diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form index c6dfba71d..7376bbf1d 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form @@ -95,6 +95,9 @@ true true true + false + true + ShowInInputField true true true @@ -106,6 +109,10 @@ true + + <key>ru</key> + <value>Автор исполнитель</value> + ГруппаАвторИсполнительExtendedTooltip 175 @@ -225,6 +232,10 @@ true + + <key>ru</key> + <value>Дата и срок</value> + ГруппаДатаИСрокExtendedTooltip 178 @@ -339,6 +350,10 @@ true + + <key>ru</key> + <value>Номер и важность</value> + System.DefaultGUIFont true @@ -371,6 +386,10 @@ true + + <key>ru</key> + <value>Группы шапки</value> + ГруппыШапкиExtendedTooltip 174 @@ -502,6 +521,10 @@ true + + <key>ru</key> + <value>Приоритет</value> + ГруппаПриоритетExtendedTooltip 184 @@ -864,6 +887,10 @@ true + + <key>ru</key> + <value>Состояние</value> + true ГруппаСостояниеExtendedTooltip @@ -1135,6 +1162,10 @@ true + + <key>ru</key> + <value>Выполнено дата</value> + ГруппаВыполненоДатаExtendedTooltip 194 @@ -1193,10 +1224,6 @@ ru Документ - - ru - Документ - false ДокументРасширеннаяПодсказка @@ -1256,6 +1283,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 167 diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form index 1112b202d..6defaf534 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form @@ -11,6 +11,10 @@ true + + <key>ru</key> + <value>Состояние</value> + ГруппаСостояниеExtendedTooltip 193 @@ -129,6 +133,9 @@ true true true + false + true + ShowInInputField true true true @@ -140,6 +147,10 @@ true + + <key>ru</key> + <value>Автор исполнитель</value> + ГруппаАвторИсполнительExtendedTooltip 196 @@ -259,6 +270,10 @@ true + + <key>ru</key> + <value>Дата и срок</value> + ГруппаДатаИСрокExtendedTooltip 199 @@ -372,6 +387,10 @@ true + + <key>ru</key> + <value>Номер и важность</value> + System.DefaultGUIFont true @@ -404,6 +423,10 @@ true + + <key>ru</key> + <value>Группы шапки</value> + ГруппыШапкиExtendedTooltip 195 @@ -535,6 +558,10 @@ true + + <key>ru</key> + <value>Приоритет</value> + ГруппаПриоритетExtendedTooltip 205 @@ -559,6 +586,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ШапкаExtendedTooltip 194 @@ -1160,12 +1191,8 @@ <key>ru</key> - <value>Группа выполнена дата</value> + <value>Выполнена дата</value> - - ru - Группа выполнена дата - ГруппаВыполненаДатаExtendedTooltip 215 @@ -1221,6 +1248,11 @@ true + + <key>ru</key> + <value>Документ</value> + + false ДокументРасширеннаяПодсказка 235 diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form index 9428a0bfc..c4ca0aaca 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form @@ -124,6 +124,10 @@ true + + <key>ru</key> + <value>Состояние</value> + ГруппаСостояниеExtendedTooltip 107 @@ -280,6 +284,10 @@ true + + <key>ru</key> + <value>Срок важность</value> + ГруппаСрокВажностьExtendedTooltip 111 @@ -355,6 +363,9 @@ true true + false + true + ShowInInputField false true true @@ -484,6 +495,10 @@ true + + <key>ru</key> + <value>Срок исполнения</value> + ГруппаСрокИсполненияРасширеннаяПодсказка 148 @@ -542,6 +557,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ШапкаРасширеннаяПодсказка 146 @@ -660,6 +679,10 @@ true + + <key>ru</key> + <value>Содержание</value> + ГруппаСодержаниеExtendedTooltip 119 @@ -787,6 +810,9 @@ 35 true true + false + true + ShowInInputField false false true @@ -926,6 +952,10 @@ true + + <key>ru</key> + <value>Срок проверки</value> + ГруппаСрокПроверкиРасширеннаяПодсказка 150 @@ -950,6 +980,10 @@ true + + <key>ru</key> + <value>Проверяющий</value> + ГруппаПроверяющийExtendedTooltip 124 @@ -973,6 +1007,10 @@ true + + <key>ru</key> + <value>Проверка</value> + ГруппаПроверкаExtendedTooltip 122 @@ -1124,6 +1162,10 @@ true + + <key>ru</key> + <value>Документ</value> + false ДокументРасширеннаяПодсказка @@ -1344,10 +1386,6 @@ ru Глобальные команды - - ru - Глобальные команды - ГлобальныеКомандыРасширеннаяПодсказка 144 @@ -1374,10 +1412,6 @@ ru Стандартные команды - - ru - Стандартные команды - СтандартныеКомандыРасширеннаяПодсказка 134 diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl index 2fe4e2e55..861e0a8a8 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl @@ -13,7 +13,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - + УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. @@ -73,7 +73,7 @@ Если ИмяСобытия = "ИзмененаНастройкаОтложенногоСтарта" Тогда Отложен = (Параметр.Отложен И Параметр.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияПроцессовДляЗапуска.ГотовКСтарту")); ДатаОтложенногоСтарта = Параметр.ДатаОтложенногоСтарта; - УстановитьСвойстваЭлементовФормы(ЭтаФорма); + УстановитьСвойстваЭлементовФормы(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -98,6 +98,15 @@ Процедура ПослеЗаписи(ПараметрыЗаписи) Оповестить("Запись_Задание", ПараметрыЗаписи, Объект.Ссылка); Оповестить("Запись_ЗадачаИсполнителя", ПараметрыЗаписи, Неопределено); + Если ПараметрыЗаписи.Свойство("Старт") И ПараметрыЗаписи.Старт Тогда + ПодключитьОбработчикОжидания("ОбновитьФорму", 0.2, Истина); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьФорму() + УстановитьСвойстваЭлементовФормы(ЭтотОбъект); + ОбновитьДоступностьКомандОстановки(); КонецПроцедуры #КонецОбласти @@ -386,8 +395,8 @@ УстановитьРеквизитыОтложенногоСтарта(); - ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); - ИзменятьЗаданияЗаднимЧислом = ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"); + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + ИзменятьЗаданияЗаднимЧислом = ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"); ИспользоватьПодчиненныеБизнесПроцессы = ПолучитьФункциональнуюОпцию("ИспользоватьПодчиненныеБизнесПроцессы"); ПредметСтрокой = ОбщегоНазначения.ПредметСтрокой(Объект.Предмет); @@ -398,7 +407,7 @@ ГлавнаяЗадачаСтрокой = Строка(Объект.ГлавнаяЗадача); КонецЕсли; - УстановитьСвойстваЭлементовФормы(ЭтаФорма); + УстановитьСвойстваЭлементовФормы(ЭтотОбъект); КонецПроцедуры @@ -407,18 +416,18 @@ Если Объект.Завершен Тогда - Элементы.ФормаОстановить.Доступность = Ложь; - Элементы.ФормаПродолжить.Доступность = Ложь; + Элементы.ФормаОстановить.Видимость = Ложь; + Элементы.ФормаПродолжить.Видимость = Ложь; Возврат; КонецЕсли; Если Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияБизнесПроцессов.Остановлен") Тогда - Элементы.ФормаОстановить.Доступность = Ложь; - Элементы.ФормаПродолжить.Доступность = Истина; + Элементы.ФормаОстановить.Видимость = Ложь; + Элементы.ФормаПродолжить.Видимость = Истина; Иначе - Элементы.ФормаОстановить.Доступность = Истина; - Элементы.ФормаПродолжить.Доступность = Ложь; + Элементы.ФормаОстановить.Видимость = Объект.Стартован; + Элементы.ФормаПродолжить.Видимость = Ложь; КонецЕсли; КонецПроцедуры @@ -442,32 +451,33 @@ Процедура УстановитьСвойстваЭлементовФормы(Форма) Если Форма.ТолькоПросмотр Тогда - Форма.Элементы.ФормаОстановить.Видимость = Ложь; - Форма.Элементы.ФормаЗаписатьИЗакрыть.Видимость = Ложь; + Форма.Элементы.ФормаОстановить.Видимость = Ложь; + Форма.Элементы.ФормаЗаписатьИЗакрыть.Видимость = Ложь; Форма.Элементы.ФормаНастроитьОтложенныйСтарт.Видимость = Ложь; - Форма.Элементы.ФормаЗаписать.Видимость = Ложь; - Форма.Элементы.ФормаПродолжить.Видимость = Ложь; + Форма.Элементы.ФормаЗаписать.Видимость = Ложь; + Форма.Элементы.ФормаПродолжить.Видимость = Ложь; Иначе - Форма.Элементы.СрокИсполненияВремя.Видимость = Форма.ИспользоватьДатуИВремяВСрокахЗадач; - Форма.Элементы.СрокПроверкиВремя.Видимость = Форма.ИспользоватьДатуИВремяВСрокахЗадач; - Форма.Элементы.Дата.Формат = ?(Форма.ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); - - Форма.Элементы.Предмет.Гиперссылка = Форма.Объект.Предмет <> Неопределено И НЕ Форма.Объект.Предмет.Пустая(); - - Форма.Элементы.ФормаСтартИЗакрыть.Видимость = Не ОбъектСтартован(Форма); - Форма.Элементы.ФормаСтартИЗакрыть.КнопкаПоУмолчанию = Не ОбъектСтартован(Форма); - Форма.Элементы.ФормаСтарт.Видимость = Не ОбъектСтартован(Форма); - Форма.Элементы.ФормаЗаписатьИЗакрыть.Видимость = ОбъектСтартован(Форма); - Форма.Элементы.ФормаЗаписатьИЗакрыть.КнопкаПоУмолчанию = ОбъектСтартован(Форма); + ОбъектСтартован = ОбъектСтартован(Форма); + Форма.Элементы.СрокИсполненияВремя.Видимость = Форма.ИспользоватьДатуИВремяВСрокахЗадач; + Форма.Элементы.СрокПроверкиВремя.Видимость = Форма.ИспользоватьДатуИВремяВСрокахЗадач; + Форма.Элементы.Дата.Формат = ?(Форма.ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + Форма.Элементы.Предмет.Гиперссылка = Форма.Объект.Предмет <> Неопределено И НЕ Форма.Объект.Предмет.Пустая(); + Форма.Элементы.ФормаСтартИЗакрыть.Видимость = Не ОбъектСтартован; + Форма.Элементы.ФормаСтартИЗакрыть.КнопкаПоУмолчанию = Не ОбъектСтартован; + Форма.Элементы.ФормаСтарт.Видимость = Не ОбъектСтартован; + Форма.Элементы.ФормаНастроитьОтложенныйСтарт.Видимость = Не ОбъектСтартован; + Форма.Элементы.ФормаЗаписатьИЗакрыть.Видимость = ?(Форма.Объект.Завершен, Ложь, ОбъектСтартован); + Форма.Элементы.ФормаЗаписать.Видимость = НЕ Форма.Объект.Завершен; + Форма.Элементы.ФормаЗаписатьИЗакрыть.КнопкаПоУмолчанию = ОбъектСтартован; Форма.Элементы.ФормаНастроитьОтложенныйСтарт.Доступность = Не Форма.Объект.Стартован; Если Форма.Объект.ГлавнаяЗадача = Неопределено Или Форма.Объект.ГлавнаяЗадача.Пустая() Тогда - Форма.Элементы.ГлавнаяЗадача.Гиперссылка = Ложь; + Форма.Элементы.ГлавнаяЗадача.Гиперссылка = Ложь; КонецЕсли; Если Не Форма.ИспользоватьПодчиненныеБизнесПроцессы Тогда - Форма.Элементы.ГлавнаяЗадача.Видимость = Ложь; + Форма.Элементы.ГлавнаяЗадача.Видимость = Ложь; КонецЕсли; КонецЕсли; @@ -478,7 +488,7 @@ &НаКлиентеНаСервереБезКонтекста Процедура УстановитьСвойстваГруппеСостояний(Форма) - + ОтображатьГруппу = Форма.Объект.Завершен Или ОбъектСтартован(Форма); Форма.Элементы.ГруппаСостояние.Видимость = ОтображатьГруппу; @@ -519,7 +529,7 @@ МассивСтрок.Добавить(ТекстСостояния); МассивСтрок.Добавить(Новый ФорматированнаяСтрока(ДатаОтложенногоСтартаСтрокой,,,, "ОткрытьНастройкуОтложенногоСтарта")); КонецЕсли; - + Форма.ИнфоНадписьЗаголовок = Новый ФорматированнаяСтрока(МассивСтрок); Форма.Элементы.ИнфоНадписьЗаголовок.МаксимальнаяВысота = Высота; @@ -535,14 +545,10 @@ ДатаОтложенногоСтарта = БизнесПроцессыИЗадачиСервер.ДатаОтложенногоСтартаПроцесса(ПроверяемыйОбъект.Ссылка); Если ПроверяемыйОбъект.СрокИсполнения < ДатаОтложенногоСтарта Тогда - Ошибки = Неопределено; - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю( - Ошибки, - "Объект.СрокИсполнения", - НСтр("ru = 'Срок исполнения задания не может быть меньше даты отложенного старта.'"), ""); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Срок исполнения задания не может быть меньше даты отложенного старта.'"),, + "СрокИсполнения", "Объект.СрокИсполнения"); КонецЕсли; - - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); КонецПроцедуры @@ -562,35 +568,26 @@ Возврат Истина; КонецЕсли; - ОшибкиПользователю = Неопределено; ОчиститьСообщения(); + РеквизитыФормыЗаполнены = Истина; Если НЕ ЗначениеЗаполнено(Объект.Исполнитель) Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю( - ОшибкиПользователю, - "Объект.Исполнитель", - НСтр("ru = 'Поле ""Исполнитель"" не заполнено.'"), - ""); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Исполнитель"" не заполнено.'"),, + "Исполнитель", "Объект.Исполнитель"); + РеквизитыФормыЗаполнены = Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(Объект.Наименование) Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю( - ОшибкиПользователю, - "Объект.Наименование", - НСтр("ru = 'Поле ""Задание"" не заполнено.'"), - ""); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Задание"" не заполнено.'"),, + "Исполнитель", "Объект.Наименование"); + РеквизитыФормыЗаполнены = Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(Объект.СрокИсполнения) Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю( - ОшибкиПользователю, - "Объект.СрокИсполнения", - НСтр("ru = 'Поле ""Срок"" исполнения не заполнено.'"), - ""); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Срок"" исполнения не заполнено.'"),, + "СрокИсполнения", "Объект.СрокИсполнения"); + РеквизитыФормыЗаполнены = Ложь; КонецЕсли; - - РеквизитыФормыНеЗаполнены = Ложь; - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(ОшибкиПользователю, РеквизитыФормыНеЗаполнены); - Возврат Не РеквизитыФормыНеЗаполнены; + Возврат РеквизитыФормыЗаполнены; КонецФункции diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form index 233f6370e..72c21eedb 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form @@ -405,10 +405,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 66 @@ -428,6 +424,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -442,6 +442,10 @@ ВажностьКартинка 24 + + <key>ru</key> + <value>Важность</value> + true true @@ -1225,9 +1229,6 @@ CommonPicture.СостоянияПроцессов - None - None - None true 60 diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl index 26e009c70..2ebe6fe94 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl @@ -48,13 +48,17 @@ &НаКлиенте Процедура ПоказыватьЗавершенныеЗаданияПриИзменении(Элемент) + УстановитьОтбор(); + Элементы.Список.Обновить(); + КонецПроцедуры &НаКлиенте Процедура ПоказыватьОстановленныеПриИзменении(Элемент) УстановитьОтбор(); + Элементы.Список.Обновить(); КонецПроцедуры @@ -83,13 +87,13 @@ &НаСервере Процедура УстановитьОтбор() ПараметрыОтбора = Новый Соответствие(); - ПараметрыОтбора.Вставить("ПоказыватьЗавершенныеЗадания", ПоказыватьЗавершенныеЗадания); - ПараметрыОтбора.Вставить("ПоказыватьОстановленные", ПоказыватьОстановленные); + ПараметрыОтбора.Вставить("ПоказыватьЗавершенныеЗадания", ПоказыватьЗавершенныеЗадания); + ПараметрыОтбора.Вставить("ПоказыватьОстановленные", ПоказыватьОстановленные); ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); ПараметрыОтбора.Вставить("ПоПроверяющему", ПоПроверяющему); УстановитьОтборСписка(ПараметрыОтбора); -КонецПроцедуры +КонецПроцедуры &НаСервере Процедура УстановитьОтборСписка(ПараметрыОтбора) diff --git a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl index 8bd6543d3..aa8aa0dde 100644 --- a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl @@ -2,15 +2,39 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Программный интерфейс для подсистемы бизнес-процессов и задач. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + Результат.Добавить("Автор"); + Результат.Добавить("Важность"); + Результат.Добавить("Исполнитель"); + Результат.Добавить("ПроверитьВыполнение"); + Результат.Добавить("Проверяющий"); + Результат.Добавить("СрокИсполнения"); + Результат.Добавить("СрокПроверки"); + Возврат Результат; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// СтандартныеПодсистемы.БизнесПроцессыИЗадачи // Получить структуру с описанием формы выполнения задачи. // Вызывается при открытии формы выполнения задачи. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. -// ТочкаМаршрутаБизнесПроцесса - точка маршрута. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка - точка маршрута. // // Возвращаемое значение: // Структура - структуру с описанием формы выполнения задачи. @@ -48,7 +72,7 @@ // Параметры: // ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. // БизнесПроцессСсылка - БизнесПроцессСсылка - бизнес-процесс, по которому сформирована задача ЗадачаСсылка. -// ТочкаМаршрутаБизнесПроцесса - точка маршрута. +// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка - точка маршрута. // Процедура ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка, БизнесПроцессСсылка, ТочкаМаршрутаБизнесПроцесса) Экспорт @@ -70,27 +94,9 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +// Конец СтандартныеПодсистемы.БизнесПроцессыИЗадачи -// Возвращает реквизиты объекта, которые разрешается редактировать -// с помощью обработки группового изменения реквизитов. -// -// Возвращаемое значение: -// Массив - список имен реквизитов объекта. -Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - - Результат = Новый Массив; - Результат.Добавить("Автор"); - Результат.Добавить("Важность"); - Результат.Добавить("Исполнитель"); - Результат.Добавить("ПроверитьВыполнение"); - Результат.Добавить("Проверяющий"); - Результат.Добавить("СрокИсполнения"); - Результат.Добавить("СрокПроверки"); - Возврат Результат; - -КонецФункции +#КонецОбласти #КонецОбласти @@ -225,11 +231,11 @@ КонецПроцедуры -Функция РезультатВыполненияПриПеренаправлении(Знач ЗадачаСсылка) +Функция РезультатВыполненияПриПеренаправлении(Знач ЗадачаСсылка) - СтрокаФормат = НСтр("ru = '%1, %2 перенаправил(а) задачу: + СтрокаФормат = "%1, %2 " + НСтр("ru = 'перенаправил(а) задачу'") + ": |%3 - |'"); + |"; Комментарий = СокрЛП(ЗадачаСсылка.РезультатВыполнения); Комментарий = ?(ПустаяСтрока(Комментарий), "", Комментарий + Символы.ПС); diff --git a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl index a12aa3336..3a99bca20 100644 --- a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl @@ -2,95 +2,20 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + // СтандартныеПодсистемы.УправлениеДоступом -// Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) создается прикладным разработчиком -// в модулях объектов, тип которых задан в одной из подписок на событие. -// ЗаписатьНаборыЗначенийДоступа или ЗаписатьЗависимыеНаборыЗначенийДоступа. -// В процедуре выполняется заполнение наборов значений доступа по свойствам объекта. -// -// Параметры: -// Таблица - ТаблицаЗначений - возвращаемая функцией ТаблицаНаборыЗначенийДоступа. -// +// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа. Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт - // Логика ограничения для - // - чтения: Автор ИЛИ Исполнитель (с учетом адресации) ИЛИ Проверяющий (с учетом адресации) - // - изменения: Автор. + БизнесПроцессыИЗадачиПереопределяемый.ПриЗаполненииНаборовЗначенийДоступа(ЭтотОбъект, Таблица); - // Если предмет не задан (т.е. бизнес-процесс без основания), - // тогда предмет не участвует в логике ограничения. - - // Чтение, Изменение: набор № 1. - Строка = Таблица.Добавить(); - Строка.НомерНабора = 1; - Строка.Чтение = Истина; - Строка.Изменение = Истина; - Строка.ЗначениеДоступа = Автор; - - // Чтение: набор № 2. - Строка = Таблица.Добавить(); - Строка.НомерНабора = 2; - Строка.Чтение = Истина; - Строка.ЗначениеДоступа = ГруппаИсполнителейЗадач; - - // Чтение: набор № 3. - Строка = Таблица.Добавить(); - Строка.НомерНабора = 3; - Строка.Чтение = Истина; - Строка.ЗначениеДоступа = ГруппаИсполнителейЗадачПроверяющий; - КонецПроцедуры // Конец СтандартныеПодсистемы.УправлениеДоступом -// Актуализирует значения реквизит невыполненных задач -// согласно реквизитам бизнес-процесса Задание: -// Важность, СрокИсполнения, Наименование и Автор. -// -Процедура ИзменитьРеквизитыНевыполненныхЗадач() Экспорт - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); - ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", Ссылка); - Блокировка.Заблокировать(); - - Запрос = Новый Запрос( - "ВЫБРАТЬ - | Задачи.Ссылка КАК Ссылка - |ИЗ - | Задача.ЗадачаИсполнителя КАК Задачи - |ГДЕ - | Задачи.БизнесПроцесс = &БизнесПроцесс - | И Задачи.ПометкаУдаления = ЛОЖЬ - | И Задачи.Выполнена = ЛОЖЬ"); - Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); - ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); - ЗадачаОбъект.Важность = Важность; - ЗадачаОбъект.СрокИсполнения = - ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, - СрокИсполненияЗадачиДляВыполнения(), СрокИсполненияЗадачиДляПроверки()); - ЗадачаОбъект.Наименование = - ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, - НаименованиеЗадачиДляВыполнения(), НаименованиеЗадачиДляПроверки()); - ЗадачаОбъект.Автор = Автор; - // Не выполняем предварительную блокировку данных для редактирования, т.к. - // Это изменение имеет более высокий приоритет над открытыми формами задач. - ЗадачаОбъект.Записать(); - КонецЦикла; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры +#КонецОбласти #КонецОбласти @@ -294,6 +219,54 @@ #Область СлужебныеПроцедурыИФункции +// Актуализирует значения реквизит невыполненных задач +// согласно реквизитам бизнес-процесса Задание: +// Важность, СрокИсполнения, Наименование и Автор. +// +Процедура ИзменитьРеквизитыНевыполненныхЗадач() Экспорт + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", Ссылка); + Блокировка.Заблокировать(); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Задачи.Ссылка КАК Ссылка + |ИЗ + | Задача.ЗадачаИсполнителя КАК Задачи + |ГДЕ + | Задачи.БизнесПроцесс = &БизнесПроцесс + | И Задачи.ПометкаУдаления = ЛОЖЬ + | И Задачи.Выполнена = ЛОЖЬ"); + Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); + ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект.Важность = Важность; + ЗадачаОбъект.СрокИсполнения = + ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, + СрокИсполненияЗадачиДляВыполнения(), СрокИсполненияЗадачиДляПроверки()); + ЗадачаОбъект.Наименование = + ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, + НаименованиеЗадачиДляВыполнения(), НаименованиеЗадачиДляПроверки()); + ЗадачаОбъект.Автор = Автор; + // Не выполняем предварительную блокировку данных для редактирования, т.к. + // Это изменение имеет более высокий приоритет над открытыми формами задач. + ЗадачаОбъект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + Процедура ИзменитьПредметЗадач() УстановитьПривилегированныйРежим(Истина); @@ -357,12 +330,12 @@ Функция РезультатВыполненияТочкиВыполнить(Знач ЗадачаСсылка) СтрокаФормат = ?(Выполнено, - НСтр("ru = '%1, %2 выполнил(а) задачу: + "%1, %2 " + НСтр("ru = 'выполнил(а) задачу'") + ": |%3 - |'"), - НСтр("ru = '%1, %2 отклонил(а) задачу: + |", + "%1, %2 " + НСтр("ru = 'отклонил(а) задачу'") + ": |%3 - |'")); + |"); ЗадачаДанные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, "РезультатВыполнения,ДатаИсполнения,Исполнитель"); Комментарий = СокрЛП(ЗадачаДанные.РезультатВыполнения); @@ -375,17 +348,17 @@ Функция РезультатВыполненияТочкиПроверить(Знач ЗадачаСсылка) Если НЕ Подтверждено Тогда - СтрокаФормат = НСтр("ru = '%1, %2 вернул(а) задачу на доработку: + СтрокаФормат = "%1, %2 " + НСтр("ru = 'вернул(а) задачу на доработку'") + ": |%3 - |'"); + |"; Иначе СтрокаФормат = ?(Выполнено, - НСтр("ru = '%1, %2 подтвердил(а) выполнение задачи: + "%1, %2 " + НСтр("ru = 'подтвердил(а) выполнение задачи'") + ": |%3 - |'"), - НСтр("ru = '%1, %2 подтвердил(а) отмену задачи: + |", + "%1, %2 " + НСтр("ru = 'подтвердил(а) отмену задачи'") + ": |%3 - |'")); + |"); КонецЕсли; ЗадачаДанные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form index 5c3317946..439cf7847 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 67 @@ -43,7 +39,7 @@ Создать 77 - ФормаПодборИзОКВ + ФормаПодборИзКлассификатора 44 true true @@ -51,7 +47,7 @@ true - ФормаПодборИзОКВExtendedTooltip + ФормаПодборИзКлассификатораРасширеннаяПодсказка 51 Label true @@ -60,7 +56,7 @@ Left - Form.Command.ПодборИзОКВ + Form.Command.ПодборИзКлассификатора Normal Auto true @@ -107,10 +103,6 @@ ru Создать - - ru - Создать - СоздатьРасширеннаяПодсказка 78 @@ -139,10 +131,6 @@ ru Команды формы - - ru - Команды формы - КомандыФормыРасширеннаяПодсказка 80 @@ -218,10 +206,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 65 @@ -240,6 +224,10 @@ Валюты 25 + + <key>ru</key> + <value>Валюты</value> + true true @@ -304,7 +292,7 @@ true - Список.Code + Список.Код КодExtendedTooltip @@ -349,7 +337,7 @@ true - Список.Description + Список.Наименование НаименованиеExtendedTooltip @@ -384,6 +372,10 @@ Курс 38 + + <key>ru</key> + <value>Курс</value> + true true @@ -418,140 +410,28 @@ true - - ПредставлениеКратности - 49 - - РубЗа - 45 - true - true - - true - - - Список.РубЗа - - None - - РубЗаExtendedTooltip - 58 - Label - true - true - - Left - - - - РубЗаКонтекстноеМеню - 46 - true - - LabelField - Enter - Left - true - - 7 - true - true - - - - Кратность - 36 - true - true - - true - - - Список.Кратность - - None - - ru - кратность равная единице не отображается - - - КратностьExtendedTooltip - 59 - Label - true - true - - Left - - - - КратностьКонтекстноеМеню - 37 - true - - LabelField - Enter - Left - true - - 7 - true - true - - - - КраткоеНаименование - 47 - true - true - - true - - - Список.КраткоеНаименование - - None - - КраткоеНаименованиеExtendedTooltip - 60 - Label - true - true - - Left - - - - КраткоеНаименованиеКонтекстноеМеню - 48 - true - - LabelField - Enter - Left - true - - 7 - true - true - - + + Кратность + 36 + + <key>ru</key> + <value>Кратность</value> + true true true - - <key>ru</key> - <value>Кратность</value> - + + Список.Кратность + ru - Кратность валюты. Отображается, если не равна 1. + Кратность равная единице не отображается - ПредставлениеКратностиExtendedTooltip - 57 + КратностьРасширеннаяПодсказка + 59 Label true true @@ -559,11 +439,20 @@ Left - ColumnGroup - - auto - true - true + + КратностьКонтекстноеМеню + 37 + true + + LabelField + Enter + true + Left + true + + 7 + true + true @@ -573,7 +462,7 @@ true - Список.Ref + Список.Ссылка СсылкаРасширеннаяПодсказка @@ -715,11 +604,12 @@ Список.DefaultPicture - None - None - None true + + OnGetDataAtServer + ВалютыПриПолученииДанныхНаСервере + 60 0001-01-01T00:00:00 @@ -770,37 +660,18 @@ true - - Список.Ref -
true
ВЫБРАТЬ - Валюты.ПометкаУдаления, - Валюты.Код, - Валюты.Наименование, - Валюты.НаименованиеПолное, - КурсыВалют.Курс, - ВЫБОР - КОГДА КурсыВалют.Кратность = 1 - ТОГДА " " - ИНАЧЕ ВЫРАЗИТЬ(&ПояснениеКратности КАК СТРОКА(50)) - КОНЕЦ КАК РубЗа, - ВЫБОР - КОГДА КурсыВалют.Кратность = 1 - ТОГДА " " - ИНАЧЕ КурсыВалют.Кратность - КОНЕЦ КАК Кратность, - ВЫБОР - КОГДА КурсыВалют.Кратность = 1 - ТОГДА " " - ИНАЧЕ Валюты.Наименование - КОНЕЦ КАК КраткоеНаименование, - Валюты.Ссылка + Валюты.ПометкаУдаления КАК ПометкаУдаления, + Валюты.Код КАК Код, + Валюты.Наименование КАК Наименование, + Валюты.НаименованиеПолное КАК НаименованиеПолное, + ВЫРАЗИТЬ(NULL КАК ЧИСЛО(10, 2)) КАК Курс, + ВЫРАЗИТЬ(NULL КАК СТРОКА(50)) КАК Кратность, + Валюты.Ссылка КАК Ссылка ИЗ - Справочник.Валюты КАК Валюты - ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода, ) КАК КурсыВалют - ПО Валюты.Ссылка = КурсыВалют.Валюта + Справочник.Валюты КАК Валюты Catalog.Валюты true true @@ -810,7 +681,7 @@ - ПодборИзОКВ + ПодборИзКлассификатора <key>ru</key> <value>По классификатору...</value> @@ -825,7 +696,7 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ПодборИзОКВ</name> + <name>ПодборИзКлассификатора</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl index 31a5a723d..05b29ae5d 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl @@ -9,16 +9,30 @@ КонецЕсли; ДатаКурса = НачалоДня(ТекущаяДатаСеанса()); - Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", ДатаКурса); - Список.Параметры.УстановитьЗначениеПараметра("ПояснениеКратности", НСтр("ru = 'руб. за'")); + Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ДатаКурса", ДатаКурса); - Элементы.Валюты.РежимВыбора = Параметры.РежимВыбора; + ИзменяемыеПоля = Новый Массив; + ИзменяемыеПоля.Добавить("Курс"); + ИзменяемыеПоля.Добавить("Кратность"); + Список.УстановитьОграниченияИспользованияВГруппировке(ИзменяемыеПоля); + Список.УстановитьОграниченияИспользованияВПорядке(ИзменяемыеПоля); + Список.УстановитьОграниченияИспользованияВОтборе(ИзменяемыеПоля); Если Не Пользователи.РолиДоступны("ДобавлениеИзменениеКурсовВалют") Тогда - Элементы.ФормаПодборИзОКВ.Видимость = Ложь; + Элементы.ФормаПодборИзКлассификатора.Видимость = Ложь; Элементы.ФормаЗагрузитьКурсыВалют.Видимость = Ложь; КонецЕсли; + ДоступнаЗагрузкаКурсов = Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено; + + Элементы.ФормаПодборИзКлассификатора.Видимость = ДоступнаЗагрузкаКурсов; + Если Не ДоступнаЗагрузкаКурсов Тогда + Элементы.СоздатьВалюту.Заголовок = НСтр("ru = 'Создать'"); + Элементы.Создать.Вид = ВидГруппыФормы.ГруппаКнопок; + КонецЕсли; + + Элементы.ФормаЗагрузитьКурсыВалют.Видимость = ДоступнаЗагрузкаКурсов; + КонецПроцедуры &НаКлиенте @@ -41,17 +55,60 @@ #КонецОбласти +#Область ОбработчикиСобытийЭлементовТаблицыФормыВалюты + +&НаСервереБезКонтекста +Процедура ВалютыПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) + + Перем ДатаКурса; + + Если Не Настройки.ДополнительныеСвойства.Свойство("ДатаКурса", ДатаКурса) Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КурсыВалют.Валюта КАК Валюта, + | КурсыВалют.Курс КАК Курс, + | КурсыВалют.Кратность КАК Кратность + |ИЗ + | РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода, Валюта В (&Валюты)) КАК КурсыВалют"; + Запрос.УстановитьПараметр("Валюты", Строки.ПолучитьКлючи()); + Запрос.УстановитьПараметр("КонецПериода", ДатаКурса); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СтрокаСписка = Строки[Выборка.Валюта]; + СтрокаСписка.Данные["Курс"] = Выборка.Курс; + Если Выборка.Кратность <> 1 Тогда + Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'руб. за %1 %2'"), + Выборка.Кратность, СтрокаСписка.Данные["Наименование"]); + СтрокаСписка.Данные["Кратность"] = Пояснение; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + #Область ОбработчикиКомандФормы &НаКлиенте -Процедура ПодборИзОКВ(Команда) - ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора", , ЭтотОбъект); +Процедура ПодборИзКлассификатора(Команда) + + ИмяФормыПодбора = "Обработка.ЗагрузкаКурсовВалют.Форма.ПодборВалютИзКлассификатора"; + ОткрытьФорму(ИмяФормыПодбора, , ЭтотОбъект); + КонецПроцедуры &НаКлиенте Процедура ЗагрузитьКурсыВалют(Команда) + + ИмяФормыЗагрузки = "Обработка.ЗагрузкаКурсовВалют.Форма"; ПараметрыФормы = Новый Структура("ОткрытиеИзСписка"); - ОткрытьФорму("Обработка.ЗагрузкаКурсовВалют.Форма", ПараметрыФормы); + ОткрытьФорму(ИмяФормыЗагрузки, ПараметрыФормы); + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form index 7d27a5303..bb7ca3022 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form @@ -46,668 +46,22 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>Странницы</name> - <id>47</id> - <items xsi:type="form:FormGroup"> - <name>ОсновныеСведения</name> - <id>48</id> - <items xsi:type="form:FormField"> - <name>Код</name> - <id>2</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Объект.Code</segments> - </dataPath> - <extendedTooltip> - <name>КодExtendedTooltip</name> - <id>75</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>КодКонтекстноеМеню</name> - <id>24</id> - <autoFill>true</autoFill> - </contextMenu> - <type>InputField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <footerHorizontalAlign>Left</footerHorizontalAlign> - <extInfo xsi:type="form:InputFieldExtInfo"> - <width>3</width> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <chooseType>true</chooseType> - <typeDomainEnabled>true</typeDomainEnabled> - <textEdit>true</textEdit> - <borderColor xsi:type="core:ColorRef"> - <color>Style.BorderColor</color> - </borderColor> - <textSize>Normal</textSize> - </extInfo> - </items> - <items xsi:type="form:FormField"> - <name>Наименование</name> - <id>3</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Объект.Description</segments> - </dataPath> - <extendedTooltip> - <name>НаименованиеExtendedTooltip</name> - <id>76</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>НаименованиеКонтекстноеМеню</name> - <id>22</id> - <autoFill>true</autoFill> - </contextMenu> - <type>InputField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <footerHorizontalAlign>Left</footerHorizontalAlign> - <extInfo xsi:type="form:InputFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <chooseType>true</chooseType> - <typeDomainEnabled>true</typeDomainEnabled> - <textEdit>true</textEdit> - <borderColor xsi:type="core:ColorRef"> - <color>Style.BorderColor</color> - </borderColor> - <textSize>Normal</textSize> - </extInfo> - </items> - <items xsi:type="form:FormGroup"> - <name>ГруппаСпособУстановкиКурса</name> - <id>106</id> - <items xsi:type="form:Decoration"> - <name>НадписьКурсВалюты</name> - <id>142</id> - <title> - <key>ru</key> - <value>Курс валюты:</value> - - true - true - - true - - - НадписьКурсВалютыРасширеннаяПодсказка - 144 - Label - true - true - - Left - - - - НадписьКурсВалютыКонтекстноеМеню - 143 - true - - Label - true - - Left - -
- - КурсВалютыВводитсяВручную - 101 - true - true - - true - - - Объект.СпособУстановкиКурса - - None - - OnChange - КурсВалютыПриИзменении - - - КурсВалютыВводитсяВручнуюРасширеннаяПодсказка - 103 - Label - true - true - - Left - - - - КурсВалютыВводитсяВручнуюКонтекстноеМеню - 102 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - вводится вручную - - - Enum.СпособыУстановкиКурсаВалюты.EnumValue.РучнойВвод - - - Vertical - - - - КурсВалютыЗагружаетсяИзИнтернета - 129 - true - true - - true - - - Объект.СпособУстановкиКурса - - None - - OnChange - КурсВалютыПриИзменении - - - КурсВалютыЗагружаетсяИзИнтернетаРасширеннаяПодсказка - 131 - Label - true - true - - Left - - - - КурсВалютыЗагружаетсяИзИнтернетаКонтекстноеМеню - 130 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - загружается из Интернета - - - Enum.СпособыУстановкиКурсаВалюты.EnumValue.ЗагрузкаИзИнтернета - - - Vertical - - - - ГруппаКурсСвязанСДругойВалютой - 138 - - КурсВалютыСвязанСКурсомДругойВалюты - 132 - true - true - - true - - - Объект.СпособУстановкиКурса - - None - - OnChange - КурсВалютыПриИзменении - - - КурсВалютыСвязанСКурсомДругойВалютыРасширеннаяПодсказка - 134 - Label - true - true - - Left - - - - КурсВалютыСвязанСКурсомДругойВалютыКонтекстноеМеню - 133 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - связан с курсом другой валюты: - - - Enum.СпособыУстановкиКурсаВалюты.EnumValue.НаценкаНаКурсДругойВалюты - - - Vertical - - - - ГруппаНаценкаНаКурсДругойВалюты - 119 - - ОсновнаяВалюта - 5 - true - true - - true - - - Объект.ОсновнаяВалюта - - None - - ОсновнаяВалютаExtendedTooltip - 81 - Label - true - true - - Left - - - - ОсновнаяВалютаКонтекстноеМеню - 35 - true - - InputField - Enter - true - Left - true - Left - - - StartChoice - ОсновнаяВалютаНачалоВыбора - - 15 - true - true - false - true - - CatalogRef.Валюты - - - Style.BorderColor - - Normal - - - - Наценка - 6 - true - true - - true - - - Объект.Наценка - - - ru - Коэффициент, применяемый к курсу выбранной валюты для вычисления курса текущей валюты - - - НаценкаExtendedTooltip - 82 - Label - true - true - - Left - - - - НаценкаКонтекстноеМеню - 36 - true - - InputField - Enter - true - Left - true - Left - - 7 - true - true - false - true - true - true - true - - -99 - - - 100 - - - Style.BorderColor - - Normal - - - - ТекстПроцент - 126 - - <key>ru</key> - <value>%</value> - - true - true - - true - - - ТекстПроцентРасширеннаяПодсказка - 128 - Label - true - true - - Left - - - - ТекстПроцентКонтекстноеМеню - 127 - true - - Label - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа наценка на курс другой валюты</value> - - - ru - Коэффициент, который применяется к курсу основной валюты для вычисления курса текущей валюты. - - Button - - ГруппаНаценкаНаКурсДругойВалютыРасширеннаяПодсказка - 120 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа курс связан с другой валютой</value> - - - ГруппаКурсСвязанСДругойВалютойРасширеннаяПодсказка - 139 - Label - true - true - - Left - - - UsualGroup - - Auto - true - Auto - Auto - - - - ГруппаКурсРассчитываетсяПоФормуле - 140 - - КурсВалютыРассчитываетсяПоФормуле - 135 - true - true - - true - - - Объект.СпособУстановкиКурса - - None - - OnChange - КурсВалютыПриИзменении - - - КурсВалютыРассчитываетсяПоФормулеРасширеннаяПодсказка - 137 - Label - true - true - - Left - - - - КурсВалютыРассчитываетсяПоФормулеКонтекстноеМеню - 136 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - рассчитывается по формуле: - - - Enum.СпособыУстановкиКурсаВалюты.EnumValue.РасчетПоФормуле - - - Vertical - - - - ФормулаРасчетаКурса - 121 - true - true - - true - - - Объект.ФормулаРасчетаКурса - - None - Button - - ФормулаРасчетаКурсаРасширеннаяПодсказка - 123 - Label - true - true - - Left - - - - ФормулаРасчетаКурсаКонтекстноеМеню - 122 - true - - InputField - Enter - true - Left - true - - 32 - true - true - false - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа курс рассчитывается по формуле</value> - - - ГруппаКурсРассчитываетсяПоФормулеРасширеннаяПодсказка - 141 - Label - true - true - - Left - - - UsualGroup - - Auto - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа способ установки курса</value> - - - ru - Группа способ установки курса - - - ГруппаСпособУстановкиКурсаРасширеннаяПодсказка - 107 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - -
+ ГруппаКодНаименование + 148 + + Код + 2 true true true - - <key>ru</key> - <value>Основные сведения</value> - - - ru - Основные сведения - + + Объект.Code + - ОсновныеСведенияExtendedTooltip - 74 + КодExtendedTooltip + 75 Label true true @@ -715,887 +69,44 @@ Left - Page - - Vertical - auto - false + + КодКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + 3 + true + true + true + true + true + + Style.BorderColor + + Normal - - ГруппаСуммаПрописью - 37 - - СклонениеЦелойЧасти - 9 - - ПолеПрописи4наРусском - 13 - - <key>ru</key> - <value>Род</value> - - true - true - - true - - - ПолеПрописи4наРусском - - - OnChange - ПолеПрописи4наРусскомПриИзменении - - - ПолеПрописи4наРусскомExtendedTooltip - 85 - Label - true - true - - Left - - - - ПолеПрописи4наРусскомКонтекстноеМеню - 25 - true - - InputField - Enter - true - Left - true - Left - - - AutoComplete - ПолеПрописи4наРусскомАвтоПодбор - - - TextEditEnd - ПолеПрописи4наРусскомОкончаниеВводаТекста - - 10 - 15 - true - false - true - true - - - ru - Мужской - - - Мужской - - - - - ru - Женский - - - Женский - - - - - ru - Средний - - - Средний - - - - Style.BorderColor - - Normal - - - - ПолеПрописи1наРусском - 10 - - <key>ru</key> - <value>Один</value> - - true - true - - true - - - ПолеПрописи1наРусском - - - OnChange - ПолеПрописи1наРусскомПриИзменении - - - ПолеПрописи1наРусскомExtendedTooltip - 86 - Label - true - true - - Left - - - - ПолеПрописи1наРусскомКонтекстноеМеню - 26 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - - ПолеПрописи2наРусском - 11 - - <key>ru</key> - <value>Два</value> - - true - true - - true - - - ПолеПрописи2наРусском - - - OnChange - ПолеПрописи2наРусскомПриИзменении - - - ПолеПрописи2наРусскомExtendedTooltip - 87 - Label - true - true - - Left - - - - ПолеПрописи2наРусскомКонтекстноеМеню - 27 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - - ПолеПрописи3наРусском - 12 - - <key>ru</key> - <value>Пять</value> - - true - true - - true - - - ПолеПрописи3наРусском - - - OnChange - ПолеПрописи3наРусскомПриИзменении - - - ПолеПрописи3наРусскомExtendedTooltip - 88 - Label - true - true - - Left - - - - ПолеПрописи3наРусскомКонтекстноеМеню - 28 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Целая часть</value> - - - ru - Склонение целой части - - - СклонениеЦелойЧастиРасширеннаяПодсказка - 84 - 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наРусскомExtendedTooltip - 91 - Label - true - true - - Left - - - - ПолеПрописи8наРусскомКонтекстноеМеню - 29 - true - - InputField - Enter - true - Left - true - Left - - - AutoComplete - ПолеПрописи8наРусскомАвтоПодбор - - - TextEditEnd - ПолеПрописи8наРусскомОкончаниеВводаТекста - - 10 - 15 - true - false - true - true - - - ru - Мужской - - - Мужской - - - - - ru - Женский - - - Женский - - - - - ru - Средний - - - Средний - - - - Style.BorderColor - - Normal - - - - ПолеПрописи5наРусском - 17 - - <key>ru</key> - <value>Один</value> - - true - true - - true - - - ПолеПрописи5наРусском - - - OnChange - ПолеПрописи5наРусскомПриИзменении - - - ПолеПрописи5наРусскомExtendedTooltip - 92 - Label - true - true - - Left - - - - ПолеПрописи5наРусскомКонтекстноеМеню - 30 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - - ПолеПрописи6наРусском - 16 - - <key>ru</key> - <value>Два</value> - - true - true - - true - - - ПолеПрописи6наРусском - - - OnChange - ПолеПрописи6наРусскомПриИзменении - - - ПолеПрописи6наРусскомExtendedTooltip - 93 - Label - true - true - - Left - - - - ПолеПрописи6наРусскомКонтекстноеМеню - 31 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - - ПолеПрописи7наРусском - 15 - - <key>ru</key> - <value>Пять</value> - - true - true - - true - - - ПолеПрописи7наРусском - - - OnChange - ПолеПрописи7наРусскомПриИзменении - - - ПолеПрописи7наРусскомExtendedTooltip - 94 - Label - true - true - - Left - - - - ПолеПрописи7наРусскомКонтекстноеМеню - 32 - true - - InputField - Enter - true - Left - true - Left - - 10 - 15 - true - true - true - true - - Style.BorderColor - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Дробная часть</value> - - - ru - Склонение дробной части - - - СклонениеДробнойЧастиРасширеннаяПодсказка - 90 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - - ru - Параметры прописи дробной части для русского языка - - Auto - Auto - - - - ГруппаЧислоРазрядовДробнойЧасти - 56 - - ДлинаДробнойЧасти - 20 - true - true - - true - - - ДлинаДробнойЧасти - - - OnChange - ДлинаДробнойЧастиПриИзменении - - - ДлинаДробнойЧастиExtendedTooltip - 96 - Label - true - true - - Left - - - - ДлинаДробнойЧастиКонтекстноеМеню - 33 - true - - InputField - Enter - true - Left - true - Left - - - AutoComplete - ДлинаДробнойЧастиАвтоПодбор - - - TextEditEnd - ДлинаДробнойЧастиОкончаниеВводаТекста - - 15 - true - true - false - true - - - ru - 2 знака - - - 2 знака - - - - - ru - 1 знак - - - 1 знак - - - - - ru - 3 знака - - - 3 знака - - - - Style.BorderColor - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа число разрядов дробной части</value> - - - ГруппаЧислоРазрядовДробнойЧастиExtendedTooltip - 95 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаПримерПрописи - 61 - - СуммаЧисло - 59 - - <key>ru</key> - <value>Сумма</value> - - true - true - - true - - - СуммаЧисло - - - OnChange - СуммаЧислоПриИзменении - - - СуммаЧислоExtendedTooltip - 98 - Label - true - true - - Left - - - - СуммаЧислоКонтекстноеМеню - 60 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - СуммаПрописью - 62 - true - true - - true - - - СуммаПрописью - - - СуммаПрописьюExtendedTooltip - 99 - Label - true - true - - Left - - - - СуммаПрописьюКонтекстноеМеню - 63 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Пример прописи суммы</value> - - - ru - Группа пример прописи - - - ГруппаПримерПрописиExtendedTooltip - 97 - Label - true - true - - Left - - - UsualGroup - - Auto - WeakSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Дробная часть</value> - - - ru - Группа параметры дробной части - - - ГруппаПараметрыДробнойЧастиExtendedTooltip - 89 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - auto - Auto - Auto - - + + Наименование + 3 true true true - - <key>ru</key> - <value>Параметры прописи валюты</value> - - - ru - Группа сумма прописью - + + Объект.Description + - ГруппаСуммаПрописьюExtendedTooltip - 83 + НаименованиеExtendedTooltip + 76 Label true true @@ -1603,11 +114,28 @@ Left - Page - - Vertical - auto - false + + НаименованиеКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + 5 + true + true + true + true + true + + Style.BorderColor + + Normal true @@ -1615,9 +143,13 @@ true + + <key>ru</key> + <value>Группа код и наименование</value> + - СтранницыExtendedTooltip - 73 + ГруппаКодНаименованиеРасширеннаяПодсказка + 149 Label true true @@ -1625,26 +157,579 @@ Left - Pages - - TabsOnTop + UsualGroup + + Auto + true + true + Auto Auto - - ТекстРучногоИзменения - 68 + + ГруппаСпособУстановкиКурса + 106 + + НадписьКурсВалюты + 142 + + <key>ru</key> + <value>Курс валюты:</value> + + true + true + + true + + + НадписьКурсВалютыРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + НадписьКурсВалютыКонтекстноеМеню + 143 + true + + Label + true + + Left + + + + КурсВалютыВводитсяВручную + 101 + true + true + + true + + + Объект.СпособУстановкиКурса + + None + + OnChange + КурсВалютыПриИзменении + + + КурсВалютыВводитсяВручнуюРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + КурсВалютыВводитсяВручнуюКонтекстноеМеню + 102 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + вводится вручную + + + Enum.СпособыУстановкиКурсаВалюты.EnumValue.РучнойВвод + + + Vertical + + + + КурсВалютыЗагружаетсяИзИнтернета + 129 + true + true + + true + + + Объект.СпособУстановкиКурса + + None + + OnChange + КурсВалютыПриИзменении + + + КурсВалютыЗагружаетсяИзИнтернетаРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + КурсВалютыЗагружаетсяИзИнтернетаКонтекстноеМеню + 130 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + загружается из Интернета + + + Enum.СпособыУстановкиКурсаВалюты.EnumValue.ЗагрузкаИзИнтернета + + + Vertical + + + + ГруппаКурсСвязанСДругойВалютой + 138 + + КурсВалютыСвязанСКурсомДругойВалюты + 132 + true + true + + true + + + Объект.СпособУстановкиКурса + + None + + OnChange + КурсВалютыПриИзменении + + + КурсВалютыСвязанСКурсомДругойВалютыРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + КурсВалютыСвязанСКурсомДругойВалютыКонтекстноеМеню + 133 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + связан с курсом другой валюты: + + + Enum.СпособыУстановкиКурсаВалюты.EnumValue.НаценкаНаКурсДругойВалюты + + + Vertical + + + + ГруппаНаценкаНаКурсДругойВалюты + 119 + + ОсновнаяВалюта + 5 + true + true + + true + + + Объект.ОсновнаяВалюта + + None + + ОсновнаяВалютаExtendedTooltip + 81 + Label + true + true + + Left + + + + ОсновнаяВалютаКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ОсновнаяВалютаНачалоВыбора + + 15 + true + true + false + true + + CatalogRef.Валюты + + + Style.BorderColor + + Normal + DontUse + + + + Наценка + 6 + true + true + + true + + + Объект.Наценка + + + ru + Коэффициент, применяемый к курсу выбранной валюты для вычисления курса текущей валюты + + + НаценкаExtendedTooltip + 82 + Label + true + true + + Left + + + + НаценкаКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + Left + + 7 + true + true + false + true + true + true + true + + -99 + + + 100 + + + Style.BorderColor + + Normal + + + + ТекстПроцент + 126 + + <key>ru</key> + <value>%</value> + + true + true + + true + + + ТекстПроцентРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + ТекстПроцентКонтекстноеМеню + 127 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Наценка на курс другой валюты</value> + + + ru + Коэффициент, который применяется к курсу основной валюты для вычисления курса текущей валюты. + + Button + + ГруппаНаценкаНаКурсДругойВалютыРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Курс связан с другой валютой</value> + + + ГруппаКурсСвязанСДругойВалютойРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + UsualGroup + + Auto + true + Auto + Auto + + + + ГруппаКурсРассчитываетсяПоФормуле + 140 + + КурсВалютыРассчитываетсяПоФормуле + 135 + true + true + + true + + + Объект.СпособУстановкиКурса + + None + + OnChange + КурсВалютыПриИзменении + + + КурсВалютыРассчитываетсяПоФормулеРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + КурсВалютыРассчитываетсяПоФормулеКонтекстноеМеню + 136 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + рассчитывается по формуле: + + + Enum.СпособыУстановкиКурсаВалюты.EnumValue.РасчетПоФормуле + + + Vertical + + + + ФормулаРасчетаКурса + 121 + true + true + + true + + + Объект.ФормулаРасчетаКурса + + None + Button + + ФормулаРасчетаКурсаРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ФормулаРасчетаКурсаКонтекстноеМеню + 122 + true + + InputField + Enter + true + Left + true + + 32 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Курс рассчитывается по формуле</value> + + + ГруппаКурсРассчитываетсяПоФормулеРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + UsualGroup + + Auto + true + Auto + Auto + + + true true true - - ТекстРучногоИзменения - - None + + <key>ru</key> + <value>Способ установки курса</value> + - ТекстРучногоИзмененияExtendedTooltip - 100 + ГруппаСпособУстановкиКурсаРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПараметрыПрописиВалюты + 145 + + <key>ru</key> + <value>Параметры прописи валюты</value> + + true + true + + true + + + ПараметрыПрописиВалютыРасширеннаяПодсказка + 147 Label true true @@ -1653,18 +738,20 @@ - ТекстРучногоИзмененияКонтекстноеМеню - 69 + ПараметрыПрописиВалютыКонтекстноеМеню + 146 true - LabelField - Enter - true - Left - true - - true - true + Label + true + true + + + Click + ПараметрыПрописиВалютыНажатие + + true + Left Top @@ -1948,15 +1035,14 @@ - ТекстРучногоИзменения + ЕстьФормаПрописей <key>ru</key> - <value>Текст ручного изменения</value> + <value>Есть форма прописей</value> - 14 + 16 - String - + Boolean true @@ -1964,35 +1050,10 @@ true - FunctionalOption.СтандартныеПодсистемыВМоделиСервиса - - - РучноеИзменение - - <key>ru</key> - <value>Ручное изменение</value> - - 15 - - - true - - - true - - - - OnReadAtServer - ПриЧтенииНаСервере - - - BeforeWriteAtServer - ПередЗаписьюНаСервере - - + diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html index 321427382..0eedf15e9 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html @@ -2,7 +2,7 @@

Описание свойств используемой валюты.

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

Основные сведения о валюте

-
При добавлении валюты из Общероссийского классификатора валют следующие поля новой валюты будут заполнены автоматически:
+
При добавлении валюты из Общероссийского классификатора валют следующие поля новой валюты будут заполнены автоматически:
  • Наименование валюты - полное наименование валюты.
  • @@ -27,13 +27,7 @@
    Укажите Наценку, % - коэффициент, который применяется к курсу основной валюты для вычисления курса текущей валюты.

Расчет по формуле

  • Предусмотрена возможность ввести валюту, курс которой зависит от нескольких валют одновременно.
  • Для этого переключатель Курс валюты установите в положение рассчитывается по формуле. -
  • Задайте способ расчета курса валюты в соответствующем поле, например, (USD+EUR)/2.

Параметры прописи валюты

-

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

-
  • Целая часть - укажите параметры склонения целой части валюты: Род и соответствующие шаблоны склонения в единственном и множественном числе. -
  • Дробная часть - укажите параметры склонения дробной части валюты: Род и соответствующие шаблоны склонения в единственном и множественном числе. -
  • Число разрядов дробной части - в случае если дробная часть в печатных формах отображается числом, то можно установить нужное количество разрядов при выводе печатных форм документов. Например, если установлено количество разрядов 1 знак, то сумма по документу будет отображена, как 150,2 евро, а если 2 знака, то – 150,20 евро. -
  • Пример прописи суммы - число, введенное в поле Сумма, будет написано по указанным параметрам прописи валюты. Используйте эту возможность для проверки параметров прописи валюты.

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

-

Просмотр курса валюты

+
  • Задайте способ расчета курса валюты в соответствующем поле, например, (USD+EUR)/2.
  • Просмотр курса валюты

    • Для перевода валютных сумм в рубли используется курс валюты.
    • Нажмите Курсы валют на панели навигации валюты. Можно установить интервал дат для удобства просмотра курсов.

    Ввод курса валюты вручную

    • Курсы основных валют можно загрузить с сайта 1С. Если для валюты загрузка невозможна, то переключатель Курс валюты автоматически устанавливается в положение  вводится вручную. diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl index 733c5e57a..6c491cdd1 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl @@ -28,28 +28,15 @@ Объект.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; КонецЕсли; - Если Параметры.Свойство("ПараметрыПрописиНаРусском") Тогда - Объект.ПараметрыПрописиНаРусском = Параметры.ПараметрыПрописиНаРусском; + Если Параметры.Свойство("ПараметрыПрописи") Тогда + Объект.ПараметрыПрописи = Параметры.ПараметрыПрописи; КонецЕсли; - ЗаполнитьФормуПоОбъекту(); - КонецЕсли; + ЕстьФормаПрописей = Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено; + УстановитьДоступностьЭлементов(ЭтотОбъект); -КонецПроцедуры - -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - ЗаполнитьФормуПоОбъекту(); - -КонецПроцедуры - -&НаСервере -Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - - ТекущийОбъект.ПараметрыПрописиНаРусском = ПараметрыПрописиНаРусском(ЭтотОбъект); КонецПроцедуры @@ -68,105 +55,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Страница "Параметры прописи валюты". - -&НаКлиенте -Процедура СуммаЧислоПриИзменении(Элемент) - - УстановитьСуммуПрописью(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи4наРусскомПриИзменении(Элемент) - УстановитьСклоненияПараметровПрописи(ЭтотОбъект); - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи4наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи4наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи8наРусскомПриИзменении(Элемент) - УстановитьСклоненияПараметровПрописи(ЭтотОбъект); - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи8наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи8наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи1наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи2наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи3наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи5наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи6наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПолеПрописи7наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ДлинаДробнойЧастиПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ДлинаДробнойЧастиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ДлинаДробнойЧастиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); - -КонецПроцедуры - &НаКлиенте Процедура КурсВалютыПриИзменении(Элемент) УстановитьДоступностьЭлементов(ЭтотОбъект); @@ -176,108 +64,6 @@ #Область СлужебныеПроцедурыИФункции -&НаСервере -Процедура ЗаполнитьФормуПоОбъекту() - - ПрочитатьПараметрыПрописи(); - - УстановитьСклоненияПараметровПрописи(ЭтотОбъект); - УстановитьСуммуПрописью(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Функция ПараметрыПрописиНаРусском(Форма) - - Возврат Форма.ПолеПрописи1наРусском + ", " - + Форма.ПолеПрописи2наРусском + ", " - + Форма.ПолеПрописи3наРусском + ", " - + НРег(Лев(Форма.ПолеПрописи4наРусском, 1)) + ", " - + Форма.ПолеПрописи5наРусском + ", " - + Форма.ПолеПрописи6наРусском + ", " - + Форма.ПолеПрописи7наРусском + ", " - + НРег(Лев(Форма.ПолеПрописи8наРусском, 1)) + ", " - + Форма.ДлинаДробнойЧасти; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьСуммуПрописью(Форма) - - Форма.СуммаПрописью = ЧислоПрописью(Форма.СуммаЧисло, , ПараметрыПрописиНаРусском(Форма)); - -КонецПроцедуры - -&НаСервере -Процедура ПрочитатьПараметрыПрописи() - - // Считывает параметры прописи и заполняет соответствующие поля диалога. - - СтрокаПараметров = СтрЗаменить(Объект.ПараметрыПрописиНаРусском, ",", Символы.ПС); - - ПолеПрописи1наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)); - ПолеПрописи2наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)); - ПолеПрописи3наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)); - - Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)); - - Если НРег(Род) = "м" Тогда - ПолеПрописи4наРусском = "Мужской"; - ИначеЕсли НРег(Род) = "ж" Тогда - ПолеПрописи4наРусском = "Женский"; - ИначеЕсли НРег(Род) = "с" Тогда - ПолеПрописи4наРусском = "Средний"; - КонецЕсли; - - ПолеПрописи5наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)); - ПолеПрописи6наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)); - ПолеПрописи7наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)); - - Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)); - - Если НРег(Род = "м") Тогда - ПолеПрописи8наРусском = "Мужской"; - ИначеЕсли НРег(Род = "ж") Тогда - ПолеПрописи8наРусском = "Женский"; - ИначеЕсли НРег(Род = "с") Тогда - ПолеПрописи8наРусском = "Средний"; - КонецЕсли; - - ДлинаДробнойЧасти = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьСклоненияПараметровПрописи(Форма) - - // Склонение заголовков параметров прописи. - - Элементы = Форма.Элементы; - - Если Форма.ПолеПрописи4наРусском = "Женский" Тогда - Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Одна'"); - Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Две'"); - ИначеЕсли Форма.ПолеПрописи4наРусском = "Мужской" Тогда - Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Один'"); - Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Два'"); - Иначе - Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Одно'"); - Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Два'"); - КонецЕсли; - - Если Форма.ПолеПрописи8наРусском = "Женский" Тогда - Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Одна'"); - Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Две'"); - ИначеЕсли Форма.ПолеПрописи8наРусском = "Мужской" Тогда - Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Один'"); - Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Два'"); - Иначе - Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Одно'"); - Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Два'"); - КонецЕсли; - -КонецПроцедуры - &НаСервереБезКонтекста Процедура ПодготовитьДанныеВыбораПодчиненнойВалюты(ДанныеВыбора, Ссылка) @@ -288,65 +74,30 @@ Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ Ссылка, НаименованиеПолное - |ИЗ - | Справочник.Валюты - |ГДЕ - | Ссылка <> &Ссылка - |И - | ОсновнаяВалюта = Значение(Справочник.Валюты.ПустаяСсылка) - |УПОРЯДОЧИТЬ ПО НаименованиеПолное"; + Запрос.Текст = + "ВЫБРАТЬ + | Валюты.Ссылка КАК Ссылка, + | Валюты.НаименованиеПолное КАК НаименованиеПолное, + | Валюты.Наименование КАК Наименование + |ИЗ + | Справочник.Валюты КАК Валюты + |ГДЕ + | Валюты.Ссылка <> &Ссылка + | И Валюты.ОсновнаяВалюта = ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) + | + |УПОРЯДОЧИТЬ ПО + | Валюты.НаименованиеПолное"; Запрос.Параметры.Вставить("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.НаименованиеПолное); + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.НаименованиеПолное + " (" + Выборка.Наименование + ")"); КонецЦикла; КонецПроцедуры -&НаКлиенте -Функция АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) - - // Вспомогательная функция управлением вводом. - - Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл - Если ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда - Результат = Новый СписокЗначений; - Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); - СтандартнаяОбработка = Ложь; - Возврат Результат; - КонецЕсли; - КонецЦикла; - - Возврат Неопределено; - -КонецФункции - -&НаКлиенте -Функция ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) - - // Вспомогательная функция управлением вводом. - - СтандартнаяОбработка = Ложь; - - Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл - Если ВРег(Текст) = ВРег(ЭлементВыбора.Представление) Тогда - СтандартнаяОбработка = Истина; - ИначеЕсли ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда - СтандартнаяОбработка = Ложь; - Результат = Новый СписокЗначений; - Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); - Возврат Результат; - КонецЕсли; - КонецЦикла; - - Возврат Неопределено; - -КонецФункции - &НаКлиентеНаСервереБезКонтекста Процедура УстановитьДоступностьЭлементов(Форма) Элементы = Форма.Элементы; @@ -354,4 +105,30 @@ Элементы.ГруппаНаценкаНаКурсДругойВалюты.Доступность = Объект.СпособУстановкиКурса = ПредопределенноеЗначение("Перечисление.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты"); Элементы.ФормулаРасчетаКурса.Доступность = Объект.СпособУстановкиКурса = ПредопределенноеЗначение("Перечисление.СпособыУстановкиКурсаВалюты.РасчетПоФормуле"); КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииПараметровПрописиВалюты(Результат, ДополнительныеПараметры) Экспорт + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Объект.ПараметрыПрописи = Результат; + Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыПрописиВалютыНажатие(Элемент) + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриИзмененииПараметровПрописиВалюты", ЭтотОбъект); + Если ЕстьФормаПрописей Тогда + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ПараметрыПрописи", Объект.ПараметрыПрописи); + ИмяФормыРедактированияПрописей = "Обработка.ЗагрузкаКурсовВалют.Форма.ПараметрыПрописиВалюты"; + ОткрытьФорму(ИмяФормыРедактированияПрописей, ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + Иначе + ПоказатьВводСтроки(ОписаниеОповещения, Объект.ПараметрыПрописи, НСтр("ru = 'Параметры прописи валюты'")); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Валюты/Help/ru.html b/SSL/src/Catalogs/Валюты/Help/ru.html index cfbf31080..433f467b0 100644 --- a/SSL/src/Catalogs/Валюты/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Help/ru.html @@ -1,5 +1,5 @@ -

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

      +

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

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

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

      • @@ -22,7 +22,7 @@
        • Нажмите Создать - По классификатору (рекомендуется для корректного ввода валюты).
        • -
          Следующие поля новой валюты будут заполнены из классификатора автоматически: Наименование, Символьный код, Цифровой код, положение переключателя Курс валюты (будет установлено положение загружается из интернета, если имеется возможность загружать курс этой валюты с сайта 1С).

        Ввод валюты не из классификатора (вручную)

        +
        Следующие поля новой валюты будут заполнены из классификатора автоматически: Наименование, Символьный код, Цифровой код, положение переключателя Курс валюты (будет установлено положение загружается из интернета, если имеется возможность загружать курс этой валюты с сайта 1С).

      Ввод валюты не из классификатора (вручную)

      Загрузка курсов валют

      diff --git a/SSL/src/Catalogs/Валюты/ManagerModule.bsl b/SSL/src/Catalogs/Валюты/ManagerModule.bsl index 19fdfe8e6..a58ecc69f 100644 --- a/SSL/src/Catalogs/Валюты/ManagerModule.bsl +++ b/SSL/src/Catalogs/Валюты/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -21,55 +22,10 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Загрузка данных из файла - -// Запрещает загрузку данных в этот справочник из подсистемы "ЗагрузкаДанныхИзФайла". -// Т.к. справочник реализует свой метод обновления данных. -// -Функция ИспользоватьЗагрузкуДанныхИзФайла() Экспорт - Возврат Ложь; -КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, -// которые необходимо обновить на новую версию. -// -Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт - - ТекстЗапроса = - "ВЫБРАТЬ - | Валюты.Ссылка - |ИЗ - | Справочник.Валюты КАК Валюты - |ГДЕ - | Валюты.Код = ""643"" - | И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)"; - - Запрос = Новый Запрос(ТекстЗапроса); - - Результат = Запрос.Выполнить().Выгрузить(); - МассивСсылок = Результат.ВыгрузитьКолонку("Ссылка"); - - ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); - -КонецПроцедуры - -// Отключает у валюты 643 загрузку из интернета. -Процедура ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета(Параметры) Экспорт - Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.Валюты"); - Пока Выборка.Следующий() Цикл - Валюта = Выборка.Ссылка.ПолучитьОбъект(); - Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); - КонецЦикла; - - Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Валюты"); -КонецПроцедуры - #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/Валюты/ObjectModule.bsl b/SSL/src/Catalogs/Валюты/ObjectModule.bsl index 68641a62d..9cc9f46a7 100644 --- a/SSL/src/Catalogs/Валюты/ObjectModule.bsl +++ b/SSL/src/Catalogs/Валюты/ObjectModule.bsl @@ -70,7 +70,6 @@ Возврат; КонецЕсли; - Если ДополнительныеСвойства.Свойство("ОбновитьКурсы") Тогда ПараметрыВалюты = Новый Структура; ПараметрыВалюты.Вставить("ОсновнаяВалюта"); @@ -92,8 +91,12 @@ Если Результат.Статус = "Ошибка" Тогда ВызватьИсключение Результат.КраткоеПредставлениеОшибки; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - РаботаСКурсамиВалют.ПриОбновленииКурсовВалютВМоделиСервиса(ЭтотОбъект); + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + МодульКурсыВалютСлужебныйВМоделиСервиса.ЗапланироватьКопированиеКурсовВалюты(ЭтотОбъект); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Catalogs/Валюты/Валюты.mdo b/SSL/src/Catalogs/Валюты/Валюты.mdo index ddb06470c..5a1c43cf9 100644 --- a/SSL/src/Catalogs/Валюты/Валюты.mdo +++ b/SSL/src/Catalogs/Валюты/Валюты.mdo @@ -237,10 +237,10 @@ Use - ПараметрыПрописиНаРусском + ПараметрыПрописи ru - Параметры прописи на русском + Параметры прописи String @@ -250,7 +250,7 @@ ru - Параметры прописи валюты на русском языке + Настройки представления суммы прописью @@ -302,20 +302,6 @@ Use Use - - ПодборВалютИзКлассификатора - - ru - Подбор валют из классификатора - - - - ru - - - PersonalComputer - MobileDevice - ФормаСписка @@ -339,12 +325,4 @@ PersonalComputer MobileDevice - - ОбщероссийскийКлассификаторВалют - - ru - Общероссийский классификатор валют - - TextDocument - diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form index 4b5695051..ba0ac736e 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 15 @@ -37,6 +33,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -270,9 +270,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form index c22af6a91..f16e93695 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 18 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -306,9 +306,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form index ea228ec41..164494ad8 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form @@ -4,13 +4,53 @@ КодОткрытыйОтвет 7 - Код - 1 + Наименование + 3 true true true + + Объект.Description + + true + + НаименованиеExtendedTooltip + 11 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Код + 1 + true + true + Объект.Code @@ -44,45 +84,15 @@ Normal - - ТребуетОткрытогоОтвета - 5 - true - true - - true - - - Объект.ТребуетОткрытогоОтвета - - Right - - ТребуетОткрытогоОтветаExtendedTooltip - 10 - Label - true - true - - Left - - - - ТребуетОткрытогоОтветаКонтекстноеМеню - 6 - true - - CheckBoxField - Auto - true - Left - true - - true true true + + <key>ru</key> + <value>Код открытый ответ</value> + КодОткрытыйОтветExtendedTooltip 8 @@ -103,20 +113,20 @@ - Наименование - 3 + ТребуетОткрытогоОтвета + 5 true true true - Объект.Description + Объект.ТребуетОткрытогоОтвета - true + Right - НаименованиеExtendedTooltip - 11 + ТребуетОткрытогоОтветаExtendedTooltip + 10 Label true true @@ -125,24 +135,16 @@ - НаименованиеКонтекстноеМеню - 4 + ТребуетОткрытогоОтветаКонтекстноеМеню + 6 true - InputField + CheckBoxField Auto true Left true - - true - true - true - true - true - true - Normal - + ФормаКоманднаяПанель diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl index 60a69ba78..ff8b8f2e3 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -18,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/Изменить/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/Изменить/CommandModule.bsl index cd0b3adf5..1d423da32 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/Изменить/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/Изменить/CommandModule.bsl @@ -2,8 +2,8 @@ #Область ОбработчикиСобытий &НаКлиенте -Процедура ОбработкаКоманды(ВариантСсылка, ПараметрыВыполненияКоманды) - ВариантыОтчетовКлиент.ПоказатьНастройкиОтчета(ВариантСсылка); +Процедура ОбработкаКоманды(Вариант, ПараметрыВыполненияКоманды) + ВариантыОтчетовКлиент.ПоказатьНастройкиОтчета(Вариант); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/Открыть/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/Открыть/CommandModule.bsl index c82adcbe0..4591afebc 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/Открыть/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/Открыть/CommandModule.bsl @@ -1,20 +1,20 @@ #Область ОбработчикиСобытий &НаКлиенте -Процедура ОбработкаКоманды(ВариантСсылка, ПараметрыВыполненияКоманды) - ПараметрыОткрытия = ВариантСсылка; +Процедура ОбработкаКоманды(СсылкаВарианта, ПараметрыВыполненияКоманды) + Вариант = СсылкаВарианта; Форма = ПараметрыВыполненияКоманды.Источник; Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда Если Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаСписка" Тогда - ПараметрыОткрытия = Форма.Элементы.Список.ТекущиеДанные; + Вариант = Форма.Элементы.Список.ТекущиеДанные; ИначеЕсли Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаЭлемента" Тогда - ПараметрыОткрытия = Форма.Объект; + Вариант = Форма.Объект; КонецЕсли; Иначе Форма = Неопределено; КонецЕсли; - ВариантыОтчетовКлиент.ОткрытьФормуОтчета(Форма, ПараметрыОткрытия); + ВариантыОтчетовКлиент.ОткрытьФормуОтчета(Форма, Вариант); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/РазместитьВРазделах/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/РазместитьВРазделах/CommandModule.bsl index b2d664b09..3dfd2cfcd 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/РазместитьВРазделах/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/РазместитьВРазделах/CommandModule.bsl @@ -2,8 +2,8 @@ #Область ОбработчикиСобытий &НаКлиенте -Процедура ОбработкаКоманды(МассивВариантов, ПараметрыВыполненияКоманды) - ВариантыОтчетовКлиент.ОткрытьДиалогРазмещенияВариантовВРазделах(МассивВариантов); +Процедура ОбработкаКоманды(Варианты, ПараметрыВыполненияКоманды) + ВариантыОтчетовКлиент.ОткрытьДиалогРазмещенияВариантовВРазделах(Варианты, ПараметрыВыполненияКоманды.Источник); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl index 27f116d2e..2b601d05c 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl @@ -2,8 +2,8 @@ #Область ОбработчикиСобытий &НаКлиенте -Процедура ОбработкаКоманды(МассивВариантов, ПараметрыВыполненияКоманды) - ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекПользователей(МассивВариантов, ПараметрыВыполненияКоманды.Источник); +Процедура ОбработкаКоманды(Варианты, ПараметрыВыполненияКоманды) + ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекПользователей(Варианты, ПараметрыВыполненияКоманды.Источник); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl index c95b82987..3cb499d77 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl @@ -2,8 +2,8 @@ #Область ОбработчикиСобытий &НаКлиенте -Процедура ОбработкаКоманды(МассивВариантов, ПараметрыВыполненияКоманды) - ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекРазмещения(МассивВариантов, ПараметрыВыполненияКоманды.Источник); +Процедура ОбработкаКоманды(Варианты, ПараметрыВыполненияКоманды) + ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекРазмещения(Варианты, ПараметрыВыполненияКоманды.Источник); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form index 64617b989..491cad09d 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form @@ -1,67 +1,12 @@ - - ИзменяемыеВарианты - 56 - true - true - - true - - - ИзменяемыеВарианты - - Left - - OnChange - ИзменяемыеВариантыПриИзменении - - - ИзменяемыеВариантыExtendedTooltip - 82 - Label - true - true - - Left - - - - ИзменяемыеВариантыКонтекстноеМеню - 57 - true - - InputField - true - Enter - true - Left - true - - true - 2 - true - false - true - true - false - true - false - false - false - true - true - true - true - - Style.ФонУправляющегоПоля - - Normal - - ДеревоПодсистем 7 + + <key>ru</key> + <value>Дерево подсистем</value> + true true @@ -70,6 +15,7 @@ ДеревоПодсистем + true None Add Copy @@ -174,12 +120,8 @@ <key>ru</key> - <value>Группа колонок</value> + <value>Колонок</value> - - ru - Группа колонок - ГруппаКолонокExtendedTooltip 86 @@ -364,32 +306,6 @@ UserCmds Auto - - ДеревоПодсистемКонтекстноеМенюПеречитать - 77 - true - true - - true - - - ДеревоПодсистемКонтекстноеМенюПеречитатьExtendedTooltip - 84 - Label - true - true - - Left - - - Form.Command.Перечитать - Normal - Auto - true - true - UserCmds - Auto - true Tree @@ -413,9 +329,6 @@ true true true - None - None - None true @@ -473,33 +386,6 @@ Auto InAdditionalSubmenu - - ДеревоПодсистемПеречитать - 75 - true - true - - true - - - ДеревоПодсистемПеречитатьExtendedTooltip - 81 - Label - true - true - - Left - - - Form.Command.Перечитать - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - Left true @@ -521,41 +407,6 @@ true auto true - - ТолькоДляАвтора - - <key>ru</key> - <value>Только для автора</value> - - 8 - - Boolean - - - true - - - true - - - - Автор - - <key>ru</key> - <value>Автор</value> - - 9 - - CatalogRef.ВнешниеПользователи - CatalogRef.Пользователи - - - true - - - true - - ИзменяемыеВарианты @@ -617,10 +468,10 @@ </edit> </attributes> <attributes> - <name>РезультатВыполнения</name> + <name>СообщенияОбОшибках</name> <title> <key>ru</key> - <value>Результат выполнения</value> + <value>Сообщения об ошибках</value> 4 @@ -850,32 +701,10 @@ DontUse Auto - - Перечитать - - <key>ru</key> - <value>Перечитать</value> - - 3 - - ru - Перечитать - - - true - - - StdPicture.Reread - - - - Перечитать - - - TextPicture - DontUse - Auto - + + Варианты + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl index 43a5a9b9e..270675b65 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl @@ -2,6 +2,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда Возврат; @@ -10,39 +11,23 @@ СмешаннаяВажность = НСтр("ru = 'Различная'"); // Контроль количества вариантов осуществляется до открытия формы. - ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.МассивВариантов); + ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.Варианты); + КоличествоВариантов = ИзменяемыеВарианты.Количество(); + ЗаполнитьРазделы(); - ПерезаполнитьДерево(Ложь); - - ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтотОбъект); - - ТекущийЭлемент = Элементы.ДеревоПодсистем; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - Если РезультатВыполнения <> Неопределено Тогда - Если РезультатВыполнения.Свойство("Отказ") И РезультатВыполнения.Отказ = Истина Тогда - Отказ = Истина; - ПоказатьРезультатВыполнения(); - Иначе - ПодключитьОбработчикОжидания("ПоказатьРезультатВыполнения", 0.2, Истина); - КонецЕсли; + Если СообщенияОбОшибках <> Неопределено Тогда + Отказ = Истина; + ОчиститьСообщения(); + СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, СообщенияОбОшибках); КонецЕсли; КонецПроцедуры #КонецОбласти -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ИзменяемыеВариантыПриИзменении(Элемент) - ПерезаполнитьДерево(Ложь); - ПоказатьРезультатВыполнения(); -КонецПроцедуры - -#КонецОбласти - #Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоПодсистем &НаКлиенте @@ -61,32 +46,18 @@ &НаКлиенте Процедура Разместить(Команда) - Если ПроверитьКоличествоВариантов() Тогда - ЗаписатьНаСервере(); - ТекстОповещения = НСтр("ru = 'Изменены настройки вариантов отчетов (%1 шт.).'"); - ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОповещения, Формат(ИзменяемыеВарианты.Количество(), "ЧН=0; ЧГ=0")); - ПоказатьОповещениеПользователя(, , ТекстОповещения); - ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); - Закрыть(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура Перечитать(Команда) - Если ПроверитьКоличествоВариантов() Тогда - ПерезаполнитьДерево(Ложь); - Элементы.ДеревоПодсистем.Развернуть(ДеревоПодсистем.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина); - ПоказатьРезультатВыполнения(); - КонецЕсли; + ЗаписатьНаСервере(); + ТекстОповещения = НСтр("ru = 'Изменены настройки вариантов отчетов (%1 шт.).'"); + ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОповещения, Формат(ИзменяемыеВарианты.Количество(), "ЧН=0; ЧГ=0")); + ПоказатьОповещениеПользователя(, , ТекстОповещения); + ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); + Закрыть(); КонецПроцедуры &НаКлиенте Процедура СнятьФлажки(Команда) - Если ПроверитьКоличествоВариантов() Тогда - ПерезаполнитьДерево(Истина); - Элементы.ДеревоПодсистем.Развернуть(ДеревоПодсистем.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина); - ПоказатьРезультатВыполнения(); - КонецЕсли; + СнятьФлажкиРазделов(); + Элементы.ДеревоПодсистем.Развернуть(ДеревоПодсистем.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина); КонецПроцедуры #КонецОбласти @@ -95,68 +66,46 @@ &НаСервере Процедура УстановитьУсловноеОформление() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "ДеревоПодсистемВажность"; - Инструкция.Отборы.Вставить("ДеревоПодсистем.Важность", Новый ПолеКомпоновкиДанных("СмешаннаяВажность")); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ЗаблокированныйРеквизитЦвет); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + + УсловноеОформление.Элементы.Очистить(); + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоПодсистемВажность.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПодсистем.Важность"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СмешаннаяВажность"); + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЗаблокированныйРеквизитЦвет); + + ВариантыОтчетов.УстановитьУсловноеОформлениеДереваПодсистем(ЭтотОбъект); + КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Клиент - -&НаКлиенте -Функция ПроверитьКоличествоВариантов() - ОчиститьСообщения(); - Если КоличествоВариантов = 0 Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Необходимо заполнить список ""Варианты отчетов""'"), - , - "ИзменяемыеВарианты"); - Возврат Ложь; - КонецЕсли; - Возврат Истина; -КонецФункции - -&НаКлиенте -Процедура ПоказатьРезультатВыполнения() - ОчиститьСообщения(); - Если РезультатВыполнения <> Неопределено Тогда - СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, РезультатВыполнения); - РезультатВыполнения = Неопределено; - КонецЕсли; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вызов сервера - &НаСервере -Процедура ПерезаполнитьДерево(ТолькоСнятьФлажки) +Процедура СнятьФлажкиРазделов() - Если ТолькоСнятьФлажки = Истина Тогда - ДеревоПриемник = РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); - Найденные = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 1), Истина); - Для Каждого СтрокаДерева Из Найденные Цикл - СтрокаДерева.Использование = 0; - СтрокаДерева.Модифицированность = Истина; - КонецЦикла; - - Найденные = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 2), Истина); - Для Каждого СтрокаДерева Из Найденные Цикл - СтрокаДерева.Использование = 0; - СтрокаДерева.Модифицированность = Истина; - КонецЦикла; - - ЗначениеВРеквизитФормы(ДеревоПриемник, "ДеревоПодсистем"); - Возврат; - КонецЕсли; + ДеревоПриемник = РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); + Найденные = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 1), Истина); + Для Каждого СтрокаДерева Из Найденные Цикл + СтрокаДерева.Использование = 0; + СтрокаДерева.Модифицированность = Истина; + КонецЦикла; - КоличествоВариантов = ИзменяемыеВарианты.Количество(); - Если КоличествоВариантов = 0 Тогда - ТекстСообщения = НСтр("ru = 'Необходимо выбрать варианты отчетов'"); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ИзменяемыеВарианты"); - Возврат; - КонецЕсли; + Найденные = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 2), Истина); + Для Каждого СтрокаДерева Из Найденные Цикл + СтрокаДерева.Использование = 0; + СтрокаДерева.Модифицированность = Истина; + КонецЦикла; + + ЗначениеВРеквизитФормы(ДеревоПриемник, "ДеревоПодсистем"); +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьРазделы() ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ @@ -282,45 +231,40 @@ КоличествоОшибок = ОтфильтрованныеВарианты.Количество(); Если КоличествоОшибок > 0 Тогда - РезультатВыполнения = Новый Структура("Текст, Подробно"); + СообщенияОбОшибках = Новый Структура("Текст, Подробно"); ТекущаяПричина = 0; ПрефиксЗаписи = Символы.ПС + " "; - РезультатВыполнения.Подробно = ""; + СообщенияОбОшибках.Подробно = ""; Для Каждого СтрокаТаблицы Из ОтфильтрованныеВарианты Цикл Если ТекущаяПричина <> СтрокаТаблицы.Причина Тогда ТекущаяПричина = СтрокаТаблицы.Причина; - РезультатВыполнения.Подробно = РезультатВыполнения.Подробно + Символы.ПС + Символы.ПС; + СообщенияОбОшибках.Подробно = СообщенияОбОшибках.Подробно + Символы.ПС + Символы.ПС; Если ТекущаяПричина = 1 Тогда - РезультатВыполнения.Подробно = РезультатВыполнения.Подробно + НСтр("ru = 'Помеченные на удаление:'"); + СообщенияОбОшибках.Подробно = СообщенияОбОшибках.Подробно + НСтр("ru = 'Помеченные на удаление:'"); ИначеЕсли ТекущаяПричина = 2 Тогда - РезультатВыполнения.Подробно = РезультатВыполнения.Подробно + НСтр("ru = 'Недостаточно прав для изменения:'"); + СообщенияОбОшибках.Подробно = СообщенияОбОшибках.Подробно + НСтр("ru = 'Недостаточно прав для изменения:'"); ИначеЕсли ТекущаяПричина = 3 Тогда - РезультатВыполнения.Подробно = РезультатВыполнения.Подробно + НСтр("ru = 'Отчет отключен или недоступен по правам:'"); + СообщенияОбОшибках.Подробно = СообщенияОбОшибках.Подробно + НСтр("ru = 'Отчет отключен или недоступен по правам:'"); ИначеЕсли ТекущаяПричина = 4 Тогда - РезультатВыполнения.Подробно = РезультатВыполнения.Подробно + НСтр("ru = 'Вариант отчета отключен по функциональной опции:'"); + СообщенияОбОшибках.Подробно = СообщенияОбОшибках.Подробно + НСтр("ru = 'Вариант отчета отключен по функциональной опции:'"); КонецЕсли; КонецЕсли; - РезультатВыполнения.Подробно = СокрЛ(РезультатВыполнения.Подробно) + Символы.ПС + " - " + Строка(СтрокаТаблицы.Ссылка); + СообщенияОбОшибках.Подробно = СокрЛ(СообщенияОбОшибках.Подробно) + Символы.ПС + " - " + Строка(СтрокаТаблицы.Ссылка); ИзменяемыеВарианты.Удалить(ИзменяемыеВарианты.НайтиПоЗначению(СтрокаТаблицы.Ссылка)); КонецЦикла; КоличествоВариантов = ИзменяемыеВарианты.Количество(); Если КоличествоВариантов = 0 Тогда - РезультатВыполнения.Текст = НСтр("ru = 'Недостаточно прав для размещения в разделах выбранных вариантов отчетов.'"); - Элементы.ДеревоПодсистем.Доступность = Ложь; - РезультатВыполнения.Вставить("Отказ", Истина); + СообщенияОбОшибках.Текст = НСтр("ru = 'Недостаточно прав для размещения в разделах выбранных вариантов отчетов.'"); Иначе - РезультатВыполнения.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СообщенияОбОшибках.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недостаточно прав для размещения в разделах некоторых вариантов отчетов (%1).'"), Формат(КоличествоОшибок, "ЧГ=")); - Элементы.ДеревоПодсистем.Доступность = Истина; КонецЕсли; - РезультатВыполнения = Новый ФиксированнаяСтруктура(РезультатВыполнения); - Иначе - Элементы.ДеревоПодсистем.Доступность = Истина; + СообщенияОбОшибках = Новый ФиксированнаяСтруктура(СообщенияОбОшибках); КонецЕсли; ВхожденияПодсистем = ВременныеТаблицы[4].Выгрузить(); @@ -337,13 +281,22 @@ &НаСервере Процедура ЗаписатьНаСервере() - Кэш = Новый Структура; + + ДеревоПриемник = РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); + ИзмененныеРазделы = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Модифицированность", Истина), Истина); НачатьТранзакцию(); Попытка - Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл - ВариантОбъект = ЭлементСписка.Значение.ПолучитьОбъект(); - ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтотОбъект, ВариантОбъект, Кэш); + Блокировка = Новый БлокировкаДанных; + Для Каждого ВариантОтчета Из ИзменяемыеВарианты Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВариантОтчета.Значение); + КонецЦикла; + Блокировка.Заблокировать(); + + Для Каждого ВариантОтчета Из ИзменяемыеВарианты Цикл + ВариантОбъект = ВариантОтчета.Значение.ПолучитьОбъект(); + ВариантыОтчетов.ДеревоПодсистемЗаписать(ВариантОбъект, ИзмененныеРазделы); ВариантОбъект.Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); @@ -354,9 +307,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Сервер - &НаСервере Процедура ДобавитьПодсистемыВДерево(ПриемникРодитель, ИсточникРодитель, ВхожденияПодсистем) Для Каждого Источник Из ИсточникРодитель.Строки Цикл @@ -387,4 +337,4 @@ КонецЦикла; КонецПроцедуры -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Module.bsl index b2c248d58..2948ed120 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Module.bsl @@ -7,12 +7,12 @@ Возврат; КонецЕсли; - Если Не Параметры.Свойство("МассивВариантов") Или ТипЗнч(Параметры.МассивВариантов) <> Тип("Массив") Тогда + Если Не Параметры.Свойство("Варианты") Или ТипЗнч(Параметры.Варианты) <> Тип("Массив") Тогда ТекстОшибки = НСтр("ru = 'Не указаны варианты отчетов.'"); Возврат; КонецЕсли; - ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.МассивВариантов); + ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.Варианты); Отфильтровать(); КонецПроцедуры @@ -65,6 +65,13 @@ КоличествоВариантов = 0; НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ЭлементСписка.Значение); + КонецЦикла; + Блокировка.Заблокировать(); + Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл ВариантОбъект = ЭлементСписка.Значение.ПолучитьОбъект(); Если ВариантыОтчетов.СброситьНастройкиВариантаОтчета(ВариантОбъект) Тогда diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl index 2fa7f2594..3a2a6663c 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl @@ -7,18 +7,18 @@ Возврат; КонецЕсли; - Если Не Параметры.Свойство("МассивВариантов") Или ТипЗнч(Параметры.МассивВариантов) <> Тип("Массив") Тогда + Если Не Параметры.Свойство("Варианты") Или ТипЗнч(Параметры.Варианты) <> Тип("Массив") Тогда ТекстОшибки = НСтр("ru = 'Не указаны варианты отчетов.'"); Возврат; КонецЕсли; - Если Не ЕстьПользовательскиеНастройки(Параметры.МассивВариантов) Тогда + Если Не ЕстьПользовательскиеНастройки(Параметры.Варианты) Тогда ТекстОшибки = НСтр("ru = 'Пользовательские настройки выбранных вариантов отчетов (%1 шт) не заданы или уже сброшены.'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Формат(Параметры.МассивВариантов.Количество(), "ЧН=0; ЧГ=0")); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Формат(Параметры.Варианты.Количество(), "ЧН=0; ЧГ=0")); Возврат; КонецЕсли; - ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.МассивВариантов); + ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.Варианты); КонецПроцедуры &НаКлиенте @@ -68,7 +68,15 @@ Функция СброситьНастройкиПользователейСервер(Знач ИзменяемыеВарианты) НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ЭлементСписка.Значение); + КонецЦикла; + Блокировка.Заблокировать(); + РегистрыСведений.НастройкиВариантовОтчетов.СброситьНастройки(ИзменяемыеВарианты.ВыгрузитьЗначения()); + ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); @@ -85,7 +93,7 @@ Запрос.УстановитьПараметр("МассивВариантов", МассивВариантов); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК Поле1 + | ИСТИНА КАК ЕстьПользовательскиеНастройки |ИЗ | РегистрСведений.НастройкиВариантовОтчетов КАК Настройки |ГДЕ diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form index 44de0fa9f..fba2cd218 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form @@ -160,10 +160,6 @@ ru Быстрые отборы - - ru - Быстрые отборы - БыстрыеОтборыExtendedTooltip 98 @@ -195,10 +191,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 169 @@ -477,6 +469,10 @@ true + + <key>ru</key> + <value>Список группа 1</value> + СписокГруппа1РасширеннаяПодсказка 189 @@ -501,10 +497,6 @@ ru Команды списка - - ru - Команды списка - КомандыСпискаExtendedTooltip 109 @@ -615,10 +607,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 102 @@ -643,6 +631,10 @@ ДеревоПодсистем 65 + + <key>ru</key> + <value>Дерево подсистем</value> + true true @@ -834,9 +826,6 @@ true true true - None - None - None true @@ -886,10 +875,6 @@ ru Левая колонка - - ru - Левая колонка - ЛеваяКолонкаExtendedTooltip 114 @@ -1014,6 +999,10 @@ ДоступенВсемПользователям 96 + + <key>ru</key> + <value>Доступен всем пользователям</value> + true true @@ -1123,6 +1112,10 @@ Описание 143 + + <key>ru</key> + <value>Описание</value> + true true @@ -1191,10 +1184,6 @@ ru Строки - - ru - Строки - СтрокиРасширеннаяПодсказка 138 @@ -1218,6 +1207,10 @@ ИмяОтчета 73 + + <key>ru</key> + <value>Имя отчета</value> + true true @@ -1388,6 +1381,10 @@ НаименованияПараметровИОтборов 150 + + <key>ru</key> + <value>Наименования параметров и отборов</value> + true true @@ -1422,6 +1419,10 @@ НаименованияПолей 153 + + <key>ru</key> + <value>Наименования полей</value> + true true @@ -1677,10 +1678,6 @@ ru Команды списка - - ru - Команды списка - КомандыСпискаСписокExtendedTooltip 121 @@ -1744,11 +1741,11 @@ true true - Список.DefaultPicture + Список.ИндексКартинки - None - None - None + + CommonPicture.ПиктограммыЭлементов + true 60 @@ -1768,12 +1765,8 @@ <key>ru</key> - <value>Группа горизонтальная</value> + <value>Горизонтальная</value> - - ru - Группа горизонтальная - ГруппаГоризонтальнаяExtendedTooltip 113 diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl index f371e9d22..a026bf447 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -125,7 +125,7 @@ ТекущийЭлемент = Элементы.Список; - СтандартныеПодсистемыСервер.ДополнитьОтборыИзСтруктуры(Список.КомпоновщикНастроек.Настройки.Отбор, Параметры.Отбор); + ВариантыОтчетов.ДополнитьОтборыИзСтруктуры(Список.КомпоновщикНастроек.Настройки.Отбор, Параметры.Отбор); Параметры.Отбор.Очистить(); ОбновитьСодержимоеСписка("ПриСозданииНаСервере"); @@ -335,11 +335,20 @@ &НаСервере Процедура УстановитьУсловноеОформление() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "Описание"; - Инструкция.Отборы.Вставить("Список.Описание", ВидСравненияКомпоновкиДанных.Заполнено); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ПоясняющийТекст); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + + УсловноеОформление.Элементы.Очистить(); + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Описание.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Описание"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст); + КонецПроцедуры &НаКлиенте @@ -448,7 +457,7 @@ Возврат; КонецЕсли; - ВсеПодсистемы = НЕ ЗначениеЗаполнено(СтрокаДерева.ПолноеИмя); + ВсеПодсистемы = Не ЗначениеЗаполнено(СтрокаДерева.ПолноеИмя); ПараметрыПоиска = Новый Структура; Если ЗначениеЗаполнено(СтрокаПоиска) Тогда @@ -457,10 +466,13 @@ Иначе Элементы.Список.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать; КонецЕсли; - Если Не ВсеПодсистемы Тогда + ПараметрыПоиска.Вставить("ЖесткийОтборПоПодсистемам", Не ВсеПодсистемы); + Если Не ВсеПодсистемы Или ЗначениеЗаполнено(СтрокаПоиска) Тогда МассивПодсистем = Новый Массив; - МассивПодсистем.Добавить(СтрокаДерева.Ссылка); - Если ВключаяПодчиненные Тогда + Если Не ВсеПодсистемы Тогда + МассивПодсистем.Добавить(СтрокаДерева.Ссылка); + КонецЕсли; + Если ВсеПодсистемы Или ВключаяПодчиненные Тогда ДобавитьРекурсивно(МассивПодсистем, СтрокаДерева.ПолучитьЭлементы()); КонецЕсли; ПараметрыПоиска.Вставить("Подсистемы", МассивПодсистем); diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form index 234364f0d..fd205a037 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form @@ -275,10 +275,6 @@ ru Дерево подсистем заголовок и видимость по умолчанию - - ru - Дерево подсистем заголовок и видимость по умолчанию - ДеревоПодсистемЗаголовокИВидимостьПоУмолчаниюРасширеннаяПодсказка 237 @@ -301,6 +297,10 @@ ДеревоПодсистем 80 + + <key>ru</key> + <value>Дерево подсистем</value> + true true @@ -412,12 +412,8 @@ <key>ru</key> - <value>Группа колонок</value> + <value>Колонок</value> - - ru - Группа колонок - ГруппаКолонокExtendedTooltip 170 @@ -476,10 +472,7 @@ true true false - true true - false - false true true true @@ -597,9 +590,6 @@ ExpandAllLevels true true - None - None - None true @@ -1054,14 +1044,11 @@ true true true - None - None - None true - Группа2 + НаименованияПолейИПараметров 190 НаименованияПолей @@ -1156,8 +1143,12 @@ true + + <key>ru</key> + <value>Наименования полей и параметров</value> + - Группа2РасширеннаяПодсказка + НаименованияПолейИПараметровРасширеннаяПодсказка 191 Label true @@ -1175,6 +1166,40 @@ Auto + + ИнтерактивнаяПометкаУдаления + 241 + true + true + + true + + + Объект.ИнтерактивнаяПометкаУдаления + + Right + + ИнтерактивнаяПометкаУдаленияРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + ИнтерактивнаяПометкаУдаленияКонтекстноеМеню + 242 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -1182,10 +1207,6 @@ ru Техническая информация - - ru - Техническая информация - true true @@ -1422,10 +1443,6 @@ ru Сброс настроек - - ru - Сброс настроек - СбросНастроекExtendedTooltip 154 @@ -1590,6 +1607,7 @@ true + true Ссылка @@ -1796,6 +1814,7 @@ <edit> <common>true</common> </edit> + <savedData>true</savedData> </attributes> <attributes> <name>СвойстваПредопределенного</name> diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl index 6dbf128cf..8a03d9f9c 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -2,6 +2,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -55,7 +57,6 @@ ПерезаполнитьДерево(Ложь); - ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -89,7 +90,13 @@ КонецЕсли; // Запись дерева подсистем. - ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтотОбъект, ТекущийОбъект); + ДеревоПриемник = РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); + Если ТекущийОбъект.ЭтоНовый() Тогда + ИзмененныеРазделы = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 1), Истина); + Иначе + ИзмененныеРазделы = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Модифицированность", Истина), Истина); + КонецЕсли; + ВариантыОтчетов.ДеревоПодсистемЗаписать(ТекущийОбъект, ИзмененныеРазделы); КонецПроцедуры &НаСервере @@ -139,6 +146,14 @@ #Область СлужебныеПроцедурыИФункции +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + ВариантыОтчетов.УстановитьУсловноеОформлениеДереваПодсистем(ЭтотОбъект); + +КонецПроцедуры + &НаСервере Функция ПерезаполнитьДерево(Прочитать) ВыделенныеСтроки = ОтчетыСервер.ЗапомнитьВыделенныеСтроки(ЭтотОбъект, "ДеревоПодсистем", "Ссылка"); diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl index b3d690e5d..a8a5906e7 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -18,6 +22,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли @@ -28,7 +36,8 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - // Переопределение для целей избранного - вместо карточки с настройками размещения отчета будет открываться его основная форма. + // Переопределение для целей избранного - вместо карточки с настройками размещения отчета будет открываться его + // основная форма. Если ВидФормы = "ФормаОбъекта" Тогда СсылкаВарианта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Ключ"); Если Не ЗначениеЗаполнено(СсылкаВарианта) Тогда @@ -59,12 +68,9 @@ ПолноеИмяОтчета = Вид + "." + ПараметрыОткрытия.ИмяОтчета; - Уникальность = ПолноеИмяОтчета; - Если ЗначениеЗаполнено(ПараметрыОткрытия.КлючВарианта) Тогда - Уникальность = Уникальность + "/КлючВарианта." + ПараметрыОткрытия.КлючВарианта; - КонецЕсли; - ПараметрыОткрытия.Вставить("КлючПараметровПечати", Уникальность); - ПараметрыОткрытия.Вставить("КлючСохраненияПоложенияОкна", Уникальность); + КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(ПолноеИмяОтчета, ПараметрыОткрытия.КлючВарианта); + ПараметрыОткрытия.Вставить("КлючПараметровПечати", КлючУникальности); + ПараметрыОткрытия.Вставить("КлючСохраненияПоложенияОкна", КлючУникальности); СтандартнаяОбработка = Ложь; Если ПараметрыОткрытия.ТипОтчета = "Дополнительный" Тогда // Для платформы. diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl index dfb3792f1..a329abf2c 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl @@ -5,7 +5,7 @@ Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) ИсключаемыеРеквизиты = Новый Массив; - Если НЕ Пользовательский Тогда + Если Не Пользовательский Тогда ИсключаемыеРеквизиты.Добавить("Автор"); КонецЕсли; @@ -29,21 +29,20 @@ КонецЕсли; ПользователемИзмененаПометкаУдаления = ( - НЕ ЭтоНовый() + Не ЭтоНовый() И ПометкаУдаления <> Ссылка.ПометкаУдаления - И НЕ ДополнительныеСвойства.Свойство("ЗаполнениеПредопределенных")); + И Не ДополнительныеСвойства.Свойство("ЗаполнениеПредопределенных")); - Если НЕ Пользовательский И ПользователемИзмененаПометкаУдаления Тогда + Если Не Пользовательский И ПользователемИзмененаПометкаУдаления Тогда Если ПометкаУдаления Тогда ТекстОшибки = НСтр("ru = 'Пометка на удаление предопределенного варианта отчета запрещена.'"); Иначе ТекстОшибки = НСтр("ru = 'Снятие пометки удаления предопределенного варианта отчета запрещена.'"); КонецЕсли; - ВариантыОтчетов.ОшибкаПоВарианту(Ссылка, ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецЕсли; - Если НЕ ПометкаУдаления И ПользователемИзмененаПометкаУдаления Тогда + Если Не ПометкаУдаления И ПользователемИзмененаПометкаУдаления Тогда НаименованиеЗанято = ВариантыОтчетов.НаименованиеЗанято(Отчет, Ссылка, Наименование); КлючВариантаЗанят = ВариантыОтчетов.КлючВариантаЗанят(Отчет, Ссылка, КлючВарианта); Если НаименованиеЗанято ИЛИ КлючВариантаЗанят Тогда @@ -58,12 +57,19 @@ КлючВарианта); КонецЕсли; ТекстОшибки = ТекстОшибки + НСтр("ru = 'Перед снятием пометки удаления варианта отчета - |необходимо установить пометку удаления конфликтующего варианта отчета.'"); - ВариантыОтчетов.ОшибкаПоВарианту(Ссылка, ТекстОшибки); + |необходимо установить пометку удаления конфликтующего варианта отчета.'"); ВызватьИсключение ТекстОшибки; КонецЕсли; КонецЕсли; + Если ПользователемИзмененаПометкаУдаления Тогда + Если Пользовательский Тогда + ИнтерактивнаяПометкаУдаления = ПометкаУдаления; + Иначе + ИнтерактивнаяПометкаУдаления = Ложь; + КонецЕсли; + КонецЕсли; + // Удаление из табличной части подсистем, помеченных на удаление. МассивУдаляемыхСтрок = Новый Массив; Для Каждого СтрокаРазмещения Из Размещение Цикл @@ -102,7 +108,7 @@ КлючВарианта, Строка(Отчет)); ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ВариантыОтчетов.ОшибкаПоВарианту(Ссылка, ТекстОшибки); + ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Ссылка); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo index 951c1c3d1..717c7e6af 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo +++ b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo @@ -133,117 +133,6 @@ <defaultObjectForm>Catalog.ВариантыОтчетов.Form.ФормаЭлемента</defaultObjectForm> <defaultListForm>Catalog.ВариантыОтчетов.Form.ФормаСписка</defaultListForm> <defaultChoiceForm>Catalog.ВариантыОтчетов.Form.ФормаСписка</defaultChoiceForm> - <attributes uuid="50a1e3bf-8624-4474-854e-21b89aaf97ed"> - <name>Отчет</name> - <synonym> - <key>ru</key> - <value>Отчет</value> - </synonym> - <type> - <types>CatalogRef.ИдентификаторыОбъектовРасширений</types> - <types>String</types> - <types>CatalogRef.ДополнительныеОтчетыИОбработки</types> - <types>CatalogRef.ИдентификаторыОбъектовМетаданных</types> - <stringQualifiers> - <length>150</length> - </stringQualifiers> - </type> - <toolTip> - <key>ru</key> - <value>Ссылка отчета или его полное имя.</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> - <fillValue xsi:type="core:StringValue"/> - <indexing>Index</indexing> - <dataHistory>Use</dataHistory> - </attributes> - <attributes uuid="6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61"> - <name>ТипОтчета</name> - <synonym> - <key>ru</key> - <value>Тип отчета</value> - </synonym> - <type> - <types>EnumRef.ТипыОтчетов</types> - </type> - <toolTip> - <key>ru</key> - <value>Тип варианта отчета</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> - <fillValue xsi:type="core:UndefinedValue"/> - <indexing>Index</indexing> - <fullTextSearch>Use</fullTextSearch> - <dataHistory>Use</dataHistory> - </attributes> - <attributes uuid="24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892"> - <name>КлючВарианта</name> - <synonym> - <key>ru</key> - <value>Ключ варианта</value> - </synonym> - <type> - <types>String</types> - <stringQualifiers> - <length>256</length> - </stringQualifiers> - </type> - <toolTip> - <key>ru</key> - <value>Уникальный ключ варианта отчета</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillValue xsi:type="core:StringValue"/> - <indexing>Index</indexing> - <dataHistory>Use</dataHistory> - </attributes> - <attributes uuid="847b97a3-d0bc-45e2-b06c-932bb22d8eca"> - <name>ПредопределенныйВариант</name> - <synonym> - <key>ru</key> - <value>Предопределенный вариант</value> - </synonym> - <comment>Вариант конфигурации</comment> - <type> - <types>CatalogRef.ПредопределенныеВариантыОтчетовРасширений</types> - <types>CatalogRef.ПредопределенныеВариантыОтчетов</types> - </type> - <toolTip> - <key>ru</key> - <value>Предопределенный вариант отчета, содержит настройки по умолчанию.</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillValue xsi:type="core:UndefinedValue"/> - <indexing>Index</indexing> - <dataHistory>Use</dataHistory> - </attributes> - <attributes uuid="503b3eab-b7f1-4ede-8845-3290a834cec7"> - <name>Пользовательский</name> - <synonym> - <key>ru</key> - <value>Пользовательский</value> - </synonym> - <type> - <types>Boolean</types> - </type> - <toolTip> - <key>ru</key> - <value>Тип варианта отчета: -Да - Пользовательский, -Нет - Предопределенный.</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillValue xsi:type="core:UndefinedValue"/> - <indexing>Index</indexing> - <dataHistory>Use</dataHistory> - </attributes> <attributes uuid="8361991a-0f30-4a03-9a4c-90556b744f53"> <name>Автор</name> <synonym> @@ -268,27 +157,6 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="3116fa60-bc42-4dea-aa03-387896168690"> - <name>ТолькоДляАвтора</name> - <synonym> - <key>ru</key> - <value>Только для автора</value> - </synonym> - <type> - <types>Boolean</types> - </type> - <toolTip> - <key>ru</key> - <value>Влияет на доступность варианта из панели отчетов: -Флажок снят - вариант доступен всем пользователям. -Флажок установлен - вариант доступен только автору.</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillValue xsi:type="core:UndefinedValue"/> - <fullTextSearch>Use</fullTextSearch> - <dataHistory>Use</dataHistory> - </attributes> <attributes uuid="5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0"> <name>ВидимостьПоУмолчанию</name> <synonym> @@ -331,51 +199,52 @@ <indexing>Index</indexing> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="f9196766-4ae2-4a73-bed6-4a8838323e02"> - <name>Настройки</name> + <attributes uuid="259cb8f5-9e78-4b2f-941b-ccb4b1112c8b"> + <name>ИнтерактивнаяПометкаУдаления</name> <synonym> <key>ru</key> - <value>Настройки</value> + <value>Интерактивная пометка удаления</value> </synonym> <type> - <types>ValueStorage</types> + <types>Boolean</types> </type> <toolTip> <key>ru</key> - <value>Пользовательские настройки варианта отчета</value> + <value>Пометка удаления, установленная пользователем</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="ca797560-8802-4bdc-b21f-7a7fd795beae"> - <name>ХешНастроек</name> + <attributes uuid="24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892"> + <name>КлючВарианта</name> <synonym> <key>ru</key> - <value>Хеш настроек</value> + <value>Ключ варианта</value> </synonym> <type> <types>String</types> <stringQualifiers> - <length>32</length> + <length>256</length> </stringQualifiers> </type> <toolTip> <key>ru</key> - <value>Служебное поле. -Используется при обновлении программы.</value> + <value>Уникальный ключ варианта отчета</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:StringValue"/> + <indexing>Index</indexing> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="56242b05-d722-4d4a-82d9-517e0e169d0b"> - <name>НаименованияПолей</name> + <attributes uuid="73c1a829-0191-486b-97a0-7f333c6f8011"> + <name>КлючевыеСлова</name> <synonym> <key>ru</key> - <value>Наименования полей</value> + <value>Ключевые слова</value> </synonym> <type> <types>String</types> @@ -383,7 +252,7 @@ </type> <toolTip> <key>ru</key> - <value>Поля, выведенные в отчете. + <value>Дополнительная терминология (в т.ч. специализированная или устаревшая). Используется при поиске.</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> @@ -413,11 +282,11 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="73c1a829-0191-486b-97a0-7f333c6f8011"> - <name>КлючевыеСлова</name> + <attributes uuid="56242b05-d722-4d4a-82d9-517e0e169d0b"> + <name>НаименованияПолей</name> <synonym> <key>ru</key> - <value>Ключевые слова</value> + <value>Наименования полей</value> </synonym> <type> <types>String</types> @@ -425,7 +294,7 @@ </type> <toolTip> <key>ru</key> - <value>Дополнительная терминология (в т.ч. специализированная или устаревшая). + <value>Поля, выведенные в отчете. Используется при поиске.</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> @@ -434,6 +303,24 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="f9196766-4ae2-4a73-bed6-4a8838323e02"> + <name>Настройки</name> + <synonym> + <key>ru</key> + <value>Настройки</value> + </synonym> + <type> + <types>ValueStorage</types> + </type> + <toolTip> + <key>ru</key> + <value>Пользовательские настройки варианта отчета</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="4eeda6df-fb48-4c88-853f-9c35e2b3a3cf"> <name>Описание</name> <synonym> @@ -454,6 +341,116 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="50a1e3bf-8624-4474-854e-21b89aaf97ed"> + <name>Отчет</name> + <synonym> + <key>ru</key> + <value>Отчет</value> + </synonym> + <type> + <types>CatalogRef.ИдентификаторыОбъектовРасширений</types> + <types>String</types> + <types>CatalogRef.ДополнительныеОтчетыИОбработки</types> + <types>CatalogRef.ИдентификаторыОбъектовМетаданных</types> + <stringQualifiers> + <length>150</length> + </stringQualifiers> + </type> + <toolTip> + <key>ru</key> + <value>Ссылка отчета или его полное имя.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fillValue xsi:type="core:StringValue"/> + <indexing>Index</indexing> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="503b3eab-b7f1-4ede-8845-3290a834cec7"> + <name>Пользовательский</name> + <synonym> + <key>ru</key> + <value>Пользовательский</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Тип варианта отчета: +Да - Пользовательский, +Нет - Предопределенный.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <indexing>Index</indexing> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="847b97a3-d0bc-45e2-b06c-932bb22d8eca"> + <name>ПредопределенныйВариант</name> + <synonym> + <key>ru</key> + <value>Предопределенный вариант</value> + </synonym> + <comment>Вариант конфигурации</comment> + <type> + <types>CatalogRef.ПредопределенныеВариантыОтчетовРасширений</types> + <types>CatalogRef.ПредопределенныеВариантыОтчетов</types> + </type> + <toolTip> + <key>ru</key> + <value>Предопределенный вариант отчета, содержит настройки по умолчанию.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <indexing>Index</indexing> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61"> + <name>ТипОтчета</name> + <synonym> + <key>ru</key> + <value>Тип отчета</value> + </synonym> + <type> + <types>EnumRef.ТипыОтчетов</types> + </type> + <toolTip> + <key>ru</key> + <value>Тип варианта отчета</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fillValue xsi:type="core:UndefinedValue"/> + <indexing>Index</indexing> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="3116fa60-bc42-4dea-aa03-387896168690"> + <name>ТолькоДляАвтора</name> + <synonym> + <key>ru</key> + <value>Только для автора</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Влияет на доступность варианта из панели отчетов: +Флажок снят - вариант доступен всем пользователям. +Флажок установлен - вариант доступен только автору.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="06afe397-1c7e-400e-bb24-f8e611d114e8"> <name>УдалитьКлючОбъекта</name> <synonym> @@ -497,6 +494,28 @@ <fillValue xsi:type="core:StringValue"/> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="ca797560-8802-4bdc-b21f-7a7fd795beae"> + <name>ХешНастроек</name> + <synonym> + <key>ru</key> + <value>Хеш настроек</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>32</length> + </stringQualifiers> + </type> + <toolTip> + <key>ru</key> + <value>Служебное поле. +Используется при обновлении программы.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:StringValue"/> + <dataHistory>Use</dataHistory> + </attributes> <tabularSections uuid="3df19dbf-efe7-4e31-99ad-fafb59ec1329"> <producedTypes> <objectType typeId="abf3e560-3e61-416a-8893-8b9da792c5a0" valueTypeId="07793fd1-5e8e-435e-98ed-fa2646c0239b"/> diff --git a/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form index 1a7053767..c3501816a 100644 --- a/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form @@ -36,6 +36,10 @@ <items xsi:type="form:Table"> <name>Список</name> <id>3</id> + <title> + <key>ru</key> + <value>Список</value> + true true @@ -268,9 +272,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl index 1a2773926..f33334857 100644 --- a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl @@ -2,7 +2,7 @@ #Область СлужебныйПрограммныйИнтерфейс -// Вызывается при установке параметров сеанса. +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры) Экспорт Если ИменаПараметровСеанса = Неопределено @@ -16,7 +16,7 @@ Или ИменаПараметровСеанса.Найти("ПодключенныеРасширения") <> Неопределено Тогда Расширения = РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные); - ПараметрыСеанса.ПодключенныеРасширения = КонтрольныеСуммыРасширений(Расширения, Ложь); + ПараметрыСеанса.ПодключенныеРасширения = КонтрольныеСуммыРасширений(Расширения); УстановленныеПараметры.Добавить("ПодключенныеРасширения"); КонецЕсли; @@ -37,12 +37,19 @@ // Расширения подключаются только в разделенном режиме, когда // вход в область данных выполнен под разделенным пользователем, -// поэтому обновление кэшей недопустимо выполнять только в этом случае. +// поэтому обновление кэшей допустимо выполнять только в этом случае. // Функция УстановленныеРасширенияДоступны() Экспорт - Возврат Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Возврат Не ОбщегоНазначения.РазделениеВключено() + Или Не СеансЗапущенБезРазделителей; КонецФункции @@ -56,13 +63,10 @@ // Расширения - Неопределено - получить контрольные суммы установленных расширений. // - ДанныеФормыКоллекция - получить контрольные суммы из указанного списка. // -// УчестьПорядокПодключения - Булево - если Ложь, строка описания контрольных сумм -// будет сформирована без учета порядка подключенных расширений. -// // Возвращаемое значение: // Строка - строки вида "<Имя расширения> (<Версия расширения>) <Контрольная сумма>". // -Функция КонтрольныеСуммыРасширений(Расширения = Неопределено, УчестьПорядокПодключения = Истина) Экспорт +Функция КонтрольныеСуммыРасширений(Расширения = Неопределено) Экспорт Если Расширения = Неопределено Тогда Расширения = РасширенияКонфигурации.Получить(); @@ -79,8 +83,8 @@ Список.Добавить(Расширение.Имя + " (" + Расширение.Версия + ") " + КонтрольнаяСумма); КонецЦикла; - Если Не УчестьПорядокПодключения Тогда - Список.СортироватьПоЗначению(); + Если Список.Количество() <> 0 Тогда + Список.Добавить("#" + Метаданные.Имя + " (" + Метаданные.Версия + ")"); КонецЕсли; КонтрольныеСуммы = ""; @@ -97,6 +101,21 @@ УстановитьПривилегированныйРежим(Истина); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + // При входе неразделенного администратора в область получить список неразделенных расширений невозможно. + // Считаем что они не изменились. + Если ОбщегоНазначения.РазделениеВключено() + И СеансЗапущенБезРазделителей + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат Ложь; + КонецЕсли; + Возврат ПараметрыСеанса.УстановленныеРасширения <> КонтрольныеСуммыРасширений(); КонецФункции @@ -121,6 +140,7 @@ |ИЗ | Справочник.ВерсииРасширений КАК ВерсииРасширений"; + // Если справочник изменяется в другом сеансе, тогда нужно дождаться окончания изменений. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииРасширений"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; @@ -197,6 +217,8 @@ |ГДЕ | ВерсииРасширений.ДатаПервогоВходаПослеУдаленияВсехРасширений <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)"; + // Если справочник ВерсииРасширений или регистр сведений СеансыВерсийРасширений изменяются в другом сеансе, + // тогда нужно дождаться окончания изменений. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииРасширений"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; @@ -279,6 +301,12 @@ КонецЦикла; // Отключение регламентного задания, если осталась только одна версия расширений. + + // Достаточно полной разделяемой блокировки справочника ВерсииРасширений и + // регистра сведений СеансыВерсийРасширений (исключительную ставить избыточно и + // крайне плохо, так как это задержит вход в другие сеансы). + // Взаимоблокировки исключены использованием разделяемых блокировок на всю таблицу в целом, + // что допустимо и необходимо для механизма регистрации использования версий. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииРасширений"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; @@ -348,7 +376,7 @@ // Включает/Отключает регламентное задание УдалениеУстаревшихПараметровРаботыВерсийРасширений. Процедура ВключитьЗаданиеУдалениеУстаревшихПараметровРаботыВерсийРасширений(Включить) Экспорт - СтандартныеПодсистемыСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( + РегламентныеЗаданияСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений, Включить); КонецПроцедуры @@ -383,11 +411,13 @@ |ИЗ | Справочник.ВерсииРасширений КАК ВерсииРасширений"; + // Если справочник изменяется в другом сеансе, тогда нужно дождаться окончания изменений. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииРасширений"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; НачатьТранзакцию(); Попытка + Блокировка.Заблокировать(); Выборка = Запрос.Выполнить().Выбрать(); ЗафиксироватьТранзакцию(); Исключение @@ -398,15 +428,20 @@ Если ВерсияНайдена(Выборка, ОписаниеРасширений) Тогда ВерсияРасширений = Выборка.Ссылка; Иначе + // Создание новой версии расширений. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииРасширений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка + // Повторная проверка, что версия еще не создана, + // что маловероятно, но возможно между транзакциями. + // Сразу исключительная блокировка недопустима, так как это + // замедлит вход пользователей в другие сеансы. Выборка = Запрос.Выполнить().Выбрать(); Если ВерсияНайдена(Выборка, ОписаниеРасширений) Тогда ВерсияРасширений = Выборка.Ссылка; Иначе + Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl deleted file mode 100644 index 102f2aa87..000000000 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl +++ /dev/null @@ -1,424 +0,0 @@ -#Область ОписаниеПеременных - -&НаКлиенте -Перем Ссылка1; - -&НаКлиенте -Перем Ссылка2; - -#КонецОбласти - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ВидимостьКомандыСравнить = - ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() И Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент(); - Элементы.ФормаСравнить.Видимость = ВидимостьКомандыСравнить; - Элементы.КонтекстноеМенюСписокСравнить.Видимость = ВидимостьКомандыСравнить; - - УникальныйИдентификаторКарточкиФайла = Параметры.УникальныйИдентификаторКарточкиФайла; - - Список.Параметры.УстановитьЗначениеПараметра("Владелец", Параметры.Файл); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура СделатьАктивнойВыполнить() - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ТекущиеДанные.Ссылка); - - Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - СменитьАктивнуюВерсиюФайла(ТекущиеДанные.Ссылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "АктивнаяВерсияИзменена"), Параметры.Файл); - Иначе - ПоказатьПредупреждение(, НСтр("ru = 'Смена активной версии разрешена только для незанятых файлов.'")); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - - Если ИмяСобытия = "Запись_Файл" И (Параметр.Событие = "ЗаконченоРедактирование" Или Параметр.Событие = "ВерсияСохранена") Тогда - - Если Параметры.Файл = Источник Тогда - - Элементы.Список.Обновить(); - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьКарточку(Команда) - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные <> Неопределено Тогда - - Версия = ТекущиеДанные.Ссылка; - - ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); - ОткрытьФорму("Справочник.ВерсииФайлов.ФормаОбъекта", ПараметрыОткрытияФормы); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередУдалением(Элемент, Отказ) - - Отказ = Истина; - ПометитьНаУдалениеСнятьПометку(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПометитьНаУдаление(Команда) - - ПометитьНаУдалениеСнятьПометку(); - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередНачаломИзменения(Элемент, Отказ) - - Отказ = Истина; - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные <> Неопределено Тогда - - Версия = ТекущиеДанные.Ссылка; - - ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); - ОткрытьФорму("Справочник.ВерсииФайлов.ФормаОбъекта", ПараметрыОткрытияФормы); - - КонецЕсли; - -КонецПроцедуры - -// Сравнить 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"; - КонецЕсли; - - ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПриАктивизацииСтроки(Элемент) - ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); - - КомандаСравненияДоступна = Ложь; - - Если ЧислоВыделенныхСтрок = 2 Тогда - КомандаСравненияДоступна = Истина; - ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда - - Если Не Элементы.Список.ТекущиеДанные.РодительскаяВерсия.Пустая() Тогда - КомандаСравненияДоступна = Истина; - Иначе - КомандаСравненияДоступна = Ложь; - КонецЕсли; - - Иначе - КомандаСравненияДоступна = Ложь; - КонецЕсли; - - Если КомандаСравненияДоступна = Истина Тогда - Элементы.ФормаСравнить.Доступность = Истина; - Элементы.КонтекстноеМенюСписокСравнить.Доступность = Истина; - Иначе - Элементы.ФормаСравнить.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокСравнить.Доступность = Ложь; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьВерсию(Команда) - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Отказ = Истина; -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура СменитьАктивнуюВерсиюФайла(Версия) - - ФайлОбъект = Версия.Владелец.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификаторКарточкиФайла); - ФайлОбъект.ТекущаяВерсия = Версия; - ФайлОбъект.ТекстХранилище = Версия.ТекстХранилище; - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификаторКарточкиФайла); - - ВерсияОбъект = Версия.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(Версия, , УникальныйИдентификаторКарточкиФайла); - ВерсияОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(Версия, УникальныйИдентификаторКарточкиФайла); - - Элементы.Список.Обновить(); - -КонецПроцедуры - -&НаСервере -Процедура УстановитьПометкуУдаления(Версия, Пометка) - ВерсияОбъект = Версия.ПолучитьОбъект(); - ВерсияОбъект.Заблокировать(); - ВерсияОбъект.УстановитьПометкуУдаления(Пометка); -КонецПроцедуры - -&НаКлиенте -Процедура ПометитьНаУдалениеСнятьПометку() - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТекущиеДанные.ПометкаУдаления Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Снять с ""%1"" пометку на удаление?'"), - Строка(ТекущиеДанные.Ссылка)); - Иначе - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пометить ""%1"" на удаление?'"), - Строка(ТекущиеДанные.Ссылка)); - КонецЕсли; - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ТекущиеДанные", ТекущиеДанные); - Обработчик = Новый ОписаниеОповещения("ПометитьНаУдалениеСнятьПометкуЗавершение", ЭтотОбъект, ПараметрыОбработчика); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); -КонецПроцедуры - -&НаКлиенте -Процедура ПометитьНаУдалениеСнятьПометкуЗавершение(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления = Не ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления; - УстановитьПометкуУдаления(ПараметрыВыполнения.ТекущиеДанные.Ссылка, ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления); - - Если ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления Тогда - ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = 1; - Иначе - ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = ПараметрыВыполнения.ТекущиеДанные.ИндексКартинки; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов) - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("СпособСравненияВерсийФайлов", СпособСравненияВерсийФайлов); - ПараметрыВыполнения.Вставить("ТекущийШаг", 1); - ПараметрыВыполнения.Вставить("ДанныеФайла1", Неопределено); - ПараметрыВыполнения.Вставить("ДанныеФайла2", Неопределено); - ПараметрыВыполнения.Вставить("Результат1", Неопределено); - ПараметрыВыполнения.Вставить("Результат2", Неопределено); - ПараметрыВыполнения.Вставить("ПолноеИмяФайла1", Неопределено); - ПараметрыВыполнения.Вставить("ПолноеИмяФайла2", Неопределено); - - СравнениеВерсийАвтомат(-1, ПараметрыВыполнения); - -КонецПроцедуры - -&НаКлиенте -Процедура СравнениеВерсийАвтомат(Результат, ПараметрыВыполнения) Экспорт - - Если Результат <> -1 Тогда - Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда - Если Результат <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; - - Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыВыполнения.ТекущийШаг = 2; - - ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 3 Тогда - ПараметрыВыполнения.Результат1 = Результат.ФайлПолучен; - ПараметрыВыполнения.ПолноеИмяФайла1 = Результат.ПолноеИмяФайла; - ПараметрыВыполнения.ТекущийШаг = 4; - - ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 4 Тогда - ПараметрыВыполнения.Результат2 = Результат.ФайлПолучен; - ПараметрыВыполнения.ПолноеИмяФайла2 = Результат.ПолноеИмяФайла; - ПараметрыВыполнения.ТекущийШаг = 5; - КонецЕсли; - КонецЕсли; - - Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда - Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда - - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; - - Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда - // Первый вызов - еще не инициализирована настройка. - Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.ВерсииФайлов.Форма.ВыборСпособаСравненияВерсий", , - ЭтотОбъект, , , , Обработчик); - Возврат; - КонецЕсли; - КонецЕсли; - ПараметрыВыполнения.ТекущийШаг = 2; - КонецЕсли; - - Если ПараметрыВыполнения.ТекущийШаг = 2 Тогда - - ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( - Ссылка1, УникальныйИдентификатор); - ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( - Ссылка2, УникальныйИдентификатор); - - ТекстСостояния = НСтр("ru = 'Выполняется сравнение версий файла ""%1""...'"); - ТекстСостояния = СтрЗаменить(ТекстСостояния, "%1", Строка(ПараметрыВыполнения.ДанныеФайла1.Ссылка)); - Состояние(ТекстСостояния); - ПараметрыВыполнения.ТекущийШаг = 3; - КонецЕсли; - - Если ПараметрыВыполнения.ТекущийШаг = 3 Тогда - Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); - РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - Обработчик, ПараметрыВыполнения.ДанныеФайла1, ПараметрыВыполнения.ПолноеИмяФайла1); - Возврат; - КонецЕсли; - - Если ПараметрыВыполнения.ТекущийШаг = 4 Тогда - Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); - РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - Обработчик, ПараметрыВыполнения.ДанныеФайла2, ПараметрыВыполнения.ПолноеИмяФайла2); - Возврат; - КонецЕсли; - - Если ПараметрыВыполнения.ТекущийШаг = 5 Тогда - Если ПараметрыВыполнения.Результат1 И ПараметрыВыполнения.Результат2 Тогда - Если ПараметрыВыполнения.ДанныеФайла1.НомерВерсии < ПараметрыВыполнения.ДанныеФайла2.НомерВерсии Тогда - ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла1; - ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла2; - Иначе - ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла2; - ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла1; - КонецЕсли; - РаботаСФайламиСлужебныйКлиент.СравнитьФайлы( - ПолноеИмяФайлаСлева, - ПолноеИмяФайлаСправа, - ПараметрыВыполнения.СпособСравненияВерсийФайлов); - КонецЕсли; - Состояние(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form index 8d3e1c3c9..09acbb2b6 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form @@ -68,6 +68,10 @@ Список 2 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Help/ru.html b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Help/ru.html index 167b22c81..c2f148aaa 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Help/ru.html +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Help/ru.html @@ -1,6 +1,6 @@

      Предназначен для выбора версии файла.

      -

      Вызывается из карточки версии файла при выборе Родительской версии.

      +

      Вызывается из карточки версии файла при выборе Родительской версии.

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

      • Номер версии - нумерация версий ведется программой автоматически при изменениях файла, при этом максимальный номер имеет последняя сохраненная версия.
      • diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Module.bsl index 5032916d2..45a32eaf5 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Module.bsl @@ -12,21 +12,18 @@ КонецЕсли; // Оформление помеченных на удаление. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления = Список.УсловноеОформление.Элементы.Добавить(); ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; ЭлементЦветаОформления.Использование = Истина; ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ПометкаУдаления"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбораДанных.ПравоеЗначение = Истина; ЭлементОтбораДанных.Использование = Истина; - ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Список"); - ЭлементОформляемогоПоля.Использование = Истина; КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form index 823e11877..77f2a59da 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form @@ -78,10 +78,6 @@ ru Форма стандартные команды - - ru - Форма стандартные команды - ФормаСтандартныеКомандыExtendedTooltip 33 @@ -149,6 +145,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl index acdac2bc2..5d5c7fc51 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl @@ -9,28 +9,25 @@ КонецЕсли; // Оформление помеченных на удаление. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления = Список.УсловноеОформление.Элементы.Добавить(); ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; ЭлементЦветаОформления.Использование = Истина; ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ПометкаУдаления"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбораДанных.ПравоеЗначение = Истина; ЭлементОтбораДанных.Использование = Истина; - ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Список"); - ЭлементОформляемогоПоля.Использование = Истина; - КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "Запись_Файл" + И Параметр.Свойство("Событие") И ( Параметр.Событие = "ЗаконченоРедактирование" ИЛИ Параметр.Событие = "ВерсияСохранена") Тогда @@ -47,7 +44,7 @@ Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока.Владелец, ВыбраннаяСтрока, УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl deleted file mode 100644 index c6a73182a..000000000 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl +++ /dev/null @@ -1,88 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Если ТипЗнч(Объект.Владелец) = Тип("СправочникСсылка.Файлы") Тогда - Элементы.ПолноеНаименование.ТолькоПросмотр = Истина; - КонецЕсли; - - Если Пользователи.ЭтоПолноправныйПользователь() Тогда - Элементы.Автор.ТолькоПросмотр = Ложь; - Элементы.ДатаСоздания.ТолькоПросмотр = Ложь; - Элементы.РодительскаяВерсия.ТолькоПросмотр = Ложь; - Иначе - Элементы.ГруппаХранение.Видимость = Ложь; - КонецЕсли; - - ТомПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Объект.Том); - - ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - - РасширениеФайлаВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( - ОбщиеНастройки.СписокРасширенийТекстовыхФайлов, Объект.Расширение); - - Если РасширениеФайлаВСписке Тогда - Если ЗначениеЗаполнено(Объект.Ссылка) Тогда - - КодировкаЗначение = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла(Объект.Ссылка); - - СписокКодировок = РаботаСФайламиСлужебный.Кодировки(); - ЭлементСписка = СписокКодировок.НайтиПоЗначению(КодировкаЗначение); - Если ЭлементСписка = Неопределено Тогда - Кодировка = КодировкаЗначение; - Иначе - Кодировка = ЭлементСписка.Представление; - КонецЕсли; - - КонецЕсли; - - Если Не ЗначениеЗаполнено(Кодировка) Тогда - Кодировка = НСтр("ru='По умолчанию'"); - КонецЕсли; - Иначе - Элементы.Кодировка.Видимость = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПослеЗаписи(ПараметрыЗаписи) - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), Объект.Владелец); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ОткрытьВыполнить() - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолноеНаименованиеПриИзменении(Элемент) - Объект.Наименование = Объект.ПолноеНаименование; -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура СохранитьКак(Команда) - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html index b0141de21..a4dc8227c 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html @@ -2,7 +2,7 @@

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

        Для просмотра списка всех версий файла откройте его карточку (в списке файлов нажмите F2 или Еще - Открыть карточку) и нажмите Версии файла на панели навигации.

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

        -

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

        +

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

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

        • Автор - пользователь, который добавил версию файла. Также в этой колонке в виде картинки отображается тип файла.
          @@ -21,7 +21,7 @@
        • Расширение - формат файла, и некоторые другие поля.

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

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

        Просмотр сведений о версии файла

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

        Замена текущей версии файла

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

        Замена текущей версии файла

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

        Сравнение двух версий файла

        • Выделите две версии в списке и нажмите Показать отличия для их сравнения. Сравнение версий поддерживается для следующих типов файлов:  HTML, TXT, RTF, DOC, DOCX, ODT.

        Сохранение версии файла на диск

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

        См. также: 

        diff --git a/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl index ef01ed3aa..433fac976 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -16,6 +20,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl index e5f2ae39c..2d0612d04 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl @@ -20,33 +20,12 @@ РодительскаяВерсия = Владелец.ТекущаяВерсия; КонецЕсли; - Если НЕ ЭтоНовый() Тогда - + Если Не ЭтоНовый() Тогда УстановленаПометкаУдаления = ПометкаУдаления И Не ПометкаУдаленияВИБ(); - - ЗаписьПодписанногоОбъекта = Ложь; - Если ДополнительныеСвойства.Свойство("ЗаписьПодписанногоОбъекта") Тогда - ЗаписьПодписанногоОбъекта = ДополнительныеСвойства.ЗаписьПодписанногоОбъекта; - КонецЕсли; - - Если ЗаписьПодписанногоОбъекта <> Истина Тогда - - СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, - "ПодписанЭП, Зашифрован"); - - СсылкаПодписан = СтруктураРеквизитов.ПодписанЭП; - СсылкаЗашифрован = СтруктураРеквизитов.Зашифрован; - - Если Зашифрован И СсылкаЗашифрован И ПодписанЭП И НЕ СсылкаПодписан Тогда - ВызватьИсключение НСтр("ru = 'Зашифрованную версию файла нельзя подписывать.'"); - КонецЕсли; - - КонецЕсли; - КонецЕсли; // Выполним установку индекса пиктограммы при записи объекта. - ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); + ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); Если СтатусИзвлеченияТекста.Пустая() Тогда СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; @@ -72,23 +51,37 @@ "ВЫБРАТЬ | ВерсииФайлов.Ссылка КАК Ссылка |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов + | Справочник." + Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя + " КАК ВерсииФайлов |ГДЕ | ВерсииФайлов.РодительскаяВерсия = &РодительскаяВерсия"; Запрос.УстановитьПараметр("РодительскаяВерсия", Ссылка); Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - - Объект = Выборка.Ссылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); - Объект.РодительскаяВерсия = РодительскаяВерсия; - Объект.Записать(); - КонецЕсли; + НачатьТранзакцию(); + Попытка + Если Не Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Выборка.Ссылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Выборка.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + Объект = Выборка.Ссылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); + Объект.РодительскаяВерсия = РодительскаяВерсия; + Объект.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецЕсли; КонецПроцедуры @@ -97,7 +90,7 @@ Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда Если НЕ Том.Пустая() И ОбщегоНазначения.СсылкаСуществует(Том) Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Том) + ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(Том) + ПутьКФайлу; Попытка Файл = Новый Файл(ПолныйПуть); Файл.УстановитьТолькоЧтение(Ложь); @@ -126,12 +119,15 @@ // Возвращает текущее значение пометки удаления в информационной базе. Функция ПометкаУдаленияВИБ() + УстановитьПривилегированныйРежим(Истина); + ИмяСправочникаВерсийФайлов = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВерсииФайлов.ПометкаУдаления |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов + | Справочник." + ИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов |ГДЕ | ВерсииФайлов.Ссылка = &Ссылка"; diff --git a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo index cf0392f26..ffcf7496c 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo +++ b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo @@ -139,7 +139,6 @@ true InDialog BothWays - Catalog.ВерсииФайлов.Form.ФормаЭлемента Catalog.ВерсииФайлов.Form.ФормаСписка Catalog.ВерсииФайлов.Form.ФормаВыбора @@ -230,10 +229,10 @@ Use - Зашифрован + УдалитьЗашифрован ru - Зашифрована + (не используется) Зашифрована Boolean @@ -316,10 +315,10 @@ Use - ПодписанЭП + УдалитьПодписанЭП ru - Подписана электронно + (не используется) Подписана электронно Boolean @@ -551,10 +550,10 @@ - ЭлектронныеПодписи + УдалитьЭлектронныеПодписи ru - электронные подписи + (не используется) Электронные подписи Use @@ -754,20 +753,6 @@ Use - - ФормаЭлемента - - ru - Форма элемента - - - - ru - - - PersonalComputer - MobileDevice - ФормаСписка @@ -791,39 +776,4 @@ PersonalComputer MobileDevice - - ВерсииФайла - - ru - Версии файла - - PersonalComputer - MobileDevice - - - ВыборСпособаСравненияВерсий - - ru - Выбор способа сравнения версий - - - - ru - - - PersonalComputer - MobileDevice - - - ОткрытьВерсииФайла - - ru - Версии файла - - FormNavigationPanelGoTo - - CatalogRef.Файлы - - Auto - diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form index ed66d0c3b..553eb693b 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 12 @@ -48,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 14 @@ -71,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -277,9 +273,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form index dd770bc79..c0129d044 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 43 @@ -39,72 +35,6 @@ КоманднаяПанель 44 - - ПереместитьВверх - 17 - true - true - - true - - false - - ПереместитьВверхExtendedTooltip - 32 - Label - true - true - - Left - - - Form.Command.ПереместитьЭлементВверх - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - Auto - - - ПереместитьВниз - 18 - true - true - - true - - false - - ПереместитьВнизExtendedTooltip - 33 - Label - true - true - - Left - - - Form.Command.ПереместитьЭлементВниз - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - Auto - true true @@ -114,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 45 @@ -137,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -253,10 +183,6 @@ ru Представление - - ru - Представление - ПредставлениеРасширеннаяПодсказка 41 @@ -431,9 +357,6 @@ Style.BorderColor - None - None - None true 60 @@ -549,7 +472,7 @@ СправочникВидыКонтактнойИнформации.РеквизитДопУпорядочивания, СправочникВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге, СправочникВидыКонтактнойИнформации.МожноИзменятьСпособРедактирования, - СправочникВидыКонтактнойИнформации.АдресТолькоРоссийский, + СправочникВидыКонтактнойИнформации.ТолькоНациональныйАдрес, СправочникВидыКонтактнойИнформации.Используется ИЗ Справочник.ВидыКонтактнойИнформации КАК СправочникВидыКонтактнойИнформации @@ -564,56 +487,6 @@ true - - ПереместитьЭлементВверх - - <key>ru</key> - <value>Переместить элемент вверх</value> - - 2 - - ru - Переместить элемент вверх - - - true - - - StdPicture.MoveUp - - - - ПереместитьЭлементВверх - - - DontUse - Auto - - - ПереместитьЭлементВниз - - <key>ru</key> - <value>Переместить элемент вниз</value> - - 3 - - ru - Переместить элемент вниз - - - true - - - StdPicture.MoveDown - - - - ПереместитьЭлементВниз - - - DontUse - Auto - diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl index 023d12ce8..cc1c313b7 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl @@ -4,8 +4,16 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + УстановитьУсловноеОформление(); + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + КонецПроцедуры #КонецОбласти @@ -28,19 +36,23 @@ #Область ОбработчикиКомандФормы +// СтандартныеПодсистемы.ПодключаемыеКоманды &НаКлиенте -Процедура ПереместитьЭлементВверх() - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(Список, Элементы.Список); - +Процедура Подключаемый_ВыполнитьКоманду(Команда) + ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список); +КонецПроцедуры + +&НаСервере +Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат); КонецПроцедуры &НаКлиенте -Процедура ПереместитьЭлементВниз() - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(Список, Элементы.Список); - +Процедура Подключаемый_ОбновитьКоманды() + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список); КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + #КонецОбласти diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form index cf4d28f1a..1882dee64 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form @@ -3,24 +3,101 @@ ГруппаОсновнаяИнформация 148 - - Тип - 70 + + ГруппаТипИНастройки + 155 + + Тип + 70 + true + true + + true + + + Объект.Тип + + + OnChange + ТипПриИзменении + + + ТипExtendedTooltip + 86 + Label + true + true + + Left + + + + ТипКонтекстноеМеню + 71 + true + + InputField + Enter + true + Left + true + + + Clearing + ТипОчистка + + 19 + true + true + false + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + ДополнительныеНастройкиАдреса + 153 + true + true + + true + + + ДополнительныеНастройкиАдресаРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Hyperlink + Form.Command.ДополнительныеНастройкиАдреса + Normal + Auto + true + true + UserCmds + Auto + true true true - - Объект.Тип - - - OnChange - ТипПриИзменении - + + <key>ru</key> + <value>Тип и настройки</value> + - ТипExtendedTooltip - 86 + ГруппаТипИНастройкиРасширеннаяПодсказка + 156 Label true true @@ -28,32 +105,13 @@ Left - - ТипКонтекстноеМеню - 71 - true - - InputField - Enter - true - Left - true - - - Clearing - ТипОчистка - - 19 - true - true - false - true - true - true - - Style.ФонУправляющегоПоля - - Normal + UsualGroup + + Auto + true + true + Auto + Auto
        @@ -145,12 +203,8 @@ <key>ru</key> - <value>Группа основная информация</value> + <value>Основная информация</value> - - ru - Группа основная информация - ГруппаОсновнаяИнформацияРасширеннаяПодсказка 149 @@ -251,10 +305,10 @@ ГруппаХранитьИсториюИзменений - 153 + 157 ОтступХранитьИсториюИзменений - 155 + 159 true true @@ -262,7 +316,7 @@ ОтступХранитьИсториюИзмененийРасширеннаяПодсказка - 157 + 161 Label true true @@ -272,7 +326,7 @@ ОтступХранитьИсториюИзмененийКонтекстноеМеню - 156 + 160 true Label @@ -285,7 +339,7 @@ ХранитьИсториюИзменений - 158 + 162 true true @@ -302,7 +356,7 @@ Button ХранитьИсториюИзмененийРасширеннаяПодсказка - 160 + 164 Label true true @@ -312,7 +366,7 @@ ХранитьИсториюИзмененийКонтекстноеМеню - 159 + 163 true CheckBoxField @@ -322,21 +376,18 @@ true + true true true <key>ru</key> - <value>Группа хранить историю изменений</value> + <value>Хранить историю изменений</value> - - ru - Группа хранить историю изменений - ГруппаХранитьИсториюИзмененийРасширеннаяПодсказка - 154 + 158 Label true true @@ -398,12 +449,8 @@ <key>ru</key> - <value>Группа тип общие для всех</value> + <value>Тип общие для всех</value> - - ru - Группа тип общие для всех - ГруппаТипОбщиеДляВсехExtendedTooltip 91 @@ -434,322 +481,6 @@ Адрес 25 - - АдресТолькоРоссийский - 13 - - <key>ru</key> - <value>Только российский</value> - - true - true - - true - - - Объект.АдресТолькоРоссийский - - Right - - OnChange - АдресТолькоРоссийскийПриИзменении - - - АдресТолькоРоссийскийExtendedTooltip - 101 - Label - true - true - - Left - - - - АдресТолькоРоссийскийКонтекстноеМеню - 14 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаПроверкаАдреса - 37 - - ДекорацияОтступ - 38 - true - true - - true - - - ДекорацияОтступРасширеннаяПодсказка - 103 - Label - true - true - - Left - - - - ДекорацияОтступКонтекстноеМеню - 39 - true - - Label - 1 - true - true - - Left - - - - ГруппаНастройкиПроверкаАдреса - 34 - - ПроверятьКорректностьАдреса - 118 - true - true - - true - - - Объект.ПроверятьКорректность - - Right - - OnChange - ПроверятьКорректностьАдресаПриИзменении - - - ПроверятьКорректностьАдресаРасширеннаяПодсказка - 120 - Label - true - true - - Left - - - - ПроверятьКорректностьАдресаКонтекстноеМеню - 119 - true - - CheckBoxField - Enter - true - Left - true - - - - ПроверятьПоКлассификатору - 121 - - <key>ru</key> - <value>Проверять по</value> - - true - true - - true - - - ПроверятьПоКлассификатору - - Left - Button - - ПроверятьПоКлассификаторуРасширеннаяПодсказка - 123 - - <key>ru</key> - <value>При проверке адреса по классификатору ФИАС выполняются дополнительные проверки: -- "Округ" (между уровнями "Регион" и "Район"). -- "Внутригородской район" (между уровнями "Город" и "Населенный пункт") -- Уровни дополнительных территорий (между "Улица", и номером дома или владения) -- Дома, владения, корпуса, строения и т.п.</value> - - Label - true - true - - Left - - - - ПроверятьПоКлассификаторуКонтекстноеМеню - 122 - true - - RadioButtonField - Enter - true - Left - true - - - - ru - ФИАС - - - 0 - - - - - ru - КЛАДР - - - 1 - - - Vertical - - - - СкрыватьНеактуальныеАдреса - 61 - true - true - - true - - - Объект.СкрыватьНеактуальныеАдреса - - Right - - СкрыватьНеактуальныеАдресаExtendedTooltip - 106 - Label - true - true - - Left - - - - СкрыватьНеактуальныеАдресаКонтекстноеМеню - 62 - true - - CheckBoxField - Enter - true - Left - true - - - - УказыватьОКТМОВручную - 129 - true - true - - true - - - Объект.УказыватьОКТМО - - Right - - УказыватьОКТМОВручнуюРасширеннаяПодсказка - 131 - Label - true - true - - Left - - - - УказыватьОКТМОВручнуюКонтекстноеМеню - 130 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа настройки проверка адреса</value> - - - ru - Группа настройки проверка адреса - - - ГруппаНастройкиПроверкаАдресаРасширеннаяПодсказка - 104 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа проверка адреса</value> - - - ru - Группа проверка адреса - - - ГруппаПроверкаАдресаРасширеннаяПодсказка - 102 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - ВключатьСтрануВПредставление 16 @@ -789,6 +520,10 @@ true + + <key>ru</key> + <value>Адрес</value> + АдресExtendedTooltip 100 @@ -852,6 +587,10 @@ true + + <key>ru</key> + <value>Адрес электронной почты</value> + АдресЭлектроннойПочтыExtendedTooltip 108 @@ -953,10 +692,6 @@ ru Телефон - - ru - Телефон - ТелефонРасширеннаяПодсказка 133 @@ -1016,10 +751,6 @@ ru Skype - - ru - Skype - SkypeРасширеннаяПодсказка 125 @@ -1112,6 +843,10 @@ true + + <key>ru</key> + <value>Другое</value> + ДругоеExtendedTooltip 110 @@ -1171,10 +906,6 @@ ru Прочие - - ru - Прочие - ПрочиеРасширеннаяПодсказка 141 @@ -1201,10 +932,6 @@ ru Проверки - - ru - Проверки - ПроверкиExtendedTooltip 99 @@ -1227,12 +954,8 @@ <key>ru</key> - <value>Группа наименование настройки по типам</value> + <value>Наименование настройки по типам</value> - - ru - Группа наименование настройки по типам - ГруппаНаименованиеНастройкиПоТипамExtendedTooltip 97 @@ -1259,6 +982,10 @@ true + + <key>ru</key> + <value>Тип контактной информации</value> + ГруппаТипКонтактнойИнформацииExtendedTooltip 90 @@ -1342,6 +1069,28 @@ true + + ДополнительныеНастройкиАдреса + + <key>ru</key> + <value>Дополнительные настройки адреса</value> + + 1 + + ru + Дополнительные настройки адреса + + + true + + + + ДополнительныеНастройкиАдреса + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl index 9dfdc7718..21567b850 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -61,21 +61,23 @@ КонецЕсли; КонецЕсли; - ПроверятьПоКлассификатору = ?(Объект.ПроверятьПоФИАС, 0, 1); + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено + И Метаданные.Обработки["РасширенныйВводКонтактнойИнформации"].Формы.Найти("НастройкиАдреса") <> Неопределено Тогда + Элементы.ДополнительныеНастройкиАдреса.Видимость = Истина; + Иначе + Элементы.ДополнительныеНастройкиАдреса.Видимость = Ложь; + КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - ИзменитьОтображениеПриИзмененииТипа(); - ОтобразитьДоступностьВариантовПроверкиПоКлассификатору(); КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - ТекущийОбъект.ПроверятьПоФИАС = (ПроверятьПоКлассификатору = 0); Если Не ТекущийОбъект.ПроверитьЗаполнение() Тогда Отказ = Истина; КонецЕсли; @@ -121,21 +123,9 @@ КонецПроцедуры -&НаКлиенте -Процедура АдресТолькоРоссийскийПриИзменении(Элемент) - - ИзменитьРеквизитыПриИзмененииТолькоРоссии(); - ИзменитьОтображениеПриИзмененииТолькоРоссии(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверятьКорректностьАдресаПриИзменении(Элемент) - ОтобразитьДоступностьВариантовПроверкиПоКлассификатору(); -КонецПроцедуры - &НаКлиенте Процедура РедактированиеТолькоВДиалогеПриИзменении(Элемент) + Если Объект.РедактированиеТолькоВДиалоге Тогда Элементы.ХранитьИсториюИзменений.Доступность = Истина; Иначе @@ -160,6 +150,14 @@ КонецПроцедуры +&НаКлиенте +Процедура ДополнительныеНастройкиАдреса(Команда) + ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПослеЗакрытияФормыНастроекАдреса", ЭтотОбъект); + ПараметрыФормы = Новый Структура("Объект", Объект); + ИмяФормыНастройкиАдреса = "Обработка.РасширенныйВводКонтактнойИнформации.Форма.НастройкиАдреса"; + ОткрытьФорму(ИмяФормыНастройкиАдреса, ПараметрыФормы,,,,, ОповещениеОЗакрытие); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -170,43 +168,34 @@ Если Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Адрес; Элементы.РедактированиеТолькоВДиалоге.Доступность = Объект.МожноИзменятьСпособРедактирования; - - ИзменитьОтображениеПриИзмененииТолькоРоссии(); - - ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда - Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.АдресЭлектроннойПочты; - Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; - ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Skype") Тогда - Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Skype; - Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; - Элементы.РазрешитьВводНесколькихЗначений.Доступность = Истина; - ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") - Или Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Факс") Тогда - Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Телефон; - Элементы.РедактированиеТолькоВДиалоге.Доступность = Объект.МожноИзменятьСпособРедактирования; - ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Другое") Тогда - Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Другое; - Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Элементы.ДополнительныеНастройкиАдреса.Видимость = Истина; Иначе - Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Прочие; - Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Элементы.ДополнительныеНастройкиАдреса.Видимость = Ложь; + Если Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда + Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.АдресЭлектроннойПочты; + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Skype") Тогда + Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Skype; + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Элементы.РазрешитьВводНесколькихЗначений.Доступность = Истина; + ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") + Или Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Факс") Тогда + Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Телефон; + Элементы.РедактированиеТолькоВДиалоге.Доступность = Объект.МожноИзменятьСпособРедактирования; + ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Другое") Тогда + Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Другое; + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Иначе + Элементы.Проверки.ТекущаяСтраница = Элементы.Проверки.ПодчиненныеЭлементы.Прочие; + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + КонецЕсли; КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ОтобразитьДоступностьВариантовПроверкиПоКлассификатору() - Если Объект.ПроверятьКорректность Тогда - Элементы.ПроверятьПоКлассификатору.Доступность = Истина; - Иначе - Элементы.ПроверятьПоКлассификатору.Доступность = Ложь; - КонецЕсли; -КонецПроцедуры - &НаКлиенте Процедура ИзменитьРеквизитыПриИзмененииТипа() Если Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда - ИзменитьРеквизитыПриИзмененииТолькоРоссии(); ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда Объект.РедактированиеТолькоВДиалоге = Ложь; @@ -214,33 +203,18 @@ ИначеЕсли Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Или Объект.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Факс") Тогда // Нет изменений - Иначе Объект.РедактированиеТолькоВДиалоге = Ложь; - КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ИзменитьОтображениеПриИзмененииТолькоРоссии() - - Элементы.ПроверятьПоКлассификатору.Доступность = Объект.ПроверятьКорректность; - Элементы.ПроверятьКорректностьАдреса.Доступность = Объект.АдресТолькоРоссийский; - Элементы.СкрыватьНеактуальныеАдреса.Доступность = Объект.АдресТолькоРоссийский; - Элементы.УказыватьОКТМОВручную.Доступность = Объект.АдресТолькоРоссийский; - -КонецПроцедуры - -&НаКлиенте -Процедура ИзменитьРеквизитыПриИзмененииТолькоРоссии() - - Если Не Объект.АдресТолькоРоссийский Тогда - Объект.ПроверятьКорректность = Ложь; - Объект.СкрыватьНеактуальныеАдреса = Ложь; - Объект.УказыватьОКТМО = Ложь; +Процедура ПослеЗакрытияФормыНастроекАдреса(Результат, ДополнительныеПараметры) Экспорт + Если ТипЗнч(Результат) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Объект, Результат); КонецЕсли; - КонецПроцедуры #КонецОбласти + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl index a7df5d1aa..a528ad0cd 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl @@ -2,26 +2,9 @@ #Область ПрограммныйИнтерфейс -// Возвращает описание блокируемых реквизитов. -// -// Возвращаемое значение: -// Массив - содержит строки в формате ИмяРеквизита[;ИмяЭлементаФормы,...] -// где ИмяРеквизита - имя реквизита объекта, ИмяЭлементаФормы - имя элемента формы, -// связанного с реквизитом. -// -Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт - - БлокируемыеРеквизиты = Новый Массив; - - БлокируемыеРеквизиты.Добавить("Тип;Тип"); - БлокируемыеРеквизиты.Добавить("Родитель"); - - Возврат БлокируемыеРеквизиты; - -КонецФункции +#Область ДляВызоваИзДругихПодсистем -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -36,6 +19,26 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов + +// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт + + БлокируемыеРеквизиты = Новый Массив; + + БлокируемыеРеквизиты.Добавить("Тип;Тип"); + БлокируемыеРеквизиты.Добавить("Родитель"); + + Возврат БлокируемыеРеквизиты; + +КонецФункции + +// Конец СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов + +#КонецОбласти + #КонецОбласти #Область ОбработчикиОбновления @@ -60,8 +63,8 @@ РезультатЗапроса.ВыгрузитьКолонку("Ссылка")); КонецПроцедуры - -Процедура ОбновитьВидПоляДругое(Параметры) Экспорт + +Процедура ЗаполнитьВидыКонтактнойИнформации(Параметры) Экспорт ВидКонтактнойИнформацииСсылка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.ВидыКонтактнойИнформации"); @@ -95,13 +98,13 @@ Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Процедуре ОбновитьВидПоляДругое не удалось обработать некоторые виды контактной информации (пропущены): %1'"), + НСтр("ru = 'Процедуре ЗаполнитьВидыКонтактнойИнформации не удалось обработать некоторые виды контактной информации (пропущены): %1'"), ПроблемныхОбъектов); ВызватьИсключение ТекстСообщения; Иначе ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, Метаданные.Справочники.ВидыКонтактнойИнформации,, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Процедура ОбновитьВидПоляДругое обработала очередную порцию видов контактной информации: %1'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Процедура ЗаполнитьВидыКонтактнойИнформации обработала очередную порцию видов контактной информации: %1'"), ОбъектовОбработано)); КонецЕсли; @@ -109,5 +112,5 @@ #КонецОбласти -#КонецЕсли +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo index 6d0de1e7b..c151b5ef1 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo @@ -154,17 +154,17 @@ Catalog.ВидыКонтактнойИнформации.Form.ФормаСписка Catalog.ВидыКонтактнойИнформации.Form.ФормаВыбораГруппы - АдресТолькоРоссийский + ТолькоНациональныйАдрес ru - Адрес только российский + Только национальный адрес Boolean ru - Допустимы только российские адреса + Допустимы только национальные адреса diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Form.form similarity index 52% rename from SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form rename to SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Form.form index 698e509e5..9b1f756d8 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Form.form @@ -1,65 +1,23 @@ - - - <key>ru</key> - <value>Помещение файла</value> - - - ТекстНапоминания - 7 - - <key>ru</key> - <value>Сейчас будет предложено выбрать файл для того, -чтобы поместить его в программу и закончить редактирование. - -Найдите нужный файл в том каталоге, который вы -указывали ранее при начале редактирования. -</value> - - true - true - - true - - - ТекстНапоминанияExtendedTooltip - 11 - Label - true - true - - Left - - - - ТекстНапоминанияКонтекстноеМеню - 8 - true - - Label - true - - Left - - + - Отступ + Описание 9 - - ПоказыватьНапоминаниеПриРедактировании - 2 + + Предупреждение32 + 6 + + <key>ru</key> + <value>Предупреждение32</value> + true true true - - БольшеНеПоказывать - - Right - ПоказыватьНапоминаниеПриРедактированииExtendedTooltip - 13 + Предупреждение32РасширеннаяПодсказка + 8 Label true true @@ -68,16 +26,51 @@ - ПоказыватьНапоминаниеПриРедактированииКонтекстноеМеню - 3 + Предупреждение32КонтекстноеМеню + 7 true - CheckBoxField - Enter - true - Left - true - + true + true + + + CommonPicture.Предупреждение32 + + + + + ОписаниеОшибки + 17 + + <key>ru</key> + <value>В файле отсутствует информация о компоненте.</value> + + true + true + + true + + + ОписаниеОшибкиРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ОписаниеОшибкиКонтекстноеМеню + 18 + true + + Label + true + 2 + + Left + true true @@ -86,15 +79,11 @@ <key>ru</key> - <value>Отступ</value> + <value>Описание</value> - - ru - Отступ - - ОтступExtendedTooltip - 12 + ОписаниеРасширеннаяПодсказка + 10 Label true true @@ -104,31 +93,70 @@ UsualGroup - Vertical Auto - NormalSeparation true true Auto Auto + + ОбщееОписание + 11 + + <key>ru</key> + <value>Необходимо указать zip-архив с внешней компонентой. +Подробнее: +<link http://its.1c.ru/db/metodtorg/content/3221/hdoc>http://its.1c.ru/db/metodtorg/content/3221/hdoc</>.</value> + + true + true + + true + + + ОбщееОписаниеРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ОбщееОписаниеКонтекстноеМеню + 12 + true + + true + Label + true + true + + Left + + Bottom true ФормаКоманднаяПанель -1 - ФормаПродолжить - 6 + ФормаОК + 1 + + <key>ru</key> + <value> ОК </value> + true true true - ФормаПродолжитьРасширеннаяПодсказка - 10 + ФормаОКРасширеннаяПодсказка + 2 Label true true @@ -136,33 +164,7 @@ Left - Form.Command.Продолжить - Auto - true - true - true - UserCmds - Auto - - - ФормаОтмена - 14 - true - true - - true - - - ФормаОтменаРасширеннаяПодсказка - 15 - Label - true - true - - Left - - - Form.StandardCommand.Cancel + Form.StandardCommand.OK Normal Auto true @@ -170,78 +172,40 @@ UserCmds Auto - Right + Center + true OnCreateAtServer ПриСозданииНаСервере + Abort + Cancel + Close + Help + Ignore + No + RestoreValues + Retry + SaveValues + Yes + 35 LockOwner true + true true Vertical true - true true 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 - - - - ПродолжитьВыполнить - - - DontUse - Auto - + diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Module.bsl new file mode 100644 index 000000000..781860af5 --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОшибкаЗагрузкиКомпоненты/Module.bsl @@ -0,0 +1,15 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Элементы.ОписаниеОшибки.Заголовок = Параметры.ОписаниеОшибки; + +КонецПроцедуры + +#КонецОбласти 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..987dbf58f --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,25 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Идентификатор + Asc + + + ДатаВерсии + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..cde192812 --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form @@ -0,0 +1,819 @@ + + + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + БыстрыеОтборы + 44 + + ИспользованиеОтбор + 62 + + <key>ru</key> + <value>Показывать</value> + + true + true + + true + + + ИспользованиеОтбор + + + OnChange + ИспользованиеОтборПриИзменении + + + ИспользованиеОтборРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ИспользованиеОтборКонтекстноеМеню + 63 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + + + ru + Все + + + 0 + + + + + ru + Используемые + + + 1 + + + + + ru + Отключенные + + + 2 + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Быстрые отборы</value> + + + БыстрыеОтборыExtendedTooltip + 45 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КоманднаяПанель + 36 + + ГруппаДействие + 65 + + ФормаОбновитьССайта + 67 + true + true + + true + + + ФормаОбновитьССайтаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Form.Command.ОбновитьССайта + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаОбновитьИзФайла + 58 + true + true + + true + + + ФормаОбновитьИзФайлаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьКак + 60 + true + true + + true + + + ФормаСохранитьКакРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Действие</value> + + + ГруппаДействиеРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + Copy + ShowMultipleSelection + + Идентификатор + 25 + true + true + + true + + + Список.Идентификатор + + + ИдентификаторРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ИдентификаторКонтекстноеМеню + 26 + true + + LabelField + Enter + true + Left + true + + 25 + true + true + + + + Версия + 22 + true + true + + true + + + Список.Версия + + + ВерсияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ВерсияКонтекстноеМеню + 23 + true + + LabelField + Enter + true + Left + true + + 18 + true + true + + + + ОбновлятьССайта + 28 + true + true + + true + + + Список.ОбновлятьССайта + + None + + ОбновлятьССайтаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ОбновлятьССайтаКонтекстноеМеню + 29 + true + + CheckBoxField + Center + Enter + true + + CommonPicture.ОбновлениеВнешнихКомпонентССайта + + Center + true + + + + Наименование + 52 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 53 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ссылка + 31 + true + true + + + Список.Ссылка + + + СсылкаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 32 + true + + LabelField + Enter + true + Left + true + + 1 + true + true + + + None + + СписокКоманднаяПанель + 5 + Left + true + + + BeforeAddRow + СписокПередНачаломДобавления + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + + СписокКонтекстноеМенюОбновитьИзФайла + 40 + true + true + + true + + + СписокКонтекстноеМенюОбновитьИзФайлаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюСохранитьКак + 42 + true + true + + true + + + СписокКонтекстноеМенюСохранитьКакРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + СписокКомпоновщикНастроекПользовательскиеНастройки + +
        + + ФормаКоманднаяПанель + -1 + Left + + + OnLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + DontBlock + Use + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.Ссылка + +
        true
        + + ВЫБРАТЬ + Таблица.Ссылка КАК Ссылка, + Таблица.ПометкаУдаления КАК ПометкаУдаления, + Таблица.Наименование КАК Наименование, + Таблица.Версия КАК Версия, + Таблица.Идентификатор КАК Идентификатор, + Таблица.Использование КАК Использование, + Таблица.ОбновлятьССайта КАК ОбновлятьССайта, + Таблица.ДатаВерсии КАК ДатаВерсии +ИЗ + Справочник.ВнешниеКомпоненты КАК Таблица + Catalog.ВнешниеКомпоненты + true + true + true + true + true + +
        + + ИспользованиеОтбор + 2 + + Number + + + + true + + + true + + + ИспользованиеОтбор + + + + ОбновитьИзФайла + + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 2 + + ru + Обновить из файла на диске... + + + true + + + CommonPicture.ОбновитьФайлИзФайлаНаДиске + + + + ОбновитьИзФайла + + + DontUse + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 3 + + ru + Сохранить как... + + + true + + + CommonPicture.СохранитьФайлКак + + + + СохранитьКак + + + DontUse + Auto + + + ОбновитьССайта + + <key>ru</key> + <value>Обновить с сайта</value> + + 1 + + ru + Обновить с сайта + + + true + + + + ОбновитьССайта + + + DontUse + Auto + + + + + + +
        diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..50f971b8b --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,224 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Если Не ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаССайта() Тогда + + Элементы.ОбновлятьССайта.Видимость = Ложь; + Элементы.ФормаОбновитьССайта.Видимость = Ложь; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + УстановитьОтбор(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ИспользованиеОтборПриИзменении(Элемент) + + УстановитьОтбор(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) + + Если Копирование Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОбновитьССайта(Команда) + + ОбновитьКомпонентыССайта(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайла(Команда) + + ДанныеСтроки = Элементы.Список.ТекущиеДанные; + Если ДанныеСтроки = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Ключ", ДанныеСтроки.Ссылка); + ПараметрыФормы.Вставить("ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии", Истина); + ОткрытьФорму("Справочник.ВнешниеКомпоненты.ФормаОбъекта", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + ДанныеСтроки = Элементы.Список.ТекущиеДанные; + Если ДанныеСтроки = Неопределено Тогда + Возврат; + КонецЕсли; + + ВнешниеКомпонентыСлужебныйКлиент.СохранитьКомпонентуВФайл(ДанныеСтроки.Ссылка); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Выполняет обновление компонент с сайта +&НаКлиенте +Процедура ОбновитьКомпонентыССайта() + + МассивСсылок = Элементы.Список.ВыделенныеСтроки; + + Если МассивСсылок.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ДлительнаяОперация = НачатьОбновлениеКомпонентССайтаНаСервере(МассивСсылок); + + Если ДлительнаяОперация = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Выполняется обновление внешних компонент...'"); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + ПараметрыОжидания.ВыводитьСообщения = Истина; + + Оповещение = Новый ОписаниеОповещения("ОбновитьКомпонентыССайтаЗавершение", ЭтотОбъект); + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьКомпонентыССайта +&НаКлиенте +Процедура ОбновитьКомпонентыССайтаЗавершение(Результат, ДополнительныеПараметры) Экспорт + + // Ответ: + // - Структура - Выполнено - результат в структуре. + // - Неопределено - Отменено пользователем. + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Сообщения <> Неопределено Тогда + Для каждого СообщениеПользователю Из Результат.Сообщения Цикл + ПоказатьОповещениеПользователя(НСтр("ru = 'Обновление с сайта'"),, + СообщениеПользователю.Текст, БиблиотекаКартинок.Информация32); + КонецЦикла; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ТекстОшибки = НСтр("ru = 'Ошибка при обновлении с сайта: %1.'"); + ПоказатьОповещениеПользователя(НСтр("ru = 'Обновление с сайта'"),, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, + Результат.КраткоеПредставлениеОшибки), + БиблиотекаКартинок.Ошибка32); + КонецЕсли; + + Если Результат.Статус = "Выполнено" Тогда + Элементы.Список.Обновить(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Обновление с сайта'"),, + НСтр("ru = 'Обновление с сайта завершено.'"), БиблиотекаКартинок.Информация32); + КонецЕсли; + +КонецПроцедуры + +///////////////////////////////////////////////////////// +// Серверная логика модели представления. + +// Серверная логика обновления компоненты с сайта. +&НаСервере +Функция НачатьОбновлениеКомпонентССайтаНаСервере(МассивСсылок) + + Если Не ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаССайта() Тогда + Возврат Неопределено; + КонецЕсли; + + Если МассивСсылок.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление внешней компоненты.'"); + + Возврат ДлительныеОперации.ВыполнитьВФоне("ВнешниеКомпонентыСлужебный.ОбновитьКомпонентыССайта", + МассивСсылок, ПараметрыВыполнения); + +КонецФункции + +///////////////////////////////////////////////////////// +// Представление данных на форме. + +&НаСервере +Процедура УстановитьОтбор() + + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ИспользованиеОтбор", ИспользованиеОтбор); + УстановитьОтборСписка(Список, ПараметрыОтбора); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура УстановитьОтборСписка(Список, ПараметрыОтбора) + + Если ПараметрыОтбора["ИспользованиеОтбор"] = 0 Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "Использование",,,, Ложь); + ИначеЕсли ПараметрыОтбора["ИспользованиеОтбор"] = 1 Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "Использование", Перечисления.ВариантыИспользованияВнешнихКомпонент.Используется,,, Истина); + ИначеЕсли ПараметрыОтбора["ИспользованиеОтбор"] = 2 Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "Использование", Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена,,, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьУсловноеОформление() + + Список.УсловноеОформление.Элементы.Очистить(); + + ЭлементУсловногоОформления = Список.УсловноеОформление.Элементы.Добавить(); + + ОтборЭлемента = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Использование"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена; + + ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра( + "TextColor", Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение); + +КонецПроцедуры + +#КонецОбласти \ 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..06f34533c --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,2093 @@ + + + + Шапка + 70 + + ОшибкаКомпоненты + 138 + + ОшибкаКомпонентыКартинкаПредупреждения + 140 + + <key>ru</key> + <value>Ошибка компоненты картинка предупреждения</value> + + true + true + + true + + + ОшибкаКомпонентыКартинкаПредупрежденияРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + + ОшибкаКомпонентыКартинкаПредупрежденияКонтекстноеМеню + 141 + true + + true + true + false + + + CommonPicture.Предупреждение32 + + + + + ОшибкаКомпонентыПояснение + 143 + + <key>ru</key> + <value>Описание последней ошибки данной компоненты.</value> + + true + true + + true + + + ОшибкаКомпонентыПояснениеРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + + ОшибкаКомпонентыПояснениеКонтекстноеМеню + 144 + true + + Label + 75 + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Ошибка компоненты</value> + + + ОшибкаКомпонентыРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + UsualGroup + + Center + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаИдентификаторВерсия + 72 + + Идентификатор + 10 + true + true + + true + + + Объект.Идентификатор + + ShowBottom + + ИдентификаторРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ИдентификаторКонтекстноеМеню + 11 + true + + InputField + Show + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Версия + 7 + true + true + + true + + + Объект.Версия + + + ВерсияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ВерсияКонтекстноеМеню + 8 + true + + InputField + Show + Auto + true + Left + true + + 18 + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Идентификатор версия</value> + + + ГруппаИдентификаторВерсияРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаНаименование + 162 + + Наименование + 146 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Объект.Description + + Button + + НаименованиеРасширеннаяПодсказка + 148 + + <key>ru</key> + <value>Имя внешней компоненты для отображения пользователям.</value> + + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 147 + true + + InputField + Show + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Наименование</value> + + + ГруппаНаименованиеРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИспользованиеОбновлятьССайта + 155 + + Использование + 131 + true + true + + true + + + Объект.Использование + + None + + ru + В режиме отладки доступна только полноправному пользователю + + + OnChange + ИспользованиеПриИзменении + + + ИспользованиеРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + ИспользованиеКонтекстноеМеню + 132 + true + + RadioButtonField + Enter + true + Left + true + + Tumbler + + + Enum.ВариантыИспользованияВнешнихКомпонент.EnumValue.Используется + + + + + Enum.ВариантыИспользованияВнешнихКомпонент.EnumValue.Отключена + + + Vertical + + + + ОбновлятьССайта + 16 + true + true + + true + + + Объект.ОбновлятьССайта + + Right + + ОбновлятьССайтаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ОбновлятьССайтаКонтекстноеМеню + 17 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Использование обновлять с сайта</value> + + + ГруппаИспользованиеОбновлятьССайтаРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Шапка</value> + + 60 + false + + ШапкаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПоддерживаемыеКлиенты + 58 + + Подсказка + 134 + + ГруппаWindows + 60 + + ГруппаWindowsТонкийКлиент + 89 + + WindowsТонкийКлиент + 91 + + <key>ru</key> + <value>Тонкий клиент</value> + + true + true + + true + + + WindowsТонкийКлиентРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + WindowsТонкийКлиентКонтекстноеМеню + 92 + true + + Label + 10 + true + true + + Left + + + + Windows_x86 + 19 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Windows_x86 + + Right + + Windows_x86РасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + Windows_x86КонтекстноеМеню + 20 + true + + CheckBoxField + Auto + true + Left + true + + + + Windows_x86_64 + 22 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.Windows_x86_64 + + Right + + Windows_x86_64РасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + Windows_x86_64КонтекстноеМеню + 23 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тонкий клиент</value> + + + ГруппаWindowsТонкийКлиентРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsChrome + 96 + + WindowsChrome + 98 + + <key>ru</key> + <value>Chrome</value> + + true + true + + true + + + WindowsChromeРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + WindowsChromeКонтекстноеМеню + 99 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_Chrome + 46 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Windows_x86_Chrome + + Right + + Windows_x86_ChromeРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + Windows_x86_ChromeКонтекстноеМеню + 47 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Сhrome</value> + + + ГруппаWindowsChromeРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsFirefox + 106 + + WindowsFirefox + 108 + + <key>ru</key> + <value>Firefox</value> + + true + true + + true + + + WindowsFirefoxРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + WindowsFirefoxКонтекстноеМеню + 109 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_Firefox + 31 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Windows_x86_Firefox + + Right + + Windows_x86_FirefoxРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + Windows_x86_FirefoxКонтекстноеМеню + 32 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Firefox</value> + + + ГруппаWindowsFirefoxРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsInternetExplorer + 101 + + WindowsInternetExplorer + 103 + + <key>ru</key> + <value>Internet Explorer</value> + + true + true + + true + + + WindowsInternetExplorerРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + WindowsInternetExplorerКонтекстноеМеню + 104 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_MSIE + 40 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Windows_x86_MSIE + + Right + + Windows_x86_MSIEРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + Windows_x86_MSIEКонтекстноеМеню + 41 + true + + CheckBoxField + Auto + true + Left + true + + + + Windows_x86_64_MSIE + 43 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.Windows_x86_64_MSIE + + Right + + Windows_x86_64_MSIEРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + Windows_x86_64_MSIEКонтекстноеМеню + 44 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Internet explorer</value> + + + ГруппаWindowsInternetExplorerРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Windows</value> + + true + + ГруппаWindowsРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ГруппаLinux + 62 + + ГруппаLinuxТонкийКлиент + 111 + + LinuxТонкийКлиент + 113 + + <key>ru</key> + <value>Тонкий клиент</value> + + true + true + + true + + + LinuxТонкийКлиентРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + LinuxТонкийКлиентКонтекстноеМеню + 114 + true + + Label + 9 + true + true + + Left + + + + Linux_x86 + 25 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Linux_x86 + + Right + + Linux_x86РасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + Linux_x86КонтекстноеМеню + 26 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64 + 28 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.Linux_x86_64 + + Right + + Linux_x86_64РасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + Linux_x86_64КонтекстноеМеню + 29 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тонкий клиент</value> + + + ГруппаLinuxТонкийКлиентРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаLinuxChrome + 116 + + LinuxChrome + 118 + + <key>ru</key> + <value>Chrome</value> + + true + true + + true + + + LinuxChromeРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + + LinuxChromeКонтекстноеМеню + 119 + true + + Label + 9 + true + true + + Left + + + + Linux_x86_Chrome + 49 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Linux_x86_Chrome + + Right + + Linux_x86_ChromeРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + Linux_x86_ChromeКонтекстноеМеню + 50 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64_Chrome + 52 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.Linux_x86_64_Chrome + + Right + + Linux_x86_64_ChromeРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + Linux_x86_64_ChromeКонтекстноеМеню + 53 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Сhrome</value> + + + ГруппаLinuxChromeРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаLinuxFirefox + 121 + + LinuxFirefox + 123 + + <key>ru</key> + <value>Firefox</value> + + true + true + + true + + + LinuxFirefoxРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + LinuxFirefoxКонтекстноеМеню + 124 + true + + Label + 9 + true + true + + Left + + + + Linux_x86_Firefox + 34 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Объект.Linux_x86_Firefox + + Right + + Linux_x86_FirefoxРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + Linux_x86_FirefoxКонтекстноеМеню + 35 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64_Firefox + 37 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.Linux_x86_64_Firefox + + Right + + Linux_x86_64_FirefoxРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + Linux_x86_64_FirefoxКонтекстноеМеню + 38 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Firefox</value> + + + ГруппаLinuxFirefoxРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Linux</value> + + true + + ГруппаLinuxРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ГруппаMacOS + 64 + + ГруппаMacOSSafari + 126 + + MacOSSafari + 128 + + <key>ru</key> + <value>Safari</value> + + true + true + + true + + + MacOSSafariРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + + MacOSSafariКонтекстноеМеню + 129 + true + + Label + true + true + + Left + + + + MacOS_x86_64_Safari + 55 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Объект.MacOS_x86_64_Safari + + Right + + MacOS_x86_64_SafariРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + MacOS_x86_64_SafariКонтекстноеМеню + 56 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Safari</value> + + + ГруппаMacOSSafariРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>OS X (macOS)</value> + + true + + ГруппаMacOSРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Подсказка</value> + + ShowTop + + ПодсказкаРасширеннаяПодсказка + 135 + + <key>ru</key> + <value>Внешние компоненты платформозависимы, и не все внешние компоненты смогут работать на любой операционной системе или в любом браузере.</value> + + Label + 60 + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Поддерживаемые компонентой операционные системы и виды клиентов</value> + + 60 + true + + ГруппаПоддерживаемыеКлиентыРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + true + true + auto + Auto + Auto + + + + ДатаВерсии + 159 + true + true + + + Объект.ДатаВерсии + + + ДатаВерсииРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + ДатаВерсииКонтекстноеМеню + 160 + true + + InputField + Show + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаЗаписатьИЗакрыть + 149 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписать + 157 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + Form.StandardCommand.Write + Normal + Picture + true + true + UserCmds + Auto + + + ГруппаДействие + 136 + + ФормаОбновитьССайта + 83 + true + true + + true + + + ФормаОбновитьССайтаРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Form.Command.ОбновитьССайта + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаОбновитьИзФайла + 77 + true + true + + true + + + ФормаОбновитьИзФайлаРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьКак + 87 + true + true + + true + + + ФормаСохранитьКакРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Действие</value> + + + ГруппаДействиеРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + + + ФормаСтандартныеКоманды + 151 + true + true + + true + + + <key>ru</key> + <value>Форма стандартные команды</value> + + + ФормаСтандартныеКомандыРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 153 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + ShowInList + WriteAndClose + 65 + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + CatalogObject.ВнешниеКомпоненты + + + true + + + true + +
        true
        + true +
        + + АдресДвоичныхДанныхКомпоненты + + <key>ru</key> + <value>Адрес двоичных данных компоненты</value> + + 2 + + String + + + + true + + + true + + + + ОбновитьИзФайла + + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 1 + + ru + Обновить из файла на диске... + + + true + + + CommonPicture.ОбновитьФайлИзФайлаНаДиске + + + + ОбновитьИзФайла + + + DontUse + Auto + + + ОбновитьССайта + + <key>ru</key> + <value>Обновить с сайта</value> + + 3 + + ru + Обновить с сайта + + + true + + + + ОбновитьССайта + + + DontUse + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 2 + + ru + Сохранить как... + + + true + + + CommonPicture.СохранитьФайлКак + + + + СохранитьКак + + + DontUse + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 4 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + DontUse + Auto + + + ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии + + Boolean + + true + + + ВернутьРезультатЗагрузкиИзФайла + + Boolean + + true + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + + 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..d12fedfb4 --- /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..1820f742b --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,412 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ЭтоНовый = Объект.Ссылка.Пустая(); + + Если ЭтоНовый Тогда + Параметры.ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии = Истина; + КонецЕсли; + + УстановитьВидимостьДоступность(); + + Если Не ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаССайта() Тогда + + Элементы.ОбновлятьССайта.Видимость = Ложь; + Элементы.ФормаОбновитьССайта.Видимость = Ложь; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Параметры.ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии Тогда + ПодключитьОбработчикОжидания("ЗагрузитьКомпонентуИзФайла", 0.1, Истина); + КонецЕсли + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + // Если вызвана команда "Перечитать" необходимо удалить буфер данных компоненты + Если ЭтоАдресВременногоХранилища(АдресДвоичныхДанныхКомпоненты) Тогда + УдалитьИзВременногоХранилища(АдресДвоичныхДанныхКомпоненты); + АдресДвоичныхДанныхКомпоненты = Неопределено; + КонецЕсли; + + УстановитьВидимостьДоступность(); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + // Если есть двоичные данные компоненты, которые надо сохранить, то помещаем их в ДополнительныеСвойства. + Если ЭтоАдресВременногоХранилища(АдресДвоичныхДанныхКомпоненты) Тогда + ДвоичныеДанныеКомпоненты = ПолучитьИзВременногоХранилища(АдресДвоичныхДанныхКомпоненты); + ТекущийОбъект.ДополнительныеСвойства.Вставить("ДвоичныеДанныеКомпоненты", ДвоичныеДанныеКомпоненты); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если Не ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + УстановитьВидимостьДоступность(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + ЗакрытьСПараметромЗакрытия(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ИспользованиеПриИзменении(Элемент) + + УстановитьВидимостьДоступность(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + ОчиститьСообщения(); + Записать(Новый Структура("ЗаписатьИЗакрыть")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьССайта(Команда) + + ОчиститьСообщения(); + ОбновитьКомпонентуССайта(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайла(Команда) + + ОчиститьСообщения(); + ЗагрузитьКомпонентуИзФайла(); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + Если ЭтоАдресВременногоХранилища(АдресДвоичныхДанныхКомпоненты) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Перед сохранение компоненты в файл элемент справочника нужно записать.'")); + Иначе + ОчиститьСообщения(); + ВнешниеКомпонентыСлужебныйКлиент.СохранитьКомпонентуВФайл(Объект.Ссылка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Строит диалог загрузки компоненты из файла. +&НаКлиенте +Процедура ЗагрузитьКомпонентуИзФайла() + + Оповещение = Новый ОписаниеОповещения("ЗагрузитьКомпонентуПослеПредупрежденияБезопасности", ЭтотОбъект); + ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемВнешнейКомпоненты"); + ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы,,,,, Оповещение); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьКомпонентуИзФайла. +&НаКлиенте +Процедура ЗагрузитьКомпонентуПослеПредупрежденияБезопасности(Ответ, Контекст) Экспорт + + // Ответ: + // - "Продолжить" - Загрузить. + // - КодВозвратаДиалога.Отмена - Отклонить. + // - Неопределено - Закрыто окно. + Если Ответ <> "Продолжить" Тогда + ЗагрузитьКомпонентуЗавершение(Контекст); + Возврат; + КонецЕсли; + + ПараметрыДиалога = Новый Структура; + ПараметрыДиалога.Вставить("Режим", РежимДиалогаВыбораФайла.Открытие); + ПараметрыДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл внешней компоненты'")); + ПараметрыДиалога.Вставить("Фильтр", НСтр("ru = 'Внешняя компонента (*.zip)|*.zip|Все файлы(*.*)|*.*'")); + + Оповещение = Новый ОписаниеОповещения("ЗагрузитьКомпонентуПослеПомещенияФайла", ЭтотОбъект, Контекст); + СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Оповещение, + УникальныйИдентификатор, Объект.ИмяФайла, ПараметрыДиалога); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьКомпонентуИзФайла. +&НаКлиенте +Процедура ЗагрузитьКомпонентуПослеПомещенияФайла(ПомещенныеФайлы, Контекст) Экспорт + + Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда + ЗагрузитьКомпонентуЗавершение(Контекст); + Возврат; + КонецЕсли; + + ОписаниеФайла = ПомещенныеФайлы[0]; + + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("АдресХранилищаФайла", ОписаниеФайла.Хранение); + ПараметрыЗагрузки.Вставить("ИмяФайла", ТолькоИмяФайла(ОписаниеФайла.Имя)); + + Результат = ЗагрузитьКомпонентуИзФайлаНаСервере(ПараметрыЗагрузки); + Если Не Результат.Загружено + Или Не ЭтоАдресВременногоХранилища(АдресДвоичныхДанныхКомпоненты)Тогда + + // Ошибка при загрузке. + + Оповещение = Новый ОписаниеОповещения("ЗагрузитьКомпонентуПослеОтображенияОшибки", ЭтотОбъект, Контекст); + + ПараметрыФормы = Новый Структура("ОписаниеОшибки", Результат.ОписаниеОшибки); + ОткрытьФорму("Справочник.ВнешниеКомпоненты.Форма.ОшибкаЗагрузкиКомпоненты", ПараметрыФормы, ЭтотОбъект, + УникальныйИдентификатор,,, Оповещение); + + Иначе + + // Успешно загружена. + + Если ПроверитьЗаполнение() Тогда + ЗагрузитьКомпонентуЗавершение(Контекст); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьКомпонентуИзФайла. +&НаКлиенте +Процедура ЗагрузитьКомпонентуПослеОтображенияОшибки(РезультатЗакрытия, Контекст) Экспорт + + ЗагрузитьКомпонентуЗавершение(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьКомпонентуИзФайла. +&НаКлиенте +Процедура ЗагрузитьКомпонентуЗавершение(Контекст) + + Если Параметры.ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии И Открыта() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обновление компоненты с сайта. +&НаКлиенте +Процедура ОбновитьКомпонентуССайта() + + ДлительнаяОперация = НачатьОбновлениеКомпонентыССайтаНаСервере(); + + Если ДлительнаяОперация = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Выполняется обновление внешней компоненты...'"); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + Оповещение = Новый ОписаниеОповещения("ОбновитьКомпонентуССайтаЗавершение", ЭтотОбъект); + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьКомпонентуССайта. +&НаКлиенте +Процедура ОбновитьКомпонентуССайтаЗавершение(Результат, ДополнительныеПараметры) Экспорт + + // Ответ: + // - Структура - Выполнено - результат в структуре. + // - Неопределено - Отменено пользователем. + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки); + КонецЕсли; + + Если Результат.Статус = "Выполнено" Тогда + ЗавершитьОбновлениеКомпонентыССайтаНаСервере(Результат); + ПоказатьОповещениеПользователя(НСтр("ru = 'Обновление с сайта'"),, + НСтр("ru = 'Внешняя компонента успешно обновлена.'"), БиблиотекаКартинок.Успешно32); + КонецЕсли; + +КонецПроцедуры + +///////////////////////////////////////////////////////// +// Серверная логика модели представления. + +// Серверная логика процедуры ЗагрузитьКомпонентуИзФайла. +&НаСервере +Функция ЗагрузитьКомпонентуИзФайлаНаСервере(ПараметрыЗагрузки) + + Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда + ВызватьИсключение НСтр("ru = 'Не достаточно прав для совершения операции.'"); + КонецЕсли; + + Зарегистрирована = Ложь; + + ОбъектСправочника = РеквизитФормыВЗначение("Объект"); + + Информация = ВнешниеКомпонентыСлужебный.ИнформацияОКомпоненте(ПараметрыЗагрузки.АдресХранилищаФайла); + + Если Не Информация.Разобрано Тогда + Возврат Новый Структура("Загружено, ОписаниеОшибки", Ложь, Информация.ОписаниеОшибки); + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ОбъектСправочника, Информация.Реквизиты); // По данным манифеста. + ОбъектСправочника.ИмяФайла = ПараметрыЗагрузки.ИмяФайла; // Установка имени файла. + АдресДвоичныхДанныхКомпоненты = ПоместитьВоВременноеХранилище(Информация.ДвоичныеДанные, + УникальныйИдентификатор); + + ЗначениеВРеквизитФормы(ОбъектСправочника, "Объект"); + + Модифицированность = Истина; + УстановитьВидимостьДоступность(); + + Возврат Новый Структура("Загружено", Истина); + +КонецФункции + +// Серверная логика обновления компоненты с сайта. +&НаСервере +Функция НачатьОбновлениеКомпонентыССайтаНаСервере() + + Если Не ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаССайта() Тогда + Возврат Неопределено; + КонецЕсли; + + ЭтоНовый = Объект.Ссылка.Пустая(); + Если ЭтоНовый Тогда + Возврат Неопределено; + КонецЕсли; + + МассивСсылок = Новый Массив; + МассивСсылок.Добавить(Объект.Ссылка); + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление внешней компоненты.'"); + + Возврат ДлительныеОперации.ВыполнитьВФоне("ВнешниеКомпонентыСлужебный.ОбновитьКомпонентыССайта", + МассивСсылок, ПараметрыВыполнения); + +КонецФункции + +// Серверная логика обновления компоненты с сайта. +&НаСервере +Функция ЗавершитьОбновлениеКомпонентыССайтаНаСервере(Результат) + + // Обновление формы по новому значению объекта в ИБ. + ЭтотОбъект.Прочитать(); + + Модифицированность = Ложь; + УстановитьВидимостьДоступность(); + +КонецФункции + +///////////////////////////////////////////////////////// +// Представление данных на форме. + +// Для внутреннего использования. +&НаСервере +Процедура УстановитьВидимостьДоступность() + + ЭтоНовый = Объект.Ссылка.Пустая(); + + // Отображение описания ошибки. + Элементы.ОшибкаКомпоненты.Видимость = Ложь; + + // Зависимость использования и автоматического обновления. + КомпонентаОтключена = (Объект.Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена); + Элементы.ОбновлятьССайта.Доступность = Не КомпонентаОтключена; + + // Параметры отображения предупреждений при редактировании + ОтображатьПредупреждение = ОтображениеПредупрежденияПриРедактировании.Отображать; + НеОтображатьПредупреждение = ОтображениеПредупрежденияПриРедактировании.НеОтображать; + Если ЗначениеЗаполнено(Объект.Наименование) Тогда + Элементы.Наименование.ОтображениеПредупрежденияПриРедактировании = ОтображатьПредупреждение; + Иначе + Элементы.Наименование.ОтображениеПредупрежденияПриРедактировании = НеОтображатьПредупреждение; + КонецЕсли; + Если ЗначениеЗаполнено(Объект.Идентификатор) Тогда + Элементы.Идентификатор.ОтображениеПредупрежденияПриРедактировании = ОтображатьПредупреждение; + Иначе + Элементы.Идентификатор.ОтображениеПредупрежденияПриРедактировании = НеОтображатьПредупреждение; + КонецЕсли; + Если ЗначениеЗаполнено(Объект.Версия) Тогда + Элементы.Версия.ОтображениеПредупрежденияПриРедактировании = ОтображатьПредупреждение; + Иначе + Элементы.Версия.ОтображениеПредупрежденияПриРедактировании = НеОтображатьПредупреждение; + КонецЕсли; + + // Доступность кнопки Сохранить в файл + Элементы.ФормаСохранитьКак.Доступность = Не ЭтоНовый; + Элементы.ФормаОбновитьССайта.Доступность = Не ЭтоНовый; + +КонецПроцедуры + +///////////////////////////////////////////////////////// +// Прочее. + +// Для внутреннего использования. +&НаКлиенте +Функция ЗакрытьСПараметромЗакрытия() + + ПараметрЗакрытия = Неопределено; + + Если Параметры.ВернутьРезультатЗагрузкиИзФайла Тогда + + ПараметрЗакрытия = Новый Структура; + ПараметрЗакрытия.Вставить("Идентификатор", Объект.Идентификатор); + ПараметрЗакрытия.Вставить("Версия" , Объект.Версия); + ПараметрЗакрытия.Вставить("Наименование" , Объект.Наименование); + + КонецЕсли; + + Закрыть(ПараметрЗакрытия); + +КонецФункции + +// Для внутреннего использования. +&НаКлиенте +Функция ТолькоИмяФайла(ВыбранноеИмяФайла) + + // Использовать критично на клиенте, т.к. ПолучитьРазделительПути() на сервере может быть другим. + МассивПодстрок = СтрРазделить(ВыбранноеИмяФайла, ПолучитьРазделительПути(), Ложь); + Возврат МассивПодстрок.Получить(МассивПодстрок.ВГраница()); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Help/ru.html b/SSL/src/Catalogs/ВнешниеКомпоненты/Help/ru.html new file mode 100644 index 000000000..5c1f9a1aa --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Help/ru.html @@ -0,0 +1,25 @@ + +

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

        +

        Внешние компоненты - специальные программы, которые могут обеспечивать:

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

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

        +

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

        +

        В списке отражаются все установленные в программе внешние компоненты.

        +

        Подключение внешней компоненты

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

        Обновление внешней компоненты

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

        Сохранение внешних компонент на компьютер

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

        Отборы в списке

        +

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

        +
        • Все; +
        • Используемые; +
        • Отключенные.

        См. также:

        + \ 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..14daa517a --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl @@ -0,0 +1,27 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + Возврат Результат; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + +#КонецОбласти + +#КонецЕсли \ 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..a4b5ba0db --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/ObjectModule.bsl @@ -0,0 +1,140 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + // Если внешняя компонента используется, то необходим контроль уникальности идентификатора и версии объекта. + Если Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Используется Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Запрос.УстановитьПараметр("Версия", Версия); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | И ВнешниеКомпоненты.Версия = &Версия + | И ВнешниеКомпоненты.Использование = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияВнешнихКомпонент.Используется) + | И ВнешниеКомпоненты.Ссылка <> &Ссылка"; + + Конфликтующие = Запрос.Выполнить(); + + Если Не Конфликтующие.Пустой() Тогда + + Отказ = Истина; + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор ""%1"" и версия ""%2"", указанные для данной компоненты, + |уже используются другой компонентой. + |Для продолжения необходимо изменить использование с ""%3"" на ""%4"".'"), + Идентификатор, + Версия, + Строка(Перечисления.ВариантыИспользованияВнешнихКомпонент.Используется), + Строка(Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена)); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Объект.Использование"); + + КонецЕсли; + КонецЕсли; + + Если ОбновлятьССайта Тогда + + // ОбновлятьССайта может быть установлен только у компоненты максимальной версии. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Запрос.Текст = + "ВЫБРАТЬ + | МАКСИМУМ(ВнешниеКомпоненты.ДатаВерсии) КАК ДатаВерсии + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор"; + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + ЭтоМаксимальнаяВерсия = (Выборка.ДатаВерсии = Null) Или (Выборка.ДатаВерсии = ДатаВерсии); + + Если Не ЭтоМаксимальнаяВерсия Тогда + + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Автоматическое обновление может быть включено только для компоненты + |последней версии. + | + |Для продолжения необходимо отключить обновление с сайта.'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Объект.ОбновлятьССайта"); + + КонецЕсли; + + // Не должно быть несколько объектов (в т.ч. разной версии, в т.ч. отключенных) с одним идентификатором + // у которых одновременно включен ОбновлятьССайта. + + Если Не Отказ Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | И ВнешниеКомпоненты.ОбновлятьССайта + | И ВнешниеКомпоненты.Ссылка <> &Ссылка"; + + Конфликтующие = Запрос.Выполнить(); + + Если Не Конфликтующие.Пустой() Тогда + + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Автоматическое обновление уже включено для другой версии компоненты. + | + |Для продолжения необходимо отключить обновление с сайта.'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Объект.ОбновлятьССайта"); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + // Связь реквизитов с пометкой удаления. + Если ПометкаУдаления Тогда + Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена; + КонецЕсли; + + // Связь реквизитов с вариантом использования. + Если Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена Тогда + ОбновлятьССайта = Ложь; + КонецЕсли; + + // Помещение двоичных данных компоненты + ДвоичныеДанныеКомпоненты = Неопределено; + Если ДополнительныеСвойства.Свойство("ДвоичныеДанныеКомпоненты", ДвоичныеДанныеКомпоненты) Тогда + ХранилищеКомпоненты = Новый ХранилищеЗначения(ДвоичныеДанныеКомпоненты); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/ВнешниеКомпоненты.mdo b/SSL/src/Catalogs/ВнешниеКомпоненты/ВнешниеКомпоненты.mdo new file mode 100644 index 000000000..73e8b6764 --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/ВнешниеКомпоненты.mdo @@ -0,0 +1,510 @@ + + + + + + + + + + ВнешниеКомпоненты + + 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 + Внешняя компонента + + 2 + true + 150 + String + Variable + AsDescription + InDialog + BothWays + Catalog.ВнешниеКомпоненты.Form.ФормаЭлемента + Catalog.ВнешниеКомпоненты.Form.ФормаСписка + + Использование + + ru + Использование + + + EnumRef.ВариантыИспользованияВнешнихКомпонент + + + + ShowError + true + + Enum.ВариантыИспользованияВнешнихКомпонент.EnumValue.Используется + + Index + Use + Use + + + Идентификатор + + ru + Идентификатор + + + String + + 150 + + + + ru + Внутренний идентификатор объекта внешней компоненты. + + + + ShowError + + Index + Use + Use + + + Версия + + ru + Версия + + + String + + 20 + + + + ru + Версия внешней компоненты + + + + ShowError + + Use + Use + + + ДатаВерсии + + ru + Дата версии + + + Date + + + + ru + Необходима для определения актуальной версии + + + + + Index + Use + Use + + + ИмяФайла + + ru + Имя файла + + + String + + 260 + + + + ru + Имя файла внешней компоненты + + + + + Use + Use + + + ХранилищеКомпоненты + + ru + Хранилище компоненты + + + ValueStorage + + + ru + Двоичные данные внешней компоненты, содержит ZIP-архив (служебное поле) + + + + + Use + Use + + + ОбновлятьССайта + + ru + Обновлять с сайта 1С + + + Boolean + + + ru + Обновлять с сайта 1С + + + + + Use + Use + + + ОписаниеОшибки + + ru + Описание ошибки + + + String + + 1024 + + + + + + Use + Use + + + Windows_x86 + + ru + Windows x86 + + + Boolean + + + + + Use + Use + + + Windows_x86_64 + + ru + Windows x86_64 + + + Boolean + + + + + Use + Use + + + Linux_x86 + + ru + Linux x86 + + + Boolean + + + + + Use + Use + + + Linux_x86_64 + + ru + Linux x86_64 + + + Boolean + + + + + Use + Use + + + Windows_x86_Firefox + + ru + Windows x86 Firefox + + + Boolean + + + + + Use + Use + + + Linux_x86_Firefox + + ru + Linux x86 Firefox + + + Boolean + + + + + Use + Use + + + Linux_x86_64_Firefox + + ru + Linux x86_64 Firefox + + + Boolean + + + + + Use + Use + + + Windows_x86_MSIE + + ru + Windows x86 MSIE + + + Boolean + + + + + Use + Use + + + Windows_x86_64_MSIE + + ru + Windows x86_64 MSIE + + + Boolean + + + + + Use + Use + + + Windows_x86_Chrome + + ru + Windows x86 Chrome + + + Boolean + + + + + Use + Use + + + Linux_x86_Chrome + + ru + Linux x86 Chrome + + + Boolean + + + + + Use + Use + + + Linux_x86_64_Chrome + + ru + Linux x86_64 Chrome + + + Boolean + + + + + Use + Use + + + MacOS_x86_64_Safari + + ru + Mac OS x86_64 Safari + + + Boolean + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + + + 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 index d447550cf..34afb0391 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form @@ -67,12 +67,8 @@ <key>ru</key> - <value>Группа настроек</value> + <value>Настроек</value> - - ru - Группа настроек - ГруппаНастроекРасширеннаяПодсказка 220 @@ -101,6 +97,10 @@ true + + <key>ru</key> + <value>Группа пользовательских настроек</value> + ГруппаПользовательскихНастроекРасширеннаяПодсказка 166 @@ -559,6 +559,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 164 @@ -586,6 +590,10 @@ ГруппыВнешнихПользователей 25 + + <key>ru</key> + <value>Группы внешних пользователей</value> + true true @@ -838,9 +846,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -945,7 +950,7 @@ <key>ru</key> - <value>Группа выбрать группу</value> + <value>Выбрать группу</value> true @@ -976,7 +981,7 @@ <key>ru</key> - <value>Группа группы</value> + <value>Группы</value> ГруппаГруппыExtendedTooltip @@ -1003,6 +1008,10 @@ ВнешниеПользователиСписок 48 + + <key>ru</key> + <value>Внешние пользователи список</value> + true true @@ -1408,9 +1417,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -1515,7 +1521,7 @@ <key>ru</key> - <value>Группа выбрать пользователя</value> + <value>Выбрать пользователя</value> true @@ -1546,7 +1552,7 @@ <key>ru</key> - <value>Группа пользователи</value> + <value>Пользователи</value> ГруппаПользователиExtendedTooltip @@ -1789,9 +1795,6 @@ CommonPicture.СостоянияПользователей - None - None - None true @@ -1833,10 +1836,6 @@ ru Группа - - ru - Группа - ГруппаExtendedTooltip 109 @@ -1943,7 +1942,7 @@ <key>ru</key> - <value>Группа показывать внешних пользователей дочерних групп</value> + <value>Показывать внешних пользователей дочерних групп</value> ГруппаПоказыватьВнешнихПользователейДочернихГруппExtendedTooltip @@ -2040,7 +2039,7 @@ true true - Items.ГруппыВнешнихПользователей.CurrentData.ВсеОбъектыАвторизации + Items.ГруппыВнешнихПользователей.CurrentData.Description Auto Auto @@ -2499,24 +2498,6 @@ true
        - - ИмяТекущегоЭлемента - - <key>ru</key> - <value>Имя текущего элемента</value> - - 6 - - String - - - - true - - - true - - ПоказыватьНедействительныхПользователей diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl index 1e422ffbd..50ae5696c 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -14,6 +14,13 @@ // ВыбранныеПользователи - Массив - массив уже выбранных пользователей. // +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПоследнийЭлемент; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -83,7 +90,7 @@ Элементы.НазначитьГруппы.Видимость = Ложь; КонецЕсли; - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда Элементы.ПользователиИБ.Видимость = Ложь; @@ -137,7 +144,9 @@ НастроитьФормуПоИспользованиюГруппПользователей(); ХранимыеПараметры.Удалить("ТекущаяСтрока"); - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") + Или Не Пользователи.ЭтоПолноправныйПользователь() Тогда + Элементы.ФормаИзменитьВыделенные.Видимость = Ложь; Элементы.ВнешниеПользователиСписокКонтекстноеМенюИзменитьВыделенные.Видимость = Ложь; КонецЕсли; @@ -152,7 +161,7 @@ Элементы.ВнешниеПользователиСписокКонтекстноеМенюУстановитьПароль.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; @@ -588,7 +597,7 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); - МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.ВнешниеПользователиСписок); + МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.ВнешниеПользователиСписок, ВнешниеПользователиСписок); КонецЕсли; КонецПроцедуры @@ -701,9 +710,9 @@ &НаКлиенте Процедура ПроверкаИзмененияТекущегоЭлементаФормы() - Если ТекущийЭлемент.Имя <> ИмяТекущегоЭлемента Тогда + Если ТекущийЭлемент <> ПоследнийЭлемент Тогда ПриИзмененииТекущегоЭлементаФормы(); - ИмяТекущегоЭлемента = ТекущийЭлемент.Имя; + ПоследнийЭлемент = ТекущийЭлемент; КонецЕсли; #Если ВебКлиент Тогда @@ -717,10 +726,10 @@ &НаКлиенте Процедура ПриИзмененииТекущегоЭлементаФормы() - Если ТекущийЭлемент.Имя = "ГруппыВнешнихПользователей" Тогда + Если ТекущийЭлемент = Элементы.ГруппыВнешнихПользователей Тогда Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийГруппы; - ИначеЕсли ТекущийЭлемент.Имя = "ВнешниеПользователиСписок" Тогда + ИначеЕсли ТекущийЭлемент = Элементы.ВнешниеПользователиСписок Тогда Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийПользователя; КонецЕсли diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form index bf037bb7c..932e0a347 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form @@ -343,7 +343,7 @@ </userVisible> <title> <key>ru</key> - <value>Группа наименование</value> + <value>Наименование</value> ГруппаНаименованиеРасширеннаяПодсказка @@ -371,7 +371,7 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> ГруппаШапкаРасширеннаяПодсказка @@ -475,7 +475,7 @@ <key>ru</key> - <value>Группа изменить ограничение</value> + <value>Изменить ограничение</value> ГруппаИзменитьОграничениеРасширеннаяПодсказка @@ -546,7 +546,7 @@ <key>ru</key> - <value>Группа вход в программу разрешен</value> + <value>Вход в программу разрешен</value> ГруппаВходВПрограммуРазрешенРасширеннаяПодсказка @@ -622,10 +622,8 @@ Left true - 23 true true - false true true true @@ -699,10 +697,8 @@ Left true - 23 true true - false true true true @@ -916,7 +912,7 @@ <key>ru</key> - <value>Группа пароль</value> + <value>Пароль</value> ГруппаПарольРасширеннаяПодсказка @@ -949,6 +945,7 @@ ПотребоватьСменуПароляПриВходе Right + Button OnChange ПотребоватьСменуПароляПриВходеПриИзменении @@ -960,6 +957,10 @@ true true + + URLProcessing + ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки + Left @@ -1054,7 +1055,7 @@ <key>ru</key> - <value>Группа отступ</value> + <value>Отступ</value> ГруппаОтступРасширеннаяПодсказка @@ -1080,6 +1081,10 @@ true + + <key>ru</key> + <value>Свойства аутентификации 1С предприятия</value> + СвойстваАутентификации1СПредприятияExtendedTooltip 208 @@ -1153,6 +1158,10 @@ true + + <key>ru</key> + <value>Свойства аутентификации open ID</value> + СвойстваАутентификацииOpenIDРасширеннаяПодсказка 280 @@ -1175,11 +1184,11 @@
        - ГруппаПредставлениеЯзыка + СвойстваДополнительные 192 ПользовательИБЯзык - 33 + 348 true true @@ -1188,9 +1197,13 @@ ПользовательИБЯзык + + OnChange + ПользовательИБЯзыкПриИзменении + ПользовательИБЯзыкРасширеннаяПодсказка - 216 + 350 Label true true @@ -1200,7 +1213,7 @@ ПользовательИБЯзыкКонтекстноеМеню - 34 + 349 true InputField @@ -1210,13 +1223,13 @@ true Left - 15 true true - false - true + true + true true true + true Style.BorderColor @@ -1228,8 +1241,13 @@ true + + <key>ru</key> + <value>Свойства дополнительные</value> + + false - ГруппаПредставлениеЯзыкаExtendedTooltip + СвойстваДополнительныеРасширеннаяПодсказка 215 Label true @@ -1242,6 +1260,7 @@ Vertical Auto + NormalSeparation true true Auto @@ -1704,9 +1723,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true true @@ -1747,10 +1763,6 @@ ru Редактирование или просмотр ролей - - ru - Редактирование или просмотр ролей - РедактированиеИлиПросмотрРолейExtendedTooltip 217 @@ -1963,8 +1975,85 @@ ФормаКоманднаяПанель -1 + + ФормаЗаписатьИЗакрыть + 351 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 352 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + PictureAndText + true + true + true + UserCmds + Auto + + + КомандыФормы + 353 + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + КомандыФормыРасширеннаяПодсказка + 354 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 355 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 356 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + Left - true NotificationProcessing @@ -1986,6 +2075,7 @@ BeforeLoadDataFromSettingsAtServer ПриЗагрузкеДанныхИзНастроекНаСервере + WriteAndClose DontBlock Use true @@ -2016,7 +2106,8 @@ ПользовательИБЯзык <key>ru</key> - <value>Язык интерфейса программы</value> + <value>Язык интерфейса +программы</value> 10 @@ -2764,6 +2855,25 @@ true + + ПользовательИБОсновнойИнтерфейс + + <key>ru</key> + <value>Основной интерфейс</value> + + 40 + + String + + + + true + + + true + + true + ПоказатьТолькоВыбранныеРоли @@ -2912,6 +3022,28 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ЗаписатьИЗакрыть</name> + <title> + <key>ru</key> + <value>Записать и закрыть</value> + + 7 + + ru + Записать объект и закрыть форму + + + true + + + + ЗаписатьИЗакрыть + + + DontUse + Auto + ГруппаНовогоВнешнегоПользователя diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl index f385bc2c3..478440c2f 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -106,9 +106,9 @@ ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", Истина); НачальноеОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ(); - ОбщаяНастройкаФормы(Истина); + ОбщаяНастройкаФормы(Объект, Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ГруппаШапка.ТолькоПросмотр = Истина; Элементы.СтраницаДополнительныеРеквизиты.ТолькоПросмотр = Истина; Элементы.СтраницаКомментарий.ТолькоПросмотр = Истина; @@ -124,6 +124,9 @@ Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда Элементы.ГруппаИзменитьОграничение.Видимость = Ложь; + Элементы.ПотребоватьСменуПароляПриВходе.Видимость = Ложь; + Иначе + Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок = ПодсказкаПотребоватьСменуПароляПриВходе(); КонецЕсли; КонецПроцедуры @@ -159,14 +162,29 @@ МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); КонецЕсли; - ОбщаяНастройкаФормы(); + ОбщаяНастройкаФормы(ТекущийОбъект); ТекущееПредставлениеОбъектаАвторизации = Строка(Объект.ОбъектАвторизации); КонецПроцедуры &НаСервере -Процедура ОбщаяНастройкаФормы(ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) +Процедура ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект = Неопределено) + + Если ТекущийОбъект = Неопределено Тогда + ТекущийОбъект = Объект; + КонецЕсли; + + ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", + ЗапретРедактированияРолей + Или ДействияВФорме.Роли <> "Редактирование" + Или Не УровеньДоступа.НастройкиДляВхода + Или Не ТекущийОбъект.УстановитьРолиНепосредственно); + +КонецПроцедуры + +&НаСервере +Процедура ОбщаяНастройкаФормы(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) Если НачальноеОписаниеПользователяИБ = Неопределено Тогда Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере. @@ -180,12 +198,14 @@ ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); УстановитьПривилегированныйРежим(Ложь); - УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(Объект); + УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); ОпределитьДействияВФорме(); ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи); + ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект); + // Установка постоянной доступности свойств. Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); @@ -203,10 +223,14 @@ И ДействияВФорме.СвойстваЭлемента <> "Редактирование" И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование"; - Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = - УровеньДоступа.ИзменениеРазрешенияНаВход И Объект.Подготовлен И Не ПриЧтенииВходВПрограммуРазрешен; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); - УстановитьДоступностьСвойств(); + Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = + УровеньДоступа.ИзменениеРазрешенияНаВход + И ТекущийОбъект.Подготовлен + И Не ПриЧтенииВходВПрограммуРазрешен; + + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -214,6 +238,26 @@ Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) ОчиститьСообщения(); + ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'"); + + // Копирование прав пользователя. + Если ЗначениеЗаполнено(ЗначениеКопирования) + И Не ЗначениеЗаполнено(Объект.Ссылка) + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") + И (Не ПараметрыЗаписи.Свойство("НеКопироватьПраваПользователя") + И Не ПараметрыЗаписи.Свойство("КопироватьПраваПользователя")) Тогда + + Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеОтветаНаВопросОКопированииПрав", ЭтотОбъект, ПараметрыЗаписи), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопировать также права пользователя ""%1""?'"), Строка(ЗначениеКопирования)), + РежимДиалогаВопрос.ДаНет, + , + , + ЗаголовокВопросов); + Возврат; + КонецЕсли; Если ДействияВФорме.Роли = "Редактирование" И Объект.УстановитьРолиНепосредственно @@ -280,6 +324,14 @@ УстановитьПривилегированныйРежим(Истина); ПользователиСлужебный.ЗаписатьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); + Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда + Источник = ЗначениеКопирования; + Приемник = ТекущийОбъект.Ссылка; + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник); + ПользователиСлужебный.СкопироватьГруппыПользователя(Источник, Приемник); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -290,7 +342,7 @@ ТекущийОбъект.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия); КонецЕсли; - ОбщаяНастройкаФормы(, ПараметрыЗаписи); + ОбщаяНастройкаФормы(ТекущийОбъект, , ПараметрыЗаписи); КонецПроцедуры @@ -327,10 +379,12 @@ ГруппаНовогоВнешнегоПользователя = Неопределено; КонецЕсли; - УстановитьДоступностьСвойств(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); + Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -428,7 +482,7 @@ Или ПользовательИБАутентификацияСтандартная); КонецЕсли; - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -452,7 +506,7 @@ ПользовательИБАутентификацияСтандартная = Истина; КонецЕсли; - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); Если Не УровеньДоступа.ИзменениеРазрешенияНаВход И Не ВходВПрограммуРазрешен Тогда @@ -479,7 +533,7 @@ ПользовательИБИмя = СокрЛП(ПользовательИБИмя); ПользовательИБИмяЗначениеПрямогоИзменения = ПользовательИБИмя; - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -506,7 +560,7 @@ ПотребоватьСменуПароляПриВходе = Ложь; КонецЕсли; - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -517,15 +571,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ПользовательИБЯзыкПриИзменении(Элемент) + + УстановитьДоступностьСвойств(ЭтотОбъект); + +КонецПроцедуры + &НаКлиенте Процедура УстановитьРолиНепосредственноПриИзменении(Элемент) - Если НЕ Объект.УстановитьРолиНепосредственно Тогда + Если Не Объект.УстановитьРолиНепосредственно Тогда ПрочитатьРолиПользователяИБ(); ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецЕсли; - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); + ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(); КонецПроцедуры @@ -551,6 +613,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПоказатьНастройкиВнешнихПользователей", Истина); + + ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", ПараметрыФормы, ЭтотОбъект); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыРоли @@ -571,11 +642,11 @@ // Поддержка дополнительных реквизитов. &НаКлиенте -Процедура Подключаемый_РедактироватьСоставСвойств() +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); КонецЕсли; КонецПроцедуры @@ -584,6 +655,13 @@ #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Записать(Новый Структура("ЗаписатьИЗакрыть")); + +КонецПроцедуры + &НаКлиенте Процедура СменитьПароль(Команда) @@ -668,7 +746,7 @@ &НаКлиенте Процедура АутентификацияПриИзменении() - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); Если НЕ ПользовательИБАутентификацияOpenID И НЕ ПользовательИБАутентификацияСтандартная Тогда @@ -693,6 +771,7 @@ ПользовательИБСтарыйПароль = Результат.СтарыйПароль; УстановитьНаличиеПароля(ЭтотОбъект, ЗначениеЗаполнено(ПользовательИБПароль)); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -868,6 +947,53 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеОтветаНаВопросОКопированииПрав(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("КопироватьПраваПользователя"); + Иначе + ПараметрыЗаписи.Вставить("НеКопироватьПраваПользователя"); + КонецЕсли; + Записать(ПараметрыЗаписи); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму() + + Закрыть(); + +КонецПроцедуры + +&НаСервере +Функция ПодсказкаПотребоватьСменуПароляПриВходе() + ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(, Ложь); + + Подсказка = Новый Массив; + Подсказка.Добавить(НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно.'")); + Подсказка.Добавить(Символы.ПС); + Подсказка.Добавить(НСтр("ru = 'См.'")); + Подсказка.Добавить(" "); + + Ссылка = НСтр("ru = 'Настройки входа внешних пользователей'"); + Если ЭтоПолноправныйПользователь Тогда + Ссылка = Новый ФорматированнаяСтрока(Ссылка,,,, "НастройкиВходаПользователей"); + КонецЕсли; + Подсказка.Добавить(Ссылка); + + Если ЭтоПолноправныйПользователь + И Метаданные.Подсистемы.Найти("Администрирование") <> Неопределено Тогда + Подсказка.Добавить(" "); + Подсказка.Добавить(НСтр("ru = 'в разделе Администрирование, + |пункт Настройки прав и пользователей.'")); + Иначе + Подсказка.Добавить("."); + КонецЕсли; + + Возврат Новый ФорматированнаяСтрока(Подсказка); +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Поддержка дополнительных реквизитов. @@ -917,11 +1043,10 @@ &НаСервере Процедура ПрочитатьРолиПользователяИБ() - СвойстваПользователяИБ = Неопределено; - - Пользователи.ПрочитатьПользователяИБ( - Объект.ИдентификаторПользователяИБ, СвойстваПользователяИБ); - + СвойстваПользователяИБ = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); + Если СвойстваПользователяИБ = Неопределено Тогда + СвойстваПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); + КонецЕсли; ОбработатьИнтерфейсРолей("ЗаполнитьРоли", СвойстваПользователяИБ.Роли); КонецПроцедуры @@ -948,7 +1073,6 @@ УстановитьПривилегированныйРежим(Истина); - ПрочитанныеСвойства = Неопределено; ОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ(); ПользовательИБСуществует = Ложь; ПользовательИБОсновной = Ложь; @@ -957,9 +1081,8 @@ Если ПриКопированииЭлемента Тогда - Если Пользователи.ПрочитатьПользователяИБ( - Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ, - ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда // Сопоставление пользователя ИБ с пользователем в справочнике. Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда @@ -972,6 +1095,7 @@ ОписаниеПользователяИБ, ПрочитанныеСвойства, "ЗапрещеноИзменятьПароль, + |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", |Роли")); @@ -979,8 +1103,8 @@ Объект.ИдентификаторПользователяИБ = Неопределено; УстановитьНаличиеПароля(ЭтотОбъект, Ложь); Иначе - Если Пользователи.ПрочитатьПользователяИБ( - Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда ПользовательИБСуществует = Истина; ПользовательИБОсновной = Истина; @@ -989,9 +1113,8 @@ И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; - - Если Пользователи.ПрочитатьПользователяИБ( - Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда ПользовательИБСуществует = Истина; Если Объект.Наименование <> ПрочитанныеСвойства.ПолноеИмя Тогда @@ -1031,13 +1154,17 @@ |ЗапрещеноИзменятьПароль, |АутентификацияОС, |ПользовательОС, - |РежимЗапуска, + |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", |Роли")); КонецЕсли; - УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен); + Если ПрочитанныеСвойства = Неопределено Тогда + УстановитьНаличиеПароля(ЭтотОбъект, Ложь); + Иначе + УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен); + КонецЕсли; КонецЕсли; Пользователи.СкопироватьСвойстваПользователяИБ( @@ -1191,14 +1318,19 @@ //////////////////////////////////////////////////////////////////////////////// // Начальное заполнение, проверка заполнения, доступность свойств. -&НаСервере -Процедура УстановитьДоступностьСвойств() +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьДоступностьСвойств(Форма) + + Элементы = Форма.Элементы; + Объект = Форма.Объект; + ДействияВФорме = Форма.ДействияВФорме; + УровеньДоступа = Форма.УровеньДоступа; // Настройка возможности изменения. Элементы.ОбъектАвторизации.ТолькоПросмотр = ДействияВФорме.СвойстваЭлемента <> "Редактирование" - ИЛИ ОбъектАвторизацииЗаданПриОткрытии - ИЛИ ЗначениеЗаполнено(Объект.Ссылка) + Или Форма.ОбъектАвторизацииЗаданПриОткрытии + Или ЗначениеЗаполнено(Объект.Ссылка) И ЗначениеЗаполнено(Объект.ОбъектАвторизации); Элементы.Недействителен.ТолькоПросмотр = @@ -1211,7 +1343,7 @@ Элементы.ВходВПрограммуРазрешен.ТолькоПросмотр = Не ( Элементы.ОсновныеСвойства.ТолькоПросмотр = Ложь И ( УровеньДоступа.ИзменениеРазрешенияНаВход - Или УровеньДоступа.ОтключениеРазрешенияНаВход И ПриЧтенииВходВПрограммуРазрешен)); + Или УровеньДоступа.ОтключениеРазрешенияНаВход И Форма.ПриЧтенииВходВПрограммуРазрешен)); Элементы.ПользовательИБИмя1.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; Элементы.ПользовательИБИмя2.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; @@ -1224,19 +1356,13 @@ Элементы.СменитьПароль.Доступность = ( УровеньДоступа.НастройкиДляВхода Или УровеньДоступа.ИзменениеТекущего - И Не ПользовательИБЗапрещеноИзменятьПароль); - - ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", - ЗапретРедактированияРолей - Или ДействияВФорме.Роли <> "Редактирование" - Или Не Объект.УстановитьРолиНепосредственно - Или Не УровеньДоступа.НастройкиДляВхода); + И Не Форма.ПользовательИБЗапрещеноИзменятьПароль); Элементы.Комментарий.ТолькоПросмотр = Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком); // Настройка необходимости заполнения. - Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект, Ложь) Тогда + Если ТребуетсяЗаписьПользователяИБ(Форма, Ложь) Тогда НоваяСтраница = Элементы.ИмяСОтметкойНезаполненного; Иначе НоваяСтраница = Элементы.ИмяБезОтметкиНезаполненного; @@ -1245,7 +1371,7 @@ Если Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница <> НоваяСтраница Тогда Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница = НоваяСтраница; КонецЕсли; - ОбновитьИмяДляВхода(ЭтотОбъект); + ОбновитьИмяДляВхода(Форма); // Настройка доступности связанных элементов. Элементы.ВходВПрограммуРазрешен.Доступность = Не Объект.Недействителен; @@ -1254,9 +1380,10 @@ Элементы.ГруппаИзменитьОграничение.Доступность = Не Объект.Недействителен И Не Элементы.Недействителен.ТолькоПросмотр; - Элементы.ПараметрыАутентификации1СПредприятия.Доступность = ПользовательИБАутентификацияСтандартная; + Элементы.ПараметрыАутентификации1СПредприятия.Доступность = + Форма.ПользовательИБАутентификацияСтандартная; - ПользователиСлужебныйКлиентСервер.ОбновитьОграничениеСрокаДействия(ЭтотОбъект); + ПользователиСлужебныйКлиентСервер.ОбновитьОграничениеСрокаДействия(Форма); КонецПроцедуры @@ -1264,7 +1391,7 @@ &НаКлиенте Процедура ИзменитьОграничениеНаВходВПрограммуЗавершение(Результат, Контекст) Экспорт - УстановитьДоступностьСвойств(); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl index 1b155d4e2..b4c62be4b 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -21,16 +25,9 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Загрузка данных из файла - -// Запрещает загрузку данных в этот справочник из подсистемы "ЗагрузкаДанныхИзФайла". -// Пакетная загрузка данных в этот справочник небезопасна. -// -Функция ИспользоватьЗагрузкуДанныхИзФайла() Экспорт - Возврат Ложь; -КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов +#КонецОбласти #КонецОбласти diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl index d290feff6..78dc2e1b1 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl @@ -72,7 +72,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыВнешнихПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоВнешнегоПользователя.ПолучитьОбъект(); diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl index ffa099128..12df898c7 100644 --- a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -19,6 +20,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс diff --git a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo index f32f5ef36..8ee743308 100644 --- a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ Автор + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -153,6 +154,35 @@ Index Use + + ДатаЗаема + + ru + Дата заема + + + Date + + + + ru + ДЛФ=ДВ + + + ru + ДЛФ=ДВ + + + ru + Дата, когда файл был занят для редактирования + + false + + + + Use + Use + ДатаМодификацииУниверсальная @@ -222,6 +252,7 @@ Отредактировал + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -373,6 +404,7 @@ Редактирует + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -486,15 +518,35 @@ Use + + ХранитьВерсии + + ru + Хранить версии + + + Boolean + + + ru + Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия. + + false + + + + Use + Use + - ЭлектронныеПодписи + УдалитьЭлектронныеПодписи ru - электронные подписи + (не используется) электронные подписи ru @@ -699,10 +751,10 @@ - СертификатыШифрования + УдалитьСертификатыШифрования ru - Сертификаты шифрования + (не используется) Сертификаты шифрования ru diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form index 663e59a12..b8a579995 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -8,6 +8,10 @@ true + + <key>ru</key> + <value>Группа пользовательских настроек</value> + ГруппаПользовательскихНастроекРасширеннаяПодсказка 20 @@ -36,6 +40,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 18 @@ -55,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -303,9 +315,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl index a18fe2c62..45eca96e4 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl @@ -31,7 +31,7 @@ Элементы.Список.РежимВыбора = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form index 721bb07b5..428aab9d2 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form @@ -250,12 +250,8 @@ <key>ru</key> - <value>Группа назначение</value> + <value>Назначение</value> - - ru - Группа назначение - ГруппаНазначениеРасширеннаяПодсказка 240 @@ -1036,9 +1032,6 @@ Style.BorderColor - None - None - None true @@ -1077,6 +1070,10 @@ Роли 131 + + <key>ru</key> + <value>Роли</value> + true true @@ -1455,9 +1452,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true true @@ -1498,10 +1492,6 @@ ru Разрешенные действия (роли) - - ru - Роли группы - РолиГруппыExtendedTooltip 174 @@ -1603,10 +1593,6 @@ ru Состав и роли - - ru - Состав и роли - СоставИРолиExtendedTooltip 154 diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl index 36392936f..722b1f47d 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl @@ -90,7 +90,7 @@ УстановитьДоступностьСвойств(ЭтотОбъект); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl index 2d0d1fa2c..5352c92fc 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -18,6 +22,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl index d0691be31..10d4caacf 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl @@ -35,22 +35,20 @@ Ошибки = Неопределено; // Проверка использования родителя. - Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + ТекстОшибки = ТекстОшибкиПроверкиРодителя(); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.Родитель", - НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть родителем.'"), - ""); + "Объект.Родитель", ТекстОшибки, ""); КонецЕсли; // Проверка незаполненных и повторяющихся внешних пользователей. ПроверенныеРеквизитыОбъекта.Добавить("Состав.ВнешнийПользователь"); - // Проверка заполнения назначения группы. - Если Назначение.Количество() = 0 Тогда + // Проверка назначения группы. + ТекстОшибки = ТекстОшибкиПроверкиНазначения(); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.Назначение", - НСтр("ru = 'Не указан вид пользователей.'"), - ""); + "Объект.Назначение", ТекстОшибки, ""); КонецЕсли; ПроверенныеРеквизитыОбъекта.Добавить("Назначение"); @@ -104,173 +102,24 @@ ЭтоНовый = ЭтоНовый(); Если Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда - ЗаполнитьНазначениеВсемиТипамиВнешнихПользователей(); ВсеОбъектыАвторизации = Ложь; - - Если НЕ Родитель.Пустая() Тогда - ВызватьИсключение - НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть перемещена.'"); - КонецЕсли; + КонецЕсли; + + ТекстОшибки = ТекстОшибкиПроверкиРодителя(); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Если Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда Если Состав.Количество() > 0 Тогда ВызватьИсключение НСтр("ru = 'Добавление участников в предопределенную группу ""Все внешние пользователи"" запрещено.'"); КонецЕсли; Иначе - Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда - ВызватьИсключение - НСтр("ru = 'Невозможно добавить подгруппу к предопределенной группе ""Все внешние пользователи"".'"); - - ИначеЕсли Родитель.ВсеОбъектыАвторизации Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно добавить подгруппу к группе ""%1"", - |так как в число ее участников входят все пользователи.'"), Родитель); - КонецЕсли; - - Если ВсеОбъектыАвторизации И ЗначениеЗаполнено(Родитель) Тогда - ВызватьИсключение - НСтр("ru = 'Невозможно переместить группу, в число участников которой входят все пользователи.'"); - КонецЕсли; - - // Проверка уникальности группы всех объектов авторизации заданного типа. - Если ВсеОбъектыАвторизации Тогда - - // Проверка что назначение не совпадает с группой все внешние пользователи. - ГруппаВсеВнешниеПользователи = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи; - НазначениеВсеВнешниеПользователи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( - ГруппаВсеВнешниеПользователи, "Назначение").Выгрузить().ВыгрузитьКолонку("ТипПользователей"); - МассивНазначения = Назначение.ВыгрузитьКолонку("ТипПользователей"); - - Если ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(НазначениеВсеВнешниеПользователи, МассивНазначения) Тогда - ВызватьИсключение - НСтр("ru = 'Невозможно создать группу, совпадающую по назначению с предопределенной группой ""Все внешние пользователи"".'"); - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.УстановитьПараметр("ТипыПользователей", Назначение.Выгрузить()); - - Запрос.Текст = - "ВЫБРАТЬ - | ТипыПользователей.ТипПользователей - |ПОМЕСТИТЬ ТипыПользователей - |ИЗ - | &ТипыПользователей КАК ТипыПользователей - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление - |ИЗ - | Справочник.ГруппыВнешнихПользователей.Назначение КАК ГруппыВнешнихПользователей - |ГДЕ - | ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | ТипыПользователей КАК ТипыПользователей - | ГДЕ - | ГруппыВнешнихПользователей.Ссылка <> &Ссылка - | И ГруппыВнешнихПользователей.Ссылка.ВсеОбъектыАвторизации - | И ТИПЗНАЧЕНИЯ(ТипыПользователей.ТипПользователей) = ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователей.ТипПользователей))"; - - РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда - - Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Уже существует группа ""%1"", - |в число участников которой входят все пользователи указанных видов.'"), - Выборка.СсылкаПредставление ); - КонецЕсли; - - КонецЕсли; - - // Проверка совпадения типа объектов авторизации с родителем - // (допустимо, если тип у родителя не задан). - Если ЗначениеЗаполнено(Родитель) Тогда - - ТипПользователейРодителя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( - Родитель, "Назначение").Выгрузить().ВыгрузитьКолонку("ТипПользователей"); - ТипПользователей = Назначение.ВыгрузитьКолонку("ТипПользователей"); - - Для Каждого ТипПользователя Из ТипПользователей Цикл - Если ТипПользователейРодителя.Найти(ТипПользователя) = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вид участников группы должен быть как у вышестоящей - |группы внешних пользователей ""%1"".'"), Родитель); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Если группе внешних пользователей устанавливается тип участников "Все пользователи заданного типа", - // проверяем наличие подчиненных групп. - Если ВсеОбъектыАвторизации - И ЗначениеЗаполнено(Ссылка) Тогда - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.Текст = - "ВЫБРАТЬ - | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление - |ИЗ - | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей - |ГДЕ - | ГруппыВнешнихПользователей.Родитель = &Ссылка"; - - РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно изменить вид участников группы ""%1"", - |так как у нее имеются подгруппы.'"), - Наименование); - КонецЕсли; - - КонецЕсли; - - // Проверка, что при изменении типа объектов авторизации - // нет подчиненных элементов другого типа (очистка типа допустима). - Если ЗначениеЗаполнено(Ссылка) Тогда - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.УстановитьПараметр("ТипыПользователей", Назначение); - Запрос.Текст = - "ВЫБРАТЬ - | ТипыПользователей.ТипПользователей - |ПОМЕСТИТЬ ТипыПользователей - |ИЗ - | &ТипыПользователей КАК ТипыПользователей - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователейНазначение.Ссылка) КАК СсылкаПредставление - |ИЗ - | Справочник.ГруппыВнешнихПользователей.Назначение КАК ГруппыВнешнихПользователейНазначение - |ГДЕ - | ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | ТипыПользователей КАК ТипыПользователей - | ГДЕ - | ГруппыВнешнихПользователейНазначение.Ссылка.Родитель = &Ссылка - | И ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователейНазначение.ТипПользователей) <> ТИПЗНАЧЕНИЯ(ТипыПользователей.ТипПользователей))"; - - РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда - - Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно изменить вид участников группы ""%1"", - |так как у нее имеется подгруппа ""%2"" с другим назначением участников.'"), - Наименование, - Выборка.СсылкаПредставление); - КонецЕсли; + ТекстОшибки = ТекстОшибкиПроверкиНазначения(); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ВызватьИсключение ТекстОшибки; КонецЕсли; СтарыеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( @@ -378,6 +227,188 @@ КонецПроцедуры +Функция ТекстОшибкиПроверкиРодителя() + + Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + Возврат + НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть родителем.'"); + КонецЕсли; + + Если Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + Если Не Родитель.Пустая() Тогда + Возврат + НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть перемещена.'"); + КонецЕсли; + Иначе + Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + Возврат + НСтр("ru = 'Невозможно добавить подгруппу к предопределенной группе ""Все внешние пользователи"".'"); + + ИначеЕсли Родитель.ВсеОбъектыАвторизации Тогда + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно добавить подгруппу к группе ""%1"", + |так как в число ее участников входят все пользователи.'"), Родитель); + КонецЕсли; + + Если ВсеОбъектыАвторизации И ЗначениеЗаполнено(Родитель) Тогда + Возврат + НСтр("ru = 'Невозможно переместить группу, в число участников которой входят все пользователи.'"); + КонецЕсли; + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция ТекстОшибкиПроверкиНазначения() + + // Проверка заполнения назначения группы. + Если Назначение.Количество() = 0 Тогда + Возврат НСтр("ru = 'Не указан вид участников группы.'"); + КонецЕсли; + + // Проверка уникальности группы всех объектов авторизации заданного типа. + Если ВсеОбъектыАвторизации Тогда + + // Проверка что назначение не совпадает с группой все внешние пользователи. + ГруппаВсеВнешниеПользователи = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи; + НазначениеВсеВнешниеПользователи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + ГруппаВсеВнешниеПользователи, "Назначение").Выгрузить().ВыгрузитьКолонку("ТипПользователей"); + МассивНазначения = Назначение.ВыгрузитьКолонку("ТипПользователей"); + + Если ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(НазначениеВсеВнешниеПользователи, МассивНазначения) Тогда + Возврат + НСтр("ru = 'Невозможно создать группу, совпадающую по назначению + |с предопределенной группой ""Все внешние пользователи"".'"); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("ТипыПользователей", Назначение.Выгрузить()); + + Запрос.Текст = + "ВЫБРАТЬ + | ТипыПользователей.ТипПользователей + |ПОМЕСТИТЬ ТипыПользователей + |ИЗ + | &ТипыПользователей КАК ТипыПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Назначение КАК ГруппыВнешнихПользователей + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТипыПользователей КАК ТипыПользователей + | ГДЕ + | ГруппыВнешнихПользователей.Ссылка <> &Ссылка + | И ГруппыВнешнихПользователей.Ссылка.ВсеОбъектыАвторизации + | И ТИПЗНАЧЕНИЯ(ТипыПользователей.ТипПользователей) = ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователей.ТипПользователей))"; + + РезультатЗапроса = Запрос.Выполнить(); + Если НЕ РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уже существует группа ""%1"", + |в число участников которой входят все пользователи указанных видов.'"), + Выборка.СсылкаПредставление); + КонецЕсли; + КонецЕсли; + + // Проверка совпадения типа объектов авторизации с родителем + // (допустимо, если тип у родителя не задан). + Если ЗначениеЗаполнено(Родитель) Тогда + + ТипПользователейРодителя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + Родитель, "Назначение").Выгрузить().ВыгрузитьКолонку("ТипПользователей"); + ТипПользователей = Назначение.ВыгрузитьКолонку("ТипПользователей"); + + Для Каждого ТипПользователя Из ТипПользователей Цикл + Если ТипПользователейРодителя.Найти(ТипПользователя) = Неопределено Тогда + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вид участников группы должен быть как у вышестоящей + |группы внешних пользователей ""%1"".'"), Родитель); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Если группе внешних пользователей устанавливается тип участников "Все пользователи заданного типа", + // проверяем наличие подчиненных групп. + Если ВсеОбъектыАвторизации + И ЗначениеЗаполнено(Ссылка) Тогда + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | ГруппыВнешнихПользователей.Родитель = &Ссылка"; + + РезультатЗапроса = Запрос.Выполнить(); + Если НЕ РезультатЗапроса.Пустой() Тогда + Возврат + НСтр("ru = 'Невозможно изменить вид участников группы, + |так как у нее имеются подгруппы.'"); + КонецЕсли; + КонецЕсли; + + // Проверка, что при изменении типа объектов авторизации + // нет подчиненных элементов другого типа (очистка типа допустима). + Если ЗначениеЗаполнено(Ссылка) Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("ТипыПользователей", Назначение); + Запрос.Текст = + "ВЫБРАТЬ + | ТипыПользователей.ТипПользователей + |ПОМЕСТИТЬ ТипыПользователей + |ИЗ + | &ТипыПользователей КАК ТипыПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователейНазначение.Ссылка) КАК СсылкаПредставление + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Назначение КАК ГруппыВнешнихПользователейНазначение + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТипыПользователей КАК ТипыПользователей + | ГДЕ + | ГруппыВнешнихПользователейНазначение.Ссылка.Родитель = &Ссылка + | И ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователейНазначение.ТипПользователей) <> ТИПЗНАЧЕНИЯ(ТипыПользователей.ТипПользователей))"; + + РезультатЗапроса = Запрос.Выполнить(); + Если НЕ РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно изменить вид участников группы, + |так как у нее имеется подгруппа ""%1"" с другим назначением участников.'"), + Выборка.СсылкаПредставление); + КонецЕсли; + КонецЕсли; + + Возврат ""; + +КонецФункции + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form index 53eab705e..4db709d97 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form @@ -7,6 +7,10 @@ ГруппыДоступа 1 + + <key>ru</key> + <value>Группы доступа</value> + true true @@ -225,13 +229,10 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true - ГруппыДоступаОписание + ГруппыДоступаКомментарий 19 true true @@ -239,11 +240,11 @@ true - Items.ГруппыДоступа.CurrentData.Описание + Items.ГруппыДоступа.CurrentData.Комментарий Left - ГруппыДоступаОписаниеРасширеннаяПодсказка + ГруппыДоступаКомментарийРасширеннаяПодсказка 21 Label true @@ -253,7 +254,7 @@ - ГруппыДоступаОписаниеКонтекстноеМеню + ГруппыДоступаКомментарийКонтекстноеМеню 20 true @@ -406,10 +407,10 @@ - Описание + Комментарий <key>ru</key> - <value>Описание</value> + <value>Комментарий</value> 5 diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl index 71da9f552..da3cea09d 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl @@ -17,9 +17,9 @@ УстановитьПривилегированныйРежим(Истина); Запрос.Текст = "ВЫБРАТЬ - | ГруппыДоступа.Ссылка, - | ГруппыДоступа.Наименование, - | ГруппыДоступа.ЭтоГруппа, + | ГруппыДоступа.Ссылка КАК Ссылка, + | ГруппыДоступа.Наименование КАК Наименование, + | ГруппыДоступа.ЭтоГруппа КАК ЭтоГруппа, | ВЫБОР | КОГДА ГруппыДоступа.ЭтоГруппа | И НЕ ГруппыДоступа.ПометкаУдаления @@ -33,7 +33,7 @@ | ИНАЧЕ 4 | КОНЕЦ КАК НомерКартинки, | ЛОЖЬ КАК Пометка, - | ГруппыДоступа.Описание + | ГруппыДоступа.Комментарий КАК Комментарий |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form index 1a11f0668..073614b9f 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -204,9 +208,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -222,7 +223,7 @@ - Описание + Комментарий 17 true true @@ -230,11 +231,11 @@ true - Items.Список.CurrentData.Описание + Items.Список.CurrentData.Комментарий Left - ОписаниеРасширеннаяПодсказка + КомментарийРасширеннаяПодсказка 19 Label true @@ -244,7 +245,7 @@ - ОписаниеКонтекстноеМеню + КомментарийКонтекстноеМеню 18 true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Module.bsl index 251194b06..bcc844531 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Module.bsl @@ -11,7 +11,7 @@ ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( Список, "ЭтоГруппа", Истина, , , Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Module.bsl index b8c5f85f0..f80f5a09e 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Module.bsl @@ -16,7 +16,7 @@ ТолькоПросмотр = Истина; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form index 3af32abdd..772c652a1 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form @@ -152,10 +152,6 @@ ru Командная панель формы - - ru - Командная панель формы - КоманднаяПанельФормыExtendedTooltip 26 @@ -223,6 +219,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -597,10 +597,6 @@ ru Контекстное меню списка - - ru - Контекстное меню списка - КонтекстноеМенюСпискаExtendedTooltip 31 @@ -639,9 +635,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -656,7 +649,7 @@ - Описание + Комментарий 8 true true @@ -664,11 +657,11 @@ true - Items.Список.CurrentData.Описание + Items.Список.CurrentData.Комментарий Left - ОписаниеExtendedTooltip + КомментарийРасширеннаяПодсказка 36 Label true @@ -678,7 +671,7 @@ - ОписаниеКонтекстноеМеню + КомментарийКонтекстноеМеню 9 true @@ -751,7 +744,7 @@ КОНЕЦ КАК Наименование, ГруппыДоступа.Профиль, ГруппыДоступа.Пользователь, - ГруппыДоступа.Описание, + ГруппыДоступа.Комментарий, ГруппыДоступа.Ответственный ИЗ Справочник.ГруппыДоступа КАК ГруппыДоступа diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl index 0d9b5d2d9..6c7ca2695 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl @@ -80,7 +80,7 @@ КонецЕсли; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form index c2d32380b..ae675c72e 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form @@ -133,6 +133,10 @@ true + + <key>ru</key> + <value>Профиль назначение</value> + ГруппаПрофильНазначениеРасширеннаяПодсказка 439 @@ -342,10 +346,6 @@ ru Пользователи стандартные команды - - ru - Пользователи стандартные команды - ПользователиСтандартныеКомандыРасширеннаяПодсказка 406 @@ -517,10 +517,6 @@ ru Пользователи контекстное меню стандартные команды - - ru - Пользователи контекстное меню стандартные команды - ПользователиКонтекстноеМенюСтандартныеКомандыРасширеннаяПодсказка 404 @@ -563,9 +559,6 @@ CommonPicture.СостоянияПользователей - None - None - None true true @@ -584,10 +577,6 @@ false false - - ru - Пользователи группы - ПользователиГруппыExtendedTooltip 344 @@ -993,9 +982,6 @@ Auto true true - None - None - None true @@ -1037,6 +1023,10 @@ ЗначенияДоступа 66 + + <key>ru</key> + <value>Значения доступа</value> + true true @@ -1275,9 +1265,6 @@ true true true - None - None - None true @@ -1286,6 +1273,10 @@ true + + <key>ru</key> + <value>Значения доступа по виду доступа</value> + ЗначенияДоступаПоВидуДоступаExtendedTooltip 373 @@ -1325,10 +1316,6 @@ false false - - ru - Доступ - ДоступExtendedTooltip 362 @@ -1347,10 +1334,10 @@ - СтраницаОписание + СтраницаКомментарий 407 - Описание + Комментарий 219 true true @@ -1358,11 +1345,11 @@ true - Объект.Описание + Объект.Комментарий None - ОписаниеExtendedTooltip + КомментарийРасширеннаяПодсказка 402 Label true @@ -1372,7 +1359,7 @@ - ОписаниеКонтекстноеМеню + КомментарийКонтекстноеМеню 220 true @@ -1399,14 +1386,10 @@ <key>ru</key> - <value>Описание</value> + <value>Комментарий</value> - - ru - Страница описание - - СтраницаОписаниеРасширеннаяПодсказка + СтраницаКомментарийРасширеннаяПодсказка 408 Label true @@ -1656,6 +1639,58 @@ ФормаКоманднаяПанель -1 + + ФормаЗаписатьИЗакрыть + 442 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 443 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + PictureAndText + true + true + true + UserCmds + Auto + + + КомандыФормы + 444 + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + КомандыФормыРасширеннаяПодсказка + 445 + Label + true + true + + Left + + + + Form + + ПоказыватьНеиспользуемыеВидыДоступа 334 @@ -1683,8 +1718,33 @@ Auto InAdditionalSubmenu + + ФормаСправка + 446 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 447 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + Left - true OnOpen @@ -1698,6 +1758,7 @@ FillCheckProcessingAtServer ОбработкаПроверкиЗаполненияНаСервере + WriteAndClose DontBlock true true @@ -2109,6 +2170,21 @@ + + ПравоРедактированияОбъекта + + <key>ru</key> + <value>Право редактирования объекта</value> + + 30 + + + true + + + true + + Подобрать @@ -2155,6 +2231,28 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ЗаписатьИЗакрыть</name> + <title> + <key>ru</key> + <value>Записать и закрыть</value> + + 3 + + ru + Записать объект и закрыть форму + + + true + + + + ЗаписатьИЗакрыть + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html index f9ec43de0..2f511264b 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html @@ -12,7 +12,7 @@
        • В поле Группа (папка) выберите папку из списка. 
      • Допустимые участники группы доступа определяются в профиле в соответствии с выбранным назначением. 
      • На вкладке Участники заполните список участников группы доступа, укажите ответственного за группу доступа.
      • На вкладке Ограничения доступа необходимо произвести дополнительные настройки прав доступа. -
      • На вкладке Описание можно ввести подробную информацию о группе доступа.

      Участники группы

      +
    • На вкладке Комментарий можно ввести подробную информацию о группе доступа.

    Участники группы

    • Перечислите список пользователей (и групп пользователей), на которых должны распространяться настройки прав доступа. Списки, из которых можно выбрать участников группы, перечислены в поле Допустимые участники в нижней части вкладки.
      • diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl index f9742860b..5b0e4185c 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl @@ -30,7 +30,7 @@ Элементы.ПользователиПодобрать.Доступность = НЕ ТолькоПросмотр; Элементы.КонтекстноеМенюПользователиПодобрать.Доступность = НЕ ТолькоПросмотр; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда @@ -47,16 +47,22 @@ ВыполненаПроцедураПриСозданииНаСервере = Истина; - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.ПользователиДобавить.ТолькоВоВсехДействиях = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() - И Не Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда + Если Не Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы + И Не УправлениеДоступомСлужебный.ЭтоПрофильОткрытиеВнешнихОтчетовИОбработок(Объект.Профиль) Тогда - ТолькоПросмотр = Истина; + ТолькоПросмотр = Истина; + Иначе + ЗапретитьИзменениеВсегоКромеСоставаУчастников(); + КонецЕсли; КонецЕсли; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -65,6 +71,7 @@ Если ОтветНаВопросПриОткрытииФормы = "УстановитьТолькоПросмотр" Тогда ОтветНаВопросПриОткрытииФормы = ""; ТолькоПросмотр = Истина; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); КонецЕсли; Если ОтветНаВопросПриОткрытииФормы = "УстановитьПрофильАдминистратор" Тогда @@ -72,8 +79,9 @@ Объект.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор"); Модифицированность = Истина; - ИначеЕсли Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") - И Объект.Профиль <> ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + ИначеЕсли Не ТолькоПросмотр + И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") + И Объект.Профиль <> ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда Отказ = Истина; ПоказатьВопрос( @@ -136,12 +144,12 @@ &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") И ПарольПользователяСервиса = Неопределено Тогда Отказ = Истина; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект, ПараметрыЗаписи), ЭтотОбъект, ПарольПользователяСервиса); @@ -179,7 +187,7 @@ Объект.Ответственный = Неопределено; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда ТекущийОбъект.ДополнительныеСвойства.Вставить( @@ -214,9 +222,12 @@ Если ПараметрыЗаписи.Свойство("ПредупредитьЧтоПрофильПомеченНаУдаление") Тогда - ПоказатьПредупреждение(, + ПоказатьПредупреждение( + Новый ОписаниеОповещения("ПослеЗаписиЗавершение", ЭтотОбъект, ПараметрыЗаписи), НСтр("ru = 'Группа доступа не влияет на права участников |так как ее профиль помечен на удаление.'")); + Иначе + ПослеЗаписиЗавершение(ПараметрыЗаписи); КонецЕсли; КонецПроцедуры @@ -409,7 +420,7 @@ КонецЦикла; - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если НЕ ОбщегоНазначения.РазделениеВключено() И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда ОписаниеОшибки = ""; @@ -822,6 +833,13 @@ #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Записать(Новый Структура("ЗаписатьИЗакрыть")); + +КонецПроцедуры + &НаКлиенте Процедура Подобрать(Команда) @@ -843,7 +861,7 @@ // Продолжение обработчика события ПриОткрытии. &НаКлиенте -Процедура ПриОткрытииПослеПодтвержденияУстановкиПрофиляАдминистратор(Ответ, Неопределен) Экспорт +Процедура ПриОткрытииПослеПодтвержденияУстановкиПрофиляАдминистратор(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ОтветНаВопросПриОткрытииФормы = "УстановитьПрофильАдминистратор"; @@ -857,7 +875,7 @@ // Продолжение обработчика события ПриОткрытии. &НаКлиенте -Процедура ПриОткрытииПослеПодтвержденияОбновленияВидовДоступа(Ответ, Неопределен) Экспорт +Процедура ПриОткрытииПослеПодтвержденияОбновленияВидовДоступа(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ОтветНаВопросПриОткрытииФормы = "ОбновитьСоставВидовДоступа"; @@ -888,6 +906,23 @@ КонецПроцедуры +// Продолжение обработчика события ПослеЗаписи. +&НаКлиенте +Процедура ПослеЗаписиЗавершение(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму() + + Закрыть(); + +КонецПроцедуры + &НаКлиенте Процедура ОбработчикОжиданияПрофильПриИзменении() @@ -895,20 +930,28 @@ КонецПроцедуры +&НаСервере +Процедура ЗапретитьИзменениеВсегоКромеСоставаУчастников() + + Элементы.Наименование.ТолькоПросмотр = Истина; + Элементы.Родитель.Видимость = Ложь; + Элементы.Профиль.ТолькоПросмотр = Истина; + Элементы.СвойстваПерсональнойГруппы.Видимость = Ложь; + Элементы.Ответственный.Видимость = Ложь; + Элементы.ОтветственныйЗаПерсональнуюГруппу.Видимость = Ложь; + Элементы.Комментарий.ТолькоПросмотр = Истина; + +КонецПроцедуры + &НаСервере Процедура НачальнаяНастройкаПриЧтенииИСоздании(ТекущийОбъект) Если ТекущийОбъект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда - Элементы.Наименование.ТолькоПросмотр = Истина; - Элементы.Родитель.Видимость = Ложь; - Элементы.Профиль.ТолькоПросмотр = Истина; - Элементы.СвойстваПерсональнойГруппы.Видимость = Ложь; - Элементы.Ответственный.Видимость = Ложь; - Элементы.ОтветственныйЗаПерсональнуюГруппу.Видимость = Ложь; - Элементы.Описание.ТолькоПросмотр = Истина; + ЗапретитьИзменениеВсегоКромеСоставаУчастников(); - Если НЕ УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда + Если Не УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда ТолькоПросмотр = Истина; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); КонецЕсли; Иначе Если ЗначениеЗаполнено(ТекущийОбъект.Пользователь) Тогда @@ -958,7 +1001,7 @@ Элементы.Доступ.ТолькоПросмотр = Истина; Элементы.Ответственный.ТолькоПросмотр = Истина; Элементы.ОтветственныйЗаПерсональнуюГруппу.ТолькоПросмотр = Истина; - Элементы.Описание.ТолькоПросмотр = Истина; + Элементы.Комментарий.ТолькоПросмотр = Истина; КонецЕсли; КонецЕсли; @@ -1436,17 +1479,18 @@ УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос( + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ - | ГруппыДоступа.ПометкаУдаления, - | ГруппыДоступа.Предопределенный, - | ГруппыДоступа.Родитель, - | ГруппыДоступа.ЭтоГруппа, - | ГруппыДоступа.Наименование, - | ГруппыДоступа.Профиль, - | ГруппыДоступа.Ответственный, - | ГруппыДоступа.Пользователь, - | ГруппыДоступа.Описание + | ГруппыДоступа.ПометкаУдаления КАК ПометкаУдаления, + | ГруппыДоступа.Предопределенный КАК Предопределенный, + | ГруппыДоступа.Родитель КАК Родитель, + | ГруппыДоступа.ЭтоГруппа КАК ЭтоГруппа, + | ГруппыДоступа.Наименование КАК Наименование, + | ГруппыДоступа.Профиль КАК Профиль, + | ГруппыДоступа.Ответственный КАК Ответственный, + | ГруппыДоступа.Пользователь КАК Пользователь, + | ГруппыДоступа.Комментарий КАК Комментарий |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ @@ -1455,8 +1499,8 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ГруппыДоступаВидыДоступа.ВидДоступа, - | ГруппыДоступаВидыДоступа.ВсеРазрешены + | ГруппыДоступаВидыДоступа.ВидДоступа КАК ВидДоступа, + | ГруппыДоступаВидыДоступа.ВсеРазрешены КАК ВсеРазрешены |ИЗ | Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа |ГДЕ @@ -1465,12 +1509,12 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ГруппыДоступаЗначенияДоступа.ВидДоступа, - | ГруппыДоступаЗначенияДоступа.ЗначениеДоступа + | ГруппыДоступаЗначенияДоступа.ВидДоступа КАК ВидДоступа, + | ГруппыДоступаЗначенияДоступа.ЗначениеДоступа КАК ЗначениеДоступа |ИЗ | Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа |ГДЕ - | ГруппыДоступаЗначенияДоступа.Ссылка = &Ссылка"); + | ГруппыДоступаЗначенияДоступа.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка); РезультатыЗапросов = Запрос.ВыполнитьПакет(); diff --git a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl index 13c83b1e1..553f5053c 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -20,6 +24,21 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт + + УправлениеДоступомСлужебный.ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ); + +КонецПроцедуры + +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -110,7 +129,7 @@ // Проверка необходимости/возможности обновления группы доступа. ГруппаДоступа = Выборка.Ссылка.ПолучитьОбъект(); - Если ГруппаДоступа.Ссылка = Справочники.ГруппыДоступа.Администраторы + Если ГруппаДоступа.Ссылка = Администраторы И ГруппаДоступа.Профиль <> Справочники.ПрофилиГруппДоступа.Администратор Тогда // Установка профиля Администратор, если не задан. ГруппаДоступа.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; @@ -206,7 +225,7 @@ ИначеЕсли НеСоздавать Тогда ГруппаЭлементов = Неопределено; Иначе - ГруппаЭлементовОбъект = Справочники.ГруппыДоступа.СоздатьГруппу(); + ГруппаЭлементовОбъект = СоздатьГруппу(); ГруппаЭлементовОбъект.Наименование = НаименованиеГруппыЭлементов; ГруппаЭлементовОбъект.Записать(); ГруппаЭлементов = ГруппаЭлементовОбъект.Ссылка; @@ -216,8 +235,11 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для поддержки обмена данными в РИБ. + // Только для внутреннего использования. -Процедура ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных, ОтправкаНазад) Экспорт +Процедура ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных) Экспорт Если ЭлементДанных.ИмяПредопределенныхДанных <> "Администраторы" Тогда Возврат; @@ -243,6 +265,38 @@ КонецПроцедуры +// Только для внутреннего использования. +Процедура УдалитьУчастниковГруппыДоступаАдминистраторыБезПользователяИБ() Экспорт + + ГруппаДоступаАдминистраторы = Администраторы.ПолучитьОбъект(); + + Индекс = ГруппаДоступаАдминистраторы.Пользователи.Количество() - 1; + Пока Индекс >= 0 Цикл + ТекущийПользователь = ГруппаДоступаАдминистраторы.Пользователи[Индекс].Пользователь; + Если ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.Пользователи") Тогда + ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийПользователь, + "ИдентификаторПользователяИБ"); + Иначе + ИдентификаторПользователяИБ = Неопределено; + КонецЕсли; + Если ТипЗнч(ИдентификаторПользователяИБ) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ИдентификаторПользователяИБ); + Иначе + ПользовательИБ = Неопределено; + КонецЕсли; + Если ПользовательИБ = Неопределено Тогда + ГруппаДоступаАдминистраторы.Пользователи.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Если ГруппаДоступаАдминистраторы.Модифицированность() Тогда + ГруппаДоступаАдминистраторы.Записать(); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. @@ -258,4 +312,4 @@ #КонецОбласти -#КонецЕсли \ No newline at end of file +#КонецЕсли diff --git a/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl index 91ba4403b..4e9efa7bb 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl @@ -25,6 +25,9 @@ Возврат; КонецЕсли; + СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + РегистрыСведений.ПраваРолей.ПроверитьДанныеРегистра(); + Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") Тогда Если ЗначениеЗаполнено(Ссылка) Тогда СтараяТаблицаПользователи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Пользователи"); @@ -125,9 +128,16 @@ Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() И Ссылка = Справочники.ГруппыДоступа.Администраторы - И НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() + И НЕ СеансЗапущенБезРазделителей И ДополнительныеСвойства.Свойство("ПарольПользователяСервиса") Тогда ПарольПользователяСервиса = ДополнительныеСвойства.ПарольПользователяСервиса; diff --git a/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo index 4b8db2dca..545300688 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo +++ b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo @@ -185,10 +185,10 @@ Use - Описание + Комментарий ru - Описание + Комментарий String @@ -196,7 +196,7 @@ ru - Краткое описание назначения группы доступа + Произвольная строка diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl index eaf78fd76..3d53198c6 100644 --- a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -15,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form index d6e86ea10..a20943f48 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form @@ -8,6 +8,10 @@ true + + <key>ru</key> + <value>Группа пользовательских настроек</value> + ГруппаПользовательскихНастроекРасширеннаяПодсказка 20 @@ -36,6 +40,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 18 @@ -55,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -307,9 +319,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl index 7ae13b1fc..3b30d5c5f 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl @@ -33,7 +33,7 @@ Элементы.Список.РежимВыбора = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form index 91a2662cd..873914010 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form @@ -99,6 +99,10 @@ Состав 10 + + <key>ru</key> + <value>Состав</value> + true true @@ -824,9 +828,6 @@ Style.BorderColor - None - None - None true diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl index 27b87cf6f..55cf10f8b 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl @@ -25,7 +25,7 @@ ОбновитьСписокНедействительныхПользователей(Истина); УстановитьДоступностьСвойств(ЭтотОбъект); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl index 1e676379f..787e099b0 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl @@ -140,10 +140,6 @@ ПользователиСлужебный.ОбновитьИспользуемостьСоставовГруппПользователей( Ссылка, УчастникиИзменений, ИзмененныеГруппы); - - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ПроверитьПравоИзмененияСостава(ИзмененияСостава); - КонецЕсли; КонецЕсли; ПользователиСлужебный.ПослеОбновленияСоставовГруппПользователей( @@ -155,44 +151,4 @@ #КонецОбласти -#Область СлужебныеПроцедурыИФункции - -Процедура ПроверитьПравоИзмененияСостава(ИзмененияСостава) - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Пользователи", ИзмененияСостава); - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Наименование КАК Наименование - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.Ссылка В(&Пользователи) - | И НЕ Пользователи.Подготовлен"; - - РезультатЗапроса = Запрос.Выполнить(); - - Если РезультатЗапроса.Пустой() Тогда - Возврат; - КонецЕсли; - - ТекстОшибки = - НСтр("ru = 'Недостаточно прав доступа. - | - |В состав участников групп пользователей можно добавлять и удалять только - |новых (добавленных) пользователей, у которых включен признак Подготовлен. - | - |Запрещено добавлять и удалять существующих пользователей:'"); - - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - ТекстОшибки = ТекстОшибки + Символы.ПС + Выборка.Наименование; - КонецЦикла; - - ВызватьИсключение ТекстОшибки; - -КонецПроцедуры - -#КонецОбласти - -#КонецЕсли +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form index 7203591a7..af6bcd7a8 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form @@ -6,6 +6,10 @@ ВсеПользователи 1 + + <key>ru</key> + <value>Все пользователи</value> + true true @@ -242,9 +246,6 @@ true true true - None - None - None true @@ -364,10 +365,10 @@ true - + <key>ru</key> <value>Команды управления списком</value> - </toolTip> + true Center @@ -633,9 +634,6 @@ true true true - None - None - None true @@ -646,12 +644,8 @@ <key>ru</key> - <value>Группа пользователи</value> + <value>Пользователи</value> - - ru - Группа пользователи - ГруппаПользователиExtendedTooltip 33 diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form index 6be33b941..e67473067 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form @@ -7,6 +7,10 @@ Разделы 1 + + <key>ru</key> + <value>Разделы</value> + true true @@ -115,12 +119,8 @@ <key>ru</key> - <value>Группа колонок</value> + <value>Колонок</value> - - ru - Группа колонок - ГруппаКолонокExtendedTooltip 16 @@ -250,9 +250,6 @@ true true true - None - None - None true diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form index 38b72c15c..b7a2c1bec 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form @@ -78,6 +78,10 @@ true + + <key>ru</key> + <value>Сообщение пользователю</value> + ГруппаСообщениеПользователюРасширеннаяПодсказка 8 diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Module.bsl index 4f03860ac..b6587ec90 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Module.bsl @@ -2,10 +2,17 @@ &НаКлиенте Процедура ПерейтиКСписку(Команда) - ПараметрыОтбора = Новый Структура; - ПараметрыОтбора.Вставить("ПроверкаДополнительныхОтчетовИОбработок", Истина); + Отборы = Новый Структура; + Отборы.Вставить("Публикация", ПредопределенноеЗначение("Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется")); + Отборы.Вставить("ПометкаУдаления", Ложь); + Отборы.Вставить("ЭтоГруппа", Ложь); - ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаСписка", ПараметрыОтбора); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Отбор", Отборы); + ПараметрыФормы.Вставить("Отображение", "Список"); + ПараметрыФормы.Вставить("ПроверкаДополнительныхОтчетовИОбработок", Истина); + + ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаСписка", ПараметрыФормы); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form index 790e137a1..7d91036bc 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form @@ -151,10 +151,6 @@ ru Быстрые отборы - - ru - Быстрые отборы - БыстрыеОтборыExtendedTooltip 32 @@ -265,10 +261,6 @@ ru Кнопки добавления - - ru - Кнопки добавления - КнопкиДобавленияExtendedTooltip 36 @@ -343,12 +335,8 @@ <key>ru</key> - <value>Группа загрузить выгрузить</value> + <value>Загрузить выгрузить</value> - - ru - Группа загрузить выгрузить - ГруппаЗагрузитьВыгрузитьРасширеннаяПодсказка 100 @@ -450,12 +438,8 @@ <key>ru</key> - <value>Группа изменить</value> + <value>Изменить</value> - - ru - Группа изменить - ГруппаИзменитьРасширеннаяПодсказка 104 @@ -480,10 +464,6 @@ ru Команды формы - - ru - Команды формы - КомандыФормыExtendedTooltip 40 @@ -642,10 +622,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 35 @@ -664,6 +640,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -1107,10 +1087,6 @@ ru Кнопки добавления - - ru - Кнопки добавления - КнопкиДобавленияМенюРасширеннаяПодсказка 112 @@ -1320,12 +1296,8 @@ <key>ru</key> - <value>Группа изменить меню</value> + <value>Изменить меню</value> - - ru - Группа изменить меню - ГруппаИзменитьМенюРасширеннаяПодсказка 108 @@ -1400,12 +1372,8 @@ <key>ru</key> - <value>Группа загрузить выгрузить меню</value> + <value>Загрузить выгрузить меню</value> - - ru - Группа загрузить выгрузить меню - ГруппаЗагрузитьВыгрузитьМенюРасширеннаяПодсказка 102 @@ -1443,9 +1411,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Module.bsl index cf24358e7..25b9b7f7a 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Module.bsl @@ -19,7 +19,7 @@ Элементы.Список.Отображение = ОтображениеТаблицы[Параметры.Отображение]; КонецЕсли; - СписокВыбора = Элементы.ПубликацияОтбор.СписокВыбора; + СписокВыбораПубликаций = Элементы.ПубликацияОтбор.СписокВыбора; ВидИспользуется = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется; ВидОтключена = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена; @@ -32,24 +32,27 @@ Если ДоступныеВидыПубликации.Найти(ВидРежимОтладки) <> Неопределено Тогда ВсеПубликацииКромеНеиспользующихся.Добавить(ВидРежимОтладки); КонецЕсли; - Если ВсеПубликацииКромеНеиспользующихся.Количество() > 1 Тогда - ПредставлениеМассива = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 или %2'"), Строка(ВсеПубликацииКромеНеиспользующихся[0]), Строка(ВсеПубликацииКромеНеиспользующихся[1])); - - СписокВыбора.Добавить(1, ПредставлениеМассива); - + СписокВыбораПубликаций.Добавить(1, ПредставлениеМассива); КонецЕсли; - Для Каждого ЗначениеПеречисления Из Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок Цикл Если ДоступныеВидыПубликации.Найти(ЗначениеПеречисления) <> Неопределено Тогда - СписокВыбора.Добавить(ЗначениеПеречисления, Строка(ЗначениеПеречисления)); + СписокВыбораПубликаций.Добавить(ЗначениеПеречисления, Строка(ЗначениеПеречисления)); КонецЕсли; КонецЦикла; + Если Параметры.Отбор.Свойство("Публикация") Тогда + ПубликацияОтбор = Параметры.Отбор.Публикация; + Параметры.Отбор.Удалить("Публикация"); + Если СписокВыбораПубликаций.НайтиПоЗначению(ПубликацияОтбор) = Неопределено Тогда + ПубликацияОтбор = Неопределено; + КонецЕсли; + КонецЕсли; + СписокВыбора = Элементы.ВидОтбор.СписокВыбора; СписокВыбора.Добавить(1, НСтр("ru = 'Только отчеты'")); СписокВыбора.Добавить(2, НСтр("ru = 'Только обработки'")); @@ -78,13 +81,21 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ВыгрузитьВФайл", "Видимость", ПравоДобавления); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ВыгрузитьВФайлМеню", "Видимость", ПравоДобавления); - ПрофилиИспользуются = Не ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + + ПрофилиИспользуются = Не ИспользуютсяПрофилиБезопасности; Элементы.ИзменитьПометкуУдаленияБезПрофилей.Видимость = Не ПрофилиИспользуются; Элементы.ИзменитьПометкуУдаленияБезПрофилейМеню.Видимость = Не ПрофилиИспользуются; Элементы.ИзменитьПометкуУдаленияСПрофилями.Видимость = ПрофилиИспользуются; Элементы.ИзменитьПометкуУдаленияСПрофилямиМеню.Видимость = ПрофилиИспользуются; - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") + Или Не ПравоДоступа("Изменение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда Элементы.ИзменитьВыделенные.Видимость = Ложь; Элементы.ИзменитьВыделенныеМеню.Видимость = Ложь; КонецЕсли; @@ -98,10 +109,12 @@ &НаСервере Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) - ПубликацияОтбор = Настройки.Получить("ПубликацияОтбор"); - ВидОтбор = Настройки.Получить("ВидОтбор"); - Список.Параметры.УстановитьЗначениеПараметра("ПубликацияОтбор", ПубликацияОтбор); - Список.Параметры.УстановитьЗначениеПараметра("ВидОтбор", ВидОтбор); + Если Не ЗначениеЗаполнено(ПубликацияОтбор) Тогда + ПубликацияОтбор = Настройки.Получить("ПубликацияОтбор"); + Список.Параметры.УстановитьЗначениеПараметра("ПубликацияОтбор", ПубликацияОтбор); + КонецЕсли; + ВидОтбор = Настройки.Получить("ВидОтбор"); + Список.Параметры.УстановитьЗначениеПараметра("ВидОтбор", ВидОтбор); КонецПроцедуры #КонецОбласти @@ -223,17 +236,27 @@ &НаСервере Процедура УстановитьУсловноеОформление() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "Список"; - Инструкция.Отборы.Вставить("Список.Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "Список"; - Инструкция.Отборы.Вставить("Список.Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + Список.УсловноеОформление.Элементы.Очистить(); + // + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Публикация"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет); + // + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Публикация"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + КонецПроцедуры &НаКлиенте @@ -274,7 +297,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ДополнительныеОтчетыИОбработки"); ЭлементБлокировки.УстановитьЗначение("Ссылка", ДополнительныйОтчетИлиОбработка); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); КонецЦикла; @@ -345,32 +367,40 @@ ЗаблокироватьОбъектыИСформироватьЗапросыРазрешений(Контекст); Обработчик = Новый ОписаниеОповещения("СписокИзменитьПометкуУдаленияПослеПодтвержденияЗапросов", ЭтотОбъект, Контекст); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Контекст.Запросы, ЭтотОбъект, Обработчик); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Контекст.Запросы, ЭтотОбъект, Обработчик); + Иначе + ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК); + КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Процедура ЗаблокироватьОбъектыИСформироватьЗапросыРазрешений(Контекст) ЗаблокироватьДанныеДляРедактирования(Контекст.Ссылка, , Контекст.ИдентификаторФормы); - Объект = Контекст.Ссылка.ПолучитьОбъект(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Объект = Контекст.Ссылка.ПолучитьОбъект(); + + Контекст.Запросы = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ЗапросыРазрешенийДополнительнойОбработки( + Объект, + Объект.Разрешения.Выгрузить(), + , + Не Контекст.ПометкаУдаления); + КонецЕсли; - Контекст.Запросы = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ЗапросыРазрешенийДополнительнойОбработки( - Объект, - Объект.Разрешения.Выгрузить(), - , - Не Контекст.ПометкаУдаления); КонецПроцедуры &НаКлиенте Процедура СписокИзменитьПометкуУдаленияПослеПодтвержденияЗапросов(Ответ, Контекст) Экспорт - МенятьПометку = (Ответ = КодВозвратаДиалога.ОК); - РазблокироватьИИзменитьПометкуУдаленияОбъектов(Контекст, МенятьПометку); + ИзменятьПометку = (Ответ = КодВозвратаДиалога.ОК); + РазблокироватьИИзменитьПометкуУдаленияОбъектов(Контекст, ИзменятьПометку); Элементы.Список.Обновить(); КонецПроцедуры &НаСервереБезКонтекста -Процедура РазблокироватьИИзменитьПометкуУдаленияОбъектов(Контекст, МенятьПометку) - Если МенятьПометку Тогда +Процедура РазблокироватьИИзменитьПометкуУдаленияОбъектов(Контекст, ИзменятьПометку) + Если ИзменятьПометку Тогда Объект = Контекст.Ссылка.ПолучитьОбъект(); Объект.УстановитьПометкуУдаления(Не Контекст.ПометкаУдаления); Объект.Записать(); diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form index 7f486dbff..1dd0703a7 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form @@ -136,12 +136,8 @@ <key>ru</key> - <value>Группа безопасный режим глобальный</value> + <value>Безопасный режим глобальный</value> - - ru - Группа безопасный режим глобальный - ГруппаБезопасныйРежимГлобальныйРасширеннаяПодсказка 383 @@ -168,12 +164,8 @@ <key>ru</key> - <value>Группа наименование режим работы</value> + <value>Наименование режим работы</value> - - ru - Группа наименование режим работы - ГруппаНаименованиеРежимРаботыРасширеннаяПодсказка 385 @@ -255,7 +247,7 @@ <key>ru</key> - <value>Группа публикация ответственный</value> + <value>Публикация ответственный</value> ГруппаПубликацияОтветственныйExtendedTooltip @@ -420,7 +412,7 @@ <key>ru</key> - <value>Группа размещение</value> + <value>Размещение</value> ГруппаРазмещениеРасширеннаяПодсказка @@ -626,10 +618,6 @@ ru Командная панель объект команды - - ru - Командная панель объект команды - КоманднаяПанельОбъектКомандыРасширеннаяПодсказка 406 @@ -648,6 +636,10 @@ ОбъектКоманды 147 + + <key>ru</key> + <value>Объект команды</value> + true true @@ -1080,9 +1072,6 @@ Auto true true - None - None - None true @@ -1195,10 +1184,6 @@ ru Варианты скрыть до записи - - ru - Варианты скрыть до записи - true ВариантыСкрытьДоЗаписиExtendedTooltip @@ -1222,6 +1207,10 @@ ВариантыДополнительногоОтчета 89 + + <key>ru</key> + <value>Варианты дополнительного отчета</value> + true true @@ -1729,9 +1718,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true @@ -1744,10 +1730,6 @@ ru Варианты показать - - ru - Варианты показать - true ВариантыПоказатьExtendedTooltip @@ -1775,10 +1757,6 @@ ru Страницы варианты - - ru - Страницы варианты - true СтраницыВариантыExtendedTooltip @@ -1916,10 +1894,6 @@ ru Страница персональный профиль безопасности - - ru - Страница персональный профиль безопасности - СтраницаПерсональныйПрофильБезопасностиРасширеннаяПодсказка 290 @@ -1988,10 +1962,6 @@ ru Страница небезопасный режим с разрешениями - - ru - Страница небезопасный режим с разрешениями - СтраницаНебезопасныйРежимСРазрешениямиРасширеннаяПодсказка 294 @@ -2059,10 +2029,6 @@ ru Страница безопасный режим с разрешениями - - ru - Страница безопасный режим с разрешениями - СтраницаБезопасныйРежимСРазрешениямиРасширеннаяПодсказка 292 @@ -2089,10 +2055,6 @@ ru Страницы безопасный режим с разрешениями - - ru - Страницы безопасный режим с разрешениями - СтраницыБезопасныйРежимСРазрешениямиРасширеннаяПодсказка 264 @@ -2115,12 +2077,8 @@ <key>ru</key> - <value>Группа безопасный режим с разрешениями</value> + <value>Безопасный режим с разрешениями</value> - - ru - Группа безопасный режим с разрешениями - ГруппаБезопасныйРежимСРазрешениямиРасширеннаяПодсказка 288 @@ -2200,10 +2158,6 @@ ru Разрешения (режим совместимости разрешений "Версия 2.1.3") - - ru - Страница разрешения версия 2 1 3 - СтраницаРазрешенияВерсия_2_1_3РасширеннаяПодсказка 187 @@ -2282,10 +2236,6 @@ ru Разрешения (режим совместимости разрешений "Версия 2.2.3") - - ru - Страница разрешения версия 2 2 2 - СтраницаРазрешенияВерсия_2_2_2РасширеннаяПодсказка 251 @@ -2310,12 +2260,8 @@ <key>ru</key> - <value>Группа страницы режимы совместимости разрешений</value> + <value>Страницы режимы совместимости разрешений</value> - - ru - Группа страницы режимы совместимости разрешений - ГруппаСтраницыРежимыСовместимостиРазрешенийРасширеннаяПодсказка 262 @@ -2384,12 +2330,8 @@ <key>ru</key> - <value>Группа включение профилей безопасности</value> + <value>Включение профилей безопасности</value> - - ru - Группа включение профилей безопасности - ГруппаВключениеПрофилейБезопасностиРасширеннаяПодсказка 305 @@ -2474,6 +2416,10 @@ КомандыЗагрузки 324 + + <key>ru</key> + <value>Команды загрузки</value> + true true @@ -2644,9 +2590,6 @@ СписокКомандЗагрузки.Picture - None - None - None true true @@ -3247,10 +3190,6 @@ ru Команды выгрузки загрузки - - ru - Команды выгрузки загрузки - КомандыВыгрузкиЗагрузкиРасширеннаяПодсказка 334 @@ -3351,10 +3290,6 @@ ru Команды формы - - ru - Команды формы - КомандыФормыРасширеннаяПодсказка 256 diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl index cf384fbeb..2946f222b 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl @@ -14,6 +14,13 @@ Возврат; КонецЕсли; + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма + И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Работа с печатными формами не поддерживается.'")); + Возврат; + КонецЕсли; + // Проверка возможности загрузки новых обработок в информационную базу. ЭтоНовый = Объект.Ссылка.Пустая(); ПравоДобавления = ДополнительныеОтчетыИОбработки.ПравоДобавления(); @@ -200,8 +207,10 @@ ЗаполнитьКоманды(); УстановитьВидимостьДоступность(); - Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - ВыполнитьЗаменуКомандПечати(); + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ОтключитьКомандыПечати(ВыбранныеОбъектыНазначения().ВыгрузитьЗначения(), ОтключаемыеКоманды().ВыгрузитьЗначения()); КонецЕсли; КонецПроцедуры @@ -260,16 +269,8 @@ Если Ссылка = "int://sp-on" Тогда - ОткрытьФорму( - "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкиИспользованияПрофилейБезопасности", - , - , - , - , - , - , - РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); - + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ОткрытьДиалогНастройкиИспользованияПрофилейБезопасности(); СтандартнаяОбработка = Ложь; КонецЕсли; @@ -473,6 +474,20 @@ Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбъектКомандыРегламентноеЗаданиеПредставление.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Команды.РегламентноеЗаданиеИспользование"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -480,8 +495,16 @@ &НаКлиенте Процедура ЗаписатьНаКлиенте(ЗакрытьПослеЗаписи) - Запросы = ЗапросыОбновленияРазрешений(); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, Новый ОписаниеОповещения("ПродолжитьЗаписьНаКлиенте", ЭтотОбъект, ЗакрытьПослеЗаписи)); + + Обработчик = Новый ОписаниеОповещения("ПродолжитьЗаписьНаКлиенте", ЭтотОбъект, ЗакрытьПослеЗаписи); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = ЗапросыОбновленияРазрешений(); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, Обработчик); + Иначе + ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -509,7 +532,7 @@ Функция ЗапросыОбновленияРазрешений() Возврат ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ЗапросыРазрешенийДополнительнойОбработки( - Объект, ПолучитьТаблицуРазрешений()); + Объект, РазрешенияПрофиляБезопасности()); КонецФункции @@ -523,7 +546,7 @@ &НаКлиенте Процедура ОбновлениеИзФайлаЗапуск() Оповещение = Новый ОписаниеОповещения("ОбновлениеИзФайлаПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемДОИО"); + ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемДополнительногоОтчетаИлиОбработки"); ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); КонецПроцедуры @@ -804,11 +827,8 @@ Возврат; КонецЕсли; - Если ИзмененФлажок Тогда - Если НЕ ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда - ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеОтключенногоРасписания(); - Возврат; - КонецЕсли; + Если ИзмененФлажок И Не ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда + Возврат; КонецЕсли; Если ЭлементКоманда.РегламентноеЗаданиеРасписание.Количество() > 0 Тогда @@ -821,9 +841,10 @@ РасписаниеКоманды = Новый РасписаниеРегламентногоЗадания; КонецЕсли; - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ЭлементКоманда", ЭлементКоманда); - Обработчик = Новый ОписаниеОповещения("ИзменитьРегламентноеЗаданиеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Контекст = Новый Структура; + Контекст.Вставить("ЭлементКоманда", ЭлементКоманда); + Контекст.Вставить("ОтключитьФлажокПриОтменеРедактирования", ИзмененФлажок); + Обработчик = Новый ОписаниеОповещения("ПослеОкончанияРедактированияРасписания", ЭтотОбъект, Контекст); РедактированиеРасписания = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеКоманды); РедактированиеРасписания.Показать(Обработчик); @@ -831,22 +852,29 @@ КонецПроцедуры &НаКлиенте -Процедура ИзменитьРегламентноеЗаданиеЗавершение(Расписание, ДополнительныеПараметры) Экспорт +Процедура ПослеОкончанияРедактированияРасписания(Расписание, Контекст) Экспорт + ЭлементКоманда = Контекст.ЭлементКоманда; Если Расписание = Неопределено Тогда - Возврат; - КонецЕсли; - - ЭлементКоманда = ДополнительныеПараметры.ЭлементКоманда; - ЭлементКоманда.РегламентноеЗаданиеРасписание.Очистить(); - ЭлементКоманда.РегламентноеЗаданиеРасписание.Добавить(Расписание); - ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(Расписание); - - Если ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеПустогоРасписания() Тогда - ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеОтключенногоРасписания(); - ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь; - Модифицированность = Истина; + Если Контекст.ОтключитьФлажокПриОтменеРедактирования Тогда + ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь; + КонецЕсли; Иначе - ЭлементКоманда.РегламентноеЗаданиеИспользование = Истина; + ЭлементКоманда.РегламентноеЗаданиеРасписание.Очистить(); + ЭлементКоманда.РегламентноеЗаданиеРасписание.Добавить(Расписание); + Если ДополнительныеОтчетыИОбработкиКлиентСервер.РасписаниеЗадано(Расписание) Тогда + Модифицированность = Истина; + ЭлементКоманда.РегламентноеЗаданиеИспользование = Истина; + ЭлементКоманда.РегламентноеЗаданиеПредставление = СтандартныеПодсистемыКлиентСервер.ПредставлениеРасписания(Расписание); + Иначе + ЭлементКоманда.РегламентноеЗаданиеПредставление = НСтр("ru = 'Не заполнено'"); + Если ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда + ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь; + ПоказатьОповещениеПользователя( + НСтр("ru = 'Запуск по расписанию отключен'"), + , + НСтр("ru = 'Расписание не заполнено'")); + КонецЕсли; + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -958,7 +986,7 @@ ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выполняется команда ""%1""'"), СтрокаТаблицыКоманд.Представление); - Состояние(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48); + ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48); ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор); @@ -995,16 +1023,6 @@ //////////////////////////////////////////////////////////////////////////////// // Клиент, Сервер -&НаКлиентеНаСервереБезКонтекста -Функция ПредставлениеПустогоРасписания() - Возврат Строка(Новый РасписаниеРегламентногоЗадания); -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПредставлениеОтключенногоРасписания() - Возврат НСтр("ru = 'Расписание не задано'"); -КонецФункции - &НаКлиентеНаСервереБезКонтекста Функция ПредставлениеБыстрогоДоступаПользователей(КоличествоПользователей) Если КоличествоПользователей = 0 Тогда @@ -1172,28 +1190,37 @@ КонецЦикла; КонецЕсли; - КоличествоРазрешений = ПолучитьТаблицуРазрешений().Количество(); + КоличествоРазрешений = РазрешенияПрофиляБезопасности().Количество(); РежимСовместимостиРазрешений = Объект.РежимСовместимостиРазрешений; БезопасныйРежим = Объект.БезопасныйРежим; - Если ПолучитьФункциональнуюОпцию("РаботаВМоделиСервиса") Или ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + + Если ПолучитьФункциональнуюОпцию("РаботаВМоделиСервиса") Или ИспользуютсяПрофилиБезопасности Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда - Если БезопасныйРежим И КоличествоРазрешений > 0 И ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + Если БезопасныйРежим И КоличествоРазрешений > 0 И ИспользуютсяПрофилиБезопасности Тогда Если ЭтоНовый Тогда БезопасныйРежим = ""; Иначе - БезопасныйРежим = РаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка); + БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка); КонецЕсли; КонецЕсли; Иначе Если КоличествоРазрешений = 0 Тогда БезопасныйРежим = Истина; Иначе - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + Если ИспользуютсяПрофилиБезопасности Тогда Если ЭтоНовый Тогда БезопасныйРежим = ""; Иначе - БезопасныйРежим = РаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка); + БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка); КонецЕсли; Иначе БезопасныйРежим = Ложь; @@ -1239,11 +1266,19 @@ БезопасныйРежим); Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 не является корректным режимом подключения для дополнительных отчетов и обработок, требующих разрешений на использование профилей безопасности!'"), + НСтр("ru = '%1 не является корректным режимом подключения для дополнительных отчетов и обработок, + |требующих разрешений на использование профилей безопасности.'"), БезопасныйРежим); КонецЕсли; - Если БезопасныйРежим = Ложь И Не ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") И РаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + ДоступнаНастройкаПрофилейБезопасности = МодульРаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности(); + Иначе + ДоступнаНастройкаПрофилейБезопасности = Ложь; + КонецЕсли; + + Если БезопасныйРежим = Ложь И Не ИспользуютсяПрофилиБезопасности И ДоступнаНастройкаПрофилейБезопасности Тогда Элементы.ГруппаВключениеПрофилейБезопасности.Видимость = Истина; Иначе Элементы.ГруппаВключениеПрофилейБезопасности.Видимость = Ложь; @@ -1255,35 +1290,28 @@ Элементы.СтраницыВариантыКомандыРазрешения.ОтображениеСтраниц = ОтображениеСтраницФормы[?(КоличествоВидимыхЗакладок > 1, "ЗакладкиСверху", "Нет")]; + ПредставлениеНазначения = ""; Если ЭтоГлобальнаяОбработка Тогда - ПредставлениеНазначения = НСтр("ru = '<Не задано>'"); - Если Объект.Разделы.Количество() > 0 Тогда - ПредставлениеНазначения = ""; - Для Каждого СтрокаРаздел Из Объект.Разделы Цикл - Если ПредставлениеНазначения <> "" Тогда - ПредставлениеНазначения = ПредставлениеНазначения + ", "; - КонецЕсли; - ПредставлениеНазначения = ПредставлениеНазначения + ДополнительныеОтчетыИОбработки.ПредставлениеРаздела(СтрокаРаздел.Раздел); - КонецЦикла; - КонецЕсли; + Для Каждого СтрокаРаздел Из Объект.Разделы Цикл + ПредставлениеРаздела = ДополнительныеОтчетыИОбработки.ПредставлениеРаздела(СтрокаРаздел.Раздел); + Если ПредставлениеНазначения = "" Тогда + ПредставлениеНазначения = ПредставлениеРаздела; + Иначе + ПредставлениеНазначения = ПредставлениеНазначения + ", " + ПредставлениеРаздела; + КонецЕсли; + КонецЦикла; Иначе - Если Объект.Назначение.Количество() = 0 Тогда - ПредставлениеНазначения = НСтр("ru = 'Не определено'"); - Иначе - ПредставлениеНазначения = ""; - Для Каждого СтрокаНазначение Из Объект.Назначение Цикл - Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаНазначение.ОбъектНазначения, "Наименование, ПометкаУдаления"); - Если Реквизиты.ПометкаУдаления Тогда - Продолжить; - КонецЕсли; - ПредставлениеОбъекта = Реквизиты.Наименование; - Если ПредставлениеНазначения = "" Тогда - ПредставлениеНазначения = ПредставлениеОбъекта; - Иначе - ПредставлениеНазначения = ПредставлениеНазначения + ", " + ПредставлениеОбъекта; - КонецЕсли; - КонецЦикла; - КонецЕсли; + Для Каждого СтрокаНазначение Из Объект.Назначение Цикл + ПредставлениеОМ = ДополнительныеОтчетыИОбработки.ПредставлениеОбъектаМетаданных(СтрокаНазначение.ОбъектНазначения); + Если ПредставлениеНазначения = "" Тогда + ПредставлениеНазначения = ПредставлениеОМ; + Иначе + ПредставлениеНазначения = ПредставлениеНазначения + ", " + ПредставлениеОМ; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если ПредставлениеНазначения = "" Тогда + ПредставлениеНазначения = НСтр("ru = 'Не определено'"); КонецЕсли; Элементы.ОбъектКомандыБыстрыйДоступПредставление.Видимость = ЭтоГлобальнаяОбработка; @@ -1334,7 +1362,7 @@ &НаСервере Процедура СформироватьПредставленияРазрешений(Знач ВидРазрешения) - ТаблицаРазрешений = ПолучитьТаблицуРазрешений(); + ТаблицаРазрешений = РазрешенияПрофиляБезопасности(); СтрокаРазрешения = ТаблицаРазрешений.Найти(ВидРазрешения, "ВидРазрешения"); Если СтрокаРазрешения <> Неопределено Тогда ПараметрыРазрешения = СтрокаРазрешения.Параметры.Получить(); @@ -1357,16 +1385,18 @@ Разрешения = Новый Массив(); + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + Для Каждого Строка Из ТаблицаРазрешений Цикл - Разрешение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаВБезопасномРежимеСлужебный.Пакет(), Строка.ВидРазрешения)); + Разрешение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(МодульРаботаВБезопасномРежимеСлужебный.Пакет(), Строка.ВидРазрешения)); ЗаполнитьЗначенияСвойств(Разрешение, Строка.Параметры.Получить()); Разрешения.Добавить(Разрешение); КонецЦикла; - Свойства = РаботаВБезопасномРежимеСлужебный.СвойстваДляРегистраРазрешений(Объект.Ссылка); + Свойства = МодульРаботаВБезопасномРежимеСлужебный.СвойстваДляРегистраРазрешений(Объект.Ссылка); УстановитьПривилегированныйРежим(Истина); - ПредставлениеРазрешений_2_2_2 = РаботаВБезопасномРежимеСлужебный.ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов( + ПредставлениеРазрешений_2_2_2 = МодульРаботаВБезопасномРежимеСлужебный.ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов( Свойства.Тип, Свойства.Идентификатор, Свойства.Тип, Свойства.Идентификатор, Разрешения); УстановитьПривилегированныйРежим(Ложь); @@ -1382,9 +1412,12 @@ Объект.Команды.Сортировать("Представление"); - КомандыПечатиОбъекта = УправлениеПечатью.СоздатьКоллекциюКомандПечати(); - Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма И Объект.Назначение.Количество() = 1 Тогда - КомандыПечатиОбъекта = УправлениеПечатью.СтандартныеКомандыПечатиОбъекта(Объект.Назначение[0].ОбъектНазначения); + КомандыПечатиОбъекта = Неопределено; + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма + И Объект.Назначение.Количество() = 1 + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + КомандыПечатиОбъекта = МодульУправлениеПечатью.СтандартныеКомандыПечатиОбъекта(Объект.Назначение[0].ОбъектНазначения); КонецЕсли; Для Каждого ЭлементКоманда Из Объект.Команды Цикл @@ -1412,29 +1445,21 @@ КонецЕсли; Если ЗначениеЗаполнено(РегламентноеЗаданиеGUID) Тогда - РегламентноеЗадание = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.НайтиЗадание(РегламентноеЗаданиеGUID); - + УстановитьПривилегированныйРежим(Истина); + РегламентноеЗадание = РегламентныеЗаданияСервер.Задание(РегламентноеЗаданиеGUID); Если РегламентноеЗадание <> Неопределено Тогда - - ПараметрыЗадания = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.ПолучитьПараметрыЗадания(РегламентноеЗадание); - ЭлементКоманда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеGUID; - ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(ПараметрыЗадания.Расписание); - ЭлементКоманда.РегламентноеЗаданиеИспользование = ПараметрыЗадания.Использование; - ЭлементКоманда.РегламентноеЗаданиеРасписание.Вставить(0, ПараметрыЗадания.Расписание); - - Если ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеПустогоРасписания() Тогда - ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь; - КонецЕсли; - + ЭлементКоманда.РегламентноеЗаданиеПредставление = СтандартныеПодсистемыКлиентСервер.ПредставлениеРасписания(РегламентноеЗадание.Расписание); + ЭлементКоманда.РегламентноеЗаданиеИспользование = РегламентноеЗадание.Использование; + ЭлементКоманда.РегламентноеЗаданиеРасписание.Вставить(0, РегламентноеЗадание.Расписание); КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); КонецЕсли; - - Если НЕ ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда - ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеОтключенногоРасписания(); + Если Не ЗначениеЗаполнено(ЭлементКоманда.РегламентноеЗаданиеПредставление) Тогда + ЭлементКоманда.РегламентноеЗаданиеПредставление = НСтр("ru = 'Не заполнено'"); КонецЕсли; ИначеЕсли Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - Если Не ПустаяСтрока(ЭлементКоманда.ЗаменяемыеКоманды) Тогда + Если Не ПустаяСтрока(ЭлементКоманда.ЗаменяемыеКоманды) И КомандыПечатиОбъекта <> Неопределено Тогда ИдентификаторыЗаменяемых = СтрРазделить(ЭлементКоманда.ЗаменяемыеКоманды, ",", Ложь); ПредставлениеЗаменяемыхКоманд = ""; КоличествоЗаменяемых = 0; @@ -1459,7 +1484,7 @@ КонецЕсли; Иначе ЭлементКоманда.РегламентноеЗаданиеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не применимо для команд с вариантом запуска ""%1""'"), + НСтр("ru = 'Неприменимо для команд с вариантом запуска ""%1""'"), Строка(ЭлементКоманда.ВариантЗапуска)); КонецЕсли; КонецЦикла; @@ -1488,7 +1513,7 @@ СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя); Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл КлючВарианта = ВариантНастроекКД.Имя; - ВариантСсылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, КлючВарианта); + ВариантСсылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, КлючВарианта); Если ВариантСсылка <> Неопределено Тогда Вариант = ВариантыДополнительногоОтчета.Добавить(); Вариант.КлючВарианта = КлючВарианта; @@ -1500,7 +1525,7 @@ КонецЦикла; Иначе КлючВарианта = ""; - ВариантСсылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, КлючВарианта); + ВариантСсылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, КлючВарианта); Если ВариантСсылка <> Неопределено Тогда Вариант = ВариантыДополнительногоОтчета.Добавить(); Вариант.КлючВарианта = КлючВарианта; @@ -1517,13 +1542,13 @@ Если Объект.ИспользуетХранилищеВариантов Тогда Хранилище = ХранилищаНастроек["ХранилищеВариантовОтчетов"]; КлючОбъекта = Объект.Ссылка; + СписокНастроек = МодульВариантыОтчетов.КлючиВариантовОтчета(КлючОбъекта); Иначе Хранилище = ХранилищеВариантовОтчетов; КлючОбъекта = "ВнешнийОтчет." + Объект.ИмяОбъекта; + СписокНастроек = Хранилище.ПолучитьСписок(КлючОбъекта); КонецЕсли; - СписокНастроек = Хранилище.ПолучитьСписок(КлючОбъекта); - Для Каждого ЭлементСписка Из СписокНастроек Цикл Вариант = ВариантыДополнительногоОтчета.Добавить(); Вариант.КлючВарианта = ЭлементСписка.Значение; @@ -1531,13 +1556,13 @@ Вариант.Пользовательский = Истина; Вариант.ИндексКартинки = 3; Если МодульВариантыОтчетов <> Неопределено Тогда - Вариант.Ссылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, Вариант.КлючВарианта); + Вариант.Ссылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, Вариант.КлючВарианта); КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервере -Функция ПолучитьТаблицуРазрешений() +Функция РазрешенияПрофиляБезопасности() Возврат ПолучитьИзВременногоХранилища(АдресРазрешений); @@ -1561,14 +1586,8 @@ &НаКлиенте Процедура ОткрытьФормуНастроекПодменюПечать() - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("Отбор", ВыбранныеОбъектыНазначения()); - ОткрытьФорму("ОбщаяФорма.НастройкаКомандПечати", ПараметрыОткрытия, , , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); -КонецПроцедуры - -&НаСервере -Процедура ВыполнитьЗаменуКомандПечати() - УправлениеПечатью.ОтключитьКомандыПечати(ВыбранныеОбъектыНазначения().ВыгрузитьЗначения(), ОтключаемыеКоманды().ВыгрузитьЗначения()); + МодульУправлениеПечатьюСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюСлужебныйКлиент"); + МодульУправлениеПечатьюСлужебныйКлиент.ОткрытьФормуНастроекПодменюПечать(ВыбранныеОбъектыНазначения()); КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl index aa7b9ac7c..f5e359410 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -19,6 +23,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl index f5d882674..ecdda08c3 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl @@ -210,70 +210,55 @@ ПубликацияВключена = (Публикация <> Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); - // Регламентные задание необходимо изменять в привилегированном режиме. + // Регламентные задания необходимо изменять в привилегированном режиме. УстановитьПривилегированныйРежим(Истина); // Очистка заданий по командам, которые были удалены из таблицы. - Если НЕ ЭтоНовый() Тогда + Если Не ЭтоНовый() Тогда Для Каждого СтараяКоманда Из Ссылка.Команды Цикл Если ЗначениеЗаполнено(СтараяКоманда.РегламентноеЗаданиеGUID) И ТаблицаКоманд.Найти(СтараяКоманда.РегламентноеЗаданиеGUID, "РегламентноеЗаданиеGUID") = Неопределено Тогда - - Задание = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.НайтиЗадание(СтараяКоманда.РегламентноеЗаданиеGUID); - Если Задание <> Неопределено Тогда - ДополнительныеОтчетыИОбработкиРегламентныеЗадания.УдалитьЗадание(Задание); - КонецЕсли; - + РегламентныеЗаданияСервер.УдалитьЗадание(СтараяКоманда.РегламентноеЗаданиеGUID); КонецЕсли; КонецЦикла; КонецЕсли; // Актуализация набора регламентных заданий для записи их идентификаторов в табличную часть. Для Каждого АктуальнаяКоманда Из ТаблицаКоманд Цикл - Команда = Команды.Найти(АктуальнаяКоманда.Идентификатор, "Идентификатор"); Если ПубликацияВключена И АктуальнаяКоманда.РегламентноеЗаданиеРасписание.Количество() > 0 Тогда Расписание = АктуальнаяКоманда.РегламентноеЗаданиеРасписание[0].Значение; - Использование = АктуальнаяКоманда.РегламентноеЗаданиеИспользование И РасписаниеЗадано(Расписание); + Использование = АктуальнаяКоманда.РегламентноеЗаданиеИспользование + И ДополнительныеОтчетыИОбработкиКлиентСервер.РасписаниеЗадано(Расписание); Иначе Расписание = Неопределено; Использование = Ложь; КонецЕсли; - Задание = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.НайтиЗадание(АктуальнаяКоманда.РегламентноеЗаданиеGUID); - + Задание = РегламентныеЗаданияСервер.Задание(АктуальнаяКоманда.РегламентноеЗаданиеGUID); Если Задание = Неопределено Тогда // Не найдено - Если Использование Тогда - - Задание = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.СоздатьНовоеЗадание( - ПредставлениеЗадания(АктуальнаяКоманда)); - + // Создать и зарегистрировать. + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок); + ПараметрыЗадания.Вставить("Использование", Ложь); + Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); ЗаданияДляОбновления.Вставить(АктуальнаяКоманда, Задание); - - // Создать и зарегистрировать - Команда.РегламентноеЗаданиеGUID = - ДополнительныеОтчетыИОбработкиРегламентныеЗадания.ПолучитьИдентификаторЗадания( - Задание); - + Команда.РегламентноеЗаданиеGUID = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); Иначе // Действие не требуется КонецЕсли; - Иначе // Найдено - Если Использование Тогда - // Зарегистрировать + // Зарегистрировать. ЗаданияДляОбновления.Вставить(АктуальнаяКоманда, Задание); Иначе - // Удалить - ДополнительныеОтчетыИОбработкиРегламентныеЗадания.УдалитьЗадание(Задание); + // Удалить. + РегламентныеЗаданияСервер.УдалитьЗадание(АктуальнаяКоманда.РегламентноеЗаданиеGUID); Команда.РегламентноеЗаданиеGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); КонецЕсли; - КонецЕсли; - КонецЦикла; ДополнительныеСвойства.Вставить("ЗаданияДляОбновления", ЗаданияДляОбновления); @@ -281,59 +266,57 @@ КонецПроцедуры Процедура ПриЗаписиГлобальнойОбработки(Отказ) - - Если Отказ ИЛИ НЕ ДополнительныеСвойства.Свойство("АктуальныеКоманды") Тогда + Если Отказ Или Не ДополнительныеСвойства.Свойство("АктуальныеКоманды") Тогда Возврат; КонецЕсли; ПубликацияВключена = (Публикация <> Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); + ТеснаяИнтеграцияСПодсистемойВМоделиСервиса = ДополнительныеОтчетыИОбработки.ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса(); - // Регламентные задание необходимо изменять в привилегированном режиме. + // Регламентные задания необходимо изменять в привилегированном режиме. УстановитьПривилегированныйРежим(Истина); Для Каждого КлючИЗначение Из ДополнительныеСвойства.ЗаданияДляОбновления Цикл - Команда = КлючИЗначение.Ключ; Задание = КлючИЗначение.Значение; + Изменения = Новый Структура; + Изменения.Вставить("Использование", Ложь); + Изменения.Вставить("Расписание", Неопределено); + Изменения.Вставить("Наименование", Лев(ПредставлениеЗадания(Команда), 120)); + Если ПубликацияВключена И Команда.РегламентноеЗаданиеРасписание.Количество() > 0 Тогда - Расписание = Команда.РегламентноеЗаданиеРасписание[0].Значение; - Использование = Команда.РегламентноеЗаданиеИспользование И РасписаниеЗадано(Расписание); - Иначе - Расписание = Неопределено; - Использование = Ложь; + Изменения.Расписание = Команда.РегламентноеЗаданиеРасписание[0].Значение; + Изменения.Использование = Команда.РегламентноеЗаданиеИспользование + И ДополнительныеОтчетыИОбработкиКлиентСервер.РасписаниеЗадано(Изменения.Расписание); КонецЕсли; - ПараметрыЗадания = Новый Массив; - ПараметрыЗадания.Добавить(Ссылка); - ПараметрыЗадания.Добавить(Команда.Идентификатор); + ПараметрыПроцедуры = Новый Массив; + ПараметрыПроцедуры.Добавить(Ссылка); + ПараметрыПроцедуры.Добавить(Команда.Идентификатор); - ДополнительныеОтчетыИОбработкиРегламентныеЗадания.УстановитьПараметрыЗадания( - Задание, - Использование, - Лев(ПредставлениеЗадания(Команда), 120), - ПараметрыЗадания, - Расписание); + Изменения.Вставить("Параметры", ПараметрыПроцедуры); + Если ТеснаяИнтеграцияСПодсистемойВМоделиСервиса Тогда + ИнтеграцияСТехнологиейСервиса.ПередОбновлениемЗадания(ЭтотОбъект, Команда, Задание, Изменения); + КонецЕсли; + Если Изменения <> Неопределено Тогда + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); + КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ПередУдалениемГлобальнойОбработки(Отказ) - - // Регламентные задание необходимо изменять в привилегированном режиме. + // Регламентные задания необходимо изменять в привилегированном режиме. УстановитьПривилегированныйРежим(Истина); + // Удаление всех заданий. Для Каждого Команда Из Команды Цикл - - Задание = ДополнительныеОтчетыИОбработкиРегламентныеЗадания.НайтиЗадание( - Команда.РегламентноеЗаданиеGUID); - - Если Задание <> Неопределено Тогда - ДополнительныеОтчетыИОбработкиРегламентныеЗадания.УдалитьЗадание(Задание); + Если ЗначениеЗаполнено(Команда.РегламентноеЗаданиеGUID) Тогда + РегламентныеЗаданияСервер.УдалитьЗадание(Команда.РегламентноеЗаданиеGUID); КонецЕсли; КонецЦикла; - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -356,12 +339,6 @@ + СокрЛП(Команда.Представление)); КонецФункции -Функция РасписаниеЗадано(Расписание) - - Возврат Строка(Расписание) <> Строка(Новый РасписаниеРегламентногоЗадания); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Назначаемые обработки diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form index 516b95526..83eedd920 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 12 @@ -39,6 +35,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -236,9 +236,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form index 168a3466a..8287217a5 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form @@ -86,6 +86,10 @@ КомпоновщикНастроекНастройкиОтбор 5 + + <key>ru</key> + <value>Компоновщик настроек настройки отбор</value> + true true @@ -239,9 +243,6 @@ true true true - None - None - None true All false diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl index 82c6d2e85..e2eac41cf 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -19,6 +20,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form index 39abe0ac3..55c10f6da 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form @@ -209,10 +209,6 @@ ru Фильтры - - ru - Фильтры - ФильтрыExtendedTooltip 34 @@ -244,10 +240,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 44 @@ -280,10 +272,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 38 @@ -303,6 +291,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -585,9 +577,6 @@ CommonPicture.КоллекцияЗаметки - None - None - None true 60 diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form index 0b8e3beaf..56065df65 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form @@ -16,10 +16,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 44 @@ -52,10 +48,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 42 @@ -75,6 +67,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -207,10 +203,6 @@ Left true - - BeforeAddRow - СписокПередНачаломДобавления - СписокSearchString 48 @@ -322,9 +314,6 @@ CommonPicture.КоллекцияЗаметки - None - None - None true 60 @@ -426,10 +415,6 @@ ru Фильтры - - ru - Фильтры - ФильтрыExtendedTooltip 38 diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl index 6b486b165..bfe8bac9d 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl +++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl @@ -48,17 +48,6 @@ #КонецОбласти -#Область ОбработчикиСобытийТаблицыСписок - -&НаКлиенте -Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) - Отказ = Истина; - ПараметрыФормы = Новый Структура("Предмет", Предмет); - ОткрытьФорму("Справочник.Заметки.ФормаОбъекта", ПараметрыФормы); -КонецПроцедуры - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции &НаСервере diff --git a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form index 8d6f6e5d4..c674dabc5 100644 --- a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form @@ -7,6 +7,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -118,10 +122,6 @@ ru Содержание - - ru - Содержание - 5 false @@ -499,9 +499,6 @@ CommonPicture.КоллекцияЗаметки - None - None - None true 60 diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form index 5ad43ed12..1ec3902a6 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form @@ -89,12 +89,8 @@ <key>ru</key> - <value>Группа предмет</value> + <value>Предмет</value> - - ru - Группа предмет - ГруппаПредметExtendedTooltip 109 @@ -119,10 +115,10 @@ true - + <key>ru</key> <value>Содержание заметки</value> - </toolTip> + СодержаниеЗаметкиExtendedTooltip 108 @@ -333,10 +329,6 @@ ru Параметры отображения - - ru - Параметры отображения - ПараметрыОтображенияExtendedTooltip 113 @@ -443,10 +435,6 @@ ru Информация об авторе - - ru - Информация об авторе - ИнформацияОбАвтореExtendedTooltip 117 @@ -517,10 +505,6 @@ ru Командная панель редактирования - - ru - Командная панель редактирования - КоманднаяПанельРедактированияExtendedTooltip 107 diff --git a/SSL/src/Catalogs/Заметки/ManagerModule.bsl b/SSL/src/Catalogs/Заметки/ManagerModule.bsl index 93707e88f..d097d8c2d 100644 --- a/SSL/src/Catalogs/Заметки/ManagerModule.bsl +++ b/SSL/src/Catalogs/Заметки/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -20,6 +21,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo index 7cf179756..5a8442195 100644 --- a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ Автор + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -153,6 +154,35 @@ Index Use + + ДатаЗаема + + ru + Дата заема + + + Date + + + + ru + ДЛФ=ДВ + + + ru + ДЛФ=ДВ + + + ru + Дата, когда файл был занят для редактирования + + false + + + + Use + Use + ДатаМодификацииУниверсальная @@ -222,6 +252,7 @@ Отредактировал + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -373,6 +404,7 @@ Редактирует + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -486,15 +518,35 @@ Use + + ХранитьВерсии + + ru + Хранить версии + + + Boolean + + + ru + Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия. + + false + + + + Use + Use + - ЭлектронныеПодписи + УдалитьЭлектронныеПодписи ru - электронные подписи + (не используется) электронные подписи ru @@ -699,10 +751,10 @@ - СертификатыШифрования + УдалитьСертификатыШифрования ru - Сертификаты шифрования + (не используется) Сертификаты шифрования ru diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form index 7aa319950..88e0c5d78 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form @@ -178,10 +178,6 @@ ru Основные команды - - ru - Основные команды - ОсновныеКомандыРасширеннаяПодсказка 48 @@ -206,10 +202,6 @@ ru Дополнительные команды - - ru - Дополнительные команды - ДополнительныеКомандыРасширеннаяПодсказка 29 @@ -259,10 +251,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 44 @@ -326,6 +314,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -617,9 +609,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl index 77bbd4a87..b12745f8b 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -17,6 +21,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form index e3eb9f74e..c6df57708 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form @@ -152,10 +152,6 @@ ru Основные команды - - ru - Основные команды - ОсновныеКомандыРасширеннаяПодсказка 45 @@ -180,10 +176,6 @@ ru Дополнительные команды - - ru - Дополнительные команды - ДополнительныеКомандыРасширеннаяПодсказка 28 @@ -296,6 +288,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -579,9 +575,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl index 77bbd4a87..b12745f8b 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -17,6 +21,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form index 7778e1a25..ac1db849f 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form @@ -204,10 +204,6 @@ ru Режим просмотра - - ru - Форма режим просмотра - ФормаРежимПросмотраРасширеннаяПодсказка 71 @@ -488,6 +484,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -727,9 +727,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form index bb3ae6b69..e34a1f4bb 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form @@ -145,10 +145,6 @@ ru Имя и синоним объекта метаданных - - ru - Имя и синоним объекта метаданных - ИмяИСинонимОбъектаМетаданныхExtendedTooltip 34 @@ -275,10 +271,6 @@ ru Полное имя и полный синоним объекта метаданных - - ru - Полное имя и полный синоним объекта метаданных - ПолноеИмяИПолныйСинонимОбъектаМетаданныхExtendedTooltip 37 @@ -796,7 +788,7 @@ - CommonCommand.ПрисоединенныеФайлыКОбъекту + 0 @@ -807,6 +799,10 @@ CommonCommand.ИсторияИзменений + + CommonCommand.ПрисоединенныеФайлы + + @@ -814,11 +810,11 @@ - CommonCommand.ЗаполнениеОбъекта + 0 - CommonCommand.ОтчетыОбъекта + 0 @@ -829,6 +825,18 @@ CommonCommand.СоздатьЗаметкуПоПредмету + + CommonCommand.ОтправитьПисьмо + + + + CommonCommand.ОтправитьSMS + + + + CommonCommand.Напомнить + + diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl index c92b1bfc8..33aa405b4 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl @@ -2,61 +2,9 @@ #Область ПрограммныйИнтерфейс -// Процедура обновляет данные справочника по метаданным конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - в этот параметр возвращается -// значение Истина, если производилась запись, иначе не изменяется. -// -// ЕстьУдаленные - Булево (возвращаемое значение) - в этот параметр возвращается -// значение Истина, если хотя бы один элемент справочника был помечен -// на удаление, иначе не изменяется. -// -// ТолькоПроверка - Булево - не производить никаких изменений, а лишь выполнить -// установку флажков ЕстьИзменения, ЕстьУдаленные. -// -Процедура ОбновитьДанныеСправочника(ЕстьИзменения = Ложь, ЕстьУдаленные = Ложь, ТолькоПроверка = Ложь) Экспорт - - ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка); - -КонецПроцедуры - -// Требуется, чтобы выгрузить все идентификаторы объектов метаданных конфигурации -// в подчиненные узлы РИБ, если ранее справочник не был включен в РИБ. -// Также может использоваться для ремонта данных справочника в РИБ-узлах. -// -Процедура ЗарегистрироватьПолноеИзменениеДляПодчиненныхУзловРИБ() Экспорт - - ПроверкаИспользования(); - - Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - МетаданныеСправочника = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных; - - УзлыРИБ = Новый Массив; - Для каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - Если ПланОбмена.РаспределеннаяИнформационнаяБаза - И ПланОбмена.Состав.Содержит(МетаданныеСправочника)Тогда - - ПланОбменаМенеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПланОбмена.ПолноеИмя()); - Выборка = ПланОбменаМенеджер.Выбрать(); - Пока Выборка.Следующий() Цикл - Если Выборка.Ссылка <> ПланОбменаМенеджер.ЭтотУзел() Тогда - УзлыРИБ.Добавить(Выборка.Ссылка); - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЦикла; - - Если УзлыРИБ.Количество() > 0 Тогда - ПланыОбмена.ЗарегистрироватьИзменения(УзлыРИБ, МетаданныеСправочника); - КонецЕсли; - -КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -70,11 +18,14 @@ КонецФункции -// Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. // -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. +// Возвращаемое значение: +// Массив(Строка) - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт @@ -85,6 +36,10 @@ КонецФункции +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -97,7 +52,7 @@ НСтр("ru = 'Справочник ""%1"" не используется.'"), НазваниеСправочника(ОбъектыРасширений)); КонецЕсли; - Если ОбъектыРасширений И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбъектыРасширений И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ВызватьИсключение ОписаниеОшибкиИдентификаторыОбъектовРасширенийНедоступныВНеразделенномРежиме(); КонецЕсли; @@ -124,37 +79,43 @@ // Возвращает Истина, если проверка, обновление и замена дублей завершена. // // Параметры: -// Сообщить - Булево - если передать Истина, тогда будет вызвано исключение -// по ошибке обращения к необновленным параметрам работы программы. +// Обновить - Булево - если передать Истина, тогда данные будут обновлены, +// если возможно. Если невозможно, тогда будет вызвано исключение. +// Если передать Ложь, тогда будет возвращено состояние данных. // -Функция ДанныеОбновлены(Сообщить = Ложь, ОбъектыРасширений = Ложь) Экспорт +Функция ДанныеОбновлены(Обновить = Ложь, ОбъектыРасширений = Ложь) Экспорт - Если Сообщить Тогда - Отказ = Неопределено; - Иначе - Отказ = Ложь; - КонецЕсли; - - СтандартныеПодсистемыСервер.ПроверитьОбновлениеПараметровРаботыПрограммы( - "ПараметрыБазовойФункциональности", "ИдентификаторыОбъектовМетаданных", Отказ); - - Если Отказ = Истина Тогда + Попытка + Обновлен = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.ИдентификаторыОбъектовМетаданных"); + Исключение + Если Обновить Тогда + ВызватьИсключение; + КонецЕсли; Возврат Ложь; + КонецПопытки; + + Если Обновлен = Неопределено Тогда + Если Обновить Тогда + ОбновитьДанныеСправочника(); + Иначе + Возврат Ложь; + КонецЕсли; КонецЕсли; Если ОбъектыРасширений И ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения) И Справочники.ВерсииРасширений.УстановленныеРасширенияДоступны() Тогда - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Если Сообщить Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Обновить Тогда ВызватьИсключение ОписаниеОшибкиИдентификаторыОбъектовРасширенийНедоступныВНеразделенномРежиме(); Иначе Возврат Ложь; КонецЕсли; КонецЕсли; - Если Не ИдентификаторыОбъектовТекущейВерсииРасширенийЗаполнены() Тогда + Если Не Справочники.ИдентификаторыОбъектовРасширений.ИдентификаторыОбъектовТекущейВерсииРасширенийЗаполнены() Тогда Справочники.ИдентификаторыОбъектовРасширений.ОбновитьДанныеСправочника(); КонецЕсли; КонецЕсли; @@ -163,23 +124,6 @@ КонецФункции -// Только для внутреннего использования. -Функция ИдентификаторыОбъектовТекущейВерсииРасширенийЗаполнены() Экспорт - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов - |ГДЕ - | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений"; - - Возврат Не Запрос.Выполнить().Пустой(); - -КонецФункции - // Только для внутреннего использования. // // Параметры: @@ -188,9 +132,7 @@ // Процедура ЗагрузитьДанныеВПодчиненныйУзел(Объекты) Экспорт - ПроверкаИспользования(); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда // В модели сервиса не поддерживается. Возврат; КонецЕсли; @@ -199,11 +141,12 @@ Возврат; КонецЕсли; + ПроверкаИспользования(); + СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ИдентификаторыОбъектовМетаданных"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - СнятьМонопольныйРежим = Ложь; НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); @@ -277,7 +220,7 @@ И Свойства.ИмяПредопределенныхДанных = Объект.ИмяПредопределенныхДанных И Свойства.ПометкаУдаления = Объект.ПометкаУдаления И КлючиОбъектовМетаданныхСовпадают(Свойства, Объект) Тогда - + СвойстваЗагружаемого.Совпадает = Истина; КонецЕсли; @@ -389,6 +332,185 @@ КонецПроцедуры +// Возвращает объект метаданных по переданному идентификатору. +// +// Параметры: +// Идентификатор - СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор +// объекта метаданных конфигурации или расширения конфигурации. +// +// КромеНесуществующихИНедоступных - Булево - если Истина тогда, когда объект метаданных +// не существует или не доступен, возвращает Null или Неопределено +// вместо вызова исключения. +// +// Возвращаемое значение: +// ОбъектМетаданных - объект метаданных, соответствующий идентификатору. +// +// Null - возвращается, когда КромеНесуществующихИНедоступных = Истина. Обозначает, что +// для указанного идентификатора объект метаданных не существует (идентификатор устарел). +// +// Неопределено - возвращается, когда КромеНесуществующихИНедоступных = Истина. Обозначает, +// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен. +// Для расширений конфигурации это значит, что расширение установлено, но не подключено, +// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка. +// Для конфигурации это значит , что в новом сеансе (новом динамическом поколении) объект +// метаданных имеется, а в текущем (старом) сеансе нет. +// +Функция ОбъектМетаданныхПоИдентификатору(Идентификатор, КромеНесуществующихИНедоступных = Ложь) Экспорт + + Идентификаторы = Новый Массив; + Идентификаторы.Добавить(Идентификатор); + + ОбъектыМетаданных = ОбъектыМетаданныхПоИдентификаторамСПопыткойПовтора(Идентификаторы, КромеНесуществующихИНедоступных); + + Возврат ОбъектыМетаданных.Получить(Идентификатор); + +КонецФункции + +// Возвращает объекты метаданных по переданным идентификаторам. +// +// Параметры: +// Идентификаторы - Массив - со значениями: +// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификаторы +// объектов метаданных конфигурации или расширений конфигурации. +// +// КромеНесуществующихИНедоступных - Булево - если Истина тогда, когда объект метаданных +// не существует или не доступен, возвращает Null или Неопределено +// вместо вызова исключения. +// +// Возвращаемое значение: +// Соответствие - со свойствами: +// * Ключ - переданный идентификатор, +// * Значение - ОбъектМетаданных - объект метаданных, соответствующий идентификатору. +// - Null - возвращается, когда КромеНесуществующихИНедоступных = Истина. Обозначает, что +// для указанного идентификатора объект метаданных не существует (идентификатор устарел). +// - Неопределено - возвращается, когда КромеНесуществующихИНедоступных = Истина. Обозначает, +// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен. +// Для расширений конфигурации это значит, что расширение установлено, но не подключено, +// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка. +// Для конфигурации это значит , что в новом сеансе (новом динамическом поколении) объект +// метаданных имеется, а в текущем (старом) сеансе нет. +// +Функция ОбъектыМетаданныхПоИдентификаторам(Идентификаторы, КромеНесуществующихИНедоступных = Ложь) Экспорт + + Возврат ОбъектыМетаданныхПоИдентификаторамСПопыткойПовтора(Идентификаторы, КромеНесуществующихИНедоступных); + +КонецФункции + +// Возвращает ссылки на объекты метаданных, найденный по полному имени удаленного объекта метаданных. +// Используется когда требуется сделать замену старой ссылки на новую или очистить ее. +// +// Параметры: +// ПолноеИмяУдаленного - Строка - например, "Роль.ЧтениеБазовойНСИ". +// +// Возвращаемое значение: +// Массив - со значениями: +// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ИдентификаторыОбъектовРасширений - найденная ссылка. +// +Функция ИдентификаторУдаленногоОбъектаМетаданных(ПолноеИмяУдаленного) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ИдентификаторыОбъектовМетаданных.Ссылка КАК Ссылка, + | ИдентификаторыОбъектовМетаданных.ПолноеИмя КАК ПолноеИмя + |ИЗ + | Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных + |ГДЕ + | ИдентификаторыОбъектовМетаданных.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ИдентификаторыОбъектовРасширений.Ссылка, + | ИдентификаторыОбъектовРасширений.ПолноеИмя + |ИЗ + | Справочник.ИдентификаторыОбъектовРасширений КАК ИдентификаторыОбъектовРасширений + |ГДЕ + | ИдентификаторыОбъектовРасширений.ПометкаУдаления"; + + Выборка = Запрос.Выполнить().Выбрать(); + + НайденныеСсылки = Новый Массив; + Пока Выборка.Следующий() Цикл + Если Не СтрНачинаетсяС(Выборка.ПолноеИмя, "? ") Тогда + Продолжить; + КонецЕсли; + ТекущееПолноеИмяУдаленного = Сред(Выборка.ПолноеИмя, 3); + ПозицияСкобки = СтрНайти(ТекущееПолноеИмяУдаленного, "("); + Если ПозицияСкобки > 0 Тогда + ТекущееПолноеИмяУдаленного = Сред(ТекущееПолноеИмяУдаленного, 1, ПозицияСкобки - 1); + КонецЕсли; + Если ВРег(СокрЛП(ТекущееПолноеИмяУдаленного)) = ВРег(СокрЛП(ПолноеИмяУдаленного)) Тогда + НайденныеСсылки.Добавить(Выборка.Ссылка); + КонецЕсли; + КонецЦикла; + + Возврат НайденныеСсылки; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Процедура обновляет данные справочника по метаданным конфигурации. +// +// Параметры: +// ЕстьИзменения - Булево - (возвращаемое значение) в этот параметр возвращается +// значение Истина, если производилась запись, иначе не изменяется. +// +// ЕстьУдаленные - Булево - (возвращаемое значение) в этот параметр возвращается +// значение Истина, если хотя бы один элемент справочника был помечен +// на удаление, иначе не изменяется. +// +// ТолькоПроверка - Булево - не производить никаких изменений, а лишь выполнить +// установку флажков ЕстьИзменения, ЕстьУдаленные. +// +Процедура ОбновитьДанныеСправочника(ЕстьИзменения = Ложь, ЕстьУдаленные = Ложь, ТолькоПроверка = Ложь) Экспорт + + ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка); + +КонецПроцедуры + +// Требуется, чтобы выгрузить все идентификаторы объектов метаданных конфигурации +// в подчиненные узлы РИБ, если ранее справочник не был включен в РИБ. +// Также может использоваться для ремонта данных справочника в РИБ-узлах. +// +Процедура ЗарегистрироватьПолноеИзменениеДляПодчиненныхУзловРИБ() Экспорт + + ПроверкаИспользования(); + + Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + МетаданныеСправочника = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных; + + УзлыРИБ = Новый Массив; + Для каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл + Если ПланОбмена.РаспределеннаяИнформационнаяБаза + И ПланОбмена.Состав.Содержит(МетаданныеСправочника)Тогда + + ПланОбменаМенеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПланОбмена.ПолноеИмя()); + Выборка = ПланОбменаМенеджер.Выбрать(); + Пока Выборка.Следующий() Цикл + Если Выборка.Ссылка <> ПланОбменаМенеджер.ЭтотУзел() Тогда + УзлыРИБ.Добавить(Выборка.Ссылка); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Если УзлыРИБ.Количество() > 0 Тогда + ПланыОбмена.ЗарегистрироватьИзменения(УзлыРИБ, МетаданныеСправочника); + КонецЕсли; + +КонецПроцедуры + // Процедура обновляет данные справочника по метаданным конфигурации. // // Параметры: @@ -399,14 +521,8 @@ // значение Истина, если хотя бы один элемент справочника был помечен // на удаление, иначе не изменяется. // -// РежимОбновления - Строка - возможные значения: -// "Полный" - выполнить обновление, -// "Частичный" - выполнить обновление (когда ОбъектыРасширений = Ложь, -// тогда выполнить обновление, если нет критичных изменений), -// "ТолькоПроверка" - не производить никаких изменений, а лишь выполнить -// установку флажков ЕстьИзменения, ЕстьУдаленные, ЕстьКритичныеИзменения. -// - Булево - если Истина, то режим обновления "ТолькоПроверка", -// если Ложь, то режим обновления "Полный". +// ТолькоПроверка - Булево - не производить никаких изменений, а выполнить только установку +// параметров ЕстьИзменения, ЕстьУдаленные, ЕстьКритичныеИзменения, СписокКритичныхИзменений. // // ЕстьКритичныеИзменения - (возвращаемое значение) - в этот параметр возвращается // значение Истина, если найдены критичные изменения, иначе не изменяется. @@ -419,7 +535,7 @@ // объектов метаданных, которые добавлены или требуется добавить, // а также объектов метаданных, полные имена которых изменены или требуется изменить. // -Процедура ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, РежимОбновления, +Процедура ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка, ЕстьКритичныеИзменения = Ложь, СписокКритичныхИзменений = "", ОбъектыРасширений = Ложь) Экспорт Если ОбъектыРасширений @@ -439,174 +555,33 @@ УстановитьПривилегированныйРежим(Истина); - Если ТипЗнч(РежимОбновления) = Тип("Булево") Тогда - РежимОбновления = ?(РежимОбновления, "ТолькоПроверка", "Полный"); - КонецЕсли; - ТолькоПроверка = (РежимОбновления = "ТолькоПроверка"); - ЕстьТекущиеИзменения = Ложь; Если Не ОбъектыРасширений Тогда ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьТекущиеИзменения); КонецЕсли; - ОбновитьДанные(ЕстьТекущиеИзменения, ЕстьУдаленные, РежимОбновления, - ЕстьКритичныеИзменения, СписокКритичныхИзменений, ОбъектыРасширений); + Если Не ОбъектыРасширений + Или Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - Если ЕстьТекущиеИзменения Тогда - ЕстьИзменения = Истина; + ОбновитьДанные(ЕстьТекущиеИзменения, ЕстьУдаленные, ТолькоПроверка, + ЕстьКритичныеИзменения, СписокКритичныхИзменений, ОбъектыРасширений); + + Если ЕстьТекущиеИзменения Тогда + ЕстьИзменения = Истина; + КонецЕсли; КонецЕсли; - Если Не ТолькоПроверка - И Не (РежимОбновления <> "Полный" И ЕстьКритичныеИзменения) Тогда - - Если Не ОбъектыРасширений Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыБазовойФункциональности", "ИдентификаторыОбъектовМетаданных"); - КонецЕсли; + Если Не ОбъектыРасширений Тогда + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.ИдентификаторыОбъектовМетаданных", Истина); КонецЕсли; КонецПроцедуры -// Возвращает объекты метаданных по переданным идентификаторам. -// -// Параметры: -// Идентификаторы - Массив - значения либо типа СправочникСсылка.ИдентификаторыОбъектовМетаданных, -// либо типа СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификаторы -// объектов метаданных конфигурации или расширения. -// -// Возвращаемое значение: -// Соответствие - со свойствами: -// * Ключ - переданный идентификатор, -// * Значение - ОбъектМетаданных - для типа СправочникСсылка.ИдентификаторыОбъектовМетаданных. -// - ОбъектМетаданных, Неопределено - для типа СправочникСсылка.ИдентификаторыОбъектовРасширений. -// Если расширение не подключено, тогда объект метаданных невозможно вернуть и возвращается Неопределено. -// Неопределено означает, что в справочнике ИдентификаторыОбъектовРасширений найден действующий -// идентификатор, но объекта метаданных, который ему соответствует, найти не удалось. -// -Функция ОбъектыМетаданныхПоИдентификаторам(Идентификаторы) Экспорт - - ОбъектыРасширений = ЭтоОбъектРасширений(Идентификаторы[0]); - НазваниеСправочника = НазваниеСправочника(ОбъектыРасширений); - - СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, ОбъектыРасширений); - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылки", Идентификаторы); - Если ОбъектыРасширений Тогда - Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); - Запрос.Текст = - "ВЫБРАТЬ - | Идентификаторы.Ссылка КАК Ссылка, - | Идентификаторы.КлючОбъектаМетаданных, - | ЕСТЬNULL(ВерсииИдентификаторов.ПолноеИмяОбъекта, """") КАК ПолноеИмя, - | Идентификаторы.ПометкаУдаления - |ИЗ - | Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов - | ПО (ВерсииИдентификаторов.Идентификатор = Идентификаторы.Ссылка) - |ГДЕ - | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений - | И Идентификаторы.Ссылка В(&Ссылки)"; - Иначе - Запрос.Текст = - "ВЫБРАТЬ - | Идентификаторы.Ссылка КАК Ссылка, - | Идентификаторы.КлючОбъектаМетаданных, - | Идентификаторы.ПолноеИмя, - | Идентификаторы.ПометкаУдаления - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - |ГДЕ - | Идентификаторы.Ссылка В(&Ссылки)"; - КонецЕсли; - - Выгрузка = Запрос.Выполнить().Выгрузить(); - ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору().'"); - - Если Выгрузка.Количество() < Идентификаторы.Количество() Тогда - Для Каждого Идентификатор Из Идентификаторы Цикл - Если Выгрузка.Найти(Идентификатор, "Ссылка") = Неопределено Тогда - Прервать; - КонецЕсли; - КонецЦикла; - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идентификатор ""%1"" - |не найден в справочнике ""%2"".'"), - Строка(Идентификатор), НазваниеСправочника); - - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; - - ОбъектыМетаданныхИдентификаторов = Новый Соответствие; - - // Проверка соответствия ключа объекта метаданных полному имени объекта метаданных. - Для Каждого Свойства Из Выгрузка Цикл - РезультатПроверки = КлючОбъектаМетаданныхСоответствуетПолномуИмени(Свойства); - Если РезультатПроверки.НеСоответствует Тогда - - Если РезультатПроверки.ОбъектМетаданных = Неопределено Тогда - Если ОбъектыРасширений И Не Свойства.ПометкаУдаления Тогда - - // Возможно расширение не удалось подключить. - ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, Неопределено); - - ИначеЕсли РезультатПроверки.КлючОбъектаМетаданных = Неопределено Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идентификатору ""%1"" - |найденному в справочнике ""%2"", - |соответствует несуществующий объект метаданных - |""%3"".'"), - Строка(Свойства.Ссылка), НазваниеСправочника, Свойства.ПолноеИмя); - Иначе - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идентификатору ""%1"" - |найденному в справочнике ""%2"", - |соответствует удаленный объект метаданных.'"), - Строка(Свойства.Ссылка), НазваниеСправочника); - КонецЕсли; - Иначе - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идентификатору ""%1"" - |найденному в справочнике ""%2"", - |соответствует объект метаданных ""%3"", - |полное имя которого отличается от заданного в идентификаторе.'"), - Строка(Свойства.Ссылка), НазваниеСправочника, РезультатПроверки.ОбъектМетаданных.ПолноеИмя()); - КонецЕсли; - - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; - - Если Не ОбъектыРасширений И Свойства.ПометкаУдаления Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идентификатор ""%1"" - |найден в справочнике ""%2"", - |но значение реквизита ""Пометка удаления"" установлено Истина.'"), - Строка(Свойства.Ссылка), НазваниеСправочника); - - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; - - ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, РезультатПроверки.ОбъектМетаданных); - - КонецЦикла; - - Возврат ОбъектыМетаданныхИдентификаторов; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - //////////////////////////////////////////////////////////////////////////////// // Реализация процедур, объявленных в других модулях. -// См. описание одноименной процедуры в общем модуле ОбщегоНазначения. +// См. ОбщегоНазначения.ИдентификаторОбъектаМетаданных. Функция ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных) Экспорт ТипОписанияОбъектаМетаданных = ТипЗнч(ОписаниеОбъектаМетаданных); @@ -626,8 +601,16 @@ ИначеЕсли ТипОписанияОбъектаМетаданных = Тип("Строка") Тогда ПолноеИмяОбъектаМетаданных = ОписаниеОбъектаМетаданных; - Иначе + + ИначеЕсли ТипОписанияОбъектаМетаданных = Тип("ОбъектМетаданных") Тогда ПолноеИмяОбъектаМетаданных = ОписаниеОбъектаМетаданных.ПолноеИмя(); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных(). + | + |Указан недопустимый тип параметра ОписаниеОбъектаМетаданных: + |""%1"".'"), + ТипОписанияОбъектаМетаданных); КонецЕсли; Возврат СтандартныеПодсистемыПовтИсп.ИдентификаторОбъектаМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); @@ -637,152 +620,23 @@ // Продолжение процедуры ИдентификаторОбъектаМетаданных. Функция ИдентификаторОбъектаМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных) Экспорт - СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, - ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()); + Массив = Новый Массив; + Массив.Добавить(ПолноеИмяОбъектаМетаданных); - УстановитьПривилегированныйРежим(Истина); + Идентификаторы = ИдентификаторыОбъектовМетаданныхСПопыткойПовтора(Массив, Истина); - ДоступныИдентификаторыОбъектовРасширений = - ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения) - И Справочники.ВерсииРасширений.УстановленныеРасширенияДоступны(); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ПолноеИмя", ПолноеИмяОбъектаМетаданных); - Запрос.Текст = - "ВЫБРАТЬ - | Идентификаторы.Ссылка КАК Ссылка, - | Идентификаторы.КлючОбъектаМетаданных, - | Идентификаторы.ПолноеИмя - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - |ГДЕ - | Идентификаторы.ПолноеИмя = &ПолноеИмя - | И НЕ Идентификаторы.ПометкаУдаления"; - - Если ДоступныИдентификаторыОбъектовРасширений Тогда - Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); - ТекстЗапроса = - "ВЫБРАТЬ - | ВерсииИдентификаторов.Идентификатор КАК Ссылка, - | Идентификаторы.КлючОбъектаМетаданных, - | ВерсииИдентификаторов.ПолноеИмяОбъекта КАК ПолноеИмя - |ИЗ - | РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы - | ПО (Идентификаторы.Ссылка = ВерсииИдентификаторов.Идентификатор) - |ГДЕ - | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений - | И ВерсииИдентификаторов.ПолноеИмяОбъекта = &ПолноеИмя"; - - Запрос.Текст = Запрос.Текст + " - | - |ОБЪЕДИНИТЬ ВСЕ - | - |" + ТекстЗапроса; - КонецЕсли; - - Выгрузка = Запрос.Выполнить().Выгрузить(); - ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных().'"); - - Если Выгрузка.Количество() = 0 Тогда - // Если идентификатор не найден по полному имени, возможно что полное имя задано с ошибкой. - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); - Если ОбъектМетаданных = Неопределено Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Объект метаданных не найден по полному имени: - |""%1"".'"), - ПолноеИмяОбъектаМетаданных); - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; - КонецЕсли; - - Если Не Метаданные.Роли.Содержит(ОбъектМетаданных) - И Не Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) - И Не Метаданные.Константы.Содержит(ОбъектМетаданных) - И Не Метаданные.Справочники.Содержит(ОбъектМетаданных) - И Не Метаданные.Документы.Содержит(ОбъектМетаданных) - И Не Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) - И Не Метаданные.Отчеты.Содержит(ОбъектМетаданных) - И Не Метаданные.Обработки.Содержит(ОбъектМетаданных) - И Не Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) - И Не Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) - И Не Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) - И Не Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) - И Не Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) - И Не Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) - И Не Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) - И Не Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) - И Не Метаданные.Задачи.Содержит(ОбъектМетаданных) - И Не ЭтоПодсистема(ОбъектМетаданных) Тогда - - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Объект метаданных не поддерживается: - |""%1"". - | - |Допустимы только типы объектов метаданных перечисленные в комментарии к функции.'"), - ПолноеИмяОбъектаМетаданных); - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; - КонецЕсли; - - ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений, - НСтр("ru = 'Для объекта метаданных ""%1"" - |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"" и - |регистре сведений ""Идентификаторы объектов версий расширений"".'"), - НСтр("ru = 'Для объекта метаданных ""%1"" - |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"".'")); - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных) - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - - ИначеЕсли Выгрузка.Количество() > 1 Тогда - ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений, - НСтр("ru = 'Для объекта метаданных ""%1"" - |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"" и - |регистре сведений ""Идентификаторы объектов версий расширений"".'"), - НСтр("ru = 'Для объекта метаданных ""%1"" - |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"".'")); - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных) - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; - - // Проверка соответствия ключа объекта метаданных полному имени объекта метаданных. - РезультатПроверки = КлючОбъектаМетаданныхСоответствуетПолномуИмени(Выгрузка[0]); - Если РезультатПроверки.НеСоответствует Тогда - НазваниеСправочника = НазваниеСправочника(ЭтоОбъектРасширений(Выгрузка[0].Ссылка)); - - Если РезультатПроверки.ОбъектМетаданных = Неопределено Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для объекта метаданных ""%1"" - |найден идентификатор в справочнике ""%2"", - |которому соответствует удаленный объект метаданных.'"), - ПолноеИмяОбъектаМетаданных, НазваниеСправочника); - Иначе - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для объекта метаданных ""%1"" - |найден идентификатор в справочнике ""%2"", - |который соответствует другому объекту метаданных ""%3"".'"), - ПолноеИмяОбъектаМетаданных, НазваниеСправочника, РезультатПроверки.ОбъектМетаданных); - КонецЕсли; - - ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ТекстОшибки - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; - - Возврат Выгрузка[0].Ссылка; + Возврат Идентификаторы.Получить(ПолноеИмяОбъектаМетаданных); КонецФункции -// См. описание одноименной процедуры в общем модуле ОбщегоНазначения. -Функция ОбъектМетаданныхПоИдентификатору(Идентификатор) Экспорт +// См. ОбщегоНазначения.ИдентификаторыОбъектовМетаданных. +Функция ИдентификаторыОбъектовМетаданных(ПолныеИменаОбъектовМетаданных) Экспорт - Идентификаторы = Новый Массив; - Идентификаторы.Добавить(Идентификатор); - - Возврат ОбъектыМетаданныхПоИдентификаторам(Идентификаторы).Получить(Идентификатор); + Возврат ИдентификаторыОбъектовМетаданныхСПопыткойПовтора(ПолныеИменаОбъектовМетаданных); КонецФункции -// См. описание одноименной процедуры в общем модуле ОбщегоНазначения. +// См. ОбщегоНазначения.ДобавитьПереименование. Процедура ДобавитьПереименование(Итог, ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки = "") Экспорт СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(); @@ -978,13 +832,7 @@ Итог.Вставить("ПорядокБиблиотек", Новый Соответствие); ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных(Итог); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДобавленииПереименованийОбъектовМетаданных(Итог); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриДобавленииПереименованийОбъектовМетаданных(Итог); ТаблицаПереименования.Сортировать( "ПорядокБиблиотеки ВОЗР, @@ -1040,6 +888,7 @@ Строка.СинонимВЕдЧисле = НСтр("ru = 'Роль'"); Строка.БезДанных = Истина; Строка.БезКлючаОбъектаМетаданных = Истина; + Строка.ОбъектыРасширений = Истина; // ПланыОбмена Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить(); @@ -1194,7 +1043,7 @@ // Регистрация объекта на всех узлах РИБ. Для Каждого ПланОбмена Из СтандартныеПодсистемыПовтИсп.ПланыОбменаРИБ() Цикл - СтандартныеПодсистемыСервер.ЗарегистрироватьОбъектНаВсехУзлах(Объект, ПланОбмена); + СтандартныеПодсистемыСервер.ЗарегистрироватьОбъектНаВсехУзлах(Объект, ПланОбмена, Ложь); КонецЦикла; Если Объект.ОбменДанными.Загрузка Тогда @@ -1289,14 +1138,14 @@ Если Строка.Ссылка <> СсылкаЗагружаемого И ТаблицаЗагружаемых.Найти(Строка.Ссылка, "Ссылка") = Неопределено Тогда - ОбновитьСвойстваПомеченногоНаУдаление(Строка); + ОбновитьСвойстваПомеченногоНаУдаление(Строка,,, Истина); Строка.НоваяСсылка = СсылкаЗагружаемого; Строка.ДубльОбновлен = Истина; ЗагружаемыйОбъект.ДополнительныеСвойства.Вставить("ЭтоЗаменаДубля"); // Замена новых ссылок на дубль на новую ссылку заданную для дубля (если есть). СтарыеДубли = Выгрузка.НайтиСтроки(Новый Структура("НоваяСсылка", Строка.Ссылка)); Для Каждого СтарыйДубль Из СтарыеДубли Цикл - ОбновитьСвойстваПомеченногоНаУдаление(СтарыйДубль); + ОбновитьСвойстваПомеченногоНаУдаление(СтарыйДубль,,, Истина); СтарыйДубль.НоваяСсылка = СсылкаЗагружаемого; СтарыйДубль.ДубльОбновлен = Истина; КонецЦикла; @@ -1305,7 +1154,7 @@ КонецПроцедуры -Процедура ОбновитьДанные(ЕстьИзменения, ЕстьУдаленные, РежимОбновления, +Процедура ОбновитьДанные(ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка, ЕстьКритичныеИзменения, СписокКритичныхИзменений, ОбъектыРасширений) СвойстваРасширений = Новый Структура; @@ -1333,20 +1182,11 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(ИмяСправочника(ОбъектыРасширений)); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Если ОбъектыРасширений Тогда ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ИдентификаторыОбъектовВерсийРасширений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", ВерсияРасширений); КонецЕсли; - Если ОбъектыРасширений Или РежимОбновления <> "Полный" Или МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); @@ -1382,8 +1222,21 @@ + Символы.ПС + СписокНовыхОбъектовМетаданных + Символы.ПС; КонецЕсли; - ТолькоПроверка = (РежимОбновления = "ТолькоПроверка") - Или Не ОбъектыРасширений И РежимОбновления <> "Полный" И ЕстьКритичныеИзменения; + Если Не ТолькоПроверка + И Не ОбъектыРасширений + И ЗначениеЗаполнено(СписокКритичныхИзменений) + И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда + + ИмяСобытия = НСтр("ru = 'Идентификаторы объектов метаданных.Требуется загрузить критичные изменения'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , СписокКритичныхИзменений); + + ВызватьИсключениеПоОшибке(ОбъектыРасширений, + НСтр("ru = 'Критичные изменения могут быть выполнены только + |в главном узле распределенной информационной базы. + |Состав требуемых изменений см. в журнале регистрации.'")); + КонецЕсли; ОбновитьИдентификаторыОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений, СвойстваРасширений, ВерсияРасширений, ЕстьИзменения, ТолькоПроверка); @@ -1410,16 +1263,9 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; ВызватьИсключение; КонецПопытки; - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - КонецПроцедуры Функция ВыгрузкаВсехИдентификаторов(ОбъектыРасширений = Ложь) @@ -1621,8 +1467,9 @@ Если ОбъектМетаданных = Неопределено ИЛИ СвойстваОбъекта.Найден Тогда // Если объект метаданных не найден или найден повторно // тогда идентификатор требуется пометить на удаление. + ЭтоДубль = ОбъектМетаданных <> Неопределено И СвойстваОбъекта.Найден; СвойстваОбновлены = Ложь; - ОбновитьСвойстваПомеченногоНаУдаление(Свойства, СвойстваОбновлены, ЕстьУдаленные); + ОбновитьСвойстваПомеченногоНаУдаление(Свойства, СвойстваОбновлены, ЕстьУдаленные, ЭтоДубль); Если СвойстваОбновлены Тогда Свойства.Обновлен = Истина; КонецЕсли; @@ -1831,7 +1678,7 @@ КонецПроцедуры -Процедура ОбновитьСвойстваПомеченногоНаУдаление(Свойства, СвойстваОбновлены = Ложь, ЕстьУдаленные = Ложь) +Процедура ОбновитьСвойстваПомеченногоНаУдаление(Свойства, СвойстваОбновлены = Ложь, ЕстьУдаленные = Ложь, ЭтоДубль = Ложь) ОбъектыРасширений = ЭтоОбъектРасширений(Свойства.Ссылка); @@ -1852,7 +1699,7 @@ ИЛИ ОбъектыРасширений И Лев(Свойства.ХешСуммаРасширения, 1) <> "?" ИЛИ СтрНайти(Свойства.ПолноеИмя, "(") = 0 ИЛИ Свойства.ЗначениеПустойСсылки <> Неопределено - ИЛИ КлючОбъектаМетаданных <> Неопределено Тогда + ИЛИ ЭтоДубль Тогда Если НЕ Свойства.ПометкаУдаления Или Лев(Свойства.ПолноеИмя, 1) <> "?" Тогда ЕстьУдаленные = Истина; @@ -1873,10 +1720,12 @@ Свойства.ХешСуммаРасширения = ВставитьЗнакВопроса(Свойства.ХешСуммаРасширения); КонецЕсли; - Если ТипЗнч(Свойства.КлючОбъектаМетаданных) = Тип("ХранилищеЗначения") Тогда - Свойства.КлючОбъектаМетаданных = Новый ХранилищеЗначения(Неопределено); - Иначе - Свойства.КлючОбъектаМетаданных = Неопределено; + Если ЭтоДубль Тогда + Если ТипЗнч(Свойства.КлючОбъектаМетаданных) = Тип("ХранилищеЗначения") Тогда + Свойства.КлючОбъектаМетаданных = Новый ХранилищеЗначения(Неопределено); + Иначе + Свойства.КлючОбъектаМетаданных = Неопределено; + КонецЕсли; КонецЕсли; СвойстваОбновлены = Истина; КонецЕсли; @@ -2638,12 +2487,532 @@ КонецФункции +// Для функций ИдентификаторОбъектаМетаданныхПоПолномуИмени, ИдентификаторыОбъектовМетаданных. +Функция ИдентификаторыОбъектовМетаданныхСПопыткойПовтора(ПолныеИменаОбъектовМетаданных, ОдинЭлемент = Ложь) + + СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, + ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); + + Попытка + Идентификаторы = ИдентификаторыОбъектовМетаданныхБезПопыткиПовтора( + ПолныеИменаОбъектовМетаданных, ОдинЭлемент); + Исключение + Если Не ОбщегоНазначения.РазделениеВключено() + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // В случае ошибки, если есть возможность обновления справочника, + // нужно выполнить обновление, а после этого повторить получение идентификатора. + Идентификаторы = Неопределено; + Иначе + ВызватьИсключение; + КонецЕсли; + КонецПопытки; + + Если Идентификаторы = Неопределено Тогда + ОбновитьДанныеСправочника(); + Идентификаторы = ИдентификаторыОбъектовМетаданныхБезПопыткиПовтора( + ПолныеИменаОбъектовМетаданных, ОдинЭлемент); + КонецЕсли; + + Возврат Идентификаторы; + +КонецФункции + +// Для функций ИдентификаторыОбъектовМетаданных. +Функция ИдентификаторыОбъектовМетаданныхБезПопыткиПовтора(ПолныеИменаОбъектовМетаданных, ОдинЭлемент) + + УстановитьПривилегированныйРежим(Истина); + + ДоступныИдентификаторыОбъектовРасширений = + ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения) + И Справочники.ВерсииРасширений.УстановленныеРасширенияДоступны(); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПолныеИмена", ПолныеИменаОбъектовМетаданных); + Запрос.Текст = + "ВЫБРАТЬ + | Идентификаторы.Ссылка КАК Ссылка, + | Идентификаторы.КлючОбъектаМетаданных, + | Идентификаторы.ПолноеИмя + |ИЗ + | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы + |ГДЕ + | Идентификаторы.ПолноеИмя В (&ПолныеИмена) + | И НЕ Идентификаторы.ПометкаУдаления"; + + Если ДоступныИдентификаторыОбъектовРасширений Тогда + Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); + ТекстЗапроса = + "ВЫБРАТЬ + | ВерсииИдентификаторов.Идентификатор КАК Ссылка, + | Идентификаторы.КлючОбъектаМетаданных, + | ВерсииИдентификаторов.ПолноеИмяОбъекта КАК ПолноеИмя + |ИЗ + | РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы + | ПО (Идентификаторы.Ссылка = ВерсииИдентификаторов.Идентификатор) + |ГДЕ + | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений + | И ВерсииИдентификаторов.ПолноеИмяОбъекта В (&ПолныеИмена)"; + + Запрос.Текст = Запрос.Текст + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |" + ТекстЗапроса; + КонецЕсли; + + Выгрузка = Запрос.Выполнить().Выгрузить(); + Выгрузка.Индексы.Добавить("ПолноеИмя"); + + Ошибки = Новый Массив; + + ИдентификаторыИзКлючей = Неопределено; + + Результат = Новый Соответствие; + Для Каждого ПолноеИмяОбъектаМетаданных Из ПолныеИменаОбъектовМетаданных Цикл + + Отбор = Новый Структура("ПолноеИмя", ПолноеИмяОбъектаМетаданных); + НайденныеСтроки = Выгрузка.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() = 0 Тогда + // Если идентификатор не найден по полному имени, возможно что полное имя задано с ошибкой. + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + Если ОбъектМетаданных = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект метаданных не найден по полному имени: + |""%1"".'"), + ПолноеИмяОбъектаМетаданных); + Ошибки.Добавить(ОписаниеОшибки); + Продолжить; + КонецЕсли; + + Если Не Метаданные.Роли.Содержит(ОбъектМетаданных) + И Не Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) + И Не Метаданные.Константы.Содержит(ОбъектМетаданных) + И Не Метаданные.Справочники.Содержит(ОбъектМетаданных) + И Не Метаданные.Документы.Содержит(ОбъектМетаданных) + И Не Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) + И Не Метаданные.Отчеты.Содержит(ОбъектМетаданных) + И Не Метаданные.Обработки.Содержит(ОбъектМетаданных) + И Не Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) + И Не Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) + И Не Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) + И Не Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) + И Не Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) + И Не Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) + И Не Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) + И Не Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) + И Не Метаданные.Задачи.Содержит(ОбъектМетаданных) + И Не ЭтоПодсистема(ОбъектМетаданных) Тогда + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект метаданных не поддерживается: + |""%1"". + | + |Допустимы только типы объектов метаданных перечисленные в комментарии к функции.'"), + ПолноеИмяОбъектаМетаданных); + Ошибки.Добавить(ОписаниеОшибки); + Продолжить; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ВерсияПрограммыОбновленаДинамически() Тогда + Если ИдентификаторыИзКлючей = Неопределено Тогда + ИдентификаторыИзКлючей = ИдентификаторыИзКлючей(); + КонецЕсли; + Идентификатор = ИдентификаторыИзКлючей.Получить(ПолноеИмяОбъектаМетаданных); + Если Идентификатор = Неопределено Тогда + СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); + КонецЕсли; + Результат.Вставить(ПолноеИмяОбъектаМетаданных, Идентификатор); + Продолжить; + КонецЕсли; + + ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений, + НСтр("ru = 'Для объекта метаданных ""%1"" + |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"" и + |регистре сведений ""Идентификаторы объектов версий расширений"".'"), + НСтр("ru = 'Для объекта метаданных ""%1"" + |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"".'")); + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных) + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + Ошибки.Добавить(ОписаниеОшибки); + Продолжить; + + ИначеЕсли НайденныеСтроки.Количество() > 1 Тогда + + ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений, + НСтр("ru = 'Для объекта метаданных ""%1"" + |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"" и + |регистре сведений ""Идентификаторы объектов версий расширений"".'"), + НСтр("ru = 'Для объекта метаданных ""%1"" + |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"".'")); + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных) + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + Ошибки.Добавить(ОписаниеОшибки); + Продолжить; + + КонецЕсли; + + // Проверка соответствия ключа объекта метаданных полному имени объекта метаданных. + СтрокаТаблицы = НайденныеСтроки[0]; + РезультатПроверки = КлючОбъектаМетаданныхСоответствуетПолномуИмени(СтрокаТаблицы); + Если РезультатПроверки.НеСоответствует Тогда + НазваниеСправочника = НазваниеСправочника(ЭтоОбъектРасширений(СтрокаТаблицы.Ссылка)); + + Если РезультатПроверки.ОбъектМетаданных = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для объекта метаданных ""%1"" + |найден идентификатор в справочнике ""%2"", + |которому соответствует удаленный объект метаданных.'"), + ПолноеИмяОбъектаМетаданных, НазваниеСправочника); + Иначе + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для объекта метаданных ""%1"" + |найден идентификатор в справочнике ""%2"", + |который соответствует другому объекту метаданных ""%3"".'"), + ПолноеИмяОбъектаМетаданных, НазваниеСправочника, РезультатПроверки.ОбъектМетаданных); + КонецЕсли; + + Ошибки.Добавить(ОписаниеОшибки); + Продолжить; + КонецЕсли; + + Результат.Вставить(ПолноеИмяОбъектаМетаданных, СтрокаТаблицы.Ссылка); + КонецЦикла; + + КоличествоОшибок = Ошибки.Количество(); + Если КоличествоОшибок > 0 Тогда + + Если ОдинЭлемент Тогда + ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных().'"); + + ИначеЕсли КоличествоОшибок = 1 Тогда + ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторыОбъектаМетаданных().'"); + Иначе + ЗаголовокОшибки = НСтр("ru = 'Ошибки при выполнении функции ОбщегоНазначения.ИдентификаторыОбъектаМетаданных().'"); + КонецЕсли; + + Разделитель = Символы.ПС + Символы.ПС; + ТекстВсехОшибок = ""; + НомерОшибки = 0; + Для Каждого ОписаниеОшибки Из Ошибки Цикл + НомерОшибки = НомерОшибки + 1; + ТекстВсехОшибок = ТекстВсехОшибок + ?(НомерОшибки = 1, "", Разделитель) + ОписаниеОшибки; + Если НомерОшибки = 3 И КоличествоОшибок > 5 Тогда + ПредставлениеКоличества = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью( + КоличествоОшибок - НомерОшибки, + НСтр("ru = 'ошибка,ошибки,ошибок'")); + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '... И еще %1'"), + ПредставлениеКоличества); + ТекстВсехОшибок = ТекстВсехОшибок + Разделитель + ОписаниеОшибки; + Прервать; + КонецЕсли; + КонецЦикла; + + ТекстВсехОшибок = ТекстВсехОшибок + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + + ВызватьИсключение ЗаголовокОшибки + Разделитель + ТекстВсехОшибок; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Для функции ИдентификаторыОбъектовМетаданныхБезПопыткиПовтора. +Функция ИдентификаторыИзКлючей() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Идентификаторы.Ссылка КАК Ссылка, + | Идентификаторы.КлючОбъектаМетаданных + |ИЗ + | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы"; + + Выборка = Запрос.Выполнить().Выбрать(); + + ИдентификаторыИзКлючей = Новый Соответствие; + + Пока Выборка.Следующий() Цикл + КлючОбъектаМетаданных = Выборка.КлючОбъектаМетаданных; + + Если КлючОбъектаМетаданных = Неопределено + Или КлючОбъектаМетаданных = Тип("Неопределено") Тогда + Продолжить; + КонецЕсли; + + ОбъектМетаданных = ОбъектМетаданныхПоКлючу(КлючОбъектаМетаданных); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + Если ИдентификаторыИзКлючей.Получить(ПолноеИмя) <> Неопределено Тогда + СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); + КонецЕсли; + + ИдентификаторыИзКлючей.Вставить(ПолноеИмя, Выборка.Ссылка); + КонецЦикла; + + Возврат ИдентификаторыИзКлючей; + +КонецФункции + +// Для функций ОбъектМетаданныхПоИдентификатору, ОбъектыМетаданныхПоИдентификаторам. +Функция ОбъектыМетаданныхПоИдентификаторамСПопыткойПовтора(Идентификаторы, КромеНесуществующихИНедоступных) + + Если Идентификаторы.Количество() = 0 Тогда + Возврат Новый Соответствие; + КонецЕсли; + + ИдентификаторыКонфигурации = Новый Массив; + ИдентификаторыРасширений = Новый Массив; + + ДобавленныеИдентификаторыКонфигурации = Новый Соответствие; + ДобавленныеИдентификаторыРасширений = Новый Соответствие; + + Для Каждого ТекущийИдентификатор Из Идентификаторы Цикл + Если ТипЗнч(ТекущийИдентификатор) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Если ДобавленныеИдентификаторыКонфигурации[ТекущийИдентификатор] = Неопределено Тогда + ИдентификаторыКонфигурации.Добавить(ТекущийИдентификатор); + ДобавленныеИдентификаторыКонфигурации.Вставить(ТекущийИдентификатор, Истина); + КонецЕсли; + ИначеЕсли ТипЗнч(ТекущийИдентификатор) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + Если ДобавленныеИдентификаторыРасширений[ТекущийИдентификатор] = Неопределено Тогда + ИдентификаторыРасширений.Добавить(ТекущийИдентификатор); + ДобавленныеИдентификаторыРасширений.Вставить(ТекущийИдентификатор, Истина); + КонецЕсли; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(). + | + |Неверный тип идентификатора объекта метаданных: + |""%1"".'"), + ТипЗнч(ТекущийИдентификатор)); + КонецЕсли; + КонецЦикла; + + Если ИдентификаторыКонфигурации.Количество() > 0 Тогда + СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, Ложь); + КонецЕсли; + + Если ИдентификаторыРасширений.Количество() > 0 Тогда + СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, Истина); + КонецЕсли; + + Попытка + ОбъектыМетаданных = ОбъектыМетаданныхПоИдентификаторамБезПопыткиПовтора(Идентификаторы, + ИдентификаторыКонфигурации, ИдентификаторыРасширений, КромеНесуществующихИНедоступных); + Исключение + Если Не ОбщегоНазначения.РазделениеВключено() + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // В случае ошибки, если есть возможность обновления справочника, + // нужно выполнить обновление, а после этого повторить получение идентификатора. + ОбъектыМетаданных = Неопределено; + Иначе + ВызватьИсключение; + КонецЕсли; + КонецПопытки; + + Если ОбъектыМетаданных = Неопределено Тогда + ОбновитьДанныеСправочника(); + ОбъектыМетаданных = ОбъектыМетаданныхПоИдентификаторамБезПопыткиПовтора(Идентификаторы, + ИдентификаторыКонфигурации, ИдентификаторыРасширений, КромеНесуществующихИНедоступных); + КонецЕсли; + + Возврат ОбъектыМетаданных; + +КонецФункции + +// Для функции ОбъектыМетаданныхПоИдентификаторамСПопыткойПовтора. +Функция ОбъектыМетаданныхПоИдентификаторамБезПопыткиПовтора(Идентификаторы, + ИдентификаторыКонфигурации, ИдентификаторыРасширений, КромеНесуществующихИНедоступных) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + + Если ИдентификаторыКонфигурации.Количество() > 0 Тогда + Запрос.УстановитьПараметр("ИдентификаторыКонфигурации", ИдентификаторыКонфигурации); + Запрос.Текст = + "ВЫБРАТЬ + | Идентификаторы.Ссылка КАК Ссылка, + | Идентификаторы.КлючОбъектаМетаданных КАК КлючОбъектаМетаданных, + | Идентификаторы.ПолноеИмя КАК ПолноеИмя, + | Идентификаторы.ПометкаУдаления КАК ПометкаУдаления, + | ЛОЖЬ КАК ОбъектРасширений, + | """" КАК ИмяРасширения + |ИЗ + | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы + |ГДЕ + | Идентификаторы.Ссылка В(&ИдентификаторыКонфигурации)"; + КонецЕсли; + + Если ИдентификаторыРасширений.Количество() > 0 Тогда + Запрос.УстановитьПараметр("ИдентификаторыРасширений", ИдентификаторыРасширений); + Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); + Если ЗначениеЗаполнено(Запрос.Текст) Тогда + Запрос.Текст = Запрос.Текст + + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |"; + КонецЕсли; + Запрос.Текст = Запрос.Текст + + "ВЫБРАТЬ + | Идентификаторы.Ссылка КАК Ссылка, + | Идентификаторы.КлючОбъектаМетаданных КАК КлючОбъектаМетаданных, + | ЕСТЬNULL(ВерсииИдентификаторов.ПолноеИмяОбъекта, """") КАК ПолноеИмя, + | Идентификаторы.ПометкаУдаления КАК ПометкаУдаления, + | ИСТИНА КАК ОбъектРасширений, + | Идентификаторы.ИмяРасширения КАК ИмяРасширения + |ИЗ + | Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов + | ПО (ВерсииИдентификаторов.Идентификатор = Идентификаторы.Ссылка) + |ГДЕ + | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений + | И Идентификаторы.Ссылка В(&ИдентификаторыРасширений)"; + КонецЕсли; + + Выгрузка = Запрос.Выполнить().Выгрузить(); + ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору().'"); + + ОбъектыМетаданныхИдентификаторов = Новый Соответствие; + + ВсегоИдентификаторов = ИдентификаторыКонфигурации.Количество() + ИдентификаторыРасширений.Количество(); + Если Выгрузка.Количество() < ВсегоИдентификаторов Тогда + Для Каждого Идентификатор Из Идентификаторы Цикл + Если Выгрузка.Найти(Идентификатор, "Ссылка") = Неопределено Тогда + Если КромеНесуществующихИНедоступных Тогда + // Объект метаданных не существует. + ОбъектыМетаданныхИдентификаторов.Вставить(Идентификатор, Null); + Продолжить; + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если Не КромеНесуществующихИНедоступных Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор ""%1"" + |не найден в справочнике ""%2"".'"), + Строка(Идентификатор), + НазваниеСправочника(ИдентификаторыРасширений.Найти(Идентификатор) <> Неопределено)); + + ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + КонецЕсли; + КонецЕсли; + + ВерсияПрограммыОбновленаДинамически = СтандартныеПодсистемыСервер.ВерсияПрограммыОбновленаДинамически(); + + // Проверка соответствия ключа объекта метаданных полному имени объекта метаданных. + Для Каждого Свойства Из Выгрузка Цикл + РезультатПроверки = КлючОбъектаМетаданныхСоответствуетПолномуИмени(Свойства); + Если РезультатПроверки.НеСоответствует Тогда + + Если РезультатПроверки.ОбъектМетаданных = Неопределено Тогда + + Если Свойства.ОбъектРасширений И Не Свойства.ПометкаУдаления Тогда + // Возможно расширение не удалось подключить. + Если КромеНесуществующихИНедоступных Тогда + ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, Неопределено); + Продолжить; + Иначе + Отбор = Новый Структура("Имя", Свойства.ИмяРасширения); + Если РасширенияКонфигурации.Получить(Отбор, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() > 0 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Расширение конфигурации %1 установлено, но отключено при запуске сеанса. + |Обычно, это значит, что при подключении расширения конфигурации возникла ошибка.'"), + Свойства.ИмяРасширения); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Расширение конфигурации %1 установлено, но не подключено. + |Требуется перезапустить сеанс.'"), + Свойства.ИмяРасширения); + КонецЕсли; + КонецЕсли; + + ИначеЕсли Не Свойства.ОбъектРасширений И ВерсияПрограммыОбновленаДинамически Тогда + // Возможно объект метаданных будет доступен после перезапуска. + Если КромеНесуществующихИНедоступных Тогда + ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, Неопределено); + Продолжить; + Иначе + // Стандартное исключение по причине динамического обновления. + СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); + КонецЕсли; + + ИначеЕсли КромеНесуществующихИНедоступных Тогда + // Объект метаданных не существует. + ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, Null); + Продолжить; + + ИначеЕсли РезультатПроверки.КлючОбъектаМетаданных = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатору ""%1"" + |найденному в справочнике ""%2"", + |соответствует несуществующий объект метаданных + |""%3"".'"), + Строка(Свойства.Ссылка), + НазваниеСправочника(Свойства.ОбъектРасширений), + Свойства.ПолноеИмя); + Иначе + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатору ""%1"" + |найденному в справочнике ""%2"", + |соответствует удаленный объект метаданных.'"), + Строка(Свойства.Ссылка), + НазваниеСправочника(Свойства.ОбъектРасширений)); + КонецЕсли; + ИначеЕсли ВерсияПрограммыОбновленаДинамически Тогда + // Возможно объект метаданных был переименован. + ОписаниеОшибки = ""; + Иначе + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатору ""%1"" + |найденному в справочнике ""%2"", + |соответствует объект метаданных ""%3"", + |полное имя которого отличается от заданного в идентификаторе.'"), + Строка(Свойства.Ссылка), + НазваниеСправочника(Свойства.ОбъектРасширений), + РезультатПроверки.ОбъектМетаданных.ПолноеИмя()); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + КонецЕсли; + КонецЕсли; + + Если Не Свойства.ОбъектРасширений И Свойства.ПометкаУдаления И Не ВерсияПрограммыОбновленаДинамически Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор ""%1"" + |найден в справочнике ""%2"", + |но значение реквизита ""Пометка удаления"" установлено Истина.'"), + Строка(Свойства.Ссылка), + НазваниеСправочника(Свойства.ОбъектРасширений)); + + ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки + + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); + КонецЕсли; + + ОбъектыМетаданныхИдентификаторов.Вставить(Свойства.Ссылка, РезультатПроверки.ОбъектМетаданных); + КонецЦикла; + + Возврат ОбъектыМетаданныхИдентификаторов; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции замены идентификатора в базе данных. Процедура ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьИзменения) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда // В модели сервиса не поддерживается. Возврат; КонецЕсли; @@ -2674,22 +3043,16 @@ Возврат; КонецЕсли; - Если МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; + Выборка = РезультатЗапроса.Выбрать(); + ЗаменяемыеСсылки = Новый Массив; + СтарыеИНовыеСсылки = Новый Соответствие; + Пока Выборка.Следующий() Цикл + ЗаменяемыеСсылки.Добавить(Выборка.Ссылка); + СтарыеИНовыеСсылки.Вставить(Выборка.Ссылка, Выборка.НоваяСсылка); + КонецЦикла; - Попытка - Выборка = РезультатЗапроса.Выбрать(); - ЗаменяемыеСсылки = Новый Массив; - СтарыеИНовыеСсылки = Новый Соответствие; - Пока Выборка.Следующий() Цикл - ЗаменяемыеСсылки.Добавить(Выборка.Ссылка); - СтарыеИНовыеСсылки.Вставить(Выборка.Ссылка, Выборка.НоваяСсылка); - КонецЦикла; - + ТекущаяПопытка = 1; + Пока Истина Цикл НайденныеДанные = НайтиПоСсылкам(ЗаменяемыеСсылки); НайденныеДанные.Колонки[0].Имя = "Ссылка"; НайденныеДанные.Колонки[1].Имя = "Данные"; @@ -2697,40 +3060,44 @@ НайденныеДанные.Колонки.Добавить("Включено"); НайденныеДанные.ЗаполнитьЗначения(Истина, "Включено"); - Если НайденныеДанные.Количество() > 0 Тогда - БезОшибок = ВыполнитьЗаменуЭлементов(СтарыеИНовыеСсылки, НайденныеДанные, Истина); - Если Не БезОшибок Тогда - ВызватьИсключение - НСтр("ru = 'Не удалось выполнить замену дублей идентификаторов объектов метаданных. - |Подробнее см. ошибки при замене идентификатора в журнале регистрации.'"); - КонецЕсли; - + Если НайденныеДанные.Количество() = 0 Тогда + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ИдентификаторыОбъектовМетаданных"); + Для Каждого ЗаменяемаяСсылка Из ЗаменяемыеСсылки Цикл + ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка); + КонецЦикла; НачатьТранзакцию(); Попытка + Блокировка.Заблокировать(); // Очистка новых ссылок у дублей идентификаторов. - Для каждого ЗаменяемаяСсылка Из ЗаменяемыеСсылки Цикл + Для Каждого ЗаменяемаяСсылка Из ЗаменяемыеСсылки Цикл ОбъектДубля = ЗаменяемаяСсылка.ПолучитьОбъект(); ОбъектДубля.НоваяСсылка = Неопределено; ОбъектДубля.ОбменДанными.Загрузка = Истина; ОбъектДубля.Записать(); КонецЦикла; - ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; КонецЕсли; - Исключение - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); + + Если ТекущаяПопытка > 10 Тогда + ВызватьИсключение + НСтр("ru = 'Не удалось выполнить замену дублей идентификаторов объектов метаданных. + |После 10 попыток все еще имеются данные, которые требуют замены. + |Выполните действие в монопольном режиме.'"); КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; + + БезОшибок = ВыполнитьЗаменуЭлементов(СтарыеИНовыеСсылки, НайденныеДанные, Истина); + Если Не БезОшибок Тогда + ВызватьИсключение + НСтр("ru = 'Не удалось выполнить замену дублей идентификаторов объектов метаданных. + |Подробнее см. ошибки при замене идентификатора в журнале регистрации.'"); + КонецЕсли; + ТекущаяПопытка = ТекущаяПопытка + 1; + КонецЦикла; КонецПроцедуры diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form index 6280f9df6..323455507 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form @@ -204,10 +204,6 @@ ru Режим просмотра - - ru - Форма режим просмотра - ФормаРежимПросмотраРасширеннаяПодсказка 71 @@ -488,6 +484,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -727,9 +727,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form index bbb19a72c..de06700ae 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form @@ -184,10 +184,6 @@ ru Имя и синоним объекта метаданных - - ru - Имя и синоним объекта метаданных - ИмяИСинонимОбъектаМетаданныхExtendedTooltip 34 @@ -314,10 +310,6 @@ ru Полное имя и полный синоним объекта метаданных - - ru - Полное имя и полный синоним объекта метаданных - ПолноеИмяИПолныйСинонимОбъектаМетаданныхExtendedTooltip 37 @@ -836,7 +828,7 @@ - CommonCommand.ПрисоединенныеФайлыКОбъекту + 0 @@ -854,11 +846,11 @@ - CommonCommand.ЗаполнениеОбъекта + 0 - CommonCommand.ОтчетыОбъекта + 0 diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl index a19062cca..a9cfc76f6 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl @@ -2,25 +2,9 @@ #Область ПрограммныйИнтерфейс -// Процедура обновляет данные справочника по метаданным конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - в этот параметр возвращается -// значение Истина, если производилась запись, иначе не изменяется. -// -// ЕстьУдаленные - Булево (возвращаемое значение) - в этот параметр возвращается -// значение Истина, если хотя бы один элемент справочника был помечен -// на удаление, иначе не изменяется. -// -// ТолькоПроверка - Булево (возвращаемое значение) - не производит никаких изменений, -// а лишь выполняет установку флажков ЕстьИзменения, ЕстьУдаленные. -// -Процедура ОбновитьДанныеСправочника(ЕстьИзменения = Ложь, ЕстьУдаленные = Ложь, ТолькоПроверка = Ложь) Экспорт - - Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(ЕстьИзменения, - ЕстьУдаленные, ТолькоПроверка, , , Истина); - -КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -33,11 +17,14 @@ КонецФункции -// Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. // -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. +// Возвращаемое значение: +// Массив(Строка) - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт @@ -45,11 +32,45 @@ КонецФункции +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс +#КонецОбласти -// См. описание одноименной процедуры в общем модуле ОбщегоНазначения. +#Область СлужебныеПроцедурыИФункции + +// Процедура обновляет данные справочника по метаданным конфигурации. +// +// Параметры: +// ЕстьИзменения - Булево - (возвращаемое значение) в этот параметр возвращается +// значение Истина, если производилась запись, иначе не изменяется. +// +// ЕстьУдаленные - Булево - (возвращаемое значение) в этот параметр возвращается +// значение Истина, если хотя бы один элемент справочника был помечен +// на удаление, иначе не изменяется. +// +// ТолькоПроверка - Булево - не производить никаких изменений, а лишь выполнить +// установку флажков ЕстьИзменения, ЕстьУдаленные. +// +Процедура ОбновитьДанныеСправочника(ЕстьИзменения = Ложь, ЕстьУдаленные = Ложь, ТолькоПроверка = Ложь) Экспорт + + Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(ЕстьИзменения, + ЕстьУдаленные, ТолькоПроверка, , , Истина); + +КонецПроцедуры + +// Возвращает Истина, если объект метаданных, которому соответствует +// идентификатор объектов расширений существует в справочнике и +// не помечен на удаление, но отсутствует в кэше метаданных расширений. +// +// Параметры: +// Идентификатор - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор +// объекта метаданных расширения. +// +// Возвращаемое значение: +// Булево - Истина, если отключен. +// Функция ОбъектРасширенияОтключен(Идентификатор) Экспорт СтандартныеПодсистемыПовтИсп.ИдентификаторыОбъектовМетаданныхПроверкаИспользования(Истина, Истина); @@ -79,6 +100,23 @@ КонецФункции +// Только для внутреннего использования. +Функция ИдентификаторыОбъектовТекущейВерсииРасширенийЗаполнены() Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ИдентификаторыОбъектовВерсийРасширений КАК ВерсииИдентификаторов + |ГДЕ + | ВерсииИдентификаторов.ВерсияРасширений = &ВерсияРасширений"; + + Возврат Не Запрос.Выполнить().Пустой(); + +КонецФункции + #КонецОбласти -#КонецЕсли \ No newline at end of file +#КонецЕсли diff --git a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form index b60330d5f..2dbc6ae82 100644 --- a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form @@ -3,6 +3,10 @@ РасписаниеРаботы 1 + + <key>ru</key> + <value>Расписание работы</value> + true true @@ -229,16 +233,12 @@ true true false - true Auto Auto true true true true - None - None - None true diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form index ccc9d8f1e..33d786b37 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 35 @@ -74,10 +70,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 33 @@ -97,6 +89,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -253,6 +249,10 @@ ВозможнаяПричина 19 + + <key>ru</key> + <value>Возможная причина</value> + true true @@ -439,9 +439,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -575,7 +572,7 @@ ИзменитьВыделенные <key>ru</key> - <value>Изменить выделенные</value> + <value>Изменить выделенные...</value> 1 diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Module.bsl index 30a600229..a483b32de 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Module.bsl @@ -13,9 +13,13 @@ КонецЕсли; УстановитьПараметрыСписка(); - + ЗаполнитьУсловноеОформлениеСписка(); + МожноРедактировать = ПравоДоступа("Редактирование", Метаданные.Справочники.Календари); + ЕстьГрупповоеИзменениеРеквизитов = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов"); + Элементы.СписокИзменитьВыделенные.Видимость = ЕстьГрупповоеИзменениеРеквизитов И МожноРедактировать; + КонецПроцедуры #КонецОбласти @@ -24,8 +28,10 @@ &НаКлиенте Процедура ИзменитьВыделенные(Команда) - МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); - МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.Список); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); + МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.Список); + КонецЕсли; КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form index 9434fda14..ba54e119d 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form @@ -7,7 +7,7 @@ НастройкаЗаполненияСтраница 283 - Группа + ГруппаНаименование 75 Наименование @@ -56,8 +56,12 @@ true + + <key>ru</key> + <value>Наименование</value> + - ГруппаExtendedTooltip + ГруппаНаименованиеРасширеннаяПодсказка 301 Label true @@ -223,10 +227,6 @@ ru Период заполнения группа - - ru - Период заполнения группа - ПериодЗаполненияГруппаExtendedTooltip 304 @@ -340,10 +340,6 @@ ru Настройки производственного календаря группа - - ru - Настройки производственного календаря группа - НастройкиПроизводственногоКалендаряГруппаExtendedTooltip 303 @@ -579,10 +575,6 @@ ru Длина цикла дней - - ru - Длина цикла дней - ГруппаДлинаЦиклаДнейExtendedTooltip 318 @@ -813,10 +805,6 @@ ru Учитывать праздники группа - - ru - Учитывать праздники группа - УчитыватьПраздникиГруппаExtendedTooltip 323 @@ -847,10 +835,6 @@ ru Настройки группа - - ru - Настройки группа - НастройкиГруппаExtendedTooltip 313 @@ -878,6 +862,10 @@ ШаблонЗаполнения 196 + + <key>ru</key> + <value>Шаблон заполнения</value> + true true @@ -1044,9 +1032,9 @@ Show Always + 3 true true - false true @@ -1058,10 +1046,6 @@ ru Шаблон заполнения группа колонок - - ru - Шаблон заполнения группа колонок - ШаблонЗаполненияГруппаКолонокExtendedTooltip 329 @@ -1174,7 +1158,7 @@ ШаблонЗаполненияКонтекстноеМеню 197 - true + 45 7 true true @@ -1192,9 +1176,6 @@ Auto true true - None - None - None true @@ -1207,10 +1188,6 @@ ru Шаблон заполнения - - ru - Шаблон заполнения - ШаблонЗаполненияГруппаExtendedTooltip 327 @@ -1240,10 +1217,6 @@ ru Настройка заполнения - - ru - Настройка заполнения - НастройкаЗаполненияГруппаExtendedTooltip 312 @@ -1394,10 +1367,6 @@ ru Горизонт планирования группа - - ru - Горизонт планирования группа - ГоризонтПланированияГруппаExtendedTooltip 336 @@ -1501,10 +1470,6 @@ ru Заполненность группа - - ru - Заполненность группа - ЗаполненностьГруппаExtendedTooltip 341 @@ -1725,10 +1690,6 @@ ru Годы ручного редактирования - - ru - Годы ручного редактирования - ГодыРучногоРедактированияГруппаExtendedTooltip 347 @@ -1821,10 +1782,6 @@ ru Настройка заполнения страница - - ru - Настройка заполнения страница - НастройкаЗаполненияСтраницаExtendedTooltip 300 @@ -1977,10 +1934,6 @@ ru Настройка результата заполнения группа - - ru - Настройка результата заполнения группа - НастройкаРезультатаЗаполненияГруппаExtendedTooltip 354 @@ -2071,10 +2024,6 @@ ru График работы - - ru - График работы группа - ГрафикРаботыГруппаExtendedTooltip 353 @@ -2104,10 +2053,6 @@ ru Результат заполнения - - ru - Результат заполнения - РезультатЗаполненияГруппаExtendedTooltip 352 @@ -2197,9 +2142,8 @@ Left true - true - true - false + 2 + 2 Style.ПоясняющийТекст @@ -2214,11 +2158,6 @@ ru Результат заполнения информационный текст группа - - ru - Результат заполнения информационный текст группа - - true РезультатЗаполненияИнформационныйТекстГруппаExtendedTooltip 360 @@ -2281,10 +2220,6 @@ ru Результат заполнения страница - - ru - Результат заполнения страница - РезультатЗаполненияСтраницаExtendedTooltip 351 @@ -2311,10 +2246,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 299 diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl index 286a709d6..a9a088da3 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl @@ -102,6 +102,10 @@ НоваяСтрока.НомерДня = КонтекстВыбора.НомерДня; КонецЦикла; + Если КонтекстВыбора.НомерДня = 0 Тогда + РасписаниеПредпраздничногоДня = ПредставлениеРасписанияДня(ЭтотОбъект, 0); + КонецЕсли; + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); @@ -220,6 +224,8 @@ УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект); + УточнитьДатуОтсчета(); + СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); @@ -239,9 +245,7 @@ &НаКлиенте Процедура ДатаОтсчетаПриИзменении(Элемент) - Если Объект.ДатаОтсчета < Дата(1900, 1, 1) Тогда - Объект.ДатаОтсчета = НачалоГода(ОбщегоНазначенияКлиент.ДатаСеанса()); - КонецЕсли; + УточнитьДатуОтсчета(); СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); @@ -433,7 +437,7 @@ ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Заполнить расписание'")); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ПредставлениеПустогоРасписания()); // @@ -501,7 +505,7 @@ ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Заполнить расписание'")); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ПредставлениеПустогоРасписания()); КонецПроцедуры @@ -547,6 +551,7 @@ ДатаДня = ДатаОтсчета; Для Каждого СтрокаДня Из ШаблонЗаполнения Цикл СтрокаДня.ПредставлениеДня = Формат(ДатаДня, "ДФ=д.ММ"); + СтрокаДня.ПредставлениеРасписания = ПредставлениеПустогоРасписания(); ДатаДня = ДатаДня + 86400; КонецЦикла; КонецЕсли; @@ -585,7 +590,7 @@ СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ПредставлениеИнтервалов, 2); Если Секунд = 0 Тогда - Возврат НСтр("ru = 'Заполнить расписание'"); + Возврат ПредставлениеПустогоРасписания(); КонецЕсли; Часов = Окр(Секунд / 3600, 1); @@ -609,6 +614,13 @@ КонецФункции +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеПустогоРасписания() + + Возврат НСтр("ru = 'Заполнить расписание'"); + +КонецФункции + &НаКлиентеНаСервереБезКонтекста Процедура УстановитьДоступностьУчитыватьПраздники(Форма) @@ -888,7 +900,8 @@ ИнформационнаяКартинка = Новый Картинка; ДоступноЗаполнениеПоШаблону = Ложь; Если Форма.РучноеРедактирование Тогда - ИнформационныйТекст = НСтр("ru = 'График работы на текущий год изменен вручную. Нажмите «Заполнить по шаблону» чтобы вернуться к автоматическому заполнению.'"); + ИнформационныйТекст = НСтр("ru = 'График работы на текущий год изменен вручную. + |Нажмите «Заполнить по шаблону» чтобы вернуться к автоматическому заполнению.'"); ИнформационнаяКартинка = БиблиотекаКартинок.Предупреждение; ДоступноЗаполнениеПоШаблону = Истина; Иначе @@ -898,7 +911,8 @@ ИнформационнаяКартинка = БиблиотекаКартинок.Информация; КонецЕсли; Иначе - ИнформационныйТекст = НСтр("ru = 'Отображаемый результат не соответствует настройке шаблона. Нажмите «Заполнить по шаблону», чтобы увидеть как выглядит график работы с учетом изменений шаблона.'"); + ИнформационныйТекст = НСтр("ru = 'Отображаемый результат не соответствует настройке шаблона. + |Нажмите «Заполнить по шаблону», чтобы увидеть как выглядит график работы с учетом изменений шаблона.'"); ИнформационнаяКартинка = БиблиотекаКартинок.Предупреждение; ДоступноЗаполнениеПоШаблону = Истина; КонецЕсли; @@ -954,4 +968,13 @@ КонецПроцедуры +&НаКлиенте +Процедура УточнитьДатуОтсчета() + + Если Объект.ДатаОтсчета < Дата(1900, 1, 1) Тогда + Объект.ДатаОтсчета = НачалоГода(ОбщегоНазначенияКлиент.ДатаСеанса()); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Календари/ManagerModule.bsl b/SSL/src/Catalogs/Календари/ManagerModule.bsl index c2bd8179e..4ade63da1 100644 --- a/SSL/src/Catalogs/Календари/ManagerModule.bsl +++ b/SSL/src/Catalogs/Календари/ManagerModule.bsl @@ -369,15 +369,15 @@ Пока ВыборкаПоГрафикам.СледующийПоЗначениюПоля("ДатаНачала") Цикл // Если дата окончания не указана, она будет подобрана по производственному календарю. ДатаОкончанияЗаполнения = ВыборкаПоГрафикам.ДатаОкончания; - ДниВключенныеВГрафик = Справочники.Календари.ДниВключенныеВГрафик( - ВыборкаПоГрафикам.ДатаНачала, - ВыборкаПоГрафикам.СпособЗаполнения, - ШаблонЗаполнения, - ДатаОкончанияЗаполнения, - ВыборкаПоГрафикам.ПроизводственныйКалендарь, - ВыборкаПоГрафикам.УчитыватьПраздники, - ВыборкаПоГрафикам.ДатаОтсчета); - Справочники.Календари.ЗаписатьДанныеГрафикаВРегистр(ВыборкаПоГрафикам.ГрафикРаботы, ДниВключенныеВГрафик, ВыборкаПоГрафикам.ДатаНачала, ДатаОкончанияЗаполнения); + ДниВключенныеВГрафик = ДниВключенныеВГрафик( + ВыборкаПоГрафикам.ДатаНачала, + ВыборкаПоГрафикам.СпособЗаполнения, + ШаблонЗаполнения, + ДатаОкончанияЗаполнения, + ВыборкаПоГрафикам.ПроизводственныйКалендарь, + ВыборкаПоГрафикам.УчитыватьПраздники, + ВыборкаПоГрафикам.ДатаОтсчета); + ЗаписатьДанныеГрафикаВРегистр(ВыборкаПоГрафикам.ГрафикРаботы, ДниВключенныеВГрафик, ВыборкаПоГрафикам.ДатаНачала, ДатаОкончанияЗаполнения); КонецЦикла; КонецЦикла; diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Form.form similarity index 98% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Form.form rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Form.form index 800cfa582..644728db0 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -408,9 +412,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -512,7 +513,7 @@
        true
        - Catalog.КлассификаторБанковРФ + Catalog.КлассификаторБанков true true true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Help/ru.html b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Help/ru.html similarity index 83% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Help/ru.html rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Help/ru.html index 938cb5686..6c488192c 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Help/ru.html +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Help/ru.html @@ -2,7 +2,7 @@

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

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

        • -
          Наименование - полное наименование банка;
          +
          Наименование - полное наименование банка;
        • БИК - БИК банка;
        • @@ -11,7 +11,7 @@
          Город - город, в котором находится банк;
        • Адрес - полный адрес банка.

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

        -

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

        +

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

        Выбор банка

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

        См. также:

        \ No newline at end of file diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Module.bsl similarity index 80% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Module.bsl index 86fb331ec..90bc20f7c 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаВыбора/Module.bsl @@ -10,16 +10,19 @@ Возврат; КонецЕсли; - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ТолькоПросмотр = Истина; - КонецЕсли; + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + ЕстьИсточникЗагрузкиДанных = Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено; МожноОбновлятьКлассификатор = - Не ОбщегоНазначенияПовтИсп.РазделениеВключено() // В модели сервиса обновляется автоматически. + Не ОбщегоНазначения.РазделениеВключено() // В модели сервиса обновляется автоматически. И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() // В узле РИБ обновляется автоматически. - И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанковРФ); // Пользователь с необходимыми правами. + И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанков); // Пользователь с необходимыми правами. - Элементы.ФормаЗагрузитьКлассификатор.Видимость = МожноОбновлятьКлассификатор; + Элементы.ФормаЗагрузитьКлассификатор.Видимость = МожноОбновлятьКлассификатор И ЕстьИсточникЗагрузкиДанных; + + Если Не Пользователи.ЭтоПолноправныйПользователь() Или Не МожноОбновлятьКлассификатор Тогда + ТолькоПросмотр = Истина; + КонецЕсли; ПереключитьВидимостьНедействующихБанков(Ложь); @@ -31,7 +34,7 @@ &НаКлиенте Процедура ЗагрузитьКлассификатор(Команда) - ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", , ЭтотОбъект); + РаботаСБанкамиКлиент.ОткрытьФормуЗагрузкиКлассификатора(ЭтотОбъект); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form similarity index 82% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Form.form rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form index 3367d677c..7afe4fec8 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 28 @@ -39,58 +35,6 @@ КоманднаяПанель 29 - - ФормаСоздать - 40 - true - true - - true - - - ФормаСоздатьРасширеннаяПодсказка - 41 - Label - true - true - - Left - - - Form.StandardCommand.Create - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСоздатьГруппу - 42 - true - true - - true - - - ФормаСоздатьГруппуРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - Form.StandardCommand.CreateFolder - Normal - Auto - true - true - UserCmds - Auto - ФормаЗагрузитьКлассификатор 16 @@ -117,54 +61,6 @@ UserCmds Auto - - ФормаГруппа1 - 44 - true - true - - true - - - ФормаГруппа1РасширеннаяПодсказка - 45 - Label - true - true - - Left - - - - Form - - - - Справка - 46 - true - true - - true - - - СправкаРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - true true @@ -174,10 +70,7 @@ ru Командная панель - - ru - Командная панель - + true КоманднаяПанельРасширеннаяПодсказка 30 @@ -191,11 +84,16 @@ CommandBar Left + Form Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -577,9 +475,6 @@ Style.BorderColor - None - None - None true true @@ -629,7 +524,7 @@
        true
        - Catalog.КлассификаторБанковРФ + Catalog.КлассификаторБанков true true true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Module.bsl similarity index 76% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Module.bsl index 5e743b33f..4221ce109 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Module.bsl @@ -10,12 +10,15 @@ Возврат; КонецЕсли; - МожноОбновлятьКлассификатор = - Не ОбщегоНазначенияПовтИсп.РазделениеВключено() // В модели сервиса обновляется автоматически. + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + ЕстьИсточникЗагрузкиДанных = Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено; + + МожноОбновлятьКлассификатор = + Не ОбщегоНазначения.РазделениеВключено() // В модели сервиса обновляется автоматически. И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() // В узле РИБ обновляется автоматически. - И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанковРФ); // Пользователь с необходимыми правами. - - Элементы.ФормаЗагрузитьКлассификатор.Видимость = МожноОбновлятьКлассификатор; + И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанков); // Пользователь с необходимыми правами. + + Элементы.ФормаЗагрузитьКлассификатор.Видимость = МожноОбновлятьКлассификатор И ЕстьИсточникЗагрузкиДанных; Если Не Пользователи.ЭтоПолноправныйПользователь() Или Не МожноОбновлятьКлассификатор Тогда ТолькоПросмотр = Истина; @@ -29,8 +32,7 @@ &НаКлиенте Процедура ЗагрузитьКлассификатор(Команда) - ПараметрыФормы = Новый Структура("ОткрытиеИзСписка"); - ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", ПараметрыФормы, ЭтотОбъект); + РаботаСБанкамиКлиент.ОткрытьФормуЗагрузкиКлассификатора(ЭтотОбъект, Истина); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form similarity index 98% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form index bbf85b95f..98e7ead23 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form @@ -97,6 +97,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ГруппаШапкаРасширеннаяПодсказка 33 @@ -170,10 +174,6 @@ ru Страница надпись деятельность прекращена - - ru - Страница надпись деятельность прекращена - СтраницаНадписьДеятельностьПрекращенаExtendedTooltip 25 @@ -241,10 +241,6 @@ ru Страница флажок деятельность прекращена - - ru - Страница флажок деятельность прекращена - СтраницаФлажокДеятельностьПрекращенаExtendedTooltip 27 @@ -391,10 +387,6 @@ ru Коды - - ru - Коды - КодыРасширеннаяПодсказка 42 @@ -505,6 +497,10 @@ true + + <key>ru</key> + <value>Корр счет БИК</value> + ГруппаКоррСчетБИКExtendedTooltip 30 @@ -677,7 +673,7 @@ Объект 1 - CatalogObject.КлассификаторБанковРФ + CatalogObject.КлассификаторБанков true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Help/ru.html similarity index 78% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Help/ru.html rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Help/ru.html index 3d4e6f203..fd3c9c9ae 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Help/ru.html @@ -6,7 +6,7 @@
        Входит в группу - по умолчанию указывается регион, в котором находится банк. Можно включить банк в новую группу, для этого выберите из списка нужную группу, нажав Показать все, для ввода новой группы нажмите Создать. 
      • -
        Деятельность банка прекращена - программа учитывает недействующие банки и автоматически включает флажок для таких банков. Также можно его включить вручную, если получены сведения о закрытии банка.
        +
        Деятельность банка прекращена - программа учитывает недействующие банки и автоматически включает флажок для таких банков. Также можно его включить вручную, если получены сведения о закрытии банка.
      • БИК - БИК банка.
      • @@ -18,6 +18,6 @@
      • Адрес - полный адрес банка.
      • -
        Телефоны - адреса и телефоны банков можно загрузить только с диска 1С:ИТС или ввести вручную.

      См. также:

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

    См. также:

    \ No newline at end of file diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Module.bsl similarity index 100% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl rename to SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Module.bsl diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html b/SSL/src/Catalogs/КлассификаторБанков/Help/ru.html similarity index 90% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html rename to SSL/src/Catalogs/КлассификаторБанков/Help/ru.html index ca0397b22..739904d29 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html +++ b/SSL/src/Catalogs/КлассификаторБанков/Help/ru.html @@ -5,7 +5,7 @@

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

    В классификаторе выводится:

    • -
      Наименование банка - полное наименование банка;
      +
      Наименование банка - полное наименование банка;
    • БИК - БИК банка;
    • @@ -32,14 +32,14 @@
      После запуска программы производится проверка актуальности классификатора банков и в случае неактуальности (если классификатор не обновлялся в течение тридцати дней) выводится сообщение с предложением обновить классификатор банков. Перейдите по ссылке Обновить классификатор банков.
    • -

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

      +

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

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

    Ввод банка

    • -
      При необходимости можно ввести банк, нажав Создать. Заполните необходимые параметры.

    См. также:

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

    См. также:

    \ No newline at end of file diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl b/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl similarity index 64% rename from SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl rename to SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl index aae5a2104..870bf3df1 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl +++ b/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -18,11 +19,15 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + // Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. +// для элементов справочника. // -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. +// Возвращаемое значение: +// Массив - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт @@ -34,6 +39,10 @@ КонецФункции +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/ObjectModule.bsl b/SSL/src/Catalogs/КлассификаторБанков/ObjectModule.bsl similarity index 100% rename from SSL/src/Catalogs/КлассификаторБанковРФ/ObjectModule.bsl rename to SSL/src/Catalogs/КлассификаторБанков/ObjectModule.bsl diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/КлассификаторБанковРФ.mdo b/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo similarity index 88% rename from SSL/src/Catalogs/КлассификаторБанковРФ/КлассификаторБанковРФ.mdo rename to SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo index 90f18d65c..e4d06521e 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/КлассификаторБанковРФ.mdo +++ b/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo @@ -7,14 +7,14 @@ - КлассификаторБанковРФ + КлассификаторБанков ru - Классификатор банков РФ + Классификатор банков true - Catalog.КлассификаторБанковРФ.StandardAttribute.Description - Catalog.КлассификаторБанковРФ.StandardAttribute.Code + Catalog.КлассификаторБанков.StandardAttribute.Description + Catalog.КлассификаторБанков.StandardAttribute.Code DontUse Use @@ -80,7 +80,7 @@ true - Catalog.КлассификаторБанковРФ.EmptyRef + Catalog.КлассификаторБанков.EmptyRef Use @@ -149,9 +149,9 @@ AsDescription BothWays BothWays - Catalog.КлассификаторБанковРФ.Form.ФормаЭлемента - Catalog.КлассификаторБанковРФ.Form.ФормаСписка - Catalog.КлассификаторБанковРФ.Form.ФормаВыбора + Catalog.КлассификаторБанков.Form.ФормаЭлемента + Catalog.КлассификаторБанков.Form.ФормаСписка + Catalog.КлассификаторБанков.Form.ФормаВыбора КоррСчет @@ -308,20 +308,6 @@ Use Use - - ЗагрузкаКлассификатора - - ru - Загрузка классификатора - - - - ru - - - PersonalComputer - MobileDevice - ФормаВыбора @@ -359,14 +345,4 @@ PersonalComputer MobileDevice - - ЗагрузкаКлассификатораБанковРФ - - ru - Загрузка классификатора банков РФ - - Открывает помощник загрузки классификатора банков РФ - ActionsPanelTools - Auto - diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Commands/ЗагрузкаКлассификатораБанковРФ/CommandModule.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/Commands/ЗагрузкаКлассификатораБанковРФ/CommandModule.bsl deleted file mode 100644 index 1c964e877..000000000 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Commands/ЗагрузкаКлассификатораБанковРФ/CommandModule.bsl +++ /dev/null @@ -1,9 +0,0 @@ -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", , - ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form index 99a7abe0c..f423c0900 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -55,10 +59,6 @@ 3 Left - - Selection - СписокВыбор - СписокSearchString 10 @@ -166,9 +166,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Module.bsl index afb417a4b..227f5615e 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Module.bsl @@ -21,25 +21,4 @@ КонецПроцедуры -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок - -&НаКлиенте -Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - РезультатВыбора = Неопределено; - ТД = Элементы.Список.ТекущиеДанные; - Если ТД <> Неопределено Тогда - РезультатВыбора = Новый Структура("КлючеваяОперация, Приоритет, ЦелевоеВремя"); - РезультатВыбора.КлючеваяОперация = ТД.Ссылка; - РезультатВыбора.Приоритет = ТД.Приоритет; - РезультатВыбора.ЦелевоеВремя = ТД.ЦелевоеВремя; - КонецЕсли; - - ОповеститьОВыборе(РезультатВыбора); - -КонецПроцедуры - -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form index 246e9abb1..576ec5158 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 20 @@ -48,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 18 @@ -71,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -374,9 +370,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl b/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl index b44c6848d..c85e551a2 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl +++ b/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl @@ -5,13 +5,6 @@ Процедура ПередЗаписью(Отказ) Если ОбменДанными.Загрузка Тогда - Если НЕ ЗначениеЗаполнено(ИмяХеш) Тогда - ХешMD5 = Новый ХешированиеДанных(ХешФункция.MD5); - ХешMD5.Добавить(Имя); - ИмяХешТемп = ХешMD5.ХешСумма; - ИмяХеш = СтрЗаменить(Строка(ИмяХешТемп), " ", ""); - КонецЕсли; - Возврат; КонецЕсли; diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form index d2386a8f8..7a1858a5d 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -212,9 +216,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form index bc83d2e29..2b625aa3b 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form @@ -307,10 +307,6 @@ ru Свойства группа кнопок 2 - - ru - Свойства группа кнопок действия - СвойстваГруппаКнопокДействияРасширеннаяПодсказка 110 @@ -385,6 +381,10 @@ true + + <key>ru</key> + <value>Свойства группа кнопок порядок</value> + СвойстваГруппаКнопокПорядокРасширеннаяПодсказка 114 @@ -538,7 +538,7 @@ <key>ru</key> - <value>Группа кнопок копирование</value> + <value>Кнопок копирование</value> ГруппаКнопокКопированиеРасширеннаяПодсказка @@ -634,6 +634,10 @@ НаборыСвойств 1 + + <key>ru</key> + <value>Наборы свойств</value> + true true @@ -871,9 +875,6 @@ Style.BorderColor - None - None - None true 60 @@ -889,6 +890,10 @@ Свойства 38 + + <key>ru</key> + <value>Свойства</value> + true true @@ -1554,9 +1559,6 @@ Style.FormBackColor - None - None - None true @@ -1565,10 +1567,10 @@ true - + <key>ru</key> - <value>Группа свойства</value> - </toolTip> + <value>Свойства</value> + ГруппаСвойстваРасширеннаяПодсказка 121 diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl index 8fb28b97b..5317f10d6 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl @@ -356,14 +356,14 @@ Процедура ОформитьНаборыИСвойства() // Оформление корня списка наборов. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления = НаборыСвойств.УсловноеОформление.Элементы.Добавить(); ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Text"); ЭлементЦветаОформления.Значение = НСтр("ru = 'Наборы'"); ЭлементЦветаОформления.Использование = Истина; ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаборыСвойств.Ссылка"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; ЭлементОтбораДанных.Использование = Истина; @@ -372,7 +372,7 @@ ЭлементОформляемогоПоля.Использование = Истина; // Оформление недоступных групп наборов, которые безусловно отображаются платформой, как часть дерева групп. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления = НаборыСвойств.УсловноеОформление.Элементы.Добавить(); ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; @@ -383,19 +383,19 @@ ГруппаЭлементовОтбораДанных.Использование = Истина; ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаборыСвойств.Ссылка"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; ЭлементОтбораДанных.ПравоеЗначение = ДоступныеНаборыСписок; ЭлементОтбораДанных.Использование = Истина; ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаборыСвойств.Родитель"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Родитель"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; ЭлементОтбораДанных.ПравоеЗначение = ДоступныеНаборыСписок; ЭлементОтбораДанных.Использование = Истина; ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаборыСвойств.Ссылка"); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; ЭлементОтбораДанных.Использование = Истина; @@ -903,7 +903,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", НаборПриемник); Попытка @@ -952,19 +951,11 @@ Если Команда = "ИзменитьПометкуУдаления" Тогда ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектовИерархия"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Иначе ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", ТекущийНабор); КонецЕсли; diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form index 70e65e896..82e48f359 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form @@ -84,6 +84,10 @@ ДополнительныеРеквизиты 72 + + <key>ru</key> + <value>Дополнительные реквизиты</value> + true true @@ -282,15 +286,16 @@ true true true - None - None - None true ДополнительныеСведения 85 + + <key>ru</key> + <value>Дополнительные сведения</value> + true true @@ -489,9 +494,6 @@ true true true - None - None - None true diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl index 27e3b4488..23bc4c507 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -15,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -32,44 +40,20 @@ ПредопределенныеНаборы = ПредопределенныеНаборы(); - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - НачатьТранзакцию(); Попытка - Блокировка.Заблокировать(); + ЕстьТекущиеИзменения = Ложь; + СтароеЗначение = Неопределено; - Параметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыДополнительныхРеквизитовИСведений"); - - ЕстьУдаленные = Ложь; - Сохраненные = Неопределено; - - Если Параметры.Свойство("ПредопределенныеНаборыДополнительныхРеквизитовИСведений") Тогда - Сохраненные = Параметры.ПредопределенныеНаборыДополнительныхРеквизитовИСведений; - - Если НЕ ПредопределенныеНаборыСовпадают(ПредопределенныеНаборы, Сохраненные, ЕстьУдаленные) Тогда - Сохраненные = Неопределено; - КонецЕсли; - КонецЕсли; - - Если Сохраненные = Неопределено Тогда - ЕстьИзменения = Истина; - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( - "ПараметрыДополнительныхРеквизитовИСведений", - "ПредопределенныеНаборыДополнительныхРеквизитовИСведений", - ПредопределенныеНаборы); - КонецЕсли; - - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыДополнительныхРеквизитовИСведений", - "ПредопределенныеНаборыДополнительныхРеквизитовИСведений"); + СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.Свойства.ПредопределенныеНаборыДополнительныхРеквизитовИСведений", + ПредопределенныеНаборы, ЕстьТекущиеИзменения, СтароеЗначение); СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( - "ПараметрыДополнительныхРеквизитовИСведений", - "ПредопределенныеНаборыДополнительныхРеквизитовИСведений", - Новый ФиксированнаяСтруктура("ЕстьУдаленные", ЕстьУдаленные)); + "СтандартныеПодсистемы.Свойства.ПредопределенныеНаборыДополнительныхРеквизитовИСведений", + ?(ЕстьТекущиеИзменения, + Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), + Новый ФиксированнаяСтруктура()) ); ЗафиксироватьТранзакцию(); Исключение @@ -77,8 +61,18 @@ ВызватьИсключение; КонецПопытки; + Если ЕстьТекущиеИзменения Тогда + ЕстьИзменения = Истина; + КонецЕсли; + КонецПроцедуры + + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + Функция ПредопределенныеНаборы() ПредопределенныеНаборы = Новый Соответствие; @@ -94,25 +88,6 @@ КонецФункции -Функция ПредопределенныеНаборыСовпадают(НовыеНаборы, СтарыеНаборы, ЕстьУдаленные) - - ПредопределенныеНаборыСовпадают = - НовыеНаборы.Количество() = СтарыеНаборы.Количество(); - - Для каждого Набор Из СтарыеНаборы Цикл - Если НовыеНаборы.Получить(Набор.Ключ) = Неопределено Тогда - ПредопределенныеНаборыСовпадают = Ложь; - ЕстьУдаленные = Истина; - Прервать; - ИначеЕсли Набор.Значение <> НовыеНаборы.Получить(Набор.Ключ) Тогда - ПредопределенныеНаборыСовпадают = Ложь; - КонецЕсли; - КонецЦикла; - - Возврат ПредопределенныеНаборыСовпадают; - -КонецФункции - #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form index c0cf0aa5b..692cbff78 100644 --- a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form @@ -711,7 +711,7 @@ <key>ru</key> - <value>Группа страницы</value> + <value>Страницы</value> ГруппаСтраницыExtendedTooltip diff --git a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl index ded738938..3ed644ae3 100644 --- a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl @@ -48,7 +48,9 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) - РазблокироватьДанныеФормыДляРедактирования(); + Если Не ЗавершениеРаботы Тогда + РазблокироватьДанныеФормыДляРедактирования(); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form index 12a031e6b..79235f27c 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -677,9 +681,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form index 3951e816b..1d010bac7 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form @@ -795,7 +795,7 @@ <key>ru</key> - <value>Группа страницы</value> + <value>Страницы</value> ГруппаСтраницыExtendedTooltip diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form index 8168f458c..2d6b00561 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form @@ -68,6 +68,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form index 7f2df1f87..76e8ead99 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form @@ -64,6 +64,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form index 39a984e05..c3120e2bd 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form @@ -79,7 +79,7 @@ <key>ru</key> - <value>Группа пояснение облачного сервиса</value> + <value>Пояснение облачного сервиса</value> ГруппаПояснениеОблачногоСервисаРасширеннаяПодсказка diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl index b59c34433..56f23ac60 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl @@ -128,57 +128,8 @@ Процедура РабочийКаталогВладельцаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - - Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); - Возврат; - КонецЕсли; - - Если Объект.Ссылка.Пустая() Тогда - Если Записать()= Ложь Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - ОчиститьСообщения(); - - Каталог = ""; - Режим = РежимДиалогаВыбораФайла.ВыборКаталога; - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.Каталог = РабочийКаталог; - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.Фильтр = Фильтр; - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); - Если ДиалогОткрытияФайла.Выбрать() Тогда - - ИмяКаталога = ДиалогОткрытияФайла.Каталог; - ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога); - - // Создать каталог для файлов - Попытка - СоздатьКаталог(ИмяКаталога); - ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; - СоздатьКаталог(ИмяКаталогаТестовое); - УдалитьФайлы(ИмяКаталогаТестовое); - Исключение - // Нет прав на создание каталога, или такой путь отсутствует. - - ТекстОшибки = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог ""%1""'"), ИмяКаталога); - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "РабочийКаталог"); - Возврат; - КонецПопытки; - - РабочийКаталог = ИмяКаталога; - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Объект.Ссылка, РабочийКаталог); - - КонецЕсли; - - ОбновитьОтображениеДанных(); + Обработчик = Новый ОписаниеОповещения("РаботыСФайламиПодключеноРабочийКаталогВладельцаНачалоВыбораПродолжение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -247,11 +198,11 @@ // СтандартныеПодсистемы.Свойства &НаКлиенте -Процедура Подключаемый_РедактироватьСоставСвойств() +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); КонецЕсли; КонецПроцедуры @@ -262,6 +213,62 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура РаботыСФайламиПодключеноРабочийКаталогВладельцаНачалоВыбораПродолжение(Результат, ДополнительныеПараметры) Экспорт + + Если Не РаботаСФайламиСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Возврат; + КонецЕсли; + + Если Объект.Ссылка.Пустая() Тогда + Если Записать()= Ложь Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ОчиститьСообщения(); + + Каталог = ""; + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.Каталог = РабочийКаталог; + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ИмяКаталога = ДиалогОткрытияФайла.Каталог; + ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога); + + // Создать каталог для файлов + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // Нет прав на создание каталога, или такой путь отсутствует. + + ТекстОшибки = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог ""%1""'"), ИмяКаталога); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "РабочийКаталог"); + Возврат; + КонецПопытки; + + РабочийКаталог = ИмяКаталога; + РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Объект.Ссылка, РабочийКаталог); + + КонецЕсли; + + ОбновитьОтображениеДанных(); + +КонецПроцедуры + &НаСервере Процедура ОбновитьПолныйПуть() @@ -416,7 +423,7 @@ Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - АдресПапкиВОблачномСервисе = ФайловыеФункцииСлужебныйКлиентСервер.АдресВОблачномСервисе( + АдресПапкиВОблачномСервисе = РаботаСФайламиСлужебныйКлиентСервер.АдресВОблачномСервисе( ВыборкаДетальныеЗаписи.Сервис, ВыборкаДетальныеЗаписи.Href); ВидимостьПояснения = Истина; diff --git a/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html index ac1ca91e1..cdb15753a 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html @@ -1,11 +1,13 @@ +

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

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

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

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

    -

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

    -

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

    -

    Выбор папки

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

    +

    Настройка прав доступа к папкам

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

    Ввод новой папки

    +
    • Ввести новую папку можно в списке Файлы с помощью команды Создать контекстного меню по правой кнопке мыши.

    Изменение папки

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

    Выбор папки

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

    См. также:

    \ No newline at end of file diff --git a/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl index 7b20c593e..7d8e7752c 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -18,6 +22,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl index 25bb2fe94..34ee6e2ec 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl @@ -16,7 +16,7 @@ Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ИзменениеПапок", Родитель) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недостаточно прав для добавления подпапок в папку файлов ""%1"".'"), - Строка(Родитель)); + Строка(?(ЗначениеЗаполнено(Родитель),Родитель, НСтр("ru = 'Папки'")))); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form index aa11d567e..c5ff47177 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 12 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -227,16 +227,13 @@ true true Auto - Auto + End ExpandTopLevel true true Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form index e7e3d7bb9..3be88fc79 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 12 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -235,9 +235,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form index f3ad770bb..720b6d333 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form @@ -90,12 +90,8 @@ <key>ru</key> - <value>Группа код предопределенная</value> + <value>Код предопределенная</value> - - ru - Группа код предопределенная - ГруппаКодПредопределеннаяExtendedTooltip 10 diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl index b00d84102..9ba9cb40f 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -20,6 +21,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form index a71a2f96b..c5199bbf0 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form @@ -330,9 +330,6 @@ Style.BorderColor - None - None - None true @@ -345,10 +342,6 @@ ru Домены: - - ru - Группа домены - ГруппаДоменыРасширеннаяПодсказка 52 @@ -731,9 +724,6 @@ Style.BorderColor - None - None - None true @@ -746,10 +736,6 @@ ru Пользователи: - - ru - Группа пользователи - ГруппаПользователиРасширеннаяПодсказка 50 @@ -781,10 +767,6 @@ ru Домены и пользователи - - ru - Домены и пользователи - ДоменыИПользователиExtendedTooltip 29 diff --git a/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form index 0f79a09b8..f7129e7b1 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form @@ -205,7 +205,7 @@
    <key>ru</key> - <value>Группа вид срока до даты</value> + <value>Вид срока до даты</value> ГруппаВидСрокаДоДатыРасширеннаяПодсказка @@ -364,7 +364,7 @@
    <key>ru</key> - <value>Группа вид срока до просрочки</value> + <value>Вид срока до просрочки</value> ГруппаВидСрокаДоПросрочкиРасширеннаяПодсказка diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form index b74f3a13a..889257919 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form @@ -288,10 +288,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 55 @@ -311,6 +307,10 @@ ПользователиИБ 1 + + <key>ru</key> + <value>Пользователи ИБ</value> + true true @@ -988,9 +988,6 @@ ПользователиИБ.Картинка - None - None - None true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl index e4e4358f4..cc3c64700 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl @@ -10,7 +10,7 @@ Возврат; КонецЕсли; - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда ВызватьИсключение НСтр("ru = 'Недостаточно прав для открытия списка пользователей информационной базы.'"); КонецЕсли; @@ -314,11 +314,13 @@ ВсеПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); Для Каждого ПользовательИБ Из ВсеПользователиИБ Цикл - СвойстваПользовательИБ = Пользователи.НовоеОписаниеПользователяИБ(); - Пользователи.ПрочитатьПользователяИБ(ПользовательИБ.УникальныйИдентификатор, СвойстваПользовательИБ); ИзмененВКонфигураторе = Ложь; - Строка = Выгрузка.Найти(СвойстваПользовательИБ.УникальныйИдентификатор, "ИдентификаторПользователяИБ"); + Строка = Выгрузка.Найти(ПользовательИБ.УникальныйИдентификатор, "ИдентификаторПользователяИБ"); + СвойстваПользовательИБ = Пользователи.СвойстваПользователяИБ(ПользовательИБ.УникальныйИдентификатор); + Если СвойстваПользовательИБ = Неопределено Тогда + СвойстваПользовательИБ = Пользователи.НовоеОписаниеПользователяИБ(); + КонецЕсли; Если Строка <> Неопределено Тогда Строка.Сопоставлен = Истина; @@ -377,10 +379,11 @@ &НаСервере Процедура УдалитьПользователяИБ(ИдентификаторПользователяИБ, Отказ) - ОписаниеОшибки = ""; - Если НЕ Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ, ОписаниеОшибки) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки, , , , Отказ); - КонецЕсли; + Попытка + Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , , , Отказ); + КонецПопытки; КонецПроцедуры @@ -485,7 +488,7 @@ КонецПроцедуры &НаКлиенте -Процедура ОтменитьСопоставлениеПродолжение(Ответ, Неопределен) Экспорт +Процедура ОтменитьСопоставлениеПродолжение(Ответ, Контекст) Экспорт Если Ответ = "ОтменитьСопоставление" Тогда ОтменитьСопоставлениеНаСервере(); diff --git a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl index df5eb499d..ba8275800 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl @@ -20,7 +20,7 @@ &НаКлиенте Процедура СменитьПочту(Команда) - Если НЕ ПроверитьЗаполнение() Тогда + Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; @@ -35,7 +35,7 @@ ТекстВопроса = ТекстВопроса + НСтр("ru = 'Выполнить изменение адреса электронной почты?'"); ПоказатьВопрос( - Новый ОписаниеОповещения("СменитьПочтуЗавершение", ЭтотОбъект), + Новый ОписаниеОповещения("СменитьПочтуПродолжение", ЭтотОбъект), ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); @@ -54,21 +54,41 @@ КонецПроцедуры &НаКлиенте -Процедура СменитьПочтуЗавершение(Ответ, Неопределен) Экспорт +Процедура СменитьПочтуПродолжение(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда - СоздатьЗапросНаСменуПочты(); + Попытка + СоздатьЗапросНаСменуПочты(); + Исключение + ПарольПользователяСервиса = ""; + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + ВызватьИсключение; + КонецПопытки; ПоказатьПредупреждение( - Новый ОписаниеОповещения("Закрыть", ЭтотОбъект), + Новый ОписаниеОповещения("СменитьПочтуЗавершение", ЭтотОбъект, Контекст), НСтр("ru = 'На указанный адрес отправлено письмо с запросом на подтверждение. |Почта будет изменена только после подтверждения запроса пользователем.'")); ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда - Закрыть(); + СменитьПочтуЗавершение(Контекст); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура СменитьПочтуЗавершение(Контекст) Экспорт + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму() + + Закрыть(ПарольПользователяСервиса); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form index 4187d0c7d..c659d5313 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form @@ -8,6 +8,10 @@ true + + <key>ru</key> + <value>Группа пользовательских настроек</value> + ГруппаПользовательскихНастроекРасширеннаяПодсказка 161 @@ -472,10 +476,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 159 @@ -503,6 +503,10 @@ ГруппыПользователей 25 + + <key>ru</key> + <value>Группы пользователей</value> + true true @@ -754,9 +758,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -861,7 +862,7 @@ <key>ru</key> - <value>Группа выбрать группу</value> + <value>Выбрать группу</value> true @@ -892,7 +893,7 @@
    <key>ru</key> - <value>Группа группы</value> + <value>Группы</value> ГруппаГруппыExtendedTooltip @@ -919,6 +920,10 @@ ПользователиСписок 48 + + <key>ru</key> + <value>Пользователи список</value> + true true @@ -1322,9 +1327,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -1429,7 +1431,7 @@ <key>ru</key> - <value>Группа выбрать пользователя</value> + <value>Выбрать пользователя</value> true @@ -1460,7 +1462,7 @@ <key>ru</key> - <value>Группа пользователи</value> + <value>Пользователи</value> ГруппаПользователиExtendedTooltip @@ -1705,9 +1707,6 @@ CommonPicture.СостоянияПользователей - None - None - None true @@ -1749,10 +1748,6 @@ ru Группа - - ru - Группа - ГруппаExtendedTooltip 108 @@ -1859,12 +1854,8 @@ <key>ru</key> - <value>Группа показывать пользователей дочерних групп и недействительных</value> + <value>Показывать пользователей дочерних групп и недействительных</value> - - ru - Группа показывать пользователей дочерних групп и недействительных - ГруппаПоказыватьПользователейДочернихГруппИНедействительныхРасширеннаяПодсказка 130 @@ -2414,24 +2405,6 @@ true - - ИмяТекущегоЭлемента - - <key>ru</key> - <value>Имя текущего элемента</value> - - 6 - - String - - - - true - - - true - - ПоказыватьНедействительныхПользователей diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl index d35f4a785..62e380232 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl @@ -14,6 +14,13 @@ // ВыбранныеПользователи - Массив - массив уже выбранных пользователей. // +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПоследнийЭлемент; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -85,7 +92,7 @@ Элементы.СоздатьПользователя.Видимость = Ложь; КонецЕсли; - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда Элементы.ПользователиИБ.Видимость = Ложь; @@ -138,7 +145,8 @@ ХранимыеПараметры.Удалить("ТекущаяСтрока"); Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Или Не Пользователи.ЭтоПолноправныйПользователь() + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ФормаИзменитьВыделенные.Видимость = Ложь; Элементы.ПользователиСписокКонтекстноеМенюИзменитьВыделенные.Видимость = Ложь; @@ -154,7 +162,7 @@ Элементы.ПользователиСписокКонтекстноеМенюУстановитьПароль.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; Элементы.ГруппыПользователей.ТолькоПросмотр = Истина; КонецЕсли; @@ -545,7 +553,7 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); - МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.ПользователиСписок); + МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.ПользователиСписок, ПользователиСписок); КонецЕсли; КонецПроцедуры @@ -566,21 +574,18 @@ Процедура ОформитьИСкрытьНедействительныхПользователей() // Оформление. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементОформления = ПользователиСписок.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить(); + ЭлементОформления.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); + ЭлементЦветаОформления = ЭлементОформления.Оформление.Элементы.Найти("TextColor"); ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; ЭлементЦветаОформления.Использование = Истина; - ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиСписок.Недействителен"); - ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбораДанных.ПравоеЗначение = Истина; - ЭлементОтбораДанных.Использование = Истина; - - ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПользователиСписок"); - ЭлементОформляемогоПоля.Использование = Истина; + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Недействителен"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Истина; + ЭлементОтбора.Использование = Истина; // Скрытие. ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( @@ -603,13 +608,11 @@ ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Предопределенный"); ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ЭлементПорядка.Использование = Истина; ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Наименование"); ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ЭлементПорядка.Использование = Истина; КонецПроцедуры @@ -630,9 +633,9 @@ &НаКлиенте Процедура ПроверкаИзмененияТекущегоЭлементаФормы() - Если ТекущийЭлемент.Имя <> ИмяТекущегоЭлемента Тогда + Если ТекущийЭлемент <> ПоследнийЭлемент Тогда ПриИзмененииТекущегоЭлементаФормы(); - ИмяТекущегоЭлемента = ТекущийЭлемент.Имя; + ПоследнийЭлемент = ТекущийЭлемент; КонецЕсли; #Если ВебКлиент Тогда @@ -646,10 +649,10 @@ &НаКлиенте Процедура ПриИзмененииТекущегоЭлементаФормы() - Если ТекущийЭлемент.Имя = "ГруппыПользователей" Тогда + Если ТекущийЭлемент = Элементы.ГруппыПользователей Тогда Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийГруппы; - ИначеЕсли ТекущийЭлемент.Имя = "ПользователиСписок" Тогда + ИначеЕсли ТекущийЭлемент = Элементы.ПользователиСписок Тогда Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийПользователя; КонецЕсли @@ -838,7 +841,7 @@ Если Не Пользователи.РолиДоступны("ДобавлениеИзменениеПользователей") Или ХранимыеПараметры.РасширенныйПодбор - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.НазначитьГруппы.Видимость = Ложь; Элементы.ПользователиСписокКонтекстноеМенюНазначитьГруппы.Видимость = Ложь; @@ -850,7 +853,7 @@ Элементы.СоздатьГруппуПользователей.Видимость = ПравоДоступа("Добавление", Метаданные.Справочники.ГруппыПользователей) И ХранимыеПараметры.ИспользоватьГруппы - И Не ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто(); + И Не ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); ВыборГруппПользователей = ХранимыеПараметры.ВыборГруппПользователей И ХранимыеПараметры.ИспользоватьГруппы diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form index 652384875..88ec47479 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form @@ -86,7 +86,7 @@ </userVisible> <title> <key>ru</key> - <value>Группа служебный пользователь</value> + <value>Служебный пользователь</value> ГруппаСлужебныйПользовательРасширеннаяПодсказка @@ -543,7 +543,7 @@ <key>ru</key> - <value>Группа наименование</value> + <value>Наименование</value> ГруппаНаименованиеРасширеннаяПодсказка @@ -653,7 +653,7 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> ГруппаШапкаРасширеннаяПодсказка @@ -758,7 +758,7 @@ <key>ru</key> - <value>Группа изменить ограничение</value> + <value>Изменить ограничение</value> ГруппаИзменитьОграничениеРасширеннаяПодсказка @@ -829,7 +829,7 @@ <key>ru</key> - <value>Группа вход в программу разрешен</value> + <value>Вход в программу разрешен</value> ГруппаВходВПрограммуРазрешенРасширеннаяПодсказка @@ -902,10 +902,8 @@ Left true - 28 true true - false true true true @@ -979,10 +977,8 @@ Left true - 28 true true - false true true true @@ -1196,7 +1192,7 @@ <key>ru</key> - <value>Группа пароль</value> + <value>Пароль</value> ГруппаПарольРасширеннаяПодсказка @@ -1229,6 +1225,7 @@ ПотребоватьСменуПароляПриВходе Right + Button OnChange ПотребоватьСменуПароляПриВходеПриИзменении @@ -1236,10 +1233,15 @@ ПотребоватьСменуПароляПриВходеРасширеннаяПодсказка 318 + true Label true true + + URLProcessing + ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки + Left @@ -1374,7 +1376,7 @@ <key>ru</key> - <value>Группа отступ</value> + <value>Отступ</value> ГруппаОтступРасширеннаяПодсказка @@ -1400,6 +1402,10 @@ true + + <key>ru</key> + <value>Свойства аутентификации 1С предприятия</value> + СвойстваАутентификации1СПредприятияExtendedTooltip 223 @@ -1623,10 +1629,8 @@ StartChoice ПользовательИБПользовательОСНачалоВыбора - 28 true true - false true true true @@ -1708,7 +1712,6 @@ ПользовательИБЯзык - 2 OnChange ПользовательИБЯзыкПриИзменении @@ -1735,7 +1738,6 @@ true Left - 20 true true true @@ -1789,7 +1791,6 @@ Clearing ПользовательИБРежимЗапускаОчистка - 20 true true true @@ -2247,9 +2248,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true
    true @@ -2472,8 +2470,85 @@ ФормаКоманднаяПанель -1 + + ФормаЗаписатьИЗакрыть + 345 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 346 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + PictureAndText + true + true + true + UserCmds + Auto + + + КомандыФормы + 347 + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + КомандыФормыРасширеннаяПодсказка + 348 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 349 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 350 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + Left - true NotificationProcessing @@ -2495,6 +2570,7 @@ BeforeLoadDataFromSettingsAtServer ПриЗагрузкеДанныхИзНастроекНаСервере + WriteAndClose DontBlock Use true @@ -2976,7 +3052,8 @@ ПользовательИБЯзык <key>ru</key> - <value>Язык интерфейса программы</value> + <value>Язык интерфейса +программы</value> 15 @@ -3297,6 +3374,25 @@ true + + ПользовательИБОсновнойИнтерфейс + + <key>ru</key> + <value>Основной интерфейс</value> + + 42 + + String + + + + true + + + true + + true + ПоказатьТолькоВыбранныеРоли @@ -3466,6 +3562,28 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ЗаписатьИЗакрыть</name> + <title> + <key>ru</key> + <value>Записать и закрыть</value> + + 8 + + ru + Записать объект и закрыть форму + + + true + + + + ЗаписатьИЗакрыть + + + DontUse + Auto + ГруппаНовогоПользователя diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl index c596a23a3..441d2da49 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -1,3 +1,9 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПараметрыЗаписиПриПроверкеПервогоАдминистратора; + +#КонецОбласти #Область ОбработчикиСобытийФормы @@ -10,7 +16,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ДоступноИзменениеПользователей = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда @@ -94,7 +100,7 @@ Если Не ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда ПользовательИБАутентификацияСтандартная = Истина; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ПользовательИБПоказыватьВСпискеВыбора = Ложь; ПользовательИБАутентификацияOpenID = Истина; КонецЕсли; @@ -122,9 +128,9 @@ ПереопределитьРедактированиеКонтактнойИнформацииВСервисе(); КонецЕсли; - ОбщаяНастройкаФормы(Истина); + ОбщаяНастройкаФормы(Объект, Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ГруппаШапка.ТолькоПросмотр = Истина; Элементы.КонтактнаяИнформация.ТолькоПросмотр = Истина; Элементы.СтраницаДополнительныеРеквизиты.ТолькоПросмотр = Истина; @@ -153,6 +159,9 @@ Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда Элементы.ГруппаИзменитьОграничение.Видимость = Ложь; + Элементы.ПотребоватьСменуПароляПриВходе.Видимость = Ложь; + Иначе + Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок = ПодсказкаПотребоватьСменуПароляПриВходе(); КонецЕсли; КонецПроцедуры @@ -203,7 +212,7 @@ МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект, "КонтактнаяИнформация"); КонецЕсли; - ОбщаяНастройкаФормы(); + ОбщаяНастройкаФормы(ТекущийОбъект); КонецПроцедуры @@ -211,9 +220,28 @@ Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) ОчиститьСообщения(); + ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'"); + + // Копирование прав пользователя. + Если ЗначениеЗаполнено(ЗначениеКопирования) + И Не ЗначениеЗаполнено(Объект.Ссылка) + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") + И (Не ПараметрыЗаписи.Свойство("НеКопироватьПраваПользователя") + И Не ПараметрыЗаписи.Свойство("КопироватьПраваПользователя")) Тогда + + Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеОтветаНаВопросОКопированииПрав", ЭтотОбъект, ПараметрыЗаписи), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопировать также права пользователя ""%1""?'"), Строка(ЗначениеКопирования)), + РежимДиалогаВопрос.ДаНет, + , + , + ЗаголовокВопросов); + Возврат; + КонецЕсли; Если ВходВПрограммуРазрешен Тогда - ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'"); Если ДействияВФорме.Роли = "Редактирование" И ПользовательИБРоли.Количество() = 0 Тогда @@ -233,23 +261,19 @@ // Обработка записи первого администратора. Если НЕ ПараметрыЗаписи.Свойство("ССозданиемПервогоАдминистратора") Тогда - ТекстВопроса = ""; - Если ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда - Отказ = Истина; - ПоказатьВопрос( - Новый ОписаниеОповещения("ПослеПодтвержденияСозданияПервогоАдминистратора", ЭтотОбъект, ПараметрыЗаписи), - ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопросов); - Возврат; - КонецЕсли; + Отказ = Истина; + ПараметрыЗаписиПриПроверкеПервогоАдминистратора = ПараметрыЗаписи; + ПодключитьОбработчикОжидания("ПроверитьПервогоАдминистратора", 0.1, Истина); + Возврат; КонецЕсли; КонецЕсли; - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ТребуетсяСинхронизацияССервисом И ПарольПользователяСервиса = Неопределено Тогда Отказ = Истина; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("ПослеЗапросаПароляДляАутентификацииВСервисеПередЗаписью", ЭтотОбъект, ПараметрыЗаписи), ЭтотОбъект, ПарольПользователяСервиса); @@ -309,6 +333,15 @@ УстановитьПривилегированныйРежим(Истина); ПользователиСлужебный.ЗаписатьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); + УстановитьПривилегированныйРежим(Ложь); + + Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда + Источник = ЗначениеКопирования; + Приемник = ТекущийОбъект.Ссылка; + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник); + ПользователиСлужебный.СкопироватьГруппыПользователя(Источник, Приемник); + КонецЕсли; КонецПроцедуры @@ -322,7 +355,7 @@ ТекущийОбъект.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия); КонецЕсли; - ОбщаяНастройкаФормы(, ПараметрыЗаписи); + ОбщаяНастройкаФормы(ТекущийОбъект, , ПараметрыЗаписи); ОбновитьСпособИзмененияEMailВСервисе(); @@ -355,6 +388,10 @@ ГруппаНовогоПользователя = Неопределено; КонецЕсли; + Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -410,7 +447,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, Объект, Отказ); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ПроверитьЗаполнениеEmail(Отказ); КонецЕсли; КонецЕсли; @@ -506,6 +543,17 @@ КонецПроцедуры +&НаКлиенте +Процедура ПользовательИБИмяПриИзменении(Элемент) + + ПользовательИБИмя = СокрЛП(ПользовательИБИмя); + ПользовательИБИмяЗначениеПрямогоИзменения = ПользовательИБИмя; + + УстановитьДоступностьСвойств(ЭтотОбъект); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); + +КонецПроцедуры + &НаКлиенте Процедура ПользовательИБАутентификацияСтандартнаяПриИзменении(Элемент) @@ -570,17 +618,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПользовательИБИмяПриИзменении(Элемент) - - ПользовательИБИмя = СокрЛП(ПользовательИБИмя); - ПользовательИБИмяЗначениеПрямогоИзменения = ПользовательИБИмя; - - УстановитьДоступностьСвойств(ЭтотОбъект); - УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); - -КонецПроцедуры - &НаКлиенте Процедура ПользовательИБЯзыкПриИзменении(Элемент) @@ -626,6 +663,13 @@ КонецПроцедуры +&НаКлиенте +Процедура ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", , ЭтотОбъект); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Поддержка контактной информации. @@ -650,9 +694,9 @@ Если ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]) Тогда ПользовательИБПароль = "" + Новый УникальныйИдентификатор + "qQ"; + УстановитьНаличиеПароля(ЭтотОбъект, Истина); КонецЕсли; - УстановитьНаличиеПароля(ЭтотОбъект, ЗначениеЗаполнено(ПользовательИБПароль)); УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -687,8 +731,12 @@ &НаКлиенте Процедура Подключаемый_EMailНачалоВыбора(Элемент) + Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда + Возврат; + КонецЕсли; + Если ПарольПользователяСервиса = Неопределено Тогда - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("Подключаемый_EMailНачалоВыбораЗавершение", ЭтотОбъект), ЭтотОбъект, ПарольПользователяСервиса); @@ -699,7 +747,7 @@ КонецПроцедуры &НаКлиенте -Процедура Подключаемый_EMailНачалоВыбораЗавершение(НовыйПарольПользователяСервиса, Неопределен) Экспорт +Процедура Подключаемый_EMailНачалоВыбораЗавершение(НовыйПарольПользователяСервиса, Контекст) Экспорт Если НовыйПарольПользователяСервиса = Неопределено Тогда Возврат; @@ -721,7 +769,8 @@ ПараметрыФормы.Вставить("Пользователь", Объект.Ссылка); Попытка - ОткрытьФорму("Справочник.Пользователи.Форма.СменаПочты", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Справочник.Пользователи.Форма.СменаПочты", ПараметрыФормы, ЭтотОбъект,,,, + Новый ОписаниеОповещения("ПослеСменыПочты", ЭтотОбъект)); Исключение ПарольПользователяСервиса = Неопределено; ВызватьИсключение; @@ -799,10 +848,30 @@ КонецПроцедуры +&НаКлиенте +Процедура РолиПометкаПриИзмененииПослеПодтверждения(Ответ, ПараметрыВыполнения) Экспорт + СтрокаТаблицы = Элементы.Роли.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + Если Ответ = "Продолжить" Тогда + ОбработатьИнтерфейсРолей("ОбновитьСоставРолей"); + Иначе + СтрокаТаблицы.Пометка = Ложь; + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Записать(Новый Структура("ЗаписатьИЗакрыть")); + +КонецПроцедуры + &НаКлиенте Процедура СменитьПароль(Команда) @@ -854,11 +923,11 @@ // Поддержка дополнительных реквизитов. &НаКлиенте -Процедура Подключаемый_РедактироватьСоставСвойств() +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); КонецЕсли; КонецПроцедуры @@ -867,19 +936,6 @@ #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура РолиПометкаПриИзмененииПослеПодтверждения(Ответ, ПараметрыВыполнения) Экспорт - СтрокаТаблицы = Элементы.Роли.ТекущиеДанные; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - Если Ответ = "Продолжить" Тогда - ОбработатьИнтерфейсРолей("ОбновитьСоставРолей"); - Иначе - СтрокаТаблицы.Пометка = Ложь; - КонецЕсли; -КонецПроцедуры - &НаСервере Процедура УстановитьУсловноеОформление() @@ -945,13 +1001,13 @@ Процедура ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора() Элементы.ПользовательИБПоказыватьВСпискеВыбора.Видимость = - Не ОбщегоНазначенияПовтИсп.РазделениеВключено() + Не ОбщегоНазначения.РазделениеВключено() И Не ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей") КонецПроцедуры &НаСервере -Процедура ОбщаяНастройкаФормы(ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) +Процедура ОбщаяНастройкаФормы(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) Если НачальноеОписаниеПользователяИБ = Неопределено Тогда Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере. @@ -965,7 +1021,7 @@ ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); УстановитьПривилегированныйРежим(Ложь); - УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(Объект); + УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); ОпределитьДействияВФорме(); @@ -976,12 +1032,12 @@ Или ДействияВФорме.Роли <> "Редактирование" Или Не УровеньДоступа.НастройкиДляВхода); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); ДействияСПользователемСервиса = МодульПользователиСлужебныйВМоделиСервиса.ПолучитьДействияСПользователемСервиса( - Объект.Ссылка); + ТекущийОбъект.Ссылка); КонецЕсли; // Настройка возможности просмотра. @@ -994,13 +1050,15 @@ ?(ВыводитьСписокРолей, ОтображениеОбычнойГруппы.Нет, ОтображениеОбычнойГруппы.ОбычноеВыделение); Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = - УровеньДоступа.ИзменениеРазрешенияНаВход И Объект.Подготовлен И Не ПриЧтенииВходВПрограммуРазрешен; + УровеньДоступа.ИзменениеРазрешенияНаВход + И ТекущийОбъект.Подготовлен + И Не ПриЧтенииВходВПрограммуРазрешен; // Настройка возможности изменения. - Если Объект.Служебный Тогда + Если ТекущийОбъект.Служебный Тогда ТолькоПросмотр = Истина; КонецЕсли; - Элементы.ГруппаСлужебныйПользователь.Видимость = Объект.Служебный; + Элементы.ГруппаСлужебныйПользователь.Видимость = ТекущийОбъект.Служебный; ТолькоПросмотр = ТолькоПросмотр ИЛИ ДействияВФорме.Роли <> "Редактирование" @@ -1008,6 +1066,8 @@ И ДействияВФорме.КонтактнаяИнформация <> "Редактирование" И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование"; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); + Элементы.Наименование.ТолькоПросмотр = Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком); @@ -1129,6 +1189,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеСменыПочты(Результат, Контекст) Экспорт + + Если Результат = "" Тогда + ПарольПользователяСервиса = Неопределено; + КонецЕсли; + +КонецПроцедуры + // Продолжение процедуры СменитьПароль. &НаКлиенте Процедура СменитьПарольПослеПолученияПароля(Результат, Контекст) Экспорт @@ -1141,7 +1210,7 @@ ПользовательИБСтарыйПароль = Результат.СтарыйПароль; Если Результат.СтарыйПароль <> Неопределено Тогда - ПарольПользователяСервиса = Результат.СтарыйПароль; + ПарольПользователяСервиса = Результат.СтарыйПароль; КонецЕсли; УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); @@ -1345,9 +1414,8 @@ РолиАдминистратора.Добавить("ПолныеПрава"); КонецЕсли; - ИмяРолиАдминистратораСистемы = Пользователи.РольАдминистратораСистемы().Имя; - Если РолиАдминистратора.Найти(ИмяРолиАдминистратораСистемы) = Неопределено Тогда - РолиАдминистратора.Добавить(ИмяРолиАдминистратораСистемы); + Если РолиАдминистратора.Найти("АдминистраторСистемы") = Неопределено Тогда + РолиАдминистратора.Добавить("АдминистраторСистемы"); КонецЕсли; Результат.Вставить("Роли", РолиАдминистратора); КонецЕсли; @@ -1381,6 +1449,31 @@ КонецПроцедуры +&НаКлиенте +Процедура ПроверитьПервогоАдминистратора() + + ПараметрыЗаписи = ПараметрыЗаписиПриПроверкеПервогоАдминистратора; + ПараметрыЗаписиПриПроверкеПервогоАдминистратора = Неопределено; + + ТекстВопроса = ""; + Если Не ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда + ПараметрыЗаписи.Вставить("ССозданиемПервогоАдминистратора"); + Попытка + Записать(ПараметрыЗаписи); + Исключение + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + КонецПопытки; + Возврат; + КонецЕсли; + + ЗаголовокВопроса = НСтр("ru = 'Запись пользователя информационной базы'"); + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеПодтвержденияСозданияПервогоАдминистратора", ЭтотОбъект, ПараметрыЗаписи), + ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса); + +КонецПроцедуры + &НаКлиенте Процедура ПослеПодтвержденияСозданияПервогоАдминистратора(Ответ, ПараметрыЗаписи) Экспорт @@ -1391,6 +1484,53 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеОтветаНаВопросОКопированииПрав(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("КопироватьПраваПользователя"); + Иначе + ПараметрыЗаписи.Вставить("НеКопироватьПраваПользователя"); + КонецЕсли; + Записать(ПараметрыЗаписи); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму() + + Закрыть(); + +КонецПроцедуры + +&НаСервере +Функция ПодсказкаПотребоватьСменуПароляПриВходе() + ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(, Ложь); + + Подсказка = Новый Массив; + Подсказка.Добавить(НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно.'")); + Подсказка.Добавить(Символы.ПС); + Подсказка.Добавить(НСтр("ru = 'См.'")); + Подсказка.Добавить(" "); + + Ссылка = НСтр("ru = 'Настройки входа пользователей'"); + Если ЭтоПолноправныйПользователь Тогда + Ссылка = Новый ФорматированнаяСтрока(Ссылка,,,, "НастройкиВходаПользователей"); + КонецЕсли; + Подсказка.Добавить(Ссылка); + + Если ЭтоПолноправныйПользователь + И Метаданные.Подсистемы.Найти("Администрирование") <> Неопределено Тогда + Подсказка.Добавить(" "); + Подсказка.Добавить(НСтр("ru = 'в разделе Администрирование, + |пункт Настройки прав и пользователей.'")); + Иначе + Подсказка.Добавить("."); + КонецЕсли; + + Возврат Новый ФорматированнаяСтрока(Подсказка); +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Поддержка контактной информации. @@ -1408,7 +1548,7 @@ &НаСервере Процедура ПереопределитьРедактированиеКонтактнойИнформацииВСервисе() - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -1433,7 +1573,7 @@ &НаСервере Процедура ОбновитьСпособИзмененияEMailВСервисе() - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -1533,7 +1673,7 @@ ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь; Иначе ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = @@ -1560,9 +1700,8 @@ Если ПриКопированииЭлемента Тогда - Если Пользователи.ПрочитатьПользователяИБ( - Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ, - ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда // Сопоставление пользователя ИБ с пользователем в справочнике. Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда @@ -1576,7 +1715,7 @@ ПрочитанныеСвойства, "ЗапрещеноИзменятьПароль, |ПоказыватьВСпискеВыбора, - |РежимЗапуска, + |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", |Роли")); @@ -1584,8 +1723,8 @@ Объект.ИдентификаторПользователяИБ = Неопределено; УстановитьНаличиеПароля(ЭтотОбъект, Ложь); Иначе - Если Пользователи.ПрочитатьПользователяИБ( - Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда ПользовательИБСуществует = Истина; ПользовательИБОсновной = Истина; @@ -1594,9 +1733,8 @@ И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; - - Если Пользователи.ПрочитатьПользователяИБ( - Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства) Тогда + ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); + Если ПрочитанныеСвойства <> Неопределено Тогда ПользовательИБСуществует = Истина; Если Объект.Наименование <> ПрочитанныеСвойства.ПолноеИмя Тогда @@ -1624,12 +1762,17 @@ |ЗапрещеноИзменятьПароль, |АутентификацияОС, |ПользовательОС, + |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", |Роли")); КонецЕсли; - УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен); + Если ПрочитанныеСвойства = Неопределено Тогда + УстановитьНаличиеПароля(ЭтотОбъект, Ложь); + Иначе + УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен); + КонецЕсли; КонецЕсли; Пользователи.СкопироватьСвойстваПользователяИБ( diff --git a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl index 28f00aebf..aa4edcc1a 100644 --- a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -19,6 +23,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl index b5d86c699..fba5f4afd 100644 --- a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl @@ -88,7 +88,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоПользователя.ПолучитьОбъект(); diff --git a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl index ef8967dd2..2ab395617 100644 --- a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -15,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ПользовательскиеНастройкиОтчетов.mdo b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ПользовательскиеНастройкиОтчетов.mdo index 35b52e9e0..4f8da0b34 100644 --- a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ПользовательскиеНастройкиОтчетов.mdo +++ b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ПользовательскиеНастройкиОтчетов.mdo @@ -133,6 +133,7 @@ Пользователь + CatalogRef.ВнешниеПользователи CatalogRef.Пользователи diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form index ec4e06885..ca92466eb 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form @@ -93,12 +93,8 @@ <key>ru</key> - <value>Группа для папки</value> + <value>Для папки</value> - - ru - Группа для папки - ГруппаДляПапкиExtendedTooltip 23 @@ -121,6 +117,10 @@ ПрименяемыеПравила 1 + + <key>ru</key> + <value>Применяемые правила</value> + true true @@ -388,12 +388,8 @@ <key>ru</key> - <value>Группа стандартные команды</value> + <value>Стандартные команды</value> - - ru - Группа стандартные команды - ГруппаСтандартныеКомандыExtendedTooltip 30 @@ -517,9 +513,6 @@ true true true - None - None - None true diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form index fc385b01a..7c3b21bcb 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -14,10 +14,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 26 @@ -42,6 +38,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -277,9 +277,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -338,17 +335,21 @@ ФормаКоманднаяПанель -1 - - СписокПереместитьВариантОтветаВверх - 6 + + НастройкаПорядкаЭлементов + 36 true true true + + <key>ru</key> + <value>Настройка порядка элементов</value> + - СписокПереместитьВариантОтветаВверхExtendedTooltip - 15 + НастройкаПорядкаЭлементовРасширеннаяПодсказка + 37 Label true true @@ -356,39 +357,7 @@ Left - Form.Command.ПереместитьПравилоВверх - Normal - Auto - true - true - UserCmds - Auto -
    - - СписокПереместитьВариантОтветаВниз - 7 - true - true - - true - - - СписокПереместитьВариантОтветаВнизExtendedTooltip - 16 - Label - true - true - - Left - - - Form.Command.ПереместитьПравилоВниз - Normal - Auto - true - true - UserCmds - Auto + ФормаПрименитьПравила @@ -465,56 +434,6 @@ true - - ПереместитьПравилоВверх - - <key>ru</key> - <value>Переместить правило вверх</value> - - 1 - - ru - Переместить правило вверх - - - true - - - StdPicture.MoveUp - - - - ПереместитьЭлементВверх - - - DontUse - Auto - - - ПереместитьПравилоВниз - - <key>ru</key> - <value>Переместить правило вниз</value> - - 2 - - ru - Переместить правило вниз - - - true - - - StdPicture.MoveDown - - - - ПереместитьЭлементВниз - - - DontUse - Auto - ПрименитьПравила diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl index 382fc07e4..612680af6 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl @@ -15,8 +15,7 @@ ТолькоПросмотр = Истина; Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаПрименитьПравила.Видимость = Ложь; - Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.СписокПереместитьВариантОтветаВверх.Видимость = Ложь; - Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.СписокПереместитьВариантОтветаВниз.Видимость = Ложь; + Элементы.НастройкаПорядкаЭлементов.Видимость = Ложь; КонецЕсли; @@ -26,6 +25,10 @@ КонецЕсли; + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + КонецПроцедуры #КонецОбласти @@ -52,22 +55,21 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Команды подсистемы настройка порядка элементов для подчиненного справочника. -// - +// СтандартныеПодсистемы.ПодключаемыеКоманды &НаКлиенте -Процедура ПереместитьЭлементВверх(Команда) - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(Список, Элементы.Список); - +Процедура Подключаемый_ВыполнитьКоманду(Команда) + ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список); +КонецПроцедуры + +&НаСервере +Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат); КонецПроцедуры &НаКлиенте -Процедура ПереместитьЭлементВниз(Команда) - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(Список, Элементы.Список); - +Процедура Подключаемый_ОбновитьКоманды() + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список); КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды #КонецОбласти diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index 584b1190b..47658c8cc 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -105,6 +105,10 @@ <items xsi:type="form:Table"> <name>КомпоновщикНастроекНастройкиОтбор</name> <id>11</id> + <title> + <key>ru</key> + <value>Компоновщик настроек настройки отбор</value> + true true @@ -258,9 +262,6 @@ true true true - None - None - None true All false diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl index 17a050c75..1521c0889 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl @@ -1,6 +1,6 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Применяет правила обработки писем. // @@ -83,8 +83,7 @@ Выборка = Результат[1].Выбрать(); Пока Выборка.Следующий() Цикл - СхемаПравилаОбработки = - Справочники.ПравилаОбработкиЭлектроннойПочты.ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); + СхемаПравилаОбработки = ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; @@ -143,8 +142,9 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -164,6 +164,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Templates/СхемаПравилаОбработкиЭлектроннойПочты/Template.dcs b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Templates/СхемаПравилаОбработкиЭлектроннойПочты/Template.dcs index 2547743b3..0904a3893 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Templates/СхемаПравилаОбработкиЭлектроннойПочты/Template.dcs +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Templates/СхемаПравилаОбработкиЭлектроннойПочты/Template.dcs @@ -19,6 +19,12 @@ Тема Тема + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тема</v8:content> + </v8:item> + АдресЭлектроннойПочтыОтправителя @@ -35,6 +41,12 @@ ТипПисьма ТипПисьма + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип письма</v8:content> + </v8:item> + Рассмотрено diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl index 78608f7a7..2f0bb2540 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl @@ -2,11 +2,31 @@ #Область ПрограммныйИнтерфейс -// Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Имена реквизитов справочника, значения которых разрешено изменять массово. // -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. +// Возвращаемое значение: +// Массив (Строка) - Имена реквизитов справочника. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + + Возврат Результат; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Имена реквизитов справочника, в разрезе которых контролируется уникальность элементов. +// +// Возвращаемое значение: +// Массив (Строка) - Имена реквизитов справочника. // Функция ПоляЕстественногоКлюча() Экспорт @@ -19,18 +39,9 @@ КонецФункции -// Возвращает реквизиты объекта, которые разрешается редактировать -// с помощью обработки группового изменения реквизитов. -// -// Возвращаемое значение: -// Массив - список имен реквизитов объекта. -Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - - Результат = Новый Массив; - - Возврат Результат; - -КонецФункции +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти #КонецОбласти diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ObjectModule.bsl index 7814ad1f9..5bf541418 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ObjectModule.bsl @@ -10,27 +10,24 @@ Возврат; КонецЕсли; Если Не ДополнительныеСвойства.Свойство("ЗаполнениеПредопределенных") Тогда - ВызватьИсключение НСтр("ru = 'Справочник ""Предопределенные варианты отчетов"" изменяется только при автоматическом заполнении его данных.'"); + ВызватьИсключение НСтр("ru = 'Запись в справочник ""Предопределенные варианты отчетов"" запрещена. Его данные заполняются автоматически.'"); КонецЕсли; КонецПроцедуры // Базовые проверки корректности данных предопределенных вариантов отчетов. Процедура ПроверитьЗаполнениеПредопределенного(Отказ) + Если ПометкаУдаления Тогда Возврат; - ИначеЕсли Не ЗначениеЗаполнено(Отчет) Тогда - ТекстОшибки = НеЗаполненоПоле("Отчет"); - Иначе + КонецЕсли; + Если ЗначениеЗаполнено(Отчет) Тогда Возврат; КонецЕсли; - Отказ = Истина; - ВариантыОтчетов.ОшибкаПоВарианту(Ссылка, ТекстОшибки); + + ВызватьИсключение НСтр("ru = 'Не заполнено поле ""Отчет""'"); + КонецПроцедуры -Функция НеЗаполненоПоле(ИмяПоля) - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не заполнено поле ""%1""'"), ИмяПоля); -КонецФункции - #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl index 78608f7a7..2f0bb2540 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl @@ -2,11 +2,31 @@ #Область ПрограммныйИнтерфейс -// Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Имена реквизитов справочника, значения которых разрешено изменять массово. // -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. +// Возвращаемое значение: +// Массив (Строка) - Имена реквизитов справочника. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + + Возврат Результат; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Имена реквизитов справочника, в разрезе которых контролируется уникальность элементов. +// +// Возвращаемое значение: +// Массив (Строка) - Имена реквизитов справочника. // Функция ПоляЕстественногоКлюча() Экспорт @@ -19,18 +39,9 @@ КонецФункции -// Возвращает реквизиты объекта, которые разрешается редактировать -// с помощью обработки группового изменения реквизитов. -// -// Возвращаемое значение: -// Массив - список имен реквизитов объекта. -Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - - Результат = Новый Массив; - - Возврат Результат; - -КонецФункции +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти #КонецОбласти diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form index 9ac228a60..a1ecd1c73 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form @@ -343,6 +343,10 @@ Boolean + + НеподписанныеДанные + + diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl index e584fdcc6..571703fa3 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl @@ -57,6 +57,11 @@ СброситьРазмерыИПоложениеОкна(); + Если ТипЗнч(Параметры.НеподписанныеДанные) = Тип("Структура") Тогда + ЭлектроннаяПодписьСлужебный.ЗарегистрироватьПодписаниеДанныхВЖурнале( + Параметры.НеподписанныеДанные, ОписаниеОшибки); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -104,7 +109,7 @@ #Область СлужебныеПроцедурыИФункции &НаКлиенте -Процедура СкопироватьВБуферОбменаЗавершение(Результат, Неопределен) Экспорт +Процедура СкопироватьВБуферОбменаЗавершение(Результат, Контекст) Экспорт Результат = ""; diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form index b8515284d..5904dae5f 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form @@ -84,12 +84,8 @@ <key>ru</key> - <value>Группа информация о программе</value> + <value>Информация о программе</value> - - ru - Группа информация о программе - ГруппаИнформацияОПрограммеРасширеннаяПодсказка 8 diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form index 4818b74c1..2b0d19736 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true @@ -168,9 +172,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -198,10 +199,6 @@ ru Стандартные команды - - ru - Стандартные команды - СтандартныеКомандыРасширеннаяПодсказка 11 diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl index a24136400..e439b86b3 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl @@ -1,3 +1,9 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем НаименованиеВыбраннойПрограммы; + +#КонецОбласти #Область ОбработчикиСобытийФормы @@ -116,8 +122,9 @@ Объект.АлгоритмШифрования = ""; КонецЕсли; - ЗаполнитьНастройкиВыбраннойПрограммы(ВыбранноеЗначение); - ЗаполнитьАлгоритмыВыбраннойПрограммы(); + НаименованиеВыбраннойПрограммы = ВыбранноеЗначение; + + ПодключитьОбработчикОжидания("ОбработчикОжиданияНаименованиеОбработкаВыбора", 0.1, Истина); КонецПроцедуры @@ -149,7 +156,7 @@ ПоказатьВопрос( Новый ОписаниеОповещения("УстановитьПометкуУдаленияПослеОтветаНаВопрос", ЭтотОбъект), - НСтр("ru = 'Для установки отметки удаления необходимо записать внесенные Вами изменения. + НСтр("ru = 'Для установки отметки удаления необходимо записать сделанные изменения. |Записать данные?'"), РежимДиалогаВопрос.ДаНет); КонецПроцедуры @@ -282,7 +289,7 @@ КонецПроцедуры &НаКлиенте -Процедура УстановитьПометкуУдаленияПослеОтветаНаВопрос(Ответ, Неопределен) Экспорт +Процедура УстановитьПометкуУдаленияПослеОтветаНаВопрос(Ответ, Контекст) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; @@ -306,4 +313,13 @@ КонецПроцедуры +// Продолжение процедуры НаименованиеОбработкаВыбора. +&НаКлиенте +Процедура ОбработчикОжиданияНаименованиеОбработкаВыбора() + + ЗаполнитьНастройкиВыбраннойПрограммы(НаименованиеВыбраннойПрограммы); + ЗаполнитьАлгоритмыВыбраннойПрограммы(); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl index 52f22dae0..41f072ee3 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -1,6 +1,10 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -13,6 +17,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли @@ -24,13 +32,21 @@ СтандартнаяОбработка = Ложь; Параметры.Вставить("ПоказатьСтраницуПрограммы"); ВыбраннаяФорма = Метаданные.ОбщиеФормы.НастройкиЭлектроннойПодписиИШифрования; - ИначеЕсли Параметры.Свойство("Ключ") И Параметры.Ключ.ЭтоПрограммаОблачногоСервиса Тогда + ИначеЕсли Параметры.Свойство("Ключ") + И Параметры.Ключ.ЭтоПрограммаОблачногоСервиса + И Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда СтандартнаяОбработка = Ложь; - ВыбраннаяФорма = "Справочник.ПрограммыЭлектроннойПодписиИШифрования.Форма.ПрограммаВОблачномСервисе"; + ВыбраннаяФорма = "Обработка.ПрограммыЭлектроннойПодписиИШифрования.Форма.ПрограммаВОблачномСервисе"; КонецЕсли; КонецПроцедуры +Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) + Если Не ЭлектроннаяПодписьСлужебныйВызовСервера.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Параметры.Отбор.Вставить("ЭтоПрограммаОблачногоСервиса", Ложь); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда @@ -51,66 +67,80 @@ Настройки.Колонки.Добавить("АлгоритмыХеширования", Новый ОписаниеТипов("Массив")); Настройки.Колонки.Добавить("АлгоритмыШифрования", Новый ОписаниеТипов("Массив")); - // ViPNet CSP (ГОСТ 2012) + // ViPNet CSP Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'ViPNet CSP (ГОСТ 2012)'"); - Настройка.ИмяПрограммы = "Infotecs GOST 2012/512 Cryptographic Service Provider"; - Настройка.ТипПрограммы = 77; - // Варианты: GOST 34.10-2012 256, GOST R 34.10-2001, GOST 34.11-2012 512. - Настройка.АлгоритмПодписи = "GOST 34.10-2012 256"; - // Варианты: GOST 34.11-2012 256, GOST R 34.11-94, GOST 34.11-2012 512. - Настройка.АлгоритмХеширования = "GOST 34.11-2012 256"; + Настройка.Представление = НСтр("ru = 'ViPNet CSP'"); + Настройка.ИмяПрограммы = "Infotecs Cryptographic Service Provider"; + Настройка.ТипПрограммы = 2; + // Варианты: GOST R 34.10-2001, GOST 34.10-2012 256, GOST 34.11-2012 512. + Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; + // Варианты: GOST R 34.11-94, GOST 34.11-2012 256, GOST 34.11-2012 512. + Настройка.АлгоритмХеширования = "GOST R 34.11-94"; Настройка.АлгоритмШифрования = "GOST 28147-89"; // Один вариант. - Настройка.Идентификатор = "VipNet2012"; + Настройка.Идентификатор = "VipNet"; - Настройка.АлгоритмыПодписи.Добавить("GOST 34.10-2012 256"); Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); + Настройка.АлгоритмыПодписи.Добавить("GOST 34.10-2012 256"); Настройка.АлгоритмыПодписи.Добавить("GOST 34.10-2012 512"); - Настройка.АлгоритмыХеширования.Добавить("GOST 34.11-2012 256"); Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); + Настройка.АлгоритмыХеширования.Добавить("GOST 34.11-2012 256"); Настройка.АлгоритмыХеширования.Добавить("GOST 34.11-2012 512"); Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - // КриптоПро CSP (ГОСТ 2012) + // КриптоПро CSP Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'КриптоПро CSP (ГОСТ 2012)'"); - Настройка.ИмяПрограммы = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider"; - Настройка.ТипПрограммы = 80; - Настройка.АлгоритмПодписи = "GR 34.10-2012 256"; - Настройка.АлгоритмХеширования = "GR 34.11-2012 256"; + Настройка.Представление = НСтр("ru = 'КриптоПро CSP'"); + Настройка.ИмяПрограммы = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"; + Настройка.ТипПрограммы = 75; + Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; + Настройка.АлгоритмХеширования = "GOST R 34.11-94"; Настройка.АлгоритмШифрования = "GOST 28147-89"; - Настройка.Идентификатор = "CryptoPro2012"; + Настройка.Идентификатор = "CryptoPro"; - Настройка.АлгоритмыПодписи.Добавить("GR 34.10-2012 256"); - Настройка.АлгоритмыХеширования.Добавить("GR 34.11-2012 256"); + Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); + Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - // ЛИССИ CSP (ГОСТ 2012) + // ЛИССИ CSP Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'ЛИССИ CSP (ГОСТ 2012)'"); - Настройка.ИмяПрограммы = "LISSI GOST R 34.10-2012 (256) CSP"; - Настройка.ТипПрограммы = 80; - Настройка.АлгоритмПодписи = "GOST R 34.10-12 256"; - Настройка.АлгоритмХеширования = "GOST R 34.11-12 256"; + Настройка.Представление = НСтр("ru = 'ЛИССИ CSP'"); + Настройка.ИмяПрограммы = "LISSI-CSP"; + Настройка.ТипПрограммы = 75; + Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; + Настройка.АлгоритмХеширования = "GOST R 34.11-94"; Настройка.АлгоритмШифрования = "GOST 28147-89"; - Настройка.Идентификатор = "Lissi2012"; + Настройка.Идентификатор = "Lissi"; - Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-12 256"); - Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-12 256"); + Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); + Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - // Сигнал-КОМ CSP (RFC 4357, ГОСТ 2012) + // Сигнал-КОМ CSP (RFC 4357) Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'Сигнал-КОМ CSP (ГОСТ 2012)'"); - Настройка.ИмяПрограммы = "Signal-COM GOST R 34.10-2012 (256) Cryptographic Provider"; - Настройка.ТипПрограммы = 80; - Настройка.АлгоритмПодписи = "GOST3410-12-256"; - Настройка.АлгоритмХеширования = "GOST3411-12-256"; + Настройка.Представление = НСтр("ru = 'Сигнал-КОМ CSP (RFC 4357)'"); + Настройка.ИмяПрограммы = "Signal-COM CPGOST Cryptographic Provider"; + Настройка.ТипПрограммы = 75; + Настройка.АлгоритмПодписи = "ECR3410-CP"; + Настройка.АлгоритмХеширования = "RUS-HASH-CP"; Настройка.АлгоритмШифрования = "GOST28147"; - Настройка.Идентификатор = "SignalComCPGOST2012"; + Настройка.Идентификатор = "SignalComCPGOST"; - Настройка.АлгоритмыПодписи.Добавить("GOST3410-12-256"); - Настройка.АлгоритмыХеширования.Добавить("GOST3411-12-256"); + Настройка.АлгоритмыПодписи.Добавить("ECR3410-CP"); + Настройка.АлгоритмыХеширования.Добавить("RUS-HASH-CP"); + Настройка.АлгоритмыШифрования.Добавить("GOST28147"); + + // Сигнал-КОМ CSP (ITU-T X.509 v.3). + Настройка = Настройки.Добавить(); + Настройка.Представление = НСтр("ru = 'Сигнал-КОМ CSP (ITU-T X.509 v.3)'"); + Настройка.ИмяПрограммы = "Signal-COM ECGOST Cryptographic Provider"; + Настройка.ТипПрограммы = 129; + Настройка.АлгоритмПодписи = "ECR3410"; + Настройка.АлгоритмХеширования = "RUS-HASH"; + Настройка.АлгоритмШифрования = "GOST28147"; + Настройка.Идентификатор = "SignalComECGOST"; + + Настройка.АлгоритмыПодписи.Добавить("ECR3410"); + Настройка.АлгоритмыХеширования.Добавить("RUS-HASH"); Настройка.АлгоритмыШифрования.Добавить("GOST28147"); // Microsoft Enhanced CSP @@ -133,343 +163,9 @@ Настройка.АлгоритмыШифрования.Добавить("DES"); Настройка.АлгоритмыШифрования.Добавить("3DES"); - // ViPNet CSP (ГОСТ 2001) - Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'ViPNet CSP (ГОСТ 2001)'"); - Настройка.ИмяПрограммы = "Infotecs Cryptographic Service Provider"; - Настройка.ТипПрограммы = 2; - // Варианты: GOST R 34.10-2001, GOST 34.10-2012 256, GOST 34.11-2012 512. - Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; - // Варианты: GOST R 34.11-94, GOST 34.11-2012 256, GOST 34.11-2012 512. - Настройка.АлгоритмХеширования = "GOST R 34.11-94"; - Настройка.АлгоритмШифрования = "GOST 28147-89"; // Один вариант. - Настройка.Идентификатор = "VipNet2001"; - - Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); - Настройка.АлгоритмыПодписи.Добавить("GOST 34.10-2012 256"); - Настройка.АлгоритмыПодписи.Добавить("GOST 34.10-2012 512"); - Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); - Настройка.АлгоритмыХеширования.Добавить("GOST 34.11-2012 256"); - Настройка.АлгоритмыХеширования.Добавить("GOST 34.11-2012 512"); - Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - - // КриптоПро CSP (ГОСТ 2001) - Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'КриптоПро CSP (ГОСТ 2001)'"); - Настройка.ИмяПрограммы = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"; - Настройка.ТипПрограммы = 75; - Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; - Настройка.АлгоритмХеширования = "GOST R 34.11-94"; - Настройка.АлгоритмШифрования = "GOST 28147-89"; - Настройка.Идентификатор = "CryptoPro2001"; - - Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); - Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); - Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - - // ЛИССИ CSP (ГОСТ 2001) - Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'ЛИССИ CSP (ГОСТ 2001)'"); - Настройка.ИмяПрограммы = "LISSI-CSP"; - Настройка.ТипПрограммы = 75; - Настройка.АлгоритмПодписи = "GOST R 34.10-2001"; - Настройка.АлгоритмХеширования = "GOST R 34.11-94"; - Настройка.АлгоритмШифрования = "GOST 28147-89"; - Настройка.Идентификатор = "Lissi2001"; - - Настройка.АлгоритмыПодписи.Добавить("GOST R 34.10-2001"); - Настройка.АлгоритмыХеширования.Добавить("GOST R 34.11-94"); - Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - - // Сигнал-КОМ CSP (RFC 4357, ГОСТ 2001) - Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'Сигнал-КОМ CSP (RFC 4357, ГОСТ 2001)'"); - Настройка.ИмяПрограммы = "Signal-COM CPGOST Cryptographic Provider"; - Настройка.ТипПрограммы = 75; - Настройка.АлгоритмПодписи = "ECR3410-CP"; - Настройка.АлгоритмХеширования = "RUS-HASH-CP"; - Настройка.АлгоритмШифрования = "GOST28147"; - Настройка.Идентификатор = "SignalComCPGOST2001"; - - Настройка.АлгоритмыПодписи.Добавить("ECR3410-CP"); - Настройка.АлгоритмыХеширования.Добавить("RUS-HASH-CP"); - Настройка.АлгоритмыШифрования.Добавить("GOST28147"); - - // Сигнал-КОМ CSP (ITU-T X.509 v.3, ГОСТ 2001). - Настройка = Настройки.Добавить(); - Настройка.Представление = НСтр("ru = 'Сигнал-КОМ CSP (ITU-T X.509 v.3, ГОСТ 2001)'"); - Настройка.ИмяПрограммы = "Signal-COM ECGOST Cryptographic Provider"; - Настройка.ТипПрограммы = 129; - Настройка.АлгоритмПодписи = "ECR3410"; - Настройка.АлгоритмХеширования = "RUS-HASH"; - Настройка.АлгоритмШифрования = "GOST28147"; - Настройка.Идентификатор = "SignalComECGOST2001"; - - Настройка.АлгоритмыПодписи.Добавить("ECR3410"); - Настройка.АлгоритмыХеширования.Добавить("RUS-HASH"); - Настройка.АлгоритмыШифрования.Добавить("GOST28147"); - Возврат Настройки; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы. - -Процедура ЗаполнитьНачальныеНастройки(Программы = Неопределено, БезОблачнойПрограммы = Ложь) Экспорт - - Если Программы = Неопределено Тогда - Программы = Новый Соответствие; - ДобавитьПрограммыНачальногоЗаполнения(Программы); - КонецЕсли; - - ОписаниеПрограмм = Новый Массив; - Для Каждого КлючИЗначение Из Программы Цикл - ОписаниеПрограмм.Добавить(ЭлектроннаяПодпись.НовоеОписаниеПрограммы( - КлючИЗначение.Ключ, КлючИЗначение.Значение)); - КонецЦикла; - - ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм(ОписаниеПрограмм); - - Если БезОблачнойПрограммы Тогда - Возврат; - КонецЕсли; - - ОбновитьПрограммуОблачногоСервиса(); - -КонецПроцедуры - -Процедура ДобавитьПрограммыНачальногоЗаполнения(Программы) - - Программы.Вставить("Infotecs GOST 2012/512 Cryptographic Service Provider", 77); - Программы.Вставить("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80); - Программы.Вставить("Infotecs Cryptographic Service Provider", 2); - Программы.Вставить("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", 75); - -КонецПроцедуры - -Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПрограммыЭлектроннойПодписиИШифрования.Ссылка - |ИЗ - | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования - |ГДЕ - | НЕ ПрограммыЭлектроннойПодписиИШифрования.ЭтоПрограммаОблачногоСервиса"; - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, ВыборкаДетальныеЗаписи.Ссылка); - КонецЦикла; - -КонецПроцедуры - -Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт - - ОбработкаЗавершена = Истина; - - ВыборкаДетальныеЗаписи = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, - "Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - - ОбъектовОбработано = 0; - ПроблемныхОбъектов = 0; - - ПоставляемыеНастройки = ПоставляемыеНастройкиПрограмм(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ОбновитьПредставлениеПрограммыОтложенно(ВыборкаДетальныеЗаписи.Ссылка, - ОбъектовОбработано, ПроблемныхОбъектов, ПоставляемыеНастройки); - КонецЦикла; - - ДозаполнитьНачальныеНастройкиОтложенно(ОбъектовОбработано, ПроблемныхОбъектов); - - Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.ПрограммыЭлектроннойПодписиИШифрования") Тогда - ОбработкаЗавершена = Ложь; - КонецЕсли; - - Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Процедуре Справочники.ОбработатьДанныеДляПереходаНаНовуюВерсию.ОбработатьДанныеДляПереходаНаНовуюВерсию не удалось обработать некоторые программы электронной подписи (пропущены): %1'"), - ПроблемныхОбъектов); - ВызватьИсключение ТекстСообщения; - Иначе - ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, - Метаданные.НайтиПоПолномуИмени("Справочник.ПрограммыЭлектроннойПодписиИШифрования"),, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Процедура Справочники.ОбработатьДанныеДляПереходаНаНовуюВерсию.ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию программ электронной подписи: %1'"), - ОбъектовОбработано)); - КонецЕсли; - - Параметры.ОбработкаЗавершена = ОбработкаЗавершена; - -КонецПроцедуры - -Процедура ОбновитьПредставлениеПрограммыОтложенно(Программа, ОбъектовОбработано, ПроблемныхОбъектов, ПоставляемыеНастройки) - - Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Свойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Программа, - "ИмяПрограммы, ТипПрограммы, Наименование, ЭтоПрограммаОблачногоСервиса"); - - Отбор = Новый Структура("ИмяПрограммы, ТипПрограммы", Свойства.ИмяПрограммы, Свойства.ТипПрограммы); - Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); - - Если Не Свойства.ЭтоПрограммаОблачногоСервиса - И Строки.Количество() = 1 - И Строки[0].Представление <> Свойства.Наименование Тогда - - ПрограммаОбъект = Программа.ПолучитьОбъект(); - ПрограммаОбъект.Наименование = Строки[0].Представление; - - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрограммаОбъект); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ПроблемныхОбъектов = ПроблемныхОбъектов + 1; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось обновить программу ""%1"" по причине: - |%2'"), Строка(Программа), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения); - Возврат; - КонецПопытки; - - ОбъектовОбработано = ОбъектовОбработано + 1; - ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Программа.Ссылка); - -КонецПроцедуры - -Процедура ДозаполнитьНачальныеНастройкиОтложенно(ОбъектовОбработано, ПроблемныхОбъектов) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПрограммыЭлектроннойПодписиИШифрования.ИмяПрограммы КАК ИмяПрограммы, - | ПрограммыЭлектроннойПодписиИШифрования.ТипПрограммы КАК ТипПрограммы - |ИЗ - | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования - |ГДЕ - | ПрограммыЭлектроннойПодписиИШифрования.ЭтоПрограммаОблачногоСервиса"; - - Программы = Новый Соответствие; - ДобавитьПрограммыНачальногоЗаполнения(Программы); - - Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Если Программы.Получить(Выборка.ИмяПрограммы) = Выборка.ТипПрограммы Тогда - Программы.Удалить(Выборка.ИмяПрограммы); - КонецЕсли; - КонецЦикла; - - ЗаполнитьНачальныеНастройки(Программы, Истина); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось дозаполнить начальные настройки программ по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ВызватьИсключение ТекстСообщения; - КонецПопытки; - - ОбновитьПрограммуОблачногоСервиса(Истина, ОбъектовОбработано, ПроблемныхОбъектов); - -КонецПроцедуры - -Процедура ОбновитьПрограммуОблачногоСервиса(Отложенно = Ложь, ОбъектовОбработано = 0, ПроблемныхОбъектов = 0) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПрограммыЭлектроннойПодписиИШифрования.Ссылка КАК Ссылка, - | ПрограммыЭлектроннойПодписиИШифрования.Наименование КАК Наименование, - | ПрограммыЭлектроннойПодписиИШифрования.ПометкаУдаления КАК ПометкаУдаления - |ИЗ - | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования - |ГДЕ - | ПрограммыЭлектроннойПодписиИШифрования.ЭтоПрограммаОблачногоСервиса"; - - Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - - Представление = НСтр("ru = 'Облачный сервис'"); - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Выборка = Запрос.Выполнить().Выбрать(); - ОблачнаяПрограмма = ?(Выборка.Следующий(), Выборка, Неопределено); - - Если ОблачнаяПрограмма = Неопределено - Или ОблачнаяПрограмма.Наименование <> Представление - Или ОблачнаяПрограмма.ПометкаУдаления Тогда - - Если ОблачнаяПрограмма = Неопределено Тогда - Программа = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент(); - Иначе - Программа = ОблачнаяПрограмма.Ссылка.ПолучитьОбъект(); - КонецЕсли; - - Программа.Наименование = Представление; - Программа.ЭтоПрограммаОблачногоСервиса = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Программа); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - - Если ОблачнаяПрограмма <> Неопределено Тогда - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось обновить программу ""%1"" по причине: - |%2'"), Строка(Программа), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - Если Отложенно Тогда - ПроблемныхОбъектов = ПроблемныхОбъектов + 1; - - ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения); - Возврат; - КонецЕсли; - Иначе - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось добавить программу ""%1"" по причине: - |%2'"), Представление, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецЕсли; - ВызватьИсключение ТекстСообщения; - КонецПопытки; - - Если Отложенно И ОблачнаяПрограмма <> Неопределено Тогда - ОбъектовОбработано = ОбъектовОбработано + 1; - ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ОблачнаяПрограмма.Ссылка); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form index 19ba63de2..94ba217b8 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form @@ -147,10 +147,6 @@ ru Основные реквизиты - - ru - Основные реквизиты - ГруппаОсновныеРеквизитыExtendedTooltip 30 @@ -484,9 +480,6 @@ СписокПереносов.Picture - None - None - None true true diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl index 92ec16a16..dab608114 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl @@ -238,8 +238,6 @@ ЗаполнитьПредставлениеПереносов(ЭтотОбъект); - Элементы.СписокПереносов.Видимость = СписокПереносов.Количество() > 0; - КонецПроцедуры &НаСервере @@ -383,6 +381,16 @@ КонецЦикла; Форма.СписокПереносов.СортироватьПоЗначению(); + УстановитьВидимостьСпискаПереносов(Форма); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьВидимостьСпискаПереносов(Форма) + + ВидимостьСписка = Форма.СписокПереносов.Количество() > 0; + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, "СписокПереносов", "Видимость", ВидимостьСписка); + КонецПроцедуры &НаКлиентеНаСервереБезКонтекста diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl index bf07c3f5c..af968002f 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl @@ -1,5 +1,63 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Возвращает реквизиты справочника, которые образуют естественный ключ +// для элементов справочника. +// +// Возвращаемое значение: +// Массив - массив имен реквизитов, образующих естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + + Результат = Новый Массив(); + + Результат.Добавить("Код"); + + Возврат Результат; + +КонецФункции + +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// СтандартныеПодсистемы.Печать + +// Формирует печатные формы +// +// Параметры: +// МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать; +// ПараметрыПечати - Структура - дополнительные настройки печати; +// КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (выходной параметр). +// ОбъектыПечати - СписокЗначений - значение - ссылка на объект; +// представление - имя области в которой был выведен объект (выходной +// параметр); +// ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов (выходной +// параметр). +// +Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( + КоллекцияПечатныхФорм, + "ПроизводственныйКалендарь", НСтр("ru = 'Производственный календарь'"), + ПечатнаяФормаПроизводственногоКалендаря(ПараметрыПечати), + , + "Справочник.ПроизводственныеКалендари.ПФ_MXL_ПроизводственныйКалендарь"); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Печать + +#КонецОбласти + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Функция читает данные производственного календаря из регистра. @@ -67,7 +125,7 @@ ДатаДня = Дата(НомерГода, 1, 1); Пока ДатаДня <= Дата(НомерГода, 12, 31) Цикл - // СНепраздничный" день - определяем в соответствии с днем недели. + // "Непраздничный" день - определяем в соответствии с днем недели. НомерДняНедели = ДеньНедели(ДатаДня); Если НомерДняНедели <= 5 Тогда ВидыДней.Вставить(ДатаДня, Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); @@ -138,44 +196,40 @@ КонецФункции -// Функция преобразовывает данные производственных календарей, -// поставляемые в виде макета в конфигурации. +// Преобразовывает данные производственных календарей, поставляемые в виде макета в конфигурации. // -// Параметры: -// - нет -// -// Возвращаемое значение - таблица значений с колонками. -// Подробнее см. комментарий к функции ДанныеПроизводственныхКалендарейИзXML. +// Возвращаемое значение: +// ТаблицаЗначений - см. ДанныеПроизводственныхКалендарейИзXML. // Функция ДанныеПроизводственныхКалендарейИзМакета() Экспорт - ТекстовыйДокумент = РегистрыСведений.ДанныеПроизводственногоКалендаря.ПолучитьМакет("ДанныеПроизводственныхКалендарей"); + Если Метаданные.Обработки.Найти("ЗаполнениеКалендарныхГрафиков") = Неопределено Тогда + Возврат НовыеДанныеПроизводственныхКалендарей(); + КонецЕсли; + + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + ТекстовыйДокумент = МодульКалендарныеГрафики.ПолучитьМакет("ДанныеПроизводственныхКалендарей"); Возврат ДанныеПроизводственныхКалендарейИзXML(ТекстовыйДокумент.ПолучитьТекст()); КонецФункции -// Функция преобразовывает данные производственных календарей, -// представленные в виде XML. +// Преобразовывает данные производственных календарей, представленные в виде XML. // // Параметры: -// - XML - документ с данными +// XML - документ с данными // -// Возвращаемое значение - таблица значений с колонками: -// - КодПроизводственногоКалендаря -// - ВидДня -// - Год -// - Дата -// - ДатаПереноса. +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * КодПроизводственногоКалендаря +// * ВидДня +// * Год +// * Дата +// * ДатаПереноса. // Функция ДанныеПроизводственныхКалендарейИзXML(Знач XML) Экспорт - ТаблицаДанных = Новый ТаблицаЗначений; - ТаблицаДанных.Колонки.Добавить("КодПроизводственногоКалендаря", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(2))); - ТаблицаДанных.Колонки.Добавить("ВидДня", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДнейПроизводственногоКалендаря")); - ТаблицаДанных.Колонки.Добавить("Год", Новый ОписаниеТипов("Число")); - ТаблицаДанных.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); - ТаблицаДанных.Колонки.Добавить("ДатаПереноса", Новый ОписаниеТипов("Дата")); + ТаблицаДанных = НовыеДанныеПроизводственныхКалендарей(); КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(XML).Данные; @@ -194,6 +248,18 @@ КонецФункции +Функция НовыеДанныеПроизводственныхКалендарей() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("КодПроизводственногоКалендаря", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(2))); + ТаблицаДанных.Колонки.Добавить("ВидДня", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДнейПроизводственногоКалендаря")); + ТаблицаДанных.Колонки.Добавить("Год", Новый ОписаниеТипов("Число")); + ТаблицаДанных.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); + ТаблицаДанных.Колонки.Добавить("ДатаПереноса", Новый ОписаниеТипов("Дата")); + Возврат ТаблицаДанных; + +КонецФункции + // Обновляет справочник Производственные календари из XML файла. // // Параметры: @@ -233,7 +299,7 @@ Если ЗначениеЗаполнено(Выборка.Ссылка) Тогда СправочникОбъект = Выборка.Ссылка.ПолучитьОбъект(); Иначе - СправочникОбъект = Справочники.ПроизводственныеКалендари.СоздатьЭлемент(); + СправочникОбъект = СоздатьЭлемент(); КонецЕсли; СправочникОбъект.Код = СокрЛП(Выборка.Код); СправочникОбъект.Наименование = СокрЛП(Выборка.Наименование); @@ -244,7 +310,7 @@ // Обновляет данные производственных календарей по таблице данных. // -Процедура ОбновитьДанныеПроизводственныхКалендарей(ТаблицаДанных) Экспорт +Функция ОбновитьДанныеПроизводственныхКалендарей(Знач ТаблицаДанных) Экспорт Запрос = Новый Запрос; Запрос.Текст = @@ -262,6 +328,7 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПроизводственныеКалендари.Ссылка КАК ПроизводственныйКалендарь, + | КлассификаторТаблица.КалендарьКод КАК КодПроизводственногоКалендаря, | КлассификаторТаблица.Год, | КлассификаторТаблица.Дата, | КлассификаторТаблица.ВидДня, @@ -288,20 +355,36 @@ КлючиРегистра.Добавить("Год"); КлючиРегистра.Добавить("Дата"); + ТаблицаИзменений = ТаблицаИзмененийПроизводственныхКалендарей(); + Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НаборЗаписей.Очистить(); ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка); + ЗаполнитьЗначенияСвойств(ТаблицаИзменений.Добавить(), Выборка); Для Каждого Ключ Из КлючиРегистра Цикл НаборЗаписей.Отбор[Ключ].Установить(Выборка[Ключ]); КонецЦикла; НаборЗаписей.Записать(Истина); КонецЦикла; - ТаблицаДанных.Свернуть("КодПроизводственногоКалендаря, Год"); - РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаДанных); + ТаблицаИзменений.Свернуть("КодПроизводственногоКалендаря, Год"); -КонецПроцедуры + Возврат ТаблицаИзменений; + +КонецФункции + +// Создает таблицу значений для описания изменений данных производственных календарей. +// +Функция ТаблицаИзмененийПроизводственныхКалендарей() + + ТаблицаИзменений = Новый ТаблицаЗначений; + ТаблицаИзменений.Колонки.Добавить("КодПроизводственногоКалендаря", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(3))); + ТаблицаИзменений.Колонки.Добавить("Год", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4))); + + Возврат ТаблицаИзменений; + +КонецФункции // Процедура записывает данные одного производственного календаря за 1 год. // @@ -334,42 +417,10 @@ НаборЗаписей.Записать(Истина); УсловияОбновления = УсловийОбновленияГрафиковРаботы(ПроизводственныйКалендарь, НомерГода); - РаспространитьИзмененияДанныхПроизводственныхКалендарей(УсловияОбновления); + КалендарныеГрафики.РаспространитьИзмененияДанныхПроизводственныхКалендарей(УсловияОбновления); КонецПроцедуры - -// Предназначена для обновления связанных с производственным календарем элементов, -// например, Графиков работы. -// -// Параметры: -// ТаблицаИзменений - таблица с колонками. -// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, -// - Год - год, за который нужно обновить данные. -// -Процедура РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаИзменений) Экспорт - // Обновляем данные графиков работы, - // заполняемых автоматически на основании производственного календаря. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда - МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - МодульГрафикиРаботы.ЗапланироватьОбновлениеГрафиковРаботы(ТаблицаИзменений); - Иначе - МодульГрафикиРаботы.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(ТаблицаИзменений); - КонецЕсли; - КонецЕсли; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.КалендарныеГрафики\ПриОбновленииПроизводственныхКалендарей"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОбновленииПроизводственныхКалендарей(ТаблицаИзменений); - КонецЦикла; - - КалендарныеГрафикиПереопределяемый.ПриОбновленииПроизводственныхКалендарей(ТаблицаИзменений); - -КонецПроцедуры - // Функция определяет соответствие видов дня производственного календаря и цвета оформления // этого дня в поле календаря. // @@ -464,7 +515,7 @@ КонецФункции -// Функция заполняет массив дат праздничных дней по производственному календарю +// Заполняет массив дат праздничных дней по производственному календарю // для конкретного календарного года. // Функция ПраздничныеДниПроизводственногоКалендаря(КодПроизводственногоКалендаря, НомерГода) @@ -473,59 +524,18 @@ ПраздничныеДни.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); ПраздничныеДни.Колонки.Добавить("ПереноситьВыходной", Новый ОписаниеТипов("Булево")); - Если КодПроизводственногоКалендаря = "РФ" Тогда - - // 1, 2, 3, 4, 5, 6 и 8 января - Новогодние каникулы. - ДобавитьПраздничныйДень(ПраздничныеДни, "01.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "02.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "03.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "04.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "05.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "06.01", НомерГода, Ложь); - ДобавитьПраздничныйДень(ПраздничныеДни, "08.01", НомерГода, Ложь); - - // 7 января - Рождество Христово. - ДобавитьПраздничныйДень(ПраздничныеДни, "07.01", НомерГода, Ложь); - - // 23 февраля - День защитника Отечества. - ДобавитьПраздничныйДень(ПраздничныеДни, "23.02", НомерГода); - - // 8 марта - Международный женский день. - ДобавитьПраздничныйДень(ПраздничныеДни, "08.03", НомерГода); - - // 1 мая - Праздник Весны и Труда. - ДобавитьПраздничныйДень(ПраздничныеДни, "01.05", НомерГода); - - // 9 мая - День Победы - ДобавитьПраздничныйДень(ПраздничныеДни, "09.05", НомерГода); - - // 12 июня - День России - ДобавитьПраздничныйДень(ПраздничныеДни, "12.06", НомерГода); - - // 4 ноября - День народного единства. - ДобавитьПраздничныйДень(ПраздничныеДни, "04.11", НомерГода); - + Если Метаданные.Обработки.Найти("ЗаполнениеКалендарныхГрафиков") <> Неопределено Тогда + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + МодульКалендарныеГрафики.ЗаполнитьПраздничныеДни(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни); КонецЕсли; Возврат ПраздничныеДни; КонецФункции -Процедура ДобавитьПраздничныйДень(ПраздничныеДни, ПраздничныйДень, НомерГода, ПереноситьВыходной = Истина) - - ДеньМесяц = СтрРазделить(ПраздничныйДень, "."); - - НоваяСтрока = ПраздничныеДни.Добавить(); - НоваяСтрока.Дата = Дата(НомерГода, ДеньМесяц[1], ДеньМесяц[0]); - НоваяСтрока.ПереноситьВыходной = ПереноситьВыходной; - -КонецПроцедуры - Функция УсловийОбновленияГрафиковРаботы(ПроизводственныйКалендарь, Год) - УсловияОбновления = Новый ТаблицаЗначений; - УсловияОбновления.Колонки.Добавить("КодПроизводственногоКалендаря", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(3))); - УсловияОбновления.Колонки.Добавить("Год", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4))); + УсловияОбновления = ТаблицаИзмененийПроизводственныхКалендарей(); НоваяСтрока = УсловияОбновления.Добавить(); НоваяСтрока.КодПроизводственногоКалендаря = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроизводственныйКалендарь, "Код"); @@ -535,52 +545,10 @@ КонецФункции -// Возвращает реквизиты справочника, которые образуют естественный ключ -// для элементов справочника. -// -// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих -// естественный ключ. -// -Функция ПоляЕстественногоКлюча() Экспорт - - Результат = Новый Массив(); - - Результат.Добавить("Код"); - - Возврат Результат; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Печатная форма производственного календаря. -// Формирует печатные формы -// -// Параметры: -// (входные) -// МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать; -// ПараметрыПечати - Структура - дополнительные настройки печати; -// (выходные) -// КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы. -// ОбъектыПечати - СписокЗначений - значение - ссылка на объект; -// представление - имя области в которой был выведен объект; -// ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов. -// -Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( - КоллекцияПечатныхФорм, - "ПроизводственныйКалендарь", НСтр("ru = 'Производственный календарь'"), - Справочники.ПроизводственныеКалендари.ПечатнаяФормаПроизводственногоКалендаря(ПараметрыПечати), - , - "Справочник.ПроизводственныеКалендари.ПФ_MXL_ПроизводственныйКалендарь"); - КонецЕсли; - -КонецПроцедуры - -Функция ПечатнаяФормаПроизводственногоКалендаря(ПараметрыПодготовкиПечатнойФормы) Экспорт +Функция ПечатнаяФормаПроизводственногоКалендаря(ПараметрыПодготовкиПечатнойФормы) ТекстЗапроса = "ВЫБРАТЬ @@ -613,7 +581,7 @@ ПроизводственныйКалендарь = ПараметрыПодготовкиПечатнойФормы.ПроизводственныйКалендарь; НомерГода = ПараметрыПодготовкиПечатнойФормы.НомерГода; - Макет = Справочники.ПроизводственныеКалендари.ПолучитьМакет("ПФ_MXL_ПроизводственныйКалендарь"); + Макет = ПолучитьМакет("ПФ_MXL_ПроизводственныйКалендарь"); ТабличныйДокумент = Новый ТабличныйДокумент; diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ПроизводственныеКалендари.mdo b/SSL/src/Catalogs/ПроизводственныеКалендари/ПроизводственныеКалендари.mdo index 8ff513ea0..1080a307d 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ПроизводственныеКалендари.mdo +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ПроизводственныеКалендари.mdo @@ -139,14 +139,6 @@ PersonalComputer MobileDevice - - ОписаниеКалендарей - - ru - Описание календарей - - TextDocument - ПФ_MXL_ПроизводственныйКалендарь diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form index cc1f82d18..318d51b9b 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -204,9 +208,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Module.bsl index 251194b06..bcc844531 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Module.bsl @@ -11,7 +11,7 @@ ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( Список, "ЭтоГруппа", Истина, , , Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl index c486b3210..97da81ddf 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form index fae33eaf5..99cf4105c 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form @@ -157,6 +157,10 @@ true + + <key>ru</key> + <value>Настроек</value> + ГруппаНастроекРасширеннаяПодсказка 34 @@ -474,6 +478,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -682,9 +690,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl index 543902263..e4974ce23 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl @@ -48,7 +48,7 @@ Элементы.ПоказатьПрофили.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form index 87d829921..14af86e81 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form @@ -255,12 +255,8 @@ <key>ru</key> - <value>Группа назначение</value> + <value>Назначение</value> - - ru - Группа назначение - ГруппаНазначениеРасширеннаяПодсказка 382 @@ -289,6 +285,10 @@ Роли 197 + + <key>ru</key> + <value>Роли</value> + true true @@ -666,9 +666,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true true @@ -978,9 +975,6 @@ Auto true true - None - None - None true @@ -1028,6 +1022,10 @@ ЗначенияДоступа 233 + + <key>ru</key> + <value>Значения доступа</value> + true true @@ -1263,9 +1261,6 @@ true true true - None - None - None true @@ -1366,10 +1361,6 @@ ru Типы видов доступа - - ru - Типы видов доступа - ТипыВидовДоступаExtendedTooltip 284 @@ -1390,6 +1381,10 @@ true + + <key>ru</key> + <value>Значения доступа по виду доступа</value> + ЗначенияДоступаПоВидуДоступаExtendedTooltip 280 @@ -1636,10 +1631,6 @@ ru Доступ - - ru - Доступ - ДоступExtendedTooltip 255 @@ -1659,6 +1650,58 @@ ФормаКоманднаяПанель -1 + + ФормаЗаписатьИЗакрыть + 391 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 392 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + PictureAndText + true + true + true + UserCmds + Auto + + + КомандыФормы + 393 + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + КомандыФормыРасширеннаяПодсказка + 394 + Label + true + true + + Left + + + + Form + + ВосстановитьПоНачальномуЗаполнению 46 @@ -1714,8 +1757,33 @@ Auto InAdditionalSubmenu + + ФормаСправка + 395 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 396 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + Left - true OnCreateAtServer @@ -1729,6 +1797,7 @@ BeforeLoadDataFromSettingsAtServer ПриЗагрузкеДанныхИзНастроекНаСервере + WriteAndClose DontBlock Use true @@ -2301,6 +2370,28 @@ DontUse Auto + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 8 + + ru + Записать объект и закрыть форму + + + true + + + + ЗаписатьИЗакрыть + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Help/ru.html index cf1f60e3d..43954fd19 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Help/ru.html @@ -9,7 +9,8 @@
  • В поле Назначение перейдите по ссылке, с помощью флажков выберите, для кого предназначен профиль групп доступа, например, Пользователи, нажмите кнопку Выбрать. После этого ссылка принимает выбранное значение.
  • Выберите Разрешенные действия (роли) на соответствующей вкладке.
  • Укажите Ограничения доступа на соответствующей вкладке. -
  • На вкладке Описание можно написать дополнительные сведения о профиле групп доступа. У предопределенных профилей доступа также имеется вкладка Описание с подробным описанием данного профиля и его назначения.
  • Разрешенные действия (роли) 

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

    • На вкладке Разрешенные действия (роли) при добавлении нового профиля групп доступа сначала необходимо определить состав его ролей, исходя из потребностей целевой группы пользователей.
    • Роль определяет некоторую совокупность действий над объектами программы, которые может выполнять пользователь. Роли могут соответствовать как различным должностным обязанностям (или видам деятельности) пользователей программы, так и могут соотноситься с более мелкими функциями. Например, роль Бухгалтер предоставляет доступ к функциональному блоку, необходимому для выполнения должностных обязанностей бухгалтера, а для включения отдельной возможности просмотра файлов может быть дополнительно назначена роль Чтение файлов. Зачастую, роли либо разрешают просмотр, либо дают возможность редактирования тех или иных данных в программе. 
    • С помощью флажков выберите одну или несколько ролей. diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl index 88593dc47..858034cfd 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl @@ -1,4 +1,11 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПараметрыЗаписиПередЗаписьюПродолжение; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -25,7 +32,7 @@ БезРедактированияПоставляемыхЗначений = ТолькоПросмотр ИЛИ НЕ Объект.Ссылка.Пустая() И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект); - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если Объект.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор И Не Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда ТолькоПросмотр = Истина; @@ -46,10 +53,12 @@ ПользователиСлужебный.ОбновитьНазначениеПриСозданииНаСервере(ЭтотОбъект); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда ТолькоПросмотр = Истина; КонецЕсли; + ПользователиСлужебныйКлиентСервер.УстановитьДоступностьКнопкиЗаписатьИЗакрыть(ЭтотОбъект); + КонецПроцедуры &НаСервере @@ -86,14 +95,8 @@ И НЕ ПараметрыЗаписи.Свойство("ОтветПоОбновлениюГруппДоступаПрофиляПолучен") Тогда Отказ = Истина; - Если ПроверитьЗаполнение() Тогда - ПоказатьВопрос( - Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект, ПараметрыЗаписи), - ТекстВопросаОбновитьГруппыДоступаПрофиля(), - РежимДиалогаВопрос.ДаНетОтмена, - , - КодВозвратаДиалога.Нет); - КонецЕсли; + ПараметрыЗаписиПередЗаписьюПродолжение = ПараметрыЗаписи; + ПодключитьОбработчикОжидания("ПередЗаписьюПродолжениеОбработчикОжидания", 0.1, Истина); Возврат; КонецЕсли; @@ -152,6 +155,10 @@ КонецЦикла; КонецЕсли; + Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -399,10 +406,30 @@ КонецПроцедуры +&НаКлиенте +Процедура РолиПометкаПриИзмененииПослеПодтверждения(Ответ, ПараметрыВыполнения) Экспорт + СтрокаТаблицы = Элементы.Роли.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + Если Ответ = "Продолжить" Тогда + ОбработатьИнтерфейсРолей("ОбновитьСоставРолей"); + Иначе + СтрокаТаблицы.Пометка = Ложь; + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Записать(Новый Структура("ЗаписатьИЗакрыть")); + +КонецПроцедуры + &НаКлиенте Процедура ВосстановитьПоНачальномуЗаполнению(Команда) @@ -469,6 +496,24 @@ #Область СлужебныеПроцедурыИФункции +// Продолжение обработчика события ПередЗаписью. +&НаКлиенте +Процедура ПередЗаписьюПродолжениеОбработчикОжидания() + + ПараметрыЗаписи = ПараметрыЗаписиПередЗаписьюПродолжение; + ПараметрыЗаписиПередЗаписьюПродолжение = Неопределено; + + Если ПроверитьЗаполнение() Тогда + ПоказатьВопрос( + Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект, ПараметрыЗаписи), + ТекстВопросаОбновитьГруппыДоступаПрофиля(), + РежимДиалогаВопрос.ДаНетОтмена, + , + КодВозвратаДиалога.Нет); + КонецЕсли; + +КонецПроцедуры + // Продолжение обработчика события ПередЗаписью. &НаКлиенте Процедура ПередЗаписьюПродолжение(Ответ, ПараметрыЗаписи) Экспорт @@ -489,7 +534,7 @@ // Продолжение обработчика команды ВосстановитьПоНачальномуЗаполнению. &НаКлиенте -Процедура ВосстановитьПоНачальномуЗаполнениюПродолжение(Ответ, Неопределен) Экспорт +Процедура ВосстановитьПоНачальномуЗаполнениюПродолжение(Ответ, Контекст) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; @@ -506,7 +551,7 @@ // Продолжение обработчика команды ВосстановитьПоНачальномуЗаполнению. &НаКлиенте -Процедура ВосстановитьПоНачальномуЗаполнениюЗавершение(Ответ, Неопределен) Экспорт +Процедура ВосстановитьПоНачальномуЗаполнениюЗавершение(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Отмена Тогда Возврат; @@ -585,16 +630,10 @@ КонецФункции &НаКлиенте -Процедура РолиПометкаПриИзмененииПослеПодтверждения(Ответ, ПараметрыВыполнения) Экспорт - СтрокаТаблицы = Элементы.Роли.ТекущиеДанные; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - Если Ответ = "Продолжить" Тогда - ОбработатьИнтерфейсРолей("ОбновитьСоставРолей"); - Иначе - СтрокаТаблицы.Пометка = Ложь; - КонецЕсли; +Процедура ЗакрытьФорму() + + Закрыть(); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl index de4be4be5..7d8f244ba 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl @@ -2,6 +2,21 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт + + УправлениеДоступомСлужебный.ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ); + +КонецПроцедуры + +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -20,6 +35,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -31,63 +50,32 @@ // ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, // устанавливается Истина, иначе не изменяется. // -Процедура ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт +Процедура ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - ПоставляемыеПрофили = ПоставляемыеПрофили(); - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - НачатьТранзакцию(); Попытка - Блокировка.Заблокировать(); - - Параметры = Неопределено; ЕстьТекущиеИзменения = Ложь; - СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы("ПараметрыОграниченияДоступа", - "ПоставляемыеПрофилиГруппДоступа", ПоставляемыеПрофили, ЕстьТекущиеИзменения, ТолькоПроверка, Параметры); - Если Не ТолькоПроверка Тогда - СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "ПоставляемыеПрофилиГруппДоступа", - ?(ЕстьТекущиеИзменения, - Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), - Новый ФиксированнаяСтруктура()) ); - КонецЕсли; + СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей", + ПоставляемыеПрофили, ЕстьТекущиеИзменения); + + СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей", + ?(ЕстьТекущиеИзменения, + Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), + Новый ФиксированнаяСтруктура()) ); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; ВызватьИсключение; КонецПопытки; - Если ЕстьТекущиеИзменения Тогда - ЕстьИзменения = Истина; - КонецЕсли; - - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", "ПоставляемыеПрофилиГруппДоступа"); - КонецЕсли; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - КонецПроцедуры // Процедура Обновляет состав предопределенных профилей в @@ -97,62 +85,35 @@ // ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, // устанавливается Истина, иначе не изменяется. // -Процедура ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт +Процедура ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - ПредопределенныеПрофили = Метаданные.Справочники.ПрофилиГруппДоступа.ПолучитьИменаПредопределенных(); - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - НачатьТранзакцию(); Попытка - Блокировка.Заблокировать(); - ЕстьУдаленные = Ложь; ЕстьТекущиеИзменения = Ложь; + СтароеЗначение = Неопределено; - Параметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы("ПараметрыОграниченияДоступа"); + СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа", + ПредопределенныеПрофили, , СтароеЗначение); - Если Параметры.Свойство("ПредопределенныеПрофилиГруппДоступа") Тогда - Сохраненные = Параметры.ПредопределенныеПрофилиГруппДоступа; - - Если Не ПредопределенныеПрофилиСовпадают(ПредопределенныеПрофили, Сохраненные, ЕстьУдаленные) Тогда - ЕстьТекущиеИзменения = Истина; - КонецЕсли; - Иначе + Если Не ПредопределенныеПрофилиСовпадают(ПредопределенныеПрофили, СтароеЗначение, ЕстьУдаленные) Тогда ЕстьТекущиеИзменения = Истина; КонецЕсли; - Если Не ТолькоПроверка И ЕстьТекущиеИзменения Тогда - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы("ПараметрыОграниченияДоступа", - "ПредопределенныеПрофилиГруппДоступа", ПредопределенныеПрофили); - КонецЕсли; - - Если Не ТолькоПроверка Тогда - СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "ПредопределенныеПрофилиГруппДоступа", - ?(ЕстьУдаленные, - Новый ФиксированнаяСтруктура("ЕстьУдаленные", Истина), - Новый ФиксированнаяСтруктура()) ); - КонецЕсли; + СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа", + ?(ЕстьУдаленные, + Новый ФиксированнаяСтруктура("ЕстьУдаленные", Истина), + Новый ФиксированнаяСтруктура()) ); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; ВызватьИсключение; КонецПопытки; @@ -160,16 +121,6 @@ ЕстьИзменения = Истина; КонецЕсли; - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "ПредопределенныеПрофилиГруппДоступа"); - КонецЕсли; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - КонецПроцедуры // Процедура обновляет поставляемые профили справочника по результату изменения @@ -179,10 +130,8 @@ УстановитьПривилегированныйРежим(Истина); - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы( - Параметры, "ПоставляемыеПрофилиГруппДоступа"); + "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей"); Если ПоследниеИзменения = Неопределено Тогда ТребуетсяОбновление = Истина; @@ -223,7 +172,7 @@ // Процедура ОбновитьПоставляемыеПрофили(ЕстьИзменения = Неопределено) Экспорт - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилейМассив; ПараметрыОбновления = ПоставляемыеПрофили.ПараметрыОбновления; @@ -231,16 +180,23 @@ ОбновленныеПрофили = Новый Массив; ОбновленныеГруппыДоступа = Новый Массив; - Запрос = Новый Запрос( + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + Запрос.Текст = "ВЫБРАТЬ - | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен, - | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных, - | ПрофилиГруппДоступа.Ссылка КАК Ссылка + | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | ПрофилиГруппДоступа.Ссылка КАК Ссылка, + | ЛОЖЬ КАК Найден |ИЗ - | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа"); + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | НЕ ПрофилиГруппДоступа.ЭтоГруппа + | И ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных <> &ПустойУникальныйИдентификатор"; ТекущиеПрофили = Запрос.Выполнить().Выгрузить(); - Для каждого СвойстваПрофиля Из ОписанияПрофилей Цикл + Для Каждого СвойстваПрофиля Из ОписанияПрофилей Цикл СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти( Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор), @@ -256,6 +212,8 @@ Профиль = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор); Иначе + СтрокаТекущегоПрофиля.Найден = Истина; + Профиль = СтрокаТекущегоПрофиля.Ссылка; Если НЕ СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен ИЛИ ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда @@ -277,6 +235,22 @@ КонецЕсли; КонецЦикла; + Для Каждого СтрокаТекущегоПрофиля Из ТекущиеПрофили Цикл + Если СтрокаТекущегоПрофиля.Найден Тогда + Продолжить; + КонецЕсли; + Если СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен Тогда + Продолжить; + КонецЕсли; + ПрофильОбъект = СтрокаТекущегоПрофиля.Ссылка.ПолучитьОбъект(); + Если ПрофильОбъект.ПометкаУдаления Тогда + Продолжить; + КонецЕсли; + ПрофильОбъект.ПометкаУдаления = Истина; + ПрофильОбъект.Записать(); + ЕстьИзменения = Истина; + КонецЦикла; + // Обновление ролей пользователей. Запрос = Новый Запрос; Запрос.Текст = @@ -294,22 +268,7 @@ КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -372,13 +331,19 @@ // Параметры: // Идентификатор - Строка - имя или уникальный идентификатор поставляемого профиля. // -Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор) Экспорт +Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор, ВызыватьИсключениеЕслиНетВБазеДанных = Ложь) Экспорт УстановитьПривилегированныйРежим(Истина); - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); + СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(Строка(Идентификатор)); - СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(Идентификатор); + Если СвойстваПрофиля = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Профиль c идентификатором ""%1"" + |не поставляется в программе.'"), + Строка(Идентификатор)); + КонецЕсли; Запрос = Новый Запрос; Запрос.УстановитьПараметр("ИдентификаторПоставляемыхДанных", @@ -398,6 +363,13 @@ Возврат Выборка.Ссылка; КонецЕсли; + Если ВызыватьИсключениеЕслиНетВБазеДанных Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Поставляемый профиль с идентификатором ""%1"" + |не найден в информационной базе.'"), + Строка(Идентификатор)); + КонецЕсли; + Возврат Неопределено; КонецФункции @@ -427,7 +399,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить( Строка(Выборка.ИдентификаторПоставляемыхДанных)); @@ -458,8 +430,7 @@ Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Профиль, "ПоставляемыйПрофильИзменен"); КонецЕсли; - ТекущиеПараметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ОписанияПрофилей = ТекущиеПараметры.ПоставляемыеПрофилиГруппДоступа.ОписанияПрофилей; + ОписанияПрофилей = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей().ОписанияПрофилей; СвойстваПрофиля = ОписанияПрофилей.Получить(Строка(Профиль.ИдентификаторПоставляемыхДанных)); Если СвойстваПрофиля = Неопределено Тогда @@ -539,7 +510,7 @@ ИдентификаторПоставляемыхДанных = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Профиль, "ИдентификаторПоставляемыхДанных")); - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(ИдентификаторПоставляемыхДанных); Возврат СвойстваПрофиля <> Неопределено; @@ -564,7 +535,7 @@ Возврат Истина; КонецЕсли; - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить( Строка(Профиль.ИдентификаторПоставляемыхДанных)); @@ -587,7 +558,7 @@ ИдентификаторПоставляемыхДанных = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Профиль, "ИдентификаторПоставляемыхДанных")); - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(ИдентификаторПоставляемыхДанных); Текст = ""; @@ -616,7 +587,7 @@ ИдентификаторПоставляемыхДанных = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Профиль, "ИдентификаторПоставляемыхДанных")); - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(ИдентификаторПоставляемыхДанных); Если СвойстваПрофиля <> Неопределено Тогда @@ -645,9 +616,8 @@ | ТипПользователей КАК ТипПользователей | ) КАК Назначение, | Профили.Роли.( - | ЕСТЬNULL(Профили.Роли.Роль.Имя, """") КАК Имя, - | ЕСТЬNULL(Профили.Роли.Роль.ПометкаУдаления, ИСТИНА) КАК ПометкаУдаления - | ) + | Роль КАК Роль + | ) КАК Роли |ИЗ | Справочник.ПрофилиГруппДоступа КАК Профили"; @@ -664,11 +634,18 @@ НедоступныеРолиПоНазначению.Вставить(НазначениеПрофиля, НедоступныеРоли); КонецЕсли; - Для Каждого Роль Из ОписаниеПрофиля.Роли Цикл + ОписаниеРолей = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам( + ОписаниеПрофиля.Роли.ВыгрузитьКолонку("Роль"), Истина); + + Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл + Если ОписаниеРоли.Значение = Неопределено Тогда + // Роль, недоступная до перезапуска, не является проблемой. + Продолжить; + КонецЕсли; - Если Роль.ПометкаУдаления - Или НедоступныеРоли.Получить(Роль.Имя) <> Неопределено - Или ВРег(Лев(Роль.Имя, СтрДлина("Удалить"))) = ВРег("Удалить") Тогда + Если ОписаниеРоли.Значение = Null + Или НедоступныеРоли.Получить(ОписаниеРоли.Значение.Имя) <> Неопределено + Или ВРег(Лев(ОписаниеРоли.Значение.Имя, СтрДлина("Удалить"))) = ВРег("Удалить") Тогда НесовместимыеПрофили.Добавить(ОписаниеПрофиля.Ссылка); Прервать; @@ -680,6 +657,165 @@ КонецФункции +// См. Справочники.ПрофилиГруппДоступа.ПоставляемыеПрофили. +Функция ОписаниеПоставляемыхПрофилей() Экспорт + + ПоставляемыеПрофили = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей"); + + Если ПоставляемыеПрофили = Неопределено Тогда + ОбновитьОписаниеПоставляемыхПрофилей(); + КонецЕсли; + + ПоставляемыеПрофили = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей"); + + Возврат ПоставляемыеПрофили; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для поддержки обмена данными в РИБ. + +// Только для внутреннего использования. +Процедура ВосстановитьСоставРолейРасширений(ЭлементДанных) Экспорт + + УдалитьРолиРасширений(ЭлементДанных); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Профиль", ЭлементДанных.Ссылка); + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль КАК Роль + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + |ГДЕ + | РолиПрофилей.Ссылка = &Профиль + | И ТИПЗНАЧЕНИЯ(РолиПрофилей.Роль) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль КАК Роль + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + |ГДЕ + | РолиПрофилей.Ссылка = &Профиль + | И ТИПЗНАЧЕНИЯ(РолиПрофилей.Роль) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)"; + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + + // Регистрация профилей для групп доступа которых нужно обновить регистр сведений ТаблицыГруппДоступа. + РолиИзменены = Ложь; + СтарыеРоли = РезультатыЗапроса[0].Выгрузить(); + Если СтарыеРоли.Количество() <> ЭлементДанных.Роли.Количество() Тогда + РолиИзменены = Истина; + Иначе + Для Каждого Роль Из ЭлементДанных.Роли Цикл + Если СтарыеРоли.Найти(Роль, "Роль") = Неопределено Тогда + РолиИзменены = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если РолиИзменены Тогда + ПрофилиСИзмененнымСоставомРолейПриЗагрузке = ПрофилиСИзмененнымСоставомРолейПриЗагрузке(); + Если ПрофилиСИзмененнымСоставомРолейПриЗагрузке.Найти(ЭлементДанных.Ссылка) = Неопределено Тогда + ПрофилиСИзмененнымСоставомРолейПриЗагрузке.Добавить(ЭлементДанных.Ссылка); + УстановитьПривилегированныйРежим(Истина); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ПрофилиСИзмененнымСоставомРолейПриЗагрузке", + ПрофилиСИзмененнымСоставомРолейПриЗагрузке); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + КонецЕсли; + + // Добавление ролей расширений к новому состав ролей конфигурации. + Выборка = РезультатыЗапроса[1].Выбрать(); + Пока Выборка.Следующий() Цикл + ЭлементДанных.Роли.Добавить().Роль = Выборка.Роль; + КонецЦикла; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура УдалитьРолиРасширений(ЭлементДанных) Экспорт + + Индекс = ЭлементДанных.Роли.Количество() - 1; + Пока Индекс >= 0 Цикл + Если ТипЗнч(ЭлементДанных.Роли[Индекс].Роль) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + ЭлементДанных.Роли.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура УдалитьРолиРасширенийВоВсехПрофиляхГруппДоступа() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + |ГДЕ + | ТИПЗНАЧЕНИЯ(РолиПрофилей.Роль) <> ТИП(Справочник.ИдентификаторыОбъектовМетаданных)"; + + ЕстьИзменения = Ложь; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ПрофильОбъект = Выборка.Ссылка.ПолучитьОбъект(); + УдалитьРолиРасширений(ПрофильОбъект); + Если ПрофильОбъект.Модифицированность() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + ЕстьИзменения = Истина; + КонецЕсли; + КонецЦикла; + + Если ЕстьИзменения Тогда + РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОбновитьТаблицыГруппДоступаПрофилейСИзмененнымСоставомРолейПриЗагрузке() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + // Изменения профилей в АРМ заблокированы и не загружаются в область данных. + Возврат; + КонецЕсли; + + ПрофилиСИзмененнымСоставомРолейПриЗагрузке = ПрофилиСИзмененнымСоставомРолейПриЗагрузке(); + Если ПрофилиСИзмененнымСоставомРолейПриЗагрузке.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Профиль", ПрофилиСИзмененнымСоставомРолейПриЗагрузке); + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Профиль В(&Профиль)"; + + ГруппыДоступаПрофилей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(ГруппыДоступаПрофилей); + + УстановитьПривилегированныйРежим(Истина); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ПрофилиСИзмененнымСоставомРолейПриЗагрузке", + Неопределено); + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + // Обработчики обновления информационной базы. // Заполняет идентификаторы поставляемых данных по совпадению с идентификатором ссылки. @@ -687,14 +823,13 @@ УстановитьПривилегированныйРежим(Истина); - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СсылкиПоставляемыхПрофилей = Новый Массив; Для каждого ОписаниеПрофиля Из ПоставляемыеПрофили.ОписанияПрофилейМассив Цикл - СсылкиПоставляемыхПрофилей.Добавить( - Справочники.ПрофилиГруппДоступа.ПолучитьСсылку( - Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор))); + СсылкиПоставляемыхПрофилей.Добавить(ПолучитьСсылку( + Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор))); КонецЦикла; Запрос = Новый Запрос; @@ -778,7 +913,7 @@ Возврат; КонецЕсли; - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); Пока Выборка.Следующий() Цикл Объект = Выборка.Ссылка.ПолучитьОбъект(); @@ -841,20 +976,17 @@ ОписанияПрофилей = Новый Массив; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииПоставляемыхПрофилейГруппДоступа"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииПоставляемыхПрофилейГруппДоступа( + ОписанияПрофилей, ПараметрыОбновления); УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа( ОписанияПрофилей, ПараметрыОбновления); ЗаголовокОшибки = НСтр("ru = 'Заданы недопустимые значения в процедуре ПриЗаполненииПоставляемыхПрофилейГруппДоступа - |общего модуля УправлениеДоступомПереопределяемый. - | - |'"); + |общего модуля УправлениеДоступомПереопределяемый.'") + + Символы.ПС + + Символы.ПС; Если ПараметрыОбновления.ЗапретитьИзменениеПрофилей И НЕ ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда @@ -881,14 +1013,19 @@ |- удаления помеченных объектов, |- в редких случаях для внесения изменений в конфигурацию. | - |Рекомендуется не использовать для ""обычной"" работы в информационной системе. - |'"); + |Рекомендуется не использовать для ""обычной"" работы в информационной системе.'") + + Символы.ПС; + ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор); + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + ОписанияПрофилей.Добавить( + УправлениеДоступомСлужебный.ОписаниеПрофиляОткрытиеВнешнихОтчетовИОбработок()); + КонецЕсли; + ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие; - СвойстваВидовДоступа = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыОграниченияДоступа").СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); // Преобразование описаний в соответствие идентификаторов и // свойств для хранения и быстрой обработки. @@ -957,7 +1094,7 @@ ПредставлениеНазначенияПрофиля(НазначениеПрофиля)); КонецЕсли; КонецЦикла; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда // Заполнение списка недоступных ролей в модели сервиса // для определения необходимости обновления поставляемых профилей. ОписаниеПрофиля.Вставить("РолиНедоступныеВСервисе", @@ -1164,10 +1301,15 @@ Функция ПредопределенныеПрофилиСовпадают(НовыеПрофили, СтарыеПрофили, ЕстьУдаленные) + Если ТипЗнч(НовыеПрофили) <> ТипЗнч(СтарыеПрофили) Тогда + ЕстьУдаленные = Истина; + Возврат Ложь; + КонецЕсли; + ПредопределенныеПрофилиСовпадают = НовыеПрофили.Количество() = СтарыеПрофили.Количество(); - Для каждого Профиль Из СтарыеПрофили Цикл + Для Каждого Профиль Из СтарыеПрофили Цикл Если НовыеПрофили.Найти(Профиль) = Неопределено Тогда ПредопределенныеПрофилиСовпадают = Ложь; ЕстьУдаленные = Истина; @@ -1218,7 +1360,7 @@ Если ПрофильСсылка = Неопределено Тогда // Поставляемый профиль не найден, нужно создать новый. - ПрофильОбъект = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент(); + ПрофильОбъект = СоздатьЭлемент(); Иначе // Поставляемый профиль связан с предопределенным элементом. ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект(); @@ -1289,7 +1431,7 @@ Функция ОписаниеРолейПрофиля(ОписаниеПрофиля) - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Возврат ОписаниеПрофиля.Роли; КонецЕсли; @@ -1323,6 +1465,21 @@ КонецФункции +Функция ПрофилиСИзмененнымСоставомРолейПриЗагрузке() + + УстановитьПривилегированныйРежим(Истина); + + ПрофилиСИзмененнымСоставомРолейПриЗагрузке = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ПрофилиСИзмененнымСоставомРолейПриЗагрузке"); + + Если ТипЗнч(ПрофилиСИзмененнымСоставомРолейПриЗагрузке) <> Тип("Массив") Тогда + ПрофилиСИзмененнымСоставомРолейПриЗагрузке = Новый Массив; + КонецЕсли; + + Возврат ПрофилиСИзмененнымСоставомРолейПриЗагрузке; + +КонецФункции + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl index 1c0dc1602..3a7af5db5 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl @@ -22,6 +22,9 @@ Возврат; КонецЕсли; + СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + РегистрыСведений.ПраваРолей.ПроверитьДанныеРегистра(); + // Получение старых ролей профиля. РезультатЗапроса = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Роли"); Если ТипЗнч(РезультатЗапроса) = Тип("РезультатЗапроса") Тогда @@ -29,7 +32,7 @@ Иначе СтарыеРолиПрофиля = Роли.Выгрузить(Новый Массив); КонецЕсли; - + СтараяПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Ссылка, "ПометкаУдаления"); @@ -38,9 +41,13 @@ Иначе // Проверка ролей. НомерСтроки = Роли.Количество() - 1; + РолиАдминистратора = Новый Массив; + РолиАдминистратора.Добавить("Роль.ПолныеПрава"); + РолиАдминистратора.Добавить("Роль.АдминистраторСистемы"); + ИдентификаторыРолей = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(РолиАдминистратора); Пока НомерСтроки >= 0 Цикл - Если ВРег(Роли[НомерСтроки].Роль) = ВРег("ПолныеПрава") - ИЛИ ВРег(Роли[НомерСтроки].Роль) = ВРег("АдминистраторСистемы") Тогда + Если ВРег(Роли[НомерСтроки].Роль) = ВРег(ИдентификаторыРолей["Роль.ПолныеПрава"]) + ИЛИ ВРег(Роли[НомерСтроки].Роль) = ВРег(ИдентификаторыРолей["Роль.АдминистраторСистемы"]) Тогда Роли.Удалить(НомерСтроки); КонецЕсли; @@ -138,7 +145,7 @@ | И (НЕ ГруппыДоступа.ЭтоГруппа)"; РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда + Если Не РезультатЗапроса.Пустой() Тогда ГруппыДоступаПрофиля = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(ГруппыДоступаПрофиля); @@ -149,6 +156,8 @@ КонецЕсли; КонецЕсли; + Справочники.ПрофилиГруппДоступа.ОбновитьТаблицыГруппДоступаПрофилейСИзмененнымСоставомРолейПриЗагрузке(); + КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) @@ -172,6 +181,10 @@ Возврат; КонецЕсли; + Если ОбъектКопирования.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + Роли.Очистить(); + КонецЕсли; + ИдентификаторПоставляемыхДанных = Неопределено; КонецПроцедуры @@ -223,10 +236,68 @@ | Данные.Роль"; ТекстЗапроса = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПраваРолей.ОбъектМетаданных + "ВЫБРАТЬ + | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, + | ПраваРолейРасширений.Роль КАК Роль, + | ПраваРолейРасширений.Добавление КАК Добавление, + | ПраваРолейРасширений.Изменение КАК Изменение, + | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, + | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, + | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, + | ПраваРолейРасширений.Просмотр КАК Просмотр, + | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваРолейРасширений.Редактирование КАК Редактирование, + | ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки + |ПОМЕСТИТЬ ПраваРолейРасширений + |ИЗ + | &ПраваРолейРасширений КАК ПраваРолейРасширений + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, + | ПраваРолейРасширений.Роль КАК Роль, + | ПраваРолейРасширений.Добавление КАК Добавление, + | ПраваРолейРасширений.Изменение КАК Изменение, + | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, + | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, + | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, + | ПраваРолейРасширений.Просмотр КАК Просмотр, + | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваРолейРасширений.Редактирование КАК Редактирование + |ПОМЕСТИТЬ ПраваРолей + |ИЗ + | ПраваРолейРасширений КАК ПраваРолейРасширений + |ГДЕ + | ПраваРолейРасширений.ВидИзмененияСтроки = 1 + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ПраваРолей.ОбъектМетаданных, + | ПраваРолей.Роль, + | ПраваРолей.Добавление, + | ПраваРолей.Изменение, + | ПраваРолей.ЧтениеБезОграничения, + | ПраваРолей.ДобавлениеБезОграничения, + | ПраваРолей.ИзменениеБезОграничения, + | ПраваРолей.Просмотр, + | ПраваРолей.ИнтерактивноеДобавление, + | ПраваРолей.Редактирование |ИЗ | РегистрСведений.ПраваРолей КАК ПраваРолей + | ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений + | ПО ПраваРолей.ОбъектМетаданных = ПраваРолейРасширений.ОбъектМетаданных + | И ПраваРолей.Роль = ПраваРолейРасширений.Роль + |ГДЕ + | ПраваРолейРасширений.ОбъектМетаданных ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваРолей.ОбъектМетаданных + |ИЗ + | ПраваРолей КАК ПраваРолей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИзмененныеРоли КАК ИзмененныеРоли | ПО ПраваРолей.Роль = ИзмененныеРоли.Роль"; @@ -236,6 +307,7 @@ |//////////////////////////////////////////////////////////////////////////////// |" + ТекстЗапроса; + Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений()); РезультатыЗапросов = Запрос.ВыполнитьПакет(); Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") @@ -256,7 +328,7 @@ УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновленияРолей); КонецЕсли; - Возврат РезультатыЗапросов[2].Выгрузить().ВыгрузитьКолонку("ОбъектМетаданных"); + Возврат РезультатыЗапросов[4].Выгрузить().ВыгрузитьКолонку("ОбъектМетаданных"); КонецФункции diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo index 10db27d4d..644a98f66 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo @@ -224,6 +224,7 @@ Роль + CatalogRef.ИдентификаторыОбъектовРасширений CatalogRef.ИдентификаторыОбъектовМетаданных diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form index 265e8bbc6..ffa67ac0d 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form @@ -50,7 +50,7 @@ - Группа1 + ГруппаНастройкиПортаИТипаСоединения 28 Порт @@ -105,7 +105,7 @@ - Декорация1 + ДекорацияРазделитель 30 true true @@ -113,7 +113,7 @@ true - Декорация1РасширеннаяПодсказка + ДекорацияРазделительРасширеннаяПодсказка 32 Label true @@ -123,7 +123,7 @@ - Декорация1КонтекстноеМеню + ДекорацияРазделительКонтекстноеМеню 31 true @@ -174,8 +174,12 @@ true + + <key>ru</key> + <value>Настройки номера порта и типа соединения</value> + - Группа1РасширеннаяПодсказка + ГруппаНастройкиПортаИТипаСоединенияРасширеннаяПодсказка 29 Label true diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form index cc2c9937a..9b445e722 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form @@ -67,6 +67,10 @@ Получатели 64 + + <key>ru</key> + <value>Получатели</value> + true true @@ -110,6 +114,7 @@ true InputField + Auto true Left true @@ -174,10 +179,6 @@ ru Получатель наименование и почта - - ru - Получатель наименование и почта - false ПолучательНаименованиеИПочтаРасширеннаяПодсказка @@ -319,10 +320,10 @@ true - + <key>ru</key> - <value>Группа командная панель получатели</value> - </toolTip> + <value>Командная панель получатели</value> + ГруппаКоманднаяПанельПолучателиРасширеннаяПодсказка 100 @@ -347,7 +348,7 @@ <key>ru</key> - <value>Группа командная панель формы</value> + <value>Командная панель формы</value> ru @@ -490,9 +491,6 @@ CommonPicture.СостоянияПользователей - None - None - None true @@ -561,7 +559,7 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> ГруппаКоманднаяПанельРасширеннаяПодсказка @@ -583,10 +581,6 @@ -1 Left - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl index ce0b9dcaf..d58e0a53b 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl @@ -28,29 +28,6 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) - - Если Получатели.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Фильтр = Новый Структура("Исключен", Ложь); - КоличествоПолучателей = Получатели.НайтиСтроки(Фильтр).Количество(); - Если КоличествоПолучателей > 0 Тогда - Возврат; - КонецЕсли; - - Отказ = Истина; - - Если ЗавершениеРаботы Тогда - Возврат; - КонецЕсли; - - ПоказатьПредупреждение(, НСтр("ru = 'Требуется указать хотя бы одного получателя'")); - -КонецПроцедуры - #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -290,11 +267,25 @@ &НаСервере Процедура УстановитьУсловноеОформление() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "ПолучателиПолучатель, ПолучателиИсключен"; - Инструкция.Отборы.Вставить("Получатели.Исключен", Истина); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + + УсловноеОформление.Элементы.Очистить(); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолучателиПолучатель.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолучателиИсключен.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Получатели.Исключен"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет); + КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form index 05f9d08b9..b569478de 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -170,9 +174,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form index b6d12700f..394e4bfa5 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 84 @@ -181,10 +177,6 @@ ru Важные команды - - ru - Важные команды - ВажныеКомандыРасширеннаяПодсказка 90 @@ -261,10 +253,6 @@ ru Команды поиска - - ru - Команды поиска - КомандыПоискаРасширеннаяПодсказка 100 @@ -374,10 +362,6 @@ ru Общие команды - - ru - Общие команды - ОбщиеКомандыРасширеннаяПодсказка 88 @@ -480,10 +464,6 @@ ru Второстепенные команды - - ru - Второстепенные команды - ВторостепенныеКомандыРасширеннаяПодсказка 128 @@ -670,10 +650,6 @@ ru Настройка списка - - ru - Настройка списка - НастройкаСпискаРасширеннаяПодсказка 116 @@ -776,10 +752,6 @@ ru Режим просмотра - - ru - Режим просмотра списка - РежимПросмотраСпискаРасширеннаяПодсказка 114 @@ -834,10 +806,6 @@ ru Список - - ru - Изменить список - ИзменитьСписокРасширеннаяПодсказка 106 @@ -863,10 +831,6 @@ ru Основные команды - - ru - Основные команды - ОсновныеКомандыРасширеннаяПодсказка 55 @@ -914,10 +878,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 86 @@ -936,6 +896,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -1026,6 +990,10 @@ Картинка 32 + + <key>ru</key> + <value>Статус последнего запуска</value> + true true @@ -1113,10 +1081,6 @@ ru Последний запуск с картинкой - - ru - Последний запуск с картинкой - ПоследнийЗапускСКартинкойExtendedTooltip 64 @@ -1189,6 +1153,10 @@ ПериодичностьРасписания 51 + + <key>ru</key> + <value>Периодичность расписания</value> + true true @@ -1231,10 +1199,6 @@ ru Расписание с картинкой - - ru - Расписание с картинкой - РасписаниеСКартинкойExtendedTooltip 67 @@ -1255,6 +1219,10 @@ УспешныйЗапуск 154 + + <key>ru</key> + <value>Успешный запуск</value> + true true @@ -1326,6 +1294,10 @@ Состояние 26 + + <key>ru</key> + <value>Состояние</value> + true true @@ -1692,9 +1664,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -1799,6 +1768,7 @@ Рассылки.Архивировать, Рассылки.ИмяАрхива, Состояние.ПоследнийЗапуск, + Состояние.СОшибками, ВЫБОР КОГДА Состояние.Выполнена ТОГДА Состояние.ПоследнийЗапуск diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl index 476b91b8b..ec4db16f4 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl @@ -6,6 +6,10 @@ Возврат; КонецЕсли; + Если Параметры.Свойство("Отображение") Тогда + Элементы.Список.Отображение = ОтображениеТаблицы[Параметры.Отображение]; + КонецЕсли; + СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата( Список, "ПоследнийЗапуск", @@ -62,10 +66,17 @@ Ложь); КонецЕсли; - Если НЕ Пользователи.РолиДоступны("ДобавлениеИзменениеРассылокОтчетов") Тогда + Если Не Пользователи.РолиДоступны("ДобавлениеИзменениеРассылокОтчетов") Тогда // Режим показа только личных рассылок - скрываются группы и лишние колонки. Элементы.Список.Отображение = ОтображениеТаблицы.Список; - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "ЭтоГруппа", Ложь, , , Истина, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, + "ЭтоГруппа", + Ложь, + , + , + Истина, + РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный); КонецЕсли; Список.Параметры.УстановитьЗначениеПараметра("ПустаяДата", '00010101'); @@ -74,7 +85,8 @@ Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияВыполненаСОшибками", НСтр("ru = 'Выполнена с ошибками'")); Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияВыполнена", НСтр("ru = 'Выполнена'")); - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") + Или Не ПравоДоступа("Изменение", Метаданные.Справочники.РассылкиОтчетов) Тогда Элементы.ИзменитьВыделенные.Видимость = Ложь; Элементы.ИзменитьВыделенныеСписок.Видимость = Ложь; КонецЕсли; diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form index 7e9ff1eae..370fafec5 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form @@ -91,7 +91,7 @@ <key>ru</key> - <value>Группа рассылка подготовлена</value> + <value>Рассылка подготовлена</value> ГруппаРассылкаПодготовленаExtendedTooltip @@ -394,7 +394,7 @@ <key>ru</key> - <value>Группа вид рассылки</value> + <value>Вид рассылки</value> ГруппаВидРассылкиExtendedTooltip @@ -424,6 +424,10 @@ Отчеты 218 + + <key>ru</key> + <value>Отчеты</value> + true true @@ -654,10 +658,6 @@ ru Команды перемещения - - ru - Команды перемещения - КомандыПеремещенияРасширеннаяПодсказка 1005 @@ -708,10 +708,6 @@ ru Командная панель отчеты - - ru - Командная панель отчеты - КоманднаяПанельОтчетыРасширеннаяПодсказка 716 @@ -884,9 +880,6 @@ true true true - None - None - None true @@ -902,6 +895,10 @@ ПустыеНастройки 657 + + <key>ru</key> + <value>Пустые настройки</value> + true true @@ -1166,9 +1163,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true @@ -1181,10 +1175,6 @@ ru Пустая страница - - ru - Пустая страница - ПустаяСтраницаExtendedTooltip 722 @@ -1208,6 +1198,10 @@ ПользовательскиеНастройки 187 + + <key>ru</key> + <value>Пользовательские настройки</value> + true true @@ -1351,10 +1345,6 @@ ru Пользовательские настройки группа колонок - - ru - Пользовательские настройки группа колонок - ПользовательскиеНастройкиГруппаКолонокРасширеннаяПодсказка 730 @@ -1513,6 +1503,10 @@ true + + <key>ru</key> + <value>Пользовательские настройки группа колонок 1</value> + ПользовательскиеНастройкиГруппаКолонок1РасширеннаяПодсказка 734 @@ -1789,9 +1783,6 @@ Auto true true - None - None - None true All Show @@ -1805,10 +1796,6 @@ ru Страница компоновщик - - ru - Страница компоновщик - СтраницаКомпоновщикExtendedTooltip 727 @@ -1831,6 +1818,10 @@ НастройкиТекущегоОтчета 234 + + <key>ru</key> + <value>Настройки текущего отчета</value> + true true @@ -2154,9 +2145,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true @@ -2169,10 +2157,6 @@ ru Страница настройки текущего отчета - - ru - Страница настройки текущего отчета - СтраницаНастройкиТекущегоОтчетаExtendedTooltip 738 @@ -2198,10 +2182,6 @@ ru Настройки отчета: - - ru - Страницы настроек отчета - СтраницыНастроекОтчетаExtendedTooltip 721 @@ -2602,7 +2582,7 @@ <key>ru</key> - <value>Группа периодичность</value> + <value>Периодичность</value> ГруппаПериодичностьExtendedTooltip @@ -2718,7 +2698,7 @@ <key>ru</key> - <value>Группа строка период повтора дней</value> + <value>Строка период повтора дней</value> ГруппаСтрокаПериодПовтораДнейExtendedTooltip @@ -3044,7 +3024,7 @@ <key>ru</key> - <value>Группа дни недели</value> + <value>Дни недели</value> ГруппаДниНеделиРасширеннаяПодсказка @@ -3289,7 +3269,7 @@ <key>ru</key> - <value>Группа строка ежемесячных параметров</value> + <value>Строка ежемесячных параметров</value> ГруппаСтрокаЕжемесячныхПараметровExtendedTooltip @@ -3963,10 +3943,10 @@ true - + <key>ru</key> - <value>Группа пометки</value> - </toolTip> + <value>Пометки</value> + Center ГруппаПометкиРасширеннаяПодсказка @@ -3993,6 +3973,10 @@ true + + <key>ru</key> + <value>Месяцы</value> + ГруппаМесяцыРасширеннаяПодсказка 780 @@ -4390,10 +4374,6 @@ ru Использовать папку - - ru - Использовать папку - ИспользоватьПапкуExtendedTooltip 813 @@ -4561,10 +4541,6 @@ ru Использовать сетевой каталог - - ru - Использовать сетевой каталог - ИспользоватьСетевойКаталогExtendedTooltip 815 @@ -4685,6 +4661,10 @@ true + + <key>ru</key> + <value>Использовать FTP ресурс</value> + ИспользоватьFTPРесурсExtendedTooltip 818 @@ -4710,10 +4690,6 @@ ru Параметры доставки - - ru - Параметры доставки - ПараметрыДоставкиExtendedTooltip 812 @@ -4851,7 +4827,7 @@ <key>ru</key> - <value>Группа доставка по электронной почте</value> + <value>Доставка по электронной почте</value> ГруппаДоставкаПоЭлектроннойПочтеРасширеннаяПодсказка @@ -4996,7 +4972,7 @@ <key>ru</key> - <value>Группа учетная запись</value> + <value>Учетная запись</value> ГруппаУчетнаяЗаписьExtendedTooltip @@ -5837,10 +5813,6 @@ ru Стандартные действия - - ru - Стандартные действия - СтандартныеДействияExtendedTooltip 860 @@ -5864,10 +5836,6 @@ ru Командная панель текст письма форматированный документ - - ru - Командная панель текст письма форматированный документ - КоманднаяПанельТекстПисьмаФорматированныйДокументExtendedTooltip 845 @@ -6198,10 +6166,6 @@ ru Страницы текст письма HTML - - ru - Страницы текст письма HTML - СтраницыТекстПисьмаHTMLExtendedTooltip 844 @@ -6585,10 +6549,6 @@ ru Командная панель текст письма - - ru - Командная панель текст письма - КоманднаяПанельТекстПисьмаExtendedTooltip 879 @@ -7026,10 +6986,6 @@ ru Доставка по электронной почте - - ru - Доставка по электронной почте - ДоставкаПоЭлектроннойПочтеExtendedTooltip 821 @@ -7142,6 +7098,10 @@ ФорматыОтчетов 100 + + <key>ru</key> + <value>Форматы отчетов</value> + true true @@ -7554,9 +7514,6 @@ Auto true true - None - None - None true @@ -7674,6 +7631,41 @@ Auto + + ТранслитерироватьИменаФайлов + 1180 + true + true + + true + + + Объект.ТранслитерироватьИменаФайлов + + Right + Button + + ТранслитерироватьИменаФайловРасширеннаяПодсказка + 1182 + Label + true + true + + Left + + + + ТранслитерироватьИменаФайловКонтекстноеМеню + 1181 + true + + CheckBoxField + Enter + true + Left + true + + ГруппаПараметрыАрхивацииВZIP 98 @@ -8349,10 +8341,6 @@ ru Общие команды - - ru - Общие команды - ОбщиеКомандыРасширеннаяПодсказка 995 @@ -8377,10 +8365,6 @@ ru Кнопки - - ru - Кнопки - КнопкиРасширеннаяПодсказка 960 diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl index 81befc669..a13da6b12 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -27,10 +27,10 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - УстановитьУсловноеОформление(); ТекстОшибкиПриОткрытии = РассылкаОтчетовПовтИсп.ТекстОшибкиПроверкиПраваДобавления(); Если ЗначениеЗаполнено(ТекстОшибкиПриОткрытии) Тогда @@ -47,7 +47,7 @@ КонецЕсли; // Удаление варианта "В сетевой каталог", если режим работы в модели сервиса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда СпособДоставкиСетевойКаталог = Элементы.ДругойСпособДоставки.СписокВыбора.НайтиПоЗначению("ИспользоватьСетевойКаталог"); Элементы.ДругойСпособДоставки.СписокВыбора.Удалить(СпособДоставкиСетевойКаталог); КонецЕсли; @@ -196,7 +196,7 @@ Элементы.ПустыеНастройки.ОтборСтрок = Новый ФиксированнаяСтруктура("ИндексКартинки", 200); // Список выбора почтовых адресов автора. - ПолучитьСписокПочтовыхАдресов(Объект.Автор, Элементы.ВидПочтовогоАдресаАвтора.СписокВыбора); + ПочтовыеАдресаПолучателя(Объект.Автор, Элементы.ВидПочтовогоАдресаАвтора.СписокВыбора); // Список выбора почтовых адресов автора. ПодключитьКэшНастроекЭлектроннойПочты(); @@ -836,7 +836,8 @@ Процедура АвторПриИзменении(Элемент) ТекущийСписок = Элементы.ВидПочтовогоАдресаАвтора.СписокВыбора; ТекущийСписок.Очистить(); - НовыйСписок = ПолучитьСписокПочтовыхАдресов(Объект.Автор); + НовыйСписок = Новый СписокЗначений; + ПочтовыеАдресаПолучателя(Объект.Автор, НовыйСписок); Для Каждого ЭлементСписка Из НовыйСписок Цикл ЗаполнитьЗначенияСвойств(ТекущийСписок.Добавить(), ЭлементСписка); КонецЦикла; @@ -2265,15 +2266,7 @@ &НаКлиентеНаСервереБезКонтекста Процедура ПереключитьСтраницу(Элементы, ИмяНабораСтраниц, СуффиксТекущейСтраницы) - ГруппаСтраниц = Элементы[ИмяНабораСтраниц]; - ТекущаяСтраница = Элементы[ИмяНабораСтраниц + СуффиксТекущейСтраницы]; - ГруппаСтраниц.ТекущаяСтраница = ТекущаяСтраница; - // Для платформы (в некоторых случаях страница не переключается с поля HTML документа). - Для Каждого Страница Из ГруппаСтраниц.ПодчиненныеЭлементы Цикл - Если ТипЗнч(Страница) = Тип("ГруппаФормы") Тогда - Страница.Видимость = (Страница = ТекущаяСтраница); - КонецЕсли; - КонецЦикла; + Элементы[ИмяНабораСтраниц].ТекущаяСтраница = Элементы[ИмяНабораСтраниц + СуффиксТекущейСтраницы]; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста @@ -2567,10 +2560,7 @@ Если Изменения = "" Или Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРасписание Тогда Элементы.ПредставлениеРасписания.Видимость = Объект.ВыполнятьПоРасписанию; Если Объект.ВыполнятьПоРасписанию Тогда - ПредставлениеРасписания = Строка(Форма.Расписание); - ПредставлениеРасписания = ВРег(Лев(ПредставлениеРасписания, 1)) + Сред(ПредставлениеРасписания, 2); - ПредставлениеРасписания = СтрЗаменить(СтрЗаменить(ПредставлениеРасписания, " ", " "), " ]", "]") + "."; - Элементы.ПредставлениеРасписания.Заголовок = ПредставлениеРасписания; + Элементы.ПредставлениеРасписания.Заголовок = СтандартныеПодсистемыКлиентСервер.ПредставлениеРасписания(Форма.Расписание); КонецЕсли; КонецЕсли; КонецПроцедуры @@ -2652,39 +2642,26 @@ // Вызов сервера, Сервер &НаСервереБезКонтекста -Функция ПолучитьСписокПочтовыхАдресов(Получатель, СписокЗначений = Неопределено) - ТекстЗапроса = - "ВЫБРАТЬ - | тчКонтактнаяИнформация.Представление КАК Представление, - | тчКонтактнаяИнформация.Вид КАК Значение - |ИЗ - | Справочник.Пользователи.КонтактнаяИнформация КАК тчКонтактнаяИнформация - |ГДЕ - | тчКонтактнаяИнформация.Ссылка = &Получатель - | И тчКонтактнаяИнформация.Тип = &ТипКИ"; +Функция ПочтовыеАдресаПолучателя(Получатель, СписокЗначений) + + Получатели = Новый Массив; + Получатели.Добавить(Получатель); + ТипыКонтактнойИнформации = Новый Массив; + ТипыКонтактнойИнформации.Добавить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); Попытка - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Пользователи", Получатель.Метаданные().Имя); + ПочтовыеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(Получатели, ТипыКонтактнойИнформации); Исключение Возврат СписокЗначений; КонецПопытки; - Если СписокЗначений = Неопределено Тогда - СписокЗначений = Новый СписокЗначений; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Получатель", Получатель); - Запрос.УстановитьПараметр("ТипКИ", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); - Запрос.Текст = ТекстЗапроса; - - ТЗИтог = Запрос.Выполнить().Выгрузить(); - Для Каждого СтрИтог Из ТЗИтог Цикл - Если ЗначениеЗаполнено(СтрИтог.Представление) Тогда - СписокЗначений.Добавить(СтрИтог.Значение, СтрИтог.Представление +" ("+ Строка(СтрИтог.Значение) +")"); + Для Каждого ПочтовыйАдрес Из ПочтовыеАдреса Цикл + Если ЗначениеЗаполнено(ПочтовыйАдрес.Представление) Тогда + СписокЗначений.Добавить(ПочтовыйАдрес.Вид, ПочтовыйАдрес.Представление + " (" + Строка(ПочтовыйАдрес.Вид) + ")"); КонецЕсли; КонецЦикла; Возврат СписокЗначений; + КонецФункции &НаСервереБезКонтекста @@ -2956,19 +2933,41 @@ &НаСервере Процедура УстановитьУсловноеОформление() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "НастройкиТекущегоОтчета"; - Инструкция.Отборы.Вставить("НастройкиТекущегоОтчета.Обнаружен", Ложь); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Инструкция.Оформление.Вставить("Доступность", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + + УсловноеОформление.Элементы.Очистить(); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НастройкиТекущегоОтчета.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НастройкиТекущегоОтчета.Обнаружен"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Отчеты.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФорматыОтчетов.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Отчеты.Доступность"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "Отчеты, ФорматыОтчетов"; - Инструкция.Отборы.Вставить("Объект.Отчеты.Доступность", Ложь); - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Инструкция.Оформление.Вставить("ТолькоПросмотр", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); КонецПроцедуры &НаСервереБезКонтекста @@ -3137,7 +3136,7 @@ // Параметры журнала ПараметрыЖурнала = Новый Структура; ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Инициализация отчета'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); - ПараметрыЖурнала.Вставить("Данные", Объект.Ссылка); + ПараметрыЖурнала.Вставить("Данные", ?(ЗначениеЗаполнено(Объект.Ссылка), Объект.Ссылка, СтрокаОтчеты.Отчет)); ПараметрыЖурнала.Вставить("Метаданные", Метаданные.Справочники.РассылкиОтчетов); ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив); @@ -3239,7 +3238,7 @@ ВариантСсылка = СтрокаОтчетыПараметры.ВариантСсылка; Иначе ОтчетИнформация = ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(СтрокаОтчетыПараметры.ОтчетПолноеИмя); - ВариантСсылка = ВариантыОтчетов.ПолучитьСсылку(ОтчетИнформация.Отчет, СтрокаОтчетыПараметры.КлючВарианта); + ВариантСсылка = ВариантыОтчетов.ВариантОтчета(ОтчетИнформация.Отчет, СтрокаОтчетыПараметры.КлючВарианта); КонецЕсли; Если ВариантСсылка.ПометкаУдаления Тогда @@ -3305,8 +3304,13 @@ ПараметрыЗаписи.Шаг = 2; // Вопрос. Обработчик = Новый ОписаниеОповещения("ЗаписатьНаКлиенте", ЭтотОбъект, ПараметрыЗаписи); - Разрешения = РазрешенияНаРесурсыСервера(); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Разрешения, ЭтотОбъект, Обработчик); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Разрешения = РазрешенияНаРесурсыСервера(); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Разрешения, ЭтотОбъект, Обработчик); + Иначе + ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК); + КонецЕсли; ИначеЕсли ПараметрыЗаписи.Шаг = 1 Тогда // Вопрос не нужен. ПараметрыЗаписи.Шаг = 3; @@ -3407,7 +3411,8 @@ &НаСервере Функция РазрешенияНаРесурсыСервера() РазрешенияНабор = РассылкаОтчетов.РазрешенияНаРесурсыСервера(Объект); - РазрешенияСсылка = РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(РазрешенияНабор, Объект.Ссылка); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + РазрешенияСсылка = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(РазрешенияНабор, Объект.Ссылка); РазрешенияМассивСсылок = Новый Массив; РазрешенияМассивСсылок.Добавить(РазрешенияСсылка); Возврат РазрешенияМассивСсылок; diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl index 3ae489d6a..fe661636e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -18,6 +22,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo index c0fedced9..86243d5b5 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo +++ b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo @@ -93,7 +93,7 @@ ru Краткое представление рассылки отчетов. -Выводится пользователю при доставке по почте. +Может использоваться в теме или тексте письма при доставке по почте. Use @@ -777,6 +777,25 @@ Use Use + + ТранслитерироватьИменаФайлов + + ru + Транслитерировать имена файлов + + + Boolean + + + ru + Сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Отчет.mxl" будет сохранен с именем "Otchet.mxl". + + + + + Use + Use + УдалитьFTPПароль diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form index fee33b64b..7b70199ee 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form @@ -63,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -263,9 +267,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form index f9691c9c1..9f6c003d7 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form @@ -44,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 33 @@ -67,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -314,6 +314,10 @@ true + + <key>ru</key> + <value>Информация о роли</value> + ГруппаExtendedTooltip 20 @@ -370,6 +374,10 @@ true + + <key>ru</key> + <value>Основное</value> + ОсновноеExtendedTooltip 19 @@ -501,9 +509,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl index b068e5bca..6ae7a6224 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl @@ -91,7 +91,7 @@ КонецЕсли; Список.ТекстЗапроса = ТекстЗапроса; - КонецПроцедуры +КонецПроцедуры &НаСервере Процедура УстановитьУсловноеОформление() diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form index 80e4a275c..fb41d576b 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form @@ -163,6 +163,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ГруппаШапкаExtendedTooltip 39 @@ -253,12 +257,8 @@ <key>ru</key> - <value>Группа назначение</value> + <value>Назначение</value> - - ru - Группа назначение - ГруппаНазначениеРасширеннаяПодсказка 58 @@ -501,6 +501,10 @@ true + + <key>ru</key> + <value>Типы объектов адресации</value> + ГруппаТипыОбъектовАдресацииExtendedTooltip 51 @@ -636,6 +640,10 @@ true + + <key>ru</key> + <value>Комментарий</value> + ГруппаКомментарийExtendedTooltip 55 diff --git a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl index 4cc5a78a1..eef2d383f 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -22,6 +23,10 @@ Возврат Результат КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl index ac29c4fe3..f0426dc66 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl @@ -39,7 +39,7 @@ Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей") Тогда Если ЭтотОбъект.Назначение.Найти(Справочники.Пользователи.ПустаяСсылка(), "ТипПользователей") = Неопределено Тогда - // При отключенных внешних пользователях, роль всегда должна быть назначена пользователям.". + // При отключенных внешних пользователях, роль всегда должна быть назначена пользователям. ЭтотОбъект.Назначение.Добавить().ТипПользователей = Справочники.Пользователи.ПустаяСсылка(); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo b/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo index 62141f560..e711a1d7f 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo +++ b/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo @@ -142,6 +142,7 @@ Catalog.РолиИсполнителей.Form.ФормаЭлемента Catalog.РолиИсполнителей.Form.ФормаСписка Catalog.РолиИсполнителей.Form.ФормаВыбора + DontUse ИспользуетсяБезОбъектовАдресации diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form index 21627f3b7..3c5841dac 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form @@ -99,7 +99,7 @@ <key>ru</key> - <value>Группа сертификаты недоступны на клиенте</value> + <value>Сертификаты недоступны на клиенте</value> ГруппаСертификатыНедоступныНаКлиентеРасширеннаяПодсказка @@ -199,7 +199,7 @@ <key>ru</key> - <value>Группа сертификаты недоступны на сервере</value> + <value>Сертификаты недоступны на сервере</value> ГруппаСертификатыНедоступныНаСервереРасширеннаяПодсказка @@ -227,12 +227,8 @@ <key>ru</key> - <value>Группа предупреждения недоступности сертификатов</value> + <value>Предупреждения недоступности сертификатов</value> - - ru - Группа предупреждения недоступности сертификатов - ГруппаПредупрежденияНедоступностиСертификатовРасширеннаяПодсказка 786 @@ -255,6 +251,10 @@ Сертификаты 217 + + <key>ru</key> + <value>Сертификаты</value> + true true @@ -686,9 +686,6 @@ true true true - None - None - None true @@ -926,187 +923,38 @@ ГруппаОписаниеСертификата 523 - - ВертикальнаяГруппа4 - 854 - - СертификатОписаниеДанных - 751 + + СертификатОписаниеДанных + 751 + + <key>ru</key> + <value>Сертификат описание данных</value> + + true + true + + true + + + СертификатОписаниеДанных + + true + None + + СертификатОписаниеДанныхСвойство + 755 true true true - СертификатОписаниеДанных + СертификатОписаниеДанных.Свойство true - None - - СертификатОписаниеДанныхСвойство - 755 - true - true - - true - - - СертификатОписаниеДанных.Свойство - - true - - СертификатОписаниеДанныхСвойствоРасширеннаяПодсказка - 757 - Label - true - true - - Left - - - - СертификатОписаниеДанныхСвойствоКонтекстноеМеню - 756 - true - - InputField - Auto - true - Left - true - - 13 - true - true - false - true - true - true - true - Normal - - - - СертификатОписаниеДанныхЗначение - 758 - true - true - - true - - - СертификатОписаниеДанных.Значение - - true - - СертификатОписаниеДанныхЗначениеРасширеннаяПодсказка - 760 - Label - true - true - - Left - - - - СертификатОписаниеДанныхЗначениеКонтекстноеМеню - 759 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - СертификатОписаниеДанныхКоманднаяПанель - 753 - Left - - - СертификатОписаниеДанныхСтрокаПоиска - 770 - - СертификатОписаниеДанныхСтрокаПоискаРасширеннаяПодсказка - 772 - Label - true - true - - Left - - - - СертификатОписаниеДанныхСтрокаПоискаКонтекстноеМеню - 771 - true - - СертификатОписаниеДанных - - true - - - - СертификатОписаниеДанныхСостояниеПросмотра - 773 - - СертификатОписаниеДанныхСостояниеПросмотраРасширеннаяПодсказка - 775 - Label - true - true - - Left - - - - СертификатОписаниеДанныхСостояниеПросмотраКонтекстноеМеню - 774 - true - - ViewStatusAddition - СертификатОписаниеДанных - - true - - - - СертификатОписаниеДанныхУправлениеПоиском - 776 - - СертификатОписаниеДанныхУправлениеПоискомРасширеннаяПодсказка - 778 - Label - true - true - - Left - - - - СертификатОписаниеДанныхУправлениеПоискомКонтекстноеМеню - 777 - true - - SearchControlAddition - СертификатОписаниеДанных - - true - - - СертификатОписаниеДанныхРасширеннаяПодсказка - 754 + СертификатОписаниеДанныхСвойствоРасширеннаяПодсказка + 757 Label true true @@ -1115,80 +963,8 @@ - СертификатОписаниеДанныхКонтекстноеМеню - 752 - true - - true - true - true - 51 - 51 - 4 - true - true - MultiRow - Row - 1 - 1 - AutoUse - true - true - false - false - false - true - Auto - Auto - true - true - true - None - None - None - true - - - - СертификатНаименование - 247 - true - true - - true - - - СертификатНаименование - - Button - - СертификатНаименованиеРасширеннаяПодсказка - 249 - - <key>ru</key> - <value>Уникальное представление сертификата используется в полях выбора при подписании и -шифровании. Оно формируется из фамилии, имени, организации, должности и срока действия. -Например: "Иванов Иван, ООО 1С, Программист, до 03.2017". - -Когда у пользователя два сертификата от разных удостоверяющих центров (УЦ), -тогда представление нужно дополнить именем УЦ. -Например: "Иванов Иван, ООО 1С, Программист, до 03.2017, УЦ 1С". - -Когда сертификат используется для специальной цели разными пользователями, -тогда представление нужно заменить на описание этой цели, например: -"Для подписания счетов-фактур, до 05.2019", -"Для подписания налоговой отчетности, до 12.2015".</value> - - Label - true - true - - Left - - - - СертификатНаименованиеКонтекстноеМеню - 248 + СертификатОписаниеДанныхСвойствоКонтекстноеМеню + 756 true InputField @@ -1197,53 +973,7 @@ Left true - 40 - true - true - true - true - true - true - Normal - - - - СертификатПользователь - 779 - true - true - - true - - - СертификатПользователь - - - ru - Текст подсказки устанавливается из реквизита справочника. - - - СертификатПользовательРасширеннаяПодсказка - 781 - Label - true - true - - Left - - - - СертификатПользовательКонтекстноеМеню - 780 - true - - InputField - Enter - true - Left - true - - 35 + 13 true true false @@ -1255,23 +985,20 @@ - СертификатОрганизация - 253 + СертификатОписаниеДанныхЗначение + 758 true true true - СертификатОрганизация + СертификатОписаниеДанных.Значение - - ru - Текст подсказки устанавливается из реквизита справочника. - + true - СертификатОрганизацияРасширеннаяПодсказка - 255 + СертификатОписаниеДанныхЗначениеРасширеннаяПодсказка + 760 Label true true @@ -1280,55 +1007,36 @@ - СертификатОрганизацияКонтекстноеМеню - 254 + СертификатОписаниеДанныхЗначениеКонтекстноеМеню + 759 true InputField - Enter + Auto true Left true - 35 true true - false true true true true Normal - DontUse - - СертификатУсиленнаяЗащитаЗакрытогоКлюча - 528 - true - true - - true - - - СертификатУсиленнаяЗащитаЗакрытогоКлюча - - Right - - ru - Уточняет, что пароль к закрытому ключу сертификата будет вводиться в отдельном окне -программой электронной подписи и шифрования, а не программой 1С:Предприятие. - -Только для сертификатов, которые выпущены с усиленной защитой закрытого ключа. - - Button - - OnChange - СертификатУсиленнаяЗащитаЗакрытогоКлючаПриИзменении - + + СертификатОписаниеДанныхКоманднаяПанель + 753 + Left + + + СертификатОписаниеДанныхСтрокаПоиска + 770 - СертификатУсиленнаяЗащитаЗакрытогоКлючаРасширеннаяПодсказка - 530 + СертификатОписаниеДанныхСтрокаПоискаРасширеннаяПодсказка + 772 Label true true @@ -1337,119 +1045,21 @@ - СертификатУсиленнаяЗащитаЗакрытогоКлючаКонтекстноеМеню - 529 + СертификатОписаниеДанныхСтрокаПоискаКонтекстноеМеню + 771 true - CheckBoxField - Enter - true - Left - true - - - - ГоризонтальнаяГруппа2 - 835 - - Пароль - 355 - true - true - - true - - - Пароль - - - ru - Введите пароль к закрытому ключу сертификата -для проверки ключа перед выбором сертификата. - - - OnChange - ПарольПриИзменении - - - ПарольРасширеннаяПодсказка - 357 - Label - true - true - - Left - - - - ПарольКонтекстноеМеню - 356 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - Normal - - - - ПарольПояснение - 741 - - <key>ru</key> - <value>(для проверки)</value> - - true - true - - true - - - ПарольПояснениеРасширеннаяПодсказка - 743 - Label - true - true - - Left - - - - ПарольПояснениеКонтекстноеМеню - 742 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Горизонтальная группа 2</value> - + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхСостояниеПросмотра + 773 - ГоризонтальнаяГруппа2РасширеннаяПодсказка - 836 + СертификатОписаниеДанныхСостояниеПросмотраРасширеннаяПодсказка + 775 Label true true @@ -1457,308 +1067,23 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + СертификатОписаниеДанныхСостояниеПросмотраКонтекстноеМеню + 774 + true + + ViewStatusAddition + СертификатОписаниеДанных + + true - - - ВертикальнаяГруппа3 - 852 - - ВертикальнаяГруппа2 - 843 - - Страницы - 816 - - СтраницаЗапоминаниеПароля - 818 - - ЗапомнитьПароль - 820 - true - true - - true - - - ЗапомнитьПароль - - Right - - ru - Запомнить пароль сертификата до закрытия программы. При снятии флажка пароль стирается из памяти, если запоминался ранее. - - Button - - OnChange - ЗапомнитьПарольПриИзменении - - - ЗапомнитьПарольРасширеннаяПодсказка - 822 - Label - true - true - - Left - - - - ЗапомнитьПарольКонтекстноеМеню - 821 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Страница запоминание пароля</value> - - - СтраницаЗапоминаниеПароляРасширеннаяПодсказка - 819 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаПояснениеУсиленногоПароля - 823 - - ПояснениеУсиленногоПароля - 825 - - <key>ru</key> - <value>Нажмите Выбрать, чтобы перейти к вводу пароля. -</value> - - true - true - - true - - - ru - Пароль запрашивает программа электронной подписи, а не программа 1С:Предприятие, -так как для выбранного сертификата указана усиленная защита закрытого ключа. - - Button - - ПояснениеУсиленногоПароляРасширеннаяПодсказка - 827 - Label - true - true - - Left - - - - ПояснениеУсиленногоПароляКонтекстноеМеню - 826 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Страница пояснение усиленного пароля</value> - - - СтраницаПояснениеУсиленногоПароляРасширеннаяПодсказка - 824 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаПояснениеУстановленногоПароля - 828 - - ПояснениеУстановленногоПароля - 830 - true - true - - true - - Button - - ПояснениеУстановленногоПароляРасширеннаяПодсказка - 832 - Label - true - true - - - URLProcessing - ПояснениеУстановленногоПароляРасширеннаяПодсказкаОбработкаНавигационнойСсылки - - Left - - - - ПояснениеУстановленногоПароляКонтекстноеМеню - 831 - true - - Label - true - true - - Style.ПоясняющийТекст - - - - Click - ПояснениеУстановленногоПароляНажатие - - Left - - - true - true - - true - - - <key>ru</key> - <value>Страница пояснение установленного пароля</value> - - - СтраницаПояснениеУстановленногоПароляРасширеннаяПодсказка - 829 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Страницы</value> - - - ru - Страницы - - - СтраницыРасширеннаяПодсказка - 817 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - <key>ru</key> - <value>Вертикальная группа 2</value> - - - ВертикальнаяГруппа2РасширеннаяПодсказка - 844 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Вертикальная группа 3</value> - + + + СертификатОписаниеДанныхУправлениеПоиском + 776 - ВертикальнаяГруппа3РасширеннаяПодсказка - 853 + СертификатОписаниеДанныхУправлениеПоискомРасширеннаяПодсказка + 778 Label true true @@ -1766,30 +1091,20 @@ Left - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto + + СертификатОписаниеДанныхУправлениеПоискомКонтекстноеМеню + 777 + true + + SearchControlAddition + СертификатОписаниеДанных + + true - - true - true - - true - - - <key>ru</key> - <value>Вертикальная группа 4</value> - - true + - ВертикальнаяГруппа4РасширеннаяПодсказка - 855 + СертификатОписаниеДанныхРасширеннаяПодсказка + 754 Label true true @@ -1797,15 +1112,37 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + + СертификатОписаниеДанныхКонтекстноеМеню + 752 + true + + true + true + true + 51 + 51 + 4 + true + true + MultiRow + Row + 1 + 1 + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + ПоказатьДанныеСертификата @@ -1840,6 +1177,10 @@ true + + <key>ru</key> + <value>Описание сертификата</value> + ГруппаОписаниеСертификатаРасширеннаяПодсказка 524 @@ -1859,6 +1200,657 @@ Auto + + СертификатНаименование + 247 + true + true + + true + + + СертификатНаименование + + Button + + СертификатНаименованиеРасширеннаяПодсказка + 249 + + <key>ru</key> + <value>Уникальное представление сертификата используется в полях выбора при подписании и +шифровании. Оно формируется из фамилии, имени, организации, должности и срока действия. +Например: "Иванов Иван, ООО 1С, Программист, до 03.2017". + +Когда у пользователя два сертификата от разных удостоверяющих центров (УЦ), +тогда представление нужно дополнить именем УЦ. +Например: "Иванов Иван, ООО 1С, Программист, до 03.2017, УЦ 1С". + +Когда сертификат используется для специальной цели разными пользователями, +тогда представление нужно заменить на описание этой цели, например: +"Для подписания счетов-фактур, до 05.2019", +"Для подписания налоговой отчетности, до 12.2015".</value> + + Label + true + true + + Left + + + + СертификатНаименованиеКонтекстноеМеню + 248 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатПользователь + 779 + true + true + + true + + + СертификатПользователь + + + ru + Текст подсказки устанавливается из реквизита справочника. + + + СертификатПользовательРасширеннаяПодсказка + 781 + Label + true + true + + Left + + + + СертификатПользовательКонтекстноеМеню + 780 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатОрганизация + 253 + true + true + + true + + + СертификатОрганизация + + + ru + Текст подсказки устанавливается из реквизита справочника. + + + СертификатОрганизацияРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + + СертификатОрганизацияКонтекстноеМеню + 254 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + DontUse + + + + ГруппаУсиленнаяЗащитаЗакрытогоКлюча + 856 + + СертификатУсиленнаяЗащитаЗакрытогоКлюча + 528 + true + true + + true + + + СертификатУсиленнаяЗащитаЗакрытогоКлюча + + Right + + ru + Уточняет, что пароль к закрытому ключу сертификата будет вводиться в отдельном окне +программой электронной подписи и шифрования, а не программой 1С:Предприятие. + +Только для сертификатов, которые выпущены с усиленной защитой закрытого ключа. + + Button + + OnChange + СертификатУсиленнаяЗащитаЗакрытогоКлючаПриИзменении + + + СертификатУсиленнаяЗащитаЗакрытогоКлючаРасширеннаяПодсказка + 530 + Label + true + true + + Left + + + + СертификатУсиленнаяЗащитаЗакрытогоКлючаКонтекстноеМеню + 529 + true + + CheckBoxField + Enter + true + Left + true + + + + ГоризонтальнаяГруппа2 + 835 + + Пароль + 355 + true + true + + true + + + Пароль + + + ru + Введите пароль к закрытому ключу сертификата +для проверки ключа перед выбором сертификата. + + + OnChange + ПарольПриИзменении + + + ПарольРасширеннаяПодсказка + 357 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 356 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ПарольПояснение + 741 + + <key>ru</key> + <value>(для проверки)</value> + + true + true + + true + + + ПарольПояснениеРасширеннаяПодсказка + 743 + Label + true + true + + Left + + + + ПарольПояснениеКонтекстноеМеню + 742 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа 2</value> + + + ГоризонтальнаяГруппа2РасширеннаяПодсказка + 836 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ВертикальнаяГруппа3 + 852 + + ВертикальнаяГруппа2 + 843 + + Страницы + 816 + + СтраницаЗапоминаниеПароля + 818 + + ЗапомнитьПароль + 820 + true + true + + true + + + ЗапомнитьПароль + + Right + + ru + Запомнить пароль сертификата до закрытия программы. При снятии флажка пароль стирается из памяти, если запоминался ранее. + + Button + + OnChange + ЗапомнитьПарольПриИзменении + + + ЗапомнитьПарольРасширеннаяПодсказка + 822 + Label + true + true + + Left + + + + ЗапомнитьПарольКонтекстноеМеню + 821 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Страница запоминание пароля</value> + + + СтраницаЗапоминаниеПароляРасширеннаяПодсказка + 819 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПояснениеУсиленногоПароля + 823 + + ПояснениеУсиленногоПароля + 825 + + <key>ru</key> + <value>Нажмите Выбрать, чтобы перейти к вводу пароля. +</value> + + true + true + + true + + + ru + Пароль запрашивает программа электронной подписи, а не программа 1С:Предприятие, +так как для выбранного сертификата указана усиленная защита закрытого ключа. + + Button + + ПояснениеУсиленногоПароляРасширеннаяПодсказка + 827 + Label + true + true + + Left + + + + ПояснениеУсиленногоПароляКонтекстноеМеню + 826 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница пояснение усиленного пароля</value> + + + СтраницаПояснениеУсиленногоПароляРасширеннаяПодсказка + 824 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПояснениеУстановленногоПароля + 828 + + ПояснениеУстановленногоПароля + 830 + true + true + + true + + Button + + ПояснениеУстановленногоПароляРасширеннаяПодсказка + 832 + Label + true + true + + + URLProcessing + ПояснениеУстановленногоПароляРасширеннаяПодсказкаОбработкаНавигационнойСсылки + + Left + + + + ПояснениеУстановленногоПароляКонтекстноеМеню + 831 + true + + Label + true + true + + Style.ПоясняющийТекст + + + + Click + ПояснениеУстановленногоПароляНажатие + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница пояснение установленного пароля</value> + + + СтраницаПояснениеУстановленногоПароляРасширеннаяПодсказка + 829 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 817 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа 2</value> + + + ВертикальнаяГруппа2РасширеннаяПодсказка + 844 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа 3</value> + + + ВертикальнаяГруппа3РасширеннаяПодсказка + 853 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Усиленная защита закрытого ключа</value> + + + ГруппаУсиленнаяЗащитаЗакрытогоКлючаРасширеннаяПодсказка + 857 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + true true @@ -1876,6 +1868,7 @@ false false + true ГруппаУточнениеСвойствСертификатаРасширеннаяПодсказка 546 @@ -2014,6 +2007,10 @@ true + + <key>ru</key> + <value>Страница уточнение свойств сертификата</value> + СтраницаУточнениеСвойствСертификатаРасширеннаяПодсказка 242 @@ -2040,10 +2037,6 @@ ru Главные страницы - - ru - Главные страницы - ГлавныеСтраницыРасширеннаяПодсказка 238 @@ -2683,6 +2676,21 @@ true + + ОтборПоОрганизации + + <key>ru</key> + <value>Отбор по организации</value> + + 27 + + + true + + + true + + Далее @@ -2868,6 +2876,10 @@ <types>Boolean</types> </valueType> </parameters> + <parameters> + <name>ОтборПоОрганизации</name> + <valueType/> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl index 600d9cc27..d013c02df 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl @@ -19,6 +19,8 @@ СертификатПараметрыРеквизитов.Вставить("Организация", Параметры.Организация); КонецЕсли; + ОтборПоОрганизации = Параметры.ОтборПоОрганизации; + Если Параметры.ДобавлениеВСписок Тогда ДобавлениеВСписок = Истина; Элементы.Выбрать.Заголовок = НСтр("ru = 'Добавить'"); @@ -258,6 +260,8 @@ &НаКлиенте Процедура Далее(Команда) + Элементы.Далее.Доступность = Ложь; + ПерейтиКВыборуТекущегоСертификата(Новый ОписаниеОповещения( "ДалееПослеПереходаКВыборуТекущегоСертификата", ЭтотОбъект)); @@ -268,6 +272,7 @@ Процедура ДалееПослеПереходаКВыборуТекущегоСертификата(Результат, Контекст) Экспорт Если Результат = Истина Тогда + Элементы.Далее.Доступность = Истина; Возврат; КонецЕсли; @@ -287,6 +292,7 @@ Процедура ДалееПослеОбновленияСпискаСертификатов(Результат, Контекст) Экспорт ПоказатьПредупреждение(, Контекст.ОписаниеОшибки); + Элементы.Далее.Доступность = Истина; КонецПроцедуры @@ -504,7 +510,7 @@ ОшибкаПолученияСертификатовНаСервере = Новый Структура; ЭлектроннаяПодписьСлужебный.ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, - ДобавлениеВСписок, Истина, ОшибкаПолученияСертификатовНаСервере, ПоказыватьВсе); + ДобавлениеВСписок, Истина, ОшибкаПолученияСертификатовНаСервере, ПоказыватьВсе, ОтборПоОрганизации); Если ЗначениеЗаполнено(ОтпечатокВыбранногоСертификата) И ( Элементы.Сертификаты.ТекущаяСтрока = Неопределено @@ -642,6 +648,10 @@ Контекст.СохраненныеСвойства = СохраненныеСвойстваСертификата(Контекст.ТекущиеДанные.Отпечаток, СертификатАдрес, СертификатПараметрыРеквизитов); + + Если ЗначениеЗаполнено(ОтборПоОрганизации) Тогда + Контекст.СохраненныеСвойства.Вставить("Организация", ОтборПоОрганизации); + КонецЕсли; ПерейтиКВыборуТекущегоСертификатаПослеЗаполненияСвойствСертификата(Контекст); @@ -695,7 +705,12 @@ КонецЕсли; КонецЕсли; - ПодключитьОбработчикОжидания("ОбработчикОжиданияАктивизироватьЭлементПароль", 0.1, Истина); + Если СертификатВОблачномСервисе Тогда + Элементы.ГруппаУсиленнаяЗащитаЗакрытогоКлюча.Видимость = Ложь; + Иначе + Элементы.ГруппаУсиленнаяЗащитаЗакрытогоКлюча.Видимость = Истина; + ПодключитьОбработчикОжидания("ОбработчикОжиданияАктивизироватьЭлементПароль", 0.1, Истина); + КонецЕсли; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина); diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form index fd168a9b2..e945c3fd6 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form @@ -669,10 +669,6 @@ <key>ru</key> <value>Команды</value> - - ru - Команды - КомандыРасширеннаяПодсказка 48 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form index b49f0ff7a..14f14252d 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form @@ -99,7 +99,7 @@ <key>ru</key> - <value>Группа сертификаты недоступны на клиенте</value> + <value>Сертификаты недоступны на клиенте</value> ГруппаСертификатыНедоступныНаКлиентеРасширеннаяПодсказка @@ -199,7 +199,7 @@ <key>ru</key> - <value>Группа сертификаты недоступны на сервере</value> + <value>Сертификаты недоступны на сервере</value> ГруппаСертификатыНедоступныНаСервереРасширеннаяПодсказка @@ -227,12 +227,8 @@ <key>ru</key> - <value>Группа предупреждения недоступности сертификатов</value> + <value>Предупреждения недоступности сертификатов</value> - - ru - Группа предупреждения недоступности сертификатов - ГруппаПредупрежденияНедоступностиСертификатовРасширеннаяПодсказка 789 @@ -255,6 +251,10 @@ Сертификаты 217 + + <key>ru</key> + <value>Сертификаты</value> + true true @@ -687,9 +687,6 @@ true true true - None - None - None true @@ -930,6 +927,10 @@ СертификатОписаниеДанных 751 + + <key>ru</key> + <value>Сертификат описание данных</value> + true true @@ -1141,9 +1142,6 @@ true true true - None - None - None true @@ -1180,6 +1178,10 @@ true + + <key>ru</key> + <value>Описание сертификата</value> + Left ГруппаОписаниеСертификатаРасширеннаяПодсказка @@ -1249,7 +1251,6 @@ Left true - 40 true true true @@ -1295,10 +1296,8 @@ Left true - 35 true true - false true true true @@ -1342,10 +1341,8 @@ Left true - 35 true true - false true true true @@ -1509,6 +1506,10 @@ true + + <key>ru</key> + <value>Страница уточнение свойств сертификата</value> + СтраницаУточнениеСвойствСертификатаРасширеннаяПодсказка 242 @@ -1535,10 +1536,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 238 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl index f38044145..aa2d575a8 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl @@ -193,6 +193,8 @@ Возврат; КонецЕсли; + Элементы.Далее.Доступность = Ложь; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() И ТекущиеДанные.ВОблачномСервисе Тогда СтруктураПоиска = Новый Структура; СтруктураПоиска.Вставить("Отпечаток", Base64Значение(ТекущиеДанные.Отпечаток)); @@ -208,7 +210,7 @@ // Продолжение процедуры Далее. &НаКлиенте -Процедура ДалееПослеПоискаСертификата(Результат, Неопределен) Экспорт +Процедура ДалееПослеПоискаСертификата(Результат, Контекст) Экспорт Если ТипЗнч(Результат) = Тип("СертификатКриптографии") Тогда Результат.НачатьВыгрузку(Новый ОписаниеОповещения( @@ -227,7 +229,6 @@ ОбновитьСписокСертификатов(Новый ОписаниеОповещения( "ДалееПослеОбновленияСпискаСертификатов", ЭтотОбъект, Контекст)); - КонецПроцедуры // Продолжение процедуры Далее. @@ -243,12 +244,13 @@ Процедура ДалееПослеОбновленияСпискаСертификатов(Результат, Контекст) Экспорт ПоказатьПредупреждение(, Контекст.ОписаниеОшибки); + Элементы.Далее.Доступность = Истина; КонецПроцедуры // Продолжение процедуры Далее. &НаКлиенте -Процедура ДалееПослеПоискаСертификатаВОблачномСервисе(Результат, Неопределен) Экспорт +Процедура ДалееПослеПоискаСертификатаВОблачномСервисе(Результат, Контекст) Экспорт Если ТипЗнч(Результат) = Тип("Структура") Тогда Если Результат.Выполнено Тогда @@ -355,8 +357,9 @@ Форма.СертификатПользователь = СохраненныеСвойства.Пользователь; Форма.СертификатОрганизация = СохраненныеСвойства.Организация; - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаУточнениеСвойствСертификата; + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаУточнениеСвойствСертификата; Элементы.Добавить.КнопкаПоУмолчанию = Истина; + Элементы.Далее.Доступность = Истина; Строка = ?(ЗначениеЗаполнено(Форма.Сертификат), НСтр("ru = 'Обновить'"), НСтр("ru = 'Добавить'")); Если Элементы.Добавить.Заголовок <> Строка Тогда diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form index 08910ae1c..b0af14df9 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form @@ -47,6 +47,9 @@ true false true + false + true + ShowInInputField true true true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Attributes/Список/ExtInfo/ListSettings.dcss index 2f2c90634..e2721561b 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Attributes/Список/ExtInfo/ListSettings.dcss @@ -7,13 +7,6 @@ false Normal - - false - Фирма - Contains - - c6ced8af-e03e-4536-8cbc-e9d809ba45d4 - Normal dfcece9d-5077-440b-b6b3-45a5cb4538eb diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form index 8547c3047..bcc75f545 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form @@ -51,6 +51,7 @@ ГруппаПользователейИспользование + Right OnChange ГруппаПользователейИспользованиеПриИзменении @@ -627,6 +628,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true @@ -648,7 +653,7 @@ true - Список.Description + Список.Наименование true @@ -830,7 +835,7 @@ true - Список.Ref + Список.Ссылка СсылкаРасширеннаяПодсказка @@ -1136,9 +1141,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -1191,33 +1193,42 @@
      true
      ВЫБРАТЬ - Сертификаты.Ссылка, - Сертификаты.ПометкаУдаления, - Сертификаты.Наименование, - Сертификаты.КомуВыдан, - Сертификаты.Фирма, - Сертификаты.Фамилия, - Сертификаты.Имя, - Сертификаты.Отчество, - Сертификаты.Должность, - Сертификаты.КемВыдан, - Сертификаты.ДействителенДо, - Сертификаты.Подписание, - Сертификаты.Шифрование, - Сертификаты.Отпечаток, - Сертификаты.ДанныеСертификата, - Сертификаты.Программа, - Сертификаты.Отозван, - Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча, - Сертификаты.Организация, - Сертификаты.Пользователь, - Сертификаты.ПользовательОповещенОСрокеДействия, - Сертификаты.Предопределенный, - Сертификаты.ИмяПредопределенныхДанных + Сертификаты.Ссылка КАК Ссылка, + Сертификаты.ПометкаУдаления КАК ПометкаУдаления, + Сертификаты.Наименование КАК Наименование, + Сертификаты.КомуВыдан КАК КомуВыдан, + Сертификаты.Фирма КАК Фирма, + Сертификаты.Фамилия КАК Фамилия, + Сертификаты.Имя КАК Имя, + Сертификаты.Отчество КАК Отчество, + Сертификаты.Должность КАК Должность, + Сертификаты.КемВыдан КАК КемВыдан, + Сертификаты.ДействителенДо КАК ДействителенДо, + Сертификаты.Подписание КАК Подписание, + Сертификаты.Шифрование КАК Шифрование, + Сертификаты.Отпечаток КАК Отпечаток, + Сертификаты.ДанныеСертификата КАК ДанныеСертификата, + Сертификаты.Программа КАК Программа, + Сертификаты.Отозван КАК Отозван, + Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча КАК УсиленнаяЗащитаЗакрытогоКлюча, + Сертификаты.Организация КАК Организация, + Сертификаты.Пользователь КАК Пользователь, + Сертификаты.ПользовательОповещенОСрокеДействия КАК ПользовательОповещенОСрокеДействия, + Сертификаты.Предопределенный КАК Предопределенный, + Сертификаты.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных ИЗ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты ГДЕ - Сертификаты.СостояниеЗаявления В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено)) + &ДополнительноеУсловие +{ГДЕ + (ИСТИНА В + (ВЫБРАТЬ ПЕРВЫЕ 1 + ИСТИНА + ИЗ + РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + ГДЕ + СоставыГруппПользователей.Пользователь = Сертификаты.Пользователь + И СоставыГруппПользователей.ГруппаПользователей В (&ГруппаПользователей)))} Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования true true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl index 9e8bb3cc9..5b89c969f 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl @@ -13,6 +13,18 @@ ЗакрыватьПриВыборе = Ложь; + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросСпискаСертификатов( + Список.ТекстЗапроса); + Иначе + Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "&ДополнительноеУсловие", "ИСТИНА"); + КонецЕсли; + + ГруппаПользователейПриИзмененииНаСервере(); + КонецПроцедуры &НаКлиенте @@ -94,79 +106,8 @@ &НаСервере Процедура ГруппаПользователейПриИзмененииНаСервере() - Если ГруппаПользователейИспользование Тогда - Список.ТекстЗапроса = - "ВЫБРАТЬ - | Сертификаты.Ссылка, - | Сертификаты.ПометкаУдаления, - | Сертификаты.Наименование, - | Сертификаты.КомуВыдан, - | Сертификаты.Фирма, - | Сертификаты.Фамилия, - | Сертификаты.Имя, - | Сертификаты.Отчество, - | Сертификаты.Должность, - | Сертификаты.КемВыдан, - | Сертификаты.ДействителенДо, - | Сертификаты.Подписание, - | Сертификаты.Шифрование, - | Сертификаты.Отпечаток, - | Сертификаты.ДанныеСертификата, - | Сертификаты.Программа, - | Сертификаты.Отозван, - | Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча, - | Сертификаты.Организация, - | Сертификаты.Пользователь, - | Сертификаты.ПользовательОповещенОСрокеДействия, - | Сертификаты.Добавил, - | Сертификаты.Предопределенный, - | Сертификаты.ИмяПредопределенныхДанных - |ИЗ - | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты - |ГДЕ - | Сертификаты.СостояниеЗаявления В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено)) - | И ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ГДЕ - | СоставыГруппПользователей.Пользователь = Сертификаты.Пользователь - | И СоставыГруппПользователей.ГруппаПользователей В (&ГруппаПользователей))"; - ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( - Список, "ГруппаПользователей", ГруппаПользователей); - Иначе - Список.ТекстЗапроса = - "ВЫБРАТЬ - | Сертификаты.Ссылка, - | Сертификаты.ПометкаУдаления, - | Сертификаты.Наименование, - | Сертификаты.КомуВыдан, - | Сертификаты.Фирма, - | Сертификаты.Фамилия, - | Сертификаты.Имя, - | Сертификаты.Отчество, - | Сертификаты.Должность, - | Сертификаты.КемВыдан, - | Сертификаты.ДействителенДо, - | Сертификаты.Подписание, - | Сертификаты.Шифрование, - | Сертификаты.Отпечаток, - | Сертификаты.ДанныеСертификата, - | Сертификаты.Программа, - | Сертификаты.Отозван, - | Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча, - | Сертификаты.Организация, - | Сертификаты.Пользователь, - | Сертификаты.ПользовательОповещенОСрокеДействия, - | Сертификаты.Добавил, - | Сертификаты.Предопределенный, - | Сертификаты.ИмяПредопределенныхДанных - |ИЗ - | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты - |ГДЕ - | Сертификаты.СостояниеЗаявления В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено))"; - КонецЕсли; + ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( + Список, "ГруппаПользователей", ГруппаПользователей, ГруппаПользователейИспользование); КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form index d23ee4c0d..23d71a040 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form @@ -58,7 +58,7 @@
      <key>ru</key> - <value>Группа представление данных</value> + <value>Представление данных</value> ГруппаПредставлениеДанныхРасширеннаяПодсказка @@ -149,8 +149,9 @@ true true true - true - ShowInDropList + false + true + ShowInInputField true false false @@ -434,10 +435,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 417 @@ -460,7 +457,7 @@ <key>ru</key> - <value>Группа поля</value> + <value>Поля</value> ГруппаПоляРасширеннаяПодсказка @@ -572,12 +569,8 @@ <key>ru</key> - <value>Группа подписание и комментарий</value> + <value>Подписание и комментарий</value> - - ru - Группа подписание и комментарий - ГруппаПодписаниеИКомментарийРасширеннаяПодсказка 453 @@ -697,6 +690,7 @@ OnCreateAtServer ПриСозданииНаСервере
      + 45 LockOwner true true @@ -840,18 +834,13 @@ Отбор сертификатов 1 - - ValueList - + true true - - - ВыходныеПараметрыДополнительныхДействий @@ -1051,6 +1040,23 @@ true + + СертификатОрганизация + + <key>ru</key> + <value>Сертификат организация</value> + + 21 + + DefinedType.Организация + + + true + + + true + + Подписать diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html index 324042782..3b9a398a3 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html @@ -5,6 +5,8 @@ <ul><li>С помощью ссылки в верхней части окна можно просмотреть объект, который будет подписан. Ссылка принимает значение наименования объекта. </li><li>Подписывать данные могут разные пользователи, при этом для каждого будет создана своя подпись. </li><li>Если <strong>Сертификат</strong> не выбран - выберите его из списка. Если при следующем открытии сертификат будет среди установленных на компьютере, повторный выбор не потребуется. +</li><li>При выборе из выпадающего списка будут показаны только сертификаты, у которых поле <strong>Пользователь</strong> не заполнено или совпадает с текущим пользователем сеанса, а поле <strong>Программа</strong> заполнено. Если при открытии окна <strong>Подписание</strong> был указан отбор по организации, то в выпадающем списке не будет сертификатов, у которых поле <strong>Организация</strong> не совпадает с организацией, указанной в отборе. Если при открытии окна <strong>Подписание</strong> был указан конкретный список сертификатов, то будет показан только этот список. +</li><li>При выборе из списка личных сертификатов (установленных на компьютере и на сервере) путем нажатия <strong>Показать все</strong>, показываются все сертификаты без учета полей <strong>Пользователь</strong> и <strong>Программа</strong>. Если при открытии окна <strong>Подписание</strong> был указан отбор по организации, то в списке не будет сертификатов, у которых поле <strong>Организация</strong> не совпадает с организацией, указанной в отборе. Но будут показаны все сертификаты, которых еще нет в списке (то есть те, которые есть только в хранилище сертификатов операционный системы компьютера или сервера). </li><li>Введите <strong>Пароль</strong> к закрытому ключу (указанный при установке или создании сертификата). </li><li>Включите флажок <strong>Запомнить пароль</strong>, для того чтобы не вводить пароль в следующий раз. </li><li>В некоторых случаях можно ввести <strong>Комментарий к подписи</strong> - дополнительную информацию о подписи. diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl index 1b4b71bcb..b1f37d6cf 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl @@ -71,7 +71,7 @@ СтандартнаяОбработка = Ложь; - Если ОтборСертификатов.Количество() > 0 Тогда + Если ТипЗнч(ОтборСертификатов) = Тип("СписокЗначений") И ОтборСертификатов.Количество() > 0 Тогда ЭлектроннаяПодписьСлужебныйКлиент.НачалоВыбораСертификатаПриУстановленномОтборе(ЭтотОбъект); Возврат; КонецЕсли; @@ -80,6 +80,9 @@ ПараметрыФормы.Вставить("ВыбранныйСертификат", Сертификат); ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Ложь); ПараметрыФормы.Вставить("ВернутьПароль", Истина); + Если ТипЗнч(ОтборСертификатов) <> Тип("СписокЗначений") Тогда + ПараметрыФормы.Вставить("ОтборПоОрганизации", ОтборСертификатов); + КонецЕсли; ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент); @@ -421,6 +424,13 @@ ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы); ПараметрыВыполнения.Вставить("ЗначениеПароля", СвойстваПароля.Значение); ПараметрыВыполнения.Вставить("СертификатВерен", ?(Результат = Неопределено, Результат, Результат = Истина)); + ПараметрыВыполнения.Вставить("СертификатАдрес", СертификатАдрес); + + ПараметрыВыполнения.Вставить("ПолноеПредставлениеДанных", + ЭлектроннаяПодписьСлужебныйКлиент.ПолноеПредставлениеДанных(ЭтотОбъект)); + + ПараметрыВыполнения.Вставить("ТекущийСписокПредставлений", ТекущийСписокПредставлений); + Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда @@ -471,7 +481,9 @@ Если Результат.Свойство("Ошибка") Тогда Контекст.ОшибкаНаКлиенте = Результат.Ошибка; - ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); + НеподписанныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.СвойстваТекущегоЭлементаДанных( + Контекст.ПараметрыВыполнения); + ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере, НеподписанныеДанные); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь); Возврат; КонецЕсли; @@ -518,15 +530,20 @@ КонецПроцедуры &НаКлиенте -Процедура ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере) +Процедура ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере, НеподписанныеДанные = Неопределено) Если Не Открыта() И ОбработкаПослеПредупреждения = Неопределено Тогда Открыть(); КонецЕсли; + ДополнительныеПараметры = Новый Структура; + Если НеподписанныеДанные <> Неопределено Тогда + ДополнительныеПараметры.Вставить("НеподписанныеДанные", НеподписанныеДанные); + КонецЕсли; + ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( - НСтр("ru = 'Не удалось подписать данные'"), "", - ОшибкаНаКлиенте, ОшибкаНаСервере, , ОбработкаПослеПредупреждения); + НСтр("ru = 'Не удалось подписать данные'"), "", + ОшибкаНаКлиенте, ОшибкаНаСервере, ДополнительныеПараметры, ОбработкаПослеПредупреждения); КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form index cff1fb688..32746a5d0 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form @@ -34,6 +34,7 @@ <id>27</id> <autoFill>true</autoFill> </contextMenu> + <width>3</width> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <extInfo xsi:type="form:PictureDecorationExtInfo"> @@ -76,7 +77,6 @@ </contextMenu> <width>3</width> <autoMaxWidth>true</autoMaxWidth> - <height>2</height> <autoMaxHeight>true</autoMaxHeight> <extInfo xsi:type="form:PictureDecorationExtInfo"> <picture xsi:type="core:PictureRef"> @@ -113,11 +113,14 @@ <autoFill>true</autoFill> </contextMenu> <type>Label</type> - <height>2</height> + <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <font xsi:type="core:FontRef"> <font>Style.NormalTextFont</font> - <height>11.0</height> + <bold>true</bold> + <italic>false</italic> + <underline>false</underline> + <strikeout>false</strikeout> </font> <extInfo xsi:type="form:LabelDecorationExtInfo"> <horizontalAlign>Left</horizontalAlign> @@ -130,7 +133,7 @@ </userVisible> <title> <key>ru</key> - <value>Группа проверка на компьютере на сервере</value> + <value>Проверка на компьютере на сервере</value> ГруппаПроверкаНаКомпьютереНаСервереРасширеннаяПодсказка @@ -144,6 +147,7 @@ UsualGroup + Center Auto true true @@ -286,7 +290,7 @@ <key>ru</key> - <value>Группа законный сертификат</value> + <value>Законный сертификат</value> ГруппаЗаконныйСертификатРасширеннаяПодсказка @@ -445,7 +449,7 @@ <key>ru</key> - <value>Группа наличие сертификата</value> + <value>Наличие сертификата</value> ГруппаНаличиеСертификатаРасширеннаяПодсказка @@ -609,7 +613,7 @@ <key>ru</key> - <value>Группа данные сертификата</value> + <value>Данные сертификата</value> ГруппаДанныеСертификатаРасширеннаяПодсказка @@ -768,7 +772,7 @@ <key>ru</key> - <value>Группа наличие программы сертификата</value> + <value>Наличие программы сертификата</value> ГруппаНаличиеПрограммыСертификатаРасширеннаяПодсказка @@ -959,7 +963,7 @@ <key>ru</key> - <value>Группа подписание данных</value> + <value>Подписание данных</value> ГруппаПодписаниеДанныхРасширеннаяПодсказка @@ -1118,7 +1122,7 @@ <key>ru</key> - <value>Группа проверка подписи данных</value> + <value>Проверка подписи данных</value> ГруппаПроверкаПодписиДанныхРасширеннаяПодсказка @@ -1277,7 +1281,7 @@ <key>ru</key> - <value>Группа шифрование данных</value> + <value>Шифрование данных</value> ГруппаШифрованиеДанныхРасширеннаяПодсказка @@ -1436,7 +1440,7 @@ <key>ru</key> - <value>Группа расшифровка данных</value> + <value>Расшифровка данных</value> ГруппаРасшифровкаДанныхРасширеннаяПодсказка @@ -1797,10 +1801,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 111 @@ -1823,7 +1823,7 @@ <key>ru</key> - <value>Группа поля</value> + <value>Поля</value> ГруппаПоляРасширеннаяПодсказка @@ -1881,35 +1881,6 @@ Auto
      - - ДекорацияОтступ - 82 - true - true - - true - - - ДекорацияОтступРасширеннаяПодсказка - 84 - Label - true - true - - Left - - - - ДекорацияОтступКонтекстноеМеню - 83 - true - - true - true - - Stretch - - Инструкция 151 @@ -2306,6 +2277,23 @@ true + + ВводитьПароль + + <key>ru</key> + <value>Вводить пароль</value> + + 17 + + Boolean + + + true + + + true + + Проверить diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl index 7ff378d7a..af9ccbc4f 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl @@ -14,6 +14,10 @@ Возврат; КонецЕсли; + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Элементы.НаСервереКартинка.Высота = 2; + КонецЕсли; + Сертификат = Параметры.Сертификат; ПроверкаПриВыборе = Параметры.ПроверкаПриВыборе; @@ -34,8 +38,10 @@ Проверки.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Проверки.Колонки.Добавить("Подсказка", Новый ОписаниеТипов("Строка")); + ВводитьПароль = Истина; + ЭлектроннаяПодписьПереопределяемый.ПриСозданииФормыПроверкаСертификата(Параметры.Сертификат, - Проверки, Параметры.ПараметрыДополнительныхПроверок, СтандартныеПроверки); + Проверки, Параметры.ПараметрыДополнительныхПроверок, СтандартныеПроверки, ВводитьПароль); Для каждого Проверка Из Проверки Цикл Группа = Элементы.Добавить("Группа" + Проверка.Имя, Тип("ГруппаФормы"), Элементы.ГруппаДополнительныеПроверки); @@ -91,6 +97,8 @@ Если Программа.ЭтоПрограммаОблачногоСервиса Тогда ЭтоПрограммаОблачногоСервиса = Истина; Элементы.ГруппаВводаПароля.Видимость = Ложь; + ИначеЕсли Не СтандартныеПроверки И Не ВводитьПароль Тогда + Элементы.ГруппаВводаПароля.Видимость = Ложь; КонецЕсли; ОбновитьВидимостьНаСервере(); @@ -145,13 +153,14 @@ ПараметрыПредупреждения.Вставить("ТекстПредупреждения", Элемент.Подсказка); ПараметрыПредупреждения.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Сертификат недействителен по причине:'")); - + ОткрытьФорму("ОбщаяФорма.РезультатПроверки", ПараметрыПредупреждения); КонецЕсли; КонецЕсли; КонецПроцедуры + &НаКлиенте Процедура ПарольПриИзменении(Элемент) @@ -181,8 +190,8 @@ ЭлектроннаяПодписьСлужебныйКлиент.ПояснениеУстановленногоПароляОбработкаНавигационнойСсылки( ЭтотОбъект, Элемент, НавигационнаяСсылка, СтандартнаяОбработка, СвойстваПароля); - КонецПроцедуры - +КонецПроцедуры + &НаКлиенте Процедура ИнструкцияНажатие(Элемент) @@ -197,6 +206,8 @@ &НаКлиенте Процедура Проверить(Команда) + Элементы.ФормаПроверить.Доступность = Ложь; + ПроверитьСертификат(Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект)); КонецПроцедуры @@ -205,6 +216,8 @@ &НаКлиенте Процедура ПроверитьЗавершение(Неопределен, Контекст) Экспорт + Элементы.ФормаПроверить.Доступность = Истина; + Если Не ПроверкаПриВыборе Тогда Возврат; КонецЕсли; @@ -362,7 +375,7 @@ Если СтандартныеПроверки Тогда ПроверитьНаСторонеСервера(СвойстваПароля.Значение); Иначе - ПроверитьНаСторонеСервераДополнительныеПроверки(); + ПроверитьНаСторонеСервераДополнительныеПроверки(СвойстваПароля.Значение); КонецЕсли; Иначе ПроверкиНаСервере = Неопределено; @@ -504,7 +517,10 @@ &НаКлиенте Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификатаВМоделиСервиса(Результат, Контекст) Экспорт - Если ТипЗнч(Результат) <> Тип("Структура") Или Не Результат.Выполнено Тогда + Если ТипЗнч(Результат) = Тип("Структура") И Не Результат.Выполнено Тогда + ОписаниеОшибки = КраткоеПредставлениеОшибки(Результат.ИнформацияОбОшибке) + Символы.ПС + Символы.ПС + + НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'"); + ИначеЕсли ТипЗнч(Результат) <> Тип("Структура") Тогда ОписаниеОшибки = Результат.ОписаниеОшибки.Описание + Символы.ПС + Символы.ПС + НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'"); ИначеЕсли Результат.Сертификат = Неопределено Тогда @@ -908,6 +924,8 @@ ПараметрыВыполнения.Вставить("ОписаниеОшибки", ""); ПараметрыВыполнения.Вставить("ЭтоПредупреждение", Ложь); ПараметрыВыполнения.Вставить("ОжидатьПродолжения", Ложь); + ПараметрыВыполнения.Вставить("Пароль", ?(ВводитьПароль, СвойстваПароля.Значение, Неопределено)); + ПараметрыВыполнения.Вставить("РезультатыПроверок", ПроверкиНаКлиенте); ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения( "ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки", ЭтотОбъект, Контекст)); @@ -1062,20 +1080,27 @@ УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина); КонецЕсли; - ПроверитьНаСторонеСервераДополнительныеПроверки(МенеджерКриптографии); + ПроверитьНаСторонеСервераДополнительныеПроверки(ЗначениеПароля, МенеджерКриптографии); КонецПроцедуры &НаСервере -Процедура ПроверитьНаСторонеСервераДополнительныеПроверки(МенеджерКриптографии = Неопределено) +Процедура ПроверитьНаСторонеСервераДополнительныеПроверки(ЗначениеПароля, МенеджерКриптографии = Неопределено) // Дополнительные проверки. - Для каждого ЭлементСписка Из ДополнительныеПроверки Цикл + Для Каждого ЭлементСписка Из ДополнительныеПроверки Цикл ОписаниеОшибки = ""; ЭтоПредупреждение = Ложь; Попытка - ЭлектроннаяПодписьПереопределяемый.ПриДополнительнойПроверкеСертификата(Сертификат, - ЭлементСписка.Значение, МенеджерКриптографии, ОписаниеОшибки, ЭтоПредупреждение); + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("Сертификат", Сертификат); + ПараметрыВыполнения.Вставить("Проверка", ЭлементСписка.Значение); + ПараметрыВыполнения.Вставить("МенеджерКриптографии", МенеджерКриптографии); + ПараметрыВыполнения.Вставить("ОписаниеОшибки", ОписаниеОшибки); + ПараметрыВыполнения.Вставить("ЭтоПредупреждение", ЭтоПредупреждение); + ПараметрыВыполнения.Вставить("Пароль", ?(ВводитьПароль, ЗначениеПароля, Неопределено)); + ПараметрыВыполнения.Вставить("РезультатыПроверок", ПроверкиНаСервере); + ЭлектроннаяПодписьПереопределяемый.ПриДополнительнойПроверкеСертификата(ПараметрыВыполнения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form index 1b3bc9775..ef55328c6 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form @@ -3,6 +3,10 @@ <items xsi:type="form:Table"> <name>Список</name> <id>1</id> + <title> + <key>ru</key> + <value>Список</value> + true true @@ -175,9 +179,6 @@ Auto true true - None - None - None true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form index 30b96a641..e940f1c27 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form @@ -58,7 +58,7 @@ <key>ru</key> - <value>Группа представление данных</value> + <value>Представление данных</value> ГруппаПредставлениеДанныхРасширеннаяПодсказка @@ -145,8 +145,9 @@ true true true - true - ShowInDropList + false + true + ShowInInputField true false false @@ -428,10 +429,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 417 @@ -454,7 +451,7 @@ <key>ru</key> - <value>Группа поля</value> + <value>Поля</value> ГруппаПоляРасширеннаяПодсказка @@ -612,6 +609,7 @@ OnCreateAtServer ПриСозданииНаСервере
      + 45 LockOwner true true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl index d7864a815..0a27bd3ec 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl @@ -221,6 +221,8 @@ Возврат; КонецЕсли; + Элементы.ФормаРасшифровать.Доступность = Ложь; + РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект)); КонецПроцедуры @@ -229,6 +231,8 @@ &НаКлиенте Процедура РасшифроватьЗавершение(Результат, Контекст) Экспорт + Элементы.ФормаРасшифровать.Доступность = Истина; + Если Результат = Истина Тогда Закрыть(Истина); КонецЕсли; diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form index c5dc4032d..6c05293c4 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -26,7 +30,7 @@ true - Список.Description + Список.Наименование true @@ -136,7 +140,7 @@ true - Список.Ref + Список.Ссылка СписокСсылкаРасширеннаяПодсказка @@ -339,9 +343,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -425,10 +426,6 @@ ru Стандартные команды - - ru - Стандартные команды - ГруппаСтандартныеКомандыExtendedTooltip 28 @@ -506,36 +503,33 @@
      true
      ВЫБРАТЬ - Сертификаты.Ссылка, - Сертификаты.ПометкаУдаления, - Сертификаты.Наименование, - Сертификаты.КомуВыдан, - Сертификаты.Фирма, - Сертификаты.Фамилия, - Сертификаты.Имя, - Сертификаты.Отчество, - Сертификаты.Должность, - Сертификаты.КемВыдан, - Сертификаты.ДействителенДо, - Сертификаты.Подписание, - Сертификаты.Шифрование, - Сертификаты.Отпечаток, - Сертификаты.ДанныеСертификата, - Сертификаты.Программа, - Сертификаты.Отозван, - Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча, - Сертификаты.Организация, - Сертификаты.Пользователь, - Сертификаты.ПользовательОповещенОСрокеДействия, - Сертификаты.Добавил, - Сертификаты.СостояниеЗаявления, - Сертификаты.СодержаниеЗаявления, - Сертификаты.Предопределенный, - Сертификаты.ИмяПредопределенныхДанных + Сертификаты.Ссылка КАК Ссылка, + Сертификаты.ПометкаУдаления КАК ПометкаУдаления, + Сертификаты.Наименование КАК Наименование, + Сертификаты.КомуВыдан КАК КомуВыдан, + Сертификаты.Фирма КАК Фирма, + Сертификаты.Фамилия КАК Фамилия, + Сертификаты.Имя КАК Имя, + Сертификаты.Отчество КАК Отчество, + Сертификаты.Должность КАК Должность, + Сертификаты.КемВыдан КАК КемВыдан, + Сертификаты.ДействителенДо КАК ДействителенДо, + Сертификаты.Подписание КАК Подписание, + Сертификаты.Шифрование КАК Шифрование, + Сертификаты.Отпечаток КАК Отпечаток, + Сертификаты.ДанныеСертификата КАК ДанныеСертификата, + Сертификаты.Программа КАК Программа, + Сертификаты.Отозван КАК Отозван, + Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча КАК УсиленнаяЗащитаЗакрытогоКлюча, + Сертификаты.Организация КАК Организация, + Сертификаты.Пользователь КАК Пользователь, + Сертификаты.ПользовательОповещенОСрокеДействия КАК ПользовательОповещенОСрокеДействия, + Сертификаты.Предопределенный КАК Предопределенный, + Сертификаты.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных ИЗ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты ГДЕ - Сертификаты.СостояниеЗаявления В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено)) + &ДополнительноеУсловие Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования true true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Module.bsl index 1aa0a6610..9f94d6b5b 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Module.bsl @@ -21,6 +21,16 @@ Элементы.СписокКонтекстноеМенюСоздать.Заголовок = НСтр("ru = 'Добавить'"); КонецЕсли; + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросСпискаСертификатов( + Список.ТекстЗапроса); + Иначе + Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "&ДополнительноеУсловие", "ИСТИНА"); + КонецЕсли; + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form index 566af9690..e800ee40c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form @@ -6,6 +6,10 @@ ОписаниеДанныхСертификата 237 + + <key>ru</key> + <value>Описание данных сертификата</value> + true true @@ -216,9 +220,6 @@ true true true - None - None - None true @@ -879,10 +880,6 @@ ru Поля - - ru - Поля - ПоляРасширеннаяПодсказка 216 @@ -1458,6 +1455,58 @@ true + + ОткрытьЗаявление + + <key>ru</key> + <value>Открыть заявление</value> + + 8 + + Boolean + + + true + + + true + + + + ИмяФормыЗаявления + + <key>ru</key> + <value>Имя формы заявления</value> + + 9 + + String + + + + true + + + true + + + + ВозможноОткрытьЗаявление + + <key>ru</key> + <value>Возможно открыть заявление</value> + + 10 + + Boolean + + + true + + + true + + СертификатОтозван @@ -1481,7 +1530,7 @@ <name>ПроверитьСертификат</name> <title> <key>ru</key> - <value>Проверить</value> + <value>Проверить...</value> 6 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html index 1c9a7bdab..752287d71 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html @@ -18,7 +18,7 @@

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

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

      Выгрузка в файл

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

    Выгрузка в файл

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

    Автозаполняемые реквизиты

    • diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl index ae84205b5..3401e6d53 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl @@ -11,6 +11,16 @@ Возврат; КонецЕсли; + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриСозданииНаСервере( + Объект, ОткрытьЗаявление); + ИмяФормыЗаявления = "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"; + ВозможноОткрытьЗаявление = Истина; + КонецЕсли; + ЕстьОрганизации = Не Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(Тип("Строка")); ПриСозданииНаСервереПриЧтенииНаСервере(); @@ -25,14 +35,13 @@ Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда Отказ = Истина; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ОбработчикОжиданияДобавитьСертификат", 0.1, Истина); Возврат; - ИначеЕсли ЗначениеЗаполнено(Объект.СостояниеЗаявления) - И Объект.СостояниеЗаявления - <> ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено") Тогда - + ИначеЕсли ОткрытьЗаявление Тогда Отказ = Истина; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ОбработчикОжиданияОткрытьЗаявление", 0.1, Истина); Возврат; КонецЕсли; @@ -107,17 +116,22 @@ &НаКлиенте Процедура ПоказатьДанныеСертификата(Команда) - ЭлектроннаяПодписьКлиент.ОткрытьСертификат(АдресСертификата, Истина); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ОткрытиеИзФормыЭлементаСертификата"); + ПараметрыФормы.Вставить("АдресСертификата", АдресСертификата); + + ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПоказатьЗаявлениеПоКоторомуБылПолученСертификат(Команда) - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("СертификатСсылка", Объект.Ссылка); - ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата", - ПараметрыФормы); + Если ВозможноОткрытьЗаявление Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СертификатСсылка", Объект.Ссылка); + ОткрытьФорму(ИмяФормыЗаявления, ПараметрыФормы); + КонецЕсли; КонецПроцедуры @@ -164,13 +178,12 @@ &НаСервере Процедура ПриСозданииНаСервереПриЧтенииНаСервере() - Если ЗначениеЗаполнено(Объект.СостояниеЗаявления) Тогда - Если Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено Тогда - Элементы.ФормаПоказатьЗаявлениеПоКоторомуБылПолученСертификат.Доступность = Истина; - Элементы.ПоказатьЗаявлениеПоКоторомуБылПолученСертификат.Доступность = Истина; - Иначе - Возврат; - КонецЕсли; + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриСозданииНаСервереПриЧтенииНаСервере( + Объект, Элементы); КонецЕсли; ДвоичныеДанныеСертификата = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( @@ -187,7 +200,7 @@ Иначе АдресСертификата = ""; Элементы.ПоказатьДанныеСертификата.Доступность = Ложь; - Элементы.ФормаПроверитьСертификат.Доступность = Ложь; + Элементы.ФормаПроверитьСертификат.Доступность = ЗначениеЗаполнено(ДвоичныеДанныеСертификата); Элементы.ФормаСохранитьДанныеСертификатаВФайл.Доступность = Ложь; Элементы.АвтоПоляИзДанныхСертификата.Видимость = Истина; Элементы.ФормаПоказатьАвтозаполняемыеРеквизиты.Пометка = Истина; @@ -274,6 +287,8 @@ &НаКлиенте Процедура ОбработчикОжиданияДобавитьСертификат() + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + ПараметрыСоздания = Новый Структура; ПараметрыСоздания.Вставить("ВЛичныйСписок", Истина); ПараметрыСоздания.Вставить("Организация", Объект.Организация); @@ -286,10 +301,13 @@ &НаКлиенте Процедура ОбработчикОжиданияОткрытьЗаявление() - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("СертификатСсылка", Объект.Ссылка); - ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата", - ПараметрыФормы); + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + + Если ВозможноОткрытьЗаявление Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СертификатСсылка", Объект.Ссылка); + ОткрытьФорму(ИмяФормыЗаявления, ПараметрыФормы); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form index 6b4c7adfb..c5d865621 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form @@ -58,7 +58,7 @@ <key>ru</key> - <value>Группа представление данных</value> + <value>Представление данных</value> ГруппаПредставлениеДанныхРасширеннаяПодсказка @@ -158,8 +158,9 @@ true true true - true - ShowInDropList + false + true + ShowInInputField true false false @@ -177,7 +178,7 @@ <key>ru</key> - <value>Группа личный сертификат</value> + <value>Личный сертификат</value> ГруппаЛичныйСертификатРасширеннаяПодсказка @@ -205,6 +206,10 @@ СертификатыШифрования 457 + + <key>ru</key> + <value>Сертификаты шифрования</value> + true true @@ -491,7 +496,7 @@ true true true - 4 + 3 true MultiRow Row @@ -509,9 +514,6 @@ true true true - None - None - None true @@ -587,6 +589,10 @@ НаборСертификатов 500 + + <key>ru</key> + <value>Набор сертификатов</value> + true true @@ -786,9 +792,6 @@ true true true - None - None - None true @@ -1386,10 +1389,10 @@ - УказанНаборСертификатов + УказанНеизменяемыйНаборСертификатов <key>ru</key> - <value>Указан набор сертификатов</value> + <value>Указан неизменяемый набор сертификатов</value> 20 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl index cca953262..3c7ed976a 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl @@ -15,18 +15,18 @@ КонецЕсли; Если ЗначениеЗаполнено(Параметры.НаборСертификатов) Тогда - УказанНаборСертификатов = Истина; + УказанНеизменяемыйНаборСертификатов = Истина; ЗаполнитьСертификатыШифрованияИзНабора(Параметры.НаборСертификатов); Если НаборСертификатов.Количество() = 0 И Параметры.ИзменятьНабор Тогда // Если все сертификаты набора ссылочные и изменение набора разрешено, // то взаимодействие с пользователем обычное, как будто он сам их добавил. - УказанНаборСертификатов = Ложь; + УказанНеизменяемыйНаборСертификатов = Ложь; КонецЕсли; КонецЕсли; ЭлектроннаяПодписьСлужебный.НастроитьФормуПодписанияШифрованияРасшифровки(ЭтотОбъект, Истина); - Если УказанНаборСертификатов Тогда + Если УказанНеизменяемыйНаборСертификатов Тогда Элементы.Сертификат.Видимость = Ложь; Элементы.ГруппаСертификатыШифрования.Заголовок = Элементы.ГруппаУказанныйНаборСертификатов.Заголовок; Элементы.СертификатыШифрования.ТолькоПросмотр = Истина; @@ -43,7 +43,7 @@ Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux") Или ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда - Если УказанНаборСертификатов Тогда + Если УказанНеизменяемыйНаборСертификатов Тогда ПодключитьОбработчикОжидания("ПерезаполнитьПрограммуШифрования", 0.1, Истина); Возврат; КонецЕсли; @@ -115,7 +115,7 @@ // Продолжение процедуры СертификатОбработкаВыбора. &НаКлиенте -Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, Неопределен) Экспорт +Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте); @@ -193,12 +193,14 @@ &НаКлиенте Процедура Зашифровать(Команда) - Если Не УказанНаборСертификатов + Если Не УказанНеизменяемыйНаборСертификатов И Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; + Элементы.ФормаЗашифровать.Доступность = Ложь; + ЗашифроватьДанные(Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект)); КонецПроцедуры @@ -207,6 +209,8 @@ &НаКлиенте Процедура ЗашифроватьЗавершение(Результат, Контекст) Экспорт + Элементы.ФормаЗашифровать.Доступность = Истина; + Если Результат = Истина Тогда Закрыть(Истина); КонецЕсли; @@ -225,27 +229,25 @@ Запрос.УстановитьПараметр("Ссылка", ОписаниеНабораСертификатов); Запрос.Текст = "ВЫБРАТЬ - | ТабличнаяЧастьСертификатыШифрования.Сертификат КАК Сертификат + | СертификатыШифрования.Сертификат КАК Сертификат |ИЗ - | &Таблица КАК ТабличнаяЧастьСертификатыШифрования + | РегистрСведений.СертификатыШифрования КАК СертификатыШифрования |ГДЕ - | ТабличнаяЧастьСертификатыШифрования.Ссылка = &Ссылка"; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", - Метаданные.НайтиПоТипу(ТипЗнч(ОписаниеНабораСертификатов)).ПолноеИмя() + ".СертификатыШифрования"); + | СертификатыШифрования.ЗашифрованныйОбъект = &Ссылка"; МассивСертификатов = Новый Массив; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл МассивСертификатов.Добавить(Выборка.Сертификат.Получить()); КонецЦикла; Иначе - Если ТипЗнч(ОписаниеНабораСертификатов) = ТипЗнч("Строка") Тогда + Если ТипЗнч(ОписаниеНабораСертификатов) = Тип("Строка") Тогда МассивСертификатов = ПолучитьИзВременногоХранилища(ОписаниеНабораСертификатов); Иначе МассивСертификатов = ОписаниеНабораСертификатов; КонецЕсли; ДобавленныеСертификаты = Новый Соответствие; - Для каждого ТекущийСертификат Из МассивСертификатов Цикл - Если ТипЗнч(Сертификат) = ТипЗнч("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда + Для Каждого ТекущийСертификат Из МассивСертификатов Цикл + Если ТипЗнч(ТекущийСертификат) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда Если ДобавленныеСертификаты.Получить(ТекущийСертификат) = Неопределено Тогда ДобавленныеСертификаты.Вставить(ТекущийСертификат, Истина); СертификатыШифрования.Добавить().Сертификат = ТекущийСертификат; @@ -270,7 +272,7 @@ Ссылки = Новый Массив; Отпечатки = Новый Массив; - Для каждого ОписаниеСертификата Из МассивСертификатов Цикл + Для Каждого ОписаниеСертификата Из МассивСертификатов Цикл НоваяСтрока = ТаблицаСертификатов.Добавить(); Если ТипЗнч(ОписаниеСертификата) = Тип("ДвоичныеДанные") Тогда СертификатКриптографии = Новый СертификатКриптографии(ОписаниеСертификата); @@ -285,6 +287,8 @@ Ссылки.Добавить(ОписаниеСертификата); КонецЕсли; КонецЦикла; + ТаблицаСертификатов.Индексы.Добавить("Ссылка"); + ТаблицаСертификатов.Индексы.Добавить("Отпечаток"); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылки", Ссылки); @@ -303,7 +307,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Строки = ТаблицаСертификатов.НайтиСтроки(Новый Структура("Ссылка", Выборка.Ссылка)); - Для каждого Строка Из Строки Цикл + Для Каждого Строка Из Строки Цикл ДанныеСертификата = Выборка.ДанныеСертификата.Получить(); Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -326,7 +330,7 @@ Строка.Данные = ДанныеСертификата; КонецЦикла; Строки = ТаблицаСертификатов.НайтиСтроки(Новый Структура("Отпечаток", Выборка.Отпечаток)); - Для каждого Строка Из Строки Цикл + Для Каждого Строка Из Строки Цикл Строка.Ссылка = Выборка.Ссылка; Строка.Представление = Выборка.Представление; КонецЦикла; @@ -594,7 +598,7 @@ Возврат; КонецЕсли; - Если УказанНаборСертификатов Тогда + Если УказанНеизменяемыйНаборСертификатов Тогда ЗаполнитьПрограммуШифрования(Новый ОписаниеОповещения( "ПродолжитьОткрытиеПослеЗаполненияПрограммы", ЭтотОбъект, Контекст)); Иначе diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl index d6908f14e..a30d0d7bd 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -28,13 +32,23 @@ НеРедактируемыеРеквизиты.Добавить("Организация"); НеРедактируемыеРеквизиты.Добавить("Пользователь"); НеРедактируемыеРеквизиты.Добавить("Добавил"); - НеРедактируемыеРеквизиты.Добавить("СостояниеЗаявления"); - НеРедактируемыеРеквизиты.Добавить("СодержаниеЗаявления"); + + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыНеРедактируемыеВГрупповойОбработке( + НеРедактируемыеРеквизиты); + КонецЕсли; Возврат НеРедактируемыеРеквизиты; КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin deleted file mode 100644 index 1c60722e5..000000000 Binary files a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin and /dev/null differ diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx new file mode 100644 index 000000000..33d9f82cf --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx @@ -0,0 +1,581 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 3 + + 0 + + 1 + + + + 1 + + 2 + + + + 2 + + 3 + + + + + 1 + + + + 4 + + + + + 5 + + + + + + 6 + + + ru + ДОКУМЕНТ ПОДПИСАН +ЭЛЕКТРОННОЙ ПОДПИСЬЮ + + + + + + + + 2 + + + + 7 + + + + + 8 + + + + + 9 + ДатаПодписи + + + + + + 3 + + + + 10 + + + + + 11 + + + ru + Сертификат: + + + + + + + 12 + НомерСертификата + + + + + + 4 + + + + 10 + + + + + 11 + + + ru + Кем выдан: + + + + + + + 12 + ВыдалСертификат + + + + + + 5 + + + + 10 + + + + + 11 + + + ru + Владелец: + + + + + + + 12 + ВладелецСертификата + + + + + + 6 + + + + 13 + + + + + 14 + + + ru + Действителен: + + + + + + + 15 + СрокДействия + + + + + + 7 + + + + 16 + + + + + 17 + ТекстОтметки + + + + + true + 18 + 12 + 12 + + 1 + 1 + 1 + + + 7 + 1 + 1 + + + ВладелецСертификата + + Rectangle + 5 + 5 + 2 + 2 + + + + ВыдалСертификат + + Rectangle + 4 + 4 + 2 + 2 + + + + Картинка + + Rectangle + 1 + 2 + 1 + 1 + + + + НомерСертификата + + Rectangle + 3 + 3 + 2 + 2 + + + + ОбластьСтрокШтамп + + Rows + 1 + 7 + -1 + -1 + + + + Отступ + + Rows + 10 + 10 + -1 + -1 + + + + ОтступЛев + + Rectangle + 10 + 11 + 1 + 1 + + + + ОтступПрав + + Rectangle + 10 + 11 + 2 + 2 + + + + ОтступШтампа + + Rectangle + 1 + 7 + 0 + 0 + + + + СрокДействия + + Rectangle + 6 + 6 + 2 + 2 + + + + ТекстОтметки + + Rectangle + 7 + 7 + 1 + 2 + + + + Штамп + + Rectangle + 1 + 7 + 1 + 2 + + + + ШтампЛеваяКолонка + + Rectangle + 1 + 6 + 1 + 1 + + + + ШтампПраваяКолонка + + Rectangle + 1 + 6 + 2 + 2 + + + + None + + + Solid + + + + + 25 + + + 85 + + + 226 + + + 0 + 0 + 0 + 0 + 45 + 72 + Top + + + 0 + 1 + 1 + 45 + 72 + Top + Text + true + 1 + RealSize + Center + Center + + + 1 + 1 + 1 + 139 + Center + Block + true + 0 + 0 + + + 0 + 0 + 72 + + + 72 + true + + + 0 + 1 + 219 + Center + Parameter + true + + + 0 + 0 + 0 + 72 + Top + 1 + + + 0 + 1 + 72 + Top + true + 1 + + + 0 + 1 + 72 + Top + Wrap + Parameter + true + + + 0 + 0 + 0 + 0 + 51 + 72 + Top + 1 + + + 0 + 1 + 1 + 51 + 72 + Top + true + 1 + + + 0 + 1 + 1 + 51 + 72 + Top + Wrap + Parameter + true + + + 0 + 90 + Center + Wrap + + + 0 + 90 + Center + Wrap + Parameter + true + + + 72 + + + 0 + iVBORw0KGgoAAAANSUhEUgAAADAAAAAcCAYAAAAnbDzKAAAABGdBTUEAALGOfPtR +kwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAK +OWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG +3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZEsRAUVLAHJAgoMRhF +VCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs +AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHo +mAARm7M5GSwRF4g4JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaI +xTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJ +IjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQdli7d1NqaQffkZKVw +BALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF +ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwv +iQJBuo2xcVZWlhGXwzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcin +Z6QzWRy64Z+H+B8H/nUeBkGceA6fwxNFhImmjMtLELWbx+YKuGk8Opf3n5r4D8P+ +pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH554SqTi3P/7zf9Z8Gl +4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ +VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBn +YBa8BgsQBGEhMkSB5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6 +qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyCqbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+Ad +cCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiEj6xHipAKpAFpRbqR +PuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I +1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvm +HGYQM46Zw2Kx8lh9rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vA +HcGdwQ3hJnELeCm8Jt4G749n43PwpfhGfDf+On4Cv0CQJmgT7AghhCTCJkIloZVw +kfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFpB+kQ6RzpLuklmUzW +IjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ +yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkC +mYMyF2TGKQhFneJCYVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sie +lh2lITQtmhcthVZKO04bpr1borTEaQlnyfYlrUuGlszLLZVzlOPIFcm1yd2WeydP +l3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48vvacIK+opBimuVTyo +2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp +vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454m +XpOhmai5V7NPc15LWytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLu +Pt0berCehV6iXo3edX1Y31Kfq79Pf9AAbWBtwDNoMBgxJBk6GWYathiOGdGMfI3y +jTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0zllmN2S1zsrm7+Qbz +LvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW +ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/aj +DqoOTIcGh8eO6o5sxybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24y +bqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU ++zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPwYyAmMCCwJvBJkGlQ +XlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR +XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9 +z/RnNjDn4rziauNmWS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzh +unCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wlxqae5Mnwknm9acpp2WmD6frphemja2zW +7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2dDYvuz9HL2d7zmSu +e+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8 +V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+ +X8IqufqN6TeV33zaEb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7Un +Zs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2vTqy+XeNc01arWLu9dn4fe9/Qfsf9rXVK +dcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqbPhziHRo9HHS4t9mq +ufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/ +0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZ +T2dzz86dSz83cz7h/HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJ +q4yrndcsr3X0W/S3/2TxU/uA5UDHdavrXTesb3QPLh88M+QwdP6m681Lt7xuXbu9 +4vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxSfNTws+7PbaOWo6fH +XMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ +tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt +37vwd5MLWe+x7ys/6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEQAA +CxEBf2RfkQAAABZ0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMDvo9WkAAANeSURB +VFhH7ZhNSFRRFMf9KiSohLKFIS0zaNNEG6tFRBBlZNHHzKDOjM6MiEjOMmoRUUSL +aFMTZZsIpQ9EKgqjlS4kaFVQYPTBQJowm1nMUJnT9Dtybzxf740P50YMKBzufeed +e+7/fz7uu05FRbn/FQqFyrLmkMlkqpYJ/M8I5HK5aqf9A4HA+vb29ka7tLS0LFpy +YtPT01OXSCTqg8Hgin/Kz41AW1vbMDJnl6GhIVdAXV1duyE8iMwgP2Ut4zdkIhQK +9Uej0dXGyRQhMMLGBbs4Eeju7l7b0dFx38neppvG7oBREm4EwuHwNmS/CNG7pIHY +CcTj8XW8e20B+hGQF1l3knWtSB/PT8lGXtnMoQsZI2El0NvbW4vvMBtGtEQikWbA ++J0IJJPJKuxeyDspF+anqfsaqX/m+5CDsVisUcB2dnbuwO6D8jOLz2YjJKwEAL8B +IL+saQfETYmmEwHsI1qPTdzv969EdxkfUve6/PL4eEh/1ENiI/op9e6NBKBkElYC +ABAC0rh5TcSNQCqVqgTIewGDzRM5eRgfuPUB/t5Bro6MHtE2PB8ySkCcAaRaBDDP +FbhbThlAJyUxH2XmOwFz1AJsmGhvpbkb8NMH+B/K13UhynxSnllzxzgB7ZCNRy0E +TthLiPf9SpeWbPD8SNm/lT6wAgPoWWWblT7D9oqynSyZQDqddvyQeSBwVYGYEBDY +66hesIOi/pt0AJhvxzaqCXn5MBYl6XaMagJsNECJHHfIwDVFYFw2YD5/lLLunH1D +dDVkoUmEU2kV5bVGPW8uOQMlEDijAH+VKAIoqUh+hnB9ycC8OvBCAHB/ZQDdXksT +71Fl8l3ppnh/nnmcBjYpMU6xugXcFiMAgNsAOWYvIWlUdF+U/hV28g0IMs5qW9Oj +HO1cMrcYISBOABzXIKnzQbl5yhUE/T3000gWyRmULL4X9s1ip5BbBoSAfEkB99hC +4iUb7PJavkbsvJQQJP58pOyXOTlV5LJmK5dP6EYgc9e00GsNSymhVnsPWJ1IJgB6 +Cpu06bq3+nPsAbcSAtAzdQUewMlhdT/KF/uHRrIh1w6if4M1o4xjyLhBGcPvJk8Z +kFOFy12tNKbP56uWuYiRujXpZPlXCZPRXIqvsv9hSwjIdVjGchLBLAn7DfLuQNeL +K/2rAAAAAElFTkSuQmCC + + \ No newline at end of file diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo index 39cc8557f..fcc5542fa 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo @@ -711,59 +711,6 @@ PersonalComputer MobileDevice - - ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата - - ru - Заявление на выпуск нового квалифицированного сертификата - - - - ru - - - PersonalComputer - MobileDevice - - - Соглашение - - ru - Соглашение - - TextDocument - - - КомпонентаОбмена - - ru - Компонента обмена - - BinaryData - - - ИменаРегионовРФПоРекомендациямДляСКПЭП - - ru - Имена регионов РФ по рекомендациям для СКПЭП - - Дата актуальности - 24.03.2014 (http://www.gnivc.ru/inf_provision/classifiers_reference/ssrf/) - TextDocument - - - ЗаявлениеНаСертификатИндивидуальногоПредпринимателя - - ru - Заявление на сертификат индивидуального предпринимателя - - - - ЗаявлениеНаСертификатЮридическогоЛица - - ru - Заявление на сертификат юридического лица - - КомпонентаXMLDSIG @@ -772,4 +719,11 @@ BinaryData + + Штамп + + ru + Штамп + + diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo index 4044dd555..e7e2df335 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ Автор + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -153,6 +154,35 @@ Index Use + + ДатаЗаема + + ru + Дата заема + + + Date + + + + ru + ДЛФ=ДВ + + + ru + ДЛФ=ДВ + + + ru + Дата, когда файл был занят для редактирования + + false + + + + Use + Use + ДатаМодификацииУниверсальная @@ -222,6 +252,7 @@ Отредактировал + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -372,6 +403,7 @@ Редактирует + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -485,15 +517,35 @@ Use + + ХранитьВерсии + + ru + Хранить версии + + + Boolean + + + ru + Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия. + + false + + + + Use + Use + - ЭлектронныеПодписи + УдалитьЭлектронныеПодписи ru - электронные подписи + (не используется) электронные подписи ru @@ -698,10 +750,10 @@ - СертификатыШифрования + УдалитьСертификатыШифрования ru - Сертификаты шифрования + (не используется) Сертификаты шифрования ru diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index e0179a60a..c0e9e682c 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -17,43 +17,6 @@ 88619765-ccb3-46c6-ac52-38e9c992ebd4 - - - - - Заблокировано - Equal - true - - - - - ЦветТекста - style:SpecialTextColor - - - - - - - - ЭтоБыстроеСообщение - Equal - true - - - Заблокировано - Equal - false - - - - - ЦветТекста - web:DarkGreen - - - Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form index 51eaa6d67..9c50470ae 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form @@ -81,6 +81,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -427,6 +431,10 @@ true + + <key>ru</key> + <value>Список группа 1</value> + СписокГруппа1ExtendedTooltip 54 @@ -487,9 +495,6 @@ Список.DefaultPicture - None - None - None true true @@ -568,6 +573,10 @@ true + + <key>ru</key> + <value>Форма группа 2</value> + ФормаГруппа2ExtendedTooltip 39 @@ -640,6 +649,10 @@ true + + <key>ru</key> + <value>Форма группа 1</value> + ФормаГруппа1ExtendedTooltip 42 @@ -714,6 +727,10 @@ true + + <key>ru</key> + <value>Форма группа 3</value> + ФормаГруппа3ExtendedTooltip 45 @@ -842,6 +859,10 @@ true + + <key>ru</key> + <value>Форма группа 4</value> + ФормаГруппа4ExtendedTooltip 49 @@ -898,6 +919,7 @@ ИЗ Справочник.СообщенияОбластейДанных КАК СообщенияОбластейДанных Catalog.СообщенияОбластейДанных + true true true true @@ -964,9 +986,6 @@ true - - CommonPicture.СинхронизацияДанныхНастройка - Настройка diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl index 6ae2a71d7..c9387d510 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl @@ -4,6 +4,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; @@ -169,4 +171,47 @@ КонецПроцедуры +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // Оформление заблокированной записи. + + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заблокировано"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); + + // Оформление быстрого сообщения. + + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); + + ГруппаЭлементовОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; + + ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоБыстроеСообщение"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заблокировано"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.РезультатУспехЦвет); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form index 4396307e0..1926515d4 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form @@ -81,6 +81,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -387,6 +391,10 @@ true + + <key>ru</key> + <value>Список группа 1</value> + СписокГруппа1ExtendedTooltip 50 @@ -447,9 +455,6 @@ Список.DefaultPicture - None - None - None true true @@ -528,6 +533,10 @@ true + + <key>ru</key> + <value>Форма группа 2</value> + ФормаГруппа2ExtendedTooltip 35 @@ -600,6 +609,10 @@ true + + <key>ru</key> + <value>Форма группа 1</value> + ФормаГруппа1ExtendedTooltip 38 @@ -674,6 +687,10 @@ true + + <key>ru</key> + <value>Форма группа 3</value> + ФормаГруппа3ExtendedTooltip 41 @@ -802,6 +819,10 @@ true + + <key>ru</key> + <value>Форма группа 4</value> + ФормаГруппа4ExtendedTooltip 45 @@ -947,9 +968,6 @@ true - - CommonPicture.СинхронизацияДанныхНастройка - Настройка diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl index 9d983c99f..687ca0c9e 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl @@ -10,8 +10,8 @@ Возврат; КонецЕсли; - ЭтоСеансСУстановленнымиЗначениямиРазделителей = ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + ЭтоСеансСУстановленнымиЗначениямиРазделителей = РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных(); // Начальная настройка группировки. ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); @@ -124,13 +124,13 @@ // Оформление заблокированной записи. - Элемент = УсловноеОформление.Элементы.Добавить(); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Заблокировано"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заблокировано"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; @@ -138,7 +138,7 @@ // Оформление быстрого сообщения. - Элемент = УсловноеОформление.Элементы.Добавить(); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); @@ -147,12 +147,12 @@ ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Заблокировано"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заблокировано"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ЭтоБыстроеСообщение"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоБыстроеСообщение"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form index 0682acdc8..48aebbb4c 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form @@ -134,6 +134,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ГруппаШапкаРасширеннаяПодсказка 23 diff --git a/SSL/src/Catalogs/СообщенияСистемы/ManagerModule.bsl b/SSL/src/Catalogs/СообщенияСистемы/ManagerModule.bsl index 6ac4e43e3..3d53198c6 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/ManagerModule.bsl +++ b/SSL/src/Catalogs/СообщенияСистемы/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -18,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form index 9d5170d2e..bebd54b88 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form @@ -7,6 +7,10 @@ Классификатор 17 + + <key>ru</key> + <value>Классификатор</value> + true true @@ -295,10 +299,6 @@ ru Классификатор группа вывести список - - ru - Классификатор группа вывести список - КлассификаторГруппаВывестиСписокРасширеннаяПодсказка 83 @@ -375,10 +375,6 @@ ru Классификатор группа поиск - - ru - Классификатор группа поиск - КлассификаторГруппаПоискExtendedTooltip 56 @@ -837,9 +833,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl index 18e04b563..d7ecd8707 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl @@ -178,7 +178,7 @@ &НаСервереБезКонтекста Функция СостояниеКлассификатора() - Данные = Справочники.СтраныМира.ТаблицаКлассификатора(); + Данные = УправлениеКонтактнойИнформацией.ТаблицаКлассификатора(); Данные.Колонки.Добавить("ИндексПиктограммы", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0))); Данные.ЗаполнитьЗначения(8, "ИндексПиктограммы"); diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form index cd119116f..368408670 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 37 @@ -39,6 +35,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -370,10 +370,6 @@ ru Создать - - ru - Создать - СоздатьРасширеннаяПодсказка 48 @@ -402,10 +398,6 @@ ru Команды списка - - ru - Список команды - СписокКомандыExtendedTooltip 22 @@ -617,9 +609,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl index 3ad329c1e..c5ad57cc3 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl @@ -187,7 +187,7 @@ | СтраныМира.Код = Классификатор.Код | И СтраныМира.Наименование = Классификатор.Наименование |"); - Запрос.УстановитьПараметр("Классификатор", Справочники.СтраныМира.ТаблицаКлассификатора()); + Запрос.УстановитьПараметр("Классификатор", УправлениеКонтактнойИнформацией.ТаблицаКлассификатора()); ЭлементОтбора.ПравоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); КонецПроцедуры diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form index 976d860ff..04a62f81c 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form @@ -88,6 +88,10 @@ true + + <key>ru</key> + <value>Наименование</value> + ГруппаНаименованиеРасширеннаяПодсказка 13 @@ -242,6 +246,10 @@ true + + <key>ru</key> + <value>Альфа кодов</value> + ГруппаАльфаКодовExtendedTooltip 17 diff --git a/SSL/src/Catalogs/СтраныМира/Help/ru.html b/SSL/src/Catalogs/СтраныМира/Help/ru.html index ca6c8a19f..c19ed28e0 100644 --- a/SSL/src/Catalogs/СтраныМира/Help/ru.html +++ b/SSL/src/Catalogs/СтраныМира/Help/ru.html @@ -8,7 +8,7 @@ SUP { FONT-SIZE: 0.9em; FONT-VARIANT: normal; FONT-WEIGHT: normal; FONT-STYLE: normal; LINE-HEIGHT: normal } -

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

      +

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

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

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

      В списке выводится информация:

      diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl index a800118dc..95d3e3271 100644 --- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl @@ -1,9 +1,10 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -18,18 +19,19 @@ КонецФункции -#КонецЕсли +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов #КонецОбласти +#КонецОбласти + +#КонецЕсли #Область ОбработчикиСобытий Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) - #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - - Если Не СтандартнаяОбработка Тогда + Если Не СтандартнаяОбработка Тогда // Обрабатывается в другом месте. Возврат; @@ -37,14 +39,167 @@ // Поведение по умолчанию, подбор только справочника. Возврат; - ИначеЕсли Истина<>Параметры.РазрешитьДанныеКлассификатора Тогда + ИначеЕсли Истина <> Параметры.РазрешитьДанныеКлассификатора Тогда // Подбор классификатора отключен, поведение по умолчанию. Возврат; + КонецЕсли; + + ОбработкаПолученияДанныхВыбораЗаполнение(ДанныеВыбора, Параметры, СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункцииКлиент + +Процедура ОбработкаПолученияДанныхВыбораЗаполнение(ДанныеВыбора, Параметры, СтандартнаяОбработка) + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + ОбработкаПолученияДанныхВыбораЗаполнениеСервер(ДанныеВыбора, Параметры, СтандартнаяОбработка) +#КонецЕсли + +КонецПроцедуры + +#КонецОбласти + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныйПрограммныйИнтерфейс + +// Определяет данные страны по справочнику стран или классификатору ОКСМ. +// Рекомендуется использовать УправлениеКонтактнойИнформацией.ДанныеСтраныМира. +// +// Параметры: +// КодСтраны - Строка, Число - код ОКСМ страны. Если не указано, то поиск по коду не производится. +// Наименование - Строка - наименование страны. Если не указано, то поиск по наименованию не производится. +// +// Возвращаемое значение: +// Структура - поля: +// * Код - Строка - реквизит найденной страны. +// * Наименование - Строка - реквизит найденной страны. +// * НаименованиеПолное - Строка - реквизит найденной страны. +// * КодАльфа2 - Строка - реквизит найденной страны. +// * КодАльфа3 - Строка - реквизит найденной страны. +// * Ссылка - СправочникаСсылка.СтраныМира - реквизит найденной страны. +// Неопределено - страна не найдена. +// +Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт + Возврат УправлениеКонтактнойИнформацией.ДанныеСтраныМира(КодСтраны, Наименование); +КонецФункции + +// Определяет данные страны по классификатору ОКСМ. +// Рекомендуется использовать УправлениеКонтактнойИнформацией.ДанныеКлассификатораСтранМираПоКоду. +// +// Параметры: +// Код - Строка, Число - код ОКСМ страны. +// ТипКода - Строка - Варианты: КодСтраны (по умолчанию), Альфа2, Альфа3. +// +// Возвращаемое значение: +// Структура - поля: +// * Код - Строка - реквизит найденной страны. +// * Наименование - Строка - реквизит найденной страны. +// * НаименованиеПолное - Строка - реквизит найденной страны. +// * КодАльфа2 - Строка - реквизит найденной страны. +// * КодАльфа3 - Строка - реквизит найденной страны. +// Неопределено - страна не найдена. +// +Функция ДанныеКлассификатораСтранМираПоКоду(Знач Код, ТипКода = "КодСтраны") Экспорт + Возврат УправлениеКонтактнойИнформацией.ДанныеКлассификатораСтранМираПоКоду(Код, ТипКода); +КонецФункции + +// Определяет данные страны по классификатору ОКСМ. +// Рекомендуется использовать УправлениеКонтактнойИнформацией.ДанныеКлассификатораСтранМираПоНаименованию. +// +// Параметры: +// Наименование - Строка - наименование страны. +// +// Возвращаемое значение: +// Структура - поля: +// * Код - Строка - реквизит найденной страны. +// * Наименование - Строка - реквизит найденной страны. +// * НаименованиеПолное - Строка - реквизит найденной страны. +// * КодАльфа2 - Строка - реквизит найденной страны. +// * КодАльфа3 - Строка - реквизит найденной страны. +// Неопределено - страна не найдена. +// +Функция ДанныеКлассификатораСтранМираПоНаименованию(Знач Наименование) Экспорт + Возврат УправлениеКонтактнойИнформацией.ДанныеКлассификатораСтранМираПоНаименованию(Наименование); +КонецФункции + +// Возвращает флаг возможности добавления и изменения элементов. +// +Функция ЕстьПравоДобавления() Экспорт + Возврат ПравоДоступа("Добавление", Метаданные.Справочники.СтраныМира); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает поля поиска в порядке предпочтения для справочника стран мира. +// +// Возвращаемое значение: +// Массив - содержит структуры с полями: +// * Имя - Строка - имя реквизита поиска. +// * ШаблонПредставления - Строка - шаблон для формирования значения представления по именам реквизитов, +// например: "%1.Наименование (%1.Код)". Здесь "Наименование" и "Код" - имена +// реквизитов, +// "%1" - заполнитель для передачи псевдонима таблицы. +// +Функция ПоляПоиска() + Результат = Новый Массив; + СписокПолей = ПустаяСсылка().Метаданные().ВводПоСтроке; + ГраницаПолей = СписокПолей.Количество() - 1; + ВсеИменаСтрокой = ""; + + ПредставлениеРазделителя = ", "; + РазделительПредставлений = " + """ + ПредставлениеРазделителя + """ + "; + + Для Индекс=0 По ГраницаПолей Цикл + ИмяПоля = СписокПолей[Индекс].Имя; + ВсеИменаСтрокой = ВсеИменаСтрокой + "," + ИмяПоля; - ИначеЕсли Не ЕстьПравоДобавления() Тогда + ШаблонПредставления = "%1." + ИмяПоля; + + ОстальныеПоля = ""; + Для Позиция=0 По ГраницаПолей Цикл + Если Позиция<>Индекс Тогда + ОстальныеПоля = ОстальныеПоля + РазделительПредставлений + СписокПолей[Позиция].Имя; + КонецЕсли; + КонецЦикла; + Если Не ПустаяСтрока(ОстальныеПоля) Тогда + ШаблонПредставления = ШаблонПредставления + + " + "" ("" + " + + "%1." + Сред(ОстальныеПоля, СтрДлина(РазделительПредставлений) + 1) + + " + "")"""; + КонецЕсли; + + Результат.Добавить( + Новый Структура("Имя, ШаблонПредставления", ИмяПоля, ШаблонПредставления)); + КонецЦикла; + + Возврат Новый Структура("СписокПолей, ИменаПолейСтрокой", Результат, Сред(ВсеИменаСтрокой, 2)); +КонецФункции + +// Экранирует символы для использования в функции запроса ПОДОБНО. +// +Функция ЭкранироватьСимволыПодобия(Знач Текст, Знач СпецСимвол = "\") + Результат = Текст; + СимволыПодобия = "%_[]^" + СпецСимвол; + + Для Позиция=1 По СтрДлина(СимволыПодобия) Цикл + ТекущийСимвол = Сред(СимволыПодобия, Позиция, 1); + Результат = СтрЗаменить(Результат, ТекущийСимвол, СпецСимвол + ТекущийСимвол); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Процедура ОбработкаПолученияДанныхВыбораЗаполнениеСервер(ДанныеВыбора, Параметры, СтандартнаяОбработка) + + Если Не ЕстьПравоДобавления() Тогда // Нет прав на добавление страны мира, поведение по умолчанию. Возврат; - КонецЕсли; // Будем имитировать поведение платформы - поиск по всем доступным полям поиска с формированием подобного списка. @@ -87,52 +242,52 @@ Если (Параметры.Свойство("ТолькоДанныеКлассификатора") И Параметры.ТолькоДанныеКлассификатора) Тогда // Запрос только по классификатору. ШаблонЗапроса = " - |ВЫБРАТЬ ПЕРВЫЕ 50 - | NULL КАК Ссылка, - | Классификатор.Код КАК Код, - | Классификатор.Наименование КАК Наименование, - | ЛОЖЬ КАК ПометкаУдаления, - | %2 КАК Представление - |ИЗ - | Классификатор КАК Классификатор - |ГДЕ - | Классификатор.%1 ПОДОБНО &СтрокаПоиска - | И ( - | " + СтрЗаменить(ШаблонОтбора, "%1", "Классификатор") + " - | ) - |УПОРЯДОЧИТЬ ПО - | Классификатор.%1 - |"; + |ВЫБРАТЬ ПЕРВЫЕ 50 + | NULL КАК Ссылка, + | Классификатор.Код КАК Код, + | Классификатор.Наименование КАК Наименование, + | ЛОЖЬ КАК ПометкаУдаления, + | %2 КАК Представление + |ИЗ + | Классификатор КАК Классификатор + |ГДЕ + | Классификатор.%1 ПОДОБНО &СтрокаПоиска + | И ( + | " + СтрЗаменить(ШаблонОтбора, "%1", "Классификатор") + " + | ) + |УПОРЯДОЧИТЬ ПО + | Классификатор.%1 + |"; Иначе // Запрос и по справочнику и по классификатору. ШаблонЗапроса = " - |ВЫБРАТЬ ПЕРВЫЕ 50 - | СтраныМира.Ссылка КАК Ссылка, - | ЕСТЬNULL(СтраныМира.Код, Классификатор.Код) КАК Код, - | ЕСТЬNULL(СтраныМира.Наименование, Классификатор.Наименование) КАК Наименование, - | ЕСТЬNULL(СтраныМира.ПометкаУдаления, ЛОЖЬ) КАК ПометкаУдаления, - | - | ВЫБОР КОГДА СтраныМира.Ссылка ЕСТЬ NULL ТОГДА - | %2 - | ИНАЧЕ - | %3 - | КОНЕЦ КАК Представление - | - |ИЗ - | Справочник.СтраныМира КАК СтраныМира - |ПОЛНОЕ СОЕДИНЕНИЕ - | Классификатор - |ПО - | Классификатор.Код = СтраныМира.Код - | И Классификатор.Наименование = СтраныМира.Наименование - |ГДЕ - | (СтраныМира.%1 ПОДОБНО &СтрокаПоиска ИЛИ Классификатор.%1 ПОДОБНО &СтрокаПоиска) - | И (" + СтрЗаменить(ШаблонОтбора, "%1", "Классификатор") + ") - | И (" + СтрЗаменить(ШаблонОтбора, "%1", "СтраныМира") + ") - | - |УПОРЯДОЧИТЬ ПО - | ЕСТЬNULL(СтраныМира.%1, Классификатор.%1) - |"; + |ВЫБРАТЬ ПЕРВЫЕ 50 + | СтраныМира.Ссылка КАК Ссылка, + | ЕСТЬNULL(СтраныМира.Код, Классификатор.Код) КАК Код, + | ЕСТЬNULL(СтраныМира.Наименование, Классификатор.Наименование) КАК Наименование, + | ЕСТЬNULL(СтраныМира.ПометкаУдаления, ЛОЖЬ) КАК ПометкаУдаления, + | + | ВЫБОР КОГДА СтраныМира.Ссылка ЕСТЬ NULL ТОГДА + | %2 + | ИНАЧЕ + | %3 + | КОНЕЦ КАК Представление + | + |ИЗ + | Справочник.СтраныМира КАК СтраныМира + |ПОЛНОЕ СОЕДИНЕНИЕ + | Классификатор + |ПО + | Классификатор.Код = СтраныМира.Код + | И Классификатор.Наименование = СтраныМира.Наименование + |ГДЕ + | (СтраныМира.%1 ПОДОБНО &СтрокаПоиска ИЛИ Классификатор.%1 ПОДОБНО &СтрокаПоиска) + | И (" + СтрЗаменить(ШаблонОтбора, "%1", "Классификатор") + ") + | И (" + СтрЗаменить(ШаблонОтбора, "%1", "СтраныМира") + ") + | + |УПОРЯДОЧИТЬ ПО + | ЕСТЬNULL(СтраныМира.%1, Классификатор.%1) + |"; КонецЕсли; ИменаПолей = ПоляПоиска(); @@ -143,17 +298,17 @@ ИменаПолейСтрокой = СтрЗаменить(ИменаПолейСтрокой, ",Наименование", ""); Запрос.Текст = " - |ВЫБРАТЬ - | Код, Наименование " + ИменаПолейСтрокой + " - |ПОМЕСТИТЬ - | Классификатор - |ИЗ - | &Классификатор КАК Классификатор - |ИНДЕКСИРОВАТЬ ПО - | Код, Наименование - | " + ИменаПолейСтрокой + " - |"; - Запрос.УстановитьПараметр("Классификатор", ТаблицаКлассификатора()); + |ВЫБРАТЬ + | Код, Наименование " + ИменаПолейСтрокой + " + |ПОМЕСТИТЬ + | Классификатор + |ИЗ + | &Классификатор КАК Классификатор + |ИНДЕКСИРОВАТЬ ПО + | Код, Наименование + | " + ИменаПолейСтрокой + " + |"; + Запрос.УстановитьПараметр("Классификатор", УправлениеКонтактнойИнформацией.ТаблицаКлассификатора()); Запрос.Выполнить(); Запрос.УстановитьПараметр("СтрокаПоиска", ЭкранироватьСимволыПодобия(Параметры.СтрокаПоиска) + "%"); @@ -175,303 +330,21 @@ Иначе // Данные классификатора РезультатВыбора = Новый Структура("Код, Наименование", - Выборка.Код, Выборка.Наименование); + Выборка.Код, Выборка.Наименование); ЭлементВыбора = Новый Структура("Значение, ПометкаУдаления, Предупреждение", - РезультатВыбора, Выборка.ПометкаУдаления, Неопределено); + РезультатВыбора, Выборка.ПометкаУдаления, Неопределено); КонецЕсли; ДанныеВыбора.Добавить(ЭлементВыбора, Выборка.Представление); КонецЦикла; - + Прервать; КонецЕсли; КонецЦикла; - - #КонецЕсли - + КонецПроцедуры -#КонецОбласти - -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Определяет данные страны по справочнику стран или классификатору ОКСМ. -// -// Параметры: -// КодСтраны - Строка, Число - код ОКСМ страны. Если не указано, то поиск по коду не производится. -// Наименование - Строка - наименование страны. Если не указано, то поиск по наименованию не производится. -// -// Возвращаемое значение: -// Структура - поля: -// * Код - Строка - реквизит найденной страны. -// * Наименование - Строка - реквизит найденной страны. -// * НаименованиеПолное - Строка - реквизит найденной страны. -// * КодАльфа2 - Строка - реквизит найденной страны. -// * КодАльфа3 - Строка - реквизит найденной страны. -// * Ссылка - СправочникаСсылка.СтраныМира - реквизит найденной страны. -// Неопределено - страна не найдена. -// -Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт - - Результат = Неопределено; - - - Если КодСтраны=Неопределено И Наименование=Неопределено Тогда - Возврат Результат; - КонецЕсли; - - НормализованныйКод = КодСтраныМира(КодСтраны); - Если КодСтраны=Неопределено Тогда - УсловиеПоиска = "ИСТИНА"; - ФильтрКлассификатора = Новый Структура; - Иначе - УсловиеПоиска = "Код=" + КонтрольКавычекВСтроке(НормализованныйКод); - ФильтрКлассификатора = Новый Структура("Код", НормализованныйКод); - КонецЕсли; - - Если Наименование<>Неопределено Тогда - УсловиеПоиска = УсловиеПоиска + " И Наименование=" + КонтрольКавычекВСтроке(Наименование); - ФильтрКлассификатора.Вставить("Наименование", Наименование); - КонецЕсли; - - Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); - - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 1 - | Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3 - |ИЗ - | Справочник.СтраныМира - |ГДЕ - | " + УсловиеПоиска + " - |УПОРЯДОЧИТЬ ПО - | Наименование - |"); - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - ЗаполнитьЗначенияСвойств(Результат, Выборка); - - Иначе - ДанныеКлассификатора = ТаблицаКлассификатора(); - СтрокиДанных = ДанныеКлассификатора.НайтиСтроки(ФильтрКлассификатора); - Если СтрокиДанных.Количество()=0 Тогда - Результат = Неопределено; - Иначе - ЗаполнитьЗначенияСвойств(Результат, СтрокиДанных[0]); - КонецЕсли; - - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Определяет данные страны по классификатору ОКСМ. -// -// Параметры: -// Код - Строка, Число - код ОКСМ страны. -// ТипКода - Строка - Варианты: КодСтраны (по умолчанию), Альфа2, Альфа3. -// -// Возвращаемое значение: -// Структура - поля: -// * Код - Строка - реквизит найденной страны. -// * Наименование - Строка - реквизит найденной страны. -// * НаименованиеПолное - Строка - реквизит найденной страны. -// * КодАльфа2 - Строка - реквизит найденной страны. -// * КодАльфа3 - Строка - реквизит найденной страны. -// Неопределено - страна не найдена. -// -Функция ДанныеКлассификатораСтранМираПоКоду(Знач Код, ТипКода = "КодСтраны") Экспорт - - ДанныеКлассификатора = ТаблицаКлассификатора(); - Если СтрСравнить(ТипКода, "Альфа2") = 0 Тогда - СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа2"); - ИначеЕсли СтрСравнить(ТипКода, "Альфа3") = 0 Тогда - СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа3"); - Иначе - СтрокаДанных = ДанныеКлассификатора.Найти(КодСтраныМира(Код), "Код"); - КонецЕсли; - - Если СтрокаДанных=Неопределено Тогда - Результат = Неопределено; - Иначе - Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); - ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных); - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Определяет данные страны по классификатору ОКСМ. -// -// Параметры: -// Наименование - Строка - наименование страны. -// -// Возвращаемое значение: -// Структура - поля: -// * Код - Строка - реквизит найденной страны. -// * Наименование - Строка - реквизит найденной страны. -// * НаименованиеПолное - Строка - реквизит найденной страны. -// * КодАльфа2 - Строка - реквизит найденной страны. -// * КодАльфа3 - Строка - реквизит найденной страны. -// Неопределено - страна не найдена. -// -Функция ДанныеКлассификатораСтранМираПоНаименованию(Знач Наименование) Экспорт - ДанныеКлассификатора = ТаблицаКлассификатора(); - СтрокаДанных = ДанныеКлассификатора.Найти(Наименование, "Наименование"); - Если СтрокаДанных=Неопределено Тогда - Результат = Неопределено; - Иначе - Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); - ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных); - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Создает или возвращает существующую ссылку по данным классификатора. -// -// Параметры: -// Отбор - Структура - содержит поле: -// * Код - Строка - для поиска страны в классификаторе. -// Данные - Структура - для заполнения одноименных оставшихся полей создаваемого объекта. -// -// Возвращаемое значение: -// СправочникСсылка.СтраныМира - ссылка на созданный элемент. -// -Функция СсылкаПоДаннымКлассификатора(Знач Отбор, Знач ДополнительныеДанные = Неопределено) Экспорт - - // Убеждаемся, что страна есть в классификаторе. - ДанныеПоиска = ДанныеКлассификатораСтранМираПоКоду(Отбор.Код); - Если ДанныеПоиска=Неопределено Тогда - ВызватьИсключение НСтр("ru='Некорректный код страны мира для поиска в классификаторе'"); - КонецЕсли; - - // Проверяем на существование в справочнике по данным классификатора. - ДанныеПоиска = ДанныеСтраныМира(ДанныеПоиска.Код, ДанныеПоиска.Наименование); - Результат = ДанныеПоиска.Ссылка; - Если Не ЗначениеЗаполнено(Результат) Тогда - ОбъектСтраны = Справочники.СтраныМира.СоздатьЭлемент(); - ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДанныеПоиска); - Если ДополнительныеДанные<>Неопределено Тогда - ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДополнительныеДанные); - КонецЕсли; - ОбъектСтраны.Записать(); - Результат = ОбъектСтраны.Ссылка; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Возвращает полные данные ОКСМ классификатора. -// -// Возвращаемое значение: -// ТаблицаЗначений - данные классификатора с колонками: -// * Код - Строка - данные страны. -// * Наименование - Строка - данные страны. -// * НаименованиеПолное - Строка - данные страны. -// * КодАльфа2 - Строка - данные страны. -// * КодАльфа3 - Строка - данные страны. -// -// Таблица значений проиндексирована по полям "Код", "Наименование". -// -Функция ТаблицаКлассификатора() Экспорт - Макет = Справочники.СтраныМира.ПолучитьМакет("Классификатор"); - - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(Макет.ПолучитьТекст()); - - Возврат СериализаторXDTO.ПрочитатьXML(Чтение); -КонецФункции - -// Возвращает флаг возможности добавления и изменения элементов. -// -Функция ЕстьПравоДобавления() Экспорт - Возврат ПравоДоступа("Добавление", Метаданные.Справочники.СтраныМира); -КонецФункции - -// Возвращает поля поиска в порядке предпочтения для справочника стран мира. -// -// Возвращаемое значение: -// Массив - содержит структуры с полями: -// * Имя - Строка - имя реквизита поиска. -// * ШаблонПредставления - Строка - шаблон для формирования значения представления по именам реквизитов, -// например: "%1.Наименование (%1.Код)". Здесь "Наименование" и "Код" - имена -// реквизитов, -// "%1" - заполнитель для передачи псевдонима таблицы. -// -Функция ПоляПоиска() - Результат = Новый Массив; - СписокПолей = Справочники.СтраныМира.ПустаяСсылка().Метаданные().ВводПоСтроке; - ГраницаПолей = СписокПолей.Количество() - 1; - ВсеИменаСтрокой = ""; - - ПредставлениеРазделителя = ", "; - РазделительПредставлений = " + """ + ПредставлениеРазделителя + """ + "; - - Для Индекс=0 По ГраницаПолей Цикл - ИмяПоля = СписокПолей[Индекс].Имя; - ВсеИменаСтрокой = ВсеИменаСтрокой + "," + ИмяПоля; - - ШаблонПредставления = "%1." + ИмяПоля; - - ОстальныеПоля = ""; - Для Позиция=0 По ГраницаПолей Цикл - Если Позиция<>Индекс Тогда - ОстальныеПоля = ОстальныеПоля + РазделительПредставлений + СписокПолей[Позиция].Имя; - КонецЕсли; - КонецЦикла; - Если Не ПустаяСтрока(ОстальныеПоля) Тогда - ШаблонПредставления = ШаблонПредставления - + " + "" ("" + " - + "%1." + Сред(ОстальныеПоля, СтрДлина(РазделительПредставлений) + 1) - + " + "")"""; - КонецЕсли; - - Результат.Добавить( - Новый Структура("Имя, ШаблонПредставления", ИмяПоля, ШаблонПредставления)); - КонецЦикла; - - Возврат Новый Структура("СписокПолей, ИменаПолейСтрокой", Результат, Сред(ВсеИменаСтрокой, 2)); -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Приводит код страны к единому виду - строка длиной три символа. -// -Функция КодСтраныМира(Знач КодСтраны) - - Если ТипЗнч(КодСтраны)=Тип("Число") Тогда - Возврат Формат(КодСтраны, "ЧЦ=3; ЧН=; ЧВН=; ЧГ="); - КонецЕсли; - - Возврат Прав("000" + КодСтраны, 3); -КонецФункции - -// Возвращает строку в кавычках. -// -Функция КонтрольКавычекВСтроке(Знач Строка) - Возврат """" + СтрЗаменить(Строка, """", """""") + """"; -КонецФункции - -// Экранирует символы для использования в функции запроса ПОДОБНО. -// -Функция ЭкранироватьСимволыПодобия(Знач Текст, Знач СпецСимвол = "\") - Результат = Текст; - СимволыПодобия = "%_[]^" + СпецСимвол; - - Для Позиция=1 По СтрДлина(СимволыПодобия) Цикл - ТекущийСимвол = Сред(СимволыПодобия, Позиция, 1); - Результат = СтрЗаменить(Результат, ТекущийСимвол, СпецСимвол + ТекущийСимвол); - КонецЦикла; - - Возврат Результат; -КонецФункции - #Область ОбновлениеИнформационнойБазы // Регистрирует к обработке страны мира. @@ -487,16 +360,16 @@ НоваяСтрока = ПредыдущиеЗначенияОКСМ.Добавить(); НоваяСтрока.Код = "203"; - НоваяСтрока.Наименование = "ЧЕШСКАЯ РЕСПУБЛИКА"; + НоваяСтрока.Наименование = НСтр("ru='ЧЕШСКАЯ РЕСПУБЛИКА'"); НоваяСтрока.КодАльфа2 = "CZ"; НоваяСтрока.КодАльфа3 = "CZE"; НоваяСтрока = ПредыдущиеЗначенияОКСМ.Добавить(); НоваяСтрока.Код = "270"; - НоваяСтрока.Наименование = "ГАМБИЯ"; + НоваяСтрока.Наименование = НСтр("ru='ГАМБИЯ'"); НоваяСтрока.КодАльфа2 = "GM"; НоваяСтрока.КодАльфа3 = "GMB"; - НоваяСтрока.НаименованиеПолное = "Республика Гамбия"; + НоваяСтрока.НаименованиеПолное = НСтр("ru='Республика Гамбия'"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -580,7 +453,7 @@ #КонецОбласти - #КонецОбласти -#КонецЕсли \ No newline at end of file +#КонецЕсли + diff --git a/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl b/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl index 46db46122..2117c3506 100644 --- a/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl @@ -1,8 +1,38 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс +#Область ОбработчикиСобытий -// Контролирует уникальность элемента в базе. +Процедура ПередЗаписью(Отказ) + Если ОбменДанными.Загрузка Или ЭтотОбъект.ДополнительныеСвойства.Свойство("НеПроверятьУникальность") Тогда + Возврат; + КонецЕсли; + + Если Не ПроверитьЗаполнение() Тогда + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Существующий = СуществующийЭлемент(); + Если Существующий<>Неопределено Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Существующий.ОписаниеОшибки,, "Объект.Наименование"); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + Если ДанныеЗаполнения<>Неопределено Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения); + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Контролирует уникальность элемента в базе. // // Возвращаемое значение: // Неопределено - нет ошибок. @@ -15,7 +45,7 @@ // * КодАльфа3 - Строка - реквизит уже существующего элемента. // * Ссылка - СправочникаСсылка.СтраныМира - реквизит уже существующего элемента. // -Функция СуществующийЭлемент() Экспорт +Функция СуществующийЭлемент() Результат = Неопределено; @@ -64,34 +94,4 @@ #КонецОбласти -#Область ОбработчикиСобытий - -Процедура ПередЗаписью(Отказ) - Если ОбменДанными.Загрузка Или ЭтотОбъект.ДополнительныеСвойства.Свойство("НеПроверятьУникальность") Тогда - Возврат; - КонецЕсли; - - Если Не ПроверитьЗаполнение() Тогда - Отказ = Истина; - КонецЕсли; -КонецПроцедуры - -Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) - - Существующий = СуществующийЭлемент(); - Если Существующий<>Неопределено Тогда - Отказ = Истина; - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Существующий.ОписаниеОшибки,, "Объект.Наименование"); - КонецЕсли; - -КонецПроцедуры - -Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) - Если ДанныеЗаполнения<>Неопределено Тогда - ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения); - КонецЕсли; -КонецПроцедуры - -#КонецОбласти - #КонецЕсли diff --git a/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo b/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo index 571b32385..0d98736f5 100644 --- a/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo +++ b/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo @@ -147,6 +147,7 @@ Catalog.СтраныМира.Form.ФормаЭлемента Catalog.СтраныМира.Form.ФормаСписка Catalog.СтраныМира.Form.ФормаСписка + DontUse НаименованиеПолное diff --git a/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl index 5e8e3b434..14daa517a 100644 --- a/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -17,6 +18,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form index b9ec2a396..3ba903117 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -295,12 +299,8 @@ <key>ru</key> - <value>Группа кнопок включения загрузки выгрузки данных</value> + <value>Кнопок включения загрузки выгрузки данных</value> - - ru - Группа кнопок включения загрузки выгрузки данных - ГруппаКнопокВключенияЗагрузкиВыгрузкиДанныхExtendedTooltip 45 @@ -377,10 +377,6 @@ ru Список контекстное меню группа кнопок - - ru - Список контекстное меню группа кнопок - СписокКонтекстноеМенюГруппаКнопокExtendedTooltip 48 @@ -445,9 +441,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -717,12 +710,8 @@
      <key>ru</key> - <value>Группа кнопок</value> + <value>Кнопок</value> - - ru - Группа кнопок - ГруппаКнопокExtendedTooltip 42 diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl index 39982c409..855ec9407 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl @@ -150,11 +150,6 @@ Возврат; КонецЕсли; - Сообщение = НСтр("ru = 'Синхронизируются данные по сценарию ""%1""...'"); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, Строка(ТекущиеДанные.Ссылка)); - - Состояние(Сообщение); - Отказ = Ложь; // Запускаем выполнение обмена. @@ -167,8 +162,7 @@ Сообщение = НСтр("ru = 'Сценарий синхронизации успешно выполнен.'"); Картинка = Неопределено; КонецЕсли; - - Состояние(Сообщение,,, Картинка); + ПоказатьОповещениеПользователя(Сообщение,,,Картинка); КонецПроцедуры diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form index 8e7b23cd4..22f93c714 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 23 @@ -70,6 +66,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 25 @@ -89,6 +89,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -364,9 +368,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form index 12b77d311..ce2436adf 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form @@ -1,7 +1,7 @@ - Группа + ГруппаКодНаименование 103 Наименование @@ -85,8 +85,12 @@ true + + <key>ru</key> + <value>Код наименование</value> + - ГруппаExtendedTooltip + ГруппаКодНаименованиеРасширеннаяПодсказка 128 Label true @@ -186,10 +190,6 @@ ru Обмен по расписанию - - ru - Обмен по расписанию - ОбменПоРасписаниюExtendedTooltip 131 @@ -215,6 +215,10 @@ СоставРасписания 5 + + <key>ru</key> + <value>Состав расписания</value> + true true @@ -368,10 +372,6 @@ ru Колонки узла информационной базы - - ru - Колонки узла информационной базы - КолонкиУзлаИнформационнойБазыExtendedTooltip 139 @@ -646,9 +646,6 @@ Auto true true - None - None - None true @@ -661,10 +658,6 @@ ru Состав настройки обмена - - ru - Состав - СоставExtendedTooltip 134 @@ -742,10 +735,6 @@ ru Дополнительно - - ru - Дополнительно - ДополнительноExtendedTooltip 145 diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl index b5bca7b9b..b782b6c5b 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. // @@ -15,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -29,7 +37,7 @@ ВидТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); - СценарийОбменаДанными = Справочники.СценарииОбменовДанными.СоздатьЭлемент(); + СценарийОбменаДанными = СоздатьЭлемент(); // Заполняем реквизиты шапки СценарийОбменаДанными.Наименование = Наименование; @@ -134,9 +142,8 @@ // При необходимости создаем регламентное задание. Если РегламентноеЗаданиеОбъект = Неопределено Тогда - - РегламентноеЗаданиеОбъект = РегламентныеЗадания.СоздатьРегламентноеЗадание("СинхронизацияДанных"); - + ПараметрыЗадания = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.СинхронизацияДанных); + РегламентноеЗаданиеОбъект = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); КонецЕсли; Возврат РегламентноеЗаданиеОбъект; @@ -201,8 +208,8 @@ // Процедура ОчиститьСсылкиНаУзелИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl index db3f073c5..3da842c25 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl @@ -30,7 +30,7 @@ КонецЕсли; // Обновляем кэш платформы для зачитывания актуальных настроек - // сценария обмена данными процедурой ОбменДаннымиПовтИсп.ПолучитьСтруктуруНастроекОбмена. + // сценария обмена данными процедурой ОбменДаннымиПовтИсп.НастройкиОбменаДанными. ОбновитьПовторноИспользуемыеЗначения(); КонецПроцедуры diff --git a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo index 9f2b6ec62..f99b71499 100644 --- a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ Автор + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -153,6 +154,35 @@ Index Use + + ДатаЗаема + + ru + Дата заема + + + Date + + + + ru + ДЛФ=ДВ + + + ru + ДЛФ=ДВ + + + ru + Дата, когда файл был занят для редактирования + + false + + + + Use + Use + ДатаМодификацииУниверсальная @@ -222,6 +252,7 @@ Отредактировал + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -373,6 +404,7 @@ Редактирует + CatalogRef.УчетныеЗаписиСинхронизацииФайлов CatalogRef.Пользователи @@ -486,15 +518,35 @@ Use + + ХранитьВерсии + + ru + Хранить версии + + + Boolean + + + ru + Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия. + + false + + + + Use + Use + - ЭлектронныеПодписи + УдалитьЭлектронныеПодписи ru - электронные подписи + (не используется) электронные подписи ru @@ -699,10 +751,10 @@ - СертификатыШифрования + УдалитьСертификатыШифрования ru - Сертификаты шифрования + (не используется) Сертификаты шифрования ru diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form index 8ac988d3d..611937ec2 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form @@ -90,12 +90,8 @@ <key>ru</key> - <value>Группа лишние файлы</value> + <value>Лишние файлы</value> - - ru - Группа лишние файлы - ГруппаЛишниеФайлыРасширеннаяПодсказка 17 @@ -199,12 +195,8 @@
      <key>ru</key> - <value>Группа комментарий</value> + <value>Комментарий</value> - - ru - Группа комментарий - ГруппаКомментарийРасширеннаяПодсказка 6 diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl index 5e355e65b..a7a406a81 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl @@ -82,7 +82,7 @@ Для Каждого ЛишнийФайл Из ЛишниеФайлы Цикл Попытка Если Не ПустаяСтрока(ПутьКаталогаДляКопирования) Тогда - ИмяФайлаСПутем = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( + ИмяФайлаСПутем = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( КаталогДляКопирования, ЛишнийФайл.Имя); ПереместитьФайл(ЛишнийФайл.ПолноеИмя, КаталогДляКопирования + ИмяФайлаСПутем); @@ -145,7 +145,7 @@ ТаблицаФайловНаДиске.Колонки.Добавить("Отредактировал"); ТаблицаФайловНаДиске.Колонки.Добавить("ДатаРедактирования"); - ПутьКТому = ФайловыеФункцииСлужебный.ПолныйПутьТома(ТомХраненияФайлов); + ПутьКТому = РаботаСФайламиСлужебный.ПолныйПутьТома(ТомХраненияФайлов); МассивФайлов = НайтиФайлы(ПутьКТому,"*", Истина); Для Каждого Файл Из МассивФайлов Цикл @@ -165,7 +165,8 @@ НоваяСтрока.Том = ТомХраненияФайлов; КонецЦикла; - ФайловыеФункцииСлужебный.ПроверитьЦелостностьФайлов(ТаблицаФайловНаДиске, ТомХраненияФайлов); + РаботаСФайламиСлужебный.ПроверитьЦелостностьФайлов(ТаблицаФайловНаДиске, ТомХраненияФайлов); + ТаблицаФайловНаДиске.Индексы.Добавить("СтатусПроверки"); МассивЛишнихФайлов = ТаблицаФайловНаДиске.НайтиСтроки( Новый Структура("СтатусПроверки", НСтр("ru = 'Лишние файлы (есть на диске, но сведения о них отсутствуют)'"))); @@ -224,7 +225,7 @@ ИмяФайла, ИнформацияОбОшибке)); - КонецПроцедуры +КонецПроцедуры &НаСервере Процедура СформироватьОтчетОбОшибках(ОтчетОбОшибках, МассивФайловСОшибками) diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form index 2fac9093d..e5555091f 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form @@ -153,10 +153,6 @@ ru Форма стандартные команды - - ru - Форма стандартные команды - ФормаСтандартныеКомандыРасширеннаяПодсказка 47 @@ -250,6 +246,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Module.bsl index 5593599ea..4e4a0aeef 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Module.bsl @@ -4,7 +4,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.ФормаУстановкаПометкиУдаления.ТолькоВоВсехДействиях = Ложь; КонецЕсли; Элементы.ПеренестиВсеФайлыВТома.Видимость = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами"); @@ -29,10 +29,7 @@ &НаКлиенте Процедура ПеренестиВсеФайлыВТома(Команда) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); - МодульРаботаСФайламиСлужебныйКлиент.ПеренестиВсеФайлыВТома(); - КонецЕсли; + РаботаСФайламиСлужебныйКлиент.ПеренестиВсеФайлыВТома(); КонецПроцедуры @@ -78,9 +75,12 @@ ПодготовкаКУстановкеСнятиюПометкиУдаления(Том, ДополнительныеПараметры); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ДополнительныеПараметры.Запросы, ЭтотОбъект, Новый ОписаниеОповещения( - "ПродолжитьУстановкуСнятиеПометкиУдаления", ЭтотОбъект, ДополнительныеПараметры)); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + ДополнительныеПараметры.Запросы, ЭтотОбъект, Новый ОписаниеОповещения( + "ПродолжитьУстановкуСнятиеПометкиУдаления", ЭтотОбъект, ДополнительныеПараметры)); + КонецЕсли; КонецПроцедуры @@ -101,7 +101,10 @@ Том, СвойстваТома.ПолныйПутьWindows, СвойстваТома.ПолныйПутьLinux); Иначе // Пометка удаления не установлена, ее требуется установить. - Запрос = РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Том) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Запрос = МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Том) + КонецЕсли; КонецЕсли; ДополнительныеПараметры.Запросы.Добавить(Запрос); @@ -123,12 +126,27 @@ &НаСервереБезКонтекста Процедура ЗавершитьУстановкуСнятиеПометкиУдаления(ДополнительныеПараметры) - Объект = ДополнительныеПараметры.Том.ПолучитьОбъект(); - Объект.УстановитьПометкуУдаления(Не ДополнительныеПараметры.ПометкаУдаления); - Объект.Записать(); + НачатьТранзакцию(); + Попытка - РазблокироватьДанныеДляРедактирования( - ДополнительныеПараметры.Том, ДополнительныеПараметры.ИдентификаторФормы); + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ДополнительныеПараметры.Том); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + Объект = ДополнительныеПараметры.Том.ПолучитьОбъект(); + Объект.УстановитьПометкуУдаления(Не ДополнительныеПараметры.ПометкаУдаления); + Объект.Записать(); + + РазблокироватьДанныеДляРедактирования( + ДополнительныеПараметры.Том, ДополнительныеПараметры.ИдентификаторФормы); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form index 26143408a..c67ca9038 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form @@ -92,12 +92,8 @@ <key>ru</key> - <value>Группа код и наименование</value> + <value>Код и наименование</value> - - ru - Группа код и наименование - ГруппаКодИНаименованиеExtendedTooltip 25 @@ -239,7 +235,7 @@
      <key>ru</key> - <value>Группа пути</value> + <value>Пути</value> ГруппаПутиExtendedTooltip @@ -401,12 +397,8 @@ <key>ru</key> - <value>Группа максимальный размер</value> + <value>Максимальный размер</value> - - ru - Группа максимальный размер - ГруппаМаксимальныйРазмерExtendedTooltip 32 @@ -592,10 +584,6 @@ ru Стандартные команды - - ru - Стандартные команды - СтандартныеКомандыРасширеннаяПодсказка 39 diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html index 9e960d98d..75b57ac8c 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html @@ -12,13 +12,7 @@
      • Если сервер 1С:Предприятия работает под Linux, то путь к тому хранения файлов можно указать только локальный, например /home/path. Для того чтобы использовать UNC путь, нужно сделать на него ссылку.  Для этого под правами администратора сделайте следующее:
        • выполните команду вида mkdir folder, где вместо "folder" напишите имя своего каталога. Например, в каталоге /home выполните команду mkdir shared - будет создан каталог shared с полным путем /home/shared.
        • выполните команду вида  mount -t cifs //server/share folder -o //domain/user, password=pwd, где
             - где //server/share - UNC путь к другому компьютеру , folder - путь к каталогу на Linux компьютере, например \home\shared, //domain/user - имя домена/пользователя, если необходимо, pwd - пароль пользователя (если необходимо). -
        •  Если имя и пароль не нужны, команда выглядит так:  mount -t cifs //server/share folder.
      • После этого в пути к тому указываем folder, например /home/shared.

      Проверка целостности тома

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

      Удаление лишних файлов

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

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

      +
    •  Если имя и пароль не нужны, команда выглядит так:  mount -t cifs //server/share folder.
  • После этого в пути к тому указываем folder, например /home/shared.
  • Просмотр списка файлов в томе

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

    См. также:

    • diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl index 53e2c786a..4f80f7e5a 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl @@ -23,10 +23,8 @@ Элементы.ПолныйПутьWindows.ОтображениеПредупрежденияПриРедактировании = ОтображениеПредупрежденияПриРедактировании.Отображать; - ТекущийРазмерВБайтах = 0; - - ФайловыеФункцииСлужебный.ПриОпределенииРазмераФайловНаТоме( - Объект.Ссылка, ТекущийРазмерВБайтах); + ТекущийРазмерВБайтах = РаботаСФайламиСлужебныйВызовСервера.ПодсчитатьРазмерФайловНаТоме( + Объект.Ссылка); ТекущийРазмер = ТекущийРазмерВБайтах / (1024 * 1024); Если ТекущийРазмер = 0 И ТекущийРазмерВБайтах <> 0 Тогда @@ -188,7 +186,7 @@ #Область СлужебныеПроцедурыИФункции &НаКлиенте -Процедура ЗаписатьИЗакрытьОповещение(Результат = Неопределено, Неопределен = Неопределено) Экспорт +Процедура ЗаписатьИЗакрытьОповещение(Результат, Контекст) Экспорт Записать(Новый Структура("ЗаписатьИЗакрыть")); @@ -221,17 +219,18 @@ &НаКлиенте Процедура РазрешитьВнешнийРесурсНачало() - ЗапросыВнешнихРесурсов = Новый Массив; - Если Не ПроверитьЗаполнениеНаСервере(ЗапросыВнешнихРесурсов) Тогда - Возврат; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + ЗапросыВнешнихРесурсов = Новый Массив; + Если Не ПроверитьЗаполнениеНаСервере(ЗапросыВнешнихРесурсов) Тогда + Возврат; + КонецЕсли; + + ОповещениеОЗакрытии = Новый ОписаниеОповещения( + "РазрешитьВнешнийРесурсЗавершение", ЭтотОбъект, ТекущиеПараметрыЗаписи); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыВнешнихРесурсов, ЭтотОбъект, ОповещениеОЗакрытии); КонецЕсли; - ОповещениеОЗакрытии = Новый ОписаниеОповещения( - "РазрешитьВнешнийРесурсЗавершение", ЭтотОбъект, ТекущиеПараметрыЗаписи); - - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ЗапросыВнешнихРесурсов, ЭтотОбъект, ОповещениеОЗакрытии); - КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl index e0b3a1050..a2fe38855 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -16,6 +20,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -23,7 +31,7 @@ // Только для внутреннего использования. Процедура ДобавитьЗапросыНаИспользованиеВнешнихРесурсовВсехТомов(Запросы) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -51,42 +59,50 @@ // Только для внутреннего использования. Процедура ДобавитьЗапросыНаОтменуИспользованияВнешнихРесурсовВсехТомов(Запросы) Экспорт - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТомаХраненияФайлов.Ссылка КАК Ссылка, - | ТомаХраненияФайлов.ПолныйПутьLinux, - | ТомаХраненияФайлов.ПолныйПутьWindows, - | ТомаХраненияФайлов.ПометкаУдаления КАК ПометкаУдаления - |ИЗ - | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Запросы.Добавить(РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( - Выборка.Ссылка)); - КонецЦикла; + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТомаХраненияФайлов.Ссылка КАК Ссылка, + | ТомаХраненияФайлов.ПолныйПутьLinux, + | ТомаХраненияФайлов.ПолныйПутьWindows, + | ТомаХраненияФайлов.ПометкаУдаления КАК ПометкаУдаления + |ИЗ + | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Запросы.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( + Выборка.Ссылка)); + КонецЦикла; + КонецЕсли; КонецПроцедуры // Только для внутреннего использования. Функция ЗапросНаИспользованиеВнешнихРесурсовДляТома(Том, ПолныйПутьWindows, ПолныйПутьLinux) Экспорт - Разрешения = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); - Если ЗначениеЗаполнено(ПолныйПутьWindows) Тогда - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( - ПолныйПутьWindows, Истина, Истина)); + Разрешения = Новый Массив; + + Если ЗначениеЗаполнено(ПолныйПутьWindows) Тогда + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + ПолныйПутьWindows, Истина, Истина)); + КонецЕсли; + + Если ЗначениеЗаполнено(ПолныйПутьLinux) Тогда + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + ПолныйПутьLinux, Истина, Истина)); + КонецЕсли; + + Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, Том); КонецЕсли; - Если ЗначениеЗаполнено(ПолныйПутьLinux) Тогда - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( - ПолныйПутьLinux, Истина, Истина)); - КонецЕсли; - - Возврат РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, Том); - КонецФункции #КонецОбласти diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl index ebc9af6a7..1e8c3f61e 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl @@ -14,9 +14,7 @@ Если МаксимальныйРазмер <> 0 Тогда ТекущийРазмерВБайтах = 0; Если Не Ссылка.Пустая() Тогда - - ФайловыеФункцииСлужебный.ПриОпределенииРазмераФайловНаТоме( - Ссылка, ТекущийРазмерВБайтах); + ТекущийРазмерВБайтах = РаботаСФайламиСлужебныйВызовСервера.ПодсчитатьРазмерФайловНаТоме(Ссылка); КонецЕсли; ТекущийРазмер = ТекущийРазмерВБайтах / (1024 * 1024); diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form index c60ee776c..fd53c117f 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form @@ -35,7 +35,7 @@ Left true - 82 + 60 true 30 true @@ -97,6 +97,7 @@ true true true + true true true @@ -129,16 +130,7 @@ ru - iCloud - - - iCloud - - - - - ru - DrobBox (через dropdav.com) + DropBox (через dropdav.com) Dropbox @@ -196,12 +188,8 @@ <key>ru</key> - <value>Группа сервис логин</value> + <value>Сервис логин</value> - - ru - Группа сервис логин - ГруппаСервисЛогинРасширеннаяПодсказка 43 @@ -318,10 +306,6 @@ ru Логин и пароль - - ru - Группа папка пароль - false ГруппаПапкаПарольРасширеннаяПодсказка @@ -350,12 +334,8 @@ <key>ru</key> - <value>Группа настройки</value> + <value>Настройки</value> - - ru - Группа настройки - ГруппаНастройкиРасширеннаяПодсказка 41 @@ -382,12 +362,8 @@ <key>ru</key> - <value>Группа наименование и настройки</value> + <value>Наименование и настройки</value> - - ru - Группа наименование и настройки - false ГруппаНаименованиеИНастройкиРасширеннаяПодсказка @@ -535,6 +511,11 @@ Объект.АвторФайлов None + + ru + Если файлы в облаке редактирует только один пользователь, то рекомендуется указать его в качестве автора новых и измененных файлов. + + Button АвторФайловРасширеннаяПодсказка 46 @@ -574,12 +555,8 @@ <key>ru</key> - <value>Группа автор пользователь</value> + <value>Автор пользователь</value> - - ru - Группа автор пользователь - ГруппаАвторПользовательРасширеннаяПодсказка 56 @@ -599,42 +576,6 @@ Auto - - ДекорацияПояснениеАвтораФайлов - 47 - - <key>ru</key> - <value>Если файлы в облаке редактирует только один пользователь, то рекомендуется указать его в качестве автора новых и измененных файлов.</value> - - true - true - - true - - - ДекорацияПояснениеАвтораФайловРасширеннаяПодсказка - 49 - Label - true - true - - Left - - - - ДекорацияПояснениеАвтораФайловКонтекстноеМеню - 48 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - true true @@ -644,10 +585,6 @@ ru Автор файлов - - ru - Группа автор файлов - ГруппаАвторФайловРасширеннаяПодсказка 51 diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl index df0d66279..d629f5c5d 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl @@ -126,8 +126,6 @@ &НаКлиенте Процедура ПроверитьВозможностьСинхронизацииСОблачнымСервисом() - Состояние(НСтр("ru = 'Проверка учетной записи'"),,НСтр("ru = 'Выполняется проверка учетной записи. Подождите...'")); - СообщениеОбОшибке = ""; СтруктураРезультата = Неопределено; @@ -158,7 +156,7 @@ &НаСервере Процедура ВыполнитьПроверкуПодключения(УчетнаяЗапись, СтруктураРезультата) - ФайловыеФункцииСлужебный.ВыполнитьПроверкуПодключения(УчетнаяЗапись, СтруктураРезультата); + РаботаСФайламиСлужебный.ВыполнитьПроверкуПодключения(УчетнаяЗапись, СтруктураРезультата); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Help/ru.html index 468bc400a..ed16621e8 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Help/ru.html +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Help/ru.html @@ -1,8 +1,8 @@

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

      -

      Для ввода новой учетной записи нажмите Создать.

      Ввод новой учетной записи

      -
      • Напишите Наименование. +
        • Для ввода новой учетной записи нажмите Создать. +
        • Напишите Наименование.
        • В поле Сервис выберите из списка, с каким облачным сервисом будут синхронизироваться файлы данной учетной записи.
        • Укажите Логин и Пароль - данные для доступа, полученные при регистрации на выбранном облачном сервисе.
        • В поле Корневая папка напишите папку, в которой будут храниться все файлы для этой учетной записи. Ее необходимо создать самостоятельно на облачном сервисе. diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/УчетныеЗаписиСинхронизацииФайлов.mdo b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/УчетныеЗаписиСинхронизацииФайлов.mdo index c65358ae6..dce8ff0f7 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/УчетныеЗаписиСинхронизацииФайлов.mdo +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/УчетныеЗаписиСинхронизацииФайлов.mdo @@ -14,7 +14,6 @@ true Catalog.УчетныеЗаписиСинхронизацииФайлов.StandardAttribute.Description - Catalog.УчетныеЗаписиСинхронизацииФайлов.StandardAttribute.Code DontUse Use @@ -107,14 +106,15 @@ 2 true 9 - 25 + 100 String Variable true true AsDescription InDialog - BothWays + true + QuickChoice Catalog.УчетныеЗаписиСинхронизацииФайлов.Form.ФормаЭлемента Сервис diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form index 848d3c0e5..7c56fc70c 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form @@ -181,6 +181,10 @@ true + + <key>ru</key> + <value>Не удалось подключиться картинка и надпись</value> + ru Учетная запись не настроена картинка и надпись @@ -210,6 +214,10 @@ АдресЭлектроннойПочты 44 + + <key>ru</key> + <value>Адрес почты</value> + true true @@ -218,7 +226,6 @@ АдресЭлектроннойПочты - 1 OnChange АдресЭлектроннойПочтыПриИзменении @@ -321,10 +328,6 @@ ru Аутентификация - - ru - Аутентификация - АутентификацияРасширеннаяПодсказка 201 @@ -342,7 +345,6 @@ NormalSeparation true true - Auto Auto @@ -426,10 +428,6 @@ ru Использовать учетную запись - - ru - Использовать учетную запись - ИспользоватьУчетнуюЗаписьРасширеннаяПодсказка 190 @@ -451,6 +449,94 @@ Auto + + ДляКогоУчетнаяЗапись + 247 + + ВидУчетнойЗаписи + 249 + true + true + + true + + + ВидУчетнойЗаписи + + None + + ВидУчетнойЗаписиРасширеннаяПодсказка + 251 + Label + true + true + + Left + + + + ВидУчетнойЗаписиКонтекстноеМеню + 250 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Для всех + + + Общая + + + + + ru + Только для меня + + + Персональная + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Для кого учетная запись</value> + + + ДляКогоУчетнаяЗаписьРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + ИмяОтправителя 202 @@ -557,10 +643,6 @@ ru Имя отправителя - - ru - Имя отправителя - ИмяОтправителяРасширеннаяПодсказка 203 @@ -656,10 +738,6 @@ ru Способ настройки учетной записи - - ru - Способ настройки учетной записи - СпособНастройкиУчетнойЗаписиРасширеннаяПодсказка 155 @@ -690,10 +768,6 @@ ru Настройка учетной записи - - ru - Настройка учетной записи - НастройкаУчетнойЗаписиРасширеннаяПодсказка 33 @@ -903,10 +977,6 @@ ru Авторизация при отправке писем - - ru - Авторизация при отправке писем - АвторизацияПриОтправкеПисемРасширеннаяПодсказка 79 @@ -1036,10 +1106,6 @@ ru Настройки сервера входящей почты - - ru - Настройки сервера входящей почты - НастройкиСервераИсходящейПочтыРасширеннаяПодсказка 90 @@ -1192,10 +1258,6 @@ ru Длительность ожидания - - ru - Длительность ожидания - ДлительностьОжиданияИсходящейПочтыРасширеннаяПодсказка 180 @@ -1291,10 +1353,6 @@ ru Настройка сервера исходящей почты - - ru - Настройка сервера исходящей почты - НастройкаСервераИсходящейПочтыРасширеннаяПодсказка 39 @@ -1667,10 +1725,6 @@ ru Протокол и порт сервера входящей почты - - ru - Протокол и порт сервера входящей почты - ПротоколИПортСервераВходящейПочтыРасширеннаяПодсказка 115 @@ -1740,10 +1794,6 @@ ru Тип соединения и длительность ожидания - - ru - Тип соединения и длительность ожидания - ТипСоединенияИДлительностьОжиданияРасширеннаяПодсказка 123 @@ -1773,10 +1823,6 @@ ru Настройки сервера входящей почты - - ru - Настройки сервера входящей почты - НастройкиСервераВходящейПочтыРасширеннаяПодсказка 110 @@ -1974,10 +2020,6 @@ ru Настройка удаления писем - - ru - Настройка удаления писем - НастройкаУдаленияПисемРасширеннаяПодсказка 141 @@ -2006,10 +2048,6 @@ ru Оставлять письма на сервере - - ru - Оставлять письма на сервере - ОставлятьПисьмаНаСервереРасширеннаяПодсказка 136 @@ -2243,10 +2281,6 @@ ru Длительность ожидания - - ru - Длительность ожидания - ДлительностьОжиданияРасширеннаяПодсказка 128 @@ -2450,10 +2484,6 @@ ru Проверка настроек учетной записи - - ru - Проверка настроек учетной записи - ПроверкаНастроекУчетнойЗаписиРасширеннаяПодсказка 35 @@ -2629,10 +2659,6 @@ vasyapupkin@example.com завершена. ru Учетная запись успешно настроена - - ru - Учетная запись успешно настроена - УчетнаяЗаписьУспешноНастроенаРасширеннаяПодсказка 37 @@ -2659,10 +2685,6 @@ vasyapupkin@example.com завершена. ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 2 @@ -2727,7 +2749,7 @@ vasyapupkin@example.com завершена. Left - Form.StandardCommand.CustomizeForm + 0 Normal Auto true @@ -2745,10 +2767,6 @@ vasyapupkin@example.com завершена. ru Командная панель левая часть - - ru - Командная панель левая часть - КоманднаяПанельЛеваяЧастьРасширеннаяПодсказка 12 @@ -2883,10 +2901,6 @@ vasyapupkin@example.com завершена. ru Командная панель правая часть - - ru - Командная панель правая часть - КоманднаяПанельПраваяЧастьРасширеннаяПодсказка 31 @@ -2911,10 +2925,6 @@ vasyapupkin@example.com завершена. ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 29 @@ -2953,6 +2963,7 @@ vasyapupkin@example.com завершена. Abort Close + CustomizeForm Help Ignore No @@ -3650,6 +3661,24 @@ vasyapupkin@example.com завершена. true + + ВидУчетнойЗаписи + + <key>ru</key> + <value>Вид учетной записи</value> + + 39 + + String + + + + true + + + true + + Назад diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl index af45bd9de..85d68a964 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl @@ -8,7 +8,14 @@ КонецЕсли; Элементы.КнопкаПерейтиКНастройкам.Видимость = Ложь; - ИспользуютсяПрофилиБезопасности = ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + Элементы.СпособНастройки.Видимость = Не ИспользуютсяПрофилиБезопасности; Если ИспользуютсяПрофилиБезопасности Тогда СпособНастройки = "Вручную"; @@ -16,8 +23,12 @@ СпособНастройки = "Автоматически"; КонецЕсли; + ДоступноПолучениеПисем = РаботаСПочтовымиСообщениямиСлужебный.НастройкиПодсистемы().ДоступноПолучениеПисем; КонтекстныйРежим = Параметры.КонтекстныйРежим; - Элементы.ИспользоватьУчетнуюЗапись.Видимость = Не КонтекстныйРежим; + Элементы.ИспользоватьУчетнуюЗапись.Видимость = Не КонтекстныйРежим И ДоступноПолучениеПисем; + Элементы.Протокол.Доступность = ДоступноПолучениеПисем; + Элементы.ОставлятьПисьмаНаСервере.Видимость = ДоступноПолучениеПисем; + Элементы.НастройкаУчетнойЗаписиЗаголовок.Заголовок = ?(КонтекстныйРежим, НСтр("ru = 'Для отправки писем необходимо настроить учетную запись электронной почты'"), НСтр("ru = 'Введите параметры учетной записи'")); @@ -28,7 +39,7 @@ Заголовок = НСтр("ru = 'Настройка учетной записи электронной почты'"); КонецЕсли; - ИспользоватьДляПолучения = Не КонтекстныйРежим; + ИспользоватьДляПолучения = Не КонтекстныйРежим И ДоступноПолучениеПисем; ИспользоватьДляОтправки = Истина; Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаУчетнойЗаписи; @@ -70,6 +81,10 @@ КонецЕсли; КонецЕсли; + ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(); + Элементы.ДляКогоУчетнаяЗапись.Видимость = ЭтоПолноправныйПользователь; + ВидУчетнойЗаписи = ?(ЭтоПолноправныйПользователь, "Общая", "Персональная"); + КонецПроцедуры &НаКлиенте @@ -229,7 +244,7 @@ КонецЕсли; КонецЕсли; ИначеЕсли ТекущаяСтраница = Элементы.НастройкаСервераИсходящейПочты Тогда - Если Не КонтекстныйРежим Или ТребуетсяВходНаСерверПередОтправкой Тогда + Если Не КонтекстныйРежим И ИспользоватьДляПолучения Или ТребуетсяВходНаСерверПередОтправкой Тогда СледующаяСтраница = Элементы.НастройкаСервераВходящейПочты; Иначе СледующаяСтраница = Элементы.ДополнительныеНастройки; @@ -269,11 +284,18 @@ &НаКлиенте Процедура ВыполнитьПроверкуНастроек() - Запрос = СоздатьЗапросНаИспользованиеВнешнихРесурсов(); - ОповещениеОЗакрытии = Новый ОписаниеОповещения("ВыполнитьПроверкуНастроекЗапросНаРазрешенияВыполнен", ЭтотОбъект); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Запрос), ЭтотОбъект, ОповещениеОЗакрытии); + ОповещениеОЗакрытии = Новый ОписаниеОповещения("ВыполнитьПроверкуНастроекЗапросНаРазрешенияВыполнен", ЭтотОбъект); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запрос = СоздатьЗапросНаИспользованиеВнешнихРесурсов(); + + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Запрос), ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -292,7 +314,9 @@ &НаСервере Функция СоздатьЗапросНаИспользованиеВнешнихРесурсов() - Возврат РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( Разрешения(), СсылкаНовойУчетнойЗаписи); КонецФункции @@ -302,9 +326,11 @@ Результат = Новый Массив; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Если ИспользоватьДляОтправки Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( "SMTP", СерверИсходящейПочты, ПортСервераИсходящейПочты, @@ -313,7 +339,7 @@ Если ИспользоватьДляПолучения Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( Протокол, СерверВходящейПочты, ПортСервераВходящейПочты, @@ -569,7 +595,12 @@ Если Не ПустаяСтрока(ТекстОшибки) Тогда ПроверкаЗавершиласьСОшибками = Истина; Иначе - СоздатьУчетнуюЗапись(); + Попытка + СоздатьУчетнуюЗапись(); + Исключение + ПроверкаЗавершиласьСОшибками = Истина; + СообщенияОбОшибках = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; КонецЕсли; КонецПроцедуры @@ -577,27 +608,34 @@ &НаСервере Процедура СоздатьУчетнуюЗапись() + Если КонтекстныйРежим И ВидУчетнойЗаписи = "Общая" И ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты, "АдресЭлектроннойПочты")) Тогда + УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПолучитьОбъект(); + Иначе + Если УчетнаяЗаписьСсылка.Пустая() Тогда + УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СоздатьЭлемент(); + УчетнаяЗапись.УстановитьСсылкуНового(СсылкаНовойУчетнойЗаписи); + Иначе + УчетнаяЗапись = УчетнаяЗаписьСсылка.ПолучитьОбъект(); + КонецЕсли; + КонецЕсли; + ЗаполнитьЗначенияСвойств(УчетнаяЗапись, ЭтотОбъект); + УчетнаяЗапись.ИмяПользователя = ИмяОтправителяПисем; + УчетнаяЗапись.Пользователь = ИмяПользователяДляПолученияПисем; + УчетнаяЗапись.ПользовательSMTP = ИмяПользователяДляОтправкиПисем; + УчетнаяЗапись.ВремяОжидания = ДлительностьОжиданияСервера; + УчетнаяЗапись.ОставлятьКопииСообщенийНаСервере = ОставлятьКопииПисемНаСервере; + УчетнаяЗапись.ПериодХраненияСообщенийНаСервере = ?(ОставлятьКопииПисемНаСервере И УдалятьПисьмаССервера И Протокол = "POP", ПериодХраненияСообщенийНаСервере, 0); + УчетнаяЗапись.ПротоколВходящейПочты = Протокол; + УчетнаяЗапись.Наименование = НазваниеУчетнойЗаписи; + Если ВидУчетнойЗаписи = "Персональная" Тогда + УчетнаяЗапись.ВладелецУчетнойЗаписи = Пользователи.ТекущийПользователь(); + Иначе + УчетнаяЗапись.ВладелецУчетнойЗаписи = Справочники.Пользователи.ПустаяСсылка(); + КонецЕсли; + УчетнаяЗапись.ДополнительныеСвойства.Вставить("НеПроверятьИзменениеНастроек"); + НачатьТранзакцию(); Попытка - Если КонтекстныйРежим И ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты, "АдресЭлектроннойПочты")) Тогда - УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПолучитьОбъект(); - Иначе - Если УчетнаяЗаписьСсылка.Пустая() Тогда - УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СоздатьЭлемент(); - УчетнаяЗапись.УстановитьСсылкуНового(СсылкаНовойУчетнойЗаписи); - Иначе - УчетнаяЗапись = УчетнаяЗаписьСсылка.ПолучитьОбъект(); - КонецЕсли; - КонецЕсли; - ЗаполнитьЗначенияСвойств(УчетнаяЗапись, ЭтотОбъект); - УчетнаяЗапись.ИмяПользователя = ИмяОтправителяПисем; - УчетнаяЗапись.Пользователь = ИмяПользователяДляПолученияПисем; - УчетнаяЗапись.ПользовательSMTP = ИмяПользователяДляОтправкиПисем; - УчетнаяЗапись.ВремяОжидания = ДлительностьОжиданияСервера; - УчетнаяЗапись.ОставлятьКопииСообщенийНаСервере = ОставлятьКопииПисемНаСервере; - УчетнаяЗапись.ПериодХраненияСообщенийНаСервере = ?(ОставлятьКопииПисемНаСервере И УдалятьПисьмаССервера И Протокол = "POP", ПериодХраненияСообщенийНаСервере, 0); - УчетнаяЗапись.ПротоколВходящейПочты = Протокол; - УчетнаяЗапись.Наименование = НазваниеУчетнойЗаписи; УчетнаяЗапись.Записать(); УчетнаяЗаписьСсылка = УчетнаяЗапись.Ссылка; ТребуетсяПодтверждениеЗакрытияФормы = Ложь; @@ -606,15 +644,15 @@ ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(УчетнаяЗаписьСсылка, ПарольДляПолученияПисем); ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(УчетнаяЗаписьСсылка, ПарольДляОтправкиПисем, "ПарольSMTP"); УстановитьПривилегированныйРежим(Ложь); - ЗафиксироватьТранзакцию(); + ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка при создании учетной записи электронной почты'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; - + КонецПроцедуры &НаСервере @@ -716,7 +754,12 @@ Или ИспользоватьДляПолучения <> НайденныеНастройки.ДляПолучения; ЗаполнитьЗначенияСвойств(ЭтотОбъект, НайденныеНастройки); Если Не ПроверкаЗавершиласьСОшибками Тогда - СоздатьУчетнуюЗапись(); + Попытка + СоздатьУчетнуюЗапись(); + Исключение + ПроверкаЗавершиласьСОшибками = Истина; + СообщенияОбОшибках = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; ОповеститьОбИзменении(СсылкаНовойУчетнойЗаписи); КонецЕсли; ПерейтиНаСледующуюСтраницу(); diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Form.form similarity index 61% rename from SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Form.form rename to SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Form.form index 9e561d675..bea5fc95e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Form.form @@ -1,20 +1,23 @@ <?xml version="1.0" encoding="UTF-8"?> <form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:form="http://g5.1c.ru/v8/dt/form"> + <title> + <key>ru</key> + <value>Введите пароль учетной записи</value> + - Информация - 5 + Пароль + 1 true true true - Информация + Пароль - None - ИнформацияExtendedTooltip - 9 + ПарольРасширеннаяПодсказка + 3 Label true true @@ -23,71 +26,42 @@ - ИнформацияКонтекстноеМеню - 6 + ПарольКонтекстноеМеню + 2 true - LabelField + InputField Enter true Left true - + true true + true + true + true + true + true + Normal - - СУчетомПодпапок - 3 - true - true - - true - - - СУчетомПодпапок - - Right - - СУчетомПодпапокExtendedTooltip - 10 - Label - true - true - - Left - - - - СУчетомПодпапокКонтекстноеМеню - 4 - true - - CheckBoxField - Enter - true - Left - true - - Bottom true ФормаКоманднаяПанель -1 - ОК - 1 + ФормаОК + 4 true true true - false - ОКExtendedTooltip - 7 + ФормаОКРасширеннаяПодсказка + 5 Label true true @@ -95,7 +69,7 @@ Left - Form.StandardCommand.OK + Form.Command.ОК Auto true true @@ -104,17 +78,16 @@ Auto - Отмена - 2 + ФормаОтмена + 6 true true true - false - ОтменаExtendedTooltip - 8 + ФормаОтменаРасширеннаяПодсказка + 7 Label true true @@ -133,42 +106,34 @@ Right true - - OnCreateAtServer - ПриСозданииНаСервере - + Abort + Close + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 30 LockOwner true true Vertical true + true true auto true - СУчетомПодпапок + Пароль <key>ru</key> - <value>С учетом подпапок</value> + <value>Пароль</value> 1 - - Boolean - - - true - - - true - - - - Информация - - <key>ru</key> - <value>Информация</value> - - 2 String @@ -180,6 +145,28 @@ true + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Module.bsl new file mode 100644 index 000000000..ae6749394 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаДоступаКУчетнойЗаписи/Module.bsl @@ -0,0 +1,8 @@ +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + Закрыть(Пароль); +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form index c8dd5b37c..13a95543e 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -58,6 +62,42 @@ true + + ВладелецУчетнойЗаписи + 26 + true + true + + true + + + Список.ВладелецУчетнойЗаписи + + + ВладелецУчетнойЗаписиРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ВладелецУчетнойЗаписиКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + Ссылка 14 @@ -204,9 +244,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -219,6 +256,44 @@ true + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + 29 + true + true + + true + + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + + Right + + OnChange + ПоказыватьПерсональныеУчетныеЗаписиПользователейПриИзменении + + + ПоказыватьПерсональныеУчетныеЗаписиПользователейРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ПоказыватьПерсональныеУчетныеЗаписиПользователейКонтекстноеМеню + 30 + true + + CheckBoxField + Enter + true + Left + true + + ФормаКоманднаяПанель -1 @@ -302,6 +377,10 @@ Left + + OnCreateAtServer + ПриСозданииНаСервере + LockOwner true true @@ -339,6 +418,23 @@ true + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + + <key>ru</key> + <value>Показывать персональные учетные записи пользователей</value> + + 2 + + Boolean + + + true + + + true + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..2b90d1323 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,35 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.ПоказыватьПерсональныеУчетныеЗаписиПользователей.Видимость = Пользователи.ЭтоПолноправныйПользователь(); + ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей); + Элементы.ВладелецУчетнойЗаписи.Видимость = ПоказыватьПерсональныеУчетныеЗаписиПользователей; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПоказыватьПерсональныеУчетныеЗаписиПользователейПриИзменении(Элемент) + ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей); + Элементы.ВладелецУчетнойЗаписи.Видимость = ПоказыватьПерсональныеУчетныеЗаписиПользователей; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей) + СписокПользователей = Новый Массив; + СписокПользователей.Добавить(ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка")); + СписокПользователей.Добавить(ПользователиКлиентСервер.ТекущийПользователь()); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "ВладелецУчетнойЗаписи", СписокПользователей, ВидСравненияКомпоновкиДанных.ВСписке, , + Не ПоказыватьПерсональныеУчетныеЗаписиПользователей); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form index 4a893305d..585d8f365 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 28 @@ -78,10 +74,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 30 @@ -101,6 +93,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -237,6 +233,42 @@ true + + ВладелецУчетнойЗаписи + 43 + true + true + + true + + + Список.ВладелецУчетнойЗаписи + + + ВладелецУчетнойЗаписиРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ВладелецУчетнойЗаписиКонтекстноеМеню + 44 + true + + LabelField + Enter + true + Left + true + + true + true + + Ссылка 24 @@ -384,9 +416,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -400,11 +429,53 @@ ГруппаПользовательскихНастроек + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + 40 + true + true + + true + + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + + Right + + OnChange + ПоказыватьПерсональныеУчетныеЗаписиПользователейПриИзменении + + + ПоказыватьПерсональныеУчетныеЗаписиПользователейРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ПоказыватьПерсональныеУчетныеЗаписиПользователейКонтекстноеМеню + 41 + true + + CheckBoxField + Enter + true + Left + true + + Форма_КоманднаяПанель -1 Left + + OnCreateAtServer + ПриСозданииНаСервере + DontBlock true true @@ -439,6 +510,23 @@ true + + ПоказыватьПерсональныеУчетныеЗаписиПользователей + + <key>ru</key> + <value>Показывать персональные учетные записи пользователей</value> + + 2 + + Boolean + + + true + + + true + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..2b90d1323 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,35 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.ПоказыватьПерсональныеУчетныеЗаписиПользователей.Видимость = Пользователи.ЭтоПолноправныйПользователь(); + ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей); + Элементы.ВладелецУчетнойЗаписи.Видимость = ПоказыватьПерсональныеУчетныеЗаписиПользователей; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПоказыватьПерсональныеУчетныеЗаписиПользователейПриИзменении(Элемент) + ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей); + Элементы.ВладелецУчетнойЗаписи.Видимость = ПоказыватьПерсональныеУчетныеЗаписиПользователей; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ПереключитьВидимостьПерсональныхУчетныхЗаписей(Список, ПоказыватьПерсональныеУчетныеЗаписиПользователей) + СписокПользователей = Новый Массив; + СписокПользователей.Добавить(ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка")); + СписокПользователей.Добавить(ПользователиКлиентСервер.ТекущийПользователь()); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "ВладелецУчетнойЗаписи", СписокПользователей, ВидСравненияКомпоновкиДанных.ВСписке, , + Не ПоказыватьПерсональныеУчетныеЗаписиПользователей); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index 91bc3d744..3a2f6f93b 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -157,10 +157,6 @@ ru Шапка - - ru - Шапка - ШапкаРасширеннаяПодсказка 87 @@ -445,10 +441,6 @@ ru Авторизация при отправке писем - - ru - Авторизация при отправке писем - АвторизацияПриОтправкеПисемРасширеннаяПодсказка 193 @@ -578,10 +570,6 @@ ru Настройки сервера входящей почты - - ru - Настройки сервера входящей почты - НастройкиСервераИсходящейПочтыРасширеннаяПодсказка 159 @@ -655,10 +643,6 @@ ru Тип соединения и длительность ожидания при отправке - - ru - Тип соединения и длительность ожидания при отправке - ТипСоединенияИДлительностьОжиданияПриОтправкеРасширеннаяПодсказка 203 @@ -698,6 +682,10 @@ Объект.ТребуетсяВходНаСерверПередОтправкой Right + + OnChange + ТребуетсяВходНаСерверПередОтправкойПриИзменении + ТребуетсяВходНаСерверПередОтправкойРасширеннаяПодсказка 191 @@ -729,10 +717,6 @@ ru POP перед SMTP - - ru - POPПеред SMTP - POPПередSMTPРасширеннаяПодсказка 205 @@ -754,6 +738,47 @@ Auto + + ОтправлятьСкрытыеКопииПисемНаЭтотАдрес + 219 + true + true + + true + + + Объект.ОтправлятьСкрытыеКопииПисемНаЭтотАдрес + + Right + Button + + ОтправлятьСкрытыеКопииПисемНаЭтотАдресРасширеннаяПодсказка + 221 + + <key>ru</key> + <value>Рекомендуется включать при отсутствии штатных возможностей для хранения отправленных писем на почтовом сервере. +После включения флажка, чтобы не путать скрытые копии отправленных писем с обычными входящими письмами, +также рекомендуется настроить правило обработки (фильтрации) входящих писем в настройках ящика на почтовом сервере.</value> + + Label + true + true + + Left + + + + ОтправлятьСкрытыеКопииПисемНаЭтотАдресКонтекстноеМеню + 220 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -763,10 +788,6 @@ ru Отправка писем - - ru - Отправка писем - ОтправкаПисемРасширеннаяПодсказка 101 @@ -1096,10 +1117,6 @@ ru Протокол и порт сервера входящей почты - - ru - Протокол и порт сервера входящей почты - ПротоколИПортСервераВходящейПочтыРасширеннаяПодсказка 112 @@ -1173,10 +1190,6 @@ ru Тип соединения и длительность ожидания - - ru - Тип соединения и длительность ожидания - ТипСоединенияИДлительностьОжиданияРасширеннаяПодсказка 188 @@ -1206,10 +1219,6 @@ ru Настройки сервера входящей почты - - ru - Настройки сервера входящей почты - НастройкиСервераВходящейПочтыРасширеннаяПодсказка 126 @@ -1405,10 +1414,6 @@ ru Настройка периода хранения писем - - ru - Настройка периода хранения писем - НастройкаПериодаХраненияПисемРасширеннаяПодсказка 142 @@ -1437,10 +1442,6 @@ ru Оставлять письма на сервере - - ru - Оставлять письма на сервере - ОставлятьПисьмаНаСервереРасширеннаяПодсказка 186 @@ -1470,10 +1471,6 @@ ru Получение писем - - ru - Получение писем - ПолучениеПисемРасширеннаяПодсказка 99 @@ -1588,10 +1585,6 @@ ru Длительность ожидания - - ru - Длительность ожидания - ДлительностьОжиданияРасширеннаяПодсказка 137 @@ -1620,10 +1613,6 @@ ru Прочие настройки - - ru - Прочие настройки - ПрочиеНастройкиРасширеннаяПодсказка 207 @@ -1666,6 +1655,153 @@ Auto + + ГруппаДляКогоУчетнаяЗапись + 222 + + ДляКогоУчетнаяЗапись + 224 + + <key>ru</key> + <value>Для кого учетная запись</value> + + true + true + + true + + + ВидУчетнойЗаписи + + None + + OnChange + ДляКогоУчетнаяЗаписьПриИзменении + + + ДляКогоУчетнаяЗаписьРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + + ДляКогоУчетнаяЗаписьКонтекстноеМеню + 225 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Для всех + + + Общая + + + + + ru + Только для: + + + Персональная + + + Vertical + + + + ПользовательУчетнойЗаписи + 227 + + <key>ru</key> + <value>Владелец учетной записи</value> + + true + true + + true + + + Объект.ВладелецУчетнойЗаписи + + None + + OnChange + ПользовательУчетнойЗаписиПриИзменении + + + ПользовательУчетнойЗаписиРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + ПользовательУчетнойЗаписиКонтекстноеМеню + 228 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Для кого учетная запись</value> + + 46 + false + + ГруппаДляКогоУчетнаяЗаписьРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + auto + Auto + Auto + + ФормаКоманднаяПанель -1 @@ -1733,10 +1869,6 @@ ru Форма стандартные команды - - ru - Форма стандартные команды - ФормаСтандартныеКомандыРасширеннаяПодсказка 211 @@ -1824,6 +1956,10 @@ OnCreateAtServer ПриСозданииНаСервере + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + WriteAndClose DontBlock true @@ -1940,6 +2076,77 @@ true + + ВидУчетнойЗаписи + + <key>ru</key> + <value>Вид учетной записи</value> + + 7 + + String + + + + true + + + true + + true + + + ВладелецУчетнойЗаписи + + <key>ru</key> + <value>Владелец учетной записи</value> + + 8 + + CatalogRef.Пользователи + + + true + + + true + + + + ПроверкаПароля + + <key>ru</key> + <value>Проверка пароля</value> + + 9 + + String + + + + true + + + true + + + + ДоступноПолучениеПисем + + <key>ru</key> + <value>Доступно получение писем</value> + + 10 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть @@ -1981,6 +2188,10 @@ <event>BeforeWrite</event> <name>ПередЗаписью</name> </handlers> + <handlers> + <event>BeforeWriteAtServer</event> + <name>ПередЗаписьюНаСервере</name> + </handlers> <handlers> <event>OnWriteAtServer</event> <name>ПриЗаписиНаСервере</name> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html index f9c6f6382..cf4d99369 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html @@ -18,8 +18,8 @@ <ul><li>Укажите <strong>Имя пользователя</strong> учетной записи в формате <a href="mailto:User@Server.net">User@Server.net</a>, он может отличаться от основного, в таком случае он будет предназначен только для отправки писем.</li></ul><ul><li>При необходимости введите <strong>Пароль</strong> учетной записи (если он не введен, программа запрашивает его при отправке писем). </li></ul><ul><li>При необходимости включите флажок <strong>Безопасная проверка пароля</strong>. </li><li>В поле <strong>Сервер</strong> укажите адрес SMTP-сервера, например, "smtp.Server.net". </li><li>Укажите <strong>Порт</strong> компьютера для отправки почтовых сообщений, например, "465". -</li><li>Включите флажок <strong>Использовать безопасное соединение (SSL)</strong>. -</li><li>При необходимости включите флажок <strong>Требуется авторизация на сервере входящей почты перед отправкой</strong>.</li></ul><h3>Получение писем (настройка сервера входящей почты) </h3> +</li><li>Включите флажок <strong>Использовать безопасное соединение</strong> (SSL). +</li><li>При необходимости включите флажок <strong>Требуется вход на сервер перед отправкой</strong>.</li></ul><h3>Получение писем (настройка сервера входящей почты) </h3> <ul><li>Укажите <strong>Имя пользователя</strong> учетной записи в формате <a href="mailto:User@Server.net">User@Server.net</a>, он может отличаться от основного, в таком случае он будет предназначен только для получения писем. </li><li>При необходимости введите <strong>Пароль</strong> учетной записи (если он не введен, программа запрашивает его для получения писем). </li></ul><ul><li>При необходимости включите флажок <strong>Безопасная проверка пароля</strong>. </li><li>В поле <strong>Сервер</strong> укажите адрес POP3 сервера, например, "imap.Server.net".  @@ -27,17 +27,7 @@ </li><li>Укажите <strong>Порт</strong> компьютера для получения входящей почты, например, 993. </li><li>Включите флажок <strong>Использовать безопасное соединение (SSL)</strong>. </li><li>Включите флажок <strong>Оставлять копии писем на сервере</strong>, для того чтобы программа не удалила письма в папке "Входящие" почтового ящика электронной почты. По умолчанию флажок отключен, в этом случае все письма после получения будут удалены с почтового сервера. -</li><li>Определите срок хранения писем на почтовом сервере с помощью поля <strong>Удалять письма с сервера через</strong> - например, через "10 дней".</li></ul><h3>Возможности при получении писем по протоколу IMAP</h3> -<ul><li> -<div style="MARGIN-LEFT: 0px">В программе предусмотрена поддержка протокола IMAP. Электронные письма по данному протоколу загружаются из всех папок на почтовом сервере, в том числе и исходящие письма, за исключением папок <strong>Черновики</strong>, <strong>Удаленные</strong>, <strong>Спам</strong>.</div> -</li><li> -<div style="MARGIN-LEFT: 0px">Если на сервере нет ни одной активной папки, то загрузка писем выполняется из всех папок, кроме списка исключений, который описан выше. Связано такое решение с тем, что некоторые почтовые серверы все папки по умолчанию делают неактивными, при этом из собственных веб-клиентов работают с ними как с активными.</div> -</li><li> -<div style="MARGIN-LEFT: 0px">Исходящим письмом считаются письма, у которых адрес отправителя совпадает с адресом, указанным в учетной записи электронной почты. В случае если такое письмо отправлено и на собственный почтовый адрес, то оно не загружается.</div> -</li><li> -<div style="MARGIN-LEFT: 0px">Для загруженного письма проверяются ранее загруженные письма на предмет поиска основания, а также проверяется, а не является ли загруженное письмо основанием для одного ли нескольких ранее загруженных писем. Таким образом, обеспечивается надежное выстраивание писем в цепочки и определение для вновь загруженных писем предметов.</div> -</li><li> -<div style="MARGIN-LEFT: 0px">При получении писем по протоколу IMAP предусмотрены более широкие возможности <a href="InformationRegister.НастройкиУчетныхЗаписейЭлектроннойПочты.Form.ФормаЗаписи/Help">обработки писем</a>. Открываются по команде <strong>Настройки</strong> панели навигации учетной записи электронной почты.</div></li></ul><h3>Прочие настройки</h3> +</li><li>Определите срок хранения писем на почтовом сервере с помощью поля <strong>Удалять письма с сервера через</strong> - например, через "10 дней".</li></ul><h3>Прочие настройки</h3> <ul><li>Укажите <strong>Длительность ожидания сервера</strong> - например, "30 сек".</li></ul><h3>Проверка настроек</h3> <ul><li> <p>Нажмите <strong>Проверить настройки</strong> для проверки введенных параметров учетной записи.</p> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl index 3b7ab9eb1..cd629d7a1 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl @@ -18,9 +18,19 @@ РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; КонецЕсли; + ДоступноПолучениеПисем = РаботаСПочтовымиСообщениямиСлужебный.НастройкиПодсистемы().ДоступноПолучениеПисем; + Элементы.ИспользоватьУчетнуюЗапись.ОтображатьЗаголовок = ДоступноПолучениеПисем; + Элементы.ДляПолучения.Видимость = ДоступноПолучениеПисем; + Элементы.ОставлятьПисьмаНаСервере.Видимость = ДоступноПолучениеПисем; + Если Не ДоступноПолучениеПисем Тогда + Элементы.ДляОтправки.Заголовок = НСтр("ru = 'Использовать для отправки писем'"); + КонецЕсли; + Элементы.ПолучениеПисем.Доступность = ДоступноПолучениеПисем Или Объект.ТребуетсяВходНаСерверПередОтправкой; + Элементы.Протокол.Доступность = ДоступноПолучениеПисем; + Если Объект.Ссылка.Пустая() Тогда Объект.ИспользоватьДляОтправки = Истина; - Объект.ИспользоватьДляПолучения = Истина; + Объект.ИспользоватьДляПолучения = ДоступноПолучениеПисем; КонецЕсли; УдалятьПисьмаССервера = Объект.ПериодХраненияСообщенийНаСервере > 0; @@ -38,6 +48,12 @@ Элементы.ФормаЗаписатьИЗакрыть.Доступность = Не ТолькоПросмотр; + ЭтоПерсональнаяУчетнаяЗапись = ЗначениеЗаполнено(Объект.ВладелецУчетнойЗаписи); + Элементы.ПользовательУчетнойЗаписи.Доступность = ЭтоПерсональнаяУчетнаяЗапись; + ВидУчетнойЗаписи = ?(ЭтоПерсональнаяУчетнаяЗапись, "Персональная", "Общая"); + Элементы.ГруппаДляКогоУчетнаяЗапись.Доступность = Пользователи.ЭтоПолноправныйПользователь(); + ВладелецУчетнойЗаписи = Объект.ВладелецУчетнойЗаписи; + КонецПроцедуры &НаСервере @@ -55,6 +71,20 @@ КонецЕсли; КонецПроцедуры +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + Если ВидУчетнойЗаписи = "Персональная" И Не ЗначениеЗаполнено(Объект.ВладелецУчетнойЗаписи) Тогда + Отказ = Истина; + ТекстСообщения = НСтр("ru = 'Не выбран владелец учетной записи.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "Объект.ВладелецУчетнойЗаписи"); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + ТекущийОбъект.ДополнительныеСвойства.Вставить("Пароль", ПроверкаПароля); +КонецПроцедуры + &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемПодтверждениеПолучено", ЭтотОбъект); @@ -82,24 +112,43 @@ Запрос = СоздатьЗапросНаИспользованиеВнешнихРесурсов(); ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПолучениеРазрешенийЗавершение", ЭтотОбъект, ПараметрыЗаписи); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Запрос), ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Запрос), ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; + Возврат; КонецЕсли; + + Если ВидУчетнойЗаписи = "Общая" И ЗначениеЗаполнено(Объект.ВладелецУчетнойЗаписи) Тогда + Объект.ВладелецУчетнойЗаписи = Неопределено; + КонецЕсли; + + ТребуетсяПроверкаПароля = Объект.ВладелецУчетнойЗаписи <> ВладелецУчетнойЗаписи + Или ЗначениеЗаполнено(Объект.ВладелецУчетнойЗаписи); + Если Не ПараметрыЗаписи.Свойство("ПарольВведен") И ТребуетсяПроверкаПароля Тогда + Отказ = Истина; + ЗапроситьПароль(ПараметрыЗаписи); + Возврат; + КонецЕсли; + РазрешенияПолучены = Ложь; КонецПроцедуры &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) - Оповестить("Запись_УчетнаяЗаписьЭлектроннойПочты",,Объект.Ссылка); Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда Закрыть(); КонецЕсли; + ВладелецУчетнойЗаписи = Объект.ВладелецУчетнойЗаписи; КонецПроцедуры &НаКлиенте @@ -176,6 +225,22 @@ ПарольSMTPИзменен = Истина; КонецПроцедуры +&НаКлиенте +Процедура ТребуетсяВходНаСерверПередОтправкойПриИзменении(Элемент) + Элементы.ПолучениеПисем.Доступность = ДоступноПолучениеПисем Или Объект.ТребуетсяВходНаСерверПередОтправкой; +КонецПроцедуры + +&НаКлиенте +Процедура ДляКогоУчетнаяЗаписьПриИзменении(Элемент) + Элементы.ПользовательУчетнойЗаписи.Доступность = ВидУчетнойЗаписи = "Персональная"; + ОповеститьОбИзмененииВладельцаУчетнойЗаписи(); +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательУчетнойЗаписиПриИзменении(Элемент) + ОповеститьОбИзмененииВладельцаУчетнойЗаписи(); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -226,7 +291,7 @@ Процедура УстановитьДоступностьЭлементов() ИспользуетсяПротоколPOP = Объект.ПротоколВходящейПочты = "POP"; Элементы.POPПередSMTP.Видимость = ИспользуетсяПротоколPOP; - Элементы.ОставлятьПисьмаНаСервере.Видимость = ИспользуетсяПротоколPOP; + Элементы.ОставлятьПисьмаНаСервере.Видимость = ИспользуетсяПротоколPOP И ДоступноПолучениеПисем; Элементы.НастройкаПериодаХраненияПисем.Доступность = Объект.ОставлятьКопииСообщенийНаСервере; Элементы.ПериодХраненияСообщенийНаСервере.Доступность = УдалятьПисьмаССервера; @@ -245,7 +310,8 @@ &НаСервере Функция СоздатьЗапросНаИспользованиеВнешнихРесурсов() - Возврат РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( Разрешения(), Объект.Ссылка); КонецФункции @@ -255,9 +321,11 @@ Результат = Новый Массив; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Если Объект.ИспользоватьДляОтправки Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( "SMTP", Объект.СерверИсходящейПочты, Объект.ПортСервераИсходящейПочты, @@ -266,7 +334,7 @@ Если Объект.ИспользоватьДляПолучения Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( Объект.ПротоколВходящейПочты, Объект.СерверВходящейПочты, Объект.ПортСервераВходящейПочты, @@ -277,4 +345,26 @@ КонецФункции +&НаКлиенте +Процедура ЗапроситьПароль(ПараметрыЗаписи) + ПроверкаПароля = ""; + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаПароля", ЭтотОбъект, ПараметрыЗаписи); + ОткрытьФорму("Справочник.УчетныеЗаписиЭлектроннойПочты.Форма.ПроверкаДоступаКУчетнойЗаписи", , + ЭтотОбъект, , , , ОписаниеОповещения); +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВводаПароля(Пароль, ПараметрыЗаписи) Экспорт + Если ТипЗнч(Пароль) = Тип("Строка") Тогда + ПараметрыЗаписи.Вставить("ПарольВведен"); + ПроверкаПароля = Пароль; + Записать(ПараметрыЗаписи); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОповеститьОбИзмененииВладельцаУчетнойЗаписи() + Оповестить("ПриИзмененииВидаУчетнойЗаписиЭлектроннойПочты", ВидУчетнойЗаписи = "Персональная", ЭтотОбъект); +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl index f20a3c85b..e7666a3ef 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -19,6 +20,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли @@ -118,13 +123,15 @@ Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", УчетнаяЗапись); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + УчетныеЗаписи = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока УчетныеЗаписи.Следующий() Цикл Разрешения = Новый Массив; НастройкиУчетнойЗаписи = УчетныеЗаписи.Выбрать(); Пока НастройкиУчетнойЗаписи.Следующий() Цикл Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( НастройкиУчетнойЗаписи.Протокол, НастройкиУчетнойЗаписи.Сервер, НастройкиУчетнойЗаписи.Порт, @@ -310,9 +317,8 @@ КонецФункции Функция ОшибкаАутентификации(СообщениеСервера) - Возврат СтрНайти(НРег(СообщениеСервера), "authenticat") > 0 - Или СтрНайти(НРег(СообщениеСервера), "password") > 0 - Или СтрНайти(НРег(СообщениеСервера), "[auth]") > 0; + Возврат СтрНайти(НРег(СообщениеСервера), "auth") > 0 + Или СтрНайти(НРег(СообщениеСервера), "password") > 0; КонецФункции Функция ПодключениеВыполнено(СообщениеСервера) diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl index 8368217e6..8b6258c97 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl @@ -1,25 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс - -// Инициализирует новую учетную запись значениями по умолчанию. -// -Процедура ЗаполнитьОбъектЗначениямиПоУмолчанию() Экспорт - - ИмяПользователя = НСтр("ru = '1С:Предприятие'"); - ИспользоватьДляПолучения = Ложь; - ИспользоватьДляОтправки = Ложь; - ОставлятьКопииСообщенийНаСервере = Ложь; - ПериодХраненияСообщенийНаСервере = 0; - ВремяОжидания = 30; - ПортСервераВходящейПочты = 110; - ПортСервераИсходящейПочты = 25; - ПротоколВходящейПочты = "POP"; - -КонецПроцедуры - -#КонецОбласти - #Область ОбработчикиСобытий Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) @@ -67,6 +47,77 @@ УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Не ДополнительныеСвойства.Свойство("НеПроверятьИзменениеНастроек") И Не Ссылка.Пустая() Тогда + + СписокРеквизитов = "ИспользоватьДляОтправки,ИспользоватьДляПолучения,СерверВходящейПочты,СерверИсходящейПочты,ВладелецУчетнойЗаписи,ИспользоватьЗащищенноеСоединениеДляВходящейПочты,ИспользоватьЗащищенноеСоединениеДляИсходящейПочты,ИспользоватьБезопасныйВходНаСерверВходящейПочты,ИспользоватьБезопасныйВходНаСерверИсходящейПочты,Пользователь,ПользовательSMTP"; + ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, СписокРеквизитов); + + ТребуетсяПроверкаПароля = ЗначениеЗаполнено(ЗначенияРеквизитов.ВладелецУчетнойЗаписи); + Если ТребуетсяПроверкаПароля Тогда + ДоИзменения = Новый Структура(СписокРеквизитов); + ЗаполнитьЗначенияСвойств(ДоИзменения, ЗначенияРеквизитов); + ПослеИзменения = Новый Структура(СписокРеквизитов); + ЗаполнитьЗначенияСвойств(ПослеИзменения, ЭтотОбъект); + ТребуетсяПроверкаПароля = ОбщегоНазначения.ЗначениеВСтрокуXML(ДоИзменения) <> ОбщегоНазначения.ЗначениеВСтрокуXML(ПослеИзменения); + КонецЕсли; + + Если ТребуетсяПроверкаПароля Тогда + ТекстСообщенияОбОшибке = НСтр("ru = 'Не подтвержден пароль для изменения настроек учетной записи.'"); + ПроверкаПароля = Неопределено; + Если Не ДополнительныеСвойства.Свойство("Пароль", ПроверкаПароля) Или Не ПарольВведенВерно(ПроверкаПароля) Тогда + ВызватьИсключение ТекстСообщенияОбОшибке; + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ЗаполнитьОбъектЗначениямиПоУмолчанию() Экспорт + + ИмяПользователя = НСтр("ru = '1С:Предприятие'"); + ИспользоватьДляПолучения = Ложь; + ИспользоватьДляОтправки = Ложь; + ОставлятьКопииСообщенийНаСервере = Ложь; + ПериодХраненияСообщенийНаСервере = 0; + ВремяОжидания = 30; + ПортСервераВходящейПочты = 110; + ПортСервераИсходящейПочты = 25; + ПротоколВходящейПочты = "POP"; + +КонецПроцедуры + +Функция ПарольВведенВерно(ПроверкаПароля) + УстановитьПривилегированныйРежим(Истина); + Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Ссылка, "Пароль,ПарольSMTP"); + УстановитьПривилегированныйРежим(Ложь); + + ПроверяемыеПароли = Новый Массив; + Если ЗначениеЗаполнено(Пароли.Пароль) Тогда + ПроверяемыеПароли.Добавить(Пароли.Пароль); + КонецЕсли; + Если ЗначениеЗаполнено(Пароли.ПарольSMTP) Тогда + ПроверяемыеПароли.Добавить(Пароли.ПарольSMTP); + КонецЕсли; + + Для Каждого ПроверяемыйПароль Из ПроверяемыеПароли Цикл + Если ПроверкаПароля <> ПроверяемыйПароль Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; +КонецФункции + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo index 69501a655..139c88289 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo @@ -693,6 +693,45 @@ <fillValue xsi:type="core:StringValue"/> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="94bc76ae-72a0-418f-98c4-ae0a0326a2da"> + <name>ОтправлятьСкрытыеКопииПисемНаЭтотАдрес</name> + <synonym> + <key>ru</key> + <value>Отправлять скрытые копии писем на этот адрес</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Если включен, то в получатели скрытых копий всех исходящих писем будет добавляться этот почтовый адрес. +Рекомендуется включать при отсутствии штатных возможностей для хранения отправленных писем на почтовом сервере.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="784475ff-eec5-462a-a511-ba31f8374c2e"> + <name>ВладелецУчетнойЗаписи</name> + <synonym> + <key>ru</key> + <value>Владелец учетной записи</value> + </synonym> + <type> + <types>CatalogRef.Пользователи</types> + </type> + <toolTip> + <key>ru</key> + <value>Владелец персональной учетной записи электронной почты</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <forms uuid="ecaa0af8-549c-4c07-82ff-1c4e02ff15b8"> <name>ФормаВыбора</name> <synonym> @@ -734,6 +773,15 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="27e0b5d9-1a4c-45b8-8969-d1d1c39129c1"> + <name>ПроверкаДоступаКУчетнойЗаписи</name> + <synonym> + <key>ru</key> + <value>Проверка доступа к учетной записи</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <commands uuid="56b570b1-93b0-468a-9672-9c71113753f3"> <name>ПроверитьУчетнуюЗапись</name> <synonym> diff --git a/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl deleted file mode 100644 index 700e1a372..000000000 --- a/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl +++ /dev/null @@ -1,8 +0,0 @@ -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("Справочник.Файлы.ФормаСписка", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); -КонецПроцедуры - -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form deleted file mode 100644 index 221824397..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form +++ /dev/null @@ -1,436 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> - <title> - <key>ru</key> - <value>Внимание</value> - - - ГруппаТекст - 2 - - Декорация1 - 3 - true - true - - true - - - Декорация1ExtendedTooltip - 14 - Label - true - true - - Left - - - - Декорация1КонтекстноеМеню - 4 - true - - true - true - - - CommonPicture.Информация32 - - - - - ТекстВопроса - 6 - true - true - - true - - - ТекстВопроса - - None - - ТекстВопросаExtendedTooltip - 15 - Label - true - true - - Left - - - - ТекстВопросаКонтекстноеМеню - 7 - true - - LabelField - Enter - true - Left - true - - 2 - true - - - true - true - - true - - - <key>ru</key> - <value>Группа текст</value> - - - ru - Группа текст - - - ГруппаТекстExtendedTooltip - 13 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаКнопок - 1 - - СохранитьИЗакончитьРедактирование - 8 - true - true - - true - - false - - СохранитьИЗакончитьРедактированиеExtendedTooltip - 17 - Label - true - true - - Left - - - UsualButton - Form.Command.СохранитьИЗакончитьРедактирование - Normal - Auto - 40 - true - 1 - true - UserCmds - Auto - - - СохранитьИзменения - 9 - true - true - - true - - false - - СохранитьИзмененияExtendedTooltip - 18 - Label - true - true - - Left - - - UsualButton - Form.Command.СохранитьИзменения - Normal - Auto - 40 - true - 1 - true - UserCmds - Auto - - - НеСохранять - 5 - true - true - - true - - false - - НеСохранятьExtendedTooltip - 19 - Label - true - true - - Left - - - UsualButton - Form.Command.НеСохранять - Normal - Auto - 40 - true - 1 - true - UserCmds - Auto - - - ГруппаВернуться - 22 - - Вернуться - 10 - true - true - - true - - false - - ВернутьсяExtendedTooltip - 21 - Label - true - true - - Left - - - UsualButton - Form.Command.Вернуться - Normal - Auto - 40 - true - 1 - true - Bottom - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа вернуться</value> - - - ru - Группа вернуться - - 2 - - ГруппаВернутьсяРасширеннаяПодсказка - 23 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа кнопок</value> - - - ru - Группа кнопок - - - ГруппаКнопокExtendedTooltip - 16 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - None - false - - ФормаКоманднаяПанель - -1 - Left - true - - - OnCreateAtServer - ПриСозданииНаСервере - - LockOwner - true - true - Vertical - true - true - true - auto - true - - ТекстВопроса - - <key>ru</key> - <value>Текст вопроса</value> - - 1 - - String - - - - true - - - true - - - - СохранитьИЗакончитьРедактирование - - <key>ru</key> - <value>Сохранить и закончить редактирование</value> - - 1 - - ru - Сохранить и закончить редактирование - - - true - - - - СохранитьИЗакончитьРедактирование - - - DontUse - Auto - - - СохранитьИзменения - - <key>ru</key> - <value>Сохранить, оставить занятым</value> - - 2 - - ru - Сохранить изменения - - - true - - - - СохранитьИзменения - - - DontUse - Auto - - - НеСохранять - - <key>ru</key> - <value>Не сохранять</value> - - 3 - - ru - Не сохранять - - - true - - - - НеСохранять - - - DontUse - Auto - - - Вернуться - - <key>ru</key> - <value>Отменить</value> - - 4 - - ru - Вернуться в редактор - - - true - - - - Вернуться - - - DontUse - Auto - - - - - - diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Module.bsl deleted file mode 100644 index 56d458fac..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Module.bsl +++ /dev/null @@ -1,38 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Если Параметры.Свойство("АвтоТест") Тогда - Возврат; - КонецЕсли; - - Параметры.Свойство("ТекстВопроса", ТекстВопроса); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Вернуться(Команда) - ОповеститьОВыборе("Вернуться"); -КонецПроцедуры - -&НаКлиенте -Процедура НеСохранять(Команда) - ОповеститьОВыборе("НеСохранять"); -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИЗакончитьРедактирование(Команда) - ОповеститьОВыборе("СохранитьИЗакончитьРедактирование"); -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - ОповеститьОВыборе("СохранитьИзменения"); -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl deleted file mode 100644 index 46689dbc8..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl +++ /dev/null @@ -1,36 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - БольшеНеПоказывать = Ложь; - - ТекстНапоминания = - НСтр("ru = 'Версия не была создана, т.к. файл не изменен. Комментарий не сохранен.'"); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ОК(Команда) - - Если БольшеНеПоказывать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиПрограммы", - "ПоказыватьИнформациюЧтоФайлНеБылИзменен", - Ложь); - КонецЕсли; - - Закрыть(БольшеНеПоказывать); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form b/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form index be43c87a4..e2aa38131 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form @@ -46,6 +46,10 @@ ФормаСоздатьИзФайла 87 + + <key>ru</key> + <value>Файл с диска...</value> + true true @@ -62,7 +66,7 @@ Left - Form.Command.СоздатьФайл + Form.Command.ДобавитьФайл Normal Auto true @@ -88,7 +92,7 @@ Left - Form.Command.СоздатьФайлИзШаблона + Form.Command.ДобавитьФайлПоШаблону Normal Auto true @@ -114,7 +118,7 @@ Left - Form.Command.СоздатьФайлСоСканера + Form.Command.ДобавитьФайлСоСканера Normal Auto true @@ -129,12 +133,8 @@ <key>ru</key> - <value>Создать</value> + <value>Добавить</value> - - ru - Создать файл - ФормаПодменюСоздатьРасширеннаяПодсказка 229 @@ -279,7 +279,9 @@ 77 true true - + + true + false ФормаЗанятьРасширеннаяПодсказка @@ -493,12 +495,8 @@ <key>ru</key> - <value>Форма глобальные команды</value> + <value>Глобальные команды</value> - - ru - Форма глобальные команды - None ФормаГлобальныеКомандыРасширеннаяПодсказка @@ -564,7 +562,7 @@ Left - Form.Command.ДобавитьПодписьИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true @@ -706,7 +704,7 @@ ru - Электронная подпись и шифрование + Команды электронной подписи и шифрования ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка @@ -1063,12 +1061,8 @@ <key>ru</key> - <value>Форма группа команд поиска</value> + <value>Команды поиска</value> - - ru - Форма группа команд поиска - None ФормаГруппаКомандПоискаРасширеннаяПодсказка @@ -1258,12 +1252,8 @@ <key>ru</key> - <value>Форма группа настройка списка</value> + <value>Настройка списка</value> - - ru - Форма группа настройка списка - ФормаГруппаНастройкаСпискаРасширеннаяПодсказка 330 @@ -1339,7 +1329,7 @@ ru - Форма группа дополнительно + Дополнительные команды None @@ -1394,12 +1384,8 @@ <key>ru</key> - <value>Группа команд формы</value> + <value>Команды формы</value> - - ru - Группа команд формы - ГруппаКомандФормыРасширеннаяПодсказка 382 @@ -1439,7 +1425,7 @@ - Группа3 + ГруппаПапкиИФайлыОбщая 406 ГруппаПапкиИФайлы @@ -1447,6 +1433,10 @@ Папки 24 + + <key>ru</key> + <value>Папки</value> + true true @@ -1901,12 +1891,8 @@ <key>ru</key> - <value>Папки контекстное меню стандартные</value> + <value>Стандартные команды</value> - - ru - Папки контекстное меню стандартные - ПапкиКонтекстноеМенюСтандартныеExtendedTooltip 177 @@ -2184,7 +2170,7 @@ <key>ru</key> - <value>Группа пояснение облачного сервиса</value> + <value>Пояснение облачного сервиса</value> ГруппаПояснениеОблачногоСервисаРасширеннаяПодсказка @@ -2208,6 +2194,10 @@ Список 6 + + <key>ru</key> + <value>Файлы</value> + true true @@ -2226,6 +2216,10 @@ СписокНомерКартинкиПодписанЗашифрован 117 + + <key>ru</key> + <value>Номер картинки подписан зашифрован</value> + true true @@ -2282,6 +2276,10 @@ СписокИндексКартинки 7 + + <key>ru</key> + <value>Индекс картинки</value> + true true @@ -2440,10 +2438,6 @@ ru Список группа имя картинка описание - - ru - Список группа имя картинка описание - None СписокГруппаИмяКартинкаОписаниеРасширеннаяПодсказка @@ -2466,51 +2460,7 @@ СписокВажныеРеквизиты 277 - СписокАвтор - 279 - true - true - - true - - - Список.Автор - - - СписокАвторРасширеннаяПодсказка - 281 - Label - true - true - - Left - - - - СписокАвторКонтекстноеМеню - 280 - true - - InputField - true - Enter - true - Left - true - - 15 - true - true - false - true - true - true - true - Normal - - - - СписокТекущаяВерсияДатаМодификацииФайла + СписокДатаИзменения 143 <key>ru</key> @@ -2522,10 +2472,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ТекущаяВерсияДатаМодификацииФайла</segments> + <segments>Список.ДатаИзменения</segments> </dataPath> <extendedTooltip> - <name>СписокТекущаяВерсияДатаМодификацииФайлаРасширеннаяПодсказка</name> + <name>СписокДатаИзмененияРасширеннаяПодсказка</name> <id>224</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -2535,7 +2485,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокТекущаяВерсияДатаМодификацииФайлаКонтекстноеМеню</name> + <name>СписокДатаИзмененияКонтекстноеМеню</name> <id>144</id> <autoFill>true</autoFill> </contextMenu> @@ -2552,6 +2502,46 @@ <horizontalStretch>false</horizontalStretch> </extInfo> </items> + <items xsi:type="form:FormField"> + <name>СписокОтредактировал</name> + <id>411</id> + <title> + <key>ru</key> + <value>Изменил</value> + + true + true + + true + + + Список.Отредактировал + + + СписокОтредактировалРасширеннаяПодсказка + 413 + Label + true + true + + Left + + + + СписокОтредактировалКонтекстноеМеню + 412 + true + + LabelField + Enter + true + Left + true + + true + true + + true true @@ -2561,10 +2551,6 @@ ru Список важные реквизиты - - ru - Список важные реквизиты - None СписокВажныеРеквизитыРасширеннаяПодсказка @@ -2633,6 +2619,50 @@ + + СписокАвтор + 279 + true + true + + true + + + Список.Автор + + + СписокАвторРасширеннаяПодсказка + 281 + Label + true + true + + Left + + + + СписокАвторКонтекстноеМеню + 280 + true + + InputField + true + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + СписокДатаСоздания 282 @@ -2849,6 +2879,10 @@ BeforeRowChange СписокПередНачаломИзменения + + OnChange + СписокПриИзменении + СписокСтрокаПоиска 368 @@ -2936,6 +2970,10 @@ СписокКонтекстноеМенюСоздать 96 + + <key>ru</key> + <value>Добавить</value> + true true @@ -3052,7 +3090,9 @@ 68 true true - + + true + false СписокКонтекстноеМенюЗанятьРасширеннаяПодсказка @@ -3210,12 +3250,8 @@ <key>ru</key> - <value>Список контекстное меню группа команд основные</value> + <value>Основные команды</value> - - ru - Список контекстное меню группа команд основные - СписокКонтекстноеМенюГруппаКомандОсновныеРасширеннаяПодсказка 307 @@ -3278,7 +3314,7 @@ Left - Form.Command.ДобавитьПодписьИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true @@ -3422,10 +3458,6 @@ ru Электронная подпись и шифрование - - ru - Электронная подпись и шифрование - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка 200 @@ -3751,108 +3783,6 @@ ГруппаПользовательскихНастроек - - ГруппаПоиск - 53 - - Поиск - 51 - - <key>ru</key> - <value>Быстрый поиск файлов и папок</value> - - true - true - - true - - - СтрокаПоиска - - - OnChange - ПоискПриИзменении - - - ПоискExtendedTooltip - 226 - Label - true - true - - Left - - - - ПоискКонтекстноеМеню - 52 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - Normal - - - - Найти - 54 - true - true - - true - - false - - НайтиExtendedTooltip - 227 - Label - true - true - - Left - - - UsualButton - Form.Command.Найти - Normal - Auto - true - true - UserCmds - Auto - - true - true - - - ГруппаПоискExtendedTooltip - 225 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - true true @@ -3860,12 +3790,8 @@ <key>ru</key> - <value>Группа файлы и поиск</value> + <value>Файлы</value> - - ru - Группа файлы и поиск - ГруппаФайлыИПоискРасширеннаяПодсказка 397 @@ -3940,7 +3866,7 @@ <key>ru</key> - <value>Группа папки и файлы</value> + <value>Папки и файлы</value> 8 @@ -3967,8 +3893,12 @@ true + + <key>ru</key> + <value>Папки и файлы</value> + - Группа3РасширеннаяПодсказка + ГруппаПапкиИФайлыОбщаяРасширеннаяПодсказка 407 Label true @@ -4022,7 +3952,6 @@ DontBlock Use true - true Vertical true true @@ -4050,6 +3979,9 @@ Список.ВладелецФайла + + Список.ДатаИзменения + Список.Зашифрован @@ -4066,7 +3998,10 @@ Список.Редактирует - Список.РедактируетТекущийПользователь + Список.ФайлРедактируетТекущийПользователь + + + Список.ФайлРедактируется Список.ХранитьВерсии @@ -4074,14 +4009,12 @@
          true
          ВЫБРАТЬ - Файлы.Код, Файлы.Редактирует, Файлы.ДатаСоздания, - Файлы.ТекущаяВерсияНомерВерсии, - ВЫРАЗИТЬ(Файлы.ТекущаяВерсияРазмер / 1024 КАК ЧИСЛО(10, 0)) КАК ТекущаяВерсияРазмер, + Файлы.УдалитьТекущаяВерсияНомерВерсии, + ВЫРАЗИТЬ(Файлы.Размер / 1024 КАК ЧИСЛО(10, 0)) КАК ТекущаяВерсияРазмер, Файлы.Автор, - Файлы.ТекущаяВерсияДатаСоздания, - Файлы.ТекущаяВерсияРасширение КАК Расширение, + Файлы.Расширение КАК Расширение, ВЫБОР КОГДА Файлы.ПометкаУдаления = ИСТИНА ТОГДА Файлы.ИндексКартинки + 1 @@ -4090,17 +4023,22 @@ Файлы.Наименование, ПОДСТРОКА(Файлы.Описание, 0, 140) КАК Описание, Файлы.Ссылка, - Файлы.ТекущаяВерсияАвтор, Файлы.ПометкаУдаления, Файлы.ХранитьВерсии, Файлы.ВладелецФайла, + Файлы.Изменил КАК Отредактировал, ВЫБОР КОГДА Файлы.Редактирует = &ТекущийПользователь ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ - КОНЕЦ КАК РедактируетТекущийПользователь, - Файлы.ПодписанЭП, - Файлы.Зашифрован, + КОНЕЦ КАК ФайлРедактируетТекущийПользователь, + ВЫБОР + КОГДА НЕ Файлы.Редактирует В (&ПустыеПользователи) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК ФайлРедактируется, + Файлы.ПодписанЭП КАК ПодписанЭП, + Файлы.Зашифрован КАК Зашифрован, ВЫБОР КОГДА Файлы.ПодписанЭП И Файлы.Зашифрован @@ -4111,12 +4049,12 @@ ТОГДА 0 ИНАЧЕ -1 КОНЕЦ КАК НомерКартинкиПодписанЗашифрован, - Файлы.ТекущаяВерсияДатаМодификацииФайла, - КодировкиВерсийФайлов.Кодировка + ДОБАВИТЬКДАТЕ(Файлы.ДатаМодификацииУниверсальная, СЕКУНДА, &СекундДоМестногоВремени) КАК ДатаИзменения, + КодировкиФайлов.Кодировка ИЗ Справочник.Файлы КАК Файлы - ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодировкиВерсийФайлов КАК КодировкиВерсийФайлов - ПО Файлы.ТекущаяВерсия = КодировкиВерсийФайлов.ВерсияФайла + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодировкиФайлов КАК КодировкиФайлов + ПО Файлы.ТекущаяВерсия = КодировкиФайлов.Файл ГДЕ (Файлы.ВладелецФайла = &Владелец ИЛИ НЕ &ИспользоватьИерархию @@ -4500,26 +4438,6 @@ true - - ЗапрещенныеРасширения - - <key>ru</key> - <value>Запрещенные расширения</value> - - 20 - - ValueList - - - true - - - true - - - - - ИмпортФайлов @@ -4568,30 +4486,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>Найти</name> - <title> - <key>ru</key> - <value>Найти</value> - - 2 - - ru - Найти файлы или папки по названию или коду - - - true - - - - НайтиВыполнить - - - Picture - DontUse - Auto - - - СоздатьФайл + ДобавитьФайл <key>ru</key> <value>Из файла на диске ...</value> @@ -4606,7 +4501,7 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СоздатьФайлВыполнить</name> + <name>ДобавитьФайл</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> @@ -5008,7 +4903,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ДобавитьПодписьИзФайла</name> + <name>ДобавитьЭПИзФайла</name> <title> <key>ru</key> <value>Добавить электронную подпись из файла...</value> @@ -5078,7 +4973,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>СоздатьФайлИзШаблона</name> + <name>ДобавитьФайлПоШаблону</name> <title> <key>ru</key> <value>По шаблону...</value> @@ -5086,21 +4981,21 @@ <id>24</id> <toolTip> <key>ru</key> - <value>Создать файл из шаблона</value> + <value>Добавить файл по шаблону</value> </toolTip> <use> <common>true</common> </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СоздатьФайлИзШаблонаВыполнить</name> + <name>ДобавитьФайлПоШаблону</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>СоздатьФайлСоСканера</name> + <name>ДобавитьФайлСоСканера</name> <title> <key>ru</key> <value>Со сканера...</value> @@ -5108,14 +5003,14 @@ <id>25</id> <toolTip> <key>ru</key> - <value>Создать файл со сканера</value> + <value>Добавить файл со сканера</value> </toolTip> <use> <common>true</common> </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СоздатьФайлСоСканераВыполнить</name> + <name>ДобавитьФайлСоСканера</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html index 45685c915..dd5a7950b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html @@ -5,7 +5,7 @@ <p>Левая часть списка содержит иерархическую структуру <a href="Catalog.ПапкиФайлов/Help">папок</a>. В списке имеются предопределенные папки, которые нельзя удалить, например, папка <strong>Шаблоны файлов</strong>. </p> <p>В правой части располагается список файлов в выбранной папке. С помощью соответствующих <a href="Catalog.Файлы/Help">команд</a> в список можно добавлять новые файлы и папки, копировать, изменять или удалять их.</p> <p>Для работы с реквизитами файла (автор, наименование, описание и т.д.) используется <a href="Catalog.Файлы.Form.ФормаЭлемента/Help">карточка</a> (<strong>Еще -</strong> <strong>Открыть карточку</strong>), а для работы с самим файлом (<strong>Просмотреть</strong> или <strong>Редактировать</strong> файл) - соответствующее приложение, установленное на компьютере. </p> -<p>При редактировании файла его предыдущая <a href="Catalog.ВерсииФайлов.Form.ФормаЭлемента/Help">версия</a> автоматически сохраняется в информационной базе (эта настройка установлена по умолчанию, отменять не рекомендуется, т.к. если файл был испорчен во время редактирования, в этом случае имеется возможность вернуться к одной из его предыдущих <a href="Catalog.ВерсииФайлов/Help">версий</a>). </p> +<p>При редактировании файла его предыдущая <a href="DataProcessor.РаботаСФайлами.Form.ВерсияПрисоединенногоФайла/Help">версия</a> автоматически сохраняется в информационной базе (эта настройка установлена по умолчанию, отменять не рекомендуется, т.к. если файл был испорчен во время редактирования, в этом случае имеется возможность вернуться к одной из его предыдущих <a href="Catalog.ВерсииФайлов/Help">версий</a>). </p> <p>Зеленым цветом отображаются файлы, занятые Вами для редактирования, а серым цветом - файлы, занятые другими пользователями программы.</p> <p>В списке выводится:</p> <ul><li><img src="CommonPicture.ПодписанЗашифрованЗаголовок"></img> - наличие электронной подписи или шифрования. @@ -54,19 +54,19 @@ </li><li>Для настройки прав доступа воспользуйтесь соответствующей командой панели навигации папки.</li></ul></li></ul><h3>Загрузка файлов </h3> <ul><li>С помощью команды меню <strong>Еще</strong> или контекстного меню по правой кнопке мыши <strong>Загрузить файлы</strong> можно разместить в одной из папок списка файлы с жесткого или сетевого диска. </li><li>В открывшемся <strong>Проводнике Windows</strong> укажите путь к файлу, нажмите <strong>Открыть</strong>. -</li><li>Заполните необходимые для загрузки <a href="Catalog.Файлы.Form.ФормаИмпортаФайлов/Help">сведения</a>.</li></ul><h3>Загрузка папок</h3> +</li><li>Заполните необходимые для загрузки <a href="DataProcessor.РаботаСФайлами.Form.ФормаИмпортаФайлов/Help">сведения</a>.</li></ul><h3>Загрузка папок</h3> <ul><li> <div>Для того чтобы поместить папку с жесткого или сетевого диска в одну из папок списка <strong>Файлы</strong>, выберите папку, выполните команду меню <strong>Еще</strong> или контекстного меню по правой кнопке мыши <strong>Загрузить папку</strong>.</div> </li><li> <div>В открывшемся <strong>Проводнике Windows</strong> укажите путь к папке, нажмите<strong> Выбор папки</strong>. </div> </li><li> -<div>Заполните необходимые для загрузки <a href="Catalog.Файлы.Form.ФормаИмпортаПапки/Help">сведения</a>.</div></li></ul><h3>Загрузка файлов и папок с помощью перетаскивания мышью</h3> +<div>Заполните необходимые для загрузки <a href="DataProcessor.РаботаСФайлами.Form.ФормаИмпортаПапки/Help">сведения</a>.</div></li></ul><h3>Загрузка файлов и папок с помощью перетаскивания мышью</h3> <ul><li> <div>Если нужно загрузить один или несколько файлов (папок), можно использовать перетаскивание мышью - просто перетащите файл (папку) или несколько выбранных файлов (папок) мышкой из <strong>Проводника Windows</strong> в нужную папку списка файлов программы.</div> </li><li> <div>Один файл сразу записывается в список файлов, автоматически создается карточка файла.</div> </li><li> <div>При перетаскивании нескольких файлов, папки или нескольких папок заполните необходимые <a href="Catalog.Файлы.Form.ФормаПеретаскивания/Help">сведения</a>.</div></li></ul><h3>Выгрузка папок</h3> -<ul><li>Команда <strong>Сохранить папку</strong> (расположена в контекстном меню папки) позволяет <a href="Catalog.Файлы.Form.ФормаЭкспортаПапки/Help">скопировать выбранную папку</a> с файлами на жесткий диск. При этом копируются только активные версии файлов. </li></ul><h3>Управление просмотром списка файлов</h3> +<ul><li>Команда <strong>Сохранить папку</strong> (расположена в контекстном меню папки) позволяет <a href="DataProcessor.РаботаСФайлами.Form.ФормаЭкспортаПапки/Help">скопировать выбранную папку</a> с файлами на жесткий диск. При этом копируются только активные версии файлов. </li></ul><h3>Управление просмотром списка файлов</h3> <ul><li>С помощью команды <strong>Еще - Дополнительно -</strong> <strong>Использовать иерархию</strong> можно изменить вид списка и увидеть все файлы, находящиеся в разных папках, в одном списке.</li></ul><h3>См. также: </h3> <ul><li><a href="v8help://frame/form_common">Работа  с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl index 2cc164abf..7c68c1f42 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl @@ -28,7 +28,7 @@ Если Параметры.Свойство("ПараметрыОтправки") Тогда ПараметрыОтправки = Параметры.ПараметрыОтправки; Иначе - ПараметрыОтправки = ФайловыеФункцииСлужебный.ПодготовитьСтруктуруПараметровОтправки(); + ПараметрыОтправки = РаботаСФайламиСлужебный.ПодготовитьСтруктуруПараметровОтправки(); КонецЕсли; Элементы.Папки.ТекущаяСтрока = ПапкаПриОткрытии; @@ -37,6 +37,14 @@ "Владелец", ПапкаПриОткрытии); Список.Параметры.УстановитьЗначениеПараметра( "ТекущийПользователь", Пользователи.ТекущийПользователь()); + + ПустыеПользователи = Новый Массив; + ПустыеПользователи.Добавить(Неопределено); + ПустыеПользователи.Добавить(Справочники.Пользователи.ПустаяСсылка()); + ПустыеПользователи.Добавить(Справочники.ВнешниеПользователи.ПустаяСсылка()); + ПустыеПользователи.Добавить(Справочники.УчетныеЗаписиСинхронизацииФайлов.ПустаяСсылка()); + Список.Параметры.УстановитьЗначениеПараметра( + "ПустыеПользователи", ПустыеПользователи); ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); Если ПоказыватьКолонкуРазмер = Ложь Тогда @@ -50,7 +58,7 @@ ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПравПапки(Элементы.Папки.ТекущаяСтрока)); - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.ФормаИзменить.Видимость = Ложь; Элементы.ФормаИзменить82.Видимость = Истина; КонецЕсли; @@ -65,7 +73,7 @@ Элементы.Предпросмотр.Пометка = ИспользоватьПредпросмотр; КонецЕсли; - РасширенияПоддерживающиеПредпросмотр = ФайловыеФункцииСлужебный.СписокРасширенийДляПредпросмотра(); + РасширенияПоддерживающиеПредпросмотр = РаботаСФайламиСлужебный.СписокРасширенийДляПредпросмотра(); Элементы.ГруппаПояснениеОблачногоСервиса.Видимость = Ложь; ИспользоватьСинхронизациюФайлов = ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов"); @@ -80,22 +88,24 @@ КонецЕсли; - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); + ДатаУниверсальная = ТекущаяДатаСеанса(); + Список.Параметры.УстановитьЗначениеПараметра("СекундДоМестногоВремени", + МестноеВремя(ДатаУниверсальная, ЧасовойПоясСеанса()) - ДатаУниверсальная); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - УстановитьДоступностьФайловыхКоманд(); - - Элементы.ФормаСоздатьСоСканера.Видимость = ФайловыеФункцииСлужебныйКлиент.ДоступнаКомандаСканировать(); + Элементы.ФормаСоздатьСоСканера.Видимость = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); #Если ВебКлиент Тогда Элементы.Печать.Видимость = Ложь; Элементы.СписокКонтекстноеМенюПечать.Видимость = Ложь; #КонецЕсли + УстановитьДоступностьФайловыхКоманд(); + КонецПроцедуры &НаКлиенте @@ -138,35 +148,25 @@ КонецЕсли; КонецЕсли; - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда - - Если Параметр <> Неопределено Тогда - ВладелецФайла = Неопределено; - Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда - Если ВладелецФайла = Элементы.Папки.ТекущаяСтрока Тогда - Элементы.Список.Обновить(); - - ФайлСозданный = Неопределено; - Если Параметр.Свойство("Файл", ФайлСозданный) Тогда - Элементы.Список.ТекущаяСтрока = ФайлСозданный; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ДанныеФайлаИзменены" Тогда - УстановитьДоступностьФайловыхКоманд(); - КонецЕсли; - Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - + И (ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") + Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда + ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); КонецЕсли; + Если ИмяСобытия <> "Запись_Файл" Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("Файл") Тогда + Элементы.Список.ТекущаяСтрока = Параметр.Файл; + КонецЕсли; + + Элементы.Список.Обновить(); + + УстановитьДоступностьФайловыхКоманд(); + КонецПроцедуры &НаКлиенте @@ -200,17 +200,16 @@ #КонецОбласти -#Область ОбработчикиСобытийЭлементовШапкиФормы +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок &НаКлиенте -Процедура ПоискПриИзменении(Элемент) - НайтиФайлыИлиПапки(); +Процедура СписокПриИзменении(Элемент) + Если Элемент.ВыделенныеСтроки.Количество() > 0 Тогда + Оповестить("Запись_Файл", + Новый Структура("Событие", "ДанныеФайлаИзменены"), Элемент.ВыделенныеСтроки); + КонецЕсли; КонецПроцедуры -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок - &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда @@ -219,37 +218,22 @@ СтандартнаяОбработка = Ложь; - КакОткрывать = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + КакОткрывать = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; Если КакОткрывать = "ОткрыватьКарточку" Тогда ПоказатьЗначение(, ВыбраннаяСтрока); Возврат; КонецЕсли; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - Если ИмяКаталога = Неопределено Или ПустаяСтрока(ИмяКаталога) Тогда - Возврат; - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ВыбраннаяСтрока", ВыбраннаяСтрока); - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); + Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаРедактирования", ЭтотОбъект, ПараметрыОбработчика); - ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Истина); + РаботаСФайламиСлужебныйКлиент.ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Истина); + КонецПроцедуры &НаКлиенте @@ -273,7 +257,7 @@ Если Копирование Тогда РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); Иначе - РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект, , Истина); + РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект, 2, Истина); КонецЕсли; КонецПроцедуры @@ -292,7 +276,10 @@ &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) - УстановитьДоступностьФайловыхКоманд(); + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Элементы.Список.ТекущиеДанные.Ссылка); + КонецЕсли; + ПодключитьОбработчикОжидания("ОбработкаОжиданияУстановитьДоступностьФайловыхКоманд", 0.1, Истина); КонецПроцедуры @@ -303,9 +290,10 @@ &НаКлиенте Процедура ПапкиПриАктивизацииСтроки(Элемент) - УстановитьДоступностьКомандПриИзмененииПапки(); + ПодключитьОбработчикОжидания("УстановитьДоступностьКомандПриИзмененииПапки", 0.1, Истина); + Если ИспользоватьСинхронизациюФайлов Тогда - УстановитьВидимостьПоясненияСинхронизацииФайлов(); + ПодключитьОбработчикОжидания("УстановитьВидимостьПоясненияСинхронизацииФайлов", 0.1, Истина); КонецЕсли; КонецПроцедуры @@ -334,62 +322,16 @@ Процедура ИмпортФайловВыполнить() Обработчик = Новый ОписаниеОповещения("ИмпортФайловПослеУстановкиРасширения", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); - -КонецПроцедуры - -&НаКлиенте -Процедура ИмпортФайловПослеУстановкиРасширения(Результат, ПараметрыВыполнения) Экспорт - Если НЕ Результат Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); - Возврат; - КонецЕсли; - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.МножественныйВыбор = Истина; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); - Если Не ДиалогОткрытияФайла.Выбрать() Тогда - Возврат; - КонецЕсли; - - МассивИменФайлов = Новый Массив; - Для Каждого ИмяФайла Из ДиалогОткрытияФайла.ВыбранныеФайлы Цикл - МассивИменФайлов.Добавить(ИмяФайла); - КонецЦикла; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); - ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыФормы); КонецПроцедуры &НаКлиенте Процедура ИмпортПапки(Команда) - #Если ВебКлиент Тогда - ТекстПредупреждения = НСтр("ru = 'В веб-клиенте импорт папок недоступен. - |Используйте команду ""Создать"" в списке файлов.'"); - ПоказатьПредупреждение(, ТекстПредупреждения); - Возврат; - #КонецЕсли - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); - Если Не ДиалогОткрытияФайла.Выбрать() Тогда - Возврат; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ИмпортПапкиПослеУстановкиРасширения", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); - ПараметрыФормы.Вставить("КаталогНаДиске", ДиалогОткрытияФайла.Каталог); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаПапки", ПараметрыФормы); КонецПроцедуры &НаКлиенте @@ -397,179 +339,40 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПапкаЭкспорта", Элементы.Папки.ТекущаяСтрока); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаЭкспортаПапки", ПараметрыФормы); + + Обработчик = Новый ОписаниеОповещения("ЭкспортПапкиПослеУстановкиРасширения", ЭтотОбъект, ПараметрыФормы); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры &НаКлиенте -Процедура НайтиВыполнить() +Процедура ДобавитьФайл(Команда) - Если СтрокаПоиска = "" Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Не указан текст для поиска.'"), , "СтрокаПоиска"); - Возврат; - КонецЕсли; + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыВыполнения.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); + ПараметрыВыполнения.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); + ПараметрыВыполнения.Вставить("ЭтоФайл", Истина); - НайтиФайлыИлиПапки(); + РаботаСФайламиСлужебныйКлиент.ДобавитьПослеВыбораРежимаСоздания(2, ПараметрыВыполнения); КонецПроцедуры &НаКлиенте -Процедура НайтиФайлыИлиПапки() - - Если СтрокаПоиска = "" Тогда - Возврат; - КонецЕсли; - - Результат = НайтиФайлыИлиПапкиСервер(); - - Если Результат = "НичегоНеНайдено" Тогда - ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось найти файл или папку, - |наименование или код которых содержит ""%1"".'"), - СтрокаПоиска); - ПоказатьПредупреждение(, ТекстПредупреждения); - Иначе - Если Результат = "НайденФайл" Тогда - ТекущийЭлемент = Элементы.Список; - Иначе - Если Результат = "НайденаПапка" Тогда - ТекущийЭлемент = Элементы.Папки; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); -КонецПроцедуры - -&НаСервере -Функция СтрЗаменитьСпецСимволом(Строка, Символ, СпецСимвол) - СтрокаНовая = СтрЗаменить(Строка, Символ, СпецСимвол + Символ); - Возврат СтрокаНовая; -КонецФункции - -&НаСервере -Функция НайтиФайлыИлиПапкиСервер() - - Перем НайденныйФайл; - Перем НайденнаяПапка; - - Найдено = Ложь; - - Запрос = Новый Запрос; - - СтрокаПоискаНовая = СтрокаПоиска; - - СпецСимвол = "|"; - СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "[", СпецСимвол); - СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "]", СпецСимвол); - - Запрос.Параметры.Вставить("Строка", "%" + СтрокаПоискаНовая + "%"); - - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | Файлы.Ссылка - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.ПолноеНаименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""|"""; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденныйФайл = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | Файлы.Ссылка - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Код ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденныйФайл = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ПапкиФайлов.Ссылка - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Наименование ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденнаяПапка = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ПапкиФайлов.Ссылка - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Код ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденнаяПапка = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если НайденныйФайл <> Неопределено Тогда - Элементы.Папки.ТекущаяСтрока = НайденныйФайл.ВладелецФайла; - Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); - Элементы.Список.ТекущаяСтрока = НайденныйФайл.Ссылка; - Возврат "НайденФайл"; - КонецЕсли; - - Если НайденнаяПапка <> Неопределено Тогда - Элементы.Папки.ТекущаяСтрока = НайденнаяПапка; - Возврат "НайденаПапка"; - КонецЕсли; - - Возврат "НичегоНеНайдено"; -КонецФункции - -&НаКлиенте -Процедура СоздатьФайлВыполнить(Команда) +Процедура ДобавитьФайлПоШаблону(Команда) ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); - Иначе - РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыБезРасширения(ПараметрыДобавления); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьФайлИзШаблонаВыполнить(Команда) - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления); КонецПроцедуры &НаКлиенте -Процедура СоздатьФайлСоСканераВыполнить(Команда) +Процедура ДобавитьФайлСоСканера(Команда) ПараметрыДобавления = Новый Структура; ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); @@ -577,7 +380,7 @@ ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); ПараметрыДобавления.Вставить("ЭтоФайл", Истина); - ФайловыеФункцииСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); + РаботаСФайламиСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); КонецПроцедуры @@ -614,18 +417,9 @@ Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, + Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, Ложь); КонецПроцедуры @@ -636,72 +430,79 @@ Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("РедактироватьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); КонецПроцедуры &НаКлиенте -Функция ФайловыеКомандыДоступны(ФайлСсылка = Неопределено) - // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка. +Функция ФайловыеКомандыДоступны() - Если ФайлСсылка = Неопределено Тогда - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - КонецЕсли; - - Если ФайлСсылка = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат Ложь; - КонецЕсли; - - Возврат Истина; + Возврат РаботаСФайламиСлужебныйКлиент.ФайловыеКомандыДоступны(Элементы); КонецФункции &НаКлиенте Процедура ЗакончитьРедактирование(Команда) - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + + Если НЕ ДанныеСтроки.ФайлРедактируется + ИЛИ НЕ ДанныеСтроки.ФайлРедактируетТекущийПользователь Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; - СтрокаТаблицы = Элементы.Список.ТекущиеДанные; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; + Если МассивФайлов.Количество() > 1 Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивФайлов", МассивФайлов); + ПараметрыФормы.Вставить("ВозможностьСоздаватьВерсииФайлов", Истина); + ПараметрыФормы.Вставить("Редактирует", ДанныеСтроки.Редактирует); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЗавершениеРедактирования", ПараметрыФормы, ЭтотОбъект); + ИначеЕсли МассивФайлов.Количество() = 1 Тогда + ПараметрыОбновленияФайлов = Новый Структура; + ПараметрыОбновленияФайлов.Вставить("МассивФайлов", МассивФайлов); + ПараметрыОбновленияФайлов.Вставить("ВозможностьСоздаватьВерсииФайлов", Истина); + ПараметрыОбновленияФайлов.Вставить("ХранитьВерсии", ДанныеСтроки.ХранитьВерсии); + ПараметрыОбновленияФайлов.Вставить("СоздатьНовуюВерсию", Ложь); + ПараметрыОбновленияФайлов.Вставить("ФайлРедактируетТекущийПользователь", Истина); + ПараметрыОбновленияФайлов.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыОбновленияФайлов.Вставить("ИдентификаторФормы", УникальныйИдентификатор); + ПараметрыОбновленияФайлов.Вставить("Редактирует", ДанныеСтроки.Редактирует); + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеПоСсылкамСОповещением(ПараметрыОбновленияФайлов); КонецЕсли; - Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); - ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Обработчик, СтрокаТаблицы.Ссылка, УникальныйИдентификатор); - ПараметрыОбновленияФайла.ХранитьВерсии = СтрокаТаблицы.ХранитьВерсии; - ПараметрыОбновленияФайла.РедактируетТекущийПользователь = СтрокаТаблицы.РедактируетТекущийПользователь; - ПараметрыОбновленияФайла.Редактирует = СтрокаТаблицы.Редактирует; - ПараметрыОбновленияФайла.АвторТекущейВерсии = СтрокаТаблицы.Автор; - ПараметрыОбновленияФайла.Кодировка = СтрокаТаблицы.Кодировка; - РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); - КонецПроцедуры &НаКлиенте Процедура Занять(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; - Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + КоличествоФайлов = Элементы.Список.ВыделенныеСтроки.Количество(); + + Если КоличествоФайлов = 1 Тогда + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + ИначеЕсли КоличествоФайлов > 1 Тогда + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + + Если ЗначениеЗаполнено(ДанныеСтроки.Редактирует) Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект, МассивФайлов); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, МассивФайлов); + КонецЕсли; КонецПроцедуры @@ -712,13 +513,23 @@ Возврат; КонецЕсли; - Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, Элементы.Список.ТекущаяСтрока); - ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = ТекущиеДанные.РедактируетТекущийПользователь; - ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + Если Не РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл( + ДанныеСтроки.Ссылка, + ДанныеСтроки.ФайлРедактируетТекущийПользователь, + ДанныеСтроки.Редактирует) Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; + + ОсвободитьФайлы(МассивФайлов); + Для Каждого ПрисоединенныйФайл Из МассивФайлов Цикл + ОповеститьОбИзменении(ПрисоединенныйФайл); + КонецЦикла; + УстановитьДоступностьФайловыхКоманд(); КонецПроцедуры @@ -746,7 +557,7 @@ КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); + Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); КонецПроцедуры @@ -758,7 +569,8 @@ Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения( + Элементы.Список.ТекущаяСтрока, , УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -779,8 +591,9 @@ Процедура СписокПередНачаломИзменения(Элемент, Отказ) Отказ = Истина; - ПараметрыОткрытияФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока); + ПараметрыОткрытияФормы = Новый Структура("Ключ, ПараметрыОтправки", Элемент.ТекущаяСтрока, ПараметрыОтправки); ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыОткрытияФормы); + КонецПроцедуры &НаКлиенте @@ -805,7 +618,7 @@ МассивФайлов = Новый Массив; МассивФайлов.Добавить(Элементы.Список.ТекущаяСтрока); - РаботаСФайламиСлужебныйКлиент.ПодписатьФайл(МассивФайлов, УникальныйИдентификатор, + РаботаСФайламиСлужебныйКлиент.ПодписатьФайлы(МассивФайлов, УникальныйИдентификатор, Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); КонецПроцедуры @@ -891,7 +704,7 @@ &НаКлиенте Процедура Отправить(Команда) - ФайловыеФункцииСлужебныйКлиент.ОтправитьФайлыПоПочте( + РаботаСФайламиСлужебныйКлиент.ОтправитьФайлыПоПочте( Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ПараметрыОтправки, Истина); КонецПроцедуры @@ -911,23 +724,8 @@ КонецЕсли; ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; - Если ВыделенныеСтроки.Количество() > 1 Тогда - ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайловДляОткрытия( - ВыделенныеСтроки, - ЭтотОбъект.УникальныйИдентификатор); - - РаботаСФайламиКлиент.НапечататьФайлы(ДанныеФайлов); - Иначе - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, - ЭтотОбъект.УникальныйИдентификатор, - Неопределено, - ПредыдущийАдресФайла); - - ДанныеФайлов = Новый Массив; - ДанныеФайлов.Добавить(ДанныеФайла); - - РаботаСФайламиКлиент.НапечататьФайлы(ДанныеФайлов); + Если ВыделенныеСтроки.Количество() > 0 Тогда + РаботаСФайламиКлиент.НапечататьФайлы(ВыделенныеСтроки, ЭтотОбъект.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры @@ -974,43 +772,77 @@ #Область СлужебныеПроцедурыИФункции &НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - +Процедура ИмпортФайловПослеУстановкиРасширения(Результат, ПараметрыВыполнения) Экспорт + Если НЕ Результат Тогда + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Возврат; КонецЕсли; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если Не ДиалогОткрытияФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + МассивИменФайлов = Новый Массив; + Для Каждого ИмяФайла Из ДиалогОткрытияФайла.ВыбранныеФайлы Цикл + МассивИменФайлов.Добавить(ИмяФайла); + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); + ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаФайлов", ПараметрыФормы); КонецПроцедуры &НаКлиенте -Процедура РедактироватьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт +Процедура ИмпортПапкиПослеУстановкиРасширения(Результат, ПараметрыВыполнения) Экспорт - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + Если НЕ Результат Тогда + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Возврат; КонецЕсли; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если Не ДиалогОткрытияФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); + ПараметрыФормы.Вставить("КаталогНаДиске", ДиалогОткрытияФайла.Каталог); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаПапки", ПараметрыФормы); + КонецПроцедуры &НаКлиенте -Процедура ВыбратьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт +Процедура ЭкспортПапкиПослеУстановкиРасширения(Результат, ПараметрыФормы) Экспорт - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ВыбраннаяСтрока = ДополнительныеПараметры.ВыбраннаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаРедактирования", ЭтотОбъект, ПараметрыОбработчика); - - ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Истина); + Если НЕ Результат Тогда + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Возврат; КонецЕсли; + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЭкспортаПапки", ПараметрыФормы); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ОсвободитьФайлы(Знач МассивФайлов) + + Для Каждого ПрисоединенныйФайл Из МассивФайлов Цикл + РаботаСФайламиСлужебный.ОсвободитьФайл(ПрисоединенныйФайл); + КонецЦикла; + КонецПроцедуры &НаКлиенте @@ -1022,12 +854,11 @@ КонецЕсли; КонецЕсли; - Если ПапкаДляДобавления.Пустая() Тогда - Возврат; - КонецЕсли; - ТипЗначения = ТипЗнч(ЗначениеПеретаскивания); Если ТипЗначения = Тип("Файл") Тогда + Если ПапкаДляДобавления.Пустая() Тогда + Возврат; + КонецЕсли; Если ЗначениеПеретаскивания.ЭтоФайл() Тогда ПараметрыДобавления = Новый Структура; ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); @@ -1054,6 +885,9 @@ ТипЗначения = ТипЗнч(ЗначениеПеретаскивания[0]); Если ТипЗначения = Тип("Файл") Тогда + Если ПапкаДляДобавления.Пустая() Тогда + Возврат; + КонецЕсли; МассивИменФайлов = Новый Массив; Для Каждого ФайлПринятый Из ЗначениеПеретаскивания Цикл @@ -1062,7 +896,9 @@ РаботаСФайламиСлужебныйКлиент.ОткрытьФормуПеретаскиванияИзвне(ПапкаДляДобавления, МассивИменФайлов); ИначеЕсли ТипЗначения = Тип("СправочникСсылка.Файлы") Тогда - + Если ПапкаДляДобавления.Пустая() Тогда + Возврат; + КонецЕсли; Если Действие = ДействиеПеретаскивания.Копирование Тогда РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлы( @@ -1153,7 +989,7 @@ Возврат; КонецЕсли; - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; @@ -1197,7 +1033,7 @@ Возврат; КонецЕсли; - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); РасшифроватьСервер( Результат.МассивДанныхДляЗанесенияВБазу, @@ -1278,8 +1114,6 @@ Элементы.ФормаСоздатьСоСканера.Доступность = ДобавлениеФайлов И Не ФайлыРедактируютсяВОблачномСервисе; Элементы.СписокКонтекстноеМенюСоздать.Доступность = ДобавлениеФайлов И Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюСоздать.Доступность = ДобавлениеФайлов И Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.ФормаСкопировать.Доступность = ДобавлениеФайлов И Не ФайлыРедактируютсяВОблачномСервисе; Элементы.СписокКонтекстноеМенюУстановитьПометкуУдаления.Доступность = ДобавлениеФайлов И Не ФайлыРедактируютсяВОблачномСервисе; @@ -1319,7 +1153,7 @@ Если Элементы.Папки.ТекущиеДанные.ПапкаСинхронизируется Тогда - АдресПапкиВОблачномСервисе = ФайловыеФункцииСлужебныйКлиентСервер.АдресВОблачномСервисе( + АдресПапкиВОблачномСервисе = РаботаСФайламиСлужебныйКлиентСервер.АдресВОблачномСервисе( Элементы.Папки.ТекущиеДанные.УчетнаяЗаписьСервис, Элементы.Папки.ТекущиеДанные.Href); ЧастиСтроки = Новый Массив; @@ -1380,6 +1214,13 @@ КонецФункции +&НаСервереБезКонтекста +Функция ДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) + + Возврат РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные); + +КонецФункции + &НаКлиенте Процедура ОбработкаОжиданияУстановитьДоступностьФайловыхКоманд() @@ -1395,7 +1236,7 @@ И ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда УстановитьДоступностьКоманд( - ТекущиеДанные.РедактируетТекущийПользователь, + ТекущиеДанные.ФайлРедактируетТекущийПользователь, ТекущиеДанные.Редактирует, ТекущиеДанные.ПодписанЭП, ТекущиеДанные.Зашифрован); @@ -1537,79 +1378,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ВыбратьРежимИРедактироватьФайл(ОбработчикРезультата, ДанныеФайла, ДоступностьКомандыРедактировать) Экспорт - // Выбрать режим открытия файла и начать редактирование. - РезультатОткрыть = "Открыть"; - РезультатРедактировать = "Редактировать"; - РезультатОтмена = "Отмена"; - - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - - СпособОткрытия = ПерсональныеНастройки.ТекстовыеФайлыСпособОткрытия; - Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда - - РасширениеВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( - ПерсональныеНастройки.ТекстовыеФайлыРасширение, - ДанныеФайла.Расширение); - - Если РасширениеВСписке Тогда - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); - Возврат; - КонецЕсли; - - КонецЕсли; - - СпособОткрытия = ПерсональныеНастройки.ГрафическиеСхемыСпособОткрытия; - Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда - - РасширениеВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( - ПерсональныеНастройки.ГрафическиеСхемыРасширение, - ДанныеФайла.Расширение); - - Если РасширениеВСписке Тогда - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); - Возврат; - КонецЕсли; - - КонецЕсли; - - // Если уже занят для редактирования, то не спрашивать - сразу открывать. - Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) - И ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла = Истина - И ДоступностьКомандыРедактировать Тогда - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Обработчик = Новый ОписаниеОповещения("ВыбратьРежимИРедактироватьФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыбратьРежимИРедактироватьФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт - РезультатОткрыть = "Открыть"; - РезультатРедактировать = "Редактировать"; - РезультатОтмена = "Отмена"; - - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОтмена); - Возврат; - КонецЕсли; - - Если Результат.КакОткрывать = 1 Тогда - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатРедактировать); - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОткрыть); -КонецПроцедуры - &НаКлиенте Процедура СписокВыборПослеВыбораРежимаРедактирования(Результат, ПараметрыВыполнения) Экспорт РезультатОткрыть = "Открыть"; @@ -1642,7 +1410,7 @@ &НаСервере Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект); + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект); КонецПроцедуры @@ -1668,7 +1436,7 @@ ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные <> Неопределено И РасширенияПоддерживающиеПредпросмотр.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); АдресДанныхФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; Иначе АдресДанныхФайла = Неопределено; diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Module.bsl deleted file mode 100644 index e56d2d487..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Module.bsl +++ /dev/null @@ -1,33 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Информация = Параметры.Информация; - Заголовок = Параметры.Заголовок; -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Да(Команда) - СтруктураВозврата = Новый Структура("ПрименитьКоВсем, КодВозврата", - ПрименитьКоВсем, КодВозвратаДиалога.Да); - Закрыть(СтруктураВозврата); -КонецПроцедуры - -&НаКлиенте -Процедура Нет(Команда) - СтруктураВозврата = Новый Структура("ПрименитьКоВсем, КодВозврата", - ПрименитьКоВсем, КодВозвратаДиалога.Нет); - Закрыть(СтруктураВозврата); -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form index bca1ca2db..4694b00b3 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form @@ -70,6 +70,10 @@ <items xsi:type="form:Button"> <name>ДобавитьФайл</name> <id>64</id> + <title> + <key>ru</key> + <value>Добавить файл</value> + true true @@ -232,6 +236,10 @@ Папки 11 + + <key>ru</key> + <value>Папки</value> + true true @@ -248,6 +256,10 @@ ПапкиИндексКартинки 37 + + <key>ru</key> + <value>Индекс картинки</value> + true true @@ -348,10 +360,6 @@ ru Картинка и наименование папок - - ru - Картинка и наименование папок - КартинкаИНаименованиеПапокExtendedTooltip 51 @@ -544,6 +552,10 @@ Список 2 + + <key>ru</key> + <value>Список</value> + true true @@ -558,6 +570,10 @@ СписокНомерКартинкиПодписанЗашифрован 41 + + <key>ru</key> + <value>Номер картинки</value> + true true @@ -1155,6 +1171,10 @@ true + + <key>ru</key> + <value>Списки</value> + ГруппаСпискиExtendedTooltip 49 @@ -1217,17 +1237,12 @@ Список.ПодписанЭП - - Список.ТекущаяВерсияРасширение -
          true
          ВЫБРАТЬ Файлы.Ссылка, Файлы.ПометкаУдаления, Файлы.Предопределенный, - Файлы.Код, - Файлы.Наименование, Файлы.Автор, Файлы.ДатаСоздания, Файлы.ХранитьВерсии, @@ -1235,7 +1250,7 @@ Файлы.ТекущаяВерсия, Файлы.ИндексКартинки, Файлы.Описание, - Файлы.ПолноеНаименование, + Файлы.Наименование, Файлы.ВладелецФайла, Файлы.ПодписанЭП, Файлы.Зашифрован, @@ -1249,14 +1264,13 @@ ТОГДА 0 ИНАЧЕ -1 КОНЕЦ КАК НомерКартинкиПодписанЗашифрован, - Файлы.ТекущаяВерсияРасширение + Файлы.Расширение ИЗ Справочник.Файлы КАК Файлы ГДЕ Файлы.ВладелецФайла = &Владелец И Файлы.ПометкаУдаления = ЛОЖЬ Catalog.Файлы - true true true true @@ -1312,7 +1326,7 @@ ДобавитьФайл <key>ru</key> - <value>Создать файл</value> + <value>Добавить файл</value> 1 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Help/ru.html index d9af03da9..2e004dd5b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Help/ru.html @@ -1,7 +1,7 @@

          Предназначен для выбора шаблона файла. Выбор осуществляется из папки Шаблоны файлов.

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

          -

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

          +

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

          Список состоит из двух частей: слева папка Шаблоны файлов, справа - список шаблонов файлов, которые в ней находятся. Список состоит из колонок:

          •  - наличие электронной подписи или шифрования;
            @@ -14,7 +14,7 @@
            Выделите нужный шаблон в списке, нажмите Выбрать. Также можно воспользоваться двойным щелчком мыши.
          • Программа автоматически создает и выводит на просмотр карточку файла. Заполните необходимые поля, нажмите Записать и закрыть.

          Добавление шаблона файлов

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

            Просмотр сведений о файле

            diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl index 9f26ec100..ad2276568 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl @@ -45,7 +45,7 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда + Если ИмяСобытия = "Запись_Файл" И Параметр.Свойство("Событие") И Параметр.Событие = "СозданФайл" Тогда Если Параметр <> Неопределено Тогда ВладелецФайла = Неопределено; @@ -64,9 +64,9 @@ КонецЕсли; Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - + И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") + Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда + ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); КонецЕсли; @@ -120,7 +120,7 @@ &НаСервере Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект,, Истина); + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект,, Истина); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Help/ru.html deleted file mode 100644 index e979e2db3..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаГрупповаяОперацияНаПапке/Help/ru.html +++ /dev/null @@ -1 +0,0 @@ -Предназначена \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form index efaceeea3..2465f8bee 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form @@ -2,14 +2,14 @@ <key>ru</key> - <value>Создание нового файла</value> + <value>Добавление нового файла</value> РежимСоздания 2 <key>ru</key> - <value>Создать новый файл</value> + <value>Добавить</value> true true @@ -46,19 +46,19 @@ ru - Из шаблона + Файл с диска - 1 + 2 ru - Из файла на диске + По шаблону - 2 + 1 Vertical @@ -68,11 +68,11 @@ ОсновнаяКоманднаяПанель 1 - СоздатьФайл + ДобавитьФайл 4 <key>ru</key> - <value>Создать</value> + <value>Добавить</value> true true @@ -81,7 +81,7 @@ false - СоздатьФайлExtendedTooltip + ДобавитьФайлРасширеннаяПодсказка 12 Label true @@ -166,6 +166,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 11 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html index 4bc0ffac6..9f4206597 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html @@ -1,10 +1,10 @@

            Предназначена для выбора способа создания нового файла.

            -

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

            +

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

            Способы создания нового файла

            Выберите с помощью переключателя:

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

            Нажмите кнопку Создать для перехода к добавлению файла.

            См. также:

            • Общая информация о файлах; diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form index b93d379a8..0f4d8221b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form @@ -5,7 +5,7 @@ Загрузка файлов - Группа + ГруппаФайлы 19 Заголовок @@ -55,10 +55,10 @@ true - + <key>ru</key> <value>Заголовок</value> - </toolTip> + ЗаголовокExtendedTooltip 48 @@ -81,6 +81,10 @@ ДеревоФайлов 31 + + <key>ru</key> + <value>Дерево файлов</value> + true true @@ -222,6 +226,10 @@ true + + <key>ru</key> + <value>Картинка и наименование</value> + КартинкаИНаименованиеExtendedTooltip 51 @@ -364,8 +372,12 @@ true + + <key>ru</key> + <value>Файлы</value> + - ГруппаExtendedTooltip + ГруппаФайлыРасширеннаяПодсказка 47 Label true @@ -564,10 +576,6 @@ ru Реквизиты файлов - - ru - Реквизиты файлов - РеквизитыФайловExtendedTooltip 57 @@ -659,12 +667,8 @@ <key>ru</key> - <value>Группа кодировка</value> + <value>Кодировка</value> - - ru - Группа кодировка - ГруппаКодировкаExtendedTooltip 60 @@ -764,6 +768,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 63 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Help/ru.html index d6fca1ca6..b28182b2e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Help/ru.html @@ -21,13 +21,13 @@
            • Включите флажок, для того чтобы Хранить версии (рекомендуется, по умолчанию флажок включен);
            • -
              Для текстовых файлов можно Выбрать кодировку из списка.
          • +
            Для текстовых файлов можно Выбрать кодировку из списка.
        • Для подтверждения нажмите Загрузить файлы.

        См. также:

        \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl index 26ea80bdc..4c0fceac4 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl @@ -39,13 +39,11 @@ Заголовок = НСтр("ru = 'Загрузка папок'"); КонецЕсли; - Состояние(); - КонецПроцедуры &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.Файлы.Форма.ВыборКодировки") Тогда + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.РаботаСФайлами.Форма.ВыборКодировки") Тогда Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда Возврат; КонецЕсли; @@ -124,7 +122,7 @@ Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры #КонецОбласти @@ -150,21 +148,13 @@ Если ФайлПеренесенный.Расширение = "" Тогда НовыйЭлемент.ИндексКартинки = 2; // папка Иначе - НовыйЭлемент.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + НовыйЭлемент.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); КонецЕсли; Если ФайлПеренесенный.ЭтоКаталог() Тогда Путь = ФайлПеренесенный.ПолноеИмя + ПолучитьРазделительПути(); - Если ЭлементВерхнегоУровня = Истина Тогда - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идет сбор информации о каталоге - |""%1"". - |Пожалуйста, подождите.'"), - Путь)); - КонецЕсли; - НайденныеФайлы = НайтиФайлы(Путь, "*.*"); ФайлСортированные = Новый Массив; diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form index 87b8e337d..f7d4e6ac4 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form @@ -124,6 +124,10 @@ Папки 11 + + <key>ru</key> + <value>Папки</value> + true true @@ -140,6 +144,10 @@ ПапкиИндексКартинки 37 + + <key>ru</key> + <value>Индекс картинки</value> + true true @@ -239,10 +247,6 @@ ru Картинка и наименование папок - - ru - Картинка и наименование папок - КартинкаИНаименованиеПапокExtendedTooltip 47 @@ -435,6 +439,10 @@ Список 2 + + <key>ru</key> + <value>Список</value> + true true @@ -602,10 +610,6 @@ ru Картинка и наименование - - ru - Картинка и наименование - КартинкаИНаименованиеExtendedTooltip 51 @@ -892,10 +896,10 @@ true - + <key>ru</key> - <value>Группа списки</value> - </toolTip> + <value>Списки</value> + 10 ГруппаСпискиExtendedTooltip @@ -966,7 +970,6 @@ Файлы.Ссылка, Файлы.ПометкаУдаления, Файлы.Предопределенный, - Файлы.Код, Файлы.Наименование, Файлы.Автор, Файлы.ДатаСоздания, @@ -975,7 +978,6 @@ Файлы.ТекущаяВерсия, Файлы.ИндексКартинки, Файлы.Описание, - Файлы.ПолноеНаименование, Файлы.ВладелецФайла ИЗ Справочник.Файлы КАК Файлы diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form deleted file mode 100644 index c328e5afd..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form +++ /dev/null @@ -1,3732 +0,0 @@ - - - - <key>ru</key> - <value>Присоединенные файлы</value> - - - ВладелецФайла - 259 - - Style.LargeTextFont - - true - true - - true - - - ВладелецФайла - - - ВладелецФайлаРасширеннаяПодсказка - 261 - Label - true - true - - Left - - - - ВладелецФайлаКонтекстноеМеню - 260 - true - - LabelField - Enter - true - Left - true - - true - true - true - - Style.LargeTextFont - - - - - ГруппаПользовательскихНастроек - 227 - true - true - - true - - - <key>ru</key> - <value>Группа пользовательских настроек</value> - - - ГруппаПользовательскихНастроекРасширеннаяПодсказка - 228 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - Auto - Auto - - - - КоманднаяПанель - 229 - - ФормаПодменюСоздать - 176 - - ФормаСоздатьИзФайла - 47 - true - true - - true - - false - - ФормаСоздатьИзФайлаРасширеннаяПодсказка - 114 - Label - true - true - - Left - - - Form.Command.СоздатьФайл - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСоздатьИзШаблона - 178 - true - true - - true - - - ФормаСоздатьИзШаблонаРасширеннаяПодсказка - 179 - Label - true - true - - Left - - - Form.Command.СоздатьФайлИзШаблона - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСоздатьСоСканера - 180 - true - true - - true - - - ФормаСоздатьСоСканераРасширеннаяПодсказка - 181 - Label - true - true - - Left - - - Form.Command.СоздатьФайлСоСканера - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Создать</value> - - - ru - Создать файл - - - ФормаПодменюСоздатьРасширеннаяПодсказка - 177 - Label - true - true - - Left - - - Popup - - - StdPicture.CreateListItem - - Normal - - - - ФормаИзменить - 49 - - <key>ru</key> - <value>Открыть карточку</value> - - true - true - - true - - false - - ФормаИзменитьРасширеннаяПодсказка - 133 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.Change - Normal - Auto - true - true - UserCmds - Auto - - - ФормаГруппаКомандОсновные - 187 - - ФормаОткрыть - 73 - true - true - - true - - false - - ФормаОткрытьРасширеннаяПодсказка - 115 - Label - true - true - - Left - - - Form.Command.ОткрытьФайл - Normal - true - true - UserCmds - Auto - - - ФормаЗанять - 68 - true - true - - false - - ФормаЗанятьРасширеннаяПодсказка - 118 - Label - true - true - - Left - - - Form.Command.Занять - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаРедактировать - 74 - true - true - - true - - false - - ФормаРедактироватьРасширеннаяПодсказка - 116 - Label - true - true - - Left - - - Form.Command.Редактировать - Normal - true - true - UserCmds - Auto - - - ФормаСохранитьИзменения - 75 - true - true - - false - - ФормаСохранитьИзмененияРасширеннаяПодсказка - 121 - Label - true - true - - Left - - - Form.Command.СохранитьИзменения - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаЗакончитьРедактирование - 67 - true - true - - true - - false - - ФормаЗакончитьРедактированиеРасширеннаяПодсказка - 117 - Label - true - true - - Left - - - Form.Command.ЗакончитьРедактирование - Normal - Picture - true - true - UserCmds - Auto - - - Печать - 253 - true - true - - true - - - ПечатьРасширеннаяПодсказка - 254 - Label - true - true - - Left - - - Form.Command.Печать - Normal - Auto - true - true - UserCmds - Auto - - - Отправить - 251 - true - true - - true - - - ОтправитьРасширеннаяПодсказка - 252 - Label - true - true - - Left - - - Form.Command.Отправить - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Форма группа команд основные</value> - - - ФормаГруппаКомандОсновныеРасширеннаяПодсказка - 188 - Label - true - true - - Left - - - - - - ФормаГлобальныеКоманды - 185 - true - true - - true - - - <key>ru</key> - <value>Форма глобальные команды</value> - - None - - ФормаГлобальныеКомандыРасширеннаяПодсказка - 186 - Label - true - true - - Left - - - - FormCommandPanelGlobalCommands - - - - ФормаГруппаКомандЭлектроннаяПодписьИШифрование - 103 - - ФормаГруппаКомандЭлектроннаяПодпись - 231 - - ФормаПодписать - 101 - true - true - - true - - - ФормаПодписатьExtendedTooltip - 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> - - - ФормаГруппаКомандЭлектроннаяПодписьРасширеннаяПодсказка - 232 - Label - true - true - - Left - - - - - - ФормаГруппаКомандШифрование - 96 - - ФормаЗашифровать - 97 - true - true - - true - - - ФормаЗашифроватьExtendedTooltip - 130 - Label - true - true - - Left - - - Form.Command.Зашифровать - Normal - Auto - true - true - UserCmds - Auto - - - ФормаРасшифровать - 98 - true - true - - true - - - ФормаРасшифроватьExtendedTooltip - 131 - Label - true - true - - Left - - - Form.Command.Расшифровать - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Шифрование</value> - - - ФормаГруппаКомандШифрованиеРасширеннаяПодсказка - 129 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Электронная подпись и шифрование</value> - - - ru - Электронная подпись и шифрование - - - ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка - 124 - Label - true - true - - Left - - - Popup - - - CommonPicture.ПодписанЗашифрованЗаголовок - - Picture - Normal - - - - Предпросмотр - 244 - true - true - - true - - - ПредпросмотрРасширеннаяПодсказка - 245 - Label - true - true - - Left - - - Form.Command.Предпросмотр - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - НастроитьСинхронизацию - 272 - true - true - - true - - - НастроитьСинхронизациюРасширеннаяПодсказка - 273 - Label - true - true - - Left - - - Form.Command.НастроитьСинхронизацию - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаГруппаКомандДополнительные - 77 - - ФормаИзменить82 - 191 - - <key>ru</key> - <value>Открыть карточку</value> - - true - - true - - - ФормаИзменить82РасширеннаяПодсказка - 192 - Label - true - true - - Left - - - Form.StandardCommand.Change - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСкопировать - 50 - true - true - - true - - false - - ФормаСкопироватьРасширеннаяПодсказка - 132 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.Copy - 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 - - - ФормаСохранитьКак - 76 - true - true - - true - - false - - ФормаСохранитьКакРасширеннаяПодсказка - 122 - 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 - - - ФормаОткрытьКаталогФайла - 72 - true - true - - true - - false - - ФормаОткрытьКаталогФайлаРасширеннаяПодсказка - 119 - 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 - - - - - - ФормаГруппаДополнительно - 193 - - ФормаОбновитьСписок - 195 - true - true - - true - - - ФормаОбновитьСписокExtendedTooltip - 196 - Label - true - true - - Left - - - Form.Command.Обновить - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаГруппаНастройкаСписка - 199 - - ФормаНастройкаСписка - 201 - true - true - - true - - - ФормаНастройкаСпискаРасширеннаяПодсказка - 202 - Label - true - true - - Left - - - Form.StandardCommand.ListSettings - Normal - Auto - true - true - UserCmds - Auto - - - ФормаЗагрузитьНастройкиДинамическогоСписка - 203 - true - true - - true - - - ФормаЗагрузитьНастройкиДинамическогоСпискаРасширеннаяПодсказка - 204 - Label - true - true - - Left - - - Form.StandardCommand.LoadDynamicListSettings - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСохранитьНастройкиДинамическогоСписка - 205 - true - true - - true - - - ФормаСохранитьНастройкиДинамическогоСпискаРасширеннаяПодсказка - 206 - Label - true - true - - Left - - - Form.StandardCommand.SaveDynamicListSettings - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСтандартныеНастройкиДинамическогоСписка - 207 - true - true - - true - - - ФормаСтандартныеНастройкиДинамическогоСпискаРасширеннаяПодсказка - 208 - Label - true - true - - Left - - - Form.StandardCommand.DynamicListStandardSettings - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Форма группа настройка списка</value> - - - ru - Форма группа настройка списка - - - ФормаГруппаНастройкаСпискаРасширеннаяПодсказка - 200 - Label - true - true - - Left - - - - - - ФормаВывестиСписок - 209 - true - true - - true - - - ФормаВывестиСписокРасширеннаяПодсказка - 210 - Label - true - true - - Left - - - Form.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - - ФормаИзменитьФорму - 211 - true - true - - true - - - ФормаИзменитьФормуРасширеннаяПодсказка - 212 - Label - true - true - - Left - - - Form.StandardCommand.CustomizeForm - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Дополнительно</value> - - - ru - Форма группа дополнительно - - None - - ФормаГруппаДополнительноРасширеннаяПодсказка - 194 - Label - true - true - - Left - - - Popup - - Auto - Normal - - - - ФормаСправка - 57 - true - true - - true - - false - - ФормаСправкаРасширеннаяПодсказка - 141 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Командная панель</value> - - - КоманднаяПанельРасширеннаяПодсказка - 230 - Label - true - true - - Left - - - CommandBar - - Left - - - - ГруппаФайлы - 246 - - ГруппаФайлыИПояснениеОблачногоСервиса - 262 - - ГруппаПояснениеОблачногоСервиса - 264 - - ДекорацияКартинкаОблачногоСервиса - 266 - - <key>ru</key> - <value>Декорация картинка облачного сервиса</value> - - true - true - - true - - - ДекорацияКартинкаОблачногоСервисаРасширеннаяПодсказка - 268 - Label - true - true - - Left - - - - ДекорацияКартинкаОблачногоСервисаКонтекстноеМеню - 267 - true - - true - true - - - CommonPicture.ПапкаОблачногоСервиса - - - - - ДекорацияПояснение - 269 - - <key>ru</key> - <value>Работа с файлами ведется в облачном сервисе <link 1>%1</></value> - - true - true - - true - - - ДекорацияПояснениеРасширеннаяПодсказка - 271 - Label - true - true - - Left - - - - ДекорацияПояснениеКонтекстноеМеню - 270 - true - - true - Label - true - Center - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа пояснение облачного сервиса</value> - - - ГруппаПояснениеОблачногоСервисаРасширеннаяПодсказка - 265 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Список - 10 - true - true - - true - - - Список - - false - None - Refresh - - СписокНомерКартинкиПодписанЗашифрован - 91 - true - true - - true - - - Список.НомерКартинкиПодписанЗашифрован - - None - - ru - Наличие электронной подписи или шифрования - - - СписокНомерКартинкиПодписанЗашифрованРасширеннаяПодсказка - 161 - Label - true - true - - Left - - - - СписокНомерКартинкиПодписанЗашифрованКонтекстноеМеню - 92 - true - - PictureField - Enter - true - - CommonPicture.ПодписанЗашифрованЗаголовок - - Left - true - - 2 - true - true - true - true - - CommonPicture.ПодписанЗашифрованСостояния - - - - 1 - - - - - СписокГруппаКартинкаИНаименование - 45 - - СписокИндексКартинки - 25 - true - true - - true - - - Список.ИндексКартинки - - None - None - - СписокИндексКартинкиРасширеннаяПодсказка - 164 - Label - true - true - - Left - - - - СписокИндексКартинкиКонтекстноеМеню - 26 - true - - PictureField - Enter - true - Left - true - Left - - 2 - true - 1 - true - true - true - - CommonPicture.КоллекцияПиктограммФайлов - - - 1 - - - - - СписокНаименование - 17 - - <key>ru</key> - <value>Наименование</value> - - true - true - - true - - - Список.Description - - - СписокНаименованиеРасширеннаяПодсказка - 165 - Label - true - true - - Left - - - - СписокНаименованиеКонтекстноеМеню - 18 - true - - InputField - Enter - true - true - Left - true - - 20 - true - true - true - true - true - Normal - - - - СписокОписание - 27 - true - true - - true - - - Список.Описание - - None - - СписокОписаниеРасширеннаяПодсказка - 166 - Label - true - true - - Left - - - - СписокОписаниеКонтекстноеМеню - 28 - true - - InputField - Enter - true - true - Left - true - - 15 - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Список группа картинка и наименование</value> - - - СписокГруппаКартинкаИНаименованиеРасширеннаяПодсказка - 163 - Label - true - true - - Left - - - ColumnGroup - - InCell - auto - true - - - - СписокАвтор - 21 - true - true - - true - - - Список.Автор - - - СписокАвторРасширеннаяПодсказка - 168 - Label - true - true - - Left - - - - СписокАвторКонтекстноеМеню - 22 - true - - InputField - Enter - true - Left - true - - 15 - true - true - true - true - true - Normal - - - - СписокТекущаяВерсияДатаМодификацииФайла - 182 - - <key>ru</key> - <value>Дата изменения</value> - - true - true - - true - - - Список.ТекущаяВерсияДатаМодификацииФайла - - - СписокТекущаяВерсияДатаМодификацииФайлаРасширеннаяПодсказка - 184 - Label - true - true - - Left - - - - СписокТекущаяВерсияДатаМодификацииФайлаКонтекстноеМеню - 183 - true - - LabelField - Enter - true - Left - true - - 15 - true - true - false - - - - СписокТекущаяВерсияРазмер - 39 - - <key>ru</key> - <value>Размер (Кб)</value> - - true - true - - true - - - Список.ТекущаяВерсияРазмер - - - ru - Размер файла в килобайтах - - - СписокТекущаяВерсияРазмерРасширеннаяПодсказка - 170 - Label - true - true - - Left - - - - СписокТекущаяВерсияРазмерКонтекстноеМеню - 40 - true - - LabelField - Enter - true - Left - true - - 10 - true - true - false - - ru - ЧЦ=10; ЧН=0 - - - - - СписокДатаСоздания - 23 - true - true - - - Список.ДатаСоздания - - - СписокДатаСозданияРасширеннаяПодсказка - 167 - Label - true - true - - Left - - - - СписокДатаСозданияКонтекстноеМеню - 24 - true - - InputField - Enter - true - Left - true - - 15 - true - true - false - true - true - true - Normal - - - - СписокРедактирует - 29 - true - true - - - Список.Редактирует - - - СписокРедактируетРасширеннаяПодсказка - 169 - Label - true - true - - Left - - - - СписокРедактируетКонтекстноеМеню - 30 - true - - InputField - Enter - true - Left - true - - 15 - true - true - true - true - true - Normal - - - - СписокТекущаяВерсияАвтор - 35 - true - true - - - Список.ТекущаяВерсияАвтор - - - СписокТекущаяВерсияАвторРасширеннаяПодсказка - 171 - Label - true - true - - Left - - - - СписокТекущаяВерсияАвторКонтекстноеМеню - 36 - true - - InputField - Enter - true - Left - true - - 17 - true - true - true - true - true - Normal - - - - СписокТекущаяВерсияДатаСоздания - 37 - true - true - - - Список.ТекущаяВерсияДатаСоздания - - - СписокТекущаяВерсияДатаСозданияРасширеннаяПодсказка - 172 - Label - true - true - - Left - - - - СписокТекущаяВерсияДатаСозданияКонтекстноеМеню - 38 - true - - InputField - Enter - true - Left - true - - 15 - true - true - false - true - true - true - Normal - - - - СписокХранитьВерсии - 63 - true - true - - - Список.ХранитьВерсии - - - СписокХранитьВерсииРасширеннаяПодсказка - 173 - Label - true - true - - Left - - - - СписокХранитьВерсииКонтекстноеМеню - 64 - true - - CheckBoxField - Enter - true - Left - true - - - - СписокРедактируетТекущийПользователь - 65 - true - true - - - Список.РедактируетТекущийПользователь - - None - - ru - Редактирует текущий пользователь - - - СписокРедактируетТекущийПользовательРасширеннаяПодсказка - 174 - Label - true - true - - Left - - - - СписокРедактируетТекущийПользовательКонтекстноеМеню - 66 - true - - CheckBoxField - Enter - true - - CommonPicture.РедактироватьФайл - - Left - true - - - - СписокСсылка - 89 - true - true - - - Список.Ref - - - СписокСсылкаРасширеннаяПодсказка - 175 - Label - true - true - - Left - - - - СписокСсылкаКонтекстноеМеню - 90 - true - - LabelField - Enter - true - Left - true - - 1 - true - true - - - None - - СписокКоманднаяПанель - 12 - Left - true - - - DragCheck - СписокПроверкаПеретаскивания - - - Selection - СписокВыбор - - - BeforeAddRow - СписокПередНачаломДобавления - - - OnActivateRow - СписокПриАктивизацииСтроки - - - Drag - СписокПеретаскивание - - - СписокСтрокаПоиска - 235 - - СписокСтрокаПоискаРасширеннаяПодсказка - 237 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 236 - true - - Список - - true - - - - СписокСостояниеПросмотра - 238 - - СписокСостояниеПросмотраРасширеннаяПодсказка - 240 - Label - true - true - - Left - - - - СписокСостояниеПросмотраКонтекстноеМеню - 239 - true - - ViewStatusAddition - Список - - true - - - - СписокУправлениеПоиском - 241 - - СписокУправлениеПоискомРасширеннаяПодсказка - 243 - Label - true - true - - Left - - - - СписокУправлениеПоискомКонтекстноеМеню - 242 - true - - SearchControlAddition - Список - - true - - - - СписокExtendedTooltip - 160 - Label - true - true - - Left - - - - СписокКонтекстноеМеню - 11 - - СписокКонтекстноеМенюСоздать - 215 - true - true - - true - - - СписокКонтекстноеМенюСоздатьРасширеннаяПодсказка - 216 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.Create - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюИзменить - 217 - - <key>ru</key> - <value>Открыть карточку</value> - - true - true - - true - - - СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка - 218 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.Change - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюГруппаКомандОсновные - 213 - - СписокКонтекстноеМенюОткрыть - 78 - true - true - - true - - false - - СписокКонтекстноеМенюОткрытьРасширеннаяПодсказка - 142 - Label - true - true - - Left - - - Form.Command.ОткрытьФайл - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюЗанять - 81 - true - true - - false - - СписокКонтекстноеМенюЗанятьРасширеннаяПодсказка - 145 - 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 - - - СписокКонтекстноеМенюСохранитьИзменения - 82 - true - true - - false - - СписокКонтекстноеМенюСохранитьИзмененияРасширеннаяПодсказка - 146 - 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 - - - СписокКонтекстноеМенюПечать - 255 - true - true - - true - - - СписокКонтекстноеМенюПечатьРасширеннаяПодсказка - 256 - Label - true - true - - Left - - - Form.Command.Печать - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюОтправить - 257 - true - true - - true - - - СписокКонтекстноеМенюОтправитьРасширеннаяПодсказка - 258 - Label - true - true - - Left - - - Form.Command.Отправить - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Список контекстное меню группа команд основные</value> - - - СписокКонтекстноеМенюГруппаКомандОсновныеРасширеннаяПодсказка - 214 - Label - true - true - - Left - - - - - - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование - 104 - - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодпись - 233 - - СписокКонтекстноеМенюПодписать - 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> - - - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьРасширеннаяПодсказка - 234 - 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> - - - СписокКонтекстноеМенюГруппаКомандШифрованиеРасширеннаяПодсказка - 157 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Электронная подпись и шифрование</value> - - - ru - Электронная подпись и шифрование - - - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка - 152 - Label - true - true - - Left - - - Popup - - Auto - Normal - - - - СписокКонтекстноеМенюГруппаКомандДополнительные - 219 - - СписокКонтекстноеМенюСкопировать - 221 - true - true - - true - - - СписокКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 222 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.Copy - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюУстановитьПометкуУдаления - 223 - true - true - - true - - - СписокКонтекстноеМенюУстановитьПометкуУдаленияРасширеннаяПодсказка - 224 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.SetDeletionMark - 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 - - <key>ru</key> - <value>Отменить редактирование</value> - - true - true - - true - - false - - СписокКонтекстноеМенюОсвободитьРасширеннаяПодсказка - 149 - 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 - - - СписокКонтекстноеМенюИмпортФайлов - 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> - - - СписокКонтекстноеМенюГруппаКомандДополнительныеРасширеннаяПодсказка - 220 - Label - true - true - - Left - - - - - - СписокКонтекстноеМенюГруппаСтандартныхКоманд - 225 - true - true - - true - - - <key>ru</key> - <value>Список контекстное меню группа стандартных команд</value> - - - СписокКонтекстноеМенюГруппаСтандартныхКомандРасширеннаяПодсказка - 226 - Label - true - true - - Left - - - - Item.Список - - - - HierarchicalList - true - true - true - 10 - 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 - ГруппаПользовательскихНастроек - -
        - true - true - - true - - - <key>ru</key> - <value>Файлы и пояснение облачного сервиса</value> - - - ru - Группа файлы и пояснение облачного сервиса - - - ГруппаФайлыИПояснениеОблачногоСервисаРасширеннаяПодсказка - 263 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - -
        - - АдресДанныхФайла - 248 - true - - true - - - АдресДанныхФайла - - None - - АдресДанныхФайлаРасширеннаяПодсказка - 250 - Label - true - true - - Left - - - - АдресДанныхФайлаКонтекстноеМеню - 249 - true - - PictureField - Enter - true - Left - true - - true - true - true - true - AutoSize - - ru - Выберите файл для предварительного просмотра - - - - 1 - - - - true - true - - true - - - <key>ru</key> - <value>Группа файлы</value> - - - ru - Группа файлы - - - ГруппаФайлыРасширеннаяПодсказка - 247 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - -
        - - ФормаКоманднаяПанель - -1 - Left - - - NotificationProcessing - ОбработкаОповещения - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - Refresh - DontBlock - true - true - Vertical - true - true - true - auto - true - - Список - 1 - - DynamicList - - - true - - - true - - - Список.Ref - - - Список.Зашифрован - - - Список.ПодписанЭП - - - Список.Расширение - - - Список.Редактирует - - - Список.РедактируетТекущийПользователь - - - Список.ХранитьВерсии - -
        true
        - - ВЫБРАТЬ - Файлы.Код, - Файлы.Редактирует, - Файлы.ДатаСоздания, - Файлы.ТекущаяВерсияРазмер / 1024 КАК ТекущаяВерсияРазмер, - Файлы.Автор, - Файлы.ТекущаяВерсияДатаСоздания, - Файлы.ТекущаяВерсияРасширение КАК Расширение, - ВЫБОР - КОГДА Файлы.ПометкаУдаления = ИСТИНА - ТОГДА Файлы.ИндексКартинки + 1 - ИНАЧЕ Файлы.ИндексКартинки - КОНЕЦ КАК ИндексКартинки, - Файлы.Наименование, - Файлы.Описание, - Файлы.Ссылка, - Файлы.ТекущаяВерсияАвтор, - Файлы.ТекущаяВерсияДатаМодификацииФайла, - Файлы.ПометкаУдаления, - Файлы.ХранитьВерсии, - ВЫБОР - КОГДА Файлы.Редактирует = &ТекущийПользователь - ТОГДА ИСТИНА - ИНАЧЕ ЛОЖЬ - КОНЕЦ КАК РедактируетТекущийПользователь, - Файлы.Зашифрован, - Файлы.ПодписанЭП, - ВЫБОР - КОГДА Файлы.ПодписанЭП - И Файлы.Зашифрован - ТОГДА 2 - КОГДА Файлы.Зашифрован - ТОГДА 1 - КОГДА Файлы.ПодписанЭП - ТОГДА 0 - ИНАЧЕ -1 - КОНЕЦ КАК НомерКартинкиПодписанЗашифрован -ИЗ - Справочник.Файлы КАК Файлы -ГДЕ - Файлы.ВладелецФайла = &Владелец - 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> - - 4 - - ValueList - - - 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 - - - true - - - true - - - - ВладелецФайла - - <key>ru</key> - <value>Владелец</value> - - 8 - - AnyRef - - - true - - - true - - - - ФайлыРедактируютсяВОблачномСервисе - - <key>ru</key> - <value>Файлы редактируются в облачном сервисе</value> - - 9 - - Boolean - - - true - - - true - - - - ЗапрещенныеРасширения - - <key>ru</key> - <value>Запрещенные расширения</value> - - 10 - - ValueList - - - true - - - true - - - - - - - СоздатьФайл - - <key>ru</key> - <value>Из файла на диске...</value> - - 1 - - ru - Создать файл из файла на диске - - - true - - - - СоздатьФайлВыполнить - - - TextPicture - DontUse - Auto - - - ЗакончитьРедактирование - - <key>ru</key> - <value>Закончить редактирование</value> - - 2 - - ru - Сохранить и освободить файл в информационной базе - - - true - - - CommonPicture.ЗакончитьРедактированиеФайла - - - - ЗакончитьРедактирование - - - TextPicture - DontUse - Auto - - - Занять - - <key>ru</key> - <value>Занять</value> - - 3 - - ru - Пометить файл как занятый для редактирования - - - true - - - CommonPicture.ЗанятьФайл - - - - Занять - - - TextPicture - DontUse - Auto - - - Освободить - - <key>ru</key> - <value>Освободить</value> - - 5 - - ru - Освободить занятый файл - - - true - - - CommonPicture.ОсвободитьФайл - - - - Освободить - - - TextPicture - DontUse - Auto - - - ОткрытьКаталогФайла - - <key>ru</key> - <value>Открыть каталог файла</value> - - 6 - - ru - Открыть каталог файла - - - true - - - - ОткрытьКаталогФайла - - - DontUse - Auto - - - ОткрытьФайл - - <key>ru</key> - <value>Просмотреть</value> - - 7 - - ru - Открыть файл для просмотра - - - true - - - CommonPicture.ОткрытьВыбранныйФайл - - - - ОткрытьФайл - - - Picture - DontUse - Auto - - - Редактировать - - <key>ru</key> - <value>Редактировать</value> - - 8 - - ru - Занять файл и открыть для редактирования - - - true - - F4 - - CommonPicture.РедактироватьФайл - - - - Редактировать - - - TextPicture - DontUse - Auto - - - СохранитьИзменения - - <key>ru</key> - <value>Сохранить изменения</value> - - 9 - - ru - Сохранить измененный файл в информационной базе - - - true - - - CommonPicture.ОпубликоватьФайл - - - - СохранитьИзменения - - - TextPicture - DontUse - Auto - - - СохранитьКак - - <key>ru</key> - <value>Сохранить как...</value> - - 10 - - ru - Сохранить файл на диск или другое устройство - - - true - - - CommonPicture.СохранитьФайлКак - - - - СохранитьКак - - - TextPicture - DontUse - Auto - - - ИмпортФайлов - - <key>ru</key> - <value>Загрузить файлы...</value> - - 4 - - ru - Загрузить файлы - - - true - - - - ИмпортФайлов - - - DontUse - Auto - - - ДобавитьПодписьИзФайла - - <key>ru</key> - <value>Добавить электронную подпись из файла...</value> - - 11 - - true - - - - ДобавитьПодписьИзФайла - - - DontUse - Auto - - - Подписать - - <key>ru</key> - <value>Подписать...</value> - - 13 - - ru - Подписать - - - true - - - CommonPicture.ПодписанЭП - - - - Подписать - - - DontUse - Auto - - - Расшифровать - - <key>ru</key> - <value>Расшифровать...</value> - - 14 - - ru - Расшифровать - - - true - - - - Расшифровать - - - DontUse - Auto - - - СохранитьВместеСПодписью - - <key>ru</key> - <value>Сохранить вместе с электронной подписью...</value> - - 15 - - ru - Сохранить вместе с электронной подписью - - - true - - - - СохранитьВместеСПодписью - - - DontUse - Auto - - - Зашифровать - - <key>ru</key> - <value>Зашифровать...</value> - - 16 - - ru - Зашифровать - - - true - - - CommonPicture.Зашифрован - - - - Зашифровать - - - DontUse - Auto - - - СоздатьФайлИзШаблона - - <key>ru</key> - <value>Из шаблона...</value> - - 12 - - ru - Создать файл из шаблона - - - true - - - - СоздатьФайлИзШаблона - - - DontUse - Auto - - - СоздатьФайлСоСканера - - <key>ru</key> - <value>Со сканера...</value> - - 17 - - ru - Создать файл со сканера - - - true - - - - СоздатьФайлСоСканера - - - DontUse - Auto - - - Обновить - - <key>ru</key> - <value>Обновить</value> - - 18 - - ru - Обновить - - - true - - F5 - - StdPicture.Refresh - - - - Обновить - - - DontUse - Auto - - - Предпросмотр - - <key>ru</key> - <value>Предпросмотр</value> - - 19 - - ru - Предпросмотр - - - true - - - - Предпросмотр - - - DontUse - Auto - - - Отправить - - <key>ru</key> - <value>Отправить</value> - - 20 - - ru - Отправить - - - true - - - - Отправить - - - DontUse - Auto - - - Печать - - <key>ru</key> - <value>Печать</value> - - 21 - - ru - Печать - - - true - - - - Печать - - - DontUse - Auto - - - НастроитьСинхронизацию - - <key>ru</key> - <value>Синхронизация с облаком ...</value> - - 22 - - ru - Настроить синхронизацию - - - true - - - - НастроитьСинхронизацию - - - FunctionalOption.ИспользоватьСинхронизациюФайлов - DontUse - Auto - - - - - - -
        diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Help/ru.html deleted file mode 100644 index 6977f2504..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Help/ru.html +++ /dev/null @@ -1,22 +0,0 @@ - -

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

        -

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

        -

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

        -

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

        -
        •  - наличие электронной подписи или шифрования. -
        • Наименование - полное наименование файла. Значок рядом с наименованием указывает тип файла. -
        • Автор - пользователь, который добавил версию файла; -
        • Дата изменения - дата изменения данных версии файла (местное время); -
          -
        • Описание - подробное описание файла. -

        С помощью команды Еще - Изменить форму можно добавить сведения:

        -
        • -
          Расширение - формат файла, рядом значок, который также показывает формат;
          -
        • Редактирует - пользователь, который занял файл для редактирования и т.д.  -
        • -
          Размер (КБ) - размер данных версии файла;

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

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

        См. также:

        - \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl deleted file mode 100644 index 86a3cdc8a..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl +++ /dev/null @@ -1,1198 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ВладелецФайла = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВладелецФайла"); - ТекущаяСсылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ТекущаяСтрока"); - СписокОткрытИзКарточкиФайла = ЗначениеЗаполнено(ТекущаяСсылка); - Элементы.ВладелецФайла.Видимость = СписокОткрытИзКарточкиФайла; - Если СписокОткрытИзКарточкиФайла И Не ЗначениеЗаполнено(ВладелецФайла) Тогда - ВладелецФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущаяСсылка, "ВладелецФайла"); - КонецЕсли; - Если ЗначениеЗаполнено(ВладелецФайла) Тогда - Список.Параметры.УстановитьЗначениеПараметра("Владелец", ВладелецФайла); - ТипСправочникаСФайлами = ТипЗнч(ВладелецФайла); - КонецЕсли; - - Если Параметры.Свойство("ЗаголовокФормы") Тогда - Заголовок = Параметры.ЗаголовокФормы; - ИначеЕсли СписокОткрытИзКарточкиФайла Тогда - Заголовок = Заголовок + " (" + Строка(ТипСправочникаСФайлами) + " " + Строка(ВладелецФайла) + ")"; - КонецЕсли; - - Если Параметры.Свойство("ПараметрыОтправки") Тогда - ПараметрыОтправки = Параметры.ПараметрыОтправки; - Иначе - ПараметрыОтправки = ФайловыеФункцииСлужебный.ПодготовитьСтруктуруПараметровОтправки(); - КонецЕсли; - - Список.Параметры.УстановитьЗначениеПараметра("ТекущийПользователь", Пользователи.ТекущийПользователь()); - - РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); - - ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - - ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); - Если ПоказыватьКолонкуРазмер = Ложь Тогда - Элементы.СписокТекущаяВерсияРазмер.Видимость = Ложь; - КонецЕсли; - - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда - Элементы.ФормаИзменить.Видимость = Ложь; - Элементы.ФормаИзменить82.Видимость = Истина; - КонецЕсли; - - Если ТипСправочникаСФайлами <> Неопределено Тогда - ИспользоватьПредпросмотр = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( - ТипСправочникаСФайлами, - "Предпросмотр"); - - Если ИспользоватьПредпросмотр <> Неопределено Тогда - Предпросмотр = ИспользоватьПредпросмотр; - Элементы.АдресДанныхФайла.Видимость = ИспользоватьПредпросмотр; - Элементы.Предпросмотр.Пометка = ИспользоватьПредпросмотр; - КонецЕсли; - КонецЕсли; - - РасширенияПоддерживающиеПредпросмотр = ФайловыеФункцииСлужебный.СписокРасширенийДляПредпросмотра(); - - ОбновитьПояснениеОблачногоСервиса(); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); - - Если Не МодульУправлениеДоступом.ЕстьРоль("НастройкаСинхронизацииФайлов") Тогда - Элементы.НастроитьСинхронизацию.Видимость = Ложь; - КонецЕсли; - - КонецЕсли; - - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - УстановитьДоступностьФайловыхКоманд(); - - Элементы.ФормаСоздатьСоСканера.Видимость = ФайловыеФункцииСлужебныйКлиент.ДоступнаКомандаСканировать(); - - #Если ВебКлиент Тогда - Элементы.Печать.Видимость = Ложь; - Элементы.СписокКонтекстноеМенюПечать.Видимость = Ложь; - #КонецЕсли - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - - Если ИмяСобытия = "ИмпортФайловЗавершен" Тогда - Элементы.Список.Обновить(); - - Если Параметр <> Неопределено Тогда - Элементы.Список.ТекущаяСтрока = Параметр; - КонецЕсли; - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда - - Если Параметр <> Неопределено Тогда - - ВладелецФайлаСписка = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - - ВладелецФайла = Неопределено; - Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда - Если ВладелецФайла = ВладелецФайлаСписка.Значение Тогда - Элементы.Список.Обновить(); - - ФайлСозданный = Неопределено; - Если Параметр.Свойство("Файл", ФайлСозданный) Тогда - Элементы.Список.ТекущаяСтрока = ФайлСозданный; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ДанныеФайлаИзменены" Тогда - УстановитьДоступностьФайловыхКоманд(); - КонецЕсли; - - Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - - ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок - -&НаКлиенте -Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат; - КонецЕсли; - - СтандартнаяОбработка = Ложь; - - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - КакОткрывать = ПерсональныеНастройки.ДействиеПоДвойномуЩелчкуМыши; - - Если КакОткрывать = "ОткрыватьКарточку" Тогда - ПоказатьЗначение(, ВыбраннаяСтрока); - Возврат; - КонецЕсли; - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - Если ИмяКаталога = Неопределено ИЛИ ПустаяСтрока(ИмяКаталога) Тогда - Возврат; - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ВыбраннаяСтрока", ВыбраннаяСтрока); - ДополнительныеПараметры.Вставить("ПерсональныеНастройки", ПерсональныеНастройки); - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - - // Если уже занят для редактирования, то не спрашивать - сразу открывать. - Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - СпрашиватьРежимРедактированияПриОткрытииФайла = ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла; - Если СпрашиватьРежимРедактированияПриОткрытииФайла = Истина Тогда - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаОткрытия", ЭтотОбъект, ПараметрыОбработчика); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , ЭтотОбъект, , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - Возврат; - КонецЕсли; - КонецЕсли; - - // Для просмотра. - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); -КонецПроцедуры - -&НаКлиенте -Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; -КонецПроцедуры - -&НаКлиенте -Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда - Возврат; - КонецЕсли; - - ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайла); -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Отказ = Истина; - ФайлОснование = Элементы.Список.ТекущаяСтрока; - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - - Если Копирование Тогда - РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); - Иначе - РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура СписокПриАктивизацииСтроки(Элемент) - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ЗакончитьРедактирование(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - ДанныеФайла = Элементы.Список.ТекущиеДанные; - - Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеЗавершение", ЭтотОбъект); - ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Обработчик, ФайлСсылка, УникальныйИдентификатор); - ПараметрыОбновленияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - ПараметрыОбновленияФайла.РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыОбновленияФайла.Редактирует = ДанныеФайла.Редактирует; - РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура Занять(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - Обработчик = Новый ОписаниеОповещения("ЗанятьЗавершение", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением( - Обработчик, - ФайлСсылка); - -КонецПроцедуры - -&НаКлиенте -Процедура Освободить(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - ДанныеФайла = Элементы.Список.ТекущиеДанные; - - Обработчик = Новый ОписаниеОповещения("ОсвободитьЗавершение", ЭтотОбъект); - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, ФайлСсылка); - ПараметрыОсвобожденияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыОсвобожденияФайла.Редактирует = ДанныеФайла.Редактирует; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьКаталогФайла(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФайл(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ФайлСсылка", ФайлСсылка); - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура Редактировать(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ФайлСсылка", ФайлСсылка); - Оповещение = Новый ОписаниеОповещения("РедактироватьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - Обработчик = Новый ОписаниеОповещения("РедактироватьЗавершение", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, ФайлСсылка); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением( - Неопределено, - ФайлСсылка, - УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ФайлСсылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); - -КонецПроцедуры - -&НаКлиенте -Процедура ИмпортФайлов(Команда) - #Если ВебКлиент Тогда - ТекстПредупреждения = НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. - |Используйте команду ""Создать"" в списке файлов.'"); - ПоказатьПредупреждение(, ТекстПредупреждения); - Возврат; - #КонецЕсли - - МассивИменФайлов = ФайловыеФункцииСлужебныйКлиент.ИмпортируемыеФайлы(); - - Если МассивИменФайлов.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПапкаДляДобавления", ВладелецФайла); - ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыФормы); -КонецПроцедуры - -&НаКлиенте -Процедура Подписать(Команда) - - МассивФайлов = Новый Массив; - Для каждого ФайлСсылка Из Элементы.Список.ВыделенныеСтроки Цикл - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Продолжить; - КонецЕсли; - МассивФайлов.Добавить(ФайлСсылка); - КонецЦикла; - - РаботаСФайламиСлужебныйКлиент.ПодписатьФайл(МассивФайлов, УникальныйИдентификатор, - Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); - -КонецПроцедуры - -&НаКлиенте -Процедура Зашифровать(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ФайлСсылка); - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ФайлСсылка", ФайлСсылка); - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект, ПараметрыОбработчика); - - РаботаСФайламиСлужебныйКлиент.Зашифровать(Обработчик, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура Расшифровать(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ФайлСсылка); - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ФайлСсылка", ФайлСсылка); - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект, ПараметрыОбработчика); - - РаботаСФайламиСлужебныйКлиент.Расшифровать( - Обработчик, - ДанныеФайла.Ссылка, - УникальныйИдентификатор, - ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьПодписьИзФайла(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла( - ФайлСсылка, - УникальныйИдентификатор, - Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаЗавершение", ЭтотОбъект)); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьВместеСПодписью(Команда) - - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.СохранитьФайлВместеСПодписью(ФайлСсылка, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьФайлВыполнить() - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); - Иначе - РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыБезРасширения(ПараметрыДобавления); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьФайлИзШаблона(Команда) - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления); - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьФайлСоСканера(Команда) - - ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - Если ЗначениеПараметраКД = Неопределено Тогда - ВладелецФайла = Неопределено; - Иначе - ВладелецФайла = ЗначениеПараметраКД.Значение; - КонецЕсли; - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - ПараметрыДобавления.Вставить("ЭтоФайл", Истина); - ФайловыеФункцииСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); - -КонецПроцедуры - -&НаКлиенте -Процедура Обновить(Команда) - - Элементы.Список.Обновить(); - ПодключитьОбработчикОжидания("УстановитьДоступностьФайловыхКоманд", 0.1, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура Предпросмотр(Команда) - - Предпросмотр = Не Предпросмотр; - Элементы.Предпросмотр.Пометка = Предпросмотр; - УстановитьВидимостьПредпросмотра(Предпросмотр); - СохранитьВариантПредпросмотра(ТипСправочникаСФайлами, Предпросмотр); - - #Если ВебКлиент Тогда - ОбновитьПредпросмотр(); - #КонецЕсли - -КонецПроцедуры - -&НаКлиенте -Процедура Отправить(Команда) - - ФайловыеФункцииСлужебныйКлиент.ОтправитьФайлыПоПочте( - Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ПараметрыОтправки, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура Печать(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - СистемнаяИнфо = Новый СистемнаяИнформация; - Если СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86 - И СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); - Возврат; - КонецЕсли; - - ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; - Если ВыделенныеСтроки.Количество() > 1 Тогда - ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайловДляОткрытия( - ВыделенныеСтроки, - ЭтотОбъект.УникальныйИдентификатор); - - РаботаСФайламиКлиент.НапечататьФайлы(ДанныеФайлов); - Иначе - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, - ЭтотОбъект.УникальныйИдентификатор, - Неопределено, - ПредыдущийАдресФайла); - - ДанныеФайлов = Новый Массив; - ДанныеФайлов.Добавить(ДанныеФайла); - - РаботаСФайламиКлиент.НапечататьФайлы(ДанныеФайлов); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ФайлСсылка = ДополнительныеПараметры.ФайлСсылка; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура РедактироватьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ФайлСсылка = ДополнительныеПараметры.ФайлСсылка; - Обработчик = Новый ОписаниеОповещения("РедактироватьЗавершение", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, ФайлСсылка); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВыбратьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ВыбраннаяСтрока = ДополнительныеПараметры.ВыбраннаяСтрока; - ПерсональныеНастройки = ДополнительныеПараметры.ПерсональныеНастройки; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, - УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); - - // Если уже занят для редактирования, то не спрашивать - сразу открывать. - Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - СпрашиватьРежимРедактированияПриОткрытииФайла = ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла; - Если СпрашиватьРежимРедактированияПриОткрытииФайла = Истина Тогда - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаОткрытия", ЭтотОбъект, ПараметрыОбработчика); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , ЭтотОбъект, , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - Возврат; - КонецЕсли; - КонецЕсли; - - // Для просмотра. - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СписокВыборПослеВыбораРежимаОткрытия(Результат, ПараметрыВыполнения) Экспорт - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - Если Результат.КакОткрывать = 1 Тогда - // Для редактирования. - Обработчик = Новый ОписаниеОповещения("СписокВыборПослеРедактирования", ЭтотОбъект, ПараметрыВыполнения); - РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); - Возврат; - КонецЕсли; - - // Для просмотра. - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); -КонецПроцедуры - -&НаКлиенте -Процедура СписокВыборПослеРедактирования(Результат, ПараметрыВыполнения) Экспорт - ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗанятьЗавершение(Результат, ПараметрыВыполнения) Экспорт - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ОсвободитьЗавершение(Результат, ПараметрыВыполнения) Экспорт - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура РедактироватьЗавершение(Результат, ПараметрыВыполнения) Экспорт - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ПодписатьЗавершение(Результат, ПараметрыВыполнения) Экспорт - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗашифроватьЗавершение(Результат, ПараметрыВыполнения) Экспорт - Если Результат.Успех <> Истина Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ПараметрыВыполнения.ФайлСсылка, - Истина, // Зашифровать - Результат.МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - Результат.МассивОтпечатков); - - РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( - МассивФайловВРабочемКаталогеДляУдаления, - ПараметрыВыполнения.ДанныеФайла.Владелец, - ПараметрыВыполнения.ФайлСсылка); - - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура РасшифроватьЗавершение(Результат, ПараметрыВыполнения) Экспорт - Если Результат.Успех <> Истина Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ПараметрыВыполнения.ФайлСсылка, - Ложь, // Зашифровать - Результат.МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - Новый Массив, // МассивФайловВРабочемКаталогеДляУдаления - Новый Массив); // МассивОтпечатков. - - РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( - ПараметрыВыполнения.ДанныеФайла.Владелец, - ПараметрыВыполнения.ФайлСсылка); - - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьПодписьИзФайлаЗавершение(Результат, ПараметрыВыполнения) Экспорт - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗакончитьРедактированиеЗавершение(Результат, ПараметрыВыполнения) Экспорт - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьФайловыхКоманд() - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные <> Неопределено - И ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - - УстановитьДоступностьКоманд( - ТекущиеДанные.РедактируетТекущийПользователь, - ТекущиеДанные.Редактирует, - ТекущиеДанные.ПодписанЭП, - ТекущиеДанные.Зашифрован); - Иначе - СделатьКомандыНедоступными(); - КонецЕсли; - - ОбновитьПредпросмотр(); - -КонецПроцедуры - -&НаКлиенте -Процедура СделатьКомандыНедоступными() - - Элементы.ФормаЗакончитьРедактирование.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюЗакончитьРедактирование.Доступность = Ложь; - - Элементы.ФормаСохранитьИзменения.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюСохранитьИзменения.Доступность = Ложь; - - Элементы.ФормаОсвободить.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюОсвободить.Доступность = Ложь; - - Элементы.ФормаЗанять.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюЗанять.Доступность = Ложь; - - Элементы.ФормаРедактировать.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюРедактировать.Доступность = Ложь; - - Элементы.ФормаПодписать.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюПодписать.Доступность = Ложь; - - Элементы.ФормаСохранитьВместеСПодписью.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюСохранитьВместеСПодписью.Доступность = Ложь; - - Элементы.ФормаЗашифровать.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюЗашифровать.Доступность = Ложь; - - Элементы.ФормаРасшифровать.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюРасшифровать.Доступность = Ложь; - - Элементы.ФормаДобавитьПодписьИзФайла.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюДобавитьПодписьИзФайла.Доступность = Ложь; - - Элементы.ФормаСохранитьКак.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюСохранитьКак.Доступность = Ложь; - - Элементы.ФормаОткрытьКаталогФайла.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюОткрытьКаталогФайла.Доступность = Ложь; - - Элементы.ФормаОткрыть.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюОткрыть.Доступность = Ложь; - - Элементы.Печать.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюПечать.Доступность = Ложь; - - Элементы.Отправить.Доступность = Ложь; - Элементы.СписокКонтекстноеМенюОтправить.Доступность = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, ПодписанЭП, Зашифрован) - - Элементы.ФормаЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; - Элементы.СписокКонтекстноеМенюЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; - - Элементы.ФормаСохранитьИзменения.Доступность = РедактируетТекущийПользователь И Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюСохранитьИзменения.Доступность = РедактируетТекущийПользователь И Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаОсвободить.Доступность = ЗначениеЗаполнено(Редактирует) И Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюОсвободить.Доступность = ЗначениеЗаполнено(Редактирует) И Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаЗанять.Доступность = Не ЗначениеЗаполнено(Редактирует) И НЕ (ПодписанЭП ИЛИ Зашифрован); - Элементы.СписокКонтекстноеМенюЗанять.Доступность = Не ЗначениеЗаполнено(Редактирует) И НЕ (ПодписанЭП ИЛИ Зашифрован); - - Элементы.ФормаРедактировать.Доступность = НЕ (ПодписанЭП ИЛИ Зашифрован) И Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюРедактировать.Доступность = НЕ (ПодписанЭП ИЛИ Зашифрован) И Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаПодписать.Доступность = Не ЗначениеЗаполнено(Редактирует); - Элементы.СписокКонтекстноеМенюПодписать.Доступность = Не ЗначениеЗаполнено(Редактирует); - - Элементы.ФормаСохранитьВместеСПодписью.Доступность = ПодписанЭП; - Элементы.СписокКонтекстноеМенюСохранитьВместеСПодписью.Доступность = ПодписанЭП; - - Элементы.ФормаЗашифровать.Доступность = Не ЗначениеЗаполнено(Редактирует) И НЕ Зашифрован; - Элементы.СписокКонтекстноеМенюЗашифровать.Доступность = Не ЗначениеЗаполнено(Редактирует) И НЕ Зашифрован; - - Элементы.ФормаРасшифровать.Доступность = Зашифрован; - Элементы.СписокКонтекстноеМенюРасшифровать.Доступность = Зашифрован; - - Элементы.ФормаСохранитьКак.Доступность = Истина; - Элементы.СписокКонтекстноеМенюСохранитьКак.Доступность = Истина; - - Элементы.ФормаОткрытьКаталогФайла.Доступность = Истина; - Элементы.СписокКонтекстноеМенюОткрытьКаталогФайла.Доступность = Истина; - - Элементы.ФормаОткрыть.Доступность = Истина; - Элементы.СписокКонтекстноеМенюОткрыть.Доступность = Истина; - - Элементы.Печать.Доступность = Истина; - Элементы.СписокКонтекстноеМенюПечать.Доступность = Истина; - - Элементы.Отправить.Доступность = Истина; - Элементы.СписокКонтекстноеМенюОтправить.Доступность = Истина; - - Элементы.ФормаСоздатьИзФайла.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюСоздать.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаСоздатьИзШаблона.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.ФормаСоздатьСоСканера.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаСкопировать.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюСкопировать.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаУстановитьПометкуУдаления.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюУстановитьПометкуУдаления.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - - Элементы.ФормаИмпортФайлов.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - Элементы.СписокКонтекстноеМенюИмпортФайлов.Доступность = Не ФайлыРедактируютсяВОблачномСервисе; - -КонецПроцедуры - -&НаКлиенте -Функция ФайловыеКомандыДоступны(ФайлСсылка = Неопределено) - // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка. - - Если ФайлСсылка = Неопределено Тогда - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - КонецЕсли; - - Если ФайлСсылка = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Если ТипЗнч(ФайлСсылка) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат Ложь; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -&НаКлиенте -Процедура ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка) - // Обработчик события Перетаскивание в формах объектов - владельцев Файл (кроме формы Файлы). - // -// Параметры: - // ПараметрыПеретаскивания - Параметры перетаскивания. - // ВладелецФайлаСписка - ЛюбаяСсылка - владелец файла. - - Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() Тогда - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПараметрыПеретаскивания.Значение.ПолноеИмя); - ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайлаСписка); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Неопределено); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И Не ПараметрыПеретаскивания.Значение.ЭтоФайл() Тогда - - ПоказатьПредупреждение(, НСтр("ru = 'Выберите только файлы без каталогов.'")); - Возврат; - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("СправочникСсылка.Файлы") Тогда - - РаботаСФайламиСлужебныйКлиент.ПеренестиФайлВПриложенныеФайлы( - ПараметрыПеретаскивания.Значение, - ВладелецФайлаСписка); - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда - Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ТипПеретаскиваемого = ТипЗнч(ПараметрыПеретаскивания.Значение[0]); - Если ТипПеретаскиваемого = Тип("СправочникСсылка.Файлы") Тогда - РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПриложенныеФайлы( - ПараметрыПеретаскивания.Значение, - ВладелецФайлаСписка); - Возврат; - КонецЕсли; - - Если ТипПеретаскиваемого <> Тип("Файл") Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите файлы.'")); - Возврат; - КонецЕсли; - - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - Если Не ФайлПринятый.ЭтоФайл() Тогда // Только файлы, но не каталоги. - ПоказатьПредупреждение(, НСтр("ru = 'Выберите только файлы без каталогов.'")); - Возврат; - КонецЕсли; - КонецЦикла; - - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); - ПараметрыДобавления.Вставить("ПолноеИмяФайла", Неопределено); - ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайлаСписка); - ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); - ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Неопределено); - ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); - - ТекстыОшибок = Новый Массив; - - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - ПараметрыДобавления.ПолноеИмяФайла = ФайлПринятый.ПолноеИмя; - Результат = РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыДобавления); - Если Не Результат.ФайлДобавлен И ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда - ТекстыОшибок.Добавить(Результат.ТекстОшибки); - КонецЕсли; - КонецЦикла; - - // Вывод ошибок. - КоличествоОшибок = ТекстыОшибок.Количество(); - Если КоличествоОшибок > 0 Тогда - ПараметрыПредупреждения = Новый Структура("Текст, Подробно"); - Если КоличествоОшибок = 1 Тогда - ПараметрыПредупреждения.Текст = ТекстыОшибок[0]; - Иначе - ПараметрыПредупреждения.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При выполнении возникли ошибки (%1).'"), - Строка(КоличествоОшибок)); - Подробно = ""; - Для Каждого ТекстОшибки Из ТекстыОшибок Цикл - Если Подробно <> "" Тогда - Подробно = Подробно + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС; - КонецЕсли; - Подробно = Подробно + ТекстОшибки; - КонецЦикла; - ПараметрыПредупреждения.Подробно = Подробно; - КонецЕсли; - СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, ПараметрыПредупреждения); - КонецЕсли; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПриИзмененияИспользованияПодписанияИлиШифрования() - - ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - -КонецПроцедуры - -&НаСервере -Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура СохранитьВариантПредпросмотра(ТипСправочникаСФайлами, Предпросмотр) - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ТипСправочникаСФайлами, "Предпросмотр", Предпросмотр); -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьВидимостьПредпросмотра(ИспользоватьПредпросмотр) - - Элементы.АдресДанныхФайла.Видимость = ИспользоватьПредпросмотр; - Элементы.Предпросмотр.Пометка = ИспользоватьПредпросмотр; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьПредпросмотр() - - Если Не Предпросмотр Тогда - Возврат; - КонецЕсли; - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные <> Неопределено - И РасширенияПоддерживающиеПредпросмотр.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - АдресДанныхФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - Иначе - АдресДанныхФайла = Неопределено; - Элементы.АдресДанныхФайла.ТекстНевыбраннойКартинки = НСтр("ru = 'Нет данных для предварительного просмотра'"); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьПояснениеОблачногоСервиса() - - ВидимостьПояснения = Ложь; - - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Href, - | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись.Наименование, - | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись.Сервис КАК Сервис - |ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - |ГДЕ - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &ВладелецФайла"; - - Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла.Ссылка); - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - - ФайлыРедактируютсяВОблачномСервисе = Истина; - ВидимостьПояснения = Истина; - - АдресПапкиВОблачномСервисе = ФайловыеФункцииСлужебныйКлиентСервер.АдресВОблачномСервисе( - ВыборкаДетальныеЗаписи.Сервис, ВыборкаДетальныеЗаписи.Href); - - ЧастиСтроки = Новый Массив; - ЧастиСтроки.Добавить(НСтр("ru = 'Работа с файлами ведется в облачном сервисе'")); - ЧастиСтроки.Добавить(" "); - ЧастиСтроки.Добавить(Новый ФорматированнаяСтрока(ВыборкаДетальныеЗаписи.УчетнаяЗаписьНаименование, , , , АдресПапкиВОблачномСервисе)); - Элементы.ДекорацияПояснение.Заголовок = Новый ФорматированнаяСтрока(ЧастиСтроки); - - КонецЦикла; - КонецЕсли; - - Элементы.ГруппаПояснениеОблачногоСервиса.Видимость = ВидимостьПояснения; - -КонецПроцедуры - -&НаКлиенте -Процедура НастроитьСинхронизацию(Команда) - - НастройкаСинхронизации = ПараметрыНастройкиСинхронизации(ВладелецФайла); - - Если ЗначениеЗаполнено(НастройкаСинхронизации.УчетнаяЗапись) Тогда - ТипЗначения = Тип("РегистрСведенийКлючЗаписи.НастройкиСинхронизацииФайлов"); - ПараметрыЗаписи = Новый Массив(1); - ПараметрыЗаписи[0] = НастройкаСинхронизации; - - КлючЗаписи = Новый(ТипЗначения, ПараметрыЗаписи); - - ПараметрыЗаписи = Новый Структура; - ПараметрыЗаписи.Вставить("Ключ", КлючЗаписи); - Иначе - НастройкаСинхронизации.Вставить("ЭтоФайл", Истина); - ПараметрыЗаписи = НастройкаСинхронизации; - КонецЕсли; - - ОткрытьФорму("РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ПростаяФормаЗаписиНастройки", ПараметрыЗаписи, ЭтотОбъект); - -КонецПроцедуры - -&НаСервере -Функция ПараметрыНастройкиСинхронизации(ВладелецФайла) - - ТипВладельцаФайла = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Тип("СправочникСсылка.Файлы")); - - Отбор = Новый Структура( - "ВладелецФайла, ТипВладельцаФайла, УчетнаяЗапись", - ВладелецФайла, - ТипВладельцаФайла, - Справочники.УчетныеЗаписиСинхронизацииФайлов.ПустаяСсылка()); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | НастройкиСинхронизацииФайлов.ВладелецФайла, - | НастройкиСинхронизацииФайлов.ТипВладельцаФайла, - | НастройкиСинхронизацииФайлов.УчетнаяЗапись - |ИЗ - | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов - |ГДЕ - | НастройкиСинхронизацииФайлов.ВладелецФайла = &ВладелецФайла - | И НастройкиСинхронизацииФайлов.ТипВладельцаФайла = &ТипВладельцаФайла"; - - Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); - Запрос.УстановитьПараметр("ТипВладельцаФайла", ТипВладельцаФайла); - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Если ВыборкаДетальныеЗаписи.Количество() = 1 Тогда - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - Отбор.УчетнаяЗапись = ВыборкаДетальныеЗаписи.УчетнаяЗапись; - КонецЦикла; - КонецЕсли; - - Возврат Отбор; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form index aa35a7fd4..fc7e43088 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form @@ -1,34 +1,29 @@ - ГруппаОсновная - 145 + ГруппаОбщаяИнформация + 29 - ГруппаОсновныеДанные - 45 + ГруппаОбщиеДанные + 156 - ПолноеНаименование - 43 - - <key>ru</key> - <value>Наименование</value> - + Наименование + 102 true true true - Объект.ПолноеНаименование + Объект.Description - Top - - OnChange - ПолноеНаименованиеПриИзменении - + + ru + Имя файла (без расширения) + - ПолноеНаименованиеExtendedTooltip - 243 + НаименованиеРасширеннаяПодсказка + 104 Label true true @@ -37,8 +32,8 @@ - ПолноеНаименованиеКонтекстноеМеню - 44 + НаименованиеКонтекстноеМеню + 103 true InputField @@ -48,18 +43,16 @@ true true + true true true true - - Style.BorderColor - Normal Описание - 5 + 105 true true @@ -68,10 +61,14 @@ Объект.Описание - Top + Left + + ru + Краткое описание файла + - ОписаниеExtendedTooltip - 244 + ОписаниеРасширеннаяПодсказка + 107 Label true true @@ -81,7 +78,7 @@ ОписаниеКонтекстноеМеню - 23 + 106 true InputField @@ -89,7 +86,6 @@ true Left true - Left 2 true @@ -97,9 +93,6 @@ true true true - - Style.BorderColor - Normal @@ -110,15 +103,15 @@
        <key>ru</key> - <value>Группа основные данные</value> + <value>Общие данные</value> ru - Группа основные данные + Общие данные файла - ГруппаОсновныеДанныеExtendedTooltip - 242 + ГруппаОбщиеДанныеРасширеннаяПодсказка + 157 Label true true @@ -138,19 +131,18 @@
        ГруппаКоманды - 136 + 158 - ФормаОткрыть - 137 + ФормаОткрытьФайлДляПросмотра + 11 true true true - false - ФормаОткрытьРасширеннаяПодсказка - 246 + ФормаОткрытьФайлДляПросмотраExtendedTooltip + 63 Label true true @@ -159,26 +151,25 @@ UsualButton - Form.Command.ОткрытьФайл + Form.Command.ОткрытьФайлДляПросмотра Normal - Auto + PictureAndText true true UserCmds Auto - ФормаРедактировать - 138 + Редактировать + 160 true true true - false - ФормаРедактироватьРасширеннаяПодсказка - 247 + РедактироватьРасширеннаяПодсказка + 161 Label true true @@ -196,17 +187,16 @@ Auto - ФормаЗакончитьРедактирование - 139 + ЗакончитьРедактирование + 162 true true true - false - ФормаЗакончитьРедактированиеРасширеннаяПодсказка - 248 + ЗакончитьРедактированиеРасширеннаяПодсказка + 163 Label true true @@ -224,17 +214,16 @@ Auto - ФормаСохранитьИзменения - 142 + СохранитьИзменения + 164 true true true - false - ФормаСохранитьИзмененияРасширеннаяПодсказка - 249 + СохранитьИзмененияРасширеннаяПодсказка + 165 Label true true @@ -252,17 +241,16 @@ Auto - ФормаСохранитьКак - 144 + СохранитьКак + 166 true true true - false - ФормаСохранитьКакРасширеннаяПодсказка - 251 + СохранитьКакРасширеннаяПодсказка + 167 Label true true @@ -286,15 +274,11 @@
        <key>ru</key> - <value>Группа команды</value> + <value>Команды</value> - - ru - Группа команды - - ГруппаКомандыExtendedTooltip - 245 + ГруппаКомандыРасширеннаяПодсказка + 159 Label true true @@ -319,15 +303,15 @@
        <key>ru</key> - <value>Группа основная</value> + <value>Общая информация</value> ru - Группа основная + Общая информация о файле - ГруппаОсновнаяExtendedTooltip - 241 + ГруппаОбщаяИнформацияExtendedTooltip + 77 Label true true @@ -346,65 +330,16 @@
        ГруппаДополнительныеДанныеСтраницы - 187 + 25 ГруппаСведенияОФайле - 188 + 26 - ГруппаСведения - 112 - - ДатаСоздания - 113 - - <key>ru</key> - <value>Создан</value> - - true - true - - true - - - Объект.ДатаСоздания - - - ДатаСозданияExtendedTooltip - 255 - Label - true - true - - Left - - - - ДатаСозданияКонтекстноеМеню - 114 - true - - InputField - true - Enter - true - Left - true - Left - - true - true - true - true - true - - Style.BorderColor - - Normal - - + ГруппаСведенияЧасть1 + 30 Автор - 115 + 108 true true @@ -413,9 +348,13 @@ Объект.Автор + + ru + Пользователь, который добавил файл в список + - АвторExtendedTooltip - 256 + АвторРасширеннаяПодсказка + 110 Label true true @@ -425,7 +364,7 @@ АвторКонтекстноеМеню - 116 + 109 true InputField @@ -434,10 +373,60 @@ true Left true - Left true true + true + true + true + true + Normal + + + + Изменил + 111 + + <key>ru</key> + <value>Отредактировал</value> + + true + true + + true + + + Объект.Изменил + + + ru + Последний пользователь, который отредактировал файл + + + ИзменилРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + ИзменилКонтекстноеМеню + 112 + true + + InputField + true + Enter + true + Left + true + + true + true + true true true true @@ -446,10 +435,10 @@ ГруппаРедактирует - 219 + 201 Редактирует - 117 + 203 true true @@ -459,8 +448,8 @@ Объект.Редактирует - РедактируетExtendedTooltip - 258 + РедактируетРасширеннаяПодсказка + 205 Label true true @@ -470,7 +459,7 @@ РедактируетКонтекстноеМеню - 118 + 204 true InputField @@ -483,6 +472,7 @@ true true false + true true true true @@ -491,7 +481,7 @@ ДатаЗаема - 220 + 206 <key>ru</key> <value>с</value> @@ -505,8 +495,8 @@ <segments>Объект.ДатаЗаема</segments> </dataPath> <extendedTooltip> - <name>ДатаЗаемаExtendedTooltip</name> - <id>259</id> + <name>ДатаЗаемаРасширеннаяПодсказка</name> + <id>208</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -516,7 +506,7 @@ </extendedTooltip> <contextMenu> <name>ДатаЗаемаКонтекстноеМеню</name> - <id>221</id> + <id>207</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -528,6 +518,7 @@ <extInfo xsi:type="form:InputFieldExtInfo"> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> + <horizontalStretch>false</horizontalStretch> <wrap>true</wrap> <chooseType>true</chooseType> <typeDomainEnabled>true</typeDomainEnabled> @@ -542,15 +533,11 @@ </userVisible> <title> <key>ru</key> - <value>Группа редактирует</value> + <value>Редактирует</value> - - ru - Группа редактирует - - ГруппаРедактируетExtendedTooltip - 257 + ГруппаРедактируетРасширеннаяПодсказка + 202 Label true true @@ -568,8 +555,12 @@ - Владелец - 119 + ВладелецФайла + 173 + + <key>ru</key> + <value>Размещение</value> + true true @@ -583,8 +574,8 @@ ВладелецПриИзменении - ВладелецExtendedTooltip - 260 + ВладелецФайлаРасширеннаяПодсказка + 175 Label true true @@ -593,8 +584,8 @@ - ВладелецКонтекстноеМеню - 120 + ВладелецФайлаКонтекстноеМеню + 174 true InputField @@ -605,51 +596,10 @@ true true - true - true - true - true - Normal - - - - Код - 121 - true - true - - true - - - Объект.Code - - true - - КодExtendedTooltip - 261 - Label - true - true - - Left - - - - КодКонтекстноеМеню - 122 - true - - InputField - Enter - true - Left - true - Left - - true - true - true true + false + true + ShowInInputField true true true @@ -658,7 +608,7 @@ ХранитьВерсии - 134 + 168 true true @@ -669,8 +619,8 @@ Right - ХранитьВерсииExtendedTooltip - 274 + ХранитьВерсииРасширеннаяПодсказка + 170 Label true true @@ -680,7 +630,7 @@ ХранитьВерсииКонтекстноеМеню - 135 + 169 true CheckBoxField @@ -688,7 +638,6 @@ true Left true - Left true @@ -698,15 +647,11 @@ <key>ru</key> - <value>Сведения о файле</value> + <value>Основные сведения</value> - - ru - Группа сведения - - ГруппаСведенияExtendedTooltip - 254 + ГруппаСведенияЧасть1ExtendedTooltip + 80 Label true true @@ -718,23 +663,21 @@ Vertical Auto - WeakSeparation true true - auto Auto Auto - ГруппаВерсия - 125 + ГруппаСведенияЧасть2 + 31 - ТекущаяВерсияНомер + ДатаСоздания 126 <key>ru</key> - <value>Номер</value> + <value>Создан</value> true true @@ -742,11 +685,15 @@ true - Объект.ТекущаяВерсияНомерВерсии + Объект.ДатаСоздания + + ru + Дата добавления файла в список + - ТекущаяВерсияНомерExtendedTooltip - 266 + ДатаСозданияРасширеннаяПодсказка + 128 Label true true @@ -755,7 +702,7 @@ - ТекущаяВерсияНомерКонтекстноеМеню + ДатаСозданияКонтекстноеМеню 127 true @@ -776,11 +723,11 @@ - ТекущаяВерсияАвтор - 128 + ДатаМодификации + 123 <key>ru</key> - <value>Автор</value> + <value>Изменен</value> true true @@ -788,11 +735,15 @@ true - Объект.ТекущаяВерсияАвтор + ДатаМодификации + + ru + Дата изменения данных файла (местное время) + - ТекущаяВерсияАвторExtendedTooltip - 267 + ДатаМодификацииРасширеннаяПодсказка + 125 Label true true @@ -801,8 +752,8 @@ - ТекущаяВерсияАвторКонтекстноеМеню - 129 + ДатаМодификацииКонтекстноеМеню + 124 true InputField @@ -822,141 +773,11 @@ - ГруппаДат - 218 + ГруппаРазмерСДекорацией + 196 - ТекущаяВерсияДатаСоздания - 130 - - <key>ru</key> - <value>Создана</value> - - true - true - - true - - - Объект.ТекущаяВерсияДатаСоздания - - - ТекущаяВерсияДатаСозданияExtendedTooltip - 269 - Label - true - true - - Left - - - - ТекущаяВерсияДатаСозданияКонтекстноеМеню - 131 - true - - InputField - true - Enter - true - Left - true - - 18 - true - true - true - true - true - true - Normal - - - - ТекущаяВерсияДатаМодификацииФайла - 216 - - <key>ru</key> - <value>Изменена</value> - - true - true - - true - - - Объект.ТекущаяВерсияДатаМодификацииФайла - - - ТекущаяВерсияДатаМодификацииФайлаExtendedTooltip - 270 - Label - true - true - - Left - - - - ТекущаяВерсияДатаМодификацииФайлаКонтекстноеМеню - 217 - true - - InputField - true - Enter - true - Left - true - - 18 - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа дат</value> - - - ru - Группа дат - - - ГруппаДатExtendedTooltip - 268 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаРазмер - 222 - - ТекущаяВерсияРазмер - 132 + Размер + 120 <key>ru</key> <value>Размер</value> @@ -967,11 +788,15 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.ТекущаяВерсияРазмер</segments> + <segments>Объект.Размер</segments> </dataPath> + <toolTip> + <key>ru</key> + <value>Размер файла</value> + </toolTip> <extendedTooltip> - <name>ТекущаяВерсияРазмерExtendedTooltip</name> - <id>272</id> + <name>РазмерРасширеннаяПодсказка</name> + <id>122</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -980,8 +805,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ТекущаяВерсияРазмерКонтекстноеМеню</name> - <id>133</id> + <name>РазмерКонтекстноеМеню</name> + <id>121</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -1001,8 +826,8 @@ </extInfo> </items> <items xsi:type="form:Decoration"> - <name>ДекорацияРазмер</name> - <id>223</id> + <name>ДекорацияБайт</name> + <id>198</id> <title> <key>ru</key> <value>байт</value> @@ -1013,8 +838,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДекорацияРазмерExtendedTooltip</name> - <id>273</id> + <name>ДекорацияБайтРасширеннаяПодсказка</name> + <id>200</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1023,11 +848,12 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ДекорацияРазмерКонтекстноеМеню</name> - <id>224</id> + <name>ДекорацияБайтКонтекстноеМеню</name> + <id>199</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <extInfo xsi:type="form:LabelDecorationExtInfo"> <horizontalAlign>Left</horizontalAlign> @@ -1040,15 +866,11 @@ </userVisible> <title> <key>ru</key> - <value>Группа размер</value> + <value>Размер с декорацией</value> - - ru - Группа размер - - ГруппаРазмерExtendedTooltip - 271 + ГруппаРазмерСДекорациейРасширеннаяПодсказка + 197 Label true true @@ -1067,25 +889,25 @@ ГруппаРасширение - 225 + 182 - ТекущаяВерсияРасширение - 123 - - <key>ru</key> - <value>Расширение</value> - + Расширение + 114 true true true - Объект.ТекущаяВерсияРасширение + Объект.Расширение + + ru + Расширение файла + - ТекущаяВерсияРасширениеExtendedTooltip - 263 + РасширениеРасширеннаяПодсказка + 116 Label true true @@ -1094,8 +916,8 @@ - ТекущаяВерсияРасширениеКонтекстноеМеню - 124 + РасширениеКонтекстноеМеню + 115 true InputField @@ -1105,7 +927,6 @@ Left true - 4 true true true @@ -1117,7 +938,7 @@ ИндексКартинки - 226 + 184 true true @@ -1128,8 +949,8 @@ None - ИндексКартинкиExtendedTooltip - 264 + ИндексКартинкиРасширеннаяПодсказка + 186 Label true true @@ -1139,7 +960,7 @@ ИндексКартинкиКонтекстноеМеню - 227 + 185 true PictureField @@ -1167,15 +988,15 @@ <key>ru</key> - <value>Группа расширение</value> + <value>Расширение</value> ru - Группа расширение + Расширение файла - ГруппаРасширениеExtendedTooltip - 262 + ГруппаРасширениеРасширеннаяПодсказка + 183 Label true true @@ -1195,7 +1016,7 @@ Кодировка - 228 + 187 true true @@ -1205,8 +1026,8 @@ Кодировка - КодировкаExtendedTooltip - 275 + КодировкаРасширеннаяПодсказка + 189 Label true true @@ -1216,7 +1037,7 @@ КодировкаКонтекстноеМеню - 229 + 188 true LabelField @@ -1236,15 +1057,11 @@ <key>ru</key> - <value>Текущая версия</value> + <value>Дополнительные сведения</value> - - ru - Группа версия - - ГруппаВерсияExtendedTooltip - 265 + ГруппаСведенияЧасть2ExtendedTooltip + 81 Label true true @@ -1256,10 +1073,8 @@ Vertical Auto - WeakSeparation true true - auto Auto Auto @@ -1275,11 +1090,11 @@ ru - Группа сведения о файле + Информация о файле ГруппаСведенияОФайлеExtendedTooltip - 253 + 79 Label true true @@ -1295,10 +1110,14 @@ ГруппаЭлектронныеПодписи - 189 + 27 ЭлектронныеПодписи - 190 + 32 + + <key>ru</key> + <value>Электронные подписи</value> + true true @@ -1308,14 +1127,19 @@ ЭлектронныеПодписи None + Add Change + Copy + Delete + EndEdit MoveDown MoveUp + SelectAll SortListAsc SortListDesc ЭлектронныеПодписиКомуВыданСертификат - 193 + 35 true true @@ -1326,7 +1150,7 @@ ЭлектронныеПодписиКомуВыданСертификатРасширеннаяПодсказка - 284 + 90 Label true true @@ -1336,7 +1160,7 @@ ЭлектронныеПодписиКомуВыданСертификатКонтекстноеМеню - 194 + 36 true InputField @@ -1356,7 +1180,7 @@ ЭлектронныеПодписиДатаПодписи - 195 + 37 true true @@ -1367,7 +1191,7 @@ ЭлектронныеПодписиДатаПодписиРасширеннаяПодсказка - 285 + 91 Label true true @@ -1377,7 +1201,7 @@ ЭлектронныеПодписиДатаПодписиКонтекстноеМеню - 196 + 38 true InputField @@ -1397,7 +1221,7 @@ ЭлектронныеПодписиКомментарий - 197 + 39 true true @@ -1408,7 +1232,7 @@ ЭлектронныеПодписиКомментарийРасширеннаяПодсказка - 286 + 92 Label true true @@ -1418,7 +1242,7 @@ ЭлектронныеПодписиКомментарийКонтекстноеМеню - 198 + 40 true InputField @@ -1438,10 +1262,10 @@ ЭлектронныеПодписиПроверка - 325 + 154 ЭлектронныеПодписиСтатус - 199 + 41 true true @@ -1452,7 +1276,7 @@ ЭлектронныеПодписиСтатусРасширеннаяПодсказка - 287 + 93 Label true true @@ -1462,7 +1286,7 @@ ЭлектронныеПодписиСтатусКонтекстноеМеню - 200 + 42 true InputField @@ -1483,7 +1307,7 @@ ЭлектронныеПодписиОписаниеОшибки - 330 + 193 true true @@ -1495,7 +1319,7 @@ None ЭлектронныеПодписиОписаниеОшибкиРасширеннаяПодсказка - 332 + 195 Label true true @@ -1505,7 +1329,7 @@ ЭлектронныеПодписиОписаниеОшибкиКонтекстноеМеню - 331 + 194 true InputField @@ -1525,7 +1349,7 @@ ЭлектронныеПодписиДатаПроверкиПодписи - 322 + 151 true true @@ -1536,7 +1360,7 @@ ЭлектронныеПодписиДатаПроверкиПодписиРасширеннаяПодсказка - 324 + 153 Label true true @@ -1546,7 +1370,7 @@ ЭлектронныеПодписиДатаПроверкиПодписиКонтекстноеМеню - 323 + 152 true InputField @@ -1576,7 +1400,7 @@ ЭлектронныеПодписиПроверкаРасширеннаяПодсказка - 326 + 155 Label true true @@ -1593,10 +1417,10 @@ ЭлектронныеПодписиКоманднаяПанель - 192 + 34 ЭлектронныеПодписиПодписать - 215 + 43 true true @@ -1604,7 +1428,7 @@ ЭлектронныеПодписиПодписатьРасширеннаяПодсказка - 277 + 83 Label true true @@ -1614,6 +1438,7 @@ Form.Command.Подписать Normal + Auto true true UserCmds @@ -1621,7 +1446,7 @@ ЭлектронныеПодписиОткрыть - 201 + 44 true true @@ -1629,7 +1454,7 @@ ЭлектронныеПодписиОткрытьРасширеннаяПодсказка - 278 + 84 Label true true @@ -1647,7 +1472,7 @@ ЭлектронныеПодписиПроверить - 202 + 46 true true @@ -1655,7 +1480,7 @@ ЭлектронныеПодписиПроверитьРасширеннаяПодсказка - 279 + 85 Label true true @@ -1663,7 +1488,7 @@ Left - Form.Command.Проверить + Form.Command.ПроверитьЭП Normal Auto true @@ -1673,7 +1498,7 @@ ЭлектронныеПодписиПроверитьВсе - 203 + 47 true true @@ -1681,7 +1506,7 @@ ЭлектронныеПодписиПроверитьВсеРасширеннаяПодсказка - 280 + 86 Label true true @@ -1699,7 +1524,7 @@ ЭлектронныеПодписиУдалить - 205 + 45 true true @@ -1707,7 +1532,7 @@ ЭлектронныеПодписиУдалитьРасширеннаяПодсказка - 282 + 88 Label true true @@ -1715,7 +1540,7 @@ Left - Form.Command.Удалить + Form.Command.УдалитьЭП Normal Auto true @@ -1725,7 +1550,7 @@ ЭлектронныеПодписиСохранить - 204 + 48 true true @@ -1733,7 +1558,7 @@ ЭлектронныеПодписиСохранитьРасширеннаяПодсказка - 281 + 87 Label true true @@ -1741,7 +1566,7 @@ Left - Form.Command.Сохранить + Form.Command.СохранитьПодпись Normal Auto true @@ -1757,10 +1582,10 @@ ЭлектронныеПодписиСтрокаПоиска - 302 + 131 ЭлектронныеПодписиСтрокаПоискаРасширеннаяПодсказка - 304 + 133 Label true true @@ -1770,7 +1595,7 @@ ЭлектронныеПодписиСтрокаПоискаКонтекстноеМеню - 303 + 132 true ЭлектронныеПодписи @@ -1780,10 +1605,10 @@ ЭлектронныеПодписиСостояниеПросмотра - 305 + 134 ЭлектронныеПодписиСостояниеПросмотраРасширеннаяПодсказка - 307 + 136 Label true true @@ -1793,7 +1618,7 @@ ЭлектронныеПодписиСостояниеПросмотраКонтекстноеМеню - 306 + 135 true ViewStatusAddition @@ -1804,10 +1629,10 @@ ЭлектронныеПодписиУправлениеПоиском - 308 + 137 ЭлектронныеПодписиУправлениеПоискомРасширеннаяПодсказка - 310 + 139 Label true true @@ -1817,7 +1642,7 @@ ЭлектронныеПодписиУправлениеПоискомКонтекстноеМеню - 309 + 138 true SearchControlAddition @@ -1828,7 +1653,7 @@ ЭлектронныеПодписиРасширеннаяПодсказка - 283 + 89 Label true true @@ -1838,16 +1663,17 @@ ЭлектронныеПодписиКонтекстноеМеню - 191 + 33 true true + true + true true true 1 true MultiRow - Row
        true
        1 1 @@ -1871,7 +1697,7 @@
        Инструкция - 327 + 190 <key>ru</key> <value>Типичные проблемы при работе с программами электронной подписи и их решение</value> @@ -1883,7 +1709,7 @@ </userVisible> <extendedTooltip> <name>ИнструкцияРасширеннаяПодсказка</name> - <id>329</id> + <id>192</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1893,7 +1719,7 @@ </extendedTooltip> <contextMenu> <name>ИнструкцияКонтекстноеМеню</name> - <id>328</id> + <id>191</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -1916,13 +1742,10 @@ <key>ru</key> <value>Электронные подписи</value> - - ru - Электронные подписи - + None ГруппаЭлектронныеПодписиРасширеннаяПодсказка - 276 + 82 Label true true @@ -1939,10 +1762,14 @@ ГруппаСертификатыШифрования - 206 + 28 СертификатыШифрования - 207 + 49 + + <key>ru</key> + <value>Сертификаты</value> + true true @@ -1953,9 +1780,13 @@ None Change + + ru + Сертификаты + СертификатыШифрованияПредставление - 212 + 55 true true @@ -1964,10 +1795,9 @@ СертификатыШифрования.Представление - None СертификатыШифрованияПредставлениеExtendedTooltip - 291 + 97 Label true true @@ -1977,7 +1807,7 @@ СертификатыШифрованияПредставлениеКонтекстноеМеню - 213 + 56 true InputField @@ -1997,10 +1827,10 @@ СертификатыШифрованияКоманднаяПанель - 209 + 51 СертификатыШифрованияОткрыть - 214 + 54 true true @@ -2008,7 +1838,7 @@ СертификатыШифрованияОткрытьРасширеннаяПодсказка - 289 + 95 Label true true @@ -2032,10 +1862,10 @@ СертификатыШифрованияСтрокаПоиска - 311 + 140 СертификатыШифрованияСтрокаПоискаРасширеннаяПодсказка - 313 + 142 Label true true @@ -2045,7 +1875,7 @@ СертификатыШифрованияСтрокаПоискаКонтекстноеМеню - 312 + 141 true СертификатыШифрования @@ -2055,10 +1885,10 @@ СертификатыШифрованияСостояниеПросмотра - 314 + 143 СертификатыШифрованияСостояниеПросмотраРасширеннаяПодсказка - 316 + 145 Label true true @@ -2068,7 +1898,7 @@ СертификатыШифрованияСостояниеПросмотраКонтекстноеМеню - 315 + 144 true ViewStatusAddition @@ -2079,10 +1909,10 @@ СертификатыШифрованияУправлениеПоиском - 317 + 146 СертификатыШифрованияУправлениеПоискомРасширеннаяПодсказка - 319 + 148 Label true true @@ -2092,7 +1922,7 @@ СертификатыШифрованияУправлениеПоискомКонтекстноеМеню - 318 + 147 true SearchControlAddition @@ -2103,7 +1933,7 @@ СертификатыШифрованияExtendedTooltip - 290 + 96 Label true true @@ -2113,7 +1943,7 @@ СертификатыШифрованияКонтекстноеМеню - 208 + 50 true true @@ -2155,7 +1985,7 @@ None ГруппаСертификатыШифрованияРасширеннаяПодсказка - 288 + 94 Label true true @@ -2165,14 +1995,13 @@ Page - Vertical auto false ГруппаДополнительныеРеквизиты - 320 + 171 true true @@ -2180,11 +2009,11 @@ <key>ru</key> - <value>Дополнительные реквизиты</value> + <value>Дополнительно</value> ГруппаДополнительныеРеквизитыРасширеннаяПодсказка - 321 + 172 Label true true @@ -2206,15 +2035,15 @@ <key>ru</key> - <value>Группа дополнительные данные страницы</value> + <value>Дополнительные данные страницы</value> ru - Группа дополнительные данные страницы + Дополнительные данные ГруппаДополнительныеДанныеСтраницыExtendedTooltip - 252 + 78 Label true true @@ -2236,17 +2065,16 @@ ФормаКоманднаяПанель -1 - ФормаЗанять - 140 + ФормаЗаписатьИЗакрыть + 178 true true true - false - ФормаЗанятьРасширеннаяПодсказка - 231 + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 179 Label true true @@ -2254,7 +2082,84 @@ Left - Form.Command.Занять + Form.Command.СтандартнаяЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписать + 180 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + Form.Command.СтандартнаяЗаписать + Normal + true + true + UserCmds + Auto + + + ФормаСкопировать + 219 + true + true + + true + + + ФормаСкопироватьРасширеннаяПодсказка + 220 + Label + true + true + + Left + + + Form.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + ФормаПоказатьВСписке + 149 + true + true + + true + + + ФормаПоказатьВСпискеРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Form.Command.ПоказатьВСписке Normal Auto true @@ -2263,9 +2168,89 @@ Auto InAdditionalSubmenu + + ПодменюПечать + 213 + + Печать + 215 + true + true + + true + + + ПечатьРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Form.Command.Печать + Normal + Auto + true + true + UserCmds + Auto + + + ПечатьСоШтампом + 217 + true + true + + true + + + ПечатьСоШтампомРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + Form.Command.ПечатьСоШтампом + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Печать</value> + + + ПодменюПечатьРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + Popup + + Auto + Normal + + ФормаГлобальныеКоманды - 296 + 98 true true @@ -2277,12 +2262,12 @@ ru - Форма глобальные команды + Общие команды работы с файлами None ФормаГлобальныеКомандыРасширеннаяПодсказка - 297 + 99 Label true true @@ -2294,23 +2279,49 @@ FormCommandPanelGlobalCommands + + ФормаОтправить + 211 + true + true + + true + + + ФормаОтправитьРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + Form.Command.Отправить + Normal + Auto + true + true + UserCmds + Auto + ФормаГруппаКомандЭлектроннаяПодписьИШифрование - 155 + 17 ФормаГруппаКомандЭлектроннаяПодпись - 300 + 129 - ФормаПодписать - 148 + ФормаПодписатьФайлЭП + 19 true true true - ФормаПодписатьExtendedTooltip - 235 + ФормаПодписатьФайлЭПРасширеннаяПодсказка + 71 Label true true @@ -2325,19 +2336,18 @@ true UserCmds Auto - InAdditionalSubmenu - ФормаДобавитьПодписьИзФайла - 152 + ФормаДобавитьЭПИзФайла + 20 true true true - ФормаДобавитьПодписьИзФайлаРасширеннаяПодсказка - 236 + ФормаДобавитьЭПИзФайлаРасширеннаяПодсказка + 72 Label true true @@ -2345,26 +2355,25 @@ Left - Form.Command.ДобавитьПодписьИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true true UserCmds Auto - InAdditionalSubmenu - ФормаСохранитьВместеСПодписью - 154 + ФормаСохранитьВместеСЭП + 21 true true true - ФормаСохранитьВместеСПодписьюРасширеннаяПодсказка - 237 + ФормаСохранитьВместеСЭПРасширеннаяПодсказка + 73 Label true true @@ -2372,14 +2381,13 @@ Left - Form.Command.СохранитьВместеСПодписью + Form.Command.СохранитьВместеСЭП Normal Auto true true UserCmds Auto - InAdditionalSubmenu true true @@ -2392,7 +2400,7 @@ ФормаГруппаКомандЭлектроннаяПодписьРасширеннаяПодсказка - 301 + 130 Label true true @@ -2404,10 +2412,10 @@ ФормаГруппаКомандШифрование - 149 + 18 ФормаЗашифровать - 150 + 22 true true @@ -2415,7 +2423,7 @@ ФормаЗашифроватьExtendedTooltip - 239 + 75 Label true true @@ -2430,11 +2438,10 @@ true UserCmds Auto - InAdditionalSubmenu ФормаРасшифровать - 151 + 23 true true @@ -2442,7 +2449,7 @@ ФормаРасшифроватьExtendedTooltip - 240 + 76 Label true true @@ -2457,7 +2464,6 @@ true UserCmds Auto - InAdditionalSubmenu true true @@ -2466,11 +2472,11 @@
        <key>ru</key> - <value>Шифрование</value> + <value>Форма группа команд шифрование</value> ФормаГруппаКомандШифрованиеРасширеннаяПодсказка - 238 + 74 Label true true @@ -2491,11 +2497,11 @@ ru - Электронная подпись и шифрование + Команды работы с электронной подписью и шифрованием ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка - 233 + 70 Label true true @@ -2512,20 +2518,47 @@ Normal
        + + ФормаСтандартныеУстановитьПометкуУдаления + 5 + true + true + + true + + + ФормаСтандартныеУстановитьПометкуУдаленияExtendedTooltip + 61 + Label + true + true + + Left + + + Form.Command.СтандартныеУстановитьПометкуУдаления + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + - ФормаДополнительныеКоманды - 298 + ФормаГруппаДополнительныеКоманды + 100 - ФормаСкопировать - 294 + ФормаСохранитьКак + 12 true true true - ФормаСкопироватьРасширеннаяПодсказка - 295 + ФормаСохранитьКакExtendedTooltip + 67 Label true true @@ -2533,25 +2566,26 @@ Left - Form.StandardCommand.Copy + Form.Command.СохранитьКак Normal Auto true true UserCmds Auto + InAdditionalSubmenu - ФормаУстановитьПометкуУдаления - 292 + ФормаОсвободить + 16 true true true - ФормаУстановитьПометкуУдаленияРасширеннаяПодсказка - 293 + ФормаОсвободитьExtendedTooltip + 66 Label true true @@ -2559,34 +2593,7 @@ Left - Form.StandardCommand.SetDeletionMark - Normal - Auto - true - true - UserCmds - Auto - - - ФормаОтменитьРедактирование - 141 - true - true - - true - - false - - ФормаОтменитьРедактированиеРасширеннаяПодсказка - 230 - Label - true - true - - Left - - - Form.Command.ОтменитьРедактирование + Form.Command.Освободить Normal Auto true @@ -2597,16 +2604,15 @@ ФормаОбновитьИзФайлаНаДиске - 146 + 24 true true true - false - ФормаОбновитьИзФайлаНаДискеРасширеннаяПодсказка - 232 + ФормаОбновитьИзФайлаНаДискеExtendedTooltip + 68 Label true true @@ -2625,16 +2631,15 @@ ФормаОткрытьКаталогФайла - 143 + 13 true true true - false - ФормаОткрытьКаталогФайлаРасширеннаяПодсказка - 250 + ФормаОткрытьКаталогФайлаExtendedTooltip + 69 Label true true @@ -2658,16 +2663,16 @@ <key>ru</key> - <value>Форма дополнительные команды</value> + <value>Форма группа дополнительные команды</value> ru - Форма дополнительные команды + Дополнительные команды None - ФормаДополнительныеКомандыРасширеннаяПодсказка - 299 + ФормаГруппаДополнительныеКомандыРасширеннаяПодсказка + 101 Label true true @@ -2678,7 +2683,6 @@ Left - true NotificationProcessing @@ -2688,22 +2692,23 @@ OnOpen ПриОткрытии - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере + + OnClose + ПриЗакрытии + FillCheckProcessingAtServer ОбработкаПроверкиЗаполненияНаСервере Delete + Write + WriteAndClose DontBlock true - true true Vertical true @@ -2712,10 +2717,15 @@ auto true - Объект + ДатаМодификации + + <key>ru</key> + <value>Дата модификации</value> + 1 - CatalogObject.Файлы + Date + true @@ -2723,22 +2733,17 @@ true - - Объект.ТекстХранилище - -
        true
        true
        - НадписьКатегории + ЗначениеКопирования <key>ru</key> - <value>Надпись категории</value> + <value>Значение копирования</value> 2 - String - + AnyRef true @@ -2748,61 +2753,12 @@ - НовыйФайл + ИмяСправочника <key>ru</key> - <value>Новый файл</value> + <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 @@ -2815,83 +2771,15 @@ - ФайлРедактировался + ТекущийПользователь <key>ru</key> - <value>Файл редактировался</value> - - 9 - - Boolean - - - true - - - true - - - - НаименованиеДоЗаписи - - <key>ru</key> - <value>Наименование до записи</value> + <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 + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи true @@ -2906,7 +2794,7 @@ ru Электронные подписи - 13 + 6 ValueTable @@ -2996,7 +2884,7 @@ 5 - CatalogRef.ВерсииФайлов + AnyRef true @@ -3058,26 +2946,6 @@ true - - ИндексКартинки - - <key>ru</key> - <value>Индекс картинки</value> - - 9 - - Number - - 10 - - - - true - - - true - - УстановившийПодпись @@ -3101,7 +2969,7 @@ <key>ru</key> <value>Адрес сертификата</value> - 12 + 9 String @@ -3131,6 +2999,24 @@ true + + ПорядковыйНомер + + <key>ru</key> + <value>Порядковый номер</value> + + 12 + + Number + + + + true + + + true + + ОписаниеОшибки @@ -3156,7 +3042,7 @@ <key>ru</key> <value>Сертификаты шифрования</value> - 12 + 7 ValueTable @@ -3220,6 +3106,26 @@ true + + ПорядковыйНомер + + <key>ru</key> + <value>Порядковый номер</value> + + 4 + + Number + + 10 + + + + true + + + true + + ОписаниеКолонокТаблицыПодписей @@ -3227,7 +3133,7 @@ ru Описание колонок таблицы подписей - 14 + 8 true @@ -3237,64 +3143,12 @@ - ТекущийПользователь + ФайлБылСоздан <key>ru</key> - <value>Текущий пользователь</value> + <value>Файл был создан</value> - 15 - - CatalogRef.Пользователи - - - true - - - true - - - - Кодировка - - <key>ru</key> - <value>Кодировка</value> - - 16 - - String - - - - true - - - true - - - - ПолученОтветНаВопросФайлЗанят - - <key>ru</key> - <value>Получен ответ на вопрос файл занят</value> - - 17 - - Boolean - - - true - - - true - - - - ПолученОтветНаВопросОткрытьДляРедактирования - - <key>ru</key> - <value>Получен ответ на вопрос открыть для редактирования</value> - - 18 + 9 Boolean @@ -3311,7 +3165,7 @@ ru Файл редактируется в облаке - 19 + 12 Boolean @@ -3323,17 +3177,33 @@ - КоличествоЗанятыхФайлов + Объект <key>ru</key> - <value>Количество занятых файлов</value> + <value>Объект</value> - 20 + 13 - Number - - 10 - + CatalogObject.Файлы + + + true + + + true + +
        true
        + true +
        + + ВозможностьСоздаватьВерсииФайлов + + <key>ru</key> + <value>Возможность создавать версии файлов</value> + + 14 + + Boolean true @@ -3343,14 +3213,15 @@ - ЗапрещенныеРасширения + Кодировка <key>ru</key> - <value>Запрещенные расширения</value> + <value>Кодировка</value> - 21 + 15 - ValueList + String + true @@ -3358,20 +3229,76 @@ true - - - - - Записать + + НаименованиеДоЗаписи <key>ru</key> - <value>Записать</value> + <value>Наименование до записи</value> + + 16 + + String + + + + true + + + true + + + + ПараметрыОтправки + + <key>ru</key> + <value>Параметры отправки</value> + + 17 + + + true + + + true + + + + СтандартнаяЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> 1 + ru + Записать объект и закрыть форму + + + true + + + StdPicture.WriteAndClose + + + + СтандартнаяЗаписатьИЗакрыть + + + Text + DontUse + Auto + + + СтандартнаяЗаписать + <key>ru</key> <value>Записать</value> + + 2 + + ru + Записать файл true @@ -3382,45 +3309,67 @@ - ЗаписатьВыполнить + СтандартнаяЗаписать - Picture DontUse Auto - Скопировать + СтандартныеУстановитьПометкуУдаления <key>ru</key> - <value>Скопировать</value> + <value>Пометить на удаление / Снять пометку</value> - 2 + 5 ru - Скопировать + Пометить на удаление / Снять пометку true - StdPicture.CloneObject + StdPicture.MarkToDelete - СкопироватьВыполнить + СтандартныеУстановитьПометкуУдаления DontUse Auto - ОткрытьФайл + Подписать + + <key>ru</key> + <value>Подписать...</value> + + 7 + + ru + Подписать файл + + + true + + + + Подписать + + + TextPicture + DontUse + Auto + + + ОткрытьФайлДляПросмотра <key>ru</key> <value>Просмотреть</value> - 3 + 9 ru Открыть файл для просмотра @@ -3433,138 +3382,7 @@ - ОткрытьФайлВыполнить - - - TextPicture - DontUse - Auto - - - Редактировать - - <key>ru</key> - <value>Редактировать</value> - - 4 - - ru - Открыть файл для редактирования - - - true - - - CommonPicture.РедактироватьФайл - - - - Редактировать - - - TextPicture - true - DontUse - Auto - - - Занять - - <key>ru</key> - <value>Занять</value> - - 5 - - ru - Пометить файл как занятый для редактирования - - - true - - - CommonPicture.ЗанятьФайл - - - - Занять - - - TextPicture - true - DontUse - Auto - - - ОтменитьРедактирование - - <key>ru</key> - <value>Отменить редактирование</value> - - 6 - - ru - Освободить занятый файл - - - true - - - CommonPicture.ОсвободитьФайл - - - - ОтменитьРедактирование - - - TextPicture - true - DontUse - Auto - - - СохранитьИзменения - - <key>ru</key> - <value>Сохранить изменения</value> - - 7 - - ru - Сохранить измененный файл в информационной базе - - - true - - - CommonPicture.ОпубликоватьФайл - - - - СохранитьИзменения - - - TextPicture - true - DontUse - Auto - - - ОткрытьКаталогФайла - - <key>ru</key> - <value>Открыть каталог файла</value> - - 8 - - ru - Открыть каталог файла - - - true - - - - ОткрытьКаталогФайла + ОткрытьФайлДляПросмотра TextPicture @@ -3577,7 +3395,7 @@ ru Сохранить как... - 9 + 10 ru Сохранить файл на диск или другое устройство @@ -3597,13 +3415,62 @@ DontUse Auto + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 11 + + ru + Открыть каталог файла + + + true + + + + ОткрытьКаталогФайла + + + DontUse + Auto + + + Редактировать + + <key>ru</key> + <value>Редактировать</value> + + 12 + + ru + Занять файл и открыть для редактирования + + + true + + F4 + + CommonPicture.РедактироватьФайл + + + + Редактировать + + + TextPicture + DontUse + Auto + ЗакончитьРедактирование <key>ru</key> <value>Закончить редактирование</value> - 10 + 13 ru Сохранить и освободить файл в информационной базе @@ -3620,56 +3487,52 @@ TextPicture - true DontUse Auto - ОбновитьИзФайлаНаДиске + Освободить <key>ru</key> - <value>Обновить из файла на диске</value> + <value>Отменить редактирование</value> - 11 + 14 ru - Обновить из файла на диске + Освободить занятый файл true - CommonPicture.ОбновитьФайлИзФайлаНаДиске + CommonPicture.ОсвободитьФайл - ОбновитьИзФайлаНаДиске + Освободить - Text + TextPicture DontUse Auto - Подписать + ДобавитьЭПИзФайла <key>ru</key> - <value>Подписать...</value> + <value>Добавить электронную подпись из файла...</value> - 12 + 6 ru - Подписать файл + Добавить электронную подпись из файла true - - CommonPicture.ПодписанЭП - - Подписать + ДобавитьЭПИзФайла DontUse @@ -3681,7 +3544,7 @@ ru Зашифровать... - 13 + 8 ru Зашифровать @@ -3706,7 +3569,7 @@ ru Расшифровать... - 14 + 15 ru Расшифровать @@ -3723,29 +3586,7 @@ Auto - ДобавитьПодписьИзФайла - - <key>ru</key> - <value>Добавить электронную подпись из файла...</value> - - 15 - - ru - Добавить электронную подпись из файла - - - true - - - - ДобавитьПодписьИзФайла - - - DontUse - Auto - - - СохранитьВместеСПодписью + СохранитьВместеСЭП <key>ru</key> <value>Сохранить вместе с электронной подписью...</value> @@ -3753,26 +3594,49 @@ <id>16</id> <toolTip> <key>ru</key> - <value>Сохранить вместе с электронной подписью</value> + <value>Сохранить файл на диск или другое устройство вместе с электронной подписью</value> </toolTip> <use> <common>true</common> </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СохранитьВместеСПодписью</name> + <name>СохранитьВместеСЭП</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОбновитьИзФайлаНаДиске</name> + <title> + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 17 + + ru + Обновить из файла на диске + + + true + + + + ОбновитьИзФайлаНаДиске + + + Text + DontUse + Auto + ОткрытьПодпись <key>ru</key> <value>Открыть</value> - 17 + 18 ru Открыть подпись @@ -3782,19 +3646,19 @@ - ОткрытьПодпись + КомандаЭПСписокОткрытьПодпись DontUse Auto - Проверить + ПроверитьЭП <key>ru</key> <value>Проверить</value> - 18 + 19 ru Проверить выделенные подписи @@ -3804,20 +3668,42 @@ - Проверить + ПроверитьЭП true DontUse Auto + + УдалитьЭП + + <key>ru</key> + <value>Удалить</value> + + 20 + + ru + Удалить выделенные подписи + + + true + + + + УдалитьЭП + + + DontUse + Auto + ПроверитьВсе <key>ru</key> <value>Проверить все</value> - 19 + 21 ru Проверить все подписи @@ -3835,12 +3721,12 @@ Auto - Сохранить + СохранитьПодпись <key>ru</key> <value>Сохранить...</value> - 20 + 22 ru Сохранить подпись в файл @@ -3850,29 +3736,7 @@ - Сохранить - - - DontUse - Auto - - - Удалить - - <key>ru</key> - <value>Удалить</value> - - 21 - - ru - Удалить выделенные подписи - - - true - - - - Удалить + СохранитьПодпись DontUse @@ -3884,7 +3748,7 @@ ru Открыть сертификат - 22 + 23 ru Открыть сертификат @@ -3900,18 +3764,164 @@ DontUse Auto + + ПоказатьВСписке + + <key>ru</key> + <value>Показать в списке</value> + + 24 + + ru + Показать в списке + + + true + + + StdPicture.ShowInList + + + + ПоказатьВСписке + + + DontUse + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 25 + + ru + Сохранить измененный файл в информационной базе + + + true + + + CommonPicture.ОпубликоватьФайл + + + + СохранитьИзменения + + + TextPicture + true + DontUse + Auto + + + Отправить + + <key>ru</key> + <value>Отправить</value> + + 26 + + ru + Отправить + + + true + + + + Отправить + + + DontUse + Auto + + + Печать + + <key>ru</key> + <value>Сразу на принтер</value> + + 27 + + ru + Сразу на принтер + + + true + + + + Печать + + + DontUse + Auto + + + ПечатьСоШтампом + + <key>ru</key> + <value>Со штампом электронной подписи...</value> + + 28 + + ru + Печать со штампом электронной подписи + + + true + + + + ПечатьСоШтампом + + + DontUse + Auto + - ФайлОснование + Ключ - CatalogRef.Файлы + AnyRef true - ВладелецФайла - + ЗначениеКопирования + + AnyRef + true + + ЭтоНовый + + Boolean + + + + ПрисоединенныйФайл + + AnyRef + + true + + + ИмяСправочникаХранилищаФайлов + + String + + + + + ВладелецФайла + + AnyRef + + РежимСоздания @@ -3919,42 +3929,41 @@ + + ПараметрыОтправки + + 0 - 2 - - true - - - - 0 - - true - - - - 0 + Added + FormNavigationPanelGoTo + 0 true 0 + Added + FormNavigationPanelGoTo 1 true - 0 - - true - + InformationRegister.ДвоичныеДанныеФайлов.StandardCommand.OpenByValue.Файл + FormNavigationPanelGoTo + 2 + - 0 + CommonCommand.ВерсииФайла + Added + FormNavigationPanelGoTo + 3 true @@ -3963,10 +3972,6 @@ - - AfterWrite - ПослеЗаписи - AfterWriteAtServer ПослеЗаписиНаСервере @@ -3975,13 +3980,13 @@ OnReadAtServer ПриЧтенииНаСервере - - BeforeWrite - ПередЗаписью - BeforeWriteAtServer ПередЗаписьюНаСервере + + OnWriteAtServer + ПриЗаписиНаСервере + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html index e1d626fb0..1898d778c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html @@ -1,46 +1,66 @@ -

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

        -

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

        +

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

        +

        Открывается из списка присоединенных файлов с помощью команды Еще - Открыть карточку (клавиши F2).

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

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

        Текущая версия

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

          Хранение версий

          +
          Расширение - расширение (формат) файла.

        Редактирование присоединенного файла

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

        При использовании ЭП и шифрования становятся доступными вкладки:

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

      Сохранение файла

      +
      • +
        С помощью команды Еще - Сохранить как можно сохранить файл в указанный каталог на жестком или сетевом диске.
        +
      • +
        Соответствующей командой меню Еще можно Открыть каталог файла в Проводнике Windows;

      Обновление файла

      +
      • С помощью команды Еще - Обновить из файла на диске можно обновить файл из оригинального файла на диске (из которого изначально был создан файл в программе).

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

      +

      При использовании электронной подписи становится доступным выпадающее меню Еще - Электронная подпись и шифрование, которое содержит команды для работы с электронной подписью файлов:

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

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

      При использовании электронной подписи и шифрования становятся доступными вкладки:

      Электронные подписи

      -

      На вкладке размещаются сведения об электронной подписи файла:

      -
      • Автор подписи - пользователь, который подписал файл; +

        На вкладке размещаются сведения об электронной подписи файла:

        +
        • Автор подписи - пользователь, который подписал файл;
        • Дата подписи - дата подписания файла;
        • Комментарий - напишите дополнительные сведения о подписи; -
        • Статус - истинность подписи.

        С помощью соответствующих команд можно:

        +
      • Статус, Дата проверки - истинность подписи и дата ее проверки.

      С помощью соответствующих кнопок можно:

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

      Разрешено расшифровывать

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

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

      -

      См. также:

      - \ No newline at end of file +
      В списке на этой вкладке отображаются сертификаты, с помощью которых зашифрован файл. Двойным щелчком мыши или с помощью соответствующей кнопки можно Открыть сертификат электронной подписи и просмотреть его основные свойства: кому и кем выдан, назначение и срок действия сертификата.

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl index 608b4a7c3..58438a277 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl @@ -3,230 +3,88 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; - ТекущийПользователь = Пользователи.ТекущийПользователь(); - - КолонкиМассив = Новый Массив; - Для Каждого ОписаниеКолонки Из РеквизитФормыВЗначение("ЭлектронныеПодписи").Колонки Цикл - КолонкиМассив.Добавить(ОписаниеКолонки.Имя); - КонецЦикла; - ОписаниеКолонокТаблицыПодписей = Новый ФиксированныйМассив(КолонкиМассив); - - ДанныеФайлаКорректны = Ложь; - - РежимСоздания = Параметры.РежимСоздания; - - Если Параметры.Ключ = Неопределено Или Параметры.Ключ.Пустая() Тогда + РаботаСФайламиСлужебный.ФормаЭлементаПриСозданииНаСервере( + ЭтотОбъект, Отказ, СтандартнаяОбработка, Параметры, ТолькоПросмотр); - НовыйФайл = Истина; + ПараметрыОтправки = ?(ЗначениеЗаполнено(Параметры.ПараметрыОтправки), + Параметры.ПараметрыОтправки, РаботаСФайламиСлужебный.ПодготовитьСтруктуруПараметровОтправки()); - Если Параметры.ЗначениеКопирования.Пустая() Тогда - Объект.ВладелецФайла = Параметры.ВладелецФайла; - Иначе - Объект.ТекущаяВерсия = Справочники.ВерсииФайлов.ПустаяСсылка(); - Параметры.ФайлОснование = Параметры.ЗначениеКопирования; - КонецЕсли; - - КонецЕсли; - - ДокОснование = Параметры.ФайлОснование; - Если Не ДокОснование.Пустая() Тогда - - Объект.ПолноеНаименование = ДокОснование.ПолноеНаименование; - Объект.Наименование = Объект.ПолноеНаименование; - Объект.ХранитьВерсии = ДокОснование.ХранитьВерсии; - - КонецЕсли; - - Если Не Объект.Ссылка.Пустая() Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ДанныеФайлаКорректны = Истина; - КонецЕсли; - - ТипВладельца = ТипЗнч(Объект.ВладелецФайла); - Элементы.Владелец.Заголовок = ТипВладельца; - - НовыйФайлЗаписан = Ложь; - // СтандартныеПодсистемы.Свойства Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты"); + ДополнительныеПараметры.Вставить("Объект", Объект); ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина); МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры); КонецЕсли; // Конец СтандартныеПодсистемы.Свойства - Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда - ОбновитьПолныйПуть(); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + + ДоступнаПечатьСоШтампом = + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") + И ЭтотОбъект.Объект.Расширение = "mxl" + И ЭтотОбъект.Объект.ПодписанЭП; + + Элементы.ПечатьСоШтампом.Видимость = ДоступнаПечатьСоШтампом; + Если Не ДоступнаПечатьСоШтампом Тогда + Элементы.ПодменюПечать.Вид = ВидГруппыФормы.ГруппаКнопок; + Элементы.Печать.Заголовок = НСтр("ru = 'Печать'"); КонецЕсли; - Если Не Параметры.ФайлОснование.Пустая() Тогда - ФайлОснованиеПодписан = Параметры.ФайлОснование.ПодписанЭП; - КонецЕсли; - - ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - ОбщиеНастройки = МодульЭлектроннаяПодпись.ОбщиеНастройки(); - - Если ОбщиеНастройки.ИспользоватьЭлектронныеПодписи Тогда - ЗаполнитьСписокПодписей(); - КонецЕсли; - - Если ОбщиеНастройки.ИспользоватьШифрование Тогда - ЗаполнитьСписокШифрования(); - КонецЕсли; - КонецЕсли; - - ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - - РасширениеФайлаВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( - ОбщиеНастройки.СписокРасширенийТекстовыхФайлов, Объект.ТекущаяВерсияРасширение); - - Если РасширениеФайлаВСписке Тогда - Если ЗначениеЗаполнено(Объект.ТекущаяВерсия) Тогда - - КодировкаЗначение = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла( - Объект.ТекущаяВерсия); - - СписокКодировок = РаботаСФайламиСлужебный.Кодировки(); - ЭлементСписка = СписокКодировок.НайтиПоЗначению(КодировкаЗначение); - Если ЭлементСписка = Неопределено Тогда - Кодировка = КодировкаЗначение; - Иначе - Кодировка = ЭлементСписка.Представление; - КонецЕсли; - - КонецЕсли; - - Если Не ЗначениеЗаполнено(Кодировка) Тогда - Кодировка = НСтр("ru = 'По умолчанию'"); - КонецЕсли; - - Иначе - Элементы.Кодировка.Видимость = Ложь; - КонецЕсли; - - Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); - - Если Не МодульУправлениеДоступом.ЕстьПраво("ИзменениеФайлов", Объект.ВладелецФайла) Тогда - ТолькоПросмотр = Истина; - КонецЕсли; - КонецЕсли; - - СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект, "ГруппаСведения"); - СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект, "ГруппаВерсия"); - - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда - ФайлРедактируетсяВОблаке = ФайловыеФункцииСлужебный.ФайлРедактируетсяВОблаке(Объект.Ссылка); - КонецЕсли; - - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); + ОбновитьЗаголовок(); + ОбновитьПолныйПуть(); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - УстановитьДоступностьЭлементовФормы(); - НаименованиеДоЗаписи = Объект.Наименование; - Если Не Параметры.ФайлОснование.Пустая() И ФайлОснованиеПодписан Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" подписан. - |Копирование сведений об ЭП в новый файл сделает его недоступным для изменения. - | - |Скопировать сведения об ЭП в новый файл?'"), - Строка(Параметры.ФайлОснование)); - Обработчик = Новый ОписаниеОповещения("ПриОткрытииПослеОтветаНаВопросСкопироватьСведения", ЭтотОбъект); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Возврат; - КонецЕсли; + ДатаМодификации = МестноеВремя(ЭтотОбъект.Объект.ДатаМодификацииУниверсальная); - ПриОткрытииЗавершение(); + УстановитьДоступностьКомандСпискаЭП(); + УстановитьДоступностьКомандСпискаШифрования(); - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); - КонецЕсли; + ПрочитатьСертификатыПодписей(); КонецПроцедуры &НаКлиенте -Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) +Процедура ПриЗакрытии(ЗавершениеРаботы) Если ЗавершениеРаботы Тогда Возврат; КонецЕсли; - - Если ФайлРедактировался И Не ПолученОтветНаВопросФайлЗанят Тогда - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); - Если ПараметрыРаботыКлиента.АвторизованныйПользователь = Объект.Редактирует Тогда - ТекстВопроса = НСтр("ru = 'Файл занят для редактирования. - | - |Закрыть карточку?'"); - ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(ЭтотОбъект, Отказ, ЗавершениеРаботы, ТекстВопроса, "ПолученОтветНаВопросФайлЗанят"); - Возврат; - КонецЕсли; - КонецЕсли; - - ПредложитьОткрытьФайлДляРедактирования = РежимСоздания = "ИзШаблона" И НЕ Объект.ПодписанЭП - И НовыйФайл И НовыйФайлЗаписан И (Не ФайлРедактировался) И Не ПолученОтветНаВопросОткрытьДляРедактирования; - Если ПредложитьОткрытьФайлДляРедактирования Тогда - Отказ = Истина; - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Открыть файл ""%1"" для редактирования?'"), - СокрЛП(Объект.ПолноеНаименование)); - Обработчик = Новый ОписаниеОповещения("ПередЗакрытиемПослеОтветаНаВопросОткрытьДляРедактирования", ЭтотОбъект); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); - Возврат; - КонецЕсли; + РазблокироватьОбъект(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "ФайлОткрыт" И Источник = Объект.Ссылка Тогда - НовыйФайл = Ложь; - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ФайлРедактировался" И Источник = Объект.Ссылка Тогда - ФайлРедактировался = Истина; - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ОбъектПодписан" И Источник = Объект.Ссылка Тогда - Прочитать(); - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "АктивнаяВерсияИзменена" И Источник = Объект.Ссылка Тогда - Прочитать(); - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ВерсияСохранена" И Источник = Объект.Ссылка Тогда - Прочитать(); - КонецЕсли; - - Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - + Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") И (ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") + Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); КонецЕсли; + Если ИмяСобытия = "Запись_Файл" + И Источник = Объект.Ссылка + И Параметр <> Неопределено + И ТипЗнч(Параметр) = Тип("Структура") + И Параметр.Свойство("Событие") + И (Параметр.Событие = "ЗаконченоРедактирование" + Или Параметр.Событие = "РедактированиеОтменено") Тогда + Прочитать(); + КонецЕсли; + // СтандартныеПодсистемы.Свойства Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); @@ -239,100 +97,6 @@ КонецПроцедуры -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - // СтандартныеПодсистемы.Свойства - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); - МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); - КонецЕсли; - // Конец СтандартныеПодсистемы.Свойства - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗаписью(Отказ) - - Объект.Наименование = Объект.ПолноеНаименование; - -КонецПроцедуры - -&НаСервере -Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) - - // СтандартныеПодсистемы.Свойства - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); - МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); - КонецЕсли; - // Конец СтандартныеПодсистемы.Свойства - - КоличествоЗанятыхФайлов = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКоличествоЗанятыхФайлов(, - ПользователиКлиентСервер.АвторизованныйПользователь()); - -КонецПроцедуры - -&НаСервере -Процедура ПослеЗаписиНаСервере(ТекущийОбъект) - - Если НаименованиеДоЗаписи <> ТекущийОбъект.Наименование Тогда - Если ТекущийОбъект.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - РаботаСФайламиСлужебныйВызовСервера.ПереименоватьФайлВерсииНаДиске( - ТекущийОбъект.ТекущаяВерсия, - НаименованиеДоЗаписи, - ТекущийОбъект.Наименование, - УникальныйИдентификатор); - КонецЕсли; - КонецЕсли; - - Если НовыйФайл Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ДанныеФайлаКорректны = Истина; - КонецЕсли; - - Если Не Параметры.ФайлОснование.Пустая() И Объект.ТекущаяВерсия.Пустая() Тогда - СоздатьКопиюВерсии(Объект.Ссылка, Параметры.ФайлОснование, КопироватьПодписиЭП); - Модифицированность = Ложь; - КонецЕсли; - - ВерсияОбъекта = Объект.ТекущаяВерсия.ПолучитьОбъект(); - ФайловыеФункцииСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, ВерсияОбъекта.ЭлектронныеПодписи); - Если ВерсияОбъекта.Модифицированность() Тогда - ВерсияОбъекта.Записать(); - КонецЕсли; - - РазблокироватьДанныеДляРедактирования(Объект.Ссылка, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ПослеЗаписи() - Если НовыйФайл Тогда - НовыйФайлЗаписан = Истина; - - ПараметрыОповещения = Новый Структура("Владелец, Файл, Событие", Объект.ВладелецФайла, Объект.Ссылка, "СозданФайл"); - Оповестить("Запись_Файл", ПараметрыОповещения); - - Иначе - Если НаименованиеДоЗаписи <> Объект.Наименование Тогда - // в кэше обновить файл - РаботаСФайламиСлужебныйКлиент.ОбновитьИнформациюВРабочемКаталоге( - Объект.ТекущаяВерсия, Объект.Наименование); - - НаименованиеДоЗаписи = Объект.Наименование; - КонецЕсли; - КонецЕсли; - - СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента( - "КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаЭП(); - УстановитьДоступностьКомандСпискаШифрования(); -КонецПроцедуры - &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) @@ -345,22 +109,98 @@ КонецПроцедуры +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ТекущийПользователь = Пользователи.ТекущийПользователь(); + + РаботаСФайламиСлужебный.ЗаполнитьСписокПодписей(ЭтотОбъект); + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); + + // СтандартныеПодсистемы.Свойства + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.Свойства + + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + ОбновитьЗаголовок(); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + // СтандартныеПодсистемы.Свойства + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.Свойства + + Если Не ЗначениеЗаполнено(ТекущийОбъект.ТипХраненияФайла) Тогда + ТекущийОбъект.ТипХраненияФайла = РаботаСФайламиСлужебный.ТипХраненияФайлов(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если ЗначениеЗаполнено(ЗначениеКопирования) Тогда + + ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ЗначениеКопирования); + Если РаботаСФайламиСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + РаботаСФайламиСлужебный.ЗаписатьФайлВИнформационнуюБазу(ТекущийОбъект.Ссылка, ДвоичныеДанные); + Иначе + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ТекущийОбъект.ДатаМодификацииУниверсальная, + ТекущийОбъект.Наименование, ТекущийОбъект.Расширение); + ТекущийОбъект.Том = СведенияОФайле.Том; + ТекущийОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + КонецЕсли; + + РаботаСФайламиСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, ЗначениеКопирования); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + СертификатыИсточника = МодульЭлектроннаяПодпись.СертификатыШифрования(ЗначениеКопирования); + МодульЭлектроннаяПодпись.ЗаписатьСертификатыШифрования(ТекущийОбъект, СертификатыИсточника); + + УстановленныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(ЗначениеКопирования); + МодульЭлектроннаяПодпись.ДобавитьПодпись(ТекущийОбъект, УстановленныеПодписи); + КонецЕсли; + Иначе + РаботаСФайламиСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, ТекущийОбъект.Ссылка); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если НаименованиеДоЗаписи <> ТекущийОбъект.Наименование Тогда + Если ТекущийОбъект.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + РаботаСФайламиСлужебныйВызовСервера.ПереименоватьФайлВерсииНаДиске( + ТекущийОбъект.ТекущаяВерсия, + НаименованиеДоЗаписи, + ТекущийОбъект.Наименование, + УникальныйИдентификатор); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ЗначениеКопирования) Тогда + СоздатьКопиюВерсии(ТекущийОбъект.Ссылка, ЗначениеКопирования); + ЗначениеКопирования = Справочники[ИмяСправочника].ПустаяСсылка(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы -&НаКлиенте -Процедура ПолноеНаименованиеПриИзменении(Элемент) - Объект.ПолноеНаименование = СокрЛП(Объект.ПолноеНаименование); - Попытка - ФайловыеФункцииСлужебныйКлиент.КорректноеИмяФайла(Объект.ПолноеНаименование, Истина); - Исключение - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Объект.Наименование = СокрЛП(Объект.ПолноеНаименование); -КонецПроцедуры - &НаКлиенте Процедура ВладелецПриИзменении(Элемент) @@ -369,21 +209,7 @@ КонецЕсли; ТипВладельца = ТипЗнч(Объект.ВладелецФайла); - Элементы.Владелец.Заголовок = ТипВладельца; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппаДополнительныеДанныеСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") - И ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты" - И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда - - СвойстваВыполнитьОтложеннуюИнициализацию(); - МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); - КонецЕсли; + Элементы.ВладелецФайла.Заголовок = ТипВладельца; КонецПроцедуры @@ -419,171 +245,235 @@ &НаКлиенте Процедура СертификатыШифрованияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ОткрытьСертификатШифрованияВыполнить(); + + СтандартнаяОбработка = Ложь; + + ОткрытьСертификатШифрования(Неопределено); + КонецПроцедуры #КонецОбласти #Область ОбработчикиКомандФормы -&НаКлиенте -Процедура Занять(Команда) - - Если Модифицированность Тогда - Записать(); - КонецЕсли; - - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - - РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); - -КонецПроцедуры +/////////////////////////////////////////////////////////////////////////////////// +// Обработчики команд файлов &НаКлиенте -Процедура Редактировать(Команда) - - Если Объект.Ссылка.Пустая() Тогда - Записать(); - КонецЕсли; - - Если Модифицированность Тогда - Записать(); - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Объект.ТекущаяВерсияРасширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("РедактироватьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Объект.Наименование, Объект.ТекущаяВерсияРасширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ОтменитьРедактирование(Команда) - - Если Модифицированность Тогда - Записать(); - КонецЕсли; - - ПолучитьДанныеФайлаЕслиНекорректны(); - - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, ДанныеФайла.Ссылка); - ПараметрыОсвобожденияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыОсвобожденияФайла.Редактирует = ДанныеФайла.Редактирует; - ПараметрыОсвобожденияФайла.УникальныйИдентификатор = УникальныйИдентификатор; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗакончитьРедактирование(Команда) - - Если Модифицированность Тогда - Записать(); - КонецЕсли; - - ПолучитьДанныеФайлаЕслиНекорректны(); - - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Обработчик, ДанныеФайла.Ссылка, УникальныйИдентификатор); - ПараметрыОбновленияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - ПараметрыОбновленияФайла.РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыОбновленияФайла.Редактирует = ДанныеФайла.Редактирует; - РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - - Если Модифицированность Тогда - Записать(); - КонецЕсли; - - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - - РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением(Обработчик, - Объект.Ссылка, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьКаталогФайла(Команда) - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); - +Процедура ПоказатьВСписке(Команда) + СтандартныеПодсистемыКлиент.ПоказатьВСписке(ЭтотОбъект["Объект"].Ссылка, Неопределено); КонецПроцедуры &НаКлиенте Процедура ОбновитьИзФайлаНаДиске(Команда) - Если Модифицированность Тогда - Записать(); + Перем НовоеРасширение; + + Если ЭтоНовый() + ИЛИ ЭтотОбъект.Объект.Зашифрован + ИЛИ ЭтотОбъект.Объект.ПодписанЭП + ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда + Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ЭтотОбъект.Объект.Ссылка); + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеЗавершение", ЭтотОбъект); РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Обработчик, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры +&НаКлиенте +Процедура СтандартнаяЗаписатьИЗакрыть(Команда) + + Если ОбработатьКомандуЗаписиФайла() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяЗаписать(Команда) + + ОбработатьКомандуЗаписиФайла(); + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартныеУстановитьПометкуУдаления(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + Если Модифицированность Тогда + Если ЭтотОбъект.Объект.ПометкаУдаления Тогда + ТекстВопроса = НСтр( + "ru = 'Для выполнения действия требуется записать изменения файла. + |Записать изменения и снять пометку на удаление с файла + |""%1""?'"); + Иначе + ТекстВопроса = НСтр( + "ru = 'Для выполнения действия требуется записать изменения файла. + |Записать изменения и пометить на удаление файл + |""%1""?'"); + КонецЕсли; + Иначе + Если ЭтотОбъект.Объект.ПометкаУдаления Тогда + ТекстВопроса = НСтр("ru = 'Снять пометку на удаление с файла + |""%1""?'"); + Иначе + ТекстВопроса = НСтр("ru = 'Пометить на удаление файл + |""%1""?'"); + КонецЕсли; + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса, ЭтотОбъект.Объект.Ссылка); + + ОписаниеОповещения = Новый ОписаниеОповещения("СтандартныеУстановитьПометкуУдаленияОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура СтандартныеУстановитьПометкуУдаленияОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ЭтотОбъект.Объект.ПометкаУдаления = НЕ ЭтотОбъект.Объект.ПометкаУдаления; + ОбработатьКомандуЗаписиФайла(); + КонецЕсли; + +КонецПроцедуры + +// СтандартныеПодсистемы.Свойства + +&НаКлиенте +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Свойства + +/////////////////////////////////////////////////////////////////////////////////// +// Обработчики команд ЭП и шифрования. + &НаКлиенте Процедура Подписать(Команда) - Если Объект.Ссылка.Пустая() Или Модифицированность Тогда - Если Не Записать() Тогда - Возврат; - КонецЕсли; + Если ЭтоНовый() + Или ЗначениеЗаполнено(Объект.Редактирует) + Или Объект.Зашифрован Тогда + Возврат; + КонецЕсли; + + Если Модифицированность Тогда + Записать(); КонецЕсли; МассивФайлов = Новый Массив; МассивФайлов.Добавить(Объект.Ссылка); - РаботаСФайламиСлужебныйКлиент.ПодписатьФайл(МассивФайлов, УникальныйИдентификатор, - Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); + РаботаСФайламиСлужебныйКлиент.ПодписатьФайлы(МассивФайлов, УникальныйИдентификатор, + Новый ОписаниеОповещения("ПриПолученииПодписи", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЭПИзФайла(Команда) + + Если ЭтоНовый() + Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + Или ЭтотОбъект.Объект.Зашифрован Тогда + Возврат; + КонецЕсли; + + ПрисоединенныйФайл = ЭтотОбъект.Объект.Ссылка; + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла( + ПрисоединенныйФайл, + УникальныйИдентификатор, + Новый ОписаниеОповещения("ПриПолученииПодписей", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСЭП(Команда) + + Если ЭтоНовый() + ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.СохранитьВместеСЭП( + ЭтотОбъект.Объект.Ссылка, + УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура Зашифровать(Команда) - Если Объект.Ссылка.Пустая() Тогда - ТекстВопроса = - НСтр("ru = 'Данные еще не записаны. Выполнение команды - |""Зашифровать"" возможно только после записи данных. - | - |Данные будут записаны.'"); - Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеОтветаНаВопросЗаписать", ЭтотОбъект); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + Если ЭтоНовый() Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ЗашифроватьПродолжение(); + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ЭтотОбъект.Объект.Ссылка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Зашифровать( + Обработчик, + ДанныеФайла, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + Результат.МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + ЭтотОбъект.Объект.Ссылка); + + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + + УстановитьДоступностьКомандСпискаШифрования(); + КонецПроцедуры &НаКлиенте Процедура Расшифровать(Команда) - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); + Если ЭтоНовый() Или Не ЭтотОбъект.Объект.Зашифрован Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ЭтотОбъект.Объект.Ссылка); ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); @@ -598,24 +488,31 @@ КонецПроцедуры &НаКлиенте -Процедура ДобавитьПодписьИзФайла(Команда) +Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт - РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла( - Объект.Ссылка, - УникальныйИдентификатор, - Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаЗавершение", ЭтотОбъект)); + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); + + РасшифроватьСервер(Результат.МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ЭтотОбъект.Объект.Ссылка); + + ЗаполнитьСписокШифрованияНаСервере(); + УстановитьДоступностьКомандСпискаШифрования(); КонецПроцедуры -&НаКлиенте -Процедура СохранитьВместеСПодписью(Команда) - - РаботаСФайламиСлужебныйКлиент.СохранитьФайлВместеСПодписью(Объект.Ссылка, УникальныйИдентификатор); - +&НаСервере +Процедура ЗаполнитьСписокШифрованияНаСервере() + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); КонецПроцедуры &НаКлиенте -Процедура ОткрытьПодпись(Команда) +Процедура КомандаЭПСписокОткрытьПодпись(Команда) Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; @@ -627,38 +524,40 @@ КонецПроцедуры &НаКлиенте -Процедура Проверить(Команда) +Процедура ПроверитьЭП(Команда) Если Элементы.ЭлектронныеПодписи.ВыделенныеСтроки.Количество() = 0 Тогда Возврат; КонецЕсли; - ПолучитьДанныеФайлаЕслиНекорректны(); - СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(Объект.Ссылка,, УникальныйИдентификатор); - ФайловыеФункцииСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, - СтруктураВозврата.ДвоичныеДанные, Элементы.ЭлектронныеПодписи.ВыделенныеСтроки); + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, + ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, + Элементы.ЭлектронныеПодписи.ВыделенныеСтроки); КонецПроцедуры &НаКлиенте Процедура ПроверитьВсе(Команда) - ПолучитьДанныеФайлаЕслиНекорректны(); - СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(Объект.Ссылка,, УникальныйИдентификатор); - ФайловыеФункцииСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, СтруктураВозврата.ДвоичныеДанные); + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура Сохранить(Команда) +Процедура СохранитьПодпись(Команда) Если Элементы.ЭлектронныеПодписи.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - Если Элементы.ЭлектронныеПодписи.ТекущиеДанные.Объект = Неопределено - Или Элементы.ЭлектронныеПодписи.ТекущиеДанные.Объект.Пустая() Тогда - + ТекущиеДанные = Элементы.ЭлектронныеПодписи.ТекущиеДанные; + + Если ТекущиеДанные.Объект = Неопределено Или ТекущиеДанные.Объект.Пустая() Тогда + Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда @@ -666,628 +565,35 @@ КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.СохранитьПодпись(Элементы.ЭлектронныеПодписи.ТекущиеДанные.АдресПодписи); + МодульЭлектроннаяПодписьКлиент.СохранитьПодпись(ТекущиеДанные.АдресПодписи); КонецПроцедуры &НаКлиенте -Процедура Удалить(Команда) +Процедура УдалитьЭП(Команда) - Обработчик = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект); + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЭПОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); - ПоказатьВопрос(Обработчик, НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЭПОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + Записать(); + УдалитьИзСпискаПодписейИЗаписатьФайл(); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + УстановитьДоступностьКомандСпискаЭП(); КонецПроцедуры &НаКлиенте Процедура ОткрытьСертификатШифрования(Команда) - ОткрытьСертификатШифрованияВыполнить(); -КонецПроцедуры - -// СтандартныеПодсистемы.Свойства - -&НаКлиенте -Процедура Подключаемый_РедактироватьСоставСвойств() - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); - МодульУправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); - КонецЕсли; - -КонецПроцедуры - -// Конец СтандартныеПодсистемы.Свойства - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура РедактироватьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - - // - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Редактирует.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Редактирует"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; - ОтборЭлемента.ПравоеЗначение = Справочники.Пользователи.ПустаяСсылка(); - - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - - // - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Редактирует.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Редактирует"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ТекущийПользователь"); - - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ФайлЗанятыйТекущимПользователем); - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытиемПослеОтветаНаВопросОткрытьДляРедактирования(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = КодВозвратаДиалога.Да Тогда - РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Неопределено, Объект.Ссылка, УникальныйИдентификатор); - КонецЕсли; - ПолученОтветНаВопросОткрытьДляРедактирования = Истина; - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытииЗавершение() - УстановитьДоступностьКомандСпискаЭП(); - УстановитьДоступностьКомандСпискаШифрования(); -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытииПослеОтветаНаВопросСкопироватьСведения(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = КодВозвратаДиалога.Да Тогда - КопироватьПодписиЭП = Истина; - КонецЕсли; - ПриОткрытииЗавершение(); -КонецПроцедуры - -&НаКлиенте -Процедура ПрочитатьИУстановитьДоступностьЭлементовФормы(Результат, ПараметрыВыполнения) Экспорт - Прочитать(); - УстановитьДоступностьЭлементовФормы(); -КонецПроцедуры - -&НаКлиенте -Процедура ПодписатьЗавершение(Результат, ПараметрыВыполнения) Экспорт - - ПрочитатьИЗаполнитьПодписи(); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаЭП(); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗашифроватьПослеОтветаНаВопросЗаписать(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - - Если Не Записать() Тогда - Возврат; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - ПолучитьНавигационнуюСсылку(Объект.Ссылка), - Строка(Объект.Ссылка), - БиблиотекаКартинок.Информация32); - - ЗашифроватьПродолжение(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗашифроватьПродолжение() - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); - - РаботаСФайламиСлужебныйКлиент.Зашифровать( - Обработчик, - ДанныеФайла, - УникальныйИдентификатор); -КонецПроцедуры - -&НаКлиенте -Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт - Если Не Результат.Успех Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - ЗашифроватьСервер( - Результат.МассивДанныхДляЗанесенияВБазу, - Результат.МассивОтпечатков, - МассивФайловВРабочемКаталогеДляУдаления, - ИмяРабочегоКаталога); - - РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( - МассивФайловВРабочемКаталогеДляУдаления, - ПараметрыВыполнения.ДанныеФайла.Владелец, - Объект.Ссылка); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаШифрования(); - -КонецПроцедуры - -&НаКлиенте -Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт - Если Не Результат.Успех Тогда - Возврат; - КонецЕсли; - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - РасшифроватьСервер(Результат.МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога); - - РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( - ПараметрыВыполнения.ДанныеФайла.Владелец, - Объект.Ссылка); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаШифрования(); -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьПодписьИзФайлаЗавершение(Результат, ПараметрыВыполнения) Экспорт - - Если Результат = Истина Тогда - УстановитьДоступностьЭлементовФормы(); - ЗаполнитьСписокПодписей(); - УстановитьДоступностьКомандСпискаЭП(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура УдалитьЗавершение(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - - РеквизитПодписанИзменен = Ложь; - УдалитьПодписиИОбновитьСписок(РеквизитПодписанИзменен); - - Если РеквизитПодписанИзменен Тогда - ОповеститьОбИзменении(Объект.Ссылка); - Прочитать(); - КонецЕсли; - - Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлПодписан"), Объект.ВладелецФайла); - - УстановитьДоступностьКомандСпискаЭП(); - УстановитьДоступностьЭлементовФормы(); - -КонецПроцедуры - -&НаСервере -Процедура СоздатьКопиюВерсии(Приемник, Источник, КопироватьПодписиЭП) - - Если Источник.ТекущаяВерсия.Пустая() Тогда - Возврат; - КонецЕсли; - - ХранилищеФайла = Неопределено; - Если Источник.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - ХранилищеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(Источник.ТекущаяВерсия); - КонецЕсли; - - СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); - СведенияОФайле.ИмяБезРасширения = Объект.Наименование; - СведенияОФайле.Размер = Источник.ТекущаяВерсия.Размер; - СведенияОФайле.РасширениеБезТочки = Источник.ТекущаяВерсия.Расширение; - СведенияОФайле.АдресВременногоХранилищаФайла = ХранилищеФайла; - СведенияОФайле.АдресВременногоХранилищаТекста = Источник.ТекущаяВерсия.ТекстХранилище; - СведенияОФайле.СсылкаНаВерсиюИсточник = Источник.ТекущаяВерсия; - Версия = РаботаСФайламиСлужебныйВызовСервера.СоздатьВерсию(Приемник, СведенияОФайле); - - // Обновим форму Файла (ведь запись может произойти и не при закрытии формы). - Объект.ТекущаяВерсия = Версия.Ссылка; - - // Обновим запись в информационной базе. - РаботаСФайламиСлужебныйВызовСервера.ОбновитьВерсиюВФайле( - Приемник, Версия, Источник.ТекущаяВерсия.ТекстХранилище, УникальныйИдентификатор); - - Прочитать(); - - Если КопироватьПодписиЭП Тогда - - ФайлОбъект = Объект.Ссылка.ПолучитьОбъект(); - ФайлОбъект.ПодписанЭП = Истина; - ФайлОбъект.Записать(); - - ВерсияОбъект = Объект.ТекущаяВерсия.ПолучитьОбъект(); - - Для Каждого Строка Из Источник.ТекущаяВерсия.ЭлектронныеПодписи Цикл - НоваяСтрока = ВерсияОбъект.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); - КонецЦикла; - - ВерсияОбъект.ПодписанЭП = Истина; - ВерсияОбъект.Записать(); - - ПрочитатьИЗаполнитьПодписи(); - - КонецЕсли; - - Если Источник.Зашифрован Тогда - - ФайлОбъект = Объект.Ссылка.ПолучитьОбъект(); - ФайлОбъект.Зашифрован = Истина; - - Для Каждого Строка Из Источник.СертификатыШифрования Цикл - НоваяСтрока = ФайлОбъект.СертификатыШифрования.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); - КонецЦикла; - - ФайлОбъект.Записать(); - - ВерсияОбъект = Объект.ТекущаяВерсия.ПолучитьОбъект(); - ВерсияОбъект.Зашифрован = Истина; - ВерсияОбъект.Записать(); - - ПрочитатьИЗаполнитьШифрование(); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьЭлементовФормы() - - ДоступныДействияСФайлом = Не Объект.ТекущаяВерсия.Пустая() И Не Объект.Ссылка.Пустая(); - - Элементы.ХранитьВерсии.Доступность = ДоступныДействияСФайлом И Не Объект.ПометкаУдаления; - - Элементы.ФормаОтменитьРедактирование.Доступность = ЗначениеЗаполнено(Объект.Редактирует) И Не ФайлРедактируетсяВОблаке; - Элементы.ФормаОткрытьКаталогФайла.Доступность = ДоступныДействияСФайлом; - Элементы.ФормаСохранитьКак.Доступность = ДоступныДействияСФайлом; - - Элементы.ФормаРедактировать.Доступность = НЕ Объект.ПодписанЭП И Не ФайлРедактируетсяВОблаке; - Элементы.ФормаЗакончитьРедактирование.Доступность = ЗначениеЗаполнено(Объект.Редактирует) И Не ФайлРедактируетсяВОблаке; - - Элементы.ПолноеНаименование.ТолькоПросмотр = ЗначениеЗаполнено(Объект.Редактирует); - - Элементы.ФормаЗанять.Доступность = Не ЗначениеЗаполнено(Объект.Редактирует) И (ДоступныДействияСФайлом) И НЕ Объект.ПодписанЭП И Не ФайлРедактируетсяВОблаке; - Элементы.ФормаСохранитьИзменения.Доступность = ЗначениеЗаполнено(Объект.Редактирует) И Не ФайлРедактируетсяВОблаке; - - Элементы.ФормаОбновитьИзФайлаНаДиске.Доступность = ДоступныДействияСФайлом И НЕ Объект.ПодписанЭП И Не ФайлРедактируетсяВОблаке; - - Элементы.ФормаПодписать.Доступность = (ДоступныДействияСФайлом И Не ЗначениеЗаполнено(Объект.Редактирует)) ИЛИ НЕ ДоступныДействияСФайлом; - Элементы.ФормаЗашифровать.Доступность = (ДоступныДействияСФайлом И Не ЗначениеЗаполнено(Объект.Редактирует) И НЕ Объект.Зашифрован) ИЛИ НЕ ДоступныДействияСФайлом; - - Элементы.ФормаДобавитьПодписьИзФайла.Доступность = ДоступныДействияСФайлом И Не ЗначениеЗаполнено(Объект.Редактирует); - Элементы.ФормаСохранитьВместеСПодписью.Доступность = ДоступныДействияСФайлом И Объект.ПодписанЭП; - Элементы.ФормаРасшифровать.Доступность = ДоступныДействияСФайлом И Объект.Зашифрован; - - Элементы.ФормаСкопировать.Доступность = Не ФайлРедактируетсяВОблаке; - Элементы.ФормаУстановитьПометкуУдаления.Доступность = Не ФайлРедактируетсяВОблаке; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьВыполнить() - Записать(); - Прочитать(); -КонецПроцедуры - -&НаКлиенте -Процедура СкопироватьВыполнить() - - РаботаСФайламиКлиент.СкопироватьФайл(Объект.ВладелецФайла, Объект.Ссылка); - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСписокШифрования() - - СертификатыШифрования.Очистить(); - - Если Объект.Зашифрован Тогда - МассивСертификатовШифрования = РаботаСФайламиСлужебныйВызовСервера.СертификатыШифрования(Объект.Ссылка); - Для Каждого СтруктураСертификата Из МассивСертификатовШифрования Цикл - НоваяСтрока = СертификатыШифрования.Добавить(); - НоваяСтрока.Представление = СтруктураСертификата.Представление; - НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; - Если СтруктураСертификата.Сертификат <> Неопределено Тогда - НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище(СтруктураСертификата.Сертификат, УникальныйИдентификатор); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - ТекстЗаголовка = НСтр("ru = 'Разрешено расшифровывать'"); - - Если СертификатыШифрования.Количество() <> 0 Тогда - ТекстЗаголовка =ТекстЗаголовка + " (" + Формат(СертификатыШифрования.Количество(), "ЧГ=") + ")"; - КонецЕсли; - - Элементы.ГруппаСертификатыШифрования.Заголовок = ТекстЗаголовка; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСписокПодписей() - - ЭлектронныеПодписи.Очистить(); - - Если Объект.ПодписанЭП Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ЭлектронныеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, - | ЭлектронныеПодписи.ДатаПодписи КАК ДатаПодписи, - | ЭлектронныеПодписи.Комментарий КАК Комментарий, - | ЭлектронныеПодписи.Подпись КАК Подпись, - | ЭлектронныеПодписи.Отпечаток КАК Отпечаток, - | ЭлектронныеПодписи.УстановившийПодпись КАК УстановившийПодпись, - | ЭлектронныеПодписи.Сертификат КАК Сертификат, - | ЭлектронныеПодписи.ДатаПроверкиПодписи КАК ДатаПроверкиПодписи, - | ЭлектронныеПодписи.ПодписьВерна КАК ПодписьВерна - |ИЗ - | Справочник.ВерсииФайлов.ЭлектронныеПодписи КАК ЭлектронныеПодписи - |ГДЕ - | ЭлектронныеПодписи.Ссылка = &ОбъектСсылка"; - - Запрос.Параметры.Вставить("ОбъектСсылка", Объект.ТекущаяВерсия); - ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); - - Пока ВыборкаЗапроса.Следующий() Цикл - НоваяСтрока = ЭлектронныеПодписи.Добавить(); - - НоваяСтрока.КомуВыданСертификат = ВыборкаЗапроса.КомуВыданСертификат; - НоваяСтрока.ДатаПодписи = ВыборкаЗапроса.ДатаПодписи; - НоваяСтрока.Комментарий = ВыборкаЗапроса.Комментарий; - НоваяСтрока.Объект = Объект.ТекущаяВерсия; - НоваяСтрока.Отпечаток = ВыборкаЗапроса.Отпечаток; - НоваяСтрока.УстановившийПодпись = ВыборкаЗапроса.УстановившийПодпись; - НоваяСтрока.ДатаПроверкиПодписи = ВыборкаЗапроса.ДатаПроверкиПодписи; - НоваяСтрока.ПодписьВерна = ВыборкаЗапроса.ПодписьВерна; - НоваяСтрока.ИндексКартинки = -1; - - ФайловыеФункцииСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(НоваяСтрока); - - ДвоичныеДанные = ВыборкаЗапроса.Подпись.Получить(); - Если ДвоичныеДанные <> Неопределено Тогда - НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); - КонецЕсли; - - ДвоичныеДанныеСертификата = ВыборкаЗапроса.Сертификат.Получить(); - Если ДвоичныеДанныеСертификата <> Неопределено Тогда - НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище(ДвоичныеДанныеСертификата, УникальныйИдентификатор); - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - Если ЭлектронныеПодписи.Количество() = 0 Тогда - ТекстЗаголовка = НСтр("ru = 'Электронные подписи'"); - Иначе - ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Электронные подписи (%1)'"), - Формат(ЭлектронныеПодписи.Количество(), "ЧГ=")); - КонецЕсли; - Элементы.ГруппаЭлектронныеПодписи.Заголовок = ТекстЗаголовка; - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьПолныйПуть() - - Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда - - ПапкаРодитель = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "ВладелецФайла"); - - Если ЗначениеЗаполнено(ПапкаРодитель) Тогда - - ПолныйПуть = ""; - - Пока ЗначениеЗаполнено(ПапкаРодитель) Цикл - - Если Не ПустаяСтрока(ПолныйПуть) Тогда - ПолныйПуть = "\" + ПолныйПуть; - КонецЕсли; - - ПолныйПуть = Строка(ПапкаРодитель) + ПолныйПуть; - - ПапкаРодитель = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПапкаРодитель, "Родитель"); - Если Не ЗначениеЗаполнено(ПапкаРодитель) Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - - Элементы.Владелец.Подсказка = ПолныйПуть; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФайлВыполнить() - - Если Объект.Ссылка.Пустая() Тогда - Записать(); - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Объект.ТекущаяВерсияРасширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Объект.Наименование, Объект.ТекущаяВерсияРасширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолучитьДанныеФайлаЕслиНекорректны() - - Если ДанныеФайла = Неопределено ИЛИ НЕ ДанныеФайлаКорректны Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ДанныеФайлаКорректны = Истина; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ПрочитатьИЗаполнитьПодписи() - - Прочитать(); - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ДанныеФайлаКорректны = Истина; - ЗаполнитьСписокПодписей(); - -КонецПроцедуры - -&НаСервере -Процедура ПрочитатьИЗаполнитьШифрование() - - Прочитать(); - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ДанныеФайлаКорректны = Истина; - ЗаполнитьСписокШифрования(); - -КонецПроцедуры - -&НаСервере -Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков, - МассивФайловВРабочемКаталогеДляУдаления, - ИмяРабочегоКаталога) - - Зашифровать = Истина; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - Объект.Ссылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - - Прочитать(); - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ЗаполнитьСписокШифрования(); - -КонецПроцедуры - -&НаСервере -Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, - ИмяРабочегоКаталога) - - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - Объект.Ссылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - - Прочитать(); - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Объект.Ссылка); - ЗаполнитьСписокШифрования(); - -КонецПроцедуры - -&НаСервере -Процедура УдалитьПодписиИОбновитьСписок(РеквизитПодписанИзменен) - - ИндексыСтрок = Новый Массив; - - Для Каждого Элемент Из Элементы.ЭлектронныеПодписи.ВыделенныеСтроки Цикл - ДанныеСтроки = ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент); - - Если ДанныеСтроки.Объект <> Неопределено И (НЕ ДанныеСтроки.Объект.Пустая()) Тогда - - ИндексыСтрок.Добавить(ЭлектронныеПодписи.Индекс(ДанныеСтроки)); - КонецЕсли; - КонецЦикла; - - РаботаСФайламиСлужебныйВызовСервера.УдалитьПодписиВерсииФайла( - Объект.ТекущаяВерсия, - ИндексыСтрок, - РеквизитПодписанИзменен, - УникальныйИдентификатор); - - ЗаполнитьСписокПодписей(); - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьКомандСпискаЭП() - - ФайловыеФункцииСлужебныйКлиент.УстановитьДоступностьКомандСпискаЭлектронныхПодписей(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьКомандСпискаШифрования() - - ФайловыеФункцииСлужебныйКлиент.УстановитьДоступностьКомандСпискаСертификатовШифрования(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьСертификатШифрованияВыполнить() ТекущиеДанные = Элементы.СертификатыШифрования.ТекущиеДанные; @@ -1298,7 +604,6 @@ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); Если ПустаяСтрока(ТекущиеДанные.АдресСертификата) Тогда @@ -1310,16 +615,113 @@ КонецПроцедуры &НаКлиенте -Процедура ПриИзмененияИспользованияПодписанияИлиШифрования() +Процедура УстановитьДоступностьКомандСпискаЭП() - ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); + РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаЭлектронныхПодписей(ЭтотОбъект); КонецПроцедуры -&НаСервере -Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() +&НаКлиенте +Процедура УстановитьДоступностьКомандСпискаШифрования() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект, Ложь); + РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаСертификатовШифрования(ЭтотОбъект); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////// +// Обработчики команд для поддержки совместной работы с файлами. + +&НаКлиенте +Процедура Редактировать(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + И ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда + Возврат; + КонецЕсли; + + Если Модифицированность И Не Записать() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Неопределено, + ДанныеФайла, УникальныйИдентификатор); + Иначе + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Неопределено, + ДанныеФайла, УникальныйИдентификатор); + + ОбновитьОбъект(); + + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + Если ЭтоНовый() + Или Не ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + Или ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ЭтотОбъект.Объект.Ссылка); + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьРедактированиеВыполненоПомещение", ЭтотОбъект); + ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(ОписаниеОповещения, ДанныеФайла.Ссылка, УникальныйИдентификатор); + ПараметрыОбновленияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + Если Не ВозможностьСоздаватьВерсииФайлов Тогда + ПараметрыОбновленияФайла.Вставить("СоздатьНовуюВерсию", Ложь); + КонецЕсли; + ПараметрыОбновленияФайла.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыОбновленияФайла.Редактирует = ДанныеФайла.Редактирует; + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактированиеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт + + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + + Если ЭтоНовый() + ИЛИ НЕ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + ИЛИ ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда + Возврат; + КонецЕсли; + + ОсвободитьФайл(); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "РедактированиеОтменено"), ЭтотОбъект.Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением(Обработчик, + ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -1367,4 +769,748 @@ // Конец СтандартныеПодсистемы.Свойства +&НаКлиенте +Процедура Отправить(Команда) + + Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиСлужебныйКлиент.ОтправитьФайлыПоПочте(Файлы, УникальныйИдентификатор, ПараметрыОтправки, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Печать(Команда) + + СистемнаяИнфо = Новый СистемнаяИнформация; + Если СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86 + И СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиКлиент.НапечататьФайлы(Файлы, ЭтотОбъект.УникальныйИдентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатьСоШтампом(Команда) + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ТабличныйДокументСоШтампом(ЭтотОбъект.Объект.Ссылка, ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ОбновитьЗаголовок() + + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + ТипФайла = НСтр("ru = 'Файл'"); + Иначе + ТипФайла = НСтр("ru = 'Присоединенный файл'"); + КонецЕсли; + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (%2)'"), Строка(ЭтотОбъект.Объект.Ссылка), ТипФайла); + Иначе + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (Создание)'"), ТипФайла); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ДанныеФайла(Знач ПрисоединенныйФайл, + Знач ИдентификаторФормы = Неопределено, + Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) + + Возврат РаботаСФайлами.ДанныеФайла( + ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные); + +КонецФункции + +&НаКлиенте +Процедура ОткрытьФайлДляПросмотра() + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + ФайлРедактируется = ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + И ЭтотОбъект.Объект.Редактирует = ТекущийПользователь; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла() + + Если ЭтоНовый() + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак() + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьИзСпискаПодписейИЗаписатьФайл() + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + ИндексыСтрок = Новый Массив; + + Для Каждого НомерВыделеннойСтроки Из Элементы.ЭлектронныеПодписи.ВыделенныеСтроки Цикл + УдаляемаяСтрока = ЭлектронныеПодписи.НайтиПоИдентификатору(НомерВыделеннойСтроки); + ИндексыСтрок.Добавить(УдаляемаяСтрока.ПорядковыйНомер); + КонецЦикла; + + МодульЭлектроннаяПодпись.УдалитьПодпись(Объект.Ссылка, ИндексыСтрок, УникальныйИдентификатор); + + Прочитать(); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьДоступностьКнопок(Форма, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке) + + ФайлРедактируется = ЗначениеЗаполнено(Форма.Объект.Редактирует) Или ФайлРедактируетсяВОблаке; + ФайлРедактируетТекущийПользователь = Форма.Объект.Редактирует = ТекущийПользователь; + + ИменаВсехКоманд = ПолучитьИменаКомандФормы(); + ИменаКоманд = ПолучитьДоступныеКоманды( + ФайлРедактируется, + ФайлРедактируетТекущийПользователь, + Форма.Объект.ПодписанЭП, + Форма.Объект.Зашифрован, + Форма.Объект.Ссылка.Пустая(), + ФайлРедактируетсяВОблаке); + + Если Форма.ЭлектронныеПодписи.Количество() = 0 Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьПодпись"); + КонецЕсли; + + Для Каждого ЭлементФормы Из Элементы Цикл + Если ТипЗнч(ЭлементФормы) <> Тип("КнопкаФормы") Тогда + Продолжить; + КонецЕсли; + Если ИменаВсехКоманд.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено Тогда + ЭлементФормы.Доступность = Ложь; + КонецЕсли; + КонецЦикла; + + Для Каждого ЭлементФормы Из Элементы Цикл + Если ТипЗнч(ЭлементФормы) <> Тип("КнопкаФормы") Тогда + Продолжить; + КонецЕсли; + Если ИменаКоманд.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено Тогда + ЭлементФормы.Доступность = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьИменаКомандФормы() + + ИменаКоманд = ПолучитьИменаКомандИзмененияОбъекта(); + + Для Каждого ИмяКоманды Из ПолучитьИменаПростыхКомандОбъектов() Цикл + ИменаКоманд.Добавить(ИмяКоманды); + КонецЦикла; + + Возврат ИменаКоманд; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьИменаПростыхКомандОбъектов() + + ИменаКоманд = Новый Массив; + + // Простые команды, которые доступны любому пользователю читающему файлы. + ИменаКоманд.Добавить("СохранитьВместеСЭП"); + + ИменаКоманд.Добавить("ОткрытьСертификат"); + ИменаКоманд.Добавить("ОткрытьПодпись"); + ИменаКоманд.Добавить("ПроверитьЭП"); + ИменаКоманд.Добавить("ПроверитьВсе"); + ИменаКоманд.Добавить("СохранитьПодпись"); + + ИменаКоманд.Добавить("ОткрытьКаталогФайла"); + ИменаКоманд.Добавить("ОткрытьФайлДляПросмотра"); + ИменаКоманд.Добавить("СохранитьКак"); + + Возврат ИменаКоманд; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьИменаКомандИзмененияОбъекта() + + ИменаКоманд = Новый Массив; + + ИменаКоманд.Добавить("Подписать"); + ИменаКоманд.Добавить("ДобавитьЭПИзФайла"); + + ИменаКоманд.Добавить("УдалитьЭП"); + + ИменаКоманд.Добавить("Редактировать"); + ИменаКоманд.Добавить("ЗакончитьРедактирование"); + ИменаКоманд.Добавить("Освободить"); + ИменаКоманд.Добавить("СохранитьИзменения"); + + ИменаКоманд.Добавить("Зашифровать"); + ИменаКоманд.Добавить("Расшифровать"); + + ИменаКоманд.Добавить("СтандартныеСкопировать"); + ИменаКоманд.Добавить("ОбновитьИзФайлаНаДиске"); + + ИменаКоманд.Добавить("СтандартнаяЗаписать"); + ИменаКоманд.Добавить("СтандартнаяЗаписатьИЗакрыть"); + ИменаКоманд.Добавить("СтандартныеУстановитьПометкуУдаления"); + + Возврат ИменаКоманд; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьДоступныеКоманды(ФайлРедактируется, + ФайлРедактируетТекущийПользователь, + ФайлПодписан, + ФайлЗашифрован, + ЭтоНовыйФайл, + ФайлРедактируетсяВОблаке) + + Если ЭтоНовыйФайл Тогда + ИменаКоманд = Новый Массив; + ИменаКоманд.Добавить("СтандартнаяЗаписать"); + ИменаКоманд.Добавить("СтандартнаяЗаписатьИЗакрыть"); + Возврат ИменаКоманд; + КонецЕсли; + + ИменаКоманд = ПолучитьИменаКомандФормы(); + + Если ФайлРедактируется Тогда + Если ФайлРедактируетТекущийПользователь Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); + Иначе + УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); + УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); + КонецЕсли; + УдалитьКомандыЭП(ИменаКоманд); + + УдалитьКомандуИзМассива(ИменаКоманд, "Зашифровать"); + УдалитьКомандуИзМассива(ИменаКоманд, "Расшифровать"); + Иначе + УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); + УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьИзменения"); + КонецЕсли; + + Если ФайлПодписан Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); + УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); + Иначе + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьСертификат"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьПодпись"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПроверитьЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПроверитьВсе"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьПодпись"); + УдалитьКомандуИзМассива(ИменаКоманд, "УдалитьЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); + КонецЕсли; + + Если ФайлЗашифрован Тогда + УдалитьКомандыЭП(ИменаКоманд); + Если Не ФайлРедактируется Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); + КонецЕсли; + + УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); + + УдалитьКомандуИзМассива(ИменаКоманд, "Зашифровать"); + + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьКаталогФайла"); + + УдалитьКомандуИзМассива(ИменаКоманд, "Подписать"); + Иначе + УдалитьКомандуИзМассива(ИменаКоманд, "Расшифровать"); + КонецЕсли; + + Если ФайлРедактируетсяВОблаке Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "СтандартныеСкопировать"); + УдалитьКомандуИзМассива(ИменаКоманд, "СтандартныеУстановитьПометкуУдаления"); + КонецЕсли; + + Возврат ИменаКоманд; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УдалитьКомандыЭП(Знач ИменаКоманд) + + УдалитьКомандуИзМассива(ИменаКоманд, "Подписать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭПИзФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УдалитьКомандуИзМассива(Массив, ИмяКоманды) + + Позиция = Массив.Найти(ИмяКоманды); + + Если Позиция = Неопределено Тогда + Возврат; + КонецЕсли; + + Массив.Удалить(Позиция); + +КонецПроцедуры + +&НаСервере +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, + МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога) + + Зашифровать = Истина; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ЭтотОбъект.Объект.Ссылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + + ОбновитьИнформациюОСертификатахОбъекта(); + +КонецПроцедуры + +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога) + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ЭтотОбъект.Объект.Ссылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + + ОбновитьИнформациюОСертификатахОбъекта(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьОбъект() + Прочитать(); +КонецПроцедуры + +&НаСервере +Процедура ОсвободитьФайл() + + ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); + РаботаСФайламиСлужебный.ОсвободитьФайл(ЗаписываемыйОбъект); + ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); + +КонецПроцедуры + +&НаКлиенте +Функция ОбработатьКомандуЗаписиФайла() + + Если ПустаяСтрока(ЭтотОбъект.Объект.Наименование) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Для продолжения укажите имя файла.'"), , "Наименование", "Объект"); + Возврат Ложь; + КонецЕсли; + + Попытка + РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + Возврат Ложь; + КонецПопытки; + + Записать(); + + Модифицированность = Ложь; + ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + + Оповестить("Запись_Файл", + Новый Структура("ЭтоНовый", ФайлБылСоздан), + ЭтотОбъект.Объект.Ссылка); + + УстановитьДоступностьКомандСпискаЭП(); + УстановитьДоступностьКомандСпискаШифрования(); + + Если НаименованиеДоЗаписи <> Объект.Наименование Тогда + // в кэше обновить файл + Если ЗначениеЗаполнено(Объект.ТекущаяВерсия) Тогда + РаботаСФайламиСлужебныйКлиент.ОбновитьИнформациюВРабочемКаталоге( + Объект.ТекущаяВерсия, Объект.Наименование); + Иначе + РаботаСФайламиСлужебныйКлиент.ОбновитьИнформациюВРабочемКаталоге( + Объект.Ссылка, Объект.Наименование); + КонецЕсли; + + НаименованиеДоЗаписи = Объект.Наименование; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаСервереБезКонтекста +Процедура РазблокироватьОбъект(Знач Ссылка, Знач УникальныйИдентификатор) + + РазблокироватьДанныеДляРедактирования(Ссылка, УникальныйИдентификатор); + +КонецПроцедуры + +// Продолжение процедуры ПодписатьФайлЭП. +// Вызывается из подсистемы ЭлектроннаяПодпись после подписания данных для нестандартного +// способа добавления подписи в объект. +// +&НаКлиенте +Процедура ПриПолученииПодписи(ПараметрыВыполнения, Контекст) Экспорт + + ОбновитьИнформациюОПодписиОбъекта(); + УстановитьДоступностьКомандСпискаЭП(); + +КонецПроцедуры + +// Продолжение процедуры ПодписатьФайлЭП. +// Вызывается из подсистемы ЭлектроннаяПодпись после подготовки подписей из файлов +// для нестандартного способа добавления подписи в объект. +// +&НаКлиенте +Процедура ПриПолученииПодписей(ПараметрыВыполнения, Контекст) Экспорт + + ОбновитьИнформациюОПодписиОбъекта(); + УстановитьДоступностьКомандСпискаЭП(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИнформациюОПодписиОбъекта() + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + РаботаСФайламиСлужебный.ЗаполнитьСписокПодписей(ЭтотОбъект); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИнформациюОСертификатахОбъекта() + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьИУстановитьДоступностьЭлементовФормы(Результат, ДополнительныеПараметры) Экспорт + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + +КонецПроцедуры + +&НаКлиенте +Процедура ПрочитатьСертификатыПодписей() + + Если ЭлектронныеПодписи.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("МодульЭлектроннаяПодписьКлиентСервер", + ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиентСервер")); + + ОбщиеНастройки = Контекст.МодульЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); + + Если ОбщиеНастройки.ПроверятьЭлектронныеПодписиНаСервере Тогда + Возврат; + КонецЕсли; + + НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( + "ПрочитатьСертификатыПодписейПослеПодключенияРасширения", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейПослеПодключенияРасширения(Подключено, Контекст) Экспорт + + Если Не Подключено Тогда + Возврат; + КонецЕсли; + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + + МодульЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения( + "ПрочитатьСертификатыПодписейПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст), + "ПолучениеСертификатов", Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт + + Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда + Возврат; + КонецЕсли; + + Контекст.Вставить("Индекс", -1); + Контекст.Вставить("МенеджерКриптографии", Результат); + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейЦиклНачало(Контекст) + + Если ЭлектронныеПодписи.Количество() <= Контекст.Индекс + 1 Тогда + Возврат; + КонецЕсли; + Контекст.Индекс = Контекст.Индекс + 1; + Контекст.Вставить("СтрокаТаблицы", ЭлектронныеПодписи[Контекст.Индекс]); + + Если ЗначениеЗаполнено(Контекст.СтрокаТаблицы.Отпечаток) Тогда + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + Возврат; + КонецЕсли; + + // Подпись не была прочитана при записи объекта. + Подпись = ПолучитьИзВременногоХранилища(Контекст.СтрокаТаблицы.АдресПодписи); + + Если Не ЗначениеЗаполнено(Подпись) Тогда + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + Возврат; + КонецЕсли; + + Контекст.МенеджерКриптографии.НачатьПолучениеСертификатовИзПодписи(Новый ОписаниеОповещения( + "ПрочитатьСертификатыПодписейЦиклПослеПолученияСертификатовИзПодписи", ЭтотОбъект, Контекст, + "ПрочитатьСертификатыПодписейЦиклПослеОшибкиПолученияСертификатовИзПодписи", ЭтотОбъект), + Подпись); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейЦиклПослеОшибкиПолученияСертификатовИзПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейЦиклПослеПолученияСертификатовИзПодписи(Сертификаты, Контекст) Экспорт + + Если Сертификаты.Количество() = 0 Тогда + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + Возврат; + КонецЕсли; + + Контекст.Вставить("Сертификат", Сертификаты[0]); + + Контекст.Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( + "ПрочитатьСертификатыПодписейЦиклПослеВыгрузкиСертификата", ЭтотОбъект, Контекст, + "ПрочитатьСертификатыПодписейЦиклПослеОшибкиВыгрузкиСертификата", ЭтотОбъект)); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейЦиклПослеОшибкиВыгрузкиСертификата(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ПрочитатьСертификатыПодписей. +&НаКлиенте +Процедура ПрочитатьСертификатыПодписейЦиклПослеВыгрузкиСертификата(ДанныеСертификата, Контекст) Экспорт + + СтрокаТаблицы = Контекст.СтрокаТаблицы; + + СтрокаТаблицы.Отпечаток = Base64Строка(Контекст.Сертификат.Отпечаток); + СтрокаТаблицы.АдресСертификата = ПоместитьВоВременноеХранилище(ДанныеСертификата, УникальныйИдентификатор); + СтрокаТаблицы.КомуВыданСертификат = + Контекст.МодульЭлектроннаяПодписьКлиентСервер.ПредставлениеСубъекта(Контекст.Сертификат); + + ПрочитатьСертификатыПодписейЦиклНачало(Контекст); + +КонецПроцедуры + +&НаКлиенте +Функция ЭтоНовый() + + Возврат ЭтотОбъект.Объект.Ссылка.Пустая(); + +КонецФункции + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДискеЗавершение(Результат, ПараметрыВыполнения) Экспорт + ОбновитьДанныеОбъектаНаСервере(); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьДанныеОбъектаНаСервере() + + ЗначениеВРеквизитФормы(ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(), "Объект"); + ДатаМодификации = МестноеВремя(ЭтотОбъект.Объект.ДатаМодификацииУниверсальная); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененияИспользованияПодписанияИлиШифрования() + + ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() + + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект, Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппаДополнительныеДанныеСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") + И ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты" + И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда + + СвойстваВыполнитьОтложеннуюИнициализацию(); + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьПолныйПуть() + + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + + ПапкаРодитель = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "ВладелецФайла"); + + Если ЗначениеЗаполнено(ПапкаРодитель) Тогда + + ПолныйПуть = ""; + + Пока ЗначениеЗаполнено(ПапкаРодитель) Цикл + + Если Не ПустаяСтрока(ПолныйПуть) Тогда + ПолныйПуть = "\" + ПолныйПуть; + КонецЕсли; + + ПолныйПуть = Строка(ПапкаРодитель) + ПолныйПуть; + + ПапкаРодитель = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПапкаРодитель, "Родитель"); + Если Не ЗначениеЗаполнено(ПапкаРодитель) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Элементы.ВладелецФайла.Подсказка = ПолныйПуть; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура СоздатьКопиюВерсии(Приемник, Источник) + + Если Источник.ТекущаяВерсия.Пустая() Тогда + Возврат; + КонецЕсли; + + ХранилищеФайла = Неопределено; + Если Источник.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ХранилищеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(Источник.ТекущаяВерсия); + КонецЕсли; + + СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); + СведенияОФайле.ИмяБезРасширения = Объект.Наименование; + СведенияОФайле.Размер = Источник.ТекущаяВерсия.Размер; + СведенияОФайле.РасширениеБезТочки = Источник.ТекущаяВерсия.Расширение; + СведенияОФайле.АдресВременногоХранилищаФайла = ХранилищеФайла; + СведенияОФайле.АдресВременногоХранилищаТекста = Источник.ТекущаяВерсия.ТекстХранилище; + СведенияОФайле.СсылкаНаВерсиюИсточник = Источник.ТекущаяВерсия; + СведенияОФайле.Зашифрован = Источник.Зашифрован; + + Версия = РаботаСФайламиСлужебныйВызовСервера.СоздатьВерсию(Приемник, СведенияОФайле); + + РаботаСФайламиСлужебныйВызовСервера.ОбновитьВерсиюВФайле( + Приемник, Версия, Источник.ТекущаяВерсия.ТекстХранилище, УникальныйИдентификатор); + + Прочитать(); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Help/ru.html b/SSL/src/Catalogs/Файлы/Help/ru.html index abed2eebc..e385f6f58 100644 --- a/SSL/src/Catalogs/Файлы/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Help/ru.html @@ -1,6 +1,6 @@

    -

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

    +

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

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

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

    @@ -8,11 +8,11 @@

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

    - + - + @@ -29,19 +29,19 @@
    Команда Описание
     Создать (Insert)Описание
     Добавить (Insert) Добавляет новый файл в программу. Возможные способы создания файла: из шаблона, из файла на диске, со сканера.
     Открыть (Просмотреть) Открывает файл внешним приложением для просмотра или редактирования, в зависимости от того, помечен ли файл как занятый текущим пользователем для редактирования.
     Редактировать (F4) Помечает файл как занятый для редактирования и открывает его внешним приложением.
    Клавиша Enter (двойной щелчок мыши)По умолчанию необходимо выбрать, как открыть файл - для просмотра или для редактирования. Действие настраивается в персональных настройках программы на закладке Работа с файлами.
     Закончить редактированиеПо умолчанию необходимо выбрать, как открыть файл - для просмотра или для редактирования. Действие настраивается в персональных настройках программы на закладке Работа с файлами.
     Закончить редактирование Обновляет файл в хранилище и снимает с него пометку занятости для редактирования. 
    Печать С помощью кнопки можно распечатать файл.
    Отправить Можно отправить почтовое сообщение, выбранный файл при этом автоматически будет его приложением.
     Сохранить измененияСохраняет файл в указанный каталог на жестком или сетевом диске, а также сохраняет подписи файла - все или выбранные, в зависимости от настройки действий При сохранении данных в файл вместе с электронной подписью (в персональных настройках программы, вкладка Дополнительно) Команду можно использовать, например, если необходимо передать подписанный файл другому лицу.
     Зашифровать Шифрование файла. В отличие от подписания могут использоваться несколько сертификатов, например, если необходимо зашифровать файл для нескольких пользователей. Выберите нужные из списка с помощью флажков. Зашифрованный файл в списках отображается со значком . В отличие от подписания пароль к закрытому ключу в процессе шифрования вводить не нужно. Зашифрованный файл доступен для редактирования. Шифруются все версии файла. Для зашифрованных файлов не работает полнотекстовый поиск. Зашифрованный файл можно скопировать. При этом новый, скопированный файл останется зашифрованным. Зашифрованный файл нельзя подписать.  Подписанный файл зашифровать можно, при этом перед проверкой электронной подписи у зашифрованного файла программа запросит пароль для предварительной расшифровки файла.
    Расшифровать По команде происходит расшифровка файла. Для расшифровки нужно ввести пароль к закрытому ключу.

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

    -

    Добавление файлов

    +

    Добавление файлов

    Для добавления нового файла в программу:

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

      См. также:

      \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/ManagerModule.bsl b/SSL/src/Catalogs/Файлы/ManagerModule.bsl index 74d87a20a..5a4518436 100644 --- a/SSL/src/Catalogs/Файлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/Файлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,14 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - РедактируемыеРеквизиты = Новый Массив; - РедактируемыеРеквизиты.Добавить("Описание"); - РедактируемыеРеквизиты.Добавить("Редактирует"); - - Возврат РедактируемыеРеквизиты; + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли @@ -26,7 +30,10 @@ Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - + Если Параметры.Количество() = 0 Тогда + ВыбраннаяФорма = "Файлы"; // Т.к. не указан конкретный файл, то открываем список файлов. + СтандартнаяОбработка = Ложь; + КонецЕсли; Если ВидФормы = "ФормаСписка" Тогда ТекущаяСтрока = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ТекущаяСтрока"); Если ТипЗнч(ТекущаяСтрока) = Тип("СправочникСсылка.Файлы") И Не ТекущаяСтрока.Пустая() Тогда @@ -34,10 +41,10 @@ ВладелецФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущаяСтрока, "ВладелецФайла"); Если ТипЗнч(ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда Параметры.Вставить("Папка", ВладелецФайла); - ВыбраннаяФорма = "Справочник.Файлы.Форма.Файлы"; + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы"; Иначе Параметры.Вставить("ВладелецФайла", ВладелецФайла); - ВыбраннаяФорма = "Справочник.Файлы.Форма.ФормаСпискаПрисоединенныхФайлов"; + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы"; КонецЕсли; КонецЕсли; КонецЕсли; @@ -47,3 +54,112 @@ КонецПроцедуры #КонецОбласти + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// которые необходимо обновить на новую версию. +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ОтработаныВсеФайлы = Ложь; + + Ссылка = ""; + + Пока Не ОтработаныВсеФайлы Цикл + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1000 + | Файлы.Ссылка КАК Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ДатаМодификацииУниверсальная = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) + | И Файлы.Ссылка > &Ссылка + | И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка) + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); + + КоличествоСсылок = МассивСсылок.Количество(); + + Если КоличествоСсылок < 1000 Тогда + ОтработаныВсеФайлы = Истина; + КонецЕсли; + + Если КоличествоСсылок > 0 Тогда + Ссылка = МассивСсылок[КоличествоСсылок-1]; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + ОбработкаЗавершена = Истина; + + Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.Файлы"); + + ОбъектовОбработано = 0; + ПроблемныхОбъектов = 0; + + Пока Выборка.Следующий() Цикл + + НачатьТранзакцию(); + Попытка + ОбновляемыйФайл = Выборка.Ссылка.ПолучитьОбъект(); + ОбновляемыйФайл.ДатаМодификацииУниверсальная = ОбновляемыйФайл.ТекущаяВерсия.ДатаМодификацииУниверсальная; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ОбновляемыйФайл); + + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Выборка.Ссылка); + ОбъектовОбработано = ОбъектовОбработано + 1; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + // Если не удалось обработать какой-либо документ, повторяем попытку снова. + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать файл: %1 по причине: + |%2'"), + Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); + КонецПопытки; + + КонецЦикла; + + Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Файлы") Тогда + ОбработкаЗавершена = Ложь; + КонецЕсли; + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию.ОбработатьДанныеДляПереходаНаНовуюВерсию не удалось обработать программы электронной подписи (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, + , , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедура Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию программ электронной подписи: %1'"), + ОбъектовОбработано)); + КонецЕсли; + + Параметры.ОбработкаЗавершена = ОбработкаЗавершена; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/ObjectModule.bsl b/SSL/src/Catalogs/Файлы/ObjectModule.bsl index 2fe4a1170..e69de29bb 100644 --- a/SSL/src/Catalogs/Файлы/ObjectModule.bsl +++ b/SSL/src/Catalogs/Файлы/ObjectModule.bsl @@ -1,204 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область ОбработчикиСобытий - -// Обработка события ПередЗаписью. -// -Процедура ПередЗаписью(Отказ) - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда - Возврат; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда - - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не заполнен владелец в файле - |""%1"".'"), - Наименование); - - Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Ошибка записи файла при обновлении ИБ'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - Ссылка, - ОписаниеОшибки); - Иначе - ВызватьИсключение ОписаниеОшибки; - КонецЕсли; - - КонецЕсли; - - Если ЭтоНовый() Тогда - // Проверка права "Добавление". - Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ДобавлениеФайлов", ВладелецФайла) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недостаточно прав для добавления файлов в папку ""%1"".'"), - Строка(ВладелецФайла)); - КонецЕсли; - Иначе - - ЕстьПометкаУдаленияВИБ = ПометкаУдаленияВИБ(); - УстановленаПометкаУдаления = ПометкаУдаления И Не ЕстьПометкаУдаленияВИБ; - ИзмененаПометкаУдаления = (ПометкаУдаления <> ЕстьПометкаУдаленияВИБ); - - ЗаписьПодписанногоОбъекта = Ложь; - Если ДополнительныеСвойства.Свойство("ЗаписьПодписанногоОбъекта") Тогда - ЗаписьПодписанногоОбъекта = ДополнительныеСвойства.ЗаписьПодписанногоОбъекта; - КонецЕсли; - - Если ЗаписьПодписанногоОбъекта <> Истина Тогда - - СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, - "ПодписанЭП, Зашифрован, Редактирует"); - - СсылкаПодписан = СтруктураРеквизитов.ПодписанЭП; - СсылкаЗашифрован = СтруктураРеквизитов.Зашифрован; - СсылкаРедактирует = СтруктураРеквизитов.Редактирует; - СсылкаЗанят = ЗначениеЗаполнено(СтруктураРеквизитов.Редактирует); - Занят = ЗначениеЗаполнено(Редактирует); - - Если ПодписанЭП И СсылкаПодписан И Занят И Не СсылкаЗанят Тогда - ВызватьИсключение НСтр("ru = 'Подписанный файл нельзя редактировать.'"); - КонецЕсли; - - Если Зашифрован И СсылкаЗашифрован И ПодписанЭП И НЕ СсылкаПодписан Тогда - ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); - КонецЕсли; - - КонецЕсли; - - Если Не ТекущаяВерсия.Пустая() Тогда - - РеквизитыТекущейВерсии = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( - ТекущаяВерсия, "ПолноеНаименование"); - - // Проверим равенство имени файла и его текущей версии. - // Если имена отличаются - имя у версии должно стать как у карточки с файлом. - Если РеквизитыТекущейВерсии.ПолноеНаименование <> ПолноеНаименование Тогда - Объект = ТекущаяВерсия.ПолучитьОбъект(); - Если Объект <> Неопределено И Объект.Ссылка <> Неопределено Тогда - ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); - УстановитьПривилегированныйРежим(Истина); - Объект.ПолноеНаименование = ПолноеНаименование; - // Чтобы не сработала подписка СкопироватьРеквизитыВерсииФайловВФайл. - Объект.ДополнительныеСвойства.Вставить("ПереименованиеФайла", Истина); - Объект.Записать(); - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если ИзмененаПометкаУдаления Тогда - - // Проверка права "Пометка на удаление". - Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ПометкаУдаленияФайлов", ВладелецФайла) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недостаточно прав для пометки файлов на удаление в папке ""%1"".'"), - Строка(ВладелецФайла)); - КонецЕсли; - - // Попытка установить пометку удаления. - Если УстановленаПометкаУдаления И ЗначениеЗаполнено(Редактирует) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Нельзя удалить файл ""%1"", - |т.к. он занят для редактирования пользователем ""%2"".'"), - ПолноеНаименование, - Строка(Редактирует) ); - КонецЕсли; - - КонецЕсли; - - НаименованиеВИБ = НаименованиеВИБ(); - Если ПолноеНаименование <> НаименованиеВИБ Тогда - Если ЗначениеЗаполнено(Редактирует) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Нельзя переименовать файл ""%1"", - |т.к. он занят для редактирования пользователем ""%2"".'"), - НаименованиеВИБ, - Строка(Редактирует)); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Наименование = СокрЛП(ПолноеНаименование); - -КонецПроцедуры - -Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) - - Если ЭтоНовый() Тогда - ДатаСоздания = ТекущаяДатаСеанса(); - ХранитьВерсии = Истина; - ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); - - Автор = Пользователи.ТекущийПользователь(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает текущее значение пометки удаления в информационной базе. -Функция ПометкаУдаленияВИБ() - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Файлы.ПометкаУдаления - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Ссылка = &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", Ссылка); - - Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.ПометкаУдаления; - КонецЕсли; - - Возврат Неопределено; -КонецФункции - -// Возвращает текущее значение наименования в информационной базе. -Функция НаименованиеВИБ() - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Файлы.ПолноеНаименование - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Ссылка = &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.ПолноеНаименование; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/Файлы.mdo b/SSL/src/Catalogs/Файлы/Файлы.mdo index 34b816aa5..89a47e207 100644 --- a/SSL/src/Catalogs/Файлы/Файлы.mdo +++ b/SSL/src/Catalogs/Файлы/Файлы.mdo @@ -14,7 +14,6 @@ Файлы в папках Catalog.Файлы.StandardAttribute.Description - Catalog.Файлы.StandardAttribute.Code DontUse Use @@ -150,12 +149,9 @@ 2 true - 11 150 String Variable - true - true AsDescription InDialog BothWays @@ -239,6 +235,26 @@ Use Use + + ДатаМодификацииУниверсальная + + ru + Дата модификации универсальная + + + Date + + + + ru + Дата изменения данных файла (универсальное время) + + + + + Use + Use + ДатаСоздания @@ -347,10 +363,10 @@ Use - ПолноеНаименование + УдалитьПолноеНаименование ru - Полное наименование + (не используется) Полное наименование String @@ -364,7 +380,6 @@ - ShowError @@ -441,7 +456,7 @@ Use - ТекущаяВерсияАвтор + Изменил ru Отредактировал @@ -463,10 +478,10 @@ Use - ТекущаяВерсияДатаМодификацииФайла + УдалитьТекущаяВерсияДатаМодификацииФайла ru - Дата изменения (местное время) + (не используется) Дата изменения (местное время) Date @@ -482,10 +497,10 @@ Use - ТекущаяВерсияДатаСоздания + УдалитьТекущаяВерсияДатаСоздания ru - Дата редактирования + (не используется) Дата редактирования Date @@ -504,10 +519,10 @@ Use - ТекущаяВерсияКод + УдалитьТекущаяВерсияКод ru - Код активной версии + (не используется) Код активной версии String @@ -525,10 +540,10 @@ Use - ТекущаяВерсияНомерВерсии + УдалитьТекущаяВерсияНомерВерсии ru - Номер активной версии + (не используется) Номер активной версии Number @@ -546,7 +561,7 @@ Use - ТекущаяВерсияПутьКФайлу + ПутьКФайлу ru Путь к файлу @@ -565,7 +580,7 @@ Use - ТекущаяВерсияРазмер + Размер ru Размер (байт) @@ -589,7 +604,7 @@ Use - ТекущаяВерсияРасширение + Расширение ru Расширение @@ -611,7 +626,7 @@ Use - ТекущаяВерсияТом + Том ru Том @@ -649,6 +664,65 @@ Use Use + + ТипХраненияФайла + + ru + Тип хранения файла + + + EnumRef.ТипыХраненияФайлов + + + ru + Тип хранения файла (в томе или в информационной базе) + + + + + Index + Use + + + СтатусИзвлеченияТекста + + ru + Статус извлечения текста + + + EnumRef.СтатусыИзвлеченияТекстаФайлов + + + ru + Статус извлечения текста из файла (служебное поле) + + + + + Enum.СтатусыИзвлеченияТекстаФайлов.EmptyRef + + Index + Use + Use + + + ФайлХранилище + + ru + Временное хранилище файла + + + ValueStorage + + + ru + Временное хранилище файла (служебное поле) + + + + + Use + @@ -740,10 +814,10 @@ - СертификатыШифрования + УдалитьСертификатыШифрования ru - Сертификаты шифрования + (не используется) Сертификаты шифрования ru @@ -815,133 +889,6 @@ Use - - ВопросПриВыходеИзТекстовогоРедактора - - ru - Вопрос при выходе из текстового редактора - - PersonalComputer - MobileDevice - - - ВопросПриИмпортеФайлов - - ru - Сообщение о файлах, чей размер превышает допустимый - - - - ru - - - PersonalComputer - MobileDevice - - - ВыборКодировки - - ru - Выбор кодировки - - - - ru - - - PersonalComputer - MobileDevice - - - ВыборСохраненияШифрованногоФайла - - ru - Выбор сохранения шифрованного файла - - - - ru - - - PersonalComputer - MobileDevice - - - ИнформацияФайлНеБылИзменен - - ru - Информация файл не был изменен - - PersonalComputer - MobileDevice - - - РедактированиеТекстовогоФайла - - ru - Редактор текстовых файлов - - - - ru - - - PersonalComputer - MobileDevice - - - РедактируемыеФайлы - - ru - Редактируемые файлы - - true - - - ru - - - PersonalComputer - MobileDevice - - - РежимСозданияФайлаДляСохранитьКак - - ru - Режим создания файла для сохранить как - - - - ru - - - PersonalComputer - MobileDevice - - - СписокЗанятыхСВопросом - - ru - Список занятых с вопросом - - true - - - ru - - - PersonalComputer - MobileDevice - - - ФайлСуществует - - ru - Файл существует - - PersonalComputer - MobileDevice - Файлы @@ -957,54 +904,6 @@ PersonalComputer MobileDevice - - ФайлыВОсновномРабочемКаталоге - - ru - Файлы в основном рабочем каталоге - - true - - - ru - - - PersonalComputer - MobileDevice - - - ФормаВозвратаФайла - - ru - Комментарий к версии - - true - - - ru - - - PersonalComputer - MobileDevice - - - ФормаВопроса - - ru - Форма вопроса - - PersonalComputer - MobileDevice - - - ФормаВопросаЗакончитьРедактирование - - ru - Форма вопроса закончить редактирование - - PersonalComputer - MobileDevice - ФормаВыбора @@ -1019,73 +918,6 @@ PersonalComputer MobileDevice - - ФормаВыбораРежимаОткрытия - - ru - Форма выбора режима открытия - - true - - - ru - - - PersonalComputer - MobileDevice - - - ФормаГрупповаяОперацияНаПапке - - ru - Форма групповая операция на папке - - - - ru - - - PersonalComputer - MobileDevice - - - ФормаИмпортаПапки - - ru - Импорт каталога - - true - - - ru - - - PersonalComputer - MobileDevice - - - ФормаИмпортаФайлов - - ru - Импорт файлов - - - - ru - - - PersonalComputer - MobileDevice - - - ФормаНапоминанияПередПоместитьФайл - - ru - Форма напоминания перед поместить файл - - PersonalComputer - MobileDevice - ФормаНового @@ -1101,20 +933,6 @@ PersonalComputer MobileDevice - - ФормаОтчета - - ru - Форма отчета - - - - ru - - - PersonalComputer - MobileDevice - ФормаПеретаскивания @@ -1143,55 +961,12 @@ PersonalComputer MobileDevice - - ФормаСписка - - ru - Форма списка - - - - ru - - - PersonalComputer - MobileDevice - - - ФормаСпискаПрисоединенныхФайлов - - ru - Форма списка присоединенных файлов - - - - ru - - - PersonalComputer - MobileDevice - - - ФормаЭкспортаПапки - - ru - Форма экспорта папки - - - - ru - - - PersonalComputer - MobileDevice - ФормаЭлемента ru - Карточка файла + Форма элемента - true ru @@ -1207,28 +982,6 @@ Макет отчета - - ВсеФайлы - - ru - Все файлы - - NavigationPanelOrdinary - Auto - - - РедактируемыеФайлы - - ru - Редактируемые файлы - - NavigationPanelOrdinary - Auto - - ru - Открывает список редактируемых файлов в папках - - Файлы diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form index c3ce2c94e..7d2968f88 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 15 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -272,9 +272,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form index 764a03194..c65286a61 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form @@ -60,6 +60,10 @@ Вопросы 136 + + <key>ru</key> + <value>Вопросы</value> + true true @@ -693,7 +697,7 @@ 1 ru - Кнопка ОК + Закончить редактирование вопроса true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Help/ru.html b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Help/ru.html index f7c631740..a9fc25a0b 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Help/ru.html +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Help/ru.html @@ -1,76 +1,15 @@ -

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

      -

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

      -

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

      +

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

      +

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

      • -
        На первой странице мастера напишите Формулировку вопроса, например, "Укажите близких родственников".
        +
        Напишите Формулировку вопроса.
      • -

        С помощью переключателя выберите тип табличного вопроса. Табличные вопросы могут быть четырех типов:

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

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

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

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

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

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

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

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

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

        Просмотр готового табличного вопроса

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

        См. также:

        +
        Нажмите ОК для окончания редактирования.

        См. также:

        \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Module.bsl index 17277281b..e71d46dec 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Module.bsl @@ -122,7 +122,7 @@ КонецПроцедуры -&НаСервере +&НаСервереБезКонтекста Функция РеквизитыВопроса(Вопрос) Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Вопрос,"Представление,Формулировка,ЭтоГруппа,ТипОтвета"); diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form index 90b5c0121..00f002101 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form @@ -158,10 +158,6 @@ ru Страница картинка составной - - ru - Страница картинка составной - СтраницаКартинкаСоставнойExtendedTooltip 153 @@ -231,10 +227,6 @@ ru Страница картинка ответы в строках - - ru - Страница картинка ответы в строках - СтраницаКартинкаОтветыВСтрокахExtendedTooltip 155 @@ -302,10 +294,6 @@ ru Страница картинка ответы в колонках - - ru - Страница картинка ответы в колонках - СтраницаКартинкаОтветыВКолонкахExtendedTooltip 157 @@ -373,10 +361,6 @@ ru Страница картинка ответы в строках и колонках - - ru - Страница картинка ответы в строках и колонках - СтраницаКартинкаОтветыВСтрокахИКолонкахExtendedTooltip 159 @@ -438,10 +422,6 @@ ru Страница картинка пустая - - ru - Страница картинка пустая - СтраницаКартинкаПустаяExtendedTooltip 161 @@ -468,10 +448,6 @@ ru Страницы тип табличного вопроса картинки - - ru - Страницы тип табличного вопроса картинки - СтраницыТипТабличногоВопросаКартинкиExtendedTooltip 152 @@ -496,10 +472,6 @@ ru Страница тип табличного вопроса - - ru - Страница тип табличного вопроса - СтраницаТипТабличногоВопросаExtendedTooltip 150 @@ -565,6 +537,10 @@ ОтветыКолонкиОтветыВСтрокахИКолонках 22 + + <key>ru</key> + <value>Ответы колонки ответы в строках и колонках</value> + true true @@ -774,9 +750,6 @@ true true true - None - None - None true @@ -789,10 +762,6 @@ ru Состав колонок - - ru - Группа состав колонок ответы в строках и колонках - ГруппаСоставКолонокОтветыВСтрокахИКолонкахExtendedTooltip 165 @@ -860,6 +829,10 @@ ОтветыСтрокиОтветыВСтрокахИКолонках 27 + + <key>ru</key> + <value>Ответы строки ответы в строках и колонках</value> + true true @@ -1069,9 +1042,6 @@ true true true - None - None - None true @@ -1084,10 +1054,6 @@ ru Состав строк - - ru - Группа состав строк ответы в строках и колонках - ГруппаСоставСтрокОтветыВСтрокахИКолонкахExtendedTooltip 170 @@ -1115,12 +1081,8 @@
        <key>ru</key> - <value>Группа общая ответы в строках и колонках</value> + <value>Общая ответы в строках и колонках</value> - - ru - Группа общая ответы в строках и колонках - ГруппаОбщаяОтветыВСтрокахИКолонкахExtendedTooltip 164 @@ -1145,10 +1107,10 @@ true - + <key>ru</key> <value>Страница предопределенные ответы в строках и колонках</value> - </toolTip> + СтраницаПредопределенныеОтветыВСтрокахИКолонкахExtendedTooltip 163 @@ -1175,6 +1137,10 @@ Вопросы 136 + + <key>ru</key> + <value>Вопросы</value> + true true @@ -1357,9 +1323,6 @@ true true true - None - None - None true @@ -1463,6 +1426,10 @@ ОтветыКолонкиОтветыВКолонках 42 + + <key>ru</key> + <value>Ответы колонки ответы в колонках</value> + true true @@ -1672,9 +1639,6 @@ true true true - None - None - None true @@ -1727,10 +1691,6 @@ ru Состав колонок - - ru - Группа состав колонок ответы в колонках - ГруппаСоставКолонокОтветыВКолонкахExtendedTooltip 180 @@ -1760,10 +1720,6 @@ ru Страница предопределенные ответы в колонках - - ru - Страница предопределенные ответы в колонках - СтраницаПредопределенныеОтветыВКолонкахExtendedTooltip 179 @@ -1826,6 +1782,10 @@ ОтветыСтрокиОтветыВСтроках 54 + + <key>ru</key> + <value>Ответы строки ответы в строках</value> + true true @@ -2039,9 +1999,6 @@ true true true - None - None - None true @@ -2094,10 +2051,6 @@ ru Состав строк: - - ru - Группа состав строк ответы в строках - ГруппаСоставСтрокОтветыВСтрокахExtendedTooltip 187 @@ -2127,10 +2080,6 @@ ru Состав строк: - - ru - Страница предопределенные ответы в строках - СтраницаПредопределенныеОтветыВСтрокахExtendedTooltip 186 @@ -2153,6 +2102,10 @@ РезультирующаяТаблица 76 + + <key>ru</key> + <value>Результирующая таблица</value> + true true @@ -2278,9 +2231,6 @@ true true true - None - None - None true @@ -2293,10 +2243,6 @@ ru Страница результирующая таблица - - ru - Страница результирующая таблица - СтраницаРезультирующаяТаблицаExtendedTooltip 193 @@ -2343,10 +2289,10 @@ true - + <key>ru</key> - <value>Группа основные страницы</value> - </toolTip> + <value>Основные страницы</value> + ГруппаОсновныеСтраницыРасширеннаяПодсказка 209 @@ -2671,12 +2617,8 @@
        <key>ru</key> - <value>Группа далее</value> + <value>Далее</value> - - ru - Группа далее - 1 Right @@ -2699,6 +2641,10 @@ true + + <key>ru</key> + <value>Кнопки</value> + false ГруппаКнопкиExtendedTooltip diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html index f7c631740..b7642591f 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html @@ -1,9 +1,14 @@ -

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

        +

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

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

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

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

          • diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl index 23221f6f7..e432f1ac8 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl @@ -790,7 +790,7 @@ КонецПроцедуры -&НаСервере +&НаСервереБезКонтекста Функция РеквизитыВопроса(Вопрос) Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Вопрос,"Представление,Формулировка,ЭтоГруппа,ТипОтвета"); diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form index 259419385..7a3612a40 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form @@ -370,12 +370,8 @@ <key>ru</key> - <value>Группа кнопки</value> + <value>Кнопки</value> - - ru - Группа кнопки - true ГруппаКнопкиExtendedTooltip @@ -599,6 +595,24 @@ true + + ПредыдущаяФормулировкаПоВопросу + + <key>ru</key> + <value>Предыдущая формулировка по вопросу</value> + + 11 + + String + + + + true + + + true + + ПеренестиВШаблон diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Help/ru.html b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Help/ru.html index 747f0a313..f3232f410 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Help/ru.html +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Help/ru.html @@ -5,6 +5,9 @@ <ul><li>В поле <strong>Элементарный вопрос</strong> выберите вопрос из ранее подготовленного <a href="ChartOfCharacteristicTypes.ВопросыДляАнкетирования/Help">списка вопросов</a> для анкетирования, после выбора вопроса в этом поле отражается его наименование. Можно создать вопрос в <a href="ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Form.ФормаВыбора/Help">списке выбора</a>, если нужного <a href="ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Form.ФормаЭлемента/Help">вопроса</a> не нашлось. </li><li>Поле <strong>Формулировка</strong> после выборе вопроса для анкетирования автоматически заполняется текстом формулировки вопроса. Здесь же можно изменить формулировку вопроса, которая будет видна респондентам в <a href="Document.Анкета.Form.ФормаСписка/Help">анкетах</a> этого шаблона. </li><li>Если флажок <strong>Обязательный</strong> установлен, то респондент не сможет завершить анкетирование, не ответив на этот вопрос. +</li><li>В поле <strong>Способ отображения подсказки</strong> укажите, как будет показываться подсказка в тексте анкеты: +<ul><li><strong>Контекстная подсказка</strong> - текст подсказки будет все время виден; +</li><li><strong>Знак вопроса справа</strong> - в этом случае текст подсказки скрыт, ее можно увидеть, нажав на знак вопроса.</li></ul></li><li>В поле <strong>Подсказка</strong> напишите краткое объяснение вопроса, для того чтобы респонденту было легче на него отвечать. </li><li>Напишите <strong>Заметки</strong> по поводу вопроса - уточняющую информацию, которая будет выводиться в нижней части шаблона анкеты.</li></ul><h3>См. также:</h3> <ul><li> <div><a href="v8help://frame/form_common">Работа с формами</a>.</div></li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl index 7b27330a2..36e150ed1 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl @@ -49,7 +49,12 @@ РеквизитыВопрос = РеквизитыВопроса(ВыбранноеЗначение); - СформироватьАвтоФормулировку(РеквизитыВопрос.Формулировка); + Если ПустаяСтрока(Формулировка) + Или Формулировка = ПредыдущаяФормулировкаПоВопросу Тогда + Формулировка = РеквизитыВопрос.Формулировка; + КонецЕсли; + + ПредыдущаяФормулировкаПоВопросу = РеквизитыВопрос.Формулировка; КонецПроцедуры @@ -111,23 +116,7 @@ КонецФункции -// Получает значение формулировки элементарного вопроса и заполняет список выбора поля Формулировка. -&НаКлиенте -Функция СформироватьАвтоФормулировку(ФормулировкаЭлементарногоВопроса) - - Элементы.Формулировка.СписокВыбора.Очистить(); - - Если ПустаяСтрока(Формулировка) Тогда - Формулировка = ФормулировкаЭлементарногоВопроса; - КонецЕсли; - - Элементы.Формулировка.СписокВыбора.Добавить(ФормулировкаЭлементарногоВопроса); - - Возврат ФормулировкаЭлементарногоВопроса; - -КонецФункции - -&НаСервере +&НаСервереБезКонтекста Функция РеквизитыВопроса(Вопрос) Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Вопрос,"ЭтоГруппа,ТипОтвета,Формулировка"); diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form index 8fe38e73b..a3b7435bc 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form @@ -10,10 +10,6 @@ <key>ru</key> <value>Группа пользовательских настроек</value> - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 15 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -276,9 +276,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form index e28957bd2..5e4706e6b 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form @@ -273,6 +273,10 @@ ФормаДереваАнкеты 15 + + <key>ru</key> + <value>Форма дерева анкеты</value> + true true @@ -427,10 +431,6 @@ ru Наименование - - ru - Наименование - КартинкаПолныйКодExtendedTooltip 107 @@ -713,10 +713,6 @@ ru Добавить - - ru - Форма дерева анкеты подменю добавить - ФормаДереваАнкетыПодменюДобавитьРасширеннаяПодсказка 114 @@ -828,10 +824,6 @@ ru Форма дерева анкеты группа - - ru - Форма дерева анкеты группа - ФормаДереваАнкетыГруппаРасширеннаяПодсказка 130 @@ -879,6 +871,10 @@ true + + <key>ru</key> + <value>Форма дерева анкеты группа 1</value> + ФормаДереваАнкетыГруппа1РасширеннаяПодсказка 134 @@ -1278,6 +1274,10 @@ true + + <key>ru</key> + <value>Форма дерева анкеты контекстное меню группа 1</value> + ФормаДереваАнкетыКонтекстноеМенюГруппа1РасширеннаяПодсказка 136 @@ -1325,6 +1325,10 @@ true + + <key>ru</key> + <value>Форма дерева анкеты контекстное меню группа 2</value> + ФормаДереваАнкетыКонтекстноеМенюГруппа2РасширеннаяПодсказка 138 @@ -1392,9 +1396,6 @@ CommonPicture.КоллекцияДеревоАнкеты - None - None - None true @@ -1459,10 +1460,6 @@ ru Вопросы - - ru - Дерево анкеты - ДеревоАнкетыExtendedTooltip 87 @@ -1485,6 +1482,10 @@ true + + <key>ru</key> + <value>Основные страницы</value> + ОсновныеСтраницыExtendedTooltip 82 diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl index 92c3d9a0d..be5ad4d95 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl @@ -62,6 +62,7 @@ ИначеЕсли ИмяСобытия = "ОкончаниеРедактированияПараметровСтрокиШаблонаАнкеты" Тогда ЗаполнитьЗначенияСвойств(ТекущиеДанные,Параметр); + ТекущиеДанные.ЕстьЗаметки = Не ПустаяСтрока(ТекущиеДанные.Заметки); Модифицированность = Истина; Если ТекущиеДанные.ТипСтроки <> "Вопрос" Тогда @@ -962,7 +963,7 @@ КонецЕсли; Если СтрокаПеретаскивание.ТипВопроса = ПредопределенноеЗначение("Перечисление.ТипыВопросовШаблонаАнкеты.Комплексный") Тогда - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаПеретаскивание.СоставТабличногоВопроса,НоваяСтрока.СоставКомплексногоВопроса); + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаПеретаскивание.СоставКомплексногоВопроса,НоваяСтрока.СоставКомплексногоВопроса); КонецЕсли; Для каждого Элемент Из СтрокаПеретаскивание.ПолучитьЭлементы() Цикл diff --git a/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl index 58c0ea349..4ea4853c3 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -22,6 +23,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form index 4598eba78..26252ae8f 100644 --- a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form @@ -360,6 +360,10 @@ Left true + + BeforeClose + ПередЗакрытием + OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl index f741ca533..fae886f55 100644 --- a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl @@ -36,6 +36,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если Не ЗавершениеРаботы Тогда + РазблокироватьДанныеФормыДляРедактирования(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -69,4 +78,5 @@ КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form index 48196c869..ac7b88d34 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form @@ -16,10 +16,6 @@ ru Параметры шаблона - - ru - Параметры шаблона - ПараметрыШаблонаРасширеннаяПодсказка 8 @@ -51,6 +47,7 @@ true + true ФормаОКРасширеннаяПодсказка 10 @@ -62,8 +59,8 @@ Form.Command.ОК - Normal Auto + true true true UserCmds @@ -100,6 +97,11 @@ true + + <key>ru</key> + <value>Командная панель формы</value> + + Bottom ГруппаКоманднаяПанельФормыРасширеннаяПодсказка 2 @@ -112,7 +114,7 @@ CommandBar - Left + Right Form diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl index bdd04b93d..c85887b95 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl @@ -9,6 +9,7 @@ Предмет = Параметры.Предмет; ДобавитьЭлементыФормыПараметровШаблона(Параметры.Шаблон); + КонецПроцедуры #КонецОбласти @@ -96,6 +97,8 @@ СписокРеквизитов.Добавить(ПараметрШаблона.Имя); КонецЦикла; + ЭтотОбъект.Высота = 3 + ТаблицаПараметрыШаблона.Количество() * 2; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Form.form index 4a9767a9c..b3eea1085 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Form.form @@ -192,6 +192,10 @@ true + + <key>ru</key> + <value>Командная панель формы</value> + ГруппаКоманднаяПанельФормыРасширеннаяПодсказка 11 diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl index 7ae3cb4ee..eeaef4a84 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl @@ -115,7 +115,6 @@ #КонецОбласти - #Область СлужебныеПроцедурыИФункции &НаСервереБезКонтекста @@ -135,7 +134,7 @@ Процедура ЗаполнитьСписокВыбораВводНаОсновании(ТипПараметра) ПредставлениеТипа = ""; - НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебный.ПриОпределенииНастроек(); + НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебныйПовтИсп.ПриОпределенииНастроек(); Для каждого ПредметШаблона Из НастройкиШаблоновСообщений.ПредметыШаблонов Цикл Если СтрСравнить(ПредметШаблона.Имя, Параметры.ПолноеИмяТипаПараметраВводаНаОсновании) = 0 Тогда Продолжить; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form index aa32380ec..9795bf0ab 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form @@ -44,6 +44,10 @@ Шаблоны 39 + + <key>ru</key> + <value>Шаблоны</value> + true true @@ -287,10 +291,6 @@ ru Страница обычный текст - - ru - Страница обычный текст - СтраницаОбычныйТекстРасширеннаяПодсказка 67 @@ -339,6 +339,7 @@ true FormattedDocumentField + true Enter true Left @@ -356,7 +357,10 @@ true - true + + <key>ru</key> + <value>Страница форматированный документ</value> + СтраницаФорматированныйДокументРасширеннаяПодсказка 63 @@ -383,10 +387,6 @@ ru Страницы предпросмотра - - ru - Страницы предпросмотра - СтраницыПредпросмотраРасширеннаяПодсказка 61 @@ -409,12 +409,8 @@ <key>ru</key> - <value>Группа список выбора</value> + <value>Список выбора</value> - - ru - Группа список выбора - ГруппаСписокВыбораРасширеннаяПодсказка 35 @@ -554,10 +550,6 @@ ru Форма группа редактирование - - ru - Форма группа редактирование - ФормаГруппаРедактированиеРасширеннаяПодсказка 77 diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl index 179742342..e141ac81b 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl @@ -5,7 +5,7 @@ Предмет = Параметры.Предмет; ВидСообщения = Параметры.ВидСообщения; - РежимВыбора = Параметры.РежимВыбора; + РежимВыбора = Параметры.РежимВыбора; Если ВидСообщения = "СообщениеSMS" Тогда ПредназначенДляSMS = Истина; @@ -36,9 +36,8 @@ Процедура ПриОткрытии(Отказ) Если ПустойСписокШаблонов Тогда ПараметрыОтправки = КонструкторПараметровОтправки(); - ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Истина; - Закрыть(); - ОткрытьФормуСообщения(ПараметрыОтправки); + ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Ложь; + СформироватьСообщениеДляОтправки(ПараметрыОтправки); КонецЕсли; КонецПроцедуры @@ -73,7 +72,7 @@ Элементы.ФормаСформироватьИОтправить.Доступность = (Элемент.ТекущиеДанные.Имя <> "<БезШаблона>"); Если Элемент.ТекущиеДанные.ТипТекстаПисьма = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML") Тогда Элементы.СтраницыПредпросмотра.ТекущаяСтраница = Элементы.СтраницаФорматированныйДокумент; - УстановитьHTMLВФорматированныйДокумент(Элемент.ТекущиеДанные.ТекстШаблона, Элемент.ТекущиеДанные.Ссылка); + ПодключитьОбработчикОжидания("ОбновитьДанныеПредпросмотра", 0.2, Истина); Иначе Элементы.СтраницыПредпросмотра.ТекущаяСтраница = Элементы.СтраницаОбычныйТекст; ПредпросмотрОбычныйТекст.УстановитьТекст(Элемент.ТекущиеДанные.ТекстШаблона); @@ -92,20 +91,10 @@ &НаКлиенте Процедура ШаблоныВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - Если РежимВыбора Тогда - ТекущиеДанные = Шаблоны.НайтиПоИдентификатору(ВыбраннаяСтрока); - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыОтправки = КонструкторПараметровОтправки(ТекущиеДанные.Ссылка); - ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Истина; - Сообщение = СформироватьСообщение(ПараметрыОтправки, ВидСообщения); - Закрыть(Сообщение); - Иначе - СформироватьСообщениеПоВыбранномШаблону(); - КонецЕсли; + СтандартнаяОбработка = Ложь; + СформироватьСообщениеПоВыбранномШаблону(); + КонецПроцедуры #КонецОбласти @@ -114,7 +103,9 @@ &НаКлиенте Процедура Сформировать(Команда) + СформироватьСообщениеПоВыбранномШаблону(); + КонецПроцедуры &НаКлиенте @@ -126,6 +117,7 @@ КонецЕсли; ПараметрыОтправки = КонструкторПараметровОтправки(ТекущиеДанные.Ссылка); + ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу = Истина; Если ТекущиеДанные.ЕстьПроизвольныеПараметры Тогда ВводПараметров(ТекущиеДанные.Ссылка, ПараметрыОтправки, Истина); Иначе @@ -143,9 +135,10 @@ Процедура ВводПараметров(Шаблон, ПараметрыОтправки, ОтправлятьСразу) ПараметрыДляЗаполнения = Новый Структура("Шаблон, Предмет", Шаблон, Предмет); - ДополнительныеПараметры = Новый Структура("ПараметрыОтправки, ОтправлятьСразу", ПараметрыОтправки, ОтправлятьСразу); - Оповещение = Новый ОписаниеОповещения("ПослеВводаПараметров", ЭтотОбъект, ДополнительныеПараметры); + + Оповещение = Новый ОписаниеОповещения("ПослеВводаПараметров", ЭтотОбъект, ПараметрыОтправки); ОткрытьФорму("Справочник.ШаблоныСообщений.Форма.ЗаполнитьПроизвольныеПараметры", ПараметрыДляЗаполнения,,,,, Оповещение); + КонецПроцедуры #КонецОбласти @@ -162,107 +155,125 @@ ПараметрыОтправки = КонструкторПараметровОтправки(ТекущиеДанные.Ссылка); ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Истина; - Если РежимВыбора Тогда - Сообщение = СформироватьСообщение(ПараметрыОтправки, ВидСообщения); - Закрыть(Сообщение); + + Если ТекущиеДанные.ЕстьПроизвольныеПараметры Тогда + ВводПараметров(ТекущиеДанные.Ссылка, ПараметрыОтправки, Ложь); Иначе - Если ТекущиеДанные.ЕстьПроизвольныеПараметры Тогда - ВводПараметров(ТекущиеДанные.Ссылка, ПараметрыОтправки, Ложь); - Иначе - Закрыть(); - ОткрытьФормуСообщения(ПараметрыОтправки); - КонецЕсли; + СформироватьСообщениеДляОтправки(ПараметрыОтправки); КонецЕсли; - + КонецПроцедуры &НаКлиенте -Процедура ПослеВводаПараметров(Результат, ДополнительныеПараметры) Экспорт +Процедура СформироватьСообщениеДляОтправки(ПараметрыОтправки) - Если Результат <> Неопределено И Результат <> КодВозвратаДиалога.Отмена Тогда - Если ДополнительныеПараметры.ОтправлятьСразу Тогда - ОтравитьСообщение(ДополнительныеПараметры.ПараметрыОтправки); + АдресВременногоХранилища = Неопределено; + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); + + АдресРезультата = СформироватьСообщениеНаСервере(АдресВременногоХранилища, ПараметрыОтправки, ВидСообщения); + + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + Если ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу Тогда + ПослеФормированияИОтправкиСообщения(Результат, ПараметрыОтправки.ДополнительныеПараметры); + Иначе + Если РежимВыбора Тогда + Закрыть(Результат); Иначе Закрыть(); - ДополнительныеПараметры.ПараметрыОтправки.ДополнительныеПараметры.ПроизвольныеПараметры = Результат; - ОткрытьФормуСообщения(ДополнительныеПараметры.ПараметрыОтправки); + ПоказатьФормуСообщения(Результат); КонецЕсли; КонецЕсли; КонецПроцедуры +&НаСервере +Функция СформироватьСообщениеНаСервере(АдресВременногоХранилища, ПараметрыОтправки, ВидСообщения) + + ПараметрыВызоваСервера = Новый Структура(); + ПараметрыВызоваСервера.Вставить("ПараметрыОтправки", ПараметрыОтправки); + ПараметрыВызоваСервера.Вставить("ВидСообщения", ВидСообщения); + + ШаблоныСообщенийСлужебный.СформироватьСообщениеВФоне(ПараметрыВызоваСервера, АдресВременногоХранилища); + + Возврат АдресВременногоХранилища; + +КонецФункции + +&НаКлиенте +Процедура ПослеВводаПараметров(Результат, ПараметрыОтправки) Экспорт + + Если Результат <> Неопределено И Результат <> КодВозвратаДиалога.Отмена Тогда + ПараметрыОтправки.ДополнительныеПараметры.ПроизвольныеПараметры = Результат; + СформироватьСообщениеДляОтправки(ПараметрыОтправки); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ОтравитьСообщение(Знач ПараметрыОтправкиСообщения) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - ОписаниеОповещения = Новый ОписаниеОповещения("ОтравитьСообщениеПроверкаУчетнойЗаписиВыполнена", ЭтотОбъект, ПараметрыОтправкиСообщения); - МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); + Если ВидСообщения = "Письмо" Тогда + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ОтравитьСообщениеПроверкаУчетнойЗаписиВыполнена", ЭтотОбъект, ПараметрыОтправкиСообщения); + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); + КонецЕсли; + Иначе + СформироватьСообщениеДляОтправки(ПараметрыОтправкиСообщения); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ОтравитьСообщениеПроверкаУчетнойЗаписиВыполнена(Результат, ПараметрыОтправки) Экспорт +Процедура ОтравитьСообщениеПроверкаУчетнойЗаписиВыполнена(УчетнаяЗаписьНастроена, ПараметрыОтправки) Экспорт - Сообщение = СформироватьСообщениеИОтправить(ПараметрыОтправки); - Если Сообщение.Отправлено Тогда; + Если УчетнаяЗаписьНастроена Тогда + СформироватьСообщениеДляОтправки(ПараметрыОтправки); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеФормированияИОтправкиСообщения(Результат, ПараметрыОтправки) + + Если Результат.Отправлено Тогда; Закрыть(); Иначе - ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Истина; Оповещение = Новый ОписаниеОповещения("ПослеВопросаОбОткрытиеФормыСообщения", ЭтотОбъект, ПараметрыОтправки); - ОписаниеОшибки = Сообщение.ОписаниеОшибки + Символы.ПС + НСтр("ru = 'Открыть форму отправки сообщения?'"); + ОписаниеОшибки = Результат.ОписаниеОшибки + Символы.ПС + НСтр("ru = 'Открыть форму отправки сообщения?'"); ПоказатьВопрос(Оповещение, ОписаниеОшибки, РежимДиалогаВопрос.ДаНет); КонецЕсли; - + КонецПроцедуры -&НаСервереБезКонтекста -Функция СформироватьСообщение(ПараметрыОтправки, ВидСообщения) - - Сообщение = ШаблоныСообщений.СформироватьСообщение(ПараметрыОтправки.Шаблон, ПараметрыОтправки.Предмет, ПараметрыОтправки.УникальныйИдентификатор, ПараметрыОтправки.ДополнительныеПараметры); - Если ВидСообщения = "Письмо" Тогда - Возврат ПреобразоватьПараметрыПисьма(Сообщение); - Иначе - Сообщение.Вложения = Неопределено; - КонецЕсли; - - Возврат Сообщение; - -КонецФункции - -&НаСервере -Функция СформироватьСообщениеИОтправить(ПараметрыОтправки) - - Возврат ШаблоныСообщенийСлужебный.СформироватьСообщениеИОтправить(ПараметрыОтправки); - -КонецФункции - &НаКлиенте -Процедура ОткрытьФормуСообщения(Знач ПараметрыОтправки) - - Результат = СформироватьСообщение(ПараметрыОтправки, ВидСообщения); +Процедура ПоказатьФормуСообщения(Сообщение) Если ВидСообщения = "СообщениеSMS" Тогда Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда МодульОтправкаSMSКлиент= ОбщегоНазначенияКлиент.ОбщийМодуль("ОтправкаSMSКлиент"); ДополнительныеПараметры = Новый Структура("ИсточникКонтактнойИнформации, ПеревестиВТранслит"); + + Если Сообщение.ДополнительныеПараметры <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ДополнительныеПараметры, Сообщение.ДополнительныеПараметры); + КонецЕсли; + ДополнительныеПараметры.ИсточникКонтактнойИнформации = Предмет; - ДополнительныеПараметры.ПеревестиВТранслит = - ?(Результат.ДополнительныеПараметры.Свойство("ПеревестиВТранслит"), Результат.ДополнительныеПараметры.ПеревестиВТранслит, Ложь); - МодульОтправкаSMSКлиент.ОтправитьSMS(Результат.Получатель.ВыгрузитьЗначения(), Результат.Текст, ДополнительныеПараметры); + Текст = ?(Сообщение.Свойство("Текст"), Сообщение.Текст, ""); + Получатель = ?(Сообщение.Свойство("Получатель"), Сообщение.Получатель.ВыгрузитьЗначения(), Новый СписокЗначений); + МодульОтправкаSMSКлиент.ОтправитьSMS(Получатель, Текст, ДополнительныеПараметры); КонецЕсли; Иначе Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(Результат); + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(Сообщение); КонецЕсли; КонецЕсли; - Если Результат.Свойство("СообщенияПользователю") - И Результат.СообщенияПользователю <> Неопределено - И Результат.СообщенияПользователю.Количество() > 0 Тогда - Для каждого СообщенияПользователю Из Результат.СообщенияПользователю Цикл + Если Сообщение.Свойство("СообщенияПользователю") + И Сообщение.СообщенияПользователю <> Неопределено + И Сообщение.СообщенияПользователю.Количество() > 0 Тогда + Для каждого СообщенияПользователю Из Сообщение.СообщенияПользователю Цикл ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщенияПользователю.Текст, СообщенияПользователю.КлючДанных, СообщенияПользователю.Поле, СообщенияПользователю.ПутьКДанным); КонецЦикла; @@ -281,6 +292,7 @@ ПараметрыОтправки.ДополнительныеПараметры.Вставить("ПреобразовыватьHTMLДляФорматированногоДокумента", Ложь); ПараметрыОтправки.ДополнительныеПараметры.Вставить("ВидСообщения", ВидСообщения); ПараметрыОтправки.ДополнительныеПараметры.Вставить("ПроизвольныеПараметры", Новый Соответствие); + ПараметрыОтправки.ДополнительныеПараметры.Вставить("ОтправитьСразу", Ложь); Возврат ПараметрыОтправки; @@ -289,7 +301,9 @@ &НаКлиенте Процедура ПослеВопросаОбОткрытиеФормыСообщения(Результат, ПараметрыОтправки) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда - ОткрытьФормуСообщения(ПараметрыОтправки); + ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу = Ложь; + ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Истина; + СформироватьСообщениеДляОтправки(ПараметрыОтправки); КонецЕсли; КонецПроцедуры @@ -302,7 +316,8 @@ КонецПроцедуры -Процедура ОбновитьОкно(Результат, ДополнительныеПараметры) +&НаКлиенте +Процедура ОбновитьОкно(Результат, ДополнительныеПараметры) Экспорт ЗаполнитьСписокДоступныхШаблонов(); КонецПроцедуры @@ -357,6 +372,14 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбновитьДанныеПредпросмотра() + ТекущиеДанные = Элементы.Шаблоны.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + УстановитьHTMLВФорматированныйДокумент(ТекущиеДанные.ТекстШаблона, ТекущиеДанные.Ссылка); + КонецЕсли; +КонецПроцедуры + &НаСервере Процедура УстановитьHTMLВФорматированныйДокумент(ТекстШаблонаПисьмаHTML, СсылкаНаТекущийОбъект); @@ -372,61 +395,7 @@ СтруктураВложений.Вставить(ВложениеВHTML.Представление, Изображение); КонецЦикла; ПредпросмотрФорматированныйДокумент.УстановитьHTML(Сообщение.Текст, СтруктураВложений); - + КонецПроцедуры -&НаСервереБезКонтекста -Функция ПреобразоватьПараметрыПисьма(Сообщение) - - ПараметрыПисьма = Новый Структура(); - ПараметрыПисьма.Вставить("Отправитель"); - ПараметрыПисьма.Вставить("Тема", Сообщение.Тема); - ПараметрыПисьма.Вставить("Текст", Сообщение.Текст); - ПараметрыПисьма.Вставить("СообщенияПользователю", Сообщение.СообщенияПользователю); - ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", Ложь); - - Если Сообщение.Получатель = Неопределено ИЛИ Сообщение.Получатель.Количество() = 0 Тогда - ПараметрыПисьма.Вставить("Получатель", ""); - Иначе - ПараметрыПисьма.Вставить("Получатель", Сообщение.Получатель); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") - И ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда - Если ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") Тогда - СтруктураВложений = Новый Структура(); - - Индекс = Сообщение.Вложения.Количество() - 1; - Пока Индекс >= 0 Цикл - Вложение = Сообщение.Вложения[Индекс]; - Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда - Картинка = Новый Картинка(ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище)); - СтруктураВложений.Вставить(Вложение.Представление, Картинка); - Сообщение.Вложения.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - ПараметрыПисьма.Текст = Новый Структура("ТекстHTML, СтруктураВложений", ПараметрыПисьма.Текст, СтруктураВложений); - Иначе - Если СтрНачинаетсяС(ПараметрыПисьма.Текст, " + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + ГруппаФильтр 42 @@ -101,12 +135,8 @@ <key>ru</key> - <value>Группа фильтр</value> + <value>Фильтр</value> - - ru - Группа фильтр - ГруппаФильтрРасширеннаяПодсказка 43 @@ -127,8 +157,167 @@ - СписокКомпоновщикНастроекПользовательскиеНастройки - 1 + ГруппаКоманднаяПанельСписка + 46 + + Справка + 48 + true + true + + true + + + СправкаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + ФормаГруппаСоздать + 22 + + ФормаСоздатьШаблонЭлектронногоПисьма + 24 + true + true + + true + + + ФормаСоздатьШаблонЭлектронногоПисьмаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.СоздатьШаблонЭлектронногоПисьма + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСоздатьШаблонСообщенияSMS + 26 + true + true + + true + + + ФормаСоздатьШаблонСообщенияSMSРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.СоздатьШаблонСообщенияSMS + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Создать шаблон</value> + + + ФормаГруппаСоздатьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаКоманднаяПанельФормы + 28 + + ФормаПоказыватьКонтекстныеШаблоны + 44 + true + true + + true + + + ФормаПоказыватьКонтекстныеШаблоныРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Command.ПоказыватьКонтекстныеШаблоны + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Командная панель формы</value> + + + ГруппаКоманднаяПанельФормыРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + Form + + true true @@ -136,12 +325,11 @@ <key>ru</key> - <value>Группа пользовательских настроек</value> + <value>Командная панель списка</value> - false - СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка - 2 + ГруппаКоманднаяПанельСпискаРасширеннаяПодсказка + 47 Label true true @@ -149,20 +337,18 @@ Left - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - Auto - Auto + CommandBar + + Left Список 3 + + <key>ru</key> + <value>Список</value> + true true @@ -213,6 +399,10 @@ ШаблонДля 30 + + <key>ru</key> + <value>Шаблон для</value> + true true @@ -249,6 +439,10 @@ Назначение 33 + + <key>ru</key> + <value>Назначение</value> + true true @@ -412,141 +606,12 @@ ФормаКоманднаяПанель -1 - - ФормаГруппаСоздать - 22 - - ФормаСоздатьШаблонЭлектронногоПисьма - 24 - true - true - - true - - - ФормаСоздатьШаблонЭлектронногоПисьмаРасширеннаяПодсказка - 25 - Label - true - true - - Left - - - Form.Command.СоздатьШаблонЭлектронногоПисьма - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСоздатьШаблонСообщенияSMS - 26 - true - true - - true - - - ФормаСоздатьШаблонСообщенияSMSРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - Form.Command.СоздатьШаблонСообщенияSMS - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Создать шаблон</value> - - - ru - Форма группа создать - - - ФормаГруппаСоздатьРасширеннаяПодсказка - 23 - Label - true - true - - Left - - - Popup - - Auto - Normal - - - - ФормаПоказыватьСлужебныеШаблоны - 44 - true - true - - true - - - ФормаПоказыватьСлужебныеШаблоныРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - Form.Command.ПоказыватьСлужебныеШаблоны - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ГруппаКоманднаяПанельФормы - 46 - true - true - - true - - - ГруппаКоманднаяПанельФормыРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - - Form - - Left + + NotificationProcessing + ОбработкаОповещения + OnCreateAtServer ПриСозданииНаСервере @@ -594,8 +659,8 @@ ГДЕ (&Назначение = "" ИЛИ СправочникШаблоныСообщений.Назначение = &Назначение) - И (СправочникШаблоныСообщений.Назначение <> &СлужебныйШаблон - ИЛИ &ПоказыватьСлужебныеШаблоны) + И (СправочникШаблоныСообщений.ВладелецШаблона = Неопределено + ИЛИ &ПоказыватьКонтекстныеШаблоны) Catalog.ШаблоныСообщений true true @@ -719,22 +784,22 @@ Auto - ПоказыватьСлужебныеШаблоны + ПоказыватьКонтекстныеШаблоны <key>ru</key> - <value>Показывать служебные шаблоны</value> + <value>Показывать контекстные шаблоны</value> 3 ru - Показывать служебные шаблоны + Показывать контекстные шаблоны true - ПоказыватьСлужебныеШаблоны + ПоказыватьКонтекстныеШаблоны DontUse diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl index 9007b14e2..cb9cfc390 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl @@ -3,6 +3,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -21,13 +23,16 @@ Элементы.ФормаСоздатьШаблонСообщенияSMS.Видимость = ВключенаОтправкаSMS; Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Видимость = ВключенаРаботаСПочтовымиСообщениями; - Элементы.ФормаПоказыватьСлужебныеШаблоны.Видимость = Пользователи.ЭтоПолноправныйПользователь(); + Элементы.ФормаПоказыватьКонтекстныеШаблоны.Видимость = Пользователи.ЭтоПолноправныйПользователь(); КонецПроцедуры &НаСервере Процедура ИнициализироватьОтборы() + Элементы.НазначениеФильтр.СписокВыбора.Очистить(); + Элементы.ШаблонДляФильтр.СписокВыбора.Очистить(); + Список.Параметры.УстановитьЗначениеПараметра("Назначение", ""); ВидыШаблонов = ШаблоныСообщенийСлужебный.ВидыШаблонов(); @@ -35,8 +40,7 @@ Список.Параметры.УстановитьЗначениеПараметра("СообщениеSMS", ВидыШаблонов.НайтиПоЗначению("SMS").Представление); Список.Параметры.УстановитьЗначениеПараметра("ЭлектроннаяПочта", ВидыШаблонов.НайтиПоЗначению("Email").Представление); - Список.Параметры.УстановитьЗначениеПараметра("СлужебныйШаблон", НСтр("ru='Служебный'")); - Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьСлужебныеШаблоны", Ложь); + Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьКонтекстныеШаблоны", Ложь); Для каждого ВидШаблона Из ВидыШаблонов Цикл Элементы.ШаблонДляФильтр.СписокВыбора.Добавить(ВидШаблона.Значение, ВидШаблона.Представление); @@ -74,6 +78,14 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ПослеЗаписиШаблонаСообщения" Тогда + ИнициализироватьОтборы(); + УстановитьФильтрНазначение(Назначение); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -122,20 +134,24 @@ КонецПроцедуры &НаКлиенте -Процедура ПоказыватьСлужебныеШаблоны(Команда) - Элементы.ФормаПоказыватьСлужебныеШаблоны.Пометка = Не Элементы.ФормаПоказыватьСлужебныеШаблоны.Пометка; - Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьСлужебныеШаблоны", Элементы.ФормаПоказыватьСлужебныеШаблоны.Пометка); - Если Элементы.ФормаПоказыватьСлужебныеШаблоны.Пометка Тогда - Элементы.НазначениеФильтр.СписокВыбора.Добавить("Служебный", НСтр("ru='Служебный'")); - Иначе - Если Назначение = "Служебный" Тогда - УстановитьФильтрНазначение(""); - КонецЕсли; - НайденныйЭлемент = Элементы.НазначениеФильтр.СписокВыбора.НайтиПоЗначению("Служебный"); - Если НайденныйЭлемент <> Неопределено Тогда - Элементы.НазначениеФильтр.СписокВыбора.Удалить(НайденныйЭлемент); - КонецЕсли; - КонецЕсли; +Процедура ПоказыватьКонтекстныеШаблоны(Команда) + Элементы.ФормаПоказыватьКонтекстныеШаблоны.Пометка = Не Элементы.ФормаПоказыватьКонтекстныеШаблоны.Пометка; + Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьКонтекстныеШаблоны", Элементы.ФормаПоказыватьКонтекстныеШаблоны.Пометка); +КонецПроцедуры + +&НаСервере +Процедура УстановитьУсловноеОформление() + + Список.УсловноеОформление.Элементы.Очистить(); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.ВладелецШаблона"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form index 2ab2c8f07..f926bdbbd 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form @@ -5,162 +5,25 @@ Шаблон сообщения электронного письма - ГруппаНаименование - 18 - - Наименование - 4 - true - true - - true - - - Объект.Description - - - НаименованиеРасширеннаяПодсказка - 6 - Label - true - true - - Left - - - - НаименованиеКонтекстноеМеню - 5 - true - - InputField - Auto - true - Left - true - - 50 - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа наименование</value> - - - ru - Группа наименование - - - ГруппаНаименованиеРасширеннаяПодсказка - 19 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаНазначение - 20 - - ВариантыНазначенияДляВсех - 27 - - <key>ru</key> - <value>Назначение</value> - - true - true - - true - - - ВариантыНазначения - - - OnChange - ВариантыНазначенияДляВсехПриИзменении - - - ВариантыНазначенияДляВсехРасширеннаяПодсказка - 29 - Label - true - true - - Left - - - - ВариантыНазначенияДляВсехКонтекстноеМеню - 28 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Общий - - - 0 - - - Vertical - - + ГруппаГлавное + 54 - ГруппаНазначениеВариант - 268 + ГруппаЛеваяСторона + 294 - ВариантыНазначения - 265 - - Style.FormBackColor - + Наименование + 4 true true true - ВариантыНазначения + Объект.Description - - OnChange - ВариантыНазначенияДляВсехПриИзменении - - ВариантыНазначенияРасширеннаяПодсказка - 267 + НаименованиеРасширеннаяПодсказка + 6 Label true true @@ -169,47 +32,124 @@ - ВариантыНазначенияКонтекстноеМеню - 266 + НаименованиеКонтекстноеМеню + 5 true - RadioButtonField - Enter + InputField + Auto true Left true - - - - ru - Только для - - - 1 - - - Vertical + + 50 + true + true + true + true + true + true + Normal + + + + ГруппаВнешняяОбработка + 215 + + ВнешняяОбработка + 217 + true + true + + true + + + Объект.ВнешняяОбработка + + + OnChange + ВнешняяОбработкаПриИзменении + + + ВнешняяОбработкаРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + + ВнешняяОбработкаКонтекстноеМеню + 218 + true + + InputField + Enter + true + Left + true + + true + true + true + false + true + true + true + + Отбор.Вид + + + Enum.ВидыДополнительныхОтчетовИОбработок.EnumValue.ШаблонСообщения + + + + Normal + + + true + + true + + + <key>ru</key> + <value>Внешняя обработка</value> + + + ГруппаВнешняяОбработкаРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto - ПолноеИмяТипаПараметраВводаНаОсновании - 24 - - <key>ru</key> - <value>Назначение</value> - + ТемаПисьма + 171 true true true - Объект.ПолноеИмяТипаПараметраВводаНаОсновании + Объект.ТемаПисьма - None - ПолноеИмяТипаПараметраВводаНаОснованииРасширеннаяПодсказка - 26 + ТемаПисьмаРасширеннаяПодсказка + 173 Label true true @@ -218,8 +158,8 @@ - ПолноеИмяТипаПараметраВводаНаОснованииКонтекстноеМеню - 25 + ТемаПисьмаКонтекстноеМеню + 172 true InputField @@ -228,217 +168,15 @@ Left true - - ChoiceProcessing - ПолноеИмяТипаПараметраВводаНаОснованииОбработкаВыбора - - true + 60 true true - true true true true Normal - true - true - - true - - - <key>ru</key> - <value>Группа назначение вариант</value> - - - ru - Группа назначение вариант - - - ГруппаНазначениеВариантРасширеннаяПодсказка - 269 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа назначение</value> - - - ru - Группа назначение - - - ГруппаНазначениеРасширеннаяПодсказка - 21 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаВнешняяОбработка - 215 - - ВнешняяОбработка - 217 - true - true - - true - - - Объект.ВнешняяОбработка - - - OnChange - ВнешняяОбработкаПриИзменении - - - ВнешняяОбработкаРасширеннаяПодсказка - 219 - Label - true - true - - Left - - - - ВнешняяОбработкаКонтекстноеМеню - 218 - true - - InputField - Enter - true - Left - true - - true - true - true - false - true - true - true - - Отбор.Вид - - - Enum.ВидыДополнительныхОтчетовИОбработок.EnumValue.ШаблонСообщения - - - - Normal - - - true - - true - - - <key>ru</key> - <value>Группа внешняя обработка</value> - - - ГруппаВнешняяОбработкаРасширеннаяПодсказка - 216 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ТемаПисьма - 171 - true - true - - true - - - Объект.ТемаПисьма - - - ТемаПисьмаРасширеннаяПодсказка - 173 - Label - true - true - - Left - - - - ТемаПисьмаКонтекстноеМеню - 172 - true - - InputField - Enter - true - Left - true - - 60 - true - true - true - true - true - true - Normal - - - - ГруппаГлавное - 54 - - ГруппаЛеваяСторона - 294 Страницы 40 @@ -455,12 +193,8 @@ <key>ru</key> - <value>Группа командная панель письма ВHTML</value> + <value>Командная панель письма ВHTML</value> - - ru - Группа командная панель письма ВHTML - ГруппаКоманднаяПанельПисьмаВHTMLРасширеннаяПодсказка 76 @@ -531,10 +265,6 @@ ru Сообщение электронное письмо HTML - - ru - Сообщение электронное письмо HTML - СообщениеЭлектронноеПисьмоHTMLРасширеннаяПодсказка 43 @@ -555,40 +285,6 @@ СообщениеЭлектронноеПисьмо 155 - - ДекорацияТелоПисьма - 168 - - <key>ru</key> - <value>Текст письма:</value> - - true - true - - true - - - ДекорацияТелоПисьмаРасширеннаяПодсказка - 170 - Label - true - true - - Left - - - - ДекорацияТелоПисьмаКонтекстноеМеню - 169 - true - - Label - true - true - - Left - - ТелоСообщенияОбычныйТекст 186 @@ -647,10 +343,6 @@ ru Сообщение электронное письмо - - ru - Сообщение электронное письмо - СообщениеЭлектронноеПисьмоРасширеннаяПодсказка 156 @@ -752,12 +444,8 @@ <key>ru</key> - <value>Группа отправлять в транслите</value> + <value>Отправлять в транслите</value> - - ru - Группа отправлять в транслите - true ГруппаОтправлятьВТранслитеРасширеннаяПодсказка @@ -786,12 +474,8 @@ <key>ru</key> - <value>Группа заголовок сообщение SMS</value> + <value>Заголовок сообщение SMS</value> - - ru - Группа заголовок сообщение SMS - true ГруппаЗаголовокСообщениеSMSРасширеннаяПодсказка @@ -866,10 +550,6 @@ ru Сообщение SMS - - ru - Сообщение SMS - СообщениеSMSРасширеннаяПодсказка 45 @@ -943,10 +623,6 @@ ru Сообщение внешняя обработка - - ru - Сообщение внешняя обработка - СообщениеВнешняяОбработкаРасширеннаяПодсказка 158 @@ -973,10 +649,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 41 @@ -995,147 +667,28 @@ ГруппаДоступ 289 - - ГруппаДоступТолькоАвтору - 299 - - ДоступТолькоДляАвтора - 291 - true - true - - true - - - Доступно - - - OnChange - ДоступТолькоАвторуПриИзменении - - - ДоступТолькоДляАвтораРасширеннаяПодсказка - 293 - Label - true - true - - Left - - - - ДоступТолькоДляАвтораКонтекстноеМеню - 292 - true - - RadioButtonField - Enter - true - Left - true - - - - ru - Только для автора: - - - 0 - - - Vertical - - - - Автор - 301 - true - true - - true - - - Объект.Автор - - None - - OnChange - АвторПриИзменении - - - АвторРасширеннаяПодсказка - 303 - Label - true - true - - Left - - - - АвторКонтекстноеМеню - 302 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - Normal - - - true - true - - true - - - ГруппаДоступТолькоАвторуРасширеннаяПодсказка - 300 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - ДоступВсемПользователям - 296 - - Style.FormBackColor - + Автор + 301 + + <key>ru</key> + <value>Доступен</value> + true true true - Доступно + Объект.Автор OnChange - ДоступВсемПользователямПриИзменении + АвторПриИзменении - ДоступВсемПользователямРасширеннаяПодсказка - 298 + АвторРасширеннаяПодсказка + 303 Label true true @@ -1144,26 +697,28 @@ - ДоступВсемПользователямКонтекстноеМеню - 297 + АвторКонтекстноеМеню + 302 true - RadioButtonField + InputField Enter true Left true - - - - ru - Всем пользователям - - - 1 - - - Vertical + + true + true + true + true + false + true + true + Normal + + ru + Всем + true @@ -1173,12 +728,8 @@ <key>ru</key> - <value>Группа доступ</value> + <value>Доступ</value> - - ru - Группа доступ - ГруппаДоступРасширеннаяПодсказка 290 @@ -1191,7 +742,6 @@ UsualGroup - Vertical Auto WeakSeparation true @@ -1207,12 +757,8 @@ <key>ru</key> - <value>Группа левая сторона</value> + <value>Левая сторона</value> - - ru - Группа левая сторона - ГруппаЛеваяСторонаРасширеннаяПодсказка 295 @@ -1236,6 +782,120 @@ ГруппаПараметры 52 + + ГруппаНазначение + 344 + + Назначение + 346 + + <key>ru</key> + <value>Назначение:</value> + + true + true + + true + + + НазначениеРасширеннаяПодсказка + 348 + Label + true + true + + Left + + + + НазначениеКонтекстноеМеню + 347 + true + + Label + true + true + + Left + + + + ПолноеИмяТипаПараметраВводаНаОсновании + 24 + true + true + + true + + + Объект.ПолноеИмяТипаПараметраВводаНаОсновании + + None + + OnChange + ПолноеИмяТипаПараметраВводаНаОснованииПриИзменении + + + ПолноеИмяТипаПараметраВводаНаОснованииРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ПолноеИмяТипаПараметраВводаНаОснованииКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Назначение</value> + + + ГруппаНазначениеРасширеннаяПодсказка + 345 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + СтраницыЗаголовокПараметры 77 @@ -1247,7 +907,7 @@ 81 <key>ru</key> - <value>Параметры:</value> + <value>Параметры: </value> true true @@ -1281,7 +941,7 @@ 306 РеквизитыМенюДобавитьПараметрПочта - 322 + 328 ДобавитьПараметрВТему 324 @@ -1311,7 +971,7 @@ РеквизитыДобавитьПараметрВТекстСообщения - 326 + 322 true true @@ -1319,7 +979,7 @@ РеквизитыДобавитьПараметрВТекстСообщенияРасширеннаяПодсказка - 327 + 323 Label true true @@ -1345,13 +1005,9 @@ ru Добавить параметр в... - - ru - Реквизиты меню добавить параметр почта - РеквизитыМенюДобавитьПараметрПочтаРасширеннаяПодсказка - 323 + 329 Label true true @@ -1367,7 +1023,7 @@ РеквизитыМенюДобавитьПараметрВТекстСообщенияSMS - 328 + 332 <key>ru</key> <value>Добавить параметр в текст сообщения</value> @@ -1379,7 +1035,7 @@ </userVisible> <extendedTooltip> <name>РеквизитыМенюДобавитьПараметрВТекстСообщенияSMSРасширеннаяПодсказка</name> - <id>329</id> + <id>333</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1398,7 +1054,7 @@ </items> <items xsi:type="form:FormGroup"> <name>ГруппаСтандартныеКнопки</name> - <id>342</id> + <id>334</id> <items xsi:type="form:Button"> <name>Добавить</name> <id>304</id> @@ -1425,32 +1081,6 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>Изменить</name> - <id>344</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИзменитьРасширеннаяПодсказка</name> - <id>345</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Item.Реквизиты.StandardCommand.Change</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> <items xsi:type="form:Button"> <name>Удалить</name> <id>308</id> @@ -1537,9 +1167,13 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Стандартные кнопки</value> + ГруппаСтандартныеКнопкиРасширеннаяПодсказка - 343 + 335 Label true true @@ -1554,6 +1188,10 @@ true + + <key>ru</key> + <value>Реквизиты командная панель</value> + ГруппаРеквизитыКоманднаяПанельРасширеннаяПодсказка 307 @@ -1578,10 +1216,6 @@ ru Страница заголовок параметры - - ru - Страница заголовок параметры - СтраницаЗаголовокПараметрыРасширеннаяПодсказка 80 @@ -1638,12 +1272,8 @@ <key>ru</key> - <value>Группа скрытая выравнивание</value> + <value>Скрытая выравнивание</value> - - ru - Группа скрытая выравнивание - ГруппаСкрытаяВыравниваниеРасширеннаяПодсказка 241 @@ -1667,10 +1297,6 @@ ru Скрытый - - ru - Скрытый заголовок параметры - СкрытыйЗаголовокПараметрыРасширеннаяПодсказка 85 @@ -1733,10 +1359,6 @@ ru Скрытый заголовок сообщение SMS - - ru - Скрытый заголовок сообщение SMS - СкрытыйЗаголовокСообщениеSMSРасширеннаяПодсказка 239 @@ -1759,6 +1381,10 @@ true + + <key>ru</key> + <value>Страницы заголовок параметры</value> + Center СтраницыЗаголовокПараметрыРасширеннаяПодсказка @@ -1895,10 +1521,6 @@ ru Реквизиты представление и формат - - ru - Реквизиты представление и формат - true РеквизитыПредставлениеИФорматРасширеннаяПодсказка @@ -2090,10 +1712,6 @@ ru Добавить параметр в... - - ru - Реквизиты контекстное меню добавить параметр почта - РеквизитыКонтекстноеМенюДобавитьПараметрПочтаРасширеннаяПодсказка 279 @@ -2112,18 +1730,19 @@ РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщенияДляSMS - 287 + 330 <key>ru</key> <value>Добавить параметр в текст сообщения</value> + true true true РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщенияДляSMSРасширеннаяПодсказка - 288 + 331 Label true true @@ -2167,10 +1786,10 @@ ГруппаСтандартныеКнопкиКонтекстноеМеню - 330 + 336 РеквизитыКонтекстноеМенюДобавить - 332 + 316 true true @@ -2178,7 +1797,7 @@ РеквизитыКонтекстноеМенюДобавитьРасширеннаяПодсказка - 333 + 317 Label true true @@ -2196,7 +1815,7 @@ РеквизитыКонтекстноеМенюИзменить - 334 + 338 true true @@ -2204,7 +1823,7 @@ РеквизитыКонтекстноеМенюИзменитьРасширеннаяПодсказка - 335 + 339 Label true true @@ -2222,7 +1841,7 @@ РеквизитыКонтекстноеМенюУдалить - 336 + 320 true true @@ -2230,7 +1849,7 @@ РеквизитыКонтекстноеМенюУдалитьРасширеннаяПодсказка - 337 + 321 Label true true @@ -2248,7 +1867,7 @@ РеквизитыКонтекстноеМенюКопироватьВБуферОбмена - 338 + 340 true true @@ -2256,7 +1875,7 @@ РеквизитыКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 339 + 341 Label true true @@ -2274,7 +1893,7 @@ РеквизитыКонтекстноеМенюВывестиСписок - 340 + 342 true true @@ -2282,7 +1901,7 @@ РеквизитыКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 341 + 343 Label true true @@ -2305,15 +1924,11 @@ <key>ru</key> - <value>Группа стандартные кнопки контекстное меню</value> + <value>Стандартные кнопки контекстное меню</value> - - ru - Группа стандартные кнопки контекстное меню - ГруппаСтандартныеКнопкиКонтекстноеМенюРасширеннаяПодсказка - 331 + 337 Label true true @@ -2429,16 +2044,16 @@ Auto - ВложенияСвойстваВложения - 189 + ВложенияИзменить + 352 true true true - ВложенияСвойстваВложенияРасширеннаяПодсказка - 190 + ВложенияИзменитьРасширеннаяПодсказка + 353 Label true true @@ -2446,34 +2061,7 @@ Left - Form.Command.СвойстваВложения - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВложенияКопироватьВБуферОбмена - 201 - true - true - - true - - - ВложенияКопироватьВБуферОбменаРасширеннаяПодсказка - 202 - Label - true - true - - Left - - - Form.Item.Вложения.StandardCommand.CopyToClipboard + Form.Command.ИзменитьВложение Normal Auto true @@ -2512,6 +2100,33 @@ ГруппаВложенияВывестиСписок 205 + + ВложенияКопироватьВБуферОбмена + 201 + true + true + + true + + + ВложенияКопироватьВБуферОбменаРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Form.Item.Вложения.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ВложенияВывестиСписок 203 @@ -2546,12 +2161,8 @@ <key>ru</key> - <value>Группа вложения вывести список</value> + <value>Вложения вывести список</value> - - ru - Группа вложения вывести список - ГруппаВложенияВывестиСписокРасширеннаяПодсказка 206 @@ -2573,10 +2184,6 @@ ru Командная панель печатные формы и вложения - - ru - Командная панель печатные формы и вложения - КоманднаяПанельПечатныеФормыИВложенияРасширеннаяПодсказка 154 @@ -2600,12 +2207,8 @@ <key>ru</key> - <value>Группа печатные формы и вложения</value> + <value>Печатные формы и вложения</value> - - ru - Группа печатные формы и вложения - ГруппаПечатныеФормыИВложенияРасширеннаяПодсказка 152 @@ -2628,6 +2231,10 @@ Вложения 89 + + <key>ru</key> + <value>Вложения</value> + true true @@ -2990,32 +2597,6 @@ ГруппаВложенияВывестиСписокКонтекстноеМеню 211 - - ВложенияКонтекстноеМенюСвойстваВложения - 207 - true - true - - true - - - ВложенияКонтекстноеМенюСвойстваВложенияРасширеннаяПодсказка - 208 - Label - true - true - - Left - - - Form.Command.СвойстваВложения - Normal - Auto - true - true - UserCmds - Auto - ВложенияВывестиСписокКонтекстноеМеню 213 @@ -3074,6 +2655,10 @@ true + + <key>ru</key> + <value>Вложения вывести список контекстное меню</value> + ГруппаВложенияВывестиСписокКонтекстноеМенюРасширеннаяПодсказка 212 @@ -3192,6 +2777,41 @@ true + + ТранслитерироватьИменаФайлов + 349 + true + true + + true + + + Объект.ТранслитерироватьИменаФайлов + + Right + Button + + ТранслитерироватьИменаФайловРасширеннаяПодсказка + 351 + Label + true + true + + Left + + + + ТранслитерироватьИменаФайловКонтекстноеМеню + 350 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -3199,12 +2819,8 @@ <key>ru</key> - <value>Группа настройки вложений</value> + <value>Настройки вложений</value> - - ru - Группа настройки вложений - ГруппаНастройкиВложенийРасширеннаяПодсказка 271 @@ -3232,7 +2848,7 @@ <key>ru</key> - <value>Группа вложения</value> + <value>Вложения</value> ГруппаВложенияРасширеннаяПодсказка @@ -3261,12 +2877,8 @@ <key>ru</key> - <value>Группа параметры</value> + <value>Параметры</value> - - ru - Группа параметры - ГруппаПараметрыРасширеннаяПодсказка 53 @@ -3294,12 +2906,8 @@ <key>ru</key> - <value>Группа главное</value> + <value>Главное</value> - - ru - Группа главное - ГруппаГлавноеРасширеннаяПодсказка 55 @@ -3500,10 +3108,6 @@ ru Сообщение формируется - - ru - Форма группа сообщение формируется - ФормаГруппаСообщениеФормируетсяРасширеннаяПодсказка 175 @@ -3523,6 +3127,10 @@ Left true + + NotificationProcessing + ОбработкаОповещения + OnOpen ПриОткрытии @@ -3739,26 +3347,6 @@ - - ВариантыНазначения - - <key>ru</key> - <value>Варианты назначения</value> - - 5 - - Number - - 10 - - - - true - - - true - - Вложения @@ -4071,26 +3659,6 @@ <itemValueType/> </extInfo> </attributes> - <attributes> - <name>Доступно</name> - <title> - <key>ru</key> - <value>Доступно</value> - - 11 - - Number - - 10 - - - - true - - - true - - ИспользоватьПроизвольныеПараметры @@ -4149,6 +3717,7 @@ <name>ЭлектронноеПисьмоHTML</name> </handler> </action> + <modifiesStoredData>true</modifiesStoredData> <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -4171,6 +3740,7 @@ <name>ЭлектронноеПисьмоОбычныйТекст</name> </handler> </action> + <modifiesStoredData>true</modifiesStoredData> <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -4218,28 +3788,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>СвойстваВложения</name> - <title> - <key>ru</key> - <value>Свойства</value> - - 6 - - ru - Свойства вложения - - - true - - - - СвойстваВложения - - - DontUse - Auto - ИзменитьВложение @@ -4348,7 +3896,11 @@ <commandInterface> <navigationPanel> <cmiFragmentRecord> - <command>CommonCommand.ПрисоединенныеФайлыКОбъекту</command> + <command>0</command> + <userVisible/> + </cmiFragmentRecord> + <cmiFragmentRecord> + <command>CommonCommand.ПрисоединенныеФайлы</command> <userVisible/> </cmiFragmentRecord> </navigationPanel> diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Help/ru.html index 33b2bf0f7..7f5173b2f 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Help/ru.html @@ -1,5 +1,5 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> -<p>Предназначена для создания шаблона <a href="#1">электронного письма</a> или <a href="#2">SMS-сообщения</a>.</p> +<p>Предназначена для создания шаблона <a href="CommonForm.ОтправкаСообщения/Help">электронного письма</a> или <a href="CommonForm.ОтправкаSMS/Help">SMS-сообщения</a>.</p> <h3><a name="#1">Шаблон электронного письма</a></h3> <p>Шаблон можно создать с помощью соответствующей кнопки из списка шаблонов, а также можно его настроить из исходящего электронного письма с помощью кнопки <strong>Создать на основании</strong>. В последнем случае в шаблон будут включены некоторые поля текущего исходящего электронного письма. Заполните необходимые поля:</p> <ul><li>Напишите <strong>Наименование</strong> так, чтобы было понятно, как будет использоваться шаблон. diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl index 126649806..6560f160d 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl @@ -9,42 +9,19 @@ Возврат; КонецЕсли; - НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебный.ПриОпределенииНастроек(); + Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.СписокВыбора.Добавить("Общий", НСтр("ru='Общий'")); + НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебныйПовтИсп.ПриОпределенииНастроек(); + Для каждого ПредметШаблона Из НастройкиШаблоновСообщений.ПредметыШаблонов Цикл + Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.СписокВыбора.Добавить(ПредметШаблона.Имя, ПредметШаблона.Представление); + КонецЦикла; Если Параметры.Ключ = Неопределено Или Параметры.Ключ.Пустая() Тогда + Если Параметры.ЗначениеКопирования = Справочники.ШаблоныСообщений.ПустаяСсылка() Тогда - Если Параметры.ЗначенияЗаполнения.Количество() = 0 Тогда - Если ЗначениеЗаполнено(Параметры.ПолноеИмяТипаОснования) Тогда - // Контекстный вызов - Объект.ПолноеИмяТипаПараметраВводаНаОсновании = Параметры.ПолноеИмяТипаОснования; - Объект.ПредназначенДляВводаНаОсновании = Истина; - Элементы.ГруппаНазначение.Видимость = Ложь; - Иначе - Объект.ПредназначенДляВводаНаОсновании = Ложь; - КонецЕсли; - КонецЕсли; - - ИнициализироватьНовыйШаблонСообщений(); + ИнициализироватьНовыйШаблонСообщений(НастройкиШаблоновСообщений); Иначе - СписокФайлов = Новый Массив; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - МодульПрисоединенныеФайлы.ПолучитьПрикрепленныеФайлыКОбъекту(Параметры.ЗначениеКопирования, СписокФайлов); - Для каждого Вложение Из СписокФайлов Цикл - Если ПустаяСтрока(Вложение.ИДФайлаЭлектронногоПисьма) Тогда - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Вложение.Расширение); - МодульПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Вложение).Записать(ИмяВременногоФайла); - НоваяСтрока = Вложения.Добавить(); - НоваяСтрока.Имя = ИмяВременногоФайла; - НоваяСтрока.Представление = Вложение.Наименование + "." + Вложение.Расширение; - НоваяСтрока.ИндексКартинки = ПолучитьИндексПиктограммыФайла(Вложение.Расширение); - НоваяСтрока.Статус = "ВнешнийНовый"; - НоваяСтрока.Идентификатор = Вложение.Описание; - КонецЕсли; - КонецЦикла; - КонецЕсли; Для каждого ПараметрыЗначениеКопирования Из Параметры.ЗначениеКопирования.Параметры Цикл Отбор = Новый Структура("ИмяПараметра", ПараметрыЗначениеКопирования.ИмяПараметра); @@ -54,21 +31,18 @@ КонецЕсли КонецЦикла; - УстановитьТекстШаблона(Объект, СписокФайлов); + УстановитьТекстШаблона(Объект, СкопироватьВложенияИзИсточника()); КонецЕсли; + КонецЕсли; - - Для каждого ПредметШаблона Из НастройкиШаблоновСообщений.ПредметыШаблонов Цикл - Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.СписокВыбора.Добавить(ПредметШаблона.Имя, ПредметШаблона.Представление); - КонецЦикла; - ОтображениеЭлементовФормы(); ИнициализироватьФорматыСохранения(); СформироватьСписокРеквизитовИПечатныхФорм(); ИспользоватьПроизвольныеПараметры = НастройкиШаблоновСообщений.ИспользоватьПроизвольныеПараметры; + Если НЕ ИспользоватьПроизвольныеПараметры Тогда Элементы.ГруппаРеквизитыКоманднаяПанель.Видимость = Ложь; Элементы.РеквизитыКонтекстноеМенюДобавить.Видимость = Ложь; @@ -76,10 +50,12 @@ Элементы.РеквизитыКонтекстноеМенюУдалить.Видимость = Ложь; КонецЕсли; - Если СтрНачинаетсяС(Объект.Назначение, "Служебный") Тогда + Если Параметры.Свойство("ВладелецШаблона") Тогда Элементы.ГруппаНазначение.Видимость = Ложь; Элементы.ГруппаДоступ.Видимость = Ложь; Элементы.ФормаГруппаСообщениеФормируется.Видимость = Ложь; + Элементы.Наименование.Видимость = Ложь; + Элементы.Назначение.Видимость = Ложь; КонецЕсли; КонецПроцедуры @@ -117,33 +93,22 @@ КонецЕсли; КонецЦикла; + Если ПустаяСтрока(Объект.ПолноеИмяТипаПараметраВводаНаОсновании) Тогда + Объект.Назначение = НСтр("ru='Общий'"); + Объект.ПредназначенДляВводаНаОсновании = Ложь; + Объект.ПолноеИмяТипаПараметраВводаНаОсновании = НСтр("ru='Общий'"); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) - Если ВариантыНазначения = 1 И ПустаяСтрока(Объект.ПолноеИмяТипаПараметраВводаНаОсновании) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Укажите назначение шаблона сообщения'"),, "Объект.ПолноеИмяТипаПараметраВводаНаОсновании"); - Отказ = Истина; - Возврат; - КонецЕсли; + ПоместитьНовыеФайлыВоВременноеХранилище(Вложения, УникальныйИдентификатор, Отказ); - РезультатПроверкиШаблоны = РезультатПроверкиШаблоны(); - Если ЗначениеЗаполнено(РезультатПроверкиШаблоны) Тогда - ПоказатьПредупреждение(, НСтр("ru='Шаблон сообщения не может быть записан.'") + Символы.ПС - + РезультатПроверкиШаблоны); - Отказ = Истина; - Возврат; - КонецЕсли; - - #Если Не ВебКлиент Тогда - ПоместитьНовыеФайлыВоВременноеХранилище(Вложения, УникальныйИдентификатор, Отказ); - #КонецЕсли - - Объект.ТолькоДляАвтора = ?(Доступно = 1, Ложь, Истина); Если НЕ Объект.ПредназначенДляВводаНаОсновании Тогда Объект.ПолноеИмяТипаПараметраВводаНаОсновании = ""; - Объект.Назначение = ""; + Объект.Назначение = НСтр("ru='Общий'"); КонецЕсли; КонецПроцедуры @@ -151,7 +116,13 @@ &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - ПоместитьНовыеФайлыВоВременноеХранилище(Вложения, УникальныйИдентификатор, Отказ); + РезультатПроверкиШаблоны = РезультатПроверкиШаблоны(); + Если ЗначениеЗаполнено(РезультатПроверкиШаблоны) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Шаблон сообщения не может быть записан.'") + + Символы.ПС + РезультатПроверкиШаблоны); + Отказ = Истина; + Возврат; + КонецЕсли; Если ТекущийОбъект.ПредназначенДляSMS Тогда ТекущийОбъект.ТекстШаблонаSMS = ТелоСообщенияОбычныйТекст.ПолучитьТекст(); @@ -221,10 +192,10 @@ // Добавим в список удаленных вложений ранее сохраненные картинки, отображаемые в теле форматированного документа. - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); СписокФайлов = Новый Массив; - МодульПрисоединенныеФайлы.ПолучитьПрикрепленныеФайлыКОбъекту(ТекущийОбъект.Ссылка, СписокФайлов); + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ТекущийОбъект.Ссылка, СписокФайлов); Для каждого Вложение Из СписокФайлов Цикл Если ЗначениеЗаполнено(Вложение.ИДФайлаЭлектронногоПисьма) Тогда УдалитьПрисоединенныйФайл(Вложение.Ссылка); @@ -266,6 +237,13 @@ &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Оповестить("ПослеЗаписиШаблонаСообщения", Объект.Ссылка, ЭтотОбъект); + + Если ПустаяСтрока(Объект.ПолноеИмяТипаПараметраВводаНаОсновании) Тогда + Объект.Назначение = НСтр("ru='Общий'"); + Объект.ПредназначенДляВводаНаОсновании = Ложь; + Объект.ПолноеИмяТипаПараметраВводаНаОсновании = НСтр("ru='Общий'"); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -274,26 +252,23 @@ СформироватьПредставлениеВыбранныхФорматов(); КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_Файл" И ТипЗнч(Источник) = Тип("СправочникСсылка.ШаблоныСообщенийПрисоединенныеФайлы") Тогда + ОбновитьСписокПечатныхФорм(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте -Процедура ПолноеИмяТипаПараметраВводаНаОснованииОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - Объект.ПолноеИмяТипаПараметраВводаНаОсновании = ВыбранноеЗначение; - Представление = Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение).Представление; - Объект.Назначение = Представление; - СформироватьСписокРеквизитовИПечатныхФорм(); - -КонецПроцедуры - -&НаКлиенте -Процедура ВариантыНазначенияДляВсехПриИзменении(Элемент) - Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.Доступность = ВариантыНазначения; - Объект.ПредназначенДляВводаНаОсновании = (ВариантыНазначения = 1); - Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.АвтоОтметкаНезаполненного = (ВариантыНазначения = 1); - +Процедура ПолноеИмяТипаПараметраВводаНаОснованииПриИзменении(Элемент) + Объект.ПредназначенДляВводаНаОсновании = (Объект.ПолноеИмяТипаПараметраВводаНаОсновании <> "Общий"); + Объект.Назначение = Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.ТекстРедактирования; СформироватьСписокРеквизитовИПечатныхФорм(); КонецПроцедуры @@ -315,91 +290,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ФорматВложенийНажатиеЗавершение(Результат, ДополнительныеПараметры) Экспорт - - РезультатВыбораФорматов = Результат; - Если РезультатВыбораФорматов <> КодВозвратаДиалога.Отмена И РезультатВыбораФорматов <> Неопределено Тогда - УстановитьВыборФормата(РезультатВыбораФорматов.ФорматыСохранения); - Объект.УпаковатьВАрхив = РезультатВыбораФорматов.УпаковатьВАрхив; - СформироватьПредставлениеВыбранныхФорматов(); - Модифицированность = Истина; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ВыбранныеНастройкиФормата() - - ФорматыСохранения = Новый Массив; - - Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл - Если ВыбранныйФормат.Пометка Тогда - ФорматыСохранения.Добавить(ВыбранныйФормат.Значение); - КонецЕсли; - КонецЦикла; - - Результат = Новый Структура; - Результат.Вставить("УпаковатьВАрхив", Объект.УпаковатьВАрхив); - Результат.Вставить("ФорматыСохранения", ФорматыСохранения); - Результат.Вставить("Получатели", Новый Массив); - - Возврат Результат; - -КонецФункции - -&НаКлиенте -Процедура УстановитьВыборФормата(Знач ФорматыСохранения = Неопределено) - - Если Объект.ПредназначенДляSMS Тогда - Возврат; - КонецЕсли; - - ЕстьВыбранныйФормат = Ложь; - Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл - Если ФорматыСохранения <> Неопределено Тогда - ВыбранныйФормат.Пометка = ФорматыСохранения.Найти(ВыбранныйФормат.Значение) <> Неопределено; - КонецЕсли; - - Если ВыбранныйФормат.Пометка Тогда - ЕстьВыбранныйФормат = Истина; - КонецЕсли; - КонецЦикла; - - Если Не ЕстьВыбранныйФормат Тогда - ВыбранныеФорматыСохранения[0].Пометка = Истина; - КонецЕсли; - - -КонецПроцедуры - -&НаКлиенте -Процедура СформироватьПредставлениеВыбранныхФорматов() - - ФорматПечатныхФорм = ""; - КоличествоФорматов = 0; - Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл - Если ВыбранныйФормат.Пометка Тогда - Если Не ПустаяСтрока(ФорматПечатныхФорм) Тогда - ФорматПечатныхФорм = ФорматПечатныхФорм + ", "; - КонецЕсли; - ФорматПечатныхФорм = ФорматПечатныхФорм + ВыбранныйФормат.Представление; - КоличествоФорматов = КоличествоФорматов + 1; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура ДоступВсемПользователямПриИзменении(Элемент) - Доступно = 1; -КонецПроцедуры - -&НаКлиенте -Процедура ДоступТолькоАвторуПриИзменении(Элемент) - Доступно = 0; -КонецПроцедуры - &НаКлиенте Процедура ТелоПисьмаВHTMLПриИзменении(Элемент) ТелоПисьмаВHTML.ПолучитьHTML(Объект.ТекстШаблонаПисьмаHTML, Новый Структура); @@ -418,9 +308,7 @@ &НаКлиенте Процедура АвторПриИзменении(Элемент) - Если НЕ ЗначениеЗаполнено(Объект.Автор) Тогда - Объект.Автор = ПользователиКлиентСервер.АвторизованныйПользователь(); - КонецЕсли; + Объект.ТолькоДляАвтора = ЗначениеЗаполнено(Объект.Автор); КонецПроцедуры #КонецОбласти @@ -430,28 +318,9 @@ &НаКлиенте Процедура ВложенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; - ДобавитьВложениеВыполнить(); -КонецПроцедуры - -&НаКлиенте -Процедура СвойстваВложения(Команда) - - ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; + Если Не Копирование Тогда + ДобавитьВложениеВыполнить(); КонецЕсли; - - ТекущийИндексВКоллекции = Вложения.Индекс(ТекущиеДанные); - - Если ТекущиеДанные.Ссылка = ПредопределенноеЗначение("Справочник.ШаблоныСообщенийПрисоединенныеФайлы.ПустаяСсылка") Тогда - ДополнительныеПараметры = Новый Структура("ТекущийИндексВКоллекции", ТекущийИндексВКоллекции); - ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОЗаписиФайлаПослеЗакрытия", ЭтотОбъект, ДополнительныеПараметры); - ТекстВопроса = НСтр("ru = 'Свойства файла доступны только после его записи. Записать?'"); - ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Иначе - ОткрытьСвойстваВложения(ТекущийИндексВКоллекции); - КонецЕсли; - КонецПроцедуры &НаКлиенте @@ -469,31 +338,19 @@ КонецЕсли; Если ТекущиеДанные.Статус = "ПечатнаяФорма" Или ЗначениеЗаполнено(ТекущиеДанные.Реквизит) Тогда - Элементы.ВложенияКонтекстноеМенюУдалить.Доступность = Ложь; + Элементы.ВложенияКонтекстноеМенюУдалить.Доступность = Ложь; Элементы.ВложенияКонтекстноеМенюИзменитьВложение.Доступность = Ложь; - Элементы.ВложенияКонтекстноеМенюСвойстваВложения.Доступность = Ложь; - Элементы.ВложенияСвойстваВложения.Доступность = Ложь; - Элементы.ВложенияУдалить.Доступность = Ложь; + Элементы.ВложенияИзменить.Доступность = Ложь; + Элементы.ВложенияУдалить.Доступность = Ложь; Иначе - Элементы.ВложенияКонтекстноеМенюУдалить.Доступность = Истина; + Элементы.ВложенияКонтекстноеМенюУдалить.Доступность = Истина; Элементы.ВложенияКонтекстноеМенюИзменитьВложение.Доступность = Истина; - Элементы.ВложенияКонтекстноеМенюСвойстваВложения.Доступность = Истина; - Элементы.ВложенияСвойстваВложения.Доступность = Истина; - Элементы.ВложенияУдалить.Доступность = Истина; + Элементы.ВложенияИзменить.Доступность = Ложь; + Элементы.ВложенияУдалить.Доступность = Истина; КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ИзменитьВложение(Команда) - ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ДобавитьВложениеВыполнить(ТекущиеДанные.Идентификатор); -КонецПроцедуры - &НаКлиенте Процедура ВложенияВыбранПриИзменении(Элемент) ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; @@ -533,7 +390,6 @@ &НаКлиенте Процедура РеквизитыПриАктивизацииСтроки(Элемент) - ТекущиеДанные = Элементы.Реквизиты.ТекущиеДанные; ДоступностьФорматированногоВывода = Ложь; Если ТекущиеДанные <> Неопределено Тогда @@ -545,15 +401,9 @@ Элементы.Удалить.Доступность = Ложь; КонецЕсли; Если ТекущиеДанные.ПолучитьЭлементы().Количество() > 0 Тогда - Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрПочта.Доступность = Ложь; - Элементы.РеквизитыМенюДобавитьПараметрПочта.Доступность = Ложь; - Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщенияДляSMS.Доступность = Ложь; - Элементы.РеквизитыМенюДобавитьПараметрВТекстСообщенияSMS.Доступность = Ложь; + ИзменитьДоступностьКонтекстногоМенюРеквизитов(Ложь); Иначе - Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрПочта.Доступность = Истина; - Элементы.РеквизитыМенюДобавитьПараметрПочта.Доступность = Истина; - Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщенияДляSMS.Доступность = Истина; - Элементы.РеквизитыМенюДобавитьПараметрВТекстСообщенияSMS.Доступность = Истина; + ИзменитьДоступностьКонтекстногоМенюРеквизитов(Истина); Для каждого Тип Из ТекущиеДанные.Тип.Типы() Цикл Если Тип = Тип("Дата") Или Тип = Тип("Число") Или Тип = Тип("Булево") Тогда ДоступностьФорматированногоВывода = Истина; @@ -562,7 +412,10 @@ КонецЦикла; КонецЕсли; КонецЕсли; - Элементы.ФорматОтображенияРеквизита.Доступность = ДоступностьФорматированногоВывода; + Если Элементы.ФорматОтображенияРеквизита.Доступность <> ДоступностьФорматированногоВывода Тогда + Элементы.ФорматОтображенияРеквизита.Доступность = ДоступностьФорматированногоВывода; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -733,7 +586,7 @@ КонецЕсли; КонецЕсли; КонецЕсли; - + КонецПроцедуры &НаКлиенте @@ -748,6 +601,27 @@ КонецПроцедуры +&НаКлиенте +Процедура ИзменитьВложение(Команда) + + ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущийИдентификаторВКоллекции = Элементы.Вложения.ТекущаяСтрока; + + Если ТекущиеДанные.Ссылка = ПредопределенноеЗначение("Справочник.ШаблоныСообщенийПрисоединенныеФайлы.ПустаяСсылка") Тогда + ДополнительныеПараметры = Новый Структура("ТекущийИндексВКоллекции", ТекущийИдентификаторВКоллекции); + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОЗаписиФайлаПослеЗакрытия", ЭтотОбъект, ДополнительныеПараметры); + ТекстВопроса = НСтр("ru = 'Свойства файла доступны только после его записи. Записать?'"); + ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Иначе + ОткрытьСвойстваВложения(ТекущийИдентификаторВКоллекции); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -755,6 +629,7 @@ &НаКлиенте Процедура ПослеЗакрытияФормыПараметра(ОписаниеПараметра, ДополнительныеПараметры) Экспорт Если ТипЗнч(ОписаниеПараметра) = Тип("Структура") Тогда + Модифицированность = Истина; Если ДополнительныеПараметры.Добавление Тогда ДобавитьПроизвольныйПараметр(ОписаниеПараметра); Иначе @@ -773,6 +648,97 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ИзменитьДоступностьКонтекстногоМенюРеквизитов(НовоеЗначение) + + Если Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщения.Доступность <> НовоеЗначение Тогда + Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщения.Доступность = НовоеЗначение; + Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТему.Доступность = НовоеЗначение; + Элементы.ДобавитьПараметрВТему.Доступность = НовоеЗначение; + Элементы.РеквизитыДобавитьПараметрВТекстСообщения.Доступность = НовоеЗначение; + Элементы.РеквизитыКонтекстноеМенюДобавитьПараметрВТекстСообщенияДляSMS.Доступность = НовоеЗначение; + Элементы.РеквизитыМенюДобавитьПараметрВТекстСообщенияSMS.Доступность = НовоеЗначение; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ВыбранныеНастройкиФормата() + + ФорматыСохранения = Новый Массив; + + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл + Если ВыбранныйФормат.Пометка Тогда + ФорматыСохранения.Добавить(ВыбранныйФормат.Значение); + КонецЕсли; + КонецЦикла; + + Результат = Новый Структура; + Результат.Вставить("УпаковатьВАрхив", Объект.УпаковатьВАрхив); + Результат.Вставить("ФорматыСохранения", ФорматыСохранения); + Результат.Вставить("Получатели", Новый Массив); + Результат.Вставить("ПереводитьИменаФайловВТранслит", Объект.ТранслитерироватьИменаФайлов); + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура УстановитьВыборФормата(Знач ФорматыСохранения = Неопределено) + + Если Объект.ПредназначенДляSMS Тогда + Возврат; + КонецЕсли; + + ЕстьВыбранныйФормат = Ложь; + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл + Если ФорматыСохранения <> Неопределено Тогда + ВыбранныйФормат.Пометка = ФорматыСохранения.Найти(ВыбранныйФормат.Значение) <> Неопределено; + КонецЕсли; + + Если ВыбранныйФормат.Пометка Тогда + ЕстьВыбранныйФормат = Истина; + КонецЕсли; + КонецЦикла; + + Если Не ЕстьВыбранныйФормат Тогда + ВыбранныеФорматыСохранения[0].Пометка = Истина; + КонецЕсли; + + +КонецПроцедуры + +&НаКлиенте +Процедура ФорматВложенийНажатиеЗавершение(Результат, ДополнительныеПараметры) Экспорт + + РезультатВыбораФорматов = Результат; + Если РезультатВыбораФорматов <> КодВозвратаДиалога.Отмена И РезультатВыбораФорматов <> Неопределено Тогда + УстановитьВыборФормата(РезультатВыбораФорматов.ФорматыСохранения); + Объект.УпаковатьВАрхив = РезультатВыбораФорматов.УпаковатьВАрхив; + Объект.ТранслитерироватьИменаФайлов = РезультатВыбораФорматов.ПереводитьИменаФайловВТранслит; + СформироватьПредставлениеВыбранныхФорматов(); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьПредставлениеВыбранныхФорматов() + + ФорматПечатныхФорм = ""; + КоличествоФорматов = 0; + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл + Если ВыбранныйФормат.Пометка Тогда + Если Не ПустаяСтрока(ФорматПечатныхФорм) Тогда + ФорматПечатныхФорм = ФорматПечатныхФорм + ", "; + КонецЕсли; + ФорматПечатныхФорм = ФорматПечатныхФорм + ВыбранныйФормат.Представление; + КоличествоФорматов = КоличествоФорматов + 1; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + &НаСервере Процедура ДобавитьПроизвольныйПараметр(ОписаниеПараметра) НоваяПараметр = Объект.Параметры.Добавить(); @@ -787,36 +753,69 @@ КонецПроцедуры &НаСервере -Процедура ИнициализироватьНовыйШаблонСообщений() +Процедура ИнициализироватьНовыйШаблонСообщений(Знач НастройкиШаблоновСообщений) - Если Параметры.Основание = Неопределено Тогда + ВидСообщения = Параметры.ВидСообщения; + + Если ЗначениеЗаполнено(Параметры.ПолноеИмяТипаОснования) Тогда - Если ЗначениеЗаполнено(Параметры.ВидСообщения) Тогда - Если Параметры.ВидСообщения = "СообщениеSMS" Тогда - Объект.ПредназначенДляSMS = Истина; - Объект.ПредназначенДляЭлектронныхПисем = Ложь; - Иначе - Объект.ПредназначенДляSMS = Ложь; - Объект.ПредназначенДляЭлектронныхПисем = Истина; - Объект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; + // Контекстный вызов + Объект.ПолноеИмяТипаПараметраВводаНаОсновании = Параметры.ПолноеИмяТипаОснования; + Элементы.ГруппаНазначение.Видимость = Ложь; + Объект.ПредназначенДляВводаНаОсновании = Истина; + + ИначеЕсли Параметры.ПараметрыВыбора.Количество() > 0 Тогда + + Если Параметры.ПараметрыВыбора.Свойство("Назначение") Тогда + НазначениеШаблона = НастройкиШаблоновСообщений.ПредметыШаблонов.Найти(Параметры.ПараметрыВыбора.Назначение, "Представление"); + Если НазначениеШаблона = Неопределено Тогда + НазначениеШаблона = НастройкиШаблоновСообщений.ПредметыШаблонов.Найти(Параметры.ПараметрыВыбора.Назначение, "Имя"); + КонецЕсли; + Если НазначениеШаблона <> Неопределено Тогда + Объект.ПолноеИмяТипаПараметраВводаНаОсновании = НазначениеШаблона.Имя; + Объект.Назначение = НазначениеШаблона.Представление; + Объект.ПредназначенДляВводаНаОсновании = Истина; КонецЕсли; КонецЕсли; - Объект.ТолькоДляАвтора = Истина; - Объект.Автор = Пользователи.АвторизованныйПользователь(); - Доступно = 0; + Если Параметры.ПараметрыВыбора.Свойство("ПредназначенДляЭлектронныхПисем") + И Параметры.ПараметрыВыбора.ПредназначенДляЭлектронныхПисем Тогда + ВидСообщения = "Письмо" + ИначеЕсли Параметры.ПараметрыВыбора.Свойство("ПредназначенДляSMS") + И Параметры.ПараметрыВыбора.ПредназначенДляSMS Тогда + ВидСообщения = "СообщениеSMS" + КонецЕсли; + + ИначеЕсли Параметры.Основание = Неопределено Тогда + + Объект.ПредназначенДляВводаНаОсновании = Ложь; + Объект.ПолноеИмяТипаПараметраВводаНаОсновании = "Общий"; + + КонецЕсли; + + Если Параметры.Основание = Неопределено Тогда + + Если ВидСообщения = "СообщениеSMS" Тогда + Объект.ПредназначенДляSMS = Истина; + Объект.ПредназначенДляЭлектронныхПисем = Ложь; + Иначе + Объект.ПредназначенДляSMS = Ложь; + Объект.ПредназначенДляЭлектронныхПисем = Истина; + Объект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; + КонецЕсли; + Объект.ТолькоДляАвтора = Ложь; Иначе - Если Объект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда СтруктураВложений = Новый Структура; ТелоПисьмаВHTML.УстановитьHTML(Объект.ТекстШаблонаПисьмаHTML, СтруктураВложений); Иначе ТелоСообщенияОбычныйТекст.УстановитьТекст(Объект.ТекстШаблонаПисьма); КонецЕсли; - КонецЕсли; + Параметры.Свойство("ВладелецШаблона", Объект.ВладелецШаблона); + КонецПроцедуры &НаСервере @@ -891,14 +890,14 @@ Элементы.ФормаПоШаблону.Пометка = Ложь; ЗаполнитьШаблонПоВнешнейОбработке(); Иначе - Элементы.ГруппаНазначение.Доступность = Истина; + Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.Доступность = Истина; Элементы.ТемаПисьма.ТолькоПросмотр = Ложь; Элементы.ГруппаВнешняяОбработка.Видимость = Ложь; Элементы.ГруппаПараметры.Видимость = Истина; Элементы.ФормаВнешнейОбработкой.Пометка = Ложь; Элементы.ФормаПоШаблону.Пометка = Истина; КонецЕсли; - + Если Пользователи.РолиДоступны("ДобавлениеИзменениеШаблоновСообщений") Тогда Элементы.ГруппаДоступ.Видимость = Истина; Иначе @@ -916,10 +915,6 @@ Элементы.ГруппаНастройкиВложений.Видимость = Ложь; КонецЕсли; - Доступно = ?(Объект.ТолькоДляАвтора, 0, 1); - ВариантыНазначения = ?(ЗначениеЗаполнено(Объект.ПолноеИмяТипаПараметраВводаНаОсновании), 1, 0); - Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.Доступность = (ВариантыНазначения = 1); - КонецПроцедуры &НаСервере @@ -934,10 +929,10 @@ СтруктураВложений = Новый Структура(); Если СписокФайлов <> Неопределено Тогда Для каждого Вложение Из СписокФайлов Цикл - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда Если ЗначениеЗаполнено(Вложение.ИДФайлаЭлектронногоПисьма) Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - СведенияОФайле = МодульПрисоединенныеФайлы.ПолучитьДанныеФайла(Вложение, УникальныйИдентификатор); + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + СведенияОФайле = МодульРаботаСФайлами.ДанныеФайла(Вложение, УникальныйИдентификатор); Изображение = Новый Картинка(ПолучитьИзВременногоХранилища(СведенияОФайле.СсылкаНаДвоичныеДанныеФайла)); СтруктураВложений.Вставить(СведенияОФайле.Наименование, Изображение); КонецЕсли; @@ -967,6 +962,16 @@ ЗаполнитьДеревоРеквизитов(СписокРеквизитов, СведенияОШаблоне.ОбщиеРеквизиты, Истина); ЗначениеВРеквизитФормы(СписокРеквизитов, "Реквизиты"); + СформироватьСписокПечатныхФорм(СведенияОШаблоне); + + +КонецПроцедуры + +&НаСервере +Процедура СформироватьСписокПечатныхФорм(СведенияОШаблоне) + + Перем Вложение, ВнутренниеВложение, ВыбранныеПечатныеФормыИВложения, Выбрано, НесохраненныеФайл, НесохраненныеФайлы, НоваяСтрока, Отбор, Расширение, ФайлВложение; + ВыбранныеПечатныеФормыИВложения = Объект.ПечатныеФормыИВложения.Выгрузить(, "Идентификатор").ВыгрузитьКолонку("Идентификатор"); Отбор = Новый Структура("Статус", "ВнешнийНовый"); @@ -981,8 +986,9 @@ ВнутренниеВложение = Истина; Расширение = ?(ПустаяСтрока(Вложение.ТипФайла), "mxl", Вложение.ТипФайла); ФайлВложение.ИндексКартинки = ПолучитьИндексПиктограммыФайла(Расширение); - ФайлВложение.Реквизит = Вложение.Реквизит; - ФайлВложение.Выбрано = 1; + ФайлВложение.Реквизит = Вложение.Реквизит; + ФайлВложение.Выбрано = 1; + ФайлВложение.Представление = Вложение.Представление; Прервать; КонецЕсли; КонецЦикла; @@ -991,18 +997,18 @@ КонецЕсли; Выбрано = 0; - Если ЗначениеЗаполнено(Вложение.Реквизит) Тогда - Выбрано = 2; - КонецЕсли; Если ВыбранныеПечатныеФормыИВложения.Найти(Вложение.Идентификатор) <> Неопределено Тогда Выбрано = 1; + ИначеЕсли ЗначениеЗаполнено(Вложение.Реквизит) Тогда + Выбрано = 2; КонецЕсли; НоваяСтрока = Вложения.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Вложение); Расширение = ?(ПустаяСтрока(Вложение.ТипФайла), "mxl", Вложение.ТипФайла); НоваяСтрока.ИндексКартинки = ПолучитьИндексПиктограммыФайла(Расширение); - НоваяСтрока.Выбрано = Выбрано; + НоваяСтрока.Выбрано = Выбрано; + КонецЦикла; ЗаполнитьВложения(); @@ -1010,15 +1016,25 @@ НоваяСтрока = Вложения.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, НесохраненныеФайл); КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСписокПечатныхФорм() + + ПараметрыШаблона = ШаблоныСообщенийСлужебный.ПараметрыШаблона(Объект); + СведенияОШаблоне = ШаблоныСообщенийСлужебный.СведенияОШаблоне(ПараметрыШаблона); + + СформироватьСписокПечатныхФорм(СведенияОШаблоне); КонецПроцедуры &НаСервере Функция ПолучитьИндексПиктограммыФайла(Расширение) - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиентСервер"); - Возврат МодульФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйКлиентСервер"); + Возврат МодульРаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); КонецЕсли; Возврат 0; @@ -1028,9 +1044,9 @@ &НаКлиенте Функция ПолучитьИндексПиктограммыФайлаКлиент(Расширение) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебныйКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиентСервер"); - Возврат МодульФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиентСервер"); + Возврат МодульРаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); КонецЕсли; Возврат 0; @@ -1071,6 +1087,7 @@ КонецПроцедуры +// проверить шаблон &НаСервере Функция РезультатПроверкиШаблоны() @@ -1295,18 +1312,18 @@ КонецПроцедуры &НаКлиенте -Процедура ОткрытьСвойстваВложения(ТекущийИндексВКоллекции) +Процедура ОткрытьСвойстваВложения(ТекущийИдентификаторВКоллекции) - ТекущиеДанные = Вложения.Получить(ТекущийИндексВКоллекции); + ТекущиеДанные = Вложения.НайтиПоИдентификатору(ТекущийИдентификаторВКоллекции); Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - Элементы.Вложения.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор(); + Элементы.Вложения.ТекущаяСтрока = ТекущийИдентификаторВКоллекции; - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПрисоединенныеФайлыКлиент"); - МодульПрисоединенныеФайлыКлиент.ОткрытьФормуПрисоединенногоФайла(ТекущиеДанные.Ссылка); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиКлиент"); + МодульРаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка,); КонецЕсли КонецПроцедуры @@ -1324,11 +1341,11 @@ &НаСервере Процедура ЗаполнитьВложения(ПереданныеПараметры = Неопределено) - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); СписокФайлов = Новый Массив; - МодульПрисоединенныеФайлы.ПолучитьПрикрепленныеФайлыКОбъекту(Объект.Ссылка, СписокФайлов); + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(Объект.Ссылка, СписокФайлов); Для Каждого СсылкаНаФайл Из СписокФайлов Цикл СведенияОФайле = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаФайл, "ИДФайлаЭлектронногоПисьма, ИндексКартинки, Наименование, Расширение"); Если ПустаяСтрока(СведенияОФайле.ИДФайлаЭлектронногоПисьма) Тогда @@ -1349,6 +1366,43 @@ КонецЕсли КонецПроцедуры +&НаСервере +Функция СкопироватьВложенияИзИсточника() + + СписокФайлов = Новый Массив; + СписокОшибок = Неопределено; + ОписаниеОшибки = НСтр("ru='Не удалось скопировать вложение по причине: %1'"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(Параметры.ЗначениеКопирования, СписокФайлов); + Для каждого Вложение Из СписокФайлов Цикл + Если ПустаяСтрока(Вложение.ИДФайлаЭлектронногоПисьма) Тогда + Попытка + ДанныеФайла = МодульРаботаСФайлами.ДанныеФайла(Вложение, УникальныйИдентификатор, Истина); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытияШаблоныСообщений(), ИнформацияОбОшибке, НСтр("ru='Не удалось извлечь и записать присоединенный файл для копирования.")); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(СписокОшибок, "Вложения", ТекстОшибки, "Вложения",, ТекстОшибки); + Продолжить; + КонецПопытки; + НоваяСтрока = Вложения.Добавить(); + НоваяСтрока.Имя = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; + НоваяСтрока.Представление = Вложение.Наименование + "." + Вложение.Расширение; + НоваяСтрока.ИндексКартинки = ПолучитьИндексПиктограммыФайла(Вложение.Расширение); + НоваяСтрока.Статус = "ВнешнийНовый"; + НоваяСтрока.Идентификатор = Вложение.Описание; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(СписокОшибок); + + Возврат СписокФайлов; + +КонецФункции + &НаКлиенте Процедура УдалитьВложениеВыполнить() @@ -1397,7 +1451,8 @@ // Параметры: // Ссылка - ДокументСсылка - ссылка на владельца присоединенных файлов. // ТипТекстаПисьма - Перечисление.СпособыРедактированияЭлектронныхПисем - для определения необходимости выполнения преобразований. -// ТаблицаСоответствийИменВложенийИдентификаторам - ТаблицаЗначений - позволяет определить какому вложению соответствует какая картинка. +// ТаблицаСоответствийИменВложенийИдентификаторам - ТаблицаЗначений - позволяет определить какому вложению +// соответствует какая картинка. // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы из которого выполняется сохранение. // &НаСервере @@ -1428,8 +1483,8 @@ Функция ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо, АдресВоВременномХранилище, ИмяФайла, Размер, КоличествоПустыхИменВоВложениях = 0) - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); ИмяФайлаДляРазбора = ИмяФайла; РасширениеБезТочки = ПолучитьРасширениеФайла(ИмяФайлаДляРазбора); @@ -1452,7 +1507,7 @@ ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); ПараметрыФайла.Вставить("ВремяИзменения", Неопределено); ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено); - Возврат МодульПрисоединенныеФайлы .ДобавитьПрисоединенныйФайл(ПараметрыФайла, АдресВоВременномХранилище, ""); + Возврат МодульРаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВоВременномХранилище, ""); КонецЕсли; Возврат Неопределено; @@ -1465,7 +1520,6 @@ УсловноеОформление.Элементы.Очистить(); // - Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); @@ -1514,6 +1568,20 @@ КонецЕсли; КонецПроцедуры +Процедура ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытия, ИнформацияОбОшибке, ТекстСобытия) + + Комментарий = ТекстСобытия + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.ШаблоныСообщений,, Комментарий); + +КонецПроцедуры + +&НаСервере +Функция ИмяСобытияШаблоныСообщений() + + Возврат НСтр("ru = 'Шаблоны сообщений'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + +КонецФункции + // Внешняя обработка &НаСервере @@ -1530,18 +1598,14 @@ СтруктураДанныхВнешнейОбработки = ВнешнийОбъект.СтруктураДанныхДляОтображенияВШаблоне(); МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(СтруктураДанныхВнешнейОбработки.ПолноеИмяТипаПараметраВводаНаОсновании); - Если МетаданныеОбъекта = Неопределено Тогда - ВариантыНазначения = 0; - Иначе + Если МетаданныеОбъекта <> Неопределено Тогда ЭлементНазначения = Элементы.ПолноеИмяТипаПараметраВводаНаОсновании.СписокВыбора.НайтиПоЗначению(СтруктураДанныхВнешнейОбработки.ПолноеИмяТипаПараметраВводаНаОсновании); Если ЭлементНазначения = Неопределено Тогда - ВариантыНазначения = 0; ВнешняяОбработка = Неопределено; ОписаниеОшибки = НСтр("ru = 'Предмет %1 определенный в внешней обработке не найдено. Внешняя обработка не может быть подключена.'"); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки, СтруктураДанныхВнешнейОбработки.ПолноеИмяТипаПараметраВводаНаОсновании); Возврат КонецЕсли; - ВариантыНазначения = 1; Объект.ШаблонПоВнешнейОбработке = Истина; Объект.ПолноеИмяТипаПараметраВводаНаОсновании = ЭлементНазначения.Значение; Объект.Назначение = ЭлементНазначения.Представление; @@ -1578,5 +1642,4 @@ КонецПроцедуры -#КонецОбласти - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl index e69de29bb..31edeb017 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl @@ -0,0 +1,48 @@ +#Область ОбработчикиСобытий + +Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) + + Если Параметры.Свойство("ВладелецШаблона") И ЗначениеЗаполнено(Параметры.ВладелецШаблона) Тогда + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Параметры.Вставить("ВладелецШаблона", Параметры.ВладелецШаблона); + Параметры.Вставить("Ключ", ОпределитьШаблонПоВладельцу(Параметры.ВладелецШаблона)); + ВыбраннаяФорма = "Справочник.ШаблоныСообщений.ФормаОбъекта"; + СтандартнаяОбработка = Ложь; + #КонецЕсли + КонецЕсли; + +КонецПроцедуры + + +#КонецОбласти + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +Функция ОпределитьШаблонПоВладельцу(ВладелецШаблона) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ШаблоныСообщений.Ссылка КАК Ссылка + |ИЗ + | Справочник.ШаблоныСообщений КАК ШаблоныСообщений + |ГДЕ + | ШаблоныСообщений.ВладелецШаблона = &ВладелецШаблона"; + + Запрос.УстановитьПараметр("ВладелецШаблона", ВладелецШаблона); + + РезультатЗапроса = Запрос.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + Возврат РезультатЗапроса.Выгрузить()[0].Ссылка; + Иначе + Возврат ПустаяСсылка(); + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl b/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl index 79a0c9dbe..d2d464cb6 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl @@ -11,6 +11,7 @@ ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда ЗаполнитьНаОснованииСтруктуры(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка); КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -20,18 +21,20 @@ Процедура ЗаполнитьНаОснованииЭлектронноеПисьмоИсходящее(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) - ЭтотОбъект.ТемаПисьма = ДанныеЗаполнения.Тема; - ЭтотОбъект.ТекстШаблонаПисьмаHTML = ДанныеЗаполнения.ТекстHTML; - ЭтотОбъект.ТекстШаблонаПисьма = ДанныеЗаполнения.Текст; - ЭтотОбъект.ТемаПисьма = ДанныеЗаполнения.Тема; - ЭтотОбъект.Наименование = ДанныеЗаполнения.Тема; - ЭтотОбъект.ПредназначенДляЭлектронныхПисем = Истина; - ЭтотОбъект.ПредназначенДляSMS = Ложь; - Если ДанныеЗаполнения.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML + ЭтотОбъект.ТемаПисьма = ДанныеЗаполнения.Тема; + ЭтотОбъект.ТекстШаблонаПисьмаHTML = ДанныеЗаполнения.ТекстHTML; + ЭтотОбъект.ТекстШаблонаПисьма = ДанныеЗаполнения.Текст; + ЭтотОбъект.ТемаПисьма = ДанныеЗаполнения.Тема; + ЭтотОбъект.Наименование = ДанныеЗаполнения.Тема; + ЭтотОбъект.ПредназначенДляЭлектронныхПисем = Истина; + ЭтотОбъект.ПредназначенДляSMS = Ложь; + ЭтотОбъект.ПолноеИмяТипаПараметраВводаНаОсновании = НСтр("ru='Общий'"); + + Если ДанныеЗаполнения.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML ИЛИ ДанныеЗаполнения.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками Тогда - ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; + ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; Иначе - ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; + ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; КонецЕсли; КонецПроцедуры @@ -43,73 +46,38 @@ ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПараметрыШаблона); - Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") - И ДанныеЗаполнения.Свойство("ПредназначенДляSMS") - И ДанныеЗаполнения.ПредназначенДляSMS Тогда - ПараметрыШаблона.ТипШаблона = "SMS"; - КонецЕсли; - Если ЗначениеЗаполнено(ПараметрыШаблона.ВнешняяОбработка) Тогда ЭтотОбъект.ШаблонПоВнешнейОбработке = Истина; КонецЕсли; Если ЗначениеЗаполнено(ПараметрыШаблона.ПолноеИмяТипаНазначения) Тогда - - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); + МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); ЭтотОбъект.ПолноеИмяТипаПараметраВводаНаОсновании = ПараметрыШаблона.ПолноеИмяТипаНазначения; - ЭтотОбъект.Назначение = МетаданныеОбъекта.Представление(); - ЭтотОбъект.ПредназначенДляВводаНаОсновании = Истина; - - ИначеЕсли ЗначениеЗаполнено(ПараметрыШаблона.Назначение) Тогда - - НастройкиШаблона = ШаблоныСообщенийСлужебный.ПриОпределенииНастроек(); - - Для каждого ОписаниеШаблона Из НастройкиШаблона.ПредметыШаблонов Цикл - Если СтрСравнить(ПараметрыШаблона.Назначение, ОписаниеШаблона.Представление) = 0 - ИЛИ СтрСравнить(ПараметрыШаблона.Назначение, ОписаниеШаблона.Имя) = 0 Тогда - - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОписаниеШаблона.Имя); - ЭтотОбъект.ПолноеИмяТипаПараметраВводаНаОсновании = ОписаниеШаблона.Имя; - ЭтотОбъект.Назначение = ОписаниеШаблона.Представление; - ЭтотОбъект.ПредназначенДляВводаНаОсновании = Истина; - ПараметрыШаблона.ПолноеИмяТипаНазначения = ОписаниеШаблона.Имя; - Прервать; - - КонецЕсли; - КонецЦикла; - - КонецЕсли; - - Если ПараметрыШаблона.Служебный Тогда - ЭтотОбъект.Назначение = "Служебный"; - Если ДанныеЗаполнения.Свойство("КлючНазначенияИспользования") Тогда - ЭтотОбъект.Назначение = ЭтотОбъект.Назначение + ":" + ДанныеЗаполнения.КлючНазначенияИспользования; - КонецЕсли; + ЭтотОбъект.Назначение= МетаданныеОбъекта.Представление(); + ЭтотОбъект.ПредназначенДляВводаНаОсновании = Истина; КонецЕсли; Если ПараметрыШаблона.ТипШаблона = "Письмо" Тогда - - ЭтотОбъект.ПредназначенДляSMS = Ложь; + ЭтотОбъект.ПредназначенДляSMS = Ложь; ЭтотОбъект.ПредназначенДляЭлектронныхПисем = Истина; - ЭтотОбъект.ТемаПисьма = ПараметрыШаблона.Тема; - + ЭтотОбъект.ТемаПисьма = ПараметрыШаблона.Тема; Если ПараметрыШаблона.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда ЭтотОбъект.ТекстШаблонаПисьмаHTML = ПараметрыШаблона.Текст; - ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; + ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; Иначе ЭтотОбъект.ТекстШаблонаПисьма = ПараметрыШаблона.Текст; ЭтотОбъект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; КонецЕсли; ИначеЕсли ПараметрыШаблона.ТипШаблона = "SMS" Тогда - - ЭтотОбъект.ПредназначенДляSMS = Истина; + ЭтотОбъект.ПредназначенДляSMS = Истина; ЭтотОбъект.ПредназначенДляЭлектронныхПисем = Ложь; ЭтотОбъект.ТекстШаблонаSMS = ПараметрыШаблона.Текст; ЭтотОбъект.ОтправлятьВТранслите = ПараметрыШаблона.ПеревестиВТранслит; - + ИначеЕсли ПараметрыШаблона.ТипШаблона = "Общий" Тогда + ЭтотОбъект.ПредназначенДляSMS = Ложь; + ЭтотОбъект.ПредназначенДляЭлектронныхПисем = Ложь; КонецЕсли; - КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo b/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo index 0824e6f01..6786399a0 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo +++ b/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo @@ -145,6 +145,25 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="8368e1fa-da0c-4a9b-9d50-a122933c7899"> + <name>ВладелецШаблона</name> + <synonym> + <key>ru</key> + <value>Владелец шаблона</value> + </synonym> + <type> + <types>AnyRef</types> + </type> + <toolTip> + <key>ru</key> + <value>Определяет владельца контекстного шаблона</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="37986729-a275-4e86-8613-faee9a4f2525"> <name>ВнешняяОбработка</name> <synonym> @@ -431,6 +450,25 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="2f26970e-b964-43e2-8d6d-999bbc577689"> + <name>ТранслитерироватьИменаФайлов</name> + <synonym> + <key>ru</key> + <value>Транслитерировать имена файлов</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Сформированные печатных формы и файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Счет на оплату.pdf" будет сохранен с именем "Schet na oplaty.pdf".</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="65a50026-88e7-45dd-bb0c-f212218ca093"> <name>УпаковатьВАрхив</name> <synonym> diff --git a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..9b26d1e35 100644 --- a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -13,6 +17,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ШаблоныСообщенийПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ШаблоныСообщенийПрисоединенныеФайлы.mdo index 990c87cb5..95ebbc6e2 100644 --- a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ШаблоныСообщенийПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ШаблоныСообщенийПрисоединенныеФайлы.mdo @@ -117,6 +117,7 @@ <value>Автор</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -126,7 +127,6 @@ <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillChecking>ShowError</fillChecking> - <quickChoice>DontUse</quickChoice> <createOnInput>Use</createOnInput> <fillValue xsi:type="core:ReferenceValue"> <value>Catalog.Пользователи.EmptyRef</value> @@ -154,6 +154,35 @@ <indexing>Index</indexing> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="1e13bd37-61b5-4901-a607-e00e5d1900a8"> + <name>ДатаЗаема</name> + <synonym> + <key>ru</key> + <value>Дата заема</value> + </synonym> + <type> + <types>Date</types> + <dateQualifiers/> + </type> + <format> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </format> + <editFormat> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </editFormat> + <toolTip> + <key>ru</key> + <value>Дата, когда файл был занят для редактирования</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="395b43e4-c18b-4f68-b99c-aed8d4b8cac9"> <name>ДатаМодификацииУниверсальная</name> <synonym> @@ -223,6 +252,7 @@ <value>Изменил</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -231,7 +261,6 @@ </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <quickChoice>DontUse</quickChoice> <createOnInput>Use</createOnInput> <fillValue xsi:type="core:ReferenceValue"> <value>Catalog.Пользователи.EmptyRef</value> @@ -508,15 +537,35 @@ <fillValue xsi:type="core:StringValue"/> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="663a80ba-b97e-4265-a627-4a7d273f9472"> + <name>ХранитьВерсии</name> + <synonym> + <key>ru</key> + <value>Хранить версии</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия.</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <tabularSections uuid="fbf754c3-ab89-4704-b01a-67f8bcea0c7c"> <producedTypes> <objectType typeId="f440fce2-e580-4ca8-bcdf-b12814973c1c" valueTypeId="1054d276-2fae-40ee-a60b-bdad04fc1f00"/> <rowType typeId="819b220f-8ed8-4c78-945d-b0945d2e9f3a" valueTypeId="ae08d6f9-2834-4440-805a-45dd55dda624"/> </producedTypes> - <name>ЭлектронныеПодписи</name> + <name>УдалитьЭлектронныеПодписи</name> <synonym> <key>ru</key> - <value>электронные подписи</value> + <value>(не используется) электронные подписи</value> </synonym> <toolTip> <key>ru</key> @@ -721,10 +770,10 @@ <objectType typeId="21b8eadd-0269-43ee-b8e4-2934a6068e26" valueTypeId="7805ef06-c562-424b-8051-7408444ffc1f"/> <rowType typeId="c5b5617c-3648-40ca-b9e7-50a0815525cd" valueTypeId="e81aa0b2-9b3f-4edc-aeb4-4b99f4d5aa09"/> </producedTypes> - <name>СертификатыШифрования</name> + <name>УдалитьСертификатыШифрования</name> <synonym> <key>ru</key> - <value>Сертификаты шифрования</value> + <value>(не используется) сертификаты шифрования</value> </synonym> <toolTip> <key>ru</key> diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo index 5c36d2084..696078bf6 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ <value>Автор</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -153,6 +154,35 @@ <indexing>Index</indexing> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="1d429511-9446-4102-95f4-df676125e14c"> + <name>ДатаЗаема</name> + <synonym> + <key>ru</key> + <value>Дата заема</value> + </synonym> + <type> + <types>Date</types> + <dateQualifiers/> + </type> + <format> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </format> + <editFormat> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </editFormat> + <toolTip> + <key>ru</key> + <value>Дата, когда файл был занят для редактирования</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="bf1fc624-60d7-4a04-bb3a-b6e2882bebfe"> <name>ДатаМодификацииУниверсальная</name> <synonym> @@ -222,6 +252,7 @@ <value>Отредактировал</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -373,6 +404,7 @@ <value>Редактирует</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -507,15 +539,54 @@ <fillValue xsi:type="core:StringValue"/> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="aa0e290d-21ab-4197-b8f3-cf1f97ab1b98"> + <name>ХранитьВерсии</name> + <synonym> + <key>ru</key> + <value>Хранить версии</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия.</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="eefa9859-4168-4a10-923f-e4a713c99a3b"> + <name>ЭтоВложениеПисьмо</name> + <synonym> + <key>ru</key> + <value>Это вложение письмо</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Признак того, что хранимый файл является электронным письмом.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <tabularSections uuid="5aecdfd1-1cd7-4523-be23-7e32fcb01a94"> <producedTypes> <objectType typeId="60f9d73d-b399-4dd0-bb8e-dcfc7fe846a0" valueTypeId="12a9705a-3732-49d1-bda1-6bd85ea6f287"/> <rowType typeId="3f261abd-0aa8-48bc-8be2-798e5210c287" valueTypeId="fa346882-b525-4375-ad27-4035bf99b7c8"/> </producedTypes> - <name>ЭлектронныеПодписи</name> + <name>УдалитьЭлектронныеПодписи</name> <synonym> <key>ru</key> - <value>электронные подписи</value> + <value>(не используется) электронные подписи</value> </synonym> <toolTip> <key>ru</key> @@ -720,10 +791,10 @@ <objectType typeId="946fa1d5-c10e-4684-8798-85333aaa48fd" valueTypeId="d340c16c-6b3d-4db4-ad64-962247052a13"/> <rowType typeId="d3584d22-0cec-43c5-9ca4-534fe6b87af2" valueTypeId="a61bda21-8119-4b30-8548-0220974229cc"/> </producedTypes> - <name>СертификатыШифрования</name> + <name>УдалитьСертификатыШифрования</name> <synonym> <key>ru</key> - <value>Сертификаты шифрования</value> + <value>(не используется) Сертификаты шифрования</value> </synonym> <toolTip> <key>ru</key> diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl index c870ef204..3b70fa857 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl @@ -2,6 +2,10 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. // @@ -9,10 +13,14 @@ // Массив - список имен реквизитов объекта. Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - Возврат ПрисоединенныеФайлы.РеквизитыРедактируемыеВГрупповойОбработке(); + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo index ef81a6dc4..081b0a87e 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo @@ -116,6 +116,7 @@ <value>Автор</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -153,6 +154,35 @@ <indexing>Index</indexing> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="8e9eb604-5f15-4ef5-8906-5bcd57b3d099"> + <name>ДатаЗаема</name> + <synonym> + <key>ru</key> + <value>Дата заема</value> + </synonym> + <type> + <types>Date</types> + <dateQualifiers/> + </type> + <format> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </format> + <editFormat> + <key>ru</key> + <value>ДЛФ=ДВ</value> + </editFormat> + <toolTip> + <key>ru</key> + <value>Дата, когда файл был занят для редактирования</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="a682e9e1-284f-4e32-86b2-6736f159f585"> <name>ДатаМодификацииУниверсальная</name> <synonym> @@ -222,6 +252,7 @@ <value>Отредактировал</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -372,6 +403,7 @@ <value>Редактирует</value> </synonym> <type> + <types>CatalogRef.УчетныеЗаписиСинхронизацииФайлов</types> <types>CatalogRef.Пользователи</types> </type> <toolTip> @@ -506,15 +538,76 @@ <fillValue xsi:type="core:StringValue"/> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="42f4ad3c-3724-4032-82f0-10c8dbe6cc9f"> + <name>ХранитьВерсии</name> + <synonym> + <key>ru</key> + <value>Хранить версии</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Добавлять версии файла при окончании редактирования. Если отключить, тогда будет хранится только последняя версия.</value> + </toolTip> + <mask>false</mask> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="bbd8b83d-413a-4ffc-8351-e0ec4f4ae619"> + <name>ЭтоВложениеПисьмо</name> + <synonym> + <key>ru</key> + <value>Это вложение письмо</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Признак того, что хранимый файл является электронным письмом.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> + <attributes uuid="c49cef0d-3b71-4e66-9e35-72b94920dae5"> + <name>ПорядковыйНомерВоВложениях</name> + <synonym> + <key>ru</key> + <value>Порядковый номер во вложениях</value> + </synonym> + <type> + <types>Number</types> + <numberQualifiers> + <precision>3</precision> + </numberQualifiers> + </type> + <toolTip> + <key>ru</key> + <value>Порядковый номер вложения в таблице вложений электронного письма.</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <tabularSections uuid="30e06f80-b6d0-4fa9-a346-8e17dbe2fb68"> <producedTypes> <objectType typeId="5132f7c2-f61f-4f36-92be-8d2e1920edc9" valueTypeId="98abc5c9-c4cd-4aa8-902f-7795165e808a"/> <rowType typeId="46ec3982-6024-4c18-a9a7-4578a2a71c1b" valueTypeId="d523a542-50d1-4127-b133-3b0e5f372dcc"/> </producedTypes> - <name>ЭлектронныеПодписи</name> + <name>УдалитьЭлектронныеПодписи</name> <synonym> <key>ru</key> - <value>электронные подписи</value> + <value>(не используется) электронные подписи</value> </synonym> <toolTip> <key>ru</key> @@ -719,10 +812,10 @@ <objectType typeId="b73b3c92-4d7d-4ec4-9ae3-ccaea9b55695" valueTypeId="365609d7-0ecc-4399-8edd-25f745b86129"/> <rowType typeId="b31c33ac-2049-41b4-a8d3-e06409eaee10" valueTypeId="4ad6d83c-0a45-4b33-9a9a-957c77372bed"/> </producedTypes> - <name>СертификатыШифрования</name> + <name>УдалитьСертификатыШифрования</name> <synonym> <key>ru</key> - <value>Сертификаты шифрования</value> + <value>(не используется) Сертификаты шифрования</value> </synonym> <toolTip> <key>ru</key> diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form index 44274be9e..d46d34a85 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ <items xsi:type="form:Table"> <name>Список</name> <id>1</id> + <title> + <key>ru</key> + <value>Список</value> + true true @@ -244,9 +248,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form index c79eaf087..23df086c6 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form @@ -10,10 +10,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 18 @@ -38,6 +34,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -319,9 +319,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form index faaa631b1..593a9d1e5 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form @@ -97,10 +97,10 @@ true - + <key>ru</key> <value>Наименование код</value> - </toolTip> + НаименованиеКодExtendedTooltip 93 @@ -215,262 +215,6 @@ Normal - - ГруппаТипОтвета - 144 - - ТипОтвета - 9 - true - true - - true - - - ТипОтвета - - - OnChange - ТипОтветаПриИзменении - - - ТипОтветаExtendedTooltip - 102 - Label - true - true - - Left - - - - ТипОтветаКонтекстноеМеню - 10 - true - - InputField - true - Auto - true - Left - true - - 43 - true - true - false - true - true - false - ShowInInputField - false - false - false - false - true - true - true - true - - Style.ФонУправляющегоПоля - - Normal - 43 - - - - ГруппаВидПереключателя - 146 - - ГруппаВидПереключателяНеОтображать - 150 - - Декорация1 - 152 - true - true - - true - - - Декорация1РасширеннаяПодсказка - 154 - Label - true - true - - Left - - - - Декорация1КонтекстноеМеню - 153 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа вид переключателя не отображать</value> - - - ГруппаВидПереключателяНеОтображатьРасширеннаяПодсказка - 151 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - ГруппаВидПереключателяОтображать - 148 - - ВидПереключателя - 141 - - <key>ru</key> - <value>Вид</value> - - true - true - - true - - - Объект.ВидПереключателя - - - ВидПереключателяРасширеннаяПодсказка - 143 - Label - true - true - - Left - - - - ВидПереключателяКонтекстноеМеню - 142 - true - - InputField - Enter - true - Left - true - - 12 - true - true - false - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа вид переключателя отображать</value> - - - ГруппаВидПереключателяОтображатьРасширеннаяПодсказка - 149 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Группа вид переключателя</value> - - - ГруппаВидПереключателяРасширеннаяПодсказка - 147 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа тип ответа</value> - - - ru - Группа тип ответа - - - ГруппаТипОтветаРасширеннаяПодсказка - 145 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - Комментарий 18 @@ -563,6 +307,10 @@ true + + <key>ru</key> + <value>Комментарий</value> + КомментарийExtendedTooltip 98 @@ -583,6 +331,258 @@ Auto + + ГруппаТипОтвета + 144 + + ТипОтвета + 9 + true + true + + true + + + ТипОтвета + + + OnChange + ТипОтветаПриИзменении + + + ТипОтветаExtendedTooltip + 102 + Label + true + true + + Left + + + + ТипОтветаКонтекстноеМеню + 10 + true + + InputField + true + Auto + true + Left + true + + 43 + true + true + false + true + true + false + ShowInInputField + false + false + false + false + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + 43 + + + + ГруппаВидПереключателя + 146 + + ГруппаВидПереключателяНеОтображать + 150 + + ДекорацияНеОтображатьВидПереключателя + 152 + true + true + + true + + + ДекорацияНеОтображатьВидПереключателяРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + ДекорацияНеОтображатьВидПереключателяКонтекстноеМеню + 153 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Вид переключателя не отображать</value> + + + ГруппаВидПереключателяНеОтображатьРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаВидПереключателяОтображать + 148 + + ВидПереключателя + 141 + + <key>ru</key> + <value>Вид</value> + + true + true + + true + + + Объект.ВидПереключателя + + + ВидПереключателяРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + ВидПереключателяКонтекстноеМеню + 142 + true + + InputField + Enter + true + Left + true + + 12 + true + true + false + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Вид переключателя отображать</value> + + + ГруппаВидПереключателяОтображатьРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Вид переключателя</value> + + + ГруппаВидПереключателяРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Тип ответа</value> + + + ГруппаТипОтветаРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + ЗависимыеПараметры 20 @@ -778,10 +778,6 @@ ru Реквизиты числа - - ru - Реквизиты числа - РеквизитыЧислаExtendedTooltip 106 @@ -844,10 +840,6 @@ ru Страница число - - ru - Страница число - СтраницаЧислоExtendedTooltip 105 @@ -923,10 +915,6 @@ ru Страница строка - - ru - Страница строка - СтраницаСтрокаExtendedTooltip 112 @@ -1029,6 +1017,10 @@ ТаблицаВариантыОтветов 55 + + <key>ru</key> + <value>Таблица варианты ответов</value> + true true @@ -1230,66 +1222,6 @@ ТаблицаВариантыОтветовКоманднаяПанель 57 - - ТаблицаВариантыОтветовПереместитьВариантОтветаВверх - 87 - true - true - - true - - false - - ТаблицаВариантыОтветовПереместитьВариантОтветаВверхExtendedTooltip - 119 - Label - true - true - - Left - - - Form.Command.ПереместитьВариантОтветаВверх - Normal - Auto - true - true - UserCmds - - StdPicture.MoveUp - - Auto - - - ТаблицаВариантыОтветовПереместитьВариантОтветаВниз - 88 - true - true - - true - - false - - ТаблицаВариантыОтветовПереместитьВариантОтветаВнизExtendedTooltip - 120 - Label - true - true - - Left - - - Form.Command.ПереместитьВариантОтветаВниз - Normal - Auto - true - true - UserCmds - - StdPicture.MoveDown - - Auto - Left true @@ -1412,9 +1344,6 @@ ВариантыОтветов.DefaultPicture - None - None - None true 60 @@ -1436,10 +1365,6 @@ ru Варианты ответов - - ru - Варианты ответов - ВариантыОтветовExtendedTooltip 116 @@ -1673,58 +1598,6 @@ true - - ПереместитьВариантОтветаВверх - - <key>ru</key> - <value>Переместить вариант ответа вверх</value> - - 1 - - ru - Переместить вариант ответа вверх - - - true - - - StdPicture.MoveUp - - - - ПереместитьЭлементВверх - - - true - DontUse - Auto - - - ПереместитьВариантОтветаВниз - - <key>ru</key> - <value>Переместить вариант ответа вниз</value> - - 2 - - ru - Переместить вариант ответа вниз - - - true - - - StdPicture.MoveDown - - - - ПереместитьЭлементВниз - - - true - DontUse - Auto - @@ -1736,8 +1609,8 @@ - AfterWrite - ПослеЗаписи + AfterWriteAtServer + ПослеЗаписиНаСервере BeforeWrite diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Help/ru.html index 39001ccf6..e4fbc0fca 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Help/ru.html @@ -16,7 +16,9 @@
          • Включите флажок Агрегировать сумму в отчетах, для того чтобы в отчете Анализ опроса выводилась общая сумму по всем анкетам, в которых заполнен ответ на этот вопрос.
        • Дата - при ответе на вопрос этого типа респондент вводит дату.
        • Булево - респонденту доступен выбор одного из двух значений: Да или Нет.
        • Выбор одного варианта ответа из предложенных - с помощью этого типа ответа можно предложить респонденту выбрать один из вариантов ответа с помощью переключателей. Возможные варианты ответов составитель может задать в списке. -
        • Выбор нескольких вариантов ответа из предложенных - респондент может отметить произвольное количество вариантов ответа с помощью флажков. Возможные варианты ответов составитель может задать в списке. +
          • С помощью поля Вид можно определить, как будет выглядеть выбор варианта ответа в шаблоне анкеты: +
            • Переключатель; +
            • Тумблер.
        • Выбор нескольких вариантов ответа из предложенных - респондент может отметить произвольное количество вариантов ответа с помощью флажков. Возможные варианты ответов составитель может задать в списке.
          • Если в списке у варианта ответа установить флажок Требует открытого ответа, то респонденту будет предложено дать развернутый ответ в текстовом поле под вариантами ответа, прокомментировав таким образом свой выбор.
        • Помимо перечисленных типов ответов, также имеется возможность выбрать в качестве типа ответа один из некоторых списков программы. В этом случае респондент будет выбирать в качестве ответа на вопрос элемент списка программы.
      • Включение флажка Попросить респондента прокомментировать ответ, пояснив характер комментария на этапе подготовки вопроса позволит респонденту при заполнении анкеты в текстовом поле рядом с ответом разъяснить свой ответ.
        • В случае установки флажка в поле ниже нужно указать текст, который будет выводиться перед текстовым полем разъяснения респондента. Поле является обязательным.
        • Флажок Попросить респондента прокомментировать ответ, пояснив характер комментария недоступен при выборе типа ответа Текст и Выбор нескольких вариантов ответа из предложенных. В ответе типа Текст и так можно дать развернутый ответ. Для ответа типа Выбор нескольких вариантов ответа из предложенных при необходимости предусмотрен вывод поля с комментарием для каждого варианта ответа.
      • См. также:

        diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl index 30be54103..82b761405 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl @@ -33,6 +33,19 @@ Объект.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.Переключатель; КонецЕсли; + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения(); + ПараметрыРазмещения.Источники = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования"); + ПараметрыРазмещения.КоманднаяПанель = Элементы.ФормаКоманднаяПанель; + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения); + + ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения(); + ПараметрыРазмещения.Источники = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет"); + ПараметрыРазмещения.КоманднаяПанель = Элементы.ТаблицаВариантыОтветовКоманднаяПанель; + ПараметрыРазмещения.ПрефиксГрупп = "ВариантыОтветовАнкет"; + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + КонецПроцедуры &НаКлиенте @@ -62,6 +75,19 @@ КонецПроцедуры +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + ДоступностьТаблицыВариантыОтветов(ЭтотОбъект); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ВариантыОтветов, + "Владелец", + Объект.Ссылка, + ВидСравненияКомпоновкиДанных.Равно, + , + Истина); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -73,14 +99,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПослеЗаписи(ПараметрыЗаписи) - - ДоступностьТаблицыВариантыОтветов(); - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ВариантыОтветов,"Владелец", Объект.Ссылка, ВидСравненияКомпоновкиДанных.Равно, ,Истина); - -КонецПроцедуры - &НаКлиенте Процедура ТаблицаВариантыОтветовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) @@ -151,19 +169,31 @@ #Область ОбработчикиКомандФормы +// СтандартныеПодсистемы.ПодключаемыеКоманды &НаКлиенте -Процедура ПереместитьЭлементВверх(Команда) - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(ВариантыОтветов, Элементы.ТаблицаВариантыОтветов); - +Процедура Подключаемый_ВыполнитьКоманду(Команда) + Если СтрНачинаетсяС(Команда.Имя, "ВариантыОтветовАнкет") Тогда + ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.ТаблицаВариантыОтветов); + Иначе + ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) + Если СтрНачинаетсяС(Контекст.ИмяКомандыВФорме, "ВариантыОтветовАнкет") Тогда + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.ТаблицаВариантыОтветов, Результат); + Иначе + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат); + КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ПереместитьЭлементВниз(Команда) - - НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(ВариантыОтветов, Элементы.ТаблицаВариантыОтветов); - +Процедура Подключаемый_ОбновитьКоманды() + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.ТаблицаВариантыОтветов); КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды #КонецОбласти @@ -247,7 +277,7 @@ Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.ВариантыОтветов; - ДоступностьТаблицыВариантыОтветов(); + ДоступностьТаблицыВариантыОтветов(ЭтотОбъект); Иначе @@ -299,21 +329,21 @@ КонецПроцедуры -&НаКлиенте -Процедура ДоступностьТаблицыВариантыОтветов() +&НаКлиентеНаСервереБезКонтекста +Процедура ДоступностьТаблицыВариантыОтветов(Форма) - Если Объект.Ссылка.Пустая() Тогда - Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Истина; - ИнформацияВариантыОтветов = НСтр("ru = 'Для редактирования вариантов ответов необходимо записать вопрос для анкетирования'"); + Если Форма.Объект.Ссылка.Пустая() Тогда + Форма.Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Истина; + Форма.ИнформацияВариантыОтветов = НСтр("ru = 'Для редактирования вариантов ответов необходимо записать вопрос для анкетирования'"); Иначе - Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Ложь; - ИнформацияВариантыОтветов = НСтр("ru = 'Варианты ответов на вопрос:'"); + Форма.Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Ложь; + Форма.ИнформацияВариантыОтветов = НСтр("ru = 'Варианты ответов на вопрос:'"); КонецЕсли; - Если ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз") Тогда - Элементы.ТребуетОткрытогоОтвета.Видимость = Ложь; - ИначеЕсли ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз") Тогда - Элементы.ТребуетОткрытогоОтвета.Видимость = Истина; + Если Форма.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз") Тогда + Форма.Элементы.ТребуетОткрытогоОтвета.Видимость = Ложь; + ИначеЕсли Форма.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз") Тогда + Форма.Элементы.ТребуетОткрытогоОтвета.Видимость = Истина; КонецЕсли; КонецПроцедуры @@ -413,5 +443,4 @@ КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl index 2ae86c019..ca894754e 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -17,6 +18,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ВыборРеквизита/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ВыборРеквизита/Form.form index 42f56ca87..f3ee3ad90 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ВыборРеквизита/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ВыборРеквизита/Form.form @@ -7,6 +7,10 @@ РеквизитыОбъекта 1 + + <key>ru</key> + <value>Реквизиты объекта</value> + true true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Form.form index 52ee7b2f0..ebbb26230 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Form.form @@ -153,6 +153,24 @@ Не заполнено + + + ru + В списке + + + В списке + + + + + ru + Не в списке + + + Не в списке + + Normal @@ -516,6 +534,7 @@ 3 + ValueList Boolean String Date diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Help/ru.html new file mode 100644 index 000000000..d33799873 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Help/ru.html @@ -0,0 +1,8 @@ + +

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

        +

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

        +

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

        +

        Таблица для ввода условий состоит из колонок:

        +
        • выберите Реквизит из списка с помощью кнопки ; +
        • выберите Вид сравнения; +
        • выберите из списка или напишите нужное Значение (в зависимости от выбранного реквизита способ указания значения может меняться).

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

        \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl index 7d8e22f63..0e340ca19 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl @@ -43,18 +43,45 @@ РеквизитыОбъекта = СписокРеквизитовДляОтбора(ПолноеИмяОбъектаМетаданных, НаборДополнительныхРеквизитов); + СтрокаОтбора = Неопределено; ЗависимостиДополнительныхРеквизитов = Параметры.ЗависимостиРеквизитов; Для Каждого СтрокаТабличнойЧасти Из ЗависимостиДополнительныхРеквизитов Цикл Если СтрокаТабличнойЧасти.ЗависимоеСвойство = НастраиваемоеСвойство Тогда - СтрокаОтбора = ЗависимостиРеквизитов.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаОтбора, СтрокаТабличнойЧасти); + РеквизитСМножественнымЗначением = (СтрокаТабличнойЧасти.Условие = "В списке") + Или (СтрокаТабличнойЧасти.Условие = "Не в списке"); + + Если РеквизитСМножественнымЗначением Тогда + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Реквизит", СтрокаТабличнойЧасти.Реквизит); + ПараметрыОтбора.Вставить("Условие", СтрокаТабличнойЧасти.Условие); + + РезультатПоиска = ЗависимостиРеквизитов.НайтиСтроки(ПараметрыОтбора); + Если РезультатПоиска.Количество() = 0 Тогда + СтрокаОтбора = ЗависимостиРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаОтбора, СтрокаТабличнойЧасти,, "Значение"); + + Значения = Новый СписокЗначений; + Значения.Добавить(СтрокаТабличнойЧасти.Значение); + СтрокаОтбора.Значение = Значения; + Иначе + СтрокаОтбора = РезультатПоиска[0]; + СтрокаОтбора.Значение.Добавить(СтрокаТабличнойЧасти.Значение); + КонецЕсли; + Иначе + СтрокаОтбора = ЗависимостиРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаОтбора, СтрокаТабличнойЧасти); + КонецЕсли; ОписаниеРеквизита = РеквизитыОбъекта.Найти(СтрокаОтбора.Реквизит, "Реквизит"); Если ОписаниеРеквизита = Неопределено Тогда Продолжить; // Реквизит объекта не найден. КонецЕсли; + СтрокаОтбора.РежимВыбора = ОписаниеРеквизита.РежимВыбора; СтрокаОтбора.Представление = ОписаниеРеквизита.Представление; СтрокаОтбора.ТипЗначения = ОписаниеРеквизита.ТипЗначения; + Если РеквизитСМножественнымЗначением Тогда + СтрокаОтбора.Значение.ТипЗначения = ОписаниеРеквизита.ТипЗначения; + КонецЕсли; КонецЕсли; КонецЦикла; @@ -77,8 +104,19 @@ &НаКлиенте Процедура ЗависимостиРеквизитовВидСравненияПриИзменении(Элемент) - ТекущаяСтрока = ЗависимостиРеквизитов.НайтиПоИдентификатору(Элементы.ЗависимостиРеквизитов.ТекущаяСтрока); + ЗависимостиРеквизитовУстановитьОграничениеТиповДляЗначения(); + + ТаблицаФормы = Элементы.ЗависимостиРеквизитов; + ТекущаяСтрока = ЗависимостиРеквизитов.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока); ТекущаяСтрока.Значение = Неопределено; + + Если ТаблицаФормы.ТекущиеДанные.Условие = "В списке" + Или ТаблицаФормы.ТекущиеДанные.Условие = "Не в списке" Тогда + ТекущаяСтрока.Значение = Новый СписокЗначений; + ТекущаяСтрока.Значение.ТипЗначения = ТаблицаФормы.ТекущиеДанные.ТипЗначения; + Иначе + ТекущаяСтрока.Значение = Неопределено; + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -137,10 +175,29 @@ КопияТаблицы.Колонки.Удалить("Представление"); КопияТаблицы.Колонки.Удалить("ТипЗначения"); + ПараметрОтбора = Новый Структура; + ПараметрОтбора.Вставить("Условие", "В списке"); // Идентификатор. + ПреобразоватьЗависимостиВСписке(КопияТаблицы, ПараметрОтбора); + ПараметрОтбора.Условие = "Не в списке"; // Идентификатор. + ПреобразоватьЗависимостиВСписке(КопияТаблицы, ПараметрОтбора); + Возврат Новый ХранилищеЗначения(КопияТаблицы); КонецФункции +&НаСервере +Процедура ПреобразоватьЗависимостиВСписке(Таблица, Отбор) + НайденныеСтроки = Таблица.НайтиСтроки(Отбор); + Для Каждого Строка Из НайденныеСтроки Цикл + Для Каждого Элемент Из Строка.Значение Цикл + НоваяСтрока = Таблица.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + НоваяСтрока.Значение = Элемент.Значение; + КонецЦикла; + Таблица.Удалить(Строка); + КонецЦикла; +КонецПроцедуры + &НаСервере Функция СписокРеквизитовДляОтбора(ПолноеИмяОбъектаМетаданных, НаборДополнительныхРеквизитов) @@ -225,7 +282,12 @@ КонецЕсли; ПолеВвода.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); - ПолеВвода.ОграничениеТипа = ТаблицаФормы.ТекущиеДанные.ТипЗначения; + Если ТаблицаФормы.ТекущиеДанные.Условие = "В списке" + Или ТаблицаФормы.ТекущиеДанные.Условие = "Не в списке" Тогда + ПолеВвода.ОграничениеТипа = Новый ОписаниеТипов("СписокЗначений"); + Иначе + ПолеВвода.ОграничениеТипа = ТаблицаФормы.ТекущиеДанные.ТипЗначения; + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form index 13dbfc55d..26b024ce5 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form @@ -302,10 +302,6 @@ ru Вид общие значения реквизитов - - ru - Вид общие значения реквизитов - ВидОбщиеЗначенияРеквизитовExtendedTooltip 69 @@ -424,10 +420,6 @@ ru Вид общий реквизит - - ru - Вид общий реквизит - ВидОбщийРеквизитExtendedTooltip 72 @@ -478,10 +470,6 @@ ru Дополнительный реквизит - - ru - Дополнительный реквизит - ДополнительныйРеквизитРасширеннаяПодсказка 62 @@ -588,10 +576,6 @@ ru Сведение предупреждение - - ru - Сведение предупреждение - СведениеПредупреждениеExtendedTooltip 76 @@ -798,10 +782,6 @@ ru Вид общие значения сведений - - ru - Вид общие значения сведений - ВидОбщиеЗначенияСведенийExtendedTooltip 82 @@ -920,10 +900,6 @@ ru Вид общее сведение - - ru - Вид общее сведение - ВидОбщееСведениеExtendedTooltip 85 @@ -950,10 +926,6 @@ ru Виды сведения - - ru - Виды сведения - ВидыСведенияExtendedTooltip 81 @@ -978,10 +950,6 @@ ru Дополнительное сведение - - ru - Дополнительное сведение - ДополнительноеСведениеРасширеннаяПодсказка 75 @@ -1008,10 +976,6 @@ ru Типы свойства - - ru - Типы свойства - ТипыСвойстваExtendedTooltip 61 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl index 4bbb1e827..b73e0956b 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl @@ -107,8 +107,6 @@ &НаКлиенте Процедура ЗаписатьНачало() - Состояние(НСтр("ru = 'Выполняется изменение настройки свойства. Пожалуйста, подождите'")); - РезультатВыполнения = ЗаписатьНаСервере(); Если РезультатВыполнения.Статус = "Выполнено" Тогда diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form index 58788196e..936e46432 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form @@ -59,10 +59,6 @@ ru Пояснение дополнительного реквизита - - ru - Пояснение дополнительного реквизита - ПояснениеДополнительногоРеквизитаExtendedTooltip 31 @@ -129,10 +125,6 @@ ru Пояснение дополнительного сведения - - ru - Пояснение дополнительного сведения - ПояснениеДополнительногоСведенияExtendedTooltip 33 @@ -158,10 +150,6 @@ ru Пояснения - - ru - Пояснения - ПоясненияExtendedTooltip 30 @@ -177,69 +165,6 @@ Auto
        - - КнопкиПояснения - 13 - - ОК - 16 - - <key>ru</key> - <value>ОК</value> - - true - true - - true - - false - - ОКExtendedTooltip - 36 - Label - true - true - - Left - - - Form.Command.РазрешитьРедактирование - Auto - true - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Кнопки пояснения</value> - - - ru - Кнопки пояснения - - Bottom - - КнопкиПоясненияExtendedTooltip - 35 - Label - true - true - - Left - - - CommandBar - - Right - - true true @@ -249,10 +174,6 @@ ru Объект не используется - - ru - Объект не используется - ОбъектНеИспользуетсяExtendedTooltip 29 @@ -325,10 +246,6 @@ ru Предупреждение дополнительного реквизита - - ru - Предупреждение дополнительного реквизита - ПредупреждениеДополнительногоРеквизитаExtendedTooltip 39 @@ -395,10 +312,6 @@ ru Предупреждение дополнительного сведения - - ru - Предупреждение дополнительного сведения - ПредупреждениеДополнительногоСведенияExtendedTooltip 41 @@ -424,10 +337,6 @@ ru Предупреждения - - ru - Предупреждения - ПредупрежденияExtendedTooltip 38 @@ -443,92 +352,6 @@ Auto
        - - КнопкиПредупреждения - 8 - - РазрешитьРедактирование - 9 - true - true - - true - - false - - РазрешитьРедактированиеExtendedTooltip - 44 - Label - true - true - - Left - - - Form.Command.РазрешитьРедактирование - Normal - Auto - true - true - UserCmds - Auto - - - Отмена - 11 - true - true - - true - - false - - ОтменаExtendedTooltip - 45 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Кнопки предупреждения</value> - - - ru - Кнопки предупреждения - - Bottom - - КнопкиПредупрежденияExtendedTooltip - 43 - Label - true - true - - Left - - - CommandBar - - Right - - true true @@ -538,10 +361,6 @@ ru Объект используется - - ru - Объект используется - ОбъектИспользуетсяExtendedTooltip 37 @@ -567,10 +386,6 @@ ru Диалоги пользователя - - ru - Диалоги пользователя - ДиалогиПользователяExtendedTooltip 28 @@ -586,12 +401,147 @@ Auto
        - None - false + Bottom + true ФормаКоманднаяПанель -1 - Left + + КнопкиПояснения + 13 + + ОК + 16 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + ОКExtendedTooltip + 36 + Label + true + true + + Left + + + Form.Command.РазрешитьРедактирование + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки пояснения</value> + + Bottom + + КнопкиПоясненияExtendedTooltip + 35 + Label + true + true + + Left + + + + + + КнопкиПредупреждения + 8 + + РазрешитьРедактирование + 9 + true + true + + true + + false + + РазрешитьРедактированиеExtendedTooltip + 44 + Label + true + true + + Left + + + Form.Command.РазрешитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаExtendedTooltip + 45 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки предупреждения</value> + + Bottom + + КнопкиПредупрежденияExtendedTooltip + 43 + Label + true + true + + Left + + + + + Right OnCreateAtServer diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl index ea452e91b..61799af25 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl @@ -21,6 +21,7 @@ КонецЕсли; СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "СвойствоИспользуется"); + Элементы.КнопкиПояснения.Видимость = Ложь; Иначе Элементы.ДиалогиПользователя.ТекущаяСтраница = Элементы.ОбъектНеИспользуется; Элементы.ОбъектИспользуется.Видимость = Ложь; // Для компактного отображения формы. @@ -34,6 +35,7 @@ КонецЕсли; СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "СвойствоНеИспользуется"); + Элементы.КнопкиПредупреждения.Видимость = Ложь; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form index 399d17c5d..e9cae7af1 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -371,9 +375,6 @@ CommonPicture.ДополнительныеРеквизитыСведения - None - None - None true 60 @@ -741,6 +742,10 @@ ЭтоДополнительноеСведение + + ОтображаемыеНаборыСвойств + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl index e40b3ad7c..9a46a945f 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl @@ -63,6 +63,8 @@ КонецЕсли; ЗаполнитьВыбранныеЗначения(); + ДобавитьФильтрПоНаборамСвойств(); + ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( Список, "ПредставлениеГруппировкиОбщихСвойств", @@ -81,6 +83,20 @@ ЭлементГруппировкиДанных.Использование = Истина; КонецПроцедуры +&НаСервере +Процедура ДобавитьФильтрПоНаборамСвойств() + Если ТипЗнч(Параметры.ОтображаемыеНаборыСвойств) = Тип("Массив") + И Параметры.ОтображаемыеНаборыСвойств.Количество() <> 0 Тогда + УсловиеЗапроса = + " + |ГДЕ + | Свойства.НаборСвойств В (&Наборы)"; + Список.ТекстЗапроса = Список.ТекстЗапроса + УсловиеЗапроса; + ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( + Список, "Наборы", Параметры.ОтображаемыеНаборыСвойств, Истина); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form index ea7e4d1a9..5f55f2575 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form @@ -12,10 +12,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 17 @@ -48,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 15 @@ -71,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -322,9 +318,6 @@ CommonPicture.ДополнительныеРеквизитыСведения - None - None - None true 60 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form index d9af0ddbd..ca57eb685 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form @@ -3,6 +3,33 @@ ОсновнаяКоманднаяПанель 240 + + ФормаУстановитьСнятьПометкуУдаления + 453 + true + true + + true + + + ФормаУстановитьСнятьПометкуУдаленияРасширеннаяПодсказка + 454 + Label + true + true + + Left + + + Form.Command.УстановитьСнятьПометкуУдаления + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true @@ -12,10 +39,6 @@ ru Основная командная панель - - ru - Основная командная панель - ОсновнаяКоманднаяПанельРасширеннаяПодсказка 241 @@ -136,6 +159,10 @@ true + + <key>ru</key> + <value>Панель еще</value> + ПанельЕщеРасширеннаяПодсказка 409 @@ -156,6 +183,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокРасширеннаяПодсказка 337 @@ -190,6 +221,10 @@ НаборыСвойств 345 + + <key>ru</key> + <value>Наборы свойств</value> + true true @@ -211,6 +246,10 @@ Представление 396 + + <key>ru</key> + <value>Представление набора</value> + true true @@ -405,9 +444,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true 60 @@ -424,6 +460,10 @@ true + + <key>ru</key> + <value>Страница все наборы</value> + СтраницаВсеНаборыРасширеннаяПодсказка 417 @@ -447,6 +487,10 @@ ОбщиеНаборыСвойств 420 + + <key>ru</key> + <value>Общие наборы свойств</value> + true true @@ -612,9 +656,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true 60 @@ -631,6 +672,10 @@ true + + <key>ru</key> + <value>Страница общие наборы</value> + СтраницаОбщиеНаборыРасширеннаяПодсказка 419 @@ -653,6 +698,10 @@ true + + <key>ru</key> + <value>Страницы наборы свойств</value> + СтраницыНаборыСвойствРасширеннаяПодсказка 415 @@ -675,7 +724,7 @@ <key>ru</key> - <value>Группа наборы свойств</value> + <value>Наборы свойств</value> ГруппаНаборыСвойствРасширеннаяПодсказка @@ -703,6 +752,10 @@ Свойства 366 + + <key>ru</key> + <value>Свойства</value> + true true @@ -915,9 +968,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true @@ -1110,6 +1160,10 @@ true + + <key>ru</key> + <value>Расшифровка реквизита</value> + Style.FormTextColor @@ -1139,6 +1193,10 @@ true + + <key>ru</key> + <value>Содержимое</value> + ГруппаСодержимоеРасширеннаяПодсказка 342 @@ -1386,6 +1444,10 @@ true + + <key>ru</key> + <value>Наименование реквизита</value> + ГруппаНаименованиеРеквизитаРасширеннаяПодсказка 115 @@ -1521,23 +1583,27 @@ ГруппаМногострочность 38 - ГруппаМногострочноеПолеВводаНастройки - 46 + ГруппаОднострочноеПолеВводаНастройки + 448 - МногострочноеПолеВвода - 39 + ОднострочныйВид + 442 true true true - МногострочноеПолеВвода + ПредставлениеРеквизита - Right + None + + OnChange + ВидРеквизитаПриИзменении + - МногострочноеПолеВводаExtendedTooltip - 131 + ОднострочныйВидРасширеннаяПодсказка + 444 Label true true @@ -1546,17 +1612,148 @@ - МногострочноеПолеВводаКонтекстноеМеню - 40 + ОднострочныйВидКонтекстноеМеню + 443 + true + + RadioButtonField + Top + Enter + true + Left + true + + RadioButtons + 1 + + + ru + Однострочное поле ввода + + + ОднострочноеПолеВвода + + + Vertical + + + + ВыводитьВВидеГиперссылки + 445 + true + true + + true + + + Объект.ВыводитьВВидеГиперссылки + + Right + + ВыводитьВВидеГиперссылкиРасширеннаяПодсказка + 447 + Label + true + true + + Left + + + + ВыводитьВВидеГиперссылкиКонтекстноеМеню + 446 true CheckBoxField + Top Enter true Left true + true + true + + true + + + <key>ru</key> + <value>Однострочное поле ввода настройки</value> + + + ГруппаОднострочноеПолеВводаНастройкиРасширеннаяПодсказка + 449 + Label + true + true + + Left + + + UsualGroup + + Auto + true + Auto + Auto + + + + ГруппаМногострочноеПолеВводаНастройки + 46 + + МногострочныйВид + 450 + true + true + + true + + + ПредставлениеРеквизита + + None + + OnChange + ВидРеквизитаПриИзменении + + + МногострочныйВидРасширеннаяПодсказка + 452 + Label + true + true + + Left + + + + МногострочныйВидКонтекстноеМеню + 451 + true + + RadioButtonField + Top + Enter + true + Left + true + + RadioButtons + 1 + + + ru + Многострочное поле ввода + + + МногострочноеПолеВвода + + + Vertical + + МногострочноеПолеВводаЧисло 41 @@ -1621,7 +1818,7 @@ <key>ru</key> - <value>Группа многострочное поле ввода настройки</value> + <value>Многострочное поле ввода настройки</value> ГруппаМногострочноеПолеВводаНастройкиExtendedTooltip @@ -1637,7 +1834,6 @@ Auto true - true Auto Auto @@ -1649,7 +1845,7 @@ <key>ru</key> - <value>Группа многострочность</value> + <value>Многострочность</value> ГруппаМногострочностьExtendedTooltip @@ -1664,6 +1860,7 @@ UsualGroup Vertical + Half Auto true true @@ -1713,9 +1910,6 @@ Label true true - - Style.ButtonTextColor - Left @@ -1750,9 +1944,6 @@ Label true true - - Style.ButtonTextColor - Left @@ -1806,12 +1997,8 @@ <key>ru</key> - <value>Группа свойства</value> + <value>Свойства</value> - - ru - Группа свойства - ГруппаСвойстваРасширеннаяПодсказка 327 @@ -1955,12 +2142,8 @@ <key>ru</key> - <value>Группа настройка зависимостей</value> + <value>Настройка зависимостей</value> - - ru - Группа настройка зависимостей - ГруппаНастройкаЗависимостейРасширеннаяПодсказка 329 @@ -1987,12 +2170,8 @@ <key>ru</key> - <value>Группа свойства и зависимости</value> + <value>Свойства и зависимости</value> - - ru - Группа свойства и зависимости - ГруппаСвойстваИЗависимостиРасширеннаяПодсказка 325 @@ -2165,7 +2344,7 @@ <key>ru</key> - <value>Группа заголовки форм значений</value> + <value>Заголовки форм значений</value> ГруппаЗаголовкиФормЗначенийExtendedTooltip @@ -2199,10 +2378,6 @@ Объект.Комментарий Left - - OnChange - КомментарийПриИзменении - КомментарийExtendedTooltip 159 @@ -2383,10 +2558,6 @@ ru Главное - - ru - Главная страница - ГлавнаяСтраницаРасширеннаяПодсказка 170 @@ -2416,6 +2587,10 @@ Значения 57 + + <key>ru</key> + <value>Значения</value> + true true @@ -2990,9 +3165,6 @@ Значения.DefaultPicture - None - None - None true 60 @@ -3036,6 +3208,10 @@ ЗначенияДополнительногоРеквизита 291 + + <key>ru</key> + <value>Значения дополнительного реквизита</value> + true true @@ -3213,6 +3389,10 @@ true + + <key>ru</key> + <value>Значения дополнительных реквизитов 1 группа 1</value> + ЗначенияДополнительныхРеквизитов1Группа1РасширеннаяПодсказка 311 @@ -3569,10 +3749,6 @@ ru Уточнение списка значений - - ru - Уточнение списка значений - УточнениеСпискаЗначенийExtendedTooltip 151 @@ -3601,10 +3777,6 @@ ru Значения - - ru - Страница значения - СтраницаЗначенияРасширеннаяПодсказка 183 @@ -3622,35 +3794,6 @@ false - - СтраницаКомментарий - 171 - true - true - - true - - - <key>ru</key> - <value>Комментарий</value> - - - СтраницаКомментарийРасширеннаяПодсказка - 172 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - true true @@ -3660,10 +3803,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 168 @@ -3770,10 +3909,6 @@ ru Командная панель лево - - ru - Командная панель лево - КоманднаяПанельЛевоРасширеннаяПодсказка 230 @@ -3877,6 +4012,7 @@ ru Командная панель помощника + true КоманднаяПанельПомощникаРасширеннаяПодсказка 228 @@ -3889,6 +4025,7 @@ UsualGroup + Bottom Auto true true @@ -3917,6 +4054,7 @@ OnCreateAtServer ПриСозданииНаСервере + SetDeletionMark DontBlock true true @@ -4369,7 +4507,8 @@ ИНАЧЕ Наборы.Родитель В (&Наборы) КОНЕЦ И Наборы.Используется - И ЕСТЬNULL(Наборы.Родитель.Используется, ИСТИНА) + И ЕСТЬNULL(Наборы.Родитель.Используется, ИСТИНА) + И Наборы.Ссылка НЕ В (&ИсключаемыеНаборы) Catalog.НаборыДополнительныхРеквизитовИСведений true true @@ -4642,6 +4781,25 @@ true + + ПредставлениеРеквизита + + <key>ru</key> + <value>Представление реквизита</value> + + 24 + + String + + + + true + + + true + + true + РедактироватьФорматЗначения @@ -4841,6 +4999,31 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>УстановитьСнятьПометкуУдаления</name> + <title> + <key>ru</key> + <value>Пометить на удаление/ Снять пометку</value> + + 10 + + ru + Пометить на удаление/ Снять пометку + + + true + + + StdPicture.MarkToDelete + + + + УстановитьСнятьПометкуУдаления + + + DontUse + Auto + ЭтоДополнительноеСведение diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Help/ru.html index 8a14fb7a4..9bd2e9f44 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Help/ru.html @@ -15,7 +15,11 @@
      • В строке Пример для наглядности производятся соответствующие этим параметрам изменения.
      • Для подтверждения выбранных параметров нажмите ОК.
      • После уточнения формата ссылка меняет значение на Формат установлен. -
      • Подробнее о форматах см. ниже.
      • Заполните поле Всплывающая подсказка, для того чтобы объяснить, как заполняется дополнительное сведение или реквизит. Содержимое поля будет выводиться на экран при наведении мыши на поле дополнительного реквизита (сведения).
      • Заполните поле Комментарий, для того чтобы при подборе дополнительного реквизита (сведения) в наборы в нижней части списка выбора выводилось его описание. Для заполнения перейдите на вкладку Комментарий.
      • Добавление из другого набора

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

        • В программе предусмотрена возможность использовать ранее введенные дополнительные реквизиты и сведения для других наборов.
        • Наиболее актуален этот способ для дополнительных реквизитов и сведений типа Дополнительное значение и Дополнительное значение (иерархия). Если проведены соответствующие настройки (включен хотя бы один из флажков в разделе Администрирование - Общие настройки), становится доступной кнопка Добавить.
        • Выберите набор дополнительных реквизитов (сведений), нажмите кнопку Добавить, в выпадающем меню выполните команду Из другого набора. diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl index d57d6b976..19dc4e266 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl @@ -14,18 +14,7 @@ Возврат; КонецЕсли; - ПереданныеПараметрыФормы = Новый Структура; - ПереданныеПараметрыФормы.Вставить("ВладелецДополнительныхЗначений"); - ПереданныеПараметрыФормы.Вставить("ПоказатьУточнениеНабора"); - ПереданныеПараметрыФормы.Вставить("ТекущийНаборСвойств"); - ПереданныеПараметрыФормы.Вставить("ЭтоДополнительноеСведение"); - ПереданныеПараметрыФормы.Вставить("ВыборОбщегоСвойства"); - ПереданныеПараметрыФормы.Вставить("ВыбранныеЗначения"); - ПереданныеПараметрыФормы.Вставить("ВыборВладельцаДополнительныхЗначений"); - ПереданныеПараметрыФормы.Вставить("ЗначениеКопирования"); - ПереданныеПараметрыФормы.Вставить("КопированиеСВопросом"); - ПереданныеПараметрыФормы.Вставить("Перетаскивание", Ложь); - ЗаполнитьЗначенияСвойств(ПереданныеПараметрыФормы, Параметры); + СоздатьСтруктуруПереданныхПараметров(); Если ПереданныеПараметрыФормы.КопированиеСВопросом И Не ПолучитьФункциональнуюОпцию("ИспользоватьОбщиеДополнительныеРеквизитыИСведения") @@ -136,8 +125,9 @@ И Объект.ТипЗначения.Типы().Количество() = 1 И Объект.ТипЗначения.СодержитТип(Тип("Строка")) Тогда - Если МногострочноеПолеВвода Тогда - ТекущийОбъект.МногострочноеПолеВвода = МногострочноеПолеВводаЧисло; + Если ПредставлениеРеквизита = "МногострочноеПолеВвода" Тогда + ТекущийОбъект.МногострочноеПолеВвода = МногострочноеПолеВводаЧисло; + ТекущийОбъект.ВыводитьВВидеГиперссылки = Ложь; КонецЕсли; КонецЕсли; @@ -151,7 +141,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", ДобавитьВНабор); Блокировка.Заблокировать(); ЗаблокироватьДанныеДляРедактирования(ДобавитьВНабор); @@ -223,11 +212,34 @@ Процедура ПриОткрытии(Отказ) Если РежимПомощника Тогда УстановитьНастройкиПомощника(); - Иначе - УстановитьКартинкуКомментария(); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "Свойства_УстановленаЗависимостьРеквизита" Тогда + Модифицированность = Истина; + ЗначениеДобавлено = Ложь; + Для Каждого УсловиеЗависимости Из УсловияЗависимостиРеквизитов Цикл + Значение = Неопределено; + Если Параметр.Свойство(УсловиеЗависимости.Представление, Значение) Тогда + ЗначениеВХранилище = ПоместитьВоВременноеХранилище(Значение, УникальныйИдентификатор); + УсловиеЗависимости.Значение = ЗначениеВХранилище; + ЗначениеДобавлено = Истина; + КонецЕсли; + КонецЦикла; + Если Не ЗначениеДобавлено Тогда + Для Каждого ПереданныйПараметр Из Параметр Цикл + ЗначениеВХранилище = ПоместитьВоВременноеХранилище(ПереданныйПараметр.Значение, УникальныйИдентификатор); + УсловияЗависимостиРеквизитов.Добавить(ЗначениеВХранилище, ПереданныйПараметр.Ключ); + КонецЦикла; + КонецЕсли; + + УстановитьЗависимостиДополнительныхРеквизитов(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -297,7 +309,7 @@ &НаКлиенте Процедура МногострочноеПолеВводаЧислоПриИзменении(Элемент) - МногострочноеПолеВвода = Истина; + ПредставлениеРеквизита = "МногострочноеПолеВвода"; КонецПроцедуры @@ -331,40 +343,17 @@ ОткрытьФормуНастройкиЗависимости("Виден"); КонецПроцедуры -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "Свойства_УстановленаЗависимостьРеквизита" Тогда - Модифицированность = Истина; - ЗначениеДобавлено = Ложь; - Для Каждого УсловиеЗависимости Из УсловияЗависимостиРеквизитов Цикл - Значение = Неопределено; - Если Параметр.Свойство(УсловиеЗависимости.Представление, Значение) Тогда - ЗначениеВХранилище = ПоместитьВоВременноеХранилище(Значение, УникальныйИдентификатор); - УсловиеЗависимости.Значение = ЗначениеВХранилище; - ЗначениеДобавлено = Истина; - КонецЕсли; - КонецЦикла; - Если Не ЗначениеДобавлено Тогда - Для Каждого ПереданныйПараметр Из Параметр Цикл - ЗначениеВХранилище = ПоместитьВоВременноеХранилище(ПереданныйПараметр.Значение, УникальныйИдентификатор); - УсловияЗависимостиРеквизитов.Добавить(ЗначениеВХранилище, ПереданныйПараметр.Ключ); - КонецЦикла; - КонецЕсли; - КонецЕсли; - - УстановитьЗависимостиДополнительныхРеквизитов(); -КонецПроцедуры - -&НаКлиенте -Процедура КомментарийПриИзменении(Элемент) - УстановитьКартинкуКомментария(); -КонецПроцедуры - &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); КонецПроцедуры +&НаКлиенте +Процедура ВидРеквизитаПриИзменении(Элемент) + Элементы.ВыводитьВВидеГиперссылки.Доступность = (ПредставлениеРеквизита = "ОднострочноеПолеВвода"); + Элементы.МногострочноеПолеВводаЧисло.Доступность = (ПредставлениеРеквизита = "МногострочноеПолеВвода"); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыНаборыСвойств @@ -474,7 +463,7 @@ ИндексСтраницы = ОсновнаяСтраница.ПодчиненныеЭлементы.Индекс(ОсновнаяСтраница.ТекущаяСтраница); Если ИндексСтраницы = 0 И Элементы.Свойства.ТекущиеДанные = Неопределено Тогда - ТекстПредупреждения = НСтр("ru = 'Элемент не выбран!'"); + ТекстПредупреждения = НСтр("ru = 'Элемент не выбран.'"); ПоказатьПредупреждение(, ТекстПредупреждения); Возврат; КонецЕсли; @@ -609,17 +598,15 @@ КонецПроцедуры +&НаКлиенте +Процедура УстановитьСнятьПометкуУдаления(Команда) + ЗаписатьОбъект("ИзменениеПометкиУдаления", "УстановитьСнятьПометкуУдаленияПродолжение"); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура УстановитьКартинкуКомментария() - - Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Объект.Комментарий); - -КонецПроцедуры - &НаСервере Процедура УстановитьЗависимостиДополнительныхРеквизитов() @@ -685,6 +672,31 @@ КонецЕсли; КонецЦикла; + РодительТекущегоНабора = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + ПереданныеПараметрыФормы.ТекущийНаборСвойств, "Родитель"); + ИсключаемыеНаборы = Новый Массив; + ИсключаемыеНаборы.Добавить(ПереданныеПараметрыФормы.ТекущийНаборСвойств); + Если ЗначениеЗаполнено(РодительТекущегоНабора) Тогда + ИмяПредопределенныхДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РодительТекущегоНабора, "ИмяПредопределенныхДанных"); + ПозицияЗаменяемогоСимвола = СтрНайти(ИмяПредопределенныхДанных, "_"); + ПолноеИмяОбъекта = Лев(ИмяПредопределенныхДанных, ПозицияЗаменяемогоСимвола - 1) + + "." + + Сред(ИмяПредопределенныхДанных, ПозицияЗаменяемогоСимвола + 1); + Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъекта); + СсылкаОбъекта = Менеджер.ПустаяСсылка(); + НаборыОбъекта = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(СсылкаОбъекта); + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("ОбщийНабор", Истина); + НайденныеСтроки = НаборыОбъекта.НайтиСтроки(ПараметрыОтбора); + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если ПереданныеПараметрыФормы.ТекущийНаборСвойств = НайденнаяСтрока.Набор Тогда + Продолжить; + КонецЕсли; + ИсключаемыеНаборы.Добавить(НайденнаяСтрока.Набор); + КонецЦикла; + КонецЕсли; + Если ЭтоДополнительноеСведение = 1 Тогда Элементы.ОбщиеРеквизитыНеВключенныеВНаборы.Заголовок = НСтр("ru ='Только общие дополнительные сведения'"); Иначе @@ -693,7 +705,10 @@ ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( НаборыСвойств, "Наборы", ДоступныеНаборы, Истина); - + + ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( + НаборыСвойств, "ИсключаемыеНаборы", ИсключаемыеНаборы, Истина); + ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка( НаборыСвойств, "ЭтоДополнительноеСведение", (ЭтоДополнительноеСведение = 1), Истина); @@ -834,10 +849,15 @@ ОбновитьСоставЭлементовФормы(); Если Объект.МногострочноеПолеВвода > 0 Тогда - МногострочноеПолеВвода = Истина; + ПредставлениеРеквизита = "МногострочноеПолеВвода"; МногострочноеПолеВводаЧисло = Объект.МногострочноеПолеВвода; + Иначе + ПредставлениеРеквизита = "ОднострочноеПолеВвода"; КонецЕсли; + Элементы.ВыводитьВВидеГиперссылки.Доступность = (ПредставлениеРеквизита = "ОднострочноеПолеВвода"); + Элементы.МногострочноеПолеВводаЧисло.Доступность = (ПредставлениеРеквизита = "МногострочноеПолеВвода"); + КонецПроцедуры &НаКлиенте @@ -875,7 +895,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПослеПодтвержденияОчисткиВесовыхКоэффициентов(Ответ, Неопределен) Экспорт +Процедура ПослеПодтвержденияОчисткиВесовыхКоэффициентов(Ответ, Контекст) Экспорт Если Ответ <> "ОчиститьИЗаписать" Тогда Объект.ДополнительныеЗначенияСВесом = НЕ Объект.ДополнительныеЗначенияСВесом; @@ -893,7 +913,7 @@ КонецПроцедуры &НаКлиенте -Процедура ДополнительныеЗначенияСВесомПриИзмененииЗавершение(Отказ, Неопределен) Экспорт +Процедура ДополнительныеЗначенияСВесомПриИзмененииЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Объект.ДополнительныеЗначенияСВесом = НЕ Объект.ДополнительныеЗначенияСВесом; @@ -910,7 +930,7 @@ КонецПроцедуры &НаКлиенте -Процедура УточнениеСпискаЗначенийКомментарийНажатиеЗавершение(Отказ, Неопределен) Экспорт +Процедура УточнениеСпискаЗначенийКомментарийНажатиеЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -929,7 +949,7 @@ КонецПроцедуры &НаКлиенте -Процедура УточнениеНаборовКомментарийНажатиеПродолжение(Отказ, Неопределен) Экспорт +Процедура УточнениеНаборовКомментарийНажатиеПродолжение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -1010,7 +1030,7 @@ КонецПроцедуры &НаКлиенте -Процедура ЗначенияПередНачаломИзмененияЗавершение(Отказ, Неопределен) Экспорт +Процедура ЗначенияПередНачаломИзмененияЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -1035,7 +1055,7 @@ КонецПроцедуры &НаКлиенте -Процедура УточнениеСпискаЗначенийИзменитьЗавершение(Отказ, Неопределен) Экспорт +Процедура УточнениеСпискаЗначенийИзменитьЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -1054,7 +1074,7 @@ КонецПроцедуры &НаКлиенте -Процедура УточнениеНаборовИзменитьЗавершение(Отказ, Неопределен) Экспорт +Процедура УточнениеНаборовИзменитьЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -1075,6 +1095,31 @@ &НаКлиенте Процедура ЗаписатьОбъект(ВариантТекстаВопроса, ИмяПроцедурыПродолжения, ДополнительныеПараметры = Неопределено, ПараметрыЗаписи = Неопределено) + Если ПараметрыЗаписи = Неопределено Тогда + ПараметрыЗаписи = Новый Структура; + КонецЕсли; + + Если ВариантТекстаВопроса = "ИзменениеПометкиУдаления" Тогда + Если Модифицированность Тогда + ТекстВопроса = НСтр("ru = 'Для %1 пометки удаления необходимо записать внесенные изменения. Записать данные?'"); + Если Объект.ПометкаУдаления Тогда + Действие = НСтр("ru = 'снятия'"); + Иначе + Действие = НСтр("ru = 'установки'"); + КонецЕсли; + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Действие); + Иначе + ТекстВопроса = НСтр("ru = 'Пометить ""%1"" на удаление?'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Объект.Наименование); + КонецЕсли; + + ПоказатьВопрос( + Новый ОписаниеОповещения( + ИмяПроцедурыПродолжения, ЭтотОбъект, ПараметрыЗаписи), + ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + Возврат; + КонецЕсли; + Если ЗначениеЗаполнено(Объект.Ссылка) И НЕ Модифицированность Тогда ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения( @@ -1082,10 +1127,6 @@ Возврат; КонецЕсли; - Если ПараметрыЗаписи = Неопределено Тогда - ПараметрыЗаписи = Новый Структура; - КонецЕсли; - ОбработкаПродолжения = Новый Структура; ОбработкаПродолжения.Вставить("ИмяПроцедуры", ИмяПроцедурыПродолжения); ОбработкаПродолжения.Вставить("Параметры", ДополнительныеПараметры); @@ -1119,15 +1160,25 @@ КонецПроцедуры +&НаКлиенте +Процедура УстановитьСнятьПометкуУдаленияПродолжение(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + Объект.ПометкаУдаления = Не Объект.ПометкаУдаления; + КонецЕсли; + ЗаписатьОбъектПродолжение(Ответ, ПараметрыЗаписи); + +КонецПроцедуры + + &НаКлиенте Процедура ЗаписатьОбъектПродолжение(Ответ, ПараметрыЗаписи) Экспорт - Если Ответ <> "Записать" Тогда - Возврат; + Если Ответ = "Записать" + Или Ответ = КодВозвратаДиалога.Да Тогда + Записать(ПараметрыЗаписи); КонецЕсли; - Записать(ПараметрыЗаписи); - КонецПроцедуры &НаКлиенте @@ -1143,7 +1194,7 @@ КонецПроцедуры &НаКлиенте -Процедура РедактироватьФорматЗначенияЗавершение(Текст, Неопределен) Экспорт +Процедура РедактироватьФорматЗначенияЗавершение(Текст, Контекст) Экспорт Если Текст <> Неопределено Тогда Объект.ФорматСвойства = Текст; @@ -1207,6 +1258,10 @@ ШаблонЗаголовкаПереключателя = НСтр("ru = 'Выберите вариант добавления дополнительного %1 ""%2"" в набор ""%3""'"); Если ТекущаяСтраница = Элементы.ВыборРеквизита Тогда + Элементы.ВыборДействия.Видимость = Ложь; + Элементы.КарточкаРеквизита.Видимость = Ложь; + Элементы.ВыборРеквизита.Видимость = Истина; + Если ПереданныеПараметрыФормы.ЭтоДополнительноеСведение Тогда Заголовок = НСтр("ru = 'Добавление дополнительного сведения'"); Иначе @@ -1222,6 +1277,10 @@ Строка(ПереданныеПараметрыФормы.ТекущийНаборСвойств)); ИначеЕсли ТекущаяСтраница = Элементы.ВыборДействия Тогда + Элементы.ВыборРеквизита.Видимость = Ложь; + Элементы.КарточкаРеквизита.Видимость = Ложь; + Элементы.ВыборДействия.Видимость = Истина; + Если ПереданныеПараметрыФормы.КопированиеСВопросом Тогда Элементы.КоманднаяПанельЛево.Доступность = Ложь; ВладелецДополнительныхЗначений = ПереданныеПараметрыФормы.ВладелецДополнительныхЗначений; @@ -1249,6 +1308,10 @@ КонецЕсли; Иначе + Элементы.ВыборДействия.Видимость = Ложь; + Элементы.ВыборРеквизита.Видимость = Ложь; + Элементы.КарточкаРеквизита.Видимость = Истина; + Элементы.КомандаДалее.Заголовок = НСтр("ru = 'Готово'"); Элементы.КоманднаяПанельЛево.Доступность = Истина; КонецЕсли; @@ -1287,11 +1350,8 @@ Элементы.РедактироватьФорматЗначения.Видимость = Истина; КонецЕсли; - Если НЕ Объект.ЭтоДополнительноеСведение - И Объект.ТипЗначения.Типы().Количество() = 1 - И Объект.ТипЗначения.СодержитТип(Тип("Строка")) Тогда - - Элементы.ГруппаМногострочность.Видимость = Истина; + Если НЕ Объект.ЭтоДополнительноеСведение Тогда + ПереключитьНастройкиВыводаРеквизита(Объект.ТипЗначения); Иначе Элементы.ГруппаМногострочность.Видимость = Ложь; КонецЕсли; @@ -1594,6 +1654,23 @@ КонецПроцедуры +&НаСервере +Процедура ПереключитьНастройкиВыводаРеквизита(ТипЗначения) + + РазрешитьВыборМногострочногоПоля = (Объект.ТипЗначения.Типы().Количество() = 1) + И (Объект.ТипЗначения.СодержитТип(Тип("Строка"))); + РазрешитьВыводВВидеГиперссылки = РазрешитьВыборМногострочногоПоля + Или (Не Объект.ТипЗначения.СодержитТип(Тип("Строка")) + И Не Объект.ТипЗначения.СодержитТип(Тип("Дата")) + И Не Объект.ТипЗначения.СодержитТип(Тип("Булево")) + И Не Объект.ТипЗначения.СодержитТип(Тип("Число"))); + + Элементы.ОднострочныйВид.Видимость = РазрешитьВыборМногострочногоПоля; + Элементы.ГруппаМногострочноеПолеВводаНастройки.Видимость = РазрешитьВыборМногострочногоПоля; + Элементы.ВыводитьВВидеГиперссылки.Видимость = РазрешитьВыводВВидеГиперссылки; + +КонецПроцедуры + &НаСервере Процедура ОчиститьВведенныеВесовыеКоэффициенты() @@ -1605,7 +1682,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(ИмяТаблицыЗначений); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -2139,6 +2215,23 @@ КонецПроцедуры +&НаСервере +Процедура СоздатьСтруктуруПереданныхПараметров() + ПереданныеПараметрыФормы = Новый Структура; + ПереданныеПараметрыФормы.Вставить("ВладелецДополнительныхЗначений"); + ПереданныеПараметрыФормы.Вставить("ПоказатьУточнениеНабора"); + ПереданныеПараметрыФормы.Вставить("ТекущийНаборСвойств"); + ПереданныеПараметрыФормы.Вставить("ЭтоДополнительноеСведение"); + ПереданныеПараметрыФормы.Вставить("ВыборОбщегоСвойства"); + ПереданныеПараметрыФормы.Вставить("ВыбранныеЗначения"); + ПереданныеПараметрыФормы.Вставить("ВыборВладельцаДополнительныхЗначений"); + ПереданныеПараметрыФормы.Вставить("ЗначениеКопирования"); + ПереданныеПараметрыФормы.Вставить("КопированиеСВопросом"); + ПереданныеПараметрыФормы.Вставить("Перетаскивание", Ложь); + + ЗаполнитьЗначенияСвойств(ПереданныеПараметрыФормы, Параметры); +КонецПроцедуры + &НаСервереБезКонтекста Функция НаименованиеУжеИспользуется(Знач Заголовок, Знач ТекущееСвойство, Знач НаборСвойств, НовоеНаименование) diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl index dc5d63627..4fa660e17 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl @@ -2,22 +2,9 @@ #Область ПрограммныйИнтерфейс -// Возвращает описание блокируемых реквизитов. -// -// Возвращаемое значение: -// Массив - содержит строки в формате ИмяРеквизита[;ИмяЭлементаФормы,...] -// где ИмяРеквизита - имя реквизита объекта, ИмяЭлементаФормы - имя элемента формы, -// связанного с реквизитом. -// -Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт - - Результат = Новый Массив; - - Результат.Добавить("ТипЗначения"); - - Возврат Результат; - -КонецФункции +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые разрешается редактировать // с помощью обработки группового изменения реквизитов. @@ -39,6 +26,25 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов + +// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт + + Результат = Новый Массив; + + Результат.Добавить("ТипЗначения"); + + Возврат Результат; + +КонецФункции + +// Конец СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли @@ -71,18 +77,13 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", Свойство); ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", ТекущийНаборСвойств); ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектовИерархия"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -97,7 +98,7 @@ СвойствоОбъект.Записать(); Иначе Запрос.УстановитьПараметр("Владелец", Свойство); - НовыйОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент(); + НовыйОбъект = СоздатьЭлемент(); ЗаполнитьЗначенияСвойств(НовыйОбъект, СвойствоОбъект, , "Родитель"); СвойствоОбъект = НовыйОбъект; СвойствоОбъект.НаборСвойств = ТекущийНаборСвойств; @@ -186,11 +187,9 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Свойство", Свойство); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Свойство", СвойствоОбъект.Ссылка); // Если исходное свойство общее, тогда нужно получить список наборов @@ -207,7 +206,6 @@ Если УправлениеСвойствамиСлужебный.ЭтоОбъектМетаданныхСДополнительнымиРеквизитами(МетаданныеВладельца) Тогда ВладелецСДополнительнымиРеквизитами = Истина; ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяВладельца); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; КонецЕсли; Блокировка.Заблокировать(); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl index 383b66dbd..c32b2afdb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl @@ -127,7 +127,7 @@ |ГДЕ | НаборыСвойств.Свойство = &Свойство | - |ОБЪЕДИНИТЬ + |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | НаборыСвойств.Ссылка diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo index a33403abe..4f276e52f 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo @@ -175,6 +175,25 @@ Use + + ВыводитьВВидеГиперссылки + + ru + Выводить в виде гиперссылки + + + Boolean + + + ru + Признак того, что дополнительный реквизит выводится в виде ссылки + + + + + Use + Use + ДополнительныеЗначенияИспользуются @@ -631,6 +650,11 @@ ru Зависимость реквизитов + + + ru + + PersonalComputer MobileDevice diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form index fb601376d..eca95d3a3 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form @@ -44,10 +44,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 19 @@ -67,6 +63,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -319,9 +319,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl index fd8d180fe..5c038b7c9 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl @@ -2,8 +2,9 @@ #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Групповое изменение объектов. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов // Возвращает реквизиты объекта, которые не рекомендуется редактировать // с помощью обработки группового изменения реквизитов. @@ -18,6 +19,10 @@ КонецФункции +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..4b2b0f388 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form @@ -0,0 +1,415 @@ + + + + КоманднаяПанель + 22 + + ФормаВключитьВозможностьРедактирования + 24 + true + true + + true + + + ФормаВключитьВозможностьРедактированияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + ГруппаПользовательскихНастроек + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + ГруппаПользовательскихНастроекРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + + Наименование + 16 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТипЗначения + 19 + true + true + + true + + + Список.ValueType + + true + + ТипЗначенияРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + true + + + + УдалитьНоваяСсылка + 26 + true + true + + true + + + Список.УдалитьНоваяСсылка + + + УдалитьНоваяСсылкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + УдалитьНоваяСсылкаКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 5 + Left + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + true + + true + true + true + true + true + MultiRow +
          true
          + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + ГруппаПользовательскихНастроек + +
          + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
          true
          + + ChartOfCharacteristicTypes.РазделыДатЗапретаИзменения + true + true + true + true + +
          + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + + + + +
          diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Module.bsl similarity index 50% rename from SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl rename to SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Module.bsl index 9aa31a770..8418109ec 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Module.bsl @@ -8,7 +8,10 @@ Возврат; КонецЕсли; - БольшеНеПоказывать = Ложь; + ТолькоПросмотр = Истина; + Элементы.Список.РежимВыбора = Параметры.РежимВыбора; + + ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения(); КонецПроцедуры @@ -17,16 +20,9 @@ #Область ОбработчикиКомандФормы &НаКлиенте -Процедура ПродолжитьВыполнить(Команда) +Процедура ВключитьВозможностьРедактирования(Команда) - Если БольшеНеПоказывать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиПрограммы", - "ПоказыватьПодсказкиПриРедактированииФайлов", - Ложь); - КонецЕсли; - - Закрыть(Истина); + ТолькоПросмотр = Ложь; КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..4f0d84547 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,215 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипЗначения + 4 + true + true + + true + + + Объект.ValueType + + + ТипЗначенияРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + УдалитьНоваяСсылка + 9 + true + true + + true + + + Объект.УдалитьНоваяСсылка + + + УдалитьНоваяСсылкаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + УдалитьНоваяСсылкаКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаВключитьВозможностьРедактирования + 7 + true + true + + true + + + ФормаВключитьВозможностьРедактированияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + ChartOfCharacteristicTypesObject.РазделыДатЗапретаИзменения + + + true + + + true + +
          true
          + true +
          + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + + + + +
          diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..561e6f035 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,28 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ТолькоПросмотр = Истина; + + ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl new file mode 100644 index 000000000..401cbd950 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl @@ -0,0 +1,161 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. +// +// Возвращаемое значение: +// Массив(Строка) - массив имен реквизитов, образующих естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + + Результат = Новый Массив; + Результат.Добавить("Наименование"); + + Возврат Результат; + +КонецФункции + +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СвойстваРазделовДатЗапрета() Экспорт + + Разделы = Новый ТаблицаЗначений; + Разделы.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(150))); + Разделы.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); + Разделы.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Разделы.Колонки.Добавить("ТипыОбъектов", Новый ОписаниеТипов("Массив")); + + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); + ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ПриЗаполненииРазделовДатЗапретаИзменения + |общего модуля ДатыЗапретаИзмененияПереопределяемый.'") + + Символы.ПС + + Символы.ПС; + + РазделыДатЗапрета = Новый Соответствие; + РазделыБезОбъектов = Новый Массив; + ВсеРазделыБезОбъектов = Истина; + + ТипыОбъектовДатЗапрета = Новый Соответствие; + Типы = Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.Тип.Типы(); + Для Каждого Тип Из Типы Цикл + Если Тип = Тип("ПеречислениеСсылка.ВидыНазначенияДатЗапрета") + Или Тип = Тип("ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения") + Или Не ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + Продолжить; + КонецЕсли; + ТипыОбъектовДатЗапрета.Вставить(Тип, Истина); + КонецЦикла; + + Для Каждого Раздел Из Разделы Цикл + Если Не ЗначениеЗаполнено(Раздел.Имя) Тогда + ВызватьИсключение ЗаголовокОшибки + НСтр("ru = 'Имя раздела дат запрета не заполнено.'"); + КонецЕсли; + + Если РазделыДатЗапрета.Получить(Раздел.Имя) <> Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя раздела дат запрета ""%1"" уже определено.'"), + Раздел.Имя); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Раздел.Идентификатор) И Раздел.Имя <> "ОбщаяДата" Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор раздела дат запрета ""%1"" не заполнен.'"), + Раздел.Имя); + КонецЕсли; + + РазделСсылка = ПолучитьСсылку(Раздел.Идентификатор); + + Если РазделыДатЗапрета.Получить(РазделСсылка) <> Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор ""%1"" раздела дат запрета + |""%2"" уже используется для раздела ""%3"".'"), + Раздел.Идентификатор, Раздел.Имя, РазделыДатЗапрета.Получить(РазделСсылка).Имя); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Раздел.Представление) Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Представление раздела дат запрета ""%1"" не заполнено.'"), + Раздел.Имя); + КонецЕсли; + + ТипыОбъектов = Новый Массив; + Для Каждого Тип Из Раздел.ТипыОбъектов Цикл + ВсеРазделыБезОбъектов = Ложь; + Если Не ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип ""%1"" указан, как тип объектов для раздела дат запрета ""%2"". + |Однако это не тип ссылки.'"), + Строка(Тип), Раздел.Имя); + КонецЕсли; + Если ТипыОбъектовДатЗапрета.Получить(Тип) = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип объектов ""%1"" раздела дат запрета ""%2"" + |не указан в свойстве ""Тип"" плана видов характеристик ""Разделы дат запрета изменения"".'"), + Строка(Тип), Раздел.Имя); + КонецЕсли; + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + ПолноеИмя = МетаданныеТипа.ПолноеИмя(); + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя); + СвойстваТипа = Новый Структура; + СвойстваТипа.Вставить("ПустаяСсылка", МенеджерОбъекта.ПустаяСсылка()); + СвойстваТипа.Вставить("ПолноеИмя", ПолноеИмя); + СвойстваТипа.Вставить("Представление", Строка(Тип)); + ТипыОбъектов.Добавить(Новый ФиксированнаяСтруктура(СвойстваТипа)); + КонецЦикла; + + СвойстваРаздела = Новый Структура; + СвойстваРаздела.Вставить("Имя", Раздел.Имя); + СвойстваРаздела.Вставить("Ссылка", РазделСсылка); + СвойстваРаздела.Вставить("Представление", Раздел.Представление); + СвойстваРаздела.Вставить("ТипыОбъектов", Новый ФиксированныйМассив(ТипыОбъектов)); + СвойстваРаздела = Новый ФиксированнаяСтруктура(СвойстваРаздела); + РазделыДатЗапрета.Вставить(СвойстваРаздела.Имя, СвойстваРаздела); + РазделыДатЗапрета.Вставить(СвойстваРаздела.Ссылка, СвойстваРаздела); + + Если ТипыОбъектов.Количество() = 0 Тогда + РазделыБезОбъектов.Добавить(Раздел.Имя); + КонецЕсли; + КонецЦикла; + + // Добавление пустого раздела (общая дата). + СвойстваРаздела = Новый Структура; + СвойстваРаздела.Вставить("Имя", ""); + СвойстваРаздела.Вставить("Ссылка", ПустаяСсылка()); + СвойстваРаздела.Вставить("Представление", НСтр("ru = 'Общая дата'")); + СвойстваРаздела.Вставить("ТипыОбъектов", Новый ФиксированныйМассив(Новый Массив)); + СвойстваРаздела = Новый ФиксированнаяСтруктура(СвойстваРаздела); + РазделыДатЗапрета.Вставить(СвойстваРаздела.Имя, СвойстваРаздела); + РазделыДатЗапрета.Вставить(СвойстваРаздела.Ссылка, СвойстваРаздела); + + Свойства = Новый Структура; + Свойства.Вставить("Разделы", Новый ФиксированноеСоответствие(РазделыДатЗапрета)); + Свойства.Вставить("РазделыБезОбъектов", Новый ФиксированныйМассив(РазделыБезОбъектов)); + Свойства.Вставить("ВсеРазделыБезОбъектов", ВсеРазделыБезОбъектов); + Свойства.Вставить("БезРазделовИОбъектов", Разделы.Количество() = 0); + Свойства.Вставить("ЕдинственныйРаздел", ?(Разделы.Количество() = 1, + РазделыДатЗапрета[Разделы[0].Имя].Ссылка, + ПустаяСсылка())); + Свойства.Вставить("ПоказыватьРазделы", Свойства.ВсеРазделыБезОбъектов + Или Не ЗначениеЗаполнено(Свойства.ЕдинственныйРаздел)); + + Возврат Новый ФиксированнаяСтруктура(Свойства); + +КонецФункции + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ObjectModule.bsl index 4d633bff7..e69de29bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ObjectModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ObjectModule.bsl @@ -1,33 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область ОбработчикиСобытий - -// Предотвращает изменение разделов дат запрета изменения, -// которые должны изменятся только в режиме конфигурирования. -// -Процедура ПередЗаписью(Отказ) - - Если Предопределенный - И ОбменДанными.Загрузка - И ОбменДанными.Отправитель <> Неопределено - И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - - ЗаполнитьЗначенияСвойств(ЭтотОбъект, - ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "ТипЗначения, Наименование")); - КонецЕсли; - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - ВызватьИсключение - НСтр("ru = 'Изменение разделов дат запрета изменения - |выполняется только через конфигуратор. - | - |Удаление допустимо.'"); - -КонецПроцедуры - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/РазделыДатЗапретаИзменения.mdo b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/РазделыДатЗапретаИзменения.mdo index 091149fe6..a3a2a23d5 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/РазделыДатЗапретаИзменения.mdo +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/РазделыДатЗапретаИзменения.mdo @@ -109,13 +109,50 @@ AsDescription - ОбработкаПерсональныхДанных - Обработка персональных данных + УдалитьОбработкаПерсональныхДанных + (не используется) Обработка персональных данных ChartOfCharacteristicTypesRef.РазделыДатЗапретаИзменения + DontAutoUpdate InDialog BothWays + ChartOfCharacteristicTypes.РазделыДатЗапретаИзменения.Form.ФормаЭлемента + ChartOfCharacteristicTypes.РазделыДатЗапретаИзменения.Form.ФормаСписка + ChartOfCharacteristicTypes.РазделыДатЗапретаИзменения.Form.ФормаСписка + + УдалитьНоваяСсылка + + ru + (не используется) Новая ссылка + + + ChartOfCharacteristicTypesRef.РазделыДатЗапретаИзменения + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo index 2874e7eec..71cdae82a 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo @@ -91,5 +91,6 @@ Constant.ИспользоватьРазделениеПоОбластямДанных DontUse DontUse + DontUse Use diff --git a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo index fc37ec875..cebc004ee 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo @@ -105,7 +105,7 @@ DontUse - Constant.ВерсияКлассификатораБанковРФ + Constant.ВерсияКлассификатораБанков DontUse @@ -124,10 +124,6 @@ Constant.ИспользоватьПроверкуКонтрагентов DontUse - - Constant.ПараметрыПодключаемыхКоманд - DontUse - InformationRegister.УдалитьЗамерыВремениТехнологические DontUse @@ -209,7 +205,7 @@ DontUse - ScheduledJob.ЗагрузкаКлассификатораБанковРФССайтаРБК + ScheduledJob.ЗагрузкаКлассификатораБанков DontUse @@ -288,10 +284,6 @@ ScheduledJob.ОтложенноеОбновлениеИБ DontUse - - Constant.ПараметрыРаботыПользователей - DontUse - Constant.КаталогОбменаФайламиВМоделиСервисаLinux DontUse @@ -324,10 +316,6 @@ InformationRegister.УдалитьОбластиКРезервномуКопированию DontUse - - Constant.РазделыОписанияИзмененийСистемы - DontUse - Catalog.ОчередьЗаданий DontUse @@ -364,6 +352,10 @@ DocumentJournal.Взаимодействия DontUse + + ScheduledJob.ОбновлениеВнешнихКомпонентССайта + DontUse + Constant.МаксимальноеКоличествоИсполняющихФоновыхЗаданий DontUse @@ -400,10 +392,6 @@ ScheduledJob.ИзвлечениеТекста DontUse - - Constant.ПараметрыСлужебныхСобытий - DontUse - ScheduledJob.ПланированиеОбработкиЗаданий DontUse @@ -445,7 +433,7 @@ DontUse - Constant.КонечнаяТочкаМенеджераСервиса + Constant.УдалитьКонечнаяТочкаМенеджераСервиса DontUse @@ -476,6 +464,10 @@ ScheduledJob.МониторингЗадач DontUse + + InformationRegister.ПараметрыРаботыПрограммы + DontUse + Constant.УдалитьИмяСлужебногоПользователяМенеджераСервиса DontUse @@ -484,10 +476,6 @@ InformationRegister.НастройкиТранспортаОбмена DontUse - - Constant.ПараметрыОграниченияДоступа - DontUse - ScheduledJob.ОчисткаЗамеровВремени DontUse @@ -513,11 +501,11 @@ DontUse - Constant.ВнутреннийАдресМенеджераСервиса + Constant.УдалитьВнутреннийАдресМенеджераСервиса DontUse - Catalog.КлассификаторБанковРФ + Catalog.КлассификаторБанков DontUse @@ -536,10 +524,6 @@ ScheduledJob.СборИОтправкаСтатистики DontUse - - Constant.ПараметрыВариантовОтчетов - DontUse - InformationRegister.УдалитьЗамерыВремени2 DontUse @@ -600,6 +584,10 @@ Constant.СведенияОбОбновленииИБ DontUse + + ScheduledJob.ЗапускДополнительныхОбработок + DontUse + ChartOfCharacteristicTypes.УдалитьВидыДоступа DontUse @@ -724,10 +712,6 @@ InformationRegister.БезопасноеХранилищеДанных DontUse - - Constant.ПараметрыДополнительныхРеквизитовИСведений - DontUse - InformationRegister.УдалитьОчередьЗаданий DontUse diff --git a/SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl b/SSL/src/CommonCommands/ВерсииФайла/CommandModule.bsl similarity index 91% rename from SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl rename to SSL/src/CommonCommands/ВерсииФайла/CommandModule.bsl index 9984e38b1..42d85bdb6 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl +++ b/SSL/src/CommonCommands/ВерсииФайла/CommandModule.bsl @@ -9,7 +9,7 @@ ПараметрыВыполненияКоманды.Источник.УникальныйИдентификатор); ОткрытьФорму( - "Справочник.ВерсииФайлов.Форма.ВерсииФайла", + "Обработка.РаботаСФайлами.Форма.ВерсииФайла", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/ПрисоединенныеФайлыКОбъекту.mdo b/SSL/src/CommonCommands/ВерсииФайла/ВерсииФайла.mdo similarity index 52% rename from SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/ПрисоединенныеФайлыКОбъекту.mdo rename to SSL/src/CommonCommands/ВерсииФайла/ВерсииФайла.mdo index fc7743739..8971fe321 100644 --- a/SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/ПрисоединенныеФайлыКОбъекту.mdo +++ b/SSL/src/CommonCommands/ВерсииФайла/ВерсииФайла.mdo @@ -1,13 +1,13 @@ - - ПрисоединенныеФайлыКОбъекту + + ВерсииФайла ru - Присоединенные файлы + Версии файла FormNavigationPanelGoTo - DefinedType.ВладелецПрисоединенныхФайлов + CatalogRef.Файлы Auto diff --git a/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl b/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl new file mode 100644 index 000000000..d5c4e3412 --- /dev/null +++ b/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl @@ -0,0 +1,32 @@ + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПоказатьПредупреждение(, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Время сеанса: %1 + |На сервере: %2 + |На клиенте: %3 + | + |Время сеанса - это время сервера, + |приведенное к часовому поясу клиента.'"), + Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДЛФ=T"), + Формат(ДатаСервера(), "ДЛФ=T"), + Формат(ТекущаяДата(), "ДЛФ=T"))); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Функция ДатаСервера() + + Возврат ТекущаяДата(); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonCommands/ВремяТекущегоСеанса/ВремяТекущегоСеанса.mdo b/SSL/src/CommonCommands/ВремяТекущегоСеанса/ВремяТекущегоСеанса.mdo new file mode 100644 index 000000000..8ae11f298 --- /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..1fe26a183 --- /dev/null +++ b/SSL/src/CommonCommands/ВсеФайлы/CommandModule.bsl @@ -0,0 +1,8 @@ +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВсеФайлы", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonCommands/ВсеФайлы/ВсеФайлы.mdo b/SSL/src/CommonCommands/ВсеФайлы/ВсеФайлы.mdo new file mode 100644 index 000000000..e8e41d92f --- /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 index 6273a1cf4..2b2056ec7 100644 --- a/SSL/src/CommonCommands/ЗагрузитьКомплектПравил/CommandModule.bsl +++ b/SSL/src/CommonCommands/ЗагрузитьКомплектПравил/CommandModule.bsl @@ -2,9 +2,17 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(ИмяПланаОбмена(ПараметрКоманды)); - + СведенияОПланеОбмена = СведенияОПланеОбмена(ПараметрКоманды); + Если СведенияОПланеОбмена.ИспользуютсяПравилаКонвертации Тогда + ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(СведенияОПланеОбмена.ИмяПланаОбмена); + Иначе + ВидПравил = ПредопределенноеЗначение("Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов"); + + Отбор = Новый Структура("ИмяПланаОбмена, ВидПравил", СведенияОПланеОбмена.ИмяПланаОбмена, ВидПравил); + ЗначенияЗаполнения = Новый Структура("ИмяПланаОбмена, ВидПравил", СведенияОПланеОбмена.ИмяПланаОбмена, ВидПравил); + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "ПравилаДляОбменаДанными", + ПараметрКоманды, "ПравилаРегистрацииОбъектов"); + КонецЕсли; КонецПроцедуры #КонецОбласти @@ -12,10 +20,14 @@ #Область СлужебныеПроцедурыИФункции &НаСервере -Функция ИмяПланаОбмена(Знач УзелИнформационнойБазы) +Функция СведенияОПланеОбмена(Знач УзелИнформационнойБазы) - Возврат ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); + Результат = Новый Структура("ИмяПланаОбмена,ИспользуютсяПравилаКонвертации"); + Результат.ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); + Результат.ИспользуютсяПравилаКонвертации = ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(Результат.ИмяПланаОбмена, "ПравилаОбмена"); + Возврат Результат; КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonCommands/ЗаполнениеОбъекта/CommandModule.bsl b/SSL/src/CommonCommands/ЗаполнениеОбъекта/CommandModule.bsl deleted file mode 100644 index 3b0981367..000000000 --- a/SSL/src/CommonCommands/ЗаполнениеОбъекта/CommandModule.bsl +++ /dev/null @@ -1,14 +0,0 @@ - -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( - ПараметрКоманды, - ПараметрыВыполненияКоманды, - ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo b/SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo deleted file mode 100644 index f1fa4db4c..000000000 --- a/SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo +++ /dev/null @@ -1,19 +0,0 @@ - - - ЗаполнениеОбъекта - - ru - Заполнение... - - FormCommandBarImportant - - DefinedType.ОбъектСДополнительнымиКомандами - - Multiple - true - Auto - - ru - Перейти к списку дополнительных обработок для заполнения объекта - - diff --git a/SSL/src/CommonCommands/Настройка1СБухфон/CommandModule.bsl b/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl similarity index 89% rename from SSL/src/CommonCommands/Настройка1СБухфон/CommandModule.bsl rename to SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl index e95148be4..d3ad5cfda 100644 --- a/SSL/src/CommonCommands/Настройка1СБухфон/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl @@ -3,7 +3,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("ОбщаяФорма.Настройка1СБухфон"); + ОткрытьФорму("ОбщаяФорма.НастройкаОнлайнПоддержки"); КонецПроцедуры diff --git a/SSL/src/CommonCommands/Настройка1СБухфон/Настройка1СБухфон.mdo b/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo similarity index 87% rename from SSL/src/CommonCommands/Настройка1СБухфон/Настройка1СБухфон.mdo rename to SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo index 3a378e4fb..1828638a2 100644 --- a/SSL/src/CommonCommands/Настройка1СБухфон/Настройка1СБухфон.mdo +++ b/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo @@ -1,6 +1,6 @@ - Настройка1СБухфон + НастройкаОнлайнПоддержки ru Настройка онлайн-поддержки diff --git a/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl index aa7367ef1..b0ff32f10 100644 --- a/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl @@ -6,7 +6,7 @@ ОткрытьФорму( "Справочник.УчетныеЗаписиЭлектроннойПочты.ФормаОбъекта", - Новый Структура("Ключ, БлокироватьВладельца", УчетнаяЗапись(), Истина), + Новый Структура("Ключ", УчетнаяЗапись()), ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); diff --git a/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl b/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl index a5544e6c3..305b2f9b7 100644 --- a/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl @@ -4,7 +4,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); ИмяОткрываемойФормы = ?(ПараметрыРаботыКлиента.РазделениеВключено, "ОбщаяФорма.СинхронизацияДанныхВМоделиСервиса", "ОбщаяФорма.СинхронизацияДанных"); diff --git a/SSL/src/CommonCommands/ОтчетыОбъекта/CommandModule.bsl b/SSL/src/CommonCommands/ОтчетыОбъекта/CommandModule.bsl deleted file mode 100644 index a55a65c27..000000000 --- a/SSL/src/CommonCommands/ОтчетыОбъекта/CommandModule.bsl +++ /dev/null @@ -1,14 +0,0 @@ - -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( - ПараметрКоманды, - ПараметрыВыполненияКоманды, - ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет()); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo b/SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo deleted file mode 100644 index dcceb519e..000000000 --- a/SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo +++ /dev/null @@ -1,18 +0,0 @@ - - - ОтчетыОбъекта - - ru - Отчеты... - - FormCommandBarImportant - - DefinedType.ОбъектСДополнительнымиКомандами - - Multiple - Auto - - ru - Перейти к списку дополнительных отчетов - - diff --git a/SSL/src/CommonCommands/ПоказатьРезультатРезервногоКопирования/CommandModule.bsl b/SSL/src/CommonCommands/ПоказатьРезультатРезервногоКопирования/CommandModule.bsl index fa11c95c9..410e81739 100644 --- a/SSL/src/CommonCommands/ПоказатьРезультатРезервногоКопирования/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПоказатьРезультатРезервногоКопирования/CommandModule.bsl @@ -4,7 +4,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); ПараметрыРезервногоКопирования = ПараметрыРаботы.РезервноеКопированиеИБ; ПараметрыФормы = Новый Структура(); diff --git a/SSL/src/CommonCommands/ПраваДоступа/CommandModule.bsl b/SSL/src/CommonCommands/ПраваДоступа/CommandModule.bsl index 74dbfdceb..0736c9abb 100644 --- a/SSL/src/CommonCommands/ПраваДоступа/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПраваДоступа/CommandModule.bsl @@ -7,7 +7,7 @@ Возврат; КонецЕсли; - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ПараметрыРаботыКлиента.УпрощенныйИнтерфейсНастройкиПравДоступа Тогда ИмяФормы = "ОбщаяФорма.ПраваДоступаУпрощенно"; diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl b/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl index bbeb23433..63d9930d3 100644 --- a/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl @@ -2,18 +2,17 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - Параметры = Новый Структура; - Параметры.Вставить("ВладелецФайла", ПараметрКоманды); - Заголовок = НСтр("ru = 'Присоединенные файлы'"); - Параметры.Вставить("ЗаголовокФормы", Заголовок); - ОткрытьФорму( - "Справочник.Файлы.Форма.ФормаСпискаПрисоединенныхФайлов", - Параметры, - ПараметрыВыполненияКоманды.Источник, - ПараметрыВыполненияКоманды.Уникальность, - ПараметрыВыполненияКоманды.Окно); - + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ВладелецФайла", ПараметрКоманды); + ПараметрыФормы.Вставить("ТолькоПросмотр", ПараметрыВыполненияКоманды.Источник.ТолькоПросмотр); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", + ПараметрыФормы, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo b/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo index 96da8e2c3..f082664da 100644 --- a/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo +++ b/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo @@ -7,7 +7,7 @@ FormNavigationPanelGoTo - DefinedType.ВладелецФайлов + DefinedType.ВладелецПрисоединенныхФайлов Auto diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/CommandModule.bsl b/SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/CommandModule.bsl deleted file mode 100644 index 4b6f57c5d..000000000 --- a/SSL/src/CommonCommands/ПрисоединенныеФайлыКОбъекту/CommandModule.bsl +++ /dev/null @@ -1,19 +0,0 @@ - -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ВладелецФайла", ПараметрКоманды); - ПараметрыФормы.Вставить("ТолькоПросмотр", ПараметрыВыполненияКоманды.Источник.ТолькоПросмотр); - - ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", - ПараметрыФормы, - ПараметрыВыполненияКоманды.Источник, - ПараметрыВыполненияКоманды.Уникальность, - ПараметрыВыполненияКоманды.Окно); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonCommands/ПроверитьДоступКСервису/CommandModule.bsl b/SSL/src/CommonCommands/ПроверитьДоступКСервису/CommandModule.bsl new file mode 100644 index 000000000..4c31bab3d --- /dev/null +++ b/SSL/src/CommonCommands/ПроверитьДоступКСервису/CommandModule.bsl @@ -0,0 +1,9 @@ + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ПроверкаКонтрагентовКлиент.ПроверитьДоступКСервису(); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonCommands/ПроверитьДоступКСервису/ПроверитьДоступКСервису.mdo b/SSL/src/CommonCommands/ПроверитьДоступКСервису/ПроверитьДоступКСервису.mdo new file mode 100644 index 000000000..3f9d5ca75 --- /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 index d1b5bef70..dd692bcdf 100644 --- a/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl +++ b/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl @@ -19,7 +19,7 @@ &НаСервере Функция ЕстьФайлыВТомах() - Возврат ФайловыеФункцииСлужебный.ЕстьФайлыВТомах(); + Возврат РаботаСФайламиСлужебный.ЕстьФайлыВТомах(); КонецФункции diff --git a/SSL/src/Catalogs/Файлы/Commands/РедактируемыеФайлы/CommandModule.bsl b/SSL/src/CommonCommands/РедактируемыеФайлы/CommandModule.bsl similarity index 83% rename from SSL/src/Catalogs/Файлы/Commands/РедактируемыеФайлы/CommandModule.bsl rename to SSL/src/CommonCommands/РедактируемыеФайлы/CommandModule.bsl index 9ec32013e..30b89f938 100644 --- a/SSL/src/Catalogs/Файлы/Commands/РедактируемыеФайлы/CommandModule.bsl +++ b/SSL/src/CommonCommands/РедактируемыеФайлы/CommandModule.bsl @@ -4,7 +4,7 @@ Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОткрытьФорму( - "Справочник.Файлы.Форма.РедактируемыеФайлы", + "Обработка.РаботаСФайлами.Форма.РедактируемыеФайлы", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, diff --git a/SSL/src/CommonCommands/РедактируемыеФайлы/РедактируемыеФайлы.mdo b/SSL/src/CommonCommands/РедактируемыеФайлы/РедактируемыеФайлы.mdo new file mode 100644 index 000000000..099082eb8 --- /dev/null +++ b/SSL/src/CommonCommands/РедактируемыеФайлы/РедактируемыеФайлы.mdo @@ -0,0 +1,14 @@ + + + РедактируемыеФайлы + + ru + Редактируемые файлы + + NavigationPanelOrdinary + Auto + + ru + Открывает список редактируемых файлов в папках + + diff --git a/SSL/src/CommonCommands/Запустить1СБухфон/CommandModule.bsl b/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl similarity index 72% rename from SSL/src/CommonCommands/Запустить1СБухфон/CommandModule.bsl rename to SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl index c89d910ce..63e34a977 100644 --- a/SSL/src/CommonCommands/Запустить1СБухфон/CommandModule.bsl +++ b/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl @@ -2,7 +2,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - Интеграция1СБухфонКлиент.Запустить1СБухфон(); + ВызовОнлайнПоддержкиКлиент.ВызватьОнлайнПоддержку(); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonCommands/Запустить1СБухфон/Запустить1СБухфон.mdo b/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo similarity index 85% rename from SSL/src/CommonCommands/Запустить1СБухфон/Запустить1СБухфон.mdo rename to SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo index 95c9abe19..db9ab2098 100644 --- a/SSL/src/CommonCommands/Запустить1СБухфон/Запустить1СБухфон.mdo +++ b/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo @@ -1,6 +1,6 @@ - Запустить1СБухфон + СвязатьсяСоСпециалистомОнлайнПоддержки ru Связаться со специалистом онлайн-поддержки diff --git a/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo b/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo index a0141a7e6..e3740669e 100644 --- a/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo +++ b/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo @@ -7,4 +7,8 @@ FormNavigationPanelGoTo Auto + + ru + Открыть отчет "Связанные документы", который отображает связи текущего объекта с другими объектами информационной базы. + diff --git a/SSL/src/CommonForms/АдреснаяКнига/Form.form b/SSL/src/CommonForms/АдреснаяКнига/Form.form index 574218274..d466f6471 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Form.form +++ b/SSL/src/CommonForms/АдреснаяКнига/Form.form @@ -131,12 +131,8 @@
          <key>ru</key> - <value>Группа строка поиска</value> + <value>Строка поиска</value> - - ru - Группа строка поиска - true ГруппаСтрокаПоискаExtendedTooltip @@ -160,6 +156,10 @@ НайденныеКонтакты 25 + + <key>ru</key> + <value>Найденные контакты</value> + true true @@ -401,9 +401,6 @@ Auto true true - None - None - None true @@ -416,10 +413,6 @@ ru Поиск контактов - - ru - Страница поиск контактов - СтраницаПоискКонтактовExtendedTooltip 184 @@ -443,6 +436,10 @@ КонтактыПоПредмету 121 + + <key>ru</key> + <value>Контакты по предмету</value> + true true @@ -730,9 +727,6 @@ Auto true true - None - None - None true @@ -745,10 +739,6 @@ ru Контакты по предмету - - ru - Страница все контакты по предмету - СтраницаВсеКонтактыПоПредметуExtendedTooltip 196 @@ -772,6 +762,10 @@ ГруппыПользователей 176 + + <key>ru</key> + <value>Группы пользователей</value> + true true @@ -955,9 +949,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -972,6 +963,10 @@ СписокПользователей 95 + + <key>ru</key> + <value>Список пользователей</value> + true true @@ -1038,7 +1033,7 @@ Selection - СписокСправочникаВыбор + Подключаемый_СписокСправочникаВыбор СписокПользователейСтрокаПоиска @@ -1151,9 +1146,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -1200,10 +1192,6 @@ ru Страницы списки - - ru - Страницы списки - СтраницыСпискиExtendedTooltip 183 @@ -1416,10 +1404,6 @@ ru Страница переместить одна таблица - - ru - Страница переместить одна таблица - СтраницаПереместитьОднаТаблицаExtendedTooltip 210 @@ -1682,10 +1666,6 @@ ru Страница переместить две таблицы - - ru - Страница переместить две таблицы - СтраницаПереместитьДвеТаблицыExtendedTooltip 217 @@ -1735,6 +1715,10 @@ ПолучателиПисьма 56 + + <key>ru</key> + <value>Получатели письма</value> + true true @@ -1780,7 +1764,7 @@ 12 true true - true + true true @@ -2269,10 +2253,6 @@ ru Найти контакт - - ru - Найти контакт - НайтиКонтактExtendedTooltip 228 @@ -2378,10 +2358,6 @@ ru Изменить группу - - ru - Изменить группу - ИзменитьГруппуExtendedTooltip 232 @@ -2414,9 +2390,6 @@ Auto true true - None - None - None true @@ -2427,7 +2400,7 @@ <key>ru</key> - <value>Группа получатели</value> + <value>Получатели</value> ГруппаПолучателиExtendedTooltip @@ -2456,12 +2429,8 @@ <key>ru</key> - <value>Группа получатели переместить</value> + <value>Получатели переместить</value> - - ru - Группа получатели переместить - ГруппаПолучателиПереместитьExtendedTooltip 208 @@ -2488,12 +2457,8 @@ <key>ru</key> - <value>Группа списки</value> + <value>Списки</value> - - ru - Группа списки - ГруппаСпискиExtendedTooltip 182 diff --git a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl index 45e53f92f..3f97cf772 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl +++ b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl @@ -19,7 +19,7 @@ Взаимодействия.ЗаполнитьКонтактыПоПредмету(Элементы, Предмет, КонтактыПоПредмету, Истина); // Заполним список вариантов поиска и осуществим первый поиск. - ВсеСпискиПоиска = Взаимодействия.ПолучитьСписокДоступныхПоисков(ППДВключен, Параметры, Элементы, Истина); + ВсеСпискиПоиска = Взаимодействия.СписокДоступныхПоисков(ППДВключен, Параметры, Элементы, Истина); ВариантыПоиска = "ПоEmail"; КонецПроцедуры @@ -103,7 +103,7 @@ КонецПроцедуры &НаКлиенте -Процедура СписокСправочникаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) +Процедура Подключаемый_СписокСправочникаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; @@ -111,7 +111,7 @@ Возврат; КонецЕсли; - Результат = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(ВыбраннаяСтрока); + Результат = ВзаимодействияВызовСервера.НаименованиеИАдресаЭлектроннойПочтыКонтакта(ВыбраннаяСтрока); Если Результат = Неопределено Тогда Возврат; КонецЕсли; @@ -139,7 +139,7 @@ Возврат; КонецЕсли; - Результат = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); + Результат = ВзаимодействияВызовСервера.НаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); Если Результат <> Неопределено И Результат.Адреса.Количество() > 0 Тогда СписокАдресов = СтрСоединить(Результат.Адреса.ВыгрузитьЗначения(), ";"); Иначе @@ -231,7 +231,7 @@ Процедура КомандаНайтиВыполнить() Если ПустаяСтрока(СтрокаПоиска) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не задана строка поиска!'"),,"СтрокаПоиска"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не задана строка поиска.'"),,"СтрокаПоиска"); Возврат; КонецЕсли; @@ -487,7 +487,7 @@ &НаСервере Процедура НайтиПоНачалуНаименования() - Взаимодействия.ПолучитьВсеКонтактыПоНачалуНаименованияСАдресамиЭлектроннойПочты(СтрокаПоиска, ЭтотОбъект); + Взаимодействия.ВсеКонтактыПоНачалуНаименованияСАдресамиЭлектроннойПочты(СтрокаПоиска, ЭтотОбъект); КонецПроцедуры @@ -588,7 +588,7 @@ Возврат; КонецЕсли; - Результат = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); + Результат = ВзаимодействияВызовСервера.НаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); Если Результат <> Неопределено И Результат.Адреса.Количество() > 0 Тогда СписокАдресов = СтрСоединить(Результат.Адреса.ВыгрузитьЗначения(), ";"); Иначе diff --git a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form index 38dbaae85..0f06f37c0 100644 --- a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form +++ b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form @@ -25,7 +25,7 @@ • Если информационная база была перемещена, нажмите <b>Информационная база перемещена</>. • Если это копия информационной базы, нажмите <b>Это копия информационной базы</><b>.</> При этом работа со всеми внешними ресурсами (синхронизация данных, отправка почты и т.п.), выполняемая по расписанию, - будет заблокирована для предотвращения конфликтов с основной информационной базой. + будет заблокирована для предотвращения конфликтов с основой информационной базой. Блокировку также можно снять позднее в разделе <b>Администрирование</><b> - </><b>Поддержка и обслуживание</>. @@ -183,10 +183,6 @@ ru Еще - - ru - Форма группа еще - ФормаГруппаЕщеРасширеннаяПодсказка 15 @@ -235,6 +231,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + ГруппаКоманднаяПанельРасширеннаяПодсказка 28 @@ -255,6 +255,10 @@ true + + <key>ru</key> + <value>Принятие решения о блокировке</value> + ГруппаПринятиеРешенияОБлокировкеРасширеннаяПодсказка 21 @@ -311,12 +315,8 @@ <key>ru</key> - <value>Группа командная панель параметры</value> + <value>Командная панель параметры</value> - - ru - Группа командная панель параметры - ГруппаКоманднаяПанельПараметрыРасширеннаяПодсказка 33 @@ -372,6 +372,10 @@ true + + <key>ru</key> + <value>Параметры блокировки</value> + ГруппаПараметрыБлокировкиРасширеннаяПодсказка 23 @@ -394,6 +398,10 @@ true + + <key>ru</key> + <value>Параметры формы</value> + ГруппаПараметрыФормыРасширеннаяПодсказка 19 diff --git a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Help/ru.html b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Help/ru.html index 69714f607..0fdddba35 100644 --- a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Help/ru.html +++ b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Help/ru.html @@ -9,7 +9,7 @@
          • По изменению имени информационной базы. Например, если имя информационной базы было "base_bp", а стало "base_bp_test".
          • -
            Или по изменению имени компьютера и имени сервера. Например, если имя компьютера было "main_server", а стало "test_server", а так же изменилось имя сервера с "main" на "test".

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

          +
          Или по изменению имени компьютера и имени сервера. Например, если имя компьютера было "main_server", а стало "test_server", а также изменилось имя сервера с "main" на "test".

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

        Ложные срабатывания при проверке перемещения базы

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

        См. также:

        diff --git a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl index 5e46c81c9..25f4f0943 100644 --- a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl +++ b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl @@ -12,17 +12,17 @@ Если Параметры.ПринятиеРешенияОБлокировке Тогда ТекстСнятияБлокировки = РегламентныеЗаданияСлужебный.ЗначениеНастройки("РасположениеКомандыСнятияБлокировки"); - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ИзменилосьРазделение = ПараметрыБлокировки.РазделениеВключено <> РазделениеВключено; Если Не РазделениеВключено И Не ИзменилосьРазделение Тогда СохраненнаяСтрокаСоединения = ПараметрыБлокировки.СтрокаСоединения; - ПараметрыСохраненнойСтрокиСоединения = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СохраненнаяСтрокаСоединения); + ПараметрыСохраненнойСтрокиСоединения = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СохраненнаяСтрокаСоединения); Если ПараметрыСохраненнойСтрокиСоединения.Свойство("File") Тогда СохраненнаяСтрокаСоединения = ПараметрыСохраненнойСтрокиСоединения.File; КонецЕсли; ТекущаяСтрокаСоединения = СтрокаСоединения; - ПараметрыТекущейСтрокиСоединения = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(ТекущаяСтрокаСоединения); + ПараметрыТекущейСтрокиСоединения = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(ТекущаяСтрокаСоединения); Если ПараметрыТекущейСтрокиСоединения.Свойство("File") Тогда ТекущаяСтрокаСоединения = ПараметрыТекущейСтрокиСоединения.File; КонецЕсли; @@ -37,7 +37,7 @@ |• Если информационная база будет использоваться для ведения учета, нажмите Информационная база перемещена. |• При выборе варианта Это копия информационной базы работа со всеми внешними ресурсами | (синхронизация данных, отправка почты и т.п.), выполняемая по расписанию, - | будет заблокирована для предотвращения конфликтов с основной информационной базой. + | будет заблокирована для предотвращения конфликтов с основой информационной базой. | |%3'"), СохраненнаяСтрокаСоединения, ТекущаяСтрокаСоединения, ТекстСнятияБлокировки); ИначеЕсли Не РазделениеВключено И ИзменилосьРазделение Тогда @@ -128,6 +128,7 @@ ЭтоКопияИнформационнойБазыНаСервере(); Закрыть(); КонецПроцедуры + &НаКлиенте Процедура ПроверятьИмяСервера(Команда) ПараметрыБлокировки.ПроверятьИмяСервера = Не ПараметрыБлокировки.ПроверятьИмяСервера; @@ -157,37 +158,24 @@ ЗависимостиЗаданий = РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); НайденныеСтроки = ЗависимостиЗаданий.НайтиСтроки(Новый Структура("РаботаетСВнешнимиРесурсами", Истина)); ОбработанныеЗадания = Новый Соответствие; + Для Каждого СтрокаЗадания Из НайденныеСтроки Цикл Если ОбработанныеЗадания.Получить(СтрокаЗадания.РегламентноеЗадание) <> Неопределено Тогда Продолжить; // Задание уже было отключено. КонецЕсли; ОбработанныеЗадания.Вставить(СтрокаЗадания.РегламентноеЗадание); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); - ПараметрыЗадания.Вставить("ИмяМетода", СтрокаЗадания.РегламентноеЗадание.ИмяМетода); - ПараметрыЗадания.Вставить("Использование", Истина); - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); - - ПараметрыЗадания = Новый Структура("Использование", Ложь); - Для Каждого Задание Из СписокЗаданий Цикл - МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания); - ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.Идентификатор); - КонецЦикла; - КонецЕсли; - Иначе - Отбор = Новый Структура; - Отбор.Вставить("Метаданные", СтрокаЗадания.РегламентноеЗадание); - Отбор.Вставить("Использование", Истина); - МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор); - Для Каждого Задание Из МассивЗаданий Цикл - Задание.Использование = Ложь; - Задание.Записать(); - ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.УникальныйИдентификатор); - КонецЦикла; - КонецЕсли; + + Отбор = Новый Структура; + Отбор.Вставить("Использование", Истина); + Отбор.Вставить("Метаданные", СтрокаЗадания.РегламентноеЗадание); + Задания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор); + + ПараметрыЗадания = Новый Структура("Использование", Ложь); + Для Каждого Задание Из Задания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, ПараметрыЗадания); + ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.УникальныйИдентификатор); + КонецЦикла; + КонецЦикла; ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Истина; ХранилищеЗначения = Новый ХранилищеЗначения(ПараметрыБлокировки); diff --git a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form index e4fd0b990..2da447d47 100644 --- a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form +++ b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -101,10 +105,6 @@ ru Колонки - - ru - Колонки - КолонкиРасширеннаяПодсказка 38 @@ -349,10 +349,6 @@ ru Список добавление удаление меню - - ru - Список добавление удаление меню - СписокДобавлениеУдалениеМенюРасширеннаяПодсказка 105 @@ -431,10 +427,6 @@ ru Список включение отключение флажков меню - - ru - Список включение отключение флажков меню - СписокВключениеОтключениеФлажковМенюРасширеннаяПодсказка 79 @@ -511,10 +503,6 @@ ru Список сортировка меню - - ru - Список сортировка меню - СписокСортировкаМенюРасширеннаяПодсказка 91 @@ -591,10 +579,6 @@ ru Список перемещение меню - - ru - Список перемещение меню - СписокПеремещениеМенюРасширеннаяПодсказка 97 @@ -631,54 +615,11 @@ Список.Picture - None - None - None true Подвал 106 - - Декорация1 - 110 - - <key>ru</key> - <value>Список может быть не полным. -Для добавления элементов нажмите "Подбор".</value> - - true - - true - - - Декорация1РасширеннаяПодсказка - 112 - Label - true - true - - Left - - - - Декорация1КонтекстноеМеню - 111 - true - - Label - 1 - true - - Style.ПоясняющийТекст - - - Style.TextFont - - - Left - - СписокПодборПодвал 108 @@ -710,35 +651,6 @@ UserCmds Auto - - ЗаглушкаЧтобыПраваяКоманднаяПанельНеУезжалаВниз - 113 - true - true - - true - - - ЗаглушкаЧтобыПраваяКоманднаяПанельНеУезжалаВнизРасширеннаяПодсказка - 115 - Label - true - true - - Left - - - - ЗаглушкаЧтобыПраваяКоманднаяПанельНеУезжалаВнизКонтекстноеМеню - 114 - true - - Label - true - - Left - - НижняяКоманднаяПанель 24 @@ -803,10 +715,6 @@ ru Нижняя командная панель - - ru - Нижняя командная панель - НижняяКоманднаяПанельРасширеннаяПодсказка 25 @@ -831,10 +739,6 @@ ru Подвал - - ru - Подвал - ПодвалРасширеннаяПодсказка 107 @@ -974,10 +878,6 @@ ru Список добавление удаление - - ru - Список добавление удаление - СписокДобавлениеУдалениеРасширеннаяПодсказка 103 @@ -1056,10 +956,6 @@ ru Список включение отключение флажков - - ru - Список включение отключение флажков - СписокВключениеОтключениеФлажковРасширеннаяПодсказка 44 @@ -1070,7 +966,9 @@ Left - + + Compact + СписокСортировка @@ -1136,10 +1034,6 @@ ru Список сортировка - - ru - Список сортировка - СписокСортировкаРасширеннаяПодсказка 55 @@ -1150,7 +1044,9 @@ Left - + + Compact + СписокПеремещение @@ -1216,10 +1112,6 @@ ru Список перемещение - - ru - Список перемещение - СписокПеремещениеРасширеннаяПодсказка 9 @@ -1230,7 +1122,9 @@ Left - + + Compact + ФормаИзменитьФорму @@ -1286,10 +1180,6 @@ Left - - OnOpen - ПриОткрытии - OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl index ca789ecad..3b72362e0 100644 --- a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl +++ b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl @@ -1,13 +1,10 @@ #Область ОписаниеПеременных &НаКлиенте -Перем ПеременныеКлиента; +Перем ЭлементСпискаДоНачалаИзменения; #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// СОБЫТИЯ ФОРМЫ - #Область ОбработчикиСобытийФормы &НаСервере @@ -17,11 +14,37 @@ КонецЕсли; Параметры.Свойство("ОграничиватьВыборУказаннымиЗначениями", ОграничиватьВыборУказаннымиЗначениями); + БыстрыйВыбор = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "БыстрыйВыбор", Ложь); + ИнформацияОТипах = ОтчетыКлиентСервер.АнализТипов(Параметры.ОписаниеТипов, Истина); ИнформацияОТипах.Вставить("СодержитСсылочныеТипы", Ложь); + + ВсеТипыСБыстрымВыбором = ИнформацияОТипах.КоличествоТипов < 10 + И (ИнформацияОТипах.КоличествоТипов = ИнформацияОТипах.ОбъектныеТипы.Количество()); Для Каждого Тип Из ИнформацияОТипах.ОбъектныеТипы Цикл - Если Метаданные.НайтиПоТипу(Тип) <> Неопределено Тогда - ИнформацияОТипах.СодержитСсылочныеТипы = Истина; + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИнформацияОТипах.СодержитСсылочныеТипы = Истина; + + Вид = ВРег(СтрРазделить(ОбъектМетаданных.ПолноеИмя(), ".")[0]); + Если Вид <> "ПЕРЕЧИСЛЕНИЕ" Тогда + Если Вид = "СПРАВОЧНИК" + Или Вид = "ПЛАНВИДОВРАСЧЕТА" + Или Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или Вид = "ПЛАНОБМЕНА" + Или Вид = "ПЛАНСЧЕТОВ" Тогда + Если ОбъектМетаданных.СпособВыбора <> Метаданные.СвойстваОбъектов.СпособВыбора.БыстрыйВыбор Тогда + ВсеТипыСБыстрымВыбором = Ложь; + КонецЕсли; + Иначе + ВсеТипыСБыстрымВыбором = Ложь; + КонецЕсли; + КонецЕсли; + + Если Не ВсеТипыСБыстрымВыбором Тогда Прервать; КонецЕсли; КонецЦикла; @@ -29,21 +52,31 @@ ЗначенияДляВыбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ЗначенияДляВыбора"); Отмеченные = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Отмеченные"); + Если ВсеТипыСБыстрымВыбором Тогда + БыстрыйВыбор = Истина; + КонецЕсли; + + Если Не ОграничиватьВыборУказаннымиЗначениями И БыстрыйВыбор И Не Параметры.ЗначенияДляВыбораЗаполнены Тогда + ЗначенияДляВыбора = ОтчетыСервер.ЗначенияДляВыбора(Параметры); + КонецЕсли; + Заголовок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Представление"); Если ПустаяСтрока(Заголовок) Тогда Заголовок = Строка(Параметры.ОписаниеТипов); КонецЕсли; - БыстрыйВыбор = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "БыстрыйВыбор"); Если ИнформацияОТипах.КоличествоТипов = 0 Тогда ОграничиватьВыборУказаннымиЗначениями = Истина; - ИначеЕсли Не ИнформацияОТипах.СодержитОбъектныеТипы Или БыстрыйВыбор = Истина Тогда + ИначеЕсли Не ИнформацияОТипах.СодержитОбъектныеТипы Или БыстрыйВыбор Тогда Элементы.СписокПодбор.Видимость = Ложь; Элементы.СписокПодборМеню.Видимость = Ложь; Элементы.СписокПодборПодвал.Видимость = Ложь; Элементы.СписокДобавить.ТолькоВоВсехДействиях = Ложь; КонецЕсли; + ВыборГруппИЭлементов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВыборГруппИЭлементов"); + Элементы.СписокЗначение.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ВыборГруппИЭлементов); + Список.ТипЗначения = ИнформацияОТипах.ОписаниеТиповДляФормы; Если ТипЗнч(ЗначенияДляВыбора) = Тип("СписокЗначений") Тогда ЗначенияДляВыбора.ЗаполнитьПометки(Ложь); @@ -87,20 +120,13 @@ Если ОграничиватьВыборУказаннымиЗначениями Или Не ИнформацияОТипах.СодержитСсылочныеТипы Или Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗагрузкаДанныхИзФайла") Тогда - Элементы.СписокВставитьИзБуфераОбмена.Видимость = Ложь; + Элементы.СписокВставитьИзБуфераОбмена.Видимость = Ложь; + Элементы.СписокВставитьИзБуфераОбменаМеню.Видимость = Ложь; КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ПриОткрытии(Отказ) - ПеременныеКлиента = Новый Структура; -КонецПроцедуры - #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// СОБЫТИЯ ТАБЛИЦЫ Список - #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок &НаКлиенте @@ -120,7 +146,6 @@ ЭлементСпискаДоНачалаИзменения = Новый Структура("Идентификатор, Пометка, Значение, Представление"); ЗаполнитьЗначенияСвойств(ЭлементСпискаДоНачалаИзменения, ЭлементСпискаВФорме); ЭлементСпискаДоНачалаИзменения.Идентификатор = СтрокаИдентификатор; - ПеременныеКлиента.Вставить("ЭлементСпискаДоНачалаИзменения", ЭлементСпискаДоНачалаИзменения); КонецПроцедуры &НаКлиенте @@ -159,14 +184,12 @@ Иначе Для Каждого ЭлементСпискаДубльВФорме Из СписокЗначенийВФорме Цикл Если ЭлементСпискаДубльВФорме.Значение = Значение И ЭлементСпискаДубльВФорме <> ЭлементСпискаВФорме Тогда - Состояние(НСтр("ru = 'Обнаружены дублирующиеся записи. Редактирование отменено.'")); ОтменаЗавершенияРедактирования = Истина; // Запрет дублей. Прервать; КонецЕсли; КонецЦикла; КонецЕсли; - ЭлементСпискаДоНачалаИзменения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ЭлементСпискаДоНачалаИзменения"); ЕстьИнформация = (ЭлементСпискаДоНачалаИзменения <> Неопределено И ЭлементСпискаДоНачалаИзменения.Идентификатор = СтрокаИдентификатор); Если Не ОтменаЗавершенияРедактирования И ЕстьИнформация И ЭлементСпискаДоНачалаИзменения.Значение <> Значение Тогда Если ОграничиватьВыборУказаннымиЗначениями Тогда @@ -216,9 +239,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// СОБЫТИЯ КНОПОК - #Область ОбработчикиКомандФормы &НаКлиенте @@ -249,19 +269,19 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - #Область СлужебныеПроцедурыИФункции &НаКлиенте Процедура ВставитьИзБуфераОбменаЗавершение(НайденныеОбъекты, ПараметрыВыполнения) Экспорт + Если НайденныеОбъекты = Неопределено Тогда Возврат; КонецЕсли; + Для Каждого Значение Из НайденныеОбъекты Цикл ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Список, Значение, Неопределено, Истина); КонецЦикла; + КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Form.form b/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Form.form index ecf2cef41..d790d41ec 100644 --- a/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Form.form +++ b/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Form.form @@ -89,6 +89,10 @@ true + + <key>ru</key> + <value>Недостаточно памяти</value> + НедостаточноПамятиРасширеннаяПодсказка 107 @@ -151,6 +155,10 @@ true + + <key>ru</key> + <value>Медленное соединение</value> + МедленноеСоединениеРасширеннаяПодсказка 109 @@ -173,6 +181,10 @@ true + + <key>ru</key> + <value>Режимы медленной работы</value> + РежимыМедленнойРаботыРасширеннаяПодсказка 105 @@ -234,10 +246,6 @@ ru Для включения автоматической проверки обратитесь к администратору - - ru - Информация о необходимости обратиться к администратору - ИнформацияОНеобходимостиОбратитьсяКАдминистраторуРасширеннаяПодсказка 73 @@ -379,10 +387,6 @@ ru Кнопки - - ru - Кнопки - КнопкиРасширеннаяПодсказка 66 diff --git a/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Module.bsl b/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Module.bsl index 674a30a33..d3e1770e9 100644 --- a/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Module.bsl +++ b/SSL/src/CommonForms/ВключениеПроверкиКонтрагентов/Module.bsl @@ -116,7 +116,7 @@ , , , - ПроверкаКонтрагентовКлиентСерверПовтИсп.ПутьКИнструкции()); + ПроверкаКонтрагентовКлиентСервер.ПутьКИнструкции()); Элемент.Заголовок = Новый ФорматированнаяСтрока( Элемент.Заголовок, diff --git a/SSL/src/CommonForms/Вопрос/Form.form b/SSL/src/CommonForms/Вопрос/Form.form index 6f4bda526..9311fa5ba 100644 --- a/SSL/src/CommonForms/Вопрос/Form.form +++ b/SSL/src/CommonForms/Вопрос/Form.form @@ -163,10 +163,6 @@ ru Колонки - - ru - Колонки - КолонкиExtendedTooltip 17 @@ -198,10 +194,6 @@ ru Командная панель - - ru - Командная панель - true true true diff --git a/SSL/src/CommonForms/Вопрос/Module.bsl b/SSL/src/CommonForms/Вопрос/Module.bsl index 4fc36b8ab..b0d18d723 100644 --- a/SSL/src/CommonForms/Вопрос/Module.bsl +++ b/SSL/src/CommonForms/Вопрос/Module.bsl @@ -38,11 +38,11 @@ // Размещение текста. ТекстСообщения = Параметры.ТекстСообщения; - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.МногострочныйТекстСообщения.ЦветРамки = Новый Цвет; // Для платформы (при изменении цвета рамки появляется белый контур). КонецЕсли; МинимальнаяШиринаПоля = 50; - ПримернаяВысотаПоля = СтандартныеПодсистемыКлиентСервер.ЧислоСтрок(Параметры.ТекстСообщения, МинимальнаяШиринаПоля); + ПримернаяВысотаПоля = ЧислоСтрок(Параметры.ТекстСообщения, МинимальнаяШиринаПоля); Элементы.МногострочныйТекстСообщения.Ширина = МинимальнаяШиринаПоля; Элементы.МногострочныйТекстСообщения.Высота = Мин(ПримернаяВысотаПоля, 10); @@ -266,4 +266,28 @@ Возврат Результат; КонецФункции +// Определяет примерное число строк с учетом переносов. +&НаСервереБезКонтекста +Функция ЧислоСтрок(Текст, ОтсечкаПоШирине, ПриводитьКРазмерамЭлементовФормы = Истина) + ЧислоСтрок = СтрЧислоСтрок(Текст); + ЧислоПереносов = 0; + Для НомерСтроки = 1 По ЧислоСтрок Цикл + Строка = СтрПолучитьСтроку(Текст, НомерСтроки); + ЧислоПереносов = ЧислоПереносов + Цел(СтрДлина(Строка)/ОтсечкаПоШирине); + КонецЦикла; + ПримерноеЧислоСтрок = ЧислоСтрок + ЧислоПереносов; + Если ПриводитьКРазмерамЭлементовФормы Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Коэффициент = 4/5; // В 8.2 в высоту 4 вмещается примерно 5 строк текста. + Иначе + Коэффициент = 2/3; // В такси в высоту 2 вмещается примерно 3 строки текста. + КонецЕсли; + ПримерноеЧислоСтрок = Цел((ПримерноеЧислоСтрок+1)*Коэффициент); + КонецЕсли; + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 И ПримерноеЧислоСтрок = 2 Тогда + ПримерноеЧислоСтрок = 3; + КонецЕсли; + Возврат ПримерноеЧислоСтрок; +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form new file mode 100644 index 000000000..232f582d3 --- /dev/null +++ b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form @@ -0,0 +1,166 @@ + + + + <key>ru</key> + <value>Установка внешней компоненты</value> + + + Шапка + 16 + + ДекорацияПояснение + 10 + + <key>ru</key> + <value>Установить внешнюю компоненту?</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 11 + true + + Label + 75 + true + true + + Style.NormalTextFont + 100 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Шапка</value> + + + ШапкаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + УстановитьИПродолжить + 1 + + <key>ru</key> + <value>Установить и продолжить</value> + + true + true + + true + + true + + УстановитьИПродолжитьРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Form.StandardCommand.Yes + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 3 + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + auto + true + + ТекстПояснения + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Module.bsl b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Module.bsl new file mode 100644 index 000000000..8dc0ad049 --- /dev/null +++ b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Module.bsl @@ -0,0 +1,20 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(Параметры.ТекстПояснения) Тогда + Элементы.ДекорацияПояснение.Заголовок = Параметры.ТекстПояснения + + Символы.ПС + + НСтр("ru = 'Установить?'"); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/ПрисоединенныйФайл.mdo b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/ВопросОбУстановкеВнешнейКомпоненты.mdo similarity index 52% rename from SSL/src/CommonForms/ПрисоединенныйФайл/ПрисоединенныйФайл.mdo rename to SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/ВопросОбУстановкеВнешнейКомпоненты.mdo index b08b7c136..b76a8feb0 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/ПрисоединенныйФайл.mdo +++ b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/ВопросОбУстановкеВнешнейКомпоненты.mdo @@ -1,15 +1,10 @@ - - ПрисоединенныйФайл + + ВопросОбУстановкеВнешнейКомпоненты ru - Присоединенный файл + Вопрос об установке внешней компоненты - - - ru - - PersonalComputer MobileDevice diff --git a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form index 73d4a4977..9539fe42f 100644 --- a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form +++ b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form @@ -43,7 +43,7 @@ 6 <key>ru</key> - <value>Связь с главным узлом "%1" распределенной информационной базы была отменена.</value> + <value>Была отменена связь с главным узлом "%1" распределенной информационной базы.</value> true true @@ -82,12 +82,8 @@ <key>ru</key> - <value>Группа предупреждение</value> + <value>Предупреждение</value> - - ru - Группа предупреждение - 2 ГруппаПредупреждениеРасширеннаяПодсказка diff --git a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Module.bsl b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Module.bsl index 8b11a3bce..6a7144426 100644 --- a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Module.bsl +++ b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Module.bsl @@ -142,7 +142,8 @@ | ПсевдонимЗаданнойТаблицы.Предопределенный"; ОписанияСохраненных = Новый Массив; - Для каждого Коллекция Из КоллекцииМетаданных Цикл + Для Каждого Коллекция Из КоллекцииМетаданных Цикл + ЭтоПланСчетов = (Коллекция = Метаданные.ПланыСчетов); Для Каждого ОбъектМетаданных Из Коллекция Цикл Если ОбъектМетаданных.ОбновлениеПредопределенныхДанных = Метаданные.СвойстваОбъектов.ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически Тогда @@ -163,29 +164,33 @@ ТаблицаИмен.Индексы.Добавить("Имя"); Имена = ОбъектМетаданных.ПолучитьИменаПредопределенных(); СохранитьСуществующиеПредопределенныеОбъектыПередСозданиемНедостающих( - ОбъектМетаданных, ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных); + ОбъектМетаданных, ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных, ЭтоПланСчетов); КонецЦикла; КонецЦикла; ИнициализироватьПредопределенныеДанные(); // Восстановление предопределенных элементов, существовавших до инициализации. - Для каждого ОписаниеСохраненных Из ОписанияСохраненных Цикл + Для Каждого ОписаниеСохраненных Из ОписанияСохраненных Цикл Запрос.Текст = ОписаниеСохраненных.ТекстЗапроса; ТаблицаИмен = Запрос.Выполнить().Выгрузить(); ТаблицаИмен.Индексы.Добавить("Имя"); - Для каждого ОписаниеСохраненного Из ОписаниеСохраненных.ТаблицаИмен Цикл + Для Каждого ОписаниеСохраненного Из ОписаниеСохраненных.ТаблицаИмен Цикл Если Не ОписаниеСохраненного.ОбъектСуществует Тогда Продолжить; КонецЕсли; Строка = ТаблицаИмен.Найти(ОписаниеСохраненного.Имя, "Имя"); Если Строка <> Неопределено Тогда - ОбновлениеИнформационнойБазы.УдалитьДанные(Строка.Ссылка.ПолучитьОбъект()); + НовыйОбъект = Строка.Ссылка.ПолучитьОбъект(); + Если ОписаниеСохраненных.ЭтоПланСчетов Тогда + ДополнитьНовыеВидыСубконтоСчета(ОписаниеСохраненного.Объект, НовыйОбъект); + КонецЕсли; + ОбновлениеИнформационнойБазы.УдалитьДанные(НовыйОбъект); Строка.Имя = ""; КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОписаниеСохраненного.Объект); КонецЦикла; - Для каждого Строка Из ТаблицаИмен Цикл + Для Каждого Строка Из ТаблицаИмен Цикл Если Не ЗначениеЗаполнено(Строка.Имя) Или Не ЗначениеЗаполнено(Строка.ИмяРодителя) Тогда Продолжить; @@ -201,9 +206,39 @@ КонецПроцедуры +&НаСервереБезКонтекста +Процедура ДополнитьНовыеВидыСубконтоСчета(Счет, ОбразецСчета) + + Для Каждого Строка Из ОбразецСчета.ВидыСубконто Цикл + Индекс = ОбразецСчета.ВидыСубконто.Индекс(Строка); + Если Счет.ВидыСубконто.Количество() > Индекс Тогда + Если Счет.ВидыСубконто[Индекс].ВидСубконто <> Строка.ВидСубконто Тогда + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Обмен данными.Отключение связи с главным узлом'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Счет.Метаданные(), + Счет, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У счета ""%1"" субконто №%2 ""%3"" не совпадает с предопределенным субконто ""%4"".'"), + Строка(Счет), + Индекс + 1, + Строка(Счет.ВидыСубконто[Индекс].ВидСубконто), + Строка(Строка.ВидСубконто)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + ИначеЕсли Не Счет.ВидыСубконто[Индекс].Предопределенное Тогда + Счет.ВидыСубконто[Индекс].Предопределенное = Истина; + КонецЕсли; + Иначе + ЗаполнитьЗначенияСвойств(Счет.ВидыСубконто.Добавить(), Строка); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + &НаСервереБезКонтекста Процедура СохранитьСуществующиеПредопределенныеОбъектыПередСозданиемНедостающих( - ОбъектМетаданных, ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных) + ОбъектМетаданных, ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных, ЭтоПланСчетов) ТребуетсяИнициализация = Ложь; ПредопределенныеСуществуют = Ложь; @@ -227,8 +262,9 @@ Если ПредопределенныеСуществуют Тогда ОписаниеСохраненных = Новый Структура; - ОписаниеСохраненных.Вставить("ТекстЗапроса", Запрос.Текст); - ОписаниеСохраненных.Вставить("ТаблицаИмен", ТаблицаИмен); + ОписаниеСохраненных.Вставить("ТекстЗапроса", Запрос.Текст); + ОписаниеСохраненных.Вставить("ТаблицаИмен", ТаблицаИмен); + ОписаниеСохраненных.Вставить("ЭтоПланСчетов", ЭтоПланСчетов); ОписанияСохраненных.Добавить(ОписаниеСохраненных); ТаблицаИмен.Колонки.Добавить("Объект"); @@ -236,7 +272,21 @@ Если Строка.ОбъектСуществует Тогда Объект = Строка.Ссылка.ПолучитьОбъект(); Объект.ИмяПредопределенныхДанных = ""; + Если ЭтоПланСчетов Тогда + СтрокиПредопределенныхВидовСубконто = Новый Массив; + Для Каждого СтрокаВидаСубконто Из Объект.ВидыСубконто Цикл + Если СтрокаВидаСубконто.Предопределенное Тогда + СтрокаВидаСубконто.Предопределенное = Ложь; + СтрокиПредопределенныхВидовСубконто.Добавить(СтрокаВидаСубконто); + КонецЕсли; + КонецЦикла; + КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + Если ЭтоПланСчетов Тогда + Для Каждого СтрокаВидаСубконто Из СтрокиПредопределенныхВидовСубконто Цикл + СтрокаВидаСубконто.Предопределенное = Истина; + КонецЦикла; + КонецЕсли; Объект.ИмяПредопределенныхДанных = Строка.Имя; Строка.Объект = Объект; КонецЕсли; diff --git a/SSL/src/CommonForms/ВходВОбластьДанных/Form.form b/SSL/src/CommonForms/ВходВОбластьДанных/Form.form index d803ca843..75848a7c6 100644 --- a/SSL/src/CommonForms/ВходВОбластьДанных/Form.form +++ b/SSL/src/CommonForms/ВходВОбластьДанных/Form.form @@ -104,12 +104,8 @@ <key>ru</key> - <value>Группа вход в область</value> + <value>Вход в область</value> - - ru - Группа вход в область - ГруппаВходВОбластьExtendedTooltip 7 diff --git a/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl b/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl index 9108ba4ba..9e4b5bf45 100644 --- a/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl +++ b/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl @@ -101,7 +101,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПередНачаломРаботыСистемы(Результат, Неопределен) Экспорт +Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПередНачаломРаботыСистемы(Результат, Контекст) Экспорт Если Результат.Отказ Тогда ВыйтиИзОбластиДанныхНаСервере(); @@ -121,7 +121,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПриНачалеРаботыСистемы(Результат, Неопределен) Экспорт +Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПриНачалеРаботыСистемы(Результат, Контекст) Экспорт Если Результат.Отказ Тогда ВыйтиИзОбластиДанныхНаСервере(); @@ -203,7 +203,7 @@ УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); НачатьТранзакцию(); @@ -248,7 +248,7 @@ СтандартныеПодсистемыСервер.УстановитьПустуюФормуНаПустойРабочийСтол(); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецПроцедуры @@ -256,7 +256,7 @@ Функция ОсуществленВходВОбластьДанных() УстановитьПривилегированныйРежим(Истина); - ОсуществленВход = ОбщегоНазначения.ИспользованиеРазделителяСеанса(); + ОсуществленВход = РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса(); // Подготовка к закрытию форм разделенного рабочего стола. Если ОсуществленВход Тогда diff --git a/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form b/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form index 7c7356fc0..13e2add64 100644 --- a/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form +++ b/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form @@ -82,12 +82,8 @@ <key>ru</key> - <value>Группа предупреждение</value> + <value>Предупреждение</value> - - ru - Группа предупреждение - ГруппаПредупреждениеРасширеннаяПодсказка 10 diff --git a/SSL/src/CommonForms/ВыборДаты/Form.form b/SSL/src/CommonForms/ВыборДаты/Form.form index 5cc7c87c8..672e64e7c 100644 --- a/SSL/src/CommonForms/ВыборДаты/Form.form +++ b/SSL/src/CommonForms/ВыборДаты/Form.form @@ -24,7 +24,6 @@ true Label - true true Style.ПоясняющийТекст diff --git a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form index 7dd9b0bdc..b6ab58fdc 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form @@ -87,10 +87,6 @@ ru Сообщение для пользователя - - ru - Сообщение для пользователя - СообщениеДляПользователяExtendedTooltip 42 @@ -230,10 +226,6 @@ ru Файл и кнопка - - ru - Файл и кнопка - ФайлИКнопкаExtendedTooltip 47 @@ -262,10 +254,6 @@ ru Описание файла в рабочем каталоге - - ru - Описание файла в рабочем каталоге - ОписаниеФайлаВРабочемКаталогеExtendedTooltip 45 @@ -539,10 +527,6 @@ ru Свойства файлов - - ru - Свойства файлов - СвойстваФайловExtendedTooltip 50 diff --git a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl index c1c1d6f7c..9fea9c249 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl @@ -71,7 +71,7 @@ &НаКлиенте Процедура ОткрытьКаталог(Команда) - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайлаВРабочемКаталоге); + РаботаСФайламиСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайлаВРабочемКаталоге); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form index b48ad7a2f..a44085342 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form @@ -18,10 +18,6 @@ ru Командная панель пользователи - - ru - Командная панель пользователи - КоманднаяПанельПользователиExtendedTooltip 58 @@ -41,6 +37,10 @@ СписокПользователи 1 + + <key>ru</key> + <value>Список пользователи</value> + true true @@ -220,9 +220,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -244,10 +241,6 @@ ru Пользователи - - ru - Пользователи - ПользователиExtendedTooltip 57 @@ -271,6 +264,10 @@ СписокРоли 26 + + <key>ru</key> + <value>Список роли</value> + true true @@ -443,9 +440,6 @@ СписокРоли.DefaultPicture - None - None - None true 60 @@ -510,10 +504,6 @@ ru Роли исполнителей - - ru - Роли - РолиExtendedTooltip 61 @@ -540,10 +530,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 56 diff --git a/SSL/src/CommonForms/ВыборКонтакта/Form.form b/SSL/src/CommonForms/ВыборКонтакта/Form.form index b6d770f26..4f8abf6dc 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Form.form +++ b/SSL/src/CommonForms/ВыборКонтакта/Form.form @@ -133,12 +133,8 @@ <key>ru</key> - <value>Группа строка поиска</value> + <value>Строка поиска</value> - - ru - Группа строка поиска - ГруппаСтрокаПоискаExtendedTooltip 108 @@ -161,6 +157,10 @@ НайденныеКонтакты 20 + + <key>ru</key> + <value>Найденные контакты</value> + true true @@ -397,9 +397,6 @@ Auto true true - None - None - None true @@ -412,10 +409,6 @@ ru Поиск контактов - - ru - Страница поиск контактов - СтраницаПоискКонтактовExtendedTooltip 107 @@ -439,6 +432,10 @@ КонтактыПоПредмету 71 + + <key>ru</key> + <value>Контакты по предмету</value> + true true @@ -628,9 +625,6 @@ Auto true true - None - None - None true @@ -643,10 +637,6 @@ ru Контакты по предмету - - ru - Страница все контакты по предмету - СтраницаВсеКонтактыПоПредметуExtendedTooltip 119 @@ -670,6 +660,10 @@ ГруппыПользователей 100 + + <key>ru</key> + <value>Группы пользователей</value> + true true @@ -854,9 +848,6 @@ CommonPicture.СостоянияПользователей - None - None - None true 60 @@ -871,6 +862,10 @@ СписокПользователей 84 + + <key>ru</key> + <value>Список пользователей</value> + true true @@ -938,7 +933,7 @@ Selection - СписокСправочникаВыбор + Подключаемый_СписокСправочникаВыбор OnActivateRow @@ -1050,9 +1045,6 @@ СписокПользователей.DefaultPicture - None - None - None true 60 @@ -1099,10 +1091,6 @@ ru Страницы списки - - ru - Страницы списки - СтраницыСпискиExtendedTooltip 106 diff --git a/SSL/src/CommonForms/ВыборКонтакта/Module.bsl b/SSL/src/CommonForms/ВыборКонтакта/Module.bsl index 067d333e5..0d15b2f16 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Module.bsl +++ b/SSL/src/CommonForms/ВыборКонтакта/Module.bsl @@ -16,7 +16,7 @@ Взаимодействия.ЗаполнитьКонтактыПоПредмету(Элементы, Параметры.Предмет, КонтактыПоПредмету, Ложь); // Заполним список вариантов поиска и осуществим первый поиск. - ВсеСпискиПоиска = Взаимодействия.ПолучитьСписокДоступныхПоисков(ППДВключен, Параметры, Элементы, Ложь); + ВсеСпискиПоиска = Взаимодействия.СписокДоступныхПоисков(ППДВключен, Параметры, Элементы, Ложь); ВыполнитьПервыйПоиск(); // Если заполнен контакт, установим нужной текущую страницу и спозиционируемся на нем. @@ -46,7 +46,7 @@ КонецПроцедуры &НаКлиенте -Процедура СписокСправочникаВыбор(Элемент, ВыбраннаяСтрока,Поле , СтандартнаяОбработка) +Процедура Подключаемый_СписокСправочникаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; @@ -129,7 +129,7 @@ Процедура КомандаНайтиВыполнить() Если ПустаяСтрока(СтрокаПоиска) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Не задана строка поиска!'")); + ПоказатьПредупреждение(, НСтр("ru = 'Не задана строка поиска.'")); Возврат; КонецЕсли; @@ -364,7 +364,7 @@ &НаСервере Функция НайтиПоНачалуНаименования() - ТаблицаКонтактов = Взаимодействия.ПолучитьВсеКонтактыПоНачалуНаименования(СтрокаПоиска); + ТаблицаКонтактов = Взаимодействия.ВсеКонтактыПоНачалуНаименования(СтрокаПоиска); Если ТаблицаКонтактов = Неопределено ИЛИ ТаблицаКонтактов.Количество() = 0 Тогда Возврат Ложь; diff --git a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form index 5cc5b22c7..ee176340e 100644 --- a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form +++ b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form @@ -3,6 +3,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -215,6 +219,10 @@ true + + <key>ru</key> + <value>Список контекстное меню группа 1</value> + СписокКонтекстноеМенюГруппа1ExtendedTooltip 16 @@ -331,9 +339,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true None diff --git a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl index 415bcd345..3fc32fc29 100644 --- a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl @@ -15,7 +15,7 @@ Если Параметры.ПараметрыВнешнегоСоединения.ТипСоединения = "ВнешнееСоединение" Тогда - Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(Параметры.ПараметрыВнешнегоСоединения); + Подключение = ОбменДаннымиСервер.ВнешнееСоединениеСБазой(Параметры.ПараметрыВнешнегоСоединения); СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; ВнешнееСоединение = Подключение.Соединение; diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form index 915729a43..38c244a9c 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form @@ -3,6 +3,10 @@ ДеревоОбъектовМетаданных 1 + + <key>ru</key> + <value>Дерево объектов метаданных</value> + true true @@ -298,9 +302,6 @@ ExpandTopLevel true true - None - None - None true Bottom @@ -399,6 +400,7 @@ OnCreateAtServer ПриСозданииНаСервере + CustomizeForm LockOwner true true diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl index 0f61cb7e7..9b34849fe 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -64,6 +64,11 @@ КонецЕсли; Параметры.Свойство("НачальноеЗначениеВыбора", НачальноеЗначениеВыбора); + Если Не ЗначениеЗаполнено(НачальноеЗначениеВыбора) + И ВыборЕдинственного + И Параметры.ВыбранныеОбъектыМетаданных.Количество() = 1 Тогда + НачальноеЗначениеВыбора = Параметры.ВыбранныеОбъектыМетаданных[0].Значение; + КонецЕсли; ДеревоОбъектовМетаданныхЗаполнить(); @@ -133,7 +138,7 @@ И ТекДанные.ЭтоОбъектМетаданных Тогда ВыбранныеОбъектыМетаданных.Очистить(); - ВыбранныеОбъектыМетаданных.Добавить(ТекДанные.ПолноеИмя); + ВыбранныеОбъектыМетаданных.Добавить(ТекДанные.ПолноеИмя, ТекДанные.Представление); Иначе @@ -147,9 +152,10 @@ ПолучениеДанных(); КонецЕсли; - Оповестить("ВыборОбъектовМетаданных", ВыбранныеОбъектыМетаданных, Параметры.УникальныйИдентификаторИсточник); - - Закрыть(); + Если ЭтотОбъект.ОписаниеОповещенияОЗакрытии = Неопределено Тогда + Оповестить("ВыборОбъектовМетаданных", ВыбранныеОбъектыМетаданных, Параметры.УникальныйИдентификаторИсточник); + КонецЕсли; + Закрыть(ВыбранныеОбъектыМетаданных); КонецПроцедуры @@ -609,7 +615,7 @@ Для Каждого Элемент Из КоллекцияЭлементов Цикл Если Элемент.Пометка = 1 И Не ПустаяСтрока(Элемент.ПолноеИмя) Тогда - ВыбранныеОбъектыМетаданных.Добавить(Элемент.ПолноеИмя); + ВыбранныеОбъектыМетаданных.Добавить(Элемент.ПолноеИмя, Элемент.Представление); КонецЕсли; ПолучениеДанных(Элемент); КонецЦикла; diff --git a/SSL/src/CommonForms/ВыборПолучателейСообщения/Form.form b/SSL/src/CommonForms/ВыборПолучателейСообщения/Form.form deleted file mode 100644 index d6e88cb90..000000000 --- a/SSL/src/CommonForms/ВыборПолучателейСообщения/Form.form +++ /dev/null @@ -1,890 +0,0 @@ - - - - <key>ru</key> - <value>Получатели сообщения</value> - - - ПолучателиСообщения - 1 - true - true - - true - - - ПолучателиСообщения - - None - Add - CancelSearch - Change - Copy - Delete - EndEdit - Find - MoveDown - MoveUp - ShowRowRearrangement - SortListAsc - SortListDesc - - ПолучателиСообщенияВыбран - 14 - true - true - - true - - - ПолучателиСообщения.Выбран - - None - - ПолучателиСообщенияВыбранРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - - ПолучателиСообщенияВыбранКонтекстноеМеню - 15 - true - - CheckBoxField - Auto - true - - CommonPicture.ЭлектронноеПисьмо - - Left - true - - - - ГруппаПолучатели - 26 - - ГруппаПредставлениеПолучателей - 28 - - ПолучателиСообщенияПредставление - 17 - true - true - - true - - - ПолучателиСообщения.Представление - - - ПолучателиСообщенияПредставлениеРасширеннаяПодсказка - 19 - Label - true - true - - Left - - - - ПолучателиСообщенияПредставлениеКонтекстноеМеню - 18 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПолучателиСообщенияПредставлениеАдреса - 20 - - <key>ru</key> - <value>E-mail</value> - - true - true - - true - - - ПолучателиСообщения.ПредставлениеАдреса - - - ПолучателиСообщенияПредставлениеАдресаРасширеннаяПодсказка - 22 - Label - true - true - - Left - - - - ПолучателиСообщенияПредставлениеАдресаКонтекстноеМеню - 21 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа представление получателей</value> - - - ru - Группа представление получателей - - - ГруппаПредставлениеПолучателейРасширеннаяПодсказка - 29 - Label - true - true - - Left - - - ColumnGroup - - auto - true - - - - ГруппаПояснение - 34 - - ПолучателиСообщенияПояснение - 23 - true - true - - true - - - ПолучателиСообщения.Пояснение - - None - - ПолучателиСообщенияПояснениеРасширеннаяПодсказка - 25 - Label - true - true - - Left - - - - ПолучателиСообщенияПояснениеКонтекстноеМеню - 24 - true - - InputField - true - Auto - Left - - true - true - true - true - true - true - - Style.ПоясняющийТекст - - Normal - - - true - - true - - - <key>ru</key> - <value>Группа пояснение</value> - - - ru - Группа пояснение - - - ГруппаПояснениеРасширеннаяПодсказка - 35 - Label - true - true - - Left - - - ColumnGroup - - Vertical - true - - - true - true - - true - - - <key>ru</key> - <value>Группа получатели</value> - - - ru - Группа получатели - - - ГруппаПолучателиРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - ColumnGroup - - Vertical - auto - true - - - - ПолучателиСообщенияКоманднаяПанель - 3 - Left - - - Selection - ПолучателиСообщенияВыбор - - - BeforeAddRow - ПолучателиСообщенияПередНачаломДобавления - - - BeforeDeleteRow - ПолучателиСообщенияПередУдалением - - - ПолучателиСообщенияСтрокаПоиска - 5 - - ПолучателиСообщенияСтрокаПоискаРасширеннаяПодсказка - 7 - Label - true - true - - Left - - - - ПолучателиСообщенияСтрокаПоискаКонтекстноеМеню - 6 - true - - ПолучателиСообщения - - true - - - - ПолучателиСообщенияСостояниеПросмотра - 8 - - ПолучателиСообщенияСостояниеПросмотраРасширеннаяПодсказка - 10 - Label - true - true - - Left - - - - ПолучателиСообщенияСостояниеПросмотраКонтекстноеМеню - 9 - true - - ViewStatusAddition - ПолучателиСообщения - - true - - - - ПолучателиСообщенияУправлениеПоиском - 11 - - ПолучателиСообщенияУправлениеПоискомРасширеннаяПодсказка - 13 - Label - true - true - - Left - - - - ПолучателиСообщенияУправлениеПоискомКонтекстноеМеню - 12 - true - - SearchControlAddition - ПолучателиСообщения - - true - - - - ПолучателиСообщенияРасширеннаяПодсказка - 4 - Label - true - true - - Left - - - - ПолучателиСообщенияКонтекстноеМеню - 2 - - ПолучателиСообщенияКонтекстноеМенюГруппаВыбор - 42 - - ПолучателиСообщенияКонтекстноеМенюВыбратьВсехПолучателей - 36 - true - true - - true - - - ПолучателиСообщенияКонтекстноеМенюВыбратьВсехПолучателейРасширеннаяПодсказка - 37 - Label - true - true - - Left - - - Form.Command.ВыбратьВсехПолучателей - Normal - Auto - true - true - UserCmds - Auto - - - ПолучателиСообщенияКонтекстноеМенюОтменитьВыборДляВсех - 38 - 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 - Получатели сообщения контекстное меню группа выбор - - - ПолучателиСообщенияКонтекстноеМенюГруппаВыборРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - - - - ПолучателиСообщенияКонтекстноеМенюГруппаСтандартныеКоманды - 44 - - ПолучателиСообщенияКонтекстноеМенюКопировать - 46 - true - true - - true - - - ПолучателиСообщенияКонтекстноеМенюКопироватьРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - Form.Item.ПолучателиСообщения.StandardCommand.CopyToClipboard - Normal - Auto - true - true - UserCmds - Auto - - - ПолучателиСообщенияКонтекстноеМенюВывестиСписок - 40 - true - true - - true - - - ПолучателиСообщенияКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 41 - Label - true - true - - Left - - - Form.Item.ПолучателиСообщения.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Получатели сообщения контекстное меню группа стандартные команды</value> - - - ru - Получатели сообщения контекстное меню группа стандартные команды - - - ПолучателиСообщенияКонтекстноеМенюГруппаСтандартныеКомандыРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - - - true - - true - true - true - true - true - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - true - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - ФормаВыбрать - 30 - true - true - - true - - - ФормаВыбратьРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - Form.Command.Выбрать - Auto - true - true - true - UserCmds - Auto - - - ФормаОтмена - 32 - true - true - - true - - - ФормаОтменаРасширеннаяПодсказка - 33 - 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 - - ValueTable - - - true - - - true - - - Адрес - - <key>ru</key> - <value>E-mail</value> - - 1 - - String - - - - true - - - true - - - - Представление - - <key>ru</key> - <value>Получатель</value> - - 2 - - String - - - - true - - - true - - - - Выбран - - <key>ru</key> - <value>Выбран</value> - - 4 - - Boolean - - - true - - - true - - - - Пояснение - - <key>ru</key> - <value>Пояснение</value> - - 7 - - 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 - - - - Выбрать - - - DontUse - Auto - - - Отмена - - <key>ru</key> - <value>Отмена</value> - - 2 - - ru - Отмена - - - true - - - - Отмена - - - DontUse - Auto - - - ВыбратьВсехПолучателей - - <key>ru</key> - <value>Выбрать всех получателей</value> - - 3 - - ru - Выбрать всех получателей - - - true - - - StdPicture.CheckAll - - - - ВыбратьВсехПолучателей - - - DontUse - Auto - - - ОтменитьВыборДляВсех - - <key>ru</key> - <value>Отменить выбор для всех</value> - - 4 - - ru - Отменить выбор для всех - - - true - - - StdPicture.UncheckAll - - - - ОтменитьВыборДляВсех - - - DontUse - Auto - - - ПолучателиСообщения - - String - - - - - ПочтовыйАдресПолучателя - - String - - - - - - - - diff --git a/SSL/src/CommonForms/ВыборПолучателейСообщения/Module.bsl b/SSL/src/CommonForms/ВыборПолучателейСообщения/Module.bsl deleted file mode 100644 index 960e2387c..000000000 --- a/SSL/src/CommonForms/ВыборПолучателейСообщения/Module.bsl +++ /dev/null @@ -1,215 +0,0 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - УстановитьУсловноеОформление(); - - Если Параметры.Свойство("АвтоТест") Тогда - Возврат; - КонецЕсли; - - ПараметрыПолучателейСообщения = ПолучитьИзВременногоХранилища(Параметры.ПолучателиСообщения); - Если ТипЗнч(ПараметрыПолучателейСообщения) = Тип("Строка") Тогда - ЗаполнитьТаблицуПолучателейИзСтроки(ПараметрыПолучателейСообщения); - ИначеЕсли ТипЗнч(ПараметрыПолучателейСообщения) = Тип("СписокЗначений") Тогда - ЗаполнитьТаблицуПолучателейИзСпискаЗначений(ПараметрыПолучателейСообщения); - ИначеЕсли ТипЗнч(ПараметрыПолучателейСообщения) = Тип("Массив") Тогда - ЗаполнитьТаблицуПолучателейИзМассиваСтруктур(ПараметрыПолучателейСообщения); - КонецЕсли; - - ОтметитьВыбранныхПолучателей(Параметры.ПочтовыйАдресПолучателя); - - УстановитьВидимостьРеквизитовТабличнойЧасти(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыПолучатели - -&НаКлиенте -Процедура ПолучателиСообщенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) - - Отказ = Истина; - -КонецПроцедуры - -&НаКлиенте -Процедура ПолучателиСообщенияПередУдалением(Элемент, Отказ) - - Отказ = Истина; - -КонецПроцедуры - -&НаКлиенте -Процедура ПолучателиСообщенияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - Элемент.ТекущиеДанные.Выбран = НЕ Элемент.ТекущиеДанные.Выбран; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Выбрать(Команда) - - Результат = СформироватьПочтовыйАдресПолучателя(); - ОповеститьОВыборе(Результат); - -КонецПроцедуры - -&НаКлиенте -Процедура Отмена(Команда) - - Закрыть(Неопределено); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыбратьВсехПолучателей(Команда) - - УстановитьВыборДляВсехПолучателей(Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ОтменитьВыборДляВсех(Команда) - - УстановитьВыборДляВсехПолучателей(Ложь); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Функция СформироватьПочтовыйАдресПолучателя() - - Для Каждого Получатель Из ПолучателиСообщения Цикл - Если Получатель.Выбран Тогда - ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя + Получатель.Представление + " <" + СокрЛП(Получатель.Адрес) + ">; "; - КонецЕсли; - КонецЦикла; - - Возврат Новый Структура("ПочтовыйАдресПолучателя", СокрЛП(ПочтовыйАдресПолучателя)); - -КонецФункции - -&НаКлиенте -Функция УстановитьВыборДляВсехПолучателей(Выбор) - - Для Каждого Получатель Из ПолучателиСообщения Цикл - Получатель.Выбран = Выбор; - КонецЦикла; - -КонецФункции - -&НаСервере -Процедура ЗаполнитьТаблицуПолучателейИзМассиваСтруктур(ПараметрыПолучателейСообщения) - - Для Каждого ПараметрыПолучателя Из ПараметрыПолучателейСообщения Цикл - Получатель = ПолучателиСообщения.Добавить(); - ЗаполнитьЗначенияСвойств(Получатель, ПараметрыПолучателя); - Получатель.Выбран = Ложь; - Получатель.ПредставлениеАдреса = Получатель.Адрес; - Если ПараметрыПолучателя.Свойство("ВидПочтовогоАдреса") И НЕ ПустаяСтрока(ПараметрыПолучателя.ВидПочтовогоАдреса) Тогда - Получатель.ПредставлениеАдреса = Получатель.ПредставлениеАдреса + " (" + ПараметрыПолучателя.ВидПочтовогоАдреса + ")"; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьТаблицуПолучателейИзСпискаЗначений(ПараметрыПолучателейСообщения) - - Для Каждого ПараметрыПолучателя Из ПараметрыПолучателейСообщения Цикл - Получатель = ПолучателиСообщения.Добавить(); - Получатель.Адрес = ПараметрыПолучателя.Значение; - Получатель.Представление = ПараметрыПолучателя.Представление; - Получатель.ПредставлениеАдреса = Получатель.Адрес; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьТаблицуПолучателейИзСтроки(Знач ПараметрыПолучателейСообщения) - - ПараметрыПолучателейСообщения = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(ПараметрыПолучателейСообщения); - - Для Каждого ПараметрыПолучателя Из ПараметрыПолучателейСообщения Цикл - Получатель = ПолучателиСообщения.Добавить(); - Получатель.Адрес = ПараметрыПолучателя.Адрес; - Получатель.Представление = ПараметрыПолучателя.Псевдоним; - Получатель.ПредставлениеАдреса = Получатель.Адрес; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ОтметитьВыбранныхПолучателей(ПочтовыеАдресаПолучателей) - - ПараметрыПолучателей = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(ПочтовыеАдресаПолучателей); - ПочтовыйАдресПолучателя = ""; - Отбор = Новый Структура("Адрес", ""); - Для Каждого ПараметрыПолучателя Из ПараметрыПолучателей Цикл - Если НЕ ЗначениеЗаполнено(ПараметрыПолучателя.Адрес) Тогда - Продолжить; - КонецЕсли; - - Отбор.Адрес = ПараметрыПолучателя.Адрес; - НайденныеСтроки = ПолучателиСообщения.НайтиСтроки(Отбор); - Если НайденныеСтроки.Количество() > 0 Тогда - НайденныеСтроки[0].Выбран = Истина; - - Иначе - ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя + ПараметрыПолучателя.Адрес + "; "; - - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьВидимостьРеквизитовТабличнойЧасти() - - ВидимостьПояснения = Ложь; - - Для Каждого СтрокаТаблицы Из ПолучателиСообщения Цикл - Если ЗначениеЗаполнено(СтрокаТаблицы.Пояснение) Тогда - ВидимостьПояснения = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если ВидимостьПояснения Тогда - Элементы.ГруппаПояснение.Видимость = Истина; - Элементы.ПолучателиСообщения.Шапка = Истина; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолучателиСообщенияПояснение.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолучателиСообщения.Пояснение"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; - - Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - -КонецПроцедуры - -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form index d80c9fe63..c64ac3bc2 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form @@ -113,10 +113,6 @@ ru Путь к архиву с файлами начального образа - - ru - Группа путь файловой базы - ГруппаПутьФайловойБазыExtendedTooltip 8 diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl index e0bdb554d..8f7fa1064 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - Если СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда Элементы.ПутьКАрхивуWindows.Заголовок = НСтр("ru = 'Для сервера 1С:Предприятия под управлением Microsoft Windows'"); Иначе Элементы.ПутьКАрхивуWindows.КнопкаВыбора = Ложь; @@ -25,8 +25,8 @@ СтандартнаяОбработка = Ложь; - Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Если Не РаботаСФайламиСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); Возврат; КонецЕсли; @@ -63,7 +63,7 @@ Возврат; КонецЕсли; - Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + Если Не ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда Если Не ПустаяСтрока(ПутьКАрхивуWindows) И (Лев(ПутьКАрхивуWindows, 2) <> "\\" ИЛИ СтрНайти(ПутьКАрхивуWindows, ":") <> 0) Тогда ТекстОшибки = НСтр("ru = 'Путь к архиву с файлами начального образа @@ -74,18 +74,11 @@ КонецЕсли; - Состояние( - НСтр("ru = 'Обмен данными'"), - , - НСтр("ru = 'Осуществляется размещение файлов из - |архива с файлами начального образа...'"), - БиблиотекаКартинок.СоздатьНачальныйОбраз); - ДобавитьФайлыВТома(); ТекстОповещения = НСтр("ru = 'Размещение файлов из архива с файлами - |начального образа успешно завершено.'"); - ПоказатьОповещениеПользователя(ТекстОповещения); + |начального образа успешно завершено.'"); + ПоказатьОповещениеПользователя(НСтр("ru = 'Размещение файлов'"),, ТекстОповещения); КонецПроцедуры @@ -96,7 +89,7 @@ &НаСервере Процедура ДобавитьФайлыВТома() - ФайловыеФункцииСлужебный.ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux); + РаботаСФайламиСлужебный.ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form index 9ffde51dd..b633b7e98 100644 --- a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form +++ b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form @@ -44,6 +44,9 @@ true true + false + true + ShowInInputField false true true @@ -176,7 +179,7 @@ <key>ru</key> - <value>Группа отступ</value> + <value>Отступ</value> ГруппаОтступРасширеннаяПодсказка diff --git a/SSL/src/CommonForms/ВыборТиповПользователей/Form.form b/SSL/src/CommonForms/ВыборТиповПользователей/Form.form index 835879879..aff7cc627 100644 --- a/SSL/src/CommonForms/ВыборТиповПользователей/Form.form +++ b/SSL/src/CommonForms/ВыборТиповПользователей/Form.form @@ -3,6 +3,10 @@ Назначение 47 + + <key>ru</key> + <value>Назначение</value> + true true diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form index 87c27ee0d..9235fed3b 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form @@ -7,6 +7,10 @@ УзлыПлановОбмена 14 + + <key>ru</key> + <value>Узлы планов обмена</value> + true true @@ -225,9 +229,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form index 08f9c7a48..c5a97fe49 100644 --- a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form +++ b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form @@ -6,6 +6,10 @@ ВыбранныеФорматы 32 + + <key>ru</key> + <value>Выбранные форматы</value> + true true @@ -214,9 +218,6 @@ ВыбранныеФорматыСохранения.Picture - None - None - None true true @@ -228,10 +229,6 @@ ru Формат вложений - - ru - Группа выбор форматов - ГруппаВыборФорматовExtendedTooltip 44 @@ -294,6 +291,45 @@ true + + ПереводитьИменаФайловВТранслит + 59 + true + true + + true + + + ПереводитьИменаФайловВТранслит + + Right + + ru + Сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Документ.txt" будет сохранен с именем "Document.txt". + + Button + + ПереводитьИменаФайловВТранслитРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ПереводитьИменаФайловВТранслитКонтекстноеМеню + 60 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -303,10 +339,6 @@ ru В форматах - - ru - Группа дополнительные параметры - ГруппаДополнительныеПараметрыExtendedTooltip 48 @@ -467,6 +499,26 @@ УпаковатьВАрхив + + ПереводитьИменаФайловВТранслит + + <key>ru</key> + <value>Транслитерировать имена файлов</value> + + 1 + + Boolean + + + true + + + true + + + ПереводитьИменаФайловВТранслит + + Выбрать diff --git a/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl b/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl index cf92da0c5..e2d788de7 100644 --- a/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl +++ b/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl @@ -12,10 +12,11 @@ Если Параметры.НастройкиФормата <> Неопределено Тогда ПереданныйМассивФорматов = Параметры.НастройкиФормата.ФорматыСохранения; УпаковатьВАрхив = Параметры.НастройкиФормата.УпаковатьВАрхив; + ПереводитьИменаФайловВТранслит = Параметры.НастройкиФормата.ПереводитьИменаФайловВТранслит; КонецЕсли; // заполнение списка форматов - Для Каждого ФорматСохранения Из УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента() Цикл + Для Каждого ФорматСохранения Из СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента() Цикл Пометка = Ложь; Если Параметры.НастройкиФормата <> Неопределено Тогда ПереданныйФормат = ПереданныйМассивФорматов.Найти(ФорматСохранения.ТипФайлаТабличногоДокумента); @@ -30,9 +31,16 @@ &НаСервере Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки) - Если Параметры.НастройкиФормата <> Неопределено И Параметры.НастройкиФормата.ФорматыСохранения.Количество() > 0 Тогда - Настройки.Удалить("ВыбранныеФорматыСохранения"); - Настройки.Удалить("УпаковатьВАрхив"); + Если Параметры.НастройкиФормата <> Неопределено Тогда + Если Параметры.НастройкиФормата.ФорматыСохранения.Количество() > 0 Тогда + Настройки.Удалить("ВыбранныеФорматыСохранения"); + КонецЕсли; + Если Параметры.НастройкиФормата.Свойство("УпаковатьВАрхив") Тогда + Настройки.Удалить("УпаковатьВАрхив"); + КонецЕсли; + Если Параметры.НастройкиФормата.Свойство("ПереводитьИменаФайловВТранслит") Тогда + Настройки.Удалить("ПереводитьИменаФайловВТранслит"); + КонецЕсли; Возврат; КонецЕсли; @@ -95,6 +103,7 @@ Результат = Новый Структура; Результат.Вставить("УпаковатьВАрхив", УпаковатьВАрхив); Результат.Вставить("ФорматыСохранения", ФорматыСохранения); + Результат.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); Возврат Результат; diff --git a/SSL/src/CommonForms/ГруппыПользователей/Form.form b/SSL/src/CommonForms/ГруппыПользователей/Form.form index 636c6e9e8..11711fa0d 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Form.form +++ b/SSL/src/CommonForms/ГруппыПользователей/Form.form @@ -119,6 +119,10 @@ <items xsi:type="form:Table"> <name>ДеревоГрупп</name> <id>1</id> + <title> + <key>ru</key> + <value>Дерево групп</value> + true true @@ -277,12 +281,8 @@ <key>ru</key> - <value>Группа пометка картинка</value> + <value>Пометка картинка</value> - - ru - Группа пометка картинка - ГруппаПометкаКартинкаExtendedTooltip 36 @@ -417,9 +417,6 @@ true true true - None - None - None true true diff --git a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl index 345c40ae0..4a8ef4d9e 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl +++ b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl @@ -66,7 +66,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ФормаЗаписатьИЗакрыть.Доступность = Ложь; Элементы.ФормаИсключитьИзВсехГрупп.Доступность = Ложь; Элементы.ДеревоГрупп.ТолькоПросмотр = Истина; diff --git a/SSL/src/CommonForms/ДлительнаяОперация/Form.form b/SSL/src/CommonForms/ДлительнаяОперация/Form.form index 12306a08e..a049510c6 100644 --- a/SSL/src/CommonForms/ДлительнаяОперация/Form.form +++ b/SSL/src/CommonForms/ДлительнаяОперация/Form.form @@ -83,10 +83,6 @@ ru Картинка и надпись - - ru - Картинка и надпись - КартинкаИНадписьРасширеннаяПодсказка 15 diff --git a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form index a855ec0e3..99f7ff320 100644 --- a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form +++ b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form @@ -54,7 +54,7 @@ <key>ru</key> - <value>Группа представление данных</value> + <value>Представление данных</value> ГруппаПредставлениеДанныхРасширеннаяПодсказка @@ -80,6 +80,10 @@ Подписи 1 + + <key>ru</key> + <value>Подписи</value> + true true @@ -339,9 +343,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl index a8043a4b1..4388c650c 100644 --- a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl +++ b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl @@ -168,7 +168,7 @@ Ошибка = Новый Структура("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'") + Символы.ПС + Результат.ОписаниеОшибки); - + ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Не удалось добавить электронную подпись из файла'"), "", Ошибка, Новый Структура); Возврат; diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form index 16dec7c18..432263dd1 100644 --- a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form @@ -9,6 +9,10 @@ ТаблицаКоманд 15 + + <key>ru</key> + <value>Таблица команд</value> + true true @@ -187,9 +191,6 @@ true true true - None - None - None true @@ -202,10 +203,6 @@ ru Страница открыть обработку - - ru - Страница открыть обработку - СтраницаОткрытьОбработкуExtendedTooltip 55 @@ -308,10 +305,6 @@ ru Страница выполнения обработки - - ru - Страница выполнения обработки - true СтраницаВыполненияОбработкиExtendedTooltip @@ -339,10 +332,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 54 @@ -456,10 +445,6 @@ ru Командная панель страницы открыть обработку - - ru - Командная панель страницы открыть обработку - КоманднаяПанельСтраницыОткрытьОбработкуExtendedTooltip 64 @@ -484,10 +469,6 @@ ru Подвал - - ru - Подвал - ПодвалРасширеннаяПодсказка 80 diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl index 7fc804e46..adf228a11 100644 --- a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl @@ -32,9 +32,6 @@ ИначеЕсли ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда ЭтоНазначаемыеОбработки = Истина; Заголовок = НСтр("ru = 'Команды создания связанных объектов'"); - ИначеЕсли ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ШаблонСообщения Тогда - ЭтоНазначаемыеОбработки = Истина; - Заголовок = НСтр("ru = 'Шаблоны сообщений'"); ИначеЕсли ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда ЭтоГлобальныеОбработки = Истина; Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -114,17 +111,9 @@ &НаКлиенте Процедура НастроитьСписок(Команда) - Открытие = Новый Структура("Имя, Параметры, Владелец, Уникальность, Окно"); - - Открытие.Имя = "ОбщаяФорма.НастройкаМоихОтчетовИОбработок"; - Открытие.Владелец = ЭтотОбъект; - Открытие.Уникальность = Ложь; - - Открытие.Параметры = Новый Структура("ВидОбработок, СсылкаРаздела"); - Открытие.Параметры.ВидОбработок = ВидОбработок; - Открытие.Параметры.СсылкаРаздела = СсылкаРаздела; - - ОткрытьФорму(Открытие.Имя, Открытие.Параметры, Открытие.Владелец, Открытие.Уникальность, Открытие.Окно); + ПараметрыФормы = Новый Структура("ВидОбработок, СсылкаРаздела"); + ЗаполнитьЗначенияСвойств(ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.НастройкаМоихОтчетовИОбработок", ПараметрыФормы, ЭтотОбъект, Ложь); КонецПроцедуры &НаКлиенте @@ -203,15 +192,15 @@ &НаКлиенте Процедура ВыполнитьСерверныйМетодОбработки() + Задание = ЗапуститьФоновоеЗадание(ВыполняемаяКоманда, УникальныйИдентификатор); НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ПолучатьРезультат = Истина; - - Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияФоновогоЗадания", ЭтотОбъект); + Обработчик = Новый ОписаниеОповещения("ВыполнитьСерверныйМетодОбработкиЗавершение", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); + КонецПроцедуры &НаСервереБезКонтекста @@ -232,7 +221,7 @@ КонецФункции &НаКлиенте -Процедура ПослеЗавершенияФоновогоЗадания(Задание, ДополнительныеПараметры) Экспорт +Процедура ВыполнитьСерверныйМетодОбработкиЗавершение(Задание, ДополнительныеПараметры) Экспорт Если Задание.Статус = "Выполнено" Тогда // Показ всплывающего оповещения и закрытие этой формы. Если ВыполняемаяКоманда.ПоказыватьОповещение Тогда diff --git a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form index 83a32aa02..05ddb4d14 100644 --- a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form @@ -149,10 +149,6 @@ ru HTTP - - ru - Группа HTTP - ГруппаHTTPExtendedTooltip 34 @@ -276,10 +272,6 @@ ru HTTP - - ru - Группа HTTP - ГруппаHTTPSExtendedTooltip 37 @@ -435,10 +427,6 @@ ru Прокси серверы - - ru - Группа прокси серверы - ГруппаПроксиСерверыExtendedTooltip 33 @@ -468,6 +456,10 @@ АдресаИсключений 20 + + <key>ru</key> + <value>Адреса исключений</value> + true true @@ -630,9 +622,6 @@ true true true - None - None - None true @@ -682,10 +671,6 @@ ru Не использовать прокси-сервер для адресов - - ru - Группа адресов исключений - ГруппаАдресовИсключенийExtendedTooltip 43 diff --git a/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Form.form b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Form.form new file mode 100644 index 000000000..4419cb62a --- /dev/null +++ b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Form.form @@ -0,0 +1,1625 @@ + + + + <key>ru</key> + <value>Установка внешней компоненты</value> + + + Шапка + 90 + + Предупреждение32 + 95 + + <key>ru</key> + <value>Предупреждение32</value> + + true + true + + true + + + Предупреждение32РасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + Предупреждение32КонтекстноеМеню + 96 + true + + true + true + false + Bottom + + + CommonPicture.Предупреждение32 + + + + + ДекорацияПояснение + 92 + + <key>ru</key> + <value>Отсутствует компонента для используемого клиентского приложения. +Обратитесь к администратору.</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 93 + true + + Label + 75 + true + + Style.NormalTextFont + 100 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Шапка</value> + + + ШапкаРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + UsualGroup + + Center + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПоддерживаемыеКлиенты + 1 + + Подсказка + 3 + + ГруппаWindows + 5 + + ГруппаWindowsТонкийКлиент + 7 + + WindowsТонкийКлиент + 9 + + <key>ru</key> + <value>Тонкий клиент</value> + + true + true + + true + + + WindowsТонкийКлиентРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + WindowsТонкийКлиентКонтекстноеМеню + 10 + true + + Label + 10 + true + true + + Left + + + + Windows_x86 + 12 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Windows_x86 + + Right + + Windows_x86РасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + Windows_x86КонтекстноеМеню + 13 + true + + CheckBoxField + Auto + true + Left + true + + + + Windows_x86_64 + 15 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Windows_x86_64 + + Right + + Windows_x86_64РасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + Windows_x86_64КонтекстноеМеню + 16 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тонкий клиент</value> + + + ГруппаWindowsТонкийКлиентРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsChrome + 18 + + WindowsChrome + 20 + + <key>ru</key> + <value>Chrome</value> + + true + true + + true + + + WindowsChromeРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + WindowsChromeКонтекстноеМеню + 21 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_Chrome + 23 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Windows_x86_Chrome + + Right + + Windows_x86_ChromeРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + Windows_x86_ChromeКонтекстноеМеню + 24 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Сhrome</value> + + + ГруппаWindowsChromeРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsFirefox + 26 + + WindowsFirefox + 28 + + <key>ru</key> + <value>Firefox</value> + + true + true + + true + + + WindowsFirefoxРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + WindowsFirefoxКонтекстноеМеню + 29 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_Firefox + 31 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Windows_x86_Firefox + + Right + + Windows_x86_FirefoxРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + Windows_x86_FirefoxКонтекстноеМеню + 32 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Firefox</value> + + + ГруппаWindowsFirefoxРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаWindowsInternetExplorer + 34 + + WindowsInternetExplorer + 36 + + <key>ru</key> + <value>Internet Explorer</value> + + true + true + + true + + ShowBottom + + WindowsInternetExplorerРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + WindowsInternetExplorerКонтекстноеМеню + 37 + true + + Label + 10 + true + true + + Left + + + + Windows_x86_MSIE + 39 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Windows_x86_MSIE + + Right + + Windows_x86_MSIEРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + Windows_x86_MSIEКонтекстноеМеню + 40 + true + + CheckBoxField + Auto + true + Left + true + + + + Windows_x86_64_MSIE + 42 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Windows_x86_64_MSIE + + Right + + Windows_x86_64_MSIEРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + Windows_x86_64_MSIEКонтекстноеМеню + 43 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Internet explorer</value> + + ShowBottom + + ГруппаWindowsInternetExplorerРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Windows</value> + + true + + ГруппаWindowsРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ГруппаLinux + 45 + + ГруппаLinuxТонкийКлиент + 47 + + LinuxТонкийКлиент + 49 + + <key>ru</key> + <value>Тонкий клиент</value> + + true + true + + true + + + LinuxТонкийКлиентРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + LinuxТонкийКлиентКонтекстноеМеню + 50 + true + + Label + 9 + true + true + + Left + + + + Linux_x86 + 52 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Linux_x86 + + Right + + Linux_x86РасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + Linux_x86КонтекстноеМеню + 53 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64 + 55 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Linux_x86_64 + + Right + + Linux_x86_64РасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + Linux_x86_64КонтекстноеМеню + 56 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тонкий клиент</value> + + + ГруппаLinuxТонкийКлиентРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаLinuxChrome + 58 + + LinuxChrome + 60 + + <key>ru</key> + <value>Chrome</value> + + true + true + + true + + + LinuxChromeРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + LinuxChromeКонтекстноеМеню + 61 + true + + Label + 9 + true + true + + Left + + + + Linux_x86_Chrome + 63 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Linux_x86_Chrome + + Right + + Linux_x86_ChromeРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + Linux_x86_ChromeКонтекстноеМеню + 64 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64_Chrome + 66 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Linux_x86_64_Chrome + + Right + + Linux_x86_64_ChromeРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + Linux_x86_64_ChromeКонтекстноеМеню + 67 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Сhrome</value> + + + ГруппаLinuxChromeРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаLinuxFirefox + 69 + + LinuxFirefox + 71 + + <key>ru</key> + <value>Firefox</value> + + true + true + + true + + + LinuxFirefoxРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + LinuxFirefoxКонтекстноеМеню + 72 + true + + Label + 9 + true + true + + Left + + + + Linux_x86_Firefox + 74 + + <key>ru</key> + <value>x86</value> + + true + true + + true + + + Linux_x86_Firefox + + Right + + Linux_x86_FirefoxРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + Linux_x86_FirefoxКонтекстноеМеню + 75 + true + + CheckBoxField + Auto + true + Left + true + + + + Linux_x86_64_Firefox + 77 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + Linux_x86_64_Firefox + + Right + + Linux_x86_64_FirefoxРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + Linux_x86_64_FirefoxКонтекстноеМеню + 78 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Firefox</value> + + + ГруппаLinuxFirefoxРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Linux</value> + + true + + ГруппаLinuxРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ГруппаMacOS + 80 + + ГруппаMacOSSafari + 82 + + MacOSSafari + 84 + + <key>ru</key> + <value>Safari</value> + + true + true + + true + + + MacOSSafariРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + MacOSSafariКонтекстноеМеню + 85 + true + + Label + true + true + + Left + + + + MacOS_x86_64_Safari + 87 + + <key>ru</key> + <value>x64</value> + + true + true + + true + + + MacOS_x86_64_Safari + + Right + + MacOS_x86_64_SafariРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + MacOS_x86_64_SafariКонтекстноеМеню + 88 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Safari</value> + + + ГруппаMacOSSafariРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>OS X (macOS)</value> + + true + + ГруппаMacOSРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Подсказка</value> + + ShowTop + + ПодсказкаРасширеннаяПодсказка + 4 + + <key>ru</key> + <value>Внешние компоненты платформозависимы, и не все внешние компоненты смогут работать на любой операционной системе или в любом браузере.</value> + + Label + 60 + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Поддерживаемые компонентой операционные системы и виды клиентов</value> + + 60 + true + + ГруппаПоддерживаемыеКлиентыРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Auto + true + Button + true + true + auto + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + УстановитьИПродолжить + 98 + + <key>ru</key> + <value>Установить и продолжить</value> + + true + false + + true + + true + + УстановитьИПродолжитьРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.StandardCommand.Yes + Normal + Auto + true + true + UserCmds + Auto + + + Закрыть + 100 + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + auto + true + + Windows_x86 + + <key>ru</key> + <value>Windows x86</value> + + 1 + + Boolean + + + true + + + true + + + + Windows_x86_64 + + <key>ru</key> + <value>Windows x86 64</value> + + 2 + + Boolean + + + true + + + true + + + + Linux_x86 + + <key>ru</key> + <value>Linux x86</value> + + 3 + + Boolean + + + true + + + true + + + + Linux_x86_64 + + <key>ru</key> + <value>Linux x86 64</value> + + 4 + + Boolean + + + true + + + true + + + + Windows_x86_Firefox + + <key>ru</key> + <value>Windows x86 firefox</value> + + 5 + + Boolean + + + true + + + true + + + + Linux_x86_Firefox + + <key>ru</key> + <value>Linux x86 firefox</value> + + 6 + + Boolean + + + true + + + true + + + + Linux_x86_64_Firefox + + <key>ru</key> + <value>Linux x86 64 firefox</value> + + 7 + + Boolean + + + true + + + true + + + + Windows_x86_MSIE + + <key>ru</key> + <value>Windows x86 MSIE</value> + + 8 + + Boolean + + + true + + + true + + + + Windows_x86_64_MSIE + + <key>ru</key> + <value>Windows x86 64 MSIE</value> + + 9 + + Boolean + + + true + + + true + + + + Windows_x86_Chrome + + <key>ru</key> + <value>Windows x86 chrome</value> + + 10 + + Boolean + + + true + + + true + + + + Linux_x86_Chrome + + <key>ru</key> + <value>Linux x86 chrome</value> + + 11 + + Boolean + + + true + + + true + + + + Linux_x86_64_Chrome + + <key>ru</key> + <value>Linux x86 64 chrome</value> + + 12 + + Boolean + + + true + + + true + + + + MacOS_x86_64_Safari + + <key>ru</key> + <value>Mac o s x86 64 safari</value> + + 13 + + Boolean + + + true + + + true + + + + ТекстПояснения + + String + + + + + ПоддерживаемыеКлиенты + + + + + + + diff --git a/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Module.bsl b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Module.bsl new file mode 100644 index 000000000..1f07caf6e --- /dev/null +++ b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/Module.bsl @@ -0,0 +1,26 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(Параметры.ТекстПояснения) Тогда + Элементы.ДекорацияПояснение.Заголовок = Параметры.ТекстПояснения + + Символы.ПС + Символы.ПС + + НСтр("ru = 'Отсутствует компонента для используемого клиентского приложения. + |Обратитесь к администратору.'"); + + КонецЕсли; + + // Заполнение реквизитов поддерживаемых клиентов. + Если ТипЗнч(Параметры.ПоддерживаемыеКлиенты) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.ПоддерживаемыеКлиенты); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/ДоступныеВидыКлиентовВнешнейКомпоненты.mdo similarity index 50% rename from SSL/src/CommonForms/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo rename to SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/ДоступныеВидыКлиентовВнешнейКомпоненты.mdo index f0ec8040a..751345b36 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo +++ b/SSL/src/CommonForms/ДоступныеВидыКлиентовВнешнейКомпоненты/ДоступныеВидыКлиентовВнешнейКомпоненты.mdo @@ -1,15 +1,10 @@ - - ПрисоединенныеФайлы + + ДоступныеВидыКлиентовВнешнейКомпоненты ru - Присоединенные файлы + Доступные виды клиентов внешней компоненты - - - ru - - PersonalComputer MobileDevice diff --git a/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Form.form b/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Form.form index 42269af43..9ba398040 100644 --- a/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Form.form +++ b/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Form.form @@ -187,10 +187,6 @@ ru Реквизиты поиска - - ru - Реквизиты поиска - ГруппаРеквизитыПоискаРасширеннаяПодсказка 47 @@ -219,10 +215,6 @@ ru Введите текст для поиска - - ru - Группа поиск - ГруппаПоискРасширеннаяПодсказка 10 @@ -249,6 +241,10 @@ Контрагенты 13 + + <key>ru</key> + <value>Контрагенты</value> + true true @@ -713,10 +709,6 @@ ru Подвал - - ru - Подвал - ГруппаПодвалРасширеннаяПодсказка 61 diff --git a/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Module.bsl b/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Module.bsl index 9c035d4b5..c1c45bea3 100644 --- a/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Module.bsl +++ b/SSL/src/CommonForms/ЗаполнениеРеквизитовКонтрагента/Module.bsl @@ -20,7 +20,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); - ТаблицаРегионов = МодульАдресныйКлассификатор.КлассификаторСубъектовРФ(); + ТаблицаРегионов = МодульАдресныйКлассификатор.СубъектыРФ(); Элементы.Регион.СписокВыбора.Очистить(); Для каждого СтрокаТаблицы Из ТаблицаРегионов Цикл Элементы.Регион.СписокВыбора.Добавить( diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form index 783e3ece2..f8d2e94ef 100644 --- a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form @@ -76,12 +76,8 @@ <key>ru</key> - <value>Группа шапка лево</value> + <value>Шапка лево</value> - - ru - Группа шапка лево - ГруппаШапкаЛевоРасширеннаяПодсказка 142 @@ -200,12 +196,8 @@ <key>ru</key> - <value>Группа шапка право</value> + <value>Шапка право</value> - - ru - Группа шапка право - ГруппаШапкаПравоРасширеннаяПодсказка 134 @@ -228,7 +220,7 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> true @@ -259,6 +251,10 @@ true + + <key>ru</key> + <value>Кнопки шапка</value> + ГруппаКнопкиШапкаExtendedTooltip 98 @@ -287,6 +283,10 @@ ДеревоРазделов 53 + + <key>ru</key> + <value>Дерево разделов</value> + true true @@ -369,10 +369,6 @@ ru Раздел - - ru - Раздел - ГруппаПолныйКодНаименованиеExtendedTooltip 108 @@ -566,9 +562,6 @@ CommonPicture.КоллекцияДеревоАнкеты - None - None - None true true @@ -578,7 +571,7 @@ <key>ru</key> - <value>Группа дерево разделов</value> + <value>Дерево разделов</value> ГруппаДеревоРазделовExtendedTooltip @@ -681,12 +674,8 @@ <key>ru</key> - <value>Группа ожидание элементы</value> + <value>Ожидание элементы</value> - - ru - Группа ожидание элементы - Center Center @@ -715,7 +704,7 @@ <key>ru</key> - <value>Группа ожидание</value> + <value>Ожидание</value> true true @@ -781,7 +770,7 @@ <key>ru</key> - <value>Группа тело анкеты</value> + <value>Тело анкеты</value> true @@ -814,10 +803,6 @@ ru Дерево форма заполнения - - ru - Дерево форма заполнения - ДеревоФормаЗаполненияExtendedTooltip 103 @@ -912,12 +897,8 @@ <key>ru</key> - <value>Группа кнопки подвал</value> + <value>Кнопки подвал</value> - - ru - Группа кнопки подвал - ГруппаКнопкиПодвалРасширеннаяПодсказка 140 diff --git a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form index 410f4b272..a138db8d8 100644 --- a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form +++ b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form @@ -91,7 +91,7 @@ <key>ru</key> - <value>Mozilla Firefox</value> + <value>Mozilla fire fox</value> MozillaFireFoxExtendedTooltip @@ -240,10 +240,6 @@ ru Отступ - - ru - Отступ - ОтступExtendedTooltip 26 diff --git a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl index 8b0346e85..983389fdb 100644 --- a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl +++ b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl @@ -33,10 +33,8 @@ Процедура ПродолжитьВыполнить(Команда) Если БольшеНеПоказывать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиПрограммы", - "ПоказыватьПодсказкиПриРедактированииФайлов", - Ложь); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); КонецЕсли; Закрыть(Истина); diff --git a/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Form.form b/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Form.form index dd53850b4..9391c61cc 100644 --- a/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Form.form +++ b/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Form.form @@ -63,23 +63,23 @@ - Токен - 17 + ЛогинДоступаКСервисуMorpher + 4 + + <key>ru</key> + <value>Логин</value> + true true true - Токен + ЛогинДоступаКСервисуMorpher - - OnChange - ТокенПриИзменении - - ТокенРасширеннаяПодсказка - 19 + ЛогинДоступаКСервисуMorpherРасширеннаяПодсказка + 6 Label true true @@ -88,8 +88,8 @@ - ТокенКонтекстноеМеню - 18 + ЛогинДоступаКСервисуMorpherКонтекстноеМеню + 5 true InputField @@ -98,8 +98,57 @@ Left true + 23 true true + true + true + true + true + true + Normal + + + + ПарольДоступаКСервисуMorpher + 7 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + ПарольДоступаКСервисуMorpher + + + ПарольДоступаКСервисуMorpherРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПарольДоступаКСервисуMorpherКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + 23 + true + true + true true true true @@ -110,13 +159,7 @@ ИнфоНадписьДоступКСервису - 20 - - <key>ru</key> - <value>Анонимное использование сервиса имеет <link http://www.morpher.ru/ws3/#limitations>ограничения</>. -Получить токен можно в <link http://www.morpher.ru/My/Token.aspx>личном кабинете</> после регистрации. -</value> - + 14 true true @@ -124,7 +167,7 @@ ИнфоНадписьДоступКСервисуРасширеннаяПодсказка - 22 + 16 Label true true @@ -134,10 +177,9 @@ ИнфоНадписьДоступКСервисуКонтекстноеМеню - 21 + 15 true - true Label true true @@ -242,17 +284,15 @@ - Токен + ПарольДоступаКСервисуMorpher <key>ru</key> - <value>Токен</value> + <value>Пароль доступа к сервису morpher</value> - 1 + 3 String - - 40 - + true @@ -262,14 +302,15 @@ - ТокенИзменен + ЛогинДоступаКСервисуMorpher <key>ru</key> - <value>Токен изменен</value> + <value>Логин доступа к сервису morpher</value> - 3 + 4 - Boolean + String + true diff --git a/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Module.bsl b/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Module.bsl index a8f9ea978..e28d29621 100644 --- a/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Module.bsl +++ b/SSL/src/CommonForms/НастройкаДоступаКСервисуMorpher/Module.bsl @@ -9,17 +9,22 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ВладелецТокена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"); - Токен = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ВладелецТокена, "ТокенДоступаКСервисуMorpher", Истина); + ЛогинДоступаКСервисуMorpher = Константы.ЛогинДоступаКСервисуMorpher.Получить(); + Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"), "ПарольДоступаКСервисуMorpher"); УстановитьПривилегированныйРежим(Ложь); - ВидДоступаКСервисуMorher = 0; - Если ЗначениеЗаполнено(Токен) Тогда - ВидДоступаКСервисуMorher = 1; - Токен = ЭтотОбъект.УникальныйИдентификатор; - КонецЕсли; + ВидДоступаКСервисуMorher = ?(ЗначениеЗаполнено(ЛогинДоступаКСервисуMorpher), 1, 0); УстановитьДоступностьЭлементов(); + ПарольДоступаКСервисуMorpher = ?(ЗначениеЗаполнено(Пароль), ЭтотОбъект.УникальныйИдентификатор, ""); + + ЧастиСтроки = Новый Массив; + ЧастиСтроки.Добавить(НСтр("ru = 'Анонимное использование сервиса имеет ограничения.'")); + ЧастиСтроки.Добавить(" "); + ЧастиСтроки.Добавить(Новый ФорматированнаяСтрока("Подробнее", , , , "http://www.morpher.ru/WebService.aspx#limitations")); + + Элементы.ИнфоНадписьДоступКСервису.Заголовок = Новый ФорматированнаяСтрока(ЧастиСтроки); + КонецПроцедуры #КонецОбласти @@ -32,17 +37,12 @@ УстановитьДоступностьЭлементов(); Если ВидДоступаКСервисуMorher = 0 Тогда - Токен = Неопределено; - ТокенИзменен = Истина; + ЛогинДоступаКСервисуMorpher = ""; + ПарольДоступаКСервисуMorpher = ""; КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ТокенПриИзменении(Элемент) - ТокенИзменен = Истина; -КонецПроцедуры - #КонецОбласти #Область ОбработчикиКомандФормы @@ -50,13 +50,6 @@ &НаКлиенте Процедура ОК(Команда) - Отказ = Ложь; - ПроверитьТокен(Отказ); - - Если Отказ Тогда - Возврат; - КонецЕсли; - СохранитьИзмененияНаСервере(); Закрыть(); @@ -69,56 +62,36 @@ &НаСервере Процедура СохранитьИзмененияНаСервере() - Если Не ТокенИзменен Тогда - Возврат; - КонецЕсли; - УстановитьПривилегированныйРежим(Истина); - ВладелецТокена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ВладелецТокена, Токен, "ТокенДоступаКСервисуMorpher"); - УстановитьПривилегированныйРежим(Ложь); - Если ЗначениеЗаполнено(Токен) Тогда - Токен = ЭтотОбъект.УникальныйИдентификатор; - КонецЕсли; + // Установка логина. + Константы.ЛогинДоступаКСервисуMorpher.Установить(ЛогинДоступаКСервисуMorpher); + // Установка пароля. + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"), ПарольДоступаКСервисуMorpher, "ПарольДоступаКСервисуMorpher"); + ПарольДоступаКСервисуMorpher = ?(ЗначениеЗаполнено(ПарольДоступаКСервисуMorpher), ЭтотОбъект.УникальныйИдентификатор, ""); + ПарольДоступаКСервисуMorpherИзменен = Ложь; - ТокенИзменен = Ложь; + СклонениеПредставленийОбъектов.УстановитьДоступностьСервисаСклонения(Истина); КонецПроцедуры &НаСервере Процедура УстановитьДоступностьЭлементов() + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, + "ЛогинДоступаКСервисуMorpher", + "Доступность", + ВидДоступаКСервисуMorher = 1); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, - "Токен", + "ПарольДоступаКСервисуMorpher", "Доступность", ВидДоступаКСервисуMorher = 1); - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, - "Токен", - "АвтоОтметкаНезаполненного", - ВидДоступаКСервисуMorher = 1); - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, - "Токен", - "ОтметкаНезаполненного", - Не ЗначениеЗаполнено(Токен)); КонецПроцедуры -&НаКлиенте -Процедура ПроверитьТокен(Отказ) - - Если ВидДоступаКСервисуMorher = 1 И Не ЗначениеЗаполнено(Токен) Тогда - ТекстСообщения = НСтр("ru = 'Токен доступа не заполнен.'"); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , "Токен", Отказ); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonForms/НастройкаКомандПечати/Form.form b/SSL/src/CommonForms/НастройкаКомандПечати/Form.form index 05893285a..a4e94da20 100644 --- a/SSL/src/CommonForms/НастройкаКомандПечати/Form.form +++ b/SSL/src/CommonForms/НастройкаКомандПечати/Form.form @@ -7,6 +7,10 @@ КомандыПечати 1 + + <key>ru</key> + <value>Команды печати</value> + true true @@ -191,6 +195,10 @@ true + + <key>ru</key> + <value>Команды печати группа 2</value> + КомандыПечатиГруппа2РасширеннаяПодсказка 45 @@ -322,9 +330,6 @@ true true true - None - None - None true @@ -473,6 +478,10 @@ true + + <key>ru</key> + <value>Форма группа 1</value> + ФормаГруппа1РасширеннаяПодсказка 40 diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form index dc7dfc5c2..6b0d99360 100644 --- a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form @@ -103,10 +103,6 @@ ru Командная панель таблицы - - ru - Командная панель таблицы - КоманднаяПанельТаблицыРасширеннаяПодсказка 47 @@ -130,10 +126,6 @@ ru Кнопки таблицы - - ru - Кнопки таблицы - КнопкиТаблицыРасширеннаяПодсказка 49 @@ -156,12 +148,8 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> - - ru - Группа шапка - ГруппаШапкаРасширеннаяПодсказка 51 @@ -184,6 +172,10 @@ ИспользуемыеКоманды 21 + + <key>ru</key> + <value>Используемые команды</value> + true true @@ -278,12 +270,8 @@ <key>ru</key> - <value>Группа в ячейке</value> + <value>В ячейке</value> - - ru - Группа в ячейке - ГруппаВЯчейкеРасширеннаяПодсказка 41 diff --git a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form index 5baf134e4..cf308b608 100644 --- a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form +++ b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form @@ -3,6 +3,10 @@ СписокСостоянияУзлов 1 + + <key>ru</key> + <value>Список состояния узлов</value> + true true @@ -117,10 +121,10 @@ true - + <key>ru</key> <value>Список состояния узлов группа основная</value> - </toolTip> + СписокСостоянияУзловГруппаОсновнаяExtendedTooltip 78 @@ -238,12 +242,8 @@ <key>ru</key> - <value>Группа состояния загрузки</value> + <value>Состояния загрузки</value> - - ru - Группа состояния загрузки - ГруппаСостоянияЗагрузкиExtendedTooltip 82 @@ -306,6 +306,10 @@ true + + <key>ru</key> + <value>Загрузки</value> + true ГруппаЗагрузкиExtendedTooltip @@ -424,12 +428,8 @@ <key>ru</key> - <value>Группа состояния выгрузки</value> + <value>Состояния выгрузки</value> - - ru - Группа состояния выгрузки - ГруппаСостоянияВыгрузкиExtendedTooltip 87 @@ -492,6 +492,10 @@ true + + <key>ru</key> + <value>Выгрузки</value> + true ГруппаВыгрузкиExtendedTooltip @@ -547,10 +551,10 @@ true - + <key>ru</key> <value>Список состояния узлов отправить и получить сообщения сейчас</value> - </toolTip> + СписокСостоянияУзловОтправитьИПолучитьСообщенияСейчасExtendedTooltip 61 @@ -734,6 +738,10 @@ true + + <key>ru</key> + <value>Список состояния узлов группа 2</value> + СписокСостоянияУзловГруппа2ExtendedTooltip 68 @@ -889,6 +897,10 @@ true + + <key>ru</key> + <value>Список состояния узлов группа 1</value> + СписокСостоянияУзловГруппа1ExtendedTooltip 71 @@ -1103,6 +1115,10 @@ true + + <key>ru</key> + <value>Список состояния узлов контекстное меню группа 2</value> + СписокСостоянияУзловКонтекстноеМенюГруппа2ExtendedTooltip 55 @@ -1175,6 +1191,10 @@ true + + <key>ru</key> + <value>Список состояния узлов контекстное меню группа 1</value> + СписокСостоянияУзловКонтекстноеМенюГруппа1ExtendedTooltip 58 @@ -1211,9 +1231,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl index d9deec759..286e45ac0 100644 --- a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl +++ b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl @@ -8,8 +8,8 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Настройка подсистемы в разделенном режиме не поддерживается.'"),,,, Отказ); diff --git a/SSL/src/CommonForms/Настройка1СБухфон/Form.form b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form similarity index 97% rename from SSL/src/CommonForms/Настройка1СБухфон/Form.form rename to SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form index d41375038..d26aac918 100644 --- a/SSL/src/CommonForms/Настройка1СБухфон/Form.form +++ b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form @@ -264,10 +264,6 @@ ru Логин пароль - - ru - Логин пароль - ЛогинПарольExtendedTooltip 194 @@ -294,12 +290,8 @@ <key>ru</key> - <value>Группа логин пароль</value> + <value>Логин пароль</value> - - ru - Группа логин пароль - ГруппаЛогинПарольРасширеннаяПодсказка 191 @@ -420,7 +412,7 @@ Auto - Аккаунт1СБухфон + АккаунтОнлайнПоддержки 40 true true @@ -429,7 +421,7 @@ 2 - Аккаунт1СБухфонExtendedTooltip + АккаунтОнлайнПоддержкиРасширеннаяПодсказка 204 Label true @@ -439,7 +431,7 @@ Hyperlink - Form.Command.ПолучитьАккаунт1СБухфон + Form.Command.ПолучитьАккаунтОнлайнПоддержки Normal Auto true @@ -484,10 +476,6 @@ ru Группы гиперссылки - - ru - Группы гиперссылки - ГруппыГиперссылкиРасширеннаяПодсказка 202 @@ -514,7 +502,7 @@ <key>ru</key> - <value>Группа информация о загрузке</value> + <value>Информация о загрузке</value> ГруппаИнформацияОЗагрузкеРасширеннаяПодсказка @@ -720,7 +708,7 @@ - ПолучитьАккаунт1СБухфон + ПолучитьАккаунтОнлайнПоддержки <key>ru</key> <value>Зарегистрироваться в сервисе онлайн-поддержки (1С-Коннект)</value> @@ -731,7 +719,7 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ПолучитьАккаунт1СБухфон</name> + <name>ПолучитьАккаунтВызовОнлайнПоддержки</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> diff --git a/SSL/src/CommonForms/Настройка1СБухфон/Help/ru.html b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html similarity index 100% rename from SSL/src/CommonForms/Настройка1СБухфон/Help/ru.html rename to SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html diff --git a/SSL/src/CommonForms/Настройка1СБухфон/Module.bsl b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl similarity index 77% rename from SSL/src/CommonForms/Настройка1СБухфон/Module.bsl rename to SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl index aea86d559..fbfbfe1df 100644 --- a/SSL/src/CommonForms/Настройка1СБухфон/Module.bsl +++ b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl @@ -4,8 +4,8 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // Заполнение элементов формы согласно предыдущих настроек текущего пользователя. - Результат = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя(); - ВидимостьКнопки = Результат.ВидимостьКнопки1СБухфон; + Результат = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); + ВидимостьКнопки = Результат.ВидимостьКнопкиВызовОнлайнПоддержки; СохранитьЛогинПароль = Результат.ИспользоватьЛП; Элементы.Логин.Доступность = Результат.ИспользоватьЛП; Элементы.Пароль.Доступность = Результат.ИспользоватьЛП; @@ -13,7 +13,7 @@ Пароль = Результат.Пароль; СистемнаяИнформация = Новый СистемнаяИнформация; ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - ПутьКФайлу = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); + ПутьКФайлу = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); ИнициализироватьЭлементыФормы(ЭтотОбъект); @@ -26,7 +26,7 @@ Отказ = Истина; КонецЕсли; Если ПутьКФайлу="" Тогда - ПутьКФайлу = Интеграция1СБухфонКлиент.ПутьКИсполняемомуФайлуИзРеестраWindows(); + ПутьКФайлу = ВызовОнлайнПоддержкиКлиент.ПутьКИсполняемомуФайлуИзРеестраWindows(); КонецЕсли; КонецПроцедуры @@ -51,7 +51,7 @@ &НаКлиенте Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Оповещение = Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект); - Интеграция1СБухфонКлиент.ВыбратьФайл1СБухфон(Оповещение, ПутьКФайлу); + ВызовОнлайнПоддержкиКлиент.ВыбратьФайлВызовОнлайнПоддержки(Оповещение, ПутьКФайлу); КонецПроцедуры #КонецОбласти @@ -61,11 +61,11 @@ &НаКлиенте Процедура Сохранить(Команда) - ИдентификаторКлиента = Интеграция1СБухфонКлиент.ИдентификаторКлиента(); + ИдентификаторКлиента = ВызовОнлайнПоддержкиКлиент.ИдентификаторКлиента(); СохранитьНастройкиПользователяВХранилище(Логин, Пароль, СохранитьЛогинПароль, ВидимостьКнопки); НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу); // Оповестим форму кнопки для управления видимостью кнопки. - Оповестить("СохранениеНастроек1СБухфон"); + Оповестить("СохранениеНастроекВызовОнлайнПоддержки"); ПриИзмененииНастроек(); ОбновитьИнтерфейс(); Закрыть(); @@ -73,7 +73,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПолучитьАккаунт1СБухфон(Команда) +Процедура ПолучитьАккаунтВызовОнлайнПоддержки(Команда) ПерейтиПоНавигационнойСсылке("http://buhphone.com/clients/be-client/"); @@ -99,7 +99,7 @@ &НаСервереБезКонтекста Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу) - Интеграция1СБухфон.СохранитьРасположениеИсполняемогоФайла1СБухфон(ИдентификаторКлиента, ПутьКФайлу); + ВызовОнлайнПоддержки.СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, ПутьКФайлу); КонецПроцедуры &НаСервереБезКонтекста @@ -108,13 +108,13 @@ СохранитьЛогинПароль, ВидимостьКнопки) - Интеграция1СБухфон.СохранитьНастройкиПользователяВХранилище(Логин, Пароль, СохранитьЛогинПароль, ВидимостьКнопки); + ВызовОнлайнПоддержки.СохранитьНастройкиПользователяВХранилище(Логин, Пароль, СохранитьЛогинПароль, ВидимостьКнопки); КонецПроцедуры &НаСервереБезКонтекста Процедура ПриИзмененииНастроек() - Интеграция1СБухфонПереопределяемый.ПриИзмененииНастроек(); + ВызовОнлайнПоддержкиПереопределяемый.ПриИзмененииНастроек(); КонецПроцедуры // Выполняет инициализацию элементов формы в зависимости от diff --git a/SSL/src/CommonForms/Настройка1СБухфон/Настройка1СБухфон.mdo b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo similarity index 88% rename from SSL/src/CommonForms/Настройка1СБухфон/Настройка1СБухфон.mdo rename to SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo index 7e21d886e..dc6f91933 100644 --- a/SSL/src/CommonForms/Настройка1СБухфон/Настройка1СБухфон.mdo +++ b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4d660fec-4a76-470e-bba9-3d031941b289"> - <name>Настройка1СБухфон</name> + <name>НастройкаОнлайнПоддержки</name> <synonym> <key>ru</key> <value>Настройка онлайн-поддержки</value> diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form index 5a49ecca0..cdbd90801 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form @@ -93,10 +93,10 @@ <userVisible> <common>true</common> </userVisible> - <toolTip> + <title> <key>ru</key> - <value>Группа расположение</value> - </toolTip> + <value>Расположение</value> + ГруппаРасположениеExtendedTooltip 30 @@ -358,10 +358,6 @@ ru Текущее состояние: - - ru - Текущее состояние: - СейчасВЛокальномКэшеФайловExtendedTooltip 36 diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html index 0de2e174d..87c0499fb 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html @@ -10,5 +10,5 @@
        • Если установлен флажок Подтверждать при удалении из основного рабочего каталога, то перед удалением каждого файла будет выдаваться запрос на удаление файла. По умолчанию флажок снят.

        Удаление файлов после редактирования

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

        Текущее состояние

        • Программа показывает Текущее состояние основного рабочего каталога - количество Файлов, содержащихся в нем и их Общий объем (Мб).

        Просмотр списка файлов в основном рабочем каталоге

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

        Очистка основного рабочего каталога

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

        Очистка основного рабочего каталога

        • Нажмите Очистить основной рабочий каталог, для того чтобы удалить все файлы в основном рабочем каталоге, кроме занятых Вами для редактирования. Для подтверждения очистки нажмите Да.
        \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl index 13ce09b4e..01bb749b8 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl @@ -20,13 +20,14 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если НЕ РаботаСФайламиСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами", 0.1, Истина); Отказ = Истина; Возврат; КонецЕсли; - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + РабочийКаталогПользователя = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); ОбновитьТекущееСостояниеРабочегоКаталога(); @@ -41,7 +42,7 @@ СтандартнаяОбработка = Ложь; - Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если НЕ РаботаСФайламиСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда Возврат; КонецЕсли; @@ -84,14 +85,15 @@ &НаКлиенте Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами() - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); КонецПроцедуры &НаКлиенте Процедура СписокФайловВыполнить() - ОткрытьФорму("Справочник.Файлы.Форма.ФайлыВОсновномРабочемКаталоге", , ЭтотОбъект,,,, + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФайлыВОсновномРабочемКаталоге", , ЭтотОбъект, , , , Новый ОписаниеОповещения("СписокФайловЗакрытие", ЭтотОбъект)); КонецПроцедуры @@ -101,7 +103,7 @@ ТекстВопроса = НСтр("ru = 'Из основного рабочего каталога будут удалены все файлы, - |кроме занятых вами для редактирования. + |кроме занятых для редактирования. | |Продолжить?'"); Обработчик = Новый ОписаниеОповещения("ОчиститьЛокальныйКэшФайловПослеОтветаНаВопросПродолжить", ЭтотОбъект); @@ -112,7 +114,7 @@ &НаКлиенте Процедура ПутьКРабочемуКаталогуПоУмолчанию(Команда) - УстановитьНовыйРабочийКаталог(ФайловыеФункцииСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя()); + УстановитьНовыйРабочийКаталог(РаботаСФайламиСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя()); КонецПроцедуры @@ -149,8 +151,7 @@ Элемент.Вставить("Значение", ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов); МассивСтруктур.Добавить(Элемент); - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения( - МассивСтруктур); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); КонецПроцедуры @@ -161,9 +162,6 @@ Возврат; КонецЕсли; - Состояние(НСтр("ru = 'Выполняется очистка основного рабочего каталога... - |Пожалуйста, подождите.'")); - Обработчик = Новый ОписаниеОповещения("ОчиститьЛокальныйКэшФайловЗавершение", ЭтотОбъект); // ОчищатьВсе = Истина. РаботаСФайламиСлужебныйКлиент.ОчиститьРабочийКаталог(Обработчик, РазмерФайловВРабочемКаталоге, 0, Истина); @@ -175,7 +173,7 @@ ОбновитьТекущееСостояниеРабочегоКаталога(); - Состояние(НСтр("ru = 'Очистка основного рабочего каталога успешно завершена.'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Основной рабочий каталог'"),, НСтр("ru = 'Очистка основного рабочего каталога успешно завершена.'")); КонецПроцедуры @@ -223,7 +221,7 @@ РазмерФайловВРабочемКаталоге = 0; КоличествоСуммарное = 0; - ФайловыеФункцииСлужебныйКлиент.ОбходФайловРазмер( + РаботаСФайламиСлужебныйКлиент.ОбходФайловРазмер( РабочийКаталогПользователя, МассивФайлов, РазмерФайловВРабочемКаталоге, diff --git a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form index 27bf70eef..93d2fe063 100644 --- a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form +++ b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form @@ -114,10 +114,6 @@ ru Провайдер и описание - - ru - Провайдер и описание - ПровайдерИОписаниеРасширеннаяПодсказка 23 diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form b/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form index e85c1c5c8..012ab6dd4 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form @@ -180,7 +180,7 @@ <key>ru</key> - <value>Группа минимальная длина пароля</value> + <value>Минимальная длина пароля</value> ГруппаМинимальнаяДлинаПароляРасширеннаяПодсказка @@ -207,7 +207,7 @@ <key>ru</key> - <value>Группа сложность пароля</value> + <value>Сложность пароля</value> ГруппаСложностьПароляРасширеннаяПодсказка @@ -366,7 +366,7 @@ <key>ru</key> - <value>Группа максимальный срок действия пароля</value> + <value>Максимальный срок действия пароля</value> ГруппаМаксимальныйСрокДействияПароляРасширеннаяПодсказка @@ -517,7 +517,7 @@ <key>ru</key> - <value>Группа минимальный срок действия пароля</value> + <value>Минимальный срок действия пароля</value> ГруппаМинимальныйСрокДействияПароляРасширеннаяПодсказка @@ -663,7 +663,7 @@ <key>ru</key> - <value>Группа запретить повторение пароля среди последних</value> + <value>Запретить повторение пароля среди последних</value> ГруппаЗапретитьПовторениеПароляСредиПоследнихРасширеннаяПодсказка @@ -690,7 +690,7 @@ <key>ru</key> - <value>Группа смена пароля</value> + <value>Смена пароля</value> ГруппаСменаПароляРасширеннаяПодсказка @@ -850,7 +850,7 @@ <key>ru</key> - <value>Группа просрочка работы в программе до запрещения входа</value> + <value>Просрочка работы в программе до запрещения входа</value> ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl b/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl index 3ccbbf921..759e8bb40 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl @@ -144,7 +144,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Константа.НастройкиВходаПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -181,7 +180,9 @@ Если ЗначениеЗаполнено(НастройкиВхода.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Или ЗначениеЗаполнено(НастройкиВхода.ВнешниеПользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда + УстановитьПривилегированныйРежим(Истина); ПользователиСлужебный.ИзменитьЗаданиеКонтрольАктивностиПользователей(Истина); + УстановитьПривилегированныйРежим(Ложь); КонецЕсли; ЗафиксироватьТранзакцию(); diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/НастройкиВходаПользователей.mdo b/SSL/src/CommonForms/НастройкиВходаПользователей/НастройкиВходаПользователей.mdo index 44bb7b586..953a0a51e 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/НастройкиВходаПользователей.mdo +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/НастройкиВходаПользователей.mdo @@ -12,4 +12,5 @@ PersonalComputer MobileDevice + true
        diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form index d6aa737ab..40e9a4513 100644 --- a/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form @@ -7,6 +7,10 @@ ГруппыПрав 1 + + <key>ru</key> + <value>Группы прав</value> + true true @@ -387,9 +391,6 @@ CommonPicture.СостоянияПользователей - None - None - None true diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl index c686d3a72..77a61e060 100644 --- a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl @@ -11,14 +11,23 @@ КонецЕсли; СсылкаНаОбъект = Параметры.СсылкаНаОбъект; - ТекущиеПараметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ВозможныеПрава = ТекущиеПараметры.ВозможныеПраваДляНастройкиПравОбъектов; + Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда + ВызватьИсключение НСтр("ru = 'Не указан владелец настроек прав.'"); + КонецЕсли; - Если ВозможныеПрава.ПоТипамСсылок[ТипЗнч(СсылкаНаОбъект)] = Неопределено Тогда + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); + ТипСсылкиНаОбъект = ТипЗнч(СсылкаНаОбъект); + + Если ВозможныеПрава.ПоТипамСсылок.Получить(ТипСсылкиНаОбъект) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Права доступа не настраиваются + НСтр("ru = 'Права доступа для каждого объекта не настраиваются |для объектов типа ""%1"".'"), - Строка(ТипЗнч(СсылкаНаОбъект))); + Строка(ТипСсылкиНаОбъект)); + КонецЕсли; + + Если Не ПравоДоступа("Просмотр", Метаданные.НайтиПоТипу(ТипСсылкиНаОбъект)) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нет права Просмотр на объекты типа ""%1"".'"), Строка(ТипСсылкиНаОбъект)); КонецЕсли; // Проверка разрешения на открытие формы. @@ -348,7 +357,7 @@ КонецПроцедуры &НаКлиенте -Процедура ЗаписатьИЗакрытьОповещение(Результат = Неопределено, Неопределен = Неопределено) Экспорт +Процедура ЗаписатьИЗакрытьОповещение(Результат, Контекст) Экспорт ЗаписатьНачало(Истина); @@ -393,7 +402,7 @@ КонецПроцедуры &НаКлиенте -Процедура ЗаписатьПослеПодтверждения(Ответ, Неопределен) Экспорт +Процедура ЗаписатьПослеПодтверждения(Ответ, Контекст) Экспорт Если Ответ = "ЗаписатьИЗакрыть" Тогда ПодтвердитьОтказОтУправленияПравами = Ложь; @@ -413,7 +422,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПеречитатьЗавершение(Ответ, Неопределен) Экспорт +Процедура ПеречитатьЗавершение(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ПрочитатьПрава(); @@ -516,9 +525,8 @@ &НаСервере Процедура ДобавитьРеквизитыИлиЭлементыФормы(НовыеРеквизиты = Неопределено) - ТекущиеПараметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ПоТипамСсылок = ТекущиеПараметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; - ОписанияВозможныхПрав = ПоТипамСсылок.Получить(ТипЗнч(Параметры.СсылкаНаОбъект)); + Права = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); + ОписанияВозможныхПрав = Права.ПоТипамСсылок.Получить(ТипЗнч(Параметры.СсылкаНаОбъект)); ОписаниеТиповПсевдоФлажка = Новый ОписаниеТипов("Булево, Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)); @@ -874,12 +882,12 @@ Возврат; КонецЕсли; - ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей); + ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Неопределено); КонецПроцедуры &НаКлиенте -Процедура ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Неопределен = Неопределено) Экспорт +Процедура ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Контекст) Экспорт Если ВыборИПодборВнешнихПользователей = Неопределено Тогда Возврат; diff --git a/SSL/src/CommonForms/НастройкиПроверкиКонтрагентов/Form.form b/SSL/src/CommonForms/НастройкиПроверкиКонтрагентов/Form.form index 842d79d6d..2a7b9b7a8 100644 --- a/SSL/src/CommonForms/НастройкиПроверкиКонтрагентов/Form.form +++ b/SSL/src/CommonForms/НастройкиПроверкиКонтрагентов/Form.form @@ -68,10 +68,6 @@ ru Левая колонка первой группы - - ru - Левая колонка первой группы - false ЛеваяКолонкаПервойГруппыРасширеннаяПодсказка @@ -172,10 +168,6 @@ ru Правая колонка первой группы - - ru - Правая колонка первой группы - ПраваяКолонкаПервойГруппыРасширеннаяПодсказка 132 @@ -201,6 +193,10 @@ true + + <key>ru</key> + <value>Первая группа настроек</value> + ПерваяГруппаНастроекРасширеннаяПодсказка 134 diff --git a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form index eb0f0f5e1..d3830d432 100644 --- a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form +++ b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form @@ -7,6 +7,10 @@ ОбластиПерсональныхДанных 7 + + <key>ru</key> + <value>Области персональных данных</value> + true true @@ -130,9 +134,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form index 437bf133b..43062ff48 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form @@ -171,7 +171,7 @@ <key>ru</key> - <value>Группа сертификаты отбор</value> + <value>Сертификаты отбор</value> ГруппаСертификатыОтборРасширеннаяПодсказка @@ -390,6 +390,10 @@ Сертификаты 46 + + <key>ru</key> + <value>Сертификаты</value> + true true @@ -800,9 +804,6 @@ Сертификаты.DefaultPicture - None - None - None true 60 @@ -853,7 +854,7 @@ 165 <key>ru</key> - <value>В обозреватель интернет не установлено расширение для работы с электронной подписью и шифрованием. Невозможно проверить какие из программ установлены на компьютере.</value> + <value>В браузере не установлено расширение для работы с электронной подписью и шифрованием. Невозможно проверить, какие из программ установлены на компьютере.</value> true true @@ -918,7 +919,7 @@ <key>ru</key> - <value>Группа веб клиент расширение не установлено</value> + <value>Веб клиент расширение не установлено</value> ГруппаВебКлиентРасширениеНеУстановленоРасширеннаяПодсказка @@ -1082,10 +1083,6 @@ ru Программы командная панель отдельно - - ru - Программы командная панель отдельно - ПрограммыКоманднаяПанельОтдельноРасширеннаяПодсказка 182 @@ -1530,9 +1527,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true @@ -1645,10 +1639,6 @@ ru Страница программы список - - ru - Страница программы список - СтраницаПрограммыСписокРасширеннаяПодсказка 323 @@ -1747,10 +1737,6 @@ ru Страница программы обновление - - ru - Страница программы обновление - СтраницаПрограммыОбновлениеРасширеннаяПодсказка 325 @@ -1777,10 +1763,6 @@ ru Страницы программы и обновление - - ru - Страницы программы и обновление - СтраницыПрограммыИОбновлениеРасширеннаяПодсказка 321 @@ -1910,7 +1892,7 @@ <key>ru</key> - <value>Группа проверять подписи на сервере</value> + <value>Проверять подписи на сервере</value> ГруппаПроверятьПодписиНаСервереРасширеннаяПодсказка @@ -2156,6 +2138,48 @@ Vertical + + СохранятьСертификатВместеСПодписью + 350 + + <key>ru</key> + <value>Сохранять сертификат</value> + + true + true + + true + + + СохранятьСертификатВместеСПодписью + + Right + + OnChange + СохранятьСертификатВместеСПодписьюПриИзменении + + + СохранятьСертификатВместеСПодписьюРасширеннаяПодсказка + 352 + Label + true + true + + Left + + + + СохранятьСертификатВместеСПодписьюКонтекстноеМеню + 351 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -2775,6 +2799,23 @@ true + + СохранятьСертификатВместеСПодписью + + <key>ru</key> + <value>Сохранять сертификат вместе с подписью</value> + + 14 + + Boolean + + + true + + + true + + Обновить diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html index 8476eb518..3695f709b 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html @@ -10,7 +10,7 @@ </li><li>Можно установить отбор только своих сертификатов в поле <strong>Показать</strong>. По умолчанию показываются все сертификаты. </li><li>Предусмотрен отбор по полю <strong>Состояние заявления</strong> ("Любое", "Не подготовлено", "Подготовлено", "Отправлено", "Отклонено", "Исполнено, сертификат не установлен", "Исполнено"). </li><li><a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования.Form.ФормаЭлемента/Help">Сертификат</a> можно <strong>Добавить</strong> из числа <strong>установленных на компьютере</strong>. Также это можно сделать в процессе подписания или шифрования данных. -</li><li>Также с помощью кнопки <strong>Добавить</strong> можно подготовить <a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования.Form.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help">Заявление на выпуск нового сертификата</a>. +</li><li>Также с помощью кнопки <strong>Добавить</strong> можно подготовить <a href="DataProcessor.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Form.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help">Заявление на выпуск нового сертификата</a>. </li><li>Просмотреть сертификат или заявление на выпуск нового сертификата можно, дважды щелкнув по нему мышью. Также можно это сделать с помощью команды <strong>Изменить</strong> контекстного меню по правой кнопке мыши или меню <strong>Еще</strong>.</li></ul><h3>Программы</h3> <ul><li>Содержит список программ, которые будут использованы в информационной базе (в том числе во всех узлах распределенной ИБ). </li><li>Эти программы не обязательно должны быть установлены на всех компьютерах. Более того, установка более одной программы на одном компьютере может вызвать конфликты между ними. @@ -30,5 +30,6 @@ <ul><li> <div><strong>Сохранять все подписи</strong> - все подписи сохраняются; </div> </li><li> -<div><strong>Спрашивать</strong> - выбор сохраняемых подписей осуществляется из <a href="CommonForm.СохранениеВместеСЭлектроннойПодписью/Help">списка</a>.</div></li></ul></li></ul><h3>См. также:</h3> +<div><strong>Спрашивать</strong> - выбор сохраняемых подписей осуществляется из <a href="CommonForm.СохранениеВместеСЭлектроннойПодписью/Help">списка</a>.</div></li></ul></li><li> +<div>Включите флажок <strong>Сохранять сертификат</strong> для сохранения на компьютер сертификата вместе с файлом и электронной подписью.</div></li></ul><h3>См. также:</h3> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl index 5fc16d9f1..ed6b4ab6a 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl @@ -10,6 +10,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); ЭлектроннаяПодписьСлужебный.УстановитьУсловноеОформлениеСпискаСертификатов(Сертификаты, Истина); Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. @@ -35,7 +36,7 @@ Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда УстановитьПроверкуПодписейНаСервере(Ложь); Элементы.ПроверятьПодписиНаСервере.Видимость = Ложь; Элементы.ПодписыватьНаСервере.Видимость = Ложь; @@ -64,10 +65,11 @@ КонецЕсли; Если Не ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно Тогда - Элементы.СертификатыСоздать.Видимость = Истина; - Элементы.СертификатыДобавить.Видимость = Ложь; - Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь; + Элементы.СертификатыСоздать.Видимость = Истина; + Элементы.СертификатыДобавить.Видимость = Ложь; + Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь; Элементы.СертификатыСостояниеЗаявления.Видимость = Ложь; + Элементы.Инструкция.Видимость = Ложь; КонецЕсли; СертификатыОбновитьОтбор(ЭтотОбъект); @@ -81,16 +83,13 @@ Элементы.ПрограммыИзменить.ТолькоВоВсехДействиях = Ложь; КонецЕсли; - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - - Если РежимРаботы.ЭтоWindowsКлиент Тогда + Если ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда Элементы.ГруппаПрограммыLinuxПутьКПрограмме.Видимость = Ложь; КонецЕсли; Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = - РежимРаботы.ЭтоВебКлиент И Параметры.Свойство("РасширениеНеПодключено"); - - УстановитьУсловноеОформление(); + ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() + И Параметры.Свойство("РасширениеНеПодключено"); ЗаполнитьПрограммыИНастройки(); @@ -224,6 +223,11 @@ КонецПроцедуры +&НаКлиенте +Процедура СохранятьСертификатВместеСПодписьюПриИзменении(Элемент) + СохранитьНастройки(); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСертификаты @@ -591,7 +595,7 @@ // Продолжение процедуры ОпределитьУстановленныеПрограммы. &НаКлиенте -Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Неопределен) Экспорт +Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт Если Подключено Тогда Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыОбновление; @@ -628,7 +632,7 @@ // Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы. &НаКлиенте -Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Неопределен) Экспорт +Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт Если Не Подключено Тогда Если Не Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда @@ -755,11 +759,11 @@ ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки(); - ДействияПриСохраненииСЭП = ПерсональныеНастройки.ДействияПриСохраненииСЭП; - РасширениеДляЗашифрованныхФайлов = ПерсональныеНастройки.РасширениеДляЗашифрованныхФайлов; - РасширениеДляФайловПодписи = ПерсональныеНастройки.РасширениеДляФайловПодписи; - ПутиКПрограммам = ПерсональныеНастройки.ПутиКПрограммамЭлектроннойПодписиИШифрования; - + ДействияПриСохраненииСЭП = ПерсональныеНастройки.ДействияПриСохраненииСЭП; + РасширениеДляЗашифрованныхФайлов = ПерсональныеНастройки.РасширениеДляЗашифрованныхФайлов; + РасширениеДляФайловПодписи = ПерсональныеНастройки.РасширениеДляФайловПодписи; + ПутиКПрограммам = ПерсональныеНастройки.ПутиКПрограммамЭлектроннойПодписиИШифрования; + СохранятьСертификатВместеСПодписью = ПерсональныеНастройки.СохранятьСертификатВместеСПодписью; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -836,6 +840,10 @@ ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(Выборка.Ссылка)); ОбновитьЗначение(Строка.НомерКартинки, ?(Выборка.ПометкаУдаления, 4, 3)); ОбновитьЗначение(Строка.ЭтоПрограммаОблачногоСервиса, Выборка.ЭтоПрограммаОблачногоСервиса); + Если Строка.ЭтоПрограммаОблачногоСервиса И Не Строка.ПометкаУдаления Тогда + ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); + ОбновитьЗначение(Строка.Установлена, Истина); + КонецЕсли; ОбработанныеСтроки.Вставить(Строка, Истина); Индекс = Индекс + 1; @@ -865,10 +873,10 @@ Процедура СохранитьНастройки() СохраняемыеНастройки = Новый Структура; - СохраняемыеНастройки.Вставить("ДействияПриСохраненииСЭП", ДействияПриСохраненииСЭП); - СохраняемыеНастройки.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); - СохраняемыеНастройки.Вставить("РасширениеДляФайловПодписи", РасширениеДляФайловПодписи); - + СохраняемыеНастройки.Вставить("ДействияПриСохраненииСЭП", ДействияПриСохраненииСЭП); + СохраняемыеНастройки.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); + СохраняемыеНастройки.Вставить("РасширениеДляФайловПодписи", РасширениеДляФайловПодписи); + СохраняемыеНастройки.Вставить("СохранятьСертификатВместеСПодписью", СохранятьСертификатВместеСПодписью); СохранитьНастройкиНаСервере(СохраняемыеНастройки); КонецПроцедуры @@ -900,7 +908,7 @@ &НаСервереБезКонтекста Процедура УстановитьПроверкуПодписейНаСервере(ПроверятьПодписиНаСервере) - Если Не ПравоДоступа("Установка", Метаданные.Константы.ПроверятьЭлектронныеПодписиНаСервере) + Если Не ПравоДоступа("Изменение", Метаданные.Константы.ПроверятьЭлектронныеПодписиНаСервере) Или Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить() = ПроверятьПодписиНаСервере Тогда Возврат; @@ -916,7 +924,7 @@ &НаСервереБезКонтекста Процедура УстановитьПодписаниеНаСервере(ПодписыватьНаСервере) - Если Не ПравоДоступа("Установка", Метаданные.Константы.СоздаватьЭлектронныеПодписиНаСервере) + Если Не ПравоДоступа("Изменение", Метаданные.Константы.СоздаватьЭлектронныеПодписиНаСервере) Или Константы.СоздаватьЭлектронныеПодписиНаСервере.Получить() = ПодписыватьНаСервере Тогда Возврат; diff --git a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form index e8ba0b3fb..2a6c30d4d 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form +++ b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form @@ -152,6 +152,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Отключены регламентные задания</value> + ГруппаОтключеныРегламентныеЗаданияРасширеннаяПодсказка 54 @@ -384,10 +388,6 @@ ru Описание обновлений группа - - ru - Описание обновлений группа - ОписаниеОбновленийГруппаРасширеннаяПодсказка 52 @@ -462,10 +462,6 @@ ru Командная панель списка - - ru - Командная панель списка - КоманднаяПанельСпискаExtendedTooltip 31 @@ -545,7 +541,7 @@ 11 <key>ru</key> - <value>Описание изменений также можно открыть из панели "Информация" на рабочем столе. </value> + <value>Описание изменений также можно открыть из группы "Информация" раздела "Главное".</value> true true @@ -686,7 +682,7 @@ <key>ru</key> - <value>Группа техническая информация и закрыть</value> + <value>Техническая информация и закрыть</value> false Right diff --git a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl index f559cca45..08f095b66 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl +++ b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl @@ -33,7 +33,7 @@ Если ДокументОписаниеОбновлений <> Неопределено И (ПоследняяВерсия = Неопределено Или Не Параметры.ПоказыватьТолькоИзменения) Тогда - ВсеРазделы = Константы.РазделыОписанияИзмененийСистемы.Получить().Получить(); + ВсеРазделы = ОбновлениеИнформационнойБазыСлужебный.РазделыОписанияИзменений(); Если ТипЗнч(ВсеРазделы) = Тип("СписокЗначений") И ВсеРазделы.Количество() <> 0 Тогда Для Каждого Элемент Из ВсеРазделы Цикл @@ -73,7 +73,7 @@ ВремяНачалаОбновления = СведенияОбОбновлении.ВремяНачалаОбновления; ВремяОкончанияОбновления = СведенияОбОбновлении.ВремяОкончанияОбновления; - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Или СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно <> Неопределено Или СведенияОбОбновлении.ДеревоОбработчиков <> Неопределено И СведенияОбОбновлении.ДеревоОбработчиков.Строки.Количество() = 0 Тогда @@ -92,7 +92,7 @@ Если Не ЗначениеЗаполнено(ВремяНачалаОбновления) И Не ЗначениеЗаполнено(ВремяОкончанияОбновления) Тогда Элементы.ТехническаяИнформацияОРезультатахОбновления.Видимость = Ложь; - ИначеЕсли Пользователи.ЭтоПолноправныйПользователь() И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + ИначеЕсли Пользователи.ЭтоПолноправныйПользователь() И Не ОбщегоНазначения.РазделениеВключено() Тогда Элементы.ТехническаяИнформацияОРезультатахОбновления.Видимость = Истина; Иначе Элементы.ТехническаяИнформацияОРезультатахОбновления.Видимость = Ложь; @@ -112,6 +112,8 @@ Элементы.ГруппаОтключеныРегламентныеЗадания.Видимость = Ложь; КонецЕсли; + Элементы.ОписаниеОбновлений.ГоризонтальнаяПолосаПрокрутки = ИспользованиеПолосыПрокрутки.НеИспользовать; + ОбновлениеИнформационнойБазыСлужебный.УстановитьФлагОтображенияОписанийПоТекущуюВерсию(); КонецПроцедуры diff --git a/SSL/src/CommonForms/ОтправкаSMS/Form.form b/SSL/src/CommonForms/ОтправкаSMS/Form.form index 4f9cdf004..bf75b9a50 100644 --- a/SSL/src/CommonForms/ОтправкаSMS/Form.form +++ b/SSL/src/CommonForms/ОтправкаSMS/Form.form @@ -64,7 +64,7 @@ <key>ru</key> - <value>Группа номер получателя</value> + <value>Номер получателя</value> ГруппаНомерПолучателяРасширеннаяПодсказка @@ -132,7 +132,7 @@ true true true - DontUse + OnValueChange Normal
        @@ -216,12 +216,8 @@ <key>ru</key> - <value>Группа транслит</value> + <value>Транслит</value> - - ru - Группа транслит - ГруппаТранслитРасширеннаяПодсказка 37 @@ -336,12 +332,8 @@ <key>ru</key> - <value>Группа имя отправителя</value> + <value>Имя отправителя</value> - - ru - Группа имя отправителя - ГруппаИмяОтправителяРасширеннаяПодсказка 63 @@ -368,12 +360,8 @@ <key>ru</key> - <value>Группа текст сообщения</value> + <value>Текст сообщения</value> - - ru - Группа текст сообщения - ГруппаТекстСообщенияРасширеннаяПодсказка 26 @@ -504,12 +492,8 @@ <key>ru</key> - <value>Группа проверка статуса</value> + <value>Проверка статуса</value> - - ru - Группа проверка статуса - ГруппаПроверкаСтатусаРасширеннаяПодсказка 46 @@ -637,12 +621,8 @@ <key>ru</key> - <value>Группа сообщение отправлено</value> + <value>Сообщение отправлено</value> - - ru - Группа сообщение отправлено - true ГруппаСообщениеОтправленоРасширеннаяПодсказка @@ -742,12 +722,8 @@ <key>ru</key> - <value>Группа проверка статуса доставки</value> + <value>Проверка статуса доставки</value> - - ru - Группа проверка статуса доставки - Top ГруппаПроверкаСтатусаДоставкиРасширеннаяПодсказка @@ -777,10 +753,6 @@ ru Страница сообщение отправлено - - ru - Страница сообщение отправлено - СтраницаСообщениеОтправленоРасширеннаяПодсказка 92 @@ -910,10 +882,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 42 @@ -1044,6 +1012,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + ГруппаКоманднаяПанельРасширеннаяПодсказка 44 @@ -1086,7 +1058,7 @@ НомераПолучателей <key>ru</key> - <value>Номер телефона получателя</value> + <value>Номера получателей</value> 1 diff --git a/SSL/src/CommonForms/ОтправкаSMS/Module.bsl b/SSL/src/CommonForms/ОтправкаSMS/Module.bsl index 705366b29..202262d02 100644 --- a/SSL/src/CommonForms/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаSMS/Module.bsl @@ -35,8 +35,7 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - ДлинаСообщенияСимволов = 0; - Элементы.ТекстСообщения.ОбновитьТекстРедактирования(); + ДлинаСообщенияСимволов = СтрДлина(ТекстСообщения); КонецПроцедуры #КонецОбласти @@ -113,7 +112,7 @@ Иначе Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСообщениеНеОтправлено; - ШаблонСообщения = НСтр("ru = 'Сообщение не было отправлено: + ШаблонСообщения = НСтр("ru = 'Отправка не выполнена: |%1 |Подробности см. в журнале регистрации.'"); diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Form.form b/SSL/src/CommonForms/ОтправкаСообщения/Form.form index 566d88009..ea54d4327 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Form.form +++ b/SSL/src/CommonForms/ОтправкаСообщения/Form.form @@ -1,83 +1,23 @@ - - ГруппаУчетнаяЗапись - 30 - - УчетнаяЗапись - 76 - true - true - - true - - - УчетнаяЗапись - - - OnChange - УстановитьПризнакМодифицированностиФормы - - - УчетнаяЗаписьРасширеннаяПодсказка - 78 - Label - true - true - - Left - - - - УчетнаяЗаписьКонтекстноеМеню - 77 - true - - InputField - Enter - true - Left - true - - - ChoiceProcessing - УчетнаяЗаписьОбработкаВыбора - - true - true - true - true - true - true - - Отбор.ИспользоватьДляОтправки - - - true - - - - - Отбор.ПометкаУдаления - - - - - Normal - - + + УчетнаяЗапись + 76 true true true - - <key>ru</key> - <value>Учетная запись</value> - + + УчетнаяЗапись + + + OnChange + УстановитьПризнакМодифицированностиФормы + - ГруппаУчетнаяЗаписьExtendedTooltip - 64 + УчетнаяЗаписьРасширеннаяПодсказка + 78 Label true true @@ -85,45 +25,77 @@ Left - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto + + УчетнаяЗаписьКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + + ChoiceProcessing + УчетнаяЗаписьОбработкаВыбора + + true + true + true + true + true + true + + Отбор.ИспользоватьДляОтправки + + + true + + + + + Отбор.ПометкаУдаления + + + + + Normal ОсновнаяГруппаТелаПисьма 10 - ПочтовыйАдресаПолучателей - 83 + ПочтовыеАдресаПолучателей + 87 + + <key>ru</key> + <value>Почтовый адреса получателей</value> + true true true - ПочтовыйАдресаПолучателей + ПочтовыеАдресаПолучателей None - ПочтовыйАдресаПолучателейВариантОтправки - 96 + ПочтовыйАдресПолучателейВариантОтправки + 100 true true true - ПочтовыйАдресаПолучателей.ВариантОтправки + ПочтовыеАдресаПолучателей.ВариантОтправки - ПочтовыйАдресаПолучателейВариантОтправкиРасширеннаяПодсказка - 98 + ПочтовыйАдресПолучателейВариантОтправкиРасширеннаяПодсказка + 102 Label true true @@ -132,111 +104,67 @@ - ПочтовыйАдресаПолучателейВариантОтправкиКонтекстноеМеню - 97 - true - - InputField - Auto - true - Left - true - - 2 - true - true - true - true - true - true - - - ru - Кому: - - - Кому: - - - - - ru - Копия: - - - Копия: - - - - - ru - Скрытая копия: - - - Скрытая копия: - - - Normal - - - - ПочтовыйАдресаПолучателейПредставление - 104 - true - true - - true - - - ПочтовыйАдресаПолучателей.Представление - - - OnChange - ПочтовыйАдресаПолучателейПредставлениеПриИзменении - - - ПочтовыйАдресаПолучателейПредставлениеРасширеннаяПодсказка - 106 - Label - true - true - - Left - - - - ПочтовыйАдресаПолучателейПредставлениеКонтекстноеМеню - 105 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПочтовыйАдресаПолучателейАдресат - 99 - true - - true - - - ПочтовыйАдресаПолучателей.Адресат - - - ПочтовыйАдресаПолучателейАдресатРасширеннаяПодсказка + ПочтовыйАдресПолучателейВариантОтправкиКонтекстноеМеню 101 + true + + InputField + true + Left + true + + 1 + true + true + true + true + true + OnActivate + true + + + ru + Кому: + + + Кому: + + + + + ru + Копия: + + + Копия: + + + + + ru + Скрытая копия: + + + Скрытая копия: + + + Normal + + + + ПочтовыйАдресПолучателейПредставление + 110 + true + true + + true + + + ПочтовыеАдресаПолучателей.Представление + + + ПочтовыйАдресПолучателейПредставлениеРасширеннаяПодсказка + 112 Label true true @@ -245,8 +173,8 @@ - ПочтовыйАдресаПолучателейАдресатКонтекстноеМеню - 100 + ПочтовыйАдресПолучателейПредставлениеКонтекстноеМеню + 111 true InputField @@ -255,30 +183,41 @@ Left true + + AutoComplete + ПочтовыйАдресПолучателейПредставлениеАвтоПодбор + true true true - true true true Normal - ПочтовыйАдресаПолучателейКоманднаяПанель - 85 + ПочтовыеАдресаПолучателейКоманднаяПанель + 89 Left - AfterDeleteRow - ПочтовыйАдресаПолучателейПослеУдаления + BeforeDeleteRow + ПочтовыйАдресаПолучателейПередУдалением + + + BeforeEditEnd + ПочтовыйАдресаПолучателейПередОкончаниемРедактирования + + + OnStartEdit + ПочтовыйАдресаПолучателейПриНачалеРедактирования - ПочтовыйАдресаПолучателейСтрокаПоиска - 87 + ПочтовыеАдресаПолучателейСтрокаПоиска + 91 - ПочтовыйАдресаПолучателейСтрокаПоискаРасширеннаяПодсказка - 89 + ПочтовыеАдресаПолучателейСтрокаПоискаРасширеннаяПодсказка + 93 Label true true @@ -287,21 +226,21 @@ - ПочтовыйАдресаПолучателейСтрокаПоискаКонтекстноеМеню - 88 + ПочтовыеАдресаПолучателейСтрокаПоискаКонтекстноеМеню + 92 true - ПочтовыйАдресаПолучателей + ПочтовыеАдресаПолучателей true - ПочтовыйАдресаПолучателейСостояниеПросмотра - 90 + ПочтовыеАдресаПолучателейСостояниеПросмотра + 94 - ПочтовыйАдресаПолучателейСостояниеПросмотраРасширеннаяПодсказка - 92 + ПочтовыеАдресаПолучателейСостояниеПросмотраРасширеннаяПодсказка + 96 Label true true @@ -310,22 +249,22 @@ - ПочтовыйАдресаПолучателейСостояниеПросмотраКонтекстноеМеню - 91 + ПочтовыеАдресаПолучателейСостояниеПросмотраКонтекстноеМеню + 95 true ViewStatusAddition - ПочтовыйАдресаПолучателей + ПочтовыеАдресаПолучателей true - ПочтовыйАдресаПолучателейУправлениеПоиском - 93 + ПочтовыеАдресаПолучателейУправлениеПоиском + 97 - ПочтовыйАдресаПолучателейУправлениеПоискомРасширеннаяПодсказка - 95 + ПочтовыеАдресаПолучателейУправлениеПоискомРасширеннаяПодсказка + 99 Label true true @@ -334,19 +273,19 @@ - ПочтовыйАдресаПолучателейУправлениеПоискомКонтекстноеМеню - 94 + ПочтовыеАдресаПолучателейУправлениеПоискомКонтекстноеМеню + 98 true SearchControlAddition - ПочтовыйАдресаПолучателей + ПочтовыеАдресаПолучателей true - ПочтовыйАдресаПолучателейРасширеннаяПодсказка - 86 + ПочтовыеАдресаПолучателейРасширеннаяПодсказка + 90 Label true true @@ -355,8 +294,8 @@ - ПочтовыйАдресаПолучателейКонтекстноеМеню - 84 + ПочтовыеАдресаПолучателейКонтекстноеМеню + 88 true true @@ -377,6 +316,8 @@ Auto true true + true + true true @@ -441,10 +382,6 @@ ru Командная панель форматирование - - ru - Командная панель форматирование - КоманднаяПанельФорматированиеРасширеннаяПодсказка 80 @@ -818,12 +755,8 @@ <key>ru</key> - <value>Группа приложить файл</value> + <value>Приложить файл</value> - - ru - Группа приложить файл - ГруппаПриложитьФайлExtendedTooltip 56 @@ -884,9 +817,6 @@ true true true - None - None - None true @@ -924,6 +854,10 @@ true + + <key>ru</key> + <value>Основная группа тела письма</value> + ОсновнаяГруппаТелаПисьмаExtendedTooltip 51 @@ -939,6 +873,7 @@ Vertical Auto true + true Auto Auto @@ -1036,16 +971,16 @@ Auto - ФормаЗаполнитьПоШаблону - 102 + ФормаСформироватьПоШаблону + 106 true true true - ФормаЗаполнитьПоШаблонуРасширеннаяПодсказка - 103 + ФормаСформироватьПоШаблонуРасширеннаяПодсказка + 107 Label true true @@ -1090,7 +1025,7 @@ ФормаСохранитьКакШаблон - 81 + 108 true true @@ -1098,7 +1033,7 @@ ФормаСохранитьКакШаблонРасширеннаяПодсказка - 82 + 109 Label true true @@ -1118,10 +1053,6 @@ Left true - - ChoiceProcessing - ОбработкаВыбора - OnOpen ПриОткрытии @@ -1134,6 +1065,10 @@ OnCreateAtServer ПриСозданииНаСервере + + OnClose + ПриЗакрытии + DontBlock true true @@ -1235,7 +1170,7 @@ АдресОтвета <key>ru</key> - <value>Обратный адрес</value> + <value>Адрес ответа</value> 7 @@ -1480,24 +1415,6 @@ - - ПолучателиСообщения - - <key>ru</key> - <value>Получатели сообщения</value> - - 14 - - String - - - - true - - - true - - ТребуетсяПодтверждениеЗакрытияФормы @@ -1516,12 +1433,12 @@ </edit> </attributes> <attributes> - <name>ПочтовыйАдресаПолучателей</name> + <name>ПочтовыеАдресаПолучателей</name> <title> <key>ru</key> - <value>Почтовый адреса получателей</value> + <value>Почтовые адреса получателей</value> - 16 + 18 ValueTable @@ -1531,6 +1448,7 @@ true + true ВариантОтправки @@ -1549,24 +1467,6 @@ <common>true</common> </edit> </columns> - <columns> - <name>Адресат</name> - <title> - <key>ru</key> - <value>Адресат</value> - - 2 - - String - - - - true - - - true - - Представление @@ -1586,6 +1486,43 @@ </edit> </columns> </attributes> + <attributes> + <name>ПолучателиСообщения</name> + <title> + <key>ru</key> + <value>Получатели сообщения</value> + + 20 + + ValueList + + + true + + + true + + + + + + + РезультатУспехЦвет + + <key>ru</key> + <value>Результат успех цвет</value> + + 21 + + Color + + + true + + + true + + ОтправитьПисьмо @@ -1659,13 +1596,35 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СформироватьПоШаблону</name> + <title> + <key>ru</key> + <value>Сформировать по шаблону</value> + + 4 + + ru + Сформировать по шаблону + + + true + + + + СформироватьПоШаблону + + + DontUse + Auto + СохранитьКакШаблон <key>ru</key> <value>Сохранить как шаблон...</value> - 4 + 5 ru Сохранить как шаблон @@ -1681,37 +1640,15 @@ DontUse Auto - - СформироватьПоШаблону - - <key>ru</key> - <value>Сформировать по шаблону</value> - - 5 - - ru - Сформировать по шаблону - - - true - - - - ЗаполнитьПоШаблону - - - DontUse - Auto - - УчетнаяЗапись + Отправитель ValueList CatalogRef.УчетныеЗаписиЭлектроннойПочты - Кому + Получатель @@ -1722,7 +1659,7 @@
        - Тело + Текст String @@ -1745,6 +1682,14 @@ Boolean + + Копии + + + + СкрытыеКопии + + diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl index ef7ed670c..b48c1cf88 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl @@ -27,32 +27,18 @@ Если ТипЗнч(Параметры.Вложения) = Тип("СписокЗначений") Или ТипЗнч(Параметры.Вложения) = Тип("Массив") Тогда Для Каждого Вложение Из Параметры.Вложения Цикл - Если ТипЗнч(Параметры.Вложения) = Тип("СписокЗначений") Тогда - ОписаниеВложения = Вложения.Добавить(); - ОписаниеВложения.Представление = Вложение.Представление; - Если ТипЗнч(Вложение.Значение) = Тип("ДвоичныеДанные") Тогда - ОписаниеВложения.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Вложение.Значение, УникальныйИдентификатор); - Иначе - Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда - ОписаниеВложения.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПолучитьИзВременногоХранилища(Вложение.Значение), УникальныйИдентификатор); - Иначе - ОписаниеВложения.ПутьКФайлу = Вложение.Значение; - КонецЕсли; - КонецЕсли; - Иначе // ТипЗнч(Параметры.Вложения) = "массив структур" - ОпределитьНазначениеВложенияПисьма(Вложение, ВложенияДляПисьма); - КонецЕсли; + ОпределитьНазначениеВложенияПисьма(Вложение, ВложенияДляПисьма); КонецЦикла; КонецЕсли; ТемаПисьма = Параметры.Тема; - ТелоПисьма.УстановитьHTML(ТекстВHTML(Параметры.Тело), ВложенияДляПисьма); + ТелоПисьма.УстановитьHTML(ТекстВHTML(Параметры.Текст), ВложенияДляПисьма); АдресОтвета = Параметры.АдресОтвета; // Обработка сложных параметров формы (составного типа). // УчетнаяЗапись, Кому. - Если НЕ ЗначениеЗаполнено(Параметры.УчетнаяЗапись) Тогда + Если НЕ ЗначениеЗаполнено(Параметры.Отправитель) Тогда // Учетная запись не передана - выбираем первую доступную. ДоступныеУчетныеЗаписи = РаботаСПочтовымиСообщениями.ДоступныеУчетныеЗаписи(Истина); Если ДоступныеУчетныеЗаписи.Количество() = 0 Тогда @@ -63,10 +49,10 @@ УчетнаяЗапись = ДоступныеУчетныеЗаписи[0].Ссылка; - ИначеЕсли ТипЗнч(Параметры.УчетнаяЗапись) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда - УчетнаяЗапись = Параметры.УчетнаяЗапись; - ИначеЕсли ТипЗнч(Параметры.УчетнаяЗапись) = Тип("СписокЗначений") Тогда - НаборУчетныхЗаписей = Параметры.УчетнаяЗапись; + ИначеЕсли ТипЗнч(Параметры.Отправитель) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда + УчетнаяЗапись = Параметры.Отправитель; + ИначеЕсли ТипЗнч(Параметры.Отправитель) = Тип("СписокЗначений") Тогда + НаборУчетныхЗаписей = Параметры.Отправитель; Если НаборУчетныхЗаписей.Количество() = 0 Тогда ТекстСообщения = НСтр("ru = 'Не указаны учетные записи для отправки сообщения, обратитесь к администратору системы.'"); @@ -89,16 +75,14 @@ // Для переданного списка учетных записей выбираем их из списка выбора. Элементы.УчетнаяЗапись.КнопкаВыпадающегоСписка = Истина; - КонецЕсли; - Если ТипЗнч(Параметры.Кому) = Тип("СписокЗначений") Тогда + Если ТипЗнч(Параметры.Получатель) = Тип("СписокЗначений") Тогда - Для Каждого ЭлементПочтовыйАдрес Из Параметры.Кому Цикл - НовыйПолучатель = ПочтовыйАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = "Кому:"; - НовыйПолучатель.Адресат = ЭлементПочтовыйАдрес.Значение; - Если ЗначениеЗаполнено(ЭлементПочтовыйАдрес.Представление) Тогда + Для Каждого ЭлементПочтовыйАдрес Из Параметры.Получатель Цикл + НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); + НовыйПолучатель.ВариантОтправки = НСтр("ru='Кому:'"); + Если ЗначениеЗаполнено(ЭлементПочтовыйАдрес.Представление) Тогда НовыйПолучатель.Представление = ЭлементПочтовыйАдрес.Представление + " <" + ЭлементПочтовыйАдрес.Значение @@ -108,46 +92,48 @@ КонецЕсли; КонецЦикла; - ИначеЕсли ТипЗнч(Параметры.Кому) = Тип("Строка") Тогда - НовыйПолучатель = ПочтовыйАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = "Кому:"; - НовыйПолучатель.Адресат = Параметры.Кому; - НовыйПолучатель.Представление = Параметры.Кому; - ИначеЕсли ТипЗнч(Параметры.Кому) = Тип("Массив") Тогда - Для Каждого СтруктураПолучателя Из Параметры.Кому Цикл + ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("Строка") Тогда + НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); + НовыйПолучатель.ВариантОтправки = НСтр("ru='Кому:'"); + НовыйПолучатель.Представление = Параметры.Получатель; + ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("Массив") Тогда + Для Каждого СтруктураПолучателя Из Параметры.Получатель Цикл ЕстьСвойствоВыбран = СтруктураПолучателя.Свойство("Выбран"); - МассивАдресов = СтрРазделить(СтруктураПолучателя.Адрес, ";"); + МассивАдресов = СтрРазделить(СтруктураПолучателя.Адрес, ";"); Для Каждого Адрес Из МассивАдресов Цикл - Если ПустаяСтрока(Адрес) Тогда + Если ПустаяСтрока(Адрес) Тогда Продолжить; КонецЕсли; Если (ЕстьСвойствоВыбран И СтруктураПолучателя.Выбран) ИЛИ (НЕ ЕстьСвойствоВыбран) Тогда - НовыйПолучатель = ПочтовыйАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = "Кому:"; - НовыйПолучатель.Адресат = Адрес; - НовыйПолучатель.Представление = СтруктураПолучателя.Представление + " <" + СокрЛП(Адрес) + ">; "; + НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); + НовыйПолучатель.ВариантОтправки = НСтр("ru='Кому:'"); + НовыйПолучатель.Представление = СтруктураПолучателя.Представление + " <" + СокрЛП(Адрес) + ">"; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; - Если ТипЗнч(Параметры.Кому) = Тип("Массив") Тогда - ПолучателиСообщения = ПоместитьВоВременноеХранилище(Параметры.Кому, УникальныйИдентификатор); - Иначе - ПолучателиСообщения = ПоместитьВоВременноеХранилище(Новый Массив, УникальныйИдентификатор); + Если ТипЗнч(Параметры.Получатель) = Тип("Массив") Тогда + РезультатУспехЦвет = ЦветаСтиля.РезультатУспехЦвет; + + Если ТипЗнч(Параметры.Получатель) = Тип("Строка") Тогда + ЗаполнитьТаблицуПолучателейИзСтроки(Параметры.Получатель); + ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("СписокЗначений") Тогда + ПолучателиСообщения = (Параметры.Получатель); + ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("Массив") Тогда + ЗаполнитьТаблицуПолучателейИзМассиваСтруктур(Параметры.Получатель); + КонецЕсли; КонецЕсли; - Если ПочтовыйАдресаПолучателей.Количество() = 0 Тогда - НоваяСтрока = ПочтовыйАдресаПолучателей.Добавить(); - НоваяСтрока.ВариантОтправки = "Кому:"; - НоваяСтрока.Адресат = ""; - НоваяСтрока.Представление = ""; + Если ПочтовыеАдресаПолучателей.Количество() = 0 Тогда + НоваяСтрока = ПочтовыеАдресаПолучателей.Добавить(); + НоваяСтрока.ВариантОтправки = НСтр("ru='Кому:'"); + НоваяСтрока.Представление = ""; КонецЕсли; // Получаем список адресов, которые пользователь использовал ранее. СписокАдресовОтвета = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( - "РедактированиеНовогоПисьма", - "СписокАдресовОтвета"); + "РедактированиеНовогоПисьма", "СписокАдресовОтвета"); Если СписокАдресовОтвета <> Неопределено И СписокАдресовОтвета.Количество() > 0 Тогда Для Каждого ЭлементаАдресОтвета Из СписокАдресовОтвета Цикл @@ -172,10 +158,22 @@ АвтоматическаяПодстановкаАдресаОтвета = Истина; КонецЕсли; - Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда - Элементы.ФормаСохранитьКакШаблон.Видимость = Ложь; - Элементы.ФормаЗаполнитьПоШаблону.Видимость = Ложь; - КонецЕсли; + // СтандартныеПодсистемы.ШаблоныСообщений + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") + И ПолучитьФункциональнуюОпцию("ИспользоватьШаблоныСообщений") Тогда + + МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); + Элементы.ФормаСформироватьПоШаблону.Видимость = МодульШаблоныСообщенийСлужебный.ЕстьДоступныеШаблоны("Письмо"); + Элементы.ФормаСохранитьКакШаблон.Видимость = Истина; + + Иначе + Элементы.ФормаСформироватьПоШаблону.Видимость = Ложь; + Элементы.ФормаСохранитьКакШаблон.Видимость = Ложь; + + КонецЕсли; + + // Конец СтандартныеПодсистемы.ШаблоныСообщений КонецПроцедуры @@ -187,15 +185,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ИсточникВыбора.ИмяФормы = "ОбщаяФорма.ВыборПолучателейСообщения" И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда - ПочтовыйАдресПолучателя = ВыбранноеЗначение.ПочтовыйАдресПолучателя; - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Если Не ТребуетсяПодтверждениеЗакрытияФормы Тогда @@ -210,6 +199,15 @@ ПодключитьОбработчикОжидания("ПоказатьВопросПередЗакрытиемФормы", 0.1, Истина); КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + АдресаВложений = Новый Массив; + Для Каждого Вложение Из Вложения Цикл + АдресаВложений.Добавить(Вложение.АдресВоВременномХранилище); + КонецЦикла; + ОчиститьВложения(АдресаВложений); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -240,25 +238,108 @@ #КонецОбласти -#Область ОбработчикиСобытийЭлементовТаблицыФормыПочтовыйАдресаПолучателей +#Область ОбработчикиСобытийЭлементовТаблицыФормыПочтовыеАдресаПолучателей &НаКлиенте -Процедура ПочтовыйАдресаПолучателейПослеУдаления(Элемент) - Если ПочтовыйАдресаПолучателей.Количество() = 0 Тогда - НовыйПолучатель = ПочтовыйАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = "Кому:"; +Процедура ПочтовыйАдресаПолучателейПередУдалением(Элемент, Отказ) + + Если ПочтовыеАдресаПолучателей.Количество() = 1 Тогда + Отказ = Истина; + ПочтовыеАдресаПолучателей[0].Представление = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПочтовыйАдресаПолучателейПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + Если НоваяСтрока Тогда + Элемент.ТекущиеДанные.ВариантОтправки = Элементы.ПочтовыйАдресПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению("Кому:"); + Элемент.ТекущийЭлемент = Элементы.ПочтовыйАдресПолучателейПредставление; КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ПочтовыйАдресаПолучателейПредставлениеПриИзменении(Элемент) - Если Элементы.ПочтовыйАдресаПолучателей.ТекущиеДанные <> Неопределено Тогда - Элементы.ПочтовыйАдресаПолучателей.ТекущиеДанные.Адресат = Элементы.ПочтовыйАдресаПолучателей.ТекущиеДанные.Представление; +Процедура ПочтовыйАдресПолучателейПредставлениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + Если ПолучателиСообщения.Количество() = 0 Тогда + Возврат; КонецЕсли; + + СтандартнаяОбработка = Ложь; + + ДанныеВыбора = Новый СписокЗначений; + + СписокАдресов = Новый Массив; + Для каждого СтрокаТаблицы Из ПочтовыеАдресаПолучателей Цикл + Адрес = ПочтовыйАдресИзПредставления(СтрокаТаблицы.Представление); + Если ЗначениеЗаполнено(Адрес) Тогда + СписокАдресов.Добавить(ВРег(Адрес)); + КонецЕсли; + КонецЦикла; + ПредставлениеВыбор = Новый ФорматированнаяСтрока(Текст, Новый Шрифт(,, Истина), РезультатУспехЦвет); + ДлинаТекста = СтрДлина(Текст); + Для Каждого Почта Из ПолучателиСообщения Цикл + Адрес = ПочтовыйАдресИзПредставления(Почта.Значение); + Если СписокАдресов.Найти(ВРег(Адрес)) = Неопределено Тогда + Позиция = СтрНайти(Почта.Значение, Текст); + Если Позиция > 0 Тогда + Представление= Новый ФорматированнаяСтрока(Лев(Почта.Представление, Позиция - 1), ПредставлениеВыбор, Сред(Почта.Представление, Позиция + ДлинаТекста)); + ДанныеВыбора.Добавить(Почта.Значение, Представление); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ДанныеВыбора.Количество() = 0 Тогда + СтандартнаяОбработка = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПочтовыйАдресаПолучателейПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) + + Если ОтменаРедактирования Тогда + Возврат; + КонецЕсли; + + ДанныеСтроки = Элемент.ТекущиеДанные; + Если ДанныеСтроки = Неопределено Тогда + Возврат; + КонецЕсли; + + Адрес = ПочтовыйАдресИзПредставления(ДанныеСтроки.Представление); + + Если ПустаяСтрока(Адрес) Тогда + Адрес = ДанныеСтроки.Представление; + КонецЕсли; + + Если ПустаяСтрока(Адрес) Тогда + Возврат; + КонецЕсли; + + Если СтрНайти(Адрес, "@") = 0 ИЛИ СтрНайти(Адрес, ".") = 0 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Необходимо ввести адрес электронной почты'")); + Отказ = Истина; + Возврат; + КонецЕсли; + + Дубли = Новый Соответствие; + Для каждого ПолучательПисьма Из ПочтовыеАдресаПолучателей Цикл + АдресПочты = ПочтовыйАдресИзПредставления(ПолучательПисьма.Представление); + Если Дубли[ВРег(АдресПочты)] = Неопределено Тогда + Дубли.Вставить(ВРег(АдресПочты), Истина); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Такой адрес электронной почты уже есть в списке.'")); + Отказ = Истина; + Возврат; + КонецЕсли; + КонецЦикла; + КонецПроцедуры #КонецОбласти + #Область ОбработчикиСобытийЭлементовТаблицыФормыВложения // Удаляет вложение из списка, а так же вызывает функцию @@ -359,8 +440,11 @@ Если ПоляЗаполненыКорректно() И ОтправитьПочтовоеСообщение() Тогда СохранитьАдресОтвета(АдресОтвета); - Состояние(НСтр("ru = 'Сообщение успешно отправлено'")); ТребуетсяПодтверждениеЗакрытияФормы = Ложь; + + ПоказатьОповещениеПользователя(НСтр("ru = 'Сообщение отправлено:'"), , + ?(ПустаяСтрока(ТемаПисьма), НСтр("ru = '<Без темы>'"), ТемаПисьма), БиблиотекаКартинок.Информация32); + Закрыть(); КонецЕсли; @@ -370,19 +454,20 @@ Функция ПоляЗаполненыКорректно() Результат = Истина; - Если ПочтовыйАдресаПолучателей.Количество() = 0 Тогда + Если ПочтовыеАдресаПолучателей.Количество() = 0 Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Необходимо заполнить получателя письма'"), , "ПочтовыйАдресПолучателя"); + НСтр("ru = 'Необходимо заполнить получателя письма'"), , "ПочтовыеАдресаПолучателей"); Результат = Ложь; КонецЕсли; - Для каждого Получателей Из ПочтовыйАдресаПолучателей Цикл - Если ПустаяСтрока(Получателей.Адресат) Тогда + Для каждого ПолучательПочты Из ПочтовыеАдресаПолучателей Цикл + Адрес = ПочтовыйАдресИзПредставления(ПолучательПочты.Представление); + Если ПустаяСтрока(Адрес) Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Необходимо заполнить получателя письма'"),, "ПочтовыйАдресаПолучателей[" + Формат(ПочтовыйАдресаПолучателей.Индекс(Получателей), "ЧГ=0") + "].Адресат"); + НСтр("ru = 'Необходимо заполнить получателя письма'"),, "ПочтовыеАдресаПолучателей[" + Формат(ПочтовыеАдресаПолучателей.Индекс(ПолучательПочты), "ЧГ=0") + "].Представление"); Результат = Ложь; - ИначеЕсли СтрНайти(Получателей.Адресат, "@") = 0 Тогда + ИначеЕсли СтрНайти(Адрес, "@") = 0 Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Неверный адрес электронной почты'"),, "ПочтовыйАдресаПолучателей[" + Формат(ПочтовыйАдресаПолучателей.Индекс(Получателей), "ЧГ=0") + "].Адресат"); + НСтр("ru = 'Неверный адрес электронной почты'"),, "ПочтовыеАдресаПолучателей[" + Формат(ПочтовыеАдресаПолучателей.Индекс(ПолучательПочты), "ЧГ=0") + "].Представление"); Результат = Ложь; КонецЕсли; КонецЦикла; @@ -401,7 +486,7 @@ // СтандартныеПодсистемы.ШаблоныСообщений &НаКлиенте -Процедура ЗаполнитьПоШаблону(Команда) +Процедура СформироватьПоШаблону(Команда) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщенийКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ШаблоныСообщенийКлиент"); @@ -579,14 +664,17 @@ Копии = Новый Массив; СкрытыеКопии = Новый Массив; - Для каждого Получатель Из ПочтовыйАдресаПолучателей Цикл - Если Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда - СкрытыеКопии.Добавить(Новый Структура("Адрес, Представление", Получатель.Адресат, Получатель.Представление)); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда - Копии.Добавить(Новый Структура("Адрес, Представление", Получатель.Адресат, Получатель.Представление)); - Иначе - Кому.Добавить(Новый Структура("Адрес, Представление", Получатель.Адресат, Получатель.Представление)); - КонецЕсли; + Для каждого Получатель Из ПочтовыеАдресаПолучателей Цикл + ПочтаПолучателей = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель.Представление); + Для каждого ПочтаПолучателя Из ПочтаПолучателей Цикл + Если Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда + СкрытыеКопии.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); + ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда + Копии.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); + Иначе + Кому.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); + КонецЕсли; + КонецЦикла; КонецЦикла; Если Кому.Количество() > 0 Тогда @@ -618,70 +706,13 @@ ПараметрыПисьма.Вставить("Тема", ТемаПисьма); КонецЕсли; - Если ЗначениеЗаполнено(ПолучателиСообщения) Тогда - ПараметрыПисьма.Вставить("ПолучателиСообщения", ПолучитьИзВременногоХранилища(ПолучателиСообщения)); - КонецЕсли; - - СодержимоеПисьма = ПолучитьHTMLФорматированногоДокументаДляПисьма(ТелоПисьма); - ТекстHTML = СодержимоеПисьма.ТекстHTML; - Картинки = СодержимоеПисьма.Картинки; - - ПараметрыПисьма.Вставить("Тело", ТекстHTML); - ПараметрыПисьма.Вставить("ТипТекста", "HTML"); + ПараметрыПисьма.Вставить("Тело", ТелоПисьма); ПараметрыПисьма.Вставить("Вложения", Вложения()); - Для Каждого Картинка Из Картинки Цикл - ИмяКартинки = Картинка.Ключ; - ДанныеКартинки = Картинка.Значение; - - ОписаниеВложения = Новый Структура; - ОписаниеВложения.Вставить("Представление", ИмяКартинки); - ОписаниеВложения.Вставить("АдресВоВременномХранилище", ПоместитьВоВременноеХранилище(ДанныеКартинки.ПолучитьДвоичныеДанные())); - ОписаниеВложения.Вставить("Кодировка", ""); - ОписаниеВложения.Вставить("Идентификатор", ИмяКартинки); - ПараметрыПисьма.Вложения.Добавить(ОписаниеВложения); - КонецЦикла; - Возврат ПараметрыПисьма; КонецФункции -&НаСервере -Функция ПолучитьHTMLФорматированногоДокументаДляПисьма(ФорматированныйДокумент) - - // Выгрузка форматированного документа в HTML текст и картинки. - ТекстHTML = ""; - Картинки = Новый Структура; - ФорматированныйДокумент.ПолучитьHTML(ТекстHTML, Картинки); - - // Конвертация HTML текста в ДокументHTML. - Построитель = Новый ПостроительDOM; - ЧтениеHTML = Новый ЧтениеHTML; - ЧтениеHTML.УстановитьСтроку(ТекстHTML); - ДокументHTML = Построитель.Прочитать(ЧтениеHTML); - - // Замена имен картинок в документе HTML на идентификаторы. - Для Каждого Картинка Из ДокументHTML.Картинки Цикл - АтрибутИсточникКартинки = Картинка.Атрибуты.ПолучитьИменованныйЭлемент("src"); - АтрибутИсточникКартинки.ТекстовоеСодержимое = "cid:" + АтрибутИсточникКартинки.ТекстовоеСодержимое; - КонецЦикла; - - // Конвертация ДокументHTML обратно в текст HTML. - ЗаписьDOM = Новый ЗаписьDOM; - ЗаписьHTML = Новый ЗаписьHTML; - ЗаписьHTML.УстановитьСтроку(); - ЗаписьDOM.Записать(ДокументHTML, ЗаписьHTML); - ТекстHTML = ЗаписьHTML.Закрыть(); - - // Подготовка результата. - Результат = Новый Структура; - Результат.Вставить("ТекстHTML", ТекстHTML); - Результат.Вставить("Картинки", Картинки); - - Возврат Результат; - -КонецФункции - &НаСервере Функция ТекстВHTML(Текст) @@ -881,10 +912,17 @@ &НаКлиенте Процедура СохранитьКакШаблон(Команда) - Шаблон = СоздатьШаблонСообщений(); - Если Шаблон <> Неопределено Тогда - ПоказатьЗначение(, Шаблон); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда + МодульШаблоныСообщенийКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ШаблоныСообщенийКлиентСервер"); + ПараметровШаблона = МодульШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона(); + МодульШаблоныСообщенийКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ШаблоныСообщенийКлиент"); + ПараметровШаблона.Тема = ТемаПисьма; + ПараметровШаблона.Текст = ТелоПисьма.ПолучитьТекст(); + ПараметровШаблона.ТипШаблона = "Письмо"; + МодульШаблоныСообщенийКлиент.ПоказатьФормуШаблона(ПараметровШаблона); КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -896,8 +934,9 @@ Если ТипЗнч(Результат.Получатель) = Тип("СписокЗначений") Тогда Для Каждого Получатель Из Результат.Получатель Цикл - АдресПолучателя = ПочтовыйАдресаПолучателей.Добавить(); - АдресПолучателя.ПочтовыйАдресаПолучателейАдресат = Получатель.Представление; + АдресПолучателя = ПочтовыеАдресаПолучателей.Добавить(); + АдресПолучателя.ВариантОтправки = НСтр("ru='Кому:'"); + АдресПолучателя.Представление = Получатель.Представление; КонецЦикла; КонецЕсли; КонецЕсли; @@ -917,20 +956,62 @@ КонецПроцедуры -&НаСервере -Функция СоздатьШаблонСообщений() +&НаКлиенте +Функция ПочтовыйАдресИзПредставления(Знач Представление) - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда - МодульШаблоныСообщений = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщений"); - ПараметровШаблона = МодульШаблоныСообщений.ОписаниеПараметровШаблона(); - ПараметровШаблона.Тема = ТемаПисьма; - ПараметровШаблона.Текст = ТелоПисьма.ПолучитьТекст(); - ПараметровШаблона.ТипШаблона = "Письмо"; - Возврат МодульШаблоныСообщений.СоздатьШаблон(ТемаПисьма, ПараметровШаблона); + Адрес = Представление; + ПозицияНачало = СтрНайти(Представление, "<"); + Если ПозицияНачало > 0 Тогда + ПозицияОкончание = СтрНайти(Представление, ">", НаправлениеПоиска.СНачала, ПозицияНачало); + Если ПозицияОкончание > 0 Тогда + Адрес = Сред(Представление, ПозицияНачало + 1, ПозицияОкончание - ПозицияНачало - 1); + КонецЕсли; КонецЕсли; - Возврат Неопределено; + Возврат СокрЛП(Адрес); + КонецФункции +&НаСервере +Процедура ЗаполнитьТаблицуПолучателейИзМассиваСтруктур(ПараметрыПолучателейСообщения) + + Для Каждого ПараметрыПолучателя Из ПараметрыПолучателейСообщения Цикл + Если ЗначениеЗаполнено(ПараметрыПолучателя.Адрес) Тогда + Адрес = СтрЗаменить(ПараметрыПолучателя.Представление, ",", " ") + " < "+ ПараметрыПолучателя.Адрес + ">"; + + Если ПараметрыПолучателя.Свойство("ВидПочтовогоАдреса") + И ЗначениеЗаполнено(ПараметрыПолучателя.ВидПочтовогоАдреса) Тогда + Представление = Адрес + " (" + ПараметрыПолучателя.ВидПочтовогоАдреса + ")"; + ИначеЕсли ПараметрыПолучателя.Свойство("ИсточникКонтактнойИнформации") + И ЗначениеЗаполнено(ПараметрыПолучателя.ИсточникКонтактнойИнформации) Тогда + Представление = Адрес + " (" + Строка(ПараметрыПолучателя.ИсточникКонтактнойИнформации) + ")"; + Иначе + Представление = Адрес; + КонецЕсли; + ПолучателиСообщения.Добавить(Адрес, Представление); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуПолучателейИзСтроки(Знач ПараметрыПолучателейСообщения) + + ПараметрыПолучателейСообщения = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(ПараметрыПолучателейСообщения); + + Для Каждого ПараметрыПолучателя Из ПараметрыПолучателейСообщения Цикл + Если ЗначениеЗаполнено(ПараметрыПолучателя.Адрес) Тогда + ПолучателиСообщения.Добавить(ПараметрыПолучателя.Адрес, ПараметрыПолучателя.Псевдоним); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ОчиститьВложения(АдресаВложений) + Для Каждого АдресВложения Из АдресаВложений Цикл + УдалитьИзВременногоХранилища(АдресВложения); + КонецЦикла; +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form index cbc96af5f..c23c4475c 100644 --- a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form +++ b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form @@ -7,6 +7,10 @@ ФорматыСохранения 32 + + <key>ru</key> + <value>Форматы сохранения</value> + true true @@ -214,9 +218,6 @@ ФорматыСохранения.Picture - None - None - None true diff --git a/SSL/src/CommonForms/ПанельОтчетов/Form.form b/SSL/src/CommonForms/ПанельОтчетов/Form.form index 5dc7c131e..683cf8ff0 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Form.form +++ b/SSL/src/CommonForms/ПанельОтчетов/Form.form @@ -125,7 +125,7 @@ - Группа1 + ГруппаКоманднаяПанельПравая 405 ПоказыватьПодсказки @@ -289,10 +289,6 @@ ru Настройки - - ru - Настройки - НастройкиРасширеннаяПодсказка 419 @@ -363,6 +359,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + 26 1 false @@ -386,9 +386,13 @@ true + + <key>ru</key> + <value>Командная панель правая</value> + true - Группа1РасширеннаяПодсказка + ГруппаКоманднаяПанельПраваяРасширеннаяПодсказка 406 Label true @@ -412,6 +416,10 @@ true + + <key>ru</key> + <value>Верхняя панель строка 1</value> + ВерхняяПанельСтрока1РасширеннаяПодсказка 396 @@ -519,6 +527,10 @@ true + + <key>ru</key> + <value>Быстрый доступ шапка</value> + БыстрыйДоступШапкаРасширеннаяПодсказка 376 @@ -588,10 +600,6 @@ ru Подсказка для режима настройки - - ru - Подсказка для режима настройки - ПодсказкаДляРежимаНастройкиРасширеннаяПодсказка 368 @@ -622,6 +630,10 @@ true + + <key>ru</key> + <value>Быстрый доступ колонка 1</value> + БыстрыйДоступКолонка1ExtendedTooltip 285 @@ -650,6 +662,10 @@ true + + <key>ru</key> + <value>Быстрый доступ колонка 2</value> + БыстрыйДоступКолонка2ExtendedTooltip 286 @@ -679,10 +695,6 @@ ru Быстрый доступ - - ru - Быстрый доступ - БыстрыйДоступExtendedTooltip 284 @@ -745,6 +757,10 @@ true + + <key>ru</key> + <value>Быстрый доступ подвал</value> + БыстрыйДоступПодвалРасширеннаяПодсказка 316 @@ -775,6 +791,10 @@ true + + <key>ru</key> + <value>Без группы колонка 1</value> + БезГруппыКолонка1ExtendedTooltip 290 @@ -803,6 +823,10 @@ true + + <key>ru</key> + <value>Без группы колонка 2</value> + БезГруппыКолонка2ExtendedTooltip 291 @@ -832,10 +856,6 @@ ru Без группы - - ru - Без группы - БезГруппыExtendedTooltip 289 @@ -896,6 +916,10 @@ true + + <key>ru</key> + <value>С группой колонка 1</value> + СГруппойКолонка1ExtendedTooltip 295 @@ -924,6 +948,10 @@ true + + <key>ru</key> + <value>С группой колонка 2</value> + СГруппойКолонка2ExtendedTooltip 296 @@ -953,10 +981,6 @@ ru С группой - - ru - С группой - СГруппойExtendedTooltip 294 @@ -1058,6 +1082,10 @@ true + + <key>ru</key> + <value>См также колонка 1</value> + СмТакжеКолонка1ExtendedTooltip 300 @@ -1086,6 +1114,10 @@ true + + <key>ru</key> + <value>См также колонка 2</value> + СмТакжеКолонка2ExtendedTooltip 301 @@ -1112,13 +1144,9 @@ true - <key>ru</key> - <value>См. также</value> - - ru См также - + СмТакжеExtendedTooltip 299 @@ -1174,6 +1202,10 @@ true + + <key>ru</key> + <value>Колонки</value> + КолонкиExtendedTooltip 283 @@ -1253,6 +1285,10 @@ true + + <key>ru</key> + <value>Результаты поиска из других разделов</value> + РезультатыПоискаИзДругихРазделовРасширеннаяПодсказка 351 @@ -1282,10 +1318,6 @@ ru Отчеты, найденные в других разделах - - ru - Результаты поиска из других разделов группа - РезультатыПоискаИзДругихРазделовГруппаРасширеннаяПодсказка 346 @@ -1335,7 +1367,7 @@ true UserCmds - Style.ВидимыйВариантОтчетаЦвет + Style.ГиперссылкаЦвет Auto @@ -1413,6 +1445,10 @@ true + + <key>ru</key> + <value>Подвал формы</value> + ПодвалФормыРасширеннаяПодсказка 312 @@ -1474,26 +1510,6 @@ true auto true - - ВыведеноЭлементовВариантов - - <key>ru</key> - <value>Выведено элементов вариантов</value> - - 3 - - Number - - 10 - - - - true - - - true - - РежимНастройки @@ -2195,6 +2211,26 @@ <common>true</common> </edit> </columns> + <columns> + <name>ВидимыхВариантов</name> + <title> + <key>ru</key> + <value>Видимых вариантов</value> + + 10 + + Number + + 10 + + + + true + + + true + + ЦветГруппыВариантовОтчетов @@ -2369,6 +2405,36 @@ true + + БыстрыйПоискВариантовПоИмениЭлемента + + <key>ru</key> + <value>Быстрый поиск вариантов по имени элемента</value> + + 1 + + + true + + + true + + + + БыстрыйПоискПодсистемПоСсылке + + <key>ru</key> + <value>Быстрый поиск подсистем по ссылке</value> + + 27 + + + true + + + true + + Настроить diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl index 7dc1377b9..7b5542a90 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl +++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl @@ -15,11 +15,11 @@ КартинкаБыстрыйДоступ = БиблиотекаКартинок.БыстрыйДоступ; ЦветСкрытыхВариантов = ЦветаСтиля.СкрытыйВариантОтчетаЦвет; - ЦветВидимыхВариантов = ЦветаСтиля.ВидимыйВариантОтчетаЦвет; + ЦветВидимыхВариантов = ЦветаСтиля.ГиперссылкаЦвет; ЦветПодсветкиНайденныхСлов = WebЦвета.Желтый; ЦветПодсказки = ЦветаСтиля.ПоясняющийТекст; - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.КоманднаяПанель.Ширина = 25; Элементы.СтрокаПоиска.Ширина = 35; ЦветГруппыВариантовОтчетов = ЦветаСтиля.ГруппаВариантовОтчетовЦвет82; @@ -139,12 +139,16 @@ &НаКлиенте Процедура Подключаемый_ВариантНажатие(Элемент) - Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", Элемент.Имя)); - Если Найденные.Количество() <> 1 Тогда + Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя); + Если Вариант = Неопределено Тогда Возврат; КонецЕсли; - Вариант = Найденные[0]; - ВариантыОтчетовКлиент.ОткрытьФормуОтчета(ЭтотОбъект, Вариант, Новый Структура("Подсистема", Вариант.Подсистема)); + ПараметрыФормыОтчета = Новый Структура; + Подсистема = НайтиПодсистемуПоСсылке(ЭтотОбъект, Вариант.Подсистема); + Если Подсистема.ВидимыхВариантов > 1 Тогда + ПараметрыФормыОтчета.Вставить("Подсистема", Вариант.Подсистема); + КонецЕсли; + ВариантыОтчетовКлиент.ОткрытьФормуОтчета(ЭтотОбъект, Вариант, ПараметрыФормыОтчета); КонецПроцедуры &НаКлиенте @@ -153,12 +157,11 @@ Показать = ЭтотОбъект[Флажок.Имя]; НадписьИмя = Сред(Флажок.Имя, СтрДлина("Флажок_")+1); + Вариант = НайтиВариантПоИмениЭлемента(НадписьИмя); Элемент = Элементы.Найти(НадписьИмя); - Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", НадписьИмя)); - Если Найденные.Количество() <> 1 Или Элемент = Неопределено Тогда + Если Вариант = Неопределено Или Элемент = Неопределено Тогда Возврат; КонецЕсли; - Вариант = Найденные[0]; ПоказатьСкрытьВариант(Вариант, Элемент, Показать); КонецПроцедуры @@ -298,11 +301,10 @@ Возврат; КонецЕсли; - Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", Элемент.Имя)); - Если Найденные.Количество() <> 1 Тогда + Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя); + Если Вариант = Неопределено Тогда Возврат; КонецЕсли; - Вариант = Найденные[0]; ДобавитьУбратьВариантИзБыстрогоДоступа(Вариант, Элемент, Истина); КонецПроцедуры @@ -318,11 +320,10 @@ Возврат; КонецЕсли; - Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", Элемент.Имя)); - Если Найденные.Количество() <> 1 Тогда + Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя); + Если Вариант = Неопределено Тогда Возврат; КонецЕсли; - Вариант = Найденные[0]; ДобавитьУбратьВариантИзБыстрогоДоступа(Вариант, Элемент, Ложь); КонецПроцедуры @@ -338,11 +339,10 @@ Возврат; КонецЕсли; - Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", Элемент.Имя)); - Если Найденные.Количество() <> 1 Тогда + Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя); + Если Вариант = Неопределено Тогда Возврат; КонецЕсли; - Вариант = Найденные[0]; ВариантыОтчетовКлиент.ПоказатьНастройкиОтчета(Вариант.Ссылка); КонецПроцедуры @@ -408,6 +408,12 @@ Элемент.Шрифт = Новый Шрифт; КонецЕсли; КонецЕсли; + Подсистема = НайтиПодсистемуПоСсылке(ЭтотОбъект, Вариант.Подсистема); + Подсистема.ВидимыхВариантов = Подсистема.ВидимыхВариантов + ?(Показать, 1, -1); + Пока Подсистема.Ссылка <> Подсистема.РазделСсылка Цикл + Подсистема = НайтиПодсистемуПоСсылке(ЭтотОбъект, Подсистема.РазделСсылка); + Подсистема.ВидимыхВариантов = Подсистема.ВидимыхВариантов + ?(Показать, 1, -1); + КонецЦикла; СохранитьПользовательскиеНастройки(Вариант.Ссылка, Вариант.Подсистема, Вариант.Видимость, Вариант.БыстрыйДоступ); КонецПроцедуры @@ -506,6 +512,37 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Функция НайтиВариантПоИмениЭлемента(НадписьИмя) + Идентификатор = БыстрыйПоискВариантовПоИмениЭлемента[НадписьИмя]; + Если Идентификатор <> Неопределено Тогда + Возврат ДобавленныеВарианты.НайтиПоИдентификатору(Идентификатор); + Иначе + Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", НадписьИмя)); + Если Найденные.Количество() = 1 Тогда + Возврат Найденные[0]; + КонецЕсли; + КонецЕсли; + Возврат Неопределено; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера + +&НаКлиентеНаСервереБезКонтекста +Функция НайтиПодсистемуПоСсылке(Форма, Ссылка) + Идентификатор = Форма.БыстрыйПоискПодсистемПоСсылке[Ссылка]; + Если Идентификатор <> Неопределено Тогда + Возврат Форма.ПодсистемыПрограммы.НайтиПоИдентификатору(Идентификатор); + Иначе + Найденные = Форма.ПодсистемыПрограммы.НайтиСтроки(Новый Структура("Ссылка", Ссылка)); + Если Найденные.Количество() = 1 Тогда + Возврат Найденные[0]; + КонецЕсли; + КонецЕсли; + Возврат Неопределено; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Вызов сервера @@ -525,8 +562,7 @@ ГруппаДляПереноса = ПодгруппаСНаименьшимКоличествомЭлементов(Элементы.БезГруппы); Иначе Элемент.Шрифт = ?(Вариант.Важный, ШрифтВажнойНадписи, Новый Шрифт); - Найденные = ПодсистемыПрограммы.НайтиСтроки(Новый Структура("Ссылка", Вариант.Подсистема)); - Подсистема = Найденные[0]; + Подсистема = НайтиПодсистемуПоСсылке(ЭтотОбъект, Вариант.Подсистема); ГруппаДляПереноса = Элементы.Найти(Подсистема.ИмяЭлемента + "_1"); Если ГруппаДляПереноса = Неопределено Тогда @@ -643,6 +679,7 @@ // Сброс номера последнего добавленного элемента. Для Каждого СтрокаТаблицы Из ПодсистемыПрограммы Цикл СтрокаТаблицы.НомерЭлемента = 0; + СтрокаТаблицы.ВидимыхВариантов = 0; КонецЦикла; // Заполнение панели отчетов @@ -718,10 +755,15 @@ Заголовок = Параметры.Заголовок; КонецЕсли; - ТекущийРазделПолноеИмя = "Подсистема." + СтрЗаменить(Параметры.ПутьКПодсистеме, ".", ".Подсистема."); + Если Параметры.ПутьКПодсистеме = ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы() Тогда + ТекущийРазделПолноеИмя = Параметры.ПутьКПодсистеме; + Иначе + ТекущийРазделПолноеИмя = "Подсистема." + СтрЗаменить(Параметры.ПутьКПодсистеме, ".", ".Подсистема."); + КонецЕсли; ВсеПодсистемы = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя(); ВсеРазделы = ВсеПодсистемы.Строки[0].Строки; + ПоискПодсистем = Новый Соответствие; Для Каждого СтрокаРаздел Из ВсеРазделы Цикл СтрокаТаблицы = ПодсистемыПрограммы.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокаРаздел); @@ -729,6 +771,8 @@ СтрокаТаблицы.НомерЭлемента = 0; СтрокаТаблицы.РазделСсылка = СтрокаРаздел.Ссылка; + ПоискПодсистем.Вставить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.ПолучитьИдентификатор()); + Если СтрокаРаздел.ПолноеИмя = ТекущийРазделПолноеИмя Тогда ТекущийРазделСсылка = СтрокаРаздел.Ссылка; Если ЗаголовокПереопределенКомандой Тогда @@ -747,6 +791,7 @@ СтрокаТаблицы.РодительСсылка = СтрокаДерева.Родитель.Ссылка; СтрокаТаблицы.РазделСсылка = СтрокаРаздел.Ссылка; + ПоискПодсистем.Вставить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.ПолучитьИдентификатор()); Если СтрокаДерева.ПолноеИмя = ТекущийРазделПолноеИмя Тогда ТекущийРазделСсылка = СтрокаДерева.Ссылка; Если ЗаголовокПереопределенКомандой Тогда @@ -767,6 +812,7 @@ КонецЕсли; КлючНазначенияИспользования = "Раздел_" + Строка(ТекущийРазделСсылка.УникальныйИдентификатор()); + БыстрыйПоискПодсистемПоСсылке = Новый ФиксированноеСоответствие(ПоискПодсистем); КонецПроцедуры &НаСервере @@ -859,18 +905,19 @@ КонецЦикла; КонецЕсли; + БыстрыйПоискВариантовПоИмениЭлемента = Новый ФиксированноеСоответствие(ПараметрыЗаполнения.ПоискВариантов); КонецПроцедуры &НаСервере Процедура ИнициализироватьПараметрыЗаполнения(ПараметрыЗаполнения) - ВыведеноЭлементовВариантов = 0; - ПараметрыЗаполнения.Вставить("ИмяГруппы", ""); ПараметрыЗаполнения.Вставить("ДобавляемыеРеквизиты", Новый Массив); ПараметрыЗаполнения.Вставить("ДобавленоПустыхДекораций", 0); ПараметрыЗаполнения.Вставить("ПределВывода", 20); ПараметрыЗаполнения.Вставить("ОсталосьВывести", ПараметрыЗаполнения.ПределВывода); ПараметрыЗаполнения.Вставить("НеВыведено", 0); + ПараметрыЗаполнения.Вставить("ВыведеноЭлементовВариантов", 0); + ПараметрыЗаполнения.Вставить("ПоискВариантов", Новый Соответствие); ШаблонГруппыВарианта = Новый Структура( "Вид, РастягиватьПоГоризонтали, @@ -1027,7 +1074,6 @@ | ИЛИ ПредопределенныеРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)) | И ВариантыОтчетов.ПредопределенныйВариант = ПредопределенныеРазмещение.Ссылка | И (ПредопределенныеРазмещение.Подсистема В (&МассивПодсистем)) - | И (ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ) | И (ВариантыОтчетов.Отчет В (&ОтчетыПользователя)) | И (НЕ ПредопределенныеРазмещение.Ссылка В (&ОтключенныеВариантыПрограммы)) |; @@ -1068,10 +1114,13 @@ | ИЛИ ВариантыРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)) | И (НЕ ВариантыРазмещение.Ссылка.ТолькоДляАвтора | ИЛИ ВариантыРазмещение.Ссылка.Автор = &ТекущийПользователь) - | И ВариантыРазмещение.Ссылка.ПометкаУдаления = ЛОЖЬ | И ВариантыРазмещение.Подсистема В(&МассивПодсистем) | И ВариантыРазмещение.Ссылка.Отчет В(&ОтчетыПользователя) | И НЕ ВариантыРазмещение.Ссылка.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) + | И НЕ(ВариантыРазмещение.Ссылка.Пользовательский + | И ВариантыРазмещение.Ссылка.ИнтерактивнаяПометкаУдаления) + | И НЕ(НЕ ВариантыРазмещение.Ссылка.Пользовательский + | И ВариантыРазмещение.Ссылка.ПометкаУдаления) |; | |//////////////////////////////////////////////////////////////////////////////// @@ -1102,7 +1151,7 @@ | И втПредопределенные.Подсистема = втВарианты.Подсистема |ГДЕ | НЕ(НЕ втВарианты.Использование = ИСТИНА - | И НЕ втВарианты.Использование ЕСТЬ NULL ) + | И НЕ втВарианты.Использование ЕСТЬ NULL) |; | |//////////////////////////////////////////////////////////////////////////////// @@ -1165,6 +1214,7 @@ Иначе ТаблицаПодсистем = ПодсистемыПрограммы.Выгрузить(); КонецЕсли; + ТаблицаПодсистем.Индексы.Добавить("Ссылка"); МассивПодсистем = ТаблицаПодсистем.ВыгрузитьКолонку("Ссылка"); ИспользоватьПодсветку = ЗначениеЗаполнено(СтрокаПоиска); @@ -1233,6 +1283,25 @@ ТаблицаРезультат = Запрос.Выполнить().Выгрузить(); ТаблицаРезультат.Колонки.Добавить("ВыводитсяВместеСОсновным", Новый ОписаниеТипов("Булево")); ТаблицаРезультат.Колонки.Добавить("КоличествоПодчиненных", Новый ОписаниеТипов("Число")); + ТаблицаРезультат.Индексы.Добавить("Ссылка"); + + ИдентификаторыОтчетов = Новый Массив; + Для Каждого СтрокаОтчета Из ТаблицаРезультат Цикл + Если Не СтрокаОтчета.Дополнительный Тогда + ИдентификаторыОтчетов.Добавить(СтрокаОтчета.Отчет); + КонецЕсли; + КонецЦикла; + + ОбъектыОтчетов = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыОтчетов); + Для Каждого ОтчетДляВывода Из ТаблицаРезультат Цикл + Если ОтчетДляВывода.ТипОтчета = Перечисления.ТипыОтчетов.Внутренний + Или ОтчетДляВывода.ТипОтчета = Перечисления.ТипыОтчетов.Расширение Тогда + МетаданныеОтчета = ОбъектыОтчетов[ОтчетДляВывода.Отчет]; + Если ОтчетДляВывода.ИмяОтчета <> МетаданныеОтчета.Имя Тогда + ОтчетДляВывода.ИмяОтчета = МетаданныеОтчета.Имя; + КонецЕсли; + КонецЕсли; + КонецЦикла; Если ИспользоватьПодсветку Тогда // Удаление записей о вариантах, связанных с подсистемами, если запись не фигурирует в связи. @@ -1526,10 +1595,14 @@ КонецЦикла; КонецЦикла; + ОписаниеТиповИдентификатора = Новый ОписаниеТипов; + ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовМетаданных"); + ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовРасширений"); + // Моделирование распределения вариантов с учетом вложенности подсистем. ДеревоРаспределения = Новый ДеревоЗначений; ДеревоРаспределения.Колонки.Добавить("Подсистема"); - ДеревоРаспределения.Колонки.Добавить("ПодсистемаСсылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + ДеревоРаспределения.Колонки.Добавить("ПодсистемаСсылка", ОписаниеТиповИдентификатора); ДеревоРаспределения.Колонки.Добавить("Варианты", Новый ОписаниеТипов("Массив")); ДеревоРаспределения.Колонки.Добавить("КоличествоВариантов", Новый ОписаниеТипов("Число")); ДеревоРаспределения.Колонки.Добавить("КоличествоПустыхСтрок", Новый ОписаниеТипов("Число")); @@ -1614,7 +1687,7 @@ ПорядокВывода.Колонки.Добавить("ЭтоПустаяСтрока", Новый ОписаниеТипов("Булево")); ПорядокВывода.Колонки.Добавить("СтрокаДерева"); ПорядокВывода.Колонки.Добавить("Подсистема"); - ПорядокВывода.Колонки.Добавить("ПодсистемаСсылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + ПорядокВывода.Колонки.Добавить("ПодсистемаСсылка", ОписаниеТиповИдентификатора); ПорядокВывода.Колонки.Добавить("ПодсистемаПриоритет", Новый ОписаниеТипов("Строка")); ПорядокВывода.Колонки.Добавить("Вариант"); ПорядокВывода.Колонки.Добавить("ВариантСсылка"); @@ -1776,6 +1849,7 @@ // Регистрация вариантов в текущей колонке / Довывод вариантов в новой колонке. ВариантовВыведено = 0; + ВидимыхВариантов = 0; Для Каждого Вариант Из СтрокаДерева.Варианты Цикл // СтрокаДерева.Варианты - это результат поиска по таблице значений. // Код рассчитан на то, что сортировка результата поиска не отличается от сортировки строк. @@ -1845,11 +1919,23 @@ КонецЕсли; ВариантовВыведено = ВариантовВыведено + 1; + Если Вариант.Видимость Тогда + ВидимыхВариантов = ВидимыхВариантов + 1; + КонецЕсли; // Учет строк, занятых вариантами. Рекурсия.СвободноСтрок = Рекурсия.СвободноСтрок - 1; КонецЦикла; + Если ВидимыхВариантов > 0 Тогда + ПодсистемаФормы = НайтиПодсистемуПоСсылке(ЭтотОбъект, СтрокаДерева.ПодсистемаСсылка); + ПодсистемаФормы.ВидимыхВариантов = ПодсистемаФормы.ВидимыхВариантов + ВидимыхВариантов; + Пока ПодсистемаФормы.Ссылка <> ПодсистемаФормы.РазделСсылка Цикл + ПодсистемаФормы = НайтиПодсистемуПоСсылке(ЭтотОбъект, ПодсистемаФормы.РазделСсылка); + ПодсистемаФормы.ВидимыхВариантов = ПодсистемаФормы.ВидимыхВариантов + ВидимыхВариантов; + КонецЦикла; + КонецЕсли; + КонецЕсли; // Регистрация вложенных строк. @@ -1965,11 +2051,11 @@ &НаСервере Функция ДобавитьГруппуСОтступом(ПараметрыЗаполнения, СтрокаПорядкаВывода, ВГруппу) - ВыведеноЭлементовВариантов = ВыведеноЭлементовВариантов + 1; + ПараметрыЗаполнения.ВыведеноЭлементовВариантов = ПараметрыЗаполнения.ВыведеноЭлементовВариантов + 1; - ГруппаОтступаИмя = "ГруппаОтступа_" + Формат(ВыведеноЭлементовВариантов, "ЧГ=0"); - КартинкаОтступаИмя = "КартинкаОтступа_" + Формат(ВыведеноЭлементовВариантов, "ЧГ=0"); - ГруппаВыводаИмя = "ГруппаВывода_" + Формат(ВыведеноЭлементовВариантов, "ЧГ=0"); + ГруппаОтступаИмя = "ГруппаОтступа_" + Формат(ПараметрыЗаполнения.ВыведеноЭлементовВариантов, "ЧГ=0"); + КартинкаОтступаИмя = "КартинкаОтступа_" + Формат(ПараметрыЗаполнения.ВыведеноЭлементовВариантов, "ЧГ=0"); + ГруппаВыводаИмя = "ГруппаВывода_" + Формат(ПараметрыЗаполнения.ВыведеноЭлементовВариантов, "ЧГ=0"); // Отступ. ГруппаОтступа = Элементы.Вставить(ГруппаОтступаИмя, Тип("ГруппаФормы"), ВГруппу); @@ -2089,6 +2175,8 @@ СтрокаТаблицы.ГруппаУровня2Имя = ПараметрыЗаполнения.ИмяГруппы; СтрокаТаблицы.НадписьИмя = НадписьИмя; + ПараметрыЗаполнения.ПоискВариантов.Вставить(НадписьИмя, СтрокаТаблицы.ПолучитьИдентификатор()); + Возврат Надпись; КонецФункции diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form index 54c90a593..5e991b4df 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form @@ -146,10 +146,6 @@ <key>ru</key> <value>Неразделенный режим</value> - - ru - Неразделенный режим - НеразделенныйРежимРасширеннаяПодсказка 45 @@ -277,10 +273,6 @@ ru Разделенный режим - - ru - Разделенный режим - РазделенныйРежимРасширеннаяПодсказка 48 @@ -303,6 +295,10 @@ true + + <key>ru</key> + <value>Режим работы</value> + РежимРаботыExtendedTooltip 44 @@ -724,6 +720,10 @@ true + + <key>ru</key> + <value>COM</value> + ГруппаCOMРасширеннаяПодсказка 62 @@ -842,6 +842,10 @@ true + + <key>ru</key> + <value>RAS</value> + ГруппаRASРасширеннаяПодсказка 64 @@ -863,6 +867,10 @@ true + + <key>ru</key> + <value>Тип подключения</value> + ГруппаТипПодключенияРасширеннаяПодсказка 86 diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl index 9da4d820c..f76bae3e4 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl @@ -17,7 +17,7 @@ Возврат; // Отказ устанавливается в ПриОткрытии. КонецЕсли; - ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); Если Параметры.ПараметрыАдминистрирования = Неопределено Тогда ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); @@ -97,7 +97,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не ЗначениеЗаполнено(АдминистраторИБ) Тогда Возврат; @@ -170,7 +170,6 @@ #Область СлужебныеПроцедурыИФункции -&НаСервере Функция ПроверитьЗаполнениеНаСервере() Возврат ПроверитьЗаполнение(); @@ -188,7 +187,7 @@ &НаСервере Процедура ПолучитьАдминистратораИБ(ПользовательИБ = Неопределено) - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если ЗначениеЗаполнено(АдминистраторИБ) Тогда @@ -214,7 +213,7 @@ ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Ложь); КонецЕсли; - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда ПроверитьПараметрыАдминистрированияФайловойБазы(); @@ -291,7 +290,7 @@ Если Параметры.ЗапрашиватьПараметрыАдминистрированияИБ Тогда // В базовых версиях проверку подключения не осуществляем. - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Или ПараметрыРаботыКлиента.ЭтоУчебнаяПлатформа Тогда diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form index 4cc55f871..e14cecf5d 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form @@ -175,12 +175,8 @@ <key>ru</key> - <value>Группа адрес сервера</value> + <value>Адрес сервера</value> - - ru - Группа адрес сервера - ГруппаАдресСервераExtendedTooltip 47 @@ -381,6 +377,10 @@ true + + <key>ru</key> + <value>Пользователь пароль</value> + ГруппаПользовательПарольРасширеннаяПодсказка 67 @@ -580,10 +580,6 @@ ru Дополнительные параметры - - ru - Группа дополнительных параметров - ГруппаДополнительныхПараметровExtendedTooltip 53 @@ -613,10 +609,6 @@ ru Настройка прокси сервера - - ru - Параметры прокси - ПараметрыПроксиExtendedTooltip 46 @@ -1109,6 +1101,7 @@ TextPicture + true DontUse Auto diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl index 1025d4c84..bdb511826 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl @@ -81,9 +81,12 @@ КонецЕсли; // Управление видимостью дополнительных элементов формы. - ФайловыйРежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый; Элементы.ГруппаПользовательПароль.Доступность = (ИспользоватьАутентификациюОС = 0); + Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + ТолькоПросмотр = Истина; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -308,7 +311,7 @@ Процедура ЗаписатьНастройкиПроксиСервераВИнформационнуюБазу(НастройкаПроксиНаКлиенте, НастройкаПроксиСервера) Если НастройкаПроксиНаКлиенте - ИЛИ ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый Тогда + Или ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкаПроксиСервера", "", НастройкаПроксиСервера); Иначе diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form index 08921623b..688d3d334 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Form.form +++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form @@ -207,12 +207,8 @@ <key>ru</key> - <value>Группа редактирование печатной формы</value> + <value>Редактирование печатной формы</value> - - ru - Группа редактирование печатной формы - ГруппаРедактированиеПечатнойФормыExtendedTooltip 156 @@ -287,7 +283,7 @@ <key>ru</key> - <value>Группа сохранить отправить</value> + <value>Сохранить отправить</value> ГруппаСохранитьОтправитьExtendedTooltip @@ -338,12 +334,8 @@ <key>ru</key> - <value>Группа навигация</value> + <value>Навигация</value> - - ru - Группа навигация - ГруппаНавигацияExtendedTooltip 161 @@ -556,10 +548,6 @@ ru Группа сохранить отправить - - ru - Группа сохранить отправить все действия - ГруппаСохранитьОтправитьВсеДействияРасширеннаяПодсказка 195 @@ -637,12 +625,8 @@ <key>ru</key> - <value>Группа редактирование макета</value> + <value>Редактирование макета</value> - - ru - Группа редактирование макета - ГруппаРедактированиеМакетаExtendedTooltip 163 @@ -664,10 +648,6 @@ ru Командная панель еще - - ru - Командная панель еще - КоманднаяПанельЕщеРасширеннаяПодсказка 193 @@ -691,7 +671,7 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> ГруппаКоманднаяПанельExtendedTooltip @@ -797,12 +777,8 @@ <key>ru</key> - <value>Группа дополнительная информация</value> + <value>Дополнительная информация</value> - - ru - Группа дополнительная информация - ГруппаДополнительнаяИнформацияРасширеннаяПодсказка 227 @@ -828,6 +804,10 @@ НастройкиПечатныхФорм 86 + + <key>ru</key> + <value>Настройки печатных форм</value> + true true @@ -1130,10 +1110,6 @@ ru Настройка комплекта - - ru - Группа настройка комплекта командная панель - ГруппаНастройкаКомплектаКоманднаяПанельРасширеннаяПодсказка 150 @@ -1388,12 +1364,8 @@ <key>ru</key> - <value>Группа настройка комплекта контекстное меню</value> + <value>Настройка комплекта контекстное меню</value> - - ru - Группа настройка комплекта контекстное меню - ГруппаНастройкаКомплектаКонтекстноеМенюExtendedTooltip 167 @@ -1455,9 +1427,6 @@ true true true - None - None - None true @@ -1479,10 +1448,6 @@ ТекущаяПечатнаяФорма None - - OnChange - ТекущаяПечатнаяФормаПриИзменении - ТекущаяПечатнаяФормаРасширеннаяПодсказка 213 @@ -1529,10 +1494,6 @@ ru Страница текущая печатная форма - - ru - Страница текущая печатная форма - СтраницаТекущаяПечатнаяФормаРасширеннаяПодсказка 210 @@ -1632,7 +1593,7 @@ <key>ru</key> - <value>Группа печатная форма недоступна</value> + <value>Печатная форма недоступна</value> ГруппаПечатнаяФормаНедоступнаExtendedTooltip @@ -1684,6 +1645,10 @@ true + + <key>ru</key> + <value>Страницы</value> + true СтраницыExtendedTooltip @@ -1707,7 +1672,7 @@ <key>ru</key> - <value>Группа печатные формы</value> + <value>Печатные формы</value> ГруппаПечатныеФормыExtendedTooltip @@ -2193,24 +2158,6 @@ - - ВыбранныйПринтер - - <key>ru</key> - <value>Выбранный принтер</value> - - 21 - - String - - - - true - - - true - - Отправить @@ -2502,6 +2449,7 @@ <use> <common>true</common> </use> + <shortcut>Alt+S</shortcut> <picture xsi:type="core:PictureRef"> <picture>CommonPicture.Сумма</picture> </picture> diff --git a/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html index 8860dc460..aecef947c 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html +++ b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html @@ -2,7 +2,8 @@ <p>Предназначена для просмотра, редактирования и печати сформированных печатных форм, а также для отправки печатной формы по электронной почте и сохранения в файл.</p> <p>Вызывается из документов и списков документов программы по команде <img src="StdPicture.Print" width="16" height="16"></img> <strong>Печать</strong>. </p> <p>Предусмотрены следующие возможности:</p> -<ul><li><strong>Печать документов</strong> - общая печатная форма для всех документов. +<ul><li><strong>Печать документов</strong> - общая печатная форма для всех документов; +</li><li><a href="#6">Печать документа со штампом визуализации электронной подписи</a>; </li><li><a href="#1">Печать комплекта</a>; </li><li><a href="#2">Настраиваемый комплект</a>.</li></ul><h3>Вывод на принтер</h3> <ul><li>Нажмите <strong>Печать</strong> для вывода нужного количества копий сформированной печатной формы на принтер.</li></ul><h3>Количество копий</h3> @@ -22,7 +23,19 @@ <div>Из предложенного списка выберите нужный документ, нажмите <strong>ОК</strong>.</div></li></ul><h3>Редактирование макета</h3> <ul><li>Нажмите <strong>Еще -</strong> <strong>Изменить макет</strong>, для того чтобы перейти к <a href="CommonForm.РедактированиеТабличногоДокумента/Help">редактированию макета</a> печатной формы. Печатная форма становится неактивной. После завершения редактирования печатная форма изменится автоматически.</li></ul><h3>Переход к списку макетов печатных форм</h3> <ul><li> -<div>Выполните команду меню <strong>Еще - Перейти к макетам печатных форм</strong>, для того чтобы открыть <a href="InformationRegister.ПользовательскиеМакетыПечати/Help">список макетов</a>.</div></li></ul><h3><a name="#1">Печать комплекта</a></h3> +<div>Выполните команду меню <strong>Еще - Перейти к макетам печатных форм</strong>, для того чтобы открыть <a href="InformationRegister.ПользовательскиеМакетыПечати/Help">список макетов</a>.</div></li></ul><h3><a name="#6">Печать документа со штампом визуализации электронной подписи</a></h3> +<p>Для добавления штампа визуализации электронной подписи в печатную форму выбранного документа:</p> +<ul><li> +<div>В списке документов выберите документ и нажмите кнопку <strong>Печать</strong>.</div> +</li><li> +<div>С помощью кнопки <strong>Сохранить</strong> присоедините печатную форму к документу, выбрав формат сохранения - <strong>Табличный(.mxl)</strong>.</div> +</li><li> +<div>В командной панели документа перейдите по гиперссылке <strong>Присоединенные файлы</strong>, выберите добавленный табличный документ и подпишите его электронной подписью.</div> +<ul><li> +<div>в контекстном меню выберите <strong>Электронная подпись и шифрование - Подписать</strong>, в поле <strong>Сертификат</strong> выберите нужный сертификат электронной подписи, введите пароль, нажмите <strong>Подписать</strong>.</div> +</li><li> +<div>в веб-клиенте на запрос расширения для работы с криптографией нажмите <strong>Да</strong>;</div></li></ul></li><li> +<div>По завершении подписи, оставаясь на этом же табличном документе, нажмите <strong>Печать - Со штампом электронной подписи</strong>.</div></li></ul><h3><a name="#1">Печать комплекта</a></h3> <ul><li>Программа позволяет распечатать комплект различных документов. Печатные формы комплекта выводятся на отдельных страницах, при этом можно просмотреть конкретную форму, выбирая из списка печатных форм слева нужную. Можно изменить количество <strong>Копий комплекта</strong>.</li></ul><h3><a name="#2">Настраиваемый комплект</a> </h3> <p>В программе предусмотрена возможность выборочной печати комплекта документов. </p> <ul><li>В окне <strong>Настраиваемый комплект</strong> слева находится панель настройки количества копий, которая состоит из столбцов: diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl index c73eae0a1..699c1db0f 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -52,7 +52,6 @@ ЕстьРазрешенныйВывод = ЕстьРазрешенныйВывод(); НастроитьВидимостьЭлементовФормы(ЕстьРазрешенныйВывод); УстановитьПризнакДоступностиВыводаВПредставленияхПечатныхФорм(ЕстьРазрешенныйВывод); - УстановитьПринтерВПечатныхФормах(); УстановитьИмяПринтераВПодсказкеКнопкиПечать(); УстановитьЗаголовокФормы(); Если ЭтоПечатьКомплекта() Тогда @@ -67,9 +66,9 @@ Если ТипЗнч(МассивСсылок) = Тип("Массив") И МассивСсылок.Количество() > 0 И ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок[0]) Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ЭлектронноеВзаимодействие.ОбменСКонтрагентами") Тогда - МодульОбменСКонтрагентамиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ОбменСКонтрагентамиКлиентСервер"); - МодульОбменСКонтрагентамиКлиентСервер.ПриВыводеНавигационнойСсылкиВФормеОбъектаИБ(ДополнительнаяИнформация, МассивСсылок); + Если ОбщегоНазначения.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда + МодульЭлектронноеВзаимодействие = ОбщегоНазначения.ОбщийМодуль("ЭлектронноеВзаимодействие"); + МодульЭлектронноеВзаимодействие.ПриВыводеНавигационнойСсылкиВФормеОбъектаИБ(ДополнительнаяИнформация, МассивСсылок); КонецЕсли; КонецЕсли; Элементы.ДополнительнаяИнформация.Заголовок = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(ДополнительнаяИнформация.Текст); @@ -84,8 +83,9 @@ Если ЗначениеЗаполнено(НастройкиФорматаСохранения) Тогда Отказ = Истина; // отказ от открытия формы СохранитьПечатнуюФормуВФайл(); + Возврат; КонецЕсли; - УстановитьТекущуюСтраницу(); + ПодключитьОбработчикОжидания("УстановитьТекущуюСтраницу", 0.1, Истина); КонецПроцедуры &НаКлиенте @@ -105,7 +105,7 @@ Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЗаписанныйОбъект); КонецЦикла; - Состояние(НСтр("ru = 'Сохранение успешно завершено.'")); + ПоказатьОповещениеПользователя(, , НСтр("ru = 'Сохранение завершено'"), БиблиотекаКартинок.Информация32); КонецЕсли; КонецЕсли; @@ -127,6 +127,23 @@ Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры) СписокВложений = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранныеПараметры); + + // Контроль уникальности имен. + ШаблонИмениФайла = "%1%2.%3"; + ИспользованныеИменаФайлов = Новый Соответствие; + Для Каждого Вложение Из СписокВложений Цикл + ИмяФайла = Вложение.Представление; + НомерИспользования = ?(ИспользованныеИменаФайлов[ИмяФайла] <> Неопределено, + ИспользованныеИменаФайлов[ИмяФайла] + 1, 1); + ИспользованныеИменаФайлов.Вставить(ИмяФайла, НомерИспользования); + Если НомерИспользования > 1 Тогда + Файл = Новый Файл(ИмяФайла); + ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, + Файл.ИмяБезРасширения, " (" + НомерИспользования + ")", Файл.Расширение); + КонецЕсли; + Вложение.Представление = ИмяФайла; + КонецЦикла; + Получатели = ПараметрыВывода.ПараметрыОтправки.Получатель; Если ВыбранныеПараметры.Свойство("Получатели") Тогда Получатели = ВыбранныеПараметры.Получатели; @@ -220,18 +237,9 @@ Если ТипЗнч(МассивСсылок) <> Тип("Массив") Тогда МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок); КонецЕсли; - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЭлектронноеВзаимодействие.ОбменСКонтрагентами") Тогда - МодульОбменСКонтрагентамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменСКонтрагентамиКлиент"); - МодульОбменСКонтрагентамиКлиент.ОбработкаНавигационнойСсылкиВФормеПечатиБСП(НавигационнаяСсылкаФорматированнойСтроки, МассивСсылок); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ТекущаяПечатнаяФормаПриИзменении(Элемент) - НастройкаПечатнойФормы = ТекущаяНастройкаПечатнойФормы(); - Если ВыбранныйПринтер <> ТекущаяПечатнаяФорма.ИмяПринтера Тогда - ВыбранныйПринтер = ТекущаяПечатнаяФорма.ИмяПринтера; - УстановитьИмяПринтераВПодсказкеКнопкиПечать(ВыбранныйПринтер); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда + МодульЭлектронноеВзаимодействиеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектронноеВзаимодействиеКлиент"); + МодульЭлектронноеВзаимодействиеКлиент.ОбработкаНавигационнойСсылкиВФормеПечатиБСП(НавигационнаяСсылкаФорматированнойСтроки, МассивСсылок); КонецЕсли; КонецПроцедуры @@ -269,7 +277,8 @@ &НаКлиенте Процедура НастройкиПечатныхФормПриАктивизацииСтроки(Элемент) - УстановитьТекущуюСтраницу(); + ОтключитьОбработчикОжидания("УстановитьТекущуюСтраницу"); + ПодключитьОбработчикОжидания("УстановитьТекущуюСтраницу", 0.1, Истина); КонецПроцедуры &НаКлиенте @@ -398,16 +407,15 @@ &НаСервере Функция СформироватьПечатныеФормы(ИменаМакетов, Отказ) - Результат = Неопределено; + Результат = Неопределено; // Формирование табличных документов. Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику(Параметры.ИсточникДанных, - Параметры.ПараметрыИсточника, Результат, ОбъектыПечати, ПараметрыВывода); - Иначе - Отказ = Истина; - КонецЕсли; + УправлениеПечатью.ПечатьПоВнешнемуИсточнику( + Параметры.ИсточникДанных, + Параметры.ПараметрыИсточника, + Результат, + ОбъектыПечати, + ПараметрыВывода); Иначе ТипыОбъектовПечати = Новый Массив; Параметры.ПараметрыПечати.Свойство("ТипыОбъектовПечати", ТипыОбъектовПечати); @@ -520,7 +528,7 @@ НовыйЭлемент.ПутьКДанным = ИмяРеквизита; НовыйЭлемент.Вывод = ВычислитьИспользованиеВывода(ОписаниеПечатнойФормы.ТабличныйДокумент); НовыйЭлемент.Редактирование = НовыйЭлемент.Вывод = ИспользованиеВывода.Разрешить И Не ОписаниеПечатнойФормы.ТабличныйДокумент.ТолькоПросмотр; - НовыйЭлемент.Защита = ОписаниеПечатнойФормы.ТабличныйДокумент.Защита; + НовыйЭлемент.Защита = ОписаниеПечатнойФормы.ТабличныйДокумент.Защита Или Не Пользователи.РолиДоступны("РедактированиеПечатныхФорм"); // Таблица настроек печатных форм (продолжение). НоваяНастройкаПечатнойФормы.ИмяСтраницы = ИмяСтраницы; @@ -646,31 +654,13 @@ КонецПроцедуры &НаСервере -Процедура УстановитьИмяПринтераВПодсказкеКнопкиПечать(ИмяПринтера = Неопределено) - Если НастройкиПечатныхФорм.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Если ИмяПринтера = Неопределено Тогда +Процедура УстановитьИмяПринтераВПодсказкеКнопкиПечать() + Если НастройкиПечатныхФорм.Количество() > 0 Тогда ИмяПринтера = ЭтотОбъект[НастройкиПечатныхФорм[0].ИмяРеквизита].ИмяПринтера; + Если Не ПустаяСтрока(ИмяПринтера) Тогда + ЭтотОбъект.Команды["Печать"].Подсказка = НСтр("ru = 'Напечатать на принтере'") + " (" + ИмяПринтера + ")"; + КонецЕсли; КонецЕсли; - - Если ПустаяСтрока(ИмяПринтера) Тогда - ИмяПринтера = НСтр("ru = 'Принтер по умолчанию'"); - КонецЕсли; - - ПодсказкаКнопкиПечать = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Напечатать на принтере (%1)'"), ИмяПринтера); - ЭтотОбъект.Команды["Печать"].Подсказка = ПодсказкаКнопкиПечать; -КонецПроцедуры - -&НаСервере -Процедура УстановитьПринтерВПечатныхФормах() - ВыбранныйПринтер = ЭтотОбъект[НастройкиПечатныхФорм[0].ИмяРеквизита].ИмяПринтера; - Для Индекс = 1 По НастройкиПечатныхФорм.Количество() - 1 Цикл - НастройкаПечатнойФормы = НастройкиПечатныхФорм[Индекс]; - ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ИмяПринтера = ВыбранныйПринтер; - КонецЦикла; КонецПроцедуры &НаСервере @@ -721,7 +711,6 @@ &НаСервере Процедура УстановитьТекущийТабличныйДокумент(ИмяРеквизита) ТекущаяПечатнаяФорма = ЭтотОбъект[ИмяРеквизита]; - ТекущаяПечатнаяФорма.ИмяПринтера = ВыбранныйПринтер; КонецПроцедуры &НаКлиенте @@ -771,9 +760,12 @@ КонецПроцедуры &НаСервере -Функция ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения) +Функция ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки) Перем ЗаписьZipФайла, ИмяАрхива; + НастройкиСохранения = НастройкиСохранения(); + ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки); + Результат = Новый Массив; // подготовка архива @@ -788,6 +780,7 @@ ИспользованныеИменаФайлов = Новый Соответствие; ВыбранныеФорматыСохранения = НастройкиСохранения.ФорматыСохранения; + ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит; ТаблицаФорматов = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента(); // сохранение печатных форм @@ -828,11 +821,16 @@ Если ИмяФайла = Неопределено Тогда ИмяФайла = ИмяФайлаПечатнойФормыПоУмолчанию(СоответствиеОбъектаПечатнойФорме.Ключ, НастройкаПечатнойФормы.Название); КонецЕсли; - ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение; - ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла); Иначе - ИмяФайла = ПолучитьИмяВременногоФайлаДляПечатнойФормы(НастройкаПечатнойФормы.Название,НастройкиФормата.Расширение,ИспользованныеИменаФайлов); + ИмяФайла = НастройкаПечатнойФормы.Название; КонецЕсли; + ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла); + + Если ПереводитьИменаФайловВТранслит Тогда + ИмяФайла = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ИмяФайла); + КонецЕсли; + + ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение; ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременнойПапки) + ИмяФайла); ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла); @@ -865,7 +863,7 @@ ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтотОбъект.УникальныйИдентификатор); ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива()); + ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит)); ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); Результат.Добавить(ОписаниеФайла); КонецЕсли; @@ -894,7 +892,7 @@ КонецЕсли; ТабличныйДокумент = ПечатнаяФорма.ПолучитьОбласть(Область.Верх, , Область.Низ); ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, - "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ФоноваяКартинка,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); + "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); Результат.Вставить(ОбъектПечати.Значение, ТабличныйДокумент); КонецЦикла; Возврат Результат; @@ -963,7 +961,7 @@ КонецФункции &НаСервере -Функция ПолучитьИмяФайлаДляАрхива() +Функция ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит) Результат = ""; @@ -987,6 +985,10 @@ КонецЕсли; КонецЦикла; + Если ПереводитьИменаФайловВТранслит Тогда + Результат = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Результат); + КонецЕсли; + Возврат Результат + ".zip"; КонецФункции @@ -994,9 +996,8 @@ &НаКлиенте Процедура СохранитьПечатнуюФормуВФайл() - ФорматыСохранения = Новый Массив; - ФорматыСохранения.Добавить(НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента); - НастройкиСохранения = Новый Структура("ФорматыСохранения,УпаковатьВАрхив", ФорматыСохранения, Ложь); + НастройкиСохранения = Новый Структура("ФорматыСохранения", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве( + НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента)); ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения); Для Каждого ФайлДляЗаписи Из ФайлыВоВременномХранилище Цикл @@ -1028,8 +1029,8 @@ ДвоичныеДанные.Записать(УникальноеИмяФайла(Папка + ФайлДляЗаписи.Представление)); КонецЦикла; - Состояние(НСтр("ru = 'Сохранение успешно завершено'"), , НСтр("ru = 'в папку:'") + " " + Папка); - + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение успешно завершено'"), "file:///" + Папка, НСтр("ru = 'в папку:'") + " " + Папка, БиблиотекаКартинок.Информация32); + КонецПроцедуры &НаКлиентеНаСервереБезКонтекста @@ -1053,8 +1054,8 @@ &НаСервере Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище, ОбъектДляПрисоединения) Результат = Новый Массив; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); Для Каждого Файл Из ФайлыВоВременномХранилище Цикл ПараметрыФайла = Новый Структура; ПараметрыФайла.Вставить("ВладелецФайлов", ОбъектДляПрисоединения); @@ -1063,7 +1064,7 @@ ПараметрыФайла.Вставить("РасширениеБезТочки", Неопределено); ПараметрыФайла.Вставить("ВремяИзменения", Неопределено); ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено); - Результат.Добавить(МодульПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл( + Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл( ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'"))); КонецЦикла; КонецЕсли; @@ -1309,7 +1310,7 @@ ПараметрыФормы = Новый Структура; ИмяОткрываемойФормы = "ОбщаяФорма.ВыборФорматаВложений"; Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") - И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда + И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда Если ПолучателейБольшеОдного(ПараметрыВывода.ПараметрыОтправки.Получатель) Тогда ПараметрыФормы.Вставить("Получатели", ПараметрыВывода.ПараметрыОтправки.Получатель); ИмяОткрываемойФормы = "ОбщаяФорма.ПодготовкаНовогоПисьма"; @@ -1320,30 +1321,6 @@ КонецПроцедуры -&НаСервере -Функция ПолучитьИмяВременногоФайлаДляПечатнойФормы(ИмяМакета, Расширение, ИспользованныеИменаФайлов) - - ШаблонИмениФайла = "%1%2.%3"; - - ИмяВременногоФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, ИмяМакета, "", Расширение)); - - НомерИспользования = ?(ИспользованныеИменаФайлов[ИмяВременногоФайла] <> Неопределено, - ИспользованныеИменаФайлов[ИмяВременногоФайла] + 1, - 1); - - ИспользованныеИменаФайлов.Вставить(ИмяВременногоФайла, НомерИспользования); - - // Если имя уже было ранее использовано, прибавляем счетчик в конце имени. - Если НомерИспользования > 1 Тогда - ИмяВременногоФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, ИмяМакета, " (" + НомерИспользования + ")", Расширение)); - КонецЕсли; - - Возврат ИмяВременногоФайла; - -КонецФункции - &НаСервере Функция ТабличныеДокументыДляПечати() ТабличныеДокументы = Новый СписокЗначений; @@ -1353,8 +1330,7 @@ ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита]; ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.Вывести(ПечатнаяФорма); - ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ФоноваяКартинка,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); - ТабличныйДокумент.ИмяПринтера = ВыбранныйПринтер; + ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); ТабличныйДокумент.КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество; ТабличныеДокументы.Добавить(ТабличныйДокумент, НастройкаПечатнойФормы.Представление); КонецЕсли; @@ -1385,4 +1361,14 @@ ПодключитьОбработчикОжидания("СохранитьНастройки", 2, Истина); КонецПроцедуры +&НаСервере +Функция НастройкиСохранения() + НастройкиСохранения = Новый Структура; + НастройкиСохранения.Вставить("ФорматыСохранения", Новый Массив); + НастройкиСохранения.Вставить("УпаковатьВАрхив", Ложь); + НастройкиСохранения.Вставить("ПереводитьИменаФайловВТранслит", Ложь); + Возврат НастройкиСохранения; +КонецФункции + #КонецОбласти + diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form index bfbd859fe..e465d4aa1 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form @@ -3,6 +3,10 @@ <items xsi:type="form:Table"> <name>Получатели</name> <id>43</id> + <title> + <key>ru</key> + <value>Получатели</value> + true true @@ -157,10 +161,6 @@ ru Получатели группа представление - - ru - Получатели группа представление - ПолучателиГруппаПредставлениеExtendedTooltip 76 @@ -234,10 +234,6 @@ ru Получатели группа пояснение - - ru - Получатели группа пояснение - ПолучателиГруппаПояснениеExtendedTooltip 79 @@ -264,10 +260,6 @@ ru Получатели группа - - ru - Получатели группа - ПолучателиГруппаExtendedTooltip 75 @@ -442,10 +434,6 @@ ru Получатели контекстное меню группа управление выбором - - ru - Получатели контекстное меню группа управление выбором - ПолучателиКонтекстноеМенюГруппаУправлениеВыборомExtendedTooltip 69 @@ -507,9 +495,6 @@ true true true - None - None - None true @@ -519,6 +504,10 @@ ВыбранныеФорматыСохранения 32 + + <key>ru</key> + <value>Выбранные форматы сохранения</value> + true true @@ -726,9 +715,6 @@ ВыбранныеФорматыСохранения.Picture - None - None - None true true @@ -739,10 +725,6 @@ ru Прикрепить печатную форму к письму в формате - - ru - Группа выбор форматов - ГруппаВыборФорматовExtendedTooltip 81 @@ -847,6 +829,45 @@ true + + ПереводитьИменаФайловВТранслит + 106 + true + true + + true + + + ПереводитьИменаФайловВТранслит + + Right + + ru + Сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Документ.txt" будет сохранен с именем "Document.txt". + + Button + + ПереводитьИменаФайловВТранслитРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ПереводитьИменаФайловВТранслитКонтекстноеМеню + 107 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -856,10 +877,6 @@ ru В форматах - - ru - Группа дополнительные параметры - ГруппаДополнительныеПараметрыExtendedTooltip 85 @@ -1183,6 +1200,26 @@ true + + ПереводитьИменаФайловВТранслит + + <key>ru</key> + <value>Транслитерировать имена файлов</value> + + 6 + + Boolean + + + true + + + true + + + ПереводитьИменаФайловВТранслит + + Подготовить diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl index 1ac5a5197..a85530638 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl @@ -52,6 +52,7 @@ Если ВыбранноеЗначение <> КодВозвратаДиалога.Отмена И ВыбранноеЗначение <> Неопределено Тогда УстановитьВыборФормата(ВыбранноеЗначение.ФорматыСохранения); УпаковатьВАрхив = ВыбранноеЗначение.УпаковатьВАрхив; + ПереводитьИменаФайловВТранслит = ВыбранноеЗначение.ПереводитьИменаФайловВТранслит; СформироватьПредставлениеВыбранныхФорматов(); КонецЕсли; @@ -201,6 +202,7 @@ Результат.Вставить("УпаковатьВАрхив", УпаковатьВАрхив); Результат.Вставить("ФорматыСохранения", ФорматыСохранения); Результат.Вставить("Получатели", ВыбранныеПолучатели()); + Результат.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); Возврат Результат; diff --git a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form index 8fb50ad96..ffa24bedf 100644 --- a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form +++ b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form @@ -216,10 +216,6 @@ <key>ru</key> <value>Настройки подключения к конечной точке</value> - - ru - Настройки подключения отправителя - НастройкиПодключенияОтправителяExtendedTooltip 27 @@ -454,10 +450,6 @@ ru Настройки подключения из конечной точки к этой информационной базе - - ru - Настройки подключения получателя - НастройкиПодключенияПолучателяExtendedTooltip 31 diff --git a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl index 25aa05ae6..a18ee8e66 100644 --- a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl +++ b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl @@ -41,8 +41,6 @@ &НаКлиенте Процедура ПодключитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт - Состояние(НСтр("ru = 'Выполняется подключение конечной точки. Пожалуйста, подождите...'")); - Отказ = Ложь; ОшибкаЗаполнения = Ложь; diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Form.form b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form similarity index 98% rename from SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Form.form rename to SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form index 2795df820..94d3542e1 100644 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Form.form +++ b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form @@ -167,6 +167,10 @@ true + + <key>ru</key> + <value>Справочная информация</value> + ГруппаСправочнаяИнформацияРасширеннаяПодсказка 161 @@ -194,7 +198,7 @@ <key>ru</key> - <value>Группа информация</value> + <value>Информация</value> ГруппаИнформацияРасширеннаяПодсказка diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html similarity index 100% rename from SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html rename to SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl similarity index 77% rename from SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl rename to SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl index 8a8a104e5..b0d3874cb 100644 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl +++ b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl @@ -4,7 +4,7 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) СистемнаяИнформация = Новый СистемнаяИнформация; ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - ПутьКФайлу = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); + ПутьКФайлу = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); КонецПроцедуры &НаКлиенте @@ -22,7 +22,7 @@ &НаКлиенте Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Оповещение = Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект); - Интеграция1СБухфонКлиент.ВыбратьФайл1СБухфон(Оповещение, ПутьКФайлу); + ВызовОнлайнПоддержкиКлиент.ВыбратьФайлВызовОнлайнПоддержки(Оповещение, ПутьКФайлу); КонецПроцедуры #КонецОбласти @@ -32,7 +32,7 @@ &НаКлиенте Процедура Сохранить(Команда) - ИдентификаторКлиента = Интеграция1СБухфонКлиент.ИдентификаторКлиента(); + ИдентификаторКлиента = ВызовОнлайнПоддержкиКлиент.ИдентификаторКлиента(); // Записывает путь к исполняемому файлу в регистр сведений. НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу); Закрыть(); @@ -52,7 +52,7 @@ &НаСервереБезКонтекста Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу) - Интеграция1СБухфон.СохранитьРасположениеИсполняемогоФайла1СБухфон(ИдентификаторКлиента, ПутьКФайлу); + ВызовОнлайнПоддержки.СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, ПутьКФайлу); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/ПоискИсполняемогоФайла1СБухфон.mdo b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo similarity index 66% rename from SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/ПоискИсполняемогоФайла1СБухфон.mdo rename to SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo index 33c86fd25..ec1082f33 100644 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/ПоискИсполняемогоФайла1СБухфон.mdo +++ b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo @@ -1,9 +1,9 @@ - ПоискИсполняемогоФайла1СБухфон + ПоискИсполняемогоФайлаОнлайнПоддержки ru - Поиск исполняемого файла 1С-Бухфон + Поиск исполняемого файла онлайн-поддержки diff --git a/SSL/src/CommonForms/ПоказателиВыделенныхЯчеек/Form.form b/SSL/src/CommonForms/ПоказателиВыделенныхЯчеек/Form.form index 3342be0ed..922ac7d06 100644 --- a/SSL/src/CommonForms/ПоказателиВыделенныхЯчеек/Form.form +++ b/SSL/src/CommonForms/ПоказателиВыделенныхЯчеек/Form.form @@ -46,6 +46,7 @@ 17 true true + true true true true @@ -92,6 +93,7 @@ 17 true true + true true true true @@ -138,6 +140,7 @@ 17 true true + true true true true @@ -184,6 +187,7 @@ 17 true true + true true true true @@ -230,6 +234,7 @@ 17 true true + true true true true @@ -305,6 +310,7 @@ 17 true true + true true true true @@ -335,7 +341,6 @@ NormalSeparation true true - Auto Auto diff --git a/SSL/src/CommonForms/ПользователиСервиса/Form.form b/SSL/src/CommonForms/ПользователиСервиса/Form.form index f72185e38..425dac027 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Form.form +++ b/SSL/src/CommonForms/ПользователиСервиса/Form.form @@ -3,6 +3,10 @@ ПользователиСервиса 1 + + <key>ru</key> + <value>Пользователи сервиса</value> + true true @@ -361,9 +365,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl index d818a8ab0..6850e701f 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl +++ b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl @@ -25,6 +25,7 @@ Если ПарольПользователяСервиса = Неопределено Тогда Отказ = Истина; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ЗапроситьПарольДляАутентификацииВСервисе", 0.1, Истина); Иначе ПодготовитьФорму(); @@ -115,13 +116,15 @@ &НаКлиенте Процедура ЗапроситьПарольДляАутентификацииВСервисе() - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("ПриОткрытииПродолжение", ЭтотОбъект)); КонецПроцедуры &НаКлиенте -Процедура ПриОткрытииПродолжение(НовыйПарольПользователяСервиса, Неопределен) Экспорт +Процедура ПриОткрытииПродолжение(НовыйПарольПользователяСервиса, Контекст) Экспорт Если НовыйПарольПользователяСервиса <> Неопределено Тогда ПарольПользователяСервиса = НовыйПарольПользователяСервиса; diff --git a/SSL/src/CommonForms/ПраваДоступа/Form.form b/SSL/src/CommonForms/ПраваДоступа/Form.form index 339391e71..e00ddfa0d 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Form.form +++ b/SSL/src/CommonForms/ПраваДоступа/Form.form @@ -41,6 +41,10 @@ ГруппыДоступа 1 + + <key>ru</key> + <value>Группы доступа</value> + true true @@ -436,14 +440,11 @@ true true true - None - None - None true - ГруппыДоступаОписаниеПредставление + ГруппыДоступаКомментарийПредставление 81 true true @@ -451,7 +452,7 @@ true - Items.ГруппыДоступа.CurrentData.Описание + Items.ГруппыДоступа.CurrentData.Комментарий Left @@ -459,7 +460,7 @@ Описание выбранной группы доступа - ГруппыДоступаОписаниеПредставлениеExtendedTooltip + ГруппыДоступаКомментарийПредставлениеРасширеннаяПодсказка 128 Label true @@ -469,7 +470,7 @@ - ГруппыДоступаОписаниеПредставлениеКонтекстноеМеню + ГруппыДоступаКомментарийПредставлениеКонтекстноеМеню 82 true @@ -624,6 +625,10 @@ Роли 85 + + <key>ru</key> + <value>Роли</value> + true true @@ -731,10 +736,6 @@ ru Роли колонок - - ru - Роли колонок - РолиКолонокExtendedTooltip 135 @@ -893,9 +894,6 @@ CommonPicture.ПиктограммыЭлементов - None - None - None true true @@ -933,10 +931,6 @@ ru Группы доступа и роли - - ru - Группы доступа и роли - ГруппыДоступаИРолиExtendedTooltip 117 @@ -1096,10 +1090,6 @@ ru Панель формы - - ru - Панель формы - ПанельФормыExtendedTooltip 113 @@ -1251,10 +1241,10 @@ - Описание + Комментарий <key>ru</key> - <value>Описание</value> + <value>Комментарий</value> 2 diff --git a/SSL/src/CommonForms/ПраваДоступа/Module.bsl b/SSL/src/CommonForms/ПраваДоступа/Module.bsl index 83953d300..615ef21b8 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступа/Module.bsl @@ -65,7 +65,7 @@ ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы"); ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ФормаВключитьВГруппу.Доступность = Ложь; Элементы.ФормаИсключитьИзГруппы.Доступность = Ложь; Элементы.ГруппыДоступаВключитьВГруппу.Доступность = Ложь; @@ -237,10 +237,10 @@ ДополнительныеПараметры.Вставить("ГруппаДоступа", ГруппаДоступа); ДополнительныеПараметры.Вставить("ВключитьВГруппуДоступа", ВключитьВГруппуДоступа); - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ГруппаДоступа = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения( "ВключитьИсключитьИзГруппыЗавершение", ЭтотОбъект, ДополнительныеПараметры), ЭтотОбъект, @@ -316,7 +316,7 @@ | ГруппыДоступа.Ссылка КАК ГруппаДоступа, | ГруппыДоступа.Наименование КАК Наименование, | ГруппыДоступа.Профиль.Наименование КАК ПрофильНаименование, - | ГруппыДоступа.Описание КАК Описание, + | ГруппыДоступа.Комментарий КАК Комментарий, | ГруппыДоступа.Ответственный КАК Ответственный |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа @@ -410,7 +410,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И ГруппаДоступа = Справочники.ГруппыДоступа.Администраторы И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда @@ -440,7 +440,7 @@ Если ГруппаДоступаОбъект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ГруппаДоступаОбъект.ДополнительныеСвойства.Вставить( "ПарольПользователяСервиса", ПарольПользователяСервиса); Иначе @@ -524,7 +524,7 @@ Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Роли.Роль.Имя КАК Роль + | Роли.Роль КАК Роль |ИЗ | Справочник.ПрофилиГруппДоступа.Роли КАК Роли | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи @@ -538,7 +538,7 @@ // Группа пользователей или Группа внешних пользователей. Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Роли.Роль.Имя КАК Роль + | Роли.Роль КАК Роль |ИЗ | Справочник.ПрофилиГруппДоступа.Роли КАК Роли | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи @@ -547,7 +547,8 @@ | И Роли.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль | И (НЕ Роли.Ссылка.ПометкаУдаления)"; КонецЕсли; - ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(), "ПрочитанныеРоли"); + + ОбработатьИнтерфейсРолей("ЗаполнитьРоли", Запрос.Выполнить().Выгрузить()); Отбор = Новый Структура("Роль", "ПолныеПрава"); Если ПрочитанныеРоли.НайтиСтроки(Отбор).Количество() > 0 Тогда diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form index c2441bca1..f8583d0a8 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form @@ -38,6 +38,10 @@ Профили 2 + + <key>ru</key> + <value>Профили</value> + true true @@ -249,9 +253,6 @@ true true true - None - None - None true @@ -616,9 +617,6 @@ true true true - None - None - None true @@ -660,6 +658,10 @@ ЗначенияДоступа 27 + + <key>ru</key> + <value>Значения доступа</value> + true true @@ -897,9 +899,6 @@ true true true - None - None - None true @@ -908,6 +907,10 @@ true + + <key>ru</key> + <value>Значения доступа по виду доступа</value> + ЗначенияДоступаПоВидуДоступаExtendedTooltip 91 @@ -936,6 +939,10 @@ true + + <key>ru</key> + <value>Доступ</value> + ДоступExtendedTooltip 82 @@ -968,10 +975,6 @@ ru Права и ограничения - - ru - Права и ограничения - 12 ПраваИОграниченияExtendedTooltip diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl index eee1efd50..5a18ae397 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl @@ -59,7 +59,7 @@ Элементы.Доступ.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); @@ -401,7 +401,7 @@ // Продолжение обработчика события ПередЗакрытием. &НаКлиенте -Процедура ЗаписатьИЗакрытьОповещение(Результат, Неопределен) Экспорт +Процедура ЗаписатьИЗакрытьОповещение(Результат, Контекст) Экспорт ЗаписатьИзменения(Новый ОписаниеОповещения("ЗаписатьИЗакрытьЗавершение", ЭтотОбъект)); @@ -409,7 +409,7 @@ // Продолжение обработчика события ПередЗакрытием. &НаКлиенте -Процедура ЗаписатьИЗакрытьЗавершение(Отказ, Неопределен) Экспорт +Процедура ЗаписатьИЗакрытьЗавершение(Отказ, Контекст) Экспорт Если Отказ Тогда Возврат; @@ -422,10 +422,10 @@ &НаКлиенте Процедура ЗаписатьИзменения(ОбработкаПродолжения = Неопределено) - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ТребуетсяСинхронизацияССервисом Тогда - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("ЗаписатьИзмененияЗавершение", ЭтотОбъект, ОбработкаПродолжения), ЭтотОбъект, ПарольПользователяСервиса); @@ -783,6 +783,7 @@ Если ЗначениеЗаполнено(Выборка.ПерсональнаяГруппаДоступа) Тогда ЗаблокироватьДанныеДляРедактирования(Выборка.ПерсональнаяГруппаДоступа); ГруппаДоступаОбъект = Выборка.ПерсональнаяГруппаДоступа.ПолучитьОбъект(); + ГруппаДоступаОбъект.ПометкаУдаления = Ложь; Иначе // Создание персональной группы доступа. ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент(); @@ -811,7 +812,7 @@ Если ОписаниеПользователя <> Неопределено Тогда ГруппаДоступаОбъект.Пользователи.Удалить(ОписаниеПользователя); - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда // Проверка пустого списка пользователей ИБ в группе доступа Администраторы. ОписаниеОшибки = ""; УправлениеДоступомСлужебный.ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы( diff --git a/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form b/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form index 908d00468..3c58d5d4c 100644 --- a/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form +++ b/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form @@ -153,12 +153,8 @@ <key>ru</key> - <value>Командная панель1</value> + <value>Командная панель 1</value> - - ru - Командная панель1 - КоманднаяПанель1РасширеннаяПодсказка 48 @@ -183,10 +179,6 @@ ru После обновления - - ru - После обновления - ПослеОбновленияРасширеннаяПодсказка 41 @@ -285,12 +277,8 @@ <key>ru</key> - <value>Командная панель2</value> + <value>Командная панель 2</value> - - ru - Командная панель2 - КоманднаяПанель2РасширеннаяПодсказка 59 @@ -315,10 +303,6 @@ ru После появления права - - ru - После появления права - ПослеПоявленияПраваРасширеннаяПодсказка 54 @@ -337,7 +321,7 @@ - ПередДобавлениемДОИО + ПередДобавлениемДополнительногоОтчетаИлиОбработки 68 Надпись3 @@ -445,12 +429,8 @@ <key>ru</key> - <value>Командная панель3</value> + <value>Командная панель 3</value> - - ru - Командная панель3 - КоманднаяПанель3РасширеннаяПодсказка 79 @@ -473,12 +453,8 @@ <key>ru</key> - <value>Колонки3</value> + <value>Колонки 3</value> - - ru - Колонки3 - Колонки3РасширеннаяПодсказка 74 @@ -505,14 +481,10 @@ <key>ru</key> - <value>Перед добавлением ДОИО</value> + <value>Перед добавлением дополнительного отчета или обработки</value> - - ru - Перед добавлением ДОИО - - ПередДобавлениемДОИОРасширеннаяПодсказка + ПередДобавлениемДополнительногоОтчетаИлиОбработкиРасширеннаяПодсказка 69 Label true @@ -637,12 +609,8 @@ <key>ru</key> - <value>Командная панель4</value> + <value>Командная панель 4</value> - - ru - Командная панель4 - КоманднаяПанель4РасширеннаяПодсказка 35 @@ -665,12 +633,8 @@ <key>ru</key> - <value>Колонки4</value> + <value>Колонки 4</value> - - ru - Колонки4 - Колонки4РасширеннаяПодсказка 30 @@ -699,10 +663,6 @@ ru Перед добавлением расширений - - ru - Перед добавлением расширений - ПередДобавлениемРасширенийРасширеннаяПодсказка 18 @@ -831,10 +791,6 @@ ru Командная панель4 - - ru - Командная панель4 - КоманднаяПанель8РасширеннаяПодсказка 161 @@ -859,10 +815,6 @@ ru Колонки4 - - ru - Колонки4 - Колонки8РасширеннаяПодсказка 159 @@ -1020,12 +972,8 @@ <key>ru</key> - <value>Командная панель5</value> + <value>Командная панель 5</value> - - ru - Командная панель5 - КоманднаяПанель5РасширеннаяПодсказка 119 @@ -1048,12 +996,8 @@ <key>ru</key> - <value>Колонки5</value> + <value>Колонки 5</value> - - ru - Колонки5 - Колонки5РасширеннаяПодсказка 114 @@ -1082,10 +1026,6 @@ ru Перед выбором роли - - ru - Перед выбором роли - ПередВыборомРолиРасширеннаяПодсказка 109 @@ -1140,6 +1080,7 @@ true Label + true true false @@ -1213,10 +1154,6 @@ ru Командная панель5 - - ru - Командная панель5 - КоманднаяПанель6РасширеннаяПодсказка 132 @@ -1241,10 +1178,6 @@ ru Колонки5 - - ru - Колонки5 - Колонки6РасширеннаяПодсказка 130 @@ -1273,10 +1206,6 @@ ru При изменении списка запрещенных расширений - - ru - При изменении списка запрещенных расширений - ПриИзмененииСпискаЗапрещенныхРасширенийРасширеннаяПодсказка 125 @@ -1364,6 +1293,7 @@ true Label + true true false @@ -1437,10 +1367,6 @@ ru Командная панель5 - - ru - Командная панель5 - КоманднаяПанель7РасширеннаяПодсказка 148 @@ -1465,10 +1391,6 @@ ru Колонки5 - - ru - Колонки5 - Колонки7РасширеннаяПодсказка 146 @@ -1497,10 +1419,6 @@ ru Перед открытием файла - - ru - Перед открытием файла - ПередОткрытиемФайлаРасширеннаяПодсказка 138 @@ -1518,6 +1436,186 @@ false + + ПередДобавлениемВнешнейКомпоненты + 166 + + ПредупрежденииПриДобавленииВнешнейКомпоненты + 168 + + <key>ru</key> + <value>При подключении внешней компоненты рекомендуется обращать +внимание на источник, из которого был получен файл компоненты. +Если вы не уверены в содержимом компоненты или в его источнике, +то компоненту не рекомендуется подключать к программе. + +См. также: <link http://1c.ru/news/info.jsp?id=21537>Пример проблемы с вирусом во внешней обработке</>. +</value> + + true + true + + true + + + ПредупрежденииПриДобавленииВнешнейКомпонентыРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + + ПредупрежденииПриДобавленииВнешнейКомпонентыКонтекстноеМеню + 169 + true + + true + Label + true + false + + Left + + + + Колонки9 + 171 + + КоманднаяПанель9 + 173 + + Продолжить9 + 175 + true + true + + true + + + Продолжить9РасширеннаяПодсказка + 176 + Label + true + true + + Left + + + Form.Command.Продолжить + Normal + Auto + true + true + UserCmds + Auto + + + Отмена9 + 177 + true + true + + true + + + Отмена9РасширеннаяПодсказка + 178 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель4</value> + + + КоманднаяПанель9РасширеннаяПодсказка + 174 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Колонки4</value> + + + Колонки9РасширеннаяПодсказка + 172 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Перед добавлением внешней компоненты</value> + + + ПередДобавлениемВнешнейКомпонентыРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + true true @@ -1527,10 +1625,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 16 diff --git a/SSL/src/CommonForms/ПредупреждениеБезопасности/Module.bsl b/SSL/src/CommonForms/ПредупреждениеБезопасности/Module.bsl index bb15be6e6..91acd3124 100644 --- a/SSL/src/CommonForms/ПредупреждениеБезопасности/Module.bsl +++ b/SSL/src/CommonForms/ПредупреждениеБезопасности/Module.bsl @@ -112,10 +112,17 @@ ЯОзнакомленНаСервере(); + // В модели сервиса право открытия внешних отчетов и обработок + // не используется для пользователей областей данных. + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.УстановитьПравоОткрытияВнешнихОтчетовИОбработок(РазрешитьИнтерактивноеОткрытие); КонецЕсли; + КонецПроцедуры &НаСервере diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form index 96ba2b9b3..e16cceaff 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form @@ -85,10 +85,6 @@ ru Верхняя группа - - ru - Верхняя группа - ВерхняяГруппаExtendedTooltip 33 diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl index 955b70d6d..070d1e8b0 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl @@ -12,9 +12,8 @@ Для Каждого Предупреждение Из Параметры.Предупреждения Цикл Ключ = Ключ + Предупреждение.ДействиеПриУстановленномФлажке.Форма + Предупреждение.ДействиеПриНажатииГиперссылки.Форма; КонецЦикла; - Хеш = Новый ХешированиеДанных(ХешФункция.MD5); - Хеш.Добавить(Ключ); - КлючСохраненияПоложенияОкна = "ПредупрежденияПриЗавершенииРаботы" + СтрЗаменить(Хеш.ХешСумма, " ", ""); + + КлючСохраненияПоложенияОкна = "ПредупрежденияПриЗавершенииРаботы" + ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Ключ); ИнициализироватьЭлементыВФорме(Параметры.Предупреждения); СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); diff --git a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form index 0ad82e924..f4acf681e 100644 --- a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form +++ b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form @@ -86,10 +86,6 @@ ru Тестовый режим - - ru - Тестовый режим - ТестовыйРежимРасширеннаяПодсказка 2 diff --git a/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl b/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl index ac3e3d31b..10dd61cb5 100644 --- a/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl +++ b/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl @@ -11,13 +11,13 @@ Элементы.ТестовыйРежим.Видимость = Истина; ЗаголовокТестовогоРежима = "{" + НСтр("ru = 'Тестирование'") + "} "; - ТекущийЗаголовок = ПолучитьЗаголовокКлиентскогоПриложения(); + ТекущийЗаголовок = КлиентскоеПриложение.ПолучитьЗаголовок(); Если СтрНачинаетсяС(ТекущийЗаголовок, ЗаголовокТестовогоРежима) Тогда Возврат; КонецЕсли; - УстановитьЗаголовокКлиентскогоПриложения(ЗаголовокТестовогоРежима + ТекущийЗаголовок); + КлиентскоеПриложение.УстановитьЗаголовок(ЗаголовокТестовогоРежима + ТекущийЗаголовок); ЗарегистрироватьОтключениеЛогикиНачалаРаботыСистемы(); diff --git a/SSL/src/CommonForms/Расширения/Form.form b/SSL/src/CommonForms/Расширения/Form.form index 06f41f3c9..e247c199a 100644 --- a/SSL/src/CommonForms/Расширения/Form.form +++ b/SSL/src/CommonForms/Расширения/Form.form @@ -131,10 +131,6 @@ ru Список расширений обновить и сохранить - - ru - Список расширений обновить и сохранить - СписокРасширенийОбновитьИСохранитьРасширеннаяПодсказка 97 @@ -197,13 +193,38 @@ - ФормаУдалитьКэшиРасширений + ФормаОбновитьКэшиРасширений + 159 + true + true + + + ФормаОбновитьКэшиРасширенийРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + Form.Command.ОбновитьКэшиРасширений + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаУдалитьУстаревшиеКэшиРасширений 131 true true - ФормаУдалитьКэшиРасширенийРасширеннаяПодсказка + ФормаУдалитьУстаревшиеКэшиРасширенийРасширеннаяПодсказка 132 Label true @@ -362,12 +383,8 @@ <key>ru</key> - <value>Группа предупреждение</value> + <value>Предупреждение</value> - - ru - Группа предупреждение - ГруппаПредупреждениеРасширеннаяПодсказка 79 @@ -471,7 +488,7 @@ <key>ru</key> - <value>Группа информация описание</value> + <value>Информация описание</value> ГруппаИнформацияОписаниеРасширеннаяПодсказка @@ -500,7 +517,7 @@ <key>ru</key> - <value>Группа информация</value> + <value>Информация</value> ГруппаИнформацияРасширеннаяПодсказка @@ -524,6 +541,10 @@ СписокРасширений 19 + + <key>ru</key> + <value>Список расширений</value> + true true @@ -710,6 +731,48 @@ Normal + + СписокРасширенийНазначение + 156 + true + true + + true + + + СписокРасширений.Назначение + + + СписокРасширенийНазначениеРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + + СписокРасширенийНазначениеКонтекстноеМеню + 157 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + СписокРасширенийКонтрольнаяСумма 98 @@ -764,6 +827,10 @@ СписокРасширений.БезопасныйРежимФлаг + + OnChange + СписокРасширенийБезопасныйРежимФлагПриИзменении + СписокРасширенийБезопасныйРежимФлагРасширеннаяПодсказка 52 @@ -870,10 +937,6 @@ Left true - - OnEditEnd - СписокРасширенийПриОкончанииРедактирования - BeforeAddRow СписокРасширенийПередНачаломДобавления @@ -1277,6 +1340,10 @@ true + + <key>ru</key> + <value>Страница длительная операция</value> + СтраницаДлительнаяОперацияРасширеннаяПодсказка 104 @@ -1314,6 +1381,10 @@ Pages + + OnCurrentPageChange + СтраницыОбновлениеПриСменеСтраницы + Auto @@ -1620,6 +1691,24 @@ true + + Назначение + + <key>ru</key> + <value>Назначение</value> + + 9 + + String + + + + true + + + true + + РасширенияИзменены @@ -1768,6 +1857,28 @@ DontUse Auto + + ОбновитьКэшиРасширений + + <key>ru</key> + <value>Обновить кэши расширений</value> + + 4 + + ru + Обновить версию параметров работы расширений, подключенных в этом сеансе. + + + true + + + + ОбновитьКэшиРасширений + + + DontUse + Auto + diff --git a/SSL/src/CommonForms/Расширения/Module.bsl b/SSL/src/CommonForms/Расширения/Module.bsl index 02394fe9a..4ce2fb9ab 100644 --- a/SSL/src/CommonForms/Расширения/Module.bsl +++ b/SSL/src/CommonForms/Расширения/Module.bsl @@ -16,7 +16,7 @@ НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.Расширения"; - УстановитьРежимРаботы(ЭтотОбъект, ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()); + УстановитьРежимРаботы(ЭтотОбъект, ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа. Обратитесь к администратору.'"); @@ -74,6 +74,22 @@ ЗавершитьРаботуСистемы(Ложь, Истина); КонецПроцедуры +&НаКлиенте +Процедура СтраницыОбновлениеПриСменеСтраницы(Элемент, ТекущаяСтраница) + + Если Элементы.СписокРасширенийДобавить.Доступность + И Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация Тогда + + Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений; + + ИначеЕсли Не Элементы.СписокРасширенийДобавить.Доступность + И Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений Тогда + + Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРасширений @@ -106,14 +122,14 @@ КонецПроцедуры &НаКлиенте -Процедура СписокРасширенийПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) +Процедура СписокРасширенийБезопасныйРежимФлагПриИзменении(Элемент) ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные; Если ТекущееРасширение = Неопределено Тогда Возврат; КонецЕсли; - - СписокРасширенийПриОкончанииРедактированияНаСервере(ТекущееРасширение.ПолучитьИдентификатор()); + + СписокРасширенийБезопасныйРежимФлагПриИзмененииНаСервере(ТекущееРасширение.ПолучитьИдентификатор()); КонецПроцедуры @@ -194,6 +210,17 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбновитьКэшиРасширений(Команда) + + ОбновитьКэшиРасширенийНаСервере(); + + ПоказатьПредупреждение(, + НСтр("ru = 'Выполнено обновление версии параметров работы расширений, + |подключенных в этом сеансе.'")); + +КонецПроцедуры + &НаКлиенте Процедура УдалитьУстаревшиеКэшиРасширений(Команда) @@ -230,7 +257,7 @@ &НаСервере Процедура ОбновитьСписок(ПослеДобавления = Ложь) - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СписокРасширений.Очистить(); Возврат; КонецЕсли; @@ -265,6 +292,7 @@ ЭлементРасширения.Версия = Расширение.Версия; ЭлементРасширения.КонтрольнаяСумма = Base64Строка(Расширение.ХешСумма); ЭлементРасширения.Синоним = Расширение.Синоним; + ЭлементРасширения.Назначение = Расширение.Назначение; ЭлементРасширения.БезопасныйРежим = Расширение.БезопасныйРежим; Если УстановленныеРасширенияДоступны Тогда @@ -347,6 +375,16 @@ КонецФункции +&НаСервере +Процедура ОбновитьКэшиРасширенийНаСервере() + + УстановитьПривилегированныйРежим(Истина); + + РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений(); + РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений(); + +КонецПроцедуры + &НаСервере Процедура УдалитьУстаревшиеКэшиРасширенийНаСервере() @@ -368,9 +406,9 @@ Оповещение = Новый ОписаниеОповещения("УдалитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст); Если ВыделенныеСтроки.Количество() > 1 Тогда - ТекстВопроса = НСтр("ru = 'Вы уверены, что хотите удалить выделенные расширения?'", "ru"); + ТекстВопроса = НСтр("ru = 'Удалить выделенные расширения?'", "ru"); Иначе - ТекстВопроса = НСтр("ru = 'Вы уверены, что хотите удалить расширение?'", "ru"); + ТекстВопроса = НСтр("ru = 'Удалить расширение?'", "ru"); КонецЕсли; ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); @@ -379,15 +417,21 @@ &НаКлиенте Процедура УдалитьРасширениеПослеПодтверждения(Результат, Контекст) Экспорт - + Если Результат = КодВозвратаДиалога.Да Тогда - Запросы = ЗапросНаОтменуРазрешенийИспользованияВнешнегоМодуля(Контекст.ВыделенныеСтроки); + Обработчик = Новый ОписаниеОповещения("УдалитьРасширениеПродолжение", ЭтотОбъект, Контекст); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = ЗапросНаОтменуРазрешенийИспользованияВнешнегоМодуля(Контекст.ВыделенныеСтроки); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, Обработчик); + Иначе + ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК); + КонецЕсли; - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, - ЭтотОбъект, Новый ОписаниеОповещения("УдалитьРасширениеПродолжение", ЭтотОбъект, Контекст)); КонецЕсли; - + КонецПроцедуры &НаКлиенте @@ -406,16 +450,15 @@ Контекст = ТекущийКонтекст; - ПоказатьДлительнуюОперацию(); Попытка УдалитьРасширенияНаСервере(Контекст.ВыделенныеСтроки); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - СкрытьДлительнуюОперацию(); + ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; - СкрытьДлительнуюОперацию(); + ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); КонецПроцедуры @@ -498,15 +541,16 @@ Функция ЗапросНаОтменуРазрешенийИспользованияВнешнегоМодуля(ВыделенныеСтроки) Разрешения = Новый Массив; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл ТекущееРасширение = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки); - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( ТекущееРасширение.Имя, ТекущееРасширение.КонтрольнаяСумма)); КонецЦикла; Запросы = Новый Массив; - Запросы.Добавить(РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов( + Запросы.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов( ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений"), Разрешения)); @@ -517,32 +561,33 @@ &НаКлиенте Процедура ПоказатьДлительнуюОперацию() - Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; Элементы.СписокРасширенийДобавить.Доступность = Ложь; Элементы.СписокРасширенийУдалить.Доступность = Ложь; + Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; КонецПроцедуры &НаКлиенте Процедура СкрытьДлительнуюОперацию() - Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений; Элементы.СписокРасширенийДобавить.Доступность = Истина; Элементы.СписокРасширенийУдалить.Доступность = Истина; + Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений; КонецПроцедуры &НаКлиенте -Процедура ЗагрузитьРасширение(ИдентификаторРасширения, МножественныйВыбор = Ложь) +Процедура ЗагрузитьРасширение(Знач ИдентификаторРасширения, МножественныйВыбор = Ложь) + Контекст = Новый Структура; Контекст.Вставить("ИдентификаторРасширения", ИдентификаторРасширения); Контекст.Вставить("МножественныйВыбор", МножественныйВыбор); - Обработчик = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст); ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемРасширений"); ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Обработчик); + КонецПроцедуры &НаКлиенте @@ -553,6 +598,7 @@ Обработчик = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеУстановкиРасширения", ЭтотОбъект, Контекст); ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + КонецПроцедуры &НаКлиенте @@ -609,9 +655,14 @@ ОповещениеОЗакрытии = Новый ОписаниеОповещения( "ЗагрузитьРасширениеПродолжение", ЭтотОбъект, Контекст); - - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ЗапросыРазрешений, ЭтотОбъект, ОповещениеОЗакрытии); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + ЗапросыРазрешений, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецПроцедуры @@ -639,13 +690,13 @@ Контекст.ИдентификаторРасширения, НеподключенныеРасширения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - СкрытьДлительнуюОперацию(); + ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'После добавления, при подготовке расширений к работе, произошла ошибка: |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); Возврат; КонецПопытки; - СкрытьДлительнуюОперацию(); + ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); Если Не РасширенияИзменены Тогда Возврат; @@ -771,9 +822,9 @@ КонецПроцедуры &НаСервере -Процедура СписокРасширенийПриОкончанииРедактированияНаСервере(ИдентификаторРасширения) +Процедура СписокРасширенийБезопасныйРежимФлагПриИзмененииНаСервере(ИдентификаторСтроки) - СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторРасширения); + СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки); Если СтрокаСписка = Неопределено Тогда Возврат; @@ -805,6 +856,7 @@ Функция ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, ИдентификаторРасширения = Неопределено) Разрешения = Новый Массив; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл НачатьТранзакцию(); @@ -824,7 +876,7 @@ Если ИдентификаторРасширения = Неопределено Тогда ВременноеРасширение.Удалить(); КонецЕсли; - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( ВременноеРасширение.Имя, Base64Строка(ВременноеРасширение.ХешСумма))); ЗафиксироватьТранзакцию(); @@ -836,11 +888,11 @@ УстановленныеРасширения = РасширенияКонфигурации.Получить(); Для Каждого Расширение Из УстановленныеРасширения Цикл - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( Расширение.Имя, Base64Строка(Расширение.ХешСумма))); КонецЦикла; - ЗапросыРазрешений.Добавить(РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, + ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений"))); Возврат Истина; @@ -869,7 +921,7 @@ КонецПопытки; Отбор = Новый Структура("УникальныйИдентификатор", ФоновоеЗадание.УникальныйИдентификатор); ФоновоеЗадание = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор)[0]; - Если ИнформацияОбОшибке <> Неопределено Тогда + Если ИнформацияОбОшибке = Неопределено Тогда ИнформацияОбОшибке = ФоновоеЗадание.ИнформацияОбОшибке; КонецЕсли; Исключение @@ -898,7 +950,7 @@ &НаСервере Процедура ПроверитьДоступностьРазделенныхДанных() - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ВызватьИсключение НСтр("ru = 'Расширения недоступны в неразделенном режиме.'"); КонецЕсли; diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form b/SSL/src/CommonForms/РедактированиеГиперссылки/Form.form similarity index 52% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form rename to SSL/src/CommonForms/РедактированиеГиперссылки/Form.form index d32288405..645c28991 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form +++ b/SSL/src/CommonForms/РедактированиеГиперссылки/Form.form @@ -1,20 +1,19 @@ - Информация - 5 + Ссылка + 1 true true true - Информация + Ссылка - None - ИнформацияExtendedTooltip - 9 + СсылкаРасширеннаяПодсказка + 3 Label true true @@ -23,37 +22,39 @@ - ИнформацияКонтекстноеМеню - 6 + СсылкаКонтекстноеМеню + 2 true - LabelField + InputField Enter true Left true - - 75 + true - 3 true + true + true + true + true + Normal - ПрименитьКоВсем - 3 + Представление + 4 true true true - ПрименитьКоВсем + Представление - Right - ПрименитьКоВсемExtendedTooltip - 10 + ПредставлениеРасширеннаяПодсказка + 6 Label true true @@ -62,16 +63,24 @@ - ПрименитьКоВсемКонтекстноеМеню - 4 + ПредставлениеКонтекстноеМеню + 5 true - CheckBoxField + InputField Enter true Left true - + + true + true + true + true + true + true + Normal + Bottom true @@ -79,43 +88,15 @@ ФормаКоманднаяПанель -1 - Да - 1 + ФормаКнопкаОк + 7 true true true - false - ДаExtendedTooltip - 7 - Label - true - true - - Left - - - Form.Command.Да - Auto - true - true - true - UserCmds - Auto - - - Нет - 2 - true - true - - true - - false - - НетExtendedTooltip + ФормаКнопкаОкРасширеннаяПодсказка 8 Label true @@ -124,7 +105,33 @@ Left - Form.Command.Нет + Form.Command.КнопкаОк + Auto + true + true + true + UserCmds + Auto + + + ФормаКнопкаОтмена + 9 + true + true + + true + + + ФормаКнопкаОтменаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.КнопкаОтмена Normal Auto true @@ -133,29 +140,39 @@ Auto Right - true + + OnOpen + ПриОткрытии + OnCreateAtServer ПриСозданииНаСервере + 50 LockOwner true + true true Vertical true + true true auto true - ПрименитьКоВсем + Ссылка <key>ru</key> - <value>Применить ко всем</value> + <value>Ссылка</value> 1 - Boolean + String + AnyRef + + 1024 + true @@ -163,12 +180,13 @@ true + true - Информация + Представление <key>ru</key> - <value>Информация</value> + <value>Представление</value> 2 @@ -181,51 +199,150 @@ true + true - - Да + + ПараметрВыбора <key>ru</key> - <value>Да</value> + <value>Параметр выбора</value> + + 3 + + + true + + + true + + + + СтрокаСсылочногоТипа + + <key>ru</key> + <value>Строка ссылочного типа</value> + + 4 + + Boolean + + + true + + + true + + + + ВозвращаемоеЗначение + + <key>ru</key> + <value>Возвращаемое значение</value> + + 5 + + + true + + + true + + + + КнопкаОк + + <key>ru</key> + <value>ОК</value> 1 ru - Да + Применить настройки true - Да + КнопкаОк DontUse Auto - Нет + КнопкаОтмена <key>ru</key> - <value>Нет</value> + <value>Отмена</value> 2 - - ru - Нет - true - Нет + КнопкаОтмена DontUse Auto + + СтрокаСсылочногоТипа + + Boolean + + + + ИмяРеквизита + + String + + + + + ИмяРеквизитаСсылки + + String + + + + + Свойство + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + ВладелецДополнительныхЗначений + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + ТипЗначения + + TypeDescription + + + + НаименованиеРеквизита + + String + + + + + ТолькоПросмотр + + Boolean + + + + ЗначениеРеквизита + + diff --git a/SSL/src/CommonForms/РедактированиеГиперссылки/Module.bsl b/SSL/src/CommonForms/РедактированиеГиперссылки/Module.bsl new file mode 100644 index 000000000..f309d700e --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеГиперссылки/Module.bsl @@ -0,0 +1,102 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ЭтотОбъект.ТолькоПросмотр = Параметры.ТолькоПросмотр; + + Элементы.Ссылка.ОграничениеТипа = Параметры.ТипЗначения; + СтрокаСсылочногоТипа = Параметры.СтрокаСсылочногоТипа; + Элементы.Представление.Видимость = СтрокаСсылочногоТипа; + Элементы.Ссылка.Заголовок = Параметры.НаименованиеРеквизита; + + КлючИспользования = ?(СтрокаСсылочногоТипа, "РедактированиеСтроки", "РедактированиеСсылочногоОбъекта"); + СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, КлючИспользования); + + Если Не Параметры.СтрокаСсылочногоТипа + И УправлениеСвойствамиСлужебный.ТипЗначенияСодержитЗначенияСвойств(Параметры.ТипЗначения) Тогда + ПараметрВыбора = ?(ЗначениеЗаполнено(Параметры.ВладелецДополнительныхЗначений), + Параметры.ВладелецДополнительныхЗначений, Параметры.Свойство); + КонецЕсли; + + ВозвращаемоеЗначение = Новый Структура; + ВозвращаемоеЗначение.Вставить("ИмяРеквизита", Параметры.ИмяРеквизита); + ВозвращаемоеЗначение.Вставить("СтрокаСсылочногоТипа", СтрокаСсылочногоТипа); + Если Параметры.СтрокаСсылочногоТипа Тогда + ВозвращаемоеЗначение.Вставить("ИмяРеквизитаСсылки", Параметры.ИмяРеквизитаСсылки); + + СсылкаИПредставление = УправлениеСвойствамиСлужебный.АдресИПредставление(Параметры.ЗначениеРеквизита); + Ссылка = СсылкаИПредставление.Ссылка; + Представление = СсылкаИПредставление.Представление; + Иначе + Ссылка = Параметры.ЗначениеРеквизита; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ПараметрВыбора = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыВыбораМассив = Новый Массив; + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ПараметрВыбора)); + + Элементы.Ссылка.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура КнопкаОк(Команда) + Если СтрокаСсылочногоТипа Тогда + Шаблон = "%2"; + Если Не ЗначениеЗаполнено(Представление) Тогда + Представление = Ссылка; + КонецЕсли; + РезультатСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Ссылка, Представление); + РезультатФорматированнаяСтрока = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(РезультатСтрока); + Если Не ЗначениеЗаполнено(Ссылка) Тогда + Значение = ""; + ВозвращаемоеЗначение.Вставить("ФорматированнаяСтрока", ПустаяФорматированнаяСтрока()); + Иначе + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Ссылка, Представление); + ВозвращаемоеЗначение.Вставить("ФорматированнаяСтрока", СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(Значение)); + КонецЕсли; + Иначе + Значение = Ссылка; + КонецЕсли; + + ВозвращаемоеЗначение.Вставить("Значение", Значение); + Закрыть(ВозвращаемоеЗначение); +КонецПроцедуры + +&НаКлиенте +Процедура КнопкаОтмена(Команда) + Закрыть(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Функция ПустаяФорматированнаяСтрока() + ПредставлениеЗначения= НСтр("ru = 'не задано'"); + СсылкаРедактирования = "НеЗадано"; + Результат = Новый ФорматированнаяСтрока(ПредставлениеЗначения,, ЦветаСтиля.ЦветПустойГиперссылки,, СсылкаРедактирования); + + Возврат Результат; +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборПолучателейСообщения/ВыборПолучателейСообщения.mdo b/SSL/src/CommonForms/РедактированиеГиперссылки/РедактированиеГиперссылки.mdo similarity index 57% rename from SSL/src/CommonForms/ВыборПолучателейСообщения/ВыборПолучателейСообщения.mdo rename to SSL/src/CommonForms/РедактированиеГиперссылки/РедактированиеГиперссылки.mdo index feddbd6a0..a2ec78b99 100644 --- a/SSL/src/CommonForms/ВыборПолучателейСообщения/ВыборПолучателейСообщения.mdo +++ b/SSL/src/CommonForms/РедактированиеГиперссылки/РедактированиеГиперссылки.mdo @@ -1,9 +1,9 @@ - - ВыборПолучателейСообщения + + РедактированиеГиперссылки ru - Выбор получателей сообщения + Редактирование гиперссылки PersonalComputer MobileDevice diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form index 02442f651..7df701860 100644 --- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form +++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form @@ -7,6 +7,10 @@ ТаблицаЗначенийСвойств 3 + + <key>ru</key> + <value>Таблица значений свойств</value> + true true @@ -114,6 +118,10 @@ true + + <key>ru</key> + <value>Таблица значений свойств картинка и свойство</value> + true false @@ -311,9 +319,6 @@ Auto true true - None - None - None true @@ -579,6 +584,23 @@ true + + ВладелецДополнительныхЗначений + + <key>ru</key> + <value>Владелец дополнительных значений</value> + + 8 + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + true + + + true + + ДоступныеНаборыСвойств diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl index 0646f5888..6b52fcd35 100644 --- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl @@ -98,7 +98,9 @@ ПараметрыВыбораМассив = Новый Массив; Если Строка.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Или Строка.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектовИерархия")) Тогда - ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", Строка.Свойство)); + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", + ?(ЗначениеЗаполнено(Строка.ВладелецДополнительныхЗначений), + Строка.ВладелецДополнительныхЗначений, Строка.Свойство))); КонецЕсли; Элементы.ТаблицаЗначенийСвойствЗначение.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); КонецПроцедуры @@ -170,7 +172,7 @@ // Заполнение дерева значениями свойств. Если ИзОбработчикаПриСоздании Тогда - ЗначенияСвойств = ПрочитатьЗначенияСвойствИзРегистраСведений(); + ЗначенияСвойств = ПрочитатьЗначенияСвойствИзРегистраСведений(Параметры.Ссылка); Иначе ЗначенияСвойств = ПолучитьТекущиеЗначенияСвойств(); ТаблицаЗначенийСвойств.Очистить(); @@ -214,12 +216,14 @@ // Запись значений свойств в регистр сведений. ЗначенияСвойств = Новый Массив; - Для каждого Строка Из ТаблицаЗначенийСвойств Цикл + Для Каждого Строка Из ТаблицаЗначенийСвойств Цикл Значение = Новый Структура("Свойство, Значение", Строка.Свойство, Строка.Значение); ЗначенияСвойств.Добавить(Значение); КонецЦикла; - ЗаписатьНаборСвойствВРегистр(СсылкаНаОбъект, ЗначенияСвойств); + Если ЗначенияСвойств.Количество() > 0 Тогда + ЗаписатьНаборСвойствВРегистр(СсылкаНаОбъект, ЗначенияСвойств); + КонецЕсли; Модифицированность = Ложь; @@ -228,26 +232,34 @@ &НаСервереБезКонтекста Процедура ЗаписатьНаборСвойствВРегистр(Знач Ссылка, Знач ЗначенияСвойств) + УстановитьПривилегированныйРежим(Истина); + + Набор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); + Набор.Отбор.Объект.Установить(Ссылка); + Набор.Прочитать(); + ТекущиеЗначения = Набор.Выгрузить(); Для Каждого Строка Из ЗначенияСвойств Цикл - Набор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); - Набор.Отбор.Объект.Установить(Ссылка); - Набор.Отбор.Свойство.Установить(Строка.Свойство); - - Если ЗначениеЗаполнено(Строка.Значение) - И Строка.Значение <> Ложь Тогда - Запись = Набор.Добавить(); + Запись = ТекущиеЗначения.Найти(Строка.Свойство, "Свойство"); + Если Запись = Неопределено Тогда + Запись = ТекущиеЗначения.Добавить(); Запись.Свойство = Строка.Свойство; Запись.Значение = Строка.Значение; Запись.Объект = Ссылка; КонецЕсли; + Запись.Значение = Строка.Значение; - Набор.Записать(); + Если Не ЗначениеЗаполнено(Запись.Значение) + Или Запись.Значение = Ложь Тогда + ТекущиеЗначения.Удалить(Запись); + КонецЕсли; КонецЦикла; + Набор.Загрузить(ТекущиеЗначения); + Набор.Записать(); КонецПроцедуры -&НаСервере -Функция ПрочитатьЗначенияСвойствИзРегистраСведений() +&НаСервереБезКонтекста +Функция ПрочитатьЗначенияСвойствИзРегистраСведений(Ссылка) Запрос = Новый Запрос; Запрос.Текст = @@ -258,7 +270,7 @@ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения |ГДЕ | ДополнительныеСведения.Объект = &Объект"; - Запрос.УстановитьПараметр("Объект", Параметры.Ссылка); + Запрос.УстановитьПараметр("Объект", Ссылка); Возврат Запрос.Выполнить().Выгрузить(); diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form index 75f6738fa..9dd215cfb 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form @@ -124,10 +124,6 @@ ru Действия с документом - - ru - Действия с документом - ДействияСДокументомExtendedTooltip 95 @@ -233,10 +229,6 @@ ru Действия с группами - - ru - Действия с группами - ДействияСГруппамиExtendedTooltip 135 @@ -284,10 +276,6 @@ ru Все действия - - ru - Все действия - ВсеДействияExtendedTooltip 134 @@ -397,10 +385,6 @@ ru Шрифт - - ru - Шрифт - ШрифтExtendedTooltip 101 @@ -533,10 +517,6 @@ ru Начертание - - ru - Начертание - НачертаниеExtendedTooltip 105 @@ -669,10 +649,6 @@ ru Выравнивание - - ru - Выравнивание - ВыравниваниеExtendedTooltip 113 @@ -778,10 +754,6 @@ ru Цвет - - ru - Цвет - ЦветExtendedTooltip 110 @@ -803,10 +775,6 @@ ru Форматирование текста - - ru - Форматирование текста - ФорматированиеТекстаExtendedTooltip 100 @@ -1128,10 +1096,6 @@ ru Границы - - ru - Границы - ГраницыExtendedTooltip 118 @@ -1190,10 +1154,6 @@ ru Действия с ячейками - - ru - Действия с ячейками - ДействияСЯчейкамиExtendedTooltip 130 @@ -1215,10 +1175,6 @@ ru Команды редактирования - - ru - Команды редактирования - КомандыРедактированияExtendedTooltip 99 @@ -1268,10 +1224,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 94 diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl index d5fdb37a3..ee93636b4 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl @@ -40,6 +40,9 @@ ИмяДокумента = Параметры.ИмяДокумента; КонецЕсли; + Элементы.ТабличныйДокумент.ОтображатьИменаСтрокИКолонок = ТабличныйДокумент.Макет; + Элементы.ТабличныйДокумент.ОтображатьИменаЯчеек = ТабличныйДокумент.Макет; + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/CommonForms/Сервис1СКонтрагентНеПодключен/Form.form b/SSL/src/CommonForms/Сервис1СКонтрагентНеПодключен/Form.form index 97069fb1f..6376a81df 100644 --- a/SSL/src/CommonForms/Сервис1СКонтрагентНеПодключен/Form.form +++ b/SSL/src/CommonForms/Сервис1СКонтрагентНеПодключен/Form.form @@ -120,10 +120,6 @@ ru Левая колонка - - ru - Левая колонка - ГруппаЛеваяКолонкаРасширеннаяПодсказка 4 @@ -204,10 +200,6 @@ ru Колонки - - ru - Колонки - ГруппаКолонкиРасширеннаяПодсказка 2 diff --git a/SSL/src/CommonForms/Сертификат/Form.form b/SSL/src/CommonForms/Сертификат/Form.form index 35059af5a..99a2ea76d 100644 --- a/SSL/src/CommonForms/Сертификат/Form.form +++ b/SSL/src/CommonForms/Сертификат/Form.form @@ -348,6 +348,10 @@ Субъект 105 + + <key>ru</key> + <value>Субъект</value> + true true @@ -563,9 +567,6 @@ true true true - None - None - None true @@ -601,6 +602,10 @@ Издатель 115 + + <key>ru</key> + <value>Издатель</value> + true true @@ -816,9 +821,6 @@ true true true - None - None - None true @@ -940,6 +942,10 @@ ВнутреннееСодержание 95 + + <key>ru</key> + <value>Внутреннее содержание</value> + true true @@ -1203,9 +1209,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/Сертификат/Module.bsl b/SSL/src/CommonForms/Сертификат/Module.bsl index d3bdd3a10..704b9901e 100644 --- a/SSL/src/CommonForms/Сертификат/Module.bsl +++ b/SSL/src/CommonForms/Сертификат/Module.bsl @@ -54,6 +54,11 @@ ГруппаВнутреннихПолей = "Общие"; ЗаполнитьВнутренниеПоляСертификата(); + Если Параметры.Свойство("ОткрытиеИзФормыЭлементаСертификата") Тогда + Элементы.ФормаСохранитьВФайл.Видимость = Ложь; + Элементы.ФормаПроверить.Видимость = Ложь; + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -92,7 +97,7 @@ // Продолжение процедуры Проверить. &НаКлиенте -Процедура ПроверитьЗавершение(Результат, Неопределен) Экспорт +Процедура ПроверитьЗавершение(Результат, Контекст) Экспорт Если Результат = Истина Тогда ПоказатьПредупреждение(, НСтр("ru = 'Сертификат действителен.'")); @@ -102,7 +107,7 @@ ПараметрыПредупреждения.Вставить("ТекстПредупреждения", Результат); ПараметрыПредупреждения.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Сертификат недействителен по причине:'")); - + ОткрытьФорму("ОбщаяФорма.РезультатПроверки", ПараметрыПредупреждения); КонецЕсли; diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Form.form b/SSL/src/CommonForms/СинхронизацияДанных/Form.form index 790edab30..63934ac3d 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Form.form +++ b/SSL/src/CommonForms/СинхронизацияДанных/Form.form @@ -11,7 +11,7 @@ СинхронизацияНеНастроена 153 - Группа1 + ГруппаСинхронизацияНеНастроена 154 Декорация2 @@ -45,7 +45,7 @@ - Группа10 + ГруппаИнформационнаяНадписьСинхронизацияНеНастроена 200 ИнформационнаяНадпись @@ -93,6 +93,10 @@ true + + <key>ru</key> + <value>Есть права на синхронизацию</value> + ЕстьПраваНаСинхронизациюExtendedTooltip 398 @@ -153,6 +157,10 @@ true + + <key>ru</key> + <value>Нет прав на синхронизацию</value> + НетПравНаСинхронизациюExtendedTooltip 400 @@ -175,6 +183,10 @@ true + + <key>ru</key> + <value>Информационная надпись</value> + ИнформационнаяНадписьExtendedTooltip 397 @@ -208,10 +220,6 @@ ru Другие программы - - ru - Подменю другие программы - false ПодменюДругиеПрограммыРасширеннаяПодсказка @@ -237,10 +245,6 @@ ru Распределенную информационную базу - - ru - Подменю РИБ - false ПодменюРИБExtendedTooltip @@ -296,10 +300,6 @@ ru Панель создать синхронизация не настроена - - ru - Панель создать синхронизация не настроена - ПанельСоздатьСинхронизацияНеНастроенаРасширеннаяПодсказка 553 @@ -404,8 +404,12 @@ true + + <key>ru</key> + <value>Информационная надпись синхронизация не настроена</value> + - Группа10ExtendedTooltip + ГруппаИнформационнаяНадписьСинхронизацияНеНастроенаРасширеннаяПодсказка 396 Label true @@ -429,8 +433,12 @@ true + + <key>ru</key> + <value>Синхронизация не настроена</value> + - Группа1ExtendedTooltip + ГруппаСинхронизацияНеНастроенаРасширеннаяПодсказка 394 Label true @@ -458,10 +466,6 @@ ru Синхронизация не настроена - - ru - Синхронизация не настроена - СинхронизацияНеНастроенаExtendedTooltip 393 @@ -486,7 +490,7 @@ Синхронизация 239 - Группа3 + ГруппаОднаСинхронизация 356 ИнформационнаяПанельТребуетсяОбновление1 @@ -602,10 +606,6 @@ ru Информация обмен данными приостановлен есть право обновления - - ru - Информация обмен данными приостановлен есть право обновления - ИнформацияОбменДаннымиПриостановленЕстьПравоОбновления1ExtendedTooltip 411 @@ -672,10 +672,6 @@ ru Информация обмен данными приостановлен нет права обновления - - ru - Информация обмен данными приостановлен нет права обновления - ИнформацияОбменДаннымиПриостановленНетПраваОбновления1ExtendedTooltip 414 @@ -702,10 +698,6 @@ ru Право обновления страницы - - ru - Право обновления страницы - ПравоОбновленияСтраницыExtendedTooltip 410 @@ -730,10 +722,6 @@ ru Информационная панель требуется обновление - - ru - Информационная панель требуется обновление - 45 ИнформационнаяПанельТребуетсяОбновление1ExtendedTooltip @@ -755,10 +743,10 @@ - Группа5 + ГруппаСтатусВыгрузкиЗагрузки 240 - Группа12 + КартинкиСтатусов 278 ДекорацияСтатусЗагрузки @@ -866,8 +854,12 @@ true + + <key>ru</key> + <value>Картинки статусов</value> + - Группа12ExtendedTooltip + КартинкиСтатусовРасширеннаяПодсказка 417 Label true @@ -887,7 +879,7 @@ - Группа16 + ЗаголовкиСтатусов 279 ДекорацияУспешнаяЗагрузка @@ -960,8 +952,12 @@ true + + <key>ru</key> + <value>Заголовки статусов</value> + - Группа16ExtendedTooltip + ЗаголовкиСтатусовРасширеннаяПодсказка 421 Label true @@ -1052,12 +1048,8 @@ <key>ru</key> - <value>Группа полноправный пользователь</value> + <value>Полноправный пользователь</value> - - ru - Группа полноправный пользователь - ГруппаПолноправныйПользовательExtendedTooltip 424 @@ -1152,6 +1144,10 @@ true + + <key>ru</key> + <value>Неполноправный пользователь</value> + ГруппаНеполноправныйПользовательExtendedTooltip 427 @@ -1177,8 +1173,12 @@ true + + <key>ru</key> + <value>Статус выгрузки загрузки</value> + - Группа5ExtendedTooltip + ГруппаСтатусВыгрузкиЗагрузкиРасширеннаяПодсказка 416 Label true @@ -1224,7 +1224,7 @@ Auto - Группа2 + ГруппаКомандыСинхронизации 391 ВыполнитьОбменДанными2 @@ -1345,8 +1345,12 @@ true + + <key>ru</key> + <value>Команды синхронизации</value> + - Группа2ExtendedTooltip + ГруппаКомандыСинхронизацииРасширеннаяПодсказка 430 Label true @@ -1369,8 +1373,12 @@ true + + <key>ru</key> + <value>Одна синхронизация</value> + - Группа3ExtendedTooltip + ГруппаОднаСинхронизацияРасширеннаяПодсказка 407 Label true @@ -1390,19 +1398,19 @@ - Группа9 + НастройкиСинхронизацииИРасписание 533 - Группа4 + СтраницыНастройкиСинхронизацииИРасписания 522 - Группа6 + СтраницаНастройкиСинхронизацииДанных 524 ГруппаНастройкиСинхронизации 260 - Группа18 + ГруппаКомандыНастройки 295 ИзменитьУзелИнформационнойБазы @@ -1499,8 +1507,12 @@ true + + <key>ru</key> + <value>Команды настройки</value> + - Группа18ExtendedTooltip + ГруппаКомандыНастройкиРасширеннаяПодсказка 435 Label true @@ -1568,6 +1580,10 @@ true + + <key>ru</key> + <value>Настройки синхронизации</value> + ГруппаНастройкиСинхронизацииExtendedTooltip 434 @@ -1599,7 +1615,7 @@ Настройки синхронизации данных - Группа6РасширеннаяПодсказка + СтраницаНастройкиСинхронизацииДанныхРасширеннаяПодсказка 525 Label true @@ -1622,7 +1638,7 @@ ГруппаСценарииСинхронизации 257 - Группа19 + ГруппаКомандыСценария 300 РасписаниеСинхронизацииДанныхДекорация @@ -1696,8 +1712,12 @@ true + + <key>ru</key> + <value>Команды сценария</value> + - Группа19ExtendedTooltip + ГруппаКомандыСценарияРасширеннаяПодсказка 441 Label true @@ -1763,6 +1783,10 @@ true + + <key>ru</key> + <value>Сценарии синхронизации</value> + ГруппаСценарииСинхронизацииExtendedTooltip 440 @@ -1818,8 +1842,12 @@ true + + <key>ru</key> + <value>Страницы настройки синхронизации и расписания</value> + - Группа4РасширеннаяПодсказка + СтраницыНастройкиСинхронизацииИРасписанияРасширеннаяПодсказка 523 Label true @@ -1839,10 +1867,14 @@ true + + <key>ru</key> + <value>Настройки синхронизации и расписание</value> + 70 false - Группа9РасширеннаяПодсказка + НастройкиСинхронизацииИРасписаниеРасширеннаяПодсказка 534 Label true @@ -1986,10 +2018,6 @@ ru Панель создать синхронизация одна - - ru - Панель создать синхронизация одна - ПанельСоздатьСинхронизацияОднаРасширеннаяПодсказка 555 @@ -2010,6 +2038,10 @@ true + + <key>ru</key> + <value>Настройка синхронизации</value> + false ГруппаНастройкаСинхронизацииExtendedTooltip @@ -2040,10 +2072,6 @@ ru Синхронизация - - ru - Синхронизация - false false @@ -2076,10 +2104,6 @@ ru Одна синхронизация - - ru - Одна синхронизация - false ОднаСинхронизацияExtendedTooltip @@ -2185,10 +2209,6 @@ ru Информация обмен данными приостановлен нет права обновления - - ru - Информация обмен данными приостановлен нет права обновления - ИнформацияОбменДаннымиПриостановленНетПраваОбновленияExtendedTooltip 455 @@ -2282,10 +2302,6 @@ ru Информация обмен данными приостановлен есть право обновления - - ru - Информация обмен данными приостановлен есть право обновления - ИнформацияОбменДаннымиПриостановленЕстьПравоОбновленияExtendedTooltip 457 @@ -2315,10 +2331,6 @@ ru Информационная панель требуется обновление - - ru - Информационная панель требуется обновление - ИнформационнаяПанельТребуетсяОбновлениеExtendedTooltip 453 @@ -2378,12 +2390,8 @@ <key>ru</key> - <value>Группа результатов синхронизации данных</value> + <value>Результатов синхронизации данных</value> - - ru - Группа результатов синхронизации данных - ГруппаРезультатовСинхронизацииДанныхExtendedTooltip 460 @@ -2472,10 +2480,6 @@ ru Список состояния узлов группа кнопок выполнения обмена данными - - ru - Список состояния узлов группа кнопок выполнения обмена данными - СписокСостоянияУзловГруппаКнопокВыполненияОбменаДаннымиExtendedTooltip 466 @@ -2552,12 +2556,8 @@ <key>ru</key> - <value>Группа командной панели изменение и состав</value> + <value>Командной панели изменение и состав</value> - - ru - Группа командной панели изменение и состав - ГруппаКоманднойПанелиИзменениеИСоставРасширеннаяПодсказка 469 @@ -2741,6 +2741,10 @@ true + + <key>ru</key> + <value>Список состояния узлов группа 2</value> + СписокСостоянияУзловГруппа2ExtendedTooltip 476 @@ -2920,6 +2924,10 @@ true + + <key>ru</key> + <value>Список состояния узлов группа 1</value> + СписокСостоянияУзловГруппа1ExtendedTooltip 479 @@ -2967,6 +2975,10 @@ true + + <key>ru</key> + <value>Список состояния узлов группа 4</value> + СписокСостоянияУзловГруппа4ExtendedTooltip 485 @@ -3014,10 +3026,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 462 @@ -3037,6 +3045,10 @@ СписокСостоянияУзлов 1 + + <key>ru</key> + <value>Список состояния узлов</value> + true true @@ -3353,10 +3365,6 @@ ru Список состояния узлов группа успешной выгрузки - - ru - Список состояния узлов группа успешной выгрузки - СписокСостоянияУзловГруппаУспешнойВыгрузкиExtendedTooltip 505 @@ -3421,12 +3429,8 @@ <key>ru</key> - <value>Группа выгрузки</value> + <value>Выгрузки</value> - - ru - Группа выгрузки - ГруппаВыгрузкиExtendedTooltip 504 @@ -3561,10 +3565,6 @@ ru Список состояния узлов группа успешной загрузки - - ru - Список состояния узлов группа успешной загрузки - СписокСостоянияУзловГруппаУспешнойЗагрузкиExtendedTooltip 510 @@ -3629,12 +3629,8 @@ <key>ru</key> - <value>Группа загрузки</value> + <value>Загрузки</value> - - ru - Группа загрузки - ГруппаЗагрузкиExtendedTooltip 509 @@ -3814,12 +3810,8 @@ <key>ru</key> - <value>Группа кнопок выполнения обмена данными</value> + <value>Кнопок выполнения обмена данными</value> - - ru - Группа кнопок выполнения обмена данными - ГруппаКнопокВыполненияОбменаДаннымиExtendedTooltip 488 @@ -3892,6 +3884,10 @@ true + + <key>ru</key> + <value>Контекстное меню список изменение и состав</value> + КонтекстноеМенюСписокИзменениеИСоставРасширеннаяПодсказка 557 @@ -4018,12 +4014,8 @@ <key>ru</key> - <value>Группа кнопок настройки расписания</value> + <value>Кнопок настройки расписания</value> - - ru - Группа кнопок настройки расписания - ГруппаКнопокНастройкиРасписанияExtendedTooltip 496 @@ -4085,9 +4077,6 @@ true true true - None - None - None true @@ -4185,12 +4174,8 @@ <key>ru</key> - <value>Группа префикса</value> + <value>Префикса</value> - - ru - Группа префикса - ГруппаПрефиксаExtendedTooltip 514 @@ -4219,10 +4204,6 @@ ru Несколько синхронизаций - - ru - Несколько синхронизаций - НесколькоСинхронизацийExtendedTooltip 452 @@ -4249,10 +4230,6 @@ ru Синхронизация данных - - ru - Синхронизация данных - СинхронизацияДанныхExtendedTooltip 392 @@ -4287,6 +4264,7 @@ DontBlock true + true Vertical true true diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html b/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html index 047337591..70b7e47a7 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html +++ b/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html @@ -1,6 +1,6 @@

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

        -

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

        +

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

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

        •  - синхронизация данных выполняется по расписанию. В этой колонке проставляется аналогичный значок для синхронизаций, которые выполняются автоматически по заданному сценарию;
          diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl b/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl index 38d8a98bc..a5325872c 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl +++ b/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl @@ -8,8 +8,6 @@ Возврат; КонецЕсли; - НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.СинхронизацияДанных"; - РольДоступнаДобавлениеИзменениеОбменовДанными = ОбменДаннымиСервер.ЕстьПраваНаАдминистрированиеОбменов(); Если Не РольДоступнаДобавлениеИзменениеОбменовДанными Тогда Элементы.СписокСостоянияУзловИзменитьУзелИнформационнойБазы.Видимость = Ложь; @@ -41,7 +39,7 @@ ОбновитьСписокСостоянияУзлов(); - Если Не РольДоступнаДобавлениеИзменениеОбменовДанными Или ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РольДоступнаДобавлениеИзменениеОбменовДанными Или ОбщегоНазначения.РазделениеВключено() Тогда Элементы.ПрефиксСинхронизацияНеНастроена.Видимость = Ложь; Элементы.ПрефиксОднаСинхронизация.Видимость = Ложь; @@ -109,23 +107,7 @@ &НаКлиенте Процедура СписокСостоянияУзловПриАктивизацииСтроки(Элемент) - ЗаданыТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные <> Неопределено; - - // Командная панель. - Элементы.Настройка.Доступность = ЗаданыТекущиеДанные; - Элементы.ГруппаКоманднойПанелиИзменениеИСостав.Доступность = ЗаданыТекущиеДанные; - Элементы.СписокСостоянияУзловГруппаКнопокВыполненияОбменаДанными.Доступность = ЗаданыТекущиеДанные; - Элементы.НастроитьРасписаниеВыполненияОбмена.Доступность = ЗаданыТекущиеДанные; - Элементы.СписокСостоянияУзловЗагрузитьПравилаСинхронизацииДанных.Доступность = ЗаданыТекущиеДанные; - Элементы.СписокСостоянияУзловИнформацияПоОбмену.Доступность = ЗаданыТекущиеДанные; - Элементы.СписокСостоянияУзловУдалитьНастройкуСинхронизации.Доступность = ЗаданыТекущиеДанные; - - // Контекстное меню. - Элементы.ГруппаКнопокВыполненияОбменаДанными.Доступность = ЗаданыТекущиеДанные; - Элементы.КонтекстноеМенюСписокИзменениеИСостав.Доступность = ЗаданыТекущиеДанные; - Элементы.КонтекстноеМенюСписокСостоянияДиагностика.Доступность = ЗаданыТекущиеДанные; - Элементы.ГруппаКнопокНастройкиРасписания.Доступность = ЗаданыТекущиеДанные; - Элементы.СписокСостоянияУзловКонтекстноеМенюИнформацияПоОбмену.Доступность = ЗаданыТекущиеДанные; + ПодключитьОбработчикОжидания("Подключаемый_СписокСостоянияУзловПриАктивизацииСтроки", 0.1, Истина); КонецПроцедуры @@ -1107,4 +1089,27 @@ КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_СписокСостоянияУзловПриАктивизацииСтроки() Экспорт + + ЗаданыТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные <> Неопределено; + + // Командная панель. + Элементы.Настройка.Доступность = ЗаданыТекущиеДанные; + Элементы.ГруппаКоманднойПанелиИзменениеИСостав.Доступность = ЗаданыТекущиеДанные; + Элементы.СписокСостоянияУзловГруппаКнопокВыполненияОбменаДанными.Доступность = ЗаданыТекущиеДанные; + Элементы.НастроитьРасписаниеВыполненияОбмена.Доступность = ЗаданыТекущиеДанные; + Элементы.СписокСостоянияУзловЗагрузитьПравилаСинхронизацииДанных.Доступность = ЗаданыТекущиеДанные; + Элементы.СписокСостоянияУзловИнформацияПоОбмену.Доступность = ЗаданыТекущиеДанные; + Элементы.СписокСостоянияУзловУдалитьНастройкуСинхронизации.Доступность = ЗаданыТекущиеДанные; + + // Контекстное меню. + Элементы.ГруппаКнопокВыполненияОбменаДанными.Доступность = ЗаданыТекущиеДанные; + Элементы.КонтекстноеМенюСписокИзменениеИСостав.Доступность = ЗаданыТекущиеДанные; + Элементы.КонтекстноеМенюСписокСостоянияДиагностика.Доступность = ЗаданыТекущиеДанные; + Элементы.ГруппаКнопокНастройкиРасписания.Доступность = ЗаданыТекущиеДанные; + Элементы.СписокСостоянияУзловКонтекстноеМенюИнформацияПоОбмену.Доступность = ЗаданыТекущиеДанные; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/Склонения/Form.form b/SSL/src/CommonForms/Склонения/Form.form index a54b80f27..ff0066cc9 100644 --- a/SSL/src/CommonForms/Склонения/Form.form +++ b/SSL/src/CommonForms/Склонения/Form.form @@ -270,7 +270,7 @@ 19 <key>ru</key> - <value>Предложный (О ком? О Чем?)</value> + <value>Предложный (О ком? О чем?)</value> true true @@ -421,7 +421,7 @@ <key>ru</key> - <value>Группа информационная надпись включение сервиса</value> + <value>Информационная надпись включение сервиса</value> ГруппаИнформационнаяНадписьВключениеСервисаРасширеннаяПодсказка @@ -515,7 +515,7 @@ <key>ru</key> - <value>Группа информационная надпись доступность сервиса</value> + <value>Информационная надпись доступность сервиса</value> ГруппаИнформационнаяНадписьДоступностьСервисаРасширеннаяПодсказка @@ -539,7 +539,7 @@ <key>ru</key> - <value>Группа информационная надпись сервис склонения</value> + <value>Информационная надпись сервис склонения</value> ГруппаИнформационнаяНадписьСервисСклоненияРасширеннаяПодсказка @@ -623,7 +623,7 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> ГруппаКоманднаяПанельРасширеннаяПодсказка @@ -682,6 +682,7 @@ true + true РодительныйПадеж @@ -700,6 +701,7 @@ true + true ДательныйПадеж @@ -718,6 +720,7 @@ true + true ВинительныйПадеж @@ -736,6 +739,7 @@ true + true ТворительныйПадеж @@ -754,6 +758,7 @@ true + true ПредложныйПадеж @@ -772,6 +777,7 @@ true + true Склонения @@ -812,7 +818,12 @@ Пол 9 - + + Number + + 1 + + true @@ -870,6 +881,7 @@ КомандаОК + true DontUse Auto @@ -888,6 +900,7 @@ КомандаОтмена + true DontUse Auto @@ -914,6 +927,7 @@ Picture + true DontUse Auto diff --git a/SSL/src/CommonForms/Склонения/Module.bsl b/SSL/src/CommonForms/Склонения/Module.bsl index 63f7d707b..0acf40132 100644 --- a/SSL/src/CommonForms/Склонения/Module.bsl +++ b/SSL/src/CommonForms/Склонения/Module.bsl @@ -24,8 +24,8 @@ Если Параметры.Свойство("ИзмененоПредставление") Тогда ИзмененоПредставление = Параметры.ИзмененоПредставление; КонецЕсли; - - ОбновитьГруппуИнформационнаяНадписьСервисСклонения() + + ОбновитьГруппуИнформационнаяНадписьСервисСклонения(); КонецПроцедуры diff --git a/SSL/src/CommonForms/СменаПароля/Form.form b/SSL/src/CommonForms/СменаПароля/Form.form index c22208c49..5d5af87b9 100644 --- a/SSL/src/CommonForms/СменаПароля/Form.form +++ b/SSL/src/CommonForms/СменаПароля/Form.form @@ -222,7 +222,7 @@ <key>ru</key> - <value>Группа новый пароль</value> + <value>Новый пароль</value> ГруппаНовыйПарольРасширеннаяПодсказка @@ -433,7 +433,7 @@ <key>ru</key> - <value>Группа ошибки</value> + <value>Ошибки</value> ГруппаОшибкиРасширеннаяПодсказка @@ -457,7 +457,7 @@ <key>ru</key> - <value>Группа подтверждение</value> + <value>Подтверждение</value> false @@ -527,7 +527,7 @@ <key>ru</key> - <value>Группа показывать новый пароль</value> + <value>Показывать новый пароль</value> ГруппаПоказыватьНовыйПарольРасширеннаяПодсказка @@ -556,7 +556,7 @@ <key>ru</key> - <value>Группа пароль</value> + <value>Пароль</value> ГруппаПарольРасширеннаяПодсказка diff --git a/SSL/src/CommonForms/СменаПароля/Module.bsl b/SSL/src/CommonForms/СменаПароля/Module.bsl index 3d3a2fd52..9047af4e3 100644 --- a/SSL/src/CommonForms/СменаПароля/Module.bsl +++ b/SSL/src/CommonForms/СменаПароля/Module.bsl @@ -86,6 +86,7 @@ Если ЗначениеЗаполнено(ТекстОшибки) Тогда Отказ = Истина; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ПоказатьТекстОшибкиИСообщитьОЗакрытии", 0.1, Истина); Иначе ПроверитьПодтверждениеПароля(); @@ -146,10 +147,10 @@ Если Не ВернутьПарольБезУстановки И Не ЭтоТекущийПользовательИБ - И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ПарольПользователяСервиса = Неопределено Тогда - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения("УстановитьПарольЗавершение", ЭтотОбъект), ЭтотОбъект, ПарольПользователяСервиса); @@ -173,6 +174,8 @@ &НаКлиенте Процедура ПоказатьТекстОшибкиИСообщитьОЗакрытии() + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + ПоказатьПредупреждение(Новый ОписаниеОповещения( "ПоказатьТекстОшибкиИСообщитьОЗакрытииЗавершение", ЭтотОбъект), ТекстОшибки); diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form index 2629c66e4..51ea8aef8 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form @@ -232,10 +232,6 @@ ru Полное имя файловой базы - - ru - Группа путь файловой базы - ГруппаПутьФайловойБазыExtendedTooltip 56 @@ -267,10 +263,6 @@ ru Заполнить параметры файловой базы - - ru - Заполнить параметры файловой базы - ЗаполнитьПараметрыФайловойБазыExtendedTooltip 54 @@ -888,10 +880,6 @@ ru Заполнить параметры серверной базы - - ru - Заполнить параметры серверной базы - ЗаполнитьПараметрыСервернойБазыExtendedTooltip 59 @@ -917,10 +905,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 53 @@ -945,10 +929,6 @@ ru Параметры информационной базы - - ru - Параметры - ПараметрыExtendedTooltip 52 @@ -1080,10 +1060,6 @@ ru Полное имя архива с файлами томов - - ru - Группа путь к архиву с файлами томов - ГруппаПутьКАрхивуСФайламиТомовExtendedTooltip 71 @@ -1118,10 +1094,6 @@ ru Панель действий - - ru - Панель действий - ПанельДействийExtendedTooltip 74 @@ -1146,10 +1118,6 @@ ru Исходные данные - - ru - Исходные данные - ИсходныеДанныеРасширеннаяПодсказка 82 @@ -1292,10 +1260,6 @@ ru Ожидание синхронизации данных - - ru - Ожидание синхронизации данных - ОжиданиеСозданияНачальногоОбразаРасширеннаяПодсказка 84 @@ -1359,10 +1323,6 @@ ru Результат - - ru - Результат - РезультатРасширеннаяПодсказка 95 @@ -1389,10 +1349,6 @@ ru Страницы формы - - ru - Страницы формы - СтраницыФормыРасширеннаяПодсказка 80 diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl index 9a11c0787..e8ac1c324 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl @@ -39,8 +39,8 @@ ЕстьФайлыВТомах = Ложь; - Если ФайловыеФункции.ЕстьТомаХраненияФайлов() Тогда - ЕстьФайлыВТомах = ФайловыеФункцииСлужебный.ЕстьФайлыВТомах(); + Если РаботаСФайлами.ЕстьТомаХраненияФайлов() Тогда + ЕстьФайлыВТомах = РаботаСФайламиСлужебный.ЕстьФайлыВТомах(); КонецЕсли; ОССервераWindows = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 @@ -62,7 +62,7 @@ Элементы.ГруппаПутьКАрхивуСФайламиТомов.Видимость = Ложь; КонецЕсли; - Если Не СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда Элементы.ПутьКАрхивуСФайламиТомов.ПодсказкаВвода = НСтр("ru = '\\имя сервера\resource\files.zip'"); Элементы.ПутьКАрхивуСФайламиТомов.КнопкаВыбора = Ложь; КонецЕсли; @@ -134,13 +134,15 @@ КонецЕсли; МассивКаталогов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПутьКФайлу, "\", Истина); ПолныйПуть = ""; - Для Каждого Каталог Из МассивКаталогов Цикл - ПолныйПуть = ПолныйПуть + Каталог + "\"; - Файл = Новый Файл(ПолныйПуть); - Если НЕ Файл.Существует() Тогда - СоздатьКаталог(ПолныйПуть); - КонецЕсли; - КонецЦикла; + Если Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда + Для Каждого Каталог Из МассивКаталогов Цикл + ПолныйПуть = ПолныйПуть + Каталог + "\"; + Файл = Новый Файл(ПолныйПуть); + Если НЕ Файл.Существует() Тогда + СоздатьКаталог(ПолныйПуть); + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -159,6 +161,8 @@ НСтр("ru = 'Создание начального образа файловой информационной базы |на данной платформе не поддерживается.'"); Иначе + ПроцентВыполнения = 0; + ДопИнформацияВыполнение = ""; ПараметрыЗадания = Новый Структура; ПараметрыЗадания.Вставить("Узел", Узел); ПараметрыЗадания.Вставить("ПутьКАрхивуСФайламиТомовWindows", ПутьКАрхивуСФайламиТомовWindows); @@ -171,7 +175,7 @@ ПараметрыЗадания.Вставить("ПолноеИмяФайловойБазыWindows", ПолноеИмяФайловойБазыWindows); ПараметрыЗадания.Вставить("ПолноеИмяФайловойБазыLinux", ПолноеИмяФайловойБазыLinux); ПараметрыЗадания.Вставить("НаименованиеЗадания", НСтр("ru = 'Создание файлового начального образа'")); - ПараметрыЗадания.Вставить("НаименованиеПроцедуры", "ФайловыеФункцииСлужебный.СоздатьФайловыйНачальныйОбразНаСервере"); + ПараметрыЗадания.Вставить("НаименованиеПроцедуры", "РаботаСФайламиСлужебный.СоздатьФайловыйНачальныйОбразНаСервере"); Иначе // Серверный начальный образ. СтрокаСоединения = @@ -188,7 +192,7 @@ ПараметрыЗадания.Вставить("СтрокаСоединения", СтрокаСоединения); ПараметрыЗадания.Вставить("НаименованиеЗадания", НСтр("ru = 'Создание серверного начального образа'")); - ПараметрыЗадания.Вставить("НаименованиеПроцедуры", "ФайловыеФункцииСлужебный.СоздатьСерверныйНачальныйОбразНаСервере"); + ПараметрыЗадания.Вставить("НаименованиеПроцедуры", "РаботаСФайламиСлужебный.СоздатьСерверныйНачальныйОбразНаСервере"); КонецЕсли; Результат = ПодготовитьДанныеДляСозданияНачальногоОбраза(ПараметрыЗадания, ВидБазы); Если ТипЗнч(Результат) = Тип("Структура") Тогда @@ -235,7 +239,7 @@ Процедура ОбработчикСохраненияФайлаПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт Если Не Подключено Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + РаботаСФайламиСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); Возврат; КонецЕсли; @@ -274,11 +278,11 @@ Если ВидБазы = 0 Тогда // Файловый начальный образ. // Функция обработки, проверки и подготовки параметров. - Результат = ФайловыеФункцииСлужебный.ПодготовитьДанныеДляСозданияФайловогоНачальногоОбраза(ПараметрыЗадания); + Результат = РаботаСФайламиСлужебный.ПодготовитьДанныеДляСозданияФайловогоНачальногоОбраза(ПараметрыЗадания); Иначе // Серверный начальный образ. // Функция обработки, проверки и подготовки параметров. - Результат = ФайловыеФункцииСлужебный.ПодготовитьДанныеДляСозданияСерверногоНачальногоОбраза(ПараметрыЗадания); + Результат = РаботаСФайламиСлужебный.ПодготовитьДанныеДляСозданияСерверногоНачальногоОбраза(ПараметрыЗадания); КонецЕсли; Возврат Результат; @@ -286,11 +290,12 @@ КонецФункции &НаКлиенте -Процедура ВыполнитьСозданиеНачальногоОбраза(Результат, Неопределен) Экспорт +Процедура ВыполнитьСозданиеНачальногоОбраза(Результат, Контекст) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПроцентВыполнения = 0; ДопИнформацияВыполнение = ""; + ПерейтиКСтраницеОжидания(); ПодключитьОбработчикОжидания("ЗапуститьСозданиеНачальногоОбраза", 1, Истина); КонецЕсли; @@ -311,7 +316,6 @@ ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("СоздатьНачальныйОбразНаСервереПрогресс", ЭтотОбъект);; ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания); - ПерейтиКСтраницеОжидания(); ИначеЕсли Результат.Статус = "Выполнено" Тогда ПерейтиКСтраницеОжидания(); ПроцентВыполнения = 100; diff --git a/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form b/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form index 7cb014268..34f8f052d 100644 --- a/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form +++ b/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form @@ -181,7 +181,7 @@ <key>ru</key> - <value>Группа файл</value> + <value>Файл</value> ГруппаФайлExtendedTooltip @@ -343,7 +343,7 @@ <key>ru</key> - <value>Группа страницы</value> + <value>Страницы</value> true diff --git a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl index 1a50bb141..5f08f0f82 100644 --- a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl +++ b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl @@ -16,7 +16,7 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если Не РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда ВызватьИсключение(НСтр("ru = 'Не установлено значение разделителя'")); КонецЕсли; @@ -114,8 +114,8 @@ &НаСервере Функция СоздатьКопиюОбластиНаСервере() - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - ОбщегоНазначения.ЗаблокироватьИБ(); + ОбластьДанных = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + УстановитьМонопольныйРежим(Истина); ПараметрыЗадания = РезервноеКопированиеОбластейДанных.СоздатьПустыеПараметрыВыгрузки(); ПараметрыЗадания.ОбластьДанных = ОбластьДанных; @@ -126,7 +126,7 @@ Попытка Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне( УникальныйИдентификатор, - РезервноеКопированиеОбластейДанныхПовтИсп.ИмяМетодаФоновогоРезервногоКопирования(), + РезервноеКопированиеОбластейДанных.ИмяМетодаФоновогоРезервногоКопирования(), ПараметрыЗадания, РезервноеКопированиеОбластейДанныхПовтИсп.НаименованиеФоновогоРезервногоКопирования()); @@ -152,7 +152,7 @@ &НаСервереБезКонтекста Процедура СнятьМонопольныйРежим() - ОбщегоНазначения.РазблокироватьИБ(); + УстановитьМонопольныйРежим(Ложь); КонецПроцедуры diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form index 907156c08..599906784 100644 --- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form +++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form @@ -54,7 +54,7 @@ <key>ru</key> - <value>Группа представление данных</value> + <value>Представление данных</value> ГруппаПредставлениеДанныхРасширеннаяПодсказка @@ -83,6 +83,10 @@ ТаблицаПодписей 34 + + <key>ru</key> + <value>Таблица подписей</value> + true true @@ -374,9 +378,6 @@ true true true - None - None - None true @@ -417,6 +418,44 @@ Auto + + СохранятьСертификатВместеСПодписью + 88 + + <key>ru</key> + <value>Сохранять сертификат</value> + + true + true + + true + + + СохранятьСертификатВместеСПодписью + + Right + + СохранятьСертификатВместеСПодписьюРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + СохранятьСертификатВместеСПодписьюКонтекстноеМеню + 89 + true + + CheckBoxField + Enter + true + Left + true + + БольшеНеСпрашивать 62 @@ -484,7 +523,7 @@ Left - Form.Command.Выбрать + Form.Command.Сохранить Auto true true @@ -678,6 +717,44 @@ true + + АдресСертификата + + <key>ru</key> + <value>Адрес сертификата</value> + + 7 + + String + + + + true + + + true + + + + РасширениеСертификата + + <key>ru</key> + <value>Расширение сертификата</value> + + 8 + + String + + 3 + + + + true + + + true + + БольшеНеСпрашивать @@ -731,11 +808,45 @@ true - - Выбрать + + СохранятьСертификатВместеСПодписью <key>ru</key> - <value>Выбрать</value> + <value>Сохранять сертификат вместе с подписью</value> + + 5 + + Boolean + + + true + + + true + + + + СохранятьСертификатВместеСПодписьюИсходноеЗначение + + <key>ru</key> + <value>Сохранять сертификат вместе с подписью исходное значение</value> + + 6 + + Boolean + + + true + + + true + + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> 1 @@ -747,7 +858,7 @@ - ВыбратьПодпись + СохранитьПодпись DontUse diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Help/ru.html b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Help/ru.html index ef259d72d..412fcd960 100644 --- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Help/ru.html +++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Help/ru.html @@ -1,11 +1,12 @@

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

          -

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

          +

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

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

          • Сохранить - флажок.
          • Автор подписи - представление лица, которому выдан сертификат;
          • Дата подписи;
          • Комментарий - подробная информация о подписи.

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

          +

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

          Для того чтобы не видеть это окно и всегда сохранять все подписи, включите флажок Больше не спрашивать.

          См. также:

          • diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Module.bsl b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Module.bsl index 8784d5487..5a80c1db4 100644 --- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Module.bsl +++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Module.bsl @@ -16,6 +16,10 @@ Возврат; КонецЕсли; + ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки(); + СохранятьСертификатВместеСПодписью = ПерсональныеНастройки.СохранятьСертификатВместеСПодписью; + СохранятьСертификатВместеСПодписьюИсходноеЗначение = СохранятьСертификатВместеСПодписью; + СохранятьВсеПодписи = Параметры.СохранятьВсеПодписи; Если ЗначениеЗаполнено(Параметры.ЗаголовокДанных) Тогда @@ -68,12 +72,12 @@ #Область ОбработчикиКомандФормы &НаКлиенте -Процедура ВыбратьПодпись(Команда) +Процедура СохранитьПодпись(Команда) - Если БольшеНеСпрашивать Тогда - ЗапомнитьБольшеНеСпрашивать(); + Если БольшеНеСпрашивать Или (СохранятьСертификатВместеСПодписью <> СохранятьСертификатВместеСПодписьюИсходноеЗначение)Тогда + СохранитьНастройки(БольшеНеСпрашивать, СохранятьСертификатВместеСПодписью); ОбновитьПовторноИспользуемыеЗначения(); - Оповестить("Запись_ЛичныеНастройкиЭлектроннойПодписиИШифрования", Новый Структура, "ДействияПриСохраненииСЭП"); + Оповестить("Запись_ЛичныеНастройкиЭлектроннойПодписиИШифрования", Новый Структура, "ДействияПриСохраненииСЭП, СохранятьСертификатВместеСПодписью"); КонецЕсли; Закрыть(ТаблицаПодписей); @@ -97,7 +101,7 @@ Если ТипЗнч(Объект) = Тип("Строка") Тогда КоллекцияПодписей = ПолучитьИзВременногоХранилища(Объект); Иначе - КоллекцияПодписей = КоллекцияПодписей(Объект); + КоллекцияПодписей = ЭлектроннаяПодпись.УстановленныеПодписи(Объект); КонецЕсли; Для каждого ВсеСвойстваПодписи Из КоллекцияПодписей Цикл @@ -105,50 +109,49 @@ ЗаполнитьЗначенияСвойств(НоваяСтрока, ВсеСвойстваПодписи); НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище( - ВсеСвойстваПодписи.Подпись.Получить(), УникальныйИдентификатор); + ВсеСвойстваПодписи.Подпись, УникальныйИдентификатор); + + ДанныеСертификата = ВсеСвойстваПодписи.Сертификат.Получить(); + Если ТипЗнч(ДанныеСертификата) = Тип("Строка") Тогда + НоваяСтрока.РасширениеСертификата = "txt"; + НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( + ДвоичныеДанныеСтроки(ДанныеСертификата), УникальныйИдентификатор); + Иначе + НоваяСтрока.РасширениеСертификата = "cer"; + НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( + ДанныеСертификата, УникальныйИдентификатор); + КонецЕсли; НоваяСтрока.Пометка = Истина; КонецЦикла; КонецПроцедуры &НаСервере -Функция КоллекцияПодписей(ОбъектСсылка) +Функция ДвоичныеДанныеСтроки(ДанныеСтроки) - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ЭлектронныеПодписи.Подпись КАК Подпись, - | ЭлектронныеПодписи.УстановившийПодпись КАК УстановившийПодпись, - | ЭлектронныеПодписи.Комментарий КАК Комментарий, - | ЭлектронныеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи, - | ЭлектронныеПодписи.ДатаПодписи КАК ДатаПодписи, - | ЭлектронныеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, - | ЭлектронныеПодписи.ПодписьВерна КАК ПодписьВерна - |ИЗ - | &ЭлектронныеПодписи КАК ЭлектронныеПодписи - |ГДЕ - | ЭлектронныеПодписи.Ссылка = &СсылкаНаОбъект"; + ВременныйФайл = ПолучитьИмяВременногоФайла(); - ОбъектМетаданных = ОбъектСсылка.Метаданные(); + ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(ДанныеСтроки); + ЗаписьТекста.Закрыть(); - Запрос = Новый Запрос; - Запрос.Параметры.Вставить("СсылкаНаОбъект", ОбъектСсылка); + ДвоичныеДанныеСертификата = Новый ДвоичныеДанные(ВременныйФайл); - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ЭлектронныеПодписи", - ОбъектМетаданных.ПолноеИмя() + ".ЭлектронныеПодписи"); + УдалитьФайлы(ВременныйФайл); - Если ОбъектМетаданных.ТабличныеЧасти.ЭлектронныеПодписи.Реквизиты.Найти("ПодписьВерна") = Неопределено Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЭлектронныеПодписи.ПодписьВерна", "ЛОЖЬ"); - КонецЕсли; - - Возврат Запрос.Выполнить().Выгрузить(); + Возврат ДвоичныеДанныеСертификата; КонецФункции &НаСервереБезКонтекста -Процедура ЗапомнитьБольшеНеСпрашивать() +Процедура СохранитьНастройки(БольшеНеСпрашивать, СохранятьСертификатВместеСПодписью) - ЧастьНастроек = Новый Структура("ДействияПриСохраненииСЭП", "СохранятьВсеПодписи"); + ЧастьНастроек = Новый Структура; + Если БольшеНеСпрашивать Тогда + ЧастьНастроек.Вставить("ДействияПриСохраненииСЭП", "СохранятьВсеПодписи"); + КонецЕсли; + ЧастьНастроек.Вставить("СохранятьСертификатВместеСПодписью", СохранятьСертификатВместеСПодписью); ЭлектроннаяПодписьСлужебный.СохранитьПерсональныеНастройки(ЧастьНастроек); ОбновитьПовторноИспользуемыеЗначения(); diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form index 39b497204..8a0a7138a 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form @@ -125,10 +125,6 @@ ru Страница сохранение в папку - - ru - Страница сохранение в папку - СтраницаСохранениеВПапкуExtendedTooltip 85 @@ -206,10 +202,6 @@ ru Страница присоединение к объекту - - ru - Страница присоединение к объекту - СтраницаПрисоединениеКОбъектуExtendedTooltip 87 @@ -234,12 +226,8 @@ <key>ru</key> - <value>Группа места сохранения</value> + <value>Места сохранения</value> - - ru - Группа места сохранения - ГруппаМестаСохраненияExtendedTooltip 84 @@ -264,10 +252,6 @@ ru Выбор места сохранения файла - - ru - Выбор места сохранения файла - ВыборМестаСохраненияФайлаExtendedTooltip 82 @@ -295,6 +279,10 @@ ВыбранныеФорматыСохранения 72 + + <key>ru</key> + <value>Выбранные форматы сохранения</value> + true true @@ -501,9 +489,6 @@ ВыбранныеФорматыСохранения.Picture - None - None - None true true @@ -515,10 +500,6 @@ ru В форматах - - ru - Группа выбор форматов - ГруппаВыборФорматовExtendedTooltip 89 @@ -582,6 +563,45 @@ true + + ПереводитьИменаФайловВТранслит + 104 + true + true + + true + + + ПереводитьИменаФайловВТранслит + + Right + + ru + Сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Документ.txt" будет сохранен с именем "Document.txt". + + Button + + ПереводитьИменаФайловВТранслитРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ПереводитьИменаФайловВТранслитКонтекстноеМеню + 105 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -591,10 +611,6 @@ ru В форматах - - ru - Группа дополнительные параметры - ГруппаДополнительныеПараметрыExtendedTooltip 93 @@ -821,6 +837,26 @@ + + ПереводитьИменаФайловВТранслит + + <key>ru</key> + <value>Транслитерировать имена файлов</value> + + 1 + + Boolean + + + true + + + true + + + ПереводитьИменаФайловВТранслит + + Сохранить diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl index cab64a34d..59bbbcd96 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl @@ -129,7 +129,8 @@ РезультатВыбора.Вставить("ВариантСохранения", ВариантСохранения); РезультатВыбора.Вставить("ПапкаДляСохранения", ВыбраннаяПапка); РезультатВыбора.Вставить("ОбъектДляПрикрепления", ВыбранныйОбъект); - + РезультатВыбора.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); + ОповеститьОВыборе(РезультатВыбора); КонецПроцедуры @@ -155,15 +156,18 @@ &НаСервере Функция КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект) - Результат = Неопределено; + МожноПрисоединять = Неопределено; - УправлениеПечатью.ПриПроверкеВозможностиПрисоединенияФайловКОбъекту(СсылкаНаОбъект, Результат); - - Если Результат = Неопределено Тогда - Результат = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + МожноПрисоединять = МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект); КонецЕсли; - Возврат Результат; + Если МожноПрисоединять = Неопределено Тогда + МожноПрисоединять = Ложь; + КонецЕсли; + + Возврат МожноПрисоединять; КонецФункции #КонецОбласти diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Form.form b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form similarity index 96% rename from SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Form.form rename to SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form index ba4d8f240..b288293c6 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Form.form +++ b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form @@ -76,10 +76,6 @@ <key>ru</key> <value>Командная панель левого табличного документа</value> - - ru - Группа командная панель левого табличного документа - true ГруппаКоманднаяПанельЛевогоТабличногоДокументаРасширеннаяПодсказка @@ -160,10 +156,6 @@ ru Версия № - - ru - Группа левый табличный документ - ГруппаЛевыйТабличныйДокументРасширеннаяПодсказка 135 @@ -257,12 +249,8 @@ <key>ru</key> - <value>Группа командная панель правого табличного документа</value> + <value>Командная панель правого табличного документа</value> - - ru - Группа командная панель правого табличного документа - ГруппаКоманднаяПанельПравогоТабличногоДокументаРасширеннаяПодсказка 119 @@ -342,10 +330,6 @@ ru Версия № - - ru - Группа правый табличный документ - ГруппаПравыйТабличныйДокументРасширеннаяПодсказка 137 @@ -375,12 +359,8 @@ <key>ru</key> - <value>Группа табличные документы</value> + <value>Табличные документы</value> - - ru - Группа табличные документы - ГруппаТабличныеДокументыРасширеннаяПодсказка 133 diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Module.bsl b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl similarity index 99% rename from SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Module.bsl rename to SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl index 2e6769179..1313b7fe0 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/СравнениеТабличныхДокументов/Module.bsl +++ b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl @@ -432,7 +432,7 @@ Результат = Новый ТаблицаЗначений; Результат.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число")); - Результат.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка",,,,МаксимальныйРазмерСтрок)); + Результат.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка", , МаксимальныйРазмерСтрок)); Граница1 = ?(ПоСтрокам, ТаблицаЗначенийИсточник.Количество(), ТаблицаЗначенийИсточник.Колонки.Количество()) - 1; diff --git a/SSL/src/CommonForms/СравнениеТабличныхДокументов/СравнениеТабличныхДокументов.mdo b/SSL/src/CommonForms/СравнениеТабличныхДокументов/СравнениеТабличныхДокументов.mdo new file mode 100644 index 000000000..90b8065a4 --- /dev/null +++ b/SSL/src/CommonForms/СравнениеТабличныхДокументов/СравнениеТабличныхДокументов.mdo @@ -0,0 +1,11 @@ + + + СравнениеТабличныхДокументов + + ru + Сравнение табличных документов + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Form.form b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form index bc81cd92a..c7d07b9f0 100644 --- a/SSL/src/CommonForms/СтруктураПодчиненности/Form.form +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form @@ -59,6 +59,10 @@ true + + <key>ru</key> + <value>Отчет</value> + ГруппаОтчетExtendedTooltip 19 diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl b/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl index 4a800766d..b3769ddea 100644 --- a/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl @@ -429,7 +429,8 @@ // Получает выборку по реквизитам документа. // // Параметры: -// ОбъектСсылка - ДокументСсылка, СправочникСсылка, ПВХСсылка - ссылка на объект, значения реквизитов которого получаются запросом. +// ОбъектСсылка - ДокументСсылка, СправочникСсылка, ПВХСсылка - ссылка на объект, значения реквизитов которого +// получаются запросом. // // Возвращаемое значение: // ВыборкаИзРезультатаЗапроса @@ -652,18 +653,36 @@ РеквизитыДокумента = Новый Соответствие; ЯвляетсяДокументом = ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта); - ИмяРеквизитаСуммаДокумента = ИмяРеквизитаДокумента(МетаданныеОбъекта.Имя, "СуммаДокумента"); - Если ЯвляетсяДокументом И МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаСуммаДокумента) <> Неопределено Тогда - РеквизитыДокумента.Вставить("СуммаДокумента", ИмяРеквизитаСуммаДокумента); + Если ЯвляетсяДокументом Тогда + + ИмяРеквизитаСуммаДокумента = ИмяРеквизитаДокумента(МетаданныеОбъекта.Имя, "СуммаДокумента"); + + Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаСуммаДокумента) <> Неопределено Тогда + РеквизитыДокумента.Вставить("СуммаДокумента", ИмяРеквизитаСуммаДокумента); + Иначе + РеквизитыДокумента.Вставить("СуммаДокумента", "NULL"); + КонецЕсли; + Иначе + РеквизитыДокумента.Вставить("СуммаДокумента", "NULL"); + КонецЕсли; - ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта.Имя, "Валюта"); - Если ЯвляетсяДокументом И МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаВалюта) <> Неопределено Тогда - РеквизитыДокумента.Вставить("Валюта", ИмяРеквизитаВалюта); + Если ЯвляетсяДокументом Тогда + + ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта.Имя, "Валюта"); + + Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаВалюта) <> Неопределено Тогда + РеквизитыДокумента.Вставить("Валюта", ИмяРеквизитаВалюта); + Иначе + РеквизитыДокумента.Вставить("Валюта", "NULL"); + КонецЕсли; + Иначе + РеквизитыДокумента.Вставить("Валюта", "NULL"); + КонецЕсли; Если ЯвляетсяДокументом Тогда @@ -677,9 +696,9 @@ Иначе РеквизитыДокумента.Вставить("Дата", "NULL"); КонецЕсли; - + КэшРеквизитовОбъекта.Вставить(ИмяОбъекта, РеквизитыДокумента); - + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form index a6415bf74..10594eb0d 100644 --- a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form +++ b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form @@ -140,10 +140,6 @@ ru Задайте параметры подключения к конечной точке - - ru - Настройки подключения - НастройкиПодключенияExtendedTooltip 14 diff --git a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl index f1e96bf27..0b4ffa98f 100644 --- a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl +++ b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl @@ -36,8 +36,6 @@ &НаКлиенте Процедура Установить(Команда) - Состояние(НСтр("ru = 'Выполняется установка ведущей конечной точки. Пожалуйста, подождите...'")); - Отказ = Ложь; ОшибкаЗаполнения = Ложь; diff --git a/SSL/src/CommonForms/УточнениеКонтактов/Form.form b/SSL/src/CommonForms/УточнениеКонтактов/Form.form index 6a91b07e1..695ee2fbf 100644 --- a/SSL/src/CommonForms/УточнениеКонтактов/Form.form +++ b/SSL/src/CommonForms/УточнениеКонтактов/Form.form @@ -7,6 +7,10 @@ ТаблицаКонтактов 13 + + <key>ru</key> + <value>Таблица контактов</value> + true true @@ -243,10 +247,6 @@ ru Сохранить в контактах - - ru - Таблица контактов группа контакт вид электронной почты - ТаблицаКонтактовГруппаКонтактВидЭлектроннойПочтыExtendedTooltip 37 @@ -384,9 +384,6 @@ true true true - None - None - None true diff --git a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl index d12edfc3e..b2162e4aa 100644 --- a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl +++ b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl @@ -344,6 +344,8 @@ Строка.Представление = ВРег(Строка.Представление); КонецЦикла; + НайденныеКонтакты.Индексы.Добавить("Представление"); + // Для каждой строки проставим список найденных контактов. Для Каждого СтрокаТаблицы Из ТаблицаКонтактов Цикл Если Не ПустаяСтрока(СтрокаТаблицы.Адрес) Тогда @@ -567,6 +569,9 @@ &НаСервере Процедура ИзменитьКонтактнуюИнформациюДляВыбранных() + МетаданныеИсходящееПисьмо = Метаданные.Документы.ЭлектронноеПисьмоИсходящее; + МетаданныеВходящееПисьмо = Метаданные.Документы.ЭлектронноеПисьмоВходящее; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТаблицаКонтакты.Контакт, @@ -592,28 +597,34 @@ Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - - КонтактОбъект = Выборка.Контакт.ПолучитьОбъект(); - - СтрокаТабличнойЧасти = КонтактОбъект.КонтактнаяИнформация.Найти(Выборка.Вид,"Вид"); - Если СтрокаТабличнойЧасти = Неопределено Тогда - СтрокаТабличнойЧасти = КонтактОбъект.КонтактнаяИнформация.Добавить(); - СтрокаТабличнойЧасти.Вид = Выборка.Вид; - СтрокаТабличнойЧасти.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; - КонецЕсли; - - СтрокаТабличнойЧасти.Представление = Выборка.Адрес; - СтрокаТабличнойЧасти.АдресЭП = Выборка.Адрес; - Позиция = СтрНайти(СтрокаТабличнойЧасти.АдресЭП, "@"); - Если Позиция <> 0 Тогда - СтрокаТабличнойЧасти.ДоменноеИмяСервера = Сред(СтрокаТабличнойЧасти.АдресЭП, Позиция+1); - КонецЕсли; + Пока Выборка.Следующий() Цикл НачатьТранзакцию(); Попытка + МетаданныеКонтакта = Выборка.Контакт.Метаданные(); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеКонтакта.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Контакт); + Блокировка.Заблокировать(); + + КонтактОбъект = Выборка.Контакт.ПолучитьОбъект(); + + СтрокаТабличнойЧасти = КонтактОбъект.КонтактнаяИнформация.Найти(Выборка.Вид,"Вид"); + Если СтрокаТабличнойЧасти = Неопределено Тогда + СтрокаТабличнойЧасти = КонтактОбъект.КонтактнаяИнформация.Добавить(); + СтрокаТабличнойЧасти.Вид = Выборка.Вид; + СтрокаТабличнойЧасти.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; + КонецЕсли; + + СтрокаТабличнойЧасти.Представление = Выборка.Адрес; + СтрокаТабличнойЧасти.АдресЭП = Выборка.Адрес; + Позиция = СтрНайти(СтрокаТабличнойЧасти.АдресЭП, "@"); + Если Позиция <> 0 Тогда + СтрокаТабличнойЧасти.ДоменноеИмяСервера = Сред(СтрокаТабличнойЧасти.АдресЭП, Позиция+1); + КонецЕсли; + КонтактОбъект.Записать(); ВыполнятьЗамену = Истина; @@ -721,7 +732,44 @@ Запрос.УстановитьПараметр("Адрес",Выборка.Адрес); Запрос.УстановитьПараметр("Письмо",Письмо); - ВыборкаПисьма = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Результат = Запрос.Выполнить(); + МассивИсходящихПисем = Новый Массив; + МассивВходящихПисем = Новый Массив; + + ВыборкаПисьма = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаПисьма.Следующий() Цикл + + Если ТипЗнч(ВыборкаПисьма.Ссылка) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда + МассивВходящихПисем.Добавить(ВыборкаПисьма.Ссылка); + Иначе + МассивИсходящихПисем.Добавить(ВыборкаПисьма.Ссылка); + КонецЕсли; + + КонецЦикла; + + Если МассивВходящихПисем.Количество() > 0 Тогда + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеВходящееПисьмо.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", МассивВходящихПисем); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Блокировка.Заблокировать(); + + КонецЕсли; + + Если МассивИсходящихПисем.Количество() > 0 Тогда + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеИсходящееПисьмо.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", МассивИсходящихПисем); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Блокировка.Заблокировать(); + + КонецЕсли; + + ВыборкаПисьма.Сбросить(); + + ВыборкаПисьма = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПисьма.Следующий() Цикл ПисьмоОбъект = ВыборкаПисьма.Ссылка.ПолучитьОбъект(); diff --git a/SSL/src/CommonForms/ФайлыВТоме/Form.form b/SSL/src/CommonForms/ФайлыВТоме/Form.form index e5b6ca654..8d2ac6e83 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Form.form +++ b/SSL/src/CommonForms/ФайлыВТоме/Form.form @@ -113,6 +113,10 @@ Список 11 + + <key>ru</key> + <value>Список</value> + true true @@ -213,6 +217,10 @@ СписокАвтор 14 + + <key>ru</key> + <value>Автор</value> + true true @@ -250,6 +258,10 @@ СписокСсылка 27 + + <key>ru</key> + <value>Ссылка</value> + true true @@ -546,6 +558,8 @@ ЛОЖЬ КАК ЭтоПрисоединенныеФайлы ИЗ Справочник.ТомаХраненияФайлов КАК ХранилищеФайлов + Catalog.ТомаХраненияФайлов + true true true true diff --git a/SSL/src/CommonForms/ФайлыВТоме/Help/ru.html b/SSL/src/CommonForms/ФайлыВТоме/Help/ru.html index eb992f600..06c3f06be 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Help/ru.html +++ b/SSL/src/CommonForms/ФайлыВТоме/Help/ru.html @@ -6,9 +6,9 @@
            • Путь к файлу в томе - полное имя файла, включает подкаталог, в котором хранится файл;
            • Размер - объем в байтах;
            • Автор - пользователь, который добавил файл.

            Отбор файлов

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

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

              -

              См. также:

              +

              См. также:

              \ No newline at end of file diff --git a/SSL/src/CommonForms/ФайлыВТоме/Module.bsl b/SSL/src/CommonForms/ФайлыВТоме/Module.bsl index 6f364a69b..fa27dee08 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Module.bsl +++ b/SSL/src/CommonForms/ФайлыВТоме/Module.bsl @@ -97,6 +97,8 @@ &НаСервере Процедура НастроитьДинамическийСписок(Знач ИмяХранилища) + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); + ТекстЗапроса = "ВЫБРАТЬ | ХранилищеФайлов.Ссылка КАК Ссылка, @@ -113,10 +115,13 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяХранилища); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоПрисоединенныеФайлы", ?( ВРег(ИмяХранилища) = ВРег("ВерсииФайлов"), "ЛОЖЬ", "ИСТИНА")); + + СвойстваСписка.ОсновнаяТаблица = "Справочник." + ИмяХранилища; + СвойстваСписка.ДинамическоеСчитываниеДанных = Истина; + СвойстваСписка.ТекстЗапроса = ТекстЗапроса; + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка); - Список.ТекстЗапроса = ТекстЗапроса; Список.Параметры.УстановитьЗначениеПараметра("Том", Том); - Список.ОсновнаяТаблица = "Справочник." + ИмяХранилища; СохранитьНастройкиОтбора(Том, ИмяХранилищаФайлов); @@ -128,9 +133,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МетаданныеСправочники = Метаданные.Справочники; ИменаХранилищФайлов.Добавить(МетаданныеСправочники.ВерсииФайлов.Имя, МетаданныеСправочники.ВерсииФайлов.Представление()); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + Для каждого Справочник Из Метаданные.Справочники Цикл Если СтрЗаканчиваетсяНа(Справочник.Имя, "ПрисоединенныеФайлы") Тогда ИменаХранилищФайлов.Добавить(Справочник.Имя, Справочник.Представление()); @@ -162,10 +165,7 @@ КонецЕсли; Если ТекущиеДанные.ЭтоПрисоединенныеФайлы Тогда - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПрисоединенныеФайлыКлиент"); - МодульПрисоединенныеФайлыКлиент.ОткрытьФормуПрисоединенногоФайла(ТекущиеДанные.Ссылка); - КонецЕсли; + РаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка); Иначе ПоказатьЗначение(, ТекущиеДанные.Ссылка); КонецЕсли; diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form index b3b6cafbc..174caba8b 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form @@ -139,9 +139,6 @@ true true true - None - None - None true @@ -279,9 +276,6 @@ ExpandAllLevels true true - None - None - None true true @@ -445,9 +439,6 @@ true true true - None - None - None true true @@ -621,9 +612,6 @@ true true true - None - None - None true @@ -755,9 +743,6 @@ true true true - None - None - None true true @@ -1087,9 +1072,6 @@ true true true - None - None - None true @@ -1223,9 +1205,6 @@ true true true - None - None - None true true @@ -1694,9 +1673,6 @@ true true true - None - None - None true @@ -1830,9 +1806,6 @@ true true true - None - None - None true All false @@ -2303,9 +2276,6 @@ true true true - None - None - None true @@ -2437,9 +2407,6 @@ true true true - None - None - None true true @@ -2904,9 +2871,6 @@ true true true - None - None - None true false @@ -3371,9 +3335,6 @@ ExpandAllLevels true true - None - None - None true true @@ -3899,6 +3860,36 @@ true + + ИдентификаторТекущегоУзлаКД + + <key>ru</key> + <value>Идентификатор текущего узла КД</value> + + 8 + + + true + + + true + + + + ФормаПараметры + + <key>ru</key> + <value>Форма параметры</value> + + 9 + + + true + + + true + + ЗавершитьРедактирование @@ -3921,16 +3912,15 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <parameters> - <name>ТекущаяСтрока</name> - <valueType/> - <keyParameter>true</keyParameter> - </parameters> <commandInterface> <navigationPanel/> <commandBar/> </commandInterface> <extInfo xsi:type="form:ReportFormExtInfo"> + <handlers> + <event>BeforeLoadVariantAtServer</event> + <name>ПередЗагрузкойВариантаНаСервере</name> + </handlers> <handlers> <event>OnLoadUserSettingsAtServer</event> <name>ПриЗагрузкеПользовательскихНастроекНаСервере</name> diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl index 69e8d83ae..f2a6c9f9e 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl @@ -361,6 +361,17 @@ Возврат; КонецЕсли; + ФормаПараметры = Новый Структура( + "КлючНазначенияИспользования, КлючПользовательскихНастроек, + |Расшифровка, СформироватьПриОткрытии, ТолькоПросмотр, + |ФиксированныеНастройки, Раздел, Подсистема, ПодсистемаПредставление"); + ЗаполнитьЗначенияСвойств(ФормаПараметры, Параметры); + ФормаПараметры.Вставить("Отбор", Новый Структура); + Если ТипЗнч(Параметры.Отбор) = Тип("Структура") Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ФормаПараметры.Отбор, Параметры.Отбор, Истина); + Параметры.Отбор.Очистить(); + КонецЕсли; + Если Параметры.Свойство("ПредставлениеВарианта") И ЗначениеЗаполнено(Параметры.ПредставлениеВарианта) Тогда АвтоЗаголовок = Ложь; Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Изменение варианта отчета ""%1""'"), Параметры.ПредставлениеВарианта); @@ -372,6 +383,39 @@ КонецЕсли; КонецЕсли; + Если Не ЗначениеЗаполнено(Параметры.ПредставлениеВарианта) Тогда + Параметры.Свойство("ВариантНаименование", Параметры.ПредставлениеВарианта); + КонецЕсли; + + ПолныйПуть = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ПолныйПутьТекущегоУзлаКД"); + Если ЗначениеЗаполнено(ПолныйПуть) Тогда + НастройкиКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Вариант"); + Если НастройкиКД = Неопределено Тогда + НастройкиКД = Отчет.КомпоновщикНастроек.Настройки; + КонецЕсли; + КорневойУзел = ОтчетыКлиентСервер.НайтиЭлементПоПолномуПути(НастройкиКД, ПолныйПуть); + Если КорневойУзел <> Неопределено Тогда + ИдентификаторТекущегоУзлаКД = НастройкиКД.ПолучитьИдентификаторПоОбъекту(КорневойУзел); + КонецЕсли; + КонецЕсли; + Если ТипЗнч(ИдентификаторТекущегоУзлаКД) <> Тип("ИдентификаторКомпоновкиДанных") Тогда + ИдентификаторТекущегоУзлаКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ТекущаяСтрока"); + Если ТипЗнч(ИдентификаторТекущегоУзлаКД) <> Тип("ИдентификаторКомпоновкиДанных") Тогда + ИдентификаторТекущегоУзлаКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИдентификаторТекущегоУзлаКД"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗагрузкойВариантаНаСервере(НовыеНастройкиКД) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") Тогда + ОтчетыСервер.УстановитьФиксированныеОтборы(ФормаПараметры.Отбор, НовыеНастройкиКД, НастройкиОтчета); + КонецЕсли; КонецПроцедуры &НаСервере @@ -383,7 +427,7 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - Если Параметры.ТекущаяСтрока <> Неопределено Тогда + Если ТипЗнч(ИдентификаторТекущегоУзлаКД) = Тип("ИдентификаторКомпоновкиДанных") Тогда ПодключитьОбработчикОжидания("УстановитьТекущуюСтроку", 0.1, Истина); КонецЕсли; КонецПроцедуры @@ -425,7 +469,7 @@ &НаКлиенте Процедура УстановитьТекущуюСтроку() - Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока = Параметры.ТекущаяСтрока; + Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока = ИдентификаторТекущегоУзлаКД; КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form index 3fb1e045d..629ba35e4 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form @@ -122,6 +122,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Команды состава группировки добавление удаление</value> + КомандыСоставаГруппировки_ДобавлениеУдалениеРасширеннаяПодсказка 607 @@ -196,6 +200,10 @@ true + + <key>ru</key> + <value>Команды состава группировки приоритет</value> + КомандыСоставаГруппировки_ПриоритетРасширеннаяПодсказка 613 @@ -206,13 +214,19 @@ Left - + + Compact + true true true + + <key>ru</key> + <value>Команды состава группировки</value> + КомандыСоставаГруппировкиРасширеннаяПодсказка 605 @@ -231,6 +245,10 @@ СоставГруппировки 624 + + <key>ru</key> + <value>Состав группировки</value> + true true @@ -338,6 +356,10 @@ true + + <key>ru</key> + <value>Состав группировки группа 1</value> + СоставГруппировкиГруппа1РасширеннаяПодсказка 644 @@ -453,6 +475,10 @@ true + + <key>ru</key> + <value>Состав группировки группа 2</value> + СоставГруппировкиГруппа2РасширеннаяПодсказка 818 @@ -638,6 +664,10 @@ true + + <key>ru</key> + <value>Команды состава группировки добавление удаление 1</value> + КомандыСоставаГруппировки_ДобавлениеУдаление1РасширеннаяПодсказка 648 @@ -712,6 +742,10 @@ true + + <key>ru</key> + <value>Команды состава группировки приоритет 1</value> + КомандыСоставаГруппировки_Приоритет1РасширеннаяПодсказка 654 @@ -770,10 +804,6 @@ ru Состав группировки - - ru - Страница состав группировки - СтраницаСоставГруппировкиРасширеннаяПодсказка 586 @@ -809,10 +839,6 @@ ru Быстрые отборы - - ru - Быстрые отборы - БыстрыеОтборыРасширеннаяПодсказка 99 @@ -841,6 +867,10 @@ true + + <key>ru</key> + <value>Обычные отборы</value> + ОбычныеОтборыРасширеннаяПодсказка 40 @@ -866,6 +896,10 @@ Отборы 342 + + <key>ru</key> + <value>Отборы</value> + true true @@ -974,6 +1008,10 @@ true + + <key>ru</key> + <value>Отборы группа 1</value> + ОтборыГруппа1РасширеннаяПодсказка 362 @@ -1137,6 +1175,10 @@ true + + <key>ru</key> + <value>Отборы группа 2</value> + ОтборыГруппа2РасширеннаяПодсказка 805 @@ -1323,6 +1365,10 @@ true + + <key>ru</key> + <value>Команды отборов добавление удаление</value> + КомандыОтборов_ДобавлениеУдалениеРасширеннаяПодсказка 325 @@ -1395,6 +1441,10 @@ true + + <key>ru</key> + <value>Команды отборов приоритет</value> + КомандыОтборов_ПриоритетРасширеннаяПодсказка 416 @@ -1405,7 +1455,9 @@ Left - + + Compact + КомандыОтборов_Группы @@ -1472,6 +1524,10 @@ true + + <key>ru</key> + <value>Команды отборов группы</value> + КомандыОтборов_ГруппыРасширеннаяПодсказка 337 @@ -1488,7 +1544,7 @@ КомандыОтборов_Флажки 1059 - ОтборыОтборы_УстановитьФлажки + Отборы_УстановитьФлажки 1061 true true @@ -1496,7 +1552,7 @@ true - ОтборыОтборы_УстановитьФлажкиРасширеннаяПодсказка + Отборы_УстановитьФлажкиРасширеннаяПодсказка 1062 Label true @@ -1514,7 +1570,7 @@ Auto - ОтборыОтборы_СнятьФлажки + Отборы_СнятьФлажки 1063 true true @@ -1522,7 +1578,7 @@ true - ОтборыОтборы_СнятьФлажкиРасширеннаяПодсказка + Отборы_СнятьФлажкиРасширеннаяПодсказка 1064 Label true @@ -1548,10 +1604,6 @@ ru Команды отборов флажки - - ru - Команды отборов флажки - КомандыОтборов_ФлажкиРасширеннаяПодсказка 1060 @@ -1562,7 +1614,167 @@ Left - + + Compact + + + + КомандыОтборов_Показывать + 1086 + + Отборы_ПоказыватьВШапкеОтчета + 1090 + true + true + + true + + + Отборы_ПоказыватьВШапкеОтчетаРасширеннаяПодсказка + 1091 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьВШапкеОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчета + 1094 + true + true + + true + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчетаРасширеннаяПодсказка + 1095 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьВНастройкахОтчета + 1088 + true + true + + true + + + Отборы_ПоказыватьВНастройкахОтчетаРасширеннаяПодсказка + 1089 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьВНастройкахОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета + 1096 + true + true + + true + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчетаРасширеннаяПодсказка + 1097 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_НеПоказывать + 1092 + true + true + + true + + + Отборы_НеПоказыватьРасширеннаяПодсказка + 1093 + Label + true + true + + Left + + + Form.Command.Отборы_НеПоказывать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Показывать</value> + + + КомандыОтборов_ПоказыватьРасширеннаяПодсказка + 1087 + Label + true + true + + Left + + + Popup + + Auto + Normal + Left @@ -1732,6 +1944,10 @@ true + + <key>ru</key> + <value>Команды отборов добавление удаление 1</value> + КомандыОтборов_ДобавлениеУдаление1РасширеннаяПодсказка 404 @@ -1804,6 +2020,10 @@ true + + <key>ru</key> + <value>Команды отборов приоритет 1</value> + КомандыОтборов_Приоритет1РасширеннаяПодсказка 422 @@ -1881,6 +2101,10 @@ true + + <key>ru</key> + <value>Команды отборов группы 1</value> + КомандыОтборов_Группы1РасширеннаяПодсказка 410 @@ -1897,7 +2121,7 @@ КомандыОтборов_Флажки1 1065 - ОтборыОтборы_УстановитьФлажки1 + Отборы_УстановитьФлажки1 1067 true true @@ -1905,7 +2129,7 @@ true - ОтборыОтборы_УстановитьФлажки1РасширеннаяПодсказка + Отборы_УстановитьФлажки1РасширеннаяПодсказка 1068 Label true @@ -1923,7 +2147,7 @@ Auto - ОтборыОтборы_СнятьФлажки1 + Отборы_СнятьФлажки1 1069 true true @@ -1931,7 +2155,7 @@ true - ОтборыОтборы_СнятьФлажки1РасширеннаяПодсказка + Отборы_СнятьФлажки1РасширеннаяПодсказка 1070 Label true @@ -1957,10 +2181,6 @@ ru Команды отборов флажки - - ru - Команды отборов флажки - КомандыОтборов_Флажки1РасширеннаяПодсказка 1066 @@ -1973,6 +2193,168 @@ + + КомандыОтборов_Показывать1 + 1098 + + Отборы_ПоказыватьВШапкеОтчета1 + 1100 + true + true + + true + + + Отборы_ПоказыватьВШапкеОтчета1РасширеннаяПодсказка + 1101 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьВШапкеОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчета1 + 1102 + true + true + + true + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчета1РасширеннаяПодсказка + 1103 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьВНастройкахОтчета1 + 1104 + true + true + + true + + + Отборы_ПоказыватьВНастройкахОтчета1РасширеннаяПодсказка + 1105 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьВНастройкахОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета1 + 1106 + true + true + + true + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета1РасширеннаяПодсказка + 1107 + Label + true + true + + Left + + + Form.Command.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета + Normal + Auto + true + true + UserCmds + Auto + + + Отборы_НеПоказывать1 + 1108 + true + true + + true + + + Отборы_НеПоказывать1РасширеннаяПодсказка + 1109 + Label + true + true + + Left + + + Form.Command.Отборы_НеПоказывать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Показывать</value> + + + ru + Команды отборов показывать + + + КомандыОтборов_Показывать1РасширеннаяПодсказка + 1099 + Label + true + true + + Left + + + Popup + + Auto + Normal + + Tree true @@ -2003,7 +2385,7 @@ Отборы.ИндексКартинки - CommonPicture.ПиктограммыПараметровИОтборов + CommonPicture.ПиктограммыНастроекОтчета true @@ -2093,12 +2475,8 @@ <key>ru</key> - <value>Группа есть вложенные отборы</value> + <value>Есть вложенные отборы</value> - - ru - Группа есть вложенные отборы - ГруппаЕстьВложенныеОтборыРасширеннаяПодсказка 807 @@ -2125,12 +2503,8 @@ <key>ru</key> - <value>Группа отборы расширенный режим</value> + <value>Отборы расширенный режим</value> - - ru - Группа отборы расширенный режим - ГруппаОтборыРасширенныйРежимРасширеннаяПодсказка 925 @@ -2193,6 +2567,10 @@ ВыбранныеПоля 230 + + <key>ru</key> + <value>Выбранные поля</value> + true true @@ -2303,12 +2681,8 @@ <key>ru</key> - <value>Выбранные поля группа1</value> + <value>Выбранные поля группа 1</value> - - ru - Выбранные поля группа1 - ВыбранныеПоляГруппа1РасширеннаяПодсказка 258 @@ -2396,6 +2770,10 @@ true + + <key>ru</key> + <value>Команды выбранных полей добавление удаление</value> + КомандыВыбранныхПолей_ДобавлениеУдалениеРасширеннаяПодсказка 213 @@ -2470,6 +2848,10 @@ true + + <key>ru</key> + <value>Команды выбранных полей приоритет</value> + КомандыВыбранныхПолей_ПриоритетРасширеннаяПодсказка 219 @@ -2480,7 +2862,9 @@ Left - + + Compact + КомандыВыбранныхПолей_Группы @@ -2551,10 +2935,6 @@ ru Команды выбранных полей группы - - ru - Команды выбранных полей группы - КомандыВыбранныхПолей_ГруппыРасширеннаяПодсказка 285 @@ -2631,10 +3011,6 @@ ru Команды выбранных полей флажки - - ru - Команды выбранных полей флажки - КомандыВыбранныхПолей_ФлажкиРасширеннаяПодсказка 1036 @@ -2645,7 +3021,9 @@ Left - + + Compact + Left @@ -2827,6 +3205,10 @@ true + + <key>ru</key> + <value>Команды выбранных полей добавление удаление 1</value> + КомандыВыбранныхПолей_ДобавлениеУдаление1РасширеннаяПодсказка 398 @@ -2901,6 +3283,10 @@ true + + <key>ru</key> + <value>Команды выбранных полей приоритет 1</value> + КомандыВыбранныхПолей_Приоритет1РасширеннаяПодсказка 392 @@ -2982,10 +3368,6 @@ ru Команды выбранных полей группы - - ru - Команды выбранных полей группы - КомандыВыбранныхПолей_Группы1РасширеннаяПодсказка 386 @@ -3062,10 +3444,6 @@ ru Команды выбранных полей флажки - - ru - Команды выбранных полей флажки - КомандыВыбранныхПолей_Флажки1РасширеннаяПодсказка 1042 @@ -3209,10 +3587,6 @@ ru Команды полей и сортировок - - ru - Команды полей и сортировок - Center КомандыПолейИСортировокРасширеннаяПодсказка @@ -3237,6 +3611,10 @@ Сортировка 130 + + <key>ru</key> + <value>Сортировка</value> + true true @@ -3343,6 +3721,10 @@ true + + <key>ru</key> + <value>Сортировка группа 1</value> + СортировкаГруппа1РасширеннаяПодсказка 164 @@ -3473,10 +3855,6 @@ ru Команды сортировки добавление удаление - - ru - Команды сортировки добавление удаление - КомандыСортировки_ДобавлениеУдалениеРасширеннаяПодсказка 205 @@ -3553,10 +3931,6 @@ ru Команды сортировки приоритет - - ru - Команды сортировки приоритет - КомандыСортировки_ПриоритетРасширеннаяПодсказка 176 @@ -3567,7 +3941,9 @@ Left - + + Compact + КомандыСортировки_Направление @@ -3631,10 +4007,6 @@ ru Команды сортировки направление - - ru - Команды сортировки направление - КомандыСортировки_НаправлениеРасширеннаяПодсказка 174 @@ -3711,10 +4083,6 @@ ru Команды сортировки флажки - - ru - Команды сортировки флажки - КомандыСортировки_ФлажкиРасширеннаяПодсказка 1048 @@ -3725,7 +4093,9 @@ Left - + + Compact + Left @@ -3907,10 +4277,6 @@ ru Команды сортировки добавление удаление - - ru - Команды сортировки добавление удаление - КомандыСортировки_ДобавлениеУдаление1РасширеннаяПодсказка 1016 @@ -3987,10 +4353,6 @@ ru Команды сортировки приоритет - - ru - Команды сортировки приоритет - КомандыСортировки_Приоритет1РасширеннаяПодсказка 1022 @@ -4065,10 +4427,6 @@ ru Команды сортировки направление - - ru - Команды сортировки направление - КомандыСортировки_Направление1РасширеннаяПодсказка 1028 @@ -4145,10 +4503,6 @@ ru Команды сортировки флажки - - ru - Команды сортировки флажки - КомандыСортировки_Флажки1РасширеннаяПодсказка 1054 @@ -4202,12 +4556,8 @@ <key>ru</key> - <value>Группа сортировки</value> + <value>Сортировки</value> - - ru - Группа сортировки - ГруппаСортировкиРасширеннаяПодсказка 1014 @@ -4234,12 +4584,8 @@ <key>ru</key> - <value>Группа поля и сортировки</value> + <value>Поля и сортировки</value> - - ru - Группа поля и сортировки - ГруппаПоляИСортировкиРасширеннаяПодсказка 901 @@ -4343,6 +4689,10 @@ true + + <key>ru</key> + <value>Есть вложенные поля или сортировки</value> + ГруппаЕстьВложенныеПоляИлиСортировкиРасширеннаяПодсказка 1003 @@ -4371,10 +4721,6 @@ ru Поля и сортировки - - ru - Страница выбранные поля и сортировки - СтраницаВыбранныеПоляИСортировкиРасширеннаяПодсказка 127 @@ -4406,6 +4752,10 @@ true + + <key>ru</key> + <value>Страница дополнительно подвал</value> + СтраницаДополнительноПодвалРасширеннаяПодсказка 52 @@ -4434,6 +4784,10 @@ true + + <key>ru</key> + <value>Страница дополнительно группировки</value> + СтраницаДополнительноГруппировкиРасширеннаяПодсказка 50 @@ -4462,6 +4816,10 @@ true + + <key>ru</key> + <value>Страница дополнительно шапка</value> + СтраницаДополнительноШапкаРасширеннаяПодсказка 48 @@ -4488,6 +4846,10 @@ Оформление 838 + + <key>ru</key> + <value>Оформление</value> + true true @@ -4524,6 +4886,10 @@ Оформление.Использование + + OnChange + ОформлениеИспользованиеПриИзменении + ОформлениеИспользованиеРасширеннаяПодсказка 893 @@ -4592,6 +4958,10 @@ true + + <key>ru</key> + <value>Оформление группа 1</value> + ОформлениеГруппа1РасширеннаяПодсказка 890 @@ -4729,6 +5099,10 @@ true + + <key>ru</key> + <value>Команды оформления добавление удаление</value> + КомандыОформления_ДобавлениеУдалениеРасширеннаяПодсказка 827 @@ -4801,6 +5175,10 @@ true + + <key>ru</key> + <value>Команды оформления приоритет</value> + КомандыОформления_ПриоритетРасширеннаяПодсказка 833 @@ -4811,7 +5189,9 @@ Left - + + Compact + Left @@ -4939,8 +5319,11 @@ true true true + + Оформление.ИндексКартинки + - CommonPicture.ПиктограммыЭлементов + CommonPicture.ПиктограммыНастроекОтчета true @@ -4951,12 +5334,8 @@ <key>ru</key> - <value>Группа оформление расширенный режим</value> + <value>Оформление расширенный режим</value> - - ru - Группа оформление расширенный режим - ГруппаОформлениеРасширенныйРежимРасширеннаяПодсказка 923 @@ -5063,12 +5442,8 @@ <key>ru</key> - <value>Группа есть вложенное оформление</value> + <value>Есть вложенное оформление</value> - - ru - Группа есть вложенное оформление - ГруппаЕстьВложенноеОформлениеРасширеннаяПодсказка 927 @@ -5097,10 +5472,6 @@ ru Оформление - - ru - Страница оформление - СтраницаОформлениеРасширеннаяПодсказка 591 @@ -5127,6 +5498,10 @@ СтруктураВарианта 429 + + <key>ru</key> + <value>Структура варианта</value> + true true @@ -5234,6 +5609,10 @@ true + + <key>ru</key> + <value>Структура варианта группа 2</value> + СтруктураВариантаГруппа2РасширеннаяПодсказка 449 @@ -5524,63 +5903,63 @@ UserCmds Auto + + СтруктураВарианта_ДобавитьТаблицу + 780 + true + true + + true + + + СтруктураВарианта_ДобавитьТаблицуРасширеннаяПодсказка + 781 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ДобавитьТаблицу + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтруктураВарианта_ДобавитьДиаграмму + 778 + true + true + + true + + + СтруктураВарианта_ДобавитьДиаграммуРасширеннаяПодсказка + 779 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ДобавитьДиаграмму + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + СтруктураВарианта_ДобавлениеТаблицИДиаграмм 776 - - СтруктураВарианта_ДобавитьТаблицу - 780 - true - true - - true - - - СтруктураВарианта_ДобавитьТаблицуРасширеннаяПодсказка - 781 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ДобавитьТаблицу - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СтруктураВарианта_ДобавитьДиаграмму - 778 - true - true - - true - - - СтруктураВарианта_ДобавитьДиаграммуРасширеннаяПодсказка - 779 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ДобавитьДиаграмму - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - true true @@ -5590,10 +5969,6 @@ ru Структура варианта добавление таблиц и диаграмм - - ru - Структура варианта добавление таблиц и диаграмм - СтруктураВарианта_ДобавлениеТаблицИДиаграммРасширеннаяПодсказка 777 @@ -5606,26 +5981,6 @@ - true - true - - true - - - КомандыСтруктурыВарианта_ДобавлениеРасширеннаяПодсказка - 469 - Label - true - true - - Left - - - - - - КомандыСтруктурыВарианта_Изменение - 516 СтруктураВарианта_Изменить 512 @@ -5687,12 +6042,32 @@ <key>ru</key> - <value>Команды структуры варианта изменение</value> + <value>Команды структуры варианта добавление</value> - + + КомандыСтруктурыВарианта_ДобавлениеРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + + + + КомандыСтруктурыВарианта_Изменение + 516 + true + true + + true + + <key>ru</key> <value>Команды структуры варианта изменение</value> - </toolTip> + КомандыСтруктурыВарианта_ИзменениеРасширеннаяПодсказка 517 @@ -5765,6 +6140,10 @@ true + + <key>ru</key> + <value>Команды структуры варианта движение по иерархии</value> + КомандыСтруктурыВарианта_ДвижениеПоИерархииРасширеннаяПодсказка 457 @@ -5775,7 +6154,9 @@ Left - + + Compact + КомандыСтруктурыВарианта_ДвижениеВнутриРодителя @@ -5837,6 +6218,10 @@ true + + <key>ru</key> + <value>Команды структуры варианта движение внутри родителя</value> + КомандыСтруктурыВарианта_ДвижениеВнутриРодителяРасширеннаяПодсказка 463 @@ -5847,7 +6232,9 @@ Left - + + Compact + КомандыСтруктурыВарианта_Флажки @@ -5913,10 +6300,6 @@ ru Команды структуры варианта флажки - - ru - Команды структуры варианта флажки - КомандыСтруктурыВарианта_ФлажкиРасширеннаяПодсказка 519 @@ -5927,7 +6310,9 @@ Left - + + Compact + СтруктураВариантаСтруктураВарианта_СохранитьВФайл @@ -6191,10 +6576,6 @@ ru Структура варианта добавление таблиц и диаграмм - - ru - Структура варианта добавление таблиц и диаграмм - СтруктураВарианта_ДобавлениеТаблицИДиаграмм1РасширеннаяПодсказка 783 @@ -6212,6 +6593,10 @@ true + + <key>ru</key> + <value>Команды структуры варианта добавление 1</value> + КомандыСтруктурыВарианта_Добавление1РасширеннаяПодсказка 742 @@ -6290,10 +6675,6 @@ ru Команды структуры варианта изменение - - ru - Команды структуры варианта изменение - КомандыСтруктурыВарианта_Изменение1РасширеннаяПодсказка 750 @@ -6366,6 +6747,10 @@ true + + <key>ru</key> + <value>Команды структуры варианта движение по иерархии 1</value> + КомандыСтруктурыВарианта_ДвижениеПоИерархии1РасширеннаяПодсказка 756 @@ -6438,6 +6823,10 @@ true + + <key>ru</key> + <value>Команды структуры варианта движение внутри родителя 1</value> + КомандыСтруктурыВарианта_ДвижениеВнутриРодителя1РасширеннаяПодсказка 762 @@ -6516,10 +6905,6 @@ ru Команды структуры варианта флажки - - ru - Команды структуры варианта флажки - КомандыСтруктурыВарианта_Флажки1РасширеннаяПодсказка 768 @@ -6563,7 +6948,7 @@ СтруктураВарианта.ИндексКартинки - CommonPicture.ПиктограммыСтруктурыОтчета + CommonPicture.ПиктограммыНастроекОтчета true @@ -6576,10 +6961,6 @@ ru Структура - - ru - Страница структура варианта - СтраницаСтруктураВариантаРасширеннаяПодсказка 428 @@ -6741,10 +7122,6 @@ ru Страницы настроек - - ru - Страницы настроек - СтраницыНастроекРасширеннаяПодсказка 36 @@ -6845,12 +7222,8 @@ <key>ru</key> - <value>Группа есть вложенные отчеты</value> + <value>Есть вложенные отчеты</value> - - ru - Группа есть вложенные отчеты - ГруппаЕстьВложенныеОтчетыРасширеннаяПодсказка 792 @@ -6870,6 +7243,144 @@ Auto + + ГруппаЕстьНесуществующиеПоля + 1110 + + КартинкаИнформация5 + 1112 + + <key>ru</key> + <value>Картинка информация</value> + + true + true + + true + + + КартинкаИнформация5РасширеннаяПодсказка + 1114 + Label + true + true + + Left + + + + КартинкаИнформация5КонтекстноеМеню + 1113 + true + + true + true + Center + + + CommonPicture.Предупреждение + + + + + ПодсказкаЕстьНесуществующиеПоля + 1115 + + <key>ru</key> + <value>В настройках используются несуществующие поля.</value> + + true + true + + true + + + ПодсказкаЕстьНесуществующиеПоляРасширеннаяПодсказка + 1117 + Label + true + true + + Left + + + + ПодсказкаЕстьНесуществующиеПоляКонтекстноеМеню + 1116 + true + + Label + true + + + URLProcessing + ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки + + Left + + + + ОчиститьНастройкиОтНесуществующихПолей + 1118 + true + true + + true + + + ОчиститьНастройкиОтНесуществующихПолейРасширеннаяПодсказка + 1119 + Label + true + true + + Left + + + UsualButton + Form.Command.ОчиститьНастройкиОтНесуществующихПолей + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Есть несуществующие поля</value> + + Button + + ГруппаЕстьНесуществующиеПоляРасширеннаяПодсказка + 1111 + + <key>ru</key> + <value>Несуществующие поля могут появиться, если разработчик отчета удалил поле или запретил его вывод. +Использование таких полей может привести к ошибкам при формировании отчета. +Рекомендуется удалить несуществующие поля из настроек отчета или заменить их на существующие.</value> + + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + КомандыФормы 73 @@ -7110,6 +7621,10 @@ true + + <key>ru</key> + <value>Команды формы правая</value> + true КомандыФормы_ПраваяРасширеннаяПодсказка @@ -7131,6 +7646,10 @@ true + + <key>ru</key> + <value>Команды формы</value> + true КомандыФормыРасширеннаяПодсказка @@ -7288,21 +7807,6 @@ true - - БыстрыйПоискОтключаемыхСвязей - - <key>ru</key> - <value>Быстрый поиск отключаемых связей</value> - - 19 - - - true - - - true - - БыстрыйПоискПользовательскихНастроек @@ -10079,6 +10583,153 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>Отборы_ПоказыватьВНастройкахОтчета</name> + <title> + <key>ru</key> + <value>В настройках отчета</value> + + 40 + + ru + Отборы показывать в настройках отчета + + + true + + + StdPicture.Attribute + + + + Отборы_ПоказыватьВНастройкахОтчета + + + DontUse + Auto + + + Отборы_ПоказыватьВШапкеОтчета + + <key>ru</key> + <value>В шапке отчета</value> + + 41 + + ru + Отборы показывать в шапке отчета + + + true + + + CommonPicture.БыстрыйДоступ + + + + Отборы_ПоказыватьВШапкеОтчета + + + DontUse + Auto + + + Отборы_НеПоказывать + + <key>ru</key> + <value>Не показывать</value> + + 42 + + ru + Отборы не показывать + + + true + + + CommonPicture.СкрытаяНастройкаОтчета + + + + Отборы_НеПоказывать + + + DontUse + Auto + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчета + + <key>ru</key> + <value>Только флажок в шапке отчета</value> + + 43 + + ru + Отборы показывать в шапке отчета + + + true + + + CommonPicture.БыстрыйДоступСФлажком + + + + Отборы_ПоказыватьТолькоФлажокВШапкеОтчета + + + DontUse + Auto + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета + + <key>ru</key> + <value>Только флажок в настройках отчета</value> + + 44 + + ru + Отборы показывать в настройках отчета + + + true + + + CommonPicture.ОбычныйДоступСФлажком + + + + Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета + + + DontUse + Auto + + + ОчиститьНастройкиОтНесуществующихПолей + + <key>ru</key> + <value>Очистить</value> + + 45 + + ru + Очистить настройки от несуществующих полей + + + true + + + + ОчиститьНастройкиОтНесуществующихПолей + + + DontUse + Auto + diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl index add01470b..29c5acdb8 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl @@ -1,17 +1,20 @@ #Область ОписаниеПеременных &НаКлиенте -Перем ПеременныеКлиента; +Перем ЭлементСпискаДоНачалаИзмененияНаКлиенте; +&НаКлиенте +Перем ИсточникПеретаскиванияНаКлиенте; +&НаКлиенте +Перем ПараметрыЗаполненияНаКлиенте; #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ФОРМА - #Область ОбработчикиСобытийФормы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -64,7 +67,7 @@ Заголовок = НСтр("ru = 'Настройки отчета'") + " """ + ВариантНаименование + """"; КонецЕсли; - Элементы.РасширенныйРежим.Видимость = НастройкиОтчета.РазрешеноМенятьВарианты; + Элементы.РасширенныйРежим.Видимость = НастройкиОтчета.РазрешеноИзменятьВарианты; Если РежимИзмененияУзлаВарианта Тогда ИмяСтраницы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИмяСтраницы", "СтраницаСоставГруппировки"); @@ -93,8 +96,6 @@ ПостоянныеКоманды.Добавить(Команда.Имя); КонецЦикла; - ДобавитьУсловноеОформление(); - НеобходимоОбновитьНастройки = Истина; КонецПроцедуры @@ -163,7 +164,6 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - ПеременныеКлиента = Новый Структура; ПоказатьРезультатЗаполненияНастроек(); КонецПроцедуры @@ -191,9 +191,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ЭЛЕМЕНТЫ - #Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте @@ -205,7 +202,7 @@ Иначе ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина); КонецЕсли; - БыстрыеНастройкиЗаполнитьКлиент(ПараметрыЗаполнения); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); КонецПроцедуры &НаКлиенте @@ -233,7 +230,8 @@ &НаКлиенте Процедура ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки(Элемент, Адрес, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ПерейтиКНастройкеВложенныхОтчетов(); + СтрокаТаблицы = Элементы.СтруктураВарианта.ТекущиеДанные; + ИзменитьУзелВарианта(СтрокаТаблицы, Неопределено, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -255,6 +253,8 @@ КонецЕсли; КонецЕсли; + ОтчетыКлиент.ОтразитьИзмененияВПодчиненных(ЭтотОбъект, ИдентификаторЭлемента, ПользовательскаяНастройкаКД); + ПользовательскиеНастройкиМодифицированы = Истина; Если РасширенныйРежим = 1 Тогда Найденные = НайтиНастройкуВарианта(ЭтотОбъект, ИдентификаторЭлемента); @@ -272,6 +272,9 @@ ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда Значение = ПользовательскаяНастройкаКД.Значение; + Если НастройкиОтчета.ПолноеИмя = "Отчет.УниверсальныйОтчет" Тогда + ОбновитьПараметрыУниверсальногоОтчета(ПользовательскаяНастройкаКД); + КонецЕсли; ИначеЕсли ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда Значение = ПользовательскаяНастройкаКД.ПравоеЗначение; Иначе @@ -282,33 +285,7 @@ ПользовательскаяНастройкаКД.Использование = Истина; КонецЕсли; - Если ПользовательскаяНастройкаКД.Использование Тогда // Очистка значений при изменении значения. - Найденные = ОтключаемыеСвязи.НайтиСтроки(Новый Структура("ВедущийИдентификаторВФорме", ИдентификаторЭлемента)); - Для Каждого Связь Из Найденные Цикл - Если Не ЗначениеЗаполнено(Связь.ПодчиненныйИдентификаторВФорме) Тогда - Продолжить; - КонецЕсли; - Если Связь.ТипСвязи = "ПараметровВыбора" Тогда - Если Связь.ПодчиненныйДействие <> РежимИзмененияСвязанногоЗначения.Очищать Тогда - Продолжить; - КонецЕсли; - Иначе - Продолжить; - КонецЕсли; - ПодчиненныйДополнительно = НайтиДополнительныеНастройкиЭлемента(Связь.ПодчиненныйИдентификаторВФорме); - Если ПодчиненныйДополнительно <> Неопределено Тогда - Если ПодчиненныйДополнительно.ВыводитьФлажок Тогда - ПодчиненныйНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(Связь.ПодчиненныйИдентификаторВФорме); - Если ПодчиненныйНастройкаКД <> Неопределено Тогда - ПодчиненныйНастройкаКД.Использование = Ложь; - КонецЕсли; - КонецЕсли; - Если Не ПодчиненныйДополнительно.ОграничиватьВыборУказаннымиЗначениями Тогда - ПодчиненныйДополнительно.ЗначенияДляВыбора.Очистить(); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; + ОтчетыКлиент.ОтразитьИзмененияВПодчиненных(ЭтотОбъект, ИдентификаторЭлемента, ПользовательскаяНастройкаКД); ПользовательскиеНастройкиМодифицированы = Истина; КонецПроцедуры @@ -484,7 +461,7 @@ ЭлементСпискаДоНачалаИзменения = Новый Структура("Идентификатор, Пометка, Значение, Представление"); ЗаполнитьЗначенияСвойств(ЭлементСпискаДоНачалаИзменения, ЭлементСпискаВФорме); ЭлементСпискаДоНачалаИзменения.Идентификатор = СтрокаИдентификатор; - ПеременныеКлиента.Вставить("ЭлементСпискаДоНачалаИзменения", ЭлементСпискаДоНачалаИзменения); + ЭлементСпискаДоНачалаИзмененияНаКлиенте = ЭлементСпискаДоНачалаИзменения; КонецПроцедуры &НаКлиенте @@ -510,14 +487,13 @@ Иначе Для Каждого ЭлементСпискаДубльВФорме Из СписокЗначенийВФорме Цикл Если ЭлементСпискаДубльВФорме.Значение = Значение И ЭлементСпискаДубльВФорме <> ЭлементСпискаВФорме Тогда - Состояние(НСтр("ru = 'Обнаружены дублирующиеся записи. Редактирование отменено.'")); ОтменаЗавершенияРедактирования = Истина; // Запрет дублей. Прервать; КонецЕсли; КонецЦикла; КонецЕсли; - ЭлементСпискаДоНачалаИзменения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ЭлементСпискаДоНачалаИзменения"); + ЭлементСпискаДоНачалаИзменения = ЭлементСпискаДоНачалаИзмененияНаКлиенте; ЕстьИнформация = (ЭлементСпискаДоНачалаИзменения <> Неопределено И ЭлементСпискаДоНачалаИзменения.Идентификатор = СтрокаИдентификатор); Если Не ОтменаЗавершенияРедактирования И ЕстьИнформация И ЭлементСпискаДоНачалаИзменения.Значение <> Значение Тогда ДополнительныеНастройки = НайтиДополнительныеНастройкиЭлемента(ИдентификаторЭлемента); @@ -868,9 +844,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА Сортировка - #Область ОбработчикиСобытийЭлементовТаблицыФормыСортировка &НаКлиенте @@ -911,9 +884,10 @@ ЭлементКД.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; СтрокаТаблицы = Результат.СтрокаТаблицы; - СтрокаТаблицы.Использование = ЭлементКД.Использование; - СтрокаТаблицы.Представление = ДоступноеПолеКД.Заголовок; - СтрокаТаблицы.Направление = ЭлементКД.ТипУпорядочивания; + СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.Представление = ДоступноеПолеКД.Заголовок; + СтрокаТаблицы.Направление = ЭлементКД.ТипУпорядочивания; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); УстановитьМодифицированность(); КонецПроцедуры @@ -944,24 +918,32 @@ &НаКлиенте Процедура Сортировка_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Сортировка"); - Сценарий.Вставить("Направление", -1); + + Контекст = НовыйКонтекст("Сортировка", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); - ЗапуститьСценарий(Сценарий); КонецПроцедуры &НаКлиенте Процедура Сортировка_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Сортировка"); - Сценарий.Вставить("Направление", 1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("Сортировка", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте @@ -991,7 +973,7 @@ Процедура СортировкаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле) // Возникает в приемнике при окончании перетаскивания когда все проверки пройдены. СтандартнаяОбработка = Ложь; - ИсточникПеретаскивания = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ИсточникПеретаскивания"); + ИсточникПеретаскивания = ИсточникПеретаскиванияНаКлиенте; Если ИсточникПеретаскивания = Неопределено Тогда Возврат; КонецЕсли; @@ -1034,9 +1016,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА ВыбранныеПоля - #Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля &НаКлиенте @@ -1059,6 +1038,10 @@ &НаКлиенте Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + Если РасширенныйРежим = 0 Тогда + Возврат; + КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект); ТаблицыПолейПоказатьВыборПоля("ВыбранныеПоля", Обработчик); КонецПроцедуры @@ -1079,7 +1062,7 @@ СтрокаТаблицы.Использование = ЭлементКД.Использование; СтрокаТаблицы.Представление = ДоступноеПолеКД.Заголовок; СтрокаТаблицы.ЭтоГруппа = Ложь; - СтрокаТаблицы.ИндексКартинки = 4; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); СтрокаТаблицы.ПолеКД = ЭлементКД.Поле; ПослеИзмененияФлажкаИспользование("ВыбранныеПоля", СтрокаТаблицы, ЭлементКД); @@ -1103,35 +1086,64 @@ &НаКлиенте Процедура ВыбранныеПоля_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "ВыбранныеПоля"); - Сценарий.Вставить("Направление", -1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("ВыбранныеПоля", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "ВыбранныеПоля"); - Сценарий.Вставить("Направление", 1); + + Контекст = НовыйКонтекст("ВыбранныеПоля", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); - ЗапуститьСценарий(Сценарий); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Сгруппировать(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, ОтредактироватьГруппуПолей, СгруппироватьСтроки, ОбновитьФорму"); - Сценарий.Вставить("Действие", "Сгруппировать"); - Сценарий.Вставить("ТаблицаИмя", "ВыбранныеПоля"); - Сценарий.Вставить("ТипГруппыКД", Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("ВыбранныеПоля", "Сгруппировать"); + Контекст.Вставить("ТипГруппыКД", Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура("Расположение", РасположениеПоляКомпоновкиДанных.Авто); + Обработчик = Новый ОписаниеОповещения("ВыбранныеПоля_СгруппироватьЗавершение", ЭтотОбъект, Контекст); + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей", ПараметрыФормы, + ЭтотОбъект, Истина, , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбранныеПоля_СгруппироватьЗавершение(ВыборПользователя, Контекст) Экспорт + + Если ВыборПользователя = Неопределено Или ВыборПользователя = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + Контекст.Вставить("ЗаголовокГруппы", ВыборПользователя.ЗаголовокГруппы); + Контекст.Вставить("Расположение", ВыборПользователя.Расположение); + СгруппироватьСтроки(Контекст); + ОбновитьФорму(Контекст); + КонецПроцедуры &НаКлиенте @@ -1166,7 +1178,7 @@ Процедура ВыбранныеПоляПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле) // Возникает в приемнике при окончании перетаскивания когда все проверки пройдены. СтандартнаяОбработка = Ложь; - ИсточникПеретаскивания = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ИсточникПеретаскивания"); + ИсточникПеретаскивания = ИсточникПеретаскиванияНаКлиенте; Если ИсточникПеретаскивания = Неопределено Тогда Возврат; КонецЕсли; @@ -1184,9 +1196,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА Отборы - #Область ОбработчикиСобытийЭлементовТаблицыФормыОтборы &НаКлиенте @@ -1310,13 +1319,18 @@ &НаКлиенте Процедура Отборы_Сгруппировать(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СгруппироватьСтроки, ОбновитьФорму"); - Сценарий.Вставить("Действие", "Сгруппировать"); - Сценарий.Вставить("ТаблицаИмя", "Отборы"); - Сценарий.Вставить("ТипГруппыКД", Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("Отборы", "Сгруппировать"); + Контекст.Вставить("ТипГруппыКД", Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СгруппироватьСтроки(Контекст); + ОбновитьФорму(Контекст); + КонецПроцедуры &НаКлиенте @@ -1326,24 +1340,32 @@ &НаКлиенте Процедура Отборы_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Отборы"); - Сценарий.Вставить("Направление", -1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("Отборы", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте Процедура Отборы_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Отборы"); - Сценарий.Вставить("Направление", 1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("Отборы", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте @@ -1356,6 +1378,31 @@ УстановитьФлажкиИспользованиеВоВсемДереве("Отборы", Ложь); КонецПроцедуры +&НаКлиенте +Процедура Отборы_ПоказыватьВШапкеОтчета(Команда) + ОтборыУстановитьУровеньДоступа("ПоказыватьВШапкеОтчета"); +КонецПроцедуры + +&НаКлиенте +Процедура Отборы_ПоказыватьВНастройкахОтчета(Команда) + ОтборыУстановитьУровеньДоступа("ПоказыватьВНастройкахОтчета"); +КонецПроцедуры + +&НаКлиенте +Процедура Отборы_ПоказыватьТолькоФлажокВШапкеОтчета(Команда) + ОтборыУстановитьУровеньДоступа("ПоказыватьТолькоФлажокВШапкеОтчета"); +КонецПроцедуры + +&НаКлиенте +Процедура Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета(Команда) + ОтборыУстановитьУровеньДоступа("ПоказыватьТолькоФлажокВНастройкахОтчета"); +КонецПроцедуры + +&НаКлиенте +Процедура Отборы_НеПоказывать(Команда) + ОтборыУстановитьУровеньДоступа("НеПоказывать"); +КонецПроцедуры + &НаКлиенте Процедура ОтборыИспользованиеПриИзменении(Элемент) ТаблицыПолейИзменитьИспользование("Отборы"); @@ -1405,41 +1452,13 @@ &НаКлиенте Процедура ОтборыПриАктивизацииСтроки(Элемент) - СтрокаТаблицы = Элементы.Отборы.ТекущиеДанные; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - МожноУдалятьИПеремещать = Истина; - Если СтрокаТаблицы.ЭтоРаздел - Или СтрокаТаблицы.ЭтоПараметр Тогда - МожноУдалятьИПеремещать = Ложь; - КонецЕсли; - - Элементы.Отборы_Удалить.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_Удалить1.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_Сгруппировать.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_Сгруппировать1.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_Разгруппировать.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_Разгруппировать1.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_ПереместитьВверх.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_ПереместитьВверх1.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_ПереместитьВниз.Доступность = МожноУдалятьИПеремещать; - Элементы.Отборы_ПереместитьВниз1.Доступность = МожноУдалятьИПеремещать; - - Если Не СтрокаТаблицы.ЭтоРаздел И Не СтрокаТаблицы.ЭтоГруппа Тогда - Элементы.ОтборыЗначение.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы( - СтрокаТаблицы.Условие, - СтрокаТаблицы.ВыборГруппИЭлементов); - КонецЕсли; + ПодключитьОбработчикОжидания("ОтборыПриИзмененииТекущейСтроки", 0.1, Истина); КонецПроцедуры #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА СтруктураВарианта - #Область ОбработчикиСобытийЭлементовТаблицыФормыСтруктураВарианта &НаКлиенте @@ -1526,13 +1545,6 @@ Или ИмяКолонки = "СтруктураВариантаСодержитОтборы" Или ИмяКолонки = "СтруктураВариантаСодержитПоляИлиСортировки" Или ИмяКолонки = "СтруктураВариантаСодержитУсловноеОформление" Тогда - - Если СтрокаТаблицы.Тип = "Таблица" - Или СтрокаТаблицы.Тип = "НастройкиВложенногоОбъекта" Тогда - ПерейтиКНастройкеВложенныхОтчетов(СтрокаТаблицы.ИдентификаторКД); - Возврат; - КонецЕсли; - Если ИмяКолонки = "СтруктураВариантаСодержитОтборы" Тогда ИмяСтраницы = "СтраницаОтборы"; ИначеЕсли ИмяКолонки = "СтруктураВариантаСодержитПоляИлиСортировки" Тогда @@ -1542,8 +1554,7 @@ Иначе ИмяСтраницы = Неопределено; КонецЕсли; - - СтруктураВариантаИзменитьУзел("СтруктураВарианта", СтрокаИдентификатор, СтрокаТаблицы, ИмяСтраницы); + ИзменитьУзелВарианта(СтрокаТаблицы, ИмяСтраницы, Неопределено); Иначе СтандартнаяОбработка = Истина; КонецЕсли; @@ -1650,7 +1661,7 @@ СтрокаТаблицы = Результат.СтрокаТаблицы; СтрокаТаблицы.Использование = ЭлементКД.Использование; СтрокаТаблицы.Представление = Представление; - СтрокаТаблицы.ИндексКартинки = 1; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Группировка"); СтрокаТаблицы.ФлажокДоступен = Истина; СтрокаТаблицы.Тип = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); @@ -1714,6 +1725,7 @@ СтрокаТаблицы.Заголовок = СтрокаТаблицы.Представление; СтрокаТаблицы.ФлажокДоступен = Истина; СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки(СтрокаТаблицы.Тип); УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "СтруктураВарианта"); ВложенныеСтроки = СтрокаТаблицы.ПолучитьЭлементы(); @@ -1728,7 +1740,6 @@ УстановитьПараметрВывода(ЭлементКД, "ТипДиаграммы.РежимПолупрозрачности", РежимПолупрозрачностиДиаграммы.Использовать); СтрокаТаблицы.Представление = НСтр("ru = 'Диаграмма'"); - СтрокаТаблицы.ИндексКартинки = 3; ВложенныйЭлементКД = ЭлементКД.Точки; ВложеннаяСтрока = ВложенныеСтроки.Добавить(); @@ -1749,7 +1760,6 @@ ИначеЕсли СтрокаТаблицы.Тип = "Таблица" Тогда СтрокаТаблицы.Представление = НСтр("ru = 'Таблица'"); - СтрокаТаблицы.ИндексКартинки = 2; ВложенныйЭлементКД = ЭлементКД.Строки; ВложеннаяСтрока = ВложенныеСтроки.Добавить(); @@ -1903,24 +1913,32 @@ &НаКлиенте Процедура СтруктураВарианта_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "СтруктураВарианта"); - Сценарий.Вставить("Направление", -1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "СтруктураВарианта"); - Сценарий.Вставить("Направление", 1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте @@ -1990,7 +2008,7 @@ Список.Добавить(ПодчиненнаяСтрока.ПолучитьИдентификатор(), ПодчиненнаяСтрока.Представление); КонецЦикла; Обработчик = Новый ОписаниеОповещения("СтруктураВарианта_Переместить", ЭтотОбъект, ПараметрыВыполнения); - ПоказатьВыборИзСписка(Обработчик, Список); + ПоказатьВыборИзМеню(Обработчик, Список); КонецЕсли; КонецПроцедуры @@ -2075,9 +2093,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА СоставГруппировки - #Область ОбработчикиСобытийЭлементовТаблицыФормыСоставГруппировки &НаКлиенте @@ -2130,13 +2145,13 @@ СтрокаТаблицы.ПолеКД = ЭлементКД.Поле; Если ДоступноеПолеКД.Ресурс Тогда - СтрокаТаблицы.ИндексКартинки = 20; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Ресурс"); ИначеЕсли ДоступноеПолеКД.Таблица Тогда - СтрокаТаблицы.ИндексКартинки = 21; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Таблица"); ИначеЕсли ДоступноеПолеКД.Папка Тогда - СтрокаТаблицы.ИндексКартинки = 1; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Группа"); Иначе - СтрокаТаблицы.ИндексКартинки = 4; + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); КонецЕсли; ИнформацияОТипах = ОтчетыКлиентСервер.АнализТипов(ДоступноеПолеКД.ТипЗначения, Ложь); @@ -2166,31 +2181,36 @@ &НаКлиенте Процедура СоставГруппировки_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "СоставГруппировки"); - Сценарий.Вставить("Направление", -1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("СоставГруппировки", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры &НаКлиенте Процедура СоставГруппировки_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "СоставГруппировки"); - Сценарий.Вставить("Направление", 1); - ЗапуститьСценарий(Сценарий); + Контекст = НовыйКонтекст("СоставГруппировки", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); + КонецПроцедуры #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ТАБЛИЦА Оформление - #Область ОбработчикиСобытийЭлементовТаблицыФормыОформление &НаКлиенте @@ -2231,33 +2251,43 @@ ТаблицыПолейПередУдалением(Элемент.Имя, Отказ); КонецПроцедуры +&НаКлиенте +Процедура ОформлениеИспользованиеПриИзменении(Элемент) + ТаблицыПолейИзменитьИспользование("Оформление"); +КонецПроцедуры + &НаКлиенте Процедура Оформление_ПереместитьВверх(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Оформление"); - Сценарий.Вставить("Направление", -1); + + Контекст = НовыйКонтекст("Оформление", "Переместить"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); - ЗапуститьСценарий(Сценарий); КонецПроцедуры &НаКлиенте Процедура Оформление_ПереместитьВниз(Команда) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, СдвинутьСтроки"); - Сценарий.Вставить("Действие", "Переместить"); - Сценарий.Вставить("ТаблицаИмя", "Оформление"); - Сценарий.Вставить("Направление", 1); + + Контекст = НовыйКонтекст("Оформление", "Переместить"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + СдвинутьСтроки(Контекст); - ЗапуститьСценарий(Сценарий); КонецПроцедуры #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// КОМАНДЫ - #Область ОбработчикиКомандФормы &НаКлиенте @@ -2276,7 +2306,7 @@ ПараметрыЗаполнения.Вставить("ИмяСобытия", "НастройкиПоУмолчанию"); ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина); - БыстрыеНастройкиЗаполнитьКлиент(ПараметрыЗаполнения); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); КонецПроцедуры &НаКлиенте @@ -2299,23 +2329,24 @@ ПараметрыЗаполнения.Вставить("ИмяСобытия", "ИзменитьУсловияОтборов"); ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); ПараметрыЗаполнения.Вставить("УсловияОтборов", ВыборПользователя); - БыстрыеНастройкиЗаполнитьКлиент(ПараметрыЗаполнения); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьНастройкиОтНесуществующихПолей(Команда) + РасширенныйРежим = 1; + ПараметрыЗаполнения = Новый Структура; + ПараметрыЗаполнения.Вставить("ИмяСобытия", "ОчиститьНастройкиОтНесуществующихПолей"); + ПараметрыЗаполнения.Вставить("ВариантМодифицирован", Истина); + ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + ПараметрыЗаполнения.Вставить("ОчиститьНастройкиОтНесуществующихПолей", Истина); + ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Подключаемые команды -&НаКлиенте -Процедура Подключаемый_Команда(Команда) - // Механизмы расширения - Результат = Ложь; - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РассылкаОтчетовКлиент"); - МодульРассылкаОтчетовКлиент.ФормаОтчетаОбработчикКоманды(ЭтотОбъект, Команда, Результат); - КонецЕсли; - ОтчетыКлиентПереопределяемый.ОбработчикКоманды(ЭтотОбъект, Команда, Результат); -КонецПроцедуры - &НаКлиенте Процедура Подключаемый_ИзменитьВидСравнения(Команда) ИдентификаторЭлемента = Прав(Команда.Имя, 32); @@ -2331,20 +2362,62 @@ ПараметрыЗаполнения = Новый Структура; ПараметрыЗаполнения.Вставить("ИмяСобытия", "ИзменитьВидСравнения"); ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); - БыстрыеНастройкиЗаполнитьКлиент(ПараметрыЗаполнения); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); КонецЕсли; КонецПроцедуры #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// // Клиент +&НаКлиенте +Процедура ОтборыПриИзмененииТекущейСтроки() Экспорт + + СтрокаТаблицы = Элементы.Отборы.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + ОтборыПриИзмененииТекущейСтрокиНаСервере(Ложь, Ложь); + Возврат; + КонецЕсли; + + ЭтоОтбор = Не СтрокаТаблицы.ЭтоПараметр И Не СтрокаТаблицы.ЭтоРаздел; + ЭтоПараметрИлиОтбор = Не СтрокаТаблицы.ЭтоРаздел; + + ОтборыПриИзмененииТекущейСтрокиНаСервере(ЭтоОтбор, ЭтоПараметрИлиОтбор); + + Если Не СтрокаТаблицы.ЭтоРаздел И Не СтрокаТаблицы.ЭтоГруппа Тогда + Элементы.ОтборыЗначение.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы( + СтрокаТаблицы.Условие, + СтрокаТаблицы.ВыборГруппИЭлементов); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОтборыПриИзмененииТекущейСтрокиНаСервере(ЭтоОтбор, ЭтоПараметрИлиОтбор) + + Элементы.Отборы_Удалить.Доступность = ЭтоОтбор; + Элементы.Отборы_Удалить1.Доступность = ЭтоОтбор; + Элементы.Отборы_Сгруппировать.Доступность = ЭтоОтбор; + Элементы.Отборы_Сгруппировать1.Доступность = ЭтоОтбор; + Элементы.Отборы_Разгруппировать.Доступность = ЭтоОтбор; + Элементы.Отборы_Разгруппировать1.Доступность = ЭтоОтбор; + Элементы.Отборы_ПереместитьВверх.Доступность = ЭтоОтбор; + Элементы.Отборы_ПереместитьВверх1.Доступность = ЭтоОтбор; + Элементы.Отборы_ПереместитьВниз.Доступность = ЭтоОтбор; + Элементы.Отборы_ПереместитьВниз1.Доступность = ЭтоОтбор; + + Элементы.КомандыОтборов_Показывать.Доступность = ЭтоПараметрИлиОтбор; + Элементы.КомандыОтборов_Показывать1.Доступность = ЭтоПараметрИлиОтбор; + Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета.Доступность = ЭтоОтбор; + Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета1.Доступность = ЭтоОтбор; + Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета.Доступность = ЭтоОтбор; + Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета1.Доступность = ЭтоОтбор; + +КонецПроцедуры + &НаКлиенте Процедура ЗаписатьИЗакрыть(Переформировать) ОповеститьОВыборе(РезультатВыбора(Переформировать)); @@ -2434,11 +2507,17 @@ КонецФункции &НаКлиенте -Процедура БыстрыеНастройкиЗаполнитьКлиент(ПараметрыЗаполнения) +Процедура ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения = Неопределено) Если ПараметрыЗаполнения = Неопределено Тогда ПараметрыЗаполнения = Новый Структура("ИмяСобытия", "ПослеИзмененияКоллекции"); КонецЕсли; - БыстрыеНастройкиЗаполнить(ПараметрыЗаполнения); + ПараметрыЗаполненияНаКлиенте = ПараметрыЗаполнения; + ПодключитьОбработчикОжидания("ЗаполнитьБыстрыеНастройкиОтложенно", 0.1, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьБыстрыеНастройкиОтложенно() + БыстрыеНастройкиЗаполнить(ПараметрыЗаполненияНаКлиенте); ПоказатьРезультатЗаполненияНастроек(); КонецПроцедуры @@ -2515,139 +2594,90 @@ КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Клиент - Движок сценарного выполнения. - &НаКлиенте -Процедура ЗапуститьСценарий(Сценарий) - // Плюсы сценарного выполнения: - // Изоляция обработчиков. - // Текущий шаг может ничего не знать о следующем или предыдущем шаге. - // Единый обработчик оповещения. - // Минимальный клиентский программный интерфейс формы. - // Избавляет от необходимости "разворачивать" стек в обратную сторону - // после закрытия диалога с пользователем. - // Удобная группировка кода. - // Код, вызывающий диалог и обрабатывающий ответ располагаются в одной функции. - // Простая последовательность шагов. - // Удобное отключение шагов. +Процедура ОбновитьПараметрыУниверсальногоОтчета(ПользовательскаяНастройкаКД) - Если ТипЗнч(Сценарий.Шаги) = Тип("Строка") Тогда - Сценарий.Шаги = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Сценарий.Шаги, ",", Истина, Истина); + НеобходимоОбновитьНастройки = Ложь; + ОчищаемыеПараметры = Новый Массив; + + ПараметрТипОбъектаМетаданных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипОбъектаМетаданных"); + Если ПараметрТипОбъектаМетаданных <> Неопределено Тогда + Если ПользовательскаяНастройкаКД.Параметр = ПараметрТипОбъектаМетаданных.Параметр + И ПараметрТипОбъектаМетаданных.Значение <> ПользовательскаяНастройкаКД.Значение Тогда + ПараметрТипОбъектаМетаданных.Значение = ПользовательскаяНастройкаКД.Значение; + НеобходимоОбновитьНастройки = Истина; + ОчищаемыеПараметры.Добавить("ПолноеИмяОбъектаМетаданных"); + ОчищаемыеПараметры.Добавить("ИмяТаблицы"); + КонецЕсли; + КонецЕсли; + ПараметрПолноеИмяОбъектаМетаданных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПолноеИмяОбъектаМетаданных"); + Если ПараметрПолноеИмяОбъектаМетаданных <> Неопределено Тогда + Если ПользовательскаяНастройкаКД.Параметр = ПараметрПолноеИмяОбъектаМетаданных.Параметр + И ПараметрПолноеИмяОбъектаМетаданных.Значение <> ПользовательскаяНастройкаКД.Значение Тогда + ПараметрПолноеИмяОбъектаМетаданных.Значение = ПользовательскаяНастройкаКД.Значение; + НеобходимоОбновитьНастройки = Истина; + ОчищаемыеПараметры.Добавить("ИмяТаблицы"); + КонецЕсли; + КонецЕсли; + ПараметрИмяТаблицы = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ИмяТаблицы"); + Если ПараметрИмяТаблицы <> Неопределено Тогда + Если ПользовательскаяНастройкаКД.Параметр = ПараметрИмяТаблицы.Параметр + И ПараметрИмяТаблицы.Значение <> ПользовательскаяНастройкаКД.Значение Тогда + НеобходимоОбновитьНастройки = Истина; + ПараметрИмяТаблицы.Значение = ПользовательскаяНастройкаКД.Значение; + КонецЕсли; КонецЕсли; - Сценарий.Вставить("ШагиВГраница", Сценарий.Шаги.ВГраница()); - Сценарий.Вставить("СледующийШагИндекс", 0); - Сценарий.Вставить("ТекущийШаг", Неопределено); - Сценарий.Вставить("ТекущийШагУточнение", ""); - Сценарий.Вставить("Обработчик", Новый ОписаниеОповещения("ВыполнитьСценарий", ЭтотОбъект, Сценарий)); - Сценарий.Вставить("ПричинаОтказа", ""); - НайтиСледующийШаг(Сценарий); - - ВыполнитьСценарий(Неопределено, Сценарий); -КонецПроцедуры - -&НаКлиенте -Процедура ВыполнитьСценарий(ВыборПользователя, Сценарий) Экспорт - Пока ВыполнитьШаг(ВыборПользователя, Сценарий) Цикл - Если Не НайтиСледующийШаг(Сценарий) Тогда - Прервать; + Для Каждого ОчищаемыйПараметр Из ОчищаемыеПараметры Цикл + Параметр = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ОчищаемыйПараметр); + Если Параметр <> Неопределено Тогда + Параметр.Значение = ""; КонецЕсли; КонецЦикла; - Если ЗначениеЗаполнено(Сценарий.ПричинаОтказа) Тогда - ПоказатьПредупреждение(, Сценарий.ПричинаОтказа); + Если НеобходимоОбновитьНастройки Тогда + Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + ПараметрыЗаполнения = Новый Структура; + ПараметрыЗаполнения.Вставить("ВариантМодифицирован", Истина); + ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина); + ПараметрыЗаполнения.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); КонецЕсли; + КонецПроцедуры &НаКлиенте -Функция НайтиСледующийШаг(Сценарий) - Если Сценарий.СледующийШагИндекс > Сценарий.ШагиВГраница Тогда - Возврат Ложь; - КонецЕсли; - Сценарий.ТекущийШаг = Сценарий.Шаги.Получить(Сценарий.СледующийШагИндекс); - Сценарий.ТекущийШагУточнение = ""; - Сценарий.СледующийШагИндекс = Сценарий.СледующийШагИндекс + 1; - Возврат Истина; +Функция НовыйКонтекст(Знач ТаблицаИмя, Знач Действие) + Результат = Новый Структура; + Результат.Вставить("ПричинаОтказа", ""); + Результат.Вставить("ТаблицаИмя", ТаблицаИмя); + Результат.Вставить("Действие", Действие); + Возврат Результат; КонецФункции &НаКлиенте -Функция ВыполнитьШаг(ВыборПользователя, Сценарий) - - Если Сценарий.ТекущийШаг = "ОпределитьВыделенныеСтроки" Тогда - Возврат ШагОпределитьВыделенныеСтроки(ВыборПользователя, Сценарий); - - ИначеЕсли Сценарий.ТекущийШаг = "ОтредактироватьГруппуПолей" Тогда - Возврат ШагОтредактироватьГруппуПолей(ВыборПользователя, Сценарий); - - ИначеЕсли Сценарий.ТекущийШаг = "СгруппироватьСтроки" Тогда - Возврат ШагСгруппироватьСтроки(ВыборПользователя, Сценарий); - - ИначеЕсли Сценарий.ТекущийШаг = "СдвинутьСтроки" Тогда - Возврат ШагСдвинутьСтроки(ВыборПользователя, Сценарий); - - ИначеЕсли Сценарий.ТекущийШаг = "УдалитьСтроки" Тогда - Возврат ШагУдалитьСтроки(ВыборПользователя, Сценарий); - - ИначеЕсли Сценарий.ТекущийШаг = "ОбновитьФорму" Тогда - Возврат ШагОбновитьФорму(ВыборПользователя, Сценарий); - - Иначе - Сценарий.ПричинаОтказа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка в сценарии: Неизвестный шаг ""%1"".'"), Сценарий.ТекущийШаг); - Возврат Ложь; - - КонецЕсли; - - // Альтернативы этим веткам условий: - // "Вычислить()" - неприемлемо использовать только для минимизации кода; - // "ВыполнитьОбработкуОповещения()" - не выгодно, т.к. поддерживаются только процедуры, - // а следовательно следующий шаг придется запускать из предыдущего шага; - // Т.е. исчезает такой большой плюс как изоляция обработчиков от асинхронной логики. - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Клиент - Шаги сценарного выполнения. +Процедура ОбновитьФорму(Контекст) + ПараметрыЗаполнения = Новый Структура("ИмяСобытия", Контекст.ТаблицаИмя + "." + Контекст.Действие); + ЗаполнитьБыстрыеНастройкиКлиент(ПараметрыЗаполнения); +КонецПроцедуры &НаКлиенте -Функция ШагОбновитьФорму(ВыборПользователя, Сценарий) - Сценарий.Вставить("ИмяСобытия", Сценарий.ТаблицаИмя + "." + Сценарий.Действие); - - // Временное хранилище несериализуемых параметров. - Хранилище = Новый Структура("Обработчик, СтрокиДерева, ТекущаяСтрока, ТекущийРодитель"); - ЗаполнитьЗначенияСвойств(Хранилище, Сценарий); - Для Каждого КлючИЗначение Из Хранилище Цикл - Сценарий.Удалить(КлючИЗначение.Ключ); - КонецЦикла; - - // Вызов сервера. - БыстрыеНастройкиЗаполнитьКлиент(Сценарий); - - // Возвращение параметров. - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Сценарий, Хранилище, Истина); - - Возврат Истина; // Продолжить сценарий. -КонецФункции - -&НаКлиенте -Функция ШагОпределитьВыделенныеСтроки(ВыборПользователя, Сценарий) - // 1. Дополняет структуру сценария информацией: - Сценарий.Вставить("СтрокиДерева", Новый Массив); // Выделенные строки (не идентификаторы). - Сценарий.Вставить("ТекущаяСтрока", Неопределено); // Активная строка (не идентификатор). - // 2. Осуществляет проверку выделенных строк согласно сценарию. - // 3. Останавливает сценарий если ничего не выделено. - ТаблицаЭлемент = Элементы[Сценарий.ТаблицаИмя]; - ТаблицаРеквизит = ЭтотОбъект[Сценарий.ТаблицаИмя]; +Процедура ОпределитьВыделенныеСтроки(Контекст) + Контекст.Вставить("СтрокиДерева", Новый Массив); // Выделенные строки (не идентификаторы). + Контекст.Вставить("ТекущаяСтрока", Неопределено); // Активная строка (не идентификатор). + ТаблицаЭлемент = Элементы[Контекст.ТаблицаИмя]; + ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя]; ТекущаяСтрокаИдентификатор = ТаблицаЭлемент.ТекущаяСтрока; Особенности = Новый Структура("МогутБытьРазделы, МогутБытьПараметры, МогутБытьГруппы, |ТребоватьОдногоРодителя"); - Особенности.МогутБытьРазделы = (Сценарий.ТаблицаИмя = "Отборы" Или Сценарий.ТаблицаИмя = "ВыбранныеПоля" Или Сценарий.ТаблицаИмя = "Сортировка"); - Особенности.МогутБытьПараметры = (Сценарий.ТаблицаИмя = "Отборы"); - Особенности.ТребоватьОдногоРодителя = (Сценарий.Действие = "Переместить" Или Сценарий.Действие = "Сгруппировать"); - Особенности.МогутБытьГруппы = (Сценарий.ТаблицаИмя = "Отборы" Или Сценарий.ТаблицаИмя = "ВыбранныеПоля"); + Особенности.МогутБытьРазделы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля" Или Контекст.ТаблицаИмя = "Сортировка"); + Особенности.МогутБытьПараметры = (Контекст.ТаблицаИмя = "Отборы"); + Особенности.ТребоватьОдногоРодителя = (Контекст.Действие = "Переместить" Или Контекст.Действие = "Сгруппировать"); + Особенности.МогутБытьГруппы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля"); Если Особенности.ТребоватьОдногоРодителя Тогда - Сценарий.Вставить("ТекущийРодитель", -1); + Контекст.Вставить("ТекущийРодитель", -1); КонецЕсли; Если Особенности.МогутБытьГруппы Тогда БылиГруппы = Ложь; @@ -2656,127 +2686,88 @@ ВыделенныеСтроки = МассивСортировать(ТаблицаЭлемент.ВыделенныеСтроки, НаправлениеСортировки.Возр); Для Каждого СтрокаИдентификатор Из ВыделенныеСтроки Цикл СтрокаДерева = ТаблицаРеквизит.НайтиПоИдентификатору(СтрокаИдентификатор); - Если Не ЗарегистрироватьВыделеннуюСтроку(Сценарий, СтрокаДерева, Особенности) Тогда - Возврат Ложь; // Завершить сценарий. + Если Не ДобавитьВыделеннуюСтроку(Контекст, СтрокаДерева, Особенности) Тогда + Возврат; КонецЕсли; Если Особенности.МогутБытьГруппы И СтрокаДерева.ЭтоГруппа Тогда БылиГруппы = Истина; КонецЕсли; Если СтрокаИдентификатор = ТекущаяСтрокаИдентификатор Тогда - Сценарий.ТекущаяСтрока = СтрокаДерева; + Контекст.ТекущаяСтрока = СтрокаДерева; КонецЕсли; КонецЦикла; - Если Сценарий.СтрокиДерева.Количество() = 0 Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Выберите элементы.'"); - Возврат Ложь; // Завершить сценарий. + Если Контекст.СтрокиДерева.Количество() = 0 Тогда + Контекст.ПричинаОтказа = НСтр("ru = 'Выберите элементы.'"); + Возврат; КонецЕсли; - Если Сценарий.ТекущаяСтрока = Неопределено Тогда - Если Сценарий.Действие = "ИзменитьГруппу" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Выберите группу.'"); - Возврат Ложь; // Завершить сценарий. + Если Контекст.ТекущаяСтрока = Неопределено Тогда + Если Контекст.Действие = "ИзменитьГруппу" Тогда + Контекст.ПричинаОтказа = НСтр("ru = 'Выберите группу.'"); + Возврат; КонецЕсли; КонецЕсли; // Исключение из списка удаляемых строк всех подчиненных строк, для которых включены родители. - Если Сценарий.Действие = "Удалить" И Особенности.МогутБытьГруппы И БылиГруппы Тогда - Количество = Сценарий.СтрокиДерева.Количество(); + Если Контекст.Действие = "Удалить" И Особенности.МогутБытьГруппы И БылиГруппы Тогда + Количество = Контекст.СтрокиДерева.Количество(); Для Номер = 1 По Количество Цикл ОбратныйИндекс = Количество - Номер; - Родитель = Сценарий.СтрокиДерева[ОбратныйИндекс]; + Родитель = Контекст.СтрокиДерева[ОбратныйИндекс]; Пока Родитель <> Неопределено Цикл Родитель = Родитель.ПолучитьРодителя(); - Если Сценарий.СтрокиДерева.Найти(Родитель) <> Неопределено Тогда - Сценарий.СтрокиДерева.Удалить(ОбратныйИндекс); + Если Контекст.СтрокиДерева.Найти(Родитель) <> Неопределено Тогда + Контекст.СтрокиДерева.Удалить(ОбратныйИндекс); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; - Возврат Истина; // Продолжить сценарий. -КонецФункции +КонецПроцедуры &НаКлиенте -Функция ЗарегистрироватьВыделеннуюСтроку(Сценарий, СтрокаДерева, Особенности) - Если Сценарий.СтрокиДерева.Найти(СтрокаДерева) <> Неопределено Тогда +Функция ДобавитьВыделеннуюСтроку(Строки, СтрокаДерева, Особенности) + Если Строки.СтрокиДерева.Найти(СтрокаДерева) <> Неопределено Тогда Возврат Истина; // Пропустить строку. КонецЕсли; Если Особенности.МогутБытьРазделы И СтрокаДерева.ЭтоРаздел Тогда Возврат Истина; // Пропустить строку. КонецЕсли; Если Особенности.МогутБытьПараметры И СтрокаДерева.ЭтоПараметр Тогда - Если Сценарий.Действие = "Переместить" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть перемещены.'"); - ИначеЕсли Сценарий.Действие = "Сгруппировать" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть участниками групп.'"); - ИначеЕсли Сценарий.Действие = "Удалить" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть удалены.'"); + Если Строки.Действие = "Переместить" Тогда + Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть перемещены.'"); + ИначеЕсли Строки.Действие = "Сгруппировать" Тогда + Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть участниками групп.'"); + ИначеЕсли Строки.Действие = "Удалить" Тогда + Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть удалены.'"); КонецЕсли; - Возврат Ложь; // Завершить сценарий. - КонецЕсли; + Возврат Ложь; КонецЕсли; Если Особенности.ТребоватьОдногоРодителя Тогда Родитель = СтрокаДерева.ПолучитьРодителя(); - Если Сценарий.ТекущийРодитель = -1 Тогда - Сценарий.ТекущийРодитель = Родитель; - ИначеЕсли Сценарий.ТекущийРодитель <> Родитель Тогда - Если Сценарий.Действие = "Переместить" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'"); - ИначеЕсли Сценарий.Действие = "Сгруппировать" Тогда - Сценарий.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'"); + Если Строки.ТекущийРодитель = -1 Тогда + Строки.ТекущийРодитель = Родитель; + ИначеЕсли Строки.ТекущийРодитель <> Родитель Тогда + Если Строки.Действие = "Переместить" Тогда + Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'"); + ИначеЕсли Строки.Действие = "Сгруппировать" Тогда + Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'"); КонецЕсли; - Возврат Ложь; // Завершить сценарий. + Возврат Ложь; КонецЕсли; КонецЕсли; - Сценарий.СтрокиДерева.Добавить(СтрокаДерева); + Строки.СтрокиДерева.Добавить(СтрокаДерева); Возврат Истина; // Следующая строка. КонецФункции &НаКлиенте -Функция ШагОтредактироватьГруппуПолей(ВыборПользователя, Сценарий) - // По результатам редактирования группы дополняет структуру сценария информацией: - // * ЗаголовокГруппы - Строка. - // * Расположение - РасположениеПоляКомпоновкиДанных. +Процедура СгруппироватьСтроки(Контекст) + ТекущийРодитель = Контекст.ТекущийРодитель; + ТаблицаЭлемент = Элементы[Контекст.ТаблицаИмя]; + УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, Контекст.ТаблицаИмя, Неопределено); - Если Сценарий.ТекущийШагУточнение = "" Тогда // Первый вызов - ПараметрыФормы = Новый Структура; - Если Сценарий.Действие = "ИзменитьГруппу" Тогда - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, Сценарий.ТаблицаИмя, Сценарий.ТекущаяСтрока); - ЭлементКД = УзелКД.ПолучитьОбъектПоИдентификатору(Сценарий.ТекущаяСтрока.ИдентификаторКД); - ПараметрыФормы.Вставить("ЗаголовокГруппы", ЭлементКД.Заголовок); - ПараметрыФормы.Вставить("Расположение", ЭлементКД.Расположение); - Иначе - ПараметрыФормы.Вставить("Расположение", РасположениеПоляКомпоновкиДанных.Авто); - КонецЕсли; - - Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - - Сценарий.ТекущийШагУточнение = "ОбработкаВыбора"; - ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей", ПараметрыФормы, ЭтотОбъект, Истина, , , Сценарий.Обработчик, Блокировать); - Возврат Ложь; // Приостановить сценарий. - - ИначеЕсли Сценарий.ТекущийШагУточнение = "ОбработкаВыбора" Тогда // После закрытия формы. - - Если ВыборПользователя = Неопределено Или ВыборПользователя = КодВозвратаДиалога.Отмена Тогда - Возврат Ложь; // Отменить сценарий. - КонецЕсли; - - Сценарий.Вставить("ЗаголовокГруппы", ВыборПользователя.ЗаголовокГруппы); - Сценарий.Вставить("Расположение", ВыборПользователя.Расположение); - Возврат Истина; // Продолжить сценарий. - - КонецЕсли; - -КонецФункции - -&НаКлиенте -Функция ШагСгруппироватьСтроки(ВыборПользователя, Сценарий) - ТекущийРодитель = Сценарий.ТекущийРодитель; - ТаблицаЭлемент = Элементы[Сценарий.ТаблицаИмя]; - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, Сценарий.ТаблицаИмя, Неопределено); - - Если Сценарий.ТекущийРодитель = Неопределено Тогда - ТаблицаРеквизит = ЭтотОбъект[Сценарий.ТаблицаИмя]; - Если Сценарий.ТаблицаИмя = "Отборы" И Не РежимИзмененияУзлаВарианта Тогда + Если Контекст.ТекущийРодитель = Неопределено Тогда + ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя]; + Если Контекст.ТаблицаИмя = "Отборы" И Не РежимИзмененияУзлаВарианта Тогда ТекущийРодитель = ТаблицаРеквизит.ПолучитьЭлементы()[1]; Иначе ТекущийРодитель = ТаблицаРеквизит; @@ -2791,7 +2782,7 @@ СтрокиРодителяКД = ТекущийРодительКД.Элементы; // Проверки пройдены. Добавление группы в родителя родителя. - Группы = ТаблицыПолейВставить(Сценарий.ТаблицаИмя, Сценарий.ТипГруппыКД, 0, Ложь); + Группы = ТаблицыПолейВставить(Контекст.ТаблицаИмя, Контекст.ТипГруппыКД, 0, Ложь); ЭлементКД = Группы.ЭлементКД; ЭлементКД.Использование = Истина; @@ -2802,22 +2793,22 @@ ГруппаДерева.ЭтоГруппа = Истина; НоваяКоллекцияСтрокДерева = ГруппаДерева.ПолучитьЭлементы(); - Если Сценарий.ТаблицаИмя = "Отборы" Тогда + Если Контекст.ТаблицаИмя = "Отборы" Тогда ГруппаДерева.Представление = Строка(ЭлементКД.ТипГруппы); ГруппаДерева.ИндексКартинки = -1; ГруппаДерева.ИндексКартинкиДоступа = 5; ГруппаДерева.Заголовок = ГруппаДерева.Представление; Иначе - ЭлементКД.Заголовок = Сценарий.ЗаголовокГруппы; - ЭлементКД.Расположение = Сценарий.Расположение; - ГруппаДерева.ИндексКартинки = 1; - ГруппаДерева.Представление = ЭлементКД.Заголовок; + ЭлементКД.Заголовок = Контекст.ЗаголовокГруппы; + ЭлементКД.Расположение = Контекст.Расположение; + ГруппаДерева.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Группа"); + ГруппаДерева.Представление = ЭлементКД.Заголовок; Если ЭлементКД.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда ГруппаДерева.Представление = ГруппаДерева.Представление + " (" + Строка(ЭлементКД.Расположение) + ")"; КонецЕсли; КонецЕсли; - Для Каждого СтараяСтрокаДерева Из Сценарий.СтрокиДерева Цикл + Для Каждого СтараяСтрокаДерева Из Контекст.СтрокиДерева Цикл СтарыйЭлементКД = УзелКД.ПолучитьОбъектПоИдентификатору(СтараяСтрокаДерева.ИдентификаторКД); ТаблицыПолейСкопироватьРекурсивно(УзелКД, СтараяСтрокаДерева, НоваяКоллекцияСтрокДерева, СтарыйЭлементКД, НоваяКоллекцияЭлементовКД); СтрокиРодителя.Удалить(СтараяСтрокаДерева); @@ -2829,18 +2820,17 @@ ВариантИзменен = Истина; КонецЕсли; - Возврат Истина; // Продолжить сценарий. -КонецФункции +КонецПроцедуры &НаКлиенте -Функция ШагСдвинутьСтроки(ВыборПользователя, Сценарий) - ТекущийРодитель = Сценарий.ТекущийРодитель; - ТаблицаЭлемент = Элементы[Сценарий.ТаблицаИмя]; - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, Сценарий.ТаблицаИмя, Неопределено); +Процедура СдвинутьСтроки(Контекст) + ТекущийРодитель = Контекст.ТекущийРодитель; + ТаблицаЭлемент = Элементы[Контекст.ТаблицаИмя]; + УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, Контекст.ТаблицаИмя, Неопределено); - Если Сценарий.ТекущийРодитель = Неопределено Тогда - ТаблицаРеквизит = ЭтотОбъект[Сценарий.ТаблицаИмя]; - Если Сценарий.ТаблицаИмя = "Отборы" И Не РежимИзмененияУзлаВарианта Тогда + Если Контекст.ТекущийРодитель = Неопределено Тогда + ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя]; + Если Контекст.ТаблицаИмя = "Отборы" И Не РежимИзмененияУзлаВарианта Тогда ТекущийРодитель = ТаблицаРеквизит.ПолучитьЭлементы()[1]; Иначе ТекущийРодитель = ТаблицаРеквизит; @@ -2855,12 +2845,12 @@ СтрокиРодителяКД = ПолучитьЭлементыКД(УзелКД, ТекущийРодительКД); ВерхняяГраницаСтрок = СтрокиРодителя.Количество() - 1; - ВыделеноСтрок = Сценарий.СтрокиДерева.Количество(); + ВыделеноСтрок = Контекст.СтрокиДерева.Количество(); // Массив выделенных строк на встречу движению: - // Если двигаем строки в "+", то обходим "от большего к меньшему"; - // Если в "-", то обходим "от меньшего к большему". - ДвигаемсяПоВозрастанию = (Сценарий.Направление < 0); + // Если двигаем строки в "+", то обходим "от большего к меньшему"; + // Если в "-", то обходим "от меньшего к большему". + ДвигаемсяПоВозрастанию = (Контекст.Направление < 0); Для Номер = 1 По ВыделеноСтрок Цикл Если ДвигаемсяПоВозрастанию Тогда @@ -2869,11 +2859,11 @@ ИндексВМассиве = ВыделеноСтрок - Номер; КонецЕсли; - СтрокаДерева = Сценарий.СтрокиДерева[ИндексВМассиве]; + СтрокаДерева = Контекст.СтрокиДерева[ИндексВМассиве]; ЭлементКД = УзелКД.ПолучитьОбъектПоИдентификатору(СтрокаДерева.ИдентификаторКД); ИндексВДереве = СтрокиРодителя.Индекс(СтрокаДерева); - ГдеОкажетсяСтрока = ИндексВДереве + Сценарий.Направление; + ГдеОкажетсяСтрока = ИндексВДереве + Контекст.Направление; Если ГдеОкажетсяСтрока < 0 Тогда // Перемещаем "в конец". СтрокиРодителя.Сдвинуть(ИндексВДереве, ВерхняяГраницаСтрок - ИндексВДереве); СтрокиРодителяКД.Сдвинуть(ЭлементКД, ВерхняяГраницаСтрок - ИндексВДереве); @@ -2881,8 +2871,8 @@ СтрокиРодителя.Сдвинуть(ИндексВДереве, -ИндексВДереве); СтрокиРодителяКД.Сдвинуть(ЭлементКД, -ИндексВДереве); Иначе - СтрокиРодителя.Сдвинуть(ИндексВДереве, Сценарий.Направление); - СтрокиРодителяКД.Сдвинуть(ЭлементКД, Сценарий.Направление); + СтрокиРодителя.Сдвинуть(ИндексВДереве, Контекст.Направление); + СтрокиРодителяКД.Сдвинуть(ЭлементКД, Контекст.Направление); КонецЕсли; КонецЦикла; @@ -2891,20 +2881,18 @@ ВариантИзменен = Истина; КонецЕсли; - Возврат Истина; // Продолжить сценарий. -КонецФункции +КонецПроцедуры &НаКлиенте -Функция ШагУдалитьСтроки(ВыборПользователя, Сценарий) - ТаблицыПолейУдалить(Сценарий.ТаблицаИмя, Сценарий.СтрокиДерева, Ложь); +Процедура УдалитьСтроки(Контекст) + ТаблицыПолейУдалить(Контекст.ТаблицаИмя, Контекст.СтрокиДерева, Ложь); ПользовательскиеНастройкиМодифицированы = Истина; Если РасширенныйРежим = 1 Тогда ВариантИзменен = Истина; КонецЕсли; - Возврат Истина; // Продолжить сценарий. -КонецФункции +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Клиент - Параметры и отборы. @@ -2953,90 +2941,92 @@ &НаКлиенте Процедура ОтборыПоказатьВыборСсылки(СтрокаТаблицы, СтандартнаяОбработка) - ПараметрыФормы = ПараметрыВыбораОтбора(СтрокаТаблицы); - Если ПараметрыФормы = Неопределено Тогда + ПараметрыВыбора = ПараметрыВыбораОтбора(СтрокаТаблицы); + Если ПараметрыВыбора = Неопределено Тогда СтандартнаяОбработка = Истина; Возврат; КонецЕсли; - Анализ = ОтчетыКлиентСервер.АнализТипов(ПараметрыФормы.ОписаниеТипов, Ложь); - Если Не Анализ.СодержитОбъектныеТипы Тогда - СтандартнаяОбработка = Истина; - Возврат; - КонецЕсли; - - ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); - ПараметрыФормы.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(СтрокаТаблицы.Значение)); - ПараметрыФормы.Вставить("Представление", СтрокаТаблицы.Представление); + ПараметрыВыбора.Вставить("МножественныйВыбор", Ложь); + ПараметрыВыбора.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(СтрокаТаблицы.Значение)); + ПараметрыВыбора.Вставить("Представление", СтрокаТаблицы.Представление); Контекст = Новый Структура; Контекст.Вставить("СтрокаИдентификатор", СтрокаТаблицы.ПолучитьИдентификатор()); - Контекст.Вставить("ПараметрыФормы", ПараметрыФормы); + Контекст.Вставить("ПараметрыВыбора", ПараметрыВыбора); Контекст.Вставить("ТекущееЗначение", СтрокаТаблицы.Значение); Контекст.Вставить("ПредставлениеПоля", СтрокаТаблицы.Представление); - Обработчик = Новый ОписаниеОповещения("ОтборыПоказатьВыборСсылкиПослеВыбораТипа", ЭтотОбъект, Контекст); - // Полное имя формы выбора. // Свойство "ФормаВыбора" недоступно на клиенте даже для чтения, // поэтому для хранения предустановленных имен форм выбора используется коллекция БыстрыйПоискИменОбъектовМетаданных. - Если ЗначениеЗаполнено(ПараметрыФормы.ПутьКФорме) Тогда - ВыполнитьОбработкуОповещения(Обработчик, ПараметрыФормы.ПутьКФорме); + Если ЗначениеЗаполнено(ПараметрыВыбора.ПутьКФорме) Тогда + Обработчик = Новый ОписаниеОповещения("ОтборыЗавершениеВыбораСсылки", ЭтотОбъект, Контекст); + ОткрытьФорму( + ПараметрыВыбора.ПутьКФорме, + ПараметрыВыбора, + ЭтотОбъект, + , + , + , + Обработчик, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); Иначе // Выбор типа из списка. СписокВыбора = Новый СписокЗначений; - СписокВыбора.ЗагрузитьЗначения(Анализ.ОбъектныеТипы); + СписокВыбора.ЗагрузитьЗначения(ПараметрыВыбора.ОписаниеТипов.Типы()); + Обработчик = Новый ОписаниеОповещения("ОтборыПоказатьВыборСсылкиПослеВыбораТипа", ЭтотОбъект, Контекст); Если СписокВыбора.Количество() = 1 Тогда // Один тип - выбор не требуется. ВыполнитьОбработкуОповещения(Обработчик, СписокВыбора[0]); Иначе - ПоказатьВыборИзСписка(Обработчик, СписокВыбора); + ПоказатьВыборИзМеню(Обработчик, СписокВыбора); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ОтборыПоказатьВыборСсылкиПослеВыбораТипа(ПутьКФормеИлиЭлементСписка, Контекст) Экспорт - - Обработчик = Новый ОписаниеОповещения("ОтборыЗавершениеВыбораСсылки", ЭтотОбъект, Контекст); - - Если ТипЗнч(ПутьКФормеИлиЭлементСписка) = Тип("Строка") Тогда - ПутьКФорме = ПутьКФормеИлиЭлементСписка; - ИначеЕсли ТипЗнч(ПутьКФормеИлиЭлементСписка) = Тип("ЭлементСпискаЗначений") Тогда - Тип = ПутьКФормеИлиЭлементСписка.Значение; - ИмяОбъектаМетаданных = БыстрыйПоискИменОбъектовМетаданных.Получить(Тип); - Если ИмяОбъектаМетаданных = -1 Или ИмяОбъектаМетаданных = Неопределено Тогда - ОтчетыКлиент.ВыбратьЗначениеПримитивногоТипа( - ЭтотОбъект, - Тип, - Контекст.ПараметрыФормы.ОписаниеТипов, - Контекст.ТекущееЗначение, - Контекст.ПредставлениеПоля, - Обработчик); - Возврат; - КонецЕсли; - Если Контекст.ПараметрыФормы.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы Тогда - ВидОбъектаМетаданных = ВРег(СтрРазделить(ИмяОбъектаМетаданных, ".")[0]); - Если ВидОбъектаМетаданных = "СПРАВОЧНИК" Или ВидОбъектаМетаданных = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбораГруппы"; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; - КонецЕсли; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; - КонецЕсли; - Иначе +Процедура ОтборыПоказатьВыборСсылкиПослеВыбораТипа(ЭлементСписка, Контекст) Экспорт + Если ТипЗнч(ЭлементСписка) <> Тип("ЭлементСпискаЗначений") Тогда Возврат; КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ОтборыЗавершениеВыбораСсылки", ЭтотОбъект, Контекст); + ПараметрыВыбора = Контекст.ПараметрыВыбора; - Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - ОткрытьФорму(ПутьКФорме, Контекст.ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Блокировать); + Тип = ЭлементСписка.Значение; + ПараметрыВыбораТипа = ВариантыОтчетовВызовСервера.ПараметрыВыбораТипа(Тип, ПараметрыВыбора); + Если ПараметрыВыбораТипа = Неопределено Тогда + ОтчетыКлиент.ВыбратьЗначениеПримитивногоТипа( + ЭтотОбъект, + Тип, + ПараметрыВыбора.ОписаниеТипов, + Контекст.ТекущееЗначение, + Контекст.ПредставлениеПоля, + Обработчик); + ИначеЕсли ПараметрыВыбораТипа.БыстрыйВыбор Тогда + ПоказатьВыборИзМеню(Обработчик, ПараметрыВыбораТипа.ЗначенияДляВыбора); + Иначе + ОткрытьФорму( + ПараметрыВыбораТипа.ПутьКФорме, + ПараметрыВыбора, + ЭтотОбъект, + , + , + , + Обработчик, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ОтборыЗавершениеВыбораСсылки(Ссылка, Контекст) Экспорт - Если Не Контекст.ПараметрыФормы.ОписаниеТипов.СодержитТип(ТипЗнч(Ссылка)) Или Не ЗначениеЗаполнено(Ссылка) Тогда +Процедура ОтборыЗавершениеВыбораСсылки(СсылкаИлиЭлементСписка, Контекст) Экспорт + Если ТипЗнч(СсылкаИлиЭлементСписка) = Тип("ЭлементСпискаЗначений") Тогда + Ссылка = СсылкаИлиЭлементСписка.Значение; + Иначе + Ссылка = СсылкаИлиЭлементСписка; + КонецЕсли; + Если Не Контекст.ПараметрыВыбора.ОписаниеТипов.СодержитТип(ТипЗнч(Ссылка)) Или Не ЗначениеЗаполнено(Ссылка) Тогда Возврат; КонецЕсли; @@ -3067,8 +3057,8 @@ &НаКлиенте Процедура ОтборыПоказатьСписокСФлажками(СтрокаТаблицы) - ПараметрыФормы = ПараметрыВыбораОтбора(СтрокаТаблицы); - Если ПараметрыФормы = Неопределено Тогда + ПараметрыВыбора = ПараметрыВыбораОтбора(СтрокаТаблицы); + Если ПараметрыВыбора = Неопределено Тогда Возврат; КонецЕсли; @@ -3076,12 +3066,12 @@ ПараметрыОбработчика.Вставить("СтрокаИдентификатор", СтрокаТаблицы.ПолучитьИдентификатор()); Обработчик = Новый ОписаниеОповещения("ОтборыЗавершениеВводаСпискомСФлажками", ЭтотОбъект, ПараметрыОбработчика); - ПараметрыФормы.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(СтрокаТаблицы.Значение)); - ПараметрыФормы.Вставить("Представление", СтрокаТаблицы.Представление); + ПараметрыВыбора.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(СтрокаТаблицы.Значение)); + ПараметрыВыбора.Вставить("Представление", СтрокаТаблицы.Представление); Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Блокировать); + ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыВыбора, ЭтотОбъект, , , , Обработчик, Блокировать); КонецПроцедуры &НаКлиенте @@ -3094,12 +3084,13 @@ Возврат Неопределено; КонецЕсли; - Результат = Новый Структура("ЗначенияДляВыбора, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, ОписаниеТипов"); + Результат = Новый Структура("Представление, ЗначенияДляВыбора, ЗначенияДляВыбораЗаполнены, БыстрыйВыбор, + |ОграничиватьВыборУказаннымиЗначениями, ОписаниеТипов, ВводСписком"); ДополнительныеНастройки = СтрокаТаблицы.Дополнительно; ЗаполнитьЗначенияСвойств(Результат, ДополнительныеНастройки); - ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы( + ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуИспользованиеГруппИЭлементов( СтрокаТаблицы.Условие, СтрокаТаблицы.ВыборГруппИЭлементов); @@ -3349,18 +3340,19 @@ БылВводСписком = СтрокаТаблицы.ВводСписком; СталВводСписком = Ложь; - Если СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВСписке - Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии - Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.НеВСписке - Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда - Элементы.ОтборыЗначение.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы; - СталВводСписком = Истина; - ИначеЕсли СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВИерархии + Если СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВИерархии Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда - Элементы.ОтборыЗначение.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы; + СтрокаТаблицы.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы; Иначе - Элементы.ОтборыЗначение.ВыборГруппИЭлементов = СтрокаТаблицы.ВыборГруппИЭлементов; + Если СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВСписке + Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии + Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.НеВСписке + Или СтрокаТаблицы.Условие = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда + СталВводСписком = Истина; + КонецЕсли; + СтрокаТаблицы.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы; КонецЕсли; + Элементы.ОтборыЗначение.ВыборГруппИЭлементов = СтрокаТаблицы.ВыборГруппИЭлементов; Если БылВводСписком <> СталВводСписком Тогда Если БылВводСписком Тогда @@ -3371,7 +3363,11 @@ ЭлементКД.ПравоеЗначение = Неопределено; КонецЕсли; Иначе - ЭлементКД.ПравоеЗначение = ОтчетыКлиентСервер.ЗначенияСписком(ЭлементКД.ПравоеЗначение); + Если ТипЗнч(ЭлементКД.ПравоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда + ЭлементКД.ПравоеЗначение = Неопределено; + Иначе + ЭлементКД.ПравоеЗначение = ОтчетыКлиентСервер.ЗначенияСписком(ЭлементКД.ПравоеЗначение); + КонецЕсли; КонецЕсли; Обновить(); // Серьезные изменения, для учета всех связей и особенностей вывода следует перерисовать полностью. КонецЕсли; @@ -3429,13 +3425,34 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ОтборыУстановитьУровеньДоступа(УровеньДоступа) + СтрокаТаблицы = Элементы.Отборы.ТекущиеДанные; + СтрокаИдентификатор = Элементы.Отборы.ТекущаяСтрока; + Если СтрокаТаблицы = Неопределено Или СтрокаИдентификатор = Неопределено Тогда + Возврат; + КонецЕсли; + ТаблицыПолейИзменитьУровеньДоступа("Отборы", СтрокаИдентификатор, Истина, Не СтрокаТаблицы.ЭтоПараметр, УровеньДоступа); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент - Структура варианта. &НаКлиенте -Процедура СтруктураВариантаИзменитьУзел(ТаблицаИмя, СтрокаИдентификатор, СтрокаТаблицы, ИмяСтраницы) - Контекст = Новый Структура("ТаблицаИмя, СтрокаИдентификатор", ТаблицаИмя, СтрокаИдентификатор); - Обработчик = Новый ОписаниеОповещения("СтруктураВариантаИзменитьУзелЗавершение", ЭтотОбъект, Контекст); +Процедура ИзменитьУзелВарианта(СтрокаТаблицы, ИмяСтраницы, ИспользоватьФормуВарианта) + Если СтрокаТаблицы = Неопределено Тогда + Элементы = СтруктураВарианта.ПолучитьЭлементы(); + Если Элементы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + СтрокаТаблицы = Элементы[0]; + КонецЕсли; + Если ИспользоватьФормуВарианта = Неопределено Тогда + ИспользоватьФормуВарианта = (СтрокаТаблицы.Тип = "Таблица" + Или СтрокаТаблицы.Тип = "НастройкиВложенногоОбъекта"); + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ИзменитьУзелВариантаЗавершение", ЭтотОбъект); ШаблонЗаголовка = НСтр("ru = 'Настройка %1 отчета ""%2""'"); Если СтрокаТаблицы.Тип = "Диаграмма" Тогда @@ -3449,7 +3466,7 @@ ПредставлениеУзла = ПредставлениеУзла + " """ + СтрокаТаблицы.Представление + """"; КонецЕсли; - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, ТаблицаИмя); + УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "СтруктураВарианта"); ЭлементКД = НайтиОбъектКД(УзелКД, СтрокаТаблицы); ПолныйПуть = ОтчетыКлиентСервер.ПолныйПутьКЭлементу(Отчет.КомпоновщикНастроек.Настройки, ЭлементКД); Если ПолныйПуть = Неопределено Тогда @@ -3481,76 +3498,66 @@ МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, НастройкиОтчета.ПрефиксЗамеров); КонецЕсли; - ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаНастроек", ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Режим); + ИмяОткрываемойФормы = НастройкиОтчета.ПолноеИмя + ?(ИспользоватьФормуВарианта, ".ФормаВарианта", ".ФормаНастроек"); + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Режим); КонецПроцедуры &НаКлиенте -Процедура СтруктураВариантаИзменитьУзелЗавершение(Результат, Контекст) Экспорт +Процедура ИзменитьУзелВариантаЗавершение(Результат, Контекст) Экспорт Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Отмена Тогда Возврат; КонецЕсли; - БыстрыеНастройкиЗаполнить(Результат); - ПоказатьРезультатЗаполненияНастроек(); -КонецПроцедуры - -&НаКлиенте -Процедура ПерейтиКНастройкеВложенныхОтчетов(ИдентификаторТекущегоЭлементаКД = Неопределено) - ПараметрыФормы = Новый Структура; - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); - ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); - ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); - ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); - ПараметрыФормы.Вставить("ПредставлениеВарианта", ВариантНаименование); - ПараметрыФормы.Вставить("ПредставлениеПользовательскихНастроек", ""); - ПараметрыФормы.Вставить("ТекущаяСтрока", ИдентификаторТекущегоЭлементаКД); - - Обработчик = Новый ОписаниеОповещения("ПерейтиКНастройкеВложенныхОтчетовЗавершение", ЭтотОбъект); - - Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - - ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Режим); -КонецПроцедуры - -&НаКлиенте -Процедура ПерейтиКНастройкеВложенныхОтчетовЗавершение(Результат, ПараметрыВыполнения) Экспорт - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - БыстрыеНастройкиЗаполнитьКлиент(Результат); + ЗаполнитьБыстрыеНастройкиКлиент(Результат); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Клиент - Таблицы полей (универсальные точки входа). &НаКлиенте -Процедура ТаблицыПолейИзменитьУровеньДоступа(ТаблицаИмя, СтрокаИдентификатор, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков) +Процедура ТаблицыПолейИзменитьУровеньДоступа(ТаблицаИмя, СтрокаИдентификатор, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков, УровеньДоступа = Неопределено) Контекст = Новый Структура("ТаблицаИмя, СтрокаИдентификатор", ТаблицаИмя, СтрокаИдентификатор); Обработчик = Новый ОписаниеОповещения("ТаблицыПолейИзменитьУровеньДоступаЗавершение", ЭтотОбъект, Контекст); Список = Новый СписокЗначений; Если ПоказыватьРежимыВвода Тогда - Список.Добавить(2, НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ); + Список.Добавить("ПоказыватьВШапкеОтчета", НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ); КонецЕсли; Если ПоказыватьРежимыФлажков Тогда - Список.Добавить(1, НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком); + Список.Добавить("ПоказыватьТолькоФлажокВШапкеОтчета", НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком); КонецЕсли; Если ПоказыватьРежимыВвода Тогда - Список.Добавить(4, НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит); + Список.Добавить("ПоказыватьВНастройкахОтчета", НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит); КонецЕсли; Если ПоказыватьРежимыФлажков Тогда - Список.Добавить(3, НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком); + Список.Добавить("ПоказыватьТолькоФлажокВНастройкахОтчета", НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком); КонецЕсли; - Список.Добавить(5, НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СкрытаяНастройкаОтчета); + Список.Добавить("НеПоказывать", НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СкрытаяНастройкаОтчета); - ПоказатьВыборИзМеню(Обработчик, Список); + Если УровеньДоступа = Неопределено Тогда + ПоказатьВыборИзМеню(Обработчик, Список); + Иначе + ЭлементСписка = Список.НайтиПоЗначению(УровеньДоступа); + ВыполнитьОбработкуОповещения(Обработчик, ЭлементСписка); + КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ТаблицыПолейИзменитьУровеньДоступаЗавершение(Результат, Контекст) Экспорт - Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Отмена Тогда +Процедура ТаблицыПолейИзменитьУровеньДоступаЗавершение(ЭлементСписка, Контекст) Экспорт + Если ТипЗнч(ЭлементСписка) <> Тип("ЭлементСпискаЗначений") Тогда Возврат; КонецЕсли; - ИндексКартинкиДоступа = Результат.Значение; + УровеньДоступа = ЭлементСписка.Значение; + Если УровеньДоступа = "ПоказыватьВШапкеОтчета" Тогда + ИндексКартинкиДоступа = 2; + ИначеЕсли УровеньДоступа = "ПоказыватьТолькоФлажокВШапкеОтчета" Тогда + ИндексКартинкиДоступа = 1; + ИначеЕсли УровеньДоступа = "ПоказыватьВНастройкахОтчета" Тогда + ИндексКартинкиДоступа = 4; + ИначеЕсли УровеньДоступа = "ПоказыватьТолькоФлажокВНастройкахОтчета" Тогда + ИндексКартинкиДоступа = 3; + Иначе + ИндексКартинкиДоступа = 5; + КонецЕсли; СтрокаТаблицы = ЭтотОбъект[Контекст.ТаблицаИмя].НайтиПоИдентификатору(Контекст.СтрокаИдентификатор); Если СтрокаТаблицы = Неопределено Тогда @@ -3765,12 +3772,15 @@ Процедура ТаблицыПолейПередУдалением(ТаблицаИмя, Отказ) Отказ = Истина; - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки, УдалитьСтроки, ОбновитьФорму"); - Сценарий.Вставить("Действие", "Удалить"); - Сценарий.Вставить("ТаблицаИмя", ТаблицаИмя); + Контекст = НовыйКонтекст(ТаблицаИмя, "Удалить"); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; - ЗапуститьСценарий(Сценарий); + УдалитьСтроки(Контекст); + ОбновитьФорму(Контекст); КонецПроцедуры &НаКлиенте @@ -4255,7 +4265,7 @@ КонецПроцедуры -&НаКлиенте +&НаКлиентеНаСервереБезКонтекста Функция НайтиОбъектКД(Знач УзелКД, Знач СтрокаТаблицы) Если СтрокаТаблицы = Неопределено Или ТипЗнч(СтрокаТаблицы.ИдентификаторКД) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Возврат Неопределено; @@ -4264,7 +4274,7 @@ КонецЕсли; КонецФункции -&НаКлиенте +&НаКлиентеНаСервереБезКонтекста Функция ПолучитьЭлементыКД(Знач УзелКД, Знач ОбъектКД) Если ОбъектКД = Неопределено Тогда ОбъектКД = УзелКД; @@ -4283,7 +4293,7 @@ КонецЕсли; КонецФункции -&НаКлиенте +&НаКлиентеНаСервереБезКонтекста Функция ПолучитьЭлементы(Знач ДеревоФормы, Знач СтрокаДерева) Если СтрокаДерева = Неопределено Тогда СтрокаДерева = ДеревоФормы; @@ -4587,7 +4597,7 @@ БыстрыеНастройкиВосстановитьСостояние(ПараметрыЗаполнения); // Заголовок и свойства элементов. - ВидимостьДоступностьКорректность(ПараметрыЗаполнения.ИмяСобытия); + ОбновитьВидимостьДоступность(ПараметрыЗаполнения.ИмяСобытия); // Вызов переопределяемого модуля. Если НастройкиОтчета.События.ПослеЗаполненияПанелиБыстрыхНастроек Тогда @@ -4605,13 +4615,12 @@ КонецФункции &НаСервере -Процедура ВидимостьДоступностьКорректность(ИмяСобытия = "") +Процедура ОбновитьВидимостьДоступность(ИмяСобытия = "") Если ИмяСобытия = "ПриСозданииНаСервере" Тогда Если РежимИзмененияУзлаВарианта Тогда Элементы.РасширенныйРежим.Видимость = Ложь; Элементы.ЗакрытьИСформировать.Заголовок = НСтр("ru = 'Завершить редактирование'"); Элементы.Закрыть.Заголовок = НСтр("ru = 'Отмена'"); - Элементы.Переместить(Элементы.СтраницаОтборы, Элементы.СтраницыНастроек, Элементы.СтраницаОформление); КонецЕсли; КонецЕсли; КонецПроцедуры @@ -4620,117 +4629,219 @@ // Сервер &НаСервере -Функция ОтчетОбъект() - Возврат ОбщегоНазначения.ОбъектПоПолномуИмени(НастройкиОтчета.ПолноеИмя); -КонецФункции - -&НаСервере -Процедура ДобавитьУсловноеОформление() +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + // Отборы. - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ЗаголовокПереопределен", Ложь); - Инструкция.Поля = "ОтборыЗаголовок"; - Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗаголовок.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЗаголовокПереопределен"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ВыводитьФлажок", Ложь); - Инструкция.Поля = "ОтборыИспользование"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИспользование.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ВыводитьФлажок"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ЭтоРаздел", Истина); - Инструкция.Поля = "ОтборыУсловие, ОтборыЗначение, ОтборыПредставлениеЗначения, ОтборыИндексКартинкиДоступа, ОтборыЗаголовок"; - Инструкция.Оформление.Вставить("ТолькоПросмотр", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыУсловие.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеЗначения.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИндексКартинкиДоступа.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗаголовок.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ЭтоГруппа", Истина); - Инструкция.Поля = "ОтборыУсловие, ОтборыЗначение, ОтборыПредставлениеЗначения"; - Инструкция.Оформление.Вставить("ТолькоПросмотр", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыУсловие.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеЗначения.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ФиксированныйСписокВыбора", Ложь); - Инструкция.Поля = "ОтборыПредставлениеЗначения"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеЗначения.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ФиксированныйСписокВыбора"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Отборы.ФиксированныйСписокВыбора", Истина); - Инструкция.Поля = "ОтборыЗначение"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ФиксированныйСписокВыбора"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); // Выбранные поля. - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("ВыбранныеПоля.ЭтоРаздел", Истина); - Инструкция.Поля = "ВыбранныеПоляИспользование"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВыбранныеПоляИспользование.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВыбранныеПоля.ЭтоРаздел"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); // Сортировки. - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Сортировка.ЭтоРаздел", Истина); - Инструкция.Поля = "СортировкаИспользование, СортировкаНаправление"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("Сортировка.ТипНастройки", "АвтоЭлементПорядка"); - Инструкция.Поля = "СортировкаНаправление"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаИспользование.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаНаправление.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ЭтоРаздел"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - Если РежимИзмененияУзлаВарианта Тогда - // Состав группировки. - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("СоставГруппировки.ПоказыватьТипДополнения", Истина); - Инструкция.Поля = "СоставГруппировкиТипГруппировки"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("СоставГруппировки.ПоказыватьТипДополнения", Ложь); - Инструкция.Поля = "СоставГруппировкиТипДополнения"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - Иначе - // Структура. - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда - ШрифтВажнойНадписи = Новый Шрифт(, , Истина); - Иначе // Такси. - ШрифтВажнойНадписи = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь, 100); - КонецЕсли; - - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("СтруктураВарианта.ЭтоГруппа", Истина); - Инструкция.Поля = "СтруктураВариантаПредставление"; - Инструкция.Оформление.Вставить("Шрифт", ШрифтВажнойНадписи); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("СтруктураВарианта.Подсвечивать", Истина); - Инструкция.Поля = "СтруктураВариантаПредставление"; - Инструкция.Оформление.Вставить("Шрифт", ШрифтВажнойНадписи); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("СтруктураВарианта.ФлажокДоступен", Ложь); - Инструкция.Поля = "СтруктураВариантаИспользование"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); - КонецЕсли; + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаНаправление.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ТипНастройки"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = "АвтоЭлементПорядка"; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // Состав группировки. + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипГруппировки.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипДополнения.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // Структура. + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ЭтоГруппа"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина)); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.Подсвечивать"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина)); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаИспользование.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ФлажокДоступен"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); КонецПроцедуры @@ -4771,7 +4882,7 @@ ВыделенныеСтроки = Новый Структура; ПараметрыЗаполнения.Вставить("ВыделенныеСтроки", ВыделенныеСтроки); - ИменаТаблиц = "Отборы, ВыбранныеПоля, Сортировка, " + ?(РежимИзмененияУзлаВарианта, "СтруктураВарианта", "СоставГруппировки"); + ИменаТаблиц = "Отборы, ВыбранныеПоля, Сортировка, " + ?(РежимИзмененияУзлаВарианта, "СоставГруппировки", "СтруктураВарианта"); ИменаТаблиц = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаТаблиц, ",", Истина, Истина); Для Каждого ИмяТаблицы Из ИменаТаблиц Цикл ВыделенныеСтроки.Вставить(ИмяТаблицы, ОтчетыСервер.ЗапомнитьВыделенныеСтроки(ЭтотОбъект, ИмяТаблицы, "ИдентификаторКД")); @@ -4827,15 +4938,19 @@ КонецЕсли; КонецЕсли; + ОчиститьНастройкиОтНесуществующихПолей = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ОчиститьНастройкиОтНесуществующихПолей", Ложь); + ОбновитьНастройкиВарианта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ОбновитьНастройкиВарианта", Ложь); - Если ОбновитьНастройкиВарианта Тогда - ИнформацияОбОшибке = Неопределено; + Если ОбновитьНастройкиВарианта Или ОчиститьНастройкиОтНесуществующихПолей Тогда НовыеНастройкиКД = Отчет.КомпоновщикНастроек.ПолучитьНастройки(); + Если ОчиститьНастройкиОтНесуществующихПолей Тогда + ОчиститьНастройкиОтНесуществующихПолейНаСервере(НовыеНастройкиКД); + КонецЕсли; Отчет.КомпоновщикНастроек.ЗагрузитьФиксированныеНастройки(Новый НастройкиКомпоновкиДанных); КонецЕсли; СброситьПользовательскиеНастройки = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "СброситьПользовательскиеНастройки", Ложь); - Если СброситьПользовательскиеНастройки Тогда + Если СброситьПользовательскиеНастройки Или ОчиститьНастройкиОтНесуществующихПолей Тогда НовыеПользовательскиеНастройкиКД = Новый ПользовательскиеНастройкиКомпоновкиДанных; КонецЕсли; @@ -4914,7 +5029,6 @@ // Кэши для быстрого поиска с клиента. СоответствиеПользовательскихНастроек = Новый Соответствие; СоответствиеИменОбъектовМетаданных = Информация.СоответствиеИменОбъектовМетаданных; - СоответствиеОтключаемыхСвязей = Новый Соответствие; СоответствиеНастроекВарианта = Новый Соответствие; // Удаление реквизитов @@ -5205,7 +5319,6 @@ // Сохранение соответствий для быстрого поиска в данные формы. БыстрыйПоискПользовательскихНастроек = Новый ФиксированноеСоответствие(СоответствиеПользовательскихНастроек); БыстрыйПоискИменОбъектовМетаданных = Новый ФиксированноеСоответствие(СоответствиеИменОбъектовМетаданных); - БыстрыйПоискОтключаемыхСвязей = Новый ФиксированноеСоответствие(СоответствиеОтключаемыхСвязей); БыстрыйПоискНастроекВарианта = Новый ФиксированноеСоответствие(СоответствиеНастроекВарианта); ПользовательскиеНастройкиКД.ДополнительныеСвойства.Вставить("ЭлементыФормы", ДополнительныеНастройкиЭлементов); @@ -5253,7 +5366,7 @@ ВидимостьТаблицыОтборов = (РасширенныйРежим = 1 И ТипТекущегоУзлаКД <> "Диаграмма"); Если ВидимостьТаблицыОтборов Тогда Отборы.ПолучитьЭлементы().Очистить(); - ЗарегистрироватьПараметры(Информация); + ЗарегистрироватьЭлементыПараметров(Информация); ЗарегистрироватьЭлементыОтборов(Информация); ПараметрыЗаполнения.Результат.РазвернутьУзлыДеревьев.Добавить("Отборы"); КонецЕсли; @@ -5304,7 +5417,7 @@ КонецЕсли; ВидимостьСтруктуры = Ложь; - Если Не РежимИзмененияУзлаВарианта И КорневаяСтрока.Тип <> "НастройкиВложенногоОбъекта" Тогда + Если Не РежимИзмененияУзлаВарианта И КорневаяСтрока.Тип <> "НастройкиВложенногоОбъекта" И НастройкиОтчета.РазрешеноИзменятьСтруктуру Тогда СтрокиРодителя = СтруктураВарианта.ПолучитьЭлементы(); СтрокиРодителя.Очистить(); ЕстьФлажки = ЗарегистрироватьЭлементСтруктурыОтчета(КорневаяСтрока, СтрокиРодителя); @@ -5354,517 +5467,20 @@ Элементы.СтруктураВариантаСодержитОтборы.Видимость = (РасширенныйРежим = 1); Элементы.СтруктураВариантаСодержитПоляИлиСортировки.Видимость = (РасширенныйРежим = 1); Элементы.СтруктураВариантаСодержитУсловноеОформление.Видимость = (РасширенныйРежим = 1); - Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление.Видимость = (РасширенныйРежим = 1); - Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление1.Видимость = (РасширенныйРежим = 1); - Элементы.КомандыВыбранныхПолей_Группы.Видимость = (РасширенныйРежим = 1); + Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление.Видимость = (РасширенныйРежим = 1); + Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление1.Видимость = (РасширенныйРежим = 1); + Элементы.КомандыВыбранныхПолей_Группы.Видимость = (РасширенныйРежим = 1); Элементы.КомандыВыбранныхПолей_Группы1.Видимость = (РасширенныйРежим = 1); - Элементы.КомандыСортировки_ДобавлениеУдаление.Видимость = (РасширенныйРежим = 1) Или (ВидимостьСортировок И Не ВидимостьВыбранныхПолей); + Элементы.КомандыСортировки_ДобавлениеУдаление.Видимость = (РасширенныйРежим = 1) Или (ВидимостьСортировок И Не ВидимостьВыбранныхПолей); Элементы.КомандыСортировки_ДобавлениеУдаление1.Видимость = (РасширенныйРежим = 1) Или (ВидимостьСортировок И Не ВидимостьВыбранныхПолей); + Элементы.ГруппаЕстьНесуществующиеПоля.Видимость = Информация.ЕстьНесуществующиеПоля + И (РасширенныйРежим = 1) + И (ИдентификаторТекущегоУзлаКД = Неопределено); + КонецПроцедуры -&НаСервере -Функция ЗарегистрироватьЭлементСтруктурыОтчета(СтрокаДерева, СтрокиРодителя) - СтрокаФормы = СтрокиРодителя.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаФормы, СтрокаДерева, "ИдентификаторКД, Представление, Заголовок, Тип, Подтип, - |СодержитОтборы, СодержитУсловноеОформление"); - СтрокаФормы.СодержитПоляИлиСортировки = СтрокаДерева.СодержитПоля Или СтрокаДерева.СодержитСортировки; - - СтрокаФормы.ФлажокДоступен = Истина; - Если (РасширенныйРежим = 0 И СтрокаДерева.ПользовательскаяНастройка = Неопределено) - Или СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыДиаграммы" - Или СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыТаблицы" - Или СтрокаДерева.Тип = "Настройки" Тогда - СтрокаФормы.ФлажокДоступен = Ложь; - КонецЕсли; - - Если РасширенныйРежим = 0 И ЗначениеЗаполнено(СтрокаФормы.Заголовок) Тогда - СтрокаФормы.Представление = СтрокаФормы.Заголовок; - СтрокаФормы.Подсвечивать = Истина; - КонецЕсли; - - СтрокаФормы.ИндексКартинки = -1; - Если СтрокаДерева.Тип = "Группировка" - Или СтрокаДерева.Тип = "ГруппировкаТаблицы" - Или СтрокаДерева.Тип = "ГруппировкаДиаграммы" Тогда - СтрокаФормы.ИндексКартинки = 1; - ИначеЕсли СтрокаДерева.Тип = "Таблица" Тогда - СтрокаФормы.ИндексКартинки = 2; - ИначеЕсли СтрокаДерева.Тип = "Диаграмма" Тогда - СтрокаФормы.ИндексКартинки = 3; - ИначеЕсли СтрокаДерева.Тип = "НастройкиВложенногоОбъекта" Тогда - СтрокаФормы.ИндексКартинки = 4; - КонецЕсли; - - Если СтрокаФормы.Тип = "Настройки" Тогда - СтрокаФормы.ЭтоРаздел = Истина; - СтрокаФормы.Заголовок = ""; - СтрокаФормы.Представление = НСтр("ru = 'Отчет'"); - СтрокаФормы.СодержитОтборы = Ложь; - СтрокаФормы.СодержитПоляИлиСортировки = Ложь; - СтрокаФормы.СодержитУсловноеОформление = Ложь; - СтрокаФормы.Подсвечивать = Ложь; - КонецЕсли; - - Если СтрокаФормы.ФлажокДоступен Тогда - Если РасширенныйРежим = 0 Тогда - СтрокаФормы.ИдентификаторКД = СтрокаДерева.ПользовательскаяНастройка.ИдентификаторКД; - СтрокаФормы.Использование = СтрокаДерева.ПользовательскаяНастройка.ПользовательскаяНастройкаКД.Использование; - Иначе - СтрокаФормы.Использование = СтрокаДерева.УзелКД.Использование; - КонецЕсли; - КонецЕсли; - - ПодчиненныеСтрокиРодителя = СтрокаФормы.ПолучитьЭлементы(); - - ЕстьВложенныеФлажки = Ложь; - Для Каждого ПодчиненнаяСтрокаДерева Из СтрокаДерева.Строки Цикл - Если ЗарегистрироватьЭлементСтруктурыОтчета(ПодчиненнаяСтрокаДерева, ПодчиненныеСтрокиРодителя) Тогда - ЕстьВложенныеФлажки = Истина; - КонецЕсли; - КонецЦикла; - - Возврат СтрокаФормы.ФлажокДоступен Или ЕстьВложенныеФлажки; -КонецФункции - -&НаСервере -Функция ЗарегистрироватьЭлементыСортировки() - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "Сортировка", Неопределено); - Если УзелКД = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - НаборСтрокКД = УзелКД.Элементы; - - СтрокаРаздел = Сортировка.ПолучитьЭлементы().Добавить(); - СтрокаРаздел.ЭтоРаздел = Истина; - СтрокаРаздел.Представление = НСтр("ru = 'Сортировки'"); - СтрокаРаздел.ИндексКартинки = 15; - СтрокаРаздел.ИдентификаторКД = Неопределено; - НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); - - ДоступныеПоля = УзелКД.ДоступныеПоляПорядка; - Для Каждого ЭлементКД Из НаборСтрокКД Цикл - ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); - Если ТипНастройки = "ЭлементПорядка" И Не ЗначениеЗаполнено(ЭлементКД.Поле) Тогда - Продолжить; - КонецЕсли; - - СтрокаТаблицы = НаборСтрок.Добавить(); - СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); - СтрокаТаблицы.ТипНастройки = ТипНастройки; - СтрокаТаблицы.Использование = ЭлементКД.Использование; - СтрокаТаблицы.ИндексКартинки = -1; - - Если ТипНастройки = "АвтоЭлементПорядка" Тогда - СтрокаТаблицы.Представление = НСтр("ru = 'Авто (сортировки родителя)'"); - ИначеЕсли ТипНастройки = "ЭлементПорядка" Тогда - СтрокаТаблицы.Направление = ЭлементКД.ТипУпорядочивания; - ДоступноеПоле = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); - Если ДоступноеПоле = Неопределено Тогда - СтрокаТаблицы.Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); - Иначе - СтрокаТаблицы.Представление = ДоступноеПоле.Заголовок; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат Истина; -КонецФункции - -&НаСервере -Процедура ЗарегистрироватьЭлементыСоставаГруппировки(УзелКД = Неопределено, НаборСтрокКД = Неопределено, НаборСтрок = Неопределено) - Если УзелКД = Неопределено Тогда - УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "СоставГруппировки", Неопределено); - Если УзелКД = Неопределено Тогда - Возврат; - КонецЕсли; - КонецЕсли; - Если НаборСтрокКД = Неопределено Тогда - НаборСтрокКД = УзелКД.Элементы; - КонецЕсли; - Если НаборСтрок = Неопределено Тогда - НаборСтрок = СоставГруппировки.ПолучитьЭлементы(); - КонецЕсли; - ДоступныеПоля = УзелКД.ДоступныеПоляПолейГруппировок; - Для Каждого ЭлементКД Из НаборСтрокКД Цикл - ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); - ПолеКД = Неопределено; - Если ТипНастройки = "ПолеГруппировки" Тогда - Если Не ЗначениеЗаполнено(ЭлементКД.Поле) Тогда - Продолжить; - КонецЕсли; - ПолеКД = ЭлементКД.Поле; - КонецЕсли; - - СтрокаТаблицы = НаборСтрок.Добавить(); - СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); - СтрокаТаблицы.ТипНастройки = ТипНастройки; - СтрокаТаблицы.Использование = ЭлементКД.Использование; - СтрокаТаблицы.ПолеКД = ПолеКД; - - Если ТипНастройки = "АвтоПолеГруппировки" Тогда - СтрокаТаблицы.Представление = НСтр("ru = 'Авто (по всем полям)'"); - СтрокаТаблицы.ИндексКартинки = 6; - ИначеЕсли ТипНастройки = "ПолеГруппировки" Тогда - СтрокаТаблицы.ТипГруппировки = ЭлементКД.ТипГруппировки; - СтрокаТаблицы.ТипДополнения = ЭлементКД.ТипДополнения; - ДоступноеПоле = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); - Если ДоступноеПоле = Неопределено Тогда - СтрокаТаблицы.Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); - СтрокаТаблицы.ИндексКартинки = 5; - Иначе - СтрокаТаблицы.Представление = ДоступноеПоле.Заголовок; - Если ДоступноеПоле.Ресурс Тогда - СтрокаТаблицы.ИндексКартинки = 20; - ИначеЕсли ДоступноеПоле.Таблица Тогда - СтрокаТаблицы.ИндексКартинки = 21; - ИначеЕсли ДоступноеПоле.Папка Тогда - СтрокаТаблицы.ИндексКартинки = 1; - Иначе - СтрокаТаблицы.ИндексКартинки = 4; - КонецЕсли; - ИнформацияОТипах = ОтчетыКлиентСервер.АнализТипов(ДоступноеПоле.ТипЗначения, Ложь); - Если ИнформацияОТипах.СодержитТипПериод Или ИнформацияОТипах.СодержитТипДата Тогда - СтрокаТаблицы.ПоказыватьТипДополнения = Истина; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Функция ЗарегистрироватьЭлементыВыбранныхПолей(УзелКД, НаборСтрокКД = Неопределено, НаборСтрок = Неопределено, ДоступныеПоля = Неопределено) - Если УзелКД = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - Если НаборСтрокКД = Неопределено Тогда - НаборСтрокКД = УзелКД.Элементы; - КонецЕсли; - Если НаборСтрок = Неопределено Тогда - СтрокаРаздел = ВыбранныеПоля.ПолучитьЭлементы().Добавить(); - СтрокаРаздел.ЭтоРаздел = Истина; - СтрокаРаздел.Представление = НСтр("ru = 'Поля'"); - СтрокаРаздел.ИндексКартинки = 14; - СтрокаРаздел.ИдентификаторКД = "ВыбранныеПоля"; - НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); - КонецЕсли; - Если ДоступныеПоля = Неопределено Тогда - ДоступныеПоля = УзелКД.ДоступныеПоляВыбора; - КонецЕсли; - - Для Каждого ЭлементКД Из НаборСтрокКД Цикл - ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); - ЭтоГруппа = Ложь; - ПолеКД = Неопределено; - Если ТипНастройки = "АвтоВыбранноеПоле" Тогда - Представление = НСтр("ru = 'Авто (поля родителя)'"); - ИндексКартинки = 6; - Иначе - Если ТипНастройки = "ГруппаВыбранныхПолей" Тогда - ЭтоГруппа = Истина; - ИндексКартинки = 1; - Иначе - ИндексКартинки = 4; - КонецЕсли; - - Представление = ЭлементКД.Заголовок; - Если ЗначениеЗаполнено(ЭлементКД.Поле) Тогда - ДоступноеПоле = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); - ПолеКД = ЭлементКД.Поле; - Иначе - Если Не ЭтоГруппа Тогда - Продолжить; - КонецЕсли; - ДоступноеПоле = Неопределено; - КонецЕсли; - Если ДоступноеПоле = Неопределено Тогда - Если Не ЭтоГруппа Тогда - ИндексКартинки = 5; - Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); - КонецЕсли; - ИначеЕсли Представление = "" Тогда - Представление = ДоступноеПоле.Заголовок; - КонецЕсли; - Если ЭтоГруппа И ЭлементКД.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда - Представление = Представление + " (" + Строка(ЭлементКД.Расположение) + ")"; - КонецЕсли; - КонецЕсли; - - СтрокаТаблицы = НаборСтрок.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементКД); - СтрокаТаблицы.ТипНастройки = ТипНастройки; - СтрокаТаблицы.ИндексКартинки = ИндексКартинки; - СтрокаТаблицы.ЭтоГруппа = ЭтоГруппа; - СтрокаТаблицы.Представление = Представление; - СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); - СтрокаТаблицы.ПолеКД = ПолеКД; - - Если ЭтоГруппа Тогда - ЗарегистрироватьЭлементыВыбранныхПолей(УзелКД, ЭлементКД.Элементы, СтрокаТаблицы.ПолучитьЭлементы(), ДоступныеПоля); - КонецЕсли; - КонецЦикла; - - Возврат Истина; -КонецФункции - -&НаСервере -Процедура ЗарегистрироватьПараметры(Информация) - Если РежимИзмененияУзлаВарианта Тогда - Возврат; - КонецЕсли; - - УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "ПараметрыДанных"); - Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); - Если Найденные.Количество() = 0 Тогда - Возврат; - КонецЕсли; - НаборСтрокВарианта = Найденные[0].Строки; - - СтрокаРаздел = Отборы.ПолучитьЭлементы().Добавить(); - СтрокаРаздел.ЭтоРаздел = Истина; - СтрокаРаздел.ЭтоПараметр = Истина; - СтрокаРаздел.Представление = НСтр("ru = 'Параметры'"); - СтрокаРаздел.ИндексКартинки = 2; - СтрокаРаздел.ИдентификаторКД = "ПараметрыДанных"; - НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); - - Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл - Если Не НастройкаВарианта.ВыводРазрешен Тогда - Продолжить; - КонецЕсли; - - ДоступнаяНастройкаКД = НастройкаВарианта.ДоступнаяНастройкаКД; - ЭлементКД = НастройкаВарианта.ЭлементКД; - - Если ЗначениеЗаполнено(НастройкаВарианта.ДоступнаяНастройкаКД.Заголовок) Тогда - Представление = НастройкаВарианта.ДоступнаяНастройкаКД.Заголовок; - Иначе - Представление = Строка(ЭлементКД.Параметр); - КонецЕсли; - - СтрокаТаблицы = НаборСтрок.Добавить(); - СтрокаТаблицы.Использование = ЭлементКД.Использование; - СтрокаТаблицы.Значение = НастройкаВарианта.Значение; - СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; - СтрокаТаблицы.Представление = Представление; - СтрокаТаблицы.ЭтоПараметр = Истина; - СтрокаТаблицы.ИндексКартинки = -1; - СтрокаТаблицы.ТипЗначения = НастройкаВарианта.ДоступнаяНастройкаКД.ТипЗначения; - СтрокаТаблицы.ВводСписком = НастройкаВарианта.ВводСписком; - СтрокаТаблицы.ВыводитьФлажок = НастройкаВарианта.ВыводитьФлажок; - СтрокаТаблицы.ВыборГруппИЭлементов = НастройкаВарианта.ВыборГруппИЭлементов; - - Если НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями - И ТипЗнч(НастройкаВарианта.ЗначенияДляВыбора) = Тип("СписокЗначений") Тогда - Если СтрокаТаблицы.ВводСписком Тогда - Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СписокЗначений") Тогда - Для Каждого ЭлементСписка Из СтрокаТаблицы.Значение Цикл - ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(ЭлементСписка.Значение); - Если ЭлементДляВыбора <> Неопределено Тогда - ЭлементСписка.Представление = ЭлементДляВыбора.Представление; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Иначе - СтрокаТаблицы.ФиксированныйСписокВыбора = Истина; - ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(СтрокаТаблицы.Значение); - Если ЭлементДляВыбора <> Неопределено Тогда - СтрокаТаблицы.ПредставлениеЗначения = ЭлементДляВыбора.Представление; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - НастройкаВарианта.ИдентификаторВФорме = СтрокаТаблицы.ПолучитьИдентификатор(); - - Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СтандартныйПериод") Тогда - СтрокаТаблицы.Условие = ОтчетыКлиентСервер.ПолучитьВидСтандартногоПериода(СтрокаТаблицы.Значение); - СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"); - Иначе - СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("Неопределено"); - КонецЕсли; - - СтрокаТаблицы.Заголовок = Представление; - Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда - Если ЗначениеЗаполнено(ЭлементКД.ПредставлениеПользовательскойНастройки) Тогда - СтрокаТаблицы.Заголовок = ЭлементКД.ПредставлениеПользовательскойНастройки; - КонецЕсли; - Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = 2; - ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = 4; - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - - Дополнительно = Новый Структура( - "ОписаниеТипов, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, - |ПараметрыВыбора, ФормаВыбора, ЗначенияДляВыбора"); - ЗаполнитьЗначенияСвойств(Дополнительно, НастройкаВарианта); - СтрокаТаблицы.Дополнительно = Дополнительно; - - КонецЦикла; -КонецПроцедуры - -&НаСервере -Процедура ЗарегистрироватьЭлементыОтборов(Информация, НаборСтрокВарианта = Неопределено, НаборСтрокФормы = Неопределено) - Если НаборСтрокВарианта = Неопределено Тогда - УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "Отбор"); - Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); - Если Найденные.Количество() = 0 Тогда - Возврат; - КонецЕсли; - НаборСтрокВарианта = Найденные[0].Строки; - КонецЕсли; - Если НаборСтрокФормы = Неопределено Тогда - НаборСтрокФормы = Отборы.ПолучитьЭлементы(); - СтрокаРаздел = НаборСтрокФормы.Добавить(); - СтрокаРаздел.ЭтоРаздел = Истина; - СтрокаРаздел.Представление = НСтр("ru = 'Отборы'"); - СтрокаРаздел.ИндексКартинки = 3; - СтрокаРаздел.ИдентификаторКД = "Отборы"; - НаборСтрокФормы = СтрокаРаздел.ПолучитьЭлементы(); - КонецЕсли; - Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл - Если НастройкаВарианта.Тип = "ГруппаЭлементовОтбора" Тогда - ЭтоГруппа = Истина; - ИначеЕсли НастройкаВарианта.Тип = "ЭлементОтбора" Тогда - Если НастройкаВарианта.ДоступнаяНастройкаКД = Неопределено Тогда - Продолжить; - КонецЕсли; - ЭтоГруппа = Ложь; - Иначе - Продолжить; - КонецЕсли; - - ЭлементКД = НастройкаВарианта.ЭлементКД; - - СтрокаТаблицы = НаборСтрокФормы.Добавить(); - СтрокаТаблицы.Использование = НастройкаВарианта.ЭлементКД.Использование; - СтрокаТаблицы.Представление = НастройкаВарианта.ПредставлениеПоУмолчанию; - СтрокаТаблицы.Заголовок = НастройкаВарианта.Представление; - СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; - СтрокаТаблицы.ЭтоПараметр = Ложь; - СтрокаТаблицы.ЭтоГруппа = ЭтоГруппа; - СтрокаТаблицы.ВводСписком = НастройкаВарианта.ВводСписком; - СтрокаТаблицы.ВыводитьФлажок = НастройкаВарианта.ВыводитьФлажок; - СтрокаТаблицы.ФормаВыбора = НастройкаВарианта.ФормаВыбора; - СтрокаТаблицы.ВыборГруппИЭлементов = НастройкаВарианта.ВыборГруппИЭлементов; - СтрокаТаблицы.ЗаголовокПереопределен = (СтрокаТаблицы.Заголовок <> СтрокаТаблицы.Представление); - - НастройкаВарианта.ИдентификаторВФорме = СтрокаТаблицы.ПолучитьИдентификатор(); - - Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда - Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = ?(НастройкаВарианта.ВыводитьТолькоФлажок, 1, 2); - ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = ?(НастройкаВарианта.ВыводитьТолькоФлажок, 3, 4); - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - - Если ЭтоГруппа Тогда - СтрокаТаблицы.ИндексКартинки = -1; - ЗарегистрироватьЭлементыОтборов(Информация, НастройкаВарианта.Строки, СтрокаТаблицы.ПолучитьЭлементы()); - Иначе - СтрокаТаблицы.Значение = НастройкаВарианта.Значение; - Если НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями - И ТипЗнч(НастройкаВарианта.ЗначенияДляВыбора) = Тип("СписокЗначений") Тогда - Если СтрокаТаблицы.ВводСписком Тогда - Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СписокЗначений") Тогда - Для Каждого ЭлементСписка Из СтрокаТаблицы.Значение Цикл - ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(ЭлементСписка.Значение); - Если ЭлементДляВыбора <> Неопределено Тогда - ЭлементСписка.Представление = ЭлементДляВыбора.Представление; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Иначе - СтрокаТаблицы.ФиксированныйСписокВыбора = Истина; - ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(СтрокаТаблицы.Значение); - Если ЭлементДляВыбора <> Неопределено Тогда - СтрокаТаблицы.ПредставлениеЗначения = ЭлементДляВыбора.Представление; - КонецЕсли; - КонецЕсли; - КонецЕсли; - СтрокаТаблицы.ТипЗначения = НастройкаВарианта.ОписаниеТипов; - СтрокаТаблицы.ИндексКартинки = -1; - Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СтандартныйПериод") Тогда - СтрокаТаблицы.Условие = ОтчетыКлиентСервер.ПолучитьВидСтандартногоПериода(СтрокаТаблицы.Значение); - СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"); - Иначе - СтрокаТаблицы.Условие = НастройкаВарианта.ВидСравнения; - СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ВидСравненияКомпоновкиДанных"); - КонецЕсли; - КонецЕсли; - - Дополнительно = Новый Структура( - "ОписаниеТипов, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, - |ПараметрыВыбора, ФормаВыбора, ЗначенияДляВыбора"); - ЗаполнитьЗначенияСвойств(Дополнительно, НастройкаВарианта); - СтрокаТаблицы.Дополнительно = Дополнительно; - - КонецЦикла; -КонецПроцедуры - -&НаСервере -Процедура ЗарегистрироватьОтключаемыеСвязи(Информация) - ОтключаемыеСвязи.Очистить(); - Для Каждого ОписаниеСвязи Из Информация.ОтключаемыеСвязи Цикл - Связь = ОтключаемыеСвязи.Добавить(); - ЗаполнитьЗначенияСвойств(Связь, ОписаниеСвязи); - Если РасширенныйРежим = 1 Тогда - Связь.ВедущийИдентификаторВФорме = ОписаниеСвязи.Ведущий.ИдентификаторВФорме; - Связь.ПодчиненныйИдентификаторВФорме = ОписаниеСвязи.Подчиненный.ИдентификаторВФорме; - Иначе - Связь.ВедущийИдентификаторВФорме = ОписаниеСвязи.Ведущий.ИдентификаторЭлемента; - Связь.ПодчиненныйИдентификаторВФорме = ОписаниеСвязи.Подчиненный.ИдентификаторЭлемента; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Процедура ЗарегистрироватьЭлементыОформления(Информация, НаборСтрокВарианта = Неопределено, НаборСтрокФормы = Неопределено) - Если НаборСтрокВарианта = Неопределено Тогда - УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "УсловноеОформление"); - Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); - Если Найденные.Количество() = 0 Тогда - Возврат; - КонецЕсли; - НаборСтрокВарианта = Найденные[0].Строки; - КонецЕсли; - Если НаборСтрокФормы = Неопределено Тогда - НаборСтрокФормы = Оформление.ПолучитьЭлементы(); - КонецЕсли; - Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл - ЭлементКД = НастройкаВарианта.ЭлементКД; - - СтрокаТаблицы = НаборСтрокФормы.Добавить(); - СтрокаТаблицы.Использование = ЭлементКД.Использование; - СтрокаТаблицы.Представление = НастройкаВарианта.ПредставлениеПоУмолчанию; - СтрокаТаблицы.Заголовок = НастройкаВарианта.Представление; - СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; - СтрокаТаблицы.ИндексКартинки = -1; - СтрокаТаблицы.ЗаголовокПереопределен = (СтрокаТаблицы.Заголовок <> СтрокаТаблицы.Представление); - - Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда - Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = 2; - ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда - СтрокаТаблицы.ИндексКартинкиДоступа = 4; - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - Иначе - СтрокаТаблицы.ИндексКартинкиДоступа = 5; - КонецЕсли; - КонецЦикла; -КонецПроцедуры +// Перетаскивание. &НаКлиенте Процедура ПеретаскиваниеВПределахТаблицы(ИсточникПеретаскивания, ИдентификаторЦели) @@ -6025,7 +5641,7 @@ НоваяСтрока.Представление = ДоступноеПолеКД.Заголовок; НоваяСтрока.Направление = НовыйЭлементКД.ТипУпорядочивания; НоваяСтрока.ТипНастройки = "ЭлементПорядка"; - НоваяСтрока.ИндексКартинки = -1; + НоваяСтрока.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); Индекс = Индекс + 1; ИндексКД = ИндексКД + 1; @@ -6075,26 +5691,23 @@ &НаКлиенте Функция ЗарегистрироватьНачалоПеретаскивания(ТаблицаИмя, ИсточникПеретаскивания = Неопределено) - Сценарий = Новый Структура; - Сценарий.Вставить("Шаги", "ОпределитьВыделенныеСтроки"); - Сценарий.Вставить("Действие", "НачалоПеретаскивания"); - Сценарий.Вставить("ТаблицаИмя", ТаблицаИмя); - ЗапуститьСценарий(Сценарий); - - Если ЗначениеЗаполнено(Сценарий.ПричинаОтказа) Тогда + Контекст = НовыйКонтекст(ТаблицаИмя, "НачалоПеретаскивания"); + ОпределитьВыделенныеСтроки(Контекст); + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда Возврат Ложь; КонецЕсли; ИсточникПеретаскивания = Новый Структура("ТаблицаИмя, СтрокиДерева, ТекущаяСтрока"); - ЗаполнитьЗначенияСвойств(ИсточникПеретаскивания, Сценарий); - ПеременныеКлиента.Вставить("ИсточникПеретаскивания", ИсточникПеретаскивания); + ЗаполнитьЗначенияСвойств(ИсточникПеретаскивания, Контекст); + ИсточникПеретаскиванияНаКлиенте = ИсточникПеретаскивания; Возврат Истина; + КонецФункции &НаКлиенте Процедура ПроверитьВозможностьПеретаскивания(ТаблицаИмя, ИдентификаторЦели, ПараметрыПеретаскивания) - ИсточникПеретаскивания = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ИсточникПеретаскивания"); + ИсточникПеретаскивания = ИсточникПеретаскиванияНаКлиенте; Если ИсточникПеретаскивания = Неопределено Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; ИначеЕсли ИсточникПеретаскивания.ТаблицаИмя = ТаблицаИмя Тогда @@ -6120,15 +5733,670 @@ Если РасширенныйРежим = 1 Тогда ВариантИзменен = Истина; КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда - ПодключитьОбработчикОжидания("Обновить", 3, Истина); - КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Обновить() - БыстрыеНастройкиЗаполнитьКлиент(Неопределено); + ЗаполнитьБыстрыеНастройкиКлиент(); КонецПроцедуры +// Регистрация настроек. + +&НаСервере +Функция ЗарегистрироватьЭлементСтруктурыОтчета(СтрокаДерева, СтрокиРодителя) + Если СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыДиаграммы" + Или СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыТаблицы" + Или СтрокаДерева.Тип = "Настройки" Тогда + Использование = Истина; + ФлажокДоступен = Ложь; + Иначе + Если СтрокаДерева.ПользовательскаяНастройка = Неопределено Тогда + Использование = СтрокаДерева.УзелКД.Использование; + ФлажокДоступен = (РасширенныйРежим = 1); + Иначе + Использование = СтрокаДерева.ПользовательскаяНастройка.ПользовательскаяНастройкаКД.Использование; + ФлажокДоступен = Истина; + КонецЕсли; + КонецЕсли; + Если Не Использование И Не ФлажокДоступен Тогда + Возврат Ложь; + КонецЕсли; + + СтрокаФормы = СтрокиРодителя.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаФормы, СтрокаДерева, "ИдентификаторКД, Представление, Заголовок, Тип, Подтип, + |СодержитОтборы, СодержитУсловноеОформление"); + СтрокаФормы.СодержитПоляИлиСортировки = СтрокаДерева.СодержитПоля Или СтрокаДерева.СодержитСортировки; + + СтрокаФормы.ФлажокДоступен = ФлажокДоступен; + СтрокаФормы.Использование = Использование; + Если СтрокаФормы.ФлажокДоступен И РасширенныйРежим = 0 Тогда + СтрокаФормы.ИдентификаторКД = СтрокаДерева.ПользовательскаяНастройка.ИдентификаторКД; + КонецЕсли; + + Если РасширенныйРежим = 0 И ЗначениеЗаполнено(СтрокаФормы.Заголовок) Тогда + СтрокаФормы.Представление = СтрокаФормы.Заголовок; + СтрокаФормы.Подсвечивать = Истина; + КонецЕсли; + + // Типы: "Группировка", "ГруппировкаТаблицы", "ГруппировкаДиаграммы", + // "Таблица", "Диаграмма", "НастройкиВложенногоОбъекта". + СтрокаФормы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки(СтрокаДерева.Тип, СтрокаДерева.Состояние); + Если СтрокаФормы.Тип = "Настройки" Тогда + СтрокаФормы.ИндексКартинки = -1; + СтрокаФормы.ЭтоРаздел = Истина; + СтрокаФормы.Заголовок = ""; + СтрокаФормы.Представление = НСтр("ru = 'Отчет'"); + СтрокаФормы.СодержитОтборы = Ложь; + СтрокаФормы.СодержитПоляИлиСортировки = Ложь; + СтрокаФормы.СодержитУсловноеОформление = Ложь; + СтрокаФормы.Подсвечивать = Ложь; + КонецЕсли; + + ПодчиненныеСтрокиРодителя = СтрокаФормы.ПолучитьЭлементы(); + + ЕстьВложенныеФлажки = Ложь; + Для Каждого ПодчиненнаяСтрокаДерева Из СтрокаДерева.Строки Цикл + Если ЗарегистрироватьЭлементСтруктурыОтчета(ПодчиненнаяСтрокаДерева, ПодчиненныеСтрокиРодителя) Тогда + ЕстьВложенныеФлажки = Истина; + КонецЕсли; + КонецЦикла; + + Возврат СтрокаФормы.ФлажокДоступен Или ЕстьВложенныеФлажки; +КонецФункции + +&НаСервере +Процедура ЗарегистрироватьЭлементыСоставаГруппировки(УзелКД = Неопределено, НаборСтрокКД = Неопределено, НаборСтрок = Неопределено) + Если УзелКД = Неопределено Тогда + УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "СоставГруппировки", Неопределено); + Если УзелКД = Неопределено Тогда + Возврат; + КонецЕсли; + КонецЕсли; + Если НаборСтрокКД = Неопределено Тогда + НаборСтрокКД = УзелКД.Элементы; + КонецЕсли; + Если НаборСтрок = Неопределено Тогда + НаборСтрок = СоставГруппировки.ПолучитьЭлементы(); + КонецЕсли; + ДоступныеПоля = УзелКД.ДоступныеПоляПолейГруппировок; + Для Каждого ЭлементКД Из НаборСтрокКД Цикл + ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); + ПолеКД = Неопределено; + Если ТипНастройки = "ПолеГруппировки" Тогда + Если Не ЗначениеЗаполнено(ЭлементКД.Поле) Тогда + Продолжить; + КонецЕсли; + ПолеКД = ЭлементКД.Поле; + КонецЕсли; + + СтрокаТаблицы = НаборСтрок.Добавить(); + СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); + СтрокаТаблицы.ТипНастройки = ТипНастройки; + СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.ПолеКД = ПолеКД; + + Если ТипНастройки = "АвтоПолеГруппировки" Тогда + СтрокаТаблицы.Представление = НСтр("ru = 'Авто (по всем полям)'"); + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "Предопределенный"); + ИначеЕсли ТипНастройки = "ПолеГруппировки" Тогда + СтрокаТаблицы.ТипГруппировки = ЭлементКД.ТипГруппировки; + СтрокаТаблицы.ТипДополнения = ЭлементКД.ТипДополнения; + ДоступноеПолеКД = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); + Если ДоступноеПолеКД = Неопределено Тогда + СтрокаТаблицы.Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "ПометкаУдаления"); + Иначе + СтрокаТаблицы.Представление = ДоступноеПолеКД.Заголовок; + Если ДоступноеПолеКД.Ресурс Тогда + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Ресурс"); + ИначеЕсли ДоступноеПолеКД.Таблица Тогда + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Таблица"); + ИначеЕсли ДоступноеПолеКД.Папка Тогда + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Группа"); + Иначе + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); + КонецЕсли; + ИнформацияОТипах = ОтчетыКлиентСервер.АнализТипов(ДоступноеПолеКД.ТипЗначения, Ложь); + Если ИнформацияОТипах.СодержитТипПериод Или ИнформацияОТипах.СодержитТипДата Тогда + СтрокаТаблицы.ПоказыватьТипДополнения = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаСервере +Функция ЗарегистрироватьЭлементыВыбранныхПолей(УзелКД, НаборСтрокКД = Неопределено, НаборСтрок = Неопределено, ДоступныеПоля = Неопределено) + Если УзелКД = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + Если НаборСтрокКД = Неопределено Тогда + НаборСтрокКД = УзелКД.Элементы; + КонецЕсли; + Если НаборСтрок = Неопределено Тогда + СтрокаРаздел = ВыбранныеПоля.ПолучитьЭлементы().Добавить(); + СтрокаРаздел.ЭтоРаздел = Истина; + СтрокаРаздел.Представление = НСтр("ru = 'Поля'"); + СтрокаРаздел.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("ВыбранныеПоля"); + СтрокаРаздел.ИдентификаторКД = "ВыбранныеПоля"; + НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); + КонецЕсли; + Если ДоступныеПоля = Неопределено Тогда + ДоступныеПоля = УзелКД.ДоступныеПоляВыбора; + КонецЕсли; + + ИндексКартинкиГруппы = ОтчетыКлиентСервер.ИндексКартинки("Группа"); + ИндексКартинкиЭлемента = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); + Для Каждого ЭлементКД Из НаборСтрокКД Цикл + ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); + ЭтоГруппа = Ложь; + ПолеКД = Неопределено; + Если ТипНастройки = "АвтоВыбранноеПоле" Тогда + Представление = НСтр("ru = 'Авто (поля родителя)'"); + ИндексКартинки = 6; + Иначе + Если ТипНастройки = "ГруппаВыбранныхПолей" Тогда + ЭтоГруппа = Истина; + ИндексКартинки = ИндексКартинкиГруппы; + Иначе + ИндексКартинки = ИндексКартинкиЭлемента; + КонецЕсли; + + Представление = ЭлементКД.Заголовок; + Если ЗначениеЗаполнено(ЭлементКД.Поле) Тогда + ДоступноеПоле = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); + ПолеКД = ЭлементКД.Поле; + Иначе + Если Не ЭтоГруппа Тогда + Продолжить; + КонецЕсли; + ДоступноеПоле = Неопределено; + КонецЕсли; + Если ДоступноеПоле = Неопределено Тогда + Если Не ЭтоГруппа Тогда + ИндексКартинки = 5; + Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); + КонецЕсли; + ИначеЕсли Представление = "" Тогда + Представление = ДоступноеПоле.Заголовок; + КонецЕсли; + Если ЭтоГруппа И ЭлементКД.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда + Представление = Представление + " (" + Строка(ЭлементКД.Расположение) + ")"; + КонецЕсли; + КонецЕсли; + + СтрокаТаблицы = НаборСтрок.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементКД); + СтрокаТаблицы.ТипНастройки = ТипНастройки; + СтрокаТаблицы.ИндексКартинки = ИндексКартинки; + СтрокаТаблицы.ЭтоГруппа = ЭтоГруппа; + СтрокаТаблицы.Представление = Представление; + СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); + СтрокаТаблицы.ПолеКД = ПолеКД; + + Если ЭтоГруппа Тогда + ЗарегистрироватьЭлементыВыбранныхПолей(УзелКД, ЭлементКД.Элементы, СтрокаТаблицы.ПолучитьЭлементы(), ДоступныеПоля); + КонецЕсли; + КонецЦикла; + + Возврат Истина; +КонецФункции + +&НаСервере +Функция ЗарегистрироватьЭлементыСортировки() + УзелКД = ТаблицыПолейНайтиУзел(ЭтотОбъект, "Сортировка", Неопределено); + Если УзелКД = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + НаборСтрокКД = УзелКД.Элементы; + + СтрокаРаздел = Сортировка.ПолучитьЭлементы().Добавить(); + СтрокаРаздел.ЭтоРаздел = Истина; + СтрокаРаздел.Представление = НСтр("ru = 'Сортировки'"); + СтрокаРаздел.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Сортировки"); + СтрокаРаздел.ИдентификаторКД = Неопределено; + НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); + + ДоступныеПоля = УзелКД.ДоступныеПоляПорядка; + Для Каждого ЭлементКД Из НаборСтрокКД Цикл + ТипНастройки = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); + Если ТипНастройки = "ЭлементПорядка" И Не ЗначениеЗаполнено(ЭлементКД.Поле) Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = НаборСтрок.Добавить(); + СтрокаТаблицы.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); + СтрокаТаблицы.ТипНастройки = ТипНастройки; + СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.ИндексКартинки = -1; + + Если ТипНастройки = "АвтоЭлементПорядка" Тогда + СтрокаТаблицы.Представление = НСтр("ru = 'Авто (сортировки родителя)'"); + ИначеЕсли ТипНастройки = "ЭлементПорядка" Тогда + СтрокаТаблицы.Направление = ЭлементКД.ТипУпорядочивания; + ДоступноеПоле = ДоступныеПоля.НайтиПоле(ЭлементКД.Поле); + Если ДоступноеПоле = Неопределено Тогда + СтрокаТаблицы.Представление = ОтчетыКлиентСервер.ИмяВПредставление(Строка(ЭлементКД.Поле)); + Иначе + СтрокаТаблицы.Представление = ДоступноеПоле.Заголовок; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Истина; +КонецФункции + +&НаСервере +Процедура ЗарегистрироватьЭлементыПараметров(Информация) + Если РежимИзмененияУзлаВарианта Тогда + Возврат; + КонецЕсли; + + УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "ПараметрыДанных"); + Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); + Если Найденные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НаборСтрокВарианта = Найденные[0].Строки; + + СтрокаРаздел = Отборы.ПолучитьЭлементы().Добавить(); + СтрокаРаздел.ЭтоРаздел = Истина; + СтрокаРаздел.ЭтоПараметр = Истина; + СтрокаРаздел.Представление = НСтр("ru = 'Параметры'"); + СтрокаРаздел.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("ПараметрыДанных"); + СтрокаРаздел.ИдентификаторКД = "ПараметрыДанных"; + НаборСтрок = СтрокаРаздел.ПолучитьЭлементы(); + + Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл + Если Не НастройкаВарианта.ВыводРазрешен Тогда + Продолжить; + КонецЕсли; + + ДоступнаяНастройкаКД = НастройкаВарианта.ДоступнаяНастройкаКД; + ЭлементКД = НастройкаВарианта.ЭлементКД; + + Если ЗначениеЗаполнено(НастройкаВарианта.ДоступнаяНастройкаКД.Заголовок) Тогда + Представление = НастройкаВарианта.ДоступнаяНастройкаКД.Заголовок; + Иначе + Представление = Строка(ЭлементКД.Параметр); + КонецЕсли; + + СтрокаТаблицы = НаборСтрок.Добавить(); + СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.Значение = НастройкаВарианта.Значение; + СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; + СтрокаТаблицы.Представление = Представление; + СтрокаТаблицы.ЭтоПараметр = Истина; + СтрокаТаблицы.ИндексКартинки = -1; + СтрокаТаблицы.ТипЗначения = НастройкаВарианта.ДоступнаяНастройкаКД.ТипЗначения; + СтрокаТаблицы.ВводСписком = НастройкаВарианта.ВводСписком; + СтрокаТаблицы.ВыводитьФлажок = НастройкаВарианта.ВыводитьФлажок; + СтрокаТаблицы.ВыборГруппИЭлементов = НастройкаВарианта.ВыборГруппИЭлементов; + + Если НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями + И ТипЗнч(НастройкаВарианта.ЗначенияДляВыбора) = Тип("СписокЗначений") Тогда + Если СтрокаТаблицы.ВводСписком Тогда + Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СписокЗначений") Тогда + Для Каждого ЭлементСписка Из СтрокаТаблицы.Значение Цикл + ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(ЭлементСписка.Значение); + Если ЭлементДляВыбора <> Неопределено Тогда + ЭлементСписка.Представление = ЭлементДляВыбора.Представление; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Иначе + СтрокаТаблицы.ФиксированныйСписокВыбора = Истина; + ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(СтрокаТаблицы.Значение); + Если ЭлементДляВыбора <> Неопределено Тогда + СтрокаТаблицы.ПредставлениеЗначения = ЭлементДляВыбора.Представление; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + НастройкаВарианта.ИдентификаторВФорме = СтрокаТаблицы.ПолучитьИдентификатор(); + + Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СтандартныйПериод") Тогда + СтрокаТаблицы.Условие = ОтчетыКлиентСервер.ПолучитьВидСтандартногоПериода(СтрокаТаблицы.Значение); + СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"); + Иначе + СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("Неопределено"); + КонецЕсли; + + СтрокаТаблицы.Заголовок = Представление; + Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда + Если ЗначениеЗаполнено(ЭлементКД.ПредставлениеПользовательскойНастройки) Тогда + СтрокаТаблицы.Заголовок = ЭлементКД.ПредставлениеПользовательскойНастройки; + КонецЕсли; + Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = 2; + ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = 4; + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + + Дополнительно = Новый Структура( + "ОписаниеТипов, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, + |ПараметрыВыбора, ФормаВыбора, ЗначенияДляВыбора, ЗначенияДляВыбораЗаполнены"); + ЗаполнитьЗначенияСвойств(Дополнительно, НастройкаВарианта); + Если Дополнительно.ЗначенияДляВыбораЗаполнены = Неопределено Тогда + Дополнительно.ЗначенияДляВыбораЗаполнены = Ложь; + КонецЕсли; + СтрокаТаблицы.Дополнительно = Дополнительно; + + КонецЦикла; +КонецПроцедуры + +&НаСервере +Процедура ЗарегистрироватьЭлементыОтборов(Информация, НаборСтрокВарианта = Неопределено, НаборСтрокФормы = Неопределено) + Если НаборСтрокВарианта = Неопределено Тогда + УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "Отбор"); + Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); + Если Найденные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НаборСтрокВарианта = Найденные[0].Строки; + КонецЕсли; + Если НаборСтрокФормы = Неопределено Тогда + НаборСтрокФормы = Отборы.ПолучитьЭлементы(); + СтрокаРаздел = НаборСтрокФормы.Добавить(); + СтрокаРаздел.ЭтоРаздел = Истина; + СтрокаРаздел.Представление = НСтр("ru = 'Отборы'"); + СтрокаРаздел.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Отборы"); + СтрокаРаздел.ИдентификаторКД = "Отборы"; + НаборСтрокФормы = СтрокаРаздел.ПолучитьЭлементы(); + КонецЕсли; + Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл + Если НастройкаВарианта.Тип = "ГруппаЭлементовОтбора" Тогда + ЭтоГруппа = Истина; + ИначеЕсли НастройкаВарианта.Тип = "ЭлементОтбора" Тогда + ЭтоГруппа = Ложь; + Иначе + Продолжить; + КонецЕсли; + + ЭлементКД = НастройкаВарианта.ЭлементКД; + + СтрокаТаблицы = НаборСтрокФормы.Добавить(); + СтрокаТаблицы.Использование = НастройкаВарианта.ЭлементКД.Использование; + СтрокаТаблицы.Представление = НастройкаВарианта.ПредставлениеПоУмолчанию; + СтрокаТаблицы.Заголовок = НастройкаВарианта.Представление; + СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; + СтрокаТаблицы.ЭтоПараметр = Ложь; + СтрокаТаблицы.ИндексКартинки = -1; + СтрокаТаблицы.ЭтоГруппа = ЭтоГруппа; + СтрокаТаблицы.ВводСписком = НастройкаВарианта.ВводСписком; + СтрокаТаблицы.ВыводитьФлажок = НастройкаВарианта.ВыводитьФлажок; + СтрокаТаблицы.ФормаВыбора = НастройкаВарианта.ФормаВыбора; + СтрокаТаблицы.ВыборГруппИЭлементов = НастройкаВарианта.ВыборГруппИЭлементов; + СтрокаТаблицы.ЗаголовокПереопределен = (СтрокаТаблицы.Заголовок <> СтрокаТаблицы.Представление); + + НастройкаВарианта.ИдентификаторВФорме = СтрокаТаблицы.ПолучитьИдентификатор(); + + Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда + Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = ?(НастройкаВарианта.ВыводитьТолькоФлажок, 1, 2); + ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = ?(НастройкаВарианта.ВыводитьТолькоФлажок, 3, 4); + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + + Если НастройкаВарианта.Состояние = "ПометкаУдаления" Тогда + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Ошибка"); + КонецЕсли; + + Если ЭтоГруппа Тогда + ЗарегистрироватьЭлементыОтборов(Информация, НастройкаВарианта.Строки, СтрокаТаблицы.ПолучитьЭлементы()); + Иначе + СтрокаТаблицы.Значение = НастройкаВарианта.Значение; + Если НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями + И ТипЗнч(НастройкаВарианта.ЗначенияДляВыбора) = Тип("СписокЗначений") Тогда + Если СтрокаТаблицы.ВводСписком Тогда + Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СписокЗначений") Тогда + Для Каждого ЭлементСписка Из СтрокаТаблицы.Значение Цикл + ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(ЭлементСписка.Значение); + Если ЭлементДляВыбора <> Неопределено Тогда + ЭлементСписка.Представление = ЭлементДляВыбора.Представление; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Иначе + СтрокаТаблицы.ФиксированныйСписокВыбора = Истина; + ЭлементДляВыбора = НастройкаВарианта.ЗначенияДляВыбора.НайтиПоЗначению(СтрокаТаблицы.Значение); + Если ЭлементДляВыбора <> Неопределено Тогда + СтрокаТаблицы.ПредставлениеЗначения = ЭлементДляВыбора.Представление; + КонецЕсли; + КонецЕсли; + КонецЕсли; + СтрокаТаблицы.ТипЗначения = НастройкаВарианта.ОписаниеТипов; + Если ТипЗнч(СтрокаТаблицы.Значение) = Тип("СтандартныйПериод") Тогда + СтрокаТаблицы.Условие = ОтчетыКлиентСервер.ПолучитьВидСтандартногоПериода(СтрокаТаблицы.Значение); + СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"); + Иначе + СтрокаТаблицы.Условие = НастройкаВарианта.ВидСравнения; + СтрокаТаблицы.ТипУсловия = Новый ОписаниеТипов("ВидСравненияКомпоновкиДанных"); + КонецЕсли; + КонецЕсли; + + Дополнительно = Новый Структура( + "ОписаниеТипов, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, + |ПараметрыВыбора, ФормаВыбора, ЗначенияДляВыбора, ЗначенияДляВыбораЗаполнены"); + ЗаполнитьЗначенияСвойств(Дополнительно, НастройкаВарианта); + Если Дополнительно.ЗначенияДляВыбораЗаполнены = Неопределено Тогда + Дополнительно.ЗначенияДляВыбораЗаполнены = Ложь; + КонецЕсли; + СтрокаТаблицы.Дополнительно = Дополнительно; + + КонецЦикла; +КонецПроцедуры + +&НаСервере +Процедура ЗарегистрироватьОтключаемыеСвязи(Информация) + ОтключаемыеСвязи.Очистить(); + Для Каждого ОписаниеСвязи Из Информация.ОтключаемыеСвязи Цикл + Связь = ОтключаемыеСвязи.Добавить(); + ЗаполнитьЗначенияСвойств(Связь, ОписаниеСвязи); + Если РасширенныйРежим = 1 Тогда + Связь.ВедущийИдентификаторВФорме = ОписаниеСвязи.Ведущий.ИдентификаторВФорме; + Связь.ПодчиненныйИдентификаторВФорме = ОписаниеСвязи.Подчиненный.ИдентификаторВФорме; + Иначе + Связь.ВедущийИдентификаторВФорме = ОписаниеСвязи.Ведущий.ИдентификаторЭлемента; + Связь.ПодчиненныйИдентификаторВФорме = ОписаниеСвязи.Подчиненный.ИдентификаторЭлемента; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаСервере +Процедура ЗарегистрироватьЭлементыОформления(Информация, НаборСтрокВарианта = Неопределено, НаборСтрокФормы = Неопределено) + Если НаборСтрокВарианта = Неопределено Тогда + УсловияПоиска = Новый Структура("СтрокаДерева, ИмяКоллекции", Информация.ТекущаяСтрокаДерева, "УсловноеОформление"); + Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(УсловияПоиска, Ложь); + Если Найденные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НаборСтрокВарианта = Найденные[0].Строки; + КонецЕсли; + Если НаборСтрокФормы = Неопределено Тогда + НаборСтрокФормы = Оформление.ПолучитьЭлементы(); + КонецЕсли; + Для Каждого НастройкаВарианта Из НаборСтрокВарианта Цикл + ЭлементКД = НастройкаВарианта.ЭлементКД; + + СтрокаТаблицы = НаборСтрокФормы.Добавить(); + СтрокаТаблицы.Использование = ЭлементКД.Использование; + СтрокаТаблицы.Представление = НастройкаВарианта.ПредставлениеПоУмолчанию; + СтрокаТаблицы.Заголовок = НастройкаВарианта.Представление; + СтрокаТаблицы.ИдентификаторКД = НастройкаВарианта.ИдентификаторКД; + СтрокаТаблицы.ИндексКартинки = -1; + СтрокаТаблицы.ЗаголовокПереопределен = (СтрокаТаблицы.Заголовок <> СтрокаТаблицы.Представление); + + Если ЗначениеЗаполнено(ЭлементКД.ИдентификаторПользовательскойНастройки) Тогда + Если ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = 2; + ИначеЕсли ЭлементКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда + СтрокаТаблицы.ИндексКартинкиДоступа = 4; + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + Иначе + СтрокаТаблицы.ИндексКартинкиДоступа = 5; + КонецЕсли; + Если НастройкаВарианта.Состояние = "ПометкаУдаления" Тогда + СтрокаТаблицы.ИндексКартинки = ОтчетыКлиентСервер.ИндексКартинки("Ошибка"); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Очистка настроек от несуществующих полей. + +&НаСервереБезКонтекста +Процедура ОчиститьНастройкиОтНесуществующихПолейНаСервере(НастройкиКД) + // Метод ".Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное)" не подходит, поскольку: + // 1. Цель "удалить", а не "отключить". + // 2. После его использования могут остаться группировки <Детальные записи> с отключенными недоступными полями. + + УсловияВывода = Новый Структура; + УсловияВывода.Вставить("ТолькоПользовательские", Ложь); + УсловияВывода.Вставить("ТолькоБыстрые", Ложь); + УсловияВывода.Вставить("ИдентификаторТекущегоУзлаКД", Неопределено); + + Информация = ОтчетыСервер.РасширеннаяИнформацияОНастройках( + Новый Структура("Настройки, ПользовательскиеНастройки", НастройкиКД, Новый ПользовательскиеНастройкиКомпоновкиДанных), + ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(), + Неопределено, + УсловияВывода); + + Найденные = Информация.ДеревоВарианта.Строки.НайтиСтроки(Новый Структура("Состояние", "ПометкаУдаления"), Истина); + Для Каждого СтрокаДерева Из Найденные Цикл + НастройкаВариантаКД = СтрокаДерева.УзелКД; + Если СтрокаДерева.Тип = "Группировка" + Или СтрокаДерева.Тип = "ГруппировкаТаблицы" + Или СтрокаДерева.Тип = "ГруппировкаДиаграммы" Тогда + ПоляГруппировкиКД = НастройкаВариантаКД.ПоляГруппировки; + ДоступныеПоляКД = ПоляГруппировкиКД.ДоступныеПоляПолейГруппировок; + Количество = ПоляГруппировкиКД.Элементы.Количество(); + ОбратныйИндекс = Количество; + Пока ОбратныйИндекс > 0 Цикл + ОбратныйИндекс = ОбратныйИндекс - 1; + ПолеГруппировкиКД = ПоляГруппировкиКД.Элементы[ОбратныйИндекс]; + Если ТипЗнч(ПолеГруппировкиКД) = Тип("ПолеГруппировкиКомпоновкиДанных") + И ДоступныеПоляКД.НайтиПоле(ПолеГруппировкиКД.Поле) = Неопределено Тогда + Количество = Количество - 1; + ПоляГруппировкиКД.Элементы.Удалить(ПолеГруппировкиКД); + КонецЕсли; + КонецЦикла; + Если Количество > 0 Тогда + Продолжить; // В группировке остались не помеченные поля. + КонецЕсли; + КонецЕсли; + + // Переместить подчиненные элементы на уровень с удаляемым элементом. + КорневаяСтрока = СтрокаДерева; + Пока КорневаяСтрока.Тип <> "Настройки" Цикл + КорневаяСтрока = КорневаяСтрока.Родитель; + КонецЦикла; + Для Каждого ПодчиненнаяСтрокаДерева Из СтрокаДерева.Строки Цикл + ПеремещениеСвязанныхСтрок(Информация.ДеревоВарианта, КорневаяСтрока.УзелКД, ПодчиненнаяСтрокаДерева, СтрокаДерева.Родитель, СтрокаДерева); + КонецЦикла; + + // Удалить элемент КД. + СтрокиРодителяКД = ПолучитьЭлементыКД(НастройкиКД, СтрокаДерева.Родитель.УзелКД); + СтрокиРодителяКД.Удалить(СтрокаДерева.УзелКД); + КонецЦикла; + + Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(Новый Структура("Состояние", "ПометкаУдаления"), Истина); + Для Каждого СтрокаДерева Из Найденные Цикл + Если СтрокаДерева.Родитель = Неопределено Тогда + Продолжить; // Корневые коллекции нельзя удалить (типа "Настройки.Отбор"). + КонецЕсли; + УзелКД = СтрокаДерева.Владелец.ЭлементКД; + РодительКД = СтрокаДерева.Родитель.ЭлементКД; + СтрокиРодителяКД = ПолучитьЭлементыКД(УзелКД, РодительКД); + СтрокиРодителяКД.Удалить(СтрокаДерева.ЭлементКД); + КонецЦикла; +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПеремещениеСвязанныхСтрок(Коллекция, УзелКД, Знач ЭлементДерева, Знач НовыйРодитель, + Знач ПередЧемВставить = Неопределено, Знач Индекс = Неопределено, Знач ИндексКД = Неопределено) + Результат = Новый Структура("ЭлементДерева, ЭлементКД, Индекс, ИндексКД"); + + ДобавлятьВКонец = (НовыйРодитель = Неопределено); + КудаВставить = ?(НовыйРодитель = Неопределено, Коллекция.Строки, НовыйРодитель.Строки); + Если ПередЧемВставить = Неопределено Тогда + ЭтоРаздел = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НовыйРодитель, "ЭтоРаздел"); + ЭтоГруппа = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НовыйРодитель, "ЭтоГруппа"); + Если ЭтоРаздел <> Истина И ЭтоГруппа <> Истина Тогда // На один уровень с родителем. + ПередЧемВставить = НовыйРодитель; + НовыйРодитель = ?(НовыйРодитель.Родитель = Неопределено, Коллекция, НовыйРодитель.Родитель); + КудаВставить = ?(НовыйРодитель = Неопределено, Коллекция.Строки, НовыйРодитель.Строки); + КонецЕсли; + КонецЕсли; + + ЭлементКД = НайтиОбъектКД(УзелКД, ЭлементДерева); + НовыйРодительКД = НайтиОбъектКД(УзелКД, НовыйРодитель); + КудаВставитьКД = ПолучитьЭлементыКД(УзелКД, НовыйРодительКД); + ПередЧемВставитьКД = НайтиОбъектКД(УзелКД, ПередЧемВставить); + + СтарыйРодитель = ?(ЭлементДерева.Родитель = Неопределено, Коллекция, ЭлементДерева.Родитель); + ОткудаПереместить = ?(СтарыйРодитель = Неопределено, Коллекция.Строки, СтарыйРодитель.Строки); + + СтарыйРодительКД = НайтиОбъектКД(УзелКД, СтарыйРодитель); + ОткудаПереместитьКД = ПолучитьЭлементыКД(УзелКД, СтарыйРодительКД); + + Если ЭлементКД = ПередЧемВставитьКД Тогда + Результат.ЭлементКД = ЭлементКД; + Результат.ЭлементДерева = ЭлементДерева; + Иначе + Если Индекс = Неопределено Или ИндексКД = Неопределено Тогда + Если ПередЧемВставитьКД = Неопределено Тогда + Если ДобавлятьВКонец Тогда + Индекс = КудаВставить.Количество(); + ИндексКД = КудаВставитьКД.Количество(); + Иначе + Индекс = 0; + ИндексКД = 0; + КонецЕсли; + Иначе + Индекс = КудаВставить.Индекс(ПередЧемВставить); + ИндексКД = КудаВставитьКД.Индекс(ПередЧемВставитьКД); + Если СтарыйРодитель = НовыйРодитель Тогда + СтарыйИндекс = ОткудаПереместить.Индекс(ЭлементДерева); + Если СтарыйИндекс <= Индекс Тогда + Индекс = Индекс + 1; + ИндексКД = ИндексКД + 1; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + ПоискЭлементовКД = Новый Соответствие; + Результат.ЭлементКД = ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексКД, ПоискЭлементовКД); + + ПоискСтрокТаблицы = Новый Соответствие; + Результат.ЭлементДерева = ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, ЭлементДерева, КудаВставить, Индекс, ПоискСтрокТаблицы); + + Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл + СтараяСтрока = КлючИЗначение.Ключ; + НоваяСтрока = КлючИЗначение.Значение; + НоваяСтрока.ИдентификаторКД = ПоискЭлементовКД.Получить(СтараяСтрока.ИдентификаторКД); + КонецЦикла; + + ОткудаПереместить.Удалить(ЭлементДерева); + ОткудаПереместитьКД.Удалить(ЭлементКД); + КонецЕсли; + + Результат.Индекс = КудаВставить.Индекс(Результат.ЭлементДерева); + Результат.ИндексКД = КудаВставитьКД.Индекс(Результат.ЭлементКД); + + Возврат Результат; +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ФормаОтчета/Form.form b/SSL/src/CommonForms/ФормаОтчета/Form.form index 262296771..dfc924062 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаОтчета/Form.form @@ -12,10 +12,6 @@ ru Быстрые настройки - - ru - Быстрые настройки - БыстрыеНастройкиРасширеннаяПодсказка 417 @@ -38,17 +34,75 @@ ОсновнаяКоманднаяПанель 5 - - СформироватьОтчет - 101 + + ГруппаГлавное + 643 + + СформироватьОтчет + 101 + true + true + + true + + + СформироватьОтчетРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + Form.Command.ОтчетСкомпоноватьРезультат + Auto + true + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ФормироватьСразу + 468 + true + true + + true + + + ФормироватьСразуРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + Form.Command.ФормироватьСразу + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true true + + <key>ru</key> + <value>Главное</value> + - СформироватьОтчетРасширеннаяПодсказка - 135 + ГруппаГлавноеРасширеннаяПодсказка + 644 Label true true @@ -56,41 +110,7 @@ Left - Form.Command.ОтчетСкомпоноватьРезультат - Auto - true - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - ФормироватьСразу - 468 - true - true - - true - - - ФормироватьСразуРасширеннаяПодсказка - 469 - Label - true - true - - Left - - - Form.Command.ФормироватьСразу - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu + ГруппаНастройкиОтчета @@ -224,10 +244,6 @@ ru Варианты отчета - - ru - Варианты отчета - ВариантыОтчетаРасширеннаяПодсказка 361 @@ -278,7 +294,7 @@ ru - Выбрать настройки + Выбрать другой вариант отчета или сохранить новый ГруппаВариантыОтчетаРасширеннаяПодсказка @@ -295,7 +311,7 @@ CommonPicture.ВыбратьВариантОтчета - PictureAndText + Picture Normal @@ -372,10 +388,6 @@ ru Команды вариантов отчета - - ru - Команды вариантов отчета - true КомандыВариантовОтчетаРасширеннаяПодсказка @@ -451,6 +463,10 @@ true + + <key>ru</key> + <value>Пользовательские настройки</value> + ГруппаПользовательскиеНастройкиРасширеннаяПодсказка 505 @@ -472,10 +488,6 @@ ru Прочее - - ru - Группа прочие настройки отчета - ГруппаПрочиеНастройкиОтчетаРасширеннаяПодсказка 503 @@ -497,6 +509,10 @@ true + + <key>ru</key> + <value>Настройки отчета</value> + ГруппаНастройкиОтчетаРасширеннаяПодсказка 144 @@ -708,10 +724,6 @@ ru Таблица - - ru - Команды табличного документа - КомандыТабличногоДокументаРасширеннаяПодсказка 527 @@ -735,12 +747,8 @@ <key>ru</key> - <value>Группа работа в таблице</value> + <value>Работа в таблице</value> - - ru - Группа работа в таблице - ГруппаРаботаВТаблицеРасширеннаяПодсказка 519 @@ -900,7 +908,7 @@ ГруппаОтправить 63 - ОтправитьПоЭлектроннойПочте + ОтправитьПоПочте 97 true true @@ -908,7 +916,7 @@ true - ОтправитьПоЭлектроннойПочтеРасширеннаяПодсказка + ОтправитьПоПочтеРасширеннаяПодсказка 128 Label true @@ -917,7 +925,7 @@ Left - Form.Command.ОтправитьПоЭлектроннойПочте + Form.Command.ОтправитьПоПочте Normal Picture true @@ -965,12 +973,8 @@ <key>ru</key> - <value>Группа вывод</value> + <value>Вывод</value> - - ru - Группа вывод - ГруппаВыводРасширеннаяПодсказка 535 @@ -1073,10 +1077,6 @@ ru Основная командная панель - - ru - Основная командная панель - ОсновнаяКоманднаяПанельРасширеннаяПодсказка 133 @@ -1104,10 +1104,6 @@ ru Не отсортированное - - ru - Не отсортированное - НеОтсортированноеРасширеннаяПодсказка 517 @@ -1245,10 +1241,6 @@ ru Свернуть / Развернуть - - ru - Группа свернуть развернуть - ГруппаСвернутьРазвернутьКонтекстРасширеннаяПодсказка 521 @@ -1273,6 +1265,10 @@ AdditionalDetailProcessing ОтчетТабличныйДокументОбработкаДополнительнойРасшифровки + + Selection + ОтчетТабличныйДокументВыбор + DetailProcessing ОтчетТабличныйДокументОбработкаРасшифровки @@ -1419,23 +1415,6 @@ true - - РежимВариантаОтчета - - <key>ru</key> - <value>Режим варианта отчета</value> - - 8 - - Boolean - - - true - - - true - - НастройкиОтчета @@ -1621,21 +1600,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>БыстрыйПоискОтключаемыхСвязей</name> - <title> - <key>ru</key> - <value>Быстрый поиск отключаемых связей</value> - - 9 - - - true - - - true - - ЕстьБыстрыеНастройки @@ -1995,7 +1959,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ОтправитьПоЭлектроннойПочте</name> + <name>ОтправитьПоПочте</name> <title> <key>ru</key> <value>Отправить сейчас...</value> @@ -2013,7 +1977,7 @@ </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ОтправитьПоЭлектроннойПочте</name> + <name>ОтправитьПоПочте</name> </handler> </action> <currentRowUse>DontUse</currentRowUse> @@ -2060,6 +2024,7 @@ <use> <common>true</common> </use> + <shortcut>Alt+S</shortcut> <picture xsi:type="core:PictureRef"> <picture>CommonPicture.Сумма</picture> </picture> diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl index 14f599667..044f5d375 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl @@ -1,16 +1,22 @@ #Область ОписаниеПеременных &НаКлиенте -Перем ПараметрыОбработчика; - +Перем ОбработчикПослеФормированияНаКлиенте Экспорт; &НаКлиенте -Перем ПеременныеКлиента; +Перем ПараметрыОбработчика; +&НаКлиенте +Перем ВыполнятьЗамеры; +&НаКлиенте +Перем ИдентификаторЗамера; +&НаКлиенте +Перем Непосредственно; +&НаКлиенте +Перем ФормированиеПриОткрытии; +&НаКлиенте +Перем ИнтервалОжидания; #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ФОРМА - #Область ОбработчикиСобытийФормы &НаСервере @@ -19,16 +25,49 @@ Возврат; КонецЕсли; - ВариантыПанелиКлючТекущегоВарианта = " - "; - Если ЗначениеЗаполнено(Параметры.КлючВарианта) Тогда - КлючТекущегоВарианта = Параметры.КлючВарианта; - КонецЕсли; - РежимВариантаОтчета = (ТипЗнч(КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(КлючТекущегоВарианта)); - - // Параметры формы. + // Определение ключевых параметров отчета. РежимРасшифровки = (Параметры.Свойство("Расшифровка") И Параметры.Расшифровка <> Неопределено); ПравоВывода = ПравоДоступа("Вывод", Метаданные); + ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); + ОтчетМетаданные = ОтчетОбъект.Метаданные(); + ОтчетПолноеИмя = ОтчетМетаданные.ПолноеИмя(); + ПредопределенныеВарианты = Новый СписокЗначений; + Если ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда + Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл + ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление); + КонецЦикла; + КонецЕсли; + + ВариантыПанелиКлючТекущегоВарианта = " - "; + Если ЗначениеЗаполнено(Параметры.КлючВарианта) Тогда + КлючТекущегоВарианта = Параметры.КлючВарианта; + Иначе + КлючТекущегоВарианта = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(ОтчетПолноеИмя + "/КлючТекущегоВарианта", ""); + КонецЕсли; + Если Не ЗначениеЗаполнено(КлючТекущегоВарианта) И ПредопределенныеВарианты.Количество() > 0 Тогда + КлючТекущегоВарианта = ПредопределенныеВарианты[0].Значение; + КонецЕсли; + + // Предварительная инициализация компоновщика (если требуется). + АдресСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "АдресСхемы"); + Если РежимРасшифровки Тогда + НовыеНастройкиКД = ПолучитьИзВременногоХранилища(Параметры.Расшифровка.Данные).Настройки; + АдресСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НовыеНастройкиКД.ДополнительныеСвойства, "АдресСхемы"); + КонецЕсли; + Если ТипЗнч(АдресСхемы) = Тип("Строка") И ЭтоАдресВременногоХранилища(АдресСхемы) Тогда + СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСхемы); + Если ТипЗнч(СхемаКомпоновкиДанных) = Тип("СхемаКомпоновкиДанных") Тогда + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); + Иначе + АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор); + КонецЕсли; + Иначе + АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор); + КонецЕсли; + + // Сохранение параметров открытия формы. ФормаПараметры = Новый Структура( "КлючНазначенияИспользования, КлючПользовательскихНастроек, |СформироватьПриОткрытии, ТолькоПросмотр, @@ -40,38 +79,27 @@ Параметры.Отбор.Очистить(); КонецЕсли; - Если ФормаПараметры.Подсистема = Неопределено Тогда - Элементы.ДругиеОтчеты.Видимость = Ложь; - КонецЕсли; - - // Локальные переменные. - ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); - ОтчетМетаданные = ОтчетОбъект.Метаданные(); - НастройкиОтчета = ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(); - АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор); - - НастройкиОтчета.Вставить("АдресСхемы", АдресСхемы); - НастройкиОтчета.Вставить("СхемаМодифицирована", Ложь); - НастройкиОтчета.Вставить("КлючСхемы", ""); - НастройкиОтчета.Вставить("Контекстный", ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") И ФормаПараметры.Отбор.Количество() > 0); - НастройкиОтчета.Вставить("ПолноеИмя", ОтчетМетаданные.ПолноеИмя()); - НастройкиОтчета.Вставить("Наименование", СокрЛП(ОтчетМетаданные.Представление())); - - НастройкиОтчета.Вставить("ОтчетСсылка", Параметры.Отчет); - ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчета(НастройкиОтчета.ОтчетСсылка, Истина); + // Определение настроек отчета. + ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчета(Параметры.Отчет, Истина); Если ТипОтчетаСтрокой = Неопределено Тогда - Информация = ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(НастройкиОтчета.ПолноеИмя); - НастройкиОтчета.ОтчетСсылка = Информация.Отчет; + Информация = ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(ОтчетПолноеИмя); + Параметры.Отчет = Информация.Отчет; КонецЕсли; - НастройкиОтчета.Вставить("Внешний", ТипЗнч(НастройкиОтчета.ОтчетСсылка) = Тип("Строка")); - НастройкиОтчета.Вставить("Безопасный", БезопасныйРежим() <> Ложь); + НастройкиОтчета = ВариантыОтчетов.НастройкиФормыОтчета(Параметры.Отчет, КлючТекущегоВарианта, ОтчетОбъект); + НастройкиОтчета.Вставить("РазрешеноВыбиратьВарианты", Истина); + НастройкиОтчета.Вставить("СхемаМодифицирована", Ложь); + НастройкиОтчета.Вставить("ПредопределенныеВарианты", ПредопределенныеВарианты); + НастройкиОтчета.Вставить("АдресСхемы", АдресСхемы); + НастройкиОтчета.Вставить("КлючСхемы", ""); + НастройкиОтчета.Вставить("Контекстный", ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") И ФормаПараметры.Отбор.Количество() > 0); + НастройкиОтчета.Вставить("ПолноеИмя", ОтчетПолноеИмя); + НастройкиОтчета.Вставить("Наименование", СокрЛП(ОтчетМетаданные.Представление())); + НастройкиОтчета.Вставить("ОтчетСсылка", Параметры.Отчет); + НастройкиОтчета.Вставить("Внешний", ТипЗнч(НастройкиОтчета.ОтчетСсылка) = Тип("Строка")); + НастройкиОтчета.Вставить("Безопасный", БезопасныйРежим() <> Ложь); ОбновитьИнформациюОВариантеОтчета(); ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента()); - Если ВариантыОтчетовПовтИсп.Параметры().ОтчетыСНастройками.Найти(НастройкиОтчета.ОтчетСсылка) <> Неопределено Тогда - ОтчетОбъект.ОпределитьНастройкиФормы(ЭтотОбъект, КлючТекущегоВарианта, НастройкиОтчета); - КонецЕсли; - НастройкиОтчета.Вставить("ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек", Истина); Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии = Истина Тогда Параметры.СформироватьПриОткрытии = Ложь; @@ -79,13 +107,6 @@ НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Ложь; КонецЕсли; - НастройкиОтчета.Вставить("ПредопределенныеВарианты", Новый СписокЗначений); - Если НастройкиОтчета.Внешний И ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда - Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл - НастройкиОтчета.ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление); - КонецЦикла; - КонецЕсли; - // Параметры по умолчанию. Если Не ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиОтчета, "ВыводитьСуммуВыделенныхЯчеек", Истина) Тогда Элементы.АвтоСуммаКнопка.Видимость = Ложь; @@ -93,34 +114,17 @@ КонецЕсли; // Скрытие команд вариантов. - Если Не НастройкиОтчета.Свойство("РазрешеноМенятьВарианты") Или Параметры.Свойство("ВидимостьКомандВариантовОтчетов") Тогда - НастройкиОтчета.Вставить("РазрешеноМенятьВарианты", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВидимостьКомандВариантовОтчетов")); - КонецЕсли; - Если ТипЗнч(НастройкиОтчета.РазрешеноМенятьВарианты) <> Тип("Булево") Тогда - НастройкиОтчета.РазрешеноМенятьВарианты = ВариантыОтчетовПовтИсп.ПравоДобавления(); - Если НастройкиОтчета.РазрешеноМенятьВарианты // Команды не отключены параметрами открытия формы. - И ЗначениеЗаполнено(НастройкиОтчета.ВариантСсылка) // Вариант зарегистрирован. - И ЗначениеЗаполнено(НастройкиОтчета.ПредопределенныйСсылка) Тогда // Это предопределенный. - Отключенные = ВариантыОтчетовПовтИсп.ОтключенныеВариантыПрограммы(); - Если Отключенные.Найти(НастройкиОтчета.ПредопределенныйСсылка) <> Неопределено Тогда // Вариант отключен. - Текст = НСтр("ru = 'Контекстный вариант ""%1"" отчета ""%2"" открыт без контекста.'"); - ВариантыОтчетов.ПредупреждениеПоВарианту(НастройкиОтчета.ВариантСсылка, Текст, НастройкиОтчета.ВариантСсылка, НастройкиОтчета.ОтчетСсылка); - НастройкиОтчета.РазрешеноМенятьВарианты = Ложь; - КонецЕсли; + ВидимостьКомандВариантовОтчетов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВидимостьКомандВариантовОтчетов"); + Если ВидимостьКомандВариантовОтчетов = Ложь Тогда + НастройкиОтчета.РазрешеноИзменятьВарианты = Ложь; + НастройкиОтчета.РазрешеноВыбиратьВарианты = Ложь; + Если ПустаяСтрока(КлючНазначенияИспользования) Тогда + КлючНазначенияИспользования = Параметры.КлючВарианта; + ФормаПараметры.КлючНазначенияИспользования = КлючНазначенияИспользования; КонецЕсли; КонецЕсли; - Если НастройкиОтчета.РазрешеноМенятьВарианты = Ложь И ПустаяСтрока(КлючНазначенияИспользования) Тогда - КлючНазначенияИспользования = Параметры.КлючВарианта; - ФормаПараметры.КлючНазначенияИспользования = КлючНазначенияИспользования; - КонецЕсли; - Если Не ВариантыОтчетов.ОтчетПодключенКФормеНастроек(ОтчетМетаданные) Тогда - НастройкиОтчета.РазрешеноМенятьВарианты = Ложь; - ТекстОшибки = ВариантыОтчетовКлиентСервер.ТекстОшибки(1, НастройкиОтчета.ПолноеИмя); - Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда - ВызватьИсключение ТекстОшибки; - Иначе - ВариантыОтчетов.ОшибкаПоВарианту(НастройкиОтчета.ОтчетСсылка, ТекстОшибки); - КонецЕсли; + Если НастройкиОтчета.РазрешеноИзменятьВарианты И Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда + НастройкиОтчета.РазрешеноИзменятьВарианты = Ложь; КонецЕсли; // Регистрация команд и реквизитов формы, которые не удаляются при перезаполнении быстрых настроек. @@ -133,8 +137,7 @@ ПостоянныеКоманды.Добавить(Команда.Имя); КонецЦикла; - // Приведение зависимых элементов формы к кондиции. - ВидимостьДоступностьКорректность(""); + УстановитьВидимостьДоступность(); // Тесная интеграция с почтой и рассылкой. ДоступнаОтправкаПисем = Ложь; @@ -143,13 +146,13 @@ ДоступнаОтправкаПисем = МодульРаботаСПочтовымиСообщениями.ДоступнаОтправкаПисем(); КонецЕсли; Если ДоступнаОтправкаПисем Тогда - Если НастройкиОтчета.РазрешеноМенятьВарианты + Если НастройкиОтчета.РазрешеноИзменятьВарианты И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ФормаОтчетаДобавитьКоманды(ЭтотОбъект, Отказ, СтандартнаяОбработка); Иначе // Если в подменю одна команда, то выпадающий список не отображается. - Элементы.ОтправитьПоЭлектроннойПочте.Заголовок = Элементы.ГруппаОтправить.Заголовок + "..."; - Элементы.Переместить(Элементы.ОтправитьПоЭлектроннойПочте, Элементы.ГруппаОтправить.Родитель, Элементы.ГруппаОтправить); + Элементы.ОтправитьПоПочте.Заголовок = Элементы.ГруппаОтправить.Заголовок + "..."; + Элементы.Переместить(Элементы.ОтправитьПоПочте, Элементы.ГруппаОтправить.Родитель, Элементы.ГруппаОтправить); КонецЕсли; Иначе Элементы.ГруппаОтправить.Видимость = Ложь; @@ -167,10 +170,14 @@ Исключение ТекстОшибки = НСтр("ru = 'Не удалось определить используемые таблицы:'"); ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ВариантыОтчетов.ОшибкаПоВарианту(НастройкиОтчета.ВариантСсылка, ТекстОшибки); + ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, НастройкиОтчета.ВариантСсылка); КонецПопытки; КонецЕсли; + Если ФормаПараметры.Подсистема = Неопределено Или Не НастройкиОтчета.РазрешеноВыбиратьВарианты Тогда + Элементы.ДругиеОтчеты.Видимость = Ложь; + КонецЕсли; + ОтчетыПереопределяемый.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); Если НастройкиОтчета.События.ПриСозданииНаСервере Тогда ОтчетОбъект.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); @@ -180,15 +187,14 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - ПеременныеКлиента = Новый Структура; - ПеременныеКлиента.Вставить("ВыполнятьЗамеры", Ложь); + ВыполнятьЗамеры = Ложь; // В безопасном режиме доп. отчеты формируются непосредственно, // т.к. они не могут подключать себя и использовать собственные методы в фоновых заданиях. - ПеременныеКлиента.Вставить("Непосредственно", НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный); - ПеременныеКлиента.Вставить("ФормированиеПриОткрытии", Ложь); - ПеременныеКлиента.Вставить("ИнтервалОжидания", ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 1, 0.2)); + Непосредственно = НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный; + ФормированиеПриОткрытии = Ложь; + ИнтервалОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 1, 0.2); Если Элементы.ФормироватьСразу.Пометка Тогда - ПеременныеКлиента.ФормированиеПриОткрытии = Истина; + ФормированиеПриОткрытии = Истина; ПодключитьОбработчикОжидания("СФормировать", 0.1, Истина); КонецЕсли; ПоказатьРезультатЗаполненияНастроек(); @@ -250,8 +256,7 @@ КонецЕсли; // Ничего не делать если отчет не на СКД и никаких настроек не загружено. - РежимВариантаОтчета = (ТипЗнч(КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(КлючТекущегоВарианта)); - Если Не РежимВариантаОтчета И НовыеНастройкиКД = Неопределено Тогда + Если Не РежимВариантаОтчета() И НовыеНастройкиКД = Неопределено Тогда Возврат; КонецЕсли; @@ -280,8 +285,7 @@ КонецЕсли; // Ничего не делать если отчет не на СКД и никаких настроек не загружено. - РежимВариантаОтчета = (ТипЗнч(КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(КлючТекущегоВарианта)); - Если Не РежимВариантаОтчета И НовыеНастройкиКД = Неопределено Тогда + Если Не РежимВариантаОтчета() И НовыеНастройкиКД = Неопределено Тогда Возврат; КонецЕсли; @@ -309,9 +313,6 @@ ОбновитьИнформациюОВариантеОтчета(); КонецЕсли; - // Заполнение панели быстрых настроек. - РежимВариантаОтчета = Истина; - // Вызов переопределяемого модуля. Если НастройкиОтчета.События.ПриЗагрузкеВариантаНаСервере Тогда ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); @@ -325,8 +326,8 @@ Возврат; КонецЕсли; - // Подготовка к вызову события переинициализации. Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда + // Подготовка к переинициализации. Попытка НовыеПользовательскиеНастройкиXML = ОбщегоНазначения.ЗначениеВСтрокуXML(НовыеПользовательскиеНастройкиКД); Исключение @@ -341,7 +342,7 @@ Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - Если Не РежимВариантаОтчета Тогда + Если Не РежимВариантаОтчета() Тогда Возврат; КонецЕсли; @@ -357,7 +358,7 @@ Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - Если Не РежимВариантаОтчета Тогда + Если Не РежимВариантаОтчета() Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; @@ -373,7 +374,7 @@ &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - Если Не РежимВариантаОтчета Тогда + Если Не РежимВариантаОтчета() Тогда Возврат; КонецЕсли; ПользовательскиеНастройкиКД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; @@ -416,21 +417,21 @@ &НаСервере Процедура ПриСохраненииВариантаНаСервере(НастройкиКД) - Если Не РежимВариантаОтчета Тогда + Если Не РежимВариантаОтчета() Тогда Возврат; КонецЕсли; НовыеНастройкиКД = Отчет.КомпоновщикНастроек.ПолучитьНастройки(); ОтчетыКлиентСервер.ЗагрузитьНастройки(Отчет.КомпоновщикНастроек, НовыеНастройкиКД); - НастройкиКД.ДополнительныеСвойства.Вставить("Адрес", ПоместитьВоВременноеХранилище(НовыеНастройкиКД)); // Для платформы. + НастройкиКД.ДополнительныеСвойства.Вставить("Адрес", ПоместитьВоВременноеХранилище(НовыеНастройкиКД)); НастройкиКД = НовыеНастройкиКД; ВариантыПанелиКлючТекущегоВарианта = " - "; ОбновитьИнформациюОВариантеОтчета(); - ВидимостьДоступностьКорректность("ВариантОтчета"); + УстановитьВидимостьДоступность(Ложь); КонецПроцедуры &НаСервере Процедура ПриСохраненииПользовательскихНастроекНаСервере(ПользовательскиеНастройкиКД) - Если Не РежимВариантаОтчета Тогда + Если Не РежимВариантаОтчета() Тогда Возврат; КонецЕсли; ВариантыОтчетов.ПриСохраненииПользовательскихНастроекНаСервере(ЭтотОбъект, ПользовательскиеНастройкиКД); @@ -453,14 +454,40 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ЭЛЕМЕНТЫ - #Область ОбработчикиСобытийЭлементовШапкиФормы //////////////////////////////////////////////////////////////////////////////// // Табличный документ +&НаКлиенте +Процедура ОтчетТабличныйДокументВыбор(Элемент, Область, СтандартнаяОбработка) + ОтчетыКлиентПереопределяемый.ОбработкаВыбораТабличногоДокумента(ЭтотОбъект, Элемент, Область, СтандартнаяОбработка); + + Если СтандартнаяОбработка И ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда + Если ПерейтиПоСсылке(Область.Текст) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + Попытка + ЗначениеРасшифровки = Область.Расшифровка; + Исключение + ЗначениеРасшифровки = Неопределено; + // Для некоторых типов областей табличного документа (свойство ТипОбласти) + // чтение расшифровки недоступно, поэтому делается попытка-исключение. + КонецПопытки; + + Если ЗначениеРасшифровки <> Неопределено И ПерейтиПоСсылке(ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + Если ПерейтиПоСсылке(Область.Маска) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура ОтчетТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда @@ -485,6 +512,10 @@ &НаКлиенте Процедура Подключаемый_ФлажокИспользование_ПриИзменении(Элемент) ИдентификаторЭлемента = Прав(Элемент.Имя, 32); + + ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); + + ОтчетыКлиент.ОтразитьИзмененияВПодчиненных(ЭтотОбъект, ИдентификаторЭлемента, ПользовательскаяНастройкаКД); КонецПроцедуры &НаКлиенте @@ -504,33 +535,7 @@ ПользовательскаяНастройкаКД.Использование = Истина; КонецЕсли; - Если ПользовательскаяНастройкаКД.Использование Тогда // Очистка значений при изменении значения. - Найденные = ОтключаемыеСвязи.НайтиСтроки(Новый Структура("ВедущийИдентификаторВФорме", ИдентификаторЭлемента)); - Для Каждого Связь Из Найденные Цикл - Если Не ЗначениеЗаполнено(Связь.ПодчиненныйИдентификаторВФорме) Тогда - Продолжить; - КонецЕсли; - Если Связь.ТипСвязи = "ПараметровВыбора" Тогда - Если Связь.ПодчиненныйДействие <> РежимИзмененияСвязанногоЗначения.Очищать Тогда - Продолжить; - КонецЕсли; - Иначе - Продолжить; - КонецЕсли; - ПодчиненныйДополнительно = НайтиДополнительныеНастройкиЭлемента(Связь.ПодчиненныйИдентификаторВФорме); - Если ПодчиненныйДополнительно <> Неопределено Тогда - Если ПодчиненныйДополнительно.ВыводитьФлажок Тогда - ПодчиненныйНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(Связь.ПодчиненныйИдентификаторВФорме); - Если ПодчиненныйНастройкаКД <> Неопределено Тогда - ПодчиненныйНастройкаКД.Использование = Ложь; - КонецЕсли; - КонецЕсли; - Если Не ПодчиненныйДополнительно.ОграничиватьВыборУказаннымиЗначениями Тогда - ПодчиненныйДополнительно.ЗначенияДляВыбора.Очистить(); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; + ОтчетыКлиент.ОтразитьИзмененияВПодчиненных(ЭтотОбъект, ИдентификаторЭлемента, ПользовательскаяНастройкаКД); КонецПроцедуры &НаКлиенте @@ -622,9 +627,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// КОМАНДЫ - #Область ОбработчикиКомандФормы &НаКлиенте @@ -696,15 +698,15 @@ КонецПроцедуры &НаКлиенте -Процедура ОтправитьПоЭлектроннойПочте(Команда) +Процедура ОтправитьПоПочте(Команда) ОтображениеСостояния = Элементы.ОтчетТабличныйДокумент.ОтображениеСостояния; Если ОтображениеСостояния.Видимость = Истина И ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.Неактуальность Тогда ТекстВопроса = НСтр("ru = 'Отчет не сформирован. Сформировать?'"); - Обработчик = Новый ОписаниеОповещения("ОтправитьПоЭлектроннойПочтеПослеДиалогаСформировать", ЭтотОбъект); + Обработчик = Новый ОписаниеОповещения("СформироватьПередОтправкойПоПочте", ЭтотОбъект); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); Иначе - ПоказатьДиалогОтправкиПоЭлектроннойПочте(); + ПоказатьДиалогОтправкиПоПочте(); КонецЕсли; КонецПроцедуры @@ -753,14 +755,14 @@ &НаКлиенте Процедура Подключаемый_Команда(Команда) - // Механизмы расширения - Результат = Ложь; - КомандаВПостоянных = ПостоянныеКоманды.НайтиПоЗначению(Команда.Имя); - Если КомандаВПостоянных <> Неопределено И ЗначениеЗаполнено(КомандаВПостоянных.Представление) Тогда - МодульКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(КомандаВПостоянных.Представление); - МодульКлиент.ФормаОтчетаОбработчикКоманды(ЭтотОбъект, Команда, Результат); + ПостояннаяКоманда = ПостоянныеКоманды.НайтиПоЗначению(Команда.Имя); + Если ПостояннаяКоманда <> Неопределено И ЗначениеЗаполнено(ПостояннаяКоманда.Представление) Тогда + МассивПодстрок = СтрРазделить(ПостояннаяКоманда.Представление, "."); + КлиентскийМодуль = ОбщегоНазначенияКлиент.ОбщийМодуль(МассивПодстрок[0]); + Обработчик = Новый ОписаниеОповещения(МассивПодстрок[1], КлиентскийМодуль, Команда); + ВыполнитьОбработкуОповещения(Обработчик, ЭтотОбъект); Иначе - ОтчетыКлиентПереопределяемый.ОбработчикКоманды(ЭтотОбъект, Команда, Результат); + ОтчетыКлиентПереопределяемый.ОбработчикКоманды(ЭтотОбъект, Команда, Ложь); КонецЕсли; КонецПроцедуры @@ -772,8 +774,9 @@ Возврат; КонецЕсли; ВариантФормы = Найденные[0]; + НастройкиОтчета.Удалить("ФормаНастроекРасширенныйРежим"); ЗагрузитьВариант(ВариантФормы.КлючВарианта); - КлючУникальности = Лев(КлючУникальности, СтрНайти(КлючУникальности, "/")) + "КлючВарианта." + ВариантФормы.КлючВарианта; + КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(НастройкиОтчета.ПолноеИмя, ВариантФормы.КлючВарианта); ПоказатьРезультатЗаполненияНастроек(); Если Элементы.ФормироватьСразу.Пометка Тогда ПодключитьОбработчикОжидания("Сформировать", 0.1, Истина); @@ -826,9 +829,6 @@ #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -851,17 +851,29 @@ КонецПроцедуры &НаКлиенте -Процедура ОтправитьПоЭлектроннойПочтеПослеДиалогаСформировать(Ответ, ДополнительныеПараметры) Экспорт +Процедура СформироватьПередОтправкойПоПочте(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда - ПеременныеКлиента.Вставить("ОтправитьПослеФормирования", Истина); - Сформировать(); + Обработчик = Новый ОписаниеОповещения("ОтправитьПоПочтеПослеФормирования", ЭтотОбъект); + ОтчетыКлиент.СформироватьОтчет(ЭтотОбъект, Обработчик); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьПоПочтеПослеФормирования(ТабличныйДокументСформирован, ДополнительныеПараметры) Экспорт + Если ТабличныйДокументСформирован Тогда + ПоказатьДиалогОтправкиПоПочте(); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Сформировать() + Отказ = Ложь; + ОтчетыКлиентПереопределяемый.ПередФормированием(ЭтотОбъект, Отказ); + Если Отказ Тогда + Возврат; + КонецЕсли; ПередФормированиемНаКлиенте(); - ТребуетсяОбработчик = ФоновоеЗаданиеЗапустить(ПеременныеКлиента.ФормированиеПриОткрытии, НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный); + ТребуетсяОбработчик = ФоновоеЗаданиеЗапустить(ФормированиеПриОткрытии, НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный); Если ТребуетсяОбработчик Тогда ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчика); ПодключитьОбработчикОжидания("ФоновоеЗаданиеПроверитьНаКлиенте", 1, Истина); @@ -873,48 +885,50 @@ &НаКлиенте Процедура ПередФормированиемНаКлиенте() ОтчетСформирован = Ложь; - ПеременныеКлиента.Вставить("ВыполнятьЗамеры", НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров)); - Если ПеременныеКлиента.ВыполнятьЗамеры Тогда - ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ПеременныеКлиента, "МодульОценкаПроизводительностиКлиент"); - ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ПеременныеКлиента, "ИдентификаторЗамера"); - Комментарий = НастройкиОтчета.ПрефиксЗамеров + "; " + НСтр("ru = 'Непосредственно:'") + " " + Строка(ПеременныеКлиента.Непосредственно); - ПеременныеКлиента.МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); - ПеременныеКлиента.ИдентификаторЗамера = ПеременныеКлиента.МодульОценкаПроизводительностиКлиент.НачатьЗамерВремени( + ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров); + Если ВыполнятьЗамеры Тогда + Комментарий = НастройкиОтчета.ПрефиксЗамеров + "; " + НСтр("ru = 'Непосредственно:'") + " " + Строка(Непосредственно); + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.НачатьЗамерВремени( Ложь, НастройкиОтчета.КлючЗамеров + ".Формирование"); - ПеременныеКлиента.МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ПеременныеКлиента.ИдентификаторЗамера, Комментарий); + МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, Комментарий); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПослеФормированияНаКлиенте() ОтключитьОбработчикОжидания("ФоновоеЗаданиеПроверитьНаКлиенте"); - ПеременныеКлиента.ФормированиеПриОткрытии = Ложь; - Если ПеременныеКлиента.ВыполнятьЗамеры Тогда - ПеременныеКлиента.МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ПеременныеКлиента.ИдентификаторЗамера); - КонецЕсли; - ОтправитьПослеФормирования = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПеременныеКлиента, "ОтправитьПослеФормирования"); - Если ОтправитьПослеФормирования = Истина Тогда - ПеременныеКлиента.ОтправитьПослеФормирования = Ложь; - Если ОтчетСформирован Тогда - ПоказатьДиалогОтправкиПоЭлектроннойПочте(); - КонецЕсли; + ФормированиеПриОткрытии = Ложь; + Если ВыполнятьЗамеры Тогда + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); КонецЕсли; ПоказатьРезультатЗаполненияНастроек(); - ОбновитьОтображениеДанных(); // Для платформы. + ОбновитьОтображениеДанных(); + Обработчик = ОбработчикПослеФормированияНаКлиенте; + Если ТипЗнч(Обработчик) = Тип("ОписаниеОповещения") Тогда + ВыполнитьОбработкуОповещения(Обработчик, ОтчетСформирован); + ОбработчикПослеФормированияНаКлиенте = Неопределено; + КонецЕсли; + ОтчетыКлиентПереопределяемый.ПослеФормирования(ЭтотОбъект, ОтчетСформирован); КонецПроцедуры &НаКлиенте -Процедура ПоказатьДиалогОтправкиПоЭлектроннойПочте() - ТабличныеДокументы = Новый СписокЗначений; - ТабличныеДокументы.Добавить(ОтчетТабличныйДокумент, ОтчетНаименованиеТекущегоВарианта); +Процедура ПоказатьДиалогОтправкиПоПочте() + Вложение = Новый Структура; + Вложение.Вставить("АдресВоВременномХранилище", ПоместитьВоВременноеХранилище(ОтчетТабличныйДокумент, УникальныйИдентификатор)); + Вложение.Вставить("Представление", ОтчетНаименованиеТекущегоВарианта); - ЗаголовокСохранения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Отправка отчета ""%1"" по почте'"), ОтчетНаименованиеТекущегоВарианта); + СписокВложений = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Вложение); - ПараметрыОтправки = Новый Структура("Тема", ОтчетНаименованиеТекущегоВарианта); - - МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.ОтправитьТабличныеДокументы(ТабличныеДокументы, ЗаголовокСохранения, ПараметрыОтправки); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + ПараметрыОтправки = МодульРаботаСПочтовымиСообщениямиКлиент.ПараметрыОтправкиПисьма(); + ПараметрыОтправки.Тема = ОтчетНаименованиеТекущегоВарианта; + ПараметрыОтправки.Вложения = СписокВложений; + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -922,7 +936,7 @@ Если ВариантыПанелиКлючТекущегоВарианта <> " - " Тогда // Изменения уже применены Возврат; КонецЕсли; - ВидимостьДоступностьКорректность(""); + УстановитьВидимостьДоступность(); КонецПроцедуры &НаКлиенте @@ -974,7 +988,6 @@ Возврат; КонецЕсли; - // Для платформы (переопределение доступных значений на клиенте). СвоиСпискиВыбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(РезультатЗаполненияНастроек, "СвоиСпискиВыбора"); Если ТипЗнч(СвоиСпискиВыбора) = Тип("Массив") Тогда Для Каждого ИдентификаторЭлемента Из СвоиСпискиВыбора Цикл @@ -1019,6 +1032,22 @@ РезультатЗаполненияНастроек.Очистить(); КонецПроцедуры +&НаКлиенте +Функция ПерейтиПоСсылке(АдресСсылки) + Если ПустаяСтрока(АдресСсылки) Тогда + Возврат Ложь; + КонецЕсли; + АдресСсылкиВРег = ВРег(АдресСсылки); + Если СтрНачинаетсяС(АдресСсылкиВРег, ВРег("http://")) + Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("https://")) + Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1cib/")) + Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1c://")) Тогда + ОбщегоНазначенияКлиент.ПерейтиПоСсылке(АдресСсылки); + Возврат Истина; + КонецЕсли; + Возврат Ложь; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Клиент или сервер @@ -1039,48 +1068,47 @@ // Вызов сервера &НаСервере -Процедура ВидимостьДоступностьКорректность(Изменения = "") - ПоказыватьКомандыВариантовОтчетов = РежимВариантаОтчета И НастройкиОтчета.РазрешеноМенятьВарианты; +Процедура УстановитьВидимостьДоступность(ОбновитьКоманды = Истина) + ПоказыватьКомандыВыбораВариантов = РежимВариантаОтчета() И НастройкиОтчета.РазрешеноВыбиратьВарианты; - Если Изменения = "" Тогда - Если Не РежимВариантаОтчета Тогда - Элементы.ИзменитьУсловияОтборов.Видимость = Ложь; - КонецЕсли; - - // Вычисление параметров отображения. + Если ОбновитьКоманды Тогда + ПоказыватьКомандыИзмененияВарианта = ПоказыватьКомандыВыбораВариантов И НастройкиОтчета.РазрешеноИзменятьВарианты; ЕстьНастройки = ЕстьБыстрыеНастройки Или ЕстьОбычныеНастройки; - // Применение параметров отображения. - Элементы.ВсеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов Или ЕстьОбычныеНастройки; - Элементы.ГруппаВариантыОтчета.Видимость = ПоказыватьКомандыВариантовОтчетов; - Элементы.ИзменитьВариант.Видимость = ПоказыватьКомандыВариантовОтчетов; - Элементы.ВыбратьВариант.Видимость = ПоказыватьКомандыВариантовОтчетов; + Элементы.ВсеНастройки.Видимость = ПоказыватьКомандыИзмененияВарианта Или ЕстьОбычныеНастройки; + Элементы.ВариантыОтчета.Видимость = ПоказыватьКомандыВыбораВариантов; + Элементы.ИзменитьВариант.Видимость = ПоказыватьКомандыИзмененияВарианта; + Элементы.ВыбратьВариант.Видимость = ПоказыватьКомандыВыбораВариантов; ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьВариант", "Видимость", - ПоказыватьКомандыВариантовОтчетов); // Для платформы (кнопка исчезает если команда недоступна по правам). - Элементы.ГруппаПользовательскиеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов И ЕстьНастройки; + ПоказыватьКомандыИзмененияВарианта); // Кнопка исчезает, если команда недоступна по правам. + Элементы.ИзменитьУсловияОтборов.Видимость = ЕстьНастройки И РежимВариантаОтчета(); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, + "ВыбратьНастройки", + "Видимость", + ПоказыватьКомандыВыбораВариантов И ЕстьНастройки); // Кнопка исчезает, если команда недоступна по правам. + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, + "СохранитьНастройки", + "Видимость", + ПоказыватьКомандыВыбораВариантов И ЕстьНастройки); // Кнопка исчезает, если команда недоступна по правам. КонецЕсли; // Команды выбора вариантов. Если ВариантыПанелиКлючТекущегоВарианта <> КлючТекущегоВарианта Тогда ВариантыПанелиКлючТекущегоВарианта = КлючТекущегоВарианта; - Если ПоказыватьКомандыВариантовОтчетов Тогда + Если ПоказыватьКомандыВыбораВариантов Тогда ЗаполнитьКомандыВыбораВариантов(); КонецЕсли; Если ПравоВывода Тогда - Уникальность = НастройкиОтчета.ПолноеИмя; - Если ЗначениеЗаполнено(КлючТекущегоВарианта) Тогда - Уникальность = Уникальность + "/КлючВарианта." + КлючТекущегоВарианта; - КонецЕсли; - - КлючСохраненияПоложенияОкна = Уникальность; - - НастройкиОтчета.Печать.Вставить("КлючПараметровПечати", Уникальность); - НастройкиПечатиВосстановить(); + КлючСохраненияПоложенияОкна = ОтчетыКлиентСервер.КлючУникальности(НастройкиОтчета.ПолноеИмя, КлючТекущегоВарианта); + НастройкиОтчета.Печать.Вставить("КлючПараметровПечати", КлючСохраненияПоложенияОкна); + ЗаполнитьЗначенияСвойств(ОтчетТабличныйДокумент, НастройкиОтчета.Печать); КонецЕсли; НавигационнаяСсылка = ""; @@ -1149,8 +1177,7 @@ // Обработка дополнительных настроек. ПослеИзмененияКлючевыхСостояний(ПараметрыЗаполнения); - // Заголовок, видимость/доступность элементов, параметры печати и окна. - ВидимостьДоступностьКорректность(""); + УстановитьВидимостьДоступность(); // Вызов переопределяемого модуля. Если НастройкиОтчета.События.ПослеЗаполненияПанелиБыстрыхНастроек Тогда @@ -1200,9 +1227,11 @@ ПараметрыФормированияОтчета.Вставить("СхемаМодифицирована", НастройкиОтчета.СхемаМодифицирована); ПараметрыФормированияОтчета.Вставить("КлючСхемы", НастройкиОтчета.КлючСхемы); + ИмяОтчета = СтрРазделить(НастройкиОтчета.ПолноеИмя, ".")[1]; + Если НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров) Тогда - Разрезы = Новый Структура; - Разрезы.Вставить("ИмяОтчета", СтрРазделить(НастройкиОтчета.ПолноеИмя, ".")[1]); + Разрезы = Новый Соответствие; + Разрезы.Вставить("ИмяОтчета", ИмяОтчета); Разрезы.Вставить("ИмяИсходногоВарианта", НастройкиОтчета.ИмяИсходногоВарианта); Разрезы.Вставить("Внешний", Число(НастройкиОтчета.Внешний)); Разрезы.Вставить("Пользовательский", Число(НастройкиОтчета.Пользовательский)); @@ -1227,39 +1256,32 @@ КонецЕсли; ПараметрыФормированияОтчета.Вставить("ИмяКлючевойОперации", НастройкиОтчета.КлючЗамеров + ".Формирование"); - ПараметрыФормированияОтчета.Вставить("КомментарийКлючевойОперации", НРег(ВариантыОтчетовКлиентСервер.СтруктураВСтроку(Разрезы, "=", "/"))); + ПараметрыФормированияОтчета.Вставить("КомментарийКлючевойОперации", Разрезы); КонецЕсли; Если Непосредственно Тогда Если НастройкиОтчета.СхемаМодифицирована Тогда ПараметрыФормированияОтчета.Вставить("АдресСхемы", НастройкиОтчета.АдресСхемы); КонецЕсли; - РезультатФоновогоЗадания = Новый Структура("Статус, ИдентификаторЗадания, АдресРезультата, КраткоеПредставлениеОшибки"); - РезультатФоновогоЗадания.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); ПараметрыФормированияОтчета.Вставить("Объект", РеквизитФормыВЗначение("Отчет")); ПараметрыФормированияОтчета.Вставить("ПолноеИмя", НастройкиОтчета.ПолноеИмя); - Попытка - ВариантыОтчетов.СформироватьОтчетВФоне(ПараметрыФормированияОтчета, РезультатФоновогоЗадания.АдресРезультата); - РезультатФоновогоЗадания.Статус = "Выполнено"; - Исключение - РезультатФоновогоЗадания.Статус = "Ошибка"; - РезультатФоновогоЗадания.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; Иначе Если НастройкиОтчета.СхемаМодифицирована Тогда ПараметрыФормированияОтчета.Вставить("СхемаКД", ПолучитьИзВременногоХранилища(НастройкиОтчета.АдресСхемы)); КонецЕсли; - ПараметрыЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - ПараметрыЗапуска.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполнение отчета: %1'"), - СтрРазделить(НастройкиОтчета.ПолноеИмя, ".")[1]); - ПараметрыЗапуска.ОжидатьЗавершение = Ложь; - РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне( - "ВариантыОтчетов.СформироватьОтчетВФоне", - ПараметрыФормированияОтчета, - ПараметрыЗапуска); КонецЕсли; + ПараметрыЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыЗапуска.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполнение отчета: %1'"), + ИмяОтчета); + ПараметрыЗапуска.ОжидатьЗавершение = Ложь; + ПараметрыЗапуска.ЗапуститьНеВФоне = Непосредственно; + РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне( + "ВариантыОтчетов.СформироватьОтчетВФоне", + ПараметрыФормированияОтчета, + ПараметрыЗапуска); + Если РезультатФоновогоЗадания.Статус = "Ошибка" Тогда ПоказатьОшибкиФормирования(РезультатФоновогоЗадания.КраткоеПредставлениеОшибки); Возврат Ложь; @@ -1354,7 +1376,6 @@ ВариантМодифицирован = Ложь; ПользовательскиеНастройкиМодифицированы = Ложь; НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Истина; - НастройкиОтчета.Удалить("ФормаНастроекРасширенныйРежим"); // Загрузка нового варианта. УстановитьТекущийВариант(КлючВарианта); // Переключение состояния. @@ -1463,6 +1484,10 @@ КонецЕсли; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("КлючВарианта", КлючТекущегоВарианта); Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ВариантНаименование", ОтчетНаименованиеТекущегоВарианта); + // Подготовка к предварительной инициализации компоновщика (используется при расшифровке). + Если НастройкиОтчета.СхемаМодифицирована Тогда + Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("АдресСхемы", НастройкиОтчета.АдресСхемы); + КонецЕсли; КонецЕсли; Если ПараметрыЗаполнения.Свойство("ФормаНастроекРасширенныйРежим") Тогда @@ -1535,7 +1560,6 @@ // Кэши для быстрого поиска с клиента. СоответствиеПользовательскихНастроек = Новый Соответствие; СоответствиеИменОбъектовМетаданных = Информация.СоответствиеИменОбъектовМетаданных; - СоответствиеОтключаемыхСвязей = Новый Соответствие; СоответствиеНастроекВарианта = Новый Соответствие; // Удаление реквизитов @@ -1574,14 +1598,6 @@ Режимы = РежимОтображенияЭлементаНастройкиКомпоновкиДанных; - ШаблонНастройки = Новый Структура("Тип, Подтип, Шаблон, СтрокаДерева, - |ПользовательскаяНастройкаКД, Идентификатор, НастройкаВариантаКД, ДоступнаяНастройкаКД"); - ШаблонНастройки.Вставить("Иерархия", Ложь); - ШаблонНастройки.Вставить("ФлажокИспользование", Ложь); - ШаблонНастройки.Вставить("ВводСписком", Ложь); - ШаблонНастройки.Вставить("ОграничиватьВыборУказаннымиЗначениями", Ложь); - ШаблонНастройки = Новый ФиксированнаяСтруктура(ШаблонНастройки); - ГруппыВывода = Новый Структура; ГруппыВывода.Вставить("Быстрые", Новый Структура("Порядок, Размер", Новый Массив, 0)); @@ -1649,22 +1665,11 @@ // Сохранение соответствий для быстрого поиска в данные формы. БыстрыйПоискПользовательскихНастроек = Новый ФиксированноеСоответствие(СоответствиеПользовательскихНастроек); БыстрыйПоискИменОбъектовМетаданных = Новый ФиксированноеСоответствие(СоответствиеИменОбъектовМетаданных); - БыстрыйПоискОтключаемыхСвязей = Новый ФиксированноеСоответствие(СоответствиеОтключаемыхСвязей); БыстрыйПоискНастроекВарианта = Новый ФиксированноеСоответствие(СоответствиеНастроекВарианта); ПользовательскиеНастройкиКД.ДополнительныеСвойства.Вставить("ЭлементыФормы", ДополнительныеНастройкиЭлементов); КонецПроцедуры -&НаСервере -Процедура НастройкиПечатиСохранить() - ЗаполнитьЗначенияСвойств(НастройкиОтчета.Печать, ОтчетТабличныйДокумент); -КонецПроцедуры - -&НаСервере -Процедура НастройкиПечатиВосстановить() - ЗаполнитьЗначенияСвойств(ОтчетТабличныйДокумент, НастройкиОтчета.Печать); -КонецПроцедуры - &НаСервере Процедура ФоновоеЗаданиеЗагрузитьРезультат() @@ -1691,9 +1696,9 @@ ОтображениеСостояния.Картинка = Новый Картинка; ОтображениеСостояния.Текст = ""; - НастройкиПечатиСохранить(); + ЗаполнитьЗначенияСвойств(НастройкиОтчета.Печать, ОтчетТабличныйДокумент); // Сохранение настроек печати. ОтчетТабличныйДокумент = РезультатФормирования.ТабличныйДокумент; - НастройкиПечатиВосстановить(); + ЗаполнитьЗначенияСвойств(ОтчетТабличныйДокумент, НастройкиОтчета.Печать); // Восстановление. ОтчетСформирован = Истина; @@ -1730,7 +1735,7 @@ ОтображениеСостояния.Текст = ОписаниеОшибки; Если Не ПустаяСтрока(ПодробноеПредставлениеОшибки) Тогда - ВариантыОтчетов.ПредупреждениеПоВарианту(НастройкиОтчета.ВариантСсылка, ПодробноеПредставлениеОшибки); + ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ПодробноеПредставлениеОшибки, НастройкиОтчета.ВариантСсылка); КонецЕсли; КонецПроцедуры @@ -1894,6 +1899,10 @@ И Не Пользователи.ЭтоПолноправныйПользователь() Тогда ВариантМодифицирован = Ложь; КонецЕсли; + // Также стандартный диалог не показывается если пользователю запрещено изменять варианты этого отчета. + Если Не НастройкиОтчета.РазрешеноИзменятьВарианты Тогда + ВариантМодифицирован = Ложь; + КонецЕсли; КонецПроцедуры &НаСервере @@ -1950,4 +1959,9 @@ КонецЕсли; КонецПроцедуры +&НаСервере +Функция РежимВариантаОтчета() + Возврат ТипЗнч(КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(КлючТекущегоВарианта); +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ФормаПоиска/Form.form b/SSL/src/CommonForms/ФормаПоиска/Form.form index f885c1cd2..263b50f63 100644 --- a/SSL/src/CommonForms/ФормаПоиска/Form.form +++ b/SSL/src/CommonForms/ФормаПоиска/Form.form @@ -146,6 +146,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Поиска</value> + ГруппаПоискаExtendedTooltip 52 @@ -246,12 +250,8 @@ <key>ru</key> - <value>Группа область поиска</value> + <value>Область поиска</value> - - ru - Группа область поиска - ГруппаОбластьПоискаРасширеннаяПодсказка 63 @@ -348,6 +348,10 @@ true + + <key>ru</key> + <value>Навигация</value> + ГруппаНавигацияExtendedTooltip 57 @@ -411,6 +415,10 @@ true + + <key>ru</key> + <value>Информация о найденном</value> + ГруппаИнформацияОНайденномExtendedTooltip 56 diff --git a/SSL/src/CommonForms/ФормаПоиска/Module.bsl b/SSL/src/CommonForms/ФормаПоиска/Module.bsl index 00aaaf723..f345a8b97 100644 --- a/SSL/src/CommonForms/ФормаПоиска/Module.bsl +++ b/SSL/src/CommonForms/ФормаПоиска/Module.bsl @@ -233,8 +233,6 @@ Возврат; КонецЕсли; - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется поиск ""%1""...'"), СтрокаПоиска)); - СписокВыбора = Элементы.СтрокаПоиска.СписокВыбора.Скопировать(); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ИскатьВРазделах", ИскатьВРазделах); @@ -402,7 +400,7 @@ "", Строки); - КонецПроцедуры +КонецПроцедуры &НаСервере Процедура СохранитьНастройкиПоиска() diff --git a/SSL/src/CommonForms/ЭлектроннаяПодпись/Form.form b/SSL/src/CommonForms/ЭлектроннаяПодпись/Form.form index a48dcf628..0a76eec72 100644 --- a/SSL/src/CommonForms/ЭлектроннаяПодпись/Form.form +++ b/SSL/src/CommonForms/ЭлектроннаяПодпись/Form.form @@ -210,6 +210,7 @@ true true + true true true true @@ -287,7 +288,6 @@ true InputField - true Enter true Left @@ -295,7 +295,6 @@ true true - true true true true diff --git a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl index 20fdba47d..1c7e792ca 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl @@ -1,11 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Реализация программного администрирования кластера серверов с использованием. -// COM-объекта V8*.ComConnector. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс #Область БлокировкаСеансовИЗаданий @@ -1022,15 +1014,15 @@ Функция COMСоединитель() #Если Клиент Тогда - Возврат Новый COMОбъект(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяCOMСоединителя); + Возврат Новый COMОбъект(СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ИмяCOMСоединителя); #Иначе Если БезопасныйРежим() <> Ложь Тогда - ВызватьИсключение НСтр("ru = 'Администрирование кластера невозможно в безопасном режиме!'"); + ВызватьИсключение НСтр("ru = 'Внимание! Администрирование кластера невозможно в безопасном режиме'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ВызватьИсключение НСтр("ru = 'В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера!'"); + Если ОбщегоНазначения.РазделениеВключено() Тогда + ВызватьИсключение НСтр("ru = 'Внимание! В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера'"); КонецЕсли; Возврат Новый COMОбъект(ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя()); @@ -1131,7 +1123,7 @@ КонецЦикла; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдена информационная база ""%3""!'"), + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдена информационная база ""%3""'"), Кластер.HostName, Формат(Кластер.MainPort, "ЧГ=0"), ИмяВКластере); @@ -1173,7 +1165,7 @@ КонецЦикла; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдена информационная база ""%3""!'"), + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдена информационная база ""%3""'"), Кластер.HostName, Формат(Кластер.MainPort, "ЧГ=0"), ИмяВКластере); @@ -1369,7 +1361,7 @@ КонецЦикла; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найден профиль безопасности ""%3""!'"), + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найден профиль безопасности ""%3""'"), Кластер.HostName, Формат(Кластер.MainPort, "ЧГ=0"), ИмяПрофиля); diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl index 1b13acc2d..826f82468 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl @@ -1,11 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Клиентские и серверные процедуры и функции общего назначения: -// - Реализация программного администрирования кластера серверов через сервер -// администрирования. -// -//////////////////////////////////////////////////////////////////////////////// - #Если Не ВебКлиент Тогда #Область СлужебныйПрограммныйИнтерфейс @@ -606,7 +598,7 @@ ПрофилиБезопасности = ПолучитьПрофилиБезопасности(ИдентификаторКластера, ПараметрыАдминистрированияКластера, Фильтр); Если ПрофилиБезопасности.Количество() <> 1 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирован профиль безопасности %2!'"), ИдентификаторКластера, ИмяПрофиля); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирован профиль безопасности %2.'"), ИдентификаторКластера, ИмяПрофиля); КонецЕсли; Результат = ПрофилиБезопасности[0]; @@ -659,7 +651,7 @@ ПрофилиБезопасности = ПолучитьПрофилиБезопасности(ИдентификаторКластера, ПараметрыАдминистрированияКластера, Фильтр); Если ПрофилиБезопасности.Количество() = 1 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 уже зарегистрирован профиль безопасности %2!'"), ИдентификаторКластера, ИмяПрофиля); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 уже зарегистрирован профиль безопасности %2.'"), ИдентификаторКластера, ИмяПрофиля); КонецЕсли; ОбновитьСвойстваПрофиляБезопасности(ПараметрыАдминистрированияКластера, СвойстваПрофиляБезопасности, Ложь); @@ -685,7 +677,7 @@ ПрофилиБезопасности = ПолучитьПрофилиБезопасности(ИдентификаторКластера, ПараметрыАдминистрированияКластера, Фильтр); Если ПрофилиБезопасности.Количество() <> 1 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирован профиль безопасности %2!'"), ИдентификаторКластера, ИмяПрофиля); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирован профиль безопасности %2.'"), ИдентификаторКластера, ИмяПрофиля); КонецЕсли; ОбновитьСвойстваПрофиляБезопасности(ПараметрыАдминистрированияКластера, СвойстваПрофиляБезопасности, Истина); @@ -739,7 +731,7 @@ Если ИнформационныеБазы.Количество() = 1 Тогда Возврат ИнформационныеБазы[0].Получить("infobase"); Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирована информационная база %2!'"), ИдентификаторКластера, ПараметрыАдминистрированияИнформационнойБазы.ИмяВКластере); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1 не зарегистрирована информационная база %2.'"), ИдентификаторКластера, ПараметрыАдминистрированияИнформационнойБазы.ИмяВКластере); КонецЕсли; КонецФункции @@ -790,7 +782,7 @@ Если Кластеры.Количество() = 1 Тогда Возврат Кластеры[0].Получить("cluster"); Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не обнаружен кластер серверов с портом %1'"), ПараметрыАдминистрированияКластера.ПортКластера); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не обнаружен кластер серверов с портом %1.'"), ПараметрыАдминистрированияКластера.ПортКластера); КонецЕсли; КонецФункции @@ -1689,11 +1681,11 @@ #Если Сервер Тогда Если БезопасныйРежим() <> Ложь Тогда - ВызватьИсключение НСтр("ru = 'Администрирование кластера невозможно в безопасном режиме!'"); + ВызватьИсключение НСтр("ru = 'Внимание! Администрирование кластера невозможно в безопасном режиме.'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ВызватьИсключение НСтр("ru = 'В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера!'"); + Если ОбщегоНазначения.РазделениеВключено() Тогда + ВызватьИсключение НСтр("ru = 'Внимание! В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера.'"); КонецЕсли; #КонецЕсли @@ -1706,7 +1698,7 @@ Если Не ФайлКлиента.Существует() Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно выполнить операцию администрирования кластера серверов по причине: файл %1 не найден! + НСтр("ru = 'Невозможно выполнить операцию администрирования кластера серверов по причине: файл %1 не найден. | |Для администрирования кластера через сервер администрирования (ras) требуется установить на данном |компьютере клиент сервера администрирования (rac). @@ -1779,21 +1771,27 @@ ЧтениеПотокаОшибок = Новый ЧтениеТекста(ФайлПотокаОшибок, ПолучитьКодировкуСтандартныхПотоков()); ПотокОшибок = ЧтениеПотокаОшибок.Прочитать(); ЧтениеПотокаОшибок.Закрыть(); - УдалитьФайлы(ФайлПотокаОшибок); + + УдалитьВременныйФайл(ФайлПотокаОшибок); Если ЗначениеЗаполнено(ПотокОшибок) Тогда + УдалитьВременныйФайл(ФайлПотокаВывода); ВызватьИсключение ПотокОшибок; Иначе ЧтениеПотокаВывода = Новый ЧтениеТекста(ФайлПотокаВывода, ПолучитьКодировкуСтандартныхПотоков()); ПотокВывода = ЧтениеПотокаВывода.Прочитать(); - Если ПотокВывода = Неопределено Тогда - ПотокВывода = ""; - КонецЕсли; ЧтениеПотокаВывода.Закрыть(); - УдалитьФайлы(ФайлПотокаВывода); + + УдалитьВременныйФайл(ФайлПотокаВывода); + + Если ПотокВывода = Неопределено Тогда + + ПотокВывода = ""; + + КонецЕсли; Возврат ПотокВывода; @@ -2351,6 +2349,26 @@ КонецФункции +Процедура УдалитьВременныйФайл(ПолноеИмяФайла) + + Если ПустаяСтрока(ПолноеИмяФайла) Тогда + + Возврат; + + КонецЕсли; + + Попытка + + УдалитьФайлы(ПолноеИмяФайла); + + Исключение + + Возврат; + + КонецПопытки; + +КонецПроцедуры + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl index 28c8b013d..0c1c87aab 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl @@ -1,35 +1,29 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Клиентские и серверные процедуры и функции общего назначения: -// - Программный интерфейс для администрированию кластера серверов. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область КонструкторыПараметровПрограммногоИнтерфейса // Конструктор структуры, описывающей параметры подключения к администрируемому -// кластеру серверов. +// кластеру серверов. // -// Возвращаемое значение: Структура, поля: -// ТипПодключения - Строка, возможные значения: -// "COM" - при подключении к агенту сервера с использованием COM-объекта V8*.ComConnector, -// "RAS" - при подключении к серверу администрирования (ras) с использованием консольного -// клиента сервера администрирования (rac), -// АдресАгентаСервера - Строка, сетевой адрес агента сервера (только при ТипПодключения = "COM"), -// ПортАгентаСервера - Число, сетевой порт агента сервера (только при ТипПодключения = "COM"), -// типичное значение - 1540, -// АдресСервераАдминистрирования - Строка, сетевой адрес сервера администрирования ras (только. -// При ТипПодключения = "RAS"), -// ПортСервераАдминистрирования - Число, сетевой порт сервера администрирования ras (только при. -// ТипПодключения = "RAS"), типичное значение - 1545, -// ПортКластера - Число, сетевой порт менеджера администрируемого кластера, типичное значение -1541, -// ИмяАдминистратораКластера - Строка, имя учетной записи администратора кластера (если для кластера -// не задан список администраторов - используется пустая строка), -// ПарольАдминистратораКластера - Строка, пароль учетной записи администратора кластера (если -// для кластера не задан список администраторов или для учетной записи не установлен пароль - -// используется пустая строка). +// Возвращаемое значение: +// Структура - структура с полями: +// * ТипПодключения - Строка - возможные значения: +// "COM" - при подключении к агенту сервера с использованием COM-объекта V8*.ComConnector, +// "RAS" - при подключении к серверу администрирования (ras) с использованием консольного +// клиента сервера администрирования (rac), +// * АдресАгентаСервера - Строка - сетевой адрес агента сервера (только при ТипПодключения = "COM"), +// * ПортАгентаСервера - Число - сетевой порт агента сервера (только при ТипПодключения = "COM"), +// типичное значение - 1540, +// * АдресСервераАдминистрирования - Строка - сетевой адрес сервера администрирования ras (только +// при ТипПодключения = "RAS"), +// * ПортСервераАдминистрирования - Число - сетевой порт сервера администрирования ras (только при +// ТипПодключения = "RAS"), типичное значение - 1545, +// * ПортКластера - Число - сетевой порт менеджера администрируемого кластера, типичное значение -1541, +// * ИмяАдминистратораКластера - Строка - имя учетной записи администратора кластера (если для кластера +// не задан список администраторов - используется пустая строка), +// * ПарольАдминистратораКластера - Строка - пароль учетной записи администратора кластера (если +// для кластера не задан список администраторов или для учетной записи не установлен пароль - +// используется пустая строка). // Функция ПараметрыАдминистрированияКластера() Экспорт @@ -56,14 +50,15 @@ // Конструктор структуры, описывающей параметры подключения к администрируемой информационной // базе кластера. // -// Возвращаемое значение: Структура, поля: -// ИмяВКластере - Строка, имя администрируемой информационной базы в кластере серверов, -// ИмяАдминистратораИнформационнойБазы - Строка, имя пользователя информационной базы с правами -// администратора (если для информационной базы не задан список пользователей ИБ - используется -// пустая строка), -// ПарольАдминистратораИнформационнойБазы - Строка, пароль пользователя информационной базы -// с правами администратора (если для информационной базы не задан список пользователей ИБ или -// для пользователя ИБ не установлен пароль - используется пустая строка). +// Возвращаемое значение: +// Структура - структура с полями: +// * ИмяВКластере - Строка - имя администрируемой информационной базы в кластере серверов, +// * ИмяАдминистратораИнформационнойБазы - Строка - имя пользователя информационной базы с правами +// администратора (если для информационной базы не задан список пользователей ИБ - используется +// пустая строка), +// * ПарольАдминистратораИнформационнойБазы - Строка - пароль пользователя информационной базы +// с правами администратора (если для информационной базы не задан список пользователей ИБ или +// для пользователя ИБ не установлен пароль - используется пустая строка). // Функция ПараметрыАдминистрированияИнформационнойБазыКластера() Экспорт @@ -80,16 +75,13 @@ // Проверяет корректность параметров администрирования. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной -// в качестве значения параметра ПараметрыАдминистрированияКластера, -// ПроверятьПараметрыАдминистрированияКластера - Булево, флаг необходимости проверки параметров администрирования -// кластера, -// ПроверятьПараметрыАдминистрированияИнформационнойБазы - Булево, флаг необходимости проверки параметров -// администрирования кластера. +// в качестве значения параметра ПараметрыАдминистрированияКластера. +// ПроверятьПараметрыАдминистрированияКластера - Булево - флаг необходимости проверки параметров администрирования кластера, +// ПроверятьПараметрыАдминистрированияИнформационнойБазы - Булево - флаг необходимости проверки параметров +// администрирования кластера. // Процедура ПроверитьПараметрыАдминистрирования(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, ПроверятьПараметрыАдминистрированияКластера = Истина, @@ -111,15 +103,16 @@ // Конструктор структуры, описывающей свойства блокировки сеансов и регламентных заданий // информационной базы. // -// Возвращаемое значение: Структура, поля: -// БлокировкаСеансов - Булево, флаг установки блокировки новых сеансов с информационной базой, -// ДатаС - Дата(Дата и время) - момент начала блокировки новых сеансов с информационной базой, -// ДатаПо - Дата(Дата и время) - момент окончания блокировки новых сеансов с информационной базой, -// Сообщение - Строка, сообщение, отображаемое пользователю при попытке установки нового сеанса -// с информационной базой при установленной блокировке новых сеансов, -// КодРазрешения - Строка, код обхода блокировки новых сеансов с информационной базой, -// БлокировкаРегламентныхЗаданий - Булево, флаг блокировки выполнения регламентных заданий -// информационной базы. +// Возвращаемое значение: +// Структура - структура с полями: +// * БлокировкаСеансов - Булево - флаг установки блокировки новых сеансов с информационной базой, +// * ДатаС - Дата - (Дата и время) момент начала блокировки новых сеансов с информационной базой, +// * ДатаПо - Дата - (Дата и время) момент окончания блокировки новых сеансов с информационной базой, +// * Сообщение - Строка - сообщение, отображаемое пользователю при попытке установки нового сеанса +// с информационной базой при установленной блокировке новых сеансов, +// * КодРазрешения - Строка - код обхода блокировки новых сеансов с информационной базой, +// * БлокировкаРегламентныхЗаданий - Булево - флаг блокировки выполнения регламентных заданий +// информационной базы. // Функция СвойстваБлокировкиСеансовИРегламентныхЗаданий() Экспорт @@ -140,15 +133,13 @@ // Возвращает текущее состояние блокировки сеансов и регламентных заданий для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. // -// Возвращаемое значение: Структура, описывающая состояние блокировки сеансов и регламентных заданий, -// описание - см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий(). +// Возвращаемое значение: +// Структура - см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий. // Функция БлокировкаСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт @@ -169,14 +160,9 @@ // Устанавливает новое состояние блокировки сеансов и регламентных заданий для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), -// Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной -// в качестве значения параметра ПараметрыАдминистрированияКластера. -// СвойстваБлокировкиСеансовИЗаданий - Структура, описывающая состояние блокировки сеансов и регламентных заданий, -// описание - см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. +// СвойстваБлокировкиСеансовИЗаданий - Структура - см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий. // Процедура УстановитьБлокировкуСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач СвойстваБлокировкиСеансовИЗаданий) Экспорт @@ -196,10 +182,8 @@ // Снимает блокировку сеансов и регламентных заданий для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. // @@ -231,14 +215,13 @@ // Возвращает текущее состояние блокировки регламентных заданий для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево - Истина, если удалось заблокировать регламентные задания, Ложь - иначе. // Функция БлокировкаРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт @@ -259,13 +242,9 @@ // Устанавливает новое состояние блокировки регламентных заданий для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), -// Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной -// в качестве значения параметра ПараметрыАдминистрированияКластера. -// БлокировкаРегламентныхЗаданий - Булево, флаг установки блокировки регламентных заданий информационной базы. +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера, +// БлокировкаРегламентныхЗаданий - Булево - флаг установки блокировки регламентных заданий информационной базы. // Процедура УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач БлокировкаРегламентныхЗаданий) Экспорт @@ -288,53 +267,54 @@ // Конструктор структуры, описывающей свойства сеанса информационной базы. // -// Возвращаемое значение: Структура, поля: -// Номер - Число, номер сеанса. Уникален среди всех сеансов информационной базы, -// ИмяПользователя - Строка, имя аутентифицированного пользователя информационной базы, -// ИмяКлиентскогоКомпьютера - Строка, имя или сетевой адрес компьютера, установившего -// сеанс с информационной базой, -// ИдентификаторКлиентскогоПриложения - Строка, идентификатор приложения, установившего сеанс. -// Возможные значения - см. описание к функции глобального контекста ПредставлениеПриложения(), -// ИдентификаторЯзыка - Строка, идентификатор языка интерфейса, -// МоментСозданияСеанса - Дата(Дата и время) - момент установки сеанса, -// МоментПоследнейАктивностиСеанса - Дата(Дата и время) - момент последней активности сеанса, -// Блокировка - Число, номер сеанса, который является причиной ожидания управляемой транзакционной -// блокировки, в том случае, если сеанс выполняет установку управляемых транзакционных блокировок -// и ожидает снятия блокировок, установленных другим сеансом (иначе - значение равно 0), -// БлокировкаСУБД - Число, номер сеанса, который является причиной ожидания транзакционной -// блокировки, в том случае, если сеанс исполняет запрос к СУБД и ожидает транзакционную -// блокировку, установленную другим сеансом (иначе - значение равно 0), -// Передано - Число, объем данных, переданных меду сервером 1С:Предприятия и клиентским приложением -// данного сеанса с момента начала сеанса (в байтах), -// ПереданоЗа5Минут - Число, объем данных, переданных между сервером 1С:Предприятия и клиентским -// приложением данного сеанса за последние 5 минут (в байтах), -// СерверныхВызовов - Число, количество вызовов сервера 1С:Предприятия от имена данного сеанса с -// момента начала сеанса, -// СерверныхВызововЗа5Минут - Число, количество вызовов сервера 1С:Предприятия от имени данного сеанса -// за последние 5 минут, -// ДлительностьСерверныхВызовов - Число, время исполнения вызовов сервера 1С:Предприятия от имени -// данного сеанса с момента начала сеанса (в секундах), -// ДлительностьТекущегоСерверногоВызова - Число, интервал времени в миллисекундах, прошедший с момента начала -// обращения, в случае, если сеанс выполняется вызов сервера 1С:Предприятия (иначе - значение равно 0), -// ДлительностьСерверныхВызововЗа5Минут - Число, время исполнения вызовов сервера 1С:Предприятия от имени -// данного сеанса за последние 5 минут (в миллисекундах), -// ПереданоСУБД - Число, количество данных, переданных и полученных от СУБД от имени данного сеанса с -// момента начала сеанса (в байтах), -// ПереданоСУБДЗа5Минут - Число, количество данных, переданных и полученных от СУБД от имени данного сеанса -// за последние 5 минут (в байтах), -// ДлительностьВызововСУБД - Число, время исполнения запросов к СУБД от имени данного сеанса с момента начала -// сеанса (в миллисекундах), -// ДлительностьТекущегоВызоваСУБД - Число, интервал времени в миллисекундах, прошедший с начала выполнения -// запроса в случае, если сеанс выполняет запрос к СУБД (иначе - значение равно 0), -// ДлительностьВызововСУБДЗа5Минут - Число, суммарное время исполнения запросов к СУБД от имени данного сеанса -// за последние 5 минут (в миллисекундах). -// СоединениеСУБД - Строка, номер соединения с СУБД в терминах СУБД в том случае, если в момент получения списка -// сеансов выполняется запрос к СУБД, открыта транзакция или определены временные таблицы (т.е. захвачено -// соединение с СУБД). Если соединение с СУБД не захвачено - значение равно пустой строке, -// ВремяСоединенияСУБД - Число, время соединения с СУБД с момента захвата (в миллисекундах). Если соединение с. -// СУБД не захвачено - значение равно 0, -// МоментЗахватаСоединенияСУБД - Дата(Дата и время), момент времени, когда соединение с СУБД было последний раз -// захвачено другим сеансом. +// Возвращаемое значение: +// Структура - структура с полями: +// * Номер - Число - номер сеанса. Уникален среди всех сеансов информационной базы, +// * ИмяПользователя - Строка - имя аутентифицированного пользователя информационной базы, +// * ИмяКлиентскогоКомпьютера - Строка - имя или сетевой адрес компьютера, установившего +// сеанс с информационной базой, +// * ИдентификаторКлиентскогоПриложения - Строка - идентификатор приложения, установившего сеанс +// (см. описание к функции глобального контекста ПредставлениеПриложения), +// * ИдентификаторЯзыка - Строка - идентификатор языка интерфейса, +// * МоментСозданияСеанса - Дата - (Дата и время) момент установки сеанса, +// * МоментПоследнейАктивностиСеанса - Дата - (Дата и время) момент последней активности сеанса, +// * Блокировка - Число - номер сеанса, который является причиной ожидания управляемой транзакционной +// блокировки, в том случае, если сеанс выполняет установку управляемых транзакционных блокировок +// и ожидает снятия блокировок, установленных другим сеансом (иначе - значение равно 0), +// * БлокировкаСУБД - Число - номер сеанса, который является причиной ожидания транзакционной +// блокировки, в том случае, если сеанс исполняет запрос к СУБД и ожидает транзакционную +// блокировку, установленную другим сеансом (иначе - значение равно 0), +// * Передано - Число - объем данных, переданных меду сервером 1С:Предприятия и клиентским приложением +// данного сеанса с момента начала сеанса (в байтах), +// * ПереданоЗа5Минут - Число - объем данных, переданных между сервером 1С:Предприятия и клиентским +// приложением данного сеанса за последние 5 минут (в байтах), +// * СерверныхВызовов - Число - количество вызовов сервера 1С:Предприятия от имена данного сеанса с +// момента начала сеанса, +// * СерверныхВызововЗа5Минут - Число - количество вызовов сервера 1С:Предприятия от имени данного сеанса +// за последние 5 минут, +// * ДлительностьСерверныхВызовов - Число - время исполнения вызовов сервера 1С:Предприятия от имени +// данного сеанса с момента начала сеанса (в секундах), +// * ДлительностьТекущегоСерверногоВызова - Число - интервал времени в миллисекундах, прошедший с момента начала +// обращения, в случае, если сеанс выполняется вызов сервера 1С:Предприятия (иначе - значение равно 0), +// * ДлительностьСерверныхВызововЗа5Минут - Число - время исполнения вызовов сервера 1С:Предприятия от имени +// данного сеанса за последние 5 минут (в миллисекундах), +// * ПереданоСУБД - Число - количество данных, переданных и полученных от СУБД от имени данного сеанса с +// момента начала сеанса (в байтах), +// * ПереданоСУБДЗа5Минут - Число - количество данных, переданных и полученных от СУБД от имени данного сеанса +// за последние 5 минут (в байтах), +// * ДлительностьВызововСУБД - Число - время исполнения запросов к СУБД от имени данного сеанса с момента начала +// сеанса (в миллисекундах), +// * ДлительностьТекущегоВызоваСУБД - Число - интервал времени в миллисекундах, прошедший с начала выполнения +// запроса в случае, если сеанс выполняет запрос к СУБД (иначе - значение равно 0), +// * ДлительностьВызововСУБДЗа5Минут - Число - суммарное время исполнения запросов к СУБД от имени данного сеанса +// за последние 5 минут (в миллисекундах), +// * СоединениеСУБД - Строка - номер соединения с СУБД в терминах СУБД в том случае, если в момент получения списка +// сеансов выполняется запрос к СУБД, открыта транзакция или определены временные таблицы (т.е. захвачено +// соединение с СУБД). Если соединение с СУБД не захвачено - значение равно пустой строке, +// * ВремяСоединенияСУБД - Число - время соединения с СУБД с момента захвата (в миллисекундах). Если соединение с. +// СУБД не захвачено - значение равно 0, +// * МоментЗахватаСоединенияСУБД - Дата - (Дата и время) момент времени, когда соединение с СУБД было последний раз +// захвачено другим сеансом. // Функция СвойстваСеанса() Экспорт @@ -372,44 +352,21 @@ // Возвращает описания сеансов информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// Фильтр - Описание условия фильтрации сеансов, описания которых требуется получить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации сеансов. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСеанса(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений сеансов с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства сеанса (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство. +// Фильтр - Массив - массив структур, описывающих условия фильтрации сеансов. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства сеанса. +// - Структура - структура: ключ - Имя свойства сеанса (см. выше), значение - значение, с которым +// выполняется сеанс. При использовании данного варианта описания фильтра сравнение всегда выполняется на +// равенство. // -// Возвращаемое значение: Массив(Структура), массив структур, описывающих свойства сеансов. Описание структур - -// см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса(). +// Возвращаемое значение: +// Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса). // Функция СеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено) Экспорт @@ -429,41 +386,17 @@ // Удаляет сеансы с информационной базой по фильтру. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// Фильтр - Описание условия фильтрации сеансов, которые требуется удалить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации сеансов. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСеанса(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений сеансов с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства сеанса (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство. +// Фильтр - Массив - массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства сеанса, +// - Структура - структура: ключ - Имя свойства сеанса (см. выше), значение - значение, с которым +// выполняется сеанс. При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. // Процедура УдалитьСеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено) Экспорт @@ -486,39 +419,40 @@ // Конструктор структуры, описывающей свойства соединения с информационной базой. // -// Возвращаемое значение: Структура, поля: -// Номер - Число, номер соединения с информационной базой, -// ИмяПользователя - Строка, имя пользователя 1С:Предприятия, подсоединенного к информационной базе, -// ИмяКлиентскогоКомпьютера - Строка, имя компьютера, с которого установлено соединение, -// ИдентификаторКлиентскогоПриложения - Строка, идентификатор приложения, установившего соединение. -// Возможные значения - см. описание к функции глобального контекста ПредставлениеПриложения(), -// МоментУстановкиСоединения - Дата(Дата и время), момент установки соединения, -// РежимСоединенияСИнформационнойБазой - Число, режим соединения с информационной базой (0 - -// разделяемый, 1 - монопольный), -// РежимСоединенияСБазойДанных - Число, режим соединения с базой данных (0 - соединение не установлено, -// 1 - разделяемый, 2 - монопольный), -// БлокировкаСУБД - Число, идентификатор соединения, блокирующего работу данного соединения в СУБД, -// Передано - Число, объем данных, полученных и отправленных соединением, -// ПереданоЗа5Минут - Число, объем данных, полученных и отправленных соединением за последние 5 минут, -// СерверныхВызовов - Число, количество серверных вызовов, -// СерверныхВызововЗа5Минут - Число, количество серверных вызовов соединения за последние 5 минут, -// ПереданоСУБД - Число, объем данных, переданных между сервером 1С:Предприятия и сервером баз данных, -// с момента установки данного соединения, -// ПереданоСУБДЗа5Минут - Число, объем данных, переданных между сервером 1С:Предприятия и сервером баз -// данных за последние 5 минут, -// СоединениеСУБД - Строка, идентификатор процесса соединения с СУБД (если на момент получения списка -// соединений данное соединение выполняло обращение к серверу СУБД, в противном случае - значение равно пустой -// строке). Идентификатор возвращается в терминах сервера СУБД. -// ВремяСУБД - Число, время в секундах, в течении которого выполняется обращение к серверу СУБД (если на момент -// получения списка соединений данное соединение выполняло обращение к серверу СУБД, в противном случае - значение -// равно 0), -// МоментЗахватаСоединенияСУБД - Дата(Дата и время) - момент последнего захвата соединения с сервером СУБД, -// ДлительностьСерверныхВызовов - Число, длительность всех серверных вызовов соединения, -// ДлительностьВызововСУБД - Число, время вызовов СУБД, инициированных соединением, -// ДлительностьТекущегоСерверногоВызова - Число, длительность текущего серверного вызова, -// ДлительностьТекущегоВызоваСУБД - Число, длительность текущего вызова сервера СУБД, -// ДлительностьСерверныхВызововЗа5Минут - Число, длительность серверных вызовов соединения за последние 5 минут, -// ДлительностьВызововСУБДЗа5Минут - Число, длительность вызовов соединения СУБД за последние 5 минут. +// Возвращаемое значение: +// Структура - структура с полями: +// * Номер - Число - номер соединения с информационной базой, +// * ИмяПользователя - Строка - имя пользователя 1С:Предприятия, подсоединенного к информационной базе, +// * ИмяКлиентскогоКомпьютера - Строка - имя компьютера, с которого установлено соединение, +// * ИдентификаторКлиентскогоПриложения - Строка - идентификатор приложения, установившего соединение (см. описание к +// функции глобального контекста ПредставлениеПриложения), +// * МоментУстановкиСоединения - Дата - (Дата и время) момент установки соединения, +// * РежимСоединенияСИнформационнойБазой - Число - режим соединения с информационной базой (0 - +// разделяемый, 1 - монопольный), +// * РежимСоединенияСБазойДанных - Число - режим соединения с базой данных (0 - соединение не установлено, +// 1 - разделяемый, 2 - монопольный), +// * БлокировкаСУБД - Число - идентификатор соединения, блокирующего работу данного соединения в СУБД, +// * Передано - Число - объем данных, полученных и отправленных соединением, +// * ПереданоЗа5Минут - Число - объем данных, полученных и отправленных соединением за последние 5 минут, +// * СерверныхВызовов - Число - количество серверных вызовов, +// * СерверныхВызововЗа5Минут - Число - количество серверных вызовов соединения за последние 5 минут, +// * ПереданоСУБД - Число - объем данных, переданных между сервером 1С:Предприятия и сервером баз данных, +// с момента установки данного соединения, +// * ПереданоСУБДЗа5Минут - Число - объем данных, переданных между сервером 1С:Предприятия и сервером баз +// данных за последние 5 минут, +// * СоединениеСУБД - Строка - идентификатор процесса соединения с СУБД (если на момент получения списка +// соединений данное соединение выполняло обращение к серверу СУБД, в противном случае - значение равно пустой +// строке). Идентификатор возвращается в терминах сервера СУБД, +// * ВремяСУБД - Число - время в секундах, в течении которого выполняется обращение к серверу СУБД (если на момент +// получения списка соединений данное соединение выполняло обращение к серверу СУБД, в противном случае - значение +// равно 0), +// * МоментЗахватаСоединенияСУБД - Дата - (Дата и время) момент последнего захвата соединения с сервером СУБД, +// * ДлительностьСерверныхВызовов - Число - длительность всех серверных вызовов соединения, +// * ДлительностьВызововСУБД - Число - время вызовов СУБД, инициированных соединением, +// * ДлительностьТекущегоСерверногоВызова - Число - длительность текущего серверного вызова, +// * ДлительностьТекущегоВызоваСУБД - Число - длительность текущего вызова сервера СУБД, +// * ДлительностьСерверныхВызововЗа5Минут - Число - длительность серверных вызовов соединения за последние 5 минут, +// * ДлительностьВызововСУБДЗа5Минут - Число - длительность вызовов соединения СУБД за последние 5 минут. // Функция СвойстваСоединения() Экспорт @@ -555,45 +489,21 @@ // Возвращает описания соединений с информационной базой. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// Фильтр - Описание условия фильтрации соединения, описания которых требуется получить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСоединения(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений соединений с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства соединения. При ВидСравнения.ВСписке и -// ВидСравнения.НеВСписке в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор -// значений, с которыми будет выполняться сравнение. При ВидСравнения.Интервал, -// ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства соединения (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство. +// Фильтр - Массив - массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений +// соединений с указанным в условии фильтра, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства соединения, +// - Структура - структура: ключ - Имя свойства соединения (см. выше), значение - значение, с которым +// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. // -// Возвращаемое значение: Массив(Структура), массив структур, описывающих свойства соединений. Описание структур - -// см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения(). +// Возвращаемое значение: +// Массив - см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения. // Функция СоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено) Экспорт @@ -613,42 +523,18 @@ // Разрывает соединения с информационной базой по фильтру. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// Фильтр - Описание условия фильтрации соединений, которые требуется завершить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации разрываемых соединений. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСоединения(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений соединений с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства соединения. При ВидСравнения.ВСписке и -// ВидСравнения.НеВСписке в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор -// значений, с которыми будет выполняться сравнение. При ВидСравнения.Интервал, -// ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства соединения (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство. +// Фильтр - Массив - массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений +// соединений с указанным в условии фильтра, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства соединения, +// - Структура - структура: ключ - Имя свойства соединения (см. выше), значение - значение, с которым +// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. // Процедура РазорватьСоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено) Экспорт @@ -672,14 +558,13 @@ // Возвращает имя профиля безопасности, назначенного для информационной базы. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. // -// Возвращаемое значение: Строка, имя профиля безопасности, назначенного для информационной базы. Если +// Возвращаемое значение: +// Строка - имя профиля безопасности, назначенного для информационной базы. Если // для информационной базы не назначен профиль безопасности - возвращается пустая строка. // Функция ПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт @@ -700,16 +585,15 @@ // безопасного режима. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. // -// Возвращаемое значение: Строка, имя профиля безопасности, назначенного для информационной базы в качестве профиля -// безопасности безопасного режима. Если для информационной базы не назначен профиль безопасности - возвращается -// пустая строка. +// Возвращаемое значение: +// Строка - имя профиля безопасности, назначенного для информационной базы в качестве профиля +// безопасности безопасного режима. Если для информационной базы не назначен профиль безопасности - возвращается пустая +// строка. // Функция ПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт @@ -728,13 +612,11 @@ // Назначает для информационной базы использование профиля безопасности. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// ИмяПрофиля - Строка, имя профиля безопасности. Если передана пустая строка - для информационной базы будет +// ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет // отключено использование профиля безопасности. // Процедура УстановитьПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач ИмяПрофиля = "") Экспорт @@ -755,13 +637,11 @@ // Назначает для информационной базы использование профиля безопасности безопасного режима. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИБ - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИБ - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной // в качестве значения параметра ПараметрыАдминистрированияКластера. -// ИмяПрофиля - Строка, имя профиля безопасности. Если передана пустая строка - для информационной базы будет +// ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет // отключено использование профиля безопасности безопасного режима. // Процедура УстановитьПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач ИмяПрофиля = "") Экспорт @@ -782,9 +662,11 @@ // Проверяет существование в кластере серверов профиля безопасности. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ИмяПрофиля - Строка, имя профиля безопасности, существование которого проверяется. +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ИмяПрофиля - Строка - имя профиля безопасности, существование которого проверяется. +// +// Возвращаемое значение: +// Булево - Истина если профиль с указанным именем существует, Ложь - если не существует. // Функция ПрофильБезопасностиСуществует(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт @@ -798,52 +680,50 @@ // Конструктор структуры, описывающей свойства профиля безопасности. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя профиля безопасности, -// Описание - Строка, описание профиля безопасности, -// ПрофильБезопасногоРежима - Булево, определяет возможность использования профиля безопасности -// в качестве профиля безопасности безопасного режима (как при указании в качестве профиля -// безопасного режима для информационной базы, так и при вызове. -// УстановитьБезопасныйРежим(<Имя профиля>) из кода конфигурации, -// ПолныйДоступКПривилегированномуРежиму - Булево, определяет возможность установки -// привилегированного режима из безопасного режима данного профиля безопасности, -// ПолныйДоступКФайловойСистеме - Булево, определяет наличие ограничений на доступ к файловой -// системе. При установке значения равным Ложь, доступ будет предоставлен только к каталогам файловой -// системы, перечисленным в свойстве ВиртуальныеКаталоги, -// ПолныйДоступКCOMОбъектам - Булево, определяет наличие ограничений на доступ к использованию. -// COMОбъектов. При установке значения равным Ложь, доступ будет предоставлен только к COM-классам, -// перечисленным в свойстве COMКлассы, -// ПолныйДоступКВнешнимКомпонентам - Булево, определяет наличие ограничений на доступ к использованию -// внешних компонент. При установке значения равным Ложь, доступ будет предоставлен только к внешним -// компонентам, перечисленным в свойстве ВнешниеКомпоненты, -// ПолныйДоступКВнешнимМодулям - Булево, определяет наличие ограничений на доступ к использованию -// внешних модулей (внешние отчеты и обработки, вызовы Выполнить() и Вычислить()) в небезопасном режиме. -// При установке значения равным Ложь, будет предоставлена возможность использовать в небезопасном -// режиме только внешние модули, перечисленные в свойстве ВнешниеМодули, -// ПолныйДоступКПриложениямОперационнойСистемы - Булево, определяет наличие ограничений на доступ к -// использованию приложений операционной системы. При установке значения равным Ложь, будет предоставлена -// возможность использовать только приложения операционной системы, перечисленные в свойстве ПриложенияОС, -// ПолныйДоступКИнтернетРесурсам - Булево, определяет наличие ограничений на доступ к использованию. -// Интернет-ресурсов. При установке значения равным Ложь, будет предоставлена возможность использовать -// только Интернет-ресурсы, перечисленные в свойстве ИнтернетРесурсы, -// ВиртуальныеКаталоги - Массив(Структура), массив структур, описывающих виртуальные каталоги, к которых -// предоставляется доступ при установке ПолныйДоступКФайловойСистеме = Ложь. Описания полей структур - -// см. АдминистрированиеКластераКлиентСервер.СвойстваВиртуальногоКаталога(), -// COMКлассы - Массив(Структура), массив структур, описывающих COM-классы, к которым предоставляется -// доступ при установке ПолныйДоступКCOMОбъектам = Ложь. Описания полей структур - см. -// АдминистрированиеКластераКлиентСервер.СвойстваCOMКласса(), -// ВнешниеКомпоненты - Массив(Структура), массив структур, описывающих внешние компоненты, к которым предоставляется -// доступ при установке ПолныйДоступКВнешнимКомпонентам = Ложь. Описания полей структур - см. -// АдминистрированиеКластераКлиентСервер.СвойстваВнешнейКомпоненты(), -// ВнешниеМодули - Массив(Структура), массив структур, описывающих внешние модули, к которым предоставляется -// доступ в небезопасном режиме при установке ПолныйДоступКВнешнимМодулям = Ложь. Описания полей структур - см. -// АдминистрированиеКластераКлиентСервер.СвойстваВнешнегоМодуля(), -// ПриложенияОС - Массив(Структура), массив структур, описывающих приложения операционной системы, к которым -// предоставляется доступ при установке ПолныйДоступКПриложениямОперационнойСистемы = Ложь. Описания полей -// структур - см. АдминистрированиеКластераКлиентСервер.СвойстваПриложенияОС(), -// ИнтернетРесурсы - Массив(Структура), массив структур, описывающих Интернет-ресурсы, к которым предоставляется -// доступ при установке ПолныйДоступКИнтернетРесурсам = Ложь. Описания полей структур - см. -// АдминистрированиеКластераКлиентСервер.СвойстваИнтернетРесурса(). +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя профиля безопасности, +// * Описание - Строка - описание профиля безопасности, +// * ПрофильБезопасногоРежима - Булево - определяет возможность использования профиля безопасности +// в качестве профиля безопасности безопасного режима (как при указании в качестве профиля +// безопасного режима для информационной базы, так и при вызове УстановитьБезопасныйРежим(<Имя профиля>) из кода конфигурации, +// * ПолныйДоступКПривилегированномуРежиму - Булево - определяет возможность установки +// привилегированного режима из безопасного режима данного профиля безопасности, +// * ПолныйДоступКФайловойСистеме - Булево - определяет наличие ограничений на доступ к файловой +// системе. При установке значения равным Ложь, доступ будет предоставлен только к каталогам файловой +// системы, перечисленным в свойстве ВиртуальныеКаталоги, +// * ПолныйДоступКCOMОбъектам - Булево - определяет наличие ограничений на доступ к использованию +// COMОбъектов. При установке значения равным Ложь, доступ будет предоставлен только к COM-классам, +// перечисленным в свойстве COMКлассы, +// * ПолныйДоступКВнешнимКомпонентам - Булево - определяет наличие ограничений на доступ к использованию +// внешних компонент. При установке значения равным Ложь, доступ будет предоставлен только к внешним +// компонентам, перечисленным в свойстве ВнешниеКомпоненты, +// * ПолныйДоступКВнешнимМодулям - Булево - определяет наличие ограничений на доступ к использованию +// внешних модулей (внешние отчеты и обработки, вызовы Выполнить() и Вычислить()) в небезопасном режиме. +// При установке значения равным Ложь, будет предоставлена возможность использовать в небезопасном +// режиме только внешние модули, перечисленные в свойстве ВнешниеМодули, +// * ПолныйДоступКПриложениямОперационнойСистемы - Булево - определяет наличие ограничений на доступ к +// использованию приложений операционной системы. При установке значения равным Ложь, будет предоставлена +// возможность использовать только приложения операционной системы, перечисленные в свойстве ПриложенияОС, +// * ПолныйДоступКИнтернетРесурсам - Булево - определяет наличие ограничений на доступ к использованию +// Интернет-ресурсов. При установке значения равным Ложь, будет предоставлена возможность использовать +// только Интернет-ресурсы, перечисленные в свойстве ИнтернетРесурсы, +// * ВиртуальныеКаталоги - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваВиртуальногоКаталога), +// описывающих виртуальные каталоги, к которых предоставляется доступ при установке ПолныйДоступКФайловойСистеме = +// Ложь, +// * COMКлассы - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваCOMКласса), +// описывающих COM-классы, к которым предоставляется доступ при установке ПолныйДоступКCOMОбъектам = Ложь, +// * ВнешниеКомпоненты - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваВнешнейКомпоненты), +// описывающих внешние компоненты, к которым предоставляется доступ при установке ПолныйДоступКВнешнимКомпонентам +// = Ложь, +// * ВнешниеМодули - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваВнешнегоМодуля), +// описывающих внешние модули, к которым предоставляется доступ в небезопасном режиме при установке +// ПолныйДоступКВнешнимМодулям = Ложь, +// * ПриложенияОС - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваПриложенияОС), +// описывающих приложения операционной системы, к которым предоставляется доступ при установке +// ПолныйДоступКПриложениямОперационнойСистемы = Ложь, +// * ИнтернетРесурсы - Массив - массив структур (см. АдминистрированиеКластераКлиентСервер.СвойстваИнтернетРесурса), +// описывающих Интернет-ресурсы, к которым предоставляется доступ при установке ПолныйДоступКИнтернетРесурсам = Ложь. // Функция СвойстваПрофиляБезопасности() Экспорт @@ -874,13 +754,14 @@ // Конструктор структуры, описывающей свойства виртуального каталога. // -// Возвращаемое значение: Структура, поля: -// ЛогическийURL - Строка, логический URL каталога, -// ФизическийURL - Строка, физический URL каталога на сервере для размещения данных -// виртуального каталога. -// Описание - Строка, описание виртуального каталога, -// ЧтениеДанных - Булево, флаг разрешения чтения данных из виртуального каталога, -// ЗаписьДанных - Булево, флаг разрешения записи данных в виртуальный каталог. +// Возвращаемое значение: +// Структура - структура с полями: +// * ЛогическийURL - Строка - логический URL каталога, +// * ФизическийURL - Строка - физический URL каталога на сервере для размещения данных +// виртуального каталога, +// * Описание - Строка - описание виртуального каталога, +// * ЧтениеДанных - Булево - флаг разрешения чтения данных из виртуального каталога, +// * ЗаписьДанных - Булево - флаг разрешения записи данных в виртуальный каталог. // Функция СвойстваВиртуальногоКаталога() Экспорт @@ -900,14 +781,15 @@ // Конструктор структуры, описывающей свойства COM-класса. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя COM-класса, используется в качестве ключа при поиске, -// Описание - Строка, описание COM-класса, -// ФайлМоникер - Строка, имя файла, по которому создается объект методом глобального контекста. -// ПолучитьCOMОбъект() с пустым значением второго параметра, -// CLSID - Строка, представление идентификатора COM-класса в формате системного реестра MS Windows -// без фигурных скобок, по которому он может быть создан операционной системой, -// Компьютер - Строка, имя компьютера, на котором может быть создан COM-объект. +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя COM-класса, используется в качестве ключа при поиске, +// * Описание - Строка - описание COM-класса, +// * ФайлМоникер - Строка - имя файла, по которому создается объект методом глобального +// контекста ПолучитьCOMОбъект() с пустым значением второго параметра, +// * CLSID - Строка - представление идентификатора COM-класса в формате системного реестра MS Windows +// без фигурных скобок, по которому он может быть создан операционной системой, +// * Компьютер - Строка - имя компьютера, на котором может быть создан COM-объект. // Функция СвойстваCOMКласса() Экспорт @@ -926,11 +808,12 @@ // Конструктор структуры, описывающей свойства внешней компоненты. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя внешней компоненты, используется в качестве ключа для поиска, -// Описание - Строка, описание внешней компоненты, -// ХэшСумма - Строка, контрольная сумма разрешенной внешней компоненты, вычисленная алгоритмом. -// SHA-1 и преобразованная к строке base64. +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя внешней компоненты, используется в качестве ключа для поиска, +// * Описание - Строка -описание внешней компоненты, +// * ХэшСумма - Строка - контрольная сумма разрешенной внешней компоненты, вычисленная алгоритмом +// SHA-1 и преобразованная к строке base64. // Функция СвойстваВнешнейКомпоненты() Экспорт @@ -947,11 +830,12 @@ // Конструктор структуры, описывающей свойства внешнего модуля. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя внешнего модуля, используется в качестве ключа для поиска, -// Описание - Строка, описание внешнего модуля, -// ХэшСумма - Строка, контрольная сумма разрешенного внешнего модуля, вычисленная алгоритмом. -// SHA-1 и преобразованная к строке base64. +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя внешнего модуля, используется в качестве ключа для поиска, +// * Описание - Строка - описание внешнего модуля, +// * ХэшСумма - Строка - контрольная сумма разрешенного внешнего модуля, вычисленная алгоритмом +// SHA-1 и преобразованная к строке base64. // Функция СвойстваВнешнегоМодуля() Экспорт @@ -968,11 +852,12 @@ // Конструктор структуры, описывающей свойства приложения операционной системы. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя приложения операционной системы, используется в качестве ключа для поиска, -// Описание - Строка, описание приложения операционной системы, -// ШаблонСтрокиЗапуска - Строка, шаблон строки запуска приложения (состоит из последовательности -// шаблонных слов, разделенных пробелами). +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя приложения операционной системы, используется в качестве ключа для поиска, +// * Описание - Строка - описание приложения операционной системы, +// * ШаблонСтрокиЗапуска - Строка - шаблон строки запуска приложения (состоит из последовательности +// шаблонных слов, разделенных пробелами). // Функция СвойстваПриложенияОС() Экспорт @@ -989,19 +874,20 @@ // Конструктор структуры, описывающей Интернет-ресурс. // -// Возвращаемое значение: Структура, поля: -// Имя - Строка, имя Интернет-ресурса, используется в качестве ключа для поиска, -// Описание - Строка, описание Интернет-ресурса, -// Протокол - Строка, разрешаемый сетевой протокол. Возможные значения: -// HTTP, -// HTTPS, -// FTP, -// FTPS, -// POP3, -// SMTP, -// IMAP, -// Адрес - Строка, сетевой адрес Интернет-ресурса без указания протокола и порта, -// Порт - Число, сетевой порт Интернет-ресурса. +// Возвращаемое значение: +// Структура - структура с полями: +// * Имя - Строка - имя Интернет-ресурса, используется в качестве ключа для поиска, +// * Описание - Строка - описание Интернет-ресурса, +// * Протокол - Строка - разрешаемый сетевой протокол. Возможные значения: +// HTTP, +// HTTPS, +// FTP, +// FTPS, +// POP3, +// SMTP, +// IMAP, +// * Адрес - Строка - сетевой адрес Интернет-ресурса без указания протокола и порта, +// * Порт - Число - сетевой порт Интернет-ресурса. // Функция СвойстваИнтернетРесурса() Экспорт @@ -1021,12 +907,11 @@ // Возвращает свойства профиля безопасности. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ИмяПрофиля - Строка, имя профиля безопасности. +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ИмяПрофиля - Строка - имя профиля безопасности. // -// Возвращаемое значение: Структура, описывающая профиль безопасности, описание - см. -// АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности(). +// Возвращаемое значение: +// Структура - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности. // Функция ПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт @@ -1041,10 +926,8 @@ // Создает профиль безопасности по переданному описанию. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// СвойстваПрофиляБезопасности - Структура, описывающая свойства создаваемого профиля безопасности, -// описание - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// СвойстваПрофиляБезопасности - Структура - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности. // Процедура СоздатьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности) Экспорт @@ -1059,10 +942,8 @@ // Устанавливает свойства для существующего профиля безопасности по переданному описанию. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// СвойстваПрофиляБезопасности - Структура, описывающая устанавливаемые для профиля безопасности свойства, -// описание - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// СвойстваПрофиляБезопасности - Структура - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности. // Процедура УстановитьСвойстваПрофиляБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности) Экспорт @@ -1077,9 +958,8 @@ // Удаляет профиль безопасности. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ИмяПрофиля - Строка, имя профиля безопасности. +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ИмяПрофиля - Строка - имя профиля безопасности. // Процедура УдалитьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт @@ -1098,13 +978,12 @@ // Возвращает внутренний идентификатор информационной базы. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ПараметрыАдминистрированияИнформационнойБазы - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ПараметрыАдминистрированияИнформационнойБазы - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. // -// Возвращаемое значение: Строка, внутренний идентификатор информационной базы. +// Возвращаемое значение: +// Строка - внутренний идентификатор информационной базы. // Функция ИдентификаторИнформационнойБазы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИнформационнойБазы) Экспорт @@ -1120,12 +999,12 @@ // Возвращает описания информационных баз. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// Фильтр - Структура, параметры фильтрации информационных баз. +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// Фильтр - Структура - параметры фильтрации информационных баз. // -// Возвращаемое значение: Массив(Структура). +// Возвращаемое значение: +// Массив - массив структур (свойств информационной базы). // Функция СвойстваИнформационныхБаз(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено) Экспорт @@ -1145,10 +1024,10 @@ // Возвращает внутренний идентификатор кластера серверов. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(). +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера. // -// Возвращаемое значение - Строка, внутренний идентификатор кластера серверов. +// Возвращаемое значение: +// Строка - внутренний идентификатор кластера серверов. // Функция ИдентификаторКластера(Знач ПараметрыАдминистрированияКластера) Экспорт @@ -1160,11 +1039,12 @@ // Возвращает описания кластеров серверов. // -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// Фильтр - Структура, параметры фильтрации кластеров серверов. +// Параметры: +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// Фильтр - Структура - параметры фильтрации кластеров серверов. // -// Возвращаемое значение: Массив(Структура). +// Возвращаемое значение: +// Массив - массив структур (свойств кластеров). // Функция СвойстваКластеров(Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено) Экспорт @@ -1181,12 +1061,12 @@ // Возвращает описания рабочих процессов. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// Фильтр - Структура, параметры фильтрации рабочих процессов. +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// Фильтр - Структура - параметры фильтрации рабочих процессов. // -// Возвращаемое значение: Массив(Структура). +// Возвращаемое значение: +// Массив - массив структур (свойств рабочих процессов). // Функция СвойстваРабочихПроцессов(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено) Экспорт @@ -1202,12 +1082,12 @@ // Возвращает описания рабочих серверов. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// Фильтр - Структура, параметры фильтрации рабочих серверов. +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// Фильтр - Структура - параметры фильтрации рабочих серверов. // -// Возвращаемое значение: Массив(Структура). +// Возвращаемое значение: +// Массив - массив структур (свойств рабочих процессов). // Функция СвойстваРабочихСерверов(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено) Экспорт @@ -1225,47 +1105,25 @@ // Возвращает описания сеансов информационной базы. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ИдентификаторИнформационнойБазы - Строка, внутренний идентификатор информационной базы, -// ПараметрыАдминистрированияИнформационнойБазы - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(). -// Фильтр - Описание условия фильтрации сеансов, описания которых требуется получить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации сеансов. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСеанса(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений сеансов с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства сеанса (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство, -// ИспользоватьСловарь - Булево, если Истина - возвращаемый результат будет заполнен с использован словаря, иначе - без +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ИдентификаторИнформационнойБазы - Строка - внутренний идентификатор информационной базы, +// Фильтр - Массив - массив структур, описывающих условия фильтрации сеансов. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства сеанса. +// - Структура - структура: ключ - Имя свойства сеанса (см. выше), значение - значение, с которым +// выполняется сеанс. При использовании данного варианта описания фильтра сравнение всегда выполняется на +// равенство. +// ИспользоватьСловарь - Булево - если Истина, то возвращаемый результат будет заполнен с использован словаря, иначе - без // использования. // -// Возвращаемое значение: Массив(Структура), Массив(Соответствие) - массив структур, описывающих свойства сеансов -// (описание структур - см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса()) или массив соответствий, -// описывающих свойства сеансов в нотации утилиты rac (при ИспользоватьСловарь = Ложь). +// Возвращаемое значение: +// - Массив(Структура) - Массив - структур (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса), описывающих +// свойства сеансов, +// - Массив(Соответствие) - Массив - соответствий (см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса), +// описывающих свойства сеансов в нотации утилиты rac (при ИспользоватьСловарь = Ложь). // Функция СвойстваСеансов(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач ИдентификаторИнформационнойБазы, Знач Фильтр = Неопределено, Знач ИспользоватьСловарь = Истина) Экспорт @@ -1283,48 +1141,26 @@ // Возвращает описания соединений с информационной базой. // // Параметры: -// ИдентификаторКластера - Строка, внутренний идентификатор кластера серверов, -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(), -// ИдентификаторИнформационнойБазы - Строка, внутренний идентификатор информационной базы, -// ПараметрыАдминистрированияИнформационнойБазы - Структура, описывающая параметры подключения к информационной базе, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(), -// Фильтр - Описание условия фильтрации соединения, описания которых требуется получить. -// Варианты: -// 1. Массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация. Допустимые значения - см. -// Возвращаемое значение функции АдминистрированиеКластераКлиентСервер.СвойстваСоединения(), -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений соединений с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства соединения. При ВидСравнения.ВСписке и -// ВидСравнения.НеВСписке в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор -// значений, с которыми будет выполняться сравнение. При ВидСравнения.Интервал, -// ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства соединения (см. выше), значение - значение, с которым -// выполняется сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на -// равенство, -// ИспользоватьСловарь - Булево, если Истина - возвращаемый результат будет заполнен с использован словаря, иначе - без +// ИдентификаторКластера - Строка - внутренний идентификатор кластера серверов, +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера, +// ИдентификаторИнформационнойБазы - Строка - внутренний идентификатор информационной базы, +// ПараметрыАдминистрированияИнформационнойБазы - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. +// Фильтр - Массив - массив структур, описывающих условия фильтрации соединений. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация (см. АдминистрированиеКластераКлиентСервер.СвойстваСоединений), +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства соединения. +// - Структура - структура: ключ - Имя свойства соединения (см. выше), значение - значение, с которым +// выполняется соединение. При использовании данного варианта описания фильтра сравнение всегда выполняется на +// равенство. +// ИспользоватьСловарь - Булево - если Истина - возвращаемый результат будет заполнен с использован словаря, иначе - без // использования. // -// Возвращаемое значение: Массив(Структура), Массив(Соответствие) - массив структур, описывающих свойства соединений -// (описание структур - см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения()) или массив соответствий, -// описывающих свойства соединений в нотации утилиты rac (при ИспользоватьСловарь = Ложь). +// Возвращаемое значение: +// - Массив(Структура) - Массив - структур (см. АдминистрированиеКластераКлиентСервер.СвойстваСоединений), описывающих +// свойства соединений, +// - Массив(Соответствие) - Массив - соответствий (см. АдминистрированиеКластераКлиентСервер.СвойстваСоединений), +// описывающих свойства соединений в нотации утилиты rac (при ИспользоватьСловарь = Ложь). // Функция СвойстваСоединений(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач ИдентификаторИнформационнойБазы, Знач ПараметрыАдминистрированияИнформационнойБазы, Знач Фильтр = Неопределено, Знач ИспользоватьСловарь = Ложь) Экспорт @@ -1342,8 +1178,11 @@ // Возвращает путь к консольному клиенту сервера администрирования. // +// Параметры: +// ПараметрыАдминистрированияКластера - Структура - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера. +// // Возвращаемое значение: -// Строка, путь к консольному клиенту сервера администрирования. +// Строка - путь к консольному клиенту сервера администрирования. // Функция ПутьККлиентуСервераАдминистрирования(Знач ПараметрыАдминистрированияКластера) Экспорт @@ -1359,6 +1198,19 @@ // Добавляет к фильтру новое условие. // +// Параметры: +// Фильтр - Массив - массив структур, описывающих условия фильтрации. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация, +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства. +// - Структура - структура: ключ - Имя свойства, значение - значение. +// При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. +// Свойство - - Строка - имя свойства, по которому осуществляется фильтрация, +// ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства. +// Процедура ДобавитьУсловиеФильтра(Фильтр, Знач Свойство, Знач ВидСравненияЗначений, Знач Значение) Экспорт Если Фильтр = Неопределено Тогда @@ -1395,7 +1247,7 @@ Иначе - ВызватьИсключение НСтр("ru = 'Некорректно задано описание фильтра!'"); + ВызватьИсключение НСтр("ru = 'Некорректно задано описание фильтра.'"); КонецЕсли; @@ -1405,38 +1257,19 @@ // // Параметры: // ПроверяемыйОбъект - Структура: -// Ключ - Имя свойства,значение которого сравнивается с фильтром, -// Значение - Значение свойства, которое сравнивается с фильтром, -// Фильтр - Описание условия фильтрации объектов. -// Варианты: -// 1. Массив структур, описывающих условия фильтра. Поля структур, входящих в массив: -// Свойство - Строка, имя свойства, по которому осуществляется фильтрация, -// ВидСравнения - значение системного перечисления ВидСравнения, вид сравнения значений с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), -// Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается значение соответствующего свойства. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение, -// 2. Структура (упрощенный вариант), ключ - Имя свойства (см. выше), значение - значение, с которым выполняется -// сравнение. При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. +// * Ключ - Имя свойства,значение которого сравнивается с фильтром, +// * Значение - Значение свойства, которое сравнивается с фильтром, +// Фильтр - Массив - массив структур, описывающих условия фильтрации. Поля структур, входящих в массив: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация, +// * ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, +// * Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым +// сравнивается значение соответствующего свойства. +// - Структура - структура: ключ - Имя свойства, значение - значение. +// При использовании данного варианта описания фильтра сравнение всегда выполняется на равенство. // -// Возвращаемое значение: Булево, Истина если значения свойств объекта удовлетворяют условиям, указанным в фильтре, -// Ложь - если не удовлетворяют. +// Возвращаемое значение: +// Булево - Истина если значения свойств объекта удовлетворяют условиям, указанным в фильтре, +// Ложь - если не удовлетворяют. // Функция ПроверитьУсловияФильтра(Знач ПроверяемыйОбъект, Знач Фильтр = Неопределено) Экспорт @@ -1462,7 +1295,7 @@ Иначе - ВызватьИсключение НСтр("ru = 'Некорректно задан фильтр!'"); + ВызватьИсключение НСтр("ru = 'Некорректно задан фильтр.'"); КонецЕсли; @@ -1485,29 +1318,12 @@ // // Параметры: // ПроверяемоеЗначение - Число, Строка, Дата, Булево - значение, которое сравнивается с условием, -// ВидСравненияЗначений - значение системного перечисления ВидСравнения, вид сравнения значений с указанным -// в условии фильтра. Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений), +// ВидСравнения - ВидСравнения - значение системного перечисления ВидСравнения, // Значение - Число, Строка, Дата, Булево, СписокЗначений, Массив, Структура - значение, с которым -// сравнивается проверяемое значение. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение. +// сравнивается значение соответствующего свойства. // -// Возвращаемое значение: Булево, Истина если значение удовлетворяет условиям, Ложь - если не удовлетворяет. +// Возвращаемое значение: +// Булево - Истина если значение удовлетворяет условиям, Ложь - если не удовлетворяет. // Функция ПроверитьУсловиеФильтра(Знач ПроверяемоеЗначение, Знач ВидСравненияЗначений, Знач Значение) @@ -1583,10 +1399,10 @@ // серверов, соответствующий типу подключения к администрируемому кластеру серверов. // // Параметры: -// ПараметрыАдминистрированияКластера - Структура, описывающая параметры подключения к кластеру серверов, -// описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(). +// ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера. // -// Возвращаемое значение: ОбщийМодуль. +// Возвращаемое значение: +// ОбщийМодуль - менеджер общего модуля. // Функция МенеджерАдминистрирования(Знач ПараметрыАдминистрирования) @@ -1600,7 +1416,7 @@ Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неизвестный тип подключения: %1!'"), ПараметрыАдминистрирования.ТипПодключения); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неизвестный тип подключения: %1.'"), ПараметрыАдминистрирования.ТипПодключения); КонецЕсли; @@ -1608,7 +1424,8 @@ // Возвращает дату, соответствующую пустой дате в реестре кластера серверов. // -// Возвращаемое значение: Дата(Дата и время). +// Возвращаемое значение: +// Дата(Дата и время) - пустая дата. // Функция ПустаяДата() Экспорт diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl index d9c0932cc..67a848271 100644 --- a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl @@ -1,16 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет наименование с сокращением региона по его коду. // // Параметры: -// КодСубъектаРФ - Число, Строка - код региона. +// КодСубъектаРФ - Число, Строка - код региона. Например, 50. // // Возвращаемое значение: -// Строка - наименование и сокращение региона. +// Строка - наименование и сокращение региона. Например, "Московская обл". // Неопределено - если регион не найден. // Функция НаименованиеРегионаПоКоду(КодСубъектаРФ) Экспорт @@ -48,10 +44,11 @@ // Возвращает код региона по наименованию. // // Параметры: -// Название - Строка - наименование или полное наименование (с сокращением) региона. +// Название - Строка - Наименование или полное наименование (с сокращением) региона. +// Например, "Московская" или Московская обл". // // Возвращаемое значение: -// Число - код региона. +// Число - код региона, например, 50. // Неопределено - если данные не найдены. // Функция КодРегионаПоНаименованию(Название) Экспорт @@ -114,31 +111,34 @@ Возврат Неопределено; КонецФункции -// Возвращает информацию по всем известным субъектам РФ (как классификатор так и загруженные). +// Возвращает информацию о субъектах РФ определенных в федеральной информационной адресной системе. // // Возвращаемое значение: -// ТаблицаЗначений - поставляемые данные. Содержит колонки: -// * КодСубъектаРФ - Число - код классификатора субъекта, например 77 для Москвы. -// * Наименование - Строка - наименование субъекта по классификатору. Например "Московская". -// * Сокращение - Строка - наименование субъекта по классификатору. Например "обл". -// * ПочтовыйИндекс - Число - индекс региона. Если 0 - то индекс не определен. -// * Идентификатор - УникальныйИдентификатор - идентификатор ФИАС. +// ТаблицаЗначений - сведения о субъектах(регионах) РФ: +// * КодСубъектаРФ - Число - Код субъекта, например 77 для Москвы. +// * Наименование - Строка - Наименование субъекта. Например "Московская". +// * Сокращение - Строка - Сокращение субъекта. Например "обл". +// * ПочтовыйИндекс - Число - Индекс региона. Если 0 - то индекс не определен. +// * Идентификатор - УникальныйИдентификатор - Уникальный идентификационный код адресного объекта. // -Функция КлассификаторСубъектовРФ() Экспорт +Функция СубъектыРФ() Экспорт Возврат РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); КонецФункции -// Определяет количество субъектов РФ, по которым загружен адресный классификатор. +// Возвращает количество загруженных в адресный классификатор субъектов РФ. +// Т.к. при использовании веб-сервиса фирмы 1С предоставляющего через интернет сведения об +// адресах РФ в формате ФИАС всегда доступны адресные сведения по всем регионам РФ, +// то возвращает общее количество субъектов РФ. // // Возвращаемое значение: -// Число - количество регионов с загруженными данными. +// Число - количество субъектов РФ содержащих загруженные адресные сведения в адресном классификаторе. // Функция КоличествоЗагруженныхРегионов() Экспорт Если АдресныйКлассификаторСлужебный.ИсточникДанныхАдресногоКлассификатораВебСервис() Тогда - Возврат КлассификаторСубъектовРФ().Количество(); + Возврат СубъектыРФ().Количество(); КонецЕсли; Запрос = Новый Запрос(" @@ -176,12 +176,15 @@ Возврат 0; КонецФункции -// Проверка загруженности адресного классификатора. +// Определяет наличие адресных сведений в адресном классификаторе. +// При использовании веб-сервиса фирмы 1С предоставляющего через интернет сведения об +// адресах РФ в формате ФИАС всегда возвращает Истина. // // Возвращаемое значение: -// Булево - Истина, если адресный классификатор загружен хотя бы по одному региону, Ложь - в противном случае. +// Булево - Истина, если адресный классификатор содержит сведения хотя бы по одному региону. +// Ложь, если адресные сведения отсутствуют. // -Функция КлассификаторЗагружен() Экспорт +Функция АдресныйКлассификаторЗагружен() Экспорт Если АдресныйКлассификаторСлужебный.ИсточникДанныхАдресногоКлассификатораВебСервис() Тогда Возврат Истина; @@ -199,32 +202,43 @@ Возврат Не Запрос.Выполнить().Пустой(); КонецФункции -// Проверяет адреса на соответствие классификатору. +// Проверяет адреса на соответствие адресному классификатору +// и возвращает подходящие варианты содержащие сведения об адресе. // // Параметры: // Адреса - Массив - проверяемые адреса. Содержит структуры с полями: -// * Адрес - ОбъектXDTO, Строка - Проверяемый адрес -// ((http://www.v8.1c.ru/ssl/contactinfo) АдресРФ) или его -// XML-сериализация. -// * ФорматАдреса - Строка - Тип используемого для проверки по классификатору. Если "КЛАДР", то проверка -// ведется только по уровням КЛАДР. +// * Адрес - ОбъектXDTO, Строка - Проверяемый адрес как объект XDTO Адрес +// (http://www.v8.1c.ru/ssl/contactinfo) или его +// XML-сериализация соответствующая структуре XDTO-пакета. +// * ФорматАдреса - Строка - Формат адреса. Варианты: +// * ФИАС адрес проверяется по всем уровням адреса. +// * КЛАДР, у адреса не проверяются на соответствие номера домов, округа, +// внутригородские районы, доп. территории и элементы доп. территорий. // // Возвращаемое значение: // Массив - результаты анализа. Каждый элемент массива содержит структуры с полями: -// * Ошибки - Массив - Описание ошибок поиска в классификаторе. Состоит из структур с полями. -// ** Ключ - Строка - Служебный идентификатор места ошибки - путь XPath в объекте XDTO. -// ** Текст - Строка - Текст ошибки. +// * Ошибки - Массив - Описание ошибок поиска в классификаторе. Состоит из массива структур с полями: +// ** Ключ - Строка - Служебный идентификатор места ошибки - путь XPath в объекте XDTO. +// ** Текст - Строка - Текст ошибки. // ** Подсказка - Строка - Текст возможного исправления ошибки. -// * Варианты - Массив - Содержит описание найденных вариантов. Каждый элемент - структура с полями. -// ** Идентификатор - УникальныйИдентификатор - идентификатор классификатора объекта - варианта. -// ** Индекс - Число - Почтовый индекс объекта - варианта. +// * Варианты - Массив - Содержит описание найденных вариантов в виде массива структур с полями: +// ** Идентификатор - УникальныйИдентификатор - Уникальный идентификационный код адресного объекта ФИАС. +// ** Индекс - Число - Почтовый индекс адресного объекта. // ** КодКЛАДР - Число - Код КЛАДР ближайшего объекта. -// ** OKATO - Число - Данные ФНС. -// ** ОКТМО - Число - Данные ФНС. -// ** КодИФНСФЛ - Число - Данные ФНС. -// ** КодИФНСЮЛ - Число - Данные ФНС. -// ** КодУчасткаИФНСФЛ - Число - Данные ФНС. -// ** КодУчасткаИФНСЮЛ - Число - Данные ФНС. +// ** OKATO - Число - Код общероссийского классификатора объектов административно-территориального деления. +// ** ОКТМО - Число - Код общероссийского классификатора территорий муниципальных образований. +// ** КодИФНСФЛ - Строка - Код инспекции ФНС обслуживающего физических лиц. +// ** КодИФНСЮЛ - Строка - Код инспекции ФНС обслуживающего юридические лица. +// ** КодУчасткаИФНСФЛ - Строка - Код территориального участка инспекции ФНС обслуживающего физических лиц. +// ** КодУчасткаИФНСЮЛ - Строка - Код территориального участка инспекции ФНС обслуживающего юридические лица. +// +// Пример: +// СтруктураПроверки = Новый Структура("Адрес, ФорматАдреса", Адрес, "ФИАС"); +// РезультатыПроверки = АдресныйКлассификатор.ПроверитьАдреса(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПроверки)); +// +// Если РезультатыПроверки.Количество() > 0 И РезультатыПроверки.Варианты.Количество() > 0 Тогда +// КодКЛАДР = РезультатыПроверки.Варианты[0].КодКЛАДР; +// КонецЕсли; // Функция ПроверитьАдреса(Адреса) Экспорт @@ -237,11 +251,11 @@ // Если уровень не указан, то возвращает первое найденное совпадение. // // Параметры: -// АдресноеСокращение - Строка - сокрушение адресного объекта. -// Уровень - Число - код уровня адресного объекта. +// АдресноеСокращение - Строка - сокрушение адресного объекта. Например, "г". +// Уровень - Число - код уровня адресного объекта. Например, для уровня города 4. // // Возвращаемое значение: -// Строка - полное наименование адресного объекта +// Строка - полное наименование адресного объекта. Например, "город". // Неопределено - если сокращение не найдено. // Функция ПолноеНаименованиеАдресногоСокращения(АдресноеСокращение, Уровень = Неопределено) Экспорт @@ -271,36 +285,68 @@ КонецФункции -// Определение кодов ОКАТО, ОКТМО, налоговых инспекций ФНС и др. адреса +// Определение кодов ОКТМО, ОКАТО, налоговых инспекций ФНС и др. адреса +// Возвращает коды адресного объекта. // // Параметры: -// Адрес - Строка - Адрес в формате XML -// Источник - Строка - Необязательный. Источник получения кодов адреса: -// "Сервис1С" - коды будут получены через веб-сервис 1С; -// "ЗагруженныеДанные" - коды будут определены по загруженным данным адресного классификатора; -// если параметрам не указан, то источник данных определяется автоматически. +// Адрес - Строка - XML соответствующий структуре XDTO-пакета Адрес. +// Источник - Строка - Источник получения кодов адреса: +// "Сервис1С" - коды будут получены через веб-сервис 1С предоставляющего сведения об адресах РФ в формате ФИАС; +// "ЗагруженныеДанные" - коды будут определены по загруженным данным адресного классификатора. +// Если параметр не указан, то источник данных определяется автоматически. // Возвращаемое значение: -// Структура - Коды адреса, если адрес не найден, то все поля структуры содержат пустые значения. +// Структура - Коды адреса. Если адрес не найден, то поля структуры содержат пустые значения. +// * Идентификатор - Строка - Уникальный идентификационный код адресного объекта ФИАС. +// * КодКЛАДР - Строка - Код классификатор адресов России (КЛАДР). +// * КодИФНСФЛ - Строка - Код инспекции ФНС обслуживающего физических лиц. +// * КодИФНСЮЛ - Строка - Код инспекции ФНС обслуживающего юридические лица. +// * КодУчасткаИФНСФЛ - Строка - Код территориального участка инспекции ФНС обслуживающего физических лиц. +// * КодУчасткаИФНСЮЛ - Строка - Код территориального участка инспекции ФНС обслуживающего юридические лица. +// * OKATO - Строка - Код общероссийского классификатора объектов административно-территориального деления. +// * ОКТМО - Строка - Код общероссийского классификатора территорий муниципальных образований. // Функция КодыАдреса(Адрес, Источник = Неопределено) Экспорт Возврат АдресныйКлассификаторСлужебный.КодыАдреса(Адрес, Источник); КонецФункции -// Получает идентификаторы адреса через веб-сервис. +// Возвращает идентификационный код дома и адресного объекта с помощью веб-сервиса фирмы 1С предоставляющего +// сведения об адресах РФ в формате ФИАС. Для получения идентификаторов требуется подключение +// к Интернет-поддержке пользователей и наличие постоянного соединения с интернетом, +// т.к. адресные сведения, загруженные в программу, не используются. // // Параметры: -// Адрес - Строка - Строка XML контактной информации содержащая адрес. +// Адрес - Строка - XML соответствующий структуре XDTO-пакета Адрес, содержащий адрес, +// для которого требуется определить идентификационные коды. // Возвращаемое значение: -// Структура - набор пар ключ-значение. -// * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Идентификатор адресного объекта (улицы, нас. пункта). -// * ИдентификаторДома - УникальныйИдентификатор - Идентификатор дома адресного объекта. -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен иначе Неопределено. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен иначе Неопределено. +// Структура - со свойствами: +// * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Идентификационный код адресного объекта (улицы, +// нас. пункта). +// * ИдентификаторДома - УникальныйИдентификатор - Идентификационный код дома адресного объекта. +// * Отказ - Булево - Если Истина, то при работе с веб-сервисом возникла ошибка. +// * ПодробноеПредставлениеОшибки - Строка - Полное описание ошибки, если при работе с веб-сервисом возникла +// ошибка, иначе Неопределено. +// * КраткоеПредставлениеОшибки - Строка - Краткое описание ошибки, если при работе с веб-сервисом возникла +// ошибка, иначе Неопределено. // Функция ИдентификаторыАдреса(Адрес) Экспорт Возврат АдресныйКлассификаторСлужебный.ОпределитьИдентификаторыАдреса(Адрес); КонецФункции +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать АдресныйКлассификатор.АдресныйКлассификаторЗагружен. +// Определяет наличие адресных сведений в адресном классификаторе. +// При использовании веб-сервиса фирмы 1С предоставляющего через интернет сведения об +// адресах РФ в формате ФИАС всегда возвращает Истина. +// +// Возвращаемое значение: +// Булево - Истина, если адресный классификатор содержит сведения хотя бы по одному региону. +// Ложь, если адресные сведения отсутствуют. +// +Функция КлассификаторЗагружен() Экспорт + Возврат АдресныйКлассификаторЗагружен(); +КонецФункции + #КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl index dc63a0ed2..1f84091f5 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl @@ -1,32 +1,34 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор" в модели сервиса. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( - "АдресныйКлассификаторВМоделиСервисаСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "АдресныйКлассификаторВМоделиСервисаСлужебный"); - КонецЕсли; + ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); КонецПроцедуры -// Регистрирует обработчики поставляемых данных за день и за все время. -// -Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) Экспорт +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "ФИАС"; - Обработчик.КодОбработчика = "ФИАС"; - Обработчик.Обработчик = АдресныйКлассификаторВМоделиСервисаСлужебный; + Типы.Добавить(Метаданные.Константы.ИсточникДанныхАдресногоКлассификатора); + + МетаданныеРегистров = Метаданные.РегистрыСведений; + + Типы.Добавить(МетаданныеРегистров.АдресныеОбъекты); + Типы.Добавить(МетаданныеРегистров.ДомаЗданияСтроения); + Типы.Добавить(МетаданныеРегистров.ДополнительныеАдресныеСведения); + Типы.Добавить(МетаданныеРегистров.ЗагруженныеВерсииАдресныхСведений); + Типы.Добавить(МетаданныеРегистров.ИсторияАдресныхОбъектов); + Типы.Добавить(МетаданныеРегистров.ОриентирыАдресныхОбъектов); + Типы.Добавить(МетаданныеРегистров.ПричиныИзмененияАдресныхСведений); + Типы.Добавить(МетаданныеРегистров.СлужебныеАдресныеСведения); + Типы.Добавить(МетаданныеРегистров.УровниСокращенийАдресныхСведений); + + Типы.Добавить(МетаданныеРегистров.УдалитьАдресныйКлассификатор); КонецПроцедуры @@ -35,8 +37,8 @@ // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево, возвращаемое. +// Дескриптор - ОбъектXDTO - Дескриптор. +// Загружать - Булево - Истина, если загружать, Ложь - иначе. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -51,8 +53,8 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено. Полное имя извлеченного файла. Файл будет автоматически удален +// Дескриптор - ОбъектXDTO - Дескриптор. +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. // @@ -66,6 +68,9 @@ // Вызывается при отмене обработки данных в случае сбоя. // +// Параметры: +// Дескриптор - ОбъектXDTO - Дескриптор. +// Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт КонецПроцедуры @@ -74,6 +79,26 @@ #Область СлужебныеПроцедурыИФункции +// Регистрирует обработчики поставляемых данных за день и за все время. +// +// Параметры: +// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки. +// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. +// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. +// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры: +// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт +// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт +// ОбработкаДанныхОтменена(Дескриптор) Экспорт +// +Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "ФИАС"; + Обработчик.КодОбработчика = "ФИАС"; + Обработчик.Обработчик = АдресныйКлассификаторВМоделиСервисаСлужебный; + +КонецПроцедуры + Функция ПараметрыФИАС() Возврат Новый Структура("Версия, Регион"); @@ -84,11 +109,12 @@ ПараметрыВерсии = ПараметрыФИАС(); + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); Для Каждого Характеристика Из Дескриптор.Properties.Property Цикл Если Характеристика.Code = "Регион" Тогда - ПараметрыВерсии.Регион = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Характеристика.Value); + ПараметрыВерсии.Регион = ОписаниеТипаЧисло.ПривестиЗначение(Характеристика.Value); ИначеЕсли Характеристика.Code = "Версия" Тогда - ПараметрыВерсии.Версия = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Характеристика.Value); + ПараметрыВерсии.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Характеристика.Value); КонецЕсли; КонецЦикла; @@ -98,6 +124,7 @@ Функция ОписаниеПоследнейЗагрузкиФИАС(Знач КодРегиона) + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); Результат = ПараметрыФИАС(); Запрос = Новый Запрос(); @@ -113,7 +140,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда - Результат.Версия = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Выборка.Версия); + Результат.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Выборка.Версия); Результат.Регион = Выборка.Регион; КонецЕсли; @@ -175,57 +202,4 @@ КонецПроцедуры -// Обработчики событий подсистем БСП. - -// Зарегистрировать обработчики поставляемых данных. -// -// При получении уведомления о доступности новых общих данных, вызывается процедуры. -// ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. -// В процедуру передается Дескриптор - ОбъектXDTO Descriptor. -// -// В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, -// данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. -// ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. -// Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. -// -// Параметры: -// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки. -// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. -// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. -// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры: -// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт -// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт -// ОбработкаДанныхОтменена(Дескриптор) Экспорт -// -Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - - ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив - заполняется метаданными. -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.Константы.ИсточникДанныхАдресногоКлассификатора); - - МетаданныеРегистров = Метаданные.РегистрыСведений; - - Типы.Добавить(МетаданныеРегистров.АдресныеОбъекты); - Типы.Добавить(МетаданныеРегистров.ДомаЗданияСтроения); - Типы.Добавить(МетаданныеРегистров.ДополнительныеАдресныеСведения); - Типы.Добавить(МетаданныеРегистров.ЗагруженныеВерсииАдресныхСведений); - Типы.Добавить(МетаданныеРегистров.ИсторияАдресныхОбъектов); - Типы.Добавить(МетаданныеРегистров.ОриентирыАдресныхОбъектов); - Типы.Добавить(МетаданныеРегистров.ПричиныИзмененияАдресныхСведений); - Типы.Добавить(МетаданныеРегистров.СлужебныеАдресныеСведения); - Типы.Добавить(МетаданныеРегистров.УровниСокращенийАдресныхСведений); - - Типы.Добавить(МетаданныеРегистров.УдалитьАдресныйКлассификатор); - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl index ac21682e6..feb534596 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl @@ -1,25 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции -// Данные для запроса разрешений профилей безопасности для обновления на сайте 1С. -// -// Возвращаемое значение: -// Массив - идентификаторы необходимых разрешений. -// -Функция ЗапросРазрешенийБезопасностиОбновления() Экспорт - - ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.АдресныеОбъекты"); - Разрешения = АдресныйКлассификаторСлужебный.РазрешенияБезопасностиОбновления(); - - Результат = Новый Массив; - Результат.Добавить(РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина)); - - Возврат Результат; -КонецФункции - // Возвращает представление региона по коду. // // Параметры: diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl index 7f9564125..167fd24a4 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -1,43 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Проверяет наличие обновлений адресного классификатора на сайте -// для тех субъектов, которые ранее уже загружались. -// -// Параметры: -// ПараметрыВыполнения - ПараметрыВыполненияКоманды, Структура - параметры открытия формы. -// -Процедура ОпределитьНеобходимостьОбновленияАдресныхОбъектов(ПараметрыВыполнения = Неопределено) Экспорт - - СтруктураПараметров = Новый Структура("Источник"); - - Если ПараметрыВыполнения <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(СтруктураПараметров, ПараметрыВыполнения); - КонецЕсли; - - Владелец = СтруктураПараметров.Источник; - - Если Не ЗапрашиватьДоступПриИспользовании() Тогда - // Разрешения уже получены на всю конфигурацию. - ПараметрыФормы = Новый Структура("Режим", "ПроверкаОбновления"); - ОткрытьФормуЗагрузкиАдресногоКлассификатора(ПараметрыВыполнения, ПараметрыФормы); - Возврат; - КонецЕсли; - - // Нужен запрос профиля безопасности. - ОписаниеОповещения = Новый ОписаниеОповещения( - "ПолучениеРазрешенияБезопасностиПроверкиНаличияОбновленияАдресныхОбъектов", - ЭтотОбъект, ПараметрыВыполнения); - - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - АдресныйКлассификаторВызовСервера.ЗапросРазрешенийБезопасностиОбновления(), - Владелец, ОписаниеОповещения); - -КонецПроцедуры - // Открывает форму загрузки классификатора. // // Параметры: @@ -57,26 +19,70 @@ КонецЦикла; КонецЕсли; - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ПараметрыРаботыКлиента.АдресныйКлассификаторУстарел И Не ПараметрыФормы.Свойство("КодРегионаДляЗагрузки") Тогда ИмяФормы = "РегистрСведений.АдресныеОбъекты.Форма.АктуализацияУстаревшегоКлассификатора"; Иначе ИмяФормы = "РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора"; КонецЕсли; - ОткрытьФорму(ИмяФормы, ПараметрыФормы, - ПараметрыОкна.Источник, - ПараметрыОкна.Уникальность, - ПараметрыОкна.Окно, + ОткрытьФорму(ИмяФормы, ПараметрыФормы, + ПараметрыОкна.Источник, + ПараметрыОкна.Уникальность, + ПараметрыОкна.Окно, ПараметрыОкна.НавигационнаяСсылка); КонецПроцедуры +// Открывает форму загрузки адресного классификатора. +// +// Параметры: +// ОповещениеОЗакрытие - ОписаниеОповещения - оповещение, которое вызывается при закрытие формы загрузки адресного классификатора. +// ПараметрыФормы - - Структура - параметры открытия формы: +// * КодРегионаДляЗагрузки - Число, Массив - Если указан, то регион будет отмечен для загрузки. +// ПараметрыОткрытия - Структура - параметры открытия формы: +// * Владелец - Произвольный - Форма или элемент управления другой формы. +// * Уникальность - Произвольный - Ключ, значение которого будет использоваться для поиска уже открытых форм. +// * Окно - ОкноКлиентскогоПриложения, ВариантОткрытияОкна - Окно приложения, в котором будет открыта форма. +// * НавигационнаяСсылка - Строка - Задает навигационную ссылку, возвращаемую формой. +// +Процедура ПоказатьФормуЗагрузкиАдресногоКлассификатора(ОповещениеОЗакрытие = Неопределено, ПараметрыФормы = Неопределено, ПараметрыОткрытия = Неопределено) Экспорт + + ПараметрыОткрытияФормы = Новый Структура("Уникальность, Окно, НавигационнаяСсылка, Владелец", Ложь); + Если ПараметрыОткрытия <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыОткрытияФормы, ПараметрыОткрытия); + КонецЕсли; + + ОткрытьФорму("РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора", ПараметрыФормы, + ПараметрыОткрытияФормы.Владелец, ПараметрыОткрытияФормы.Уникальность, + ПараметрыОткрытияФормы.Окно, ПараметрыОткрытияФормы.НавигационнаяСсылка, ОповещениеОЗакрытие); + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ПоказатьФормуЗагрузкиАдресногоКлассификатора. // Проверяет наличие обновлений адресного классификатора на сайте // для тех субъектов, которые ранее уже загружались. // // Параметры: // ПараметрыВыполнения - ПараметрыВыполненияКоманды, Структура - параметры открытия формы. // +Процедура ОткрытьФормуПроверкиОбновления(ПараметрыВыполнения) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Режим", "ПроверкаОбновления"); + ОткрытьФормуЗагрузкиАдресногоКлассификатора(ПараметрыФормы, ПараметрыВыполнения); +КонецПроцедуры + +// Устарела. Следует использовать ПоказатьФормуЗагрузкиАдресногоКлассификатора. +// Проверяет наличие обновлений адресного классификатора на сайте 1С +// для тех субъектов, которые ранее уже загружались. +// +// Параметры: +// ПараметрыФормы - Структура - не используется, обратная совместимость. +// ПараметрыВыполнения - ПараметрыВыполненияКоманды, Структура - параметры открытия формы. +// ОповещениеОЗакрытие - ОписаниеОповещения - оповещение, которое вызывается при закрытие формы загрузки адресного классификатора. +// Процедура ОткрытьФормуЗагрузкиАдресногоКлассификатора(ПараметрыФормы, ПараметрыВыполнения, ОповещениеОЗакрытие = Неопределено) Экспорт ПараметрыВыполненияФормы = Новый Структура("Уникальность, Окно, НавигационнаяСсылка, Источник", Ложь); @@ -88,23 +94,7 @@ ОткрытьФорму("РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора", ПараметрыВыполнения, ПараметрыВыполненияФормы.Источник, ПараметрыВыполненияФормы.Уникальность, ПараметрыВыполненияФормы.Окно, ПараметрыВыполненияФормы.НавигационнаяСсылка, ОповещениеОЗакрытие); - - КонецПроцедуры - -#Область УстаревшиеПроцедурыИФункции - -// Устарела. Следует использовать ОткрытьФормуЗагрузкиАдресногоКлассификатора. -// Проверяет наличие обновлений адресного классификатора на сайте -// для тех субъектов, которые ранее уже загружались. -// -// Параметры: -// ПараметрыВыполнения - ПараметрыВыполненияКоманды, Структура - параметры открытия формы. -// -Процедура ОткрытьФормуПроверкиОбновления(ПараметрыВыполнения) Экспорт - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Режим", "ПроверкаОбновления"); - ОткрытьФормуЗагрузкиАдресногоКлассификатора(ПараметрыФормы, ПараметрыВыполнения); + КонецПроцедуры #КонецОбласти @@ -184,25 +174,6 @@ КонецПроцедуры -// Завершение модального получения подтверждения о получении ресурсов на проверку наличия обновления классификатора. -// -Процедура ПолучениеРазрешенияБезопасностиПроверкиНаличияОбновленияАдресныхОбъектов(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт - - Если РезультатЗакрытия <> КодВозвратаДиалога.ОК Тогда - // Нет разрешения - Возврат; - КонецЕсли; - - ПараметрыФормы = Новый Структура("Режим", "ПроверкаОбновления"); - ОткрытьФормуЗагрузкиАдресногоКлассификатора(ДополнительныеПараметры, ПараметрыФормы); -КонецПроцедуры - -Функция ЗапрашиватьДоступПриИспользовании() - - Возврат Ложь; - -КонецФункции - Процедура ВыбратьКаталогЗавершениеОтображенияДиалогаВыбораФайла(Каталог, ДополнительныеПараметры) Экспорт Если Каталог <> Неопределено Тогда @@ -225,7 +196,7 @@ // Каталог - Строка - каталог с проверяемыми файлами. // ПараметрыЗагрузки - Структура - содержит поля. // * КодИсточникаЗагрузки - Строка - описывает набор анализируемых файлов. Возможные значения: "КАТАЛОГ", -// "САЙТ, "ИТС". +// "САЙТ", "ИТС". // * ПолеОшибки - Строка - имя реквизита для привязки сообщений об ошибке. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl index 0383e0fc6..c3e3c248f 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl @@ -1,7 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Имя событие для записи в журнал регистрации. diff --git a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl index d7fdec5d1..e1f57b690 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl @@ -1,7 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Набор уровней для запросов в режиме совместимости с КЛАДР. @@ -32,11 +28,8 @@ // WSПрокси - объект для вызовов сервиса. // Функция СервисКлассификатора1С() Экспорт - - УстановитьПривилегированныйРежим(Истина); + Авторизация = АдресныйКлассификаторСлужебный.ПараметрыАутентификацииНаСайте(); - УстановитьПривилегированныйРежим(Ложь); - Если Авторизация = Неопределено Тогда Логин = Неопределено; Пароль = Неопределено; diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl index b233ff7a9..d8a20c189 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl @@ -1,7 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Адресный классификатор". -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Проверка доступности поставщика - локальной базы или сервиса. @@ -416,10 +412,6 @@ КолонкаСтроение = ВариантыДомов.Колонки.Добавить("Строение", ОбщегоНазначения.ОписаниеТипаСтрока(20)); ВариантыДомов.Колонки.Добавить("Значение"); ВариантыДомов.Колонки.Добавить("Представление"); - ВариантыДомов.Колонки.Индекс(КолонкаДомЧислом); - ВариантыДомов.Колонки.Индекс(КолонкаДом); - ВариантыДомов.Колонки.Индекс(КолонкаКорпус); - ВариантыДомов.Колонки.Индекс(КолонкаСтроение); Если СтрЗаканчиваетсяНа(СтрокаПоиска, "%") Тогда ТочноеСовпадение = Ложь; @@ -457,6 +449,7 @@ ИзвлечьСписокДомовСервис1С(ИдентификаторАдресногоОбъекта, СтрокаПоиска, ВариантыДомов); КонецЕсли; + ВариантыДомов.Индексы.Добавить("ДомЧислом, Дом, Корпус, Строение"); ВариантыДомов.Сортировать("ДомЧислом, Дом, Строение, Корпус"); Возврат ВариантыДомов; @@ -957,8 +950,8 @@ ТекстЗапроса = "ВЫБРАТЬ " + СтрокаВыбрать + " ИЗ РегистрСведений.АдресныеОбъекты КАК НаселенныйПункт " + СтрокаИз + " ГДЕ НаселенныйПункт.Идентификатор = &Идентификатор"; - - Если ЗначениеЗаполнено(Упорядочить) Тогда + + Если ЗначениеЗаполнено(Упорядочить) Тогда ТекстЗапроса = ТекстЗапроса + " УПОРЯДОЧИТЬ ПО " + Упорядочить; КонецЕсли; @@ -1259,6 +1252,214 @@ КонецФункции +// Возвращает код региона и проверяет наличие загруженных адресных сведений по региону. +// +Функция СведенияОРегионе(НаименованиеРегиона) Экспорт + + Результат = Новый Структура("Загружен, КодСубъектаРФ", Неопределено, Неопределено); + СведенияОРегионе = АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(НаименованиеРегиона); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | ВЫБОР + | КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК РегионЗагружен + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные + | ПО (ЗагруженныеДанные.Уровень > 1) + | И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ + |ГДЕ + | АдресныеОбъекты.Наименование = &Наименование + | И АдресныеОбъекты.Сокращение = &Сокращение + | И АдресныеОбъекты.Уровень = 1"; + + Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование); + Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение); + + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + + Если РезультатЗапроса.Следующий() Тогда + Результат.Загружен = РезультатЗапроса.РегионЗагружен; + Результат.КодСубъектаРФ = РезультатЗапроса.КодСубъектаРФ; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает краткую информацию о состоянии загруженности регионов. +// +// Возвращаемое значение: +// Структура - описание состояния. Содержит колонки. +// * КоличествоРегионов - Число - Общие количество регионов. +// * КоличествоЗагруженныхРегионов - Число - количество загруженных регионов. +Функция КраткиеСведенияОЗагрузкеСубъектовРФ() Экспорт + + Результат = Новый Структура("КоличествоРегионов, КоличествоЗагруженныхРегионов"); + + Результат.КоличествоЗагруженныхРегионов = АдресныйКлассификатор.КоличествоЗагруженныхРегионов(); + + Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); + Результат.КоличествоРегионов = Классификатор.Количество(); + + Возврат Результат; +КонецФункции + +// Возвращает настройку текущего источника данных адресов. +// +// Возвращаемое значение: +// Строка - описание источника. Пустая строка - используются загружаемые в регистр данные. +// +Функция ИсточникДанныхАдресногоКлассификатора() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ИсточникДанныхАдресногоКлассификатора"); + +КонецФункции + +// Возвращает информацию о состоянии загруженности регионов. +// +// Возвращаемое значение: +// ТаблицаЗначений - описание состояния. Содержит колонки. +// * КодСубъектаРФ - Число - Код региона. +// * Идентификатор - УникальныйИдентификатор - Идентификатор региона. +// * Представление - Строка - Наименование и сокращение региона. +// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. +// * ДатаВерсии - Дата - UTC версия загруженных данных. +// +Функция СведенияОЗагрузкеСубъектовРФ() Экспорт + + Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); + + // Выбираем все возможные данные - и из регистра, и из классификатора. + // Считаем, что уникальность обеспечивается не идентификатором (что правильно), а кодом субъекта + // из-за особенностей платформы по передаче уникального идентификатора в таблицу-параметр запроса. + + Запрос = Новый Запрос("ВЫБРАТЬ + | Параметр.Наименование КАК Наименование, + | Параметр.Сокращение КАК Сокращение, + | Параметр.КодСубъектаРФ КАК КодСубъектаРФ + |ПОМЕСТИТЬ Классификатор + |ИЗ + | &Классификатор КАК Параметр + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА ВсеДоступныеРегионы.Наименование ЕСТЬ NULL + | ТОГДА Классификатор.Наименование + "" "" + Классификатор.Сокращение + | ИНАЧЕ ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение + | КОНЕЦ КАК Представление, + | ВЫБОР + | КОГДА ВсеДоступныеРегионы.КодСубъектаРФ ЕСТЬ NULL + | ТОГДА Классификатор.КодСубъектаРФ + | ИНАЧЕ ВсеДоступныеРегионы.КодСубъектаРФ + | КОНЕЦ КАК КодСубъектаРФ, + | ИдентификаторыАдресныхОбъектов.Идентификатор КАК Идентификатор, + | ВЫБОР + | КОГДА АдресныеОбъекты.КодСубъектаРФ ЕСТЬ NULL + | ТОГДА ЛОЖЬ + | ИНАЧЕ ИСТИНА + | КОНЕЦ КАК Загружено, + | ЕСТЬNULL(Версии.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаВерсии + |ИЗ + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.Сокращение КАК Сокращение, + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ + | ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ГДЕ + | АдресныеОбъекты.Уровень = 1 + | И АдресныеОбъекты.КодОкруга = 0 + | И АдресныеОбъекты.КодРайона = 0 + | И АдресныеОбъекты.КодГорода = 0 + | И АдресныеОбъекты.КодВнутригородскогоРайона = 0 + | И АдресныеОбъекты.КодНаселенногоПункта = 0 + | И АдресныеОбъекты.КодУлицы = 0 + | И АдресныеОбъекты.КодДополнительногоЭлемента = 0 + | И АдресныеОбъекты.КодПодчиненногоЭлемента = 0) КАК ВсеДоступныеРегионы + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | Регионы.КодСубъектаРФ КАК КодСубъектаРФ + | ИЗ + | РегистрСведений.АдресныеОбъекты КАК Регионы + | ГДЕ + | Регионы.Уровень = 1 + | И 1 В + | (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 2 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 3 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 4 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 5 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 6 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 7 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 90 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты + | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 91 + | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ)) КАК АдресныеОбъекты + | ПО (АдресныеОбъекты.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ИдентификаторыАдресныхОбъектов + | ПО (ИдентификаторыАдресныхОбъектов.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) + | И (ИдентификаторыАдресныхОбъектов.Уровень = 1) + | И (ИдентификаторыАдресныхОбъектов.КодОкруга = 0) + | И (ИдентификаторыАдресныхОбъектов.КодРайона = 0) + | И (ИдентификаторыАдресныхОбъектов.КодГорода = 0) + | И (ИдентификаторыАдресныхОбъектов.КодВнутригородскогоРайона = 0) + | И (ИдентификаторыАдресныхОбъектов.КодНаселенногоПункта = 0) + | И (ИдентификаторыАдресныхОбъектов.КодУлицы = 0) + | И (ИдентификаторыАдресныхОбъектов.КодДополнительногоЭлемента = 0) + | И (ИдентификаторыАдресныхОбъектов.КодПодчиненногоЭлемента = 0) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК Версии + | ПО (Версии.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) + | ПОЛНОЕ СОЕДИНЕНИЕ Классификатор КАК Классификатор + | ПО (Классификатор.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) + | + |УПОРЯДОЧИТЬ ПО + | ВЫБОР + | КОГДА ВсеДоступныеРегионы.КодСубъектаРФ ЕСТЬ NULL + | ТОГДА Классификатор.КодСубъектаРФ + | ИНАЧЕ ВсеДоступныеРегионы.КодСубъектаРФ + | КОНЕЦ"); + + Запрос.УстановитьПараметр("Классификатор", Классификатор); + + ЗагруженныеСведения = Запрос.Выполнить().Выгрузить(); + ЗагруженныеСведения.Индексы.Добавить("Идентификатор"); + ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ"); + ЗагруженныеСведения.Индексы.Добавить("Загружено"); + + // Корректируем идентификаторы из-за особенностей платформы по передаче уникального + // идентификатора в таблицу-параметр запроса. + Для Каждого Строка Из ЗагруженныеСведения Цикл + Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда + СтрокаКлассификатора = Классификатор.Найти(Строка.КодСубъектаРФ, "КодСубъектаРФ"); + Если СтрокаКлассификатора <> Неопределено Тогда + Строка.Идентификатор = СтрокаКлассификатора.Идентификатор; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ЗагруженныеСведения; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Загрузка адресного классификатора. @@ -1418,9 +1619,9 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. +// Обработчики событий подсистем конфигурации. -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -1429,10 +1630,128 @@ КонецПроцедуры +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Параметры.Вставить("АдресныйКлассификаторУстарел", УстаревшийКлассификаторСодержитСведения()); + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + // Разрешение на проверку обновления. + АдресФайлаВерсий = ОбщегоНазначенияКлиентСервер.СтруктураURI( + АдресФайлаОписанияДоступныхВерсий()); + + Протокол = ВРег(АдресФайлаВерсий.Схема); + Адрес = АдресФайлаВерсий.Хост; + Порт = АдресФайлаВерсий.Порт; + Описание = НСтр("ru = 'Загрузка обновлений адресного классификатора.'"); + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Разрешения = Новый Массив; + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + + ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.РегистрыСведений.АдресныеОбъекты.ПолноеИмя()); + + ЗапросРазрешений = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина); + + ЗапросыРазрешений.Добавить(ЗапросРазрешений); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + // Заполнение начальных данных. + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.4.23"; + Обработчик.Процедура = "АдресныйКлассификаторСлужебный.ВыполнитьНачальноеЗаполнение"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.ОбщиеДанные = Истина; + Обработчик.РежимВыполнения = "Монопольно"; + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; // Модель сервиса. + КонецЕсли; + + Если Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда + Возврат; // Нет прав. + КонецЕсли; + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта("РегистрСведений.АдресныеОбъекты"); + Если Разделы.Количество() = 0 Тогда + // Не вынесены в командный интерфейс. + РазделАдминистрирование = Метаданные.Подсистемы.Найти("Администрирование"); + Если РазделАдминистрирование = Неопределено Тогда + Возврат; + КонецЕсли; + Разделы.Добавить(РазделАдминистрирование); + КонецЕсли; + + // 1. Необходимость актуализировать адресный классификатор - в старом классификаторе больше нет записей о регионах. + КоличествоРегионов = ЗаполненныеРегионыУстаревшегоКлассификатора().Количество(); + Для Каждого Раздел Из Разделы Цикл + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = "АктуализацияАдресногоКлассификатора"; + Дело.ЕстьДела = ?(КоличествоРегионов > 0, Истина, Ложь); + Дело.Важное = Истина; + Дело.СкрыватьВНастройках = Истина; + Дело.Владелец = Раздел; + Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'"); + Дело.Количество = 0; + Дело.Подсказка = НСтр("ru = 'Автоподбор и проверка корректности адресов временно недоступны.'"); + Дело.ПараметрыФормы = Новый Структура; + Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.АктуализацияУстаревшегоКлассификатора"; + Если Дело.ЕстьДела = Истина Тогда + Возврат; + КонецЕсли; + КонецЦикла; + + // 2. Необходимость обновления адресного классификатора. + ПоследнееОбновление = ОписаниеПоследнейЗагрузки(); + Подсказка = ПоследнееОбновление.Представление; + Подсказка = Подсказка + Символы.ПС + НСтр("ru = 'Необходимо проверить наличие обновлений.'"); + Для Каждого Раздел Из Разделы Цикл + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = "ОбновлениеАдресногоКлассификатора"; + Дело.ЕстьДела = ПоследнееОбновление.НеобходимоОбновление; + Дело.Важное = ПоследнееОбновление.НеобходимоОбновление; + Дело.Владелец = Раздел; + Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'"); + Дело.Количество = 0; + Дело.Подсказка = Подсказка; + Дело.ПараметрыФормы = Новый Структура("Режим", "ПроверкаОбновления"); + Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора"; + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Начальное заполнение данных адресного классификатора при первом запуске. +// +Процедура ВыполнитьНачальноеЗаполнение() Экспорт + + РегистрыСведений.АдресныеОбъекты.ОбновитьСоставСубъектовРФПоКлассификатору(Истина); + +КонецПроцедуры + // Заполнение данных для проверки версии по загружаемым данным. // Процедура ЗаполнитьВерсиюПоставщикаДанныхВнутр(Результат) @@ -1450,6 +1769,8 @@ Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Данные.Индексы.Добавить("Идентификатор"); Данные.Индексы.Добавить("Представление"); + Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число")); + Колонки.Добавить("ТипАдресногоЭлемента", Новый ОписаниеТипов("Строка")); Возврат Данные; КонецФункции @@ -1462,10 +1783,10 @@ Данные = Новый ТаблицаЗначений; Колонки = Данные.Колонки; - Колонки.Добавить("Неактуален", ТипБулево); - Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); - Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("РегионЗагружен", ТипБулево); + Колонки.Добавить("Неактуален", ТипБулево); + Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); + Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("РегионЗагружен", ТипБулево); Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число")); Колонки.Добавить("ТипАдресногоЭлемента", Новый ОписаниеТипов("Строка")); @@ -3194,7 +3515,9 @@ Для Каждого ЭлементПроверки Из АдресаДляПроверки Цикл ПроверяемыйАдрес = СписокДляПроверки.Item.Добавить(Сервис.ФабрикаXDTO.Создать(ТипЭлементаСписка)); - ПроверяемыйАдрес.Address = ОбщегоНазначения.ОбъектXDTOИзСтрокиXML(ОбщегоНазначения.ОбъектXDTOВСтрокуXML(ЭлементПроверки.Адрес), Сервис.ФабрикаXDTO); + АдресВXML = ОбщегоНазначения.ОбъектXDTOВСтрокуXML(ЭлементПроверки.Адрес); + АдресВXML = СтрЗаменить(АдресВXML, "http://www.v8.1c.ru/ssl/contactinfo_ru", "http://www.v8.1c.ru/ssl/contactinfo"); // Локализация + ПроверяемыйАдрес.Address = ОбщегоНазначения.ОбъектXDTOИзСтрокиXML(АдресВXML, Сервис.ФабрикаXDTO); ПроверяемыйАдрес.Levels = ЭлементПроверки.Уровни; КонецЦикла; @@ -3449,6 +3772,10 @@ Возврат Неопределено; // т.к. мы не знаем объект верхнего уровня, то нет смысла искать. КонецЕсли; + Если СтрДлина(Наименование) < 3 Тогда + Возврат Неопределено; // Autocomplete в веб-сервисе принимает строки с длинной 3 и более + КонецЕсли; + Сервис = АдресныйКлассификаторПовтИсп.СервисКлассификатора1С(); КодЯзыка = ТекущийКодЛокализации(); @@ -4452,7 +4779,7 @@ Возврат Неопределено; КонецЕсли; - ПоляАдреса = Новый Соответствие(); //"Регион + ПоляАдреса = Новый Соответствие(); // Регион ПоляАдреса.Вставить("Регион", АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(Адрес.СубъектРФ)); ПоляАдреса.Вставить("Округ", АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(Адрес.Округ)); Район = ?(ПустаяСтрока(Адрес.СвРайМО), "", Адрес.СвРайМО.Район); @@ -4886,10 +5213,13 @@ // Десериализует объект из XML. // Функция ДесериализацияАдресаXDTO(Строка) + + ПередЧтениемXDTOКонтактнаяИнформация(Строка); + ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(Строка); - Тип = ФабрикаXDTO.Тип(ПространствоИменАдресаРФ(), "АдресРФ"); + Тип = ФабрикаXDTO.Тип(ПространствоИменДляАдресаРФ(), "АдресРФ"); Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); Возврат Результат @@ -4901,6 +5231,48 @@ Возврат "http://www.v8.1c.ru/ssl/AddressSystem"; КонецФункции +// Пространство имен для операций XDTO с адресом. +// +Функция ПространствоИменДляАдресаРФ() + Возврат "http://www.v8.1c.ru/ssl/contactinfo_ru"; +КонецФункции + +// Преобразует XML. Обратная совместимость. +// +Функция ПередЧтениемXDTOКонтактнаяИнформация(ТекстXML) + + Если СтрНайти(ТекстXML, "Адрес") = 0 Тогда + Возврат ТекстXML; + КонецЕсли; + + Если СтрНайти(ТекстXML, "http://www.v8.1c.ru/ssl/contactinfo_ru") > 0 Тогда + Возврат ТекстXML; + КонецЕсли; + + ТекстXML = СтрЗаменить(ТекстXML, "xsi:type=""АдресРФ""", "xmlns:rf=""http://www.v8.1c.ru/ssl/contactinfo_ru"" xsi:type=""rf:АдресРФ"""); + ТекстXML = СтрЗаменить(ТекстXML, "СубъектРФ", "rf:СубъектРФ"); + ТекстXML = СтрЗаменить(ТекстXML, "Округ", "rf:Округ"); + ТекстXML = СтрЗаменить(ТекстXML, "СвРайМО", "rf:СвРайМО"); + ТекстXML = СтрЗаменить(ТекстXML, "<Район>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "", ""); + ТекстXML = СтрЗаменить(ТекстXML, "<Район/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "Город>", "rf:Город>"); + ТекстXML = СтрЗаменить(ТекстXML, "<Город/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "ВнутригРайон", "rf:ВнутригРайон"); + ТекстXML = СтрЗаменить(ТекстXML, "НаселПункт", "rf:НаселПункт"); + + ТекстXML = СтрЗаменить(ТекстXML, "Улица>", "rf:Улица>"); + ТекстXML = СтрЗаменить(ТекстXML, "<Улица/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "ОКТМО", "rf:ОКТМО"); + ТекстXML = СтрЗаменить(ТекстXML, "ОКАТО", "rf:ОКАТО"); + ТекстXML = СтрЗаменить(ТекстXML, "ДопАдрЭл", "rf:ДопАдрЭл"); + ТекстXML = СтрЗаменить(ТекстXML, "<Номер", "", "rf:Местоположение>"); + + Возврат ТекстXML; + +КонецФункции + // Устанавливает в XDTO адресе значение по XPath. // Процедура УстановитьXDTOРеквизитОбъекта(ОбъектXDTO, ПутьXPath, Значение) @@ -5803,180 +6175,6 @@ #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейсОбработчикиСобытий - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "АдресныйКлассификаторСлужебный"); - - // Обновление - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "АдресныйКлассификаторСлужебный"); - - // Профили безопасности - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "АдресныйКлассификаторСлужебный"); - - // Текущие дела - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "АдресныйКлассификаторСлужебный"); - КонецЕсли; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Параметры.Вставить("АдресныйКлассификаторУстарел", УстаревшийКлассификаторСодержитСведения()); - -КонецПроцедуры - -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - // Разрешение на проверку обновления. - АдресФайлаВерсий = ОбщегоНазначенияКлиентСервер.СтруктураURI( - АдресФайлаОписанияДоступныхВерсий()); - - Протокол = ВРег(АдресФайлаВерсий.Схема); - Адрес = АдресФайлаВерсий.Хост; - Порт = АдресФайлаВерсий.Порт; - Описание = НСтр("ru = 'Загрузка обновлений адресного классификатора.'"); - - Разрешения = Новый Массив; - Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); - - ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.РегистрыСведений.АдресныеОбъекты.ПолноеИмя()); - - ЗапросРазрешений = РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина); - - ЗапросыРазрешений.Добавить(ЗапросРазрешений); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - // Заполнение начальных данных. - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.4.23"; - Обработчик.Процедура = "АдресныйКлассификаторСлужебный.ВыполнитьНачальноеЗаполнение"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.ОбщиеДанные = Истина; - Обработчик.РежимВыполнения = "Монопольно"; - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - описание дел - таблица значений с колонками: -// * Идентификатор - Строка - Внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - Если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - Если Истина, дело будет выделено красным цветом. -// * Представление - Строка - Представление дела, выводимое пользователю. -// * Количество - Число - Количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - Полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - Параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, ОбъектМетаданных - Строковый идентификатор дела, которое будет владельцем для -// текущего или объект метаданных подсистема. -// * Подсказка - Строка - Текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; // Модель сервиса. - КонецЕсли; - - Если Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда - Возврат; // Нет прав. - КонецЕсли; - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта("РегистрСведений.АдресныеОбъекты"); - Если Разделы.Количество() = 0 Тогда - // Не вынесены в командный интерфейс. - РазделАдминистрирование = Метаданные.Подсистемы.Найти("Администрирование"); - Если РазделАдминистрирование = Неопределено Тогда - Возврат; - КонецЕсли; - Разделы.Добавить(РазделАдминистрирование); - КонецЕсли; - - // 1. Необходимость актуализировать адресный классификатор - в старом классификаторе больше нет записей о регионах. - КоличествоРегионов = ЗаполненныеРегионыУстаревшегоКлассификатора().Количество(); - Для Каждого Раздел Из Разделы Цикл - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = "АктуализацияАдресногоКлассификатора"; - Дело.ЕстьДела = ?(КоличествоРегионов > 0, Истина, Ложь); - Дело.Важное = Истина; - Дело.Владелец = Раздел; - Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'"); - Дело.Количество = 0; - Дело.Подсказка = НСтр("ru = 'Автоподбор и проверка корректности адресов временно недоступны.'"); - Дело.ПараметрыФормы = Новый Структура; - Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.АктуализацияУстаревшегоКлассификатора"; - Если Дело.ЕстьДела = Истина Тогда - Возврат; - КонецЕсли; - КонецЦикла; - - // 2. Необходимость обновления адресного классификатора. - ПоследнееОбновление = ОписаниеПоследнейЗагрузки(); - Подсказка = ПоследнееОбновление.Представление; - Подсказка = Подсказка + Символы.ПС + НСтр("ru = 'Необходимо проверить наличие обновлений.'"); - Для Каждого Раздел Из Разделы Цикл - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = "ОбновлениеАдресногоКлассификатора"; - Дело.ЕстьДела = ПоследнееОбновление.НеобходимоОбновление; - Дело.Важное = ПоследнееОбновление.НеобходимоОбновление; - Дело.Владелец = Раздел; - Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'"); - Дело.Количество = 0; - Дело.Подсказка = Подсказка; - Дело.ПараметрыФормы = Новый Структура("Режим", "ПроверкаОбновления"); - Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора"; - КонецЦикла; - -КонецПроцедуры - -// Начальное заполнение данных адресного классификатора при первом запуске. -// -Процедура ВыполнитьНачальноеЗаполнение() Экспорт - - РегистрыСведений.АдресныеОбъекты.ОбновитьСоставСубъектовРФПоКлассификатору(Истина); - -КонецПроцедуры - -#КонецОбласти - #Область ПреобразованиеТиповДанныхФИАС // Преобразует УникальныйИдентификатор в ДвоичныеДанные. @@ -6090,7 +6288,7 @@ Функция ЗаполненныеРегионыУстаревшегоКлассификатора() Экспорт Результат = Новый Массив; - Если Метаданные.РегистрыСведений.Найти("УдалитьАдресныйКлассификатор") <> Неопределено + Если Метаданные.РегистрыСведений.Найти("УдалитьАдресныйКлассификатор") <> Неопределено И Пользователи.РолиДоступны("ДобавлениеИзменениеАдресныхСведений") Тогда УстановитьПривилегированныйРежим(Истина); @@ -6275,6 +6473,7 @@ Процедура ЗаполнитьАдресныеОбъектыРегистраКЛАДР(СубъектРФ, ТаблицыДанных) УстановитьПривилегированныйРежим(Истина); + ТипЧисло = Новый ОписаниеТипов("Число"); ТаблицаАдресныхОбъектов = ТаблицыДанных.АдресныеОбъекты; @@ -6496,8 +6695,7 @@ ПрефиксыЗданий.Колонки.Добавить("Идентификатор"); ПрефиксыЗданий.Колонки.Добавить("ТипСтатуса"); ПрефиксыЗданий.Колонки.Добавить("Длина"); - ПрефиксыЗданий.Индексы.Добавить("Префикс, Идентификатор, ТипСтатуса, Длина"); - + ДобавитьПрефиксЗданияКЛАДР("ДОМ", "Дом", "ESTSTAT", ПрефиксыЗданий); ДобавитьПрефиксЗданияКЛАДР("ВЛД", "Владение", "ESTSTAT", ПрефиксыЗданий); ДобавитьПрефиксЗданияКЛАДР("ДВЛД", "Домовладение", "ESTSTAT", ПрефиксыЗданий); @@ -6844,203 +7042,6 @@ Возврат РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); КонецФункции -// Возвращает информацию о состоянии загруженности регионов. -// -// Возвращаемое значение: -// ТаблицаЗначений - описание состояния. Содержит колонки. -// * КодСубъектаРФ - Число - Код региона. -// * Идентификатор - УникальныйИдентификатор - Идентификатор региона. -// * Представление - Строка - Наименование и сокращение региона. -// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. -// * ДатаВерсии - Дата - UTC версия загруженных данных. -// -Функция СведенияОЗагрузкеСубъектовРФ() Экспорт - - Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); - - // Выбираем все возможные данные - и из регистра, и из классификатора. - // Считаем, что уникальность обеспечивается не идентификатором (что правильно), а кодом субъекта - // из-за особенностей платформы по передаче уникального идентификатора в таблицу-параметр запроса. - - Запрос = Новый Запрос("ВЫБРАТЬ - | Параметр.Наименование КАК Наименование, - | Параметр.Сокращение КАК Сокращение, - | Параметр.КодСубъектаРФ КАК КодСубъектаРФ - |ПОМЕСТИТЬ Классификатор - |ИЗ - | &Классификатор КАК Параметр - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВЫБОР - | КОГДА ВсеДоступныеРегионы.Наименование ЕСТЬ NULL - | ТОГДА Классификатор.Наименование + "" "" + Классификатор.Сокращение - | ИНАЧЕ ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение - | КОНЕЦ КАК Представление, - | ВЫБОР - | КОГДА ВсеДоступныеРегионы.КодСубъектаРФ ЕСТЬ NULL - | ТОГДА Классификатор.КодСубъектаРФ - | ИНАЧЕ ВсеДоступныеРегионы.КодСубъектаРФ - | КОНЕЦ КАК КодСубъектаРФ, - | ИдентификаторыАдресныхОбъектов.Идентификатор КАК Идентификатор, - | ВЫБОР - | КОГДА АдресныеОбъекты.КодСубъектаРФ ЕСТЬ NULL - | ТОГДА ЛОЖЬ - | ИНАЧЕ ИСТИНА - | КОНЕЦ КАК Загружено, - | ЕСТЬNULL(Версии.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаВерсии - |ИЗ - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.Сокращение КАК Сокращение, - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ - | ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ГДЕ - | АдресныеОбъекты.Уровень = 1 - | И АдресныеОбъекты.КодОкруга = 0 - | И АдресныеОбъекты.КодРайона = 0 - | И АдресныеОбъекты.КодГорода = 0 - | И АдресныеОбъекты.КодВнутригородскогоРайона = 0 - | И АдресныеОбъекты.КодНаселенногоПункта = 0 - | И АдресныеОбъекты.КодУлицы = 0 - | И АдресныеОбъекты.КодДополнительногоЭлемента = 0 - | И АдресныеОбъекты.КодПодчиненногоЭлемента = 0) КАК ВсеДоступныеРегионы - | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ - | Регионы.КодСубъектаРФ КАК КодСубъектаРФ - | ИЗ - | РегистрСведений.АдресныеОбъекты КАК Регионы - | ГДЕ - | Регионы.Уровень = 1 - | И 1 В - | (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 2 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 3 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 4 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 5 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 6 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 7 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 90 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты - | ГДЕ РегистрСведений.АдресныеОбъекты.Уровень = 91 - | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регионы.КодСубъектаРФ)) КАК АдресныеОбъекты - | ПО (АдресныеОбъекты.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ИдентификаторыАдресныхОбъектов - | ПО (ИдентификаторыАдресныхОбъектов.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) - | И (ИдентификаторыАдресныхОбъектов.Уровень = 1) - | И (ИдентификаторыАдресныхОбъектов.КодОкруга = 0) - | И (ИдентификаторыАдресныхОбъектов.КодРайона = 0) - | И (ИдентификаторыАдресныхОбъектов.КодГорода = 0) - | И (ИдентификаторыАдресныхОбъектов.КодВнутригородскогоРайона = 0) - | И (ИдентификаторыАдресныхОбъектов.КодНаселенногоПункта = 0) - | И (ИдентификаторыАдресныхОбъектов.КодУлицы = 0) - | И (ИдентификаторыАдресныхОбъектов.КодДополнительногоЭлемента = 0) - | И (ИдентификаторыАдресныхОбъектов.КодПодчиненногоЭлемента = 0) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК Версии - | ПО (Версии.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) - | ПОЛНОЕ СОЕДИНЕНИЕ Классификатор КАК Классификатор - | ПО (Классификатор.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ) - | - |УПОРЯДОЧИТЬ ПО - | ВЫБОР - | КОГДА ВсеДоступныеРегионы.КодСубъектаРФ ЕСТЬ NULL - | ТОГДА Классификатор.КодСубъектаРФ - | ИНАЧЕ ВсеДоступныеРегионы.КодСубъектаРФ - | КОНЕЦ"); - - Запрос.УстановитьПараметр("Классификатор", Классификатор); - - ЗагруженныеСведения = Запрос.Выполнить().Выгрузить(); - ЗагруженныеСведения.Индексы.Добавить("Идентификатор"); - ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ"); - ЗагруженныеСведения.Индексы.Добавить("Загружено"); - - // Корректируем идентификаторы из-за особенностей платформы по передаче уникального - // идентификатора в таблицу-параметр запроса. - Для Каждого Строка Из ЗагруженныеСведения Цикл - Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда - СтрокаКлассификатора = Классификатор.Найти(Строка.КодСубъектаРФ, "КодСубъектаРФ"); - Если СтрокаКлассификатора <> Неопределено Тогда - Строка.Идентификатор = СтрокаКлассификатора.Идентификатор; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат ЗагруженныеСведения; -КонецФункции - -// Возвращает краткую информацию о состоянии загруженности регионов. -// -// Возвращаемое значение: -// Структура - описание состояния. Содержит колонки. -// * КоличествоРегионов - Число - Общие количество регионов. -// * КоличествоЗагруженныхРегионов - Число - количество загруженных регионов. -Функция КраткиеСведенияОЗагрузкеСубъектовРФ() Экспорт - - Результат = Новый Структура("КоличествоРегионов, КоличествоЗагруженныхРегионов"); - - Результат.КоличествоЗагруженныхРегионов = АдресныйКлассификатор.КоличествоЗагруженныхРегионов(); - - Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); - Результат.КоличествоРегионов = Классификатор.Количество(); - - Возврат Результат; -КонецФункции - -// Возвращает код региона и проверяет наличие загруженных адресных сведений по региону. -// -Функция СведенияОРегионе(НаименованиеРегиона) Экспорт - - Результат = Новый Структура("Загружен, КодСубъектаРФ", Неопределено, Неопределено); - СведенияОРегионе = АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(НаименованиеРегиона); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | ВЫБОР - | КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК РегионЗагружен - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные - | ПО (ЗагруженныеДанные.Уровень > 1) - | И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ - |ГДЕ - | АдресныеОбъекты.Наименование = &Наименование - | И АдресныеОбъекты.Сокращение = &Сокращение - | И АдресныеОбъекты.Уровень = 1"; - - Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование); - Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение); - - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - - Если РезультатЗапроса.Следующий() Тогда - Результат.Загружен = РезультатЗапроса.РегионЗагружен; - Результат.КодСубъектаРФ = РезультатЗапроса.КодСубъектаРФ; - КонецЕсли; - - Возврат Результат; - -КонецФункции - Функция ПредставлениеРегиона(Наименование, Сокращение) Если Сокращение = НСтр("ru = 'Респ'") Тогда Возврат НСтр("ru = 'Республика'") + " " + Наименование; @@ -7157,7 +7158,6 @@ КонецПроцедуры - // Извлекает список домов полученного из регистра сведения описания и добавляет их в список значений. // // Параметры: @@ -7453,9 +7453,17 @@ // Процедура ЗагрузитьКлассификаторАдресовССайта(КодыСубъектовРФ = Неопределено, ИсходнаяАвторизация = Неопределено) - УстановитьПривилегированныйРежим(Истина); - Авторизация = ПараметрыАутентификацииНаСайте(); - УстановитьПривилегированныйРежим(Ложь); + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Возврат; + КонецЕсли; + + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + + Если ИсходнаяАвторизация = Неопределено Тогда + Авторизация = ПараметрыАутентификацииНаСайте(); + Иначе + Авторизация = ИсходнаяАвторизация; + КонецЕсли; Если КодыСубъектовРФ = Неопределено Тогда ВсеРегионы = СведенияОЗагрузкеСубъектовРФ(); @@ -7489,7 +7497,7 @@ ПараметрыПолучения.Вставить("ПутьДляСохранения", ПутьДляСохранения); ПараметрыПолучения.Вставить("Таймаут", 180); - ЗагруженныйФайл = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ОписаниеРегиона.Адрес, ПараметрыПолучения); + ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ОписаниеРегиона.Адрес, ПараметрыПолучения); Если Не ЗагруженныйФайл.Статус Тогда УдалитьВременныйФайл(ВременныйКаталог); ВызватьИсключение ЗагруженныйФайл.СообщениеОбОшибке + Символы.ПС @@ -7551,29 +7559,6 @@ КонецПроцедуры -// Набор разрешений профилей безопасности для проверки наличия обновления на сайте 1С. -// -// Возвращаемое значение: -// Массив - необходимые разрешения. -// -Функция РазрешенияБезопасностиОбновления() Экспорт - - Разрешения = Новый Массив; - - // Запрос обновления - Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI( АдресФайлаОписанияДоступныхВерсий()); - Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( - ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Проверка обновления адресного классификатора.'"))); - - // Корневой каталог данных - используется только для получения разрешения. - // Фактический адрес для загрузки считывается из файла обновлений. - Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI("http://downloads.v8.1c.ru/tmplts/ITS/KLADR/"); - Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( - ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Загрузка данных адресного классификатора.'"))); - - Возврат Разрешения; -КонецФункции - // Путь к файлу на веб сервере, содержащему информацию по версиям адресных сведений. // // Возвращаемое значение: @@ -7596,6 +7581,13 @@ КонецФункции +// Проверяет наличие в конфигурации подсистемы ПолучениеФайловИзИнтернета для определения возможности +// обновлений адресного классификатора через интернет. +// +Функция ДоступнаЗагрузкаАдресныхСведенийИзИнтернет() Экспорт + Возврат ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета"); +КонецФункции + // Проверяет наличие обновлений адресного классификатора на веб сервере // для тех объектов, которые ранее уже загружались. // @@ -7632,13 +7624,19 @@ Результат.Индексы.Добавить("КодСубъектаРФ"); - АдресОписания = АдресИнтернетаВключаяПорт( АдресФайлаОписанияДоступныхВерсий() ); + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Возврат Результат; + КонецЕсли; + + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + + АдресОписания = АдресИнтернетаВключаяПорт(АдресФайлаОписанияДоступныхВерсий()); ПараметрыПолучения = Новый Структура("Таймаут", 180); - РезультатПолученияФайла = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес, ПараметрыПолучения); + РезультатПолученияФайла = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес, ПараметрыПолучения); Если Не РезультатПолученияФайла.Статус Тогда Возврат Результат; КонецЕсли; - РезультатПолученияФайла = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес, ПараметрыПолучения); + РезультатПолученияФайла = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес, ПараметрыПолучения); // Получен zip, внутри которого xml. КаталогДляРаспаковки = ПолучитьИмяВременногоФайла(); @@ -7708,17 +7706,6 @@ Возврат Результат; КонецФункции -// Возвращает настройку текущего источника данных адресов. -// -// Возвращаемое значение: -// Строка - описание источника. Пустая строка - используются загружаемые в регистр данные. -// -Функция ИсточникДанныхАдресногоКлассификатора() Экспорт - - Возврат ПолучитьФункциональнуюОпцию("ИсточникДанныхАдресногоКлассификатора"); - -КонецФункции - Процедура РассчитатьУровниСокращенийАдресныхСведений() Запрос = Новый Запрос(" @@ -8144,7 +8131,6 @@ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки); КонецПроцедуры - Процедура ЗагрузитьПричиныИзмененияАдреса(КодСубъектаРФ, КаталогФайлов, ВидыСведений) Сжатие = Новый СжатиеДанных(9); diff --git a/SSL/src/CommonModules/АнализЖурналаРегистрацииКлиент/Module.bsl b/SSL/src/CommonModules/АнализЖурналаРегистрацииКлиент/Module.bsl index 5218df474..f8ea5087e 100644 --- a/SSL/src/CommonModules/АнализЖурналаРегистрацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/АнализЖурналаРегистрацииКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Анализ журнала регистрации". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -20,6 +15,10 @@ // "Расширение поля формы для поля табличного документа.ОбработкаРасшифровки" в синтакс-помощнике. // Процедура ФормаОтчетаОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт + Если Расшифровка = Неопределено Тогда + Возврат; + КонецЕсли; + Если ФормаОтчета.НастройкиОтчета.ПолноеИмя <> "Отчет.АнализЖурналаРегистрации" Тогда Возврат; КонецЕсли; @@ -53,7 +52,7 @@ Обработчик = Новый ОписаниеОповещения("РезультатОбработкаРасшифровкиЗавершение", ЭтотОбъект, ПараметрыОбработчика); ФормаОтчета.ПоказатьВыборИзМеню(Обработчик, ВариантРасшифровки); - Иначе + ИначеЕсли ТипРасшифровки <> Неопределено Тогда ПоказатьСведенияОРегламентномЗадании(Расшифровка); КонецЕсли; diff --git a/SSL/src/CommonModules/АнализЖурналаРегистрацииСлужебный/Module.bsl b/SSL/src/CommonModules/АнализЖурналаРегистрацииСлужебный/Module.bsl index a70f110cc..7740ebb56 100644 --- a/SSL/src/CommonModules/АнализЖурналаРегистрацииСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АнализЖурналаРегистрацииСлужебный/Module.bsl @@ -1,35 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Анализ журнала регистрации". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "АнализЖурналаРегистрацииСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "АнализЖурналаРегистрацииСлужебный"); - КонецЕсли; - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -42,32 +16,11 @@ КонецПроцедуры -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.АнализЖурналаРегистрации); КонецПроцедуры #КонецОбласти + diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl index 8426c468c..2670b5a5b 100644 --- a/SSL/src/CommonModules/Анкетирование/Module.bsl +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -1,37 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Анкетирование" -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "Анкетирование"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "Анкетирование"); - КонецЕсли; - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Документы.Анкета.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); @@ -43,7 +16,7 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -54,16 +27,14 @@ КонецПроцедуры -#КонецОбласти +// См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов. +Процедура ПриОпределенииОбъектовСКомандамиОтчетов(Объекты) Экспорт + + Объекты.Добавить(Метаданные.Документы.НазначениеОпросов); + +КонецПроцедуры -#Область СлужебныеПроцедурыИФункции - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -71,7 +42,7 @@ Обработчик.Процедура = "Анкетирование.ИнвертироватьПризнакВключенияВАрхивАнкет"; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.5.6"; + Обработчик.Версия = "2.3.5.6"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("cfda47d2-f61f-4c23-84a6-80c77b52e6e5"); Обработчик.Процедура = "Документы.Анкета.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.Комментарий = НСтр("ru = 'Заполнение значения нового реквизита ""Режим анкетирования"" у документов ""Анкета"" прошлых периодов. @@ -83,7 +54,7 @@ Обработчик.ИзменяемыеОбъекты = "Документ.Анкета"; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.5.6"; + Обработчик.Версия = "2.3.5.6"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("1fdb0962-f814-463a-b560-48ea3d51be27"); Обработчик.Процедура = "Справочники.ВопросыШаблонаАнкеты.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.Комментарий = НСтр("ru = 'Заполнение значения нового реквизита ""Способ отображения подсказки"" в справочнике ""Вопросы шаблона анкеты"". @@ -95,7 +66,7 @@ Обработчик.ИзменяемыеОбъекты = "Справочник.ВопросыШаблонаАнкеты"; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.5.6"; + Обработчик.Версия = "2.3.5.6"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("a1581723-c1f5-4b90-b716-a180a4d5a4ad"); Обработчик.Процедура = "ПланыВидовХарактеристик.ВопросыДляАнкетирования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.Комментарий = НСтр("ru = 'Заполнение значения нового реквизита ""Вид переключателя"" плана видов характеристик ""Вопросы для анкетирования"". @@ -108,35 +79,17 @@ КонецПроцедуры -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.АнализОпроса); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.АналитическийОтчетПоАнкетированию); КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Инвертирует значение реквизита НеПоказыватьВАрхивеАнкет в соответствии с новым названием ПоказыватьВАрхивеАнкет. Процедура ИнвертироватьПризнакВключенияВАрхивАнкет() Экспорт @@ -545,7 +498,7 @@ Если ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда Форма.Элементы.НадписьВступление.Заголовок = НСтр("ru = 'Раздел'") + " " + ТекущиеДанныеДеревоРазделов.Формулировка; - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Форма.Элементы.НадписьВступление.ЦветТекста = WebЦвета.НейтральноКоричневый; Форма.Элементы.НадписьВступление.Шрифт = Новый Шрифт(, 8, Истина, , , ); Иначе @@ -588,7 +541,7 @@ СформироватьЭлементыФормыДляРаздела(Форма); КонецЕсли; - КонецПроцедуры +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Создание реквизитов формы заполнения анкеты. @@ -948,9 +901,9 @@ Форма[ИмяВопроса + "_Формулировка"] = ПолныйКодНаименование(СтрокаТаблицы); Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Формулировка",Тип("ДекорацияФормы"),ЭлементГруппаВопроса); - Элемент.Вид = ВидДекорацииФормы.Надпись; - Элемент.ВертикальноеПоложение = ВертикальноеПоложениеЭлемента.Верх; - Элемент.Заголовок = Форма[ИмяВопроса + "_Формулировка"]; + Элемент.Вид = ВидДекорацииФормы.Надпись; + Элемент.ВертикальноеПоложение = ВертикальноеПоложениеЭлемента.Верх; + Элемент.Заголовок = Форма[ИмяВопроса + "_Формулировка"]; Элемент.АвтоМаксимальнаяШирина = Ложь; Элемент.МаксимальнаяШирина = 100; Элемент.РастягиватьПоГоризонтали = Ложь; @@ -972,9 +925,7 @@ Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы,ЭлементГруппаВопроса,Форма); - - ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы,ЭлементГруппаВопроса,Форма); - + ИначеЕсли СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Комплексный Тогда ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы,ЭлементГруппаВопроса,Форма); @@ -1049,12 +1000,12 @@ ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; - Элемент.ПутьКДанным = ИмяВопроса; - Элемент.АвтоМаксимальнаяШирина = Ложь; - Элемент.РастягиватьПоГоризонтали = Ложь; + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + Элемент.АвтоМаксимальнаяШирина = Ложь; + Элемент.РастягиватьПоГоризонтали = Ложь; ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда @@ -2106,7 +2057,7 @@ // ТаблицаЗначений - таблица, содержащая информацию о доступных респонденту анкетах. // Неопределено - в случае если для респондента нет доступных анкет. // -Функция ПолучитьТаблицуДоступныхРеспондентуАнкет(Респондент) Экспорт +Функция ТаблицаДоступныхРеспондентуАнкет(Респондент) Экспорт Если ЗначениеЗаполнено(Респондент) Тогда diff --git a/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl index b3e279063..d7adc1759 100644 --- a/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl +++ b/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Анкетирование" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Создает структуру отбора, для дальнейшей передачи на сервер, diff --git a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl index ecb2b342b..c0e9bb556 100644 --- a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl @@ -1,31 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Анкетирование" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции -// Преобразовывает массив в строку, -// -// Параметры: -// Массив - Массив - массив, который будет преобразован в строку. -// Разделитель - Строка - строка, которая будет разделять элементы массива. -// -// Возвращаемое значение: -// Строка - строка получившаяся в результате преобразования массива. -// -Функция ПреобразоватьМассивВСтроку(Массив,Разделитель = "")Экспорт - - СтрокаРезультат = ""; - - Для каждого Элемент Из Массив Цикл - СтрокаРезультат = СтрокаРезультат + Строка(Элемент) + Разделитель; - КонецЦикла; - - Возврат СтрокаРезультат; - -КонецФункции - // Удаляет из строки последние символы, если они равны подстроке удаления, // до тех пор, пока последние символы будут не равны подстроке удаления. // @@ -100,7 +74,7 @@ МассивПолныйКод[инд] = 0; КонецЦикла; - ПолныйКод = ПреобразоватьМассивВСтроку(МассивПолныйКод,"."); + ПолныйКод = СтрСоединить(МассивПолныйКод,"."); ПолныйКод = УдалитьПоследниеСимволыИзСтроки(ПолныйКод,".0.","."); Элемент.ПолныйКод = ПолныйКод; diff --git a/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl index ae0f12977..bb5d07fc1 100644 --- a/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl @@ -1,55 +1,16 @@ + +#Область СлужебныйПрограммныйИнтерфейс + //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Банки в модели сервиса". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( - "БанкиСлужебныйВМоделиСервиса"); - КонецЕсли; - -КонецПроцедуры - -// Загружает файл классификатора банков РФ из поставляемых менеджером сервиса данных. -// -Процедура ЗагрузитьКлассификаторБанковРФ() Экспорт - - Дескрипторы = ПоставляемыеДанные.ДескрипторыПоставляемыхДанныхИзМенеджера("БанкиРФ"); - - Если Дескрипторы.Descriptor.Количество() < 1 Тогда - ВызватьИсключение(НСтр("ru = 'В менеджере сервиса отсутствуют данные вида ""БанкиРФ""'")); - КонецЕсли; - - ПоставляемыеДанные.ЗагрузитьИОбработатьДанные(Дескрипторы.Descriptor[0]); - -КонецПроцедуры - -// Регистрирует обработчики поставляемых данных. -// -Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "БанкиРФ"; - Обработчик.КодОбработчика = "ЗагрузкаКлассификатораБанковРФ"; - Обработчик.Обработчик = БанкиСлужебныйВМоделиСервиса; - -КонецПроцедуры +// Обработчики событий подсистем конфигурации. // Вызывается при получении уведомления о новых данных. // В теле следует проверить, необходимы ли эти данные приложению, // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево, возвращаемое. +// Дескриптор - ОбъектXDTO - Дескриптор. +// Загружать - Булево - Истина, если загружать, Ложь - иначе. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -62,51 +23,34 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено. Полное имя извлеченного файла. Файл будет автоматически удален +// Дескриптор - ОбъектXDTO - Дескриптор. +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. // Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт Если Дескриптор.DataType = "БанкиРФ" И ЗначениеЗаполнено(ПутьКФайлу) Тогда - РаботаСБанками.ЗагрузитьДанныеИзФайлаРБК(ПутьКФайлу); + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Обработки[ИмяОбработки].ЗагрузитьДанныеИзФайла(ПутьКФайлу); + КонецЕсли; КонецЕсли; КонецПроцедуры // Вызывается при отмене обработки данных в случае сбоя. // +// Параметры: +// Дескриптор - ОбъектXDTO - Дескриптор. +// Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт // ничего не надо делать. КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Зарегистрировать обработчики поставляемых данных. -// -// При получении уведомления о доступности новых общих данных, вызывается процедуры. -// ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. -// В процедуру передается Дескриптор - ОбъектXDTO Descriptor. -// -// В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, -// данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. -// ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. -// Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. -// -// Параметры: -// Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. -// Колонки: -// ВидДанных, строка - код вида данных, обрабатываемый обработчиком. -// КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. -// Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: -// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт -// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт -// ОбработкаДанныхОтменена(Дескриптор) Экспорт -// +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); @@ -114,3 +58,27 @@ КонецПроцедуры #КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Регистрирует обработчики поставляемых данных. +// +// Параметры: +// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки. +// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. +// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. +// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры: +// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт +// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт +// ОбработкаДанныхОтменена(Дескриптор) Экспорт +// +Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "БанкиРФ"; + Обработчик.КодОбработчика = "ЗагрузкаКлассификатораБанковРФ"; + Обработчик.Обработчик = БанкиСлужебныйВМоделиСервиса; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl index e7c622889..81f70f735 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Получить структуру с описанием формы выполнения задачи. @@ -39,7 +34,15 @@ КонецФункции // Проверяет, находится ли в ячейке отчета ссылка на задачу и в параметре. -// ЗначениеРасшифровки возвращает значение расшифровки. +// ЗначениеРасшифровки возвращает значение расшифровки. +// +// Параметры: +// Расшифровка - Строка - имя ячейки. +// ДанныеРасшифровкиОтчета - Строка - Адрес во временном хранилище. +// ЗначениеРасшифровки - ЗадачаСсылка.ЗадачаИсполнителя, Произвольный - Значение расшифровки из ячейки. +// +// Возвращаемое значение: +// Булево -Если Истина, то это задача исполнителю. // Функция ЭтоЗадачаИсполнителю(Знач Расшифровка, Знач ДанныеРасшифровкиОтчета, ЗначениеРасшифровки) Экспорт @@ -50,8 +53,13 @@ КонецФункции // Выполнить задачу ЗадачаСсылка, при необходимости выполнив обработчик. -// ОбработкаВыполненияПоУмолчанию модуля менеджера бизнес-процесса, -// к которому относится задача ЗадачаСсылка. +// ОбработкаВыполненияПоУмолчанию модуля менеджера бизнес-процесса, +// к которому относится задача ЗадачаСсылка. +// +// Параметры: +// ЗадачаСсылка - ЗадачаСсылка - ссылка на задачу. +// ДействиеПоУмолчанию - Булево -Признак необходимости вызова процедуры +// ОбработкаВыполненияПоУмолчанию у бизнес-процесса задачи. // Процедура ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт @@ -193,6 +201,9 @@ // Отмечает указанные бизнес-процессы как активные. // +// Параметры: +// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы. +// Процедура СделатьАктивнымБизнесПроцессы(БизнесПроцессы) Экспорт НачатьТранзакцию(); @@ -209,10 +220,13 @@ ВызватьИсключение; КонецПопытки; -КонецПроцедуры +КонецПроцедуры // Отмечает указанный бизнес-процесс как активный. // +// Параметры: +// БизнесПроцесс - БизнесПроцессСсылка - ссылка на бизнес-процесс. +// Процедура СделатьАктивнымБизнесПроцесс(БизнесПроцесс) Экспорт Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда @@ -229,7 +243,7 @@ Если Объект.Завершен Тогда ВызватьИсключение НСтр("ru = 'Невозможно сделать активными завершенные бизнес-процессы.'"); КонецЕсли; - + Если Не Объект.Стартован Тогда ВызватьИсключение НСтр("ru = 'Невозможно сделать активными не стартовавшие бизнес-процессы.'"); КонецЕсли; @@ -250,6 +264,9 @@ // Отмечает указанные бизнес-процессы как остановленные. // +// Параметры: +// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы. +// Процедура ОстановитьБизнесПроцессы(БизнесПроцессы) Экспорт НачатьТранзакцию(); @@ -267,10 +284,13 @@ ВызватьИсключение; КонецПопытки; -КонецПроцедуры +КонецПроцедуры // Отмечает указанный бизнес-процесс как остановленный. // +// Параметры: +// БизнесПроцесс - БизнесПроцессСсылка - ссылка на бизнес-процесс. +// Процедура ОстановитьБизнесПроцесс(БизнесПроцесс) Экспорт Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда @@ -308,6 +328,9 @@ // Отмечает указанные задачи как принятые к исполнению. // +// Параметры: +// Задачи - Массив - массив ссылок на задачи. +// Процедура ПринятьЗадачиКИсполнению(Задачи) Экспорт НовыйМассивЗадач = Новый Массив(); @@ -318,7 +341,7 @@ Для каждого Задача Из Задачи Цикл - Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Продолжить; КонецЕсли; @@ -350,6 +373,9 @@ // Отмечает указанные задачи как не принятые к исполнению. // +// Параметры: +// Задачи - Массив - массив ссылок на задачи. +// Процедура ОтменитьПринятиеЗадачКИсполнению(Задачи) Экспорт НовыйМассивЗадач = Новый Массив(); @@ -396,18 +422,25 @@ // ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. // // Возвращаемое значение: -// Булево +// Булево - Если Истина, то задача является ведущей. // Функция ЭтоВедущаяЗадача(ЗадачаСсылка) Экспорт УстановитьПривилегированныйРежим(Истина); Результат = БизнесПроцессыИЗадачиСервер.ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка); Возврат НЕ Результат.Пустой(); - -КонецФункции + +КонецФункции -// Формирует список подбора для указания исполнителя в полях -// ввода составного типа (Пользователь и Роль). +// Формирует список подбора для указания исполнителя в полях +// ввода составного типа (Пользователь и Роль). +// +// Параметры: +// Текст - Строка - Фрагмент текста для поиска возможных исполнителей. +// +// Возвращаемое значение: +// СписокЗначений - Список подбора содержащий возможных исполнителей. +// Функция СформироватьДанныеВыбораИсполнителя(Текст) Экспорт ДанныеВыбора = Новый СписокЗначений; @@ -466,6 +499,7 @@ #КонецОбласти + #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -497,7 +531,7 @@ Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат 0; - КонецЕсли; + КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -508,7 +542,7 @@ | Задачи.БизнесПроцесс = &БизнесПроцесс | И Задачи.Выполнена = ЛОЖЬ"; - Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс); + Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl index c71674db0..6e382aee5 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -10,6 +5,9 @@ // Отмечает указанный бизнес-процесс как остановленный. // +// Параметры: +// ПараметрКоманды - Массив, БизнесПроцессСсылка - массив ссылок на бизнес процессы или ссылка на бизнес процесс. +// Процедура Остановить(Знач ПараметрКоманды) Экспорт ТекстВопроса = ""; @@ -20,12 +18,12 @@ Если ПараметрКоманды.Количество() = 0 Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; - КонецЕсли; + КонецЕсли; Если ПараметрКоманды.Количество() = 1 И ТипЗнч(ПараметрКоманды[0]) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; - КонецЕсли; + КонецЕсли; ЧислоЗадач = БизнесПроцессыИЗадачиВызовСервера.КоличествоНевыполненныхЗадачБизнесПроцессов(ПараметрКоманды); Если ПараметрКоманды.Количество() = 1 Тогда @@ -37,19 +35,19 @@ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Будет выполнена остановка бизнес-процесса ""%1"". Продолжить?'"), Строка(ПараметрКоманды[0])); - КонецЕсли; + КонецЕсли; Иначе ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Будет выполнена остановка бизнес-процессов (%1) и всех их невыполненных задач (%2). Продолжить?'"), ПараметрКоманды.Количество(), ЧислоЗадач); - КонецЕсли; + КонецЕсли; Иначе Если ТипЗнч(ПараметрКоманды) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс'")); Возврат; - КонецЕсли; + КонецЕсли; ЧислоЗадач = БизнесПроцессыИЗадачиВызовСервера.КоличествоНевыполненныхЗадачБизнесПроцесса(ПараметрКоманды); Если ЧислоЗадач > 0 Тогда @@ -60,8 +58,8 @@ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Будет выполнена остановка бизнес-процесса ""%1"". Продолжить?'"), Строка(ПараметрКоманды)); - КонецЕсли; - + КонецЕсли; + КонецЕсли; Оповещение = Новый ОписаниеОповещения("ОстановитьЗавершение", ЭтотОбъект, ПараметрКоманды); @@ -70,10 +68,12 @@ КонецПроцедуры // Отмечает указанный бизнес-процесс как остановленный. -// Предназначена для вызова из формы бизнес-процесса. +// Предназначена для вызова из формы бизнес-процесса. +// +// Параметры: +// Форма - УправляемаяФорма - форма бизнес-процесса. // Процедура ОстановитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт - Форма.Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияБизнесПроцессов.Остановлен"); ОчиститьСообщения(); Форма.Записать(); @@ -88,6 +88,9 @@ // Отмечает указанный бизнес-процесс как активный. // +// Параметры: +// ПараметрКоманды - Массив, СтрокаГруппировкиДинамическогоСписка, БизнесПроцессСсылка - Бизнес процесс. +// Процедура СделатьАктивным(Знач ПараметрКоманды) Экспорт ТекстВопроса = ""; @@ -98,34 +101,34 @@ Если ПараметрКоманды.Количество() = 0 Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; - КонецЕсли; + КонецЕсли; Если ПараметрКоманды.Количество() = 1 И ТипЗнч(ПараметрКоманды[0]) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; - КонецЕсли; + КонецЕсли; ЧислоЗадач = БизнесПроцессыИЗадачиВызовСервера.КоличествоНевыполненныхЗадачБизнесПроцессов(ПараметрКоманды); Если ПараметрКоманды.Количество() = 1 Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Бизнес-процесс ""%1"" и все его задачи (%2) будут сделаны активными. Продолжить?'"), + НСтр("ru = 'Бизнес-процесс ""%1"" и все его задачи (%2) будут сделаны активными. Продолжить?'"), Строка(ПараметрКоманды[0]), ЧислоЗадач); Иначе ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Бизнес-процессы (%1) и их задачи (%2) будут сделаны активными. Продолжить?'"), + НСтр("ru = 'Бизнес-процессы (%1) и их задачи (%2) будут сделаны активными. Продолжить?'"), ПараметрКоманды.Количество(), ЧислоЗадач); - КонецЕсли; + КонецЕсли; Иначе Если ТипЗнч(ПараметрКоманды) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; - КонецЕсли; + КонецЕсли; ЧислоЗадач = БизнесПроцессыИЗадачиВызовСервера.КоличествоНевыполненныхЗадачБизнесПроцесса(ПараметрКоманды); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Бизнес-процесс ""%1"" и все его задачи (%2) будут сделаны активными. Продолжить?'"), + НСтр("ru = 'Бизнес-процесс ""%1"" и все его задачи (%2) будут сделаны активными. Продолжить?'"), Строка(ПараметрКоманды), ЧислоЗадач); КонецЕсли; @@ -136,7 +139,10 @@ КонецПроцедуры // Отмечает указанный бизнес-процесс как активный. -// Предназначена для вызова из формы бизнес-процесса. +// Предназначена для вызова из формы бизнес-процесса. +// +// Параметры: +// Форма - УправляемаяФорма - форма бизнес-процесса. // Процедура ПродолжитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт @@ -154,33 +160,37 @@ // Отмечает указанные задачи как принятые к исполнению. // +// Параметры: +// МассивЗадач - Массив - массив ссылок на задачи. +// Процедура ПринятьЗадачиКИсполнению(Знач МассивЗадач) Экспорт БизнесПроцессыИЗадачиВызовСервера.ПринятьЗадачиКИсполнению(МассивЗадач); Если МассивЗадач.Количество() = 0 Тогда ПоказатьПредупреждение(,НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; - ИначеЕсли МассивЗадач.Количество() <> 1 Тогда - Состояние(НСтр("ru = 'Задачи приняты к исполнению.'")); - Иначе - Состояние(НСтр("ru = 'Задача принята к исполнению.'")); - КонецЕсли; + КонецЕсли; ТипЗначенияЗадачи = Неопределено; Для каждого Задача Из МассивЗадач Цикл Если ТипЗнч(Задача) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ТипЗначенияЗадачи = ТипЗнч(Задача); Прервать; - КонецЕсли; - КонецЦикла; + КонецЕсли; + КонецЦикла; Если ТипЗначенияЗадачи <> Неопределено Тогда ОповеститьОбИзменении(ТипЗначенияЗадачи); - КонецЕсли; + КонецЕсли; КонецПроцедуры // Отмечает указанную задачу как принятую к исполнению. // +// Параметры: +// Форма - УправляемаяФорма - Форма задачи. +// ТекущийПользователь - СправочникСсылка.ВнешниеПользователи, СправочникСсылка.Пользователи - ссылка на текущего +// пользователя программы. +// Процедура ПринятьЗадачуКИсполнению(Форма, ТекущийПользователь) Экспорт Форма.Объект.ПринятаКИсполнению = Истина; @@ -194,7 +204,6 @@ ОчиститьСообщения(); Форма.Записать(); - Состояние(НСтр("ru = 'Задача принята к исполнению.'")); ОбновитьДоступностьКомандПринятияКИсполнению(Форма); ОповеститьОбИзменении(Форма.Объект.Ссылка); @@ -202,36 +211,40 @@ // Отмечает указанные задачи как не принятые к исполнению. // +// Параметры: +// МассивЗадач - Массив - массив ссылок на задачи. +// Процедура ОтменитьПринятиеЗадачКИсполнению(Знач МассивЗадач) Экспорт БизнесПроцессыИЗадачиВызовСервера.ОтменитьПринятиеЗадачКИсполнению(МассивЗадач); + Если МассивЗадач.Количество() = 0 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; - ИначеЕсли МассивЗадач.Количество() <> 1 Тогда - Состояние(НСтр("ru = 'Задачи помечены как НЕ принятые к исполнению.'")); - Иначе - Состояние(НСтр("ru = 'Задача помечена как НЕ принятая к исполнению.'")); - КонецЕсли; + КонецЕсли; ТипЗначенияЗадачи = Неопределено; Для каждого Задача Из МассивЗадач Цикл Если ТипЗнч(Задача) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ТипЗначенияЗадачи = ТипЗнч(Задача); Прервать; - КонецЕсли; - КонецЦикла; + КонецЕсли; + КонецЦикла; + Если ТипЗначенияЗадачи <> Неопределено Тогда ОповеститьОбИзменении(ТипЗначенияЗадачи); - КонецЕсли; + КонецЕсли; КонецПроцедуры // Отмечает указанную задачу как не принятую к исполнению. // +// Параметры: +// Форма - УправляемаяФорма - Форма задачи. +// Процедура ОтменитьПринятиеЗадачиКИсполнению(Форма) Экспорт - Форма.Объект.ПринятаКИсполнению = Ложь; + Форма.Объект.ПринятаКИсполнению = Ложь; Форма.Объект.ДатаПринятияКИсполнению = "00010101000000"; Если Не Форма.Объект.РольИсполнителя.Пустая() Тогда Форма.Объект.Исполнитель = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); @@ -239,7 +252,6 @@ ОчиститьСообщения(); Форма.Записать(); - Состояние(НСтр("ru = 'Задача помечена как НЕ принятая к исполнению.'")); ОбновитьДоступностьКомандПринятияКИсполнению(Форма); ОповеститьОбИзменении(Форма.Объект.Ссылка); @@ -247,6 +259,9 @@ // Устанавливает доступность команд принятия к исполнению. // +// Параметры: +// Форма - УправляемаяФорма - Форма задачи. +// Процедура ОбновитьДоступностьКомандПринятияКИсполнению(Форма) Экспорт Если Форма.Объект.ПринятаКИсполнению = Истина Тогда @@ -261,15 +276,16 @@ Иначе Форма.Элементы.ФормаПринятьКИсполнению.Доступность = Истина; Форма.Элементы.ФормаОтменитьПринятиеКИсполнению.Доступность = Ложь; - КонецЕсли; + КонецЕсли; КонецПроцедуры // Открывает форму для настройки отложенного старта бизнес процесса. // // Параметры: -// - БизнесПроцесс - БизнесПроцессСсылка - процесс для которого следует открыть форму настройки -// отложенного старта. +// БизнесПроцесс - - БизнесПроцессСсылка - процесс для которого следует открыть форму настройки +// отложенного старта. +// СрокИсполнения - Дата - дата указывающая на срок исполнения. // Процедура НастроитьОтложенныйСтарт(БизнесПроцесс, СрокИсполнения) Экспорт @@ -295,13 +311,13 @@ // Дополнительные процедуры и функции. // Стандартный обработчик оповещения для форм выполнения задач. -// Для вызова из обработчика события формы ОбработкаОповещения. +// Для вызова из обработчика события формы ОбработкаОповещения. // // Параметры: -// Форма - УправляемаяФорма - форма выполнения задачи. -// ИмяСобытия - Строка - имя события. -// Параметр - Произвольный - параметр события. -// Источник - Произвольный - источник события. +// Форма - УправляемаяФорма - Форма выполнения задачи. +// ИмяСобытия - Строка - Имя события. +// Параметр - Произвольный - Параметр события. +// Источник - Произвольный - Источник события. // Процедура ФормаЗадачиОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт @@ -319,10 +335,17 @@ КонецПроцедуры // Стандартный обработчик ПередНачаломДобавления для списков задач. -// Для вызова из обработчика события таблицы формы ПередНачаломДобавления. +// Для вызова из обработчика события таблицы формы ПередНачаломДобавления. // // Параметры: -// аналогичны параметрам обработчика таблицы формы ПередНачаломДобавления. +// Форма - УправляемаяФорма - Форма задачи. +// Элемент - Произвольный - Элементы таблицы формы. +// Отказ - Булево - Признак отказа от добавления объекта. Если в теле процедуры-обработчика установить данному +// параметру значение Истина, то добавление объекта выполнено не будет. +// Копирование - Булево - Определяет режим копирования. Если установлено Истина, то происходит копирование строки. +// Родитель - Неопределено, СправочникСсылка, ПланСчетовСсылка - Ссылка на элемент, который будет использован при +// добавлении в качестве родителя. +// Группа - Булево - Признак добавления группы. Истина - будет добавлена группа. // Процедура СписокЗадачПередНачаломДобавления(Форма, Элемент, Отказ, Копирование, Родитель, Группа) Экспорт @@ -422,10 +445,13 @@ КонецПроцедуры -// Открыть форму с дополнительной информацией о задаче. +// Открыть форму с дополнительной информацией о задаче. // // Параметры: -// ЗадачаСсылка - ЗадачаИсполнителяСсылка - задача. +// ЗадачаСсылка - ЗадачаСсылка - Ссылка на задачу. +// +// Возвращаемое значение: +// УправляемаяФорма - форма дополнительно задачи исполнителя. // Функция ОткрытьДопИнформациюОЗадаче(Знач ЗадачаСсылка) Экспорт @@ -511,27 +537,17 @@ Если Результат <> КодВозвратаДиалога.Да Тогда Возврат; - КонецЕсли; - + КонецЕсли; + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); - Иначе - Состояние(НСтр("ru = 'Идет остановка бизнес-процессов. Пожалуйста подождите...'")); - КонецЕсли; БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцессы(ПараметрКоманды); - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы остановлены.'")); - КонецЕсли; - Иначе - Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); + Иначе + БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцесс(ПараметрКоманды); - Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); - КонецЕсли; + + КонецЕсли; Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда @@ -542,15 +558,15 @@ Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ОповеститьОбИзменении(ТипЗнч(Параметр)); Прервать; - КонецЕсли; + КонецЕсли; КонецЦикла; КонецЕсли; Иначе - ОповеститьОбИзменении(ПараметрКоманды); - КонецЕсли; + ОповеститьОбИзменении(ПараметрКоманды); + КонецЕсли; КонецПроцедуры @@ -573,29 +589,17 @@ Если Результат <> КодВозвратаДиалога.Да Тогда Возврат; - КонецЕсли; + КонецЕсли; Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи делаются активными. Пожалуйста подождите...'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы и их задачи делаются активными. Пожалуйста подождите...'")); - КонецЕсли; - БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцессы(ПараметрКоманды); - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы и их задачи сделаны активными.'")); - КонецЕсли; + Иначе - Иначе - Состояние(НСтр("ru = 'Идет отмена остановки бизнес-процесса. Пожалуйста подождите...'")); БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцесс(ПараметрКоманды); - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); - КонецЕсли; + + КонецЕсли; Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда @@ -606,16 +610,16 @@ Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда ОповеститьОбИзменении(ТипЗнч(Параметр)); Прервать; - КонецЕсли; + КонецЕсли; КонецЦикла; КонецЕсли; Иначе - ОповеститьОбИзменении(ПараметрКоманды); - КонецЕсли; - + ОповеститьОбИзменении(ПараметрКоманды); + КонецЕсли; + КонецПроцедуры Процедура ПеренаправитьЗадачиЗавершение(Знач Результат, Знач МассивЗадач) Экспорт @@ -624,28 +628,10 @@ Возврат; КонецЕсли; - Если МассивЗадач.Количество() > 10 Тогда - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Выполняется перенаправление задач...'")); - КонецЕсли; МассивПеренаправленныхЗадач = Неопределено; ЗадачиПеренаправлены = БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи( МассивЗадач, Результат, Ложь, МассивПеренаправленныхЗадач); - Если МассивЗадач.Количество() > 1 Тогда - Если ЗадачиПеренаправлены Тогда - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Задачи перенаправлены:'") + " " + МассивЗадач.Количество()); - Иначе - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Не все задачи перенаправлены. Пропущены задачи, отмеченные как выполненные.'")); - КонецЕсли; - Иначе - Задача = МассивПеренаправленныхЗадач[0]; - ПоказатьОповещениеПользователя( - НСтр("ru = 'Задача перенаправлена'"), - ПолучитьНавигационнуюСсылку(Задача), - Строка(Задача)); - КонецЕсли; + Оповестить("Запись_ЗадачаИсполнителя", Новый Структура("Перенаправлена", Истина), МассивЗадач); КонецПроцедуры diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl index b4fe8dfd3..d80a0ff51 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl @@ -1,28 +1,22 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при открытии формы выбора исполнителя. -// Позволяет переопределить стандартную форму выбора. +// Позволяет переопределить стандартную форму выбора. // // Параметры: -// ЭлементИсполнитель - ЭлементФормы - элемент формы, в которой выполняется выбора исполнителя, -// который будет указан как владелец формы выбора исполнителя. -// РеквизитИсполнитель - СправочникСсылка.Пользователи - выбранное ранее значение исполнителя. -// Используется для установки текущей строки в форме выбора исполнителя. -// ТолькоПростыеРоли - Булево, если Истина, то указывает что для выбора нужно -// использовать только роли без объектов адресации. -// БезВнешнихРолей - Булево, если Истина, то указывает, что для выбора надо -// использовать только роли, у которых не установлен признак ВнешняяРоль. -// СтандартнаяОбработка - Булево - если установить в Ложь, то не требуется выводить стандартную форму выбора -// исполнителя. +// ЭлементИсполнитель - ЭлементФормы - элемент формы, в которой выполняется выбора исполнителя, +// который будет указан как владелец формы выбора исполнителя. +// РеквизитИсполнитель - СправочникСсылка.Пользователи - выбранное ранее значение исполнителя. Используется +// для установки текущей строки в форме выбора исполнителя. +// ТолькоПростыеРоли - Булево - Если Истина, то указывает что для выбора нужно +// использовать только роли без объектов адресации. +// БезВнешнихРолей - Булево - Если Истина, то указывает, что для выбора надо использовать только роли, +// у которых не установлен признак ВнешняяРоль. +// СтандартнаяОбработка - Булево - Если Ложь, то не требуется выводить стандартную форму выбора исполнителя. // -Процедура ПриВыбореИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли, БезВнешнихРолей, - СтандартнаяОбработка) Экспорт +Процедура ПриВыбореИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли, + БезВнешнихРолей, СтандартнаяОбработка) Экспорт -КонецПроцедуры +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl index e624e81f2..662061ed3 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl index 9be59fe66..e27f020b9 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl @@ -1,15 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Вызывается для обновления данных бизнес-процесса в регистре сведений. -// ДанныеБизнесПроцессов. -// +// Вызывается для обновления данных бизнес-процесса в регистре сведений ДанныеБизнесПроцессов. +// // Параметры: -// Запись - РегистрСведенийЗапись.ДанныеБизнесПроцессов +// Запись - РегистрСведенийЗапись.ДанныеБизнесПроцессов - Запись данных бизнес-процесса. // Процедура ПриЗаписиСпискаБизнесПроцессов(Запись) Экспорт @@ -49,7 +43,7 @@ // * ИмяФормы - имя формы, передаваемое в метод ОткрытьФорму. // * ПараметрыФормы - содержит параметры открываемой формы. // -// Пример заполнения: +// Пример: // Если ИмяБизнесПроцесса = "Задание" Тогда // ИмяФормы = "БизнесПроцесс.Задание.Форма.ВнешнееДействие" + ТочкаМаршрутаБизнесПроцесса.Имя; // ПараметрыФормы.Вставить("ИмяФормы", ИмяФормы); @@ -71,13 +65,20 @@ // подключенного к подсистеме "Бизнес-процессы и задачи". // В качестве значения - пустую строку. // -// Например: +// Пример: // ПодключенныеБизнесПроцессы.Вставить(Метаданные.БизнесПроцессы.ЗаданиеСРолевойАдресацией.ПолноеИмя(), ""); // Процедура ПриОпределенииБизнесПроцессов(ПодключенныеБизнесПроцессы) Экспорт +КонецПроцедуры + +// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа. +Процедура ПриЗаполненииНаборовЗначенийДоступа(Объект, Таблица) Экспорт + + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl index c5a233a17..fd97ba9d6 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -1,20 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Инициализирует общие параметры формы выполнения задачи. // // Параметры: -// ФормаЗадачи - УправляемаяФорма - форма выполнения задачи. -// ЗадачаОбъект - ЗадачаОбъект - объект задачи. -// ЭлементГруппаСостояние - ГруппаФормы - группа с информации о состоянии задачи. -// ЭлементДатаИсполнения - ПолеВвода - поле с датой исполнения задачи. +// ФормаЗадачи - УправляемаяФорма - форма выполнения задачи. +// ЗадачаОбъект - ЗадачаОбъект - объект задачи. +// ЭлементГруппаСостояние - ГруппаФормы - группа с информации о состоянии задачи. +// ЭлементДатаИсполнения - ПолеФормы - поле с датой исполнения задачи. // -Процедура ФормаЗадачиПриСозданииНаСервере(ФормаЗадачи, ЗадачаОбъект, - ЭлементГруппаСостояние, ЭлементДатаИсполнения) Экспорт +Процедура ФормаЗадачиПриСозданииНаСервере(ФормаЗадачи, ЗадачаОбъект, + ЭлементГруппаСостояние, ЭлементДатаИсполнения) Экспорт + ФормаЗадачи.ТолькоПросмотр = ЗадачаОбъект.Выполнена; Если ЗадачаОбъект.Выполнена Тогда @@ -72,7 +68,8 @@ // Вызывается при создании формы списка задач на сервере. // // Параметры: -// УсловноеОформлениеСпискаЗадач - УсловноеОформление - условное оформление списка задач. +// СписокЗадачИлиЕгоУсловноеОформление - ДинамическийСписок, УсловноеОформлениеКомпоновкиДанных - условное +// оформление списка задач. // Процедура УстановитьОформлениеЗадач(Знач СписокЗадачИлиЕгоУсловноеОформление) Экспорт @@ -231,12 +228,18 @@ // либо указанного в параметрах РольИсполнителя, ОсновнойОбъектАдресации и ДополнительныйОбъектАдресации. // // Параметры: -// Исполнитель - ПользовательСсылка - исполнитель задачи. -// РольИсполнителя - Справочники.РолиИсполнителей - роль. -// ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации - произвольный ссылочный тип. +// Исполнитель - ПользовательСсылка - исполнитель задачи. +// РольИсполнителя - Справочники.РолиИсполнителей - роль. +// ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. +// ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. // // Возвращаемое значение: -// Строка +// Строка - строковое представление исполнителя задачи, например: +// "Иванов Иван Иванович" - исполнитель, как указано в параметре Исполнитель; +// "Главный бухгалтер" - роль исполнителя, указанная в параметре РольИсполнителя; +// "Главный бухгалтер (ООО Солнышко)" - если роль указана вместе с основным объектом адресации; +// "Главный бухгалтер (ОАО Солнышко, Филиал в г.Москва)" - если роль указана вместе с обоими объектами +// адресации. // Функция ИсполнительСтрокой(Знач Исполнитель, Знач РольИсполнителя, Знач ОсновнойОбъектАдресации = Неопределено, Знач ДополнительныйОбъектАдресации = Неопределено) Экспорт @@ -250,14 +253,19 @@ КонецФункции -// Возвращает строковое представление роли РольИсполнителя. +// Возвращает строковое представление роли РольИсполнителя и ее объектов адресации, если они заданы. // // Параметры: -// РольИсполнителя - Справочники.РолиИсполнителей - роль. -// ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации - произвольный ссылочный тип. -// +// РольИсполнителя - Справочники.РолиИсполнителей - роль. +// ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. +// ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. +// // Возвращаемое значение: -// Строка +// Строка - строковое представление роли, например: +// "Главный бухгалтер" - роль исполнителя, указанная в параметре РольИсполнителя; +// "Главный бухгалтер (ООО Солнышко)" - если роль указана вместе с основным объектом адресации; +// "Главный бухгалтер (ОАО Солнышко, Филиал в г.Москва)" - если роль указана вместе с обоими объектами +// адресации. // Функция РольСтрокой(Знач РольИсполнителя, Знач ОсновнойОбъектАдресации = Неопределено, Знач ДополнительныйОбъектАдресации = Неопределено) Экспорт @@ -277,11 +285,11 @@ КонецФункции -// Помечает на удаление задачи бизнес-процесса БизнесПроцессСсылка. +// Помечает на удаление (или снимает отметку) все задачи указанного бизнес-процесса. // // Параметры: -// БизнесПроцессСсылка - бизнес-процесс. -// ПометкаУдаления - Булево - значение свойства ПометкаУдаления. +// БизнесПроцессСсылка - БизнесПроцессСсылка - бизнес-процесс, задачи которого нужно пометить на удаление. +// ПометкаУдаления - Булево - значение свойства ПометкаУдаления для задач. // Процедура УстановитьПометкуУдаленияЗадач(БизнесПроцессСсылка, ПометкаУдаления) Экспорт @@ -317,32 +325,32 @@ КонецПроцедуры // Установить формат отображения и редактирования поля формы типа Дата -// в зависимости от настроек подсистемы. +// в зависимости от настроек подсистемы. // // Параметры: -// ПолеДаты - элемент управления формы, поле со значением типа Дата. +// ПолеДаты - ПолеФормы - элемент управления формы, поле со значением типа Дата. // Процедура УстановитьФорматДаты(ПолеДаты) Экспорт ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); СтрокаФормата = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); Если ПолеДаты.Вид = ВидПоляФормы.ПолеВвода Тогда - ПолеДаты.ФорматРедактирования = СтрокаФормата; + ПолеДаты.ФорматРедактирования = СтрокаФормата; Иначе - ПолеДаты.Формат = СтрокаФормата; - КонецЕсли; - ПолеДаты.Ширина = ?(ИспользоватьДатуИВремяВСрокахЗадач, 0, 8); + ПолеДаты.Формат = СтрокаФормата; + КонецЕсли; + ПолеДаты.Ширина = ?(ИспользоватьДатуИВремяВСрокахЗадач, 0, 9); -КонецПроцедуры +КонецПроцедуры // Получить бизнес-процессы ведущей задачи ЗадачаСсылка. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - ведущая задача. // ДляИзменения - Булево - если Истина, то следует установить исключительную управляемую блокировку // на все бизнес-процессы указанной ведущей задачи. По умолчанию, Ложь. // Возвращаемое значение: -// Массив - массив бизнес-процессов. +// Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>). // Функция БизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт @@ -352,15 +360,15 @@ КонецФункции // Возвращает дату завершения указанного бизнес-процесса, -// полученную как максимальная дата исполнения задач бизнес-процесса. +// полученную как максимальная дата исполнения задач бизнес-процесса. // // Параметры: -// БизнесПроцессСсылка - бизнес-процесс. -// +// БизнесПроцессСсылка - БизнесПроцессСсылка - Ссылка на бизнес- процесс. +// // Возвращаемое значение: -// Дата +// Дата - Дата завершения указанного бизнес-процесса. // -Функция ДатаЗавершенияБизнесПроцесса(БизнесПроцессСсылка) Экспорт +Функция ДатаЗавершенияБизнесПроцесса(БизнесПроцессСсылка) Экспорт ВыполнитьПроверкуПравДоступа("Чтение", БизнесПроцессСсылка.Метаданные()); УстановитьПривилегированныйРежим(Истина); @@ -394,7 +402,7 @@ // на все бизнес-процессы, подчиненные указанной задаче. По умолчанию, Ложь. // // Возвращаемое значение: -// Массив - массив ссылок на бизнес-процессы. +// Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>). // Функция БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт @@ -489,10 +497,13 @@ КонецПроцедуры -// Установить исключительную управляемую блокировку на массив переданных бизнес-процессов. +// Установить исключительную управляемую блокировку на указанные бизнес-процессы. +// Для вызова из обработчиков команд динамических список. +// Строки группировки динамического списка игнорируются. // // Параметры: -// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы, или одна ссылка на бизнес-процесс. +// БизнесПроцессы - Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>), +// или одна ссылка на бизнес-процесс. // Процедура ЗаблокироватьБизнесПроцессы(БизнесПроцессы) Экспорт @@ -518,10 +529,12 @@ КонецПроцедуры -// Установить исключительную управляемую блокировку на массив переданных задач. +// Установить исключительную управляемую блокировку на указанные задачи. +// Для вызова из обработчиков команд динамических список. +// Строки группировки динамического списка игнорируются. // // Параметры: -// Задачи - Массив - массив ссылок на задачи, или одна ссылка ЗадачаСсылка.ЗадачаИсполнителя. +// Задачи - Массив, ЗадачаСсылка.ЗадачаИсполнителя - ссылки на задачи, или одна ссылка. // Процедура ЗаблокироватьЗадачи(Задачи) Экспорт @@ -547,8 +560,12 @@ КонецПроцедуры -// Заполняет реквизит ГлавнаяЗадача при создании бизнес-процесса -// на основании другого бизнес-процесса. +// Заполняет реквизит ГлавнаяЗадача при создании бизнес-процесса на основании другого бизнес-процесса. +// См. также БизнесПроцессыИЗадачиПереопределяемый.ПриЗаполненииГлавнойЗадачиБизнесПроцесса. +// +// Параметры: +// БизнесПроцессОбъект - БизнесПроцессОбъект - бизнес-процесс, который требуется заполнить. +// ДанныеЗаполнения - ЗадачаСсылка, Произвольный - данные заполнения, которые передаются в обработчик заполнения. // Процедура ЗаполнитьГлавнуюЗадачу(БизнесПроцессОбъект, ДанныеЗаполнения) Экспорт @@ -569,15 +586,15 @@ КонецПроцедуры // Получить группу исполнителей задач, которая соответствует реквизитам адресации. -// Если группа еще не существует, то создается и возвращается новая. -// +// Если группа еще не существует, то создается и возвращается новая. +// // Параметры: -// РольИсполнителя - СправочникСсылка.РолиИсполнителей. -// ОсновнойОбъектАдресации - ЛюбаяСсылка. -// ДополнительныйОбъектАдресации - ЛюбаяСсылка. +// РольИсполнителя - СправочникСсылка.РолиИсполнителей - роль исполнителя. +// ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. +// ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. // // Возвращаемое значение: -// СправочникСсылка.ГруппыИсполнителейЗадач. +// СправочникСсылка.ГруппыИсполнителейЗадач - Найденная по роли группа исполнителей задач. // Функция ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Экспорт @@ -620,7 +637,7 @@ ВызватьИсключение; КонецПопытки; Возврат ГруппаИсполнителей; - + КонецФункции //////////////////////////////////////////////////////////////////////////////// @@ -629,8 +646,8 @@ // Добавляет процесс в очередь для отложенного старта. // // Параметры: -// Процесс - БизнесПроцессСсылка. -// ДатаСтарта - Дата - дата отложенного старта. +// Процесс - БизнесПроцессСсылка - Бизнес процесс для отложенного старта. +// ДатаСтарта - Дата - Дата отложенного старта. // Процедура ДобавитьПроцессДляОтложенногоСтарта(Процесс, ДатаСтарта) Экспорт @@ -653,7 +670,7 @@ // Отключает отложенный старт процесс. // // Параметры: -// Процесс - БизнесПроцессСсылка. +// Процесс - БизнесПроцессСсылка -Бизнес процесс у которого требуется отключить отложенный старт. // Процедура ОтключитьОтложенныйСтартПроцесса(Процесс) Экспорт @@ -716,15 +733,15 @@ // Возвращает сведения о запуске для процесса. // // Параметры: -// - Процесс - БизнесПроцессСсылка. -// +// Процесс - БизнесПроцессСсылка -Бизнес процесс у которого требуется получить сведения о запуске. +// // Возвращаемое значение: -// - Неопределено - Возвращается если сведений нет. -// - Структура - Если есть. -// - БизнесПроцесс - БизнесПроцессСсылка. -// - ДатаОтложенногоСтарта - ДатаИВремя. -// - Состояние - ПеречислениеСсылка.СостоянияПроцессовДляЗапуска. -// - ПричинаОтменыСтарта - Строка - Причина отмены старта. +// - Неопределено - Возвращается если сведений нет. +// - Структура - Если есть. +// * БизнесПроцесс - БизнесПроцессСсылка. +// * ДатаОтложенногоСтарта - ДатаИВремя. +// * Состояние - ПеречислениеСсылка.СостоянияПроцессовДляЗапуска. +// * ПричинаОтменыСтарта - Строка - Причина отмены старта. // Функция ПараметрыОтложенногоПроцесса(Процесс) Экспорт @@ -760,12 +777,14 @@ КонецФункции -// Возвращает дату старта отложенного бизнес-процесса в том случае, -// когда БизнесПроцесс ожидает отложенного старта. -// В противном случае возвращает пустую дату. +// Возвращает дату старта отложенного бизнес-процесса в том случае, когда БизнесПроцесс +// ожидает отложенного старта. В противном случае возвращает пустую дату. // // Параметры: -// - БизнесПроцесс +// БизнесПроцесс - БизнесПроцессСсылка -Бизнес процесс у которого требуется получить дату отложенного старта. +// +// Возвращаемое значение: +// Дата - Дата отложенного старта. // Функция ДатаОтложенногоСтартаПроцесса(БизнесПроцесс) Экспорт @@ -788,12 +807,22 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики регламентных заданий. -// Обработчик регламентного задания УведомлениеИсполнителейОНовыхЗадачах. +// Выполняет рассылку уведомлений исполнителям о новых задачах за период с момента предыдущей рассылки. +// Рассылка выполняется по почте от имени системной учетной записи. +// Также является обработчиком регламентного задания УведомлениеИсполнителейОНовыхЗадачах. // Процедура УведомитьИсполнителейОНовыхЗадачах() Экспорт ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.УведомлениеИсполнителейОНовыхЗадачах); - ПроверитьСистемнаяУчетнаяЗаписьНастроена(); + + ОписаниеОшибки = ""; + ВидСообщения = НСтр("ru = 'Бизнес-процессы и задачи. Уведомление о новых задачах.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + + Если НЕ СистемнаяУчетнаяЗаписьНастроена(ОписаниеОшибки) Тогда + ЗаписьЖурналаРегистрации(ВидСообщения, УровеньЖурналаРегистрации.Ошибка, + Метаданные.РегламентныеЗадания.УведомлениеИсполнителейОНовыхЗадачах,, ОписаниеОшибки); + Возврат; + КонецЕсли; ДатаУведомления = ТекущаяДатаСеанса(); ДатаПоследнегоУведомления = Константы.ДатаУведомленияОНовыхЗадачах.Получить(); @@ -805,13 +834,10 @@ ДатаПоследнегоУведомления = ДатаУведомления - 24*60*60; КонецЕсли; - ВидСообщения = НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - ЗаписьЖурналаРегистрации(ВидСообщения, - УровеньЖурналаРегистрации.Информация, , , + ЗаписьЖурналаРегистрации(ВидСообщения, УровеньЖурналаРегистрации.Информация,,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Начато регламентное уведомление о новых задачах за период %1 - %2'"), - ДатаПоследнегоУведомления, ДатаУведомления)); - + ДатаПоследнегоУведомления, ДатаУведомления)); + ЗадачиПоИсполнителям = ВыбратьНовыеЗадачиПоИсполнителям(ДатаПоследнегоУведомления, ДатаУведомления); Для Каждого СтрокаИсполнителя Из ЗадачиПоИсполнителям.Строки Цикл ОтправитьУведомлениеОНовыхЗадачах(СтрокаИсполнителя.Исполнитель, СтрокаИсполнителя); @@ -821,19 +847,30 @@ Константы.ДатаУведомленияОНовыхЗадачах.Установить(ДатаУведомления); УстановитьПривилегированныйРежим(Ложь); - ЗаписьЖурналаРегистрации(ВидСообщения, - УровеньЖурналаРегистрации.Информация, , , + ЗаписьЖурналаРегистрации(ВидСообщения, УровеньЖурналаРегистрации.Информация,,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Завершено регламентное уведомление о новых задачах (уведомлено исполнителей: %1)'"), - ЗадачиПоИсполнителям.Строки.Количество())); + ЗадачиПоИсполнителям.Строки.Количество())); КонецПроцедуры -// Обработчик регламентного задания МониторингЗадач. +// Выполняет рассылку уведомлений исполнителям и авторам задач о задачах, не выполненных в срок. +// Рассылка выполняется по почте от имени системной учетной записи. +// Если задача направлена "в никуда", т.е. роли с пустым списком исполнителей, +// то создается новая задача ответственным за настройку ролей. +// +// Также является обработчиком регламентного задания МониторингЗадач. // Процедура ПроконтролироватьЗадачи() Экспорт ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.МониторингЗадач); - ПроверитьСистемнаяУчетнаяЗаписьНастроена(); + ОписаниеОшибки = ""; + + Если НЕ СистемнаяУчетнаяЗаписьНастроена(ОписаниеОшибки) Тогда + ВидСообщения = НСтр("ru = 'Бизнес-процессы и задачи. Мониторинг задач.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ЗаписьЖурналаРегистрации(ВидСообщения, УровеньЖурналаРегистрации.Ошибка, + Метаданные.РегламентныеЗадания.МониторингЗадач,, ОписаниеОшибки); + Возврат; + КонецЕсли; ПросроченныеЗадачи = ВыбратьПросроченныеЗадачи(); Если ПросроченныеЗадачи.Количество() = 0 Тогда @@ -855,7 +892,7 @@ // // Параметры: // Параметры - Структура - структура параметров отложенного обработчика обновления. -// БизнесПроцесс - ОбъектМетаданных - метаданные бизнес-процесса, наборы значений доступа +// БизнесПроцесс - ОбъектМетаданных.БизнесПроцесс - метаданные бизнес-процесса, наборы значений доступа // которого требуется обновить. // ИмяПроцедуры - Строка - имя процедуры отложенного обработчика обновления для журнала регистрации. // РазмерПорции - Число - количество объектов, обрабатываемых за один вызов. @@ -968,104 +1005,58 @@ #Область СлужебныйПрограммныйИнтерфейс -// Объявляет служебные события подсистемы БизнесПроцессыИЗадачи: -// -// Серверные события: -// - -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.НапоминанияПользователя\ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииЗависимостейПравДоступа"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "БизнесПроцессыИЗадачиСервер"); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. +// Обработчики событий подсистем конфигурации. -// Возвращает менеджер временных таблиц, содержащий временную таблицу пользователей -// некоторых дополнительных групп пользователей, например, пользователей групп -// исполнителей задач, которые соответствуют ключам адресации -// (РольИсполнителя + ОсновнойОбъектАдресации + ДополнительныйОбъектАдресации). -// -// При изменении состава дополнительных групп пользователей, необходимо вызвать -// процедуру ОбновитьПользователейГруппИсполнителей в модуле УправлениеДоступом, -// чтобы применить изменения к внутренним данным подсистемы. -// -// Параметры: -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц, в который можно поместить таблицу: -// ТаблицаГруппИсполнителей с полями: -// ГруппаИсполнителей - Например, -// СправочникСсылка.ГруппыИсполнителейЗадач. -// Пользователь - СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи. -// -// СодержаниеПараметра - Неопределено - параметр не указан, вернуть все данные. -// Строка, когда -// "ГруппыИсполнителей" требуется вернуть -// только составы указанных групп исполнителей. -// "Исполнители" требуется вернуть -// только составы групп исполнителей, которые -// в которые входят указанные исполнители. -// -// ЗначениеПараметра - Неопределено, когда СодержаниеПараметра = Неопределено, -// - Например, СправочникСсылка.ГруппыИсполнителейЗадач, -// когда СодержаниеПараметра = "ГруппыИсполнителей". -// - СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи, -// когда СодержаниеПараметра = "Исполнители". -// Массив указанных выше типов. -// -// НетГруппИсполнителей - Булево, если Ложь, МенеджерВременныхТаблиц содержит временную таблицу, иначе нет. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.2.2"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьОтветственногоЗаКонтрольИсполнения"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.6"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьПредметСтрокой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.1.2"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьСостоянияИПринятияКИсполнению"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.2.1.1"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьКодРолиИсполнителя"; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.3.39"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("80A64E76-12CC-4075-A80B-9EB93C411C85"); + Обработчик.Процедура = "БизнесПроцессы.Задание.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.Комментарий = НСтр("ru = 'Обновление прав доступа для бизнес-процесса ""Задание"". + |До завершения обработки будут действовать прежние права доступа к заданиям.'"); + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "БизнесПроцессы.Задание.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "БизнесПроцесс.Задание"; + Обработчик.ИзменяемыеОбъекты = "БизнесПроцесс.Задание"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.БлокируемыеОбъекты = "БизнесПроцесс.Задание"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "2.3.3.70"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновитьИспользованиеРегламентныхЗаданий"; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("86ec32f9-d28f-4282-1e6f-222a8653d2e0"); + Обработчик.Комментарий = + НСтр("ru = 'Определяет использование регламентного задания выполняющего старт отложенных бизнес-процессов.'"); + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПриОпределенииГруппИсполнителей. Процедура ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей) Экспорт НетГруппИсполнителей = Ложь; @@ -1120,15 +1111,7 @@ КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт // Загрузка в справочник ГруппыИсполнителейЗадач запрещена. @@ -1139,18 +1122,7 @@ КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.БизнесПроцессы.Задание.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); Объекты.Вставить(Метаданные.Задачи.ЗадачаИсполнителя.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); @@ -1159,8 +1131,7 @@ Объекты.Вставить(Метаданные.Справочники.РолиИсполнителей.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт Настройка = Настройки.Добавить(); Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.МониторингЗадач; @@ -1175,84 +1146,37 @@ Настройка = Настройки.Добавить(); Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СтартОтложенныхПроцессов; Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьБизнесПроцессыИЗадачи; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт + + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ИсполнителиЗадач.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ДанныеБизнесПроцессов.ПолноеИмя()); КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт - Массив.Добавить(Метаданные.РегистрыСведений.ИсполнителиЗадач.ПолноеИмя()); - Массив.Добавить(Метаданные.РегистрыСведений.ДанныеБизнесПроцессов.ПолноеИмя()); + ШаблоныЗаданий.Добавить("МониторингЗадач"); + ШаблоныЗаданий.Добавить("УведомлениеИсполнителейОНовыхЗадачах"); КонецПроцедуры -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("МониторингЗадач"); - Шаблоны.Добавить("СтартОтложенныхПроцессов"); - Шаблоны.Добавить("УведомлениеИсполнителейОНовыхЗадачах"); - -КонецПроцедуры - -// Переопределяет массив реквизитов объекта, относительно которых разрешается устанавливать время напоминания. -// Например, можно скрыть те реквизиты с датами, которые являются служебными или не имеют смысла для -// установки напоминаний: дата документа или задачи и прочие. -// -// Параметры: -// Источник - Любая ссылка - Ссылка на объект, для которого формируется массив реквизитов с датами. -// МассивРеквизитов - Массив - Массив имен реквизитов (из метаданных), содержащих даты. -// -Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, МассивРеквизитов) Экспорт +// См. НапоминанияПользователяПереопределяемый.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания. +Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами) Экспорт Если ТипЗнч(Источник) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда - МассивРеквизитов.Очистить(); - МассивРеквизитов.Добавить("СрокИсполнения"); - МассивРеквизитов.Добавить("ДатаНачала"); + РеквизитыСДатами.Очистить(); + РеквизитыСДатами.Добавить("СрокИсполнения"); + РеквизитыСДатами.Добавить("ДатаНачала"); КонецЕсли; КонецПроцедуры -// Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, -// от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. -// -// Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект": -// 1) стандартно при чтении "подчиненного" объекта -// проверяется наличие права чтения "ведущего" объекта -// и проверяется отсутствие ограничения чтения "ведущего" объекта; -// 2) стандартно при добавлении, изменении, удалении "подчиненного" объекта -// проверяется наличие права изменения "ведущего" объекта -// и проверяется отсутствие ограничения изменения "ведущего" объекта. -// -// Допускается только одно переназначение по сравнению со стандартным: -// в пункте "2)" вместо проверки права изменения "ведущего" объекта установить -// проверку права чтения "ведущего" объекта. -// -// Параметры: -// ЗависимостиПрав - ТаблицаЗначений с колонками: -// - ВедущаяТаблица - Строка, например, "БизнесПроцесс.Задание". -// - ПодчиненнаяТаблица - Строка, например, "Задача.ЗадачаИсполнителя". -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа. Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт // Задача исполнителя может быть изменена, когда бизнес-процесс доступен только для чтения, @@ -1265,45 +1189,9 @@ КонецПроцедуры -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах. -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - Возврат; - КонецЕсли; - Описание = Описание + " |БизнесПроцесс.Задание.Чтение.Пользователи @@ -1316,22 +1204,7 @@ КонецПроцедуры -// Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. -// -// Параметры: -// ВидыДоступа - ТаблицаЗначений - с колонками: -// * Имя - Строка - имя используемое в описании поставляемых -// профилей групп доступа и текстах ОДД. -// * Представление - Строка - представляет вид доступа в профилях и группах доступа. -// * ТипЗначений - Тип - тип ссылки значений доступа. -// Например, Тип("СправочникСсылка.Номенклатура"). -// * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. -// Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). -// * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно -// выбрать несколько групп значений (Групп доступа номенклатуры). -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Найти("Пользователи", "Имя"); @@ -1343,29 +1216,7 @@ КонецПроцедуры -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функция ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.БизнесПроцессы); @@ -1376,22 +1227,7 @@ МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПросроченныеЗадачи); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -1460,6 +1296,17 @@ КонецПроцедуры +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("БизнесПроцессыИЗадачиСобытия.СтартОтложенныхПроцессов"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Мониторинг и контроль исполнения. @@ -1654,6 +1501,7 @@ НаборПисемПоАдресатам.Колонки.Добавить("КоличествоЗадач"); НаборПисемПоАдресатам.Колонки.Добавить("ТипПисьма"); НаборПисемПоАдресатам.Колонки.Добавить("Получатель"); + НаборПисемПоАдресатам.Индексы.Добавить("ТипПисьма, ПочтовыйАдрес"); Для Каждого ЭлементПросроченныеЗадачи Из ПросроченныеЗадачи Цикл ПросроченнаяЗадача = ЭлементПросроченныеЗадачи.Ссылка; @@ -1661,11 +1509,9 @@ ТекстПисьма = СформироватьПредставлениеЗадачи(ЭлементПросроченныеЗадачи); // Задача адресована лично исполнителю? Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда - ПолучательПисьма = ""; - ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель, ПолучательПисьма); + ПолучательПисьма = АдресЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Исполнитель, ТекстПисьма, "Исполнителю"); - ПолучательПисьма = ""; - ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Автор, ПолучательПисьма); + ПолучательПисьма = АдресЭлектроннойПочты(ПросроченнаяЗадача.Автор); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); Иначе Исполнители = ВыбратьИсполнителейЗадач(ПросроченнаяЗадача); @@ -1674,8 +1520,7 @@ Если Исполнители.Количество() > 0 Тогда // Исполнитель не выполняет свои задачи. Для Каждого Исполнитель Из Исполнители Цикл - ПолучательПисьма = ""; - ПриПолученииАдресаЭлектроннойПочты(Исполнитель.Исполнитель, ПолучательПисьма); + ПолучательПисьма = АдресЭлектроннойПочты(Исполнитель.Исполнитель); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Исполнитель.Исполнитель, ТекстПисьма, "Исполнителю"); КонецЦикла; Иначе // Задачу исполнять некому. @@ -1683,8 +1528,7 @@ КонецЕсли; Для Каждого Координатор Из Координаторы Цикл - ПолучательПисьма = ""; - ПриПолученииАдресаЭлектроннойПочты(Координатор, ПолучательПисьма); + ПолучательПисьма = АдресЭлектроннойПочты(Координатор); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Координатор, ТекстПисьма, "Координатору"); КонецЦикла; КонецЕсли; @@ -1793,7 +1637,7 @@ | ЗадачаИсполнителя.Наименование КАК Наименование, | ЗадачаИсполнителя.СрокИсполнения КАК СрокИсполнения, | ЗадачаИсполнителя.Автор КАК Автор, - | ПОДСТРОКА(ЗадачаИсполнителя.Описание, 1, 250) КАК Описание, + | ЗадачаИсполнителя.Описание КАК Описание, | ВЫБОР | КОГДА ЗадачаИсполнителя.Исполнитель <> Неопределено | ТОГДА ЗадачаИсполнителя.Исполнитель @@ -1830,8 +1674,7 @@ Функция ОтправитьУведомлениеОНовыхЗадачах(Исполнитель, ЗадачиПоИсполнителю) - ПочтовыйАдресПолучателя = ""; - ПриПолученииАдресаЭлектроннойПочты(Исполнитель, ПочтовыйАдресПолучателя); + ПочтовыйАдресПолучателя = АдресЭлектроннойПочты(Исполнитель); Если ПустаяСтрока(ПочтовыйАдресПолучателя) Тогда ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), @@ -2435,59 +2278,6 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.0.2.2"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьОтветственногоЗаКонтрольИсполнения"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.0.6.6"; - Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьПредметСтрокой"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.1.2"; - Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьСостоянияИПринятияКИсполнению"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.2.1.1"; - Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ЗаполнитьКодРолиИсполнителя"; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.3.39"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("80A64E76-12CC-4075-A80B-9EB93C411C85"); - Обработчик.Процедура = "БизнесПроцессы.Задание.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.Комментарий = НСтр("ru = 'Обновление прав доступа для бизнес-процесса ""Задание"". - |До завершения обработки будут действовать прежние права доступа к заданиям.'"); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "БизнесПроцессы.Задание.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "БизнесПроцесс.Задание"; - Обработчик.ИзменяемыеОбъекты = "БизнесПроцесс.Задание"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; - Обработчик.БлокируемыеОбъекты = "БизнесПроцесс.Задание"; - КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Версия = "2.3.3.70"; - Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновитьИспользованиеРегламентныхЗаданий"; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("86ec32f9-d28f-4282-1e6f-222a8653d2e0"); - Обработчик.Комментарий = - НСтр("ru = 'Определяет использование регламентного задания выполняющего старт отложенных бизнес-процессов.'"); - -КонецПроцедуры - // Инициализировать предопределенную роль исполнителей ОтветственныйЗаКонтрольИсполнения. // Процедура ЗаполнитьОтветственногоЗаКонтрольИсполнения() Экспорт @@ -2626,9 +2416,6 @@ КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Возвращает адрес электронной почты пользователя Получатель для рассылки уведомлений о задачах. // // Параметры: @@ -2636,7 +2423,9 @@ // Адрес - Строка - возвращаемый адрес электронной почты. // // -Процедура ПриПолученииАдресаЭлектроннойПочты(Знач Получатель, Адрес) +Функция АдресЭлектроннойПочты(Получатель) + + Адрес = ""; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); @@ -2648,7 +2437,9 @@ КонецЕсли; КонецЕсли; -КонецПроцедуры + Возврат Адрес; + +КонецФункции Функция ЭлектроннаяПочтаВнешнегоПользователя(Получатель) @@ -2662,19 +2453,20 @@ КонецФункции -Процедура ПроверитьСистемнаяУчетнаяЗаписьНастроена() +Функция СистемнаяУчетнаяЗаписьНастроена(ОписаниеОшибки) Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - ВызватьИсключение НСтр("ru = 'Отправка почты не предусмотрена в программе.'"); + ОписаниеОшибки = НСтр("ru = 'Отправка почты не предусмотрена в программе.'"); + Иначе + МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями"); + Если МодульРаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(МодульРаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(), Истина, Ложь) Тогда + Возврат Истина; + КонецЕсли; + ОписаниеОшибки = НСтр("ru = 'Системная учетная запись электронной почты не настроена для отправки.'"); КонецЕсли; - МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями"); - Результат = МодульРаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(МодульРаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(), Истина, Ложь); - Если Не Результат Тогда - ВызватьИсключение НСтр("ru = 'Системная учетная запись электронной почты не настроена для отправки.'"); - КонецЕсли; - -КонецПроцедуры + Возврат Ложь; +КонецФункции // [2.3.3.70] Актуализирует использование регламентного задания СтартОтложенныхПроцессов. Процедура ОбновитьИспользованиеРегламентныхЗаданий() Экспорт diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl index 996d2c922..d4026fa97 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl index d52776c11..67adc9938 100644 --- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -1,81 +1,26 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (сервер). -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Формирует список разделов, в которых размещены команды вызова панели отчетов. -// -// Возвращаемое значение: -// ТаблицаЗначений - Информация о разделах. -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// * Метаданные - ОбъектМетаданных. -// * Имя - Строка. -// * Представление - Строка. -// -Функция ИспользуемыеРазделы() Экспорт - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); - Результат.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных, Строка")); - Результат.Колонки.Добавить("Имя", ОписаниеТиповСтрока()); - Результат.Колонки.Добавить("Представление", ОписаниеТиповСтрока()); - Результат.Колонки.Добавить("ЗаголовокПанели", ОписаниеТиповСтрока()); - - ИдентификаторНачальнойСтраницы = ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(); - - СписокРазделов = Новый СписокЗначений; - - ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(СписокРазделов); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда - МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); - МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов); - КонецЕсли; - - Для Каждого ЭлементСписка Из СписокРазделов Цикл - РазделМетаданные = ЭлементСписка.Значение; - Если ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда - ШаблонЗаголовка = ЭлементСписка.Представление; - Иначе - ШаблонЗаголовка = НСтр("ru = 'Отчеты раздела ""%1""'"); - КонецЕсли; - - Строка = Результат.Добавить(); - Строка.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(РазделМетаданные); - Если РазделМетаданные = ИдентификаторНачальнойСтраницы Тогда - Строка.Метаданные = ИдентификаторНачальнойСтраницы; - Строка.Имя = ИдентификаторНачальнойСтраницы; - Строка.Представление = НСтр("ru = 'Начальная страница'"); - Иначе - Строка.Метаданные = РазделМетаданные; - Строка.Имя = РазделМетаданные.Имя; - Строка.Представление = РазделМетаданные.Представление(); - КонецЕсли; - Строка.ЗаголовокПанели = СтрЗаменить(ШаблонЗаголовка, "%1", Строка.Представление); // Переход на СтрШаблон невозможен. - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Получает ссылку варианта отчета по набору ключевых реквизитов. +// Возвращает ссылку на вариант отчета. // // Параметры: -// Отчет - Соответствует реквизиту справочника - Полное имя или ссылка отчета. -// КлючВарианта - Соответствует реквизиту справочника - Имя варианта отчета. +// Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений, +// СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ДополнительныеОтчетыИОбработки, +// Строка - ссылка на отчет или полное имя внешнего отчета. +// КлючВарианта - Строка - имя варианта отчета. // -// Возвращаемое значение: -// * СправочникСсылка.ВариантыОтчетов - Когда вариант найден. -// * Неопределено - Когда вариант не найден. +// Возвращаемое значение: +// СправочникСсылка.ВариантыОтчетов, Неопределено - вариант отчета, +// либо Неопределено, если отчет отсутствует или недоступен по правам. // -Функция ПолучитьСсылку(Отчет, КлючВарианта) Экспорт +Функция ВариантОтчета(Отчет, КлючВарианта) Экспорт Результат = Неопределено; Запрос = Новый Запрос; Если ТипЗнч(Отчет) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ВариантыОтчетов.Вариант КАК Ссылка + | ВариантыОтчетов.Вариант КАК ВариантОтчета |ИЗ | РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ВариантыОтчетов |ГДЕ @@ -86,7 +31,7 @@ Иначе Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ВариантыОтчетов.Ссылка + | ВариантыОтчетов.Ссылка КАК ВариантОтчета |ИЗ | Справочник.ВариантыОтчетов КАК ВариантыОтчетов |ГДЕ @@ -100,30 +45,29 @@ Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта); Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Результат = Выборка.Ссылка; + Результат = Выборка.ВариантОтчета; КонецЕсли; Возврат Результат; КонецФункции -// Формирует массив отчетов, доступных текущему пользователю. +// Возвращает отчеты (СправочникСсылка.ВариантыОтчетов), доступные текущему пользователю. +// Их следует использовать во всех запросах к таблице +// справочника "ВариантыОтчетов" как отбор по реквизиту "Отчет", +// кроме случаев выборки вариантов из внешних отчетов. // // Возвращаемое значение: -// Массив - Ссылки отчетов, доступных текущему пользователю. -// Типы значений соответствуют типу реквизита Отчет справочника ВариантыОтчетов. -// -// Описание: -// Данный массив следует использовать во всех запросах к таблице -// справочника "ВариантыОтчетов" как отбор по реквизиту "Отчет", -// кроме случаев выборки вариантов из внешних отчетов. +// Массив - отчеты, доступные текущему пользователю (СправочникСсылка.ИдентификаторыОбъектовРасширений, +// Строка, СправочникСсылка.ДополнительныеОтчетыИОбработки, +// СправочникСсылка.ИдентификаторыОбъектовМетаданных). +// Тип элементов совпадает с типом реквизита Справочники.ВариантыОтчетов.Реквизиты.Отчет. // Функция ОтчетыТекущегоПользователя() Экспорт ДоступныеОтчеты = ВариантыОтчетовПовтИсп.ДоступныеОтчеты(); - // Дополнить массив ссылкам дополнительных отчетов, доступных текущему пользователю. + // Дополнительные отчеты, доступные текущему пользователю. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииДополнительныхОтчетовДоступныхТекущемуПользователю(ДоступныеОтчеты); @@ -133,73 +77,78 @@ КонецФункции +// Возвращает список вариантов отчета из хранилища настроек ХранилищеВариантовОтчетов. +// См. также СтандартноеХранилищеНастроекМенеджер.ПолучитьСписок в синтакс-помощнике. +// В отличие от метода платформы, вместо права "АдминистрированиеДанных" проверяются права доступа к отчету. +// +// Параметры: +// КлючОтчета - Строка - полное имя отчета с точкой. +// Пользователь - Строка, УникальныйИдентификатор, +// ПользовательИнформационнойБазы, Неопределено, +// СправочникСсылка.Пользователи - имя, идентификатор или ссылка на пользователя, +// настройки которого требуется получить. +// Если Неопределено, то текущий пользователь. +// +// Возвращаемое значение: +// СписокЗначений - список вариантов отчета, где +// * Значение - Строка - ключ варианта отчета. +// * Представление - Строка - представление варианта отчета. +// +// +Функция КлючиВариантовОтчета(КлючОтчета, Знач Пользователь = Неопределено) Экспорт + + Возврат ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьСписок(КлючОтчета, Пользователь); + +КонецФункции + +// Удаляет варианты указанного отчета или всех отчетов. +// См. также СтандартноеХранилищеНастроекМенеджер.Удалить в синтакс-помощнике. +// +// Параметры: +// КлючОтчета - Строка, Неопределено - полное имя отчета с точкой. +// Если Неопределено, то удаляются настройки всех отчетов. +// КлючВарианта - Строка, Неопределено - ключ удаляемого варианта отчета. +// Если Неопределено, то удаляются все варианты отчета. +// Пользователь - Строка, УникальныйИдентификатор, +// ПользовательИнформационнойБазы, Неопределено, +// СправочникСсылка.Пользователи - имя, идентификатор или ссылка на пользователя, +// настройки которого удаляются. +// Если Неопределено, то удаляются настройки всех пользователей. +// +Процедура УдалитьВариантОтчета(КлючОтчета, КлючВарианта, Знач Пользователь) Экспорт + + ХранилищаНастроек.ХранилищеВариантовОтчетов.Удалить(КлючОтчета, КлючВарианта, Пользователь); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Поддержка переопределяемых модулей. // Вызывает модуль менеджера отчета для заполнения его настроек. -// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). +// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: -// Настройки - Коллекция - Передается "как есть" из процедуры НастроитьВариантыОтчетов. -// ОтчетМетаданные - ОбъектМетаданных - Метаданные отчета. -// -// Важно: -// Для использования в модуле менеджера отчета должна быть размещена экспортная процедура по шаблону: -// // Настройки размещения в панели отчетов. -// // -// // Параметры: -// // Настройки - Коллекция - Передается "как есть" из ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // Может использоваться для получения настроек варианта этого отчета при помощи функции ВариантыОтчетов.ОписаниеВарианта(). -// // НастройкиОтчета - СтрокаДереваЗначений - Настройки этого отчета, -// // уже сформированные при помощи функции ВариантыОтчетов.ОписаниеОтчета() и готовые к изменению. -// // См. "Свойства для изменения" процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // -// // Описание: -// // См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // -// // Вспомогательные методы: -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// // -// // Примеры: -// // -// // 1. Установка описания варианта. -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // НастройкиВарианта.Описание = НСтр("ru = '<Описание>'"); -// // -// // 2. Отключение варианта отчета. -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // НастройкиВарианта.Включен = Ложь; -// // -// Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт -// // Код процедуры. -// КонецПроцедуры +// Настройки - Коллекция - передается "как есть" из процедуры НастроитьВариантыОтчетов. +// ОтчетМетаданные - ОбъектМетаданных - метаданные отчета, в модуле менеджера которого расположена +// экспортная процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета). // Процедура НастроитьОтчетВМодулеМенеджера(Настройки, ОтчетМетаданные) Экспорт НастройкиОтчета = ОписаниеОтчета(Настройки, ОтчетМетаданные); - Попытка - Отчеты[ОтчетМетаданные.Имя].НастроитьВариантыОтчета(Настройки, НастройкиОтчета); - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось настроить варианты отчета из модуля менеджера:'"); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), - УровеньЖурналаРегистрации.Ошибка, ОтчетМетаданные, Неопределено, ТекстОшибки); - КонецПопытки; + Отчеты[ОтчетМетаданные.Имя].НастроитьВариантыОтчета(Настройки, НастройкиОтчета); КонецПроцедуры -// Находит настройки указанного отчета. Используется для настройки размещения и общих параметров отчета. -// Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// См. описание функции ДеревоПредопределенных(). +// Возвращает настройки указанного отчета. Используется для настройки размещения и общих параметров отчета +// в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: -// Настройки - Коллекция - Используется для описания настроек отчетов и вариантов. -// Передается "как есть" из процедур НастроитьВариантыОтчетов и НастроитьВариантыОтчета. -// Отчет - ОбъектМетаданных, СправочникСсылка.ИдентификаторыОбъектовМетаданных - -// Метаданные или ссылка отчета. +// Настройки - Коллекция - используется для описания настроек отчетов и вариантов. +// Передается "как есть" из процедур ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов +// и НастроитьВариантыОтчета. +// Отчет - ОбъектМетаданных, СправочникСсылка.ИдентификаторыОбъектовМетаданных - метаданные или ссылка отчета. // // Возвращаемое значение: -// СтрокаДереваЗначений - Настройки отчета и настройки "по умолчанию" для вариантов этого отчета. -// Полученное значение можно использовать в функции ОписаниеВарианта() для получения настроек варианта. +// СтрокаДереваЗначений - настройки отчета и настройки "по умолчанию" для вариантов этого отчета. +// Полученное значение можно использовать в функции ОписаниеВарианта для получения настроек варианта. // Реквизиты для изменения: // * Включен - Булево - Если Ложь, то вариант отчета не регистрируется в подсистеме. // * ВидимостьПоУмолчанию - Булево - Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. @@ -209,13 +158,32 @@ // *** "" - Вывод отчета в подсистеме без специального выделение. // *** "Важный" - Вывод отчета в подсистеме с выделением жирным шрифтом. // *** "СмТакже" - Вывод отчета в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - Имена функциональных опций варианта отчета. +// * НастройкиДляПоиска - Структура - Дополнительные настройки для поиска этого варианта отчета. +// Эти настройки необходимо задавать только если СКД не используется или используется не в полном объеме. +// Например, СКД может использоваться только для параметризации и получения данных, +// а вывод выполняться в фиксированный макет табличного документа. +// ** НаименованияПолей - Строка - Имена полей варианта отчета. +// ** НаименованияПараметровИОтборов - Строка - Имена настроек варианта отчета. +// ** КлючевыеСлова - Строка - Дополнительная терминология (в т.ч. специализированная или устаревшая). +// Разделитель терминов: Символы.ПС. +// ** ИменаМакетов - Строка - Используется вместо НаименованияПолей. +// Имена макетов табличных или текстовых документов, +// из которых требуется извлечь информацию о наименованиях полей. +// Имена перечисляются через запятую. +// К сожалению, в макетах отсутствует информация о связях полей и их представлений (которая есть в СКД), +// поэтому для более точной работы механизма поиска рекомендуется заполнять НаименованияПолей, а не +// ИменаМакетов. // * ФорматНастроекСКД - Булево - Отчет использует типовой формат хранения настроек на механике СКД, -// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип возвращаемого значения). -// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые рассчитывают на типовой формат. +// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип +// возвращаемого значения). +// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые +// рассчитывают на типовой формат. // * ОпределитьНастройкиФормы - Булево - Отчет имеет программный интерфейс для тесной интеграции с формой отчета, // в том числе может переопределять некоторые настройки формы и подписываться на ее события. // Если Истина и отчет подключен к общей форме ФормаОтчета, // тогда в модуле объекта отчета следует определить процедуру по шаблону: +// // // Настройки общей формы отчета подсистемы "Варианты отчетов". // // // // Параметры: @@ -230,7 +198,14 @@ // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт // // Код процедуры. // КонецПроцедуры -// Прочие реквизиты см. в описании функции ДеревоПредопределенных(). +// +// Служебные реквизиты (только для чтения): +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Полное имя или ссылка на отчет. +// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. +// * КлючВарианта - Строка - Имя варианта отчета. +// * ОписаниеПолучено - Булево - Флажок что описание строки уже получено. +// Описание получается методом ОписаниеВарианта(). +// * СистемнаяИнформация - Структура - Другая служебная информация. // Функция ОписаниеОтчета(Настройки, Отчет) Экспорт ЭтоМетаданные = (ТипЗнч(Отчет) = Тип("ОбъектМетаданных")); @@ -252,7 +227,7 @@ КонецФункции // Находит настройки варианта отчета. Используется для настройки размещения. -// Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). +// Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: // Настройки - Коллекция - Используется для описания настроек отчетов и вариантов. @@ -282,7 +257,45 @@ // ** НаименованияПараметровИОтборов - Строка - Имена настроек варианта отчета. // ** КлючевыеСлова - Строка - Дополнительная терминология (в т.ч. специализированная или устаревшая). // Разделитель терминов: Символы.ПС. -// Прочие реквизиты см. в описании функции ДеревоПредопределенных(). +// ** ИменаМакетов - Строка - Используется вместо НаименованияПолей. +// Имена макетов табличных или текстовых документов, +// из которых требуется извлечь информацию о наименованиях полей. +// Имена перечисляются через запятую. +// К сожалению, в макетах отсутствует информация о связях полей и их представлений (которая есть в СКД), +// поэтому для более точной работы механизма поиска рекомендуется заполнять НаименованияПолей, а не +// ИменаМакетов. +// * ФорматНастроекСКД - Булево - Отчет использует типовой формат хранения настроек на механике СКД, +// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип +// возвращаемого значения). +// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые +// рассчитывают на типовой формат. +// * ОпределитьНастройкиФормы - Булево - Отчет имеет программный интерфейс для тесной интеграции с формой отчета, +// в том числе может переопределять некоторые настройки формы и подписываться на ее события. +// Если Истина и отчет подключен к общей форме ФормаОтчета, +// тогда в модуле объекта отчета следует определить процедуру по шаблону: +// +// // Настройки общей формы отчета подсистемы "Варианты отчетов". +// // +// // Параметры: +// // Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета. +// // Неопределено когда вызов без контекста. +// // КлючВарианта - Строка, Неопределено - Имя предопределенного +// // или уникальный идентификатор пользовательского варианта отчета. +// // Неопределено когда вызов без контекста. +// // Настройки - Структура - см. возвращаемое значение +// // ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(). +// // +// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт +// // Код процедуры. +// КонецПроцедуры +// +// Служебные реквизиты (только для чтения): +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Полное имя или ссылка на отчет. +// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. +// * КлючВарианта - Строка - Имя варианта отчета. +// * ОписаниеПолучено - Булево - Флажок что описание строки уже получено. +// Описание получается методом ОписаниеВарианта(). +// * СистемнаяИнформация - Структура - Другая служебная информация. // Функция ОписаниеВарианта(Настройки, Отчет, КлючВарианта) Экспорт Если ТипЗнч(Отчет) = Тип("СтрокаДереваЗначений") Тогда @@ -310,8 +323,8 @@ КонецФункции // Устанавливает режим вывода Отчетов и Вариантов в панелях отчетов. -// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов() переопределяемого модуля -// и из процедуры НастроитьВариантыОтчета() модуля объекта отчета. +// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов переопределяемого модуля +// и из процедуры НастроитьВариантыОтчета модуля объекта отчета. // // Параметры: // Настройки - Коллекция - Передается "как есть" из соответствующего параметра @@ -330,13 +343,13 @@ // по умолчанию видны и выводятся независимо в панелях отчетов. // Этот режим использовался в версии 2.2.1 и ранее. // -Процедура УстановитьРежимВыводаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ВыводитьОтчетыВместоВариантов) Экспорт - Если ТипЗнч(ВыводитьОтчетыВместоВариантов) <> Тип("Булево") Тогда - ВыводитьОтчетыВместоВариантов = (ВыводитьОтчетыВместоВариантов = ВРег("ПоОтчетам")); +Процедура УстановитьРежимВыводаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам) Экспорт + Если ТипЗнч(ГруппироватьПоОтчетам) <> Тип("Булево") Тогда + ГруппироватьПоОтчетам = (ГруппироватьПоОтчетам = ВРег("ПоОтчетам")); КонецЕсли; Если ТипЗнч(ОтчетИлиПодсистема) = Тип("СтрокаДереваЗначений") Или Метаданные.Отчеты.Содержит(ОтчетИлиПодсистема) Тогда - УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ВыводитьОтчетыВместоВариантов); + УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам); Иначе Подсистемы = Новый Массив; Подсистемы.Добавить(ОтчетИлиПодсистема); @@ -354,7 +367,7 @@ Если ОбработанныеОбъекты.Найти(ОбъектМетаданных) = Неопределено Тогда ОбработанныеОбъекты.Добавить(ОбъектМетаданных); Если Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда - УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОбъектМетаданных, ВыводитьОтчетыВместоВариантов); + УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОбъектМетаданных, ГруппироватьПоОтчетам); КонецЕсли; КонецЕсли; КонецЦикла; @@ -390,7 +403,7 @@ Иначе ОтчетСсылка = РеквизитыФормы.КлючОбъекта; КонецЕсли; - РеквизитыФормы.ВариантСсылка = ПолучитьСсылку(ОтчетСсылка, Форма.КлючТекущегоВарианта); + РеквизитыФормы.ВариантСсылка = ВариантОтчета(ОтчетСсылка, Форма.КлючТекущегоВарианта); КонецЕсли; КонецЕсли; @@ -437,6 +450,8 @@ Если Выборка.Наименование <> ЭлементСписка.Представление Тогда НастройкаОбъект = Выборка.Ссылка.ПолучитьОбъект(); НастройкаОбъект.Наименование = ЭлементСписка.Представление; + // Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям, + // поэтому конкурентной работы не ожидается. НастройкаОбъект.Записать(); КонецЕсли; @@ -450,6 +465,8 @@ НастройкаОбъект.КлючПользовательскойНастройки = ЭлементСписка.Значение; НастройкаОбъект.Вариант = РеквизитыФормы.ВариантСсылка; НастройкаОбъект.Пользователь = ПользовательСсылка; + // Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям, + // поэтому конкурентной работы не ожидается. НастройкаОбъект.Записать(); КонецЦикла; @@ -464,14 +481,14 @@ // Возвращаемое значение: // Массив - Имена таблиц, используемые в схеме или запросе. // -// Примеры: -// 1. Вызов из собственной формы отчета, использующего СКД. +// Пример: +// // Вызов из собственной формы отчета, использующего СКД. // ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных); // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы); -// 2. Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего СКД. +// // Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего СКД. // ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(ЭтотОбъект.СхемаКомпоновкиДанных); // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы); -// 3. Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего запрос. +// // Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего запрос. // ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(ТекстЗапроса); // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы); // @@ -490,8 +507,10 @@ // Обработка исключений (например, в случае передачи некорректного текста запроса) выполняется вызывающим кодом. // // Параметры: -// Объект - Массив из Строка - Имена таблиц, используемые отчетом. -// - СхемаКомпоновкиДанных, Строка - Схема отчета или текст запроса. +// Объект - СхемаКомпоновкиДанных - Схема отчета. +// - Строка - Текст запроса. +// - Массив - Имена таблиц, используемые отчетом. +// * Строка - Имя таблицы. // Сообщать - Булево - Когда Истина и таблицы, используемые отчетом, еще не обновлены, // то будет выведено сообщение вида "Отчет может содержать некорректные данные". // Необязательный. По умолчанию Истина. @@ -499,12 +518,12 @@ // Возвращаемое значение: // Булево - Истина когда в списке таблиц есть таблицы, которые еще не обновлены. // -// Примеры: -// 1. Вызов из собственной формы отчета. +// Пример: +// //Вызов из собственной формы отчета. // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных); -// 2. Вызов из обработчика ПриКомпоновкеРезультата отчета. +// //Вызов из обработчика ПриКомпоновкеРезультата отчета. // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ЭтотОбъект.СхемаКомпоновкиДанных); -// 3. Вызов при выполнении запроса. +// //Вызов при выполнении запроса. // ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ТекстЗапроса); // Функция ПроверитьИспользуемыеТаблицы(Объект, Сообщать = Истина) Экспорт @@ -524,72 +543,15 @@ Возврат Ложь; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Для вызова из события "ПриДобавленииОбработчиковОбновления" конфигурации. - -// Полное обновление индекса поиска вариантов отчетов. -// Следует вызывать из процедуры ПриДобавленииОбработчиковОбновления конфигурации. -// Внимание! Эта процедура должна вызываться только 1 раз - из модуля конечного прикладного решения. -// Не предназначена для вызова из библиотек. -// -// Параметры: -// Обработчики - Коллекция - Передается "как есть" из вызываемой процедуры. -// Версия - Строка - Версия конфигурации, при переходе на которую -// необходимо полностью обновить индекс поиска. -// Рекомендуется указывать последнюю функциональную версию, -// при обновлении на которую были внесены изменения -// в представления объектов метаданных или их реквизитов, -// которые могут выводиться в отчетах. -// Поднимается при необходимости. -// -// Например: -// ВариантыОтчетов.ДобавитьОбработчикиПолногоОбновления(Обработчики, "11.1.7.8"); -// -// Места использования: -// <МодульКонфигурации>.ПриДобавленииОбработчиковОбновления(). -// -// См. также: -// ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистем(). -// -Процедура ДобавитьОбработчикиПолногоОбновления(Обработчики, Версия) Экспорт - - Если РазрешеноИндексированиеНеразделенныхДанных() Тогда - Обработчик = Обработчики.Добавить(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.ОбщиеДанные = Истина; - Иначе - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОбщиеДанные = Ложь; // Для коробки без разницы, но при значении Истина механика обновления кидает исключение. - КонецЕсли; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("38d2a135-53e0-4c68-9bd6-3d6df9b9dcfb"); - Обработчик.Версия = Версия; - Обработчик.Процедура = "ВариантыОтчетов.ОтложенноеОбновлениеОбщихДанныхКонфигурацииПолное"; - Обработчик.Комментарий = НСтр("ru = 'Полное обновление индекса поиска отчетов, предусмотренных в программе. - |Поиск отчетов временно недоступен.'"); - КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("5ba93197-230b-4ac8-9abb-ab3662e5ff76"); - Обработчик.ОбщиеДанные = Ложь; - Обработчик.Версия = Версия; - Обработчик.Процедура = "ВариантыОтчетов.ОтложенноеОбновлениеРазделенныхДанныхКонфигурацииПолное"; - Обработчик.Комментарий = НСтр("ru = 'Полное обновление индекса поиска отчетов, сохраненных пользователями. - |Поиск отчетов временно недоступен.'"); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Для вызова из обработчиков обновления прикладной конфигурации. // Сбрасывает пользовательские настройки указанных отчетов. // // Параметры: -// Ключ - ОбъектМетаданных: Отчет, Строка, "*" - Отчет, для которого требуется сбросить настройки. -// * ОбъектМетаданных: Отчет - Отчет, для которого требуется сбросить настройки. -// * СправочникСсылка.ВариантыОтчетов - Вариант отчета, для которого требуется сбросить настройки. -// * Строка - Полное имя варианта отчета, для которого требуется сбросить настройки. +// Ключ - ОбъектМетаданных: Отчет - Метаданные отчета, для которого требуется сбросить настройки. +// - СправочникСсылка.ВариантыОтчетов - Вариант отчета, для которого требуется сбросить настройки. +// - Строка - Полное имя варианта отчета, для которого требуется сбросить настройки. // Заполняется в формате "<ИмяОтчета>/<ИмяВарианта>". // Если передать "*", то будут сброшены настройки всех отчетов конфигурации. // ТипыНастроек - Структура - Необязательный. Типы пользовательских настроек, которые требуется сбросить. @@ -608,7 +570,7 @@ Ключ, Новый ОписаниеТипов("Строка, ОбъектМетаданных, СправочникСсылка.ВариантыОтчетов")); - КлючиВариантов = Новый Массив; // Конечный список очищаемых ключей. + КлючиВариантов = Новый Массив; // Итоговый список очищаемых ключей. // Список ключей может быть заполнен из запроса или извне можно передать один конкретный ключ. Запрос = Новый Запрос; @@ -662,8 +624,7 @@ Исключение ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; - ОшибкаПоВарианту( - Неопределено, + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, НСтр("ru = 'В процессе выборки пользовательских настроек отчетов из системного хранилища возникла ошибка:'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -723,7 +684,7 @@ // Процедура ПеренестиПользовательскиеИзСтандартногоХранилища(ИменаОтчетов = "") Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Прямая конвертация вариантов отчетов'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Результат, который будет сохранен в хранилище. ТаблицаВариантов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПереносВариантовОтчетов", "ТаблицаВариантов", , , ""); @@ -750,8 +711,7 @@ Исключение ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; - ОшибкаПоВарианту( - Неопределено, + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, НСтр("ru = 'В процессе выборки вариантов отчетов из стандартного хранилища возникла ошибка:'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -821,7 +781,7 @@ КонецЕсли; // Результат выполнения - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); // Загрузка вариантов в хранилище подсистемы. ЗагрузитьПользовательские(ТаблицаВариантов); @@ -854,7 +814,7 @@ КонецЕсли; ПредставлениеПроцедуры = НСтр("ru = 'Завершить конвертацию вариантов отчетов'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Замена имен колонок под структуру справочника. ТаблицаВариантов.Колонки.Отчет.Имя = "ОтчетПолноеИмя"; @@ -870,7 +830,7 @@ // Проверить результат Если ТипЗнч(ОтчетИнформация.ТекстОшибки) = Тип("Строка") Тогда - ОшибкаПоВарианту(Неопределено, ОтчетИнформация.ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ОтчетИнформация.ТекстОшибки); Продолжить; КонецЕсли; @@ -918,6 +878,7 @@ Запрос.Текст = ТекстЗапроса; ВариантыБД = Запрос.Выполнить().Выгрузить(); + ВариантыБД.Индексы.Добавить("Отчет, КлючВарианта"); // Авторы вариантов ТекстЗапроса = @@ -973,12 +934,12 @@ ИначеЕсли ВариантБД <> Неопределено И ЗначениеЗаполнено(ВариантБД.ПользовательПоИмени) Тогда ВариантОбъект.Автор = ВариантБД.ПользовательПоИмени; Иначе - ОшибкаПоВарианту( - ВариантОбъект.Ссылка, - НСтр("ru = 'Вариант ""%1"" отчета ""%2"": не найден автор ""%3""'"), - ВариантОбъект.Наименование, - СтрокаТаблицы.ПредставлениеОтчета, - СтрокаТаблицы.Автор); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вариант ""%1"" отчета ""%2"": не найден автор ""%3""'"), + ВариантОбъект.Наименование, + СтрокаТаблицы.ПредставлениеОтчета, + СтрокаТаблицы.Автор), + ВариантОбъект.Ссылка); КонецЕсли; // Поскольку переносятся пользовательские варианты отчетов, @@ -994,255 +955,116 @@ СтрокаРаздел.Подсистема = СсылкаПодсистемы; КонецЦикла; + // Варианты отчетов создаются, поэтому конкурентная работа с ними исключена. ВариантОбъект.Записать(); КонецЦикла; // Очистка ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПереносВариантовОтчетов", "ТаблицаВариантов", ""); - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует отказаться от использования. +// +// Возвращаемое значение: +// ТаблицаЗначений - Используемые разделы. +// +Функция ИспользуемыеРазделы() Экспорт + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + Результат.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных, Строка")); + Результат.Колонки.Добавить("Имя", ОписаниеТиповСтрока()); + Результат.Колонки.Добавить("Представление", ОписаниеТиповСтрока()); + Результат.Колонки.Добавить("ЗаголовокПанели", ОписаниеТиповСтрока()); + + ИдентификаторНачальнойСтраницы = ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(); + + СписокРазделов = Новый СписокЗначений; + + ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(СписокРазделов); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов); + КонецЕсли; + + Для Каждого ЭлементСписка Из СписокРазделов Цикл + РазделМетаданные = ЭлементСписка.Значение; + Если ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда + ШаблонЗаголовка = ЭлементСписка.Представление; + Иначе + ШаблонЗаголовка = НСтр("ru = 'Отчеты раздела ""%1""'"); + КонецЕсли; + + Строка = Результат.Добавить(); + Строка.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(РазделМетаданные); + Если РазделМетаданные = ИдентификаторНачальнойСтраницы Тогда + Строка.Метаданные = ИдентификаторНачальнойСтраницы; + Строка.Имя = ИдентификаторНачальнойСтраницы; + Строка.Представление = НСтр("ru = 'Начальная страница'"); + Иначе + Строка.Метаданные = РазделМетаданные; + Строка.Имя = РазделМетаданные.Имя; + Строка.Представление = РазделМетаданные.Представление(); + КонецЕсли; + Строка.ЗаголовокПанели = СтрЗаменить(ШаблонЗаголовка, "%1", Строка.Представление); // Переход на СтрШаблон невозможен. + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Устарела. Следует отказаться от использования. +// Полное обновление индекса поиска вариантов отчетов. +// Следует вызывать из процедуры ПриДобавленииОбработчиковОбновления конфигурации. +// Внимание: должна вызываться только один раз из модуля конечного прикладного решения. +// Не предназначена для вызова из библиотек. +// +// Параметры: +// Обработчики - Коллекция - Передается "как есть" из вызываемой процедуры. +// Версия - Строка - Версия конфигурации, при переходе на которую +// необходимо полностью обновить индекс поиска. +// Рекомендуется указывать последнюю функциональную версию, +// при обновлении на которую были внесены изменения +// в представления объектов метаданных или их реквизитов, +// которые могут выводиться в отчетах. +// Поднимается при необходимости. +// +// Пример: +// ВариантыОтчетов.ДобавитьОбработчикиПолногоОбновления(Обработчики, "11.1.7.8"); +// +Процедура ДобавитьОбработчикиПолногоОбновления(Обработчики, Версия) Экспорт + Возврат; +КонецПроцедуры + +// Устарела. Следует использовать ВариантОтчета. +// Получает ссылку варианта отчета по набору ключевых реквизитов. +// +// Параметры: +// Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений, +// СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ДополнительныеОтчетыИОбработки, +// Строка - Ссылка отчета или полное имя внешнего отчета. +// КлючВарианта - Строка - Имя варианта отчета. +// +// Возвращаемое значение: +// * СправочникСсылка.ВариантыОтчетов - Когда вариант найден. +// * Неопределено - Когда вариант не найден. +// +Функция ПолучитьСсылку(Отчет, КлючВарианта) Экспорт + + Возврат ВариантОтчета(Отчет, КлючВарианта); + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Определяет настройки вариантов отчетов. - // - // Синтаксис: - // // См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). - // Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - // // Пример: - // МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - // МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); - // КонецПроцедуры - // - // Вспомогательные методы: - // 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: - // НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); - // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); - // Возвращаемые коллекции содержат одинаковый набор свойств. - // НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. - // Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). - // 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: - // ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); - // ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); - // ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); - // 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: - // ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"); - - // Регистрация изменений в именах вариантов отчетов. - // Используется в обработчиках обновления в целях ссылочной целостности, - // в том числе для сохранения пользовательских настроек и настроек рассылок отчетов. - // - // Синтаксис: - // // См. ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(). - // Процедура ПриРегистрацииИзмененийИменВариантовОтчетов(Изменения) Экспорт - // // Пример: - // Изменение = Изменения.Добавить(); - // Изменение.Отчет = Метаданные.Отчеты.<ИмяОтчета>; - // Изменение.СтароеИмяВарианта = "<СтароеИмяВарианта>"; - // Изменение.АктуальноеИмяВарианта = "<АктуальноеИмяВарианта>"; - // КонецПроцедуры - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ВариантыОтчетов\ПриРегистрацииИзмененийИменВариантовОтчетов"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныйМодуль = "ВариантыОтчетов"; - - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - Событие = "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - Обработчики обновления. -// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - //////////////////////////////////////////////////////////////////////////////// - // План обновления: - - //////////////////////////////////////////////////////////////////////////////// - // 1. Обновить общие данные. - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Ложь; - Обработчик.ОбщиеДанные = Истина; - Обработчик.УправлениеОбработчиками = Истина; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Версия = "*"; - Обработчик.Процедура = "ВариантыОтчетов.ОперативноеОбновлениеОбщихДанныхКонфигурации"; - Обработчик.Приоритет = 90; - - //////////////////////////////////////////////////////////////////////////////// - // 2. Обновить разделенные данные. - // 2.1. Перевести разделенные данные на версию 2.1.1.0. - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.УправлениеОбработчиками = Ложь; - Обработчик.РежимВыполнения = "Монопольно"; - Обработчик.Версия = "2.1.1.0"; - Обработчик.Процедура = "ВариантыОтчетов.ПерейтиКРедакции21"; - Обработчик.Приоритет = 80; - - // 2.2. Перевести разделенные данные на версию 2.1.3.6. - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.УправлениеОбработчиками = Ложь; - Обработчик.РежимВыполнения = "Монопольно"; - Обработчик.Версия = "2.1.3.6"; - Обработчик.Процедура = "ВариантыОтчетов.ЗаполнитьСсылкиПредопределенных"; - Обработчик.Приоритет = 80; - - // 2.3. Удалить устаревшие отложенные разделенные обязательные (на *) обработчики обновления. - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.УправлениеОбработчиками = Ложь; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Версия = "2.3.2.32"; - Обработчик.Процедура = "ВариантыОтчетов.УдалитьУстаревшиеОбработчики"; - Обработчик.Приоритет = 85; - - // 2.4. Обновить разделенные данные в локальном режиме. - Обработчик = Обработчики.Добавить(); - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Версия = "*"; - Обработчик.Процедура = "ВариантыОтчетов.ОперативноеОбновлениеРазделенныхДанныхКонфигурации"; - Обработчик.Приоритет = 70; - - //////////////////////////////////////////////////////////////////////////////// - // 3. Отложенное обновление. - // 3.1. Заполнить информацию для поиска вариантов отчетов. - - Если РазрешеноИндексированиеНеразделенныхДанных() Тогда - Обработчик = Обработчики.Добавить(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.ОбщиеДанные = Истина; - Иначе - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОбщиеДанные = Ложь; // Для коробки без разницы, но при значении Истина механика обновления кидает исключение. - КонецЕсли; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("0a485fd0-d72b-434f-917a-9c63a40f69cb"); - Обработчик.Версия = "*"; - Обработчик.Процедура = "ВариантыОтчетов.ОтложенноеОбновлениеОбщихДанныхКонфигурацииИнкрементальное"; - Обработчик.Комментарий = НСтр("ru = 'Обновление индекса поиска отчетов, предусмотренных в программе. - |Поиск отчетов временно недоступен.'"); - КонецЕсли; - - // 3.2. Заполнить информацию для поиска вариантов отчетов. - Обработчик = Обработчики.Добавить(); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("814d41ec-82e2-4d25-9334-8335e589fc1f"); - Обработчик.ОбщиеДанные = Ложь; - Обработчик.Версия = "2.2.3.31"; - Обработчик.Процедура = "ВариантыОтчетов.СократитьКоличествоБыстрыхНастроек"; - Обработчик.Комментарий = НСтр("ru = 'Уменьшает количество быстрых настроек - |в пользовательских отчетах до 2 шт.'"); - -КонецПроцедуры - -// Возникает при получении исключений поиска ссылок. -Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - - ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВариантыОтчетов.ТабличныеЧасти.Размещение.Реквизиты.Подсистема); - -КонецПроцедуры - -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// -Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - - Библиотека = "СтандартныеПодсистемы"; - - ОбщегоНазначения.ДобавитьПереименование( - Итог, "2.1.0.2", "Роль.ЧтениеВариантовОтчетов", "Роль.ИспользованиеВариантовОтчетов", Библиотека); - ОбщегоНазначения.ДобавитьПереименование( - Итог, "2.3.3.3", "Роль.ИспользованиеВариантовОтчетов", "Роль.ДобавлениеИзменениеЛичныхВариантовОтчетов", Библиотека); - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок -// при загрузке данных в другую информационную базу. -// -// Параметры: -// Типы - Массив из ОбъектМетаданных. -// -Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - - Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов); - -КонецПроцедуры - -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры - Структура - Параметры запуска. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - Параметры.Вставить("ВариантыОтчетов", Новый ФиксированнаяСтруктура(ПараметрыКлиента())); -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений); - Типы.Добавить(Метаданные.РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Получает объект отчета по ссылке варианта отчета. // // Параметры: @@ -1276,7 +1098,6 @@ ЗаполнитьЗначенияСвойств(Результат, Параметры); Результат.Успех = Ложь; Результат.СхемаМодифицирована = Ложь; - Результат.НастройкиФормы = ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(); // Поддержка возможности прямого выбора ссылок дополнительных отчетов в рассылках отчетов. Если ТипЗнч(Результат.НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") @@ -1300,7 +1121,7 @@ ВариантНастроекКД = Результат.Объект.СхемаКомпоновкиДанных.ВариантыНастроек.Получить(0); Результат.КлючВарианта = ВариантНастроекКД.Имя; Результат.НастройкиКД = ВариантНастроекКД.Настройки; - Результат.СсылкаВарианта = ПолучитьСсылку(Результат.СсылкаОтчета, Результат.КлючВарианта); + Результат.СсылкаВарианта = ВариантОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта); КонецЕсли; НадоПрочитатьСсылкуОтчета = (Результат.Объект = Неопределено И Результат.СсылкаОтчета = Неопределено); @@ -1309,7 +1130,7 @@ Если ТипЗнч(Результат.СсылкаВарианта) <> Тип("СправочникСсылка.ВариантыОтчетов") Или Не ЗначениеЗаполнено(Результат.СсылкаВарианта) Тогда Если Не НадоПрочитатьСсылкуОтчета И Результат.КлючВарианта <> Неопределено Тогда - Результат.СсылкаВарианта = ПолучитьСсылку(Результат.СсылкаОтчета, Результат.КлючВарианта); + Результат.СсылкаВарианта = ВариантОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта); КонецЕсли; Если Результат.СсылкаВарианта = Неопределено Тогда Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1348,10 +1169,7 @@ ОтчетОбъект = Результат.Объект; КомпоновщикНастроекКД = ОтчетОбъект.КомпоновщикНастроек; - ОтчетыСНастройками = ВариантыОтчетовПовтИсп.Параметры().ОтчетыСНастройками; - Если ОтчетыСНастройками.Найти(Результат.СсылкаОтчета) <> Неопределено Тогда - ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, Результат.КлючВарианта, Результат.НастройкиФормы); - КонецЕсли; + Результат.НастройкиФормы = НастройкиФормыОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта, ОтчетОбъект); Если ОтчетОбъект.СхемаКомпоновкиДанных = Неопределено Тогда Результат.Успех = Истина; @@ -1399,7 +1217,6 @@ КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Результат.АдресСхемы)); КонецЕсли; - // Чтение настроек. Если Результат.НастройкиФормы.События.ПередЗагрузкойНастроекВКомпоновщик Тогда КлючСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "КлючСхемы"); ОтчетОбъект.ПередЗагрузкойНастроекВКомпоновщик( @@ -1422,85 +1239,6 @@ Возврат Результат; КонецФункции -// Получает объект отчета по ссылке варианта отчета. -// -// Параметры: -// СсылкаОтчета - -// - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка отчета конфигурации. -// - СправочникСсылка.ИдентификаторыОбъектовРасширений - Ссылка отчета расширения. -// - Произвольный - Ссылка дополнительного или внешнего отчета. -// -// Возвращаемое значение: -// Структура - Параметры отчета, в том числе Объект отчета. -// * Объект - ОтчетОбъект.<Имя отчета>, ВнешнийОтчет - Объект отчета. -// * Имя - Строка - Имя объекта отчета. -// * ПолноеИмя - Строка - Полное имя объекта отчета. -// * Метаданные - ОбъектМетаданных - Объект метаданных отчета. -// * Ссылка - Произвольный - Ссылка отчета. -// * Успех - Булево - Истина если удалось подключить отчет. -// * ТекстОшибки - Строка - Текст ошибки. -// -// Места использования: -// РассылкаОтчетов.ИнициализироватьОтчет(). -// -Функция ПодключитьОтчетОбъект(СсылкаОтчета, ПолучатьМетаданные) - Результат = Новый Структура("Объект, Имя, ПолноеИмя, Метаданные, Ссылка, ТекстОшибки"); - Результат.Вставить("Успех", Ложь); - - Если СсылкаОтчета = Неопределено Тогда - Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В методе ""%1"" не указан параметр ""%2"".'"), - "ПодключитьОтчетОбъект", - "СсылкаОтчета"); - Возврат Результат; - Иначе - Результат.Ссылка = СсылкаОтчета; - КонецЕсли; - - Если ТипЗнч(Результат.Ссылка) = Тип("Строка") Тогда - Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отчет ""%1"" записан как внешний и не может быть подключен из программы'"), - Результат.Ссылка); - Возврат Результат; - КонецЕсли; - - Если ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") - Или ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда - Результат.Имя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Результат.Ссылка, "Имя"); - Если ПолучатьМетаданные Тогда - Результат.Метаданные = Метаданные.Отчеты.Найти(Результат.Имя); - Если Результат.Метаданные = Неопределено Тогда - Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отчет ""%1"" не найден в программе'"), - Результат.Имя); - Возврат Результат; - КонецЕсли; - КонецЕсли; - - Попытка - Результат.Объект = Отчеты[Результат.Имя].Создать(); - Результат.Успех = Истина; - Исключение - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось подключить отчет %1:'"), - Результат.Метаданные); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), - УровеньЖурналаРегистрации.Ошибка, Результат.Метаданные, Неопределено, ТекстОшибки); - КонецПопытки; - Иначе - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(Результат.Ссылка, Результат, Результат.Успех, ПолучатьМетаданные); - КонецЕсли; - КонецЕсли; - - Если Результат.Успех И ПолучатьМетаданные Тогда - Результат.ПолноеИмя = Результат.Метаданные.ПолноеИмя(); - КонецЕсли; - - Возврат Результат; -КонецФункции - // Обновляет варианты дополнительного отчета при его записи. // // Места использования: @@ -1512,7 +1250,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недостаточно прав доступа для записи вариантов дополнительного отчета ""%1"".'"), ТекущийОбъект.Наименование); - ОшибкаПоВарианту(ТекущийОбъект.Ссылка, ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ТекущийОбъект.Ссылка); ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки); Возврат; КонецЕсли; @@ -1538,27 +1276,31 @@ КонецЕсли; КонецЕсли; - // При снятии пометки удаления доп. отчета пометка удаления снимается только для предопределенных вариантов отчетов - // (для пользовательских не снимается). + // При снятии пометки удаления доп. отчета пометка удаления не снимается для пользовательских вариантов, + // помеченных на удаление интерактивно. ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Таблица.Ссылка, - | Таблица.КлючВарианта, - | Таблица.Пользовательский, - | Таблица.ПометкаУдаления, - | Таблица.Наименование + | ВариантыОтчетов.Ссылка, + | ВариантыОтчетов.КлючВарианта, + | ВариантыОтчетов.Пользовательский, + | ВариантыОтчетов.ПометкаУдаления, + | ВариантыОтчетов.Наименование |ИЗ - | Справочник.ВариантыОтчетов КАК Таблица + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов |ГДЕ - | Таблица.Отчет = &Отчет - | И Таблица.Пользовательский = ЛОЖЬ"; + | ВариантыОтчетов.Отчет = &Отчет + | И НЕ(ВариантыОтчетов.Пользовательский + | И ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)"; Запрос = Новый Запрос; Запрос.УстановитьПараметр("Отчет", ТекущийОбъект.Ссылка); Если ПометкаУдаления = Истина Тогда - // При установке пометки удаления доп. отчета пометка удаления устанавливается для всех вариантов отчетов - и - // пользовательских и предопределенных. - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Таблица.Пользовательский = ЛОЖЬ", ""); + // При установке пометки удаления доп. отчета пометка удаления устанавливается для всех вариантов отчетов. + ТекстЗапроса = СтрЗаменить( + ТекстЗапроса, + "И НЕ(ВариантыОтчетов.Пользовательский + | И ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)", + ""); КонецЕсли; Запрос.Текст = ТекстЗапроса; @@ -1590,6 +1332,7 @@ ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект(); ВариантОбъект.Наименование = ЭлементСписка.Представление; ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект); + // Обновляются существующие предопределенные варианты отчетов, поэтому конкурентная работа маловероятна. ВариантОбъект.Записать(); КонецЕсли; КонецЕсли; @@ -1606,6 +1349,7 @@ ВариантОбъект.Пользовательский = Ложь; ВариантОбъект.ВидимостьПоУмолчанию = Истина; ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект); + // Создаются предопределенные варианты отчетов, поэтому конкурентная работа исключена. ВариантОбъект.Записать(); КонецЦикла; КонецЕсли; @@ -1620,7 +1364,7 @@ Процедура ПользовательскиеВариантыОтчетов(ОтчетМетаданные, ПользовательИнформационнойБазы, ТаблицаВариантовОтчетов, СтандартнаяОбработка) Экспорт КлючОтчета = "Отчет" + "." + ОтчетМетаданные.Имя; - ВсеВариантыОтчета = ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьСписок(КлючОтчета, ПользовательИнформационнойБазы); + ВсеВариантыОтчета = КлючиВариантовОтчета(КлючОтчета, ПользовательИнформационнойБазы); ВариантыОтчета = Новый СписокЗначений; Для Каждого ВариантОтчета Из ВсеВариантыОтчета Цикл @@ -1658,63 +1402,14 @@ КонецЕсли; СтандартнаяОбработка = Ложь; - ХранилищаНастроек.ХранилищеВариантовОтчетов.Удалить(СведенияОВариантеОтчета.КлючОбъекта, - СведенияОВариантеОтчета.КлючВарианта, ПользовательИнформационнойБазы); + УдалитьВариантОтчета(СведенияОВариантеОтчета.КлючОбъекта, СведенияОВариантеОтчета.КлючВарианта, ПользовательИнформационнойБазы); КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". +// Формирует дополнительные параметры открытия формы отчета. // // Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник ПользовательскиеНастройкиОтчетов запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - - // СовместноДляПользователейИВнешнихПользователей. - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ДобавлениеИзменениеЛичныхВариантовОтчетов.Имя); - -КонецПроцедуры - -// Формирует параметры открытия формы отчета. -// Используется перед вызовом ВариантыОтчетовКлиент.ОткрытьФормуОтчета(). -// -// Параметры: -// ВариантСсылка - СправочникСсылка.ВариантыОтчетов - Ссылка открываемого варианта отчета. +// ВариантСсылка - СправочникСсылка.ВариантыОтчетов - ссылка открываемого варианта отчета. // Функция ПараметрыОткрытия(ВариантСсылка) Экспорт ПараметрыОткрытия = Новый Структура("Ссылка, Отчет, ТипОтчета, ИмяОтчета, КлючВарианта, КлючЗамеров"); @@ -1727,7 +1422,6 @@ "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВариантыОтчетов.Отчет, | ВариантыОтчетов.ТипОтчета, - | ВариантыОтчетов.Отчет.Имя КАК ИмяОтчета, | ВариантыОтчетов.КлючВарианта, | ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров |ИЗ @@ -1759,8 +1453,21 @@ ПараметрыОткрытия.Вставить("Подключен", Ложь); - Если ПараметрыОткрытия.ТипОтчета = "Внутренний" Тогда + Если ПараметрыОткрытия.ТипОтчета = "Внутренний" + Или ПараметрыОткрытия.ТипОтчета = "Расширение" Тогда + + МетаданныеОтчета = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектМетаданныхПоИдентификатору( + ПараметрыОткрытия.Отчет, Истина); + + Если ТипЗнч(МетаданныеОтчета) <> Тип("ОбъектМетаданных") Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось открыть отчет ""%1"". + |Возможно, было отключено расширение конфигурации с этим отчетом.'"), + ПараметрыОткрытия.Отчет); + КонецЕсли; + ПараметрыОткрытия.ИмяОтчета = МетаданныеОтчета.Имя; ПараметрыОткрытия.Подключен = Истина; // Отчеты конфигурации всегда подключены. + ИначеЕсли ПараметрыОткрытия.ТипОтчета = "Расширение" Тогда Если Метаданные.Отчеты.Найти(ПараметрыОткрытия.ИмяОтчета) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1778,36 +1485,6 @@ КонецПроцедуры -// См. описание в процедуре ЗаполнитьВсеПараметрыРаботыРасширений -// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. -// -Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт - - Настройки = Новый Структура; - Настройки.Вставить("Конфигурация", Ложь); - Настройки.Вставить("Расширения", Истина); - - Настройки.Вставить("ОбщиеДанные", Истина); - Настройки.Вставить("РазделенныеДанные", Истина); - Настройки.Вставить("Оперативное", Истина); - Настройки.Вставить("Отложенное", Истина); - Настройки.Вставить("Полное", Истина); - - Обновить(Настройки); - -КонецПроцедуры - -// См. описание в процедуре ОчиститьВсеПараметрыРаботыРасширений -// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. -// -Процедура ПриОчисткеВсехПараметровРаботыРасширений() Экспорт - - НаборЗаписей = РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ВерсияРасширений.Установить(ПараметрыСеанса.ВерсияРасширений); - НаборЗаписей.Записать(); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры служебного программного интерфейса. @@ -1832,9 +1509,8 @@ ПоУмолчанию = Новый Структура("Конфигурация, Расширения, ОбщиеДанные, РазделенныеДанные, Оперативное, Отложенное, Полное"); Если Настройки.Количество() < ПоУмолчанию.Количество() Тогда - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - Если РежимРаботы.МодельСервиса Тогда - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда // Разделенный сеанс. + Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ПоУмолчанию.ОбщиеДанные = Ложь; ПоУмолчанию.РазделенныеДанные = Истина; Иначе // Неразделенный сеанс. @@ -1842,7 +1518,7 @@ ПоУмолчанию.РазделенныеДанные = Ложь; КонецЕсли; Иначе - Если РежимРаботы.Автономный Тогда // АРМ. + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда // АРМ. ПоУмолчанию.ОбщиеДанные = Ложь; ПоУмолчанию.РазделенныеДанные = Истина; Иначе // Коробка. @@ -1952,7 +1628,7 @@ Возврат Результат; КонецФункции -// См. описание процедуры СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. Процедура СобратьСтатистикуКонфигурации() Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда @@ -2032,6 +1708,8 @@ ДопСвойства = КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства; ДопСвойства.Вставить("КлючВарианта", Результат.КлючВарианта); + // Проверка корректности данных, по которым формируется отчет. + Если ПроверятьЗаполнение Тогда ИсходныеСообщенияПользователю = ПолучитьСообщенияПользователю(Истина); ПроверкаПройдена = ОтчетОбъект.ПроверитьЗаполнение(); @@ -2048,7 +1726,6 @@ КонецЕсли; КонецЕсли; - // Проверка корректности данных, по которым формируется отчет. Попытка ИспользуемыеТаблицы = ИспользуемыеТаблицы(Результат.СхемаКД); ИспользуемыеТаблицы.Добавить(Результат.ПолноеИмя); @@ -2059,7 +1736,7 @@ Исключение ТекстОшибки = НСтр("ru = 'Не удалось определить используемые таблицы:'"); ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ОшибкаПоВарианту(Результат.СсылкаВарианта, ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Результат.СсылкаВарианта); КонецПопытки; // Формирование и оценка скорости. @@ -2082,6 +1759,14 @@ КомментарийКлючевойОперации); КонецЕсли; + // Регистрация результата. + + Если ДопСвойства <> КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства Тогда + НовыеДопСвойства = КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства; + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НовыеДопСвойства, ДопСвойства, Ложь); + ДопСвойства = НовыеДопСвойства; + КонецЕсли; + Модифицирован = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопСвойства, "ВариантМодифицирован"); Если Модифицирован = Истина Тогда Результат.ВариантМодифицирован = Истина; @@ -2098,31 +1783,30 @@ Если ДопСвойства.Свойство("ОтчетПустой") Тогда Пустой = ДопСвойства.ОтчетПустой; Иначе - Пустой = ОтчетПустой(ОтчетОбъект); + Пустой = ОтчетыСервер.ОтчетПустой(ОтчетОбъект); КонецЕсли; Результат.Вставить("Пустой", Пустой); КонецЕсли; + НастройкиПечати = Результат.НастройкиФормы.Печать; + НастройкиПечати.Вставить("КлючПараметровПечати", ОтчетыКлиентСервер.КлючУникальности(Результат.ПолноеИмя, Результат.КлючВарианта)); + ЗаполнитьЗначенияСвойств(Результат.ТабличныйДокумент, НастройкиПечати); + + Результат.Успех = Истина; + + // Чистка мусора. + ДопСвойства.Удалить("ВариантМодифицирован"); ДопСвойства.Удалить("ПользовательскиеНастройкиМодифицированы"); ДопСвойства.Удалить("КлючВарианта"); ДопСвойства.Удалить("ОтчетПустой"); - Результат.Успех = Истина; - Возврат Результат; КонецФункции // Детализирует доступность отчетов по правам и функциональным опциям. -Функция ДоступностьОтчетов(СсылкаИлиМассивСсылок) Экспорт - // Поддержка передачи 1 ссылки, а не массива. - Если ТипЗнч(СсылкаИлиМассивСсылок) <> Тип("Массив") Тогда - Массив = Новый Массив; - Массив.Добавить(СсылкаИлиМассивСсылок); - Доступность = ДоступностьОтчетов(Массив); - Возврат Доступность[0]; - КонецЕсли; - +Функция ДоступностьОтчетов(СсылкиОтчетов) Экспорт + Результат = Новый ТаблицаЗначений; Результат.Колонки.Добавить("Ссылка"); Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); @@ -2136,7 +1820,7 @@ СсылкиДопОтчетов = Новый Массив; УстановитьПривилегированныйРежим(Истина); - Для Каждого Ссылка Из СсылкаИлиМассивСсылок Цикл + Для Каждого Ссылка Из СсылкиОтчетов Цикл Если Результат.Найти(Ссылка, "Ссылка") <> Неопределено Тогда Продолжить; КонецЕсли; @@ -2161,14 +1845,14 @@ УстановитьПривилегированныйРежим(Ложь); Если СсылкиВариантов.Количество() > 0 Тогда - ЗначенияРеквизитовВариантов = ЗначенияРеквизитовОбъектов(СсылкиВариантов, "Отчет"); + ЗначенияОтчетов = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(СсылкиВариантов, "Отчет", Истина); Для Каждого Ссылка Из СсылкиВариантов Цикл СтрокаТаблицы = Результат.Найти(Ссылка, "Ссылка"); - ЗначенияРеквизитов = ЗначенияРеквизитовВариантов[Ссылка]; - Если ЗначенияРеквизитов = Неопределено Тогда + ОтчетЗначение = ЗначенияОтчетов[Ссылка]; + Если ОтчетЗначение = Неопределено Тогда СтрокаТаблицы.Представление = НСтр("ru = '<Недостаточно прав для работы с вариантом отчета>'"); Иначе - СтрокаТаблицы.Отчет = ЗначенияРеквизитов.Отчет; + СтрокаТаблицы.Отчет = ОтчетЗначение; СтрокаТаблицы.ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Неопределено, СтрокаТаблицы.Отчет); Если СтрокаТаблицы.ТипОтчетаСтрокой = "Внутренний" Тогда ДобавитьВМассив(СсылкиОтчетовКонфигурации, СтрокаТаблицы.Отчет); @@ -2197,605 +1881,7 @@ КонецЕсли; Возврат Результат; -КонецФункции - -// Обработчик определения доступности отчетов конфигурации и расширений. -Процедура ПриОпределенииДоступностиОтчетов(СсылкиОтчетов, Результат) - ЗначенияРеквизитовОтчетов = ЗначенияРеквизитовОбъектов(СсылкиОтчетов, "Имя"); - Для Каждого Отчет Из СсылкиОтчетов Цикл - ЗначенияРеквизитов = ЗначенияРеквизитовОтчетов[Отчет]; - ДоступенПоRLS = Истина; - ДоступенПоПравам = Истина; - ДоступенПоОпциям = Истина; - НайденВПрограмме = Истина; - Если ЗначенияРеквизитов = Неопределено Тогда - ДоступенПоRLS = Ложь; - Иначе - ИмяОтчета = ЗначенияРеквизитов.Имя; - ОтчетМетаданные = Метаданные.Отчеты.Найти(ИмяОтчета); - Если ОтчетМетаданные = Неопределено Тогда - НайденВПрограмме = Ложь; - ИначеЕсли Не ПравоДоступа("Просмотр", ОтчетМетаданные) Тогда - ДоступенПоПравам = Ложь; - ИначеЕсли Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОтчетМетаданные) Тогда - ДоступенПоОпциям = Ложь; - КонецЕсли; - КонецЕсли; - Найденные = Результат.НайтиСтроки(Новый Структура("Отчет", Отчет)); - Для Каждого СтрокаТаблицы Из Найденные Цикл - Если Не ДоступенПоRLS Тогда - СтрокаТаблицы.Представление = НСтр("ru = '<Недостаточно прав для работы с вариантом отчета>'"); - ИначеЕсли Не НайденВПрограмме Тогда - СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '<Отчет ""%1"" не найден в программе>'"), - ИмяОтчета); - ИначеЕсли Не ДоступенПоПравам Тогда - СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '<Недостаточно прав для работы с отчетом ""%1"">'"), - ИмяОтчета); - ИначеЕсли Не ДоступенПоОпциям Тогда - СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '<Отчет ""%1"" отключен в настройках программы>'"), - ИмяОтчета); - Иначе - СтрокаТаблицы.Доступен = Истина; - КонецЕсли; - КонецЦикла; - КонецЦикла; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Для отчета по внедрению. - -// Формирует дерево настроек и размещения предопределенных вариантов отчетов. -// Только для отчетов, подключенных к подсистеме. -// -// Возвращаемое значение: -// ДеревоЗначений - Настройки предопределенных вариантов отчетов, подключенных к подсистеме. -// -// Реквизиты для изменения: -// * Включен - Булево - Если Ложь, то вариант отчета не регистрируется в подсистеме. -// * ВидимостьПоУмолчанию - Булево - Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// * Наименование - Строка - Наименование варианта отчета. -// * Описание - Строка - Информация о варианте отчета. -// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. -// ** Ключ - ОбъектМетаданных - Подсистема, в которой размещается отчет или вариант отчета. -// ** Значение - Строка - Настройки размещения в подсистеме (группе). -// *** "" - Вывод отчета в подсистеме без специального выделение. -// *** "Важный" - Вывод отчета в подсистеме с выделением жирным шрифтом. -// *** "СмТакже" - Вывод отчета в группе "См. также". -// * ФункциональныеОпции - Массив из Строка - Имена функциональных опций варианта отчета. -// * НастройкиДляПоиска - Структура - Дополнительные настройки для поиска этого варианта отчета. -// Эти настройки необходимо задавать только если СКД не используется или используется не в полном объеме. -// Например, СКД может использоваться только для параметризации и получения данных, -// а вывод выполняться в фиксированный макет табличного документа. -// ** НаименованияПолей - Строка - Имена полей варианта отчета. -// ** НаименованияПараметровИОтборов - Строка - Имена настроек варианта отчета. -// ** КлючевыеСлова - Строка - Дополнительная терминология (в т.ч. специализированная или устаревшая). -// Разделитель терминов: Символы.ПС. -// ** ИменаМакетов - Строка - Используется вместо НаименованияПолей. -// Имена макетов табличных или текстовых документов, -// из которых требуется извлечь информацию о наименованиях полей. -// Имена перечисляются через запятую. -// К сожалению, в макетах отсутствует информация о связях полей и их представлений (которая есть в СКД), -// поэтому для более точной работы механизма поиска рекомендуется заполнять НаименованияПолей, а не -// ИменаМакетов. -// * ФорматНастроекСКД - Булево - Отчет использует типовой формат хранения настроек на механике СКД, -// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип возвращаемого значения). -// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые рассчитывают на типовой формат. -// * ОпределитьНастройкиФормы - Булево - Отчет имеет программный интерфейс для тесной интеграции с формой отчета, -// в том числе может переопределять некоторые настройки формы и подписываться на ее события. -// Если Истина и отчет подключен к общей форме ФормаОтчета, -// тогда в модуле объекта отчета следует определить процедуру по шаблону: -// -// // Настройки общей формы отчета подсистемы "Варианты отчетов". -// // -// // Параметры: -// // Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета. -// // Неопределено когда вызов без контекста. -// // КлючВарианта - Строка, Неопределено - Имя предопределенного -// // или уникальный идентификатор пользовательского варианта отчета. -// // Неопределено когда вызов без контекста. -// // Настройки - Структура - см. возвращаемое значение -// // ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(). -// // -// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт -// // Код процедуры. -// КонецПроцедуры -// -// Служебные реквизиты (только для чтения): -// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Полное имя или ссылка на отчет. -// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. -// * КлючВарианта - Строка - Имя варианта отчета. -// * ОписаниеПолучено - Булево - Флажок что описание строки уже получено. -// Описание получается методом ОписаниеВарианта(). -// * СистемнаяИнформация - Структура - Другая служебная информация. -// -Функция ДеревоПредопределенных(ФильтрПоТипуОтчетов = "Внутренний") Экспорт - РеквизитыСправочника = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; - ДеревоВариантов = Новый ДеревоЗначений; - ДеревоВариантов.Колонки.Добавить("Отчет", РеквизитыСправочника.Отчет.Тип); - ДеревоВариантов.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных")); - ДеревоВариантов.Колонки.Добавить("Объект"); - ДеревоВариантов.Колонки.Добавить("ИспользуетСКД", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("КлючВарианта", РеквизитыСправочника.КлючВарианта.Тип); - ДеревоВариантов.Колонки.Добавить("ОписаниеПолучено", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("Включен", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("ВидимостьПоУмолчанию", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("Наименование", ОписаниеТиповСтрока()); - ДеревоВариантов.Колонки.Добавить("Описание", ОписаниеТиповСтрока()); - ДеревоВариантов.Колонки.Добавить("Размещение", Новый ОписаниеТипов("Соответствие")); - ДеревоВариантов.Колонки.Добавить("НастройкиДляПоиска", Новый ОписаниеТипов("Структура")); - ДеревоВариантов.Колонки.Добавить("СистемнаяИнформация", Новый ОписаниеТипов("Структура")); - ДеревоВариантов.Колонки.Добавить("Тип", ОписаниеТиповСтрока()); - ДеревоВариантов.Колонки.Добавить("ЭтоВариант", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("ФункциональныеОпции", Новый ОписаниеТипов("Массив")); - ДеревоВариантов.Колонки.Добавить("ГруппироватьПоОтчету", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("КлючЗамеров", Новый ОписаниеТипов("Строка")); - ДеревоВариантов.Колонки.Добавить("ОсновнойВариант"); - ДеревоВариантов.Колонки.Добавить("ФорматНастроекСКД", Новый ОписаниеТипов("Булево")); - ДеревоВариантов.Колонки.Добавить("ОпределитьНастройкиФормы", Новый ОписаниеТипов("Булево")); - - ВыводитьОтчетыВместоВариантов = ГлобальныеНастройки().ВыводитьОтчетыВместоВариантов; - РазрешеноИндексирование = РазрешеноИндексированиеНеразделенныхДанных(); - - ПодсистемыОтчетов = РазмещениеОтчетовВПодсистемах(); - КэшФлажкаХранилища = Неопределено; - КэшФлажкаОсновнойФормы = Неопределено; - КэшФлажкаФормыНастроек = Неопределено; - Для Каждого ОтчетМетаданные Из Метаданные.Отчеты Цикл - Если Не ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажкаХранилища) Тогда - Продолжить; - КонецЕсли; - - ОтчетСсылка = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(ОтчетМетаданные); - ОтчетТип = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Неопределено, ОтчетСсылка); - Если ФильтрПоТипуОтчетов <> Неопределено И ФильтрПоТипуОтчетов <> ОтчетТип Тогда - Продолжить; - КонецЕсли; - - ЕстьРеквизиты = (ОтчетМетаданные.Реквизиты.Количество() > 0); - - // Настройки. - СтрокаОтчет = ДеревоВариантов.Строки.Добавить(); - СтрокаОтчет.Отчет = ОтчетСсылка; - СтрокаОтчет.Метаданные = ОтчетМетаданные; - СтрокаОтчет.Включен = Истина; - СтрокаОтчет.ВидимостьПоУмолчанию = Истина; - СтрокаОтчет.Описание = ОтчетМетаданные.Пояснение; - СтрокаОтчет.Наименование = ОтчетМетаданные.Представление(); - СтрокаОтчет.ОписаниеПолучено = Истина; - СтрокаОтчет.Тип = ОтчетТип; - СтрокаОтчет.ЭтоВариант = Ложь; - СтрокаОтчет.ГруппироватьПоОтчету = ВыводитьОтчетыВместоВариантов; - СтрокаОтчет.ИспользуетСКД = (ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных <> Неопределено); - СтрокаОтчет.ФорматНастроекСКД = СтрокаОтчет.ИспользуетСКД И Не ЕстьРеквизиты; - - // Подсистемы. - Найденные = ПодсистемыОтчетов.НайтиСтроки(Новый Структура("ОтчетМетаданные", ОтчетМетаданные)); - Для Каждого СтрокаПодсистема Из Найденные Цикл - СтрокаОтчет.Размещение.Вставить(СтрокаПодсистема.ПодсистемаМетаданные, ""); - КонецЦикла; - - // Поиск. - СтрокаОтчет.НастройкиДляПоиска = Новый Структура("НаименованияПолей, НаименованияПараметровИОтборов, КлючевыеСлова, ИменаМакетов"); - - // Предопределенные варианты. - Если СтрокаОтчет.ИспользуетСКД Тогда - ОтчетМенеджер = Отчеты[ОтчетМетаданные.Имя]; - СхемаКД = Неопределено; - ВариантыНастроек = Неопределено; - Попытка - СтрокаОтчет.Объект = ОтчетМенеджер.Создать(); - СхемаКД = СтрокаОтчет.Объект.СхемаКомпоновкиДанных; - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось прочитать схему отчета ""%1"":'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ОтчетМетаданные.Имя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ПредупреждениеПоВарианту(Неопределено, ТекстОшибки); - КонецПопытки; - // Чтение настроек вариантов отчета из схемы. - Если СхемаКД <> Неопределено Тогда - Попытка - ВариантыНастроек = СхемаКД.ВариантыНастроек; - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета ""%1"" из схемы:'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ОтчетМетаданные.Имя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ПредупреждениеПоВарианту(Неопределено, ТекстОшибки); - КонецПопытки; - КонецЕсли; - // Чтение настроек вариантов отчета из модуля менеджера (если не получилось из схемы). - Если ВариантыНастроек = Неопределено Тогда - Попытка - ВариантыНастроек = ОтчетМенеджер.ВариантыНастроек(); - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета ""%1"" из модуля менеджера:'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ОтчетМетаданные.Имя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ОшибкаПоВарианту(Неопределено, ТекстОшибки); - КонецПопытки; - КонецЕсли; - // Регистрация найденных вариантов. - Если ВариантыНастроек <> Неопределено Тогда - Для Каждого ВариантНастроекКД Из ВариантыНастроек Цикл - Вариант = СтрокаОтчет.Строки.Добавить(); - Вариант.Отчет = СтрокаОтчет.Отчет; - Вариант.КлючВарианта = ВариантНастроекКД.Имя; - Вариант.Наименование = ВариантНастроекКД.Представление; - Вариант.Тип = ОтчетТип; - Вариант.ЭтоВариант = Истина; - Если СтрокаОтчет.ОсновнойВариант = Неопределено Тогда - СтрокаОтчет.ОсновнойВариант = Вариант; - КонецЕсли; - Если РазрешеноИндексирование И ТипЗнч(ВариантНастроекКД) = Тип("ВариантНастроекКомпоновкиДанных") Тогда - Попытка - Вариант.СистемнаяИнформация.Вставить("НастройкиКД", ВариантНастроекКД.Настройки); - Исключение - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось прочитать настройки варианта ""%1"" отчета ""%2"":'"), - Вариант.КлючВарианта, - ОтчетМетаданные.Имя) - + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ПредупреждениеПоВарианту(Неопределено, ТекстОшибки); - КонецПопытки; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - - // Сам отчет. - Если СтрокаОтчет.ОсновнойВариант = Неопределено Тогда - Вариант = СтрокаОтчет.Строки.Добавить(); - ЗаполнитьЗначенияСвойств(Вариант, СтрокаОтчет, "Отчет, Наименование"); - Вариант.КлючВарианта = ""; - Вариант.ЭтоВариант = Истина; - СтрокаОтчет.ОсновнойВариант = Вариант; - КонецЕсли; - - КонецЦикла; - - // Механизмы расширения. - Если ФильтрПоТипуОтчетов = Неопределено Или ФильтрПоТипуОтчетов = "Внутренний" Тогда - НастроитьОтчетВМодулеМенеджера(ДеревоВариантов, Метаданные.Отчеты.УниверсальныйОтчет); - // Подключаемые обработчики подсистем БСП. - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриНастройкеВариантовОтчетов(ДеревоВариантов); - КонецЦикла; - // Переопределяемый модуль конфигурации. - ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(ДеревоВариантов); - КонецЕсли; - - // Определение основных вариантов. - Для Каждого СтрокаОтчет Из ДеревоВариантов.Строки Цикл - Если СтрокаОтчет.ГруппироватьПоОтчету = Истина Тогда - Если СтрокаОтчет.ОсновнойВариант = Неопределено - Или Не СтрокаОтчет.ОсновнойВариант.Включен Тогда - Для Каждого Вариант Из СтрокаОтчет.Строки Цикл - ЗаполнитьОписаниеСтрокиВарианта(Вариант, СтрокаОтчет); - Если Вариант.Включен Тогда - СтрокаОтчет.ОсновнойВариант = Вариант; - Вариант.ВидимостьПоУмолчанию = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Иначе - СтрокаОтчет.ОсновнойВариант = Неопределено; - КонецЕсли; - КонецЦикла; - - Возврат ДеревоВариантов; -КонецФункции - -// Определяет способ подключения хранилища вариантов отчетов. -Функция ПоУмолчаниюВсеПодключеныКХранилищу() - Возврат (Метаданные.ХранилищеВариантовОтчетов <> Неопределено И Метаданные.ХранилищеВариантовОтчетов.Имя = "ХранилищеВариантовОтчетов"); -КонецФункции - -// Определяет подключен-ли отчет к хранилищу вариантов отчетов. -Функция ОтчетПодключенКХранилищу(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт - ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов; - Если ХранилищеМетаданные = Неопределено Тогда - Если ПоУмолчаниюВсеПодключены = Неопределено Тогда - ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКХранилищу(); - КонецЕсли; - ОтчетПодключен = ПоУмолчаниюВсеПодключены; - Иначе - ОтчетПодключен = (ХранилищеМетаданные = Метаданные.ХранилищаНастроек.ХранилищеВариантовОтчетов); - КонецЕсли; - Возврат ОтчетПодключен; -КонецФункции - -// Определяет способ подключения общей формы отчета. -Функция ПоУмолчаниюВсеПодключеныКОсновнойФорме() - ФормаМетаданные = Метаданные.ОсновнаяФормаОтчета; - Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета); -КонецФункции - -// Определяет подключен-ли отчет к общей форме отчета. -Функция ОтчетПодключенКОсновнойФорме(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт - ФормаМетаданные = ОтчетМетаданные.ОсновнаяФорма; - Если ФормаМетаданные = Неопределено Тогда - Если ПоУмолчаниюВсеПодключены = Неопределено Тогда - ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКОсновнойФорме(); - КонецЕсли; - ОтчетПодключен = ПоУмолчаниюВсеПодключены; - Иначе - ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета); - КонецЕсли; - Возврат ОтчетПодключен; -КонецФункции - -// Определяет способ подключения общей формы настроек отчета. -Функция ПоУмолчаниюВсеПодключеныКФормеНастроек() - ФормаМетаданные = Метаданные.ОсновнаяФормаНастроекОтчета; - Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета); -КонецФункции - -// Определяет подключен-ли отчет к общей форме настроек отчета. -Функция ОтчетПодключенКФормеНастроек(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт - ФормаМетаданные = ОтчетМетаданные.ОсновнаяФормаНастроек; - Если ФормаМетаданные = Неопределено Тогда - Если ПоУмолчаниюВсеПодключены = Неопределено Тогда - ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКФормеНастроек(); - КонецЕсли; - ОтчетПодключен = ПоУмолчаниюВсеПодключены; - Иначе - ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета); - КонецЕсли; - Возврат ОтчетПодключен; -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Формирует отчет с указанными настройками, используется в фоновых заданиях. -Процедура СформироватьОтчетВФоне(Параметры, АдресХранилища) Экспорт - Формирование = СформироватьОтчет(Параметры, Ложь, Ложь); - - Результат = Новый Структура("ТабличныйДокумент, Расшифровка, - |Успех, ТекстОшибки, ДанныеЕщеОбновляются, - |ВариантМодифицирован, ПользовательскиеНастройкиМодифицированы"); - ЗаполнитьЗначенияСвойств(Результат, Формирование); - - Если Результат.ВариантМодифицирован Тогда - Результат.Вставить("НастройкиКД", Формирование.НастройкиКД); - КонецЕсли; - Если Результат.ПользовательскиеНастройкиМодифицированы Тогда - Результат.Вставить("ПользовательскиеНастройкиКД", Формирование.ПользовательскиеНастройкиКД); - КонецЕсли; - - ПоместитьВоВременноеХранилище(Результат, АдресХранилища); -КонецПроцедуры - -// Определяет что отчет пустой. -Функция ОтчетПустой(ОтчетОбъект) - Если ОтчетОбъект.СхемаКомпоновкиДанных = Неопределено Тогда - Возврат Ложь; // Не СКД отчет. - КонецЕсли; - - // Объект для создания макета компоновки данных. - КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных; - - // Выполняет компоновку макета. - МакетКД = КомпоновщикМакетаКД.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки()); - - // Пропуск проверки на то, что отчет пустой. - Если ЕстьВнешнийНаборДанных(МакетКД.НаборыДанных) Тогда - Возврат Ложь; - КонецЕсли; - - // Объект, выполняющий компоновку данных. - ПроцессорКД = Новый ПроцессорКомпоновкиДанных; - - // Инициализировать объект. - ПроцессорКД.Инициализировать(МакетКД, , , Истина); - - // Объект для вывода результата компоновки в табличный документ. - ПроцессорВыводаРезультатаКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; - - // Устанавливает табличный документ, в который нужно выводить результат. - ПроцессорВыводаРезультатаКД.УстановитьДокумент(Новый ТабличныйДокумент); - - // Последовательный вывод - ПроцессорВыводаРезультатаКД.НачатьВывод(); - - // Получает следующий элемент результата компоновки. - ЭлементРезультатаКД = ПроцессорКД.Следующий(); - Пока ЭлементРезультатаКД <> Неопределено Цикл - - // Вывести элемент результата компоновки отчета в документ. - ПроцессорВыводаРезультатаКД.ВывестиЭлемент(ЭлементРезультатаКД); - - // Определить не пустой результат. - Для Каждого ЗначениеПараметраМакетаКД Из ЭлементРезультатаКД.ЗначенияПараметров Цикл - Попытка - ЗначениеЗаполнено = ЗначениеЗаполнено(ЗначениеПараметраМакетаКД.Значение); - Исключение - ЗначениеЗаполнено = Ложь; // Линия, Рамка, Цвет и другие объекты КД, которые могут фигурировать при выводе. - КонецПопытки; - Если ЗначениеЗаполнено Тогда - ПроцессорВыводаРезультатаКД.ЗакончитьВывод(); - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - // Получает следующий элемент результата компоновки. - ЭлементРезультатаКД = ПроцессорКД.Следующий(); - КонецЦикла; - - // Указание объекту о том, что вывод результата завершен. - ПроцессорВыводаРезультатаКД.ЗакончитьВывод(); - - Возврат Истина; -КонецФункции - -// Проверяет наличие внешних наборов данных. -// -// Параметры: -// НаборыДанных - НаборыДанныхМакетаКомпоновкиДанных - Коллекция проверяемых наборов данных. -// -// Возвращаемое значение: -// Булево - Истина если есть внешние наборы данных. -// -Функция ЕстьВнешнийНаборДанных(НаборыДанных) - - Для Каждого НаборДанных Из НаборыДанных Цикл - - Если ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъектМакетаКомпоновкиДанных") Тогда - - Возврат Истина; - - ИначеЕсли ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда - - Если ЕстьВнешнийНаборДанных(НаборДанных.Элементы) Тогда - - Возврат Истина; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -// Заполняет описание настроек для строки варианта отчета если оно еще не заполнено. -// -// Параметры: -// СтрокаВариант - СтрокаДерева - Описание настроек варианта отчета. -// СтрокаОтчет - СтрокаДерева - Необязательный. Описание настроек отчета. -// -Процедура ЗаполнитьОписаниеСтрокиВарианта(СтрокаВариант, СтрокаОтчет = Неопределено) Экспорт - Если СтрокаВариант.ОписаниеПолучено Тогда - Возврат; - КонецЕсли; - - Если СтрокаОтчет = Неопределено Тогда - СтрокаОтчет = СтрокаВариант.Родитель; - КонецЕсли; - - // Флажок изменения настроек - СтрокаВариант.ОписаниеПолучено = Истина; - - // Копирование настроек отчета. - ЗаполнитьЗначенияСвойств(СтрокаВариант, СтрокаОтчет, "Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету"); - - Если СтрокаВариант = СтрокаОтчет.ОсновнойВариант Тогда - // Вариант "по умолчанию". - СтрокаВариант.Описание = СтрокаОтчет.Описание; - СтрокаВариант.ВидимостьПоУмолчанию = Истина; - Иначе - // Предопределенный вариант. - Если СтрокаВариант.ГруппироватьПоОтчету Тогда - СтрокаВариант.ВидимостьПоУмолчанию = Ложь; - КонецЕсли; - КонецЕсли; - - СтрокаВариант.Размещение = ОбщегоНазначенияКлиентСервер.СкопироватьСоответствие(СтрокаОтчет.Размещение); - СтрокаВариант.ФункциональныеОпции = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(СтрокаОтчет.ФункциональныеОпции); - СтрокаВариант.НастройкиДляПоиска = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(СтрокаОтчет.НастройкиДляПоиска); - СтрокаВариант.КлючЗамеров = СтрХеш("Отчет." + СтрокаОтчет.Метаданные.Имя + "." + СтрокаВариант.КлючВарианта, 135); - -КонецПроцедуры - -// Устанавливает режим вывода вариантов отчета в панелях отчетов. -// -// Параметры: -// ДеревоВариантов - ДеревоЗначений - Передается "как есть" из процедуры НастроитьВариантыОтчетов. -// Отчет - СтрокаДереваЗначений, ОбъектМетаданных: Отчет - Описание настроек или метаданные отчета. -// ВыводитьОтчетыВместоВариантов - Булево - Режим вывода в панели отчетов: -// - Истина - По отчетам (варианты скрыты, а отчет включен и видим). -// - Ложь - По вариантам (варианты видимы, а отчет отключен). -// -Процедура УстановитьРежимВыводаОтчетаВПанеляхОтчетов(ДеревоВариантов, Отчет, ВыводитьОтчетыВместоВариантов) - Если ТипЗнч(Отчет) = Тип("СтрокаДереваЗначений") Тогда - СтрокаОтчет = Отчет; - Иначе - СтрокаОтчет = ДеревоВариантов.Строки.Найти(Отчет, "Метаданные", Ложь); - Если СтрокаОтчет = Неопределено Тогда - ПредупреждениеПоВарианту(Неопределено, НСтр("ru = 'Отчет ""%1"" не подключен к подсистеме.'"), Отчет.Имя); - Возврат; - КонецЕсли; - КонецЕсли; - СтрокаОтчет.ГруппироватьПоОтчету = ВыводитьОтчетыВместоВариантов; -КонецПроцедуры - -// Формирует таблицу замен старых ключей вариантов на актуальные. -// -// Возвращаемое значение: -// ТаблицаЗначений - Таблица изменений имен вариантов. Колонки: -// * ОтчетМетаданные - ОбъектМетаданных: Отчет - Метаданные отчета, в схеме которого изменилось имя варианта. -// * СтароеИмяВарианта - Строка - Старое имя варианта, до изменения. -// * АктуальноеИмяВарианта - Строка - Текущее (последнее актуальное) имя варианта. -// * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных, Строка - Ссылка или имя отчета, -// использующееся для хранения. -// -// См. также: -// ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(). -// Служебное событие "СтандартныеПодсистемы.ВариантыОтчетов\ПриРегистрацииИзмененийИменВариантовОтчетов". -// -Функция ИзмененияКлючей() - - РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; - - Изменения = Новый ТаблицаЗначений; - Изменения.Колонки.Добавить("Отчет", Новый ОписаниеТипов("ОбъектМетаданных")); - Изменения.Колонки.Добавить("СтароеИмяВарианта", РеквизитыВариантов.КлючВарианта.Тип); - Изменения.Колонки.Добавить("АктуальноеИмяВарианта", РеквизитыВариантов.КлючВарианта.Тип); - - // Подключаемые обработчики подсистем БСП. - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.ВариантыОтчетов\ПриРегистрацииИзмененийИменВариантовОтчетов"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриРегистрацииИзмененийИменВариантовОтчетов(Изменения); - КонецЦикла; - - // Переопределяемая часть. - ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(Изменения); - - Изменения.Колонки.Отчет.Имя = "ОтчетМетаданные"; - Изменения.Колонки.Добавить("Отчет", РеквизитыВариантов.Отчет.Тип); - - // Проверить корректность замен. - Для Каждого Изменение Из Изменения Цикл - Изменение.Отчет = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Изменение.ОтчетМетаданные); - Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.АктуальноеИмяВарианта)); - Если Найденные.Количество() > 0 Тогда - Конфликт = Найденные[0]; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": - |Актуальное имя варианта ""%2"" (старое имя ""%3"") - |так же числится как старое имя ""%4"" (актуальное имя ""%5"").'"), - Строка(Изменение.Отчет), - Изменение.АктуальноеИмяВарианта, - Изменение.СтароеИмяВарианта, - Конфликт.СтароеИмяВарианта, - Конфликт.АктуальноеИмяВарианта); - КонецЕсли; - Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.СтароеИмяВарианта)); - Если Найденные.Количество() > 2 Тогда - Конфликт = Найденные[1]; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": - |Старое имя варианта ""%2"" (актуальное имя ""%3"") - |так же числится как старое имя - |варианта отчета ""%4"" (актуальное имя ""%5"").'"), - Строка(Изменение.Отчет), - Изменение.СтароеИмяВарианта, - Изменение.АктуальноеИмяВарианта, - Строка(Конфликт.ОтчетМетаданные.Представление()), - Конфликт.АктуальноеИмяВарианта); - КонецЕсли; - КонецЦикла; - - Возврат Изменения; КонецФункции // Формирует ссылку и тип отчета по полному имени. @@ -2830,10 +1916,10 @@ Результат.ОтчетМетаданные = Метаданные.Отчеты.Найти(Результат.ОтчетИмя); Если Результат.ОтчетМетаданные = Неопределено Тогда Результат.ОтчетПолноеИмя = "ВнешнийОтчет." + Результат.ОтчетИмя; - ПредупреждениеПоВарианту( - Неопределено, - НСтр("ru = 'Отчет ""%1"" не найден в программе, он будет значиться как внешний.'"), - ОтчетПолноеИмя); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет ""%1"" не найден в программе, он будет значиться как внешний.'"), + ОтчетПолноеИмя)); ИначеЕсли Не ПравоДоступа("Просмотр", Результат.ОтчетМетаданные) Тогда Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недостаточно прав доступа к отчету ""%1"".'"), @@ -2878,6 +1964,833 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Для отчета по внедрению. + +// Формирует дерево настроек и размещения предопределенных вариантов отчетов. +// Только для отчетов, подключенных к подсистеме. +// +// Возвращаемое значение: +// ДеревоЗначений - Настройки предопределенных вариантов отчетов, подключенных к подсистеме. +// +// Реквизиты для изменения: +// * Включен - Булево - Если Ложь, то вариант отчета не регистрируется в подсистеме. +// * ВидимостьПоУмолчанию - Булево - Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * Наименование - Строка - Наименование варианта отчета. +// * Описание - Строка - Информация о варианте отчета. +// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. +// ** Ключ - ОбъектМетаданных - Подсистема, в которой размещается отчет или вариант отчета. +// ** Значение - Строка - Настройки размещения в подсистеме (группе). +// "" - Вывод отчета в подсистеме без специального выделение. +// "Важный" - Вывод отчета в подсистеме с выделением жирным шрифтом. +// "СмТакже" - Вывод отчета в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - Имена функциональных опций варианта отчета. +// * НастройкиДляПоиска - Структура - Дополнительные настройки для поиска этого варианта отчета. +// Эти настройки необходимо задавать только если СКД не используется или используется не в полном объеме. +// Например, СКД может использоваться только для параметризации и получения данных, +// а вывод выполняться в фиксированный макет табличного документа. +// ** НаименованияПолей - Строка - Имена полей варианта отчета. +// ** НаименованияПараметровИОтборов - Строка - Имена настроек варианта отчета. +// ** КлючевыеСлова - Строка - Дополнительная терминология (в т.ч. специализированная или устаревшая). +// Разделитель терминов: Символы.ПС. +// ** ИменаМакетов - Строка - Используется вместо НаименованияПолей. +// Имена макетов табличных или текстовых документов, +// из которых требуется извлечь информацию о наименованиях полей. +// Имена перечисляются через запятую. +// К сожалению, в макетах отсутствует информация о связях полей и их представлений (которая есть в СКД), +// поэтому для более точной работы механизма поиска рекомендуется заполнять НаименованияПолей, а не +// ИменаМакетов. +// * ФорматНастроекСКД - Булево - Отчет использует типовой формат хранения настроек на механике СКД, +// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип +// возвращаемого значения). +// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые +// рассчитывают на типовой формат. +// * ОпределитьНастройкиФормы - Булево - Отчет имеет программный интерфейс для тесной интеграции с формой отчета, +// в том числе может переопределять некоторые настройки формы и подписываться на ее события. +// Если Истина и отчет подключен к общей форме ФормаОтчета, +// тогда в модуле объекта отчета следует определить процедуру по шаблону: +// +// // Настройки общей формы отчета подсистемы "Варианты отчетов". +// // +// // Параметры: +// // Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета. +// // Неопределено когда вызов без контекста. +// // КлючВарианта - Строка, Неопределено - Имя предопределенного +// // или уникальный идентификатор пользовательского варианта отчета. +// // Неопределено когда вызов без контекста. +// // Настройки - Структура - см. возвращаемое значение +// // ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(). +// // +// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт +// // Код процедуры. +// КонецПроцедуры +// +// Служебные реквизиты (только для чтения): +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Полное имя или ссылка на отчет. +// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. +// * КлючВарианта - Строка - Имя варианта отчета. +// * ОписаниеПолучено - Булево - Флажок что описание строки уже получено. +// Описание получается методом ОписаниеВарианта(). +// * СистемнаяИнформация - Структура - Другая служебная информация. +// +Функция ДеревоПредопределенных(ФильтрПоТипуОтчетов = "Внутренний") Экспорт + РеквизитыСправочника = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; + + ДеревоВариантов = Новый ДеревоЗначений; + ДеревоВариантов.Колонки.Добавить("Отчет", РеквизитыСправочника.Отчет.Тип); + ДеревоВариантов.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных")); + ДеревоВариантов.Колонки.Добавить("ИспользуетСКД", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("КлючВарианта", РеквизитыСправочника.КлючВарианта.Тип); + ДеревоВариантов.Колонки.Добавить("ОписаниеПолучено", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("Включен", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("ВидимостьПоУмолчанию", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("Наименование", ОписаниеТиповСтрока()); + ДеревоВариантов.Колонки.Добавить("Описание", ОписаниеТиповСтрока()); + ДеревоВариантов.Колонки.Добавить("Размещение", Новый ОписаниеТипов("Соответствие")); + ДеревоВариантов.Колонки.Добавить("НастройкиДляПоиска", Новый ОписаниеТипов("Структура")); + ДеревоВариантов.Колонки.Добавить("СистемнаяИнформация", Новый ОписаниеТипов("Структура")); + ДеревоВариантов.Колонки.Добавить("Тип", ОписаниеТиповСтрока()); + ДеревоВариантов.Колонки.Добавить("ЭтоВариант", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("ФункциональныеОпции", Новый ОписаниеТипов("Массив")); + ДеревоВариантов.Колонки.Добавить("ГруппироватьПоОтчету", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("КлючЗамеров", Новый ОписаниеТипов("Строка")); + ДеревоВариантов.Колонки.Добавить("ОсновнойВариант"); + ДеревоВариантов.Колонки.Добавить("ФорматНастроекСКД", Новый ОписаниеТипов("Булево")); + ДеревоВариантов.Колонки.Добавить("ОпределитьНастройкиФормы", Новый ОписаниеТипов("Булево")); + + ГруппироватьПоОтчетам = ГлобальныеНастройки().ВыводитьОтчетыВместоВариантов; + РазрешеноИндексирование = РазрешеноИндексированиеНеразделенныхДанных(); + ЕстьПодключаемыеКоманды = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды"); + Если ЕстьПодключаемыеКоманды Тогда + СоставПодключаемыхОтчетовИОбработок = Метаданные.Подсистемы["ПодключаемыеОтчетыИОбработки"].Состав; + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + КонецЕсли; + + ПодсистемыОтчетов = РазмещениеОтчетовВПодсистемах(); + КэшФлажкаХранилища = Неопределено; + КэшФлажкаОсновнойФормы = Неопределено; + КэшФлажкаФормыНастроек = Неопределено; + Для Каждого ОтчетМетаданные Из Метаданные.Отчеты Цикл + Если Не ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажкаХранилища) Тогда + Продолжить; + КонецЕсли; + + ОтчетСсылка = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(ОтчетМетаданные); + ОтчетТип = ВариантыОтчетовКлиентСервер.ТипОтчета(ОтчетСсылка, Истина); + Если ФильтрПоТипуОтчетов <> Неопределено И ФильтрПоТипуОтчетов <> ОтчетТип Тогда + Продолжить; + КонецЕсли; + + ЕстьРеквизиты = (ОтчетМетаданные.Реквизиты.Количество() > 0); + + // Настройки. + СтрокаОтчет = ДеревоВариантов.Строки.Добавить(); + СтрокаОтчет.Отчет = ОтчетСсылка; + СтрокаОтчет.Метаданные = ОтчетМетаданные; + СтрокаОтчет.Включен = Истина; + СтрокаОтчет.ВидимостьПоУмолчанию = Истина; + СтрокаОтчет.Описание = ОтчетМетаданные.Пояснение; + СтрокаОтчет.Наименование = ОтчетМетаданные.Представление(); + СтрокаОтчет.ОписаниеПолучено = Истина; + СтрокаОтчет.Тип = ОтчетТип; + СтрокаОтчет.ЭтоВариант = Ложь; + СтрокаОтчет.ГруппироватьПоОтчету = ГруппироватьПоОтчетам; + СтрокаОтчет.ИспользуетСКД = (ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных <> Неопределено); + СтрокаОтчет.ФорматНастроекСКД = СтрокаОтчет.ИспользуетСКД И Не ЕстьРеквизиты; + + // Подсистемы. + Найденные = ПодсистемыОтчетов.НайтиСтроки(Новый Структура("ОтчетМетаданные", ОтчетМетаданные)); + Для Каждого СтрокаПодсистема Из Найденные Цикл + СтрокаОтчет.Размещение.Вставить(СтрокаПодсистема.ПодсистемаМетаданные, ""); + КонецЦикла; + + // Поиск. + СтрокаОтчет.НастройкиДляПоиска = Новый Структура("НаименованияПолей, НаименованияПараметровИОтборов, КлючевыеСлова, ИменаМакетов"); + + // Предопределенные варианты. + Если СтрокаОтчет.ИспользуетСКД Тогда + ОтчетМенеджер = Отчеты[ОтчетМетаданные.Имя]; + СхемаКД = Неопределено; + ВариантыНастроек = Неопределено; + Попытка + СхемаКД = ОтчетМенеджер.ПолучитьМакет(ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных.Имя); + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось прочитать схему отчета:'"); + ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); + КонецПопытки; + // Чтение настроек вариантов отчета из схемы. + Если СхемаКД <> Неопределено Тогда + Попытка + ВариантыНастроек = СхемаКД.ВариантыНастроек; + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета:'"); + ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); + КонецПопытки; + КонецЕсли; + // Чтение настроек вариантов отчета из модуля менеджера (если не получилось из схемы). + Если ВариантыНастроек = Неопределено Тогда + Попытка + ВариантыНастроек = ОтчетМенеджер.ВариантыНастроек(); + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета из модуля менеджера:'"); + ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ОтчетМетаданные); + КонецПопытки; + КонецЕсли; + // Регистрация найденных вариантов. + Если ВариантыНастроек <> Неопределено Тогда + Для Каждого ВариантНастроекКД Из ВариантыНастроек Цикл + Вариант = СтрокаОтчет.Строки.Добавить(); + Вариант.Отчет = СтрокаОтчет.Отчет; + Вариант.КлючВарианта = ВариантНастроекКД.Имя; + Вариант.Наименование = ВариантНастроекКД.Представление; + Вариант.Тип = ОтчетТип; + Вариант.ЭтоВариант = Истина; + Если СтрокаОтчет.ОсновнойВариант = Неопределено Тогда + СтрокаОтчет.ОсновнойВариант = Вариант; + КонецЕсли; + Если РазрешеноИндексирование И ТипЗнч(ВариантНастроекКД) = Тип("ВариантНастроекКомпоновкиДанных") Тогда + Попытка + Вариант.СистемнаяИнформация.Вставить("НастройкиКД", ВариантНастроекКД.Настройки); + Исключение + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать настройки варианта ""%1"":'"), + Вариант.КлючВарианта) + + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); + КонецПопытки; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + // Сам отчет. + Если СтрокаОтчет.ОсновнойВариант = Неопределено Тогда + Вариант = СтрокаОтчет.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(Вариант, СтрокаОтчет, "Отчет, Наименование"); + Вариант.КлючВарианта = ""; + Вариант.ЭтоВариант = Истина; + СтрокаОтчет.ОсновнойВариант = Вариант; + КонецЕсли; + + // Обработка отчетов, включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. + Если ЕстьПодключаемыеКоманды И СоставПодключаемыхОтчетовИОбработок.Содержит(ОтчетМетаданные) Тогда + НастройкиПоставщика = МодульПодключаемыеКоманды.НастройкиПодключаемогоОбъекта(ОтчетМетаданные.ПолноеИмя()); + Если НастройкиПоставщика.ОпределитьНастройкиФормы Тогда + СтрокаОтчет.ОпределитьНастройкиФормы = Истина; + КонецЕсли; + Если НастройкиПоставщика.НастроитьВариантыОтчета Тогда + НастроитьОтчетВМодулеМенеджера(ДеревоВариантов, ОтчетМетаданные); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // Механизмы расширения. + Если ФильтрПоТипуОтчетов = Неопределено Или ФильтрПоТипуОтчетов = "Внутренний" Тогда + НастроитьОтчетВМодулеМенеджера(ДеревоВариантов, Метаданные.Отчеты.УниверсальныйОтчет); + // Подключаемые обработчики подсистем БСП. + ИнтеграцияСтандартныхПодсистем.ПриНастройкеВариантовОтчетов(ДеревоВариантов); + // Переопределяемый модуль конфигурации. + ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(ДеревоВариантов); + КонецЕсли; + + // Определение основных вариантов. + Для Каждого СтрокаОтчет Из ДеревоВариантов.Строки Цикл + Если СтрокаОтчет.ГруппироватьПоОтчету = Истина Тогда + Если СтрокаОтчет.ОсновнойВариант = Неопределено + Или Не СтрокаОтчет.ОсновнойВариант.Включен Тогда + Для Каждого Вариант Из СтрокаОтчет.Строки Цикл + ЗаполнитьОписаниеСтрокиВарианта(Вариант, СтрокаОтчет); + Если Вариант.Включен Тогда + СтрокаОтчет.ОсновнойВариант = Вариант; + Вариант.ВидимостьПоУмолчанию = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Иначе + СтрокаОтчет.ОсновнойВариант = Неопределено; + КонецЕсли; + КонецЦикла; + + Возврат ДеревоВариантов; +КонецФункции + +// Определяет подключен-ли отчет к хранилищу вариантов отчетов. +Функция ОтчетПодключенКХранилищу(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт + ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов; + Если ХранилищеМетаданные = Неопределено Тогда + Если ПоУмолчаниюВсеПодключены = Неопределено Тогда + ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКХранилищу(); + КонецЕсли; + ОтчетПодключен = ПоУмолчаниюВсеПодключены; + Иначе + ОтчетПодключен = (ХранилищеМетаданные = Метаданные.ХранилищаНастроек.ХранилищеВариантовОтчетов); + КонецЕсли; + Возврат ОтчетПодключен; +КонецФункции + +// Определяет подключен-ли отчет к общей форме отчета. +Функция ОтчетПодключенКОсновнойФорме(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт + ФормаМетаданные = ОтчетМетаданные.ОсновнаяФорма; + Если ФормаМетаданные = Неопределено Тогда + Если ПоУмолчаниюВсеПодключены = Неопределено Тогда + ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКОсновнойФорме(); + КонецЕсли; + ОтчетПодключен = ПоУмолчаниюВсеПодключены; + Иначе + ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета); + КонецЕсли; + Возврат ОтчетПодключен; +КонецФункции + +// Определяет подключен-ли отчет к общей форме настроек отчета. +Функция ОтчетПодключенКФормеНастроек(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт + ФормаМетаданные = ОтчетМетаданные.ОсновнаяФормаНастроек; + Если ФормаМетаданные = Неопределено Тогда + Если ПоУмолчаниюВсеПодключены = Неопределено Тогда + ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКФормеНастроек(); + КонецЕсли; + ОтчетПодключен = ПоУмолчаниюВсеПодключены; + Иначе + ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета); + КонецЕсли; + Возврат ОтчетПодключен; +КонецФункции + +// Список объектов, в которых используются команды отчетов. +// +// Возвращаемое значение: +// Массив из ОбъектМетаданных - Объекты метаданных с командами отчетов. +// +Функция ОбъектыСКомандамиОтчетов() Экспорт + + Результат = Новый Массив; + ИнтеграцияСтандартныхПодсистем.ПриОпределенииОбъектовСКомандамиОтчетов(Результат); + ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов(Результат); + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + //////////////////////////////////////////////////////////////////////////////// + // 1. Обновление общих данных. + + Обработчик = Обработчики.Добавить(); + Обработчик.УправлениеОбработчиками = Истина; + Обработчик.ОбщиеДанные = Истина; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Версия = "*"; + Обработчик.Процедура = "ВариантыОтчетов.ОперативноеОбновлениеОбщихДанныхКонфигурации"; + Обработчик.Приоритет = 90; + + //////////////////////////////////////////////////////////////////////////////// + // 2. Обновление разделенных данных. + + // 2.1. Перевести разделенные данные на версию 2.1.1.0. + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.РежимВыполнения = "Монопольно"; + Обработчик.Версия = "2.1.1.0"; + Обработчик.Приоритет = 80; + Обработчик.Процедура = "ВариантыОтчетов.ПерейтиКРедакции21"; + + // 2.2. Перевести разделенные данные на версию 2.1.3.6. + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.РежимВыполнения = "Монопольно"; + Обработчик.Версия = "2.1.3.6"; + Обработчик.Приоритет = 80; + Обработчик.Процедура = "ВариантыОтчетов.ЗаполнитьСсылкиПредопределенных"; + + // 2.3. Удалить устаревшие отложенные разделенные обязательные (на *) обработчики обновления. + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "ВариантыОтчетов.УдалитьУстаревшиеОбработчики"; + Обработчик.Приоритет = 85; + + // 2.4. Обновить разделенные данные в локальном режиме. + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Версия = "*"; + Обработчик.Приоритет = 70; + Обработчик.Процедура = "ВариантыОтчетов.ОперативноеОбновлениеРазделенныхДанныхКонфигурации"; + + //////////////////////////////////////////////////////////////////////////////// + // 3. Отложенное обновление. + + // 3.1. Адаптация к интерфейсу "Такси". + Обработчик = Обработчики.Добавить(); + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("814d41ec-82e2-4d25-9334-8335e589fc1f"); + Обработчик.ОбщиеДанные = Ложь; + Обработчик.Версия = "2.2.3.31"; + Обработчик.Процедура = "ВариантыОтчетов.СократитьКоличествоБыстрыхНастроек"; + Обработчик.Комментарий = НСтр("ru = 'Уменьшает количество быстрых настроек в пользовательских отчетах до 2 шт.'"); + + // 3.2. Заполнить информацию для поиска предопределенных вариантов отчетов. + Если РазрешеноИндексированиеНеразделенныхДанных() Тогда + Обработчик = Обработчики.Добавить(); + Если ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.ОбщиеДанные = Истина; + Иначе + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОбщиеДанные = Ложь; // Для коробки без разницы, но при значении Истина механика обновления кидает исключение. + КонецЕсли; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("38d2a135-53e0-4c68-9bd6-3d6df9b9dcfb"); + Обработчик.Версия = "*"; + Обработчик.Процедура = "ВариантыОтчетов.ОтложенноеОбновлениеОбщихДанныхКонфигурацииПолное"; + Обработчик.Комментарий = НСтр("ru = 'Обновление индекса поиска отчетов, предусмотренных в программе.'"); + КонецЕсли; + + // 3.3. Заполнить информацию для поиска пользовательских вариантов отчетов. + Обработчик = Обработчики.Добавить(); + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("5ba93197-230b-4ac8-9abb-ab3662e5ff76"); + Обработчик.Версия = "*"; + Обработчик.Процедура = "ВариантыОтчетов.ОтложенноеОбновлениеРазделенныхДанныхКонфигурацииПолное"; + Обработчик.Комментарий = НСтр("ru = 'Обновление индекса поиска отчетов, сохраненных пользователями.'"); +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт + + ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВариантыОтчетов.ТабличныеЧасти.Размещение.Реквизиты.Подсистема); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт + + Библиотека = "СтандартныеПодсистемы"; + + ОбщегоНазначения.ДобавитьПереименование( + Итог, "2.1.0.2", "Роль.ЧтениеВариантовОтчетов", "Роль.ИспользованиеВариантовОтчетов", Библиотека); + ОбщегоНазначения.ДобавитьПереименование( + Итог, "2.3.3.3", "Роль.ИспользованиеВариантовОтчетов", "Роль.ДобавлениеИзменениеЛичныхВариантовОтчетов", Библиотека); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + Параметры.Вставить("ВариантыОтчетов", Новый ФиксированнаяСтруктура(ПараметрыКлиента())); +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений); + Типы.Добавить(Метаданные.РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений); + +КонецПроцедуры + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + // Загрузка в справочник ПользовательскиеНастройкиОтчетов запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт + + // СовместноДляПользователейИВнешнихПользователей. + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ДобавлениеИзменениеЛичныхВариантовОтчетов.Имя); + +КонецПроцедуры + +// См. РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений. +Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт + + Настройки = Новый Структура; + Настройки.Вставить("Конфигурация", Ложь); + Настройки.Вставить("Расширения", Истина); + + Настройки.Вставить("ОбщиеДанные", Истина); + Настройки.Вставить("РазделенныеДанные", Истина); + Настройки.Вставить("Оперативное", Истина); + Настройки.Вставить("Отложенное", Истина); + Настройки.Вставить("Полное", Истина); + + Обновить(Настройки); + +КонецПроцедуры + +// См. РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений. +Процедура ПриОчисткеВсехПараметровРаботыРасширений() Экспорт + + НаборЗаписей = РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ВерсияРасширений.Установить(ПараметрыСеанса.ВерсияРасширений); + НаборЗаписей.Записать(); + +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. +Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт + Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); + Настройка.Ключ = "ДобавитьКомандыОтчетов"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево"); + + Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); + Настройка.Ключ = "НастроитьВариантыОтчета"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево"); + Настройка.ВидыПодключаемыхОбъектов = "ОТЧЕТ"; + + Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); + Настройка.Ключ = "ОпределитьНастройкиФормы"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево"); + Настройка.ВидыПодключаемыхОбъектов = "ОТЧЕТ"; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + Вид = ВидыПодключаемыхКоманд.Добавить(); + Вид.Имя = "Отчеты"; + Вид.ИмяПодменю = "ПодменюОтчеты"; + Вид.Заголовок = НСтр("ru = 'Отчеты'"); + Вид.Порядок = 50; + Вид.Картинка = БиблиотекаКартинок.Отчет; + Вид.Отображение = ОтображениеКнопки.КартинкаИТекст; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт + КомандыОтчетов = Команды.СкопироватьКолонки(); + КомандыОтчетов.Колонки.Добавить("КлючВарианта", Новый ОписаниеТипов("Строка, Null")); + КомандыОтчетов.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево")); + КомандыОтчетов.Индексы.Добавить("Обработана"); + + СтандартнаяОбработка = Источники.Строки.Количество() > 0; + ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + КомандыОтчетов.ЗаполнитьЗначения(Истина, "Обработана"); + Если СтандартнаяОбработка Тогда + ОбъектыСКомандамиОтчетов = ОбъектыСКомандамиОтчетов(); + Для Каждого Источник Из Источники.Строки Цикл + Для Каждого ДокументРегистратор Из Источник.Строки Цикл + Если ОбъектыСКомандамиОтчетов.Найти(ДокументРегистратор.Метаданные) <> Неопределено Тогда + ПриДобавленииКомандОтчетов(КомандыОтчетов, ДокументРегистратор, НастройкиФормы); + КонецЕсли; + КонецЦикла; + Если ОбъектыСКомандамиОтчетов.Найти(Источник.Метаданные) <> Неопределено Тогда + ПриДобавленииКомандОтчетов(КомандыОтчетов, Источник, НастройкиФормы); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыОтчетов", Истина)); + Для Каждого ПодключенныйОбъект Из Найденные Цикл + ПриДобавленииКомандОтчетов(КомандыОтчетов, ПодключенныйОбъект, НастройкиФормы); + КонецЦикла; + + Для Каждого КомандаОтчетов Из КомандыОтчетов Цикл + Команда = Команды.Добавить(); + ЗаполнитьЗначенияСвойств(Команда, КомандаОтчетов); + Команда.Вид = "Отчеты"; + Если Команда.Порядок = 0 Тогда + Команда.Порядок = 50; + КонецЕсли; + Если Команда.РежимЗаписи = "" Тогда + Команда.РежимЗаписи = "ЗаписыватьТолькоНовые"; + КонецЕсли; + Если Команда.МножественныйВыбор = Неопределено Тогда + Команда.МножественныйВыбор = Истина; + КонецЕсли; + Если ПустаяСтрока(Команда.ИмяФормы) И ПустаяСтрока(Команда.Обработчик) Тогда + Команда.ИмяФормы = "Форма"; + КонецЕсли; + Если Команда.ПараметрыФормы = Неопределено Тогда + Команда.ПараметрыФормы = Новый Структура; + КонецЕсли; + Команда.ПараметрыФормы.Вставить("КлючВарианта", КомандаОтчетов.КлючВарианта); + Если ПустаяСтрока(Команда.Обработчик) Тогда + Команда.ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина); + Команда.ПараметрыФормы.Вставить("ВидимостьКомандВариантовОтчетов", Ложь); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Инициализация отчетов. + +// Получает объект отчета по ссылке варианта отчета. +// +// Параметры: +// СсылкаОтчета - +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка отчета конфигурации. +// - СправочникСсылка.ИдентификаторыОбъектовРасширений - Ссылка отчета расширения. +// - Произвольный - Ссылка дополнительного или внешнего отчета. +// +// Возвращаемое значение: +// Структура - Параметры отчета, в том числе Объект отчета. +// * Объект - ОтчетОбъект.<Имя отчета>, ВнешнийОтчет - Объект отчета. +// * Имя - Строка - Имя объекта отчета. +// * ПолноеИмя - Строка - Полное имя объекта отчета. +// * Метаданные - ОбъектМетаданных - Объект метаданных отчета. +// * Ссылка - Произвольный - Ссылка отчета. +// * Успех - Булево - Истина если удалось подключить отчет. +// * ТекстОшибки - Строка - Текст ошибки. +// +// Места использования: +// РассылкаОтчетов.ИнициализироватьОтчет(). +// +Функция ПодключитьОтчетОбъект(СсылкаОтчета, ПолучатьМетаданные) + Результат = Новый Структура("Объект, Имя, ПолноеИмя, Метаданные, Ссылка, ТекстОшибки"); + Результат.Вставить("Успех", Ложь); + + Если СсылкаОтчета = Неопределено Тогда + Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В методе ""%1"" не указан параметр ""%2"".'"), + "ПодключитьОтчетОбъект", + "СсылкаОтчета"); + Возврат Результат; + Иначе + Результат.Ссылка = СсылкаОтчета; + КонецЕсли; + + Если ТипЗнч(Результат.Ссылка) = Тип("Строка") Тогда + Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет ""%1"" записан как внешний и не может быть подключен из программы'"), + Результат.Ссылка); + Возврат Результат; + КонецЕсли; + + Если ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") + Или ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + + Результат.Метаданные = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектМетаданныхПоИдентификатору( + Результат.Ссылка, Истина); + + Если ТипЗнч(Результат.Метаданные) <> Тип("ОбъектМетаданных") Тогда + Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет ""%1"" не найден в программе'"), + Результат.Имя); + Возврат Результат; + КонецЕсли; + Результат.Имя = Результат.Метаданные.Имя; + Результат.Объект = Отчеты[Результат.Имя].Создать(); + Результат.Успех = Истина; + Иначе + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(Результат.Ссылка, Результат, Результат.Успех, ПолучатьМетаданные); + КонецЕсли; + КонецЕсли; + + Если Результат.Успех И ПолучатьМетаданные Тогда + Результат.ПолноеИмя = Результат.Метаданные.ПолноеИмя(); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Компоновка данных. + +// Формирует отчет с указанными настройками, используется в фоновых заданиях. +Процедура СформироватьОтчетВФоне(Параметры, АдресХранилища) Экспорт + Формирование = СформироватьОтчет(Параметры, Ложь, Ложь); + + Результат = Новый Структура("ТабличныйДокумент, Расшифровка, + |Успех, ТекстОшибки, ДанныеЕщеОбновляются, + |ВариантМодифицирован, ПользовательскиеНастройкиМодифицированы"); + ЗаполнитьЗначенияСвойств(Результат, Формирование); + + Если Результат.ВариантМодифицирован Тогда + Результат.Вставить("НастройкиКД", Формирование.НастройкиКД); + КонецЕсли; + Если Результат.ПользовательскиеНастройкиМодифицированы Тогда + Результат.Вставить("ПользовательскиеНастройкиКД", Формирование.ПользовательскиеНастройкиКД); + КонецЕсли; + + ПоместитьВоВременноеХранилище(Результат, АдресХранилища); +КонецПроцедуры + +// Заполняет описание настроек для строки варианта отчета если оно еще не заполнено. +// +// Параметры: +// СтрокаВариант - СтрокаДерева - Описание настроек варианта отчета. +// СтрокаОтчет - СтрокаДерева - Необязательный. Описание настроек отчета. +// +Процедура ЗаполнитьОписаниеСтрокиВарианта(СтрокаВариант, СтрокаОтчет = Неопределено) Экспорт + Если СтрокаВариант.ОписаниеПолучено Тогда + Возврат; + КонецЕсли; + + Если СтрокаОтчет = Неопределено Тогда + СтрокаОтчет = СтрокаВариант.Родитель; + КонецЕсли; + + // Флажок изменения настроек + СтрокаВариант.ОписаниеПолучено = Истина; + + // Копирование настроек отчета. + ЗаполнитьЗначенияСвойств(СтрокаВариант, СтрокаОтчет, "Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету"); + + Если СтрокаВариант = СтрокаОтчет.ОсновнойВариант Тогда + // Вариант "по умолчанию". + СтрокаВариант.Описание = СтрокаОтчет.Описание; + СтрокаВариант.ВидимостьПоУмолчанию = Истина; + Иначе + // Предопределенный вариант. + Если СтрокаВариант.ГруппироватьПоОтчету Тогда + СтрокаВариант.ВидимостьПоУмолчанию = Ложь; + КонецЕсли; + КонецЕсли; + + СтрокаВариант.Размещение = ОбщегоНазначенияКлиентСервер.СкопироватьСоответствие(СтрокаОтчет.Размещение); + СтрокаВариант.ФункциональныеОпции = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(СтрокаОтчет.ФункциональныеОпции); + СтрокаВариант.НастройкиДляПоиска = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(СтрокаОтчет.НастройкиДляПоиска); + СтрокаВариант.КлючЗамеров = ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой("Отчет." + СтрокаОтчет.Метаданные.Имя + + "." + СтрокаВариант.КлючВарианта, 135); + +КонецПроцедуры + +// Панели отчетов. + +// Формирует список разделов, в которых размещены команды вызова панели отчетов. +// +// Возвращаемое значение: +// СписокЗначений - См. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(). +// +Функция СписокРазделов() Экспорт + СписокРазделов = Новый СписокЗначений; + + ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(СписокРазделов); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов); + КонецЕсли; + + Возврат СписокРазделов; +КонецФункции + +// Устанавливает режим вывода вариантов отчета в панелях отчетов. +// +// Параметры: +// ДеревоВариантов - ДеревоЗначений - Передается "как есть" из процедуры НастроитьВариантыОтчетов. +// Отчет - СтрокаДереваЗначений, ОбъектМетаданных: Отчет - Описание настроек или метаданные отчета. +// ГруппироватьПоОтчетам - Булево - Режим вывода в панели отчетов: +// - Истина - По отчетам (варианты скрыты, а отчет включен и видим). +// - Ложь - По вариантам (варианты видимы, а отчет отключен). +// +Процедура УстановитьРежимВыводаОтчетаВПанеляхОтчетов(ДеревоВариантов, Отчет, ГруппироватьПоОтчетам) + Если ТипЗнч(Отчет) = Тип("СтрокаДереваЗначений") Тогда + СтрокаОтчет = Отчет; + Иначе + СтрокаОтчет = ДеревоВариантов.Строки.Найти(Отчет, "Метаданные", Ложь); + Если СтрокаОтчет = Неопределено Тогда + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет ""%1"" не подключен к подсистеме.'"), Отчет.Имя)); + Возврат; + КонецЕсли; + КонецЕсли; + СтрокаОтчет.ГруппироватьПоОтчету = ГруппироватьПоОтчетам; +КонецПроцедуры + +// Формирует таблицу замен старых ключей вариантов на актуальные. +// +// Возвращаемое значение: +// ТаблицаЗначений - Таблица изменений имен вариантов. Колонки: +// * ОтчетМетаданные - ОбъектМетаданных: Отчет - Метаданные отчета, в схеме которого изменилось имя варианта. +// * СтароеИмяВарианта - Строка - Старое имя варианта, до изменения. +// * АктуальноеИмяВарианта - Строка - Текущее (последнее актуальное) имя варианта. +// * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных, Строка - Ссылка или имя отчета, +// использующееся для хранения. +// +// См. также: +// ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(). +// +Функция ИзмененияКлючей() + + РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; + + Изменения = Новый ТаблицаЗначений; + Изменения.Колонки.Добавить("Отчет", Новый ОписаниеТипов("ОбъектМетаданных")); + Изменения.Колонки.Добавить("СтароеИмяВарианта", РеквизитыВариантов.КлючВарианта.Тип); + Изменения.Колонки.Добавить("АктуальноеИмяВарианта", РеквизитыВариантов.КлючВарианта.Тип); + + // Переопределяемая часть. + ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(Изменения); + + Изменения.Колонки.Отчет.Имя = "ОтчетМетаданные"; + Изменения.Колонки.Добавить("Отчет", РеквизитыВариантов.Отчет.Тип); + + // Проверить корректность замен. + Для Каждого Изменение Из Изменения Цикл + Изменение.Отчет = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Изменение.ОтчетМетаданные); + Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.АктуальноеИмяВарианта)); + Если Найденные.Количество() > 0 Тогда + Конфликт = Найденные[0]; + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": + |Актуальное имя варианта ""%2"" (старое имя ""%3"") + |также числится как старое имя ""%4"" (актуальное имя ""%5"").'"), + Строка(Изменение.Отчет), + Изменение.АктуальноеИмяВарианта, + Изменение.СтароеИмяВарианта, + Конфликт.СтароеИмяВарианта, + Конфликт.АктуальноеИмяВарианта); + КонецЕсли; + Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.СтароеИмяВарианта)); + Если Найденные.Количество() > 2 Тогда + Конфликт = Найденные[1]; + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": + |Старое имя варианта ""%2"" (актуальное имя ""%3"") + |также числится как старое имя + |варианта отчета ""%4"" (актуальное имя ""%5"").'"), + Строка(Изменение.Отчет), + Изменение.СтароеИмяВарианта, + Изменение.АктуальноеИмяВарианта, + Строка(Конфликт.ОтчетМетаданные.Представление()), + Конфликт.АктуальноеИмяВарианта); + КонецЕсли; + КонецЦикла; + + Возврат Изменения; +КонецФункции + // Формирует таблицу размещения отчетов по подсистемам конфигурации. // // Параметры: @@ -2891,7 +2804,7 @@ // * ПодсистемаМетаданные - ОбъектМетаданных: Подсистема. // * ПодсистемаПолноеИмя - Строка. // -Функция РазмещениеОтчетовВПодсистемах(Результат = Неопределено, ПодсистемаРодитель = Неопределено) Экспорт +Функция РазмещениеОтчетовВПодсистемах(Результат = Неопределено, ПодсистемаРодитель = Неопределено) Если Результат = Неопределено Тогда ПолноеИмяОписаниеТипов = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.Реквизиты.ПолноеИмя.Тип; @@ -2901,6 +2814,8 @@ Результат.Колонки.Добавить("ПодсистемаМетаданные", Новый ОписаниеТипов("ОбъектМетаданных")); Результат.Колонки.Добавить("ПодсистемаПолноеИмя", ПолноеИмяОписаниеТипов); + Результат.Индексы.Добавить("ОтчетПолноеИмя"); + ПодсистемаРодитель = Метаданные; КонецЕсли; @@ -2924,7 +2839,7 @@ КонецЦикла; - РазмещениеОтчетовВПодсистемах(Результат, ПодсистемаМетаданные);; + РазмещениеОтчетовВПодсистемах(Результат, ПодсистемаМетаданные); КонецЦикла; Возврат Результат; @@ -2934,7 +2849,7 @@ // связанного с элементом справочника "Варианты отчетов". // // Параметры: -// ВариантОбъект - СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура +// ВариантОбъект - СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура - Вариант отчета. // Функция СброситьНастройкиВариантаОтчета(ВариантОбъект) Экспорт Если ВариантОбъект.Пользовательский @@ -2976,7 +2891,7 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | 1 КАК Поле1 + | 1 КАК НаименованиеЗанято |ИЗ | Справочник.ВариантыОтчетов КАК ВариантыОтчетов |ГДЕ @@ -3002,7 +2917,7 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | 1 КАК Поле1 + | 1 КАК КлючВариантаЗанят |ИЗ | Справочник.ВариантыОтчетов КАК ВариантыОтчетов |ГДЕ @@ -3047,7 +2962,8 @@ Функция ГлобальныеНастройки() Экспорт Результат = Новый Структура; Результат.Вставить("ВыводитьОтчетыВместоВариантов", Ложь); - Результат.Вставить("ВыводитьОписания", Истина); + Результат.Вставить("ВыводитьОписания", Истина); + Результат.Вставить("РазрешеноИзменятьВарианты", Истина); Результат.Вставить("Поиск", Новый Структура); Результат.Поиск.Вставить("ПодсказкаВвода", НСтр("ru = 'Наименование, поле или автор отчета'")); @@ -3056,7 +2972,7 @@ Результат.ДругиеОтчеты.Вставить("ЗакрыватьПослеВыбора", Истина); Результат.ДругиеОтчеты.Вставить("ПоказыватьФлажок", Ложь); - ВариантыОтчетовПереопределяемый.ОпределитьГлобальныеНастройки(Результат); + ВариантыОтчетовПереопределяемый.ПриОпределенииНастроек(Результат); Возврат Результат; КонецФункции @@ -3127,55 +3043,39 @@ //////////////////////////////////////////////////////////////////////////////// // Журнал регистрации -// Запись ошибки в журнал регистрации. -Процедура ОшибкаПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт - Уровень = УровеньЖурналаРегистрации.Ошибка; - ЗаписьЖурнала(Уровень, Вариант, Сообщение, Реквизит1, Реквизит2, Реквизит3); -КонецПроцедуры - -// Запись предупреждения в журнал регистрации. -Процедура ПредупреждениеПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт - Уровень = УровеньЖурналаРегистрации.Предупреждение; - ЗаписьЖурнала(Уровень, Вариант, Сообщение, Реквизит1, Реквизит2, Реквизит3); -КонецПроцедуры - -// Запись информации в журнал регистрации. -Процедура ИнформацияПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) - Уровень = УровеньЖурналаРегистрации.Информация; - ЗаписьЖурнала(Уровень, Вариант, Сообщение, Реквизит1, Реквизит2, Реквизит3); -КонецПроцедуры - -// Запись примечания в журнал регистрации. -Процедура ПримечаниеПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) - Уровень = УровеньЖурналаРегистрации.Примечание; - ЗаписьЖурнала(Уровень, Вариант, Сообщение, Реквизит1, Реквизит2, Реквизит3); -КонецПроцедуры - // Запись в журнал регистрации. -Процедура ЗаписьЖурнала(Уровень, Ссылка, Текст, Параметр1 = Неопределено, Параметр2 = Неопределено, Параметр3 = Неопределено) - Текст = СтрЗаменить(Текст, "%1", Параметр1); // Переход на СтрШаблон невозможен. - Текст = СтрЗаменить(Текст, "%2", Параметр2); - Текст = СтрЗаменить(Текст, "%3", Параметр3); - ЗаписьЖурналаРегистрации( - ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), - Уровень, - Метаданные.Справочники.ВариантыОтчетов, - Ссылка, - Текст); +Процедура ЗаписатьВЖурнал(Уровень, Сообщение, ВариантОтчета = Неопределено) Экспорт + Если ТипЗнч(ВариантОтчета) = Тип("ОбъектМетаданных") Тогда + ОбъектМетаданных = ВариантОтчета; + Данные = ОбъектМетаданных.Представление(); + Иначе + ОбъектМетаданных = Метаданные.Справочники.ВариантыОтчетов; + Данные = ВариантОтчета; + КонецЕсли; + ЗаписьЖурналаРегистрации(ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), + Уровень, ОбъектМетаданных, Данные, Сообщение); КонецПроцедуры -// Записывает в журнал регистрации событие запуска процедуры и открывает транзакцию. -Процедура ЗапускПроцедуры(ПредставлениеПроцедуры) - ИнформацияПоВарианту(Неопределено, НСтр("ru = 'Запуск процедуры ""%1"".'"), ПредставлениеПроцедуры); +// Записывает в журнал регистрации событие запуска процедуры. +Процедура ЗаписатьВЖурналЗапускПроцедуры(ИмяПроцедуры) + + ЗаписьЖурналаРегистрации(ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), + УровеньЖурналаРегистрации.Информация,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск процедуры ""%1"".'"), ИмяПроцедуры)); + КонецПроцедуры -// Записывает в журнал регистрации событие завершения процедуры и фиксирует транзакцию. -Процедура ЗавершениеПроцедуры(ПредставлениеПроцедуры, Изменено = Неопределено) +// Записывает в журнал регистрации событие завершения процедуры. +Процедура ЗаписатьВЖурналЗавершениеПроцедуры(ИмяПроцедуры, ИзмененоОбъектов = Неопределено) + Текст = НСтр("ru = 'Завершение процедуры ""%1"".'"); - Если Изменено <> Неопределено Тогда + Если ИзмененоОбъектов <> Неопределено Тогда Текст = Текст + " " + НСтр("ru = 'Изменено %2 объектов.'"); КонецЕсли; - ИнформацияПоВарианту(Неопределено, Текст, ПредставлениеПроцедуры, Изменено); + ЗаписьЖурналаРегистрации(ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), + УровеньЖурналаРегистрации.Информация,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск процедуры ""%1"".'"), ИмяПроцедуры, ИзмененоОбъектов)); // Не переводить на СтрШаблон. + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -3233,24 +3133,40 @@ Запрос.УстановитьПараметр("Подсистема", Подсистема); Запрос.Текст = ТекстЗапроса; - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект(); - - Найденные = ВариантОбъект.Размещение.НайтиСтроки(Новый Структура("Подсистема", Подсистема)); - Для Каждого СтрокаТаблицы Из Найденные Цикл - ВариантОбъект.Размещение.Удалить(СтрокаТаблицы); + ИзменяемыеВарианты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого СсылкаВарианта Из ИзменяемыеВарианты Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаВарианта); КонецЦикла; + Блокировка.Заблокировать(); - ВариантОбъект.Записать(); - КонецЦикла; + Для Каждого СсылкаВарианта Из ИзменяемыеВарианты Цикл + ВариантОбъект = СсылкаВарианта.ПолучитьОбъект(); + + Найденные = ВариантОбъект.Размещение.НайтиСтроки(Новый Структура("Подсистема", Подсистема)); + Для Каждого СтрокаТаблицы Из Найденные Цикл + ВариантОбъект.Размещение.Удалить(СтрокаТаблицы); + КонецЦикла; + + ВариантОбъект.Записать(); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. // [*] Актуализирует кэш метаданных конфигурации: справочник ПредопределенныеВариантыОтчетов -// и константу ПараметрыВариантовОтчетов. +// и параметры вариантов отчетов в регистре. Процедура ОперативноеОбновлениеОбщихДанныхКонфигурации(ПараметрыОбновления) Экспорт ОперативноеОбновлениеОбщихДанных("ОбщиеДанныеКонфигурации", ПараметрыОбновления.РазделенныеОбработчики); @@ -3264,13 +3180,6 @@ КонецПроцедуры -// Частичное индекса поиска предопределенных вариантов отчетов - только по изменениям в настройках вариантов. -Процедура ОтложенноеОбновлениеОбщихДанныхКонфигурацииИнкрементальное(Параметры = Неопределено) Экспорт - - ОтложенноеОбновлениеДанных("ОбщиеДанныеКонфигурации", Ложь); - -КонецПроцедуры - // Полное обновление индекса поиска предопределенных вариантов отчетов. Процедура ОтложенноеОбновлениеОбщихДанныхКонфигурацииПолное(Параметры = Неопределено) Экспорт @@ -3288,7 +3197,7 @@ // [2.1.1.1] Выполняет перенос данных справочника "Варианты отчетов" для редакции 2.1. Процедура ПерейтиКРедакции21() Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Перейти к редакции 2.1'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ @@ -3310,7 +3219,7 @@ // Проверить результат Если ТипЗнч(ОтчетИнформация.ТекстОшибки) = Тип("Строка") Тогда - ОшибкаПоВарианту(Выборка.Ссылка, ОтчетИнформация.ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ОтчетИнформация.ТекстОшибки, Выборка.Ссылка); Продолжить; КонецЕсли; @@ -3357,21 +3266,21 @@ ЗаписатьПредопределенный(ВариантОбъект); КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // [2.1.3.6] Заполняет ссылки предопределенных элементов справочника "Варианты отчетов". Процедура ЗаполнитьСсылкиПредопределенных() Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Заполнить ссылки предопределенных вариантов отчетов'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Составить таблицу замен старых ключей вариантов на актуальные. Изменения = ИзмененияКлючей(); // Получить ссылки вариантов отчетов для замены ключей, - // исключив из списка замен те варианты отчетов, - // актуальные ключи которых уже зарегистрированы, - // или старые ключи которых уже не заняты. + // исключив из списка замен те варианты отчетов, + // актуальные ключи которых уже зарегистрированы, + // или старые ключи которых уже не заняты. ТекстЗапроса = "ВЫБРАТЬ | Изменения.Отчет КАК Отчет, @@ -3388,8 +3297,8 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВариантыОтчетов.Ссылка КАК Ссылка, - | ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных) КАК Отчет, + | ВариантыОтчетов.Ссылка КАК ВариантОтчета, + | ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных) КАК ОтчетДляЗаменыКлючей, | ЕСТЬNULL(втИзменения.АктуальноеИмяВарианта, ВариантыОтчетов.КлючВарианта) КАК АктуальныйКлючВарианта |ПОМЕСТИТЬ втАктуальные |ИЗ @@ -3405,19 +3314,19 @@ | |ИНДЕКСИРОВАТЬ ПО | АктуальныйКлючВарианта, - | Ссылка + | ВариантОтчета |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | втАктуальные.Ссылка, + | втАктуальные.ВариантОтчета, | ПредопределенныеВариантыОтчетов.Наименование, | ПредопределенныеВариантыОтчетов.КлючВарианта, | ЕСТЬNULL(ПредопределенныеВариантыОтчетов.Ссылка, НЕОПРЕДЕЛЕНО) КАК ПредопределенныйВариант |ИЗ | втАктуальные КАК втАктуальные | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ПредопределенныеВариантыОтчетов - | ПО втАктуальные.Отчет = ПредопределенныеВариантыОтчетов.Отчет + | ПО втАктуальные.ОтчетДляЗаменыКлючей = ПредопределенныеВариантыОтчетов.Отчет | И втАктуальные.АктуальныйКлючВарианта = ПредопределенныеВариантыОтчетов.КлючВарианта"; Запрос = Новый Запрос; @@ -3445,14 +3354,14 @@ КонецЕсли; КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // [2.2.3.30] Уменьшает количество быстрых настроек в пользовательских вариантах отчетов до 2 шт. Процедура СократитьКоличествоБыстрыхНастроек(ВходящиеПараметры = Неопределено) Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Сокращение количества быстрых настроек в отчетах'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Чтение сведений от предыдущего запуска с ошибками. Параметры = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( @@ -3489,7 +3398,7 @@ ОтчетОбъект = ""; КонецЕсли; Иначе // Отчет не найден. - ОшибкаПоВарианту(СтрокаТаблицы.Ссылка, Подключение.ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, Подключение.ТекстОшибки, СтрокаТаблицы.Ссылка); ОтчетОбъект = ""; КонецЕсли; КэшОтчетов.Вставить(СтрокаТаблицы.Отчет, ОтчетОбъект); @@ -3508,10 +3417,11 @@ ТребуетсяЗапись = Ложь; КонецПопытки; Если ИнформацияОбОшибке <> Неопределено Тогда // Возникла проблема. - ТекстОшибки = НСтр("ru = 'Вариант ""%1"" отчета ""%2"":'") - + Символы.ПС + НСтр("ru = 'При уменьшении количества быстрых настроек пользовательского возникла ошибка:'") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вариант ""%1"" отчета ""%2"":'") + + Символы.ПС + НСтр("ru = 'При уменьшении количества быстрых настроек пользовательского возникла ошибка:'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), + ВариантОбъект.Ссылка, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки); ВариантыСОшибками.Добавить(ВариантОбъект.Ссылка); Ошибок = Ошибок + 1; КонецЕсли; @@ -3542,7 +3452,7 @@ ИмяПользователя()); КонецЕсли; - ЗавершениеПроцедуры(ПредставлениеПроцедуры, Записано); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры, Записано); Если Ошибок > 0 И НомерПопытки <= 30 Тогда // Следующий запуск должен состояться. @@ -3553,10 +3463,11 @@ КонецЕсли; КонецПроцедуры -// [2.3.2.32] Удаление устаревших отложенных разделенных обработчиков обновления. +// [2.4.1.1] Удаление устаревших отложенных разделенных обработчиков обновления. Процедура УдалитьУстаревшиеОбработчики(Параметры = Неопределено) Экспорт ОбновлениеИнформационнойБазы.УдалитьОтложенныйОбработчикИзОчереди("ВариантыОтчетов.ОтложенноеИнкрементальноеОбновлениеОбщихДанных"); + ОбновлениеИнформационнойБазы.УдалитьОтложенныйОбработчикИзОчереди("ВариантыОтчетов.ОтложенноеОбновлениеОбщихДанныхКонфигурацииИнкрементальное"); КонецПроцедуры @@ -3580,7 +3491,7 @@ Кэш.Вставить("ДеревоВариантов", ДеревоПредопределенных(?(Кэш.ОбновлятьКонфигурацию, "Внутренний", "Расширение"))); Кэш.Вставить("ОбновлятьЗамеры", Кэш.ОбновлятьКонфигурацию И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности")); Кэш.Вставить("ТаблицаЗамеров", ТаблицаЗамеров()); - Кэш.Вставить("МодельСервиса", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + Кэш.Вставить("МодельСервиса", ОбщегоНазначения.РазделениеВключено()); Кэш.Вставить("Уточнение", ?(Кэш.Режим = "ОбщиеДанныеКонфигурации", НСтр("ru = 'метаданные конфигурации'"), НСтр("ru = 'метаданные расширений'"))); // План обновления: @@ -3605,7 +3516,7 @@ КонецЕсли; //////////////////////////////////////////////////////////////////////////////// - // 5. Записать параметры в константу/регистр с хранилищем значения. + // 5. Записать параметры в регистр. ЗаписатьПараметрыВариантовОтчетов(Кэш); //////////////////////////////////////////////////////////////////////////////// @@ -3690,7 +3601,7 @@ КонецЕсли; ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление индекса поиска (%1)'"), Кэш.Уточнение); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); Запрос = Новый Запрос; @@ -3744,7 +3655,6 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - ПримечаниеПоВарианту(Выборка.Ссылка, НСтр("ru = 'Индексация схемы'")); ОтчетОбъект = КэшОтчетов.Получить(Выборка.Отчет); // Чтение кэша. Если ОтчетОбъект = "" Тогда @@ -3757,8 +3667,9 @@ ЗаполнитьЗначенияСвойств(Поиск, ВариантОбъект, "Отчет, КлючВарианта"); Найденные = ДеревоВариантов.Строки.НайтиСтроки(Поиск, Истина); Если Найденные.Количество() = 0 Тогда - ТекстОшибки = НСтр("ru = 'Вариант ""%1"" не найден для отчета ""%2""'"); - ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вариант ""%1"" не найден для отчета ""%2""'"), + ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ВариантОбъект.Ссылка); Продолжить; // Возникла проблема. КонецЕсли; @@ -3811,14 +3722,14 @@ ДеревоВариантов.Строки.Очистить(); КонецЕсли; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Замена старых ключей вариантов отчетов на актуальные. Процедура АктуализироватьКлючиПредопределенных(Кэш) ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление ключей вариантов отчетов (%1)'"), Кэш.Уточнение); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Составить таблицу замен старых ключей вариантов на актуальные. Изменения = ИзмененияКлючей(); @@ -3872,13 +3783,13 @@ ЗаписатьПредопределенный(ВариантОбъект); КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Актуализация предопределенных вариантов отчетов. Процедура ОбновитьНастройкиПредопределенных(Кэш) ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление настроек предопределенных (%1)'"), Кэш.Уточнение); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; @@ -3961,7 +3872,7 @@ КонецЦикла; КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Записывает настройки варианта в данные справочника. @@ -4078,7 +3989,7 @@ // Приводит разделенные данные в соответствие с неразделенными данными. Процедура АктуализироватьСоставОбласти(Кэш) ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление вариантов отчетов (%1)'"), Кэш.Уточнение); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); // Обновление сведений предопределенных вариантов. ТекстЗапроса = @@ -4285,7 +4196,7 @@ ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект); КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Обновляет предопределенные данные в разделенном режиме. @@ -4351,7 +4262,7 @@ // Установка пометки удаления вариантов удаленных отчетов. Процедура ПометитьНаУдалениеВариантыУдаленныхОтчетов(Кэш) ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удаление вариантов удаленных отчетов (%1)'"), Кэш.Уточнение); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); Запрос = Новый Запрос; ТекстЗапроса = // ОБЪЕДИНИТЬ ВСЕ используется вместо ИЛИ (требование стандартов). @@ -4411,7 +4322,7 @@ ЗаписатьПредопределенный(ВариантОбъект); КонецЦикла; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Перенос пользовательских настроек варианта из соответствующего хранилища. @@ -4438,11 +4349,10 @@ Исключение ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; - ОшибкаПоВарианту( - СтарыйВариант.Ссылка, + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, НСтр("ru = 'В процессе выборки вариантов отчетов из стандартного хранилища возникла ошибка:'") - + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + СтарыйВариант.Ссылка); КонецПопытки; Если ЭлементВыборкиПолучен = Ложь Тогда @@ -4614,9 +4524,9 @@ Возврат СписокОпераций; КонецФункции -// Запись константы ПараметрыВариантовОтчетов. +// Запись параметров вариантов отчетов в регистр. // -// Значение константы: +// Значение параметра: // ХранилищеЗначения (Структура) - Кэшируемые параметры: // * ТаблицаФункциональныхОпций - ТаблицаЗначений - Имена опций и предопределенных вариантов отчетов. // ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка отчета. @@ -4629,10 +4539,9 @@ Если Кэш.Режим = "ОбщиеДанныеРасширений" И Не ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда Возврат; // Обновление не требуется. КонецЕсли; - ПредставлениеПроцедуры = НСтр("ru = 'Запись неразделенного кэша в константу'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ПредставлениеПроцедуры = НСтр("ru = 'Запись неразделенного кэша в регистр'"); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); - // Перезапись константы только в случае если обработчик обновления был запущен "для записи" (в монопольном режиме). Кэш.ТаблицаФункциональныхОпций.Сортировать("Отчет, ПредопределенныйВариант, ИмяФункциональнойОпции"); Кэш.ОтчетыСНастройкамиСписок.СортироватьПоЗначению(); @@ -4640,20 +4549,18 @@ НовоеЗначение.Вставить("ТаблицаФункциональныхОпций", Кэш.ТаблицаФункциональныхОпций); НовоеЗначение.Вставить("ОтчетыСНастройками", Кэш.ОтчетыСНастройкамиСписок.ВыгрузитьЗначения()); + ПолноеИмяПодсистемы = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(); + Если Кэш.Режим = "ОбщиеДанныеКонфигурации" Тогда - СтароеЗначение = Константы.ПараметрыВариантовОтчетов.Получить().Получить(); + СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ПолноеИмяПодсистемы); Если ОбщегоНазначения.ЗначениеВСтрокуXML(НовоеЗначение) <> ОбщегоНазначения.ЗначениеВСтрокуXML(СтароеЗначение) Тогда - КонстантаОбъект = Константы.ПараметрыВариантовОтчетов.СоздатьМенеджерЗначения(); - КонстантаОбъект.Значение = Новый ХранилищеЗначения(НовоеЗначение, Новый СжатиеДанных(9)); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(КонстантаОбъект, Ложь, Ложь); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ПолноеИмяПодсистемы, НовоеЗначение); КонецЕсли; ИначеЕсли Кэш.Режим = "ОбщиеДанныеРасширений" Тогда - ПолноеИмяПодсистемы = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(); - ХранилищеЗначения = Новый ХранилищеЗначения(НовоеЗначение); - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы, ХранилищеЗначения); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы, НовоеЗначение); КонецЕсли; - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры // Запись регистра ПредопределенныеВариантыОтчетовВерсийРасширений. @@ -4673,7 +4580,7 @@ КонецЕсли; ПредставлениеПроцедуры = НСтр("ru = 'Запись регистра версий расширений'"); - ЗапускПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); Запрос = Новый Запрос; Запрос.Текст = @@ -4692,7 +4599,7 @@ Набор = РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений.Набор(Таблица, Измерения, Ресурсы, Истина); ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Истина); - ЗавершениеПроцедуры(ПредставлениеПроцедуры); + ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -4773,21 +4680,37 @@ // Работа с деревом подсистем из форм. // Добавляет элементы условного оформления дерева подсистем. -Процедура ДеревоПодсистемДобавитьУсловноеОформление(Форма) Экспорт +Процедура УстановитьУсловноеОформлениеДереваПодсистем(Форма) Экспорт + Форма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеВажный()); Форма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеСмТакже()); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "ДеревоПодсистем"; - Инструкция.Отборы.Вставить("ДеревоПодсистем.Приоритет", ""); - Инструкция.Оформление.Вставить("ТолькоПросмотр", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(Форма, Инструкция); + Элемент = Форма.УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Форма.Элементы.ДеревоПодсистем.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПодсистем.Приоритет"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = ""; + + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + + Элемент = Форма.УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Форма.Элементы.ДеревоПодсистемИспользование.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Форма.Элементы.ДеревоПодсистемВажность.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПодсистем.Приоритет"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = ""; + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Поля = "ДеревоПодсистемИспользование, ДеревоПодсистемВажность"; - Инструкция.Отборы.Вставить("ДеревоПодсистем.Приоритет", ""); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(Форма, Инструкция); КонецПроцедуры // Формирует дерево подсистем по данным варианта-основания. @@ -4864,27 +4787,12 @@ // Сохраняет настройки размещения, измененные пользователем в табличную часть варианта отчета. // // Параметры: -// Форма - УправляемаяФорма - Форма, в которой хранятся настройки размещения. // ВариантОбъект - СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура - Объект варианта отчета. -// Кэш - Структура - Необязательный. +// ИзмененныеПодсистемы - Массив - Массив из строк дерева значений, содержащий измененные настройки размещения. // -Процедура ДеревоПодсистемЗаписать(Форма, ВариантОбъект, Кэш = Неопределено) Экспорт - Если Кэш = Неопределено Тогда - Кэш = Новый Структура; - КонецЕсли; - Если Кэш.Свойство("ИзмененияПодсистем") Тогда - ИзмененияПодсистем = Кэш.ИзмененияПодсистем; - Иначе - ДеревоПриемник = Форма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); - Если ВариантОбъект.ЭтоНовый() Тогда - ИзмененияПодсистем = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Использование", 1), Истина); - Иначе - ИзмененияПодсистем = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("Модифицированность", Истина), Истина); - КонецЕсли; - Кэш.Вставить("ИзмененияПодсистем", ИзмененияПодсистем); - КонецЕсли; +Процедура ДеревоПодсистемЗаписать(ВариантОбъект, ИзмененныеПодсистемы) Экспорт - Для Каждого Подсистема Из ИзмененияПодсистем Цикл + Для Каждого Подсистема Из ИзмененныеПодсистемы Цикл СтрокаТабличнойЧасти = ВариантОбъект.Размещение.Найти(Подсистема.Ссылка, "Подсистема"); Если СтрокаТабличнойЧасти = Неопределено Тогда // Необходимо зарегистрировать настройку размещения варианта безусловно (даже флажок Использование отключен) @@ -4976,7 +4884,7 @@ ОтчетОбъект = Подключение.Объект; Иначе ОтчетОбъект = ""; - ОшибкаПоВарианту(ВариантОбъект.Ссылка, Подключение.ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, Подключение.ТекстОшибки, ВариантОбъект.Ссылка); КонецЕсли; ДополнительныеСвойства.Вставить("ОтчетОбъект", ОтчетОбъект); КонецЕсли; @@ -5007,13 +4915,10 @@ Если ЭтоПредопределенный Тогда ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Подробнее - см. процедуру ""НастроитьВариантыОтчетов"" модуля ""ВариантыОтчетовПереопределяемый"".'"); - Если ВариантОбъект.Размещение.Количество() > 0 Тогда - ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки); - Иначе - ИнформацияПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки); - КонецЕсли; + Уровень = ?(ВариантОбъект.Размещение.Количество() > 0, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); + ЗаписатьВЖурнал(Уровень, ТекстОшибки, ВариантОбъект.Ссылка); Иначе - ИнформацияПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Информация, ТекстОшибки, ВариантОбъект.Ссылка); КонецЕсли; Возврат ТребуетсяЗапись; // Возникла проблема. КонецЕсли; @@ -5032,22 +4937,31 @@ // Чтение настроек из данных варианта. Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") И ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ВариантыОтчетов") Тогда - НастройкиКД = ВариантОбъект.Настройки.Получить(); + Попытка + НастройкиКД = ВариантОбъект.Настройки.Получить(); + Исключение + ШаблонСообщения = НСтр("ru = 'Не удалось прочитать настройки пользовательского варианта отчета: + |%1'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстСообщения, ВариантОбъект.Ссылка); + Возврат ТребуетсяЗапись; // Возникла проблема. + КонецПопытки; КонецЕсли; // Последняя проверка. Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") Тогда Если ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетов") Или ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений") Тогда - Текст = НСтр("ru = 'Не удалось прочитать настройки предопределенного варианта отчета ""%1"".'"); - ОшибкаПоВарианту(ВариантОбъект.Ссылка, Текст, ВариантОбъект.КлючЗамеров); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать настройки предопределенного варианта отчета ""%1"".'"), ВариантОбъект.КлючЗамеров), + ВариантОбъект.Ссылка); КонецЕсли; Возврат ТребуетсяЗапись; // Возникла проблема. КонецЕсли; - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(ОбщегоНазначения.ЗначениеВСтрокуXML(НастройкиКД)); - ХешЭтихНастроек = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + ХешЭтихНастроек = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ОбщегоНазначения.ЗначениеВСтрокуXML(НастройкиКД)); Если ПроверятьХеш И ВариантОбъект.ХешНастроек = ХешЭтихНастроек Тогда Возврат ТребуетсяЗапись; // Настройки не изменились. КонецЕсли; @@ -5272,8 +5186,10 @@ // Чтение настроек из данных варианта. НастройкиКД = ВариантОбъект.Настройки.Получить(); Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") Тогда - ТекстОшибки = НСтр("ru = 'Обнаружены пустые настройки пользовательского варианта ""%1"" отчета ""%2"".'"); - ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обнаружены пустые настройки пользовательского варианта ""%1"" отчета ""%2"".'"), + ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ВариантОбъект.Ссылка); Возврат Ложь; // Возникла проблема. КонецЕсли; @@ -5321,19 +5237,26 @@ Функция НастройкиФормыОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект) Экспорт НастройкиОтчета = ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(); ОтчетыСНастройками = ВариантыОтчетовПовтИсп.Параметры().ОтчетыСНастройками; - Если ОтчетыСНастройками.Найти(ОтчетСсылка) <> Неопределено Тогда - Если ОтчетОбъект = Неопределено Тогда - Подключение = ПодключитьОтчетОбъект(ОтчетСсылка, Ложь); - Если Подключение.Успех Тогда - ОтчетОбъект = Подключение.Объект; - Иначе - Текст = НСтр("ru = 'Не удалось получить настройки отчета ""%1"":'") + Символы.ПС + Подключение.ТекстОшибки; - ИнформацияПоВарианту(ОтчетСсылка, Текст, ОтчетСсылка); - Возврат НастройкиОтчета; - КонецЕсли; - КонецЕсли; - ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета); + Если ОтчетыСНастройками.Найти(ОтчетСсылка) = Неопределено Тогда + Возврат НастройкиОтчета; КонецЕсли; + Если ОтчетОбъект = Неопределено Тогда + Подключение = ПодключитьОтчетОбъект(ОтчетСсылка, Ложь); + Если Подключение.Успех Тогда + ОтчетОбъект = Подключение.Объект; + Иначе + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить настройки отчета ""%1"":'") + Символы.ПС + Подключение.ТекстОшибки, + ОтчетСсылка); + ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Информация, Текст, ОтчетСсылка); + Возврат НастройкиОтчета; + КонецЕсли; + КонецЕсли; + ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета); + Если Не ГлобальныеНастройки().РазрешеноИзменятьВарианты Тогда + НастройкиОтчета.РазрешеноИзменятьВарианты = Ложь; + КонецЕсли; + Возврат НастройкиОтчета; КонецФункции @@ -5342,7 +5265,7 @@ // Можно ли индексировать содержимое схемы отчета. Функция РазрешеноИндексированиеНеразделенныхДанных() - Возврат Не ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Возврат Не ОбщегоНазначения.РазделениеВключено(); КонецФункции // Находит ссылки по параметрам поиска. @@ -5412,6 +5335,9 @@ ЕстьОтборПоПодсистемам = Ложь; КонецЕсли; + ЖесткийОтборПоПодсистемам = ЕстьОтборПоПодсистемам + И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыПоиска, "ЖесткийОтборПоПодсистемам", Истина); + Если ПараметрыПоиска.Свойство("ТипыОтчетов") И ЗначениеЗаполнено(ПараметрыПоиска.ТипыОтчетов) Тогда ЕстьОтборПоТипамОтчетов = Истина; Иначе @@ -5460,6 +5386,8 @@ Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь); Запрос.УстановитьПараметр("ОтчетыПользователя", ОтборПоОтчетам); Запрос.УстановитьПараметр("ОтключенныеВариантыПрограммы", ПараметрыПоиска.ОтключенныеВариантыПрограммы); + Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); + Запрос.УстановитьПараметр("ТипОтчетаРасширение", Перечисления.ТипыОтчетов.Расширение); Если ЕстьОтборПоПодсистемам Или ЕстьСтрокаПоиска Тогда ТекстЗапроса = @@ -5495,6 +5423,13 @@ | ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыРасширений.Описание) КАК СТРОКА(1000)) | ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000)) | КОНЕЦ КАК Описание, + | ВЫБОР + | КОГДА ВариантыОтчетов.Пользовательский + | ТОГДА ВариантыОтчетов.ИнтерактивнаяПометкаУдаления + | КОГДА ВариантыОтчетов.ТипОтчета = &ТипОтчетаРасширение + | ТОГДА ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL + | ИНАЧЕ ЕСТЬNULL(ВариантыКонфигурации.ПометкаУдаления, ВариантыОтчетов.ПометкаУдаления) + | КОНЕЦ КАК ПометкаУдаления, | ВариантыОтчетов.ВидимостьПоУмолчанию КАК ВидимостьПоУмолчанию |ПОМЕСТИТЬ Варианты |ИЗ @@ -5503,12 +5438,13 @@ | ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений | ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений + | ПО ВариантыОтчетов.ПредопределенныйВариант = ДоступныеВариантыРасширений.Вариант + | И (ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений) |ГДЕ | ВариантыОтчетов.ТипОтчета В(&ТипыОтчетов) | И ВариантыОтчетов.Отчет В(&ОтчетыПользователя) | И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) - | И ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ - | И НЕ ЕСТЬNULL(ВариантыКонфигурации.ПометкаУдаления, ЕСТЬNULL(ВариантыРасширений.ПометкаУдаления, ЛОЖЬ)) |; | |//////////////////////////////////////////////////////////////////////////////// @@ -5518,7 +5454,7 @@ | ЕСТЬNULL(РазмещениеВариантов.НаименованиеПодсистемы, РазмещениеПредопределенных.НаименованиеПодсистемы) КАК НаименованиеПодсистемы, | ЕСТЬNULL(РазмещениеВариантов.Использование, ИСТИНА) КАК Использование, | ВЫБОР - | КОГДА РазмещениеВариантов.Ссылка ЕСТЬ NULL + | КОГДА РазмещениеВариантов.Ссылка ЕСТЬ NULL | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ЭтоНастройкаРазработчика @@ -5536,7 +5472,8 @@ | ИЗ | Варианты КАК ВариантыОтчетов | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Размещение КАК ВариантыРазмещение - | ПО ВариантыОтчетов.Ссылка = ВариантыРазмещение.Ссылка + | ПО (ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ) + | И ВариантыОтчетов.Ссылка = ВариантыРазмещение.Ссылка | И (ВариантыРазмещение.Подсистема В (&МассивПодсистем))) КАК РазмещениеВариантов | ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ВариантыОтчетов.Ссылка КАК Ссылка, @@ -5550,6 +5487,7 @@ | Варианты КАК ВариантыОтчетов | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Размещение КАК РазмещениеКонфигурации | ПО (ВариантыОтчетов.Пользовательский = ЛОЖЬ) + | И (ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ) | И ВариантыОтчетов.ПредопределенныйВариант = РазмещениеКонфигурации.Ссылка | И (РазмещениеКонфигурации.Подсистема В (&МассивПодсистем)) | @@ -5591,6 +5529,7 @@ | ПО РазмещениеВсех.Ссылка = Варианты.Ссылка |ГДЕ | ЕСТЬNULL(ЛичныеНастройки.Видимость, Варианты.ВидимостьПоУмолчанию) + | И Варианты.ПометкаУдаления = ЛОЖЬ |; | |//////////////////////////////////////////////////////////////////////////////// @@ -5620,7 +5559,8 @@ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РазмещениеВидимых КАК Размещение | ПО ВариантыОтчетов.Ссылка = Размещение.Ссылка |ГДЕ - | &ПоискВариантовИПодсистем + | ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ + | И &ПоискВариантовИПодсистем | |ОБЪЕДИНИТЬ ВСЕ | @@ -5652,7 +5592,8 @@ |ГДЕ | Пользовательские.Пользователь = &ТекущийПользователь | И &ПоискПользовательскихНастроек - | И Пользовательские.ПометкаУдаления = ЛОЖЬ"; + | И Пользовательские.ПометкаУдаления = ЛОЖЬ + | И Варианты.ПометкаУдаления = ЛОЖЬ"; Если Не ПравоЧтенияАвторов Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.Автор КАК Автор", "НЕОПРЕДЕЛЕНО КАК Автор"); @@ -5694,7 +5635,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (РазмещениеРасширений.Подсистема В (&МассивПодсистем))", ""); КонецЕсли; - Если ЕстьСтрокаПоиска И Не ЕстьОтборПоПодсистемам Тогда + Если ЕстьСтрокаПоиска И Не ЖесткийОтборПоПодсистемам Тогда // Для поиска информация о размещении является дополнительной, а не ключевой. Если ЕстьОтборПоВидимости Тогда ТекстЗапроса = СтрЗаменить( @@ -5770,11 +5711,7 @@ Иначе // Удаление отбора для поиска в данных вариантов и подсистем. - ТекстЗапроса = СтрЗаменить( - ТекстЗапроса, - "ГДЕ - | &ПоискВариантовИПодсистем", - ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ПоискВариантовИПодсистем", ""); // Удаление таблицы для поиска среди пользовательских настроек. НачалоВыборкиИзТаблицы = ( "ОБЪЕДИНИТЬ ВСЕ @@ -5879,7 +5816,10 @@ | ВариантыОтчетов.ТипОтчета В(&ТипыОтчетов) | И ВариантыОтчетов.Отчет В(&ОтчетыПользователя) | И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) - | И ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ"; + | И НЕ(ВариантыОтчетов.Пользовательский + | И ВариантыОтчетов.ИнтерактивнаяПометкаУдаления) + | И НЕ(НЕ ВариантыОтчетов.Пользовательский + | И ВариантыОтчетов.ПометкаУдаления)"; Если ЕстьОтборПоТипамОтчетов Тогда Запрос.УстановитьПараметр("ТипыОтчетов", ПараметрыПоиска.ТипыОтчетов); @@ -5896,8 +5836,16 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ПометкаУдаления = ЛОЖЬ", ".ПометкаУдаления = ИСТИНА"); КонецЕсли; Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, " - | И ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ", ""); + ТекстЗапроса = СтрЗаменить( + ТекстЗапроса, + "ВЫБОР + | КОГДА ВариантыОтчетов.Пользовательский + | ТОГДА ВариантыОтчетов.ИнтерактивнаяПометкаУдаления + | КОГДА ВариантыОтчетов.ТипОтчета = &ТипОтчетаРасширение + | ТОГДА ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL + | ИНАЧЕ ЕСТЬNULL(ВариантыКонфигурации.ПометкаУдаления, ВариантыОтчетов.ПометкаУдаления) + | КОНЕЦ КАК ПометкаУдаления", + "ЛОЖЬ КАК ПометкаУдаления"); КонецЕсли; КонецЕсли; @@ -6251,25 +6199,25 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Прочее. +// Подменю "Отчеты". -// Возвращает строку ключа настроек, не превышающую допустимую длину. -// Если строка превышает допустимую длину, то лишние символы справа вырезаются -// и вместо них вставляется MD5 хеш-сумма строки. -// -// Параметры: -// Строка - Строка - Строковый идентификатор произвольной длины. -// ДопустимаяДлина - Число - Максимальная длина строки. -// -Функция СтрХеш(Знач Строка, ДопустимаяДлина) - Если СтрДлина(Строка) <= ДопустимаяДлина Тогда - Возврат Строка; - Иначе - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Строка); - Возврат Лев(Строка, ДопустимаяДлина-32) + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - КонецЕсли; -КонецФункции +// Вызывается из ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриДобавленииКомандОтчетов(Команды, СведенияОбОбъекте, НастройкиФормы) + СведенияОбОбъекте.Менеджер.ДобавитьКомандыОтчетов(Команды, НастройкиФормы); + ДобавленныеКоманды = Команды.НайтиСтроки(Новый Структура("Обработана", Ложь)); + Для Каждого Команда Из ДобавленныеКоманды Цикл + Если Не ЗначениеЗаполнено(Команда.Менеджер) Тогда + Команда.Менеджер = СведенияОбОбъекте.ПолноеИмя; + КонецЕсли; + Если Не ЗначениеЗаполнено(Команда.ТипПараметра) Тогда + Команда.ТипПараметра = СведенияОбОбъекте.ТипСсылкиДанных; + КонецЕсли; + Команда.Обработана = Истина; + КонецЦикла; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Прочее. // Добавляет элемент в массив с контролем уникальности. Процедура ДобавитьВМассив(Массив, Значение) @@ -6278,57 +6226,107 @@ КонецЕсли; КонецПроцедуры -// Возвращает значения реквизитов, прочитанные из информационной базы -// для нескольких объектов. -// -// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// МассивСсылок - массив ссылок на объекты одного типа. -// ВАЖНО! значения массива должны быть ссылками на -// объекты одного типа! -// ИменаРеквизитов - Строка, имена реквизитов перечисленные через запятую, -// в формате требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". -// -// Возвращаемое значение: -// Соответствие - где ключ - ссылка на объект, а Значение - структура, которая -// содержит список свойств, как список имен в строке. -// ИменаРеквизитов, со значениям реквизитов, прочитанными из информационной базы. -// -Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов, УчитыватьПрава = Неопределено) - - ЗначенияРеквизитов = Новый Соответствие; - Если МассивСсылок.Количество() = 0 Тогда - Возврат ЗначенияРеквизитов; - КонецЕсли; - Если УчитыватьПрава = Неопределено Тогда - УчитыватьПрава = Не ПривилегированныйРежим(); - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ" + ?(УчитыватьПрава, " РАЗРЕШЕННЫЕ", "") + " - | Ссылка КАК Ссылка, " + ИменаРеквизитов + " - |ИЗ - | " + МассивСсылок[0].Метаданные().ПолноеИмя() + " КАК Таблица - |ГДЕ - | Таблица.Ссылка В (&МассивСсылок)"; - Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - Результат = Новый Структура(ИменаРеквизитов); - ЗаполнитьЗначенияСвойств(Результат, Выборка); - ЗначенияРеквизитов[Выборка.Ссылка] = Результат; +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные для служебного программного интерфейса + +// Обработчик определения доступности отчетов конфигурации и расширений. +Процедура ПриОпределенииДоступностиОтчетов(СсылкиОтчетов, Результат) + ИменаОтчетов = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(СсылкиОтчетов, "Имя", Истина); + Для Каждого Отчет Из СсылкиОтчетов Цикл + ИмяОтчета = ИменаОтчетов[Отчет]; + ДоступенПоRLS = Истина; + ДоступенПоПравам = Истина; + ДоступенПоОпциям = Истина; + НайденВПрограмме = Истина; + Если ИмяОтчета = Неопределено Тогда + ДоступенПоRLS = Ложь; + Иначе + ОтчетМетаданные = Метаданные.Отчеты.Найти(ИмяОтчета); + Если ОтчетМетаданные = Неопределено Тогда + НайденВПрограмме = Ложь; + ИначеЕсли Не ПравоДоступа("Просмотр", ОтчетМетаданные) Тогда + ДоступенПоПравам = Ложь; + ИначеЕсли Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОтчетМетаданные) Тогда + ДоступенПоОпциям = Ложь; + КонецЕсли; + КонецЕсли; + Найденные = Результат.НайтиСтроки(Новый Структура("Отчет", Отчет)); + Для Каждого СтрокаТаблицы Из Найденные Цикл + Если Не ДоступенПоRLS Тогда + СтрокаТаблицы.Представление = НСтр("ru = '<Недостаточно прав для работы с вариантом отчета>'"); + ИначеЕсли Не НайденВПрограмме Тогда + СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '<Отчет ""%1"" не найден в программе>'"), + ИмяОтчета); + ИначеЕсли Не ДоступенПоПравам Тогда + СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '<Недостаточно прав для работы с отчетом ""%1"">'"), + ИмяОтчета); + ИначеЕсли Не ДоступенПоОпциям Тогда + СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '<Отчет ""%1"" отключен в настройках программы>'"), + ИмяОтчета); + Иначе + СтрокаТаблицы.Доступен = Истина; + КонецЕсли; + КонецЦикла; КонецЦикла; - - Возврат ЗначенияРеквизитов; - +КонецПроцедуры + +// Определяет способ подключения общей формы отчета. +Функция ПоУмолчаниюВсеПодключеныКОсновнойФорме() + ФормаМетаданные = Метаданные.ОсновнаяФормаОтчета; + Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета); КонецФункции +// Определяет способ подключения общей формы настроек отчета. +Функция ПоУмолчаниюВсеПодключеныКФормеНастроек() + ФормаМетаданные = Метаданные.ОсновнаяФормаНастроекОтчета; + Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета); +КонецФункции + +// Определяет способ подключения хранилища вариантов отчетов. +Функция ПоУмолчаниюВсеПодключеныКХранилищу() + Возврат (Метаданные.ХранилищеВариантовОтчетов <> Неопределено И Метаданные.ХранилищеВариантовОтчетов.Имя = "ХранилищеВариантовОтчетов"); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Отборы. + +// Устанавливает отборы по расширенной информации из структуры. +Процедура ДополнитьОтборыИзСтруктуры(Отбор, Структура, РежимОтображения = Неопределено) Экспорт + Если РежимОтображения = Неопределено Тогда + РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + КонецЕсли; + Для Каждого КлючИЗначение Из Структура Цикл + ИмяПоля = КлючИЗначение.Ключ; + ОтборПоля = КлючИЗначение.Значение; + Тип = ТипЗнч(ОтборПоля); + Если Тип = Тип("Структура") Тогда + Условие = ВидСравненияКомпоновкиДанных[ОтборПоля.Вид]; + Значение = ОтборПоля.Значение; + ИначеЕсли Тип = Тип("Массив") Тогда + Условие = ВидСравненияКомпоновкиДанных.ВСписке; + Значение = ОтборПоля; + ИначеЕсли Тип = Тип("СписокЗначений") Тогда + Условие = ВидСравненияКомпоновкиДанных.ВСписке; + Значение = ОтборПоля.ВыгрузитьЗначения(); + ИначеЕсли Тип = Тип("ВидСравненияКомпоновкиДанных") Тогда + Условие = ОтборПоля; + Значение = Неопределено; + Иначе + Условие = ВидСравненияКомпоновкиДанных.Равно; + Значение = ОтборПоля; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Отбор, + ИмяПоля, + Значение, + Условие, + , + Истина, + РежимОтображения); + КонецЦикла; +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl index ebaab6228..f259d8bf9 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl @@ -1,20 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (вызов сервера). -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции -// Открывает форму дополнительного отчета с заданным вариантом. -// -// Параметры: -// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка дополнительного отчета. -// КлючВарианта - Строка - Имя варианта дополнительного отчета. -// -Функция ПараметрыОткрытия(ВариантСсылка) Экспорт - Возврат ВариантыОтчетов.ПараметрыОткрытия(ВариантСсылка); -КонецФункции - // Открывает форму дополнительного отчета с заданным вариантом. // // Параметры: @@ -59,5 +44,9 @@ Возврат Выборка.Тип; КонецФункции -#КонецОбласти +// См. ОтчетыСервер.ПараметрыВыбораТипа. +Функция ПараметрыВыбораТипа(Знач Тип, Знач ПараметрыНастройки) Экспорт + Возврат ОтчетыСервер.ПараметрыВыбораТипа(Тип, ПараметрыНастройки); +КонецФункции +#КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl index 9bdfee0a7..8f342304b 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl @@ -1,142 +1,26 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (клиент). -// -// Выполняется на клиенте. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Открывает панель отчетов. Используется в модуле общей команды. +// Открывает форму указанного отчета. // // Параметры: -// ПутьКПодсистеме - Строка - Имя раздела или путь к подсистеме, для которой открывается панель отчетов. -// Задается в формате: "ИмяРаздела[.ИмяВложеннойПодсистемы1][.ИмяВложеннойПодсистемы2][...]". -// NB! Раздел должен быть описан в ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов. -// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды - Передается "как есть" из параметров обработчика команды. -// -Процедура ПоказатьПанельОтчетов(ПутьКПодсистеме, ПараметрыВыполненияКоманды, Удалить_Заголовок = "") Экспорт - ФормаПараметры = Новый Структура("ПутьКПодсистеме", ПутьКПодсистеме); - - ФормаОкно = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.Окно); - ФормаСсылка = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.НавигационнаяСсылка); - - ПараметрыКлиента = ПараметрыКлиента(); - Если ПараметрыКлиента.ВыполнятьЗамеры Тогда - МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); - ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.НачатьЗамерВремени( - Ложь, - "ПанельОтчетов.Открытие"); - МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, ПараметрыКлиента.ПрефиксЗамеров + "; " + ПутьКПодсистеме); - КонецЕсли; - - ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, , ПутьКПодсистеме, ФормаОкно, ФормаСсылка); - - Если ПараметрыКлиента.ВыполнятьЗамеры Тогда - МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); - КонецЕсли; -КонецПроцедуры - -// Открывает диалог настройки размещения нескольких вариантов в разделах. -// Проверки рекомендуется осуществлять до вызова. -// -// Параметры: -// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. -// ДополнительныеПараметры (*) Необязательный. -// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования окна владельца. -// -Процедура ОткрытьДиалогРазмещенияВариантовВРазделах(МассивВариантов, ДополнительныеПараметры = Неопределено, Владелец = Неопределено) Экспорт - - Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, которые необходимо разместить в разделах.'")); - Возврат; - КонецЕсли; - - ПараметрыОткрытия = Новый Структура("МассивВариантов, ДополнительныеПараметры", МассивВариантов, ДополнительныеПараметры); - ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.РазмещениеВРазделах", ПараметрыОткрытия, Владелец); - -КонецПроцедуры - -// Открывает диалог диалог сброса пользовательских настроек выбранных вариантов отчетов. -// Проверки рекомендуется осуществлять до вызова. -// -// Параметры: -// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. -// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования окна владельца. -// -Процедура ОткрытьДиалогСбросаНастроекПользователей(МассивВариантов, Владелец = Неопределено) Экспорт - - Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, для которых необходимо сбросить пользовательские настройки.'")); - Возврат; - КонецЕсли; - - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("МассивВариантов", МассивВариантов); - ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросПользовательскихНастроек", ПараметрыОткрытия, Владелец); - -КонецПроцедуры - -// Открывает диалог диалог сброса настроек размещения выбранных вариантов отчетов программы. -// Проверки рекомендуется осуществлять до вызова. -// -// Параметры: -// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. -// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования окна владельца. -// -Процедура ОткрытьДиалогСбросаНастроекРазмещения(МассивВариантов, Владелец = Неопределено) Экспорт - - Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов программы, для которых необходимо сбросить настройки размещения.'")); - Возврат; - КонецЕсли; - - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("МассивВариантов", МассивВариантов); - ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросНастроекРазмещения", ПараметрыОткрытия, Владелец); - -КонецПроцедуры - -// Оповещает открытые панели отчетов, формы списков и элементов о изменениях. -// -// Параметры: -// Параметр - Произвольный - Необязательный. Могут быть переданы любые необходимые данные. -// Источник - Произвольный - Необязательный. Источник события. Например, можно передать другую форму. -// -Процедура ОбновитьОткрытыеФормы(Параметр = Неопределено, Источник = Неопределено) Экспорт - - Оповестить(ВариантыОтчетовКлиентСервер.ИмяСобытияИзменениеВарианта(), Параметр, Источник); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Открывает форму отчета. -// -// Параметры: -// ФормаВладелец - УправляемаяФорма, Неопределено - Форма, из которой открывается отчет. -// Вариант - Структура, Коллекция - Параметры формы. -// * Ссылка - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. -// * ТипОтчета - Строка, ПеречислениеСсылка.ТипыОтчетов - "Внутренний" или "Дополнительный". -// * ИмяОтчета - Строка - Имя отчета как оно задано в метаданных. -// * КлючВарианта - Строка - Имя варианта отчета как оно задано в СКД отчета. -// * Отчет - Произвольный - Ссылка отчета. Для внутренних отчетов можно не указывать. -// * ВыполнятьЗамеры - Булево - Необязательный. Истина если необходимо замерять время открытия. -// * ИмяОперации - Строка - Необязательный. Имя ключевой операции для замеров времени открытия. -// ДополнительныеПараметры - Структура, Неопределено - Дополнение к стандартным параметрам открытия формы отчета. -// -// Вспомогательные методы: -// ВариантыОтчетов.ПараметрыОткрытия(ВариантСсылка) подготавливает параметры открытия -// на основании ссылки варианта отчета. +// ФормаВладелец - УправляемаяФорма, Неопределено - форма, из которой открывается отчет. +// Вариант - СправочникСсылка.ВариантыОтчетов, СправочникСсылка.ДополнительныеОтчетыИОбработки - вариант +// отчета, форму которого требуется открыть. Если передан тип СправочникСсылка.ДополнительныеОтчетыИОбработки, +// то открывается дополнительный отчет, подключенный к программе. +// ДополнительныеПараметры - Структура - служебный параметр, не предназначен для использования. // Процедура ОткрытьФормуОтчета(Знач ФормаВладелец, Знач Вариант, Знач ДополнительныеПараметры = Неопределено) Экспорт Тип = ТипЗнч(Вариант); Если Тип = Тип("Структура") Тогда ПараметрыОткрытия = Вариант; - ИначеЕсли Тип = Тип("СправочникСсылка.ВариантыОтчетов") + ИначеЕсли Тип = Тип("СправочникСсылка.ВариантыОтчетов") Или Тип = ВариантыОтчетовКлиентСервер.ТипСсылкиДополнительногоОтчета() Тогда - ПараметрыОткрытия = ВариантыОтчетовВызовСервера.ПараметрыОткрытия(Вариант); + ПараметрыОткрытия = Новый Структура("Ключ", Вариант); + Если ДополнительныеПараметры <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыОткрытия, ДополнительныеПараметры, Истина); + КонецЕсли; + ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаОбъекта", ПараметрыОткрытия, Неопределено, Истина); + Возврат; Иначе ПараметрыОткрытия = Новый Структура("Ссылка, Отчет, ТипОтчета, ИмяОтчета, КлючВарианта, КлючЗамеров"); Если ТипЗнч(ФормаВладелец) = Тип("УправляемаяФорма") Тогда @@ -186,12 +70,9 @@ ПолноеИмяОтчета = Вид + "." + ПараметрыОткрытия.ИмяОтчета; - Уникальность = ПолноеИмяОтчета; - Если ЗначениеЗаполнено(ПараметрыОткрытия.КлючВарианта) Тогда - Уникальность = Уникальность + "/КлючВарианта." + ПараметрыОткрытия.КлючВарианта; - КонецЕсли; - ПараметрыОткрытия.Вставить("КлючПараметровПечати", Уникальность); - ПараметрыОткрытия.Вставить("КлючСохраненияПоложенияОкна", Уникальность); + КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(ПолноеИмяОтчета, ПараметрыОткрытия.КлючВарианта); + ПараметрыОткрытия.Вставить("КлючПараметровПечати", КлючУникальности); + ПараметрыОткрытия.Вставить("КлючСохраненияПоложенияОкна", КлючУникальности); Если ПараметрыОткрытия.ВыполнятьЗамеры Тогда ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ПараметрыОткрытия, "КомментарийОперации"); @@ -209,15 +90,117 @@ КонецЕсли; КонецПроцедуры +// Открывает панель отчетов. Для использования из модулей общих команд. +// +// Параметры: +// ПутьКПодсистеме - Строка - Имя раздела или путь к подсистеме, для которой открывается панель отчетов. +// Задается в формате: "ИмяРаздела[.ИмяВложеннойПодсистемы1][.ИмяВложеннойПодсистемы2][...]". +// Раздел должен быть описан в ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов. +// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды - параметры обработчика общей команды. +// +Процедура ПоказатьПанельОтчетов(ПутьКПодсистеме, ПараметрыВыполненияКоманды) Экспорт + ФормаПараметры = Новый Структура("ПутьКПодсистеме", ПутьКПодсистеме); + + ФормаОкно = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.Окно); + ФормаСсылка = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.НавигационнаяСсылка); + + ПараметрыКлиента = ПараметрыКлиента(); + Если ПараметрыКлиента.ВыполнятьЗамеры Тогда + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.НачатьЗамерВремени( + Ложь, + "ПанельОтчетов.Открытие"); + МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, ПараметрыКлиента.ПрефиксЗамеров + "; " + ПутьКПодсистеме); + КонецЕсли; + + ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, , ПутьКПодсистеме, ФормаОкно, ФормаСсылка); + + Если ПараметрыКлиента.ВыполнятьЗамеры Тогда + МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); + КонецЕсли; +КонецПроцедуры + +// Открывает диалог настройки размещения нескольких вариантов в разделах. +// +// Параметры: +// Варианты - Массив - перемещаемые варианты отчетов (СправочникСсылка.ВариантыОтчетов). +// Владелец - УправляемаяФорма - для блокирования окна владельца. +// +Процедура ОткрытьДиалогРазмещенияВариантовВРазделах(Варианты, Владелец = Неопределено) Экспорт + + Если ТипЗнч(Варианты) <> Тип("Массив") Или Варианты.Количество() < 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, которые необходимо разместить в разделах.'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура("Варианты", Варианты); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.РазмещениеВРазделах", ПараметрыОткрытия, Владелец); + +КонецПроцедуры + +// Открывает диалог диалог сброса пользовательских настроек выбранных вариантов отчетов. +// +// Параметры: +// Варианты - Массив - обрабатываемые варианты отчетов (СправочникСсылка.ВариантыОтчетов). +// Владелец - УправляемаяФорма - для блокирования окна владельца. +// +Процедура ОткрытьДиалогСбросаНастроекПользователей(Варианты, Владелец = Неопределено) Экспорт + + Если ТипЗнч(Варианты) <> Тип("Массив") Или Варианты.Количество() < 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, для которых необходимо сбросить пользовательские настройки.'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("Варианты", Варианты); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросПользовательскихНастроек", ПараметрыОткрытия, Владелец); + +КонецПроцедуры + +// Открывает диалог диалог сброса настроек размещения выбранных вариантов отчетов программы. +// +// Параметры: +// Варианты - Массив - обрабатываемые варианты отчетов (СправочникСсылка.ВариантыОтчетов). +// Владелец - УправляемаяФорма - для блокирования окна владельца. +// +Процедура ОткрытьДиалогСбросаНастроекРазмещения(Варианты, Владелец = Неопределено) Экспорт + + Если ТипЗнч(Варианты) <> Тип("Массив") ИЛИ Варианты.Количество() < 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов программы, для которых необходимо сбросить настройки размещения.'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("Варианты", Варианты); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросНастроекРазмещения", ПараметрыОткрытия, Владелец); + +КонецПроцедуры + +// Оповещает открытые панели отчетов, формы списков и элементов о изменениях. +// +// Параметры: +// Параметр - Произвольный - могут быть переданы любые необходимые данные. +// Источник - Произвольный - источник события. Например, можно передать другую форму. +// +Процедура ОбновитьОткрытыеФормы(Параметр = Неопределено, Источник = Неопределено) Экспорт + + Оповестить(ВариантыОтчетовКлиентСервер.ИмяСобытияИзменениеВарианта(), Параметр, Источник); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + // Открывает карточку варианта отчета с настройками размещения в программе. // // Параметры: -// ВариантСсылка - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. +// Вариант - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. // -Процедура ПоказатьНастройкиОтчета(ВариантСсылка) Экспорт +Процедура ПоказатьНастройкиОтчета(Вариант) Экспорт ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПоказатьКарточку", Истина); - ПараметрыФормы.Вставить("Ключ", ВариантСсылка); + ПараметрыФормы.Вставить("Ключ", Вариант); ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаОбъекта", ПараметрыФормы); КонецПроцедуры @@ -324,7 +307,7 @@ Функция ПараметрыКлиента() Возврат ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(), + СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(), "ВариантыОтчетов"); КонецФункции diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl index 8be740fa6..14caba123 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl @@ -1,12 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (клиент, сервер). -// -// Выполняется на клиенте и на сервере. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Идентификатор, который используется для начальной страницы в модуле ВариантыОтчетовПереопределяемый. +// +// Возвращаемое значение: +// Строка - Идентификатор, который используется для начальной страницы в модуле ВариантыОтчетовПереопределяемый. +// Функция ИдентификаторНачальнойСтраницы() Экспорт Возврат "Подсистемы"; @@ -181,77 +179,4 @@ Возврат Неопределено; КонецФункции -// Возвращает текст ошибки по ее числовому номеру. -Функция ТекстОшибки(Номер, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт - Если Номер = 1 Или Номер = 2 Тогда - Если Номер = 1 Тогда - ТекстОшибки = НСтр("ru = 'Отчет ""%1"" подключен к основной форме, но не подключен к форме настроек.'"); - Иначе - ТекстОшибки = НСтр("ru = 'Отчет ""%1"" не подключен к основной форме, но подключен к форме настроек.'"); - КонецЕсли; - ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Подробнее см. в документации по внедрению подсистемы.'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Реквизит1); - КонецЕсли; - Возврат ТекстОшибки; -КонецФункции - -// Возвращает индекс пиктограммы в зависимости от переданного типа и модификаторов. -Функция ИндексПиктограммыНастроекОтчета(ИмяТипа, Предопределенный = Ложь, ПометкаУдаления = Ложь) Экспорт - Если ИмяТипа = "Папка" Тогда - Возврат ?(Предопределенный, 3, ?(ПометкаУдаления, 2, 1)); - ИначеЕсли ИмяТипа = "Элемент" Тогда - Возврат ?(Предопределенный, 6, ?(ПометкаУдаления, 5, 4)); - ИначеЕсли ИмяТипа = "Группировка" - Или ИмяТипа = "ГруппировкаТаблицы" - Или ИмяТипа = "ГруппировкаДиаграммы" Тогда - Возврат ?(Предопределенный, 9, ?(ПометкаУдаления, 8, 7)); - ИначеЕсли ИмяТипа = "Таблица" Тогда - Возврат 10; - ИначеЕсли ИмяТипа = "Отчеты" - Или ИмяТипа = "НастройкиВложенногоОбъекта" Тогда - Возврат 11; - ИначеЕсли ИмяТипа = "ПолеВвода" Тогда - Возврат 12; - ИначеЕсли ИмяТипа = "Отборы" - Или ИмяТипа = "Отбор" Тогда - Возврат 13; - ИначеЕсли ИмяТипа = "ВыбранныеПоля" Тогда - Возврат 14; - ИначеЕсли ИмяТипа = "Сортировки" Тогда - Возврат 15; - ИначеЕсли ИмяТипа = "Оформление" - Или ИмяТипа = "УсловноеОформление" Тогда - Возврат 16; - ИначеЕсли ИмяТипа = "Настройки" Тогда - Возврат 17; - ИначеЕсли ИмяТипа = "Структура" Тогда - Возврат 18; - ИначеЕсли ИмяТипа = "Выражение" Тогда - Возврат 19; - ИначеЕсли ИмяТипа = "Ресурс" Тогда - Возврат 20; - ИначеЕсли ИмяТипа = "ТабличнаяЧасть" Тогда - Возврат 21; - ИначеЕсли ИмяТипа = "" Тогда - Возврат 0; - Иначе - Возврат -1; - КонецЕсли; -КонецФункции - -// Формирует строковое представление структуры. -// Полученное представление поддается обратному преобразованию -// при условии отсутствия указанных разделителей в представлениях ключей и значений структуры. -// -Функция СтруктураВСтроку(Структура, РазделительКлючаИЗначения = "=", РазделительЭлементов = ";") Экспорт - Результат = ""; - Для Каждого КлючИЗначение Из Структура Цикл - Результат = Результат + ?(Результат = "", "", РазделительЭлементов) - + КлючИЗначение.Ключ - + РазделительКлючаИЗначения - + КлючИЗначение.Значение; - КонецЦикла; - Возврат Результат; -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl index 334688b0a..457622ab8 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl @@ -1,31 +1,60 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (сервер, переопределяемый). -// -// Выполняется на сервере, изменяется под специфику прикладной конфигурации, -// но предназначен для использования только данной подсистемой. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Настройки подсистемы - -// Определяет разделы, в которых доступна панель отчетов. +// Задает настройки, применяемые как умолчания для объектов подсистемы. // // Параметры: -// Разделы - СписокЗначений - Разделы в которые выведена команды открытия панели отчетов. -// * Значение - ОбъектМетаданных: Подсистема - Метаданные подсистемы. -// - Строка - Используется для панели отчетов начальной страницы. -// В качестве раздела можно указать ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(). -// * Представление - Строка - Заголовок панели отчетов этого раздела. +// Настройки - Структура - Коллекция настроек подсистемы. Реквизиты: +// * ВыводитьОтчетыВместоВариантов - Булево - Умолчание для вывода гиперссылок в панели отчетов: +// Истина - Варианты отчетов по умолчанию скрыты, а отчеты включены и видимы. +// Ложь - Варианты отчетов по умолчанию видимы, а отчеты отключены. +// Значение по умолчанию: Ложь. +// * ВыводитьОписания - Булево - Умолчание для вывода описаний в панели отчетов: +// Истина - Значение по умолчанию. Выводить описания в виде подписей под гиперссылками вариантов +// Ложь - Выводить описания в виде всплывающих подсказок +// Значение по умолчанию: Истина. +// * Поиск - Структура - Настройки поиска вариантов отчетов. +// ** ПодсказкаВвода - Строка - Текст подсказки выводится в поле поиска когда поиск не задан. +// В качестве примера рекомендуется указывать часто используемые термины прикладной конфигурации. +// * ДругиеОтчеты - Структура - Настройки формы "Другие отчеты": +// ** ЗакрыватьПослеВыбора - Булево - Закрывать ли форму после выбора гиперссылки отчета. +// Истина - Закрывать "Другие отчеты" после выбора. +// Ложь - Не закрывать. +// Значение по умолчанию: Истина. +// ** ПоказыватьФлажок - Булево - Показывать ли флажок ЗакрыватьПослеВыбора. +// Истина - Показывать флажок "Закрывать это окно после перехода к другому отчету". +// Ложь - Не показывать флажок. +// Значение по умолчанию: Ложь. +// * РазрешеноИзменятьВарианты - Булево - Показывать расширенные настройки отчета +// и команды изменения варианта отчета. // -// Описание: -// В Разделы необходимо добавить метаданные тех подсистем 1го уровня, -// в которых размещены команды вызова панелей отчетов. +// Пример: +// Настройки.Поиск.ПодсказкаВвода = НСтр("ru = 'Например, себестоимость'"); +// Настройки.ДругиеОтчеты.ЗакрыватьПослеВыбора = Ложь; +// Настройки.ДругиеОтчеты.ПоказыватьФлажок = Истина; +// Настройки.РазрешеноИзменятьВарианты = Ложь; // -// Например: -// Разделы.Добавить(Метаданные.Подсистемы.ИмяПодсистемы, <ЗаголовокПанелиОтчетов>); -// Разделы.Добавить(ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(), <ЗаголовокПанелиОтчетовНачальнойСтраницы>); +Процедура ПриОпределенииНастроек(Настройки) Экспорт + + + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Настройки размещения отчетов + +// Определяет разделы глобального командного интерфейса, в которых предусмотрены панели отчетов. +// В Разделы необходимо добавить метаданные тех подсистем первого уровня, +// в которых размещены команды вызова панелей отчетов. +// +// Параметры: +// Разделы - СписокЗначений - разделы, в которые выведены команды открытия панели отчетов. +// * Значение - ОбъектМетаданных: Подсистема, Строка - подсистема раздела глобального командного интерфейса, +// либо ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы для начальной страницы. +// * Представление - Строка - заголовок панели отчетов в этом разделе. +// +// Пример: +// Разделы.Добавить(Метаданные.Подсистемы.Анкетирование, НСтр("ru = 'Отчеты по анкетированию'")); +// Разделы.Добавить(ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(), НСтр("ru = 'Основные отчеты'")); // Процедура ОпределитьРазделыСВариантамиОтчетов(Разделы) Экспорт @@ -33,157 +62,11 @@ КонецПроцедуры -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Используется для описания настроек отчетов и вариантов -// см. описание к ВариантыОтчетов.ДеревоПредопределенных(). -// -// Описание: -// В данной процедуре необходимо указать каким именно образом предопределенные варианты отчетов -// будут регистрироваться в программе и показываться в панели отчетов. -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// -// Свойства для изменения: -// * Включен - Булево - -// Если Ложь, то вариант отчета не регистрируется в подсистеме. -// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. -// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи -// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). -// * ВидимостьПоУмолчанию - Булево - -// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// Пользователь может "включить" его в режиме настройки панели отчетов -// или открыть через форму "Все отчеты". -// * Описание - Строка - Дополнительная информация по варианту отчета. -// В панелях отчетов выводится в виде подсказки. -// Должно расшифровывать для пользователя содержимое варианта отчета -// и не должно дублировать наименование варианта отчета. -// Используется при поиске. -// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. -// ** Ключ - ОбъектМетаданных: Подсистема - Подсистема, в которой размещается отчет или вариант отчета. -// ** Значение - Строка - Необязательный. Настройки размещения в подсистеме. -// "" - Выводить отчет в своей группе обычным шрифтом. -// СВажный" - Выводить отчет в своей группе жирным шрифтом. -// ССмТакже" - Выводить отчет в группе "См. также". -// * ФункциональныеОпции - Массив из Строка - -// Имена функциональных опций варианта отчета. -// * НастройкиДляПоиска - Структура - Дополнительные настройки для поиска этого варианта отчета. -// Эти настройки необходимо задавать только если СКД не используется или используется не в полном объеме. -// Например, СКД может использоваться только для параметризации и получения данных, -// а вывод выполняться в фиксированный макет табличного документа. -// ** НаименованияПолей - Строка - Имена полей варианта отчета. -// ** НаименованияПараметровИОтборов - Строка - Имена настроек варианта отчета. -// ** КлючевыеСлова - Строка - Дополнительная терминология (в т.ч. специализированная или устаревшая). -// Разделитель терминов: Символы.ПС. -// * ФорматНастроекСКД - Булево - Отчет использует типовой формат хранения настроек на механике СКД, -// а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип возвращаемого значения). -// Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые рассчитывают на типовой формат. -// * ОпределитьНастройкиФормы - Булево - Отчет имеет программный интерфейс для тесной интеграции с формой отчета, -// в том числе может переопределять некоторые настройки формы и подписываться на ее события. -// Если Истина и отчет подключен к общей форме ФормаОтчета, -// тогда в модуле объекта отчета следует определить процедуру по шаблону: -// -// // Настройки общей формы отчета подсистемы "Варианты отчетов". -// // -// // Параметры: -// // Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета. -// // Неопределено когда вызов без контекста. -// // КлючВарианта - Строка, Неопределено - Имя предопределенного -// // или уникальный идентификатор пользовательского варианта отчета. -// // Неопределено когда вызов без контекста. -// // Настройки - Структура - см. возвращаемое значение -// // ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию(). -// // -// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт -// // Код процедуры. -// КонецПроцедуры -// -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// После вставки вызова в модуле менеджера указанного отчета следует разместить экспортную процедуру по шаблону: -// // Настройки размещения в панели отчетов. -// // -// // Параметры: -// // Настройки - Коллекция - Передается "как есть" из ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // Может использоваться для получения настроек варианта этого отчета при помощи функции ВариантыОтчетов.ОписаниеВарианта(). -// // НастройкиОтчета - СтрокаДереваЗначений - Настройки этого отчета, -// // уже сформированные при помощи функции ВариантыОтчетов.ОписаниеОтчета() и готовые к изменению. -// // См. "Свойства для изменения" процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // -// // Описание: -// // См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// // -// // Вспомогательные методы: -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// // -// // Примеры: -// // -// // 1. Установка описания варианта. -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // НастройкиВарианта.Описание = НСтр("ru = '<Описание>'"); -// // -// // 2. Отключение варианта отчета. -// // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// // НастройкиВарианта.Включен = Ложь; -// // -// Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт -// // Код процедуры. -// КонецПроцедуры -// -// Примеры: -// -// 1. Добавление варианта отчета в подсистему. -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчета, "<ИмяВарианта>"); -// НастройкиВарианта.Размещение.Вставить(Метаданные.Подсистемы.ИмяРаздела.Подсистемы.ИмяПодсистемы); -// -// 2. Отключение варианта отчета. -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчета, "<ИмяВарианта>"); -// НастройкиВарианта.Включен = Ложь; -// -// 3. Отключение всех вариантов отчета, кроме одного. -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ИмяОтчета); -// НастройкиОтчета.Включен = Ложь; -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// НастройкиВарианта.Включен = Истина; -// -// 4. Заполнение настроек для поиска - наименования полей, параметров и отборов: -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчетаБезСхемы, ""); -// НастройкиВарианта.НастройкиДляПоиска.НаименованияПолей = -// НСтр("ru = 'Контрагент -// |Договор -// |Ответственный -// |Скидка -// |Дата'"); -// НастройкиВарианта.НастройкиДляПоиска.НаименованияПараметровИОтборов = -// НСтр("ru = 'Период -// |Ответственный -// |Контрагент -// |Договор'"); -// -// 5. Переключение режима вывода в панелях отчетов: -// 5.1. Группировка вариантов отчета по этому отчету: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.ИмяОтчета, Истина); -// 5.2. Без группировки по отчету: -// Отчет = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ИмяОтчета); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Отчет, Ложь); -// -// Важно: +// Задает настройки размещения вариантов отчетов в панели отчетов. // Отчет выступает в качестве контейнера вариантов. // Изменяя настройки отчета можно сразу изменять настройки всех его вариантов. // Однако, если явно получить настройки варианта отчета, то они станут самостоятельными, -// т.е. более не будут наследовать изменения настроек от отчета. См. пример 3. +// т.е. более не будут наследовать изменения настроек от отчета. // // Начальная настройка размещения отчетов по подсистемам зачитывается из метаданных, // ее дублирование в коде не требуется. @@ -197,15 +80,67 @@ // Для пользовательских вариантов отчета действуют только функциональные опции отчета // - они отключаются только с отключением всего отчета. // +// Параметры: +// Настройки - Коллекция - настройки отчетов и вариантов отчетов конфигурации. +// Для их изменения предназначены следующие вспомогательные процедуры и функции: +// ВариантыОтчетов.ОписаниеОтчета, +// ВариантыОтчетов.ОписаниеВарианта, +// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов, +// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера. +// +// Пример: +// +// //Добавление варианта отчета в подсистему. +// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчета, "<ИмяВарианта>"); +// НастройкиВарианта.Размещение.Вставить(Метаданные.Подсистемы.ИмяРаздела.Подсистемы.ИмяПодсистемы); +// +// //Отключение варианта отчета. +// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчета, "<ИмяВарианта>"); +// НастройкиВарианта.Включен = Ложь; +// +// //Отключение всех вариантов отчета, кроме одного. +// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ИмяОтчета); +// НастройкиОтчета.Включен = Ложь; +// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); +// НастройкиВарианта.Включен = Истина; +// +// //Заполнение настроек для поиска - наименования полей, параметров и отборов: +// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.ИмяОтчетаБезСхемы, ""); +// НастройкиВарианта.НастройкиДляПоиска.НаименованияПолей = +// НСтр("ru = 'Контрагент +// |Договор +// |Ответственный +// |Скидка +// |Дата'"); +// НастройкиВарианта.НастройкиДляПоиска.НаименованияПараметровИОтборов = +// НСтр("ru = 'Период +// |Ответственный +// |Контрагент +// |Договор'"); +// +// //Переключение режима вывода в панелях отчетов: +// //Группировка вариантов отчета по этому отчету: +// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.ИмяОтчета, Истина); +// //Без группировки по отчету: +// Отчет = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ИмяОтчета); +// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Отчет, Ложь); +// Процедура НастроитьВариантыОтчетов(Настройки) Экспорт КонецПроцедуры -// Содержит описания изменений имен вариантов отчетов. Используется -// при обновлении информационной базы, в целях контроля ссылочной целостности -// и для сохранения настроек варианта, сделанных администратором. +// Регистрирует изменения в именах вариантов отчетов. +// Используется при обновлении в целях сохранения ссылочной целостности, +// в частности для сохранения пользовательских настроек и настроек рассылок отчетов. +// Старое имя варианта резервируется и не может быть использовано в дальнейшем. +// Если изменений было несколько, то каждое изменение необходимо зарегистрировать, +// указывая в актуальном имени варианта последнее (текущее) имя варианта отчета. +// Поскольку имена вариантов отчетов не выводятся в пользовательском интерфейсе, +// то рекомендуется задавать их таким образом, что бы затем не менять. +// В Изменения необходимо добавить описания изменений имен вариантов +// отчетов, подключенных к подсистеме. // // Параметры: // Изменения - ТаблицаЗначений - Таблица изменений имен вариантов. Колонки: @@ -213,59 +148,141 @@ // * СтароеИмяВарианта - Строка - Старое имя варианта, до изменения. // * АктуальноеИмяВарианта - Строка - Текущее (последнее актуальное) имя варианта. // -// Описание: -// В Изменения необходимо добавить описания изменений имен вариантов -// отчетов, подключенных к подсистеме. -// -// Например: +// Пример: // Изменение = Изменения.Добавить(); // Изменение.Отчет = Метаданные.Отчеты.<ИмяОтчета>; // Изменение.СтароеИмяВарианта = "<СтароеИмяВарианта>"; // Изменение.АктуальноеИмяВарианта = "<АктуальноеИмяВарианта>"; // -// Важно: -// Старое имя варианта резервируется и не может быть использовано в дальнейшем. -// Если изменений было несколько, то каждое изменение необходимо зарегистрировать, -// указывая в актуальном имени варианта последнее (текущее) имя варианта отчета. -// Поскольку имена вариантов отчетов не выводятся в пользовательском интерфейсе, -// то рекомендуется задавать их таким образом, что бы затем не менять. -// Процедура ЗарегистрироватьИзмененияКлючейВариантовОтчетов(Изменения) Экспорт КонецПроцедуры -// Глобальные настройки, применяемые как умолчания для объектов подсистемы. +//////////////////////////////////////////////////////////////////////////////// +// Настройки команд отчетов + +// Определяет объекты конфигурации, в модулях менеджеров которых предусмотрена процедура ДобавитьКомандыОтчетов, +// описывающая команды открытия контекстных отчетов. +// Синтаксис процедуры ДобавитьКомандыОтчетов см. в документации. // // Параметры: -// Настройки - Коллекция настроек подсистемы. Реквизиты: +// Объекты - Массив - объекты метаданных (ОбъектМетаданных) с командами отчетов. +// +Процедура ОпределитьОбъектыСКомандамиОтчетов(Объекты) Экспорт + +КонецПроцедуры + +// Определение списка глобальных команд отчетов. +// Событие возникает в процессе вызова модуля повторного использования. +// +// Параметры: +// КомандыОтчетов - ТаблицаЗначений - Таблица команд для вывода в подменю. Для изменения. +// * Идентификатор - Строка - Идентификатор команды. +// +// Настройки внешнего вида: +// * Представление - Строка - Представление команды в форме. +// * Важность - Строка - Суффикс группы в подменю, в которой следует вывести эту команду. +// Допустимо использовать: "Важное", "Обычное" и "СмТакже". +// * Порядок - Число - Порядок размещения команды в группе. Используется для настройки под конкретное +// рабочее место. +// * Картинка - Картинка - Картинка команды. +// * СочетаниеКлавиш - СочетаниеКлавиш - Сочетание клавиш для быстрого вызова команды. +// +// Настройки видимости и доступности: +// * ТипПараметра - ОписаниеТипов - Типы объектов, для которых предназначена эта команда. +// * ВидимостьВФормах - Строка - Имена форм через запятую, в которых должна отображаться команда. +// Используется когда состав команд отличается для различных форм. +// * ФункциональныеОпции - Строка - Имена функциональных опций через запятую, определяющих видимость команды. +// * УсловияВидимости - Массив - Определяет видимость команды в зависимости от контекста. +// Для регистрации условий следует использовать процедуру +// ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды(). +// Условия объединяются по "И". +// * ИзменяетВыбранныеОбъекты - Булево - Определяет доступность команды в ситуации, +// когда у пользователя нет прав на изменение объекта. +// Если Истина, то в описанной выше ситуации кнопка будет недоступна. +// Необязательный. Значение по умолчанию: Ложь. +// +// Настройки процесса выполнения: +// * МножественныйВыбор - Булево, Неопределено - Если Истина, то команда поддерживает множественный выбор. +// В этом случае в параметре выполнения будет передан список ссылок. +// Необязательный. Значение по умолчанию: Истина. +// * РежимЗаписи - Строка - Действия, связанные с записью объекта, которые выполняются перед обработчиком команды. +// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается +// вся форма. В этом режиме рекомендуется работать напрямую с формой, +// которая передается в структуре 2 параметра обработчика команды. +// ** "ЗаписыватьТолькоНовые" - Записывать новые объекты. +// ** "Записывать" - Записывать новые и модифицированные объекты. +// ** "Проводить" - Проводить документы. +// Перед записью и проведением у пользователя запрашивается подтверждение. +// Необязательный. Значение по умолчанию: "Записывать". +// * ТребуетсяРаботаСФайлами - Булево - Если Истина, то в веб-клиенте предлагается +// установить расширение работы с файлами. +// Необязательный. Значение по умолчанию: Ложь. +// +// Настройки обработчика: +// * Менеджер - Строка - Полное имя объекта метаданных, отвечающего за выполнение команды. +// Пример: "Отчет._ДемоКнигаПокупок". +// * ИмяФормы - Строка - Имя формы, которую требуется открыть или получить для выполнения команды. +// Если Обработчик не указан, то у формы вызывается метод "Открыть". +// * КлючВарианта - Строка - Имя варианта отчета, открываемого при выполнении команды. +// * ИмяПараметраФормы - Строка - Имя параметра формы, в который следует передать ссылку или массив ссылок. +// * ПараметрыФормы - Неопределено, Структура - Параметры формы, указанной в ИмяФормы. +// * Обработчик - Строка - Описание процедуры, обрабатывающей основное действие команды. +// Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется когда процедура размещена в общем модуле. +// Формат "<ИмяПроцедуры>" используется в следующих случаях: +// - Если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. +// - Если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. +// * ДополнительныеПараметры - Структура - Параметры обработчика, указанного в Обработчик. +// +// Параметры - Структура - Сведения о контексте исполнения. +// * ИмяФормы - Строка - Полное имя формы. +// +// СтандартнаяОбработка - Булево - Если установить в Ложь, то событие "ДобавитьКомандыОтчетов" менеджера объекта не +// будет вызвано. +// +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт + + + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ВариантыОтчетовПереопределяемый.ПриОпределенииНастроек. +// Задает настройки, применяемые как умолчания для объектов подсистемы. +// +// Параметры: +// Настройки - Структура - Коллекция настроек подсистемы. Реквизиты: // * ВыводитьОтчетыВместоВариантов - Булево - Умолчание для вывода гиперссылок в панели отчетов: -// - Истина - Варианты отчетов по умолчанию скрыты, а отчеты включены и видимы. -// - Ложь - Значение по умолчанию. Варианты отчетов по умолчанию видимы, а отчеты отключены. +// Истина - Варианты отчетов по умолчанию скрыты, а отчеты включены и видимы. +// Ложь - Варианты отчетов по умолчанию видимы, а отчеты отключены. +// Значение по умолчанию: Ложь. // * ВыводитьОписания - Булево - Умолчание для вывода описаний в панели отчетов: -// - Истина - Значение по умолчанию. Выводить описания в виде подписей под гиперссылками вариантов -// (режим чтения описаний). -// - Ложь - Выводить описания в виде всплывающих подсказок -// (как раньше). +// Истина - Значение по умолчанию. Выводить описания в виде подписей под гиперссылками вариантов +// Ложь - Выводить описания в виде всплывающих подсказок +// Значение по умолчанию: Истина. // * Поиск - Структура - Настройки поиска вариантов отчетов. -// * ПодсказкаВвода - Строка - Текст подсказки выводится в поле поиска когда поиск не задан. +// ** ПодсказкаВвода - Строка - Текст подсказки выводится в поле поиска когда поиск не задан. // В качестве примера рекомендуется указывать часто используемые термины прикладной конфигурации. // * ДругиеОтчеты - Структура - Настройки формы "Другие отчеты": -// * ЗакрыватьПослеВыбора - Булево - Закрывать ли форму после выбора гиперссылки отчета. -// - Истина - Значение по умолчанию. Закрывать "Другие отчеты" после выбора. -// - Ложь - Не закрывать. -// * ПоказыватьФлажок - Булево - Показывать ли флажок ЗакрыватьПослеВыбора. -// - Истина - Показывать флажок "Закрывать это окно после перехода к другому отчету". -// - Ложь - Значение по умолчанию. Не показывать флажок. +// ** ЗакрыватьПослеВыбора - Булево - Закрывать ли форму после выбора гиперссылки отчета. +// Истина - Закрывать "Другие отчеты" после выбора. +// Ложь - Не закрывать. +// Значение по умолчанию: Истина. +// ** ПоказыватьФлажок - Булево - Показывать ли флажок ЗакрыватьПослеВыбора. +// Истина - Показывать флажок "Закрывать это окно после перехода к другому отчету". +// Ложь - Не показывать флажок. +// Значение по умолчанию: Ложь. // -// Например: +// Пример: // Настройки.Поиск.ПодсказкаВвода = НСтр("ru = 'Например, себестоимость'"); // Настройки.ДругиеОтчеты.ЗакрыватьПослеВыбора = Ложь; // Настройки.ДругиеОтчеты.ПоказыватьФлажок = Истина; // Процедура ОпределитьГлобальныеНастройки(Настройки) Экспорт - - КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl index 46b7805c0..17e8e3655 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl @@ -1,52 +1,48 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Варианты отчетов" (сервер, повт. исп.). -// -// Выполняется на сервере, возвращаемые значения кэшируются на время сеанса. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Формирует список отчетов конфигурации, доступных текущему пользователю. +// Его следует использовать во всех запросах к таблице +// справочника "ВариантыОтчетов" как отбор по реквизиту "Отчет". // // Возвращаемое значение: -// Массив из <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - -// Ссылки отчетов, доступных текущему пользователю. -// -// Описание: -// Данный массив следует использовать во всех запросах к таблице -// справочника "ВариантыОтчетов" как отбор по реквизиту "Отчет". +// Массив - ссылки отчетов, доступных текущему пользователю. +// Тип элементов см. в реквизите Справочники.ВариантыОтчетов.Реквизиты.Отчет. // Функция ДоступныеОтчеты(ПроверятьФункциональныеОпции = Истина) Экспорт Результат = Новый Массив; + ПолныеИменаОтчетов = Новый Массив; - КэшФлажка = Неопределено; + УстановленныеРасширенияДоступны = Неопределено; + ПоУмолчаниюВсеПодключены = Неопределено; Для Каждого ОтчетМетаданные Из Метаданные.Отчеты Цикл - Если ПравоДоступа("Просмотр", ОтчетМетаданные) - И ВариантыОтчетов.ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажка) Тогда - Если ПроверятьФункциональныеОпции - И Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОтчетМетаданные) Тогда - Продолжить; - КонецЕсли; - СсылкаОтчета = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(ОтчетМетаданные); - Если ТипЗнч(СсылкаОтчета) = Тип("Строка") Тогда - Продолжить; - КонецЕсли; - Результат.Добавить(СсылкаОтчета); + Если Не ПравоДоступа("Просмотр", ОтчетМетаданные) + Или Не ВариантыОтчетов.ОтчетПодключенКХранилищу(ОтчетМетаданные, ПоУмолчаниюВсеПодключены) + Или СтандартныеПодсистемыСервер.ЭтоОбъектРасширенияНеразделенногоПользователя(ОтчетМетаданные, УстановленныеРасширенияДоступны) Тогда + Продолжить; КонецЕсли; + Если ПроверятьФункциональныеОпции + И Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОтчетМетаданные) Тогда + Продолжить; + КонецЕсли; + ПолныеИменаОтчетов.Добавить(ОтчетМетаданные.ПолноеИмя()); + КонецЦикла; + + ИдентификаторыОтчетов = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИменаОтчетов); + Для Каждого ИдентификаторОтчета Из ИдентификаторыОтчетов Цикл + Результат.Добавить(ИдентификаторОтчета.Значение); КонецЦикла; Возврат Результат; КонецФункции // Формирует список вариантов отчетов конфигурации, недоступных текущему пользователю по функциональным опциям. +// Следует использовать во всех запросах к таблице +// справочника "ВариантыОтчетов" как исключающий отбор по реквизиту "ПредопределенныйВариант". // // Возвращаемое значение: -// Массив из СправочникСсылка.ПредопределенныеВариантыОтчетов, СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений - -// Варианты отчетов, которые отключены по функциональным опциям. -// -// Описание: -// Данный массив следует использовать во всех запросах к таблице -// справочника "ВариантыОтчетов" как исключающий отбор по реквизиту "ПредопределенныйВариант". +// Массив - варианты отчетов, которые отключены по функциональным опциям. +// Тип элементов - СправочникСсылка.ПредопределенныеВариантыОтчетов, +// СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений. // Функция ОтключенныеВариантыПрограммы() Экспорт // Получить варианты, недоступные по функциональным опциям. @@ -102,7 +98,6 @@ | И (Версии.ВерсияРасширений = &ВерсияРасширений) |ГДЕ | НЕ(НЕ ВариантыРасширений.Включен = ЛОЖЬ - | И НЕ ВариантыРасширений.ПометкаУдаления = ИСТИНА | И НЕ Версии.Вариант ЕСТЬ NULL ) | И ВариантыРасширений.Отчет В(&ОтчетыПользователя) | И НЕ ВариантыРасширений.Ссылка В (&МассивОтключенных)"; @@ -131,12 +126,18 @@ // * Приоритет - Строка - Приоритет подсистемы. // Функция ПодсистемыТекущегоПользователя() Экспорт + + ОписаниеТиповИдентификатора = Новый ОписаниеТипов; + ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовМетаданных"); + ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовРасширений"); + Результат = Новый ДеревоЗначений; - Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + Результат.Колонки.Добавить("Ссылка", ОписаниеТиповИдентификатора); Результат.Колонки.Добавить("Имя", ВариантыОтчетов.ОписаниеТиповСтрока(150)); Результат.Колонки.Добавить("ПолноеИмя", ВариантыОтчетов.ОписаниеТиповСтрока(510)); Результат.Колонки.Добавить("Представление", ВариантыОтчетов.ОписаниеТиповСтрока(150)); - Результат.Колонки.Добавить("РазделСсылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + Результат.Колонки.Добавить("РазделСсылка", ОписаниеТиповИдентификатора); + Результат.Колонки.Добавить("РазделПолноеИмя", ВариантыОтчетов.ОписаниеТиповСтрока(510)); Результат.Колонки.Добавить("Приоритет", ВариантыОтчетов.ОписаниеТиповСтрока(100)); Результат.Колонки.Добавить("ПолноеПредставление", ВариантыОтчетов.ОписаниеТиповСтрока(300)); @@ -144,80 +145,120 @@ КорневаяСтрока.Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); КорневаяСтрока.Представление = НСтр("ru = 'Все разделы'"); - ДобавитьПодсистемыТекущегоПользователя(КорневаяСтрока, Неопределено, Неопределено); + МассивПолныхИмен = Новый Массив; + ПолныеИменаСтрокДерева = Новый Соответствие; + + УстановленныеРасширенияДоступны = Неопределено; + ИдентификаторНачальнойСтраницы = ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(); + СписокРазделов = ВариантыОтчетов.СписокРазделов(); + + Приоритет = 0; + Для Каждого ЭлементСписка Из СписокРазделов Цикл + + РазделМетаданные = ЭлементСписка.Значение; + Если НЕ (ТипЗнч(РазделМетаданные) = Тип("ОбъектМетаданных") И СтрНачинаетсяС(РазделМетаданные.ПолноеИмя(), "Подсистема")) + И НЕ (ТипЗнч(РазделМетаданные) = Тип("Строка") И РазделМетаданные = ИдентификаторНачальнойСтраницы) Тогда + + ВызватьИсключение НСтр("ru='Некорректно определены значения разделов в процедуре ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов'"); + + КонецЕсли; + + Если ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда + ШаблонЗаголовка = ЭлементСписка.Представление; + Иначе + ШаблонЗаголовка = НСтр("ru = 'Отчеты раздела ""%1""'"); + КонецЕсли; + ЭтоНачальнаяСтраница = (РазделМетаданные = ИдентификаторНачальнойСтраницы); + + Если Не ЭтоНачальнаяСтраница + И (Не ПравоДоступа("Просмотр", РазделМетаданные) + Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(РазделМетаданные) + Или СтандартныеПодсистемыСервер.ЭтоОбъектРасширенияНеразделенногоПользователя(РазделМетаданные, УстановленныеРасширенияДоступны)) Тогда + Продолжить; // Подсистема не доступна по ФО или по правам. + КонецЕсли; + + СтрокаДерева = КорневаяСтрока.Строки.Добавить(); + Если ЭтоНачальнаяСтраница Тогда + СтрокаДерева.Имя = ИдентификаторНачальнойСтраницы; + СтрокаДерева.ПолноеИмя = ИдентификаторНачальнойСтраницы; + СтрокаДерева.Представление = НСтр("ru = 'Начальная страница'"); + Иначе + СтрокаДерева.Имя = РазделМетаданные.Имя; + СтрокаДерева.ПолноеИмя = РазделМетаданные.ПолноеИмя(); + СтрокаДерева.Представление = РазделМетаданные.Представление(); + КонецЕсли; + МассивПолныхИмен.Добавить(СтрокаДерева.ПолноеИмя); + Если ПолныеИменаСтрокДерева[СтрокаДерева.ПолноеИмя] = Неопределено Тогда + ПолныеИменаСтрокДерева.Вставить(СтрокаДерева.ПолноеИмя, СтрокаДерева); + Иначе + ПолныеИменаСтрокДерева.Вставить(СтрокаДерева.ПолноеИмя, Истина); // Требуется поиск по дереву. + КонецЕсли; + СтрокаДерева.РазделПолноеИмя = СтрокаДерева.ПолноеИмя; + СтрокаДерева.ПолноеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонЗаголовка, + СтрокаДерева.Представление); + + Приоритет = Приоритет + 1; + СтрокаДерева.Приоритет = Формат(Приоритет, "ЧЦ=4; ЧДЦ=0; ЧВН=; ЧГ=0"); + Если Не ЭтоНачальнаяСтраница Тогда + ДобавитьПодсистемыТекущегоПользователя(СтрокаДерева, РазделМетаданные, МассивПолныхИмен, ПолныеИменаСтрокДерева, УстановленныеРасширенияДоступны); + КонецЕсли; + КонецЦикла; + + СсылкиПодсистем = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(МассивПолныхИмен); + Для Каждого КлючИЗначение Из СсылкиПодсистем Цикл + СтрокаДерева = ПолныеИменаСтрокДерева[КлючИЗначение.Ключ]; + Если СтрокаДерева = Истина Тогда // Требуется поиск по дереву. + Найденные = Результат.Строки.НайтиСтроки(Новый Структура("ПолноеИмя", КлючИЗначение.Ключ), Истина); + Для Каждого СтрокаДерева Из Найденные Цикл + СтрокаДерева.Ссылка = КлючИЗначение.Значение; + СтрокаДерева.РазделСсылка = СсылкиПодсистем[СтрокаДерева.РазделПолноеИмя]; + КонецЦикла; + Иначе + СтрокаДерева.Ссылка = КлючИЗначение.Значение; + СтрокаДерева.РазделСсылка = СсылкиПодсистем[СтрокаДерева.РазделПолноеИмя]; + КонецЕсли; + КонецЦикла; + ПолныеИменаСтрокДерева.Очистить(); Возврат Результат; КонецФункции // Добавляет подсистемы родителя с фильтром по правам доступа и функциональным опциям. -Процедура ДобавитьПодсистемыТекущегоПользователя(РодительСтрока, РодительМетаданные = Неопределено, РазделСсылка = Неопределено) - Если РодительМетаданные = Неопределено Тогда - ДляКорневойСтроки = Истина; - ПриоритетРодителя = ""; - Подсистемы = ВариантыОтчетов.ИспользуемыеРазделы(); - ИдентификаторНачальнойСтраницы = ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы(); - Иначе - ДляКорневойСтроки = Ложь; - ПриоритетРодителя = РодительСтрока.Приоритет; - Подсистемы = РодительМетаданные.Подсистемы; - ИдентификаторНачальнойСтраницы = ""; - КонецЕсли; +Процедура ДобавитьПодсистемыТекущегоПользователя(СтрокаРодителя, МетаданныеРодителя, МассивПолныхИмен, ПолныеИменаСтрокДерева, УстановленныеРасширенияДоступны) + ПриоритетРодителя = СтрокаРодителя.Приоритет; + Приоритет = 0; - Для Каждого Подсистема Из Подсистемы Цикл - Если ДляКорневойСтроки Тогда - ПодсистемаМетаданные = Подсистема.Метаданные; - ЭтоНачальнаяСтраница = (ПодсистемаМетаданные = ИдентификаторНачальнойСтраницы); - Иначе - ПодсистемаМетаданные = Подсистема; - ЭтоНачальнаяСтраница = Ложь; - КонецЕсли; - + Для Каждого ПодсистемаМетаданные Из МетаданныеРодителя.Подсистемы Цикл Приоритет = Приоритет + 1; - Если Не ЭтоНачальнаяСтраница Тогда - Если Не ПодсистемаМетаданные.ВключатьВКомандныйИнтерфейс - Или Не ПравоДоступа("Просмотр", ПодсистемаМетаданные) - Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ПодсистемаМетаданные) Тогда - Продолжить; // Подсистема не доступна по ФО или по правам. - КонецЕсли; + Если Не ПодсистемаМетаданные.ВключатьВКомандныйИнтерфейс + Или Не ПравоДоступа("Просмотр", ПодсистемаМетаданные) + Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ПодсистемаМетаданные) + Или СтандартныеПодсистемыСервер.ЭтоОбъектРасширенияНеразделенногоПользователя(ПодсистемаМетаданные, УстановленныеРасширенияДоступны) Тогда + Продолжить; // Подсистема не доступна по ФО или по правам. КонецЕсли; - Если ДляКорневойСтроки Тогда - ПодсистемаСсылка = Подсистема.Ссылка; + СтрокаДерева = СтрокаРодителя.Строки.Добавить(); + СтрокаДерева.Имя = ПодсистемаМетаданные.Имя; + СтрокаДерева.ПолноеИмя = ПодсистемаМетаданные.ПолноеИмя(); + СтрокаДерева.Представление = ПодсистемаМетаданные.Представление(); + МассивПолныхИмен.Добавить(СтрокаДерева.ПолноеИмя); + Если ПолныеИменаСтрокДерева[СтрокаДерева.ПолноеИмя] = Неопределено Тогда + ПолныеИменаСтрокДерева.Вставить(СтрокаДерева.ПолноеИмя, СтрокаДерева); Иначе - ПодсистемаСсылка = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(ПодсистемаМетаданные); - КонецЕсли; - Если ТипЗнч(ПодсистемаСсылка) = Тип("Строка") Тогда - Продолжить; + ПолныеИменаСтрокДерева.Вставить(СтрокаДерева.ПолноеИмя, Истина); // Требуется поиск по дереву. КонецЕсли; + СтрокаДерева.РазделПолноеИмя = СтрокаРодителя.РазделПолноеИмя; - СтрокаДерева = РодительСтрока.Строки.Добавить(); - Если ЭтоНачальнаяСтраница Тогда - СтрокаДерева.Имя = ИдентификаторНачальнойСтраницы; - СтрокаДерева.ПолноеИмя = "Подсистема." + ИдентификаторНачальнойСтраницы; - СтрокаДерева.Представление = НСтр("ru = 'Начальная страница'"); + Если СтрДлина(ПриоритетРодителя) > 12 Тогда + СтрокаДерева.ПолноеПредставление = СтрокаРодителя.Представление + ": " + СтрокаДерева.Представление; Иначе - СтрокаДерева.Имя = ПодсистемаМетаданные.Имя; - СтрокаДерева.ПолноеИмя = ПодсистемаМетаданные.ПолноеИмя(); - СтрокаДерева.Представление = ПодсистемаМетаданные.Представление(); - КонецЕсли; - Если ДляКорневойСтроки Тогда - СтрокаДерева.Ссылка = ПодсистемаСсылка; - СтрокаДерева.РазделСсылка = Подсистема.Ссылка; - СтрокаДерева.ПолноеПредставление = Подсистема.ЗаголовокПанели; - Иначе - СтрокаДерева.Ссылка = ПодсистемаСсылка; - СтрокаДерева.РазделСсылка = РазделСсылка; - Если СтрДлина(ПриоритетРодителя) > 12 Тогда - СтрокаДерева.ПолноеПредставление = РодительСтрока.Представление + ": " + СтрокаДерева.Представление; - Иначе - СтрокаДерева.ПолноеПредставление = СтрокаДерева.Представление; - КонецЕсли; + СтрокаДерева.ПолноеПредставление = СтрокаДерева.Представление; КонецЕсли; СтрокаДерева.Приоритет = ПриоритетРодителя + Формат(Приоритет, "ЧЦ=4; ЧДЦ=0; ЧВН=; ЧГ=0"); - Если Не ЭтоНачальнаяСтраница Тогда - ДобавитьПодсистемыТекущегоПользователя(СтрокаДерева, ПодсистемаМетаданные, СтрокаДерева.РазделСсылка); - КонецЕсли; + + ДобавитьПодсистемыТекущегоПользователя(СтрокаДерева, ПодсистемаМетаданные, МассивПолныхИмен, ПолныеИменаСтрокДерева, УстановленныеРасширенияДоступны); КонецЦикла; КонецПроцедуры @@ -233,13 +274,17 @@ // Параметры подсистемы, закэшированные при обновлении. Функция Параметры() Экспорт - ХранилищеЗначения = Константы.ПараметрыВариантовОтчетов.Получить(); - Параметры = ХранилищеЗначения.Получить(); + ПолноеИмяПодсистемы = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(); + + Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ПолноеИмяПодсистемы); + Если Параметры = Неопределено Тогда + ВариантыОтчетов.ОперативноеОбновлениеОбщихДанныхКонфигурации(Новый Структура("РазделенныеОбработчики")); + Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ПолноеИмяПодсистемы); + КонецЕсли; Если ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда - ПолноеИмяПодсистемы = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(); - ХранилищеЗначения = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы); - Если ХранилищеЗначения = Неопределено Тогда + ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы); + Если ПараметрыРасширений = Неопределено Тогда Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда УстановитьПривилегированныйРежим(Истина); Если Не ПривилегированныйРежим() Тогда @@ -255,10 +300,9 @@ Настройки.Вставить("Отложенное", Истина); Настройки.Вставить("Полное", Истина); Обновление = ВариантыОтчетов.Обновить(Настройки); - ХранилищеЗначения = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы); + ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы); КонецЕсли; - Если ХранилищеЗначения <> Неопределено Тогда - ПараметрыРасширений = ХранилищеЗначения.Получить(); + Если ПараметрыРасширений <> Неопределено Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Параметры.ОтчетыСНастройками, ПараметрыРасширений.ОтчетыСНастройками); ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Параметры.ТаблицаФункциональныхОпций, ПараметрыРасширений.ТаблицаФункциональныхОпций); КонецЕсли; diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl index 0711711c0..90d8cfdbd 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Версионирование объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняется при обновлении конфигурации. @@ -119,88 +114,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// -Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт - - Обработчики.Вставить("ВыполняетсяЗаписьОбъекта", - "ВерсионированиеОбъектов.УстановкаПараметровСеанса"); - -КонецПроцедуры - -// Устанавливает параметры сеанса подсистемы обмена данными. -// -// Параметры: -// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить. -// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса. -// -Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт - - Если ИмяПараметра = "ВыполняетсяЗаписьОбъекта" Тогда - ВыполняетсяЗаписьОбъекта(Ложь); - УстановленныеПараметры.Добавить("ВыполняетсяЗаписьОбъекта"); - КонецЕсли; - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "ВерсионированиеОбъектов"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "ВерсионированиеОбъектов"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "ВерсионированиеОбъектов"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ВерсионированиеОбъектов"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ВерсионированиеОбъектов"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "ВерсионированиеОбъектов"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "ВерсионированиеОбъектов"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "ВерсионированиеОбъектов"); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.3.8"; - Обработчик.Процедура = "ВерсионированиеОбъектов.ОбновитьСведенияОВерсияхОбъектов"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("b403067e-7c2d-461c-89f9-5d5fc95dcab6"); - Обработчик.Комментарий = НСтр("ru = 'Обновление сведений о записанных версиях объектов. После выполнения обновления увеличится скорость записи версионируемых объектов.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.4.13"; - Обработчик.Процедура = "ВерсионированиеОбъектов.ПеренестиНастройкиВерсионирования"; - Обработчик.Комментарий = НСтр("ru = 'Обновление настроек версионирования.'"); - -КонецПроцедуры - // Дозаполняет реквизиты регистра версий. Процедура ОбновитьСведенияОВерсияхОбъектов(Параметры) Экспорт @@ -283,7 +196,7 @@ Если Источник.ОбменДанными.Загрузка Тогда Если Не Источник.Ссылка.Пустая() Тогда - ЗаписатьДанныеТекущейВерсии(Источник.Ссылка); + ЗаписатьДанныеТекущейВерсии(Источник.Ссылка, Истина); КонецЕсли; Возврат; КонецЕсли; @@ -300,198 +213,6 @@ КонецПроцедуры -// Записывает версию объекта в информационную базу. -// -// Параметры: -// Объект - для создания версии. -// -Процедура ПриСозданииВерсииОбъекта(Объект, РежимЗаписи) - - Перем НомерПоследнейВерсии, Комментарий; - - Если НЕ ОбъектВерсионируется(Объект, НомерПоследнейВерсии, РежимЗаписи = РежимЗаписиДокумента.Проведение - Или РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) Тогда - Возврат; - КонецЕсли; - - Если НЕ Объект.ДополнительныеСвойства.Свойство("ВерсионированиеОбъектовКомментарийКВерсии", Комментарий) Тогда - Комментарий = ""; - КонецЕсли; - - СведенияОВерсииОбъекта = Новый Структура; - СведенияОВерсииОбъекта.Вставить("НомерВерсии", Число(НомерПоследнейВерсии) + 1); - СведенияОВерсииОбъекта.Вставить("Комментарий", Комментарий); - - ИзмененаПроведенность = (РежимЗаписи = РежимЗаписиДокумента.Проведение И Не Объект.Проведен - Или РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения И Объект.Проведен); - СведенияОВерсииОбъекта.Вставить("ИзмененаПроведенность", ИзмененаПроведенность); - - СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.НастройкиВерсионированияОбъектов) - Или МодульТекущиеДелаСервер.ДелоОтключено("УстаревшиеВерсииОбъектов") Тогда - Возврат; - КонецЕсли; - - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.РегистрыСведений.НастройкиВерсионированияОбъектов.ПолноеИмя()); - - ИнформацияОбУстаревшихВерсиях = ИнформацияОбУстаревшихВерсиях(); - РазмерУстаревшихДанных = РазмерДанныхСтрокой(ИнформацияОбУстаревшихВерсиях.РазмерДанных); - Подсказка = НСтр("ru = 'Устаревших версий: %1 (%2)'"); - - Для Каждого Раздел Из Разделы Цикл - ИдентификаторУстаревшиеОбъекты = "УстаревшиеВерсииОбъектов" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - // Добавление дела. - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИдентификаторУстаревшиеОбъекты; - // Выводим дело, если размер устаревших данных больше 1 Гб. - Дело.ЕстьДела = ИнформацияОбУстаревшихВерсиях.РазмерДанных > (1024 * 1024 * 1024); - Дело.Представление = НСтр("ru = 'Устаревшие версии объектов'"); - Дело.Форма = "РегистрСведений.НастройкиВерсионированияОбъектов.Форма.НастройкиХраненияИстории"; - Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Подсказка, ИнформацияОбУстаревшихВерсиях.КоличествоВерсий, РазмерУстаревшихДанных); - Дело.Владелец = Раздел; - КонецЦикла; - -КонецПроцедуры - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("ВерсионированиеОбъектов.ОчиститьУстаревшиеВерсииОбъектов"); - -КонецПроцедуры - -// Создает и записывает версию объекта в информационную базу. -// -Процедура СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта, ЗаписьОбычнойВерсии = Истина) - - ПроверитьНаличиеПравНаИзменениеОбъекта(Объект.Метаданные()); - - УстановитьПривилегированныйРежим(Истина); - - Если ЗаписьОбычнойВерсии Тогда - ИзмененаПроведенность = Ложь; - Если СведенияОВерсииОбъекта.Свойство("ИзмененаПроведенность") Тогда - ИзмененаПроведенность = СведенияОВерсииОбъекта.ИзмененаПроведенность; - КонецЕсли; - - // Запись данных предыдущей версии. - Если Не Объект.ЭтоНовый() И (ИзмененаПроведенность И СведенияОВерсииОбъекта.НомерВерсии > 1 Или ВерсияОтличаетсяОтРанееЗаписанной(Объект)) Тогда - // Если версионирование включено после создания объекта, создаем предыдущую запись о версии. - Если СведенияОВерсииОбъекта.НомерВерсии = 1 Тогда - Если ОбъектВерсионируется(Объект.Ссылка, Ложь) Тогда - ПараметрыВерсии = Новый Структура; - ПараметрыВерсии.Вставить("НомерВерсии", 1); - ПараметрыВерсии.Вставить("Комментарий", НСтр("ru = 'Версия создана по уже имеющемуся объекту'")); - СоздатьВерсиюОбъекта(Объект.Ссылка.ПолучитьОбъект(), ПараметрыВерсии); - СведенияОВерсииОбъекта.НомерВерсии = 2; - КонецЕсли; - КонецЕсли; - - // Сохраняем предыдущую версию объекта. - МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Объект = Объект.Ссылка; - МенеджерЗаписи.НомерВерсии = НомерПредыдущейВерсии(Объект.Ссылка, СведенияОВерсииОбъекта.НомерВерсии); - МенеджерЗаписи.Прочитать(); - Если МенеджерЗаписи.Выбран() И Не МенеджерЗаписи.ЕстьДанныеВерсии Тогда - МенеджерЗаписи.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект.Ссылка), Новый СжатиеДанных(9)); - МенеджерЗаписи.Записать(); - КонецЕсли; - КонецЕсли; - - СсылкаНаОбъект = Объект.Ссылка;; - Если СсылкаНаОбъект.Пустая() Тогда - СсылкаНаОбъект = Объект.ПолучитьСсылкуНового(); - Если СсылкаНаОбъект.Пустая() Тогда - СсылкаНаОбъект = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Объект.Ссылка).ПолучитьСсылку(); - Объект.УстановитьСсылкуНового(СсылкаНаОбъект); - КонецЕсли; - КонецЕсли; - - // Запись текущей версии без данных. - МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Объект = СсылкаНаОбъект; - МенеджерЗаписи.НомерВерсии = СведенияОВерсииОбъекта.НомерВерсии; - МенеджерЗаписи.ДатаВерсии = ТекущаяДатаСеанса(); - - АвторВерсии = Неопределено; - Если Не Объект.ДополнительныеСвойства.Свойство("АвторВерсии", АвторВерсии) Тогда - АвторВерсии = Пользователи.АвторизованныйПользователь(); - КонецЕсли; - МенеджерЗаписи.АвторВерсии = АвторВерсии; - - МенеджерЗаписи.ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.ИзмененоПользователем; - МенеджерЗаписи.Синхронизируется = Истина; - СведенияОВерсииОбъекта.Свойство("Комментарий", МенеджерЗаписи.Комментарий); - - Если Не Объект.ЭтоНовый() Тогда - // Перед тем как посчитать контрольную сумму, необходимо установить проведенность в состояние, - // которое ожидается после записи документа. - Если ИзмененаПроведенность Тогда - Объект.Проведен = Не Объект.Проведен; - КонецЕсли; - - МенеджерЗаписи.КонтрольнаяСумма = КонтрольнаяСумма(ДанныеДляХранения(Объект)); - - // Возвращаем проведенность в исходное состояние, чтобы не поломать другие механизмы, зависящие от этого реквизита. - Если ИзмененаПроведенность Тогда - Объект.Проведен = Не Объект.Проведен; - КонецЕсли; - КонецЕсли; - Иначе - // Сохраняем предыдущую версию объекта. - МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Объект = Объект.Ссылка; - МенеджерЗаписи.НомерВерсии = НомерПредыдущейВерсии(Объект.Ссылка, СведенияОВерсииОбъекта.НомерВерсии); - МенеджерЗаписи.Прочитать(); - Если МенеджерЗаписи.Выбран() И Не МенеджерЗаписи.ЕстьДанныеВерсии Тогда - МенеджерЗаписи.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект.Ссылка), Новый СжатиеДанных(9)); - МенеджерЗаписи.Записать(); - КонецЕсли; - - ДвоичныеДанные = СериализоватьОбъект(Объект); - ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); - МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ДатаВерсии = ТекущаяДатаСеанса(); - МенеджерЗаписи.ВерсияОбъекта = ХранилищеДанных; - ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СведенияОВерсииОбъекта); - КонецЕсли; - - МенеджерЗаписи.Записать(); - -КонецПроцедуры - // Записывает в информационную базу версию объекта, полученного при обмене данными. // // Параметры: @@ -522,32 +243,13 @@ СведенияОВерсииОбъекта.ТипВерсииОбъекта = ТипВерсииОбъекта; Если Не ЗначениеЗаполнено(СведенияОВерсииОбъекта.АвторВерсии) Тогда - СведенияОВерсииОбъекта.АвторВерсии = Справочники.Пользователи.ПустаяСсылка(); + СведенияОВерсииОбъекта.АвторВерсии = Пользователи.АвторизованныйПользователь(); КонецЕсли; СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта, Ложь); КонецПроцедуры -Процедура ЗаписатьДанныеТекущейВерсии(Ссылка) - Перем НомерПоследнейВерсии; - - УстановитьПривилегированныйРежим(Истина); - - Если Не ОбъектВерсионируется(Ссылка, НомерПоследнейВерсии) Тогда - Возврат; - КонецЕсли; - - ПоследняяВерсия = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - ПоследняяВерсия.Объект = Ссылка; - ПоследняяВерсия.НомерВерсии = НомерПоследнейВерсии; - ПоследняяВерсия.Прочитать(); - Если Не ПоследняяВерсия.ЕстьДанныеВерсии Тогда - ПоследняяВерсия.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Ссылка), Новый СжатиеДанных(9)); - ПоследняяВерсия.Записать(); - КонецЕсли; -КонецПроцедуры - // Устанавливает признак игнорирования версии объекта. // // Параметры: @@ -687,27 +389,6 @@ КонецФункции -Функция ЗаписьОВерсииОбъекта(СсылкаНаОбъект, НомерВерсии) - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); - НаборЗаписей.Прочитать(); - - Возврат НаборЗаписей; - -КонецФункции - -Процедура ПроверитьНаличиеПравНаИзменениеОбъекта(ОбъектМетаданных) - - Если Не ПривилегированныйРежим() И Не ПравоДоступа("Изменение", ОбъектМетаданных)Тогда - ТекстСообщения = НСтр("ru = 'Недостаточно прав на изменение ""%1"".'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ОбъектМетаданных.Представление()); - ВызватьИсключение ТекстСообщения; - КонецЕсли; - -КонецПроцедуры - Процедура ПеренестиНастройкиВерсионирования() Экспорт ТекстЗапроса = @@ -819,7 +500,356 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт + + Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.ПолноеИмя()); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. +Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда + ПрочитатьИнформациюОбУзле(ЭлементДанных[0]); + + Объект = ЭлементДанных.Отбор.Объект.Значение; + КоличествоНесинхронизируемыхВерсий = КоличествоНесинхронизируемыхВерсий(Объект); + НомерВерсии = ЭлементДанных.Отбор.НомерВерсии.Значение - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; + ЭлементДанных[0].ВерсияВладелец = ЭлементДанных[0].ВерсияВладелец - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(ЭлементДанных.Отбор.Объект.Значение); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); + НаборЗаписей.Прочитать(); + + Если ОбщегоНазначения.ЗначениеВСтрокуXML(ЭлементДанных) = ОбщегоНазначения.ЗначениеВСтрокуXML(НаборЗаписей) Тогда + // Считаем, что нет коллизии. + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + ЕстьКоллизия = ПланыОбмена.ИзменениеЗарегистрировано(Отправитель.Ссылка, Объект); + + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии; + Если Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета") + И Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] <> Неопределено Тогда + ЕстьКоллизия = Истина; + Если Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] = "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе" Тогда + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; + Иначе + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; + КонецЕсли; + КонецЕсли; + + Если Не ЕстьКоллизия Тогда + // Если объект не был изменен, то версия перезаписывается без проверки, так как неизвестно, + // был ли изменен объект в узле-отправителе. + + Если НаборЗаписей.Количество() = 0 Тогда + Запись = НаборЗаписей.Добавить(); + Запись.Объект = Объект; + Запись.НомерВерсии = НомерВерсии; + Иначе + Запись = НаборЗаписей[0]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0], , "Объект,НомерВерсии"); + Запись.НомерВерсии = НомерВерсии; + НаборЗаписей.Записать(); + ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); + + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + Если ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии Тогда + ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка); + Если ВерсииКВыгрузке.Количество() = 0 Тогда + Возврат; + КонецЕсли; + МинимальныйНомерВерсии = ВерсииКВыгрузке[0].НомерВерсии; + Для Счетчик = 1 По ВерсииКВыгрузке.Количество() - 1 Цикл + Если ВерсииКВыгрузке[Счетчик - 1].НомерВерсии - ВерсииКВыгрузке[Счетчик].НомерВерсии = 1 Тогда + МинимальныйНомерВерсии = Мин(МинимальныйНомерВерсии, ВерсииКВыгрузке[Счетчик].НомерВерсии); + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + Если МинимальныйНомерВерсии > НомерВерсии Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + КоллизииВерсийОбъектов = Новый Соответствие; + Если Отправитель.ДополнительныеСвойства.Свойство("КоллизииВерсийОбъектов") Тогда + КоллизииВерсийОбъектов = Отправитель.ДополнительныеСвойства.КоллизииВерсийОбъектов; + Иначе + Отправитель.ДополнительныеСвойства.Вставить("КоллизииВерсийОбъектов", КоллизииВерсийОбъектов); + КонецЕсли; + + НомерВерсииСКоллизией = КоллизииВерсийОбъектов[Объект]; + НомерПоследнейВерсии = НомерПоследнейВерсии(Объект); + ОбновитьВерсиюСКоллизией = Истина; + Если НомерВерсииСКоллизией = Неопределено Тогда + НомерВерсииСКоллизией = НомерПоследнейВерсии + 1; + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); + Запись = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]); + Запись.НомерВерсии = НомерВерсииСКоллизией; + Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; + Запись.ДатаВерсии = ТекущаяДатаСеанса(); + Запись.АвторВерсии = Отправитель.Ссылка; + Запись.Узел = ОбщегоНазначения.ПредметСтрокой(Запись.АвторВерсии); + Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); + НаборЗаписей.Записать(); + НомерПоследнейВерсии = НомерВерсииСКоллизией; + КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией); + ОбновитьВерсиюСКоллизией = Ложь; + КонецЕсли; + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерПоследнейВерсии + 1); + Запись = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]); + Запись.НомерВерсии = НомерПоследнейВерсии + 1; + Запись.ВерсияВладелец = НомерВерсииСКоллизией; + Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; + НаборЗаписей.Записать(); + + Если ОбновитьВерсиюСКоллизией Тогда + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); + НаборЗаписей.Прочитать(); + Для Каждого Запись Из НаборЗаписей Цикл + Запись.КонтрольнаяСумма = ЭлементДанных[0].КонтрольнаяСумма; + Запись.ВерсияОбъекта = ЭлементДанных[0].ВерсияОбъекта; + Запись.РазмерДанных = ЭлементДанных[0].РазмерДанных; + Запись.ЕстьДанныеВерсии = ЭлементДанных[0].ЕстьДанныеВерсии; + КонецЦикла; + НаборЗаписей.Записать(); + КонецЕсли; + + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. +Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если Отправитель = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда + ПрочитатьИнформациюОбУзле(ЭлементДанных[0]); + + Объект = ЭлементДанных.Отбор.Объект.Значение; + КоличествоНесинхронизируемыхВерсий = КоличествоНесинхронизируемыхВерсий(Объект); + НомерВерсии = ЭлементДанных.Отбор.НомерВерсии.Значение - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; + ЭлементДанных[0].ВерсияВладелец = ЭлементДанных[0].ВерсияВладелец - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); + НаборЗаписей.Прочитать(); + + Если ОбщегоНазначения.ЗначениеВСтрокуXML(ЭлементДанных) = ОбщегоНазначения.ЗначениеВСтрокуXML(НаборЗаписей) Тогда + // Считаем, что нет коллизии. + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + ЕстьКоллизия = Объект.ПолучитьОбъект() <> Неопределено И ПланыОбмена.ИзменениеЗарегистрировано(Отправитель.Ссылка, Объект); + + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии; + Если Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета") + И Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] <> Неопределено Тогда + ЕстьКоллизия = Истина; + Если Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] = "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе" Тогда + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; + Иначе + ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; + КонецЕсли; + КонецЕсли; + + ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка); + Для Каждого ВерсияКВыгрузке Из ВерсииКВыгрузке Цикл + Если ВерсияКВыгрузке.НомерВерсии = НомерВерсии Тогда + ЕстьКоллизия = Истина; + КонецЕсли; + КонецЦикла; + + Если Не ЕстьКоллизия Тогда + // Если объект не был изменен, то версия перезаписывается без проверки, так как неизвестно, + // был ли изменен объект в узле-отправителе. + Если НаборЗаписей.Количество() = 0 Тогда + Запись = НаборЗаписей.Добавить(); + Запись.Объект = Объект; + Запись.НомерВерсии = НомерВерсии; + Иначе + Запись = НаборЗаписей[0]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0], , "Объект,НомерВерсии"); + НаборЗаписей.Записать(); + ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + НомерПоследнейВерсии = НомерПоследнейВерсии(Объект); + ПоследняяВерсия = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + ПоследняяВерсия.Объект = Объект; + ПоследняяВерсия.НомерВерсии = НомерПоследнейВерсии; + ПоследняяВерсия.Прочитать(); + Если Не ПоследняяВерсия.ЕстьДанныеВерсии Тогда + ПоследняяВерсия.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект), Новый СжатиеДанных(9)); + ПоследняяВерсия.Записать(); + КонецЕсли; + + Если ВерсииКВыгрузке.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого ОписаниеВерсии Из ВерсииКВыгрузке Цикл + Если ОписаниеВерсии.НомерВерсии >= НомерВерсии Тогда + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(ОписаниеВерсии.НомерВерсии); + НаборЗаписей.Прочитать(); + ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); + КонецЕсли; + КонецЦикла; + + КоллизииВерсийОбъектов = Новый Соответствие; + Если Отправитель.ДополнительныеСвойства.Свойство("КоллизииВерсийОбъектов") Тогда + КоллизииВерсийОбъектов = Отправитель.ДополнительныеСвойства.КоллизииВерсийОбъектов; + Иначе + Отправитель.ДополнительныеСвойства.Вставить("КоллизииВерсийОбъектов", КоллизииВерсийОбъектов); + КонецЕсли; + + НомерВерсииСКоллизией = КоллизииВерсийОбъектов[Объект]; + СдвигНомераВерсии = 1; + УстановитьВладельцаНепринятыхВерсий = Ложь; + Если НомерВерсииСКоллизией = Неопределено Тогда + СдвигНомераВерсии = 2; + НомерВерсииСКоллизией = НомерВерсии + 1; + УстановитьВладельцаНепринятыхВерсий = Истина; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Прочитать(); + ВерсииОбъекта = НаборЗаписей.Выгрузить(); + Для Каждого Версия Из ВерсииОбъекта Цикл + НаборЗаписей.Отбор.НомерВерсии.Установить(Версия.НомерВерсии); + НаборЗаписей.Прочитать(); + Запись = НаборЗаписей[0]; + Записать = Ложь; + Если Запись.ВерсияВладелец >= НомерВерсии Тогда + Запись.ВерсияВладелец = Запись.ВерсияВладелец + СдвигНомераВерсии; + Записать = Истина; + КонецЕсли; + Если Запись.НомерВерсии >= НомерВерсии Тогда + Запись.НомерВерсии = Запись.НомерВерсии + СдвигНомераВерсии; + Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; + Если УстановитьВладельцаНепринятыхВерсий И Не ЗначениеЗаполнено(Запись.ВерсияВладелец) Тогда + Запись.ВерсияВладелец = НомерВерсииСКоллизией; + КонецЕсли; + Записать = Истина; + КонецЕсли; + Если Записать Тогда + Записи = НаборЗаписей.Выгрузить(); + НаборЗаписей.Очистить(); + НаборЗаписей.Записать(); + НаборЗаписей.Отбор.НомерВерсии.Установить(Записи[0].НомерВерсии); + НаборЗаписей.Загрузить(Записи); + НаборЗаписей.Записать(); + КонецЕсли; + КонецЦикла; + + Если КоллизииВерсийОбъектов[Объект] = Неопределено Тогда + НомерВерсииСКоллизией = НомерВерсии + 1; + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Объект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); + Запись = НаборЗаписей.Добавить(); + + ПоследняяВерсияКВыгрузке = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + ПоследняяВерсияКВыгрузке.Объект = Объект; + ПоследняяВерсияКВыгрузке.НомерВерсии = ВерсииКВыгрузке[0].НомерВерсии + СдвигНомераВерсии; + ПоследняяВерсияКВыгрузке.Прочитать(); + + ЗаполнитьЗначенияСвойств(Запись, ПоследняяВерсияКВыгрузке, , "ВерсияВладелец"); + Запись.НомерВерсии = НомерВерсииСКоллизией; + Запись.ДатаВерсии = ТекущаяДатаСеанса(); + Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); + Запись.АвторВерсии = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Отправитель.Ссылка).ЭтотУзел(); + + Если Не Запись.ЕстьДанныеВерсии Тогда + Запись.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Запись.Объект), Новый СжатиеДанных(9)) + КонецЕсли; + НаборЗаписей.Записать(); + + КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. +Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + + ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт + + ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт + + Обработчики.Вставить("ВыполняетсяЗаписьОбъекта", + "ВерсионированиеОбъектов.УстановкаПараметровСеанса"); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.3.8"; + Обработчик.Процедура = "ВерсионированиеОбъектов.ОбновитьСведенияОВерсияхОбъектов"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("b403067e-7c2d-461c-89f9-5d5fc95dcab6"); + Обработчик.Комментарий = НСтр("ru = 'Обновление сведений о записанных версиях объектов. После выполнения обновления увеличится скорость записи версионируемых объектов.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.4.13"; + Обработчик.Процедура = "ВерсионированиеОбъектов.ПеренестиНастройкиВерсионирования"; + Обработчик.Комментарий = НСтр("ru = 'Обновление настроек версионирования.'"); + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Настройка = Настройки.Добавить(); + Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов; + Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьВерсионированиеОбъектов; +КонецПроцедуры // Обработчик перехода на версию объекта. // @@ -867,7 +897,46 @@ КонецПроцедуры -// См. описание процедуры СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.НастройкиВерсионированияОбъектов) + Или МодульТекущиеДелаСервер.ДелоОтключено("УстаревшиеВерсииОбъектов") Тогда + Возврат; + КонецЕсли; + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.РегистрыСведений.НастройкиВерсионированияОбъектов.ПолноеИмя()); + + ИнформацияОбУстаревшихВерсиях = ИнформацияОбУстаревшихВерсиях(); + РазмерУстаревшихДанных = РазмерДанныхСтрокой(ИнформацияОбУстаревшихВерсиях.РазмерДанных); + Подсказка = НСтр("ru = 'Устаревших версий: %1 (%2)'"); + + Для Каждого Раздел Из Разделы Цикл + ИдентификаторУстаревшиеОбъекты = "УстаревшиеВерсииОбъектов" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + // Добавление дела. + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторУстаревшиеОбъекты; + // Выводим дело, если размер устаревших данных больше 1 Гб. + Дело.ЕстьДела = ИнформацияОбУстаревшихВерсиях.РазмерДанных > (1024 * 1024 * 1024); + Дело.Представление = НСтр("ru = 'Устаревшие версии объектов'"); + Дело.Форма = "РегистрСведений.НастройкиВерсионированияОбъектов.Форма.НастройкиХраненияИстории"; + Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Подсказка, ИнформацияОбУстаревшихВерсиях.КоличествоВерсий, РазмерУстаревшихДанных); + Дело.Владелец = Раздел; + КонецЦикла; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("ВерсионированиеОбъектов.ОчиститьУстаревшиеВерсииОбъектов"); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. Процедура СобратьСтатистикуКонфигурации() Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда @@ -913,6 +982,194 @@ #Область СлужебныеПроцедурыИФункции +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра = "ВыполняетсяЗаписьОбъекта" Тогда + ВыполняетсяЗаписьОбъекта(Ложь); + УстановленныеПараметры.Добавить("ВыполняетсяЗаписьОбъекта"); + КонецЕсли; + +КонецПроцедуры + +// Создает и записывает версию объекта в информационную базу. +// +Процедура СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта, ЗаписьОбычнойВерсии = Истина) + + ПроверитьНаличиеПравНаИзменениеОбъекта(Объект.Метаданные()); + + УстановитьПривилегированныйРежим(Истина); + + Если ЗаписьОбычнойВерсии Тогда + ИзмененаПроведенность = Ложь; + Если СведенияОВерсииОбъекта.Свойство("ИзмененаПроведенность") Тогда + ИзмененаПроведенность = СведенияОВерсииОбъекта.ИзмененаПроведенность; + КонецЕсли; + + // Запись данных предыдущей версии. + Если Не Объект.ЭтоНовый() И (ИзмененаПроведенность И СведенияОВерсииОбъекта.НомерВерсии > 1 Или ВерсияОтличаетсяОтРанееЗаписанной(Объект)) Тогда + // Если версионирование включено после создания объекта, создаем предыдущую запись о версии. + Если СведенияОВерсииОбъекта.НомерВерсии = 1 Тогда + Если ОбъектВерсионируется(Объект.Ссылка, Ложь) Тогда + ПараметрыВерсии = Новый Структура; + ПараметрыВерсии.Вставить("НомерВерсии", 1); + ПараметрыВерсии.Вставить("Комментарий", НСтр("ru = 'Версия создана по уже имеющемуся объекту'")); + СоздатьВерсиюОбъекта(Объект.Ссылка.ПолучитьОбъект(), ПараметрыВерсии); + СведенияОВерсииОбъекта.НомерВерсии = 2; + КонецЕсли; + КонецЕсли; + + // Сохраняем предыдущую версию объекта. + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = Объект.Ссылка; + МенеджерЗаписи.НомерВерсии = НомерПредыдущейВерсии(Объект.Ссылка, СведенияОВерсииОбъекта.НомерВерсии); + МенеджерЗаписи.Прочитать(); + Если МенеджерЗаписи.Выбран() Тогда + МенеджерЗаписи.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект.Ссылка), Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(); + КонецЕсли; + КонецЕсли; + + СсылкаНаОбъект = Объект.Ссылка;; + Если СсылкаНаОбъект.Пустая() Тогда + СсылкаНаОбъект = Объект.ПолучитьСсылкуНового(); + Если СсылкаНаОбъект.Пустая() Тогда + СсылкаНаОбъект = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Объект.Ссылка).ПолучитьСсылку(); + Объект.УстановитьСсылкуНового(СсылкаНаОбъект); + КонецЕсли; + КонецЕсли; + + // Запись текущей версии без данных. + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = СсылкаНаОбъект; + МенеджерЗаписи.НомерВерсии = СведенияОВерсииОбъекта.НомерВерсии; + МенеджерЗаписи.ДатаВерсии = ТекущаяДатаСеанса(); + + АвторВерсии = Неопределено; + Если Не Объект.ДополнительныеСвойства.Свойство("АвторВерсии", АвторВерсии) Тогда + АвторВерсии = Пользователи.АвторизованныйПользователь(); + КонецЕсли; + МенеджерЗаписи.АвторВерсии = АвторВерсии; + + МенеджерЗаписи.ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.ИзмененоПользователем; + МенеджерЗаписи.Синхронизируется = Истина; + СведенияОВерсииОбъекта.Свойство("Комментарий", МенеджерЗаписи.Комментарий); + + Если Не Объект.ЭтоНовый() Тогда + // Перед тем как посчитать контрольную сумму, необходимо установить проведенность в состояние, + // которое ожидается после записи документа. + Если ИзмененаПроведенность Тогда + Объект.Проведен = Не Объект.Проведен; + КонецЕсли; + + МенеджерЗаписи.КонтрольнаяСумма = КонтрольнаяСумма(ДанныеДляХранения(Объект)); + + // Возвращаем проведенность в исходное состояние, чтобы не поломать другие механизмы, зависящие от этого реквизита. + Если ИзмененаПроведенность Тогда + Объект.Проведен = Не Объект.Проведен; + КонецЕсли; + КонецЕсли; + Иначе + // Сохраняем предыдущую версию объекта. + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = Объект.Ссылка; + МенеджерЗаписи.НомерВерсии = НомерПредыдущейВерсии(Объект.Ссылка, СведенияОВерсииОбъекта.НомерВерсии); + МенеджерЗаписи.Прочитать(); + Если МенеджерЗаписи.Выбран() И Не МенеджерЗаписи.ЕстьДанныеВерсии Тогда + МенеджерЗаписи.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект.Ссылка), Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(); + КонецЕсли; + + ДвоичныеДанные = СериализоватьОбъект(Объект); + ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ДатаВерсии = ТекущаяДатаСеанса(); + МенеджерЗаписи.ВерсияОбъекта = ХранилищеДанных; + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СведенияОВерсииОбъекта); + КонецЕсли; + + МенеджерЗаписи.Записать(); + +КонецПроцедуры + +// Записывает версию объекта в информационную базу. +// +// Параметры: +// Объект - для создания версии. +// +Процедура ПриСозданииВерсииОбъекта(Объект, РежимЗаписи) + + Перем НомерПоследнейВерсии, Комментарий; + + Если НЕ ОбъектВерсионируется(Объект, НомерПоследнейВерсии, РежимЗаписи = РежимЗаписиДокумента.Проведение + Или РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) Тогда + Возврат; + КонецЕсли; + + Если НЕ Объект.ДополнительныеСвойства.Свойство("ВерсионированиеОбъектовКомментарийКВерсии", Комментарий) Тогда + Комментарий = ""; + КонецЕсли; + + СведенияОВерсииОбъекта = Новый Структура; + СведенияОВерсииОбъекта.Вставить("НомерВерсии", Число(НомерПоследнейВерсии) + 1); + СведенияОВерсииОбъекта.Вставить("Комментарий", Комментарий); + + ИзмененаПроведенность = (РежимЗаписи = РежимЗаписиДокумента.Проведение И Не Объект.Проведен + Или РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения И Объект.Проведен); + СведенияОВерсииОбъекта.Вставить("ИзмененаПроведенность", ИзмененаПроведенность); + + СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта); + +КонецПроцедуры + +Процедура ЗаписатьДанныеТекущейВерсии(Ссылка, ОбменДаннымиЗагрузка = Ложь) + Перем НомерПоследнейВерсии; + + УстановитьПривилегированныйРежим(Истина); + + Если Не ОбъектВерсионируется(Ссылка, НомерПоследнейВерсии) Тогда + Возврат; + КонецЕсли; + + ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Ссылка), Новый СжатиеДанных(9)); + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Ссылка); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерПоследнейВерсии); + НаборЗаписей.Прочитать(); + + Для Каждого Запись Из НаборЗаписей Цикл + Запись.ВерсияОбъекта = ВерсияОбъекта; + КонецЦикла; + + Если ОбменДаннымиЗагрузка Тогда + НаборЗаписей.ДополнительныеСвойства.Вставить("РегистрироватьНаУзлахПлановОбменаПриОбновленииИБ", Ложь); + КонецЕсли; + НаборЗаписей.Записать(); +КонецПроцедуры + + +Функция ЗаписьОВерсииОбъекта(СсылкаНаОбъект, НомерВерсии) + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект); + НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); + НаборЗаписей.Прочитать(); + + Возврат НаборЗаписей; + +КонецФункции + +Процедура ПроверитьНаличиеПравНаИзменениеОбъекта(ОбъектМетаданных) + + Если Не ПривилегированныйРежим() И Не ПравоДоступа("Изменение", ОбъектМетаданных)Тогда + ТекстСообщения = НСтр("ru = 'Недостаточно прав на изменение ""%1"".'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ОбъектМетаданных.Представление()); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + +КонецПроцедуры + // Возвращает табличный документ, заполненный данными объекта. // // Параметры: @@ -1413,6 +1670,40 @@ КонецЕсли; КонецФункции +Процедура ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель) + + Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда + Запись = ЭлементДанных[0]; + + Если Не Запись.Синхронизируется Тогда + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Отказ = Ложь; + Объект = Запись.Объект.ПолучитьОбъект(); + МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); + МодульОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписью(Получатель.Метаданные().Имя, Объект, Отказ); + Если Отказ Или Не Объект.ОбменДанными.Получатели.Содержит(Получатель.Ссылка) Тогда + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + КонецЕсли; + + ДобавитьИнформациюОбУзле(Запись, Получатель); + + Если НомерПоследнейВерсии(Запись.Объект, Истина) = Запись.НомерВерсии Тогда + Запись.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Запись.Объект), Новый СжатиеДанных(9)); + Запись.РазмерДанных = РазмерДанных(Запись.ВерсияОбъекта); + Запись.ЕстьДанныеВерсии = Истина; + КонецЕсли; + + Запись.Смещение = КоличествоНесинхронизируемыхВерсий(Запись.Объект); + КонецЕсли; + +КонецПроцедуры + // Только для служебного использования. // Комментарий записывается, если пользователь является либо автором версии, либо администратором. Процедура ДобавитьКомментарийКВерсии(СсылкаНаОбъект, НомерВерсии, Комментарий) Экспорт @@ -1642,7 +1933,7 @@ // Любой реквизит "может оказаться" табличной частью, поэтому на всякий случай его запомним. ИмяТабличнойЧасти = ИмяРеквизита; - Если МетаданныеОбъекта.ТабличныеЧасти.Найти(ИмяТабличнойЧасти) <> Неопределено И ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда + Если МетаданныеТабличнойЧасти(МетаданныеОбъекта, ИмяТабличнойЧасти) <> Неопределено Тогда ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений); КонецЕсли; @@ -1665,14 +1956,12 @@ КонецЕсли; Если Не ЗначениеЗаполнено(НовоеЗР.Тип) Тогда - ОписаниеРеквизита = МетаданныеОбъекта.Реквизиты.Найти(НовоеЗР.НаименованиеРеквизита); + ОписаниеРеквизита = МетаданныеРеквизита(МетаданныеОбъекта, ИмяРеквизита); Если ОписаниеРеквизита = Неопределено Тогда - НаименованиеРеквизита = ПолучитьПредставлениеРеквизитаНаЯзыке(НовоеЗР.НаименованиеРеквизита); - Если ОбщегоНазначения.ЭтоСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, НаименованиеРеквизита) Тогда - ОписаниеРеквизита = МетаданныеОбъекта.СтандартныеРеквизиты[НаименованиеРеквизита]; - Иначе - ОписаниеРеквизита = Метаданные.ОбщиеРеквизиты.Найти(НаименованиеРеквизита); - КонецЕсли; + ОписаниеРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ИмяРеквизита); + КонецЕсли; + Если ОписаниеРеквизита = Неопределено И Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + ОписаниеРеквизита = МетаданныеОбъекта.ПризнакиУчета.Найти(ИмяРеквизита); КонецЕсли; Если ОписаниеРеквизита <> Неопределено @@ -1680,32 +1969,37 @@ НовоеЗР.Тип = ОписаниеРеквизита.Тип.Типы()[0]; КонецЕсли; КонецЕсли; - ИначеЕсли (УровеньЧтения = 3) И (ЧтениеXML.Имя = "Row") Тогда // Указатель на поле табличной части. + ИначеЕсли (УровеньЧтения = 3) И ЧтениеXML.Имя = "Row" Тогда // Указатель на поле табличной части. Если ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений); КонецЕсли; - ТабличныеЧасти[ИмяТабличнойЧасти].Добавить(); - ИначеЕсли УровеньЧтения = 4 Тогда // Указатель на поле табличной части. - ТипЗначенияПоляТЧ = ""; - ИмяПоляТЧ = ЧтениеXML.Имя; - Таблица = ТабличныеЧасти[ИмяТабличнойЧасти]; - Если Таблица.Колонки.Найти(ИмяПоляТЧ)= Неопределено Тогда - Таблица.Колонки.Добавить(ИмяПоляТЧ); - КонецЕсли; - - Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда - Пока ЧтениеXML.ПрочитатьАтрибут() Цикл - Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут - И ЧтениеXML.Имя = "xsi:type" Тогда - XMLТип = ЧтениеXML.Значение; - Если СтрНачинаетсяС(XMLТип, "xs:") Тогда - ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(Прав(XMLТип, СтрДлина(XMLТип)-3), "http://www.w3.org/2001/XMLSchema")); - Иначе - ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(XMLТип, "")); - КонецЕсли; - КонецЕсли; - КонецЦикла; + ИначеЕсли УровеньЧтения = 4 Тогда + Если ЧтениеXML.Имя = "v8:Type" Тогда + Если НовоеЗР.ЗначениеРеквизита = Неопределено Тогда + НовоеЗР.ЗначениеРеквизита = ""; + КонецЕсли; + Иначе // Указатель на поле табличной части. + ТипЗначенияПоляТЧ = ""; + ИмяПоляТЧ = ЧтениеXML.Имя; + Таблица = ТабличныеЧасти[ИмяТабличнойЧасти]; + Если Таблица.Колонки.Найти(ИмяПоляТЧ)= Неопределено Тогда + Таблица.Колонки.Добавить(ИмяПоляТЧ); + КонецЕсли; + + Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда + Пока ЧтениеXML.ПрочитатьАтрибут() Цикл + Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут + И ЧтениеXML.Имя = "xsi:type" Тогда + XMLТип = ЧтениеXML.Значение; + Если СтрНачинаетсяС(XMLТип, "xs:") Тогда + ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(Прав(XMLТип, СтрДлина(XMLТип)-3), "http://www.w3.org/2001/XMLSchema")); + Иначе + ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(XMLТип, "")); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда @@ -1719,39 +2013,61 @@ НовоеЗР.ЗначениеРеквизита = ЧтениеXML.Значение; КонецПопытки; ИначеЕсли (УровеньЧтения = 4) Тогда // значение реквизита - ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1); - - Если ТипЗначенияПоляТЧ = "" Тогда - ОписаниеРТЧ = Неопределено; - Если ТабличныеЧастиМТД.Найти(ИмяТабличнойЧасти) <> Неопределено Тогда - ОписаниеРТЧ = ТабличныеЧастиМТД[ИмяТабличнойЧасти].Реквизиты.Найти(ИмяПоляТЧ); - Если ОписаниеРТЧ <> Неопределено - И ОписаниеРТЧ.Тип.Типы().Количество() = 1 Тогда - ТипЗначенияПоляТЧ = ОписаниеРТЧ.Тип.Типы()[0]; + Если НовоеЗР.Тип = Тип("ОписаниеТипов") Тогда + ТипСтрокой = Строка(ИзXMLТипа(Новый ТипДанныхXML(ЧтениеXML.Значение, ""))); + Если ПустаяСтрока(ТипСтрокой) Тогда + ТипСтрокой = ЧтениеXML.Значение; + КонецЕсли; + Если Не ПустаяСтрока(НовоеЗР.ЗначениеРеквизита) Тогда + НовоеЗР.ЗначениеРеквизита = НовоеЗР.ЗначениеРеквизита + Символы.ПС; + КонецЕсли; + НовоеЗР.ЗначениеРеквизита = НовоеЗР.ЗначениеРеквизита + ТипСтрокой; + Иначе + Если ТипЗначенияПоляТЧ = "" Тогда + ОписаниеРеквизита = Неопределено; + МетаданныеТабличнойЧасти = МетаданныеТабличнойЧасти(МетаданныеОбъекта, ИмяТабличнойЧасти); + Если МетаданныеТабличнойЧасти <> Неопределено Тогда + ОписаниеРеквизита = МетаданныеРеквизитаТабличнойЧасти(МетаданныеТабличнойЧасти, ИмяПоляТЧ); + Если ОписаниеРеквизита = Неопределено И Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + ОписаниеРеквизита = МетаданныеОбъекта.ПризнакиУчетаСубконто.Найти(ИмяПоляТЧ); + КонецЕсли; + Если ОписаниеРеквизита <> Неопределено + И ОписаниеРеквизита.Тип.Типы().Количество() = 1 Тогда + ТипЗначенияПоляТЧ = ОписаниеРеквизита.Тип.Типы()[0]; + КонецЕсли; КонецЕсли; КонецЕсли; + ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1); + ПоследняяСтрока[ИмяПоляТЧ] = ?(ЗначениеЗаполнено(ТипЗначенияПоляТЧ), XMLЗначение(ТипЗначенияПоляТЧ, ЧтениеXML.Значение), ЧтениеXML.Значение); КонецЕсли; - - ПоследняяСтрока[ИмяПоляТЧ] = ?(ЗначениеЗаполнено(ТипЗначенияПоляТЧ), XMLЗначение(ТипЗначенияПоляТЧ, ЧтениеXML.Значение), ЧтениеXML.Значение); КонецЕсли; КонецЕсли; КонецЦикла; - // Й-й этап: из списка реквизитов исключаем табличные части. + // Из списка реквизитов исключаем табличные части. Для Каждого Элемент Из ТабличныеЧасти Цикл ЗначенияРеквизитов.Удалить(ЗначенияРеквизитов.Найти(Элемент.Ключ)); КонецЦикла; - // ТабличныеЧастиМТД - Для Каждого ЭлементСоответствия Из ТабличныеЧасти Цикл - Таблица = ЭлементСоответствия.Значение; + + // Заполнение колонок таблицы в случае, когда в объекте табличная часть пустая, и имена колонок не были прочитаны. + Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл + ИмяТаблицы = ТабличнаяЧасть.Ключ; + Таблица = ТабличнаяЧасть.Значение; Если Таблица.Колонки.Количество() = 0 Тогда - ТаблицаМТД = ТабличныеЧастиМТД.Найти(ЭлементСоответствия.Ключ); - Если ТаблицаМТД <> Неопределено Тогда - Для Каждого ОписаниеКолонки Из ТаблицаМТД.Реквизиты Цикл + МетаданныеТаблицы = МетаданныеТабличнойЧасти(МетаданныеОбъекта, ИмяТаблицы); + Если МетаданныеТаблицы <> Неопределено Тогда + Для Каждого ОписаниеКолонки Из РеквизитыТабличнойЧасти(МетаданныеТаблицы) Цикл Если Таблица.Колонки.Найти(ОписаниеКолонки.Имя)= Неопределено Тогда Таблица.Колонки.Добавить(ОписаниеКолонки.Имя); КонецЕсли; КонецЦикла; + Если Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + Для Каждого ОписаниеКолонки Из МетаданныеОбъекта.ПризнакиУчетаСубконто Цикл + Если Таблица.Колонки.Найти(ОписаниеКолонки.Имя)= Неопределено Тогда + Таблица.Колонки.Добавить(ОписаниеКолонки.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; @@ -1788,36 +2104,51 @@ КонецФункции -// Получает представление наименования системного реквизита. -// -Функция ПолучитьПредставлениеРеквизитаНаЯзыке(Знач ИмяРеквизита) - - Если ИмяРеквизита = "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'"); - ИначеЕсли ИмяРеквизита = "Owner" Тогда - Возврат НСтр("ru = 'Владелец'; en='Owner'"); - Иначе - Возврат ИмяРеквизита; +Функция МетаданныеРеквизита(МетаданныеОбъекта, ИмяРеквизита) + Результат = МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита); + Если Результат = Неопределено Тогда + Попытка + Результат = МетаданныеОбъекта.СтандартныеРеквизиты[ИмяРеквизита]; + Исключение + Результат = Неопределено; + КонецПопытки; КонецЕсли; - + Возврат Результат; +КонецФункции + +Функция МетаданныеТабличнойЧасти(МетаданныеОбъекта, ИмяТабличнойЧасти) Экспорт + Результат = МетаданныеОбъекта.ТабличныеЧасти.Найти(ИмяТабличнойЧасти); + Если Результат = Неопределено Тогда + Попытка + Результат = МетаданныеОбъекта.СтандартныеТабличныеЧасти[ИмяТабличнойЧасти]; + Исключение + Результат = Неопределено; + КонецПопытки; + КонецЕсли; + Возврат Результат; +КонецФункции + +Функция МетаданныеРеквизитаТабличнойЧасти(МетаданныеТабличнойЧасти, ИмяРеквизита) Экспорт + Результат = Неопределено; + Если ТипЗнч(МетаданныеТабличнойЧасти) = Тип("ОписаниеСтандартнойТабличнойЧасти") Тогда + Попытка + Результат = МетаданныеТабличнойЧасти.СтандартныеРеквизиты[ИмяРеквизита]; + Исключение + Результат = Неопределено; + КонецПопытки; + Иначе + Результат = МетаданныеТабличнойЧасти.Реквизиты.Найти(ИмяРеквизита); + КонецЕсли; + Возврат Результат; +КонецФункции + +Функция РеквизитыТабличнойЧасти(МетаданныеТабличнойЧасти) + Если ТипЗнч(МетаданныеТабличнойЧасти) = Тип("ОписаниеСтандартнойТабличнойЧасти") Тогда + Результат = МетаданныеТабличнойЧасти.СтандартныеРеквизиты; + Иначе + Результат = МетаданныеТабличнойЧасти.Реквизиты; + КонецЕсли; + Возврат Результат; КонецФункции Процедура СформироватьОтчетПоВерсииОбъекта(ТабличныйДокумент, ОписаниеОбъекта, СсылкаНаОбъект) @@ -1839,7 +2170,7 @@ КонецЕсли; ЧислоВыведенныхСтрок = ВывестиРеквизитыПоРазобранномуОбъекту(ТабличныйДокумент, ОписаниеОбъекта, СсылкаНаОбъект); - ЧислоВыведенныхСтрок = ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТабличныйДокумент, ОписаниеОбъекта, ЧислоВыведенныхСтрок + 7, СсылкаНаОбъект); + ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТабличныйДокумент, ОписаниеОбъекта, ЧислоВыведенныхСтрок + 7, СсылкаНаОбъект); ВывестиТабличныеДокументыПоРазобранномуОбъекту(ТабличныйДокумент, ОписаниеОбъекта); Иначе СформироватьПоСтандартномуМакету(ТабличныйДокумент, Макет, ОписаниеОбъекта, ОписаниеОбъекта.Описание, СсылкаНаОбъект); @@ -1847,13 +2178,6 @@ КонецПроцедуры -// Формирует отчет по объекту, используя стандартный макет. -// -// Параметры: -// ТЧОтчета - ТабличныйДокумент - табличный документ, в который будет выводится отчет. -// ВерсияОбъекта - СправочникОбъект,ДокументОбъект - объект, данные которого необходимо отобразить в отчете. -// НаименованиеОбъекта - Строка - наименование объекта, по которому. -// Процедура СформироватьПоСтандартномуМакету(ТЧОтчета, Макет, ВерсияОбъекта, Знач ОписаниеВерсии, СсылкаНаОбъект) МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); @@ -1883,34 +2207,60 @@ Шапка = Макет.ПолучитьОбласть("Шапка"); Реквизиты = Новый Структура; Для Каждого ОписаниеРеквизита Из ВерсияОбъекта.Реквизиты Цикл - ИмяРеквизита = ПолучитьПредставлениеРеквизитаНаЯзыке(ОписаниеРеквизита.НаименованиеРеквизита); + ИмяРеквизита = ОписаниеРеквизита.НаименованиеРеквизита; + МетаданныеРеквизита = МетаданныеРеквизита(МетаданныеОбъекта, ОписаниеРеквизита.НаименованиеРеквизита); + Если МетаданныеРеквизита = Неопределено И Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + МетаданныеРеквизита = МетаданныеОбъекта.ПризнакиУчета.Найти(ОписаниеРеквизита.НаименованиеРеквизита); + КонецЕсли; + Если МетаданныеРеквизита <> Неопределено Тогда + ИмяРеквизита = МетаданныеРеквизита.Имя; + КонецЕсли; + ЗначениеРеквизита = ОписаниеРеквизита.ЗначениеРеквизита; Реквизиты.Вставить(ИмяРеквизита, ЗначениеРеквизита); КонецЦикла; Шапка.Параметры.Заполнить(Реквизиты); ТЧОтчета.Вывести(Шапка); - Для Каждого МетаданныеТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл - Если ВерсияОбъекта.ТабличныеЧасти[МетаданныеТЧ.Имя].Количество() > 0 Тогда - ИмяОбласти = МетаданныеТЧ.Имя + "Шапка"; - Если Макет.Области.Найти(ИмяОбласти) <> Неопределено Тогда - Область = Макет.ПолучитьОбласть(ИмяОбласти); - Иначе - Продолжить; - КонецЕсли; - ТЧОтчета.Вывести(Область); - - ИмяОбласти = МетаданныеТЧ.Имя; - Если Макет.Области.Найти(ИмяОбласти) <> Неопределено Тогда - ОбластьДеталиПриходаТовара = Макет.ПолучитьОбласть(ИмяОбласти); - Иначе - Продолжить; - КонецЕсли; - Для Каждого ТекСтрокаДеталиПриходаТовара Из ВерсияОбъекта.ТабличныеЧасти[МетаданныеТЧ.Имя] Цикл - ОбластьДеталиПриходаТовара.Параметры.Заполнить(ТекСтрокаДеталиПриходаТовара); - ТЧОтчета.Вывести(ОбластьДеталиПриходаТовара); - КонецЦикла; + ИменаТабличныхЧастей = Новый Массив; + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл + ИменаТабличныхЧастей.Добавить(ТабличнаяЧасть.Имя); + КонецЦикла; + Если Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл + ИменаТабличныхЧастей.Добавить(ТабличнаяЧасть.Имя); + КонецЦикла; + КонецЕсли; + + Для Каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл + Если ВерсияОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Количество() = 0 Тогда + Продолжить; КонецЕсли; + + ТабличнаяЧасть = ВерсияОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Скопировать(); + ТабличнаяЧасть.Колонки.Добавить("НомерСтроки"); + + ИмяОбласти = ИмяТабличнойЧасти + "Шапка"; + Если Макет.Области.Найти(ИмяОбласти) <> Неопределено Тогда + Область = Макет.ПолучитьОбласть(ИмяОбласти); + Иначе + Продолжить; + КонецЕсли; + ТЧОтчета.Вывести(Область); + + ИмяОбласти = ИмяТабличнойЧасти; + Если Макет.Области.Найти(ИмяОбласти) <> Неопределено Тогда + Область = Макет.ПолучитьОбласть(ИмяОбласти); + Иначе + Продолжить; + КонецЕсли; + НомерСтроки = 0; + Для Каждого СтрокаТаблицы Из ТабличнаяЧасть Цикл + НомерСтроки = НомерСтроки + 1; + СтрокаТаблицы.НомерСтроки = НомерСтроки; + Область.Параметры.Заполнить(СтрокаТаблицы); + ТЧОтчета.Вывести(Область); + КонецЦикла; КонецЦикла; Если ВерсияОбъекта.Свойство("ТабличныеДокументы") Тогда @@ -2013,108 +2363,107 @@ // Выводит табличные части по разобранному объекту, при выводе единственного объекта. // -Функция ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта, НомерСтрокиВывода, СсылкаНаОбъект) +Процедура ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта, НомерСтрокиВывода, СсылкаНаОбъект) - ЧислоВыводимыхСтрок = 0; - - Если ВерсияОбъекта.ТабличныеЧасти.Количество() <> 0 Тогда - - Для Каждого СтрокаТабличнаяЧасть Из ВерсияОбъекта.ТабличныеЧасти Цикл - НаименованиеТабличнойЧасти = СтрокаТабличнаяЧасть.Ключ; - ТабличнаяЧасть = СтрокаТабличнаяЧасть.Значение; - Если ТабличнаяЧасть.Количество() > 0 Тогда - - МетаданныеТЧ = СсылкаНаОбъект.Метаданные().ТабличныеЧасти.Найти(НаименованиеТабличнойЧасти); - - СинонимТЧ = НаименованиеТабличнойЧасти; - Если МетаданныеТЧ <> Неопределено Тогда - СинонимТЧ = МетаданныеТЧ.Представление(); - КонецЕсли; - - Секция = ТЧОтчета.ПолучитьОбласть("R" + Строка(НомерСтрокиВывода)); - ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C100", " "); - ОбластьВывода = ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C2", СинонимТЧ, 11, Истина); - ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").СоздатьФорматСтрок(); - ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").ШиринаКолонки = Окр(СтрДлина(СинонимТЧ)*2, 0, РежимОкругления.Окр15как20); - ТЧОтчета.НачатьГруппуСтрок("ГруппаСтрок"); - - ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); - - ЧислоВыводимыхСтрок = ЧислоВыводимыхСтрок + 1; - - НомерСтрокиВывода = НомерСтрокиВывода + 3; - - ДобавляемаяТЧ = Новый ТабличныйДокумент; - - ДобавляемаяТЧ.Присоединить(СформироватьПустойСектор(ТабличнаяЧасть.Количество()+1)); - - НомерКолонки = 2; - - СоответствиеРазмерностиКолонок = Новый Соответствие; - - Секция = Новый ТабличныйДокумент; - ОбластьСекции = Секция.Область("R1C1"); - УстановитьСвойстваТекста(ОбластьСекции, "N", , Истина, Истина); - ОбластьСекции.ЦветФона = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; - - НомерСтроки = 1; - Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл - НомерСтроки = НомерСтроки + 1; - УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), Формат(НомерСтроки-1, "ЧГ=0"), , Ложь, Истина); - КонецЦикла; - ДобавляемаяТЧ.Присоединить(Секция); - - НомерКолонки = 3; - - Для Каждого КолонкаТабличнойЧасти Из ТабличнаяЧасть.Колонки Цикл - Секция = Новый ТабличныйДокумент; - НаименованиеПоля = КолонкаТабличнойЧасти.Имя; - - ОписаниеПоля = Неопределено; - Если МетаданныеТЧ <> Неопределено Тогда - ОписаниеПоля = МетаданныеТЧ.Реквизиты.Найти(НаименованиеПоля); - КонецЕсли; - - Если ОписаниеПоля = Неопределено Или Не ЗначениеЗаполнено(ОписаниеПоля.Синоним) Тогда - ВыводимоеНаименованиеПоля = НаименованиеПоля; - Иначе - ВыводимоеНаименованиеПоля = ОписаниеПоля.Синоним; - КонецЕсли; - ЦветЗаголовкаКолонки = ?(ОписаниеПоля = Неопределено, ЦветаСтиля.ЗаголовокУдаленногоРеквизитаФон, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - СекцияОбласти = Секция.Область("R1C1"); - УстановитьСвойстваТекста(СекцияОбласти, ВыводимоеНаименованиеПоля, , Истина, Истина); - СекцияОбласти.ЦветФона = ЦветЗаголовкаКолонки; - СоответствиеРазмерностиКолонок.Вставить(НомерКолонки, СтрДлина(НаименованиеПоля) + 4); - НомерСтроки = 1; - Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл - НомерСтроки = НомерСтроки + 1; - Значение = ?(СтрокаТабличнойЧасти[НаименованиеПоля] = Неопределено, "", СтрокаТабличнойЧасти[НаименованиеПоля]); - ПредставлениеЗначения = ПредставлениеЗначенияРеквизита(Значение, ОписаниеПоля); - - УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), ПредставлениеЗначения, , , Истина); - Если СтрДлина(ПредставлениеЗначения) > (СоответствиеРазмерностиКолонок[НомерКолонки] - 4) Тогда - СоответствиеРазмерностиКолонок[НомерКолонки] = СтрДлина(ПредставлениеЗначения) + 4; - КонецЕсли; - КонецЦикла; - - ДобавляемаяТЧ.Присоединить(Секция); - НомерКолонки = НомерКолонки + 1; - КонецЦикла; - - ОбластьВывода = ТЧОтчета.Вывести(ДобавляемаяТЧ); - ТЧОтчета.Область(ОбластьВывода.Верх, 1, ОбластьВывода.Низ, НомерКолонки).СоздатьФорматСтрок(); - ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").ШиринаКолонки = 7; - Для ТекущийНомерКолонки = 3 По НомерКолонки-1 Цикл - ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C" + Формат(ТекущийНомерКолонки, "ЧГ=0")).ШиринаКолонки = СоответствиеРазмерностиКолонок[ТекущийНомерКолонки]; - КонецЦикла; - ТЧОтчета.ЗакончитьГруппуСтрок(); - - КонецЕсли; - КонецЦикла; - + Если ВерсияОбъекта.ТабличныеЧасти.Количество() = 0 Тогда + Возврат; КонецЕсли; -КонецФункции + МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); + ЧислоВыводимыхСтрок = 0; + + Для Каждого СтрокаТабличнаяЧасть Из ВерсияОбъекта.ТабличныеЧасти Цикл + НаименованиеТабличнойЧасти = СтрокаТабличнаяЧасть.Ключ; + ТабличнаяЧасть = СтрокаТабличнаяЧасть.Значение; + Если ТабличнаяЧасть.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + МетаданныеТЧ = МетаданныеТабличнойЧасти(МетаданныеОбъекта, НаименованиеТабличнойЧасти); + СинонимТЧ = НаименованиеТабличнойЧасти; + Если МетаданныеТЧ <> Неопределено Тогда + СинонимТЧ = МетаданныеТЧ.Представление(); + КонецЕсли; + + Секция = ТЧОтчета.ПолучитьОбласть("R" + Строка(НомерСтрокиВывода)); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C100", " "); + ОбластьВывода = ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C2", СинонимТЧ, 11, Истина); + ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").СоздатьФорматСтрок(); + ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").ШиринаКолонки = Окр(СтрДлина(СинонимТЧ)*2, 0, РежимОкругления.Окр15как20); + ТЧОтчета.НачатьГруппуСтрок("ГруппаСтрок"); + + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); + ЧислоВыводимыхСтрок = ЧислоВыводимыхСтрок + 1; + НомерСтрокиВывода = НомерСтрокиВывода + 3; + + ДобавляемаяТЧ = Новый ТабличныйДокумент; + ДобавляемаяТЧ.Присоединить(СформироватьПустойСектор(ТабличнаяЧасть.Количество()+1)); + + НомерКолонки = 2; + СоответствиеРазмерностиКолонок = Новый Соответствие; + + Секция = Новый ТабличныйДокумент; + ОбластьСекции = Секция.Область("R1C1"); + УстановитьСвойстваТекста(ОбластьСекции, "N", , Истина, Истина); + ОбластьСекции.ЦветФона = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; + + НомерСтроки = 1; + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл + НомерСтроки = НомерСтроки + 1; + УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), Формат(НомерСтроки-1, "ЧГ=0"), , Ложь, Истина); + КонецЦикла; + ДобавляемаяТЧ.Присоединить(Секция); + + НомерКолонки = 3; + + Для Каждого КолонкаТабличнойЧасти Из ТабличнаяЧасть.Колонки Цикл + Секция = Новый ТабличныйДокумент; + НаименованиеПоля = КолонкаТабличнойЧасти.Имя; + + ОписаниеПоля = Неопределено; + Если МетаданныеТЧ <> Неопределено Тогда + ОписаниеПоля = МетаданныеРеквизитаТабличнойЧасти(МетаданныеТЧ, НаименованиеПоля); + КонецЕсли; + Если ОписаниеПоля = Неопределено И Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда + ОписаниеПоля = МетаданныеОбъекта.ПризнакиУчетаСубконто.Найти(НаименованиеПоля); + КонецЕсли; + Если ОписаниеПоля = Неопределено Тогда + ВыводимоеНаименованиеПоля = НаименованиеПоля; + Иначе + ВыводимоеНаименованиеПоля = ОписаниеПоля.Представление(); + КонецЕсли; + + ЦветЗаголовкаКолонки = ?(ОписаниеПоля = Неопределено, ЦветаСтиля.ЗаголовокУдаленногоРеквизитаФон, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + СекцияОбласти = Секция.Область("R1C1"); + УстановитьСвойстваТекста(СекцияОбласти, ВыводимоеНаименованиеПоля, , Истина, Истина); + СекцияОбласти.ЦветФона = ЦветЗаголовкаКолонки; + СоответствиеРазмерностиКолонок.Вставить(НомерКолонки, СтрДлина(НаименованиеПоля) + 4); + НомерСтроки = 1; + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл + НомерСтроки = НомерСтроки + 1; + Значение = ?(СтрокаТабличнойЧасти[НаименованиеПоля] = Неопределено, "", СтрокаТабличнойЧасти[НаименованиеПоля]); + ПредставлениеЗначения = ПредставлениеЗначенияРеквизита(Значение, ОписаниеПоля); + + УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), ПредставлениеЗначения, , , Истина); + Если СтрДлина(ПредставлениеЗначения) > (СоответствиеРазмерностиКолонок[НомерКолонки] - 4) Тогда + СоответствиеРазмерностиКолонок[НомерКолонки] = СтрДлина(ПредставлениеЗначения) + 4; + КонецЕсли; + КонецЦикла; + + ДобавляемаяТЧ.Присоединить(Секция); + НомерКолонки = НомерКолонки + 1; + КонецЦикла; + + ОбластьВывода = ТЧОтчета.Вывести(ДобавляемаяТЧ); + ТЧОтчета.Область(ОбластьВывода.Верх, 1, ОбластьВывода.Низ, НомерКолонки).СоздатьФорматСтрок(); + ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").ШиринаКолонки = 7; + Для ТекущийНомерКолонки = 3 По НомерКолонки-1 Цикл + ТЧОтчета.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C" + Формат(ТекущийНомерКолонки, "ЧГ=0")).ШиринаКолонки = СоответствиеРазмерностиКолонок[ТекущийНомерКолонки]; + КонецЦикла; + ТЧОтчета.ЗакончитьГруппуСтрок(); + КонецЦикла; + +КонецПроцедуры // Выводит текст в область табличного документа с определенным оформлением. // @@ -2281,18 +2630,7 @@ ВыводитьРеквизит = Истина; - ИмяРеквизита = ПолучитьПредставлениеРеквизитаНаЯзыке(ИмяРеквизита); - ОписаниеРеквизита = СсылкаНаОбъект.Метаданные().Реквизиты.Найти(ИмяРеквизита); - - Если ОписаниеРеквизита = Неопределено Тогда - Для Каждого ОписаниеСтандартногоРеквизита Из СсылкаНаОбъект.Метаданные().СтандартныеРеквизиты Цикл - Если ОписаниеСтандартногоРеквизита.Имя = ИмяРеквизита Тогда - ОписаниеРеквизита = ОписаниеСтандартногоРеквизита; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - + ОписаниеРеквизита = МетаданныеРеквизита(СсылкаНаОбъект.Метаданные(), ИмяРеквизита); Если ОписаниеРеквизита = Неопределено Тогда ОписаниеРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ИмяРеквизита); КонецЕсли; @@ -2402,389 +2740,11 @@ Реквизиты = Новый Массив; Реквизиты.Добавить("Ref"); Реквизиты.Добавить("IsFolder"); + Реквизиты.Добавить("PredefinedDataName"); Возврат Реквизиты; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт - - Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.ПолноеИмя()); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// -Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - - Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда - ПрочитатьИнформациюОбУзле(ЭлементДанных[0]); - - Объект = ЭлементДанных.Отбор.Объект.Значение; - КоличествоНесинхронизируемыхВерсий = КоличествоНесинхронизируемыхВерсий(Объект); - НомерВерсии = ЭлементДанных.Отбор.НомерВерсии.Значение - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; - ЭлементДанных[0].ВерсияВладелец = ЭлементДанных[0].ВерсияВладелец - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(ЭлементДанных.Отбор.Объект.Значение); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); - НаборЗаписей.Прочитать(); - - Если ОбщегоНазначения.ЗначениеВСтрокуXML(ЭлементДанных) = ОбщегоНазначения.ЗначениеВСтрокуXML(НаборЗаписей) Тогда - // Считаем, что нет коллизии. - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - ЕстьКоллизия = ПланыОбмена.ИзменениеЗарегистрировано(Отправитель.Ссылка, Объект); - - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии; - Если Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета") - И Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] <> Неопределено Тогда - ЕстьКоллизия = Истина; - Если Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] = "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе" Тогда - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; - Иначе - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; - КонецЕсли; - КонецЕсли; - - Если Не ЕстьКоллизия Тогда - // Если объект не был изменен, то версия перезаписывается без проверки, так как неизвестно, - // был ли изменен объект в узле-отправителе. - - Если НаборЗаписей.Количество() = 0 Тогда - Запись = НаборЗаписей.Добавить(); - Запись.Объект = Объект; - Запись.НомерВерсии = НомерВерсии; - Иначе - Запись = НаборЗаписей[0]; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0], , "Объект,НомерВерсии"); - Запись.НомерВерсии = НомерВерсии; - НаборЗаписей.Записать(); - ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); - - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - Если ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии Тогда - ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка); - Если ВерсииКВыгрузке.Количество() = 0 Тогда - Возврат; - КонецЕсли; - МинимальныйНомерВерсии = ВерсииКВыгрузке[0].НомерВерсии; - Для Счетчик = 1 По ВерсииКВыгрузке.Количество() - 1 Цикл - Если ВерсииКВыгрузке[Счетчик - 1].НомерВерсии - ВерсииКВыгрузке[Счетчик].НомерВерсии = 1 Тогда - МинимальныйНомерВерсии = Мин(МинимальныйНомерВерсии, ВерсииКВыгрузке[Счетчик].НомерВерсии); - Иначе - Прервать; - КонецЕсли; - КонецЦикла; - - Если МинимальныйНомерВерсии > НомерВерсии Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - КоллизииВерсийОбъектов = Новый Соответствие; - Если Отправитель.ДополнительныеСвойства.Свойство("КоллизииВерсийОбъектов") Тогда - КоллизииВерсийОбъектов = Отправитель.ДополнительныеСвойства.КоллизииВерсийОбъектов; - Иначе - Отправитель.ДополнительныеСвойства.Вставить("КоллизииВерсийОбъектов", КоллизииВерсийОбъектов); - КонецЕсли; - - НомерВерсииСКоллизией = КоллизииВерсийОбъектов[Объект]; - НомерПоследнейВерсии = НомерПоследнейВерсии(Объект); - ОбновитьВерсиюСКоллизией = Истина; - Если НомерВерсииСКоллизией = Неопределено Тогда - НомерВерсииСКоллизией = НомерПоследнейВерсии + 1; - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); - Запись = НаборЗаписей.Добавить(); - ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]); - Запись.НомерВерсии = НомерВерсииСКоллизией; - Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; - Запись.ДатаВерсии = ТекущаяДатаСеанса(); - Запись.АвторВерсии = Отправитель.Ссылка; - Запись.Узел = ОбщегоНазначения.ПредметСтрокой(Запись.АвторВерсии); - Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); - НаборЗаписей.Записать(); - НомерПоследнейВерсии = НомерВерсииСКоллизией; - КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией); - ОбновитьВерсиюСКоллизией = Ложь; - КонецЕсли; - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерПоследнейВерсии + 1); - Запись = НаборЗаписей.Добавить(); - ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]); - Запись.НомерВерсии = НомерПоследнейВерсии + 1; - Запись.ВерсияВладелец = НомерВерсииСКоллизией; - Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; - НаборЗаписей.Записать(); - - Если ОбновитьВерсиюСКоллизией Тогда - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); - НаборЗаписей.Прочитать(); - Для Каждого Запись Из НаборЗаписей Цикл - Запись.КонтрольнаяСумма = ЭлементДанных[0].КонтрольнаяСумма; - Запись.ВерсияОбъекта = ЭлементДанных[0].ВерсияОбъекта; - Запись.РазмерДанных = ЭлементДанных[0].РазмерДанных; - Запись.ЕстьДанныеВерсии = ЭлементДанных[0].ЕстьДанныеВерсии; - КонецЦикла; - НаборЗаписей.Записать(); - КонецЕсли; - - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - КонецЕсли; - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// -Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - - Если Отправитель = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда - ПрочитатьИнформациюОбУзле(ЭлементДанных[0]); - - Объект = ЭлементДанных.Отбор.Объект.Значение; - КоличествоНесинхронизируемыхВерсий = КоличествоНесинхронизируемыхВерсий(Объект); - НомерВерсии = ЭлементДанных.Отбор.НомерВерсии.Значение - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; - ЭлементДанных[0].ВерсияВладелец = ЭлементДанных[0].ВерсияВладелец - ЭлементДанных[0].Смещение + КоличествоНесинхронизируемыхВерсий; - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии); - НаборЗаписей.Прочитать(); - - Если ОбщегоНазначения.ЗначениеВСтрокуXML(ЭлементДанных) = ОбщегоНазначения.ЗначениеВСтрокуXML(НаборЗаписей) Тогда - // Считаем, что нет коллизии. - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - ЕстьКоллизия = Объект.ПолучитьОбъект() <> Неопределено И ПланыОбмена.ИзменениеЗарегистрировано(Отправитель.Ссылка, Объект); - - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии; - Если Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета") - И Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] <> Неопределено Тогда - ЕстьКоллизия = Истина; - Если Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] = "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе" Тогда - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; - Иначе - ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; - КонецЕсли; - КонецЕсли; - - ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка); - Для Каждого ВерсияКВыгрузке Из ВерсииКВыгрузке Цикл - Если ВерсияКВыгрузке.НомерВерсии = НомерВерсии Тогда - ЕстьКоллизия = Истина; - КонецЕсли; - КонецЦикла; - - Если Не ЕстьКоллизия Тогда - // Если объект не был изменен, то версия перезаписывается без проверки, так как неизвестно, - // был ли изменен объект в узле-отправителе. - Если НаборЗаписей.Количество() = 0 Тогда - Запись = НаборЗаписей.Добавить(); - Запись.Объект = Объект; - Запись.НомерВерсии = НомерВерсии; - Иначе - Запись = НаборЗаписей[0]; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0], , "Объект,НомерВерсии"); - НаборЗаписей.Записать(); - ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - НомерПоследнейВерсии = НомерПоследнейВерсии(Объект); - ПоследняяВерсия = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - ПоследняяВерсия.Объект = Объект; - ПоследняяВерсия.НомерВерсии = НомерПоследнейВерсии; - ПоследняяВерсия.Прочитать(); - Если Не ПоследняяВерсия.ЕстьДанныеВерсии Тогда - ПоследняяВерсия.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Объект), Новый СжатиеДанных(9)); - ПоследняяВерсия.Записать(); - КонецЕсли; - - Если ВерсииКВыгрузке.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого ОписаниеВерсии Из ВерсииКВыгрузке Цикл - Если ОписаниеВерсии.НомерВерсии >= НомерВерсии Тогда - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(ОписаниеВерсии.НомерВерсии); - НаборЗаписей.Прочитать(); - ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель.Ссылка, НаборЗаписей); - КонецЕсли; - КонецЦикла; - - КоллизииВерсийОбъектов = Новый Соответствие; - Если Отправитель.ДополнительныеСвойства.Свойство("КоллизииВерсийОбъектов") Тогда - КоллизииВерсийОбъектов = Отправитель.ДополнительныеСвойства.КоллизииВерсийОбъектов; - Иначе - Отправитель.ДополнительныеСвойства.Вставить("КоллизииВерсийОбъектов", КоллизииВерсийОбъектов); - КонецЕсли; - - НомерВерсииСКоллизией = КоллизииВерсийОбъектов[Объект]; - СдвигНомераВерсии = 1; - УстановитьВладельцаНепринятыхВерсий = Ложь; - Если НомерВерсииСКоллизией = Неопределено Тогда - СдвигНомераВерсии = 2; - НомерВерсииСКоллизией = НомерВерсии + 1; - УстановитьВладельцаНепринятыхВерсий = Истина; - КонецЕсли; - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Прочитать(); - ВерсииОбъекта = НаборЗаписей.Выгрузить(); - Для Каждого Версия Из ВерсииОбъекта Цикл - НаборЗаписей.Отбор.НомерВерсии.Установить(Версия.НомерВерсии); - НаборЗаписей.Прочитать(); - Запись = НаборЗаписей[0]; - Записать = Ложь; - Если Запись.ВерсияВладелец >= НомерВерсии Тогда - Запись.ВерсияВладелец = Запись.ВерсияВладелец + СдвигНомераВерсии; - Записать = Истина; - КонецЕсли; - Если Запись.НомерВерсии >= НомерВерсии Тогда - Запись.НомерВерсии = Запись.НомерВерсии + СдвигНомераВерсии; - Запись.ТипВерсииОбъекта = ТипВерсииОбъекта; - Если УстановитьВладельцаНепринятыхВерсий И Не ЗначениеЗаполнено(Запись.ВерсияВладелец) Тогда - Запись.ВерсияВладелец = НомерВерсииСКоллизией; - КонецЕсли; - Записать = Истина; - КонецЕсли; - Если Записать Тогда - Записи = НаборЗаписей.Выгрузить(); - НаборЗаписей.Очистить(); - НаборЗаписей.Записать(); - НаборЗаписей.Отбор.НомерВерсии.Установить(Записи[0].НомерВерсии); - НаборЗаписей.Загрузить(Записи); - НаборЗаписей.Записать(); - КонецЕсли; - КонецЦикла; - - Если КоллизииВерсийОбъектов[Объект] = Неопределено Тогда - НомерВерсииСКоллизией = НомерВерсии + 1; - - НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Объект.Установить(Объект); - НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией); - Запись = НаборЗаписей.Добавить(); - - ПоследняяВерсияКВыгрузке = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); - ПоследняяВерсияКВыгрузке.Объект = Объект; - ПоследняяВерсияКВыгрузке.НомерВерсии = ВерсииКВыгрузке[0].НомерВерсии + СдвигНомераВерсии; - ПоследняяВерсияКВыгрузке.Прочитать(); - - ЗаполнитьЗначенияСвойств(Запись, ПоследняяВерсияКВыгрузке, , "ВерсияВладелец"); - Запись.НомерВерсии = НомерВерсииСКоллизией; - Запись.ДатаВерсии = ТекущаяДатаСеанса(); - Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); - Запись.АвторВерсии = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Отправитель.Ссылка).ЭтотУзел(); - - Если Не Запись.ЕстьДанныеВерсии Тогда - Запись.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Запись.Объект), Новый СжатиеДанных(9)) - КонецЕсли; - НаборЗаписей.Записать(); - - КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт - - ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - - ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель); - -КонецПроцедуры - -Процедура ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель) - - Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда - Запись = ЭлементДанных[0]; - - Если Не Запись.Синхронизируется Тогда - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - Отказ = Ложь; - Объект = Запись.Объект.ПолучитьОбъект(); - МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); - МодульОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписью(Получатель.Метаданные().Имя, Объект, Отказ); - Если Отказ Или Не Объект.ОбменДанными.Получатели.Содержит(Получатель.Ссылка) Тогда - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - КонецЕсли; - - ДобавитьИнформациюОбУзле(Запись, Получатель); - - Если НомерПоследнейВерсии(Запись.Объект, Истина) = Запись.НомерВерсии Тогда - Запись.ВерсияОбъекта = Новый ХранилищеЗначения(ДанныеДляХранения(Запись.Объект), Новый СжатиеДанных(9)); - Запись.РазмерДанных = РазмерДанных(Запись.ВерсияОбъекта); - Запись.ЕстьДанныеВерсии = Истина; - КонецЕсли; - - Запись.Смещение = КоличествоНесинхронизируемыхВерсий(Запись.Объект); - КонецЕсли; - -КонецПроцедуры - Функция РазмерДанных(Данные) Экспорт Возврат Base64Значение(СериализаторXDTO.XMLСтрока(Данные)).Размер(); КонецФункции @@ -2913,10 +2873,6 @@ Функция ПерейтиНаВерсиюСервер(Ссылка, НомерВерсии, ТекстСообщенияОбОшибке, ОтменаПроведения = Ложь) Экспорт - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); - КонецЕсли; - ПользовательскоеПредставлениеНомера = НомерВерсииВИерархии(Ссылка, НомерВерсии); Информация = СведенияОВерсииОбъекта(Ссылка, НомерВерсии); @@ -2947,7 +2903,7 @@ РежимЗаписи = Неопределено; ИдентификаторОшибки = "ОшибкаВосстановления"; - Если ОбщегоНазначения.ЭтоДокумент(Объект.Метаданные()) Тогда + Если ОбщегоНазначения.ЭтоДокумент(Объект.Метаданные()) И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда Если Объект.Проведен И Не ОтменаПроведения Тогда РежимЗаписи = РежимЗаписиДокумента.Проведение; Иначе diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектовКлиент/Module.bsl index b6d4f49c3..a9bbaace4 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Версионирование объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает отчет по версиям объекта в режиме сравнения версий. @@ -43,9 +38,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - // Открывает отчет о версии или о сравнении версий. // // Параметры: @@ -53,7 +45,7 @@ // СравниваемыеВерсии - Массив - Содержит массив сравниваемых версий, // если версия одна, то открывается отчет о версии. // -Процедура ПриОткрытииФормыОтчетаПоВерсии(Ссылка, СравниваемыеВерсии) Экспорт +Процедура ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии) Экспорт ПараметрыОтчета = Новый Структура; ПараметрыОтчета.Вставить("Ссылка", Ссылка); diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектовПереопределяемый/Module.bsl index c27ef23fd..30065ac09 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Версионирование объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается для получения версионируемых табличных документов во время записи версии объекта. @@ -10,12 +5,12 @@ // заменить "техногенную" табличную часть объекта на ее представление в виде табличного документа. // // Параметры: -// Ссылка - Ссылка на версионируемый объект конфигурации. -// ТабличныеДокументы - Структура - содержит данные: -// * Ключ - Строка - Имя табличного документа; +// Ссылка - ЛюбаяСсылка - версионируемый объект конфигурации. +// ТабличныеДокументы - Структура - содержит данные: +// * Ключ - Строка - имя табличного документа; // * Значение - Структура - содержит поля: -// * Наименование - Строка - Наименование табличного документа; -// * Данные - ТабличныйДокумент - версионируемый табличный документ. +// ** Наименование - Строка - наименование табличного документа; +// ** Данные - ТабличныйДокумент - версионируемый табличный документ. Процедура ПриПолученииТабличныхДокументовОбъекта(Ссылка, ТабличныеДокументы) Экспорт КонецПроцедуры @@ -24,8 +19,8 @@ // может использоваться для дополнительной обработки результата разбора версии. // // Параметры: -// Ссылка - Ссылка на версионируемый объект конфигурации. -// Результат - Структура - Результат разбора версии подсистемой версионирования. +// Ссылка - ЛюбаяСсылка - версионируемый объект конфигурации. +// Результат - Структура - результат разбора версии подсистемой версионирования. // Процедура ПослеРазбораВерсииОбъекта(Ссылка, Результат) Экспорт @@ -35,8 +30,8 @@ // РегистрСведений.ВерсииОбъектов.ВыборРеквизитовОбъекта. // // Параметры: -// Ссылка - Ссылка на версионируемый объект конфигурации. -// ДеревоРеквизитов - ДанныеФормыДерево - Дерево реквизитов объектов. +// Ссылка - ЛюбаяСсылка - версионируемый объект конфигурации. +// ДеревоРеквизитов - ДанныеФормыДерево - дерево реквизитов объектов. // Процедура ПриВыбореРеквизитовОбъекта(Ссылка, ДеревоРеквизитов) Экспорт @@ -45,10 +40,10 @@ // Вызывается при получении представления реквизита объекта. // // Параметры: -// Ссылка - Ссылка на версионируемый объект конфигурации. -// ИмяРеквизита - Строка - ИмяРеквизита как задано в конфигураторе. -// НаименованиеРеквизита - Строка - выходной параметр, можно переопределить полученный синоним. -// Видимость - Булево - выводить реквизит в отчетах по версиям. +// Ссылка - ЛюбаяСсылка - версионируемый объект конфигурации. +// ИмяРеквизита - Строка - ИмяРеквизита, как оно задано в конфигураторе. +// НаименованиеРеквизита - Строка - выходной параметр, можно переопределить полученный синоним. +// Видимость - Булево - выводить реквизит в отчетах по версиям. // Процедура ПриОпределенииНаименованияРеквизитаОбъекта(Ссылка, ИмяРеквизита, НаименованиеРеквизита, Видимость) Экспорт diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl index d86213363..a0bcbbd46 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Версионирование объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Записывает версию объекта (кроме документов) в информационную базу. @@ -20,9 +15,12 @@ // Записывает версию документа в информационную базу. // // Параметры: -// Источник - Объект - записываемый документ ИБ; -// Отказ - Булево - признак отказа от записи документа. -// +// Источник - Объект - записываемый документ ИБ; +// Отказ - Булево - признак отказа от записи документа. +// РежимЗаписи - РежимЗаписиДокумента - позволяет определить выполняется запись, проведение или отмена проведения. +// Изменение значения параметра позволяет изменить режим записи. +// РежимПроведения - РежимПроведенияДокумента - позволяет определить, выполняется оперативное проведение или нет. +// Изменение значения параметра позволяет изменить режим проведения. Процедура ЗаписатьВерсиюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт ВерсионированиеОбъектов.ЗаписатьВерсиюОбъекта(Источник, РежимЗаписи); @@ -31,21 +29,6 @@ #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - Настройка = Настройки.Добавить(); - Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов; - Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьВерсионированиеОбъектов; -КонецПроцедуры - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -55,6 +38,10 @@ // Процедура УдалитьИнформациюОбАвтореВерсии(Источник, Отказ) Экспорт + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + РегистрыСведений.ВерсииОбъектов.УдалитьИнформациюОбАвтореВерсии(Источник.Ссылка); КонецПроцедуры diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl index 322bf24f3..e9d55dd3c 100644 --- a/SSL/src/CommonModules/Взаимодействия/Module.bsl +++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается из обработчиков заполнения документов - взаимодействий и предметов заполнения. @@ -61,40 +56,16 @@ // Заполним участников Если ЗначениеЗаполнено(Контакты) И (Контакты.Количество() > 0) Тогда - - Если ТипЗнч(Объект) = Тип("ДокументОбъект.ТелефонныйЗвонок") - Или ТипЗнч(Объект) = Тип("ДокументОбъект.СообщениеSMS") Тогда - - Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") - Или ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда - - Для Каждого СтрокаКонтакт Из Контакты Цикл - - Если ТипЗнч(СтрокаКонтакт) = Тип("Структура") Тогда - - Если Не ЗначениеЗаполнено(СтрокаКонтакт.Контакт) Тогда - СтрокаКонтакт.Адрес = ""; - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - Объект.ЗаполнитьКонтакты(Контакты); - КонецЕсли; КонецПроцедуры // Устанавливает во всей цепочке взаимодействий в качестве предмета созданный объект. // Параметры: -// Предмет - созданный предмет взаимодействий, -// Взаимодействие - взаимодействие, по которому создан предмет, -// Отказ - флаг отказа от операции. +// Предмет - ОбъектСсылка - созданный предмет взаимодействий, +// Взаимодействие - ДокументСсылка - взаимодействие, по которому создан предмет, +// Отказ - Булево - флаг отказа от операции. // Процедура ПриЗаписиПредметаИзФормы(Предмет, Взаимодействие, Отказ) Экспорт @@ -135,7 +106,12 @@ КонецПроцедуры // Подготавливает оповещение при создании на сервере документа взаимодействий. -Процедура ПодготовитьОповещения(Форма,Параметры,ИспользоватьВзаимодействиеОснование = Истина) Экспорт +// Параметры: +// Форма - УправляемаяФорма - форма, из которой будет отправлено оповещение. +// Параметры - Структура - параметры создания формы документа взаимодействий. +// ИспользоватьВзаимодействиеОснование - Булево - признак необходимости учитывать документ-основание. +// +Процедура ПодготовитьОповещения(Форма, Параметры, ИспользоватьВзаимодействиеОснование = Истина) Экспорт Если Параметры.Свойство("Основание") И Параметры.Основание <> Неопределено Тогда @@ -178,49 +154,110 @@ КонецПроцедуры +// Устанавливает признак активности предмета. +// +// Параметры: +// Предмет - ДокументСсылка, СправочникСсылка - предмет, для которого выполняется запись. +// Активен - Булево - признак активности предмета. +// +Процедура УстановитьПризнакАктивен(Предмет, Активен) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | СостоянияПредметовВзаимодействий.КоличествоНеРассмотрено, + | СостоянияПредметовВзаимодействий.ДатаПоследнегоВзаимодействия, + | СостоянияПредметовВзаимодействий.Активен + |ИЗ + | РегистрСведений.СостоянияПредметовВзаимодействий КАК СостоянияПредметовВзаимодействий + |ГДЕ + | СостоянияПредметовВзаимодействий.Предмет = &Предмет"; + + Запрос.УстановитьПараметр("Предмет",Предмет); + + МенеджерЗаписи = РегистрыСведений.СостоянияПредметовВзаимодействий.СоздатьМенеджерЗаписи(); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + + Если Активен = Ложь Тогда + Возврат; + КонецЕсли; + + МенеджерЗаписи.ДатаПоследнегоВзаимодействия = Дата(1,1,1); + МенеджерЗаписи.КоличествоНеРассмотрено = 0; + + Иначе + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + Если Выборка.Активен = Активен Тогда + Возврат; + КонецЕсли; + + МенеджерЗаписи.ДатаПоследнегоВзаимодействия = Выборка.ДатаПоследнегоВзаимодействия; + МенеджерЗаписи.КоличествоНеРассмотрено = Выборка.КоличествоНеРассмотрено; + + КонецЕсли; + + МенеджерЗаписи.Активен = Активен; + МенеджерЗаписи.Предмет = Предмет; + + МенеджерЗаписи.Записать(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +// Выполняет полный перерасчет состояний по папкам, контактам и предметам. +// +Процедура ВыполнитьПолныйПерерасчетСостояний() Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. + РассчитатьРассмотреноПоПапкам(Неопределено); + РассчитатьРассмотреноПоКонтактам(Неопределено); + РассчитатьРассмотреноПоПредметам(Неопределено); - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "Взаимодействия"); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\ПослеУдаленияПомеченных"].Добавить( - "Взаимодействия"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "Взаимодействия"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "Взаимодействия"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "Взаимодействия"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки" - ].Добавить("Взаимодействия"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "Взаимодействия"); + // Загрузка в справочник СтроковыеКонтактыВзаимодействий запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); КонецЕсли; КонецПроцедуры +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Документы.Встреча.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Документы.ТелефонныйЗвонок.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Документы.ЗапланированноеВзаимодействие.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоВходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоИсходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Документы.СообщениеSMS.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ВстречаПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ЗакладкиВзаимодействий.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПапкиЭлектронныхПисем.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПравилаОбработкиЭлектроннойПочты.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.СообщениеSMSПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ТелефонныйЗвонокПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + // Вызывается после удаления помеченных объектов. // // Параметры: @@ -228,7 +265,7 @@ // * Удаленные - Массив - Ссылки удаленных объектов. // * НеУдаленные - Массив - Ссылки объектов, которые не получилось удалить. // -Процедура ПослеУдаленияПомеченных(Знач ПараметрыВыполнения) Экспорт +Процедура ПослеУдаленияПомеченных(ПараметрыВыполнения) Экспорт ТребуетсяПересчетСостояний = Ложь; @@ -249,61 +286,7 @@ КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник СтроковыеКонтактыВзаимодействий запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Документы.Встреча.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Документы.ТелефонныйЗвонок.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Документы.ЗапланированноеВзаимодействие.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоВходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоИсходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Документы.СообщениеSMS.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ВстречаПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ЗакладкиВзаимодействий.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПапкиЭлектронныхПисем.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПравилаОбработкиЭлектроннойПочты.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.СообщениеSMSПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ТелефонныйЗвонокПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); @@ -323,46 +306,27 @@ КонецПроцедуры -#КонецОбласти +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи); + Типы.Добавить(Метаданные.РегистрыСведений.Удалить_АктивныеПредметыВзаимодействий); + +КонецПроцедуры -#Область СлужебныеПроцедурыИФункции +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + ИспользоватьПочтовыйКлиент = ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент"); + ЕстьПравоСозданиеИсходящихПисем = ПравоДоступа("Добавление", Метаданные.Документы.ЭлектронноеПисьмоИсходящее); + + Параметры.Вставить("ИспользоватьПочтовыйКлиент", ИспользоватьПочтовыйКлиент); + Параметры.Вставить("ИспользоватьПрочиеВзаимодействия", ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия")); + Параметры.Вставить("СозданиеИсходящихПисемДоступно", ИспользоватьПочтовыйКлиент И ЕстьПравоСозданиеИсходящихПисем); + +КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах. -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -410,7 +374,7 @@ |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.ЭлектронноеПисьмоИсходящее |"; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда Описание = Описание + " |Справочник.ВстречаПрисоединенныеФайлы.Чтение.Объект.Документ.Встреча |Справочник.ВстречаПрисоединенныеФайлы.Изменение.Объект.Документ.Встреча @@ -430,68 +394,16 @@ КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт - ИспользоватьПочтовыйКлиент = ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент"); - ЕстьПравоСозданиеИсходящихПисем = ПравоДоступа("Добавление", Метаданные.Документы.ЭлектронноеПисьмоИсходящее); - - Параметры.Вставить("ИспользоватьПочтовыйКлиент", ИспользоватьПочтовыйКлиент); - Параметры.Вставить("ИспользоватьПрочиеВзаимодействия", ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия")); - Параметры.Вставить("СозданиеИсходящихПисемДоступно", ИспользоватьПочтовыйКлиент И ЕстьПравоСозданиеИсходящихПисем); + ШаблоныЗаданий.Добавить("ОбновлениеСтатусовДоставкиSMS"); + ШаблоныЗаданий.Добавить("ОтправкаSMS"); + ШаблоныЗаданий.Добавить("ПолучениеИОтправкаЭлектронныхПисем"); КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи); - Типы.Добавить(Метаданные.РегистрыСведений.Удалить_АктивныеПредметыВзаимодействий); - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("ОбновлениеСтатусовДоставкиSMS"); - Шаблоны.Добавить("ОтправкаSMS"); - Шаблоны.Добавить("ПолучениеИОтправкаЭлектронныхПисем"); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -538,6 +450,213 @@ КонецПроцедуры +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеПредмета_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеОтветственныйУчетнаяЗапись_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.СоздатьПапкиЭлектронныхПисем_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.ПереместитьПисьмаВПредопределенныеПапки_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.ПреобразоватьОписаниеВТему_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.4"; + Обработчик.Процедура = "Взаимодействия.ЗаполнитьРазмерДляИсходящихЭлектронныхПисем_1_2_1_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.0.1.2"; + Обработчик.Процедура = "Взаимодействия.ВыполнитьПерекодировкуПапокЭлектроннойПочты_2_0_1_2"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.22"; + Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеВключатьВПредставлениеИмяПользователя_2_1_3_22"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.ПредметыПапкиВзаимодействий.ОбновитьХранениеРассмотреноРассмотретьПосле_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("c12dc82c-2358-4abd-9622-656a6a188062"); + Обработчик.Комментарий = НСтр("ru = 'Переносится хранение реквизитов ""Рассмотрено"" и ""РассмотретьПосле"" в регистр сведений ""ПредметыПапкиВзаимодействий"". Без выполнения обработчика значения данных реквизитов будут отображаться некорректно.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.КонтактыВзаимодействий.ЗаполнитьКонтактыВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("bfe0bff5-6d5c-4359-a994-6e76bf824454"); + Обработчик.Комментарий = НСтр("ru = 'Заполняется вспомогательный регистр сведений ""КонтактыВзаимодействий"". Без выполнения обработчика не будут корректно работать отборы по контактам взаимодействий.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияПапокПисем.РассчитатьСостоянияПапокЭлектронныхПисем_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("48cc6281-e934-45d6-b673-819c68016d11"); + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества нерассмотренных писем по папкам. Без выполнения обработчика не будет корректно выводится информация о количестве нерассмотренных писем по папкам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияПредметовВзаимодействий.РассчитатьСостоянияПредметовВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("0eec6511-cb6c-443b-b27b-6b888aad99ef"); + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний предметов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по предметам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияКонтактовВзаимодействий.РассчитатьСостоянияКонтактовВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("4ec55cf6-e322-49f2-b977-77b718a4e7ca"); + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний контактов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по контактам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.29"; + Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.3.28"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("301d4867-5fb2-45ff-9d32-dc3e5da008df"); + Обработчик.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисемКОбработке"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее, Документ.ЭлектронноеПисьмоИсходящее"; + Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; + Приоритет.Порядок = "До"; + Обработчик.Комментарий = НСтр("ru = 'Выполняет дозаполнение реквизита ВзаимодействиеОснование для входящих писем, у которых письмо основание в ИБ есть, но оно не указано.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.3.28"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("1c4d3aef-eb91-49d9-aa76-06ee605e9c82"); + Обработчик.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисемКОбработке"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее, Документ.ЭлектронноеПисьмоИсходящее"; + Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; + Приоритет.Порядок = "До"; + Обработчик.Комментарий = НСтр("ru = 'Выполняет дозаполнение реквизита ВзаимодействиеОснование для исходящее писем, у которых письмо основание в ИБ есть, но оно не указано.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.4.118"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("eb7fe7da-ffd1-437f-85c7-8d673c79c4f0"); + Обработчик.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоИсходящее.ОпределитьНезаполненныеКонтактыВИсходящихЭлектронныхПисьмах"; + Обработчик.ОчередьОтложеннойОбработки = 2; + Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; + Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; + Обработчик.Комментарий = НСтр("ru = 'Выполняет определение контакта по электронной почте для исходящих писем, у которых он не установлен.'"); + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Приоритет.Порядок = "После"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; + Приоритет.Порядок = "После"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "Взаимодействия.ОбновитьПерсональныеУчетныеЗаписи"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("d57f7a36-46ca-4a52-baab-db960e3d376d"); + Обработчик.Комментарий = НСтр("ru = 'Обновляет сведения о персональных учетных записях.'"); + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Взаимодействия.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты, Справочник.УчетныеЗаписиЭлектроннойПочты"; + Обработчик.ИзменяемыеОбъекты = "Справочник.УчетныеЗаписиЭлектроннойПочты"; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// которые необходимо обновить на новую версию. +// +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | УчетныеЗаписиЭлектроннойПочты.Ссылка + |ИЗ + | РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + | ПО НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка + |ГДЕ + | НастройкиУчетныхЗаписейЭлектроннойПочты.УдалитьПерсональнаяУчетнаяЗапись + | И УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + + Запрос = Новый Запрос(ТекстЗапроса); + + Результат = Запрос.Выполнить().Выгрузить(); + МассивСсылок = Результат.ВыгрузитьКолонку("Ссылка"); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); + +КонецПроцедуры + +// Заполняет владельца в учетных записях электронной почты. +Процедура ОбновитьПерсональныеУчетныеЗаписи(Параметры) Экспорт + УчетныеЗаписи = Новый Массив; + Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.УчетныеЗаписиЭлектроннойПочты"); + Пока Выборка.Следующий() Цикл + УчетныеЗаписи.Добавить(Выборка.Ссылка); + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ + | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, + | НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем КАК ВладелецУчетнойЗаписи + |ИЗ + | РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + | ПО НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка + |ГДЕ + | УчетныеЗаписиЭлектроннойПочты.Ссылка В(&УчетныеЗаписи)"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("УчетныеЗаписи", УчетныеЗаписи); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + УчетнаяЗапись = Выборка.Ссылка.ПолучитьОбъект(); + УчетнаяЗапись.ДополнительныеСвойства.Вставить("НеПроверятьИзменениеНастроек"); + УчетнаяЗапись.ВладелецУчетнойЗаписи = Выборка.ВладелецУчетнойЗаписи; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(УчетнаяЗапись); + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.УчетныеЗаписиЭлектроннойПочты"); +КонецПроцедуры + // Возвращает поля для получения наименования владельца, если такой имеется. // // Параметры: @@ -546,13 +665,13 @@ // Возвращаемое значение: // Строка - строка, которая будет вставлена в запрос. // -Функция ПолучитьИмяПоляДляНаименованияВладельца(ИмяТаблицы) Экспорт +Функция ИмяПоляДляНаименованияВладельца(ИмяТаблицы) Экспорт МассивОписанияКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); Для каждого ЭлементОписанияМассива Из МассивОписанияКонтактов Цикл Если ЭлементОписанияМассива.Имя = ИмяТаблицы И ЭлементОписанияМассива.ЕстьВладелец Тогда - Возврат "Таблица.Владелец.Наименование"; + Возврат "СправочникКонтакт.Владелец.Наименование"; КонецЕсли; КонецЦикла; @@ -601,7 +720,7 @@ // Возвращаемое значение: // Структура - структура содержащая виды поиска и значения поиска в них. // -Функция ПолучитьСписокДоступныхПоисков(ППДВключен, Параметры, ЭлементыФормы, ДляАдреснойКниги) Экспорт +Функция СписокДоступныхПоисков(ППДВключен, Параметры, ЭлементыФормы, ДляАдреснойКниги) Экспорт ВсеСпискиПоиска = Новый Структура; @@ -801,7 +920,7 @@ // Возвращаемое значение: // Массив - массив содержащий метаданные возможных типов контактов. // -Функция ПолучитьМассивМетаданныхКонтакты() +Функция МассивМетаданныхКонтакты() МассивОписанияКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); МассивМетаданных = Новый Массив; @@ -833,15 +952,15 @@ КонецЕсли; Если ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(Предмет) Тогда - ТекстЗапроса = ПолучитьТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(Истина); + ТекстЗапроса = ТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(Истина); Иначе - ТекстЗапроса = ПолучитьТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(Истина); + ТекстЗапроса = ТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(Истина); ИмяМетаданных = Предмет.Метаданные().ПолноеИмя(); ТекстЗапроса = ТекстЗапроса + ВзаимодействияПереопределяемый.ТекстЗапросаПоискКонтактовПоПредмету(Ложь, ИмяМетаданных, Истина); КонецЕсли; - ТекстЗапроса = ТекстЗапроса + ПолучитьТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail); + ТекстЗапроса = ТекстЗапроса + ТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -865,7 +984,7 @@ // Параметры: // ПомещатьВоВременнуюТаблицу - флаг помещения промежуточных результатов во временную таблицу. // -Функция ПолучитьТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(ПомещатьВоВременнуюТаблицу) +Функция ТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(ПомещатьВоВременнуюТаблицу) СписокПоиска = Новый СписокЗначений; СписокПоиска.Добавить("Встреча.Участники", "Контакт"); @@ -888,7 +1007,7 @@ |", ""); ТекстОбъединить = ""; - ШаблонУсловияНаСсылки = ПолучитьШаблонУсловияНаСсылкиКонтактовДляЗапроса(); + ШаблонУсловияНаСсылки = ШаблонУсловияНаСсылкиКонтактовДляЗапроса(); Для Каждого ЭлементСписка Из СписокПоиска Цикл ИмяТаблицы = ЭлементСписка.Значение; @@ -897,11 +1016,11 @@ ТекстЗапроса = ТекстЗапроса + (ТекстОбъединить + "ВЫБРАТЬ" + ТекстПроРазрешенные + " РАЗЛИЧНЫЕ - | Таблица." + ИмяПоля + " + | КонтактыВзаимодействия." + ИмяПоля + " |" + ТекстВременнаяТаблица + "ИЗ - | Документ." + ИмяТаблицы + " КАК Таблица + | Документ." + ИмяТаблицы + " КАК КонтактыВзаимодействия | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий - | ПО Таблица.Ссылка = ПредметыВзаимодействий.Взаимодействие + | ПО КонтактыВзаимодействия.Ссылка = ПредметыВзаимодействий.Взаимодействие | ГДЕ | ПредметыВзаимодействий.Предмет = &Предмет | И (" + УсловиеНаСсылки + ")"); @@ -975,9 +1094,9 @@ // Возвращаемое значение: // Строка - дополнение запроса. // -Функция ПолучитьСтрокуСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,ИмяСправочника) +Функция СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,ИмяСправочника) - Если (Не ВключатьEmail) ИЛИ (НЕ ОбщегоНазначения.НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация")) Тогда + Если (Не ВключатьEmail) ИЛИ (НЕ НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация")) Тогда Возврат ""; @@ -985,7 +1104,7 @@ Возврат " | ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + ".КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация - | ПО Таблица.Ссылка = ТаблицаКонтактнаяИнформация.Ссылка + | ПО СправочникКонтакт.Ссылка = ТаблицаКонтактнаяИнформация.Ссылка | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты))"; КонецЕсли; @@ -1011,7 +1130,7 @@ Иначе - Если ОбщегоНазначения.НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация")Тогда + Если НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация")Тогда Возврат ", | ТаблицаКонтактнаяИнформация.АдресЭП"; Иначе @@ -1033,7 +1152,7 @@ // Возвращаемое значение: // Строка - текст запроса. // -Функция ПолучитьТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail) +Функция ТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail) МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); @@ -1041,15 +1160,15 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ - | Таблица.Ссылка, - | Таблица.Наименование КАК Наименование, + | СправочникКонтакт.Ссылка КАК Ссылка, + | СправочникКонтакт.Наименование КАК Наименование, | """" КАК НаименованиеВладельца " + ПолучитьСтрокуПроАдресДляЗапросаИнформацииОКонтактах(ВключатьEmail,"Пользователи") + " |ИЗ | ТаблицаКонтакты КАК ТаблицаКонтакты - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Таблица" + ПолучитьСтрокуСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,"Пользователи") + " - | ПО ТаблицаКонтакты.Контакт = Таблица.Ссылка + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК СправочникКонтакт" + СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,"Пользователи") + " + | ПО ТаблицаКонтакты.Контакт = СправочникКонтакт.Ссылка |ГДЕ - | (НЕ Таблица.ПометкаУдаления) + | (НЕ СправочникКонтакт.ПометкаУдаления) |"; Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл @@ -1062,16 +1181,16 @@ |ОБЪЕДИНИТЬ | |ВЫБРАТЬ - | Таблица.Ссылка, - | Таблица.Наименование, + | СправочникКонтакт.Ссылка, + | СправочникКонтакт.Наименование, | """"" + ПолучитьСтрокуПроАдресДляЗапросаИнформацииОКонтактах(ВключатьEmail,ЭлементМассиваОписания.Имя) + " |ИЗ | ТаблицаКонтакты КАК ТаблицаКонтакты - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник." + ЭлементМассиваОписания.Имя + " КАК Таблица" + ПолучитьСтрокуСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,ЭлементМассиваОписания.Имя) + " - | ПО ТаблицаКонтакты.Контакт = Таблица.Ссылка + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник." + ЭлементМассиваОписания.Имя + " КАК СправочникКонтакт" + СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,ЭлементМассиваОписания.Имя) + " + | ПО ТаблицаКонтакты.Контакт = СправочникКонтакт.Ссылка |ГДЕ - | (НЕ Таблица.ПометкаУдаления) - | "+?(ЭлементМассиваОписания.Иерархический," И (НЕ Таблица.Ссылка.ЭтоГруппа)",""); + | (НЕ СправочникКонтакт.ПометкаУдаления) + | "+?(ЭлементМассиваОписания.Иерархический," И (НЕ СправочникКонтакт.Ссылка.ЭтоГруппа)",""); КонецЕсли; @@ -1241,21 +1360,21 @@ // Возвращаемое значение: // ТаблицаЗначений - Результат выполненного запроса выгруженный в таблицу значений. // -Функция ПолучитьВсеКонтактыПоНачалуНаименования(Наименование) Экспорт +Функция ВсеКонтактыПоНачалуНаименования(Наименование) Экспорт МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); ТекстЗапроса = "ВЫБРАТЬ - | Таблица.Ссылка КАК Контакт, - | Таблица.Наименование КАК Наименование, - | """" КАК НаименованиеВладельца, - | """" КАК Представление + | СправочникКонтакт.Ссылка КАК Контакт, + | СправочникКонтакт.Наименование КАК Наименование, + | """" КАК НаименованиеВладельца, + | """" КАК Представление |ИЗ - | Справочник.Пользователи КАК Таблица + | Справочник.Пользователи КАК СправочникКонтакт |ГДЕ - | Таблица.Наименование ПОДОБНО &Наименование - | И (НЕ Таблица.ПометкаУдаления) + | СправочникКонтакт.Наименование ПОДОБНО &Наименование + | И (НЕ СправочникКонтакт.ПометкаУдаления) |"; Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл @@ -1304,18 +1423,18 @@ // Возвращаемое значение: // Булево - Истина, если найден хотя бы один контакт. // -Функция ПолучитьВсеКонтактыПоНачалуНаименованияСАдресамиЭлектроннойПочты(Наименование,Форма) Экспорт +Функция ВсеКонтактыПоНачалуНаименованияСАдресамиЭлектроннойПочты(Наименование,Форма) Экспорт МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); ТекстЗапроса = " ВЫБРАТЬ - | Таблица.Ссылка КАК Контакт, - | Таблица.Наименование КАК Наименование, - | """" КАК НаименованиеВладельца, + | СправочникКонтакт.Ссылка КАК Контакт, + | СправочникКонтакт.Наименование КАК Наименование, + | """" КАК НаименованиеВладельца, | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление |ИЗ - | Справочник.Пользователи КАК Таблица + | Справочник.Пользователи КАК СправочникКонтакт | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация | ПО (ТаблицаКонтактнаяИнформация.Ссылка = Таблица.Ссылка) | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)) @@ -1375,11 +1494,11 @@ // Возвращаемое значение: // Строка - сформированный текст шаблона условия. // -Функция ПолучитьШаблонУсловияНаСсылкиКонтактовДляЗапроса() +Функция ШаблонУсловияНаСсылкиКонтактовДляЗапроса() МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.МассивОписанияВозможныхКонтактов(); - ТекстКВозврату = "Таблица.%ИмяПоля% ССЫЛКА Справочник.Пользователи"; + ТекстКВозврату = "КонтактыВзаимодействия.%ИмяПоля% ССЫЛКА Справочник.Пользователи"; Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл @@ -1387,7 +1506,7 @@ Продолжить; Иначе ТекстКВозврату = ТекстКВозврату + " - |ИЛИ Таблица.%ИмяПоля% ССЫЛКА Справочник." + ЭлементМассиваОписания.Имя; + |ИЛИ КонтактыВзаимодействия.%ИмяПоля% ССЫЛКА Справочник." + ЭлементМассиваОписания.Имя; КонецЕсли; КонецЦикла; @@ -1509,10 +1628,10 @@ Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Запретить ИЛИ НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") Тогда - Возврат НСтр("ru = 'Использование индекса полнотекстового поиска данных запрещено!'"); + Возврат НСтр("ru = 'Использование индекса полнотекстового поиска данных запрещено.'"); КонецЕсли; - МассивМетаданных = ПолучитьМассивМетаданныхКонтакты(); + МассивМетаданных = МассивМетаданныхКонтакты(); СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Форма.СтрокаПоиска, 101); СписокПоиска.ОбластьПоиска = МассивМетаданных; @@ -1557,7 +1676,7 @@ " (" + Выборка.НаименованиеВладельца + ")"); КонецЦикла; - Возврат ?(КоличествоНайденныхЭлементов < 101, "", НСтр("ru = 'Уточните параметры поиска. В списке отображены не все найденные контакты!'")); + Возврат ?(КоличествоНайденныхЭлементов < 101, "", НСтр("ru = 'Уточните параметры поиска. В списке отображены не все найденные контакты.'")); КонецФункции @@ -1966,10 +2085,9 @@ МассивСтрокСТелефонами = Новый Массив; Для Каждого ЭлементМассива Из СтрРазделить(Адрес, ";", Ложь) Цикл - СтруктураПолей = ВзаимодействияКлиентСервер.СтруктураПолейПоПредставлениюТелефона(ЭлементМассива); - Если ВзаимодействияКлиентСервер.КорректноВведенНомерТелефона(СтруктураПолей) Тогда - МассивСтрокСТелефонами.Добавить(ЭлементМассива); - КонецЕсли; + Если ВзаимодействияКлиентСервер.КорректноВведенНомерТелефона(ЭлементМассива) Тогда + МассивСтрокСТелефонами.Добавить(ЭлементМассива); + КонецЕсли; КонецЦикла; Если МассивСтрокСТелефонами.Количество() > 0 Тогда @@ -2009,7 +2127,7 @@ Если ТипКонтактнойИнформации <> Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда Если ПустаяСтрока(Адрес) Тогда - ВзаимодействияВызовСервера.ПолучитьПредставлениеИВсюКонтактнуюИнформациюКонтакта( + ВзаимодействияВызовСервера.ПредставлениеИВсяКонтактнаяИнформациюКонтакта( Контакт, "", Адрес, ТипКонтактнойИнформации); КонецЕсли; Возврат; @@ -2021,7 +2139,7 @@ Возврат; КонецЕсли; - Адреса = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт); + Адреса = ВзаимодействияВызовСервера.НаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт); Если Адреса <> Неопределено И Адреса.Адреса.Количество() > 0 Тогда Элемент = Адреса.Адреса.Получить(0); Адрес = Элемент.Значение; @@ -2409,6 +2527,10 @@ // Функция ВыполнитьОтправкуПисьма(Объект, Соединение = Неопределено, ПараметрыПисьма = Неопределено, ПротоколПочты = "") Экспорт + Если ПротоколПочты <> "" И ПротоколПочты <> "Все" И ПротоколПочты <> "IMAP" Тогда + Возврат Неопределено; + КонецЕсли; + Если ПараметрыПисьма = Неопределено Тогда ПараметрыПисьма = ПараметрыПисьмаДляОтправки(Объект); КонецЕсли; @@ -2449,8 +2571,14 @@ КонецЕсли; - ИдентификаторПисьма = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыПисьма ,Соединение, ПротоколПочты); - Если ПротоколПодключения = ПротоколИнтернетПочты.IMAP Тогда + Если ПротоколПочты = "" Или ПротоколПочты = "IMAP" Тогда + Если ПротоколПочты = "IMAP" Тогда + ПараметрыПисьма.Вставить("ПротоколПочты","IMAP"); + КонецЕсли; + ИдентификаторПисьма = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыПисьма ,Соединение, ПротоколПочты); + ИначеЕсли ПротоколПочты = "Все" Тогда + ИдентификаторПисьма = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыПисьма ,Соединение, ""); + ПараметрыПисьма.Вставить("ПротоколПочты","IMAP"); РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыПисьма ,Соединение, "IMAP"); КонецЕсли; @@ -2503,34 +2631,57 @@ | Файлы.Наименование КАК ПолноеНаименование, | Файлы.Расширение КАК Расширение, | Файлы.Ссылка КАК Ссылка, - | Файлы.ЭлектронныеПодписи.( - | НомерСтроки, - | Подпись - | ), | Файлы.ИДФайлаЭлектронногоПисьма |ИЗ | Справочник." + ИмяОбъектаМетаданных + " КАК Файлы |ГДЕ - | Файлы.ВладелецФайла = &ВладелецФайла"; + | Файлы.ВладелецФайла = &ВладелецФайла + |; + | + |////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо КАК Письмо, + | ЭлектронноеПисьмоИсходящееПисьмаВложения.ПорядковыйНомерВоВложениях КАК ПорядковыйНомерВоВложениях + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &ВладелецФайла + | + |УПОРЯДОЧИТЬ ПО ПорядковыйНомерВоВложениях ВОЗР"; + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайлов); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - ИмяФайла = Выборка.ПолноеНаименование + ?(Выборка.Расширение = "", "", "." + Выборка.Расширение); - Если ПустаяСтрока(Выборка.ИДФайлаЭлектронногоПисьма) Тогда - СоотвВложения.Вставить(ИмяФайла, ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Выборка.Ссылка)); + РезультатЗапроса = Запрос.ВыполнитьПакет(); + + ВыборкаВложения = РезультатЗапроса[0].Выбрать(); + ТаблицаПисьмаВложения = РезультатЗапроса[1].Выгрузить(); + + НомерОтображаемогоВложения = 1; + Пока ВыборкаВложения.Следующий() Цикл + + ДобавитьВложениеПисьмоЕслиНеобходимо(ТаблицаПисьмаВложения, СоотвВложения, НомерОтображаемогоВложения); + ИмяФайла = ВыборкаВложения.ПолноеНаименование + ?(ВыборкаВложения.Расширение = "", "", "." + ВыборкаВложения.Расширение); + Если ПустаяСтрока(ВыборкаВложения.ИДФайлаЭлектронногоПисьма) Тогда + СоотвВложения.Вставить(ИмяФайла, РаботаСФайлами.ДвоичныеДанныеФайла(ВыборкаВложения.Ссылка)); + НомерОтображаемогоВложения = НомерОтображаемогоВложения + 1; Иначе СтруктураДанныеВложения = Новый Структура; - СтруктураДанныеВложения.Вставить("ДвоичныеДанные", ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Выборка.Ссылка)); - СтруктураДанныеВложения.Вставить("Идентификатор", Выборка.ИДФайлаЭлектронногоПисьма); + СтруктураДанныеВложения.Вставить("ДвоичныеДанные", РаботаСФайлами.ДвоичныеДанныеФайла(ВыборкаВложения.Ссылка)); + СтруктураДанныеВложения.Вставить("Идентификатор", ВыборкаВложения.ИДФайлаЭлектронногоПисьма); СоотвВложения.Вставить(ИмяФайла, СтруктураДанныеВложения); КонецЕсли; - Для каждого ЭП Из Выборка.ЭлектронныеПодписи.Выгрузить() Цикл - СоотвВложения.Вставить(Выборка.ПолноеНаименование + "-DS("+ ЭП.НомерСтроки + ")." - + РасширениеДляФайловПодписи,ЭП.Подпись.Получить()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ЭлектронныеПодписиВладельца = МодульЭлектроннаяПодпись.УстановленныеПодписи(ВыборкаВложения.Ссылка); + КонецЕсли; + НомерСтроки = 1; + Для каждого ЭП Из ЭлектронныеПодписиВладельца Цикл + СоотвВложения.Вставить(ВыборкаВложения.ПолноеНаименование + "-DS("+ НомерСтроки + ")." + + РасширениеДляФайловПодписи, ЭП.Подпись); + НомерСтроки = НомерСтроки + 1; КонецЦикла; + КонецЦикла; ПараметрыПисьма.Вставить("Вложения", СоотвВложения); ПараметрыПисьма.Вставить("ОбрабатыватьТексты", Ложь); @@ -2547,6 +2698,440 @@ КонецФункции +Процедура ДобавитьВложениеПисьмоЕслиНеобходимо(ТаблицаПисьмаВложения, СоотвВложения, НомерОтображаемогоВложения) + + НайденнаяСтрока = ТаблицаПисьмаВложения.Найти(НомерОтображаемогоВложения, "ПорядковыйНомерВоВложениях"); + Пока НайденнаяСтрока <> Неопределено Цикл + ДобавитьВложениеПисьмоИсходящееПисьмо(СоотвВложения, НайденнаяСтрока.Письмо); + НомерОтображаемогоВложения = НомерОтображаемогоВложения + 1; + НайденнаяСтрока = ТаблицаПисьмаВложения.Найти(НомерОтображаемогоВложения, "ПорядковыйНомерВоВложениях"); + КонецЦикла + +КонецПроцедуры + +Процедура ДобавитьВложениеПисьмоИсходящееПисьмо(СоотвВложения, Письмо); + + СтруктураВложение = Новый Структура; + + ДанныеИнтернетПочтовогоСообщения = ИнтернетПочтовоеСообщениеИзПисьма(Письмо); + + Если ДанныеИнтернетПочтовогоСообщения.ИнтернетПочтовоеСообщение = Неопределено Тогда + Возврат; + КонецЕсли; + + Представление = ВзаимодействияКлиентСервер.ПредставлениеПисьма(ДанныеИнтернетПочтовогоСообщения.ИнтернетПочтовоеСообщение.Тема, + ДанныеИнтернетПочтовогоСообщения.ДатаПисьма); + ИмяФайла = Представление + ".eml"; + + СтруктураВложение.Вставить("Кодировка", Письмо.Кодировка); + СтруктураВложение.Вставить("ДвоичныеДанные", ДанныеИнтернетПочтовогоСообщения.ИнтернетПочтовоеСообщение); + СтруктураВложение.Вставить("ТипСодержимого","message/rfc822"); + СтруктураВложение.Вставить("Имя", Представление); + + СоотвВложения.Вставить(ИмяФайла, СтруктураВложение); + +КонецПроцедуры + +Функция ИнтернетПочтовоеСообщениеИзПисьма(Письмо) Экспорт + + Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда + + Возврат ИнтернетПочтовоеСообщениеИзВходящегоПисьма(Письмо); + + ИначеЕсли ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда + + Возврат ИнтернетПочтовоеСообщениеИзИсходящегоПисьма(Письмо); + + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция ИнтернетПочтовоеСообщениеИзВходящегоПисьма(Письмо) + + СтруктураВозврата = Новый Структура("ИнтернетПочтовоеСообщение, ДатаПисьма"); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ЭлектронноеПисьмоВходящее.Важность КАК Важность, + | ЭлектронноеПисьмоВходящее.ИдентификаторНаСервере КАК Идентификатор, + | ЭлектронноеПисьмоВходящее.ДатаПолучения КАК ДатаПолучения, + | ЭлектронноеПисьмоВходящее.Текст КАК Текст, + | ЭлектронноеПисьмоВходящее.ТекстHTML КАК ТекстHTML, + | ЭлектронноеПисьмоВходящее.Кодировка КАК Кодировка, + | ЭлектронноеПисьмоВходящее.ОтправительАдрес КАК ОтправительАдрес, + | ЭлектронноеПисьмоВходящее.ОтправительПредставление КАК ОтправительПредставление, + | ЭлектронноеПисьмоВходящее.Тема КАК Тема, + | ЭлектронноеПисьмоВходящее.УведомитьОДоставке КАК УведомитьОДоставке, + | ЭлектронноеПисьмоВходящее.УведомитьОПрочтении КАК УведомитьОПрочтении + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее + |ГДЕ + | ЭлектронноеПисьмоВходящее.Ссылка = &Письмо + |; + | + |////////////////////////////////////////////////////////////////////////////////1 + |ВЫБРАТЬ + | ЭлектронноеПисьмоВходящееПолучателиПисьма.Адрес, + | ЭлектронноеПисьмоВходящееПолучателиПисьма.Представление, + | ЭлектронноеПисьмоВходящееПолучателиПисьма.Контакт + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиПисьма КАК ЭлектронноеПисьмоВходящееПолучателиПисьма + |ГДЕ + | ЭлектронноеПисьмоВходящееПолучателиПисьма.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоВходящееПолучателиПисьма.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////2 + |ВЫБРАТЬ + | ЭлектронноеПисьмоВходящееПолучателиКопий.Адрес, + | ЭлектронноеПисьмоВходящееПолучателиКопий.Представление, + | ЭлектронноеПисьмоВходящееПолучателиКопий.Контакт + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиКопий КАК ЭлектронноеПисьмоВходящееПолучателиКопий + |ГДЕ + | ЭлектронноеПисьмоВходящееПолучателиКопий.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоВходящееПолучателиКопий.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////3 + |ВЫБРАТЬ + | ЭлектронноеПисьмоВходящееПолучателиОтвета.Адрес, + | ЭлектронноеПисьмоВходящееПолучателиОтвета.Представление, + | ЭлектронноеПисьмоВходящееПолучателиОтвета.Контакт + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиОтвета КАК ЭлектронноеПисьмоВходящееПолучателиОтвета + |ГДЕ + | ЭлектронноеПисьмоВходящееПолучателиОтвета.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоВходящееПолучателиОтвета.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////4 + |ВЫБРАТЬ + | ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении.Адрес, + | ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении.Представление, + | ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении.Контакт + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.АдресаУведомленияОПрочтении КАК ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении + |ГДЕ + | ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоВходящееАдресаУведомленияОПрочтении.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////5 + |ВЫБРАТЬ + | Файлы.Наименование КАК ПолноеНаименование, + | Файлы.Расширение КАК Расширение, + | Файлы.Ссылка КАК Ссылка, + | Файлы.ИДФайлаЭлектронногоПисьма + |ИЗ + | Справочник.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &Письмо"; + + Запрос.УстановитьПараметр("Письмо", Письмо); + + РезультатЗапроса = Запрос.ВыполнитьПакет(); + + ВыборкаШапка = РезультатЗапроса[0].Выбрать(); + Если ВыборкаШапка.Следующий() Тогда + + ОбъектИнтернетПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; + ОбъектИнтернетПочтовоеСообщение.Важность = УправлениеЭлектроннойПочтой.ПолучитьВажность(ВыборкаШапка.Важность); + ОбъектИнтернетПочтовоеСообщение.Идентификатор.Добавить(ВыборкаШапка.Идентификатор); + ОбъектИнтернетПочтовоеСообщение.Кодировка = ВыборкаШапка.Кодировка; + ОбъектИнтернетПочтовоеСообщение.Тема = ВыборкаШапка.Тема; + ОбъектИнтернетПочтовоеСообщение.УведомитьОДоставке = ВыборкаШапка.УведомитьОДоставке; + ОбъектИнтернетПочтовоеСообщение.УведомитьОПрочтении = ВыборкаШапка.УведомитьОПрочтении; + ОбъектИнтернетПочтовоеСообщение.Отправитель = ВыборкаШапка.ОтправительАдрес; + + ДанныеОтправителя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ВыборкаШапка.ОтправительПредставление, Ложь); + Если ТипЗнч(ДанныеОтправителя) = Тип("Массив") И ДанныеОтправителя.Количество() > 0 Тогда + ОбъектИнтернетПочтовоеСообщение.ИмяОтправителя = ДанныеОтправителя[0].Представление; + ОбъектИнтернетПочтовоеСообщение.Отправитель = ДанныеОтправителя[0].Адрес; + КонецЕсли; + + Если ПустаяСтрока(ВыборкаШапка.ТекстHTML) Тогда + + ДобавитьТекстВТекстыИнтернетПочтовогоСообщения(ОбъектИнтернетПочтовоеСообщение.Тексты, + ВыборкаШапка.Текст, + ТипТекстаПочтовогоСообщения.ПростойТекст, + ВыборкаШапка.Кодировка); + + КонецЕсли; + + ДобавитьТекстВТекстыИнтернетПочтовогоСообщения(ОбъектИнтернетПочтовоеСообщение.Тексты, + ВыборкаШапка.ТекстHTML, + ТипТекстаПочтовогоСообщения.HTML, + ВыборкаШапка.Кодировка); + + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[1].Выбрать(), "Получатели"); + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[2].Выбрать(), "Копии"); + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[3].Выбрать(), "ОбратныйАдрес"); + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[4].Выбрать(), "АдресаУведомленияОПрочтении"); + ДобавитьВложенияПисьмаВПочтовоеСообщение(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[5].Выбрать()); + + СтруктураВозврата.ИнтернетПочтовоеСообщение = ОбъектИнтернетПочтовоеСообщение; + СтруктураВозврата.ДатаПисьма = ВыборкаШапка.ДатаПолучения; + + Возврат СтруктураВозврата; + +КонецФункции + +Функция ИнтернетПочтовоеСообщениеИзИсходящегоПисьма(Письмо) + + СтруктураВозврата = Новый Структура("ИнтернетПочтовоеСообщение, ДатаПисьма"); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящее.ДатаОтправления КАК ДатаОтправления, + | ЭлектронноеПисьмоИсходящее.Важность КАК Важность, + | ЭлектронноеПисьмоИсходящее.ИдентификаторНаСервере КАК Идентификатор, + | ЭлектронноеПисьмоИсходящее.ОтправительПредставление КАК ОтправительПредставление, + | ЭлектронноеПисьмоИсходящее.Кодировка КАК Кодировка, + | ЭлектронноеПисьмоИсходящее.Текст КАК Текст, + | ЭлектронноеПисьмоИсходящее.ТекстHTML КАК ТекстHTML, + | ЭлектронноеПисьмоИсходящее.ТипТекста КАК ТипТекста, + | ЭлектронноеПисьмоИсходящее.Тема КАК Тема, + | ЭлектронноеПисьмоИсходящее.УведомитьОДоставке КАК УведомитьОДоставке, + | ЭлектронноеПисьмоИсходящее.УведомитьОПрочтении КАК УведомитьОПрочтении + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее + |ГДЕ + | ЭлектронноеПисьмоИсходящее.Ссылка = &Письмо + |; + | + |////////////////////////////////////////////////////////////////////////////////1 + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Адрес, + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиПисьма КАК ЭлектронноеПисьмоИсходящееПолучателиПисьма + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////2 + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПолучателиОтвета.Адрес, + | ЭлектронноеПисьмоИсходящееПолучателиОтвета.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиОтвета КАК ЭлектронноеПисьмоИсходящееПолучателиОтвета + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиОтвета.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоИсходящееПолучателиОтвета.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////3 + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Адрес, + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиКопий КАК ЭлектронноеПисьмоИсходящееПолучателиКопий + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоИсходящееПолучателиКопий.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////4 + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо + | + |УПОРЯДОЧИТЬ ПО + | ЭлектронноеПисьмоИсходящееПисьмаВложения.НомерСтроки + |; + | + |////////////////////////////////////////////////////////////////////////////////5 + |ВЫБРАТЬ + | Файлы.Наименование КАК ПолноеНаименование, + | Файлы.Расширение КАК Расширение, + | Файлы.Ссылка КАК Ссылка, + | Файлы.ИДФайлаЭлектронногоПисьма + |ИЗ + | Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &Письмо"; + + Запрос.УстановитьПараметр("Письмо", Письмо); + + РезультатЗапроса = Запрос.ВыполнитьПакет(); + + ВыборкаШапка = РезультатЗапроса[0].Выбрать(); + Если ВыборкаШапка.Следующий() Тогда + + ОбъектИнтернетПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; + ОбъектИнтернетПочтовоеСообщение.Важность = УправлениеЭлектроннойПочтой.ПолучитьВажность(ВыборкаШапка.Важность); + ОбъектИнтернетПочтовоеСообщение.Идентификатор.Добавить(ВыборкаШапка.Идентификатор); + ОбъектИнтернетПочтовоеСообщение.Кодировка = ВыборкаШапка.Кодировка; + ОбъектИнтернетПочтовоеСообщение.Тема = ВыборкаШапка.Тема; + ОбъектИнтернетПочтовоеСообщение.УведомитьОДоставке = ВыборкаШапка.УведомитьОДоставке; + ОбъектИнтернетПочтовоеСообщение.УведомитьОПрочтении = ВыборкаШапка.УведомитьОПрочтении; + + ДанныеОтправителя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ВыборкаШапка.ОтправительПредставление, Ложь); + + Если ТипЗнч(ДанныеОтправителя) = Тип("Массив") И ДанныеОтправителя.Количество() > 0 Тогда + ОбъектИнтернетПочтовоеСообщение.ИмяОтправителя = ДанныеОтправителя[0].Представление; + ОбъектИнтернетПочтовоеСообщение.Отправитель = ДанныеОтправителя[0].Адрес; + КонецЕсли; + + Если ПустаяСтрока(ВыборкаШапка.ТекстHTML) Тогда + + ДобавитьТекстВТекстыИнтернетПочтовогоСообщения(ОбъектИнтернетПочтовоеСообщение.Тексты, + ВыборкаШапка.Текст, + ТипТекстаПочтовогоСообщения.ПростойТекст, + ВыборкаШапка.Кодировка); + + КонецЕсли; + + ДобавитьТекстВТекстыИнтернетПочтовогоСообщения(ОбъектИнтернетПочтовоеСообщение.Тексты, + ВыборкаШапка.ТекстHTML, + ТипТекстаПочтовогоСообщения.HTML, + ВыборкаШапка.Кодировка); + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[1].Выбрать(), "Получатели"); + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[2].Выбрать(), "ОбратныйАдрес"); + ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[3].Выбрать(), "Копии"); + ДобавитьВложенияПисьмаВПочтовоеСообщение(ОбъектИнтернетПочтовоеСообщение, РезультатЗапроса[5].Выбрать()); + + СтруктураВозврата.ИнтернетПочтовоеСообщение = ОбъектИнтернетПочтовоеСообщение; + СтруктураВозврата.ДатаПисьма = ВыборкаШапка.ДатаОтправления; + + Возврат СтруктураВозврата; + +КонецФункции + +Процедура ДобавитьТекстВТекстыИнтернетПочтовогоСообщения(ТекстыСообщения, ТекстСообщения, ТипТекста, Кодировка) + + Если Не ПустаяСтрока(ТекстСообщения) Тогда + + НовыйТекст = ТекстыСообщения.Добавить(ТекстСообщения, ТипТекста); + НовыйТекст.Кодировка = Кодировка; + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПолучателейВПочтовоеСообщениеПоВыборке(Сообщение, Выборка, ИмяТаблицы) + + Пока Выборка.Следующий() Цикл + + ДобавитьПолучателяВПочтовоеСообщение(Сообщение, ИмяТаблицы, Выборка.Адрес, Выборка.Представление) + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьПолучателяВПочтовоеСообщение(Сообщение, ИмяТаблицы, Адрес, Представление) + + ПолучательПисьма = Сообщение[ИмяТаблицы].Добавить(Адрес); + ПолучательПисьма.ОтображаемоеИмя = Представление; + +КонецПроцедуры + +Процедура ДобавитьВложенияПисьмаВПочтовоеСообщение(Сообщение, ВыборкаВложения) + + Пока ВыборкаВложения.Следующий() Цикл + + Имя = ВыборкаВложения.ПолноеНаименование + + ?(ВыборкаВложения.Расширение = "", "", "." + ВыборкаВложения.Расширение); + Данные = РаботаСФайлами.ДвоичныеДанныеФайла(ВыборкаВложения.Ссылка); + + ВложениеПисьма = Сообщение.Вложения.Добавить(Данные, Имя); + + Если НЕ ПустаяСтрока(ВыборкаВложения.ИДФайлаЭлектронногоПисьма) Тогда + ВложениеПисьма.Идентификатор = ВыборкаВложения.ИДФайлаЭлектронногоПисьма; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ПодписиВложения = МодульЭлектроннаяПодпись.УстановленныеПодписи(ВыборкаВложения.Ссылка); + НомерСтроки = 1; + Для Каждого ЭП Из ПодписиВложения Цикл + Имя = ВыборкаВложения.ПолноеНаименование + "-DS("+ НомерСтроки + ")." + РасширениеДляФайловПодписи(); + Данные = ЭП.Подпись; + + ВложениеПисьма = Сообщение.Вложения.Добавить(Данные, Имя); + НомерСтроки = НомерСтроки + 1; + КонецЦикла; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ДанныеХранимыхВБазеПисемВложений(Письмо) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо КАК Письмо, + | ЭлектронноеПисьмоВходящее.Размер КАК Размер, + | ЭлектронноеПисьмоВходящее.Тема КАК Тема, + | ЭлектронноеПисьмоВходящее.ДатаПолучения КАК Дата + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее + | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоВходящее.Ссылка + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо, + | ЭлектронноеПисьмоИсходящее.Размер, + | ЭлектронноеПисьмоИсходящее.Тема, + | ВЫБОР + | КОГДА ЭлектронноеПисьмоИсходящее.ДатаОтправления = ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1) + | ТОГДА ЭлектронноеПисьмоИсходящее.Дата + | ИНАЧЕ ЭлектронноеПисьмоИсходящее.ДатаОтправления + | КОНЕЦ + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее + | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоИсходящее.Ссылка + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо"; + + Запрос.УстановитьПараметр("Письмо", Письмо); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + // Устанавливает заголовок формы электронного письма. // // Параметры: @@ -2572,182 +3157,9 @@ #Область ОбработчикиОбновления -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеПредмета_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеОтветственныйУчетнаяЗапись_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.СоздатьПапкиЭлектронныхПисем_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.ПереместитьПисьмаВПредопределенныеПапки_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.ПреобразоватьОписаниеВТему_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.4"; - Обработчик.Процедура = "Взаимодействия.ЗаполнитьРазмерДляИсходящихЭлектронныхПисем_1_2_1_4"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.0.1.2"; - Обработчик.Процедура = "Взаимодействия.ВыполнитьПерекодировкуПапокЭлектроннойПочты_2_0_1_2"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.22"; - Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеВключатьВПредставлениеИмяПользователя_2_1_3_22"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.12"; - Обработчик.Процедура = "РегистрыСведений.ПредметыПапкиВзаимодействий.ОбновитьХранениеРассмотреноРассмотретьПосле_2_2_0_0"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("c12dc82c-2358-4abd-9622-656a6a188062"); - Обработчик.Комментарий = НСтр("ru = 'Переносится хранение реквизитов ""Рассмотрено"" и ""РассмотретьПосле"" в регистр сведений ""ПредметыПапкиВзаимодействий"". Без выполнения обработчика значения данных реквизитов будут отображаться некорректно.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.12"; - Обработчик.Процедура = "РегистрыСведений.КонтактыВзаимодействий.ЗаполнитьКонтактыВзаимодействий_2_2_0_0"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("bfe0bff5-6d5c-4359-a994-6e76bf824454"); - Обработчик.Комментарий = НСтр("ru = 'Заполняется вспомогательный регистр сведений ""КонтактыВзаимодействий"". Без выполнения обработчика не будут корректно работать отборы по контактам взаимодействий.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.12"; - Обработчик.Процедура = "РегистрыСведений.СостоянияПапокПисем.РассчитатьСостоянияПапокЭлектронныхПисем_2_2_0_0"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("48cc6281-e934-45d6-b673-819c68016d11"); - Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества нерассмотренных писем по папкам. Без выполнения обработчика не будет корректно выводится информация о количестве нерассмотренных писем по папкам.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.12"; - Обработчик.Процедура = "РегистрыСведений.СостоянияПредметовВзаимодействий.РассчитатьСостоянияПредметовВзаимодействий_2_2_0_0"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("0eec6511-cb6c-443b-b27b-6b888aad99ef"); - Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний предметов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по предметам.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.12"; - Обработчик.Процедура = "РегистрыСведений.СостоянияКонтактовВзаимодействий.РассчитатьСостоянияКонтактовВзаимодействий_2_2_0_0"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("4ec55cf6-e322-49f2-b977-77b718a4e7ca"); - Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний контактов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по контактам.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.29"; - Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.3.28"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("301d4867-5fb2-45ff-9d32-dc3e5da008df"); - Обработчик.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисемКОбработке"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее, Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее"; - Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "Любой"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; - Приоритет.Порядок = "До"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Приоритет.Порядок = "Любой"; - Обработчик.Комментарий = НСтр("ru = 'Выполняет дозаполнение реквизита ВзаимодействиеОснование для входящих писем, у которых письмо основание в ИБ есть, но оно не указано.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.3.28"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("1c4d3aef-eb91-49d9-aa76-06ee605e9c82"); - Обработчик.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисемКОбработке"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоВходящее, Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "Любой"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; - Приоритет.Порядок = "До"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Приоритет.Порядок = "Любой"; - Обработчик.Комментарий = НСтр("ru = 'Выполняет дозаполнение реквизита ВзаимодействиеОснование для исходящее писем, у которых письмо основание в ИБ есть, но оно не указано.'"); - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.118"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("eb7fe7da-ffd1-437f-85c7-8d673c79c4f0"); - Обработчик.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоИсходящее.ОпределитьНезаполненныеКонтактыВИсходящихЭлектронныхПисьмах"; - Обработчик.ОчередьОтложеннойОбработки = 2; - Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.Комментарий = НСтр("ru = 'Выполняет определение контакта по электронной почте для исходящих писем, у которых он не установлен.'"); - Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "После"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "После"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Приоритет.Порядок = "Любой"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.6.76"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("35e85660-7125-4079-b5df-5a71dbb43a48"); - Обработчик.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.Комментарий = - НСтр("ru = 'Перенос данных из реквизита одного ИдентификаторСообщенияОтправкаIMAP в другой для предотвращения потери данных. - |при переходе на последующие релизы.'"); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОчередьОтложеннойОбработки = 3; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.ЭлектронноеПисьмоИсходящее.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ИзменяемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; - Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьСписокКонтактовИсходящихЭлектронныхПисем"; - Приоритет.Порядок = "Любой"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоВходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "Любой"; - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Процедура = "Документы.ЭлектронноеПисьмоИсходящее.ЗаполнитьВзаимодействияОснованияУПодчиненныхПисем"; - Приоритет.Порядок = "Любой"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; - - -КонецПроцедуры - Процедура ОтключитьПодсистемуВМоделиСервиса() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Константы.ИспользоватьПочтовыйКлиент.Установить(Ложь); Константы.ИспользоватьПризнакРассмотрено.Установить(Ложь); @@ -2905,7 +3317,6 @@ МенеджерЗаписи = РегистрыСведений.НастройкиУчетныхЗаписейЭлектроннойПочты.СоздатьМенеджерЗаписи(); МенеджерЗаписи.УчетнаяЗаписьЭлектроннойПочты = Выборка.Ссылка; - МенеджерЗаписи.ПерсональнаяУчетнаяЗапись = Ложь; МенеджерЗаписи.ВключатьПодписьДляНовыхСообщений = Ложь; МенеджерЗаписи.ВключатьПодписьПриОтветеПересылке = Ложь; МенеджерЗаписи.ОтветственныйЗаОбработкуПисем = Выборка.УдалитьОтветственныйЗаОбработкуПисем; @@ -3324,8 +3735,12 @@ РассчитыватьРассмотрено = (СтарыеЗначенияРеквизитов.Рассмотрено <> Форма.Рассмотрено) ИЛИ (СтарыеЗначенияРеквизитов.Предмет <> Форма.Предмет И ЗначениеЗаполнено(Форма.Предмет)); - СтруктураДляЗаписи = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи( - , Форма.Предмет, Форма.Рассмотрено, Форма.РассмотретьПосле, РассчитыватьРассмотрено); + + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + СтруктураДляЗаписи.Предмет = Форма.Предмет; + СтруктураДляЗаписи.Рассмотрено = Форма.Рассмотрено; + СтруктураДляЗаписи.РассмотретьПосле = Форма.РассмотретьПосле; + СтруктураДляЗаписи.РассчитыватьРассмотрено = РассчитыватьРассмотрено; // Если в качестве предмета устанавливается само взаимодействие то делать ничего не нужно. Если Форма.Предмет = Ссылка Тогда @@ -3470,7 +3885,6 @@ #КонецОбласти - ////////////////////////////////////////////////////////////////////////////////// // Работа с элементами и реквизитами форм списков и документов. @@ -3528,7 +3942,7 @@ "Страница_" + ЭлементМассиваОписания.ИмяВладельца, "Страница_" + ЭлементМассиваОписания.Имя)]); ЭлементТаблица.ПутьКДанным = "Список_" + ЭлементМассиваОписания.Имя; - ЭлементТаблица.УстановитьДействие("Выбор","СписокСправочникаВыбор"); + ЭлементТаблица.УстановитьДействие("Выбор", "Подключаемый_СписокСправочникаВыбор"); ЭлементТаблица.АвтоМаксимальнаяВысота = Ложь; ЭлементТаблица.АвтоМаксимальнаяШирина = Ложь; Если Форма.ИмяФормы = "ОбщаяФорма.ВыборКонтакта" Тогда @@ -3580,12 +3994,21 @@ КонецПроцедуры + // Инициализирует переданную форму списка взаимодействий Форма согласно значениям // функциональных опций. +// Параметры: +// Форма - УправляемаяФорма - форма, для которой выполняется инициализация реквизитов. +// Параметры - Структура - // -Процедура ИнициализироватьФормуСпискаВзаимодействий(Форма) Экспорт +Процедура ИнициализироватьФормуСпискаВзаимодействий(Форма, Параметры) Экспорт - Форма.ТолькоПочта = НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия"); + Если Параметры.Свойство("ТолькоПочта") И Параметры.ТолькоПочта Тогда + Форма.ТолькоПочта = Истина; + Иначе + Форма.ТолькоПочта = НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия"); + КонецЕсли; + Форма.Элементы.СписокСоздатьЭлектронноеПисьмоОтдельнаяКнопка.Видимость = Форма.ТолькоПочта; Форма.Элементы.ГруппаСоздать.Видимость = НЕ Форма.ТолькоПочта; Если Форма.ТолькоПочта Тогда @@ -3639,8 +4062,11 @@ // Процедура УстановитьПредмет(Ссылка, Предмет, РассчитыватьРассмотрено = Истина) Экспорт - Реквизиты = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(, Предмет,,, РассчитыватьРассмотрено); - ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, Реквизиты); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + СтруктураДляЗаписи.Предмет = Предмет; + СтруктураДляЗаписи.РассчитыватьРассмотрено = РассчитыватьРассмотрено; + + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); КонецПроцедуры @@ -3704,7 +4130,7 @@ Письмо, Выборка.ТипТекста, Выборка.Текст,Выборка.ТекстHTML, Выборка.ТипТекста, Выборка.Кодировка, ОбработатьКартинки); Если ДляПечати Тогда - ДополнитьТелоПисьмаШапкойПечатнойФормы(ДокументHTML, Выборка, Ложь); + СформироватьШапкуИПодвалПечатнойФормыПисьма(Письмо, ДокументHTML, Выборка); КонецЕсли; Возврат ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML); @@ -3783,7 +4209,7 @@ Выборка.ТипТекста); ЭлементТелоОснованиеHTML = ДокументОснованиеHTML.Тело; - МассивДочернихУзловТелаОснование = ПолучитьМассивДочернихУзловСодержащихHTML(ЭлементТелоОснованиеHTML); + МассивДочернихУзловТелаОснование = МассивДочернихУзловСодержащихHTML(ЭлементТелоОснованиеHTML); ЭлементDIV = ДобавитьЭлементСАтрибутами(ЭлементТелоОснованиеHTML, "div",Новый Структура("style","border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt")); @@ -3816,7 +4242,7 @@ ВыборкаОснование.ИмяОбъектаМетаданных = "ЭлектронноеПисьмоИсходящее"); ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементDIV,ЭлементШрифт,МассивДочернихУзловТелаОснование); - МассивДочернихУзловТелаТекущее = ПолучитьМассивДочернихУзловСодержащихHTML(ДокументHTML.Тело); + МассивДочернихУзловТелаТекущее = МассивДочернихУзловСодержащихHTML(ДокументHTML.Тело); Для Каждого ДочернийУзел Из МассивДочернихУзловТелаТекущее Цикл ЭлементТелоОснованиеHTML.ВставитьПеред(ДокументОснованиеHTML.ИмпортироватьУзел(ДочернийУзел,Истина),ЭлементDIV); @@ -3828,7 +4254,7 @@ КонецЕсли; Если ДляПечати Тогда - ДополнитьТелоПисьмаШапкойПечатнойФормы(ДокументHTML,Выборка,Истина); + СформироватьШапкуИПодвалПечатнойФормыПисьма(Письмо, ДокументHTML, Выборка); КонецЕсли; Возврат ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML); @@ -3857,7 +4283,7 @@ ТекстHTML, ТипТекстаПреобразование, Кодировка = "", - ОбработатьКартинки = Ложь) + ОбработатьКартинки = Ложь) Экспорт Если ТипТекста <> ТипТекстаПреобразование И ТипТекста <> Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда @@ -3878,24 +4304,30 @@ Если ПустаяСтрока(КодировкаПисьма) Тогда ПозицияАтрибутаКодировки = СтрНайти(ТекстHTML,"charset"); Если ПозицияАтрибутаКодировки <> 0 Тогда - Инд = 0; - Пока КодСимвола(Сред(ТекстHTML,ПозицияАтрибутаКодировки + 8 + Инд,1)) <> 34 Цикл - КодировкаПисьма = КодировкаПисьма + Сред(ТекстHTML,ПозицияАтрибутаКодировки + 8 + Инд,1); - Инд = Инд + 1; - КонецЦикла - Иначе + Инд = 0; + Пока КодСимвола(Сред(ТекстHTML,ПозицияАтрибутаКодировки + 8 + Инд,1)) <> 34 Цикл + КодировкаПисьма = КодировкаПисьма + Сред(ТекстHTML,ПозицияАтрибутаКодировки + 8 + Инд,1); + Инд = Инд + 1; + КонецЦикла + Иначе КодировкаПисьма = "utf8"; КонецЕсли; КонецЕсли; - ТаблицаФайлов = ПолучитьВложенияПисьмаСНеПустымИД(Письмо); + Если ТипЗнч(Письмо) = Тип("Структура") Тогда + ТаблицаФайлов = Письмо.Вложения; + Иначе + ТаблицаФайлов = ПолучитьВложенияПисьмаСНеПустымИД(Письмо); + КонецЕсли; Если ТаблицаФайлов.Количество() Тогда - ДокументHTML = ЗаменитьИдентификаторыКартинокНаПутьКФайлам(ТекстHTML, ТаблицаФайлов, КодировкаПисьма, ОбработатьКартинки); + ДокументHTML = ЗаменитьИдентификаторыКартинокНаПутьКФайлам(ТекстHTML, ТаблицаФайлов, КодировкаПисьма, ОбработатьКартинки); Иначе + ДокументHTML = ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекстHTML, КодировкаПисьма); + КонецЕсли; КонецЕсли; @@ -3927,8 +4359,6 @@ ТекстHTML = "" + ТекстHTML + "" КонецЕсли; - ТекстHTML = СодержимоеТегаHTML(ТекстHTML, "html", Истина); - ТаблицаФайлов = ПолучитьВложенияПисьмаСНеПустымИД(Письмо); Если ТаблицаФайлов.Количество() Тогда @@ -3951,49 +4381,6 @@ КонецФункции -// Находит в HTML содержимое находящееся в теге. -// -// Параметры: -// Текст - Строка - текст XML, в котором выполняется поиск. -// ИмяТега - Строка - тег, содержимое которого необходимо найти. -// ВключатьОткрывающийЗакрывающийТег - Булево - признак того, что найденное включает открывающий и закрывающий тег, по умолчанию Ложь. -// НомерПоПорядку - Число - позиция, с которой начинается поиск, по умолчанию 1. -// -// Возвращаемое значение: -// Строка - строка, из которой удалены символы перевода строки и возврата каретки. -// -Функция СодержимоеТегаHTML(Текст, ИмяТега, ВключатьОткрывающийЗакрывающийТег = Ложь, НомерПоПорядку = 1) - - Результат = Неопределено; - - Начало = "<" + ИмяТега; - Окончание = ""; - - Содержимое = Сред( - Текст, - СтрНайти(Текст, Начало, НаправлениеПоиска.СНачала, 1, НомерПоПорядку), - СтрНайти(Текст, Окончание, НаправлениеПоиска.СНачала, 1, НомерПоПорядку) + СтрДлина(Окончание) - СтрНайти(Текст, Начало, НаправлениеПоиска.СНачала, 1, НомерПоПорядку)); - - Если ВключатьОткрывающийЗакрывающийТег Тогда - - Результат = СокрЛП(Содержимое); - - Иначе - - ОткрывающийТег = Лев(Содержимое, СтрНайти(Содержимое, ">")); - Содержимое = СтрЗаменить(Содержимое, ОткрывающийТег, ""); - - ЗакрывающийТег = Прав(Содержимое, СтрДлина(Содержимое) - СтрНайти(Содержимое, "<", НаправлениеПоиска.СКонца) + 1); - Содержимое = СтрЗаменить(Содержимое, ЗакрывающийТег, ""); - - Результат = СокрЛП(Содержимое); - - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Возвращает формат исходящих писем по умолчанию для пользователя, // исходя из настроек системы и формата последнего письма, отправленного пользователем. // @@ -4042,9 +4429,9 @@ // Заменяет в тексте HTML ИД картинок вложений на путь к файлам и создает объект документ HTML. // // Параметры: -// ТекстHTML - Строка - обрабатываемый текст HTML. -// Атрибут - ТаблицаЗначений - таблица, содержащая информацию о присоединенных файлов. -// Кодировка - Строка - кодировка текста HTML. +// ТекстHTML - Строка - обрабатываемый текст HTML. +// ТаблицаФайлов - ТаблицаЗначений - таблица, содержащая информацию о присоединенных файлов. +// Кодировка - Строка - кодировка текста HTML. // // Возвращаемое значение: // ДокументHTML - созданный документ HTML. @@ -4066,17 +4453,29 @@ НовыйАтрибутКартинки = АтрибутИсточникКартинки.КлонироватьУзел(Ложь); Если ОбработатьКартинки Тогда - ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + Если ЭтоАдресВременногоХранилища(ПрисоединенныйФайл.Ссылка) Тогда + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПрисоединенныйФайл.Ссылка); + Расширение = ПрисоединенныйФайл.Расширение; + Иначе + ДанныеФайла = РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + Расширение = ДанныеФайла.Расширение; + КонецЕсли; ТекстовоеСодержимое = Base64Строка(ДвоичныеДанные); - ТекстовоеСодержимое = "data:image/" + Сред(ДанныеФайла.Расширение,2) + ";base64," + Символы.ПС + ТекстовоеСодержимое; + ТекстовоеСодержимое = "data:image/" + Сред(Расширение,2) + ";base64," + Символы.ПС + ТекстовоеСодержимое; Иначе // Если данные картинки получить не удалось, то картинку не выводим. Пользователю при этом ничего не сообщаем. - Попытка - ТекстовоеСодержимое = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла; - Исключение - ТекстовоеСодержимое = ""; - КонецПопытки; + + Если ЭтоАдресВременногоХранилища(ПрисоединенныйФайл.Ссылка) Тогда + ТекстовоеСодержимое = ПрисоединенныйФайл.Ссылка; + Иначе + Попытка + ТекстовоеСодержимое = РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла; + Исключение + ТекстовоеСодержимое = ""; + КонецПопытки; + КонецЕсли; + КонецЕсли; НовыйАтрибутКартинки.ТекстовоеСодержимое = ТекстовоеСодержимое; @@ -4224,7 +4623,7 @@ СтруктураВложений.Вставить( ПрисоединенныйФайл.Наименование, Новый Картинка(ПолучитьИзВременногоХранилища( - ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла))); + РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла))); Прервать; @@ -4250,19 +4649,6 @@ КонецФункции -// Добавляет строку с данными исходного письма. -// Параметры: -// ЭлементРодитель - ЭлементHTML - родительский элемент HTML, для которого будет добавлены данные исходного письма. -// Атрибут - Строка - наименование данных. -// Значение - Строка - строка с данными. -// -Процедура ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементРодитель,Атрибут,Значение) - - ДобавитьТекстовыйУзел(ЭлементРодитель,Атрибут + ": ",Истина); - ДобавитьТекстовыйУзел(ЭлементРодитель,Значение,,Истина); - -КонецПроцедуры - // Получает представление получателей входящего письма. // // Параметры: @@ -4301,22 +4687,33 @@ // Функция СформироватьЭлементДанныхШапкиПисьма(ЭлементРодитель,Выборка,ТолькоПоПредставлениюОтправителя = Ложь) Экспорт - ЭлементШрифт = ДобавитьЭлементСАтрибутами(ЭлементРодитель, "Font", Новый Структура("size,face","2","Tahoma")); - ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементШрифт, "From", - Выборка.ОтправительПредставление + ?(ТолькоПоПредставлениюОтправителя Или ПустаяСтрока(Выборка.ОтправительАдрес), - "", - "[" + Выборка.ОтправительАдрес +"]")); - ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементШрифт, "Sent", Формат(Выборка.Дата,"ДЛФ=D'")); - ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементШрифт, "To", - ПолучитьПредставленияПолучателейВходящегоПисьма(Выборка.ПолучателиПисьма.Выгрузить())); - ТаблицаПолучателейКопий = Выборка.ПолучателиКопий.Выгрузить(); - Если ТаблицаПолучателейКопий.Количество() > 0 Тогда - ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементШрифт, "cc", - ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателейКопий)); - КонецЕсли; - ДобавитьСтрокуДанныхИсходногоПисьма(ЭлементШрифт,"Subject",Выборка.Тема); + ДокументВладелец = ЭлементРодитель.ДокументВладелец; - Возврат ЭлементШрифт; + ЭлементТаблица = ДокументВладелец.СоздатьЭлемент("table"); + УстановитьАтрибутЭлементаHTML(ЭлементТаблица,"border", "0"); + + ОтправительПредставление = Выборка.ОтправительПредставление + + ?(ТолькоПоПредставлениюОтправителя Или ПустаяСтрока(Выборка.ОтправительАдрес), + "", + "[" + Выборка.ОтправительАдрес +"]"); + + ДобавитьСтрокуВТаблицу(ЭлементТаблица, "From: ", ОтправительПредставление); + ДобавитьСтрокуВТаблицу(ЭлементТаблица, "Sent: ", Формат(Выборка.Дата,"ДЛФ=D'")); + + ТаблицаПолучателейПисьма = ?(ТипЗнч(Выборка.ПолучателиПисьма) = Тип("ТаблицаЗначений"),Выборка.ПолучателиПисьма, Выборка.ПолучателиПисьма.Выгрузить()); + ДобавитьСтрокуВТаблицу(ЭлементТаблица, "To: ", ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателейПисьма)); + + ТаблицаПолучателейКопий = ?(ТипЗнч(Выборка.ПолучателиКопий) = Тип("ТаблицаЗначений"),Выборка.ПолучателиКопий, Выборка.ПолучателиКопий.Выгрузить()); + Если ТаблицаПолучателейКопий.Количество() > 0 Тогда + ДобавитьСтрокуВТаблицу(ЭлементТаблица, "cc: ", ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателейКопий)); + + КонецЕсли; + + + Тема = ?(ПустаяСтрока(Выборка.Тема), НСтр("ru = '<Без Темы>'"), Выборка.Тема); + ДобавитьСтрокуВТаблицу(ЭлементТаблица, "Subject: ", Выборка.Тема); + + Возврат ЭлементТаблица; КонецФункции @@ -4326,34 +4723,24 @@ // Выборка - ВыборкаИзРезультатаЗапроса - выборка по данным письма. // ЭтоИсходящее - Булево - Истина если письмо исходящее, Ложь если исходящее. // -Процедура ДополнитьТелоПисьмаШапкойПечатнойФормы(ДокументHTML,Выборка,ЭтоИсходящее) +Процедура ДополнитьТелоПисьмаШапкойПечатнойФормы(ДокументHTML, Выборка, ЭтоИсходящее) Экспорт - Если ДокументHTML.Тело = Неопределено Тогда - ЭлементТелоПисьма = ДокументHTML.СоздатьЭлемент("body"); - ДокументHTML.Тело = ЭлементТелоПисьма; - Иначе - ЭлементТелоПисьма = ДокументHTML.Тело; - КонецЕсли; - - МассивДочернихУзловТела = ПолучитьМассивДочернихУзловСодержащихHTML(ЭлементТелоПисьма); + ЭлементТелоПисьма = ЭлементТелоПисьма(ДокументHTML); + МассивДочернихУзловТела = МассивДочернихУзловСодержащихHTML(ЭлементТелоПисьма); // Имя пользователя учетной записи. ЭлементПользователь = СформироватьЭлементИмяПользователяУчетнойЗаписи(ЭлементТелоПисьма, Выборка); ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементТелоПисьма,ЭлементПользователь, МассивДочернихУзловТела); - // Горизонтальный разделитель - СтруктураАтрибутов = Новый Структура; - СтруктураАтрибутов.Вставить("size", "2"); - СтруктураАтрибутов.Вставить("width", "100%"); - СтруктураАтрибутов.Вставить("align", "center"); - СтруктураАтрибутов.Вставить("tabindex", "-1"); - - ЭлементHR = ДобавитьЭлементСАтрибутами(ЭлементТелоПисьма, "hr", СтруктураАтрибутов); - ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементТелоПисьма,ЭлементHR,МассивДочернихУзловТела); + ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементТелоПисьма, + ЭлементГоризонтальныйРазделитель(ЭлементТелоПисьма), + МассивДочернихУзловТела); // Шапка письма ЭлементДанныеШапкиПисьма = СформироватьЭлементДанныхШапкиПисьма(ЭлементТелоПисьма,Выборка,ЭтоИсходящее); ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементТелоПисьма,ЭлементДанныеШапкиПисьма,МассивДочернихУзловТела); + ЭлементBR = ДокументHTML.СоздатьЭлемент("br"); + ВставитьЭлементHTMLПервымДочернимЭлементом(ЭлементТелоПисьма, ЭлементBR, МассивДочернихУзловТела); КонецПроцедуры @@ -4362,7 +4749,9 @@ // ДокументHTML - ДокументHTML - документ HTML в котором будет выполняться замена. // ТаблицаСоответствий - ТаблицаЗначений - таблица соответствий имен файлов и идентификаторов. // -Процедура ЗаменитьИменаКартинокНаИдентификаторыПочтовыхВложенийВHTML(ДокументHTML,ТаблицаСоответствий) Экспорт +Процедура ЗаменитьИменаКартинокНаИдентификаторыПочтовыхВложенийВHTML(ДокументHTML, ТаблицаСоответствий) Экспорт + + ТаблицаСоответствий.Индексы.Добавить("ИмяФайла"); Для каждого Картинка Из ДокументHTML.Картинки Цикл @@ -4390,6 +4779,35 @@ КонецФункции +Процедура СформироватьШапкуИПодвалПечатнойФормыПисьма(Письмо, ДокументHTML, Выборка) + + ДополнитьТелоПисьмаШапкойПечатнойФормы(ДокументHTML,Выборка,Истина); + + ТаблицаВложения = УправлениеЭлектроннойПочтой.ПолучитьВложенияЭлектронногоПисьма(Письмо, Истина, Истина); + Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда + + ТаблицаПисемВложений = ДанныеХранимыхВБазеПисемВложений(Письмо); + + Для Каждого ПисьмоВложение Из ТаблицаПисемВложений Цикл + + НоваяСтрока = ТаблицаВложения.Добавить(); + НоваяСтрока.ИмяФайла = ВзаимодействияКлиентСервер.ПредставлениеПисьма(ПисьмоВложение.Тема, ПисьмоВложение.Дата) + ".eml"; + НоваяСтрока.ИндексКартинки = 0; + НоваяСтрока.ПодписанЭП = Ложь; + НоваяСтрока.ИДФайлаЭлектронногоПисьма = ""; + НоваяСтрока.Размер = ПисьмоВложение.Размер; + НоваяСтрока.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(ПисьмоВложение.Размер) + + КонецЦикла + + КонецЕсли; + + Если ТаблицаВложения.Количество() > 0 Тогда + ДополнитьТелоПисьмаПодваломВложения(ДокументHTML, ТаблицаВложения); + КонецЕсли; + +КонецПроцедуры + // Оценивает размер электронного письма. // // Параметры: @@ -4457,7 +4875,7 @@ // Возвращаемое значение: // Массив - массив дочерних узлов содержащих HTML. // -Функция ПолучитьМассивДочернихУзловСодержащихHTML(Элемент) Экспорт +Функция МассивДочернихУзловСодержащихHTML(Элемент) Экспорт МассивДочернихУзлов = Новый Массив; @@ -4507,23 +4925,10 @@ КонецЕсли; Если Кодировка = Неопределено Тогда - ЧтениеHTML.УстановитьСтроку(ТекстHTML); - Иначе - - Попытка - - ЧтениеHTML.УстановитьСтроку(ТекстHTML, Кодировка); - - Исключение - - ЧтениеHTML.УстановитьСтроку(ТекстHTML); - - КонецПопытки; - + ЧтениеHTML.УстановитьСтроку(ТекстHTML, Кодировка); КонецЕсли; - Возврат Построитель.Прочитать(ЧтениеHTML); КонецФункции @@ -4545,11 +4950,15 @@ ЭлементБлок = ДокументHTML.СоздатьЭлемент("p"); ЭлементТело.ДобавитьДочерний(ЭлементБлок); + ЭлементШрифт = ЭлементШрифт(ДокументHTML, "2", "Tahoma"); + КоличествоСтрок = СтрЧислоСтрок(Текст); Для Инд = 1 По КоличествоСтрок Цикл - ДобавитьТекстовыйУзел(ЭлементБлок, СтрПолучитьСтроку(Текст, Инд), Ложь, ?(Инд = КоличествоСтрок, Ложь, Истина)); + ДобавитьТекстовыйУзел(ЭлементШрифт, СтрПолучитьСтроку(Текст, Инд), Ложь, ?(Инд = КоличествоСтрок, Ложь, Истина)); КонецЦикла; + ЭлементБлок.ДобавитьДочерний(ЭлементШрифт); + Возврат ДокументHTML; КонецФункции @@ -4680,6 +5089,100 @@ КонецПроцедуры +Процедура ДобавитьСтрокуВТаблицу(ЭлементРодитель, ЗначениеКолонки1 = Неопределено, ЗначениеКолонки2 = Неопределено, ЗначениеКолонки3 = Неопределено) + + ДокументВладелец = ЭлементРодитель.ДокументВладелец; + ЭлементСтрокаТаблицы = ДокументВладелец.СоздатьЭлемент("tr"); + Если ЗначениеКолонки1 <> Неопределено Тогда + ДобавитьЯчейкуВТаблицу(ЭлементСтрокаТаблицы, ЗначениеКолонки1, Истина); + КонецЕсли; + Если ЗначениеКолонки2 <> Неопределено Тогда + ДобавитьЯчейкуВТаблицу(ЭлементСтрокаТаблицы, ЗначениеКолонки2); + КонецЕсли; + Если ЗначениеКолонки3 <> Неопределено Тогда + ДобавитьЯчейкуВТаблицу(ЭлементСтрокаТаблицы, ЗначениеКолонки3); + КонецЕсли; + + ЭлементРодитель.ДобавитьДочерний(ЭлементСтрокаТаблицы); + +КонецПроцедуры + +Процедура ДобавитьЯчейкуВТаблицу(ЭлементСтрока, ЗначениеЯчейки, ВыделятьЖирным = Ложь) + + ЭлементЯчейка = ЭлементСтрока.ДокументВладелец.СоздатьЭлемент("td"); + ЭлементШрифт = ЭлементШрифт(ЭлементСтрока.ДокументВладелец, "2", "Tahoma"); + + Если ВыделятьЖирным Тогда + ЭлементЖирный = ЭлементШрифт.ДокументВладелец.СоздатьЭлемент("b"); + ЭлементЖирный.ТекстовоеСодержимое = ЗначениеЯчейки; + ЭлементШрифт.ДобавитьДочерний(ЭлементЖирный); + Иначе + ЭлементШрифт.ТекстовоеСодержимое = ЗначениеЯчейки; + КонецЕсли; + + ЭлементЯчейка.ДобавитьДочерний(ЭлементШрифт); + ЭлементСтрока.ДобавитьДочерний(ЭлементЯчейка); + +КонецПроцедуры + +Процедура ДополнитьТелоПисьмаПодваломВложения(ДокументHTML, Вложения) Экспорт + + ЭлементТелоПисьма = ЭлементТелоПисьма(ДокументHTML); + ЭлементТелоПисьма.ДобавитьДочерний(ЭлементГоризонтальныйРазделитель(ЭлементТелоПисьма)); + + ЭлементШрифт = ДобавитьЭлементСАтрибутами(ЭлементТелоПисьма, + "Font", + Новый Структура("size,face","2", "Tahoma")); + + СтрокаКоличествоВложений = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вложений: %1.'"), Вложения.Количество()); + ДобавитьТекстовыйУзел(ЭлементШрифт, СтрокаКоличествоВложений, Истина, Истина); + + Для Каждого Вложение Из Вложения Цикл + + ПредставлениеВложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (%2).'"), Вложение.ИмяФайла, Вложение.РазмерПредставление); + ДобавитьТекстовыйУзел(ЭлементШрифт, ПредставлениеВложения, , Истина); + + КонецЦикла; + + ЭлементТелоПисьма.ДобавитьДочерний(ЭлементШрифт); + +КонецПроцедуры + +Функция ЭлементГоризонтальныйРазделитель(ЭлементРодитель) + + СтруктураАтрибутов = Новый Структура; + СтруктураАтрибутов.Вставить("size", "2"); + СтруктураАтрибутов.Вставить("width", "100%"); + СтруктураАтрибутов.Вставить("align", "center"); + СтруктураАтрибутов.Вставить("tabindex", "-1"); + + Возврат ДобавитьЭлементСАтрибутами(ЭлементРодитель, "hr", СтруктураАтрибутов); + +КонецФункции + +Функция ЭлементТелоПисьма(ДокументHTML) + + Если ДокументHTML.Тело = Неопределено Тогда + ЭлементТелоПисьма = ДокументHTML.СоздатьЭлемент("body"); + ДокументHTML.Тело = ЭлементТелоПисьма; + Иначе + ЭлементТелоПисьма = ДокументHTML.Тело; + КонецЕсли; + + Возврат ЭлементТелоПисьма; + +КонецФункции + +Функция ЭлементШрифт(ДокументHTML, Размер, ИмяШрифта) + + ЭлементШрифт = ДокументHTML.СоздатьЭлемент("Font"); + УстановитьАтрибутЭлементаHTML(ЭлементШрифт,"size", Размер); + УстановитьАтрибутЭлементаHTML(ЭлементШрифт,"face", ИмяШрифта); + + Возврат ЭлементШрифт; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////////// // Работа с настройками @@ -4924,8 +5427,22 @@ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОтправкаSMS); + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Возврат; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда + Возврат; + КонецЕсли; + + МетаданныеДокумента = Метаданные.Документы.СообщениеSMS; + + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начата регламентная отправка сообщений SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + ТаблицаАдресатовСообщения = Новый ТаблицаЗначений; ТаблицаАдресатовСообщения.Колонки.Добавить("НомерСтроки"); ТаблицаАдресатовСообщения.Колонки.Добавить("НомерДляОтправки"); @@ -4962,21 +5479,8 @@ | Ссылка"; Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()); - - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - Возврат; - КонецЕсли; - - Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда - ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); - Возврат; - КонецЕсли; - - ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); - + ВыборкаДокументы = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаДокументы.Следующий() Цикл ТаблицаАдресатовСообщения.Очистить(); @@ -4996,19 +5500,48 @@ Продолжить; КонецЕсли; - МассивНомеров = ТаблицаАдресатовСообщения.ВыгрузитьКолонку("НомерДляОтправки"); - РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, ТекстСообщения, "", ОтправлятьВТранслите); + НачатьТранзакцию(); + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеДокумента.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДокументы.Ссылка); + Блокировка.Заблокировать(); - Если РезультатОтправки.ОтправленныеСообщения.Количество() = 0 Тогда - Продолжить; - КонецЕсли; - - ДокументОбъект = ВыборкаДокументы.Ссылка.ПолучитьОбъект(); - ОтразитьРезультатыОтправкиSMSВДокументе(ДокументОбъект, РезультатОтправки); - ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); - ДокументОбъект.Записать(); + МассивНомеров = ТаблицаАдресатовСообщения.ВыгрузитьКолонку("НомерДляОтправки"); + РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, ТекстСообщения, "", ОтправлятьВТранслите); + + Если РезультатОтправки.ОтправленныеСообщения.Количество() = 0 Тогда + ОтменитьТранзакцию(); + Продолжить; + КонецЕсли; + + ДокументОбъект = ВыборкаДокументы.Ссылка.ПолучитьОбъект(); + ОтразитьРезультатыОтправкиSMSВДокументе(ДокументОбъект, РезультатОтправки); + ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); + ДокументОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + + ТекстСообщения = НСтр("ru = 'Не удалось отправить : %Ссылка% по причине: %Причина%'"); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаДокументы.Ссылка); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, + МетаданныеДокумента, + ВыборкаДокументы.Ссылка, + ТекстСообщения); + ОтменитьТранзакцию(); + + КонецПопытки; КонецЦикла; + + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Закончена регламентная отправка сообщений SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); КонецПроцедуры @@ -5019,8 +5552,22 @@ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбновлениеСтатусовДоставкиSMS); + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Возврат; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда + Возврат; + КонецЕсли; + + МетаданныеДокумента = Метаданные.Документы.СообщениеSMS; + + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начато регламентное обновление состояний сообщений SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + ТаблицаИзменившихсяСтатусов = Новый ТаблицаЗначений; ТаблицаИзменившихсяСтатусов.Колонки.Добавить("НомерСтроки"); ТаблицаИзменившихсяСтатусов.Колонки.Добавить("СостояниеСообщения"); @@ -5043,37 +5590,36 @@ |ИТОГИ ПО | Ссылка"; - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - Возврат; - КонецЕсли; - - Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда - ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); - Возврат; - КонецЕсли; - - ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + ВыборкаДокументы = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаДокументы.Следующий() Цикл ТаблицаИзменившихсяСтатусов.Очистить(); - ВыборкаИдентификаторы = ВыборкаДокументы.Выбрать(); - Пока ВыборкаИдентификаторы.Следующий() Цикл + НачатьТранзакцию(); + Попытка - СостояниеСообщения = СостояниеСообщенияSMSСогласноСтатусуДоставки(ОтправкаSMS.СтатусДоставки(ВыборкаИдентификаторы.ИдентификаторСообщения)); - - Если СостояниеСообщения <> ВыборкаИдентификаторы.СостояниеСообщения Тогда - НоваяСтрока = ТаблицаИзменившихсяСтатусов.Добавить(); - НоваяСтрока.НомерСтроки = ВыборкаИдентификаторы.НомерСтроки; - НоваяСтрока.СостояниеСообщения = СостояниеСообщения; - КонецЕсли; + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеДокумента.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДокументы.Ссылка); + Блокировка.Заблокировать(); + + ВыборкаИдентификаторы = ВыборкаДокументы.Выбрать(); + Пока ВыборкаИдентификаторы.Следующий() Цикл + + СостояниеСообщения = СостояниеСообщенияSMSСогласноСтатусуДоставки(ОтправкаSMS.СтатусДоставки(ВыборкаИдентификаторы.ИдентификаторСообщения)); + + Если СостояниеСообщения <> ВыборкаИдентификаторы.СостояниеСообщения Тогда + НоваяСтрока = ТаблицаИзменившихсяСтатусов.Добавить(); + НоваяСтрока.НомерСтроки = ВыборкаИдентификаторы.НомерСтроки; + НоваяСтрока.СостояниеСообщения = СостояниеСообщения; + КонецЕсли; + + КонецЦикла; Если ТаблицаИзменившихсяСтатусов.Количество() = 0 Тогда Продолжить; + ОтменитьТранзакцию(); КонецЕсли; Для Каждого ИзменившийсяСтатус Из ТаблицаИзменившихсяСтатусов Цикл @@ -5085,10 +5631,28 @@ ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ДокументОбъект.Записать(); - КонецЦикла; + ЗафиксироватьТранзакцию(); + + Исключение + + ТекстСообщения = НСтр("ru = 'Не удалось обновить статусы доставки : %Ссылка% по причине: %Причина%'"); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаДокументы.Ссылка); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, + МетаданныеДокумента, + ВыборкаДокументы.Ссылка, + ТекстСообщения); + ОтменитьТранзакцию(); + + КонецПопытки; КонецЦикла; + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Закончено регламентное обновление состояний сообщений SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + КонецПроцедуры // Устанавливает состояние документа "Сообщение SMS" в зависимости от состояний отдельных сообщений различным контактам. @@ -5128,11 +5692,17 @@ КонецЕсли; Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаВедениеПапок + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВЫБОР + | КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ТОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаВедениеПапок + | ИНАЧЕ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи + | КОНЕЦ КАК ОтветственныйЗаВедениеПапок |ИЗ | РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + | ПО НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка |ГДЕ | НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = &УчетнаяЗаписьЭлектроннойПочты | И НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаВедениеПапок = &ОтветственныйЗаВедениеПапок"; @@ -5158,6 +5728,8 @@ // Процедура УстановитьРодителяУПапки(Папка, НовыйРодитель, НеЗаписыватьПапку = Ложь) Экспорт + МетаданныеСправочника = Метаданные.Справочники.ПапкиЭлектронныхПисем; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ПапкиЭлектронныхПисем.Ссылка @@ -5199,18 +5771,26 @@ ПеремещениеВПапкуУдаленные = Истина; КонецЕсли; - ПапкаОбъект = Папка.ПолучитьОбъект(); - ПапкаОбъект.ДополнительныеСвойства.Вставить("ОбработаноИзменениеРодителя", Истина); - - Если Не НеЗаписыватьПапку Тогда - ПапкаОбъект.Родитель = НовыйРодитель; - ПапкаОбъект.Записать(); - КонецЕсли; - - ПеремещениеВПапкуУдаленные = Ложь; - - Если НЕ НовыйРодитель.Пустая()Тогда - ЗначенияРеквизитовПапки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( + НачатьТранзакцию(); + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеСправочника.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Папка); + Блокировка.Заблокировать(); + + ПапкаОбъект = Папка.ПолучитьОбъект(); + ПапкаОбъект.ДополнительныеСвойства.Вставить("ОбработаноИзменениеРодителя", Истина); + + Если Не НеЗаписыватьПапку Тогда + ПапкаОбъект.Родитель = НовыйРодитель; + ПапкаОбъект.Записать(); + КонецЕсли; + + ПеремещениеВПапкуУдаленные = Ложь; + + Если НЕ НовыйРодитель.Пустая()Тогда + ЗначенияРеквизитовПапки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( НовыйРодитель,"ПредопределеннаяПапка,Наименование"); Если ЗначенияРеквизитовПапки <> Неопределено И ЗначенияРеквизитовПапки.ПредопределеннаяПапка @@ -5218,16 +5798,25 @@ ПеремещениеВПапкуУдаленные = Истина; + КонецЕсли; КонецЕсли; - КонецЕсли; - - Если ПеремещениеВПапкуУдаленные И НЕ ПапкаОбъект.ПометкаУдаления Тогда - ПапкаОбъект.УстановитьПометкуУдаления(Истина); - УстановитьПометкуУдаленияДляПисемПапки(Папка); - ИначеЕсли ПапкаОбъект.ПометкаУдаления И НЕ ПеремещениеВПапкуУдаленные Тогда - ПапкаОбъект.УстановитьПометкуУдаления(Ложь); - УстановитьПометкуУдаленияДляПисемПапки(Папка); - КонецЕсли; + + Если ПеремещениеВПапкуУдаленные И НЕ ПапкаОбъект.ПометкаУдаления Тогда + ПапкаОбъект.УстановитьПометкуУдаления(Истина); + УстановитьПометкуУдаленияДляПисемПапки(Папка); + ИначеЕсли ПапкаОбъект.ПометкаУдаления И НЕ ПеремещениеВПапкуУдаленные Тогда + ПапкаОбъект.УстановитьПометкуУдаления(Ложь); + УстановитьПометкуУдаленияДляПисемПапки(Папка); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; КонецПроцедуры @@ -5989,16 +6578,6 @@ /////////////////////////////////////////////////////////////////////////////////// // Расчет состояний -// Выполняет полный перерасчет состояний по папкам, контактам и предметам. -// -Процедура ВыполнитьПолныйПерерасчетСостояний() Экспорт - - РассчитатьРассмотреноПоПапкам(Неопределено); - РассчитатьРассмотреноПоКонтактам(Неопределено); - РассчитатьРассмотреноПоПредметам(Неопределено); - -КонецПроцедуры - // Рассчитывает состояния предметов взаимодействий. // // Параметры: @@ -6497,6 +7076,8 @@ КонецЕсли; + СформированнаяТаблица.Индексы.Добавить("ПоЧемуРассчитывать"); + Возврат СформированнаяТаблица; КонецФункции @@ -6507,7 +7088,7 @@ // ДополнительныеСвойства - Структура - дополнительные свойства набора записей или документа взаимодействий. // // Возвращаемое значение: -// Булево - признак необходимости расчета состояний папок, предметов или контактов взаимодействий". +// Булево - признак необходимости расчета состояний папок, предметов или контактов взаимодействий. // Функция РассчитыватьРассмотрено(ДополнительныеСвойства) Экспорт Перем РассчитыватьРассмотрено; @@ -6566,8 +7147,11 @@ Пока Выборка.Следующий() Цикл - Реквизиты = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(,,ЗначениеПризнака,,ЛОЖЬ); - ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Выборка.Взаимодействие, Реквизиты); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + СтруктураДляЗаписи.Рассмотрено = ЗначениеПризнака; + СтруктураДляЗаписи.РассчитыватьРассмотрено = Ложь; + + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Выборка.Взаимодействие, СтруктураДляЗаписи); ЕстьИзменения = Истина; КонецЦикла; @@ -7080,35 +7664,60 @@ КонецЕсли; ВыборкаВзаимодействие = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); - Пока ВыборкаВзаимодействие.Следующий() Цикл - ВыборкаДетали = ВыборкаВзаимодействие.Выбрать(); + + НачатьТранзакцию(); + Попытка - НаборЗаписей = РегистрыСведений.КонтактыВзаимодействий.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Взаимодействие.Установить(ВыборкаВзаимодействие.Взаимодействие); + Блокировка = Новый БлокировкаДанных; - Пока ВыборкаДетали.Следующий() Цикл + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КонтактыВзаимодействий"); + ТаблицаОбластиБлокировки = Новый ТаблицаЗначений; + ТаблицаОбластиБлокировки.Колонки.Добавить("Взаимодействие"); + Для Каждого ЭлементМассива Из МассивВзаимодействий Цикл + НоваяСтрока = ТаблицаОбластиБлокировки.Добавить(); + НоваяСтрока.Взаимодействие = ЭлементМассива; + КонецЦикла; + ЭлементБлокировки.ИсточникДанных = ТаблицаОбластиБлокировки; + Блокировка.Заблокировать(); + + Пока ВыборкаВзаимодействие.Следующий() Цикл + ВыборкаДетали = ВыборкаВзаимодействие.Выбрать(); - НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Взаимодействие = ВыборкаВзаимодействие.Взаимодействие; - Если ВыборкаДетали.Контакт <> Неопределено Тогда - НоваяЗапись.Контакт = ВыборкаДетали.Контакт; - Иначе - СтроковыйКонтактВзаимодействий = Справочники.СтроковыеКонтактыВзаимодействий.СоздатьЭлемент(); - СтроковыйКонтактВзаимодействий.Наименование = ВыборкаДетали.ПредставлениеКонтакта; - СтроковыйКонтактВзаимодействий.Записать(); - НоваяЗапись.Контакт = СтроковыйКонтактВзаимодействий.Ссылка; + НаборЗаписей = РегистрыСведений.КонтактыВзаимодействий.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Взаимодействие.Установить(ВыборкаВзаимодействие.Взаимодействие); + + Пока ВыборкаДетали.Следующий() Цикл + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Взаимодействие = ВыборкаВзаимодействие.Взаимодействие; + Если ВыборкаДетали.Контакт <> Неопределено Тогда + НоваяЗапись.Контакт = ВыборкаДетали.Контакт; + Иначе + СтроковыйКонтактВзаимодействий = Справочники.СтроковыеКонтактыВзаимодействий.СоздатьЭлемент(); + СтроковыйКонтактВзаимодействий.Наименование = ВыборкаДетали.ПредставлениеКонтакта; + СтроковыйКонтактВзаимодействий.Записать(); + НоваяЗапись.Контакт = СтроковыйКонтактВзаимодействий.Ссылка; + КонецЕсли; + + КонецЦикла; + + Если РассчитыватьРассмотрено Тогда + НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", Истина); КонецЕсли; + НаборЗаписей.Записать(); + КонецЦикла; - Если РассчитыватьРассмотрено Тогда - НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", Истина); - КонецЕсли; + ЗафиксироватьТранзакцию(); + + Исключение - НаборЗаписей.Записать(); + ОтменитьТранзакцию(); + ВызватьИсключение; - КонецЦикла - + КонецПопытки; + КонецПроцедуры // Удаляет повторяющиеся элементы массива. @@ -7246,9 +7855,12 @@ | ЖурналДокументов.Взаимодействия КАК Взаимодействия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий | ПО Взаимодействия.Ссылка = ПредметыВзаимодействий.Взаимодействие + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + | ПО Взаимодействия.УчетнаяЗапись = УчетныеЗаписиЭлектроннойПочты.Ссылка |ГДЕ | ТИПЗНАЧЕНИЯ(Взаимодействия.Ссылка) = ТИП(Документ.ЭлектронноеПисьмоВходящее) | И ПредметыВзаимодействий.Рассмотрено = ЛОЖЬ + | И НЕ УчетныеЗаписиЭлектроннойПочты.Ссылка IS NULL | |СГРУППИРОВАТЬ ПО | Взаимодействия.УчетнаяЗапись"; @@ -7284,5 +7896,64 @@ КонецФункции +Функция РасширениеДляФайловПодписи() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьКлиентСервер = + ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьКлиентСервер"); + + Возврат МодульЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи; + Иначе + Возврат "p7s"; + КонецЕсли; + +КонецФункции + +Процедура ЗаменитьОтветственногоВДокументе(Взаимодействие, Ответственный) Экспорт + + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Взаимодействие)).ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Взаимодействие); + Блокировка.Заблокировать(); + + Объект = Взаимодействие.ПолучитьОбъект(); + Объект.Ответственный = Ответственный; + Объект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); + Объект.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + +КонецПроцедуры + +// Проверяет наличие табличной части у справочника. +// +// Параметры: +// ИмяСправочника - Строка - имя справочника, для которого осуществляется проверка. +// ИмяТабличнойЧасти - Строка - имя табличной части, наличие которой проверяется. +// +// Возвращаемое значение: +// Булево - Истина, если табличная часть есть. +// +// Пример: +// Если Не НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация") Тогда +// Возврат; +// КонецЕсли; +// +Функция НаличиеТабличнойЧастиУСправочника(ИмяСправочника, ИмяТабличнойЧасти) + + Возврат (Метаданные.Справочники[ИмяСправочника].ТабличныеЧасти.Найти(ИмяТабличнойЧасти) <> Неопределено); + +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl index 98ee1f5b0..660b727b0 100644 --- a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl @@ -1,4 +1,3 @@ - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -11,7 +10,7 @@ // Представление - Строка - в данный параметр будет помещено полученное представление. // СтрокаКИ - Строка - в данный параметр будет помещено полученная контактная информация. // -Процедура ПолучитьПредставлениеИВсюКонтактнуюИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено) Экспорт +Процедура ПредставлениеИВсяКонтактнаяИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено) Экспорт Представление = ""; СтрокаКИ = ""; @@ -22,27 +21,27 @@ КонецЕсли; ИмяТаблицы = Контакт.Метаданные().Имя; - ИмяПоляДляНаименованияВладельца = Взаимодействия.ПолучитьИмяПоляДляНаименованияВладельца(ИмяТаблицы); + ИмяПоляДляНаименованияВладельца = Взаимодействия.ИмяПоляДляНаименованияВладельца(ИмяТаблицы); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | Таблица.Наименование, + | СправочникКонтакт.Наименование КАК Наименование, | " + ИмяПоляДляНаименованияВладельца + " КАК НаименованиеВладельца |ИЗ - | Справочник." + ИмяТаблицы + " КАК Таблица + | Справочник." + ИмяТаблицы + " КАК СправочникКонтакт |ГДЕ - | Таблица.Ссылка = &Контакт + | СправочникКонтакт.Ссылка = &Контакт |; | |//////////////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | Таблица.Тип КАК Тип, - | Таблица.Представление КАК Представление + | СправочникКонтакт.Тип КАК Тип, + | СправочникКонтакт.Представление КАК Представление |ИЗ - | Справочник." + ИмяТаблицы + ".КонтактнаяИнформация" + " КАК Таблица + | Справочник." + ИмяТаблицы + ".КонтактнаяИнформация" + " КАК СправочникКонтакт |ГДЕ - | Таблица.Ссылка = &Контакт" + ?(ТипКонтактнойИнформации = Неопределено,""," И Таблица.Тип = &ТипКонтактнойИнформации"); + | СправочникКонтакт.Ссылка = &Контакт" + ?(ТипКонтактнойИнформации = Неопределено,""," И СправочникКонтакт.Тип = &ТипКонтактнойИнформации"); Запрос.УстановитьПараметр("Контакт", Контакт); Запрос.УстановитьПараметр("ТипКонтактнойИнформации", ТипКонтактнойИнформации); @@ -75,7 +74,7 @@ // Возвращаемое значение: // Структура - содержит наименование контакта и список значений электронной почты контакта. // -Функция ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт) Экспорт +Функция НаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт) Экспорт Если Не ЗначениеЗаполнено(Контакт) Или ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда @@ -110,14 +109,14 @@ ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ЕстьNULL(ТаблицаКонтактнаяИнформация.АдресЭП,"""") КАК АдресЭП, - | Таблица." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта + " КАК Наименование + | СправочникКонтакт." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта + " КАК Наименование |ИЗ - | " + ИмяТаблицы + " КАК Таблица + | " + ИмяТаблицы + " КАК СправочникКонтакт | ЛЕВОЕ СОЕДИНЕНИЕ " + ИмяТаблицы + ".КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация - | ПО (ТаблицаКонтактнаяИнформация.Ссылка = Таблица.Ссылка) + | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)) |ГДЕ - | Таблица.Ссылка = &Контакт + | СправочникКонтакт.Ссылка = &Контакт |ИТОГИ ПО | Наименование"; @@ -346,7 +345,11 @@ // Процедура УстановитьПапкуЭлектронногоПисьма(Ссылка, Папка, РассчитыватьРассмотрено = Истина) Экспорт - ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(Папка,,,,РассчитыватьРассмотрено)); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + СтруктураДляЗаписи.Папка = Папка; + СтруктураДляЗаписи.РассчитыватьРассмотрено = РассчитыватьРассмотрено; + + ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); КонецПроцедуры @@ -437,4 +440,60 @@ КонецПроцедуры +// Преобразует письмо в двоичные данные и подготавливает к сохранению на диск. +// +// Параметры: +// Письмо - ДокументСсылка.ЭлектронноеПисьмоВходящее, +// ДокументСсылка.ЭлектронноеПисьмоИсходящее - письмо, которое подготавливается к сохранению. +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы, из которой была вызвана команда сохранения. +// +// Возвращаемое значение: +// Структура - структура, содержащая подготовленные данные письма. +// +Функция ДанныеПисьмаДляСохраненияКакФайл(Письмо, УникальныйИдентификатор) Экспорт + + ДанныеФайла = СтруктураДанныхФайла(); + + ДанныеПисьма = Взаимодействия.ИнтернетПочтовоеСообщениеИзПисьма(Письмо); + Если ДанныеПисьма <> Неопределено Тогда + + ДвоичныеДанные = ДанныеПисьма.ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные(); + ДанныеФайла.СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); + + ДанныеФайла.Наименование = ВзаимодействияКлиентСервер.ПредставлениеПисьма(ДанныеПисьма.ИнтернетПочтовоеСообщение.Тема, + ДанныеПисьма.ДатаПисьма); + + ДанныеФайла.Расширение = "eml"; + ДанныеФайла.ИмяФайла = ДанныеФайла.Наименование + "." + ДанныеФайла.Расширение; + ДанныеФайла.Размер = ДвоичныеДанные.Размер(); + ПапкаДляСохранитьКак = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляСохранитьКак"); + ДанныеФайла.Вставить("ПапкаДляСохранитьКак", ПапкаДляСохранитьКак); + + КонецЕсли; + + Возврат ДанныеФайла; + +КонецФункции + +Функция СтруктураДанныхФайла() + + СтруктураДанныхФайла = Новый Структура; + СтруктураДанныхФайла.Вставить("СсылкаНаДвоичныеДанныеФайла", ""); + СтруктураДанныхФайла.Вставить("ОтносительныйПуть", ""); + СтруктураДанныхФайла.Вставить("ДатаМодификацииУниверсальная", Дата(1, 1, 1)); + СтруктураДанныхФайла.Вставить("ИмяФайла", ""); + СтруктураДанныхФайла.Вставить("Наименование", ""); + СтруктураДанныхФайла.Вставить("Расширение", ""); + СтруктураДанныхФайла.Вставить("Размер", ""); + СтруктураДанныхФайла.Вставить("Редактирует", Неопределено); + СтруктураДанныхФайла.Вставить("ПодписанЭП", Ложь); + СтруктураДанныхФайла.Вставить("Зашифрован", Ложь); + СтруктураДанныхФайла.Вставить("ФайлРедактируется", Ложь); + СтруктураДанныхФайла.Вставить("ФайлРедактируетТекущийПользователь", Ложь); + + Возврат СтруктураДанныхФайла; + +КонецФункции + + #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl index d4c19651b..01557cea4 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl @@ -1,43 +1,5 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Открывает форму нового документа "Электронное письмо исходящее" -// с переданными в процедуру параметрами. -// -// Параметры: -// Отправитель - СправочникСсылка.УчетныеЗаписи - учетная запись, с которой выполняется отправка. -// Получатель - Строка, СписокЗначений, Массив - список получателей письма. -// Тема - Строка - тема письма. -// Текст - Строка - текст письма. -// СписокФайлов - Массив - вложения письма. -// Предмет - Ссылка - предмет письма. -// -Процедура ОткрытьФормуОтправкиПочтовогоСообщения(Знач Отправитель = Неопределено, - Знач Получатель = Неопределено, - Знач Тема = "", - Знач Текст = "", - Знач СписокФайлов = Неопределено, - Знач Предмет = Неопределено, - Знач ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт - - ПараметрыПисьма = Новый Структура; - - ПараметрыПисьма.Вставить("УчетнаяЗапись", Отправитель); - ПараметрыПисьма.Вставить("Кому", Получатель); - ПараметрыПисьма.Вставить("Тема", Тема); - ПараметрыПисьма.Вставить("Тело", Текст); - ПараметрыПисьма.Вставить("Вложения", СписокФайлов); - ПараметрыПисьма.Вставить("Предмет", Предмет); - - ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыПисьма, , , , , ОписаниеОповещенияОЗакрытии); - -КонецПроцедуры - // Открывает форму нового документа "Сообщение SMS" // с переданными в процедуру параметрами. // @@ -135,7 +97,8 @@ // // Параметры: // Элемент - ТаблицаФормы - таблица, для которой обрабатывается событие. -// ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные действия при перетаскивании. +// ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные +// действия при перетаскивании. // СтандартнаяОбработка - Булево - признак стандартной обработки события. // Строка - СтрокаТаблицы - строка таблицы, над которой находится курсор. // Поле - Поле - элемент управляемой формы, с которым связана данная колонка таблицы. @@ -165,7 +128,8 @@ // // Параметры: // Элемент - ТаблицаФормы - таблица, для которой обрабатывается событие. -// ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные действия при перетаскивании. +// ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные +// действия при перетаскивании. // СтандартнаяОбработка - Булево - признак стандартной обработки события. // Строка - СтрокаТаблицы - строка таблицы, над которой находится курсор. // Поле - Поле - элемент управляемой формы, с которым связана данная колонка таблицы. @@ -185,6 +149,88 @@ КонецПроцедуры +// Сохраняет письмо на диск. +// +// Параметры: +// Письмо - ДокументСсылка.ЭлектронноеПисьмоВходящее, +// ДокументСсылка.ЭлектронноеПисьмоИсходящее - письмо, которое будет сохранено. +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы, из которой была вызвана команда сохранения. +// +Процедура СохранитьПисьмоНаДиск(Письмо, УникальныйИдентификатор) Экспорт + + ДанныеФайла = ВзаимодействияВызовСервера.ДанныеПисьмаДляСохраненияКакФайл(Письмо, УникальныйИдентификатор); + + Если ДанныеФайла = Неопределено Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла); + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо. +// +// Открывает форму нового документа "Электронное письмо исходящее" +// с переданными в процедуру параметрами. +// +// Параметры: +// Отправитель - СправочникСсылка.УчетныеЗаписи - учетная запись, с которой выполняется отправка. +// Получатели - Строка, СписокЗначений, Массив - список получателей письма. +// - Структура - сведения о получателях письма. +// * Кому - Строка, СписокЗначений, Массив - список получателей письма. +// * Копии - Строка, СписокЗначений, Массив - список получателей копий письма. +// * СкрытыеКопии - Строка, СписокЗначений, Массив - список получателей скрытых копий письма. +// Тема - Строка - тема письма. +// Текст - Строка - текст письма. +// СписокФайлов - Массив - вложения письма. +// Предмет - Ссылка - предмет письма. +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание оповещения о закрытии формы письма. +// +Процедура ОткрытьФормуОтправкиПочтовогоСообщения(Знач Отправитель = Неопределено, + Знач Получатели = Неопределено, + Знач Тема = "", + Знач Текст = "", + Знач СписокФайлов = Неопределено, + Знач Предмет = Неопределено, + Знач ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт + + ПараметрыПисьма = Новый Структура; + + Если ТипЗнч(Получатели) = Тип("Структура") Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыПисьма, Получатели, Истина); + Иначе + ПараметрыПисьма.Вставить("Кому", Получатели); + КонецЕсли; + ПараметрыПисьма.Вставить("УчетнаяЗапись", Отправитель); + ПараметрыПисьма.Вставить("Тема", Тема); + ПараметрыПисьма.Вставить("Тело", Текст); + ПараметрыПисьма.Вставить("Вложения", СписокФайлов); + ПараметрыПисьма.Вставить("Предмет", Предмет); + + ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыПисьма, , , , , ОписаниеОповещенияОЗакрытии); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Открывает форму нового документа "Электронное письмо исходящее" +// с переданными в процедуру параметрами. +// +// Параметры: +// ПараметрыПисьма - Структура - см. РаботаСПочтовымиСообщениямиКлиент.ПараметрыОтправкиПисьма. +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание оповещения о закрытии формы письма. +// +Процедура ОткрытьФормуОтправкиПисьма(Знач ПараметрыПисьма = Неопределено, Знач ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт + + ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыПисьма, , , , , ОписаниеОповещенияОЗакрытии); + +КонецПроцедуры #КонецОбласти @@ -326,7 +372,7 @@ Если БылИзмененКонтакт Тогда Если НЕ Параметр.ДляФормыУточненияКонтактов Тогда - ВзаимодействияВызовСервера.ПолучитьПредставлениеИВсюКонтактнуюИнформациюКонтакта( + ВзаимодействияВызовСервера.ПредставлениеИВсяКонтактнаяИнформациюКонтакта( Контакт, Параметр.Представление, Параметр.Адрес, ТипКонтактнойИнформации); КонецЕсли; @@ -337,7 +383,7 @@ нПредставление = ""; нАдрес = ""; - ВзаимодействияВызовСервера.ПолучитьПредставлениеИВсюКонтактнуюИнформациюКонтакта( + ВзаимодействияВызовСервера.ПредставлениеИВсяКонтактнаяИнформациюКонтакта( Контакт, нПредставление, нАдрес, ТипКонтактнойИнформации); Представление = ?(ПустаяСтрока(Параметр.Представление), нПредставление, Параметр.Представление); @@ -638,4 +684,52 @@ КонецПроцедуры +Процедура ОткрытьВложениеПисьмо(ФайлВложенияПисьма, ПараметрыОткрытия , Форма) Экспорт + + ОчиститьСообщения(); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Письмо", ФайлВложенияПисьма); + ПараметрыФормы.Вставить("НеВызыватьКомандуПечати", ПараметрыОткрытия.НеВызыватьКомандуПечати); + ПараметрыФормы.Вставить("ИмяПользователяУчетнойЗаписи", ПараметрыОткрытия.ИмяПользователяУчетнойЗаписи); + ПараметрыФормы.Вставить("ОтображатьВложенияПисьма", ПараметрыОткрытия.ОтображатьВложенияПисьма); + ПараметрыФормы.Вставить("ДатаПисьмаОснования", ПараметрыОткрытия.ДатаПисьмаОснования); + ПараметрыФормы.Вставить("ПисьмоОснование", ПараметрыОткрытия.ПисьмоОснование); + ПараметрыФормы.Вставить("ТемаПисьмаОснования", ПараметрыОткрытия.ТемаПисьмаОснования); + + ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.ПечатьЭлектронногоПисьма", ПараметрыФормы, Форма); + +КонецПроцедуры + +// Формирует структуру по умолчанию параметров письма-вложения, которая передается в форму просмотра и печати. +// +// Параметры: +// +// Возвращаемое значение: +// Структура - содержит следующие параметры +// *ДатаПисьмаОснования - Дата - Дата письма основания. +// *ИмяПользователяУчетнойЗаписи - Строка - Имя пользователя учетной записи, которая приняла письмо-основание. +// *НеВызыватьКомандуПечати - Булево - признак того, что при открытии формы печати не нужно вызывать команду +// печати ОС. +// *ПисьмоОснование - Неопределено, +// - Строка, +// - ДокументСсылка.ЭлектронноеПисьмоВходящее, +// - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка на письмо основание или +// представление письма. +// *ТемаПисьмаОснования - Строка - Тема письма-основания. +// +Функция ПустаяСтруктураПараметровПисьмаВложения() Экспорт + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ДатаПисьмаОснования", Дата(1, 1, 1)); + ПараметрыОткрытия.Вставить("ИмяПользователяУчетнойЗаписи", ""); + ПараметрыОткрытия.Вставить("НеВызыватьКомандуПечати", Истина); + ПараметрыОткрытия.Вставить("ОтображатьВложенияПисьма", Истина); + ПараметрыОткрытия.Вставить("ПисьмоОснование", Неопределено); + ПараметрыОткрытия.Вставить("ТемаПисьмаОснования", ""); + + Возврат ПараметрыОткрытия; + +КонецФункции + + #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl index b0a56aee4..7434f4518 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при создании нового контакта. @@ -18,7 +12,7 @@ // Возвращаемое значение: // Булево - Ложь, если открытие нестандартной формы не выполнено, Истина в обратном случае. // -// Пример реализации: +// Пример: // Если ТипКонтакта = "Партнеры" Тогда // ОткрытьФорму("Справочник.Партнеры.Форма.ПомощникНового", ПараметрФормы); // Возврат Истина; diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl index f5aeab166..aa8768b8e 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -95,7 +89,7 @@ // Функция ЯвляетсяПредметом(ОбъектСсылка) Экспорт - МассивТиповПредметов = ВзаимодействияКлиентСерверПовтИспПереопределяемый.МассивТиповПредметов(); + МассивТиповПредметов = ВзаимодействияКлиентСерверСлужебныйПовтИсп.МассивТиповПредметов(); Для каждого ЭлементМассива Из МассивТиповПредметов Цикл @@ -114,6 +108,23 @@ //////////////////////////////////////////////////////////////////////////////// // Прочее +// Проверяет, является ли файл письмом по расширению файла. +// +// Параметры: +// ИмяФайла - Строка - имя проверяемого файла. +// +// Возвращаемое значение: +// Булево - Истина, если расширение файла, указывает на то, что он является письмом. +// +Функция ЭтоФайлПисьмо(ИмяФайла) Экспорт + + МассивРасширенийФайла = МассивРасширенийФайлаПисьма(); + РасширениеФайла = РасширениеФайла(ИмяФайла); + + Возврат (МассивРасширенийФайла.Найти(РасширениеФайла) <> Неопределено); + +КонецФункции + // Устанавливает состояние "Исходящее" для документа сообщение SMS и всех входящих в него сообщений. // // Параметры: @@ -134,119 +145,41 @@ // Определяет, корректно ли введен номер телефона для сообщения SMS. // // Параметры: -// СтруктураПолей - Структура - структура описывающая контактную информацию типа Телефон или МобильныйТелефон. +// НомерТелефона - Строка - строка с номером телефона. // // Возвращаемое значение: // Булево - Истина, если номер введен правильно, Ложь в обратном случае. // -Функция КорректноВведенНомерТелефона(СтруктураПолей) Экспорт +Функция КорректноВведенНомерТелефона(НомерТелефона) Экспорт - Если НЕ ПустаяСтрока(СтруктураПолей.КодСтраны) Тогда - КодСтраны = СокрЛП(КодСтраны); - Если СтрНачинаетсяС(КодСтраны, "+") Тогда - КодСтраны = Прав(КодСтраны, СтрДлина(СтруктураПолей.КодСтраны)-1); - КонецЕсли; - Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(КодСтраны) Тогда + СимволыНомера = "+1234567890"; + СимволыРазделители = "()- "; + + ФорматированныйНомер = ""; + Для Позиция = 1 По СтрДлина(НомерТелефона) Цикл + Символ = Сред(НомерТелефона, Позиция, 1); + Если Символ = "+" И Не ПустаяСтрока(ФорматированныйНомер) Тогда Возврат Ложь; КонецЕсли; - Иначе + Если СтрНайти(СимволыНомера, Символ) > 0 Тогда + ФорматированныйНомер = ФорматированныйНомер + Символ; + ИначеЕсли СтрНайти(СимволыРазделители, Символ) = 0 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Если ПустаяСтрока(ФорматированныйНомер) Тогда Возврат Ложь; КонецЕсли; - Если НЕ ПустаяСтрока(СтруктураПолей.КодГорода) Тогда - Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СтруктураПолей.КодГорода) Тогда - Возврат Ложь; - КонецЕсли; - Иначе + Если СтрДлина(ФорматированныйНомер) < 3 Тогда Возврат Ложь; КонецЕсли; - Если НЕ ПустаяСтрока(СтруктураПолей.НомерТелефона) Тогда - Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СтруктураПолей.НомерТелефона) Тогда - Возврат Ложь; - КонецЕсли; - Иначе - Возврат Ложь; - КонецЕсли; - - Если СтрДлина(СтруктураПолей.КодГорода) + СтрДлина(СтруктураПолей.НомерТелефона) <> 10 Тогда - Возврат Ложь; - КонецЕсли; - Возврат Истина; КонецФункции -// Формирует структуру полей контактной информации типа Телефон или МобильныйТелефон по представлению телефона. -// -// Параметры: -// Представление - Строка - строковая информация с номером телефона. -// -// Возвращаемое значение: -// Структура - сформированная структура. -// -Функция СтруктураПолейПоПредставлениюТелефона(Представление) Экспорт - - текСтр = СокрЛП(Представление); - - // Вырежем добавочный номер с комментарием. - ПозДоб = СтрНайти(ВРЕГ(текСтр), "ДОБ."); - Если ПозДоб <> 0 Тогда - ДобавочныйСКомментарием = СокрЛП(Сред(текСтр, ПозДоб+4)); - - текСтр = СокрЛП(Лев(текСтр, ПозДоб-1)); - - Если СтрЗаканчиваетсяНа(текСтр, ",") Тогда - текСтр = Лев(текСтр, СтрДлина(текСтр)-1); - КонецЕсли; - - ПозДоб = СтрНайти(ВРЕГ(ДобавочныйСКомментарием), ", "); - - Если ПозДоб <> 0 Тогда - Добавочный = СокрЛП(Лев(ДобавочныйСКомментарием, ПозДоб-1)); - Комментарий = СокрЛП(Сред(ДобавочныйСКомментарием, ПозДоб+2)); - Иначе - Добавочный = ДобавочныйСКомментарием; - КонецЕсли; - - КонецЕсли; - - // вырежем код города - Поз = СтрНайти(текСтр, "("); - Если Поз <> 0 Тогда - КодСтраны = СокрЛП(Лев(текСтр, Поз-1)); - - текСтр = СокрЛП(Сред(текСтр, Поз+1)); - Поз = СтрНайти(текСтр, ")"); - - Если Поз <> 0 Тогда - КодГорода = СокрЛП(Лев(текСтр, Поз-1)); - текСтр = СокрЛП(Сред(текСтр, Поз+1)); - КонецЕсли; - КонецЕсли; - - Поз = СтрНайти(текСтр, ", "); - // Если добавочного номера нет - ориентируемся по номеру телефона и комментарию. - Если ПозДоб = 0 И Поз <> 0 Тогда - // вырежем комментарий - НомерТелефона = СокрЛП(Лев(текСтр, Поз-1)); - Комментарий = СокрЛП(Сред(текСтр, Поз+2)); - Иначе - // все оставшееся это номер - НомерТелефона = текСтр; - КонецЕсли; - - Результат = Новый Структура; - Результат.Вставить("КодСтраны", КодСтраны); - Результат.Вставить("КодГорода", КодГорода); - Результат.Вставить("НомерТелефона", НомерТелефона); - Результат.Вставить("Добавочный", Добавочный); - Результат.Вставить("Комментарий", Комментарий); - - Возврат Результат; - -КонецФункции - // Формирует тему по тексту сообщения на основании первых трех слов. // // Параметры: @@ -328,26 +261,6 @@ КонецФункции -// Получает расширение для переданного имени файла. -// -// Параметры: -// ИмяФайла - Строка - имя файла, для которого необходимо получить расширение. -// -// Возвращаемое значение: -// Строка - расширение, полученное из переданного имени файла. -// -Функция ПолучитьРасширениеФайла(Знач ИмяФайла) Экспорт - - РасширениеФайла = ""; - МассивСтрок = СтрРазделить(ИмяФайла, ".", Ложь); - Если МассивСтрок.Количество() > 1 Тогда - РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1]; - КонецЕсли; - - Возврат РасширениеФайла; - -КонецФункции - // Получает каталог и имя файла для переданного полного имени файла. // // Параметры: @@ -395,6 +308,12 @@ КонецФункции +Функция МассивОписанияВозможныхКонтактов() Экспорт + + Возврат ВзаимодействияКлиентСерверСлужебныйПовтИсп.МассивОписанияВозможныхКонтактов(); + +КонецФункции + // Добавляет элемент в массив структур контакта. // // Параметры: @@ -444,29 +363,6 @@ КонецПроцедуры -// Возвращает описания возможных типов контактов. -// Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий, -// помимо справочника Пользователи. -// -// Возвращаемое значение: -// Массив - массив структур, в котором описываются возможные типы контактов. -// Каждая структура содержит описание одного типа контактов. -// Описание полей структуры см. в комментарии к функции. -// ДобавитьЭлементМассиваОписанияВозможныхТиповКонтактов общего модуля. -// ВзаимодействияКлиентСервер. -// -Функция МассивОписанияВозможныхКонтактов() Экспорт - - МассивВозможныеКонтакты = Новый Массив(); - ДобавитьЭлементМассиваОписанияВозможныхТиповКонтактов(МассивВозможныеКонтакты, - Тип("СправочникСсылка.Пользователи"),Ложь,"Пользователи","Пользователи",Ложь,Ложь,"",Ложь,""); - - ВзаимодействияКлиентСерверПовтИспПереопределяемый.ДополнитьМассивОписанияВозможныхКонтактов(МассивВозможныеКонтакты); - - Возврат МассивВозможныеКонтакты; - -КонецФункции - // Проверяет заполнение контактов в документе взаимодействий и обновляет форму документа взаимодействий// // Параметры: // Объект - ДокументОбъект - документ взаимодействий, для которой выполняется проверка. @@ -567,7 +463,7 @@ // очистить связанные отборы ГруппаОтбора = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора( - Отбор.Элементы,"Отбор по типу взаимодействий",ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ); + Отбор.Элементы,НСтр("ru = 'Отбор по типу взаимодействий'"),ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ); // установить отборы для типа Если ТипВзаимодействия = "ВсеПисьма" Тогда @@ -810,45 +706,6 @@ КонецФункции -// Формирует структуру для записи в регистр сведений ПредметыПапкиВзаимодействий. -// -// Параметры: -// Папка - Справочник.ПапкиЭлектронныхПисем - папка, имеет смысл для документов "Электронное письмо входящее" -// и "Электронное письмо исходящее". -// Предмет - СправочникСсылка, ДокументСсылка, указывает на предмет взаимодействия. -// Рассмотрено - Булево - признак рассмотрения взаимодействия. -// РассмотретьПосле - ДатаВремя - дата, до которой отложено рассмотрение взаимодействия. -// РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний папки и предмета. -// -// Возвращаемое значение: -// Структура - сформированная структура. -// -Функция СтруктураРеквизитовВзаимодействияДляЗаписи(Папка = Неопределено, Предмет = Неопределено, Рассмотрено = Неопределено, - РассмотретьПосле = Неопределено, РассчитыватьРассмотрено = Истина) Экспорт - - СтруктураВозврата = ПустаяСтруктураРеквизитыВзаимодействия(); - - Если Папка <> Неопределено Тогда - СтруктураВозврата.Папка = Папка; - КонецЕсли; - - Если Предмет <> Неопределено Тогда - СтруктураВозврата.Предмет = Предмет; - КонецЕсли; - - Если Рассмотрено <> Неопределено Тогда - СтруктураВозврата.Рассмотрено = Рассмотрено; - КонецЕсли; - - Если РассмотретьПосле <> Неопределено Тогда - СтруктураВозврата.РассмотретьПосле = РассмотретьПосле; - КонецЕсли; - СтруктураВозврата.РассчитыватьРассмотрено = РассчитыватьРассмотрено; - - Возврат СтруктураВозврата; - -КонецФункции - // Формирует пустую структуру для записи в регистр сведений ПредметыПапкиВзаимодействий. // Функция ПустаяСтруктураРеквизитыВзаимодействия() Экспорт @@ -864,6 +721,26 @@ КонецФункции +// Получает расширение для переданного имени файла. +// +// Параметры: +// ИмяФайла - Строка - имя файла, для которого необходимо получить расширение. +// +// Возвращаемое значение: +// Строка - расширение, полученное из переданного имени файла. +// +Функция РасширениеФайла(Знач ИмяФайла) Экспорт + + РасширениеФайла = ""; + МассивСтрок = СтрРазделить(ИмяФайла, ".", Ложь); + Если МассивСтрок.Количество() > 1 Тогда + РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1]; + КонецЕсли; + + Возврат РасширениеФайла; + +КонецФункции + Функция СписокСтатусов() Экспорт СписокСтатусов = Новый СписокЗначений; @@ -936,7 +813,7 @@ Процедура ОбработкаПолученияПредставления(МенеджерОбъекта, Данные, Представление, СтандартнаяОбработка) Экспорт - Тема = ?(ПустаяСтрока(Данные.Тема), НСтр("ru = 'Без темы'"), Данные.Тема); + Тема = ТемаВзаимодействия(Данные.Тема); Дата = Формат(Данные.Дата, "ДЛФ=D"); ТипДокумента = ""; Если ТипЗнч(МенеджерОбъекта) = Тип("ДокументМенеджер.Встреча") Тогда @@ -974,4 +851,49 @@ КонецФункции +Функция МассивРасширенийФайлаПисьма() + + МассивРасширенийФайла = Новый Массив; + МассивРасширенийФайла.Добавить("msg"); + МассивРасширенийФайла.Добавить("eml"); + + Возврат МассивРасширенийФайла; + +КонецФункции + +Функция НаименованиеИРасширениеФайлаПоИмениФайла(Знач ИмяФайла) Экспорт + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Расширение", ""); + СтруктураВозврата.Вставить("Наименование", ""); + + МассивСтрок = СтрРазделить(ИмяФайла, ".", Ложь); + Если МассивСтрок.Количество() > 1 Тогда + + СтруктураВозврата.Расширение = МассивСтрок[МассивСтрок.Количество() - 1]; + СтруктураВозврата.Наименование = Лев(ИмяФайла, СтрДлина(ИмяФайла) - СтрДлина(СтруктураВозврата.Расширение) - 1); + Иначе + СтруктураВозврата.Наименование = ИмяФайла; + КонецЕсли; + + Возврат СтруктураВозврата; + +КонецФункции + +Функция ПредставлениеПисьма(ТемаПисьма, ДатаПисьма) Экспорт + + ШаблонПредставления = НСтр("ru = '%1 от %2'"); + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПредставления, + ТемаВзаимодействия(ТемаПисьма), + Формат(ДатаПисьма, "ДЛФ=D")); + +КонецФункции + +Функция ТемаВзаимодействия(Тема) + + Возврат ?(ПустаяСтрока(Тема), НСтр("ru = '<Без темы>'"), Тема); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/Module.bsl new file mode 100644 index 000000000..ebc533954 --- /dev/null +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/Module.bsl @@ -0,0 +1,47 @@ +#Область ПрограммныйИнтерфейс + +// При необходимости дополняет массив строковых представлений типов предметов взаимодействий. +// Используется, если в конфигурации определен хотя бы один предмет взаимодействий. Например, заказы, вакансии и т.п. +// +// Параметры: +// ТипыПредметов - Массив - массив, в который добавляются строковые представления типов предметов взаимодействий. +// +Процедура ПриОпределенииВозможныхПредметов(ТипыПредметов) Экспорт + + + +КонецПроцедуры + +// Дополняет описания возможных типов контактов. +// Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий, +// помимо справочника Пользователи. Например, партнеры, контактные лица и т.п. +// +// Параметры: +// ТипыКонтактов - Массив - массив структур, в котором описываются возможные типы контактов. +// Каждая структура содержит описание одного типа контактов и содержит следующие поля: +// *Тип - Тип - тип ссылки контакта. +// *ВозможностьИнтерактивногоСоздания - Булево - признак возможности интерактивного создания контакта из +// документов - взаимодействий. +// *Имя - Строка - имя типа контакта , как оно определено в метаданных. +// *Представление - Строка - представление типа контакта для отображения пользователю. +// *Иерархический - Булево - признак того, является ли справочник иерархическим. +// *ЕстьВладелец - Булево - признак того, что у контакта есть владелец. +// *ИмяВладельца - Строка - имя владельца контакта, как оно определено в метаданных. +// *ИскатьПоДомену - Булево - признак того, что по данному типу контакта будет осуществляться +// поиск по домену. +// *Связь - Строка - описывает возможную связь данного контакта с другим контактом, в +// случае когда текущий контакт является реквизитом другого контакта. +// Описывается следующей строкой "ИмяТаблицы.ИмяРеквизита". +// *ИмяРеквизитаПредставлениеКонтакта - Строка - имя реквизита контакта, из которого будет получено +// представление контакта. +// +Процедура ПриОпределенииВозможныхКонтактов(ТипыКонтактов) Экспорт + + + +КонецПроцедуры + +#КонецОбласти + + + diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/ВзаимодействияКлиентСерверПовтИспПереопределяемый.mdo b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/ВзаимодействияКлиентСерверПереопределяемый.mdo similarity index 68% rename from SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/ВзаимодействияКлиентСерверПовтИспПереопределяемый.mdo rename to SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/ВзаимодействияКлиентСерверПереопределяемый.mdo index bf8c40901..16ae30d07 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/ВзаимодействияКлиентСерверПовтИспПереопределяемый.mdo +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПереопределяемый/ВзаимодействияКлиентСерверПереопределяемый.mdo @@ -1,13 +1,12 @@ - ВзаимодействияКлиентСерверПовтИспПереопределяемый + ВзаимодействияКлиентСерверПереопределяемый ru - Взаимодействия клиент сервер повт исп переопределяемый + Взаимодействия клиент сервер переопределяемый true true true true - DuringSession diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl deleted file mode 100644 index 8a80e9140..000000000 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl +++ /dev/null @@ -1,42 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// В данной функции при необходимости формируется массив строковых представлений предметов взаимодействий. -// Используется, если в конфигурации определен хотя бы один предмет взаимодействий. -// -// Возвращаемое значение: -// Булево - массив строковых представлений возможных предметов взаимодействий. -// -Функция МассивТиповПредметов() Экспорт - - МассивТиповПредметов = Новый Массив; - - - - Возврат МассивТиповПредметов; - -КонецФункции - -// Дополняет описания возможных типов контактов. -// Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий, -// помимо справочника Пользователи. -// -// Возвращаемые : -// Массив - массив структур, в котором описываются возможные типы контактов. -// Каждая структура содержит описание одного типа контактов. -// Описание полей структуры см. в комментарии к функции. -// ДобавитьЭлементМассиваОписанияВозможныхТиповКонтактов общего модуля. -// ВзаимодействияКлиентСервер. -// -Процедура ДополнитьМассивОписанияВозможныхКонтактов(МассивВозможныеКонтакты) Экспорт - - - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/Module.bsl new file mode 100644 index 000000000..17e091b6c --- /dev/null +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/Module.bsl @@ -0,0 +1,36 @@ +#Область СлужебныеПроцедурыИФункции + +// Возвращает описания возможных типов контактов. +// Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий, +// помимо справочника Пользователи. +// +// Возвращаемое значение: +// Массив - массив структур, в котором описываются возможные типы контактов. +// Каждая структура содержит описание одного типа контактов. +// Описание полей структуры см. в комментарии к функции. +// ДобавитьЭлементМассиваОписанияВозможныхТиповКонтактов общего модуля. +// ВзаимодействияКлиентСервер. +// +Функция МассивОписанияВозможныхКонтактов() Экспорт + + МассивВозможныеКонтакты = Новый Массив(); + ВзаимодействияКлиентСервер.ДобавитьЭлементМассиваОписанияВозможныхТиповКонтактов(МассивВозможныеКонтакты, + Тип("СправочникСсылка.Пользователи"),Ложь,"Пользователи","Пользователи",Ложь,Ложь,"",Ложь,""); + + ВзаимодействияКлиентСерверПереопределяемый.ПриОпределенииВозможныхКонтактов(МассивВозможныеКонтакты); + + Возврат МассивВозможныеКонтакты; + +КонецФункции + +Функция МассивТиповПредметов() Экспорт + + МассивТиповПредметов = Новый Массив; + + ВзаимодействияКлиентСерверПереопределяемый.ПриОпределенииВозможныхПредметов(МассивТиповПредметов); + + Возврат МассивТиповПредметов; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/ФайловыеФункцииСлужебныйКлиентПовтИсп.mdo b/SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/ВзаимодействияКлиентСерверСлужебныйПовтИсп.mdo similarity index 50% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/ФайловыеФункцииСлужебныйКлиентПовтИсп.mdo rename to SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/ВзаимодействияКлиентСерверСлужебныйПовтИсп.mdo index db1667a27..7421092e8 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/ФайловыеФункцииСлужебныйКлиентПовтИсп.mdo +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСерверСлужебныйПовтИсп/ВзаимодействияКлиентСерверСлужебныйПовтИсп.mdo @@ -1,11 +1,13 @@ - - ФайловыеФункцииСлужебныйКлиентПовтИсп + + ВзаимодействияКлиентСерверСлужебныйПовтИсп ru - Файловые функции служебный клиент повт исп + Взаимодействия клиент сервер служебный повт исп true + true + true true DuringSession diff --git a/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl index 153e1dc23..e4f16ed45 100644 --- a/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает текст запроса, отбирающего контакты (участников) предмета взаимодействия. @@ -13,7 +7,10 @@ // ПомещатьВоВременнуюТаблицу - Булево - признак того, что результат выполнения запроса // необходимо поместить во временную таблицу. // ИмяТаблицы - Строка - имя таблицы предмета взаимодействий, в котором будет выполнен поиск. +// Объединить - Булево - если Истина, то в запрос необходимо добавить конструкцию ОБЪЕДЕНИТЬ. // +// Возвращаемое значение: +// Строка - текст запроса Функция ТекстЗапросаПоискКонтактовПоПредмету( ПомещатьВоВременнуюТаблицу, ИмяТаблицы, @@ -44,4 +41,12 @@ КонецФункции +// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа. +Процедура ПриЗаполненииНаборовЗначенийДоступа(Объект, Таблица) Экспорт + + + +КонецПроцедуры + + #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl index 6caff11dd..df290d286 100644 --- a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Обработчик события при записи учетной записи электронной почты. @@ -15,6 +9,8 @@ КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ПапкиЭлектронныхПисем.Ссылка diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыВызовСервера/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыВызовСервера/Module.bsl new file mode 100644 index 000000000..4adf1ad9c --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеКомпонентыВызовСервера/Module.bsl @@ -0,0 +1,106 @@ +#Область ПрограммныйИнтерфейс + +// Возвращает информацию о внешней компоненте по идентификатору и версии. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// Версия - Строка, Неопределено - версия компоненты. +// +// Возвращаемое значение: +// Структура - информация о компоненте +// * Существует - Булево - признак отсутствия компоненты. +// * ОписаниеОшибки - Строка - краткое описание ошибки. +// * Идентификатор - Строка - идентификатор объекта внешней компоненты. +// * Версия - Строка - версия компоненты. +// * Наименование - Строка - наименование и краткая информация о компоненте. +// +// Пример: +// +// Результат = ВнешниеКомпонентыВызовСервера.ИнформацияОКомпоненте("InputDevice", "8.1.7.10"); +// +// Если Результат.Существует Тогда +// Идентификатор = Результат.Идентификатор; +// Версия = Результат.Версия; +// Наименование = Результат.Наименование; +// Иначе +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ОписаниеОшибки); +// КонецЕсли; +// +Функция ИнформацияОКомпоненте(Идентификатор, Версия = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Существует", Ложь); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Если Версия = Неопределено Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | МАКСИМУМ(ВнешниеКомпоненты.ДатаВерсии) КАК ДатаВерсии + |ПОМЕСТИТЬ ВТ_МаксимальнаяВерсияКомпоненты + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | + |СГРУППИРОВАТЬ ПО + | ВнешниеКомпоненты.Идентификатор + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | ВнешниеКомпоненты.Версия КАК Версия, + | ВнешниеКомпоненты.Наименование КАК Наименование, + | ВнешниеКомпоненты.Использование КАК Использование + |ИЗ + | ВТ_МаксимальнаяВерсияКомпоненты КАК ВТ_МаксимальнаяВерсияКомпоненты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + | ПО (ВнешниеКомпоненты.Идентификатор = ВТ_МаксимальнаяВерсияКомпоненты.Идентификатор) + | И ВТ_МаксимальнаяВерсияКомпоненты.ДатаВерсии = ВнешниеКомпоненты.ДатаВерсии"; + Иначе + Запрос.УстановитьПараметр("Версия", Версия); + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | ВнешниеКомпоненты.Версия КАК Версия, + | ВнешниеКомпоненты.Наименование КАК Наименование, + | ВнешниеКомпоненты.Использование КАК Использование + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | И ВнешниеКомпоненты.Версия = &Версия"; + + КонецЕсли; + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Внешняя компонента не найдена'")); + Возврат Результат; + + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Если Выборка.Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена Тогда + + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Внешняя компонента отключена'")); + Возврат Результат; + + КонецЕсли; + + Результат.Вставить("Идентификатор", Выборка.Идентификатор); + Результат.Вставить("Версия" , Выборка.Версия); + Результат.Вставить("Наименование" , Выборка.Наименование); + + Результат.Вставить("Существует", Истина); + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыВызовСервера/ВнешниеКомпонентыВызовСервера.mdo b/SSL/src/CommonModules/ВнешниеКомпонентыВызовСервера/ВнешниеКомпонентыВызовСервера.mdo new file mode 100644 index 000000000..6411da23f --- /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..6dfa059f5 --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl @@ -0,0 +1,320 @@ +#Область ПрограммныйИнтерфейс + +// Возвращает структуру параметров для см. процедуру ПодключитьКомпоненту. +// +// Возвращаемое значение: +// Структура - коллекция параметров: +// * Кэшировать - Булево - (по умолчанию Истина) использовать механизм кэширования компонент на клиенте. +// * ПредложитьУстановить - Булево - (по умолчанию Истина) предлагать устанавливать и обновлять компоненту. +// * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать +// (только для веб клиента). +// +// Пример: +// +// ПараметрыПодключения = ВнешниеКомпонентыКлиент.ПараметрыПодключения(); +// ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +Функция ПараметрыПодключения() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Кэшировать" , Истина); + Параметры.Вставить("ПредложитьУстановить", Истина); + Параметры.Вставить("ТекстПояснения" , ""); + + Возврат Параметры; + +КонецФункции + +// Подключает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Для веб-клиента предлагается диалог, подсказывающий пользователю действия по установке. +// Выполняет проверку возможности исполнения компоненты на текущем клиенте пользователя. +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения о подключении со следующими параметрами: +// * Результат - Структура - результат подключения компоненты: +// ** Подключено - Булево - признак подключения. +// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// Версия - Строка, Неопределено - версия компоненты. +// ПараметрыПодключения - Структура, Неопределено - см. функцию ПараметрыПодключения. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект); +// +// ПараметрыПодключения = ВнешниеКомпонентыКлиент.ПараметрыПодключения(); +// ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +// ВнешниеКомпонентыКлиент.ПодключитьКомпоненту(Оповещение, "InputDevice",, ПараметрыПодключения); +// +// &НаКлиенте +// Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт +// +// ПодключаемыйМодуль = Неопределено; +// +// Если Результат.Подключено Тогда +// ПодключаемыйМодуль = Результат.ПодключаемыйМодуль; +// Иначе +// Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда +// ПоказатьПредупреждение(, Результат.ОписаниеОшибки); +// КонецЕсли; +// КонецЕсли; +// +// Если ПодключаемыйМодуль <> Неопределено Тогда +// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты. +// КонецЕсли; +// +// ПодключаемыйМодуль = Неопределено; +// +// КонецПроцедуры +// +Процедура ПодключитьКомпоненту(Оповещение, Идентификатор, Версия = Неопределено, + ПараметрыПодключения = Неопределено) Экспорт + + // Для переводчиков: должно быть названо AttachAddInEx потому что AttachAddIn зарезервировано платформой. + + Параметры = ПараметрыПодключения(); + Если ПараметрыПодключения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыПодключения); + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("Идентификатор" , Идентификатор); + Контекст.Вставить("Кэшировать" , Параметры.Кэшировать); + Контекст.Вставить("ПредложитьУстановить", Параметры.ПредложитьУстановить); + Контекст.Вставить("ТекстПояснения" , Параметры.ТекстПояснения); + + ДлительнаяОперация = ВнешниеКомпонентыСлужебныйВызовСервера.НачатьПодготовкуКомпонентыКПодключению( + Идентификатор, Версия); + + // В случае, если пользователь закроет форму адрес результата потеряется и + // будет невозможно освободить память, потому адрес результата помещаем в контекст. + Контекст.Вставить("АдресРезультатаПодготовкиКомпоненты", ДлительнаяОперация.АдресРезультата); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Подготовка компоненты...'"); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуПослеПодготовки", + ВнешниеКомпонентыСлужебныйКлиент, Контекст); + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + +КонецПроцедуры + +// Подключает компоненту, выполненную по технологии COM, из реестре Windows в асинхронном режиме. +// (не рекомендуется, для обратной совместимости с компонентами 1С 7.7). +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения о подключении со следующими параметрами: +// * Результат - Структура - результат подключения компоненты: +// ** Подключено - Булево - признак подключения. +// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ИдентификаторСозданияОбъекта - Строка, Неопределено - идентификатор создания экземпляра модуля объекта +// (только для компонент, у которых идентификатор создания объекта отличается от ProgID). +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект); +// +// ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows(Оповещение, "SBRFCOMObject", "SBRFCOMExtension"); +// +// &НаКлиенте +// Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт +// +// ПодключаемыйМодуль = Неопределено; +// +// Если Результат.Подключено Тогда +// ПодключаемыйМодуль = Результат.ПодключаемыйМодуль; +// Иначе +// ПоказатьПредупреждение(, Результат.ОписаниеОшибки); +// КонецЕсли; +// +// Если ПодключаемыйМодуль <> Неопределено Тогда +// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты. +// КонецЕсли; +// +// ПодключаемыйМодуль = Неопределено; +// +// КонецПроцедуры +// +Процедура ПодключитьКомпонентуИзРеестраWindows(Оповещение, Идентификатор, + ИдентификаторСозданияОбъекта = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("Идентификатор" , Идентификатор); + Контекст.Вставить("ИдентификаторСозданияОбъекта", ИдентификаторСозданияОбъекта); + + ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуИзРеестраWindows(Контекст); + +КонецПроцедуры + +// Возвращает структуру параметров для см. процедуру УстановитьКомпоненту. +// +// Возвращаемое значение: +// Структура - коллекция параметров: +// * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать +// (только для веб клиента). +// +// Пример: +// +// ПараметрыУстановки = ВнешниеКомпонентыКлиент.ПараметрыУстановки(); +// ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +Функция ПараметрыУстановки() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ТекстПояснения", ""); + + Возврат Параметры; + +КонецФункции + +// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Выполняет проверку возможности исполнения компоненты на текущем клиенте пользователя. +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения об установке внешней компоненты: +// * Результат - Структура - результат установки компоненты: +// ** Установлено - Булево - признак установки. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// Версия - Строка, Неопределено - версия компоненты. +// ПараметрыУстановки - Структура, Неопределено - см. функцию ПараметрыУстановки. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект); +// +// ПараметрыУстановки = ВнешниеКомпонентыКлиент.ПараметрыУстановки(); +// ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +// ВнешниеКомпонентыКлиент.УстановитьКомпоненту(Оповещение, "InputDevice",, ПараметрыУстановки); +// +// &НаКлиенте +// Процедура УстановитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт +// +// Если Не Результат.Установлено И Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда +// ПоказатьПредупреждение(, Результат.ОписаниеОшибки); +// КонецЕсли; +// +// КонецПроцедуры +// +Процедура УстановитьКомпоненту(Оповещение, Идентификатор, Версия = Неопределено, + ПараметрыУстановки = Неопределено) Экспорт + + // Для переводчиков: должно быть названо InstallAddInEx потому что InstallAddIn зарезервировано платформой. + + Параметры = ПараметрыУстановки(); + Если ПараметрыУстановки <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыУстановки); + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("ТекстПояснения", Параметры.ТекстПояснения); + + ДлительнаяОперация = ВнешниеКомпонентыСлужебныйВызовСервера.НачатьПодготовкуКомпонентыКПодключению( + Идентификатор, Версия); + + // В случае, если пользователь закроет форму адрес результата потеряется и + // будет невозможно освободить память, потому адрес результата помещаем в контекст. + Контекст.Вставить("АдресРезультатаПодготовкиКомпоненты", ДлительнаяОперация.АдресРезультата); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Подготовка компоненты...'"); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + Оповещение = Новый ОписаниеОповещения("УстановитьКомпонентуПослеПодготовки", + ВнешниеКомпонентыСлужебныйКлиент, Контекст); + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + +КонецПроцедуры + +// Возвращает структуру параметров для см. процедуру ЗагрузитьКомпонентуИзФайла. +// +// Возвращаемое значение: +// Структура - коллекция параметров: +// * Идентификатор - Строка, Неопределено - идентификатор объекта внешней компоненты. +// * Версия - Строка, Неопределено - версия компоненты. +// +// Пример: +// +// ПараметрыЗагрузки = ВнешниеКомпонентыКлиент.ПараметрыЗагрузки(); +// ПараметрыЗагрузки.Идентификатор = "InputDevice"; +// ПараметрыЗагрузки.Версия = "8.1.7.10"; +// +Функция ПараметрыЗагрузки() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Идентификатор", Неопределено); + Параметры.Вставить("Версия" , Неопределено); + + Возврат Параметры; + +КонецФункции + +// Загружает файл компоненты в справочник внешних компонент в асинхронном режиме. +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения об установке внешней компоненты: +// * Результат - Структура - результат загрузки компоненты: +// ** Загружена - Булево - признак загрузки. +// ** Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ** Версия - Строка - версия загруженной компоненты. +// ** Наименование - Строка - наименование загруженной компоненты. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// ПараметрыЗагрузки - Структура, Неопределено - см. функцию ПараметрыЗагрузки. +// +// Пример: +// +// ПараметрыЗагрузки = ВнешниеКомпонентыКлиент.ПараметрыЗагрузки(); +// ПараметрыЗагрузки.Идентификатор = "InputDevice"; +// ПараметрыЗагрузки.Версия = "8.1.7.10"; +// +// Оповещение = Новый ОписаниеОповещения( +// "ЗагрузитьКомпонентуИзФайлаПослеЗагрузкиКомпоненты", ЭтотОбъект); +// +// ВнешниеКомпонентыКлиент.ЗагрузитьКомпонентуИзФайла(Оповещение, ПараметрыЗагрузки); +// +// &НаКлиенте +// Процедура ЗагрузитьКомпонентуИзФайлаПослеЗагрузкиКомпоненты(Результат, ДополнительныеПараметры) Экспорт +// +// Если Результат.Загружено Тогда +// Идентификатор = Результат.Идентификатор; +// Версия = Результат.Версия; +// КонецЕсли; +// +// КонецПроцедуры +// +Процедура ЗагрузитьКомпонентуИзФайла(Оповещение, ПараметрыЗагрузки = Неопределено) Экспорт + + Параметры = ПараметрыЗагрузки(); + Если ПараметрыЗагрузки <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыЗагрузки); + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("Идентификатор", Параметры.Идентификатор); + Контекст.Вставить("Версия" , Параметры.Версия); + + ВнешниеКомпонентыСлужебныйКлиент.ЗагрузитьКомпонентуИзФайла(Контекст); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/ФайловыеФункцииСлужебныйКлиент.mdo b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/ВнешниеКомпонентыКлиент.mdo similarity index 57% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/ФайловыеФункцииСлужебныйКлиент.mdo rename to SSL/src/CommonModules/ВнешниеКомпонентыКлиент/ВнешниеКомпонентыКлиент.mdo index 5c8afa39e..07d627a79 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/ФайловыеФункцииСлужебныйКлиент.mdo +++ b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/ВнешниеКомпонентыКлиент.mdo @@ -1,9 +1,9 @@ - - ФайловыеФункцииСлужебныйКлиент + + ВнешниеКомпонентыКлиент ru - Файловые функции служебный клиент + Внешние компоненты клиент true true diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl new file mode 100644 index 000000000..bf582c0b9 --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl @@ -0,0 +1,714 @@ + +#Область СлужебныйПрограммныйИнтерфейс + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеВнешнихКомпонентССайта; + Зависимость.ДоступноВПодчиненномУзлеРИБ = Истина; + Зависимость.ДоступноВАвтономномРабочемМесте = Истина; + Зависимость.ДоступноВМоделиСервиса = Ложь; + +КонецПроцедуры + +// Обновление всех компонент регламентным заданием. +// +Процедура ОбновитьВсеКомпонентыССайта() Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(); + + Если ОбщегоНазначения.РазделениеВключено() Тогда + ВызватьИсключение НСтр("ru = 'Недопустимое использование регламентного задания: + |Нельзя использовать регламентное задание в разделенном режиме.'"); + КонецЕсли; + + Если Не ДоступнаЗагрузкаССайта() Тогда + ВызватьИсключение НСтр("ru = 'Недопустимое использование регламентного задания: + |Нельзя использовать регламентное задание в конфигурации + |без подсистемы Интернет Поддержки.'"); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | НЕОПРЕДЕЛЕНО КАК Версия, + | ВнешниеКомпоненты.Версия КАК ТекущаяВерсия, + | ВнешниеКомпоненты.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.ОбновлятьССайта"; + + ОбновитьКомпонентыССайтаПоЗапросу(Запрос); + +КонецПроцедуры + +Функция ДоступнаЗагрузкаССайта() Экспорт + + Возврат ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ВнешниеКомпоненты") + И Не ОбщегоНазначения.РазделениеВключено(); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает ссылку на справочник внешней компоненты по идентификатору и версии. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешнего компонента. +// Версия - Строка, Неопределено - версия компоненты. +// +// Возвращаемое значение: +// СправочникСсылка.ВнешниеКомпоненты - ссылка на контейнер внешней компоненты в информационной базе. +// +Функция СсылкаПоИдентификатору(Идентификатор, Версия = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Если Версия = Неопределено Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | МАКСИМУМ(ВнешниеКомпоненты.ДатаВерсии) КАК ДатаВерсии + |ПОМЕСТИТЬ ВТ_МаксимальнаяВерсияКомпоненты + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | + |СГРУППИРОВАТЬ ПО + | ВнешниеКомпоненты.Идентификатор + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВнешниеКомпоненты.Ссылка КАК Ссылка, + | ВнешниеКомпоненты.Использование КАК Использование + |ИЗ + | ВТ_МаксимальнаяВерсияКомпоненты КАК ВТ_МаксимальнаяВерсияКомпоненты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + | ПО (ВнешниеКомпоненты.Идентификатор = ВТ_МаксимальнаяВерсияКомпоненты.Идентификатор) + | И ВТ_МаксимальнаяВерсияКомпоненты.ДатаВерсии = ВнешниеКомпоненты.ДатаВерсии"; + Иначе + Запрос.УстановитьПараметр("Версия", Версия); + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Ссылка КАК Ссылка, + | ВнешниеКомпоненты.Использование КАК Использование + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор + | И ВнешниеКомпоненты.Версия = &Версия"; + + КонецЕсли; + + Результат = Запрос.Выполнить(); + + Если Результат.Пустой() Тогда + Возврат Справочники.ВнешниеКомпоненты.ПустаяСсылка(); + КонецЕсли; + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + Если Выборка.Использование = Перечисления.ВариантыИспользованияВнешнихКомпонент.Отключена Тогда + ВызватьИсключение НСтр("ru = 'Внешняя компонента отключена. + |Необходимо обратиться к администратору.'"); + КонецЕсли; + + Возврат Результат.Выгрузить()[0].Ссылка; + +КонецФункции + +// Выполняется в длительной операции. +// Выполняет подготовку компоненты к подключению и возвращает информацию для проверки +// совместимости компоненты на клиенте. +// В случае отсутствия компоненты, выполняет ее получение средствами подсистемы интернет поддержки. +// Компонента помещается во временное хранилище до завершения сеанса, +// Для оптимизации памяти после попытки подключения рекомендуется выполнить очистку хранилища. +// +// Параметры: +// Параметры - Структура - параметры подготовки. +// * Идентификатор - Строка - идентификатор объекта внешнего компонента. +// * Версия - Строка, Неопределено - версия компоненты. +// +// АдресРезультата - Строка - Адрес в хранилище с результатом. +// * Структура - информация о компоненте +// * Подготовлена - Булево - признак отсутствия компоненты. +// * ОписаниеОшибки - Строка - краткое описание ошибки. +// * Местоположение - Строка - временное хранилище двоичных данных ZIP-архива компоненты. +// +Процедура ПодготовитьКомпонентуКПодключению(Параметры, АдресРезультата) Экспорт + + Идентификатор = Параметры.Идентификатор; + Версия = Параметры.Версия; + + Ссылка = СсылкаПоИдентификатору(Идентификатор, Версия); + Если Ссылка.Пустая() Тогда + + Если ОбщегоНазначения.РазделениеВключено() Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + + МодульВнешниеКомпоненты = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); + Результат = МодульВнешниеКомпоненты.ПолучениеСлужебнойИнформацииОКомпоненте(Идентификатор, Версия); + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + Возврат; + + КонецЕсли; + + Иначе + + Если ДоступнаЗагрузкаССайта() Тогда + + Ссылка = НоваяКомпонентаССайта(Идентификатор, Версия); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если Ссылка.Пустая() Тогда + + ТекстОшибки = НСтр("ru = 'Требуется загрузить внешнюю компоненту в информационную базу. + |Рекомендуем обратиться к администратору.'"); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + ВызватьИсключение ТекстОшибки; + + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Windows_x86"); + Результат.Вставить("Windows_x86_64"); + Результат.Вставить("Linux_x86"); + Результат.Вставить("Linux_x86_64"); + Результат.Вставить("Windows_x86_Firefox"); + Результат.Вставить("Linux_x86_Firefox"); + Результат.Вставить("Linux_x86_64_Firefox"); + Результат.Вставить("Windows_x86_MSIE"); + Результат.Вставить("Windows_x86_64_MSIE"); + Результат.Вставить("Windows_x86_Chrome"); + Результат.Вставить("Linux_x86_Chrome"); + Результат.Вставить("Linux_x86_64_Chrome"); + Результат.Вставить("MacOS_x86_64_Safari"); + + Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Результат); + + ЗаполнитьЗначенияСвойств(Результат, Реквизиты); + + Местоположение = ПолучитьНавигационнуюСсылку(Ссылка, "ХранилищеКомпоненты"); + Результат.Вставить("Местоположение", Местоположение); + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + +КонецПроцедуры + +// Разбирает файл компоненты для получения служебной информации о компоненте +// +Функция ИнформацияОКомпоненте(АдресХранилищаФайла, ВыполнятьРазборИнфоФайла = Истина) Экспорт + + // Проверка адреса временного хранилища + Если Не ЭтоАдресВременногоХранилища(АдресХранилищаФайла) Тогда + ТекстОшибки = НСтр("ru = 'Не корректный адрес временного хранилища.'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Регистрация внешней компоненты'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + // Значения заполнения по умолчанию. + Реквизиты = Новый Структура; + Реквизиты.Вставить("Windows_x86", Ложь); + Реквизиты.Вставить("Windows_x86_64", Ложь); + Реквизиты.Вставить("Linux_x86", Ложь); + Реквизиты.Вставить("Linux_x86_64", Ложь); + Реквизиты.Вставить("Windows_x86_Firefox", Ложь); + Реквизиты.Вставить("Linux_x86_Firefox", Ложь); + Реквизиты.Вставить("Linux_x86_64_Firefox", Ложь); + Реквизиты.Вставить("Windows_x86_MSIE", Ложь); + Реквизиты.Вставить("Windows_x86_64_MSIE", Ложь); + Реквизиты.Вставить("Windows_x86_Chrome", Ложь); + Реквизиты.Вставить("Linux_x86_Chrome", Ложь); + Реквизиты.Вставить("Linux_x86_64_Chrome", Ложь); + Реквизиты.Вставить("MacOS_x86_64_Safari", Ложь); + Реквизиты.Вставить("Идентификатор", Неопределено); + Реквизиты.Вставить("Наименование", Неопределено); + Реквизиты.Вставить("Версия", Неопределено); + Реквизиты.Вставить("ДатаВерсии", Неопределено); + Реквизиты.Вставить("ИмяФайла", Неопределено); + + // Получение и загрузка двоичных данных компоненты. + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла); + + // Очищаем выделенную память в хранилище + УдалитьИзВременногоХранилища(АдресХранилищаФайла); + + // Контроль соответствия компоненты. + НайденМанифест = Ложь; + + // Разбор данных архива компоненты. + Попытка + + Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения(); + ЧтениеАрхива = Новый ЧтениеZipФайла(Поток); + + Исключение + + ТекстОшибки = НСтр("ru = 'В файле отсутствует информация о компоненте.'"); + + Результат = Новый Структура; + Результат.Вставить("Разобрано", Ложь); + Результат.Вставить("ОписаниеОшибки", ТекстОшибки); + + Возврат Результат; + + КонецПопытки; + + ВременныйКаталог = СоздатьВременныйКаталог(); + + Для каждого ЭлементАрхива Из ЧтениеАрхива.Элементы Цикл + + Если ЭлементАрхива.Зашифрован Тогда + + // Очищаем временные файлы и освобождаем память. + УдалитьВременныйКаталог(ВременныйКаталог); + ЧтениеАрхива.Закрыть(); + Поток.Закрыть(); + + ТекстОшибки = НСтр("ru = 'ZIP-архив не должен быть зашифрован.'"); + + Результат = Новый Структура; + Результат.Вставить("Разобрано", Ложь); + Результат.Вставить("ОписаниеОшибки", ТекстОшибки); + + Возврат Результат; + + КонецЕсли; + + // Поиск и разбор манифеста. + Если НРег(ЭлементАрхива.ПолноеИмя) = "manifest.xml" Тогда + + ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог); + + ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя; + РазобратьМанифестКомпоненты(ВременныйФайлXML, Реквизиты); + + ОписаниеФайла = Новый Файл(ВременныйФайлXML); + Реквизиты.ДатаВерсии = ОписаниеФайла.ПолучитьВремяИзменения(); + + НайденМанифест = Истина; + + КонецЕсли; + + Если НРег(ЭлементАрхива.ПолноеИмя) = "info.xml" И ВыполнятьРазборИнфоФайла Тогда + + ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог); + + ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя; + РазобратьИнфоКомпоненты(ВременныйФайлXML, Реквизиты); + + КонецЕсли; + + КонецЦикла; + + // Очищаем временные файлы и освобождаем память. + УдалитьВременныйКаталог(ВременныйКаталог); + ЧтениеАрхива.Закрыть(); + Поток.Закрыть(); + + // Контроль соответствия компоненты. + Если Не НайденМанифест Тогда + + ТекстОшибки = НСтр("ru = 'В архиве компоненты отсутствует обязательный файл MANIFEST.XML.'"); + + Результат = Новый Структура; + Результат.Вставить("Разобрано", Ложь); + Результат.Вставить("ОписаниеОшибки", ТекстОшибки); + + Возврат Результат; + + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Разобрано", Истина); + Результат.Вставить("Реквизиты" , Реквизиты); + Результат.Вставить("ДвоичныеДанные", ДвоичныеДанные); + + Возврат Результат; + +КонецФункции + +Функция СоздатьВременныйКаталог() + + ВременныйКаталог = ПолучитьИмяВременногоФайла() + + ПолучитьРазделительПути() + + Строка(Новый УникальныйИдентификатор); + СоздатьКаталог(ВременныйКаталог); + + Возврат ВременныйКаталог; + +КонецФункции + +Процедура УдалитьВременныйКаталог(ВременныйКаталог) + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Регистрация внешней компоненты'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +Процедура РазобратьМанифестКомпоненты(ВременныйФайлXML, Реквизиты) + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ВременныйФайлXML); + + ЧтениеXML.ПерейтиКСодержимому(); + Если ЧтениеXML.Имя = "bundle" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.Имя = "component" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + ОперационнаяСистема = НРег(ЧтениеXML.ЗначениеАтрибута("os")); + ТипКомпоненты = НРег(ЧтениеXML.ЗначениеАтрибута("type")); + АрхитектураПлатформы = НРег(ЧтениеXML.ЗначениеАтрибута("arch")); + ПрограммаПросмотра = НРег(ЧтениеXML.ЗначениеАтрибута("client")); + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386" + И (ТипКомпоненты = "native" Или ТипКомпоненты = "com") Тогда + + Реквизиты.Windows_x86 = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "x86_64" + И (ТипКомпоненты = "native" Или ТипКомпоненты = "com") Тогда + + Реквизиты.Windows_x86_64 = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "native" Тогда + + Реквизиты.Linux_x86 = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64" + И ТипКомпоненты = "native" Тогда + + Реквизиты.Linux_x86_64 = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда + + Реквизиты.Windows_x86_Firefox = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда + + Реквизиты.Linux_x86_Firefox = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда + + Реквизиты.Linux_x86_64_Firefox = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "msie" Тогда + + Реквизиты.Windows_x86_MSIE = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "x86_64" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "msie" Тогда + + Реквизиты.Windows_x86_64_MSIE = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда + + Реквизиты.Windows_x86_Chrome = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда + + Реквизиты.Linux_x86_Chrome = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64" + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда + + Реквизиты.Linux_x86_64_Chrome = Истина; + Продолжить; + КонецЕсли; + + Если ОперационнаяСистема = "macos" + И (АрхитектураПлатформы = "x86_64" Или АрхитектураПлатформы = "universal") + И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "safari" Тогда + + Реквизиты.MacOS_x86_64_Safari = Истина; + Продолжить; + КонецЕсли; + + КонецЕсли; + КонецЦикла; + КонецЕсли; + ЧтениеXML.Закрыть(); + +КонецПроцедуры + +Процедура РазобратьИнфоКомпоненты(ВременныйФайлXML, Реквизиты) + + ИнфоРазобран = Ложь; + + // Пытаемся разобрать по формату БПО + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ВременныйФайлXML); + + ЧтениеXML.ПерейтиКСодержимому(); + Если ЧтениеXML.Имя = "drivers" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.Имя = "component" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + Идентификатор = ЧтениеXML.ЗначениеАтрибута("progid"); + + Реквизиты.Идентификатор = Сред(Идентификатор, СтрНайти(Идентификатор, ".") + 1); + Реквизиты.Наименование = ЧтениеXML.ЗначениеАтрибута("name"); + Реквизиты.Версия = ЧтениеXML.ЗначениеАтрибута("version"); + + ИнфоРазобран = Истина; + + КонецЕсли; + КонецЦикла; + КонецЕсли; + ЧтениеXML.Закрыть(); + + Если Не ИнфоРазобран Тогда + + // Пытаемся разобрать по формату БЭД + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ВременныйФайлXML); + + info = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); + Реквизиты.Идентификатор = info.progid; + Реквизиты.Наименование = info.name; + Реквизиты.Версия = info.version; + + ЧтениеXML.Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#Область ЗагрузкаССайта + +// Только при наличии подсистемы БИП.ВнешниеКомпоненты +// +Функция НоваяКомпонентаССайта(Идентификатор, Версия = Неопределено) + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("Идентификатор"); + Таблица.Колонки.Добавить("Версия"); + Таблица.Колонки.Добавить("ТекущаяВерсия"); + + СтрокаТаблицы = Таблица.Добавить(); + СтрокаТаблицы.Идентификатор = Идентификатор; + СтрокаТаблицы.Версия = Версия; + СтрокаТаблицы.ТекущаяВерсия = Неопределено; + + МодульВнешниеКомпонентыИнтернетПоддержка = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыИнтернетПоддержка"); + Результат = МодульВнешниеКомпонентыИнтернетПоддержка.ЗагрузитьКомпонентыССайта(Таблица); + + Если Результат.Количество() = 0 Тогда + ТекстОшибки = НСтр("ru = 'На сайте 1С нет требуемой компоненты.'"); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + СтрокаРезультата = Результат[0]; // Фокусировка на первой строке результата. + + Информация = ИнформацияОКомпоненте(СтрокаРезультата.АдресХранилищаФайла, Ложь); + + Если Не Информация.Разобрано Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , Информация.ОписаниеОшибки); + ВызватьИсключение Информация.ОписаниеОшибки; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + // Создание экземпляра компоненты. + Объект = Справочники.ВнешниеКомпоненты.СоздатьЭлемент(); + Объект.Заполнить(Неопределено); // Конструктор по умолчанию. + + ЗаполнитьЗначенияСвойств(Объект, Информация.Реквизиты); // По данным манифеста. + ЗаполнитьЗначенияСвойств(Объект, СтрокаРезультата); // По данным с сайта. + + Объект.ДополнительныеСвойства.Вставить("ДвоичныеДанныеКомпоненты", Информация.ДвоичныеДанные); + + + // Если это компонента последней версии, то устанавливаем ОбновлятьССайта. + Если Версия = Неопределено Тогда // Если изначальный запрос конкретной версии - пропускаем. + + // Запрос требуется для случая, для контроля наличия компоненты старшей версии с отключенным обновлением. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Запрос.Текст = + "ВЫБРАТЬ + | МАКСИМУМ(ВнешниеКомпоненты.ДатаВерсии) КАК ДатаВерсии + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Идентификатор = &Идентификатор"; + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + ЭтоМаксимальнаяВерсия = (Выборка.ДатаВерсии = Null) Или (Выборка.ДатаВерсии = Объект.ДатаВерсии); + + Объект.ОбновлятьССайта = ЭтоМаксимальнаяВерсия; + + КонецЕсли; + + Попытка + Объект.Записать(); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Объект.Ссылка; + +КонецФункции + +// Выполняется в длительной операции. +// Вызывается из формы элемента и списка. +// +Процедура ОбновитьКомпонентыССайта(МассивСсылок, АдресРезультата) Экспорт + + Если Не ДоступнаЗагрузкаССайта() Тогда + ВызватьИсключение НСтр("ru = 'Обновление внешних компонент не доступно. + |Требуется подсистема обновления внешних компонент библиотеки интернет поддержки.'"); + КонецЕсли; + + // Фильтруем ссылки, убирая обновление для компонент без признака + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | НЕОПРЕДЕЛЕНО КАК Версия, + | ВнешниеКомпоненты.Версия КАК ТекущаяВерсия, + | ВнешниеКомпоненты.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты + |ГДЕ + | ВнешниеКомпоненты.Ссылка В(&МассивСсылок) + | И ВнешниеКомпоненты.ОбновлятьССайта"; + + ОбновитьКомпонентыССайтаПоЗапросу(Запрос); + +КонецПроцедуры + +// Только при наличии подсистемы БИП.ВнешниеКомпоненты. +// +Процедура ОбновитьКомпонентыССайтаПоЗапросу(Запрос) + + Если Не ДоступнаЗагрузкаССайта() Тогда + ВызватьИсключение НСтр("ru = 'Обновление внешних компонент не доступно. + |Требуется подсистема обновления внешних компонент библиотеки интернет поддержки.'"); + КонецЕсли; + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + + // Выборка для поиска ссылок при обработке результата запроса с сайта. + Выборка = РезультатЗапроса.Выбрать(); + + // Выполнение запроса к сайту. + Таблица = РезультатЗапроса.Выгрузить(); + + МодульВнешниеКомпонентыИнтернетПоддержка = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыИнтернетПоддержка"); + Результат = МодульВнешниеКомпонентыИнтернетПоддержка.ЗагрузитьКомпонентыССайта(Таблица); + + // Обход результата запроса с сайта. + Для каждого СтрокаРезультата Из Результат Цикл + + Информация = ИнформацияОКомпоненте(СтрокаРезультата.АдресХранилищаФайла, Ложь); + + Если Не Информация.Разобрано Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , Информация.ОписаниеОшибки); + ВызватьИсключение Информация.ОписаниеОшибки; + КонецЕсли; + + // Поиск ссылки. + Отбор = Новый Структура("Идентификатор", СтрокаРезультата.Идентификатор); + Если Выборка.НайтиСледующий(Отбор) Тогда + + Объект = Выборка.Ссылка.ПолучитьОбъект(); + + ЗаполнитьЗначенияСвойств(Объект, Информация.Реквизиты); // По данным манифеста. + ЗаполнитьЗначенияСвойств(Объект, СтрокаРезультата); // По данным с сайта. + + Объект.ДополнительныеСвойства.Вставить("ДвоичныеДанныеКомпоненты", Информация.ДвоичныеДанные); + + Попытка + Объект.Записать(); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/ПрисоединенныеФайлыСлужебный.mdo b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/ВнешниеКомпонентыСлужебный.mdo similarity index 59% rename from SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/ПрисоединенныеФайлыСлужебный.mdo rename to SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/ВнешниеКомпонентыСлужебный.mdo index ba47319b9..05716ca63 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/ПрисоединенныеФайлыСлужебный.mdo +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/ВнешниеКомпонентыСлужебный.mdo @@ -1,9 +1,9 @@ - - ПрисоединенныеФайлыСлужебный + + ВнешниеКомпонентыСлужебный ru - Присоединенные файлы служебный + Внешние компоненты служебный true true diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl new file mode 100644 index 000000000..c393d4ca7 --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl @@ -0,0 +1,72 @@ +#Область СлужебныеПроцедурыИФункции + +// Возвращает ссылку на справочник внешней компоненты по идентификатору и версии. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешнего компонента. +// Версия - Строка, Неопределено - версия компоненты. +// +// Возвращаемое значение: +// СправочникСсылка.ВнешниеКомпоненты - ссылка на контейнер внешней компоненты в информационной базе. +// +Функция СсылкаПоИдентификатору(Идентификатор, Версия = Неопределено) Экспорт + + Возврат ВнешниеКомпонентыСлужебный.СсылкаПоИдентификатору(Идентификатор, Версия); + +КонецФункции + +// Выполняет подготовку компоненты к подключению и возвращает информацию для проверки +// совместимости компоненты на клиенте. +// В случае отсутствия компоненты, выполняет ее получение средствами подсистемы интернет поддержки. +// Компонента помещается во временное хранилище до завершения сеанса, +// Для оптимизации памяти после попытки подключения рекомендуется выполнить очистку хранилища. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешнего компонента. +// Версия - Строка, Неопределено - версия компоненты. +// +// Возвращаемое значение: +// Структура - параметры выполнения задания (см. ДлительныеОперации.ВыполнитьВФоне). +// +Функция НачатьПодготовкуКомпонентыКПодключению(Идентификатор, Версия = Неопределено) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Идентификатор", Идентификатор); + Параметры.Вставить("Версия" , Версия); + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Подготовка компоненты...'"); + + Возврат ДлительныеОперации.ВыполнитьВФоне("ВнешниеКомпонентыСлужебный.ПодготовитьКомпонентуКПодключению", + Параметры, ПараметрыВыполнения); + +КонецФункции + +// Получает результат подготовки компоненты к подключению возвращает его и очищает память. +// +Функция РезультатПодготовкиКомпонентыКПодключению(АдресРезультата) Экспорт + + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + УдалитьИзВременногоХранилища(АдресРезультата); + Возврат Результат; + +КонецФункции + +// Имя файла компоненты для сохранения в файл. +// +Функция ИмяФайлаКомпоненты(Ссылка) Экспорт + + Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ИмяФайла"); + +КонецФункции + +// Проверяет доступность +// +Функция ДоступнаЗагрузкаКомпонентыИзФайла() Экспорт + + Возврат Пользователи.ЭтоПолноправныйПользователь(,, Ложь); + +КонецФункции + +#КонецОбласти + diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/ВнешниеКомпонентыСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/ВнешниеКомпонентыСлужебныйВызовСервера.mdo new file mode 100644 index 000000000..b1a027933 --- /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..c07e9d0eb --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl @@ -0,0 +1,453 @@ +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// Информация - Структура - См. функцию. +// +Функция ПроверитьДоступностьКомпоненты(Информация) + + СистемнаяИнформация = Новый СистемнаяИнформация; + + Браузер = Неопределено; + #Если ВебКлиент Тогда + + Строка = СистемнаяИнформация.ИнформацияПрограммыПросмотра; + + Если СтрНайти(Строка, "Chrome/") > 0 Тогда + Браузер = "Chrome"; + ИначеЕсли СтрНайти(Строка, "MSIE") > 0 Тогда + Браузер = "MSIE"; + ИначеЕсли СтрНайти(Строка, "Safari/") > 0 Тогда + Браузер = "Safari"; + ИначеЕсли СтрНайти(Строка, "Firefox/") > 0 Тогда + Браузер = "Firefox"; + КонецЕсли; + #КонецЕсли + + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда + + Если Браузер = Неопределено Тогда + Возврат Информация.Linux_x86; + КонецЕсли; + + Если Браузер = "Firefox" Тогда + Возврат Информация.Linux_x86_Firefox; + КонецЕсли; + + Если Браузер = "Chrome" Тогда + Возврат Информация.Linux_x86_Chrome; + КонецЕсли; + + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда + + Если Браузер = Неопределено Тогда + Возврат Информация.Linux_x86_64; + КонецЕсли; + + Если Браузер = "Firefox" Тогда + Возврат Информация.Linux_x86_64_Firefox; + КонецЕсли; + + Если Браузер = "Chrome" Тогда + Возврат Информация.Linux_x86_64_Chrome; + КонецЕсли; + + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда + + Если Браузер = "Safari" Тогда + Возврат Информация.MacOS_x86_64_Safari; + КонецЕсли; + + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда + + Если Браузер = Неопределено Тогда + Возврат Информация.Windows_x86; + КонецЕсли; + + Если Браузер = "Firefox" Тогда + Возврат Информация.Windows_x86_Firefox; + КонецЕсли; + + Если Браузер = "Chrome" Тогда + Возврат Информация.Windows_x86_Chrome; + КонецЕсли; + + Если Браузер = "MSIE" Тогда + Возврат Информация.Windows_x86_MSIE; + КонецЕсли; + + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + + Если Браузер = Неопределено Тогда + Возврат Информация.Windows_x86_64; + КонецЕсли; + + Если Браузер = "Firefox" Тогда + Возврат Информация.Windows_x86_Firefox; + КонецЕсли; + + Если Браузер = "Chrome" Тогда + Возврат Информация.Windows_x86_Chrome; + КонецЕсли; + + Если Браузер = "MSIE" Тогда + Возврат Информация.Windows_x86_64_MSIE; + КонецЕсли; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +#Область ПодключениеВнешнейКомпоненты + +// Вызывается после подготовки длительной операцией +// +Процедура ПодключитьКомпонентуПослеПодготовки(Результат, Контекст) Экспорт + + // Ответ: + // - Структура - Выполнено - результат в структуре. + // - Неопределено - Отменено пользователем. + Если Результат = Неопределено Тогда + + // Освобождаем выделенную память. + УдалитьИзВременногоХранилища(Контекст.АдресРезультатаПодготовкиКомпоненты); // Вызов сервера. + + Возврат; + КонецЕсли; + + // В контексте АдресРезультата больше не нужен, теперь он актуализирован в Результат.АдресРезультата. + Контекст.Удалить("АдресРезультатаПодготовкиКомпоненты"); + + // Результат.Статус: + // - "Ошибка" - описание в ОписаниеОшибки. + // - "Выполнено" - результат в Результат.АдресРезультата. + Если Результат.Статус = "Ошибка" Тогда + + // Освобождаем выделенную память. + УдалитьИзВременногоХранилища(Результат.АдресРезультата); // Вызов сервера. + + РезультатПодключения = Новый Структура; + РезультатПодключения.Вставить("Подключено" , Ложь); + РезультатПодключения.Вставить("ОписаниеОшибки", Результат.КраткоеПредставлениеОшибки); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатПодключения); + Возврат; + + КонецЕсли; + + Информация = ВнешниеКомпонентыСлужебныйВызовСервера.РезультатПодготовкиКомпонентыКПодключению( + Результат.АдресРезультата); // Вызов сервера. + + Доступна = ПроверитьДоступностьКомпоненты(Информация); + + Если Не Доступна Тогда + + ОповещениеФормы = Новый ОписаниеОповещения( + "ПодключитьКомпонентуЗавершениеНеДоступноВКлиенте", ЭтотОбъект, Контекст.Оповещение); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстПояснения" , Контекст.ТекстПояснения); + ПараметрыФормы.Вставить("ПоддерживаемыеКлиенты", Информация); + + ОткрытьФорму("ОбщаяФорма.ДоступныеВидыКлиентовВнешнейКомпоненты", + ПараметрыФормы,,,,, ОповещениеФормы); + + Возврат; + + КонецЕсли; + + Контекст.Вставить("Местоположение", Информация.Местоположение); + + ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпоненту(Контекст); + +КонецПроцедуры + +// +Процедура ПодключитьКомпонентуЗавершениеНеДоступноВКлиенте(Результат, Оповещение) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", ""); + + ВыполнитьОбработкуОповещения(Оповещение, Результат); + +КонецПроцедуры + +// Параметры: +// Контекст - Структура - контекст процедуры: +// * Оповещение - ОписаниеОповещения - . +// * Идентификатор - Строка - . +// * ИдентификаторСозданияОбъекта - Строка, Неопределено - . +// +Процедура ПодключитьКомпонентуИзРеестраWindows(Контекст) Экспорт + + Если ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() + И Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда + + Оповещение = Новый ОписаниеОповещения( + "ПодключитьКомпонентуИзРеестраWindowsЗавершение", ЭтотОбъект, Контекст, + "ПодключитьКомпонентуЗавершениеПоОшибке", ЭтотОбъект); + + НачатьПодключениеВнешнейКомпоненты(Оповещение, "AddIn." + Контекст.Идентификатор); + Возврат; + + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Подключить компоненту из реестра Windows + |возможно только в тонком и толстом клиенте Windows'")); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Продолжение процедуры ПодключитьКомпонентуИзРеестраWindows. +Процедура ПодключитьКомпонентуИзРеестраWindowsЗавершение(Подключено, Контекст) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Подключено", Подключено); + + Если Не Подключено Тогда + + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Ошибка при подключении внешней компоненты'")); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + + КонецЕсли; + + Попытка + + ИдентификаторСозданияОбъекта = Контекст.ИдентификаторСозданияОбъекта; + Если ИдентификаторСозданияОбъекта = Неопределено Тогда + ИдентификаторСозданияОбъекта = Контекст.Идентификатор; + КонецЕсли; + + ПодключаемыйМодуль = Новый("AddIn." + ИдентификаторСозданияОбъекта); + + Если ПодключаемыйМодуль = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Ошибка при создании экземпляра внешней компоненты'"); + КонецЕсли; + + Результат.Вставить("ПодключаемыйМодуль", ПодключаемыйМодуль); + + Исключение + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Продолжение процедуры ПодключитьКомпонентуИзРеестраWindows. +Процедура ПодключитьКомпонентуЗавершениеПоОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + Результат = Новый Структура; + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область УстановкаВнешнейКомпоненты + +// Вызывается после подготовки длительной операцией +// +Процедура УстановитьКомпонентуПослеПодготовки(Результат, Контекст) Экспорт + + // Ответ: + // - Структура - Выполнено - результат в структуре. + // - Неопределено - Отменено пользователем. + Если Результат = Неопределено Тогда + + // Освобождаем выделенную память. + УдалитьИзВременногоХранилища(Контекст.АдресРезультатаПодготовкиКомпоненты); // Вызов сервера. + + Возврат; + КонецЕсли; + + // В контексте АдресРезультата больше не нужен, теперь он актуализирован в Результат.АдресРезультата. + Контекст.Удалить("АдресРезультатаПодготовкиКомпоненты"); + + // Результат.Статус: + // - "Ошибка" - описание в ОписаниеОшибки. + // - "Выполнено" - результат в Результат.АдресРезультата. + Если Результат.Статус = "Ошибка" Тогда + + // Освобождаем выделенную память. + УдалитьИзВременногоХранилища(Результат.АдресРезультата); // Вызов сервера. + + РезультатУстановки = Новый Структура; + РезультатУстановки.Вставить("Установлено" , Ложь); + РезультатУстановки.Вставить("ОписаниеОшибки", Результат.КраткоеПредставлениеОшибки); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатУстановки); + Возврат; + + КонецЕсли; + + Информация = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); // Вызов сервера. + + // Освобождаем выделенную память. + УдалитьИзВременногоХранилища(Результат.АдресРезультата); // Вызов сервера. + + Доступна = ПроверитьДоступностьКомпоненты(Информация); + + Если Не Доступна Тогда + + ОповещениеФормы = Новый ОписаниеОповещения( + "УстановитьКомпонентуЗавершениеНеДоступноВКлиенте", ЭтотОбъект, Контекст.Оповещение); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстПояснения" , Контекст.ТекстПояснения); + ПараметрыФормы.Вставить("ПоддерживаемыеКлиенты", Информация); + + ОткрытьФорму("ОбщаяФорма.ДоступныеВидыКлиентовВнешнейКомпоненты", + ПараметрыФормы,,,,, ОповещениеФормы); + + Возврат; + + КонецЕсли; + + Контекст.Вставить("Местоположение", Информация.Местоположение); + + ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпоненту(Контекст); + +КонецПроцедуры + +// +Процедура УстановитьКомпонентуЗавершениеНеДоступноВКлиенте(Результат, Оповещение) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Установлено" , Ложь); + Результат.Вставить("ОписаниеОшибки", ""); + + ВыполнитьОбработкуОповещения(Оповещение, Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область ЗагрузкаВнешнейКомпоненты + +// Параметры: +// Контекст - Структура - контекст процедуры: +// * Оповещение - ОписаниеОповещения - . +// * Идентификатор - Строка, Неопределено - . +// * Версия - Строка, Неопределено - . +// +Процедура ЗагрузитьКомпонентуИзФайла(Контекст) Экспорт + + Если Не ВнешниеКомпонентыСлужебныйВызовСервера.ДоступнаЗагрузкаКомпонентыИзФайла() Тогда + + Результат = Новый Структура; + Результат.Вставить("Загружено", Ложь); + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Для загрузки компоненты требуются права администратора.'")); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + + Возврат; + + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии", Истина); + ПараметрыФормы.Вставить("ВернутьРезультатЗагрузкиИзФайла" , Истина); + + Если Контекст.Идентификатор <> Неопределено Тогда + Ссылка = ВнешниеКомпонентыСлужебныйВызовСервера.СсылкаПоИдентификатору(Контекст.Идентификатор, + Контекст.Версия); + Если Не Ссылка.Пустая() Тогда + ПараметрыФормы.Вставить("Ключ", Ссылка); + КонецЕсли; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ЗагрузитьКомпонентуИзФайлаПослеЗагрузки", ЭтотОбъект, Контекст); + + ОткрытьФорму("Справочник.ВнешниеКомпоненты.ФормаОбъекта", ПараметрыФормы,,,,, Оповещение); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьКомпонентуИзФайла. +Процедура ЗагрузитьКомпонентуИзФайлаПослеЗагрузки(Результат, Контекст) Экспорт + + // Результат: + // - Структура - Загружено. + // - Неопределено - Закрыто окно. + + Загружено = (ТипЗнч(Результат) = Тип("Структура")); + + Если Не Загружено Тогда + Результат = Новый Структура; + Результат.Вставить("ОписаниеОшибки", ""); + КонецЕсли; + + Результат.Вставить("Загружено", Загружено); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область СохранениеВнешнейКомпоненты + +// Параметры: +// Ссылка - СправочникСсылка.ВнешниеКомпоненты - контейнер внешней компоненты в информационной базе. +// +Процедура СохранитьКомпонентуВФайл(Ссылка) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Ссылка", Ссылка); + + Оповещение = Новый ОписаниеОповещения("СохранитьКомпонентуВФайлПослеУстановкиРасширения", ЭтотОбъект, Контекст); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение); + +КонецПроцедуры + +// Продолжение процедуры СохранитьКомпонентуВФайл. +Процедура СохранитьКомпонентуВФайлПослеУстановкиРасширения(РасширениеПодключено, Контекст) Экспорт + + Местоположение = ПолучитьНавигационнуюСсылку(Контекст.Ссылка, "ХранилищеКомпоненты"); + ИмяФайла = ВнешниеКомпонентыСлужебныйВызовСервера.ИмяФайлаКомпоненты(Контекст.Ссылка); + + Если Не РасширениеПодключено Тогда + ПолучитьФайл(Местоположение, ИмяФайла); + Возврат; + КонецЕсли; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения внешней компоненты'"); + Диалог.Фильтр = НСтр("ru = 'Файлы внешних компонент (*.zip)|*.zip|Все файлы (*.*)|*.*'"); + Диалог.МножественныйВыбор = Ложь; + + ПолучаемыеФайлы = Новый Массив; + ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, Местоположение)); + + Оповещение = Новый ОписаниеОповещения("СохранитьКомпонентуВФайлПослеПолученияФайлов", ЭтотОбъект, Контекст); + НачатьПолучениеФайлов(Оповещение, ПолучаемыеФайлы, Диалог); + +КонецПроцедуры + +// Продолжение процедуры СохранитьКомпонентуВФайл. +Процедура СохранитьКомпонентуВФайлПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт + + Если ПолученныеФайлы <> Неопределено + И ПолученныеФайлы.Количество() > 0 Тогда + + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение в файл'"),, + НСтр("ru = 'Внешняя компонента успешно сохранена в файл.'"), БиблиотекаКартинок.Успешно32); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/ПрисоединенныеФайлыСлужебныйКлиент.mdo b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/ВнешниеКомпонентыСлужебныйКлиент.mdo similarity index 55% rename from SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/ПрисоединенныеФайлыСлужебныйКлиент.mdo rename to SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/ВнешниеКомпонентыСлужебныйКлиент.mdo index 03281794e..b547f2929 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/ПрисоединенныеФайлыСлужебныйКлиент.mdo +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/ВнешниеКомпонентыСлужебныйКлиент.mdo @@ -1,9 +1,9 @@ - - ПрисоединенныеФайлыСлужебныйКлиент + + ВнешниеКомпонентыСлужебныйКлиент ru - Присоединенные файлы служебный клиент + Внешние компоненты служебный клиент true true diff --git a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl index 2a79c7a3a..0b5dde39c 100644 --- a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает признак использования внешних пользователей в программе @@ -17,7 +12,7 @@ КонецФункции -// См. одноименную функцию в общем модуле ПользователиКлиентСервер. +// См. ПользователиКлиентСервер.ТекущийВнешнийПользователь. Функция ТекущийВнешнийПользователь() Экспорт Возврат ПользователиКлиентСервер.ТекущийВнешнийПользователь(); @@ -89,5 +84,4 @@ КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl similarity index 57% rename from SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl rename to SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl index 218eceea5..7549ef214 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl @@ -1,16 +1,14 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Интеграция с 1С:Бухфон". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Процедура устанавливает свойства элемента кнопки при встраивании в другие подсистемы. +// Выполняет действия, необходимые для подключения подсистемы в форме. +// +// Параметры: +// Элемент - КнопкаФормы - команда вызова онлайн поддержки на форме. // Процедура ПриСозданииНаСервере(Элемент) Экспорт - НастройкиПользователя = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя(); - Элемент.Видимость = НастройкиПользователя.ВидимостьКнопки1СБухфон; + НастройкиПользователя = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); + Элемент.Видимость = НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки; КонецПроцедуры @@ -18,27 +16,27 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "Интеграция1СБухфон"); - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "Интеграция1СБухфон.ПервоначальноеЗаполнение"; + Обработчик.Процедура = "ВызовОнлайнПоддержки.ПервоначальноеЗаполнение"; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт + + Библиотека = "СтандартныеПодсистемы"; + + СтароеИмя = "Роль.Интеграция1СБухфон"; + НовоеИмя = "Роль.ВызовОнлайнПоддержки"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.4.1.1", СтароеИмя, НовоеИмя, Библиотека); + КонецПроцедуры @@ -46,22 +44,22 @@ #Область СлужебныеПроцедурыИФункции -// Записывает в регистр сведений путь исполняемого файла 1С-Бухфон. +// Записывает в регистр сведений путь исполняемого файла онлайн-поддержки. // Хранение путей до исполняемых файлов ведется в разрезе ПК, для определения ПК используется идентификатор клиента // т.к. невозможно использование функции ИмяКомпьютера в веб клиенте. // // Параметры: // ИдентификаторКлиента - УникальныйИдентификатор - Идентификатор клиента (программы) 1С. // НовоеРасположениеФайла - Строка - Расположение исполняемого файла для ПК на котором запущен клиент 1С. -Процедура СохранитьРасположениеИсполняемогоФайла1СБухфон(ИдентификаторКлиента, НовоеРасположениеФайла) Экспорт +Процедура СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, НовоеРасположениеФайла) Экспорт - ТекущееРасположениеФайла = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); + ТекущееРасположениеФайла = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); Если ТекущееРасположениеФайла = НовоеРасположениеФайла Тогда Возврат; КонецЕсли; - ХранилищеОбщихНастроек.Сохранить("ПутиИсполняемыхФайлов1СБухфон", ИдентификаторКлиента, НовоеРасположениеФайла); + ХранилищеОбщихНастроек.Сохранить("ПутиИсполняемыхФайловВызовОнлайнПоддержки", ИдентификаторКлиента, НовоеРасположениеФайла); КонецПроцедуры @@ -72,20 +70,20 @@ // Логин - Строка - Данные учетной записи приложения. // Пароль - Строка - Данные учетной записи приложения. // ИспользоватьЛП - Булево - Если значение Ложь, параметры Логин, Пароль не доступны. -// ВидимостьКнопки1СБухфон - Булево - Отображение Кнопки запуска приложения на начальной странице. +// ВидимостьКнопкиВызовОнлайнПоддержки - Булево - Отображение Кнопки запуска приложения на начальной странице. // Процедура СохранитьНастройкиПользователяВХранилище(Логин, Пароль, ИспользоватьЛП, - ВидимостьКнопки1СБухфон) Экспорт + ВидимостьКнопкиВызовОнлайнПоддержки) Экспорт НастройкиПользователя = НастройкиПользователя(); НастройкиПользователя.Логин = Логин; НастройкиПользователя.Пароль = Пароль; НастройкиПользователя.ИспользоватьЛП = ИспользоватьЛП; - НастройкиПользователя.ВидимостьКнопки1СБухфон = ВидимостьКнопки1СБухфон; + НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки = ВидимостьКнопкиВызовОнлайнПоддержки; - ХранилищеОбщихНастроек.Сохранить("УчетныеЗаписиПользователей1СБухфон", "НастройкиУчетныхДанных", НастройкиПользователя); + ХранилищеОбщихНастроек.Сохранить("УчетныеЗаписиПользователейВызовОнлайнПоддержки", "НастройкиУчетныхДанных", НастройкиПользователя); КонецПроцедуры @@ -95,14 +93,14 @@ НастройкиПользователя.Вставить("Логин", ""); НастройкиПользователя.Вставить("Пароль",""); НастройкиПользователя.Вставить("ИспользоватьЛП",Ложь); - НастройкиПользователя.Вставить("ВидимостьКнопки1СБухфон",Ложь); + НастройкиПользователя.Вставить("ВидимостьКнопкиВызовОнлайнПоддержки",Ложь); Возврат НастройкиПользователя; КонецФункции Процедура ПервоначальноеЗаполнение() Экспорт - Константы.ИспользоватьИнтеграцию1СБухфон.Установить(Истина); + Константы.ИспользоватьОнлайнПоддержку.Установить(Истина); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/Интеграция1СБухфон/Интеграция1СБухфон.mdo b/SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo similarity index 75% rename from SSL/src/CommonModules/Интеграция1СБухфон/Интеграция1СБухфон.mdo rename to SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo index f215dee79..39ceabf59 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфон/Интеграция1СБухфон.mdo +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo @@ -1,9 +1,9 @@ - Интеграция1СБухфон + ВызовОнлайнПоддержки ru - Интеграция с 1С-Бухфон + Вызов онлайн-поддержки true true diff --git a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl similarity index 58% rename from SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl index a3b56932e..7fa9321c0 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Интеграция с 1С:Бухфон". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Получает из регистра сведений путь к исполняемому файлу. @@ -15,7 +10,7 @@ // Функция РасположениеИсполняемогоФайла(ИдентификаторКлиента) Экспорт - Возврат ХранилищеОбщихНастроек.Загрузить("ПутиИсполняемыхФайлов1СБухфон", ИдентификаторКлиента); + Возврат ХранилищеОбщихНастроек.Загрузить("ПутиИсполняемыхФайловВызовОнлайнПоддержки", ИдентификаторКлиента); КонецФункции @@ -29,14 +24,14 @@ // Функция НастройкиУчетнойЗаписиПользователя() Экспорт - НастройкиПользователя = Интеграция1СБухфон.НастройкиПользователя(); - НастройкиПользователяХранилище = ХранилищеОбщихНастроек.Загрузить("УчетныеЗаписиПользователей1СБухфон", "НастройкиУчетныхДанных"); + НастройкиПользователя = ВызовОнлайнПоддержки.НастройкиПользователя(); + НастройкиПользователяХранилище = ХранилищеОбщихНастроек.Загрузить("УчетныеЗаписиПользователейВызовОнлайнПоддержки", "НастройкиУчетныхДанных"); Если НЕ НастройкиПользователяХранилище = Неопределено Тогда - НастройкиПользователя.Логин = НастройкиПользователяХранилище.Логин; - НастройкиПользователя.Пароль = НастройкиПользователяХранилище.Пароль; - НастройкиПользователя.ИспользоватьЛП = НастройкиПользователяХранилище.ИспользоватьЛП; - НастройкиПользователя.ВидимостьКнопки1СБухфон = НастройкиПользователяХранилище.ВидимостьКнопки1СБухфон; + ЗаполнитьЗначенияСвойств(НастройкиПользователя, НастройкиПользователяХранилище); + Если НастройкиПользователяХранилище.Свойство("ВидимостьКнопки1СБухфон") Тогда + НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки = НастройкиПользователяХранилище.ВидимостьКнопки1СБухфон; + КонецЕсли; КонецЕсли; Возврат НастройкиПользователя; diff --git a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Интеграция1СБухфонВызовСервера.mdo b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo similarity index 62% rename from SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Интеграция1СБухфонВызовСервера.mdo rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo index 111922908..e9c80c703 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Интеграция1СБухфонВызовСервера.mdo +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo @@ -1,9 +1,9 @@ - Интеграция1СБухфонВызовСервера + ВызовОнлайнПоддержкиВызовСервера ru - Интеграция с 1С-Бухфон + Вызов онлайн-поддержки вызов сервера true true diff --git a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl similarity index 63% rename from SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl index bc44af9c6..6bc1623bb 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl @@ -1,17 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Интеграция с 1С:Бухфон". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Процедура устанавливает свойства элемента кнопки при встраивании в другие подсистемы. +// Управляет видимостью команды вызова онлайн поддержки на форме +// +// Параметры: +// ИмяСобытия - Строка - идентификатор сообщения; +// Элемент - КнопкаФормы - команда вызова онлайн поддержки на форме. // Процедура ОбработкаОповещения(ИмяСобытия, Элемент) Экспорт - Если ИмяСобытия = "СохранениеНастроек1СБухфон" Тогда - НастройкиПользователя = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя(); - Элемент.Видимость = НастройкиПользователя.ВидимостьКнопки1СБухфон; + Если ИмяСобытия = "СохранениеНастроекВызовОнлайнПоддержки" Тогда + НастройкиПользователя = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); + Элемент.Видимость = НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки; КонецЕсли; КонецПроцедуры @@ -60,18 +59,18 @@ // // Возвращаемое значение: // Строка - Путь к исполняемому файлу. -Процедура ВыбратьФайл1СБухфон(ОповещениеОЗакрытии, ПутьКФайлу = "") Экспорт +Процедура ВыбратьФайлВызовОнлайнПоддержки(ОповещениеОЗакрытии, ПутьКФайлу = "") Экспорт ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ОповещениеОЗакрытии", ОповещениеОЗакрытии); ДополнительныеПараметры.Вставить("ПутьКФайлу", ПутьКФайлу); ТекстПредложения = НСтр("ru = 'Для выбора приложения необходимо установить расширение работы с файлами.'"); - Оповещение = Новый ОписаниеОповещения("ВыбратьФайл1СБухфонПослеУстановкиРасширения", ЭтотОбъект, ДополнительныеПараметры); + Оповещение = Новый ОписаниеОповещения("ВыбратьФайлВызовОнлайнПоддержкиПослеУстановкиРасширения", ЭтотОбъект, ДополнительныеПараметры); ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения, Ложь); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура ВыбратьФайл1СБухфонПослеУстановкиРасширения(Подключено, ДополнительныеПараметры) Экспорт +Процедура ВыбратьФайлВызовОнлайнПоддержкиПослеУстановкиРасширения(Подключено, ДополнительныеПараметры) Экспорт Если Не Подключено Тогда ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗакрытии, ""); @@ -87,13 +86,13 @@ Диалог.Фильтр = Фильтр; Диалог.МножественныйВыбор = Ложь; - Оповещение = Новый ОписаниеОповещения("ВыбратьФайл1СБухфонЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Оповещение = Новый ОписаниеОповещения("ВыбратьФайлВызовОнлайнПоддержкиЗавершение", ЭтотОбъект, ДополнительныеПараметры); Диалог.Показать(Оповещение); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура ВыбратьФайл1СБухфонЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт +Процедура ВыбратьФайлВызовОнлайнПоддержкиЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗакрытии, ВыбранныеФайлы[0]); Иначе @@ -106,41 +105,45 @@ // Возвращаемое значение: // Булево - При значении Истина файл запустится по указанному пути. // -Процедура НаличиеФайла1СБухфон(ОповещениеОЗакрытии, Путь) - Оповещение = Новый ОписаниеОповещения("НаличиеФайла1СБухфонПослеИнициализацииФайла", ЭтотОбъект, ОповещениеОЗакрытии); +Процедура НаличиеФайлаВызовОнлайнПоддержки(ОповещениеОЗакрытии, Путь) + Оповещение = Новый ОписаниеОповещения("НаличиеФайлаВызовОнлайнПоддержкиПослеИнициализацииФайла", ЭтотОбъект, ОповещениеОЗакрытии); ПроверяемыйФайл = Новый Файл(); ПроверяемыйФайл.НачатьИнициализацию(Оповещение, Путь); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура НаличиеФайла1СБухфонПослеИнициализацииФайла(Файл, ОповещениеОЗакрытии) Экспорт - Оповещение = Новый ОписаниеОповещения("НаличиеФайла1СБухфонПослеПроверкиСуществования", ЭтотОбъект, ОповещениеОЗакрытии); - Файл.НачатьПроверкуСуществования(Оповещение); +Процедура НаличиеФайлаВызовОнлайнПоддержкиПослеИнициализацииФайла(Файл, ОповещениеОЗакрытии) Экспорт + Оповещение = Новый ОписаниеОповещения("НаличиеФайлаВызовОнлайнПоддержкиПослеПроверкиСуществования", ЭтотОбъект, ОповещениеОЗакрытии); + Если НРег(Файл.Расширение) <> ".exe" Тогда + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, Ложь); + Иначе + Файл.НачатьПроверкуСуществования(Оповещение); + КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура НаличиеФайла1СБухфонПослеПроверкиСуществования(Существует, ОповещениеОЗакрытии) Экспорт +Процедура НаличиеФайлаВызовОнлайнПоддержкиПослеПроверкиСуществования(Существует, ОповещениеОЗакрытии) Экспорт ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, Существует); КонецПроцедуры // Процедура запускает исполняемый файл приложения. // При отсутствии файла приложения - открывает форму поиска пути к исполняемому файлу. // -Процедура Запустить1СБухфон() Экспорт +Процедура ВызватьОнлайнПоддержку() Экспорт Если НЕ ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Для работы с приложением необходима операционная система Microsoft Windows.'")); Возврат КонецЕсли; - Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеУстановкиРасширения", ЭтотОбъект); + Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеУстановкиРасширения", ЭтотОбъект); ТекстСообщения = НСтр("ru = 'Для запуска приложения необходимо установить расширение работы с файлами.'"); ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения, Ложь); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура Запустить1СБухфонПослеУстановкиРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт +Процедура ВызватьОнлайнПоддержкуПослеУстановкиРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт Если НЕ РасширениеПодключено Тогда Возврат; @@ -149,69 +152,69 @@ // Определение параметров запуска. ИдентификаторКлиента = ИдентификаторКлиента(); ПутьИзРеестра = ПутьКИсполняемомуФайлуИзРеестраWindows(); - ПутьИзХранилища = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); + ПутьИзХранилища = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ПутьИзРеестра", ПутьИзРеестра); ДополнительныеПараметры.Вставить("ПутьИзХранилища", ПутьИзХранилища); - Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеПроверкиПутиИзРеестра", ЭтотОбъект, ДополнительныеПараметры); - НаличиеФайла1СБухфон(Оповещение, ПутьИзРеестра); + Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеПроверкиПутиИзРеестра", ЭтотОбъект, ДополнительныеПараметры); + НаличиеФайлаВызовОнлайнПоддержки(Оповещение, ПутьИзРеестра); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура Запустить1СБухфонПослеПроверкиПутиИзРеестра(ПутьИзРеестраВерен, ДополнительныеПараметры) Экспорт +Процедура ВызватьОнлайнПоддержкуПослеПроверкиПутиИзРеестра(ПутьИзРеестраВерен, ДополнительныеПараметры) Экспорт ДополнительныеПараметры.Вставить("ПутьИзРеестраВерен", ПутьИзРеестраВерен); - Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеПроверкиПутиИзХранилища", ЭтотОбъект, ДополнительныеПараметры); - НаличиеФайла1СБухфон(Оповещение, ДополнительныеПараметры.ПутьИзХранилища); + Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеПроверкиПутиИзХранилища", ЭтотОбъект, ДополнительныеПараметры); + НаличиеФайлаВызовОнлайнПоддержки(Оповещение, ДополнительныеПараметры.ПутьИзХранилища); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура Запустить1СБухфонПослеПроверкиПутиИзХранилища(ПутьИзХранилищаВерен, ДополнительныеПараметры) Экспорт +Процедура ВызватьОнлайнПоддержкуПослеПроверкиПутиИзХранилища(ПутьИзХранилищаВерен, ДополнительныеПараметры) Экспорт - УчетнаяЗапись = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя(); - ПараметрыЗапуска1СБухфон = " /StartedFrom1CConf"; + УчетнаяЗапись = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); + ПараметрыЗапускаВызовОнлайнПоддержки = " /StartedFrom1CConf"; - Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеЗапускаПриложения", ЭтотОбъект); + Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеЗапускаПриложения", ЭтотОбъект); Если УчетнаяЗапись.ИспользоватьЛП Тогда Если УчетнаяЗапись.Логин <> "" И УчетнаяЗапись.Пароль <> "" Тогда - ПараметрыЗапуска1СБухфон = ПараметрыЗапуска1СБухфон + " /login:" + УчетнаяЗапись.Логин + " /password:" + УчетнаяЗапись.Пароль; + ПараметрыЗапускаВызовОнлайнПоддержки = ПараметрыЗапускаВызовОнлайнПоддержки + " /login:" + УчетнаяЗапись.Логин + " /password:" + УчетнаяЗапись.Пароль; КонецЕсли; Если ПутьИзХранилищаВерен Тогда - НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзХранилища + ПараметрыЗапуска1СБухфон); + НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзХранилища + ПараметрыЗапускаВызовОнлайнПоддержки); Возврат; КонецЕсли; Если ДополнительныеПараметры.ПутьИзРеестраВерен Тогда - НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзРеестра + ПараметрыЗапуска1СБухфон); + НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзРеестра + ПараметрыЗапускаВызовОнлайнПоддержки); Возврат; КонецЕсли; Иначе Если ПутьИзХранилищаВерен Тогда - НачатьЗапускПриложения(Оповещение, """" + ДополнительныеПараметры.ПутьИзХранилища + """" + ПараметрыЗапуска1СБухфон); + НачатьЗапускПриложения(Оповещение, """" + ДополнительныеПараметры.ПутьИзХранилища + """" + ПараметрыЗапускаВызовОнлайнПоддержки); Возврат; КонецЕсли; Если ДополнительныеПараметры.ПутьИзРеестраВерен Тогда - НачатьЗапускПриложения(Оповещение, """" + ДополнительныеПараметры.ПутьИзРеестра + """" + ПараметрыЗапуска1СБухфон); + НачатьЗапускПриложения(Оповещение, """" + ДополнительныеПараметры.ПутьИзРеестра + """" + ПараметрыЗапускаВызовОнлайнПоддержки); Возврат; КонецЕсли; КонецЕсли; - ОткрытьФорму("ОбщаяФорма.ПоискИсполняемогоФайла1СБухфон"); + ОткрытьФорму("ОбщаяФорма.ПоискИсполняемогоФайлаОнлайнПоддержки"); КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура Запустить1СБухфонПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт +Процедура ВызватьОнлайнПоддержкуПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт // Обработка не требуется. КонецПроцедуры diff --git a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Интеграция1СБухфонКлиент.mdo b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo similarity index 70% rename from SSL/src/CommonModules/Интеграция1СБухфонКлиент/Интеграция1СБухфонКлиент.mdo rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo index 6960b442b..4f339c6a7 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Интеграция1СБухфонКлиент.mdo +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo @@ -1,9 +1,9 @@ - Интеграция1СБухфонКлиент + ВызовОнлайнПоддержкиКлиент ru - Интеграция с 1С-Бухфон клиент + Вызов онлайн-поддержки клиент true true diff --git a/SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl similarity index 80% rename from SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Module.bsl rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl index 5f9df9f79..c9d2c4c5e 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl @@ -1,9 +1,8 @@ - #Область СлужебныеПроцедурыИФункции -// Вызывается при изменении настроек кнопки запуска 1С-Бухфон. +// Вызывается при изменении настроек кнопки запуска онлайн-поддержки. // Процедуру можно использовать для настройки видимости формы, -// на которой расположена кнопка запуска 1С-Бухфон. +// на которой расположена кнопка запуска онлайн-поддержки. Процедура ПриИзмененииНастроек() Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Интеграция1СБухфонПереопределяемый.mdo b/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo similarity index 66% rename from SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Интеграция1СБухфонПереопределяемый.mdo rename to SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo index 68e6a8e57..48a2c50aa 100644 --- a/SSL/src/CommonModules/Интеграция1СБухфонПереопределяемый/Интеграция1СБухфонПереопределяемый.mdo +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo @@ -1,9 +1,9 @@ - Интеграция1СБухфонПереопределяемый + ВызовОнлайнПоддержкиПереопределяемый ru - Интеграция с 1С-Бухфон переопределяемый + Вызов онлайн-поддержки переопределяемый true true diff --git a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl index 555e78793..ac2d5982f 100644 --- a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl @@ -1,26 +1,22 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Графики работы". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Функция возвращает массив дат, которые отличается указанной даты на количество дней, -// входящих в указанный график. +// Возвращает даты, которые отличаются указанной даты ДатаОт на количество дней, +// входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - график , который необходимо использовать, тип СправочникСсылка.Календари. -// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата. -// МассивДней - массив с количеством дней, на которые нужно увеличить дату начала, тип Массив,Число. -// РассчитыватьСледующуюДатуОтПредыдущей - нужно ли рассчитывать следующую дату от предыдущей или -// все даты рассчитываются от переданной даты. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей, +// или все даты рассчитываются от переданной даты. +// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. // -// Возвращаемое значение -// Массив - массив дат, увеличенных на количество дней, входящих в график, -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// Массив, Неопределено - даты, увеличенные на количество дней, входящих в график ГрафикРаботы. +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // -Функция ДатыПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт +Функция ДатыПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, + Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; @@ -43,6 +39,7 @@ |ГДЕ | КалендарныеГрафики.ДатаГрафика >= &ДатаОт | И КалендарныеГрафики.Календарь = &ГрафикРаботы + | И КалендарныеГрафики.ДеньВключенВГрафик | |СГРУППИРОВАТЬ ПО | КалендарныеГрафики.Год @@ -72,6 +69,7 @@ | КалендарныеГрафики.ДатаГрафика >= &ДатаОт | И КалендарныеГрафики.Год = ГОД(&ДатаОт) | И КалендарныеГрафики.Календарь = &ГрафикРаботы + | И КалендарныеГрафики.ДеньВключенВГрафик |; | |//////////////////////////////////////////////////////////////////////////////// @@ -117,18 +115,18 @@ КонецФункции -// Функция возвращает дату, которая отличается указанной даты на количество дней, -// входящих в указанный график. +// Возвращает дату, которая отличается указанной даты ДатаОт на количество дней, +// входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - график, который необходимо использовать, тип СправочникСсылка.Календари. -// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата. -// КоличествоДней - количество дней, на которые нужно увеличить дату начала, тип Число. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала ДатаОт. +// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. // -// Возвращаемое значение -// Дата - дата, увеличенная на количество дней, входящих в график. -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график ГрафикРаботы. +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатаПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт @@ -151,15 +149,16 @@ // Если расписание на предпраздничный день не задано, то оно определяется так, как если бы этот день был бы рабочим. // // Параметры: -// Графики - массив элементов типа СправочникСсылка.Календари. -// ДатаНачала - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // -// Возвращаемое значение - таблица значений с колонками. -// ГрафикРаботы -// ДатаГрафика -// ВремяНачала -// ВремяОкончания +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * ГрафикРаботы - СправочникСсылка.Календари - график работы. +// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. +// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. +// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. // Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -184,8 +183,14 @@ КонецФункции -// Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками. -// Подробнее см. комментарий к функции РасписанияРаботыНаПериод. +// Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками, соответствующими возвращаемому значению +// функции РасписанияРаботыНаПериод. +// +// Параметры: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -375,26 +380,6 @@ КонецПроцедуры -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления" - ].Добавить("ГрафикиРаботы"); - -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - - // СовместноДляПользователейИВнешнихПользователей. - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ЧтениеГрафиковРаботы.Имя); - -КонецПроцедуры - // Создает временную таблицу ВТКалендарныеГрафики, содержащую данные графика ГрафикРаботы за годы, // приведенные в ВТРазличныеГодыГрафика. // @@ -444,9 +429,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Процедура выполняет обновление графиков работы по данным производственных календарей // по всем областям данных. // @@ -459,25 +441,12 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - //////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы. +// Обработчики событий подсистем конфигурации. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ГрафикиРаботы.СоздатьКалендарьПятидневкаРоссийскойФедерации"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.3.1"; Обработчик.Процедура = "ГрафикиРаботы.ЗаполнитьНастройкиЗаполненияГрафиковРаботы"; @@ -486,46 +455,45 @@ Обработчик.Версия = "2.2.2.14"; Обработчик.Процедура = "ГрафикиРаботы.ЗаполнитьКоличествоДнейВГрафикеСНачалаГода"; + Если Метаданные.Обработки.Найти("ЗаполнениеГрафиковРаботы") <> Неопределено Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеГрафиковРаботы"); + МодульГрафикиРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + КонецПроцедуры -// Процедура создает график работы на основе производственного календаря. -// Российской Федерации по шаблону "Пятидневка". -// -Процедура СоздатьКалендарьПятидневкаРоссийскойФедерации() Экспорт +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - ПроизводственныйКалендарь = КалендарныеГрафики.ПроизводственныйКалендарьРоссийскойФедерации(); - Если ПроизводственныйКалендарь = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Не Справочники.Календари.НайтиПоРеквизиту("ПроизводственныйКалендарь", ПроизводственныйКалендарь).Пустая() Тогда - Возврат; - КонецЕсли; - - НовыйГрафикРаботы = Справочники.Календари.СоздатьЭлемент(); - НовыйГрафикРаботы.Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроизводственныйКалендарь, "Наименование"); - НовыйГрафикРаботы.ПроизводственныйКалендарь = ПроизводственныйКалендарь; - НовыйГрафикРаботы.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; - НовыйГрафикРаботы.ДатаНачала = НачалоГода(ТекущаяДатаСеанса()); - НовыйГрафикРаботы.УчитыватьПраздники = Истина; - - // Заполняем недельный цикл как пятидневку. - Для НомерДня = 1 По 7 Цикл - НовыйГрафикРаботы.ШаблонЗаполнения.Добавить().ДеньВключенВГрафик = НомерДня <= 5; - КонецЦикла; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыйГрафикРаботы, Истина, Истина); + // СовместноДляПользователейИВнешнихПользователей. + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ЧтениеГрафиковРаботы.Имя); КонецПроцедуры +// См. КалендарныеГрафикиПереопределяемый.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей. +Процедура ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + ЗапланироватьОбновлениеГрафиковРаботы(ТаблицаИзменений); + Возврат; + КонецЕсли; + + ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(ТаблицаИзменений); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Заполняет производственный календарь для тех графиков работы, // которые были созданы не по шаблону или до появления производственных календарей. // Процедура ЗаполнитьНастройкиЗаполненияГрафиковРаботы() Экспорт - ПроизводственныйКалендарьРФ = КалендарныеГрафики.ПроизводственныйКалендарьРоссийскойФедерации(); - - Если ПроизводственныйКалендарьРФ = Неопределено Тогда + ПроизводственныйКалендарь = КалендарныеГрафики.ОсновнойПроизводственныйКалендарь(); + Если ПроизводственныйКалендарь = Неопределено Тогда // Если по какой-то причине нет производственного календаря по умолчанию, // заполнение настроек бессмысленно. Возврат; @@ -549,7 +517,7 @@ ГрафикРаботыОбъект = Выборка.Ссылка.ПолучитьОбъект(); Если Не ЗначениеЗаполнено(Выборка.ПроизводственныйКалендарь) Тогда // Устанавливаем календарь РФ - ГрафикРаботыОбъект.ПроизводственныйКалендарь = ПроизводственныйКалендарьРФ; + ГрафикРаботыОбъект.ПроизводственныйКалендарь = ПроизводственныйКалендарь; КонецЕсли; ГрафикРаботыОбъект.ДатаНачала = Дата(2012, 1, 1); Если Не ЗначениеЗаполнено(Выборка.ВидКалендаря) Тогда diff --git a/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl index 7340df75b..4022b60a2 100644 --- a/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Графики работы". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Процедура сдвигает только что отредактированную строку в коллекции diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl index ea6830acd..4265bba0e 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl @@ -1,19 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Групповое изменение объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Используется для открытия формы группового изменения объектов. +// Открывает диалог группового изменения реквизитов для выбранных в списке объектов. // // Параметры: -// Список - ТаблицаФормы - элемент формы списка, содержащий ссылки на изменяемые объекты. -// -// Используется для открытия формы группового изменения объектов. -// -// Параметры: -// Список - ТаблицаФормы - элемент формы списка, содержащий ссылки на изменяемые объекты. +// СписокЭлемент - ТаблицаФормы - элемент формы со списком; +// СписокРеквизит - ДинамическийСписок - реквизит формы со списком. // Процедура ИзменитьВыделенные(СписокЭлемент, Знач СписокРеквизит = Неопределено) Экспорт @@ -33,7 +24,9 @@ ВыделенныеСтроки = СписокЭлемент.ВыделенныеСтроки; ПараметрыФормы = Новый Структура("МассивОбъектов", Новый Массив); - ПараметрыФормы.Вставить("Список", СписокРеквизит); + Если ТипЗнч(СписокРеквизит) = Тип("ДинамическийСписок") Тогда + ПараметрыФормы.Вставить("КомпоновщикНастроек", СписокРеквизит.КомпоновщикНастроек); + КонецЕсли; Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl index be97a558d..dc310b49e 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Групповое изменение объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность diff --git a/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl index b0e5e35bc..b0b355d6c 100644 --- a/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl +++ b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с контрагентами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращаются реквизиты юридического лица по данным ЕГРЮЛ (наименование, адрес, коды и т.д.). @@ -11,8 +6,51 @@ // ИНН - Строка - ИНН юридического лица, реквизиты которого надо получить. // // Возвращаемое значение: -// Структура - реквизиты юридического лица. -// Содержание структуры - см. функцию НовыеРеквизитыЮридическогоЛица. +// Структура - реквизиты юридического лица. +// * ИНН - Строка - ИНН юридического лица. +// * КПП - Строка - КПП юридического лица. +// * Наименование - Строка - представление юридического лица в учетной программе. +// * НаименованиеПолное - Строка - полное наименование юридического лица. +// * НаименованиеСокращенное - Строка - сокращенное наименование юридического лица. +// * РегистрационныйНомер - Строка - ОГРН юридического лица. +// * ПравоваяФорма - Строка, Неопределено - правовая форма юридического лица. +// * ЮридическийАдрес - Структура, Неопределено - данные об юридическом адресе. +// ** КонтактнаяИнформация - Строка - данные в формате XML. +// ** Представление - Строка - представление адреса. +// ** Комментарий - Строка - произвольный комментарий. +// * Телефон - Структура, Неопределено - данные о телефоне. +// ** КонтактнаяИнформация - Строка - данные в формате XML. +// ** Представление - Строка - представление телефона. +// ** Комментарий - Строка - произвольный комментарий. +// * Руководитель - Структура, Неопределено - данные о руководителе. +// ** Должность - Строка - должность руководителя. +// ** Фамилия - Строка - фамилия руководителя. +// ** Имя - Строка - имя руководителя. +// ** Отчество - Строка - отчество руководителя. +// ** Представление - Строка - ФИО руководителя. +// ** ИНН - Строка - ИНН руководителя. +// ** ДатаЗаписи - Дата - дата записи о руководителе. +// * РегистрацияВНалоговомОргане - Структура, Неопределено - данные о регистрации в ИФНС. +// ** Код - Строка - код налогового органа. +// ** Наименование - Строка - наименование налогового органа. +// ** ОКТМО - Строка - код ОКТМО налогового органа. +// ** ОКАТО - Строка - код ОКАТО налогового органа. +// ** ДатаРегистрации - Дата - дата постановки на учет в налоговом органе. +// * ДатаРегистрации - Дата - дата регистрации юридического лица. +// * РегистрацияВПенсионномФонде - Структура, Неопределено - данные о регистрации в ПФР. +// ** РегистрационныйНомерПФР - Строка - регистрационный номер юридического лица в ПФР. +// ** КодОрганаПФР - Строка - код органа ПФР. +// ** НаименованиеОрганаПФР - Строка - наименование органа ПФР. +// ** ДатаРегистрации - Дата - дата постановки на учет в ПФР. +// * РегистрацияВФСС - Структура, Неопределено - данные о регистрации в ФСС. +// ** РегистрационныйНомерФСС - Строка - регистрационный номер юридического лица в ФСС. +// ** КодПодчиненности - Строка - код подчиненности органа ФСС. +// ** КодОрганаФСС - Строка - код органа ФСС. +// ** НаименованиеОрганаФСС - Строка - наименование органа ФСС. +// ** ДатаРегистрации - Дата - дата постановки на учет в ФСС. +// * КодОКВЭД - Строка - основной код по классификатору ОКВЭД. +// * ЭтоОКВЭД2 - Булево - основной код приведен по классификатору редакции 2 или редакции 1. +// * ОписаниеОшибки - Строка - описание возникшей ошибки. // Функция РеквизитыЮридическогоЛицаПоИНН(Знач ИНН) Экспорт @@ -67,15 +105,49 @@ КонецФункции -// Возвращаются реквизиты индивидуального предпринимателя по данным ЕГРИП (ФИО, свидетельство о регистрации, коды и -// т.д.). +// Возвращаются реквизиты индивидуального предпринимателя по данным ЕГРИП - ФИО, свидетельство о регистрации, +// коды и т.д. // // Параметры: // ИНН - Строка - ИНН индивидуального предпринимателя, реквизиты которого надо получить. // // Возвращаемое значение: // Структура - реквизиты индивидуального предпринимателя. -// Содержание структуры - см. функцию НовыеРеквизитыПредпринимателя. +// * ИНН - Строка - ИНН предпринимателя. +// * Наименование - Строка - представление предпринимателя в учетной программе. +// * НаименованиеПолное - Строка - фамилия, имя, отчество предпринимателя. +// * НаименованиеСокращенное - Строка - фамилия, имя, отчество предпринимателя. +// * Фамилия - Строка - фамилия предпринимателя. +// * Имя - Строка - имя предпринимателя. +// * Отчество - Строка - отчество предпринимателя. +// * РегистрационныйНомер - Строка - ОГРНИП. +// * Пол - Строка, Неопределено - "1" - Мужской, "2" - Женский. +// * КодСтраныГражданства - Строка, Неопределено - код страны. +// * РегистрацияВНалоговомОргане - Структура, Неопределено - данные о регистрации в ИФНС. +// ** Код - Строка - код налогового органа. +// ** Наименование - Строка - наименование налогового органа. +// ** ОКТМО - Строка - код ОКТМО налогового органа. +// ** ОКАТО - Строка - код ОКАТО налогового органа. +// ** ДатаРегистрации - Дата - дата постановки на учет в налоговом органе. +// * ДатаРегистрации - Дата - дата регистрации предпринимателя. +// * РегистрацияВПенсионномФонде - Структура, Неопределено - данные о регистрации в ПФР. +// ** РегистрационныйНомерПФР - Строка - регистрационный номер предпринимателя в ПФР. +// ** КодОрганаПФР - Строка - код органа ПФР. +// ** НаименованиеОрганаПФР - Строка - наименование органа ПФР. +// ** ДатаРегистрации - Дата - дата постановки на учет в ПФР. +// * РегистрацияВФСС - Структура, Неопределено - данные о регистрации в ФСС. +// ** РегистрационныйНомерФСС - Строка - регистрационный номер предпринимателя в ФСС. +// ** КодПодчиненности - Строка - код подчиненности органа ФСС. +// ** КодОрганаФСС - Строка - код органа ФСС. +// ** НаименованиеОрганаФСС - Строка - наименование органа ФСС. +// ** ДатаРегистрации - Дата - дата постановки на учет в ФСС. +// * СвидетельствоОРегистрации - Структура, Неопределено - данные свидетельства. +// ** Серия - Строка - серия свидетельства. +// ** Номер - Строка - номер свидетельства. +// ** Дата - Дата - дата выдачи свидетельства. +// * КодОКВЭД - Строка - код основного вида деятельности по классификатору ОКВЭД. +// * ЭтоОКВЭД2 - Булево - код ОКВЭД приведен по классификатору редакции 2 или редакции 1. +// * ОписаниеОшибки - Строка - описание возникшей ошибки. // Функция РеквизитыПредпринимателяПоИНН(Знач ИНН) Экспорт @@ -154,13 +226,26 @@ // Адрес - Строка - одно или несколько слов из юридического адреса (от региона до улицы) для поиска в ЕГРЮЛ. // // Возвращаемое значение: -// Структура - реквизиты найденных юридических лиц. Содержание структуры: -// * РеквизитыЮрЛиц - Массив - реквизиты найденных юридических лиц. -// Элементы массива - Структура, описание см. функцию НовыеРеквизитыЮридическогоЛица. -// Заполняются только основные реквизиты (ИНН, наименование, юридический адрес, ФИО руководителя). -// Если найдено больше 20 контрагентов - возвращаются реквизиты только первых 20. -// * КоличествоНайденных - Число - общее количество найденных реквизитов (может быть больше 20). -// * ОписаниеОшибки - Строка - служебный реквизит. +// Структура - реквизиты найденных юридических лиц. Содержание структуры: +// * РеквизитыЮрЛиц - Массив - реквизиты найденных юридических лиц. +// Если найдено больше 20 контрагентов - возвращаются реквизиты только первых 20. +// Элементы массива - Структура. +// ** ИНН - Строка - ИНН юридического лица. +// ** Наименование - Строка - наименование юридического лица. +// ** ЮридическийАдрес - Структура, Неопределено - данные об юридическом адресе. +// *** КонтактнаяИнформация - Строка - данные в формате XML. +// *** Представление - Строка - представление адреса. +// *** Комментарий - Строка - произвольный комментарий. +// ** Руководитель - Структура, Неопределено - данные о руководителе. +// *** Должность - Строка - должность руководителя. +// *** Фамилия - Строка - фамилия руководителя. +// *** Имя - Строка - имя руководителя. +// *** Отчество - Строка - отчество руководителя. +// *** Представление - Строка - ФИО руководителя. +// *** ИНН - Строка - ИНН руководителя. +// *** ДатаЗаписи - Дата - дата записи о руководителе. +// ** КоличествоНайденных - Число - общее количество найденных контрагентов (может быть больше 20). +// ** ОписаниеОшибки - Строка - служебный реквизит. // Функция РеквизитыЮридическихЛицПоНаименованию(Знач Наименование, Знач КодРегиона = "", Знач Адрес = "") Экспорт @@ -224,8 +309,79 @@ // ИНН - Строка - ИНН юридического лица, информацию о связях которого надо получить. // // Возвращаемое значение: -// Структура - информация о связях юридического лица. -// Содержание структуры - см. функцию НоваяИнформацияОСвязяхЮридическогоЛица. +// Структура - информация о связях юридического лица. +// Содержит основные данные о юридическом лице - см. РеквизитыЮридическогоЛицаПоИНН. +// Также содержит данные: +// * НаименованиеСтатуса - Строка - наименование текущего статуса. +// * КодСтатуса - Строка - код текущего статуса. +// * УставныйКапитал - Число - размер уставного капитала, рублей. +// * ВидыДеятельности - ТаблицаЗначений - данные о видах деятельности. +// ** КодОКВЭД - Строка - код вида деятельности по классификатору ОКВЭД. +// ** НаименованиеОКВЭД - Строка - наименование вида деятельности по ОКВЭД, +// сервисом не поставляется, должно заполняться из переопределяемого кода. +// ** ЭтоОКВЭД2 - Булево - код приведен по классификатору редакции 2 или редакции 1. +// * Лицензии - ТаблицаЗначений - данные о полученных лицензиях. +// ** Лицензия - Строка - наименование лицензии. +// ** ОписаниеЛицензии - Строка - подробное описание лицензии. +// * ОрганизацииПоАдресу - ТаблицаЗначений - данные об организациях, зарегистрированных по тому же адресу. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// * ОрганизацииГдеРуководитель - ТаблицаЗначений - данные об организациях, где руководитель этой организации также является руководителем. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// * ОрганизацииГдеРуководительПоФИО - Булево - если Истина, поиск проводился по ФИО руководителя, иначе по ИНН. +// * ОрганизацииГдеУчредитель - ТаблицаЗначений - организации, где руководитель этой организации является учредителем. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// ** ПроцентКапитала - Число - процент в уставном капитале. +// ** СуммаКапитала - Число - сумма взноса в уставный капитал. +// * ОрганизацииГдеУчредительПоФИО - Булево - если Истина, поиск проводился по ФИО руководителя, иначе по ИНН. +// * УчрежденныеФирмы - ТаблицаЗначений - организации, где эта организация является учредителем. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// ** ПроцентКапитала - Число - процент в уставном капитале. +// ** СуммаКапитала - Число - сумма взноса в уставный капитал. +// * Учредители - ТаблицаЗначений - учредители этой организации. +// ** Учредитель - Строка - ФИО или наименование учредителя. +// ** ИНН - Строка - ИНН учредителя. +// ** ПроцентКапитала - Число - процент в уставном капитале. +// ** СуммаКапитала - Число - сумма взноса в уставный капитал. +// ** ОрганизацииГдеРуководитель - ТаблицаЗначений - данные об организациях, где этот учредитель является руководителем. +// *** НаименованиеОрганизации - Строка - наименование организации. +// *** ИНН - Строка - ИНН организации. +// *** КодСтатуса - Строка - код текущего статуса организации. +// *** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// ** ОрганизацииГдеРуководительПоФИО - Булево - если Истина, поиск проводился по ФИО учредителя, иначе по ИНН. +// ** ОрганизацииГдеУчредитель - ТаблицаЗначений - организации, где этот учредитель также является учредителем. +// *** НаименованиеОрганизации - Строка - наименование организации. +// *** ИНН - Строка - ИНН организации. +// *** КодСтатуса - Строка - код текущего статуса организации. +// *** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// *** ПроцентКапитала - Число - процент в уставном капитале. +// *** СуммаКапитала - Число - сумма взноса в уставный капитал. +// ** ОрганизацииГдеУчредительПоФИО - Булево - если Истина, поиск проводился по ФИО учредителя, иначе по ИНН. +// * Подразделения - ТаблицаЗначений - филиалы и представительства юридического лица, указанные в Уставе. +// ** ОписаниеПодразделения - Строка - наименование подразделения. +// * ИзмененияВРеестре - ТаблицаЗначений - данные об изменениях в ЕГРЮЛ по этому лицу. +// ** ДатаИзменения - Дата - дата внесения изменения. +// ** ГосударственныйОрган - Строка - орган, который внес изменение. +// ** ОписаниеИзменения - Строка - описание изменения. +// * БухгалтерскаяОтчетность - ТаблицаЗначений - данные бухгалтерской отчетности, сданной в органы Росстата. +// ** Год - Число - год, за который была сдана отчетность. +// ** КодВалютыОтчетности - Строка - в рублях, в тысячах или в миллионах рублей. +// ** ТипОтчетности - Строка - обычная отчетность, упрощенная или отчетность НКО. +// ** Показатели - ТаблицаЗначений - показатели бухгалтерской отчетности. +// *** Код - Строка - код показателя отчетности. +// *** Значение - Число - значение показателя отчетности. +// * ОжиданиеОтвета - Булево - если возвращается Истина - требуется повторный вызов метода с этими же параметрами. // Функция ИнформацияОСвязяхЮридическогоЛицаПоИНН(Знач ИНН) Экспорт @@ -310,7 +466,37 @@ // // Возвращаемое значение: // Структура - информация о связях индивидуального предпринимателя. -// Содержание структуры - см. функцию НоваяИнформацияОСвязяхПредпринимателя. +// Содержит основные данные о предпринимателе - см. РеквизитыПредпринимателяПоИНН. +// Также содержит данные: +// * КодСтатуса - Строка - код текущего статуса. +// * УставныйКапитал - Число - размер уставного капитала, рублей. +// * ВидыДеятельности - ТаблицаЗначений - данные о видах деятельности. +// ** КодОКВЭД - Строка - код вида деятельности по классификатору ОКВЭД. +// ** НаименованиеОКВЭД - Строка - наименование вида деятельности по ОКВЭД, +// сервисом не поставляется, должно заполняться из переопределяемого кода. +// ** ЭтоОКВЭД2 - Булево - код приведен по классификатору редакции 2 или редакции 1. +// * Лицензии - ТаблицаЗначений - данные о полученных лицензиях. +// ** Лицензия - Строка - наименование лицензии. +// ** ОписаниеЛицензии - Строка - подробное описание лицензии. +// * ОрганизацииГдеРуководитель - ТаблицаЗначений - данные об организациях, где этот предприниматель является руководителем. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// * ОрганизацииГдеРуководительПоФИО - Булево - если Истина, поиск проводился по ФИО предпринимателя, иначе по ИНН. +// * ОрганизацииГдеУчредитель - ТаблицаЗначений - организации, где этот предприниматель является учредителем. +// ** НаименованиеОрганизации - Строка - наименование организации. +// ** ИНН - Строка - ИНН организации. +// ** КодСтатуса - Строка - код текущего статуса организации. +// ** НаименованиеСтатуса - Строка - наименование текущего статуса организации. +// ** ПроцентКапитала - Число - процент в уставном капитале. +// ** СуммаКапитала - Число - сумма взноса в уставный капитал. +// * ОрганизацииГдеУчредительПоФИО - Булево - если Истина, поиск проводился по ФИО предпринимателя, иначе по ИНН. +// * ИзмененияВРеестре - ТаблицаЗначений - данные об изменениях в ЕГРИП по этому лицу. +// ** ДатаИзменения - Дата - дата внесения изменения. +// ** ГосударственныйОрган - Строка - орган, который внес изменение. +// ** ОписаниеИзменения - Строка - описание изменения. +// * ОжиданиеОтвета - Булево - если возвращается Истина - требуется повторный вызов метода с этими же параметрами. // Функция ИнформацияОСвязяхПредпринимателяПоИНН(Знач ИНН) Экспорт @@ -407,7 +593,25 @@ // // Возвращаемое значение: // Структура - информация о проверках. -// Содержание структуры - см. функцию НоваяИнформацияОПроверкахКонтролирующимиОрганами. +// * ИНН - Строка - ИНН юридического лица или предпринимателя. +// * Проверки - ТаблицаЗначений - информация о проверках. +// ** Идентификатор - Строка - идентификатор проверки в едином реестре проверок. +// ** ПлановаяПроверка - Булево - плановая проверка или внеплановая. +// ** ПериодПроверки - Дата - месяц, в котором проводится проверка. +// ** ДатаПроверки - Дата - дата начала проверки. +// ** КонтролирующийОрган - Строка - орган, который проводит проверку. +// ** АдресПроверки - Строка - адрес, по которому проводится проверка. +// ** ЦельПроверки - Строка - с какой целью проводится проверка. +// ** Длительность - Строка - длительность проверки. +// ** Результат - Строка - описание результата проверки. +// ** Нарушения - ТаблицаЗначений - найденные нарушения. +// *** НомерНарушения - Число - номер по порядку. +// *** Нарушение - Строка - описание нарушения. +// *** НарушенныйАкт - Строка - нарушенный нормативный акт. +// *** Предписание - Строка - выданное предписание о необходимости устранении нарушения. +// *** Исполнение - Строка - информация об устранении нарушения. +// * ОписаниеОшибки - Строка - описание возникшей ошибки. +// * ОжиданиеОтвета - Булево - если возвращается Истина - требуется повторный вызов метода с этими же параметрами. // Функция ИнформацияОПроверкахКонтролирующимиОрганамиПоИНН(Знач ИНН, Плановые, Внеплановые, Завершенные, Незавершенные) Экспорт @@ -906,6 +1110,22 @@ КонецПроцедуры +Функция ЭтоРимскоеЧисло(Знач ПроверяемаяСтрока) + + ЧастиРимскихЧисел = "IVXLCDM"; + ДлинаСтроки = СтрДлина(ПроверяемаяСтрока); + ПроверяемаяСтрока = ВРег(ПроверяемаяСтрока); + + Для НомерЗнака = 1 По ДлинаСтроки Цикл + Если СтрНайти(ЧастиРимскихЧисел, Сред(ПроверяемаяСтрока, НомерЗнака, 1)) = 0 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + Процедура ЗаменитьПолныеНаименованияАдресныхОбъектовСокращенными(Объект, АдресныеСокращения = Неопределено) Если АдресныеСокращения = Неопределено Тогда @@ -943,7 +1163,7 @@ НовыеЗначения.Колонки.Добавить("ТипЭлемента"); НовыеЗначения.Колонки.Добавить("ТипНомера"); ТипыАдресныхЭлементов = Новый СписокЗначений; - Для каждого ТипОбъектовАдресации Из УправлениеКонтактнойИнформациейКлиентСервер.ТипыОбъектовАдресацииАдресаРФ() Цикл + Для каждого ТипОбъектовАдресации Из РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ() Цикл ТипыАдресныхЭлементов.Добавить(ВРег(ТипОбъектовАдресации.Ключ), ТипОбъектовАдресации.Код); КонецЦикла; @@ -1109,6 +1329,7 @@ Если ОбъектXDTO.СвПодразд <> Неопределено Тогда ПространствоИменКИ = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + ПространствоИменАдресов = РаботаСАдресами.ПространствоИмен(); Для каждого СтрокаПодразделения Из ОбъектXDTO.СвПодразд Цикл @@ -1116,7 +1337,7 @@ Если СтрокаПодразделения.АдрМНРФ <> Неопределено И СтрокаПодразделения.АдрМНРФ.Состав <> Неопределено Тогда - АдресРФ_КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "АдресРФ")); + АдресРФ_КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменАдресов, "АдресРФ")); ЗаполнитьОбъектXDTOКонтактнойИнформации(ФабрикаXDTO, АдресРФ_КИ, СтрокаПодразделения.АдрМНРФ.Состав); КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "КонтактнаяИнформация")); КИ.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "Адрес")); @@ -1556,11 +1777,12 @@ Процедура ЗаполнитьЮридическийАдрес(ОбъектXDTO, Реквизиты, Фабрика) ПространствоИменКИ = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + ПространствоИменАдресов = РаботаСАдресами.ПространствоИмен(); Если ОбъектXDTO.СвАдрес <> Неопределено И ОбъектXDTO.СвАдрес.Адрес <> Неопределено Тогда - АдресРФ_КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "АдресРФ")); + АдресРФ_КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменАдресов, "АдресРФ")); ЗаменитьПолныеНаименованияАдресныхОбъектовСокращенными(ОбъектXDTO.СвАдрес.Адрес.Состав); ПроверитьДополнительныеАдресныеЭлементы(ОбъектXDTO.СвАдрес.Адрес.Состав, Фабрика); @@ -1858,9 +2080,7 @@ Функция ПроксиСервиса(ОписаниеОшибки) Прокси = Неопределено; - УстановитьПривилегированныйРежим(Истина); ПараметрыАутентификации = ПараметрыАутентификацииВСервисе(); - УстановитьПривилегированныйРежим(Ложь); Если ПараметрыАутентификации = Неопределено Тогда @@ -1898,7 +2118,7 @@ Функция ПараметрыАутентификацииВСервисе() - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат Новый Структура("Логин,Пароль", "fresh", "fresh"); ИначеЕсли ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда @@ -2062,20 +2282,4 @@ КонецФункции -Функция ЭтоРимскоеЧисло(Знач ПроверяемаяСтрока) - - ЧастиРимскихЧисел = "IVXLCDM"; - ДлинаСтроки = СтрДлина(ПроверяемаяСтрока); - ПроверяемаяСтрока = ВРег(ПроверяемаяСтрока); - - Для НомерЗнака = 1 По ДлинаСтроки Цикл - Если СтрНайти(ЧастиРимскихЧисел, Сред(ПроверяемаяСтрока, НомерЗнака, 1)) = 0 Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl index f93206ae3..e18d976c4 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl @@ -1,100 +1,131 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Даты запрета изменения". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Проверяет наличие запрета изменения данных при редактировании или загрузке. -// Для работы функции требуется настройка процедуры ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения -// модуля ДатыЗапретаИзмененияПереопределяемый. -// -// Если Данные - полное имя объекта метаданных, тогда данные для проверки будут получены -// из базы данных через ИдентификаторДанных. -// Если Данные - объект, тогда данные для проверки будут получены из экземпляра объекта или -// набора записей. -// Если Данные - объект и задан ИдентификаторДанных, тогда будут выполнены проверки старой и -// новой версии данных, причем данные будут получены и из объекта/набора записей, -// и из базы данных через ИдентификаторДанных. +// Проверяет, запрещено ли изменение данных при интерактивном редактировании пользователем +// или при программной загрузке данных из узла плана обмена УзелПроверкиЗапретаЗагрузки. +// Для корректной работы функции требуется предварительная настройка +// процедуры ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения модуля ДатыЗапретаИзмененияПереопределяемый. // // Параметры: -// Данные - Строка - полное имя объекта метаданных. Проверка только старой версии данных. -// Требуется указать следующий параметр ИдентификаторДанных. -// - СправочникОбъект.<Имя>, -// ДокументОбъект.<Имя>, -// ПланВидовХарактеристикОбъект.<Имя>, -// ПланСчетовОбъект.<Имя>, -// ПланВидовРасчетаОбъект.<Имя>, -// БизнесПроцессОбъект.<Имя>, -// ЗадачаОбъект.<Имя>, -// ПланОбменаОбъект - объект данных. -// - РегистрСведенийНаборЗаписей.<Имя>, -// РегистрНакопленияНаборЗаписей.<Имя>, -// РегистрБухгалтерииНаборЗаписей.<Имя>, -// РегистрРасчетаНаборЗаписей.<Имя> - набор записей. +// ДанныеИлиПолноеИмя - СправочникОбъект, +// ДокументОбъект, +// ПланВидовХарактеристикОбъект, +// ПланСчетовОбъект, +// ПланВидовРасчетаОбъект, +// БизнесПроцессОбъект, +// ЗадачаОбъект, +// ПланОбменаОбъект, +// РегистрСведенийНаборЗаписей, +// РегистрНакопленияНаборЗаписей, +// РегистрБухгалтерииНаборЗаписей, +// РегистрРасчетаНаборЗаписей - проверяемый элемент данных или набор записей. +// - Строка - полное имя объекта метаданных, данные которого следует проверить в базе данных. +// Например: "Документ.ПриходнаяНакладная". +// В этом случае, следует указать в параметре ИдентификаторДанных, +// какие именно данные требуется прочитать из базы и проверить. // -// ИдентификаторДанных - Неопределено - проверить только новую версию данных. -// - СправочникСсылка.<Имя>, -// ДокументСсылка.<Имя>, -// ПланВидовХарактеристикСсылка.<Имя>, -// ПланСчетовСсылка.<Имя>, -// ПланВидовРасчетаСсылка.<Имя>, -// БизнесПроцессСсылка.<Имя>, -// ЗадачаСсылка.<Имя>, -// ПланОбменаСсылка.<Имя> - ссылка на объект данных. -// - РегистрСведенийНаборЗаписей.<Имя>.Отбор, -// РегистрНакопленияНаборЗаписей.<Имя>.Отбор, -// РегистрБухгалтерииНаборЗаписей.<Имя>.Отбор, -// РегистрРасчетаНаборЗаписей.<Имя>.Отбор - отбор набора записей. +// ИдентификаторДанных - СправочникСсылка, +// ДокументСсылка, +// ПланВидовХарактеристикСсылка, +// ПланСчетовСсылка, +// ПланВидовРасчетаСсылка, +// БизнесПроцессСсылка, +// ЗадачаСсылка, +// ПланОбменаСсылка, +// Отбор - ссылка на элемент данных или отбор набора записей, который нужно проверить. +// При этом значение для проверки будет получено из базы данных. +// - Неопределено - если не требуется получать значение для проверки из базы данных, +// а нужно проверить только данные самого объекта в ДанныеИлиПолноеИмя. // -// УзелПроверкиЗапретаЗагрузки - Неопределено - выполнить проверку изменения данных. -// - ПланыОбменаСсылка.<Имя плана обмена> - выполнить проверку -// загрузки данных для указанного узла. +// ОписаниеОшибки - Строка, Null - возвращаемый параметр: текстовое описание запрета изменения или загрузки. +// Если описание не требуется, то параметр указывать не нужно (Null). // -// ОписаниеОшибки - Строка - (возвращаемое значение) описание запрета изменения или загрузки. -// - Null - в этом случае текст сообщения об ошибке не будет подготовлен, -// что ускоряет выполнение проверки, когда запрет найден. +// УзелПроверкиЗапретаЗагрузки - Неопределено, ПланыОбменаСсылка - если Неопределено, то проверить запрет +// изменения данных; иначе - загрузку данных из указанного узла плана обмена. // // Возвращаемое значение: -// Булево - если Истина, изменение запрещено. +// Булево - Истина, если изменение данных запрещено. // -Функция ИзменениеЗапрещено(Данные, - ИдентификаторДанных = Неопределено, - ОписаниеОшибки = Null, - УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт +// Варианты вызова: +// ИзменениеЗапрещено(СправочникОбъект...) - проверить данные в переданном объекте (наборе записей). +// ИзменениеЗапрещено(Строка, СправочникСсылка...) - проверить данные, полученные из базы данных +// по полному имени объекта метаданных и ссылке (отбору набора записей). +// ИзменениеЗапрещено(СправочникОбъект..., СправочникСсылка...) - проверить одновременно +// данные в переданном объекте и данные в базе (т.е. "до" и "после" записи в базу, если проверка выполняется +// перед записью объекта). +// +Функция ИзменениеЗапрещено(ДанныеИлиПолноеИмя, ИдентификаторДанных = Неопределено, + ОписаниеОшибки = Null, УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт - Возврат ДатыЗапретаИзмененияСлужебный.ИзменениеЗапрещено(Данные, - ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки); + ПроверкаЗапретаИзменения = УзелПроверкиЗапретаЗагрузки = Неопределено; + + Если ТипЗнч(ДанныеИлиПолноеИмя) = Тип("Строка") Тогда + Если ТипЗнч(ИдентификаторДанных) = Тип("Отбор") Тогда + МенеджерДанных = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ДанныеИлиПолноеИмя); + Источник = МенеджерДанных.СоздатьНаборЗаписей(); + Для Каждого ЭлементОтбора Из ИдентификаторДанных Цикл + Источник.Отбор[ЭлементОтбора.Имя].Установить(ЭлементОтбора.Значение, ЭлементОтбора.Использование); + КонецЦикла; + Источник.Прочитать(); + ИначеЕсли Не ЗначениеЗаполнено(ИдентификаторДанных) Тогда + Возврат Ложь; + Иначе + Источник = ИдентификаторДанных.ПолучитьОбъект(); + КонецЕсли; + + Если ДатыЗапретаИзмененияСлужебный.ПропуститьПроверкуДатЗапрета(Источник, + ПроверкаЗапретаИзменения, УзелПроверкиЗапретаЗагрузки, "") Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ДатыЗапретаИзмененияСлужебный.ИзменениеЗапрещено(ДанныеИлиПолноеИмя, + ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки); + КонецЕсли; + + ВерсияОбъекта = ""; + Если ДатыЗапретаИзмененияСлужебный.ПропуститьПроверкуДатЗапрета(ДанныеИлиПолноеИмя, + ПроверкаЗапретаИзменения, УзелПроверкиЗапретаЗагрузки, ВерсияОбъекта) Тогда + Возврат Ложь; + КонецЕсли; + + Источник = ДанныеИлиПолноеИмя; + Идентификатор = ИдентификаторДанных; + + Если ВерсияОбъекта = "СтараяВерсия" Тогда + Источник = Метаданные.НайтиПоТипу(ДанныеИлиПолноеИмя).ПолноеИмя(); + + ИначеЕсли ВерсияОбъекта = "НоваяВерсия" Тогда + Идентификатор = Неопределено; + КонецЕсли; + + Возврат ДатыЗапретаИзмененияСлужебный.ИзменениеЗапрещено(Источник, + Идентификатор, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки); КонецФункции -// Проверяет наличие запрета загрузки элемента данных. -// Выполняется проверка старой и новой версии данных. Для работы требуется настройка +// Проверяет наличие запрета загрузки элемента данных или набор записей Данные. +// При этом выполняется проверка старой и новой версии данных. +// Для корректной работы требуется предварительная настройка // процедуры ДанныеДляПроверкиЗапретаИзменения модуля ДатыЗапретаИзмененияПереопределяемый. // // Параметры: -// Данные - СправочникОбъект.<Имя>, -// ДокументОбъект.<Имя>, -// ПланВидовХарактеристикОбъект.<Имя>, -// ПланСчетовОбъект.<Имя>, -// ПланВидовРасчетаОбъект.<Имя>, -// БизнесПроцессОбъект.<Имя>, -// ЗадачаОбъект.<Имя>, -// ПланОбменаОбъект.<Имя>, -// УдалениеОбъекта - объект данных. -// РегистрСведенийНаборЗаписей.<Имя>, -// РегистрНакопленияНаборЗаписей.<Имя>, -// РегистрБухгалтерииНаборЗаписей.<Имя>, -// РегистрРасчетаНаборЗаписей.<Имя> - набор записей. +// Данные - СправочникОбъект, +// ДокументОбъект, +// ПланВидовХарактеристикОбъект, +// ПланСчетовОбъект, +// ПланВидовРасчетаОбъект, +// БизнесПроцессОбъект, +// ЗадачаОбъект, +// ПланОбменаОбъект, +// УдалениеОбъекта, +// РегистрСведенийНаборЗаписей, +// РегистрНакопленияНаборЗаписей, +// РегистрБухгалтерииНаборЗаписей, +// РегистрРасчетаНаборЗаписей - элемент данных или набор записей. // -// УзелПроверкиЗапретаЗагрузки - ПланыОбменаСсылка.<Имя плана обмена> - узел, -// для которого будет выполнена проверка. -// -// Отказ - Булево - устанавливается Истина, если загрузка запрещена. -// -// ОписаниеОшибки - Строка - (возвращаемое значение) - описание запрета загрузки. -// - Null - в этом случае текст сообщения об ошибке не будет подготовлен, -// что ускоряет выполнение проверки, когда запрет найден. +// УзелПроверкиЗапретаЗагрузки - ПланОбменаСсылка - узел, для которого требуется проверка. +// Отказ - Булево - возвращаемый параметр: Истина, если загрузка запрещена. +// ОписаниеОшибки - Строка, Null - возвращаемый параметр: текстовое описание причины запрета загрузки. +// Если описание не требуется, то параметр указывать не нужно (Null). // Процедура ПроверитьДатыЗапретаЗагрузкиДанных(Данные, УзелПроверкиЗапретаЗагрузки, Отказ, ОписаниеОшибки = Null) Экспорт @@ -125,23 +156,26 @@ КонецПроцедуры // Обработчик события формы ПриЧтенииНаСервере, который встраивается в формы элементов справочников, -// документов, записей регистров и др., чтобы заблокировать форму при наличии запрета изменения. +// документов, записей регистров и др., чтобы заблокировать форму, если изменение запрещено. // // Параметры: -// Форма - УправляемаяФорма - форма объекта данных или записи регистра. +// Форма - УправляемаяФорма - форма элемента объекта или записи регистра. // -// ТекущийОбъект - СправочникОбъект.<Имя>, -// ДокументОбъект.<Имя>, -// ПланВидовХарактеристикОбъект.<Имя>, -// ПланСчетовОбъект.<Имя>, -// ПланВидовРасчетаОбъект.<Имя>, -// БизнесПроцессОбъект.<Имя>, -// ЗадачаОбъект.<Имя>, -// ПланОбменаОбъект.<Имя> - ссылка на объект данных. -// РегистрСведенийМенеджерЗаписи.<Имя>, -// РегистрНакопленияМенеджерЗаписи.<Имя>, -// РегистрБухгалтерииМенеджерЗаписи.<Имя>, -// РегистрРасчетаМенеджерЗаписи.<Имя> - менеджер записи. +// ТекущийОбъект - СправочникОбъект, +// ДокументОбъект, +// ПланВидовХарактеристикОбъект, +// ПланСчетовОбъект, +// ПланВидовРасчетаОбъект, +// БизнесПроцессОбъект, +// ЗадачаОбъект, +// ПланОбменаОбъект +// РегистрСведенийМенеджерЗаписи, +// РегистрНакопленияМенеджерЗаписи, +// РегистрБухгалтерииМенеджерЗаписи, +// РегистрРасчетаМенеджерЗаписи - менеджер записи. +// +// Возвращаемое значение: +// Булево - Истина, если проверка запрета изменения была пропущена программно. // Функция ОбъектПриЧтенииНаСервере(Форма, ТекущийОбъект) Экспорт @@ -179,7 +213,7 @@ // Данные - ТаблицаЗначений - передается в процедуру ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения. // Таблица - Строка - полное имя объекта метаданных, например, "Документ.ПриходнаяНакладная". // ПолеДаты - Строка - имя реквизита объекта или табличной части, например "Дата", "Товары.ДатаОтгрузки". -// Раздел - Строка - имя предопределенного элемента "ПланВидовХарактеристикСсылка.РазделыДатЗапрета". +// Раздел - Строка - имя предопределенного элемента ПланВидовХарактеристикСсылка.РазделыДатЗапрета. // ПолеОбъекта - Строка - имя реквизита объекта или реквизита табличной части, например "Организация", "Товары.Склад". // Процедура ДобавитьСтроку(Данные, Таблица, ПолеДаты, Раздел = "", ПолеОбъекта = "") Экспорт @@ -192,8 +226,8 @@ КонецПроцедуры -// Выполняет поиск дат запрета по проверяемым данным -// для авторизованного пользователя и/или узла плана обмена. +// Найти даты запрета по проверяемым данным +// для указанного пользователя и/или узла плана обмена. // // Параметры: // ДанныеДляПроверки - ТаблицаЗначений - возвращается функцией ШаблонДанныхДляПроверки @@ -214,10 +248,8 @@ // - Строка - подготовленное представление данных, // которое будет использовано в сообщении о запрете. // -// ОписаниеОшибки - Строка - (возвращаемое значение) описание запрета изменения или загрузки. -// Не заполняется, если параметр ОписаниеДанных не указан. -// - Null - в этом случае текст сообщения об ошибке не будет подготовлен, -// что ускоряет выполнение проверки, когда запрет найден. +// ОписаниеОшибки - Строка,Null - возвращаемый параметр: текстовое описание причины запрета загрузки. +// Если описание не требуется, то параметр указывать не нужно (Null). // // УзелПроверкиЗапретаЗагрузки - Неопределено - выполнить проверку изменения данных. // - ПланыОбменаСсылка.<Имя плана обмена> - выполнить проверку @@ -251,8 +283,24 @@ СвойстваВстраивания = ДатыЗапретаИзмененияСлужебный.СвойстваРазделов(); ПустойРаздел = ДатыЗапретаИзмененияСлужебныйПовтИсп.ПустойРаздел(); + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в функции НайденЗапретИзмененияДанных общего модуля ДатыЗапретаИзменения.'") + + Символы.ПС + + Символы.ПС; + // Приведение данных в соответствие варианту встраивания. - Для каждого Строка Из ДанныеДляПроверки Цикл + Для Каждого Строка Из ДанныеДляПроверки Цикл + + Если Строка.Раздел = Неопределено Тогда + Строка.Раздел = ПустойРаздел; + КонецЕсли; + + СвойстваРаздела = ДействующиеДаты.СвойстваРазделов.Разделы.Получить(Строка.Раздел); + Если СвойстваРаздела = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В параметре ДанныеДляПроверки указан несуществующий раздел ""%1"".'"), + Строка.Раздел); + КонецЕсли; Если СвойстваВстраивания.БезРазделовИОбъектов Тогда Строка.Раздел = ПустойРаздел; @@ -260,6 +308,8 @@ Иначе Если ЗначениеЗаполнено(СвойстваВстраивания.ЕдинственныйРаздел) Тогда Строка.Раздел = СвойстваВстраивания.ЕдинственныйРаздел; + Иначе + Строка.Раздел = СвойстваРаздела.Ссылка; КонецЕсли; Если СвойстваВстраивания.ВсеРазделыБезОбъектов @@ -413,17 +463,37 @@ // общего модуля ДатыЗапретаИзменения. // // Возвращаемое значение: -// ТаблицаЗначений - с колонками: -// * Раздел - ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения - раздел для поиска дат запрета. -// * Объект - Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.Тип - объект для поиска дат запрета. -// * Дата - Дата - дата без времени, которую нужно проверить на принадлежность установленным запретам. +// ТаблицаЗначений - таблица с колонками: +// * Дата - Дата - дата без времени, которую нужно проверить на принадлежность +// установленным запретам. +// +// * Раздел - Строка - одно из имен разделов, указанных +// в процедуре ПриЗаполненииРазделовДатЗапретаИзменения +// общего модуля ДатыЗапретаИзмененияПереопределяемый. +// +// * Объект - Ссылка - один из типов объектов, указанных для раздела +// в процедуре ПриЗаполненииРазделовДатЗапретаИзменения +// общего модуля ДатыЗапретаИзмененияПереопределяемый. // Функция ШаблонДанныхДляПроверки() Экспорт - Возврат ДатыЗапретаИзмененияСлужебныйПовтИсп.ШаблонДанныхДляПроверки().Скопировать(); + Образец = ДатыЗапретаИзмененияСлужебныйПовтИсп.ШаблонДанныхДляПроверки(); + + Возврат Образец.Скопировать(); КонецФункции +// Обновляет план видов характеристик РазделыДатЗапретаИзменения по описанию в метаданных. +// Предназначен для вызова из обработчика обновления общих данных (модель сервиса) +// при изменении состава разделов дат запрета изменения или свойств разделов в процедуре +// ПриЗаполненииРазделовДатЗапретаИзменения общего модуля ДатыЗапретаИзмененияПереопределяемый. +// +Процедура ОбновитьРазделыДатЗапретаИзменения() Экспорт + + ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl index 6d3f9a1e0..59109ab09 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Даты запрета изменения". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Позволяет изменить работу интерфейса при встраивании. @@ -18,10 +13,38 @@ КонецПроцедуры -// Содержит описание таблиц и полей объектов для проверки запретов изменения данных. -// Вызывается из процедуры ИзменениеЗапрещено общего модуля ДатыЗапретаИзменения, -// используемой в подписке на событие ПередЗаписью объекта для проверки наличия -// запретов и отказа от изменений запрещенного объекта. +// Заполняет разделы дат запрета изменения, используемые при настройке дат запрета. +// Если не указать ни одного раздела, тогда будет доступна только настройка общей даты запрета. +// +// Параметры: +// Разделы - ТаблицаЗначений - с колонками: +// * Имя - Строка - имя используемое в описании источников данных в +// процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения. +// +// * Идентификатор - УникальныйИдентификатор - идентификатор ссылки элемента плана видов характеристик. +// Чтобы получить идентификатор нужно в режиме 1С:Предприятия выполнить метод платформы: +// "ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПолучитьСсылку().УникальныйИдентификатор()". +// Не следует указывать идентификаторы, полученные любым другим способом, +// так как это может нарушить их уникальность. +// +// * Представление - Строка - представляет раздел в форме настройки дат запрета. +// +// * ТипыОбъектов - Массив - типы ссылок объектов в разрезе которых можно настроить даты запрета, +// например, Тип("СправочникСсылка.Организации"), если не указано ни одного типа, +// то даты запрета будут настраиваться только с точностью до раздела. +// +Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт + + + +КонецПроцедуры + +// Позволяет задать таблицы и поля объектов для проверки запрета изменения данных. +// Для добавления нового источника в ИсточникиДанных см. ДатыЗапретаИзменения.ДобавитьСтроку. +// +// Вызывается из процедуры ИзменениеЗапрещено общего модуля ДатыЗапретаИзменения, +// используемой в подписке на событие ПередЗаписью объекта для проверки наличия +// запретов и отказа от изменений запрещенного объекта. // // Параметры: // ИсточникиДанных - ТаблицаЗначений - с колонками: @@ -29,21 +52,22 @@ // например, Метаданные.Документы.ПриходнаяНакладная.ПолноеИмя(). // * ПолеДаты - Строка - имя реквизита объекта или табличной части, // например "Дата", "Товары.ДатаОтгрузки". -// * Раздел - Строка - имя предопределенного элемента -// "ПланВидовХарактеристикСсылка.РазделыДатЗапрета". +// * Раздел - Строка - имя раздела дат запрета, указанного в +// процедуре ПриЗаполненииРазделовДатЗапретаИзменения (см. выше). // * ПолеОбъекта - Строка - имя реквизита объекта или реквизита табличной части, // например "Организация", "Товары.Склад". // -// Для добавления строки имеется процедура ДобавитьСтроку в общем модуле ДатыЗапретаИзменения. -// Процедура ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт КонецПроцедуры -// Позволяет переопределить выполнение проверок запретов по произвольному условию. +// Позволяет переопределить выполнение проверки запрета изменения произвольным образом. // +// Если проверка выполняется в процессе записи документа, то в свойстве ДополнительныеСвойства документа Объект +// имеется свойство РежимЗаписи. +// // Параметры: // Объект - СправочникОбъект, // ДокументОбъект, @@ -52,25 +76,20 @@ // ПланВидовРасчетаОбъект, // БизнесПроцессОбъект, // ЗадачаОбъект, -// ПланОбменаОбъект - объект данных (ПередЗаписью или ПриЧтенииНаСервере). -// - РегистрСведенийНаборЗаписей, +// ПланОбменаОбъект, +// РегистрСведенийНаборЗаписей, // РегистрНакопленияНаборЗаписей, // РегистрБухгалтерииНаборЗаписей, -// РегистрРасчетаНаборЗаписей - набор записей (ПередЗаписью или ПриЧтенииНаСервере). +// РегистрРасчетаНаборЗаписей - проверяемый элемент данных или набор записей +// (который передается из обработчиков ПередЗаписью и ПриЧтенииНаСервере). // -// Для документов в свойство ДополнительныеСвойства вставляется свойство РежимЗаписи, -// если вызов делается в процессе записи документа. -// -// ПроверкаЗапретаИзменения - Булево - когда Истина, тогда проверка изменения выполняется. -// Если установить Ложь, тогда проверка запрета изменения будет пропущена. -// -// УзелПроверкиЗапретаЗагрузки - Неопределено - проверка запрета загрузки не выполняется. -// - ПланыОбменаСсылка - проверка запрета загрузки выполняется. Если -// установить Неопределено, проверка запрета загрузки будет пропущена. -// -// ВерсияОбъекта - Строка - начальное значение "". Проверяются обе версии объекта. -// Если установить "СтараяВерсия" или "НоваяВерсия", тогда будет -// выполнена проверка только старой или только новой версии объекта. +// ПроверкаЗапретаИзменения - Булево - установить в Ложь, чтобы пропустить проверку запрета изменения данных. +// УзелПроверкиЗапретаЗагрузки - ПланыОбменаСсылка, Неопределено - установить в Неопределено, чтобы +// пропустить проверку запрета загрузки данных. +// ВерсияОбъекта - Строка - установить "СтараяВерсия" или "НоваяВерсия", чтобы +// выполнить проверку только старой (в базе данных) +// или только новой версии объекта (в параметре Объект). +// По умолчанию содержит значение "" - проверяются обе версии объекта сразу. // Процедура ПередПроверкойЗапретаИзменения(Объект, ПроверкаЗапретаИзменения, diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl index 167de35b7..9a0b4a49f 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl @@ -1,31 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Даты запрета изменения". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ДатыЗапретаИзмененияСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "ДатыЗапретаИзмененияСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( - "ДатыЗапретаИзмененияСлужебный"); - КонецЕсли; - -КонецПроцедуры - // Возвращает возможность проверки запрета изменения данных. Функция ЗапретИзмененияПроверяется(ОбъектМетаданных) Экспорт @@ -40,9 +14,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов из других подсистем. - // Отключает или включает проверку запрета изменения на текущий сеанс. // Процедура ПропуститьПроверкуЗапретаИзменения(Пропустить = Истина) Экспорт @@ -68,8 +39,10 @@ КонецПроцедуры -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("ПропуститьПроверкуЗапретаИзменения", @@ -83,43 +56,19 @@ КонецПроцедуры -// Обработчики событий подсистемы Пользователи. - -// Обновляет группировки пользователей после обновления составов групп пользователей -// используемых для выполнения проверок разрешенных пользователей. -// -// Параметры: -// УчастникиИзменений - Массив значений типов: -// - СправочникСсылка.Пользователи. -// - СправочникСсылка.ВнешниеПользователи. -// Пользователи которые участвовали в изменении состава групп. -// -// ИзмененныеГруппы - Массив значений типов: -// - СправочникСсылка.ГруппыПользователей. -// - СправочникСсылка.ГруппыВнешнихПользователей. -// Группы, состав которых был изменен. -// -Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт - - ОбновитьВерсиюДатЗапретаИзменения(); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Обработчик = Обработчики.Добавить(); + Обработчик.ОбщиеДанные = Истина; + Обработчик.Версия = "*"; + Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения"; + Обработчик.РежимВыполнения = "Оперативно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.УстановитьНачальнуюДатуЗапретаИзменения"; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.1.1.12"; Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ЗаменитьНеопределеноНаЗначениеПеречисления"; @@ -137,36 +86,66 @@ Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.УстановитьОтносительныеДатыЗапрета"; Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.УстановитьНачальнуюДатуЗапретаИзменения"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ОчиститьПредопределенныеЭлементыРазделовДатЗапрета"; + Обработчик.РежимВыполнения = "Оперативно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ЗаменитьРазделыДатЗапретаНаНовые"; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт + + Если НаборЗаписейТолькоСДатамиЗапретаЗагрузки(ЭлементДанных) Тогда + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. +Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + + Если НаборЗаписейТолькоСДатамиЗапретаЗагрузки(ЭлементДанных) Тогда + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. +Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + // Стандартная обработка не переопределяется. + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; + + Если НаборЗаписейТолькоСДатамиЗапретаЗагрузки(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. +Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + // Стандартная обработка не переопределяется. + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; + + Если НаборЗаписейТолькоСДатамиЗапретаЗагрузки(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + КонецЕсли; КонецПроцедуры // Обработчики событий подсистемы ВариантыОтчетов. -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); @@ -175,32 +154,35 @@ КонецПроцедуры +// Обработчики событий подсистемы Пользователи. + +// См. ИнтеграцияСтандартныхПодсистем.ПослеОбновленияСоставовГруппПользователей. +Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт + + ОбновитьВерсиюДатЗапретаИзменения(); + +КонецПроцедуры + // Обработчики событий библиотеки ТехнологияСервиса. -// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок -// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок -// гарантируется с помощью других механизмов. -// -// Параметры: -// Типы - Массив(ОбъектМетаданных). -// -Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - // В разделенных данных используются ссылки только на предопределенные элементы - // плана видов характеристик РазделыДатЗапретаИзменения. + // В разделенных данных используются только ссылки с поставляемыми уникальными идентификаторами, + // указанными в процедуре ПриЗаполненииРазделовДатЗапретаИзменения + // общего модуля ДатыЗапретаИзмененияПереопределяемый. Типы.Добавить(Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения); КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Основные процедуры и функции. -// Устанавливает параметры сеанса подсистемы обмена данными. -// -// Параметры: -// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить. -// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт Если ИмяПараметра = "ДействующиеДатыЗапретаИзменения" Тогда @@ -416,7 +398,7 @@ // Выполняется при условии: // НЕ ИсточникРегистр И Источник.ЭтоНовый() // ИЛИ ИсточникРегистр И НЕ Замещение - // ИЛИ НЕ ИсточникРегистр И Удаление. + // ИЛИ НЕ ИсточникРегистр И Удаление Если ВерсияОбъекта <> "СтараяВерсия" И ИзменениеЗапрещено( Источник, @@ -489,7 +471,7 @@ КонецФункции -// См. одноименную функцию в общем модуле ДатыЗапретаИзменения. +// См. ДатыЗапретаИзменения.ИзменениеЗапрещено. Функция ИзменениеЗапрещено(Данные, ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -561,9 +543,16 @@ Если ДействующиеДаты.НачалоДня <> НачалоДня(ТекущаяДатаСеанса()) Или ДействующиеДаты.Версия <> Константы.ВерсияДатЗапретаИзменения.Получить() Тогда + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + ОчищаемыеПараметры = Новый Массив; ОчищаемыеПараметры.Добавить("ДействующиеДатыЗапретаИзменения"); ПараметрыСеанса.Очистить(ОчищаемыеПараметры); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + ДействующиеДаты = ПараметрыСеанса.ДействующиеДатыЗапретаИзменения; КонецЕсли; ПоследняяПроверка.Дата = ТекущаяДатаСеанса(); @@ -600,6 +589,139 @@ КонецФункции +Функция ЭтоАдресатЗапретаИзменения(АдресатЗапрета) Экспорт + + Возврат ТипЗнч(АдресатЗапрета) = Тип("СправочникСсылка.Пользователи") + Или ТипЗнч(АдресатЗапрета) = Тип("СправочникСсылка.ГруппыПользователей") + Или ТипЗнч(АдресатЗапрета) = Тип("СправочникСсылка.ВнешниеПользователи") + Или ТипЗнч(АдресатЗапрета) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") + Или АдресатЗапрета = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей; + +КонецФункции + +Функция РассчитанныеДатыЗапретаИзменения() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ДатыЗапретаИзменения.Раздел КАК Раздел, + | ДатыЗапретаИзменения.Объект КАК Объект, + | ДатыЗапретаИзменения.Пользователь КАК Пользователь, + | ДатыЗапретаИзменения.ДатаЗапрета КАК ДатаЗапрета, + | ДатыЗапретаИзменения.ОписаниеДатыЗапрета КАК ОписаниеДатыЗапрета, + | ДатыЗапретаИзменения.Комментарий КАК Комментарий + |ИЗ + | РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения"; + Таблица = Запрос.Выполнить().Выгрузить(); + + НачалоДня = НачалоДня(ТекущаяДатаСеанса()); + Для Каждого Строка Из Таблица Цикл + Строка.ДатаЗапрета = ДатаЗапретаПоОписанию(Строка.ОписаниеДатыЗапрета, + Строка.ДатаЗапрета , НачалоДня); + КонецЦикла; + + Возврат Таблица; + +КонецФункции + +// Обновляет план видов характеристик РазделыДатЗапретаИзменения по описанию в метаданных. +Процедура ОбновитьРазделыДатЗапретаИзменения() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + СвойстваРазделов = СвойстваРазделов(); + ПустойРаздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка(); + + МассивСсылокРазделов = Новый Массив; + + Для Каждого ОписаниеРаздела Из СвойстваРазделов.Разделы Цикл + Если ТипЗнч(ОписаниеРаздела.Ключ) = Тип("Строка") + Или Не ЗначениеЗаполнено(ОписаниеРаздела.Ключ) Тогда + Продолжить; + КонецЕсли; + СвойстваРаздела = ОписаниеРаздела.Значение; + МассивСсылокРазделов.Добавить(СвойстваРаздела.Ссылка); + + Объект = СвойстваРаздела.Ссылка.ПолучитьОбъект(); + Записать = Ложь; + + Если Объект = Неопределено Тогда + Объект = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.СоздатьЭлемент(); + Объект.УстановитьСсылкуНового(СвойстваРаздела.Ссылка); + Записать = Истина; + КонецЕсли; + + Если Объект.Наименование <> СвойстваРаздела.Представление Тогда + Объект.Наименование = СвойстваРаздела.Представление; + Записать = Истина; + КонецЕсли; + + Если Объект.ПометкаУдаления Тогда + Объект.ПометкаУдаления = Ложь; + Записать = Истина; + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.УдалитьНоваяСсылка) Тогда + Объект.УдалитьНоваяСсылка = ПустойРаздел; + Записать = Истина; + КонецЕсли; + + ТипыОбъектов = Новый Массив; + Если СвойстваРаздела.ТипыОбъектов.Количество() = 0 Тогда + ТипыОбъектов.Добавить(ТипЗнч(ПустойРаздел)); + Иначе + Для Каждого СвойстваТипа Из СвойстваРаздела.ТипыОбъектов Цикл + ТипыОбъектов.Добавить(ТипЗнч(СвойстваТипа.ПустаяСсылка)); + КонецЦикла; + КонецЕсли; + Если Объект.ТипЗначения.Типы().Количество() <> ТипыОбъектов.Количество() Тогда + Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); + Записать = Истина; + Иначе + Для Каждого Тип Из ТипыОбъектов Цикл + Если Не Объект.ТипЗначения.СодержитТип(Тип) Тогда + Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); + Записать = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Записать Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект, Ложь); + КонецЕсли; + КонецЦикла; + + // Пометка на удаление устаревших непредопределенных разделов. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Разделы", МассивСсылокРазделов); + Запрос.Текст = + "ВЫБРАТЬ + | Разделы.Ссылка КАК Ссылка, + | Разделы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + | Разделы.УдалитьНоваяСсылка КАК УдалитьНоваяСсылка + |ИЗ + | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы + |ГДЕ + | НЕ Разделы.ПометкаУдаления + | И НЕ Разделы.Ссылка В (&Разделы) + | И Разделы.ИмяПредопределенныхДанных = """""; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если ЗначениеЗаполнено(Выборка.УдалитьНоваяСсылка) + И ОбщегоНазначения.РазделениеВключено() Тогда + Продолжить; + КонецЕсли; + Объект = Выборка.Ссылка.ПолучитьОбъект(); + Объект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект, Ложь); + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. @@ -743,7 +865,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДатыЗапретаИзменения"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); @@ -770,6 +891,137 @@ КонецПроцедуры +// Обработчик преобразует план видов характеристик разделы дат запрета изменения. +Процедура ОчиститьПредопределенныеЭлементыРазделовДатЗапрета() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы + |ГДЕ + | Разделы.ИмяПредопределенныхДанных <> """""; + + Если Запрос.Выполнить().Пустой() Тогда + Возврат; + КонецЕсли; + + СвойстваРазделов = СвойстваРазделов(); + ПустойРаздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка(); + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("ПланВидовХарактеристик.РазделыДатЗапретаИзменения"); + + Запрос.Текст = + "ВЫБРАТЬ + | Разделы.Ссылка КАК Ссылка, + | Разделы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + |ИЗ + | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы + |ГДЕ + | Разделы.ИмяПредопределенныхДанных <> """""; + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ПреобразоватьРазделыДатЗапретаИзменения + |общего модуля ДатыЗапретаИзмененияСлужебный.'") + + Символы.ПС + + Символы.ПС; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ОбновитьРазделыДатЗапретаИзменения(); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Приставка = "Удалить"; + Если Не СтрНачинаетсяС(Выборка.ИмяПредопределенныхДанных, Приставка) Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Предопределенное имя раздела дат запрета ""%1"" должно иметь приставку ""%2"".'"), + Выборка.ИмяПредопределенныхДанных, Приставка); + КонецЕсли; + ИскомоеИмя = Сред(Выборка.ИмяПредопределенныхДанных, СтрДлина(Приставка) + 1); + СвойстваРаздела = СвойстваРазделов.Разделы.Получить(ИскомоеИмя); + Если СвойстваРаздела = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя раздела дат запрета ""%1"", полученное из имени предопределенного элемента ""%2"", + |не найдено в описании, указанном в процедуре ПриЗаполненииРазделовДатЗапретаИзменения + |общего модуля ДатыЗапретаИзмененияПереопределяемый. + | + |Если раздел был переименован/удален в описании, следует переименовать/удалить + |соответствующий предопределенный элемент.'"), + ИскомоеИмя, Выборка.ИмяПредопределенныхДанных); + КонецЕсли; + Объект = Выборка.Ссылка.ПолучитьОбъект(); + Объект.ИмяПредопределенныхДанных = ""; + Если Выборка.Ссылка <> СвойстваРаздела.Ссылка Тогда + Объект.УдалитьНоваяСсылка = СвойстваРаздела.Ссылка; + Объект.Наименование = "(" + НСтр("ru = 'не используется'") + ") " + СвойстваРаздела.Представление; + КонецЕсли; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект, Ложь); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Обработчик заменяет разделы дат запрета регистре на новые. +Процедура ЗаменитьРазделыДатЗапретаНаНовые() Экспорт + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ДатыЗапретаИзменения"); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Разделы.Ссылка КАК Ссылка, + | Разделы.УдалитьНоваяСсылка КАК УдалитьНоваяСсылка + |ИЗ + | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения + | ПО (ДатыЗапретаИзменения.Раздел = Разделы.Ссылка) + | И (Разделы.УдалитьНоваяСсылка <> ЗНАЧЕНИЕ(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка))"; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СтарыеЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей(); + СтарыеЗаписи.Отбор.Раздел.Установить(Выборка.Ссылка); + СтарыеЗаписи.Прочитать(); + НовыеЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей(); + НовыеЗаписи.Отбор.Раздел.Установить(Выборка.УдалитьНоваяСсылка); + НовыеЗаписи.Прочитать(); + Если НовыеЗаписи.Количество() > 0 Тогда + СтарыеЗаписи.Очистить(); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(СтарыеЗаписи, Ложь); + Иначе + Для Каждого СтараяЗапись Из СтарыеЗаписи Цикл + НоваяЗапись = НовыеЗаписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, СтараяЗапись); + НоваяЗапись.Раздел = Выборка.УдалитьНоваяСсылка; + Если СтараяЗапись.Раздел = СтараяЗапись.Объект Тогда + НоваяЗапись.Объект = Выборка.УдалитьНоваяСсылка; + КонецЕсли; + КонецЦикла; + СтарыеЗаписи.Очистить(); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(СтарыеЗаписи, Ложь); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыеЗаписи, Ложь); + КонецЕсли; + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -1069,6 +1321,76 @@ // 5. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и узла. // 6. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого узла. + НачалоДня = НачалоДня(ТекущаяДатаСеанса()); + + ДействующиеДаты = Новый Структура; + ДействующиеДаты.Вставить("НачалоДня", НачалоДня); + + ТипыАдресатов = Метаданные.ОпределяемыеТипы.АдресатЗапретаИзменения.Тип.Типы(); + ТипыАдресатовУзлов = Новый Массив; + ТипыАдресатовПользователей = Новый Массив; + Для каждого ТипАдресатов Из ТипыАдресатов Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипАдресатов); + Если Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда + ТипыАдресатовУзлов.Добавить(ТипАдресатов); + ИначеЕсли ТипАдресатов <> Тип("ПеречислениеСсылка.ВидыНазначенияДатЗапрета") Тогда + ТипыАдресатовПользователей.Добавить(ТипАдресатов); + КонецЕсли; + КонецЦикла; + + ДействующиеДаты.Вставить("СвойстваРазделов", ТекущиеСвойстваРазделов(ТипыАдресатовУзлов)); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + РезультатыЗапроса = ЗапросДатЗапретаИзменения().ВыполнитьПакет(); + + ЗначенияКонстант = РезультатыЗапроса[0].Выгрузить()[0]; + ДействующиеДаты.Вставить("Версия", ЗначенияКонстант.ВерсияДатЗапретаИзменения); + ДействующиеДаты.Вставить("ЗапретИзмененияИспользуется", ЗначенияКонстант.ИспользоватьДатыЗапретаИзменения); + ДействующиеДаты.Вставить("ЗапретЗагрузкиИспользуется", ЗначенияКонстант.ИспользоватьДатыЗапретаЗагрузки); + + Выгрузка = РезультатыЗапроса[1].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + ГруппыПользователей = Новый Соответствие; + Для Каждого Строка Из Выгрузка.Строки Цикл + ГруппыПользователей.Вставить(Строка.Пользователь, + Новый ФиксированныйМассив(Строка.Строки.ВыгрузитьКолонку("ГруппаПользователей"))); + КонецЦикла; + ДействующиеДаты.Вставить("ГруппыПользователей", Новый ФиксированноеСоответствие(ГруппыПользователей)); + + ДействующиеДаты.Вставить("ДляПользователей", УстановленныеДаты(РезультатыЗапроса[2], НачалоДня)); + ДействующиеДаты.Вставить("ДляИнформационныхБаз", УстановленныеДаты(РезультатыЗапроса[3], НачалоДня)); + Иначе + ДействующиеДаты.Вставить("Версия", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + ДействующиеДаты.Вставить("ЗапретИзмененияИспользуется", Ложь); + ДействующиеДаты.Вставить("ЗапретЗагрузкиИспользуется", Ложь); + ДействующиеДаты.Вставить("ГруппыПользователей", Новый ФиксированноеСоответствие(Новый Соответствие)); + УстановленныеДаты = Новый Структура; + УстановленныеДаты.Вставить("Разделы", Новый ФиксированноеСоответствие(Новый Соответствие)); + УстановленныеДаты.Вставить("ДатыЗапретаПоОбъектамНеУказаны", Истина); + ДействующиеДаты.Вставить("ДляПользователей", Новый ФиксированнаяСтруктура(УстановленныеДаты)); + ДействующиеДаты.Вставить("ДляИнформационныхБаз", Новый ФиксированнаяСтруктура(УстановленныеДаты)); + КонецЕсли; + + Если ДействующиеДаты.ДляПользователей.Разделы.Количество() = 0 Тогда + ДействующиеДаты.ЗапретИзмененияИспользуется = Ложь; + КонецЕсли; + + Если ДействующиеДаты.ДляИнформационныхБаз.Разделы.Количество() = 0 + Или ТипыАдресатовУзлов.Количество() = 0 Тогда + + ДействующиеДаты.ЗапретЗагрузкиИспользуется = Ложь; + КонецЕсли; + + ДействующиеДаты.Вставить("ИсточникиДанных", + ТекущиеИсточникиДанныхДляПроверкиЗапретаИзменения(ДействующиеДаты.СвойстваРазделов)); + + Возврат Новый ФиксированнаяСтруктура(ДействующиеДаты); + +КонецФункции + +// Для процедуры ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения. + +Функция ЗапросДатЗапретаИзменения() + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -1131,97 +1453,12 @@ | И ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) <> ТИП(Справочник.ГруппыВнешнихПользователей) |ИТОГИ ПО | Раздел, - | Объект - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | РазделыДатЗапретаИзменения.Ссылка КАК Ссылка, - | РазделыДатЗапретаИзменения.ТипЗначения КАК ТипЗначения, - | РазделыДатЗапретаИзменения.ИмяПредопределенныхДанных КАК Имя - |ИЗ - | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК РазделыДатЗапретаИзменения - |ГДЕ - | РазделыДатЗапретаИзменения.Предопределенный"; + | Объект"; - НачалоДня = НачалоДня(ТекущаяДатаСеанса()); - - ДействующиеДаты = Новый Структура; - ДействующиеДаты.Вставить("НачалоДня", НачалоДня); - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - ЗначенияКонстант = РезультатыЗапроса[0].Выгрузить()[0]; - ДействующиеДаты.Вставить("Версия", ЗначенияКонстант.ВерсияДатЗапретаИзменения); - ДействующиеДаты.Вставить("ЗапретИзмененияИспользуется", ЗначенияКонстант.ИспользоватьДатыЗапретаИзменения); - ДействующиеДаты.Вставить("ЗапретЗагрузкиИспользуется", ЗначенияКонстант.ИспользоватьДатыЗапретаЗагрузки); - - Выгрузка = РезультатыЗапроса[1].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - ГруппыПользователей = Новый Соответствие; - Для Каждого Строка Из Выгрузка.Строки Цикл - ГруппыПользователей.Вставить(Строка.Пользователь, - Новый ФиксированныйМассив(Строка.Строки.ВыгрузитьКолонку("ГруппаПользователей"))); - КонецЦикла; - ДействующиеДаты.Вставить("ГруппыПользователей", Новый ФиксированноеСоответствие(ГруппыПользователей)); - - ДействующиеДаты.Вставить("ДляПользователей", УстановленныеДаты(РезультатыЗапроса[2], НачалоДня)); - ДействующиеДаты.Вставить("ДляИнформационныхБаз", УстановленныеДаты(РезультатыЗапроса[3], НачалоДня)); - Разделы = РезультатыЗапроса[4].Выгрузить(); - Иначе - ДействующиеДаты.Вставить("Версия", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); - ДействующиеДаты.Вставить("ЗапретИзмененияИспользуется", Ложь); - ДействующиеДаты.Вставить("ЗапретЗагрузкиИспользуется", Ложь); - ДействующиеДаты.Вставить("ГруппыПользователей", Новый ФиксированноеСоответствие(Новый Соответствие)); - УстановленныеДаты = Новый Структура; - УстановленныеДаты.Вставить("Разделы", Новый ФиксированноеСоответствие(Новый Соответствие)); - УстановленныеДаты.Вставить("ДатыЗапретаПоОбъектамНеУказаны", Истина); - ДействующиеДаты.Вставить("ДляПользователей", Новый ФиксированнаяСтруктура(УстановленныеДаты)); - ДействующиеДаты.Вставить("ДляИнформационныхБаз", Новый ФиксированнаяСтруктура(УстановленныеДаты)); - Запрос.Текст = - "ВЫБРАТЬ - | РазделыДатЗапретаИзменения.Ссылка КАК Ссылка, - | РазделыДатЗапретаИзменения.ТипЗначения КАК ТипЗначения, - | РазделыДатЗапретаИзменения.ИмяПредопределенныхДанных КАК Имя - |ИЗ - | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК РазделыДатЗапретаИзменения - |ГДЕ - | РазделыДатЗапретаИзменения.Предопределенный"; - Разделы = Запрос.Выполнить().Выгрузить(); - КонецЕсли; - - ТипыАдресатов = Метаданные.ОпределяемыеТипы.АдресатЗапретаИзменения.Тип.Типы(); - ТипыАдресатовУзлов = Новый Массив; - ТипыАдресатовПользователей = Новый Массив; - Для каждого ТипАдресатов Из ТипыАдресатов Цикл - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипАдресатов); - Если Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда - ТипыАдресатовУзлов.Добавить(ТипАдресатов); - ИначеЕсли ТипАдресатов <> Тип("ПеречислениеСсылка.ВидыНазначенияДатЗапрета") Тогда - ТипыАдресатовПользователей.Добавить(ТипАдресатов); - КонецЕсли; - КонецЦикла; - - Если ДействующиеДаты.ДляПользователей.Разделы.Количество() = 0 Тогда - ДействующиеДаты.ЗапретИзмененияИспользуется = Ложь; - КонецЕсли; - - Если ДействующиеДаты.ДляИнформационныхБаз.Разделы.Количество() = 0 - Или ТипыАдресатовУзлов.Количество() = 0 Тогда - - ДействующиеДаты.ЗапретЗагрузкиИспользуется = Ложь; - КонецЕсли; - - СсылкиИменРазделов = Новый Соответствие; - ДействующиеДаты.Вставить("СвойстваРазделов", ТекущиеСвойстваРазделов(Разделы, СсылкиИменРазделов, ТипыАдресатовУзлов)); - ДействующиеДаты.Вставить("ИсточникиДанных", ТекущиеИсточникиДанныхДляПроверкиЗапретаИзменения(СсылкиИменРазделов)); - - Возврат Новый ФиксированнаяСтруктура(ДействующиеДаты); + Возврат Запрос; КонецФункции -// Для процедуры ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения. - Функция УстановленныеДаты(РезультатЗапроса, НачалоДня) Выгрузка = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); @@ -1253,7 +1490,7 @@ КонецФункции -Функция ТекущиеСвойстваРазделов(Разделы, СсылкиИменРазделов, ТипыАдресатовУзлов) +Функция ТекущиеСвойстваРазделов(ТипыАдресатовУзлов) Свойства = Новый Структура; Свойства.Вставить("ИспользоватьВнешнихПользователей", Ложь); @@ -1272,52 +1509,19 @@ Свойства.Вставить("ПустыеСсылкиУзловПлановОбмена", Новый ФиксированныйМассив(ПустыеСсылкиУзлов)); - Свойства.Вставить("ВсеРазделыБезОбъектов", Истина); + СвойстваРазделов = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.СвойстваРазделовДатЗапрета(); - РазделыБезОбъектов = Новый Массив; - ТипыОбъектовРазделов = Новый Соответствие; - - Для Каждого Раздел Из Разделы Цикл - СсылкиИменРазделов.Вставить(Раздел.Имя, Раздел.Ссылка); - - ТипыОбъектов = Новый Массив; - Для каждого Тип Из Раздел.ТипЗначения.Типы() Цикл - Если Тип <> Тип("ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения") Тогда - Если ОбщегоНазначения.ЭтоСсылка(Тип) Тогда - МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); - СвойстваТипа = Новый Структура; - СвойстваТипа.Вставить("ПолноеИмя", МетаданныеТипа.ПолноеИмя()); - СвойстваТипа.Вставить("Представление", Строка(Тип)); - ТипыОбъектов.Добавить(Новый ФиксированнаяСтруктура(СвойстваТипа)); - КонецЕсли; - КонецЕсли; - КонецЦикла; - ТипыОбъектовРазделов.Вставить(Раздел.Ссылка, Новый ФиксированныйМассив(ТипыОбъектов)); - - Если ТипыОбъектов.Количество() <> 0 Тогда - Свойства.ВсеРазделыБезОбъектов = Ложь; - Иначе - РазделыБезОбъектов.Добавить(Раздел.Ссылка); - КонецЕсли; + Для Каждого КлючИЗначение Из СвойстваРазделов Цикл + Свойства.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); КонецЦикла; - Свойства.Вставить("РазделыБезОбъектов", Новый ФиксированныйМассив(РазделыБезОбъектов)); - Свойства.Вставить("ТипыОбъектовРазделов", Новый ФиксированноеСоответствие(ТипыОбъектовРазделов)); - - ПустойРаздел = ДатыЗапретаИзмененияСлужебныйПовтИсп.ПустойРаздел(); - - Свойства.Вставить("БезРазделовИОбъектов", Разделы.Количество() = 0); - Свойства.Вставить("ЕдинственныйРаздел", ?(Разделы.Количество() = 1, Разделы[0].Ссылка, ПустойРаздел)); - Свойства.Вставить("ПоказыватьРазделы", НЕ ( НЕ Свойства.ВсеРазделыБезОбъектов - И ЗначениеЗаполнено(Свойства.ЕдинственныйРаздел))); - Возврат Новый ФиксированнаяСтруктура(Свойства); КонецФункции -Функция ТекущиеИсточникиДанныхДляПроверкиЗапретаИзменения(СсылкиИменРазделов) +Функция ТекущиеИсточникиДанныхДляПроверкиЗапретаИзменения(СвойстваРазделов) - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Новый ФиксированноеСоответствие(Новый Соответствие); КонецЕсли; @@ -1335,6 +1539,12 @@ Таблицы = ИсточникиДанных.Скопировать(, "Таблица"); Таблицы.Свернуть("Таблица"); + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения + |общего модуля ДатыЗапретаИзмененияПереопределяемый.'") + + Символы.ПС + + Символы.ПС; + Для Каждого Строка Из Таблицы Цикл ИсточникиТаблицы = Новый Структура; Попытка @@ -1351,9 +1561,8 @@ ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Строка.Таблица); КонецПопытки; Если ОбъектМетаданных = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для проверки запрета изменения - |в источнике данных неверно указана таблица + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для проверки запрета изменения в источнике данных неверно указана таблица |""%1"".'"), Строка.Таблица); КонецЕсли; @@ -1369,8 +1578,15 @@ ТекстЗапросаТолькоДаты = ""; Для Каждого Строка Из ИсточникиДанныхТаблицы Цикл + СвойстваРаздела = СвойстваРазделов.Разделы.Получить(Строка.Раздел); + Если СвойстваРаздела = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для проверки запрета изменения в источнике данных указан несуществующий + |раздел ""%1"" для таблицы ""%2"".'"), + Строка.Раздел, Строка.Таблица); + КонецЕсли; Источник = Новый Структура; - Источник.Вставить("Раздел", СсылкиИменРазделов.Получить(Строка.Раздел)); + Источник.Вставить("Раздел", Строка.Раздел); Источник.Вставить("ПолеДаты", ПолеТаблицы(Строка, "ПолеДаты", ОбъектМетаданных, ЭтоРегистр)); Источник.Вставить("ПолеОбъекта", ПолеТаблицы(Строка, "ПолеОбъекта", ОбъектМетаданных, ЭтоРегистр)); Если ЭтоРегистр Тогда @@ -1673,4 +1889,23 @@ КонецПроцедуры +// Для процедур ПриОтправкеДанныхГлавному, ПриОтправкеДанныхГлавному, +// ПриПолученииДанныхОтГлавного, ПриПолученииДанныхОтПодчиненного. +// +Функция НаборЗаписейТолькоСДатамиЗапретаЗагрузки(ЭлементДанных) + + Если ТипЗнч(ЭлементДанных) <> Тип("РегистрСведенийНаборЗаписей.ДатыЗапретаИзменения") Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ЭлементДанных.Отбор.Пользователь.Использование Тогда + ВызватьИсключение + НСтр("ru = 'Выгрузка или загрузка записей регистра сведений ""Даты запрета изменения"" + |допускается только в разрезе измерения Пользователь.'"); + КонецЕсли; + + Возврат Не ЭтоАдресатЗапретаИзменения(ЭлементДанных.Отбор.Пользователь.Значение); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйКлиентСервер/Module.bsl index 50f2feaf0..044279671 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Даты запрета изменения". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -23,91 +18,124 @@ КонецФункции -Процедура ОбщаяДатаЗапретаСОписаниемПриИзменении(Знач Контекст, РассчитатьДатуЗапрета = Истина) Экспорт +Процедура УточнитьНастройкуДатыЗапретаПриИзменении(Контекст, РассчитатьДатуЗапрета = Истина) Экспорт - Если Контекст.ОписаниеДатыЗапрета = "" Или Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Тогда - Контекст.Элементы.ГруппаРежимыРаботы.ТекущаяСтраница = Контекст.Элементы.ПростойРежим; + Если Контекст.ВыбранРасширенныйРежим Тогда + Если Контекст.ОписаниеДатыЗапрета = "" Тогда + Контекст.ДатаЗапрета = "00010101"; + КонецЕсли; Иначе - Контекст.Элементы.ГруппаРежимыРаботы.ТекущаяСтраница = Контекст.Элементы.РасширенныйРежим; + Если Контекст.ДатаЗапрета <> '00010101' И Контекст.ОписаниеДатыЗапрета = "" Тогда + Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата"; + + ИначеЕсли Контекст.ДатаЗапрета = '00010101' И Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Тогда + Контекст.ОписаниеДатыЗапрета = ""; + КонецЕсли; + КонецЕсли; + + Контекст.ТекстНадписиОтносительнойДатыЗапрета = ""; + + Если Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Или Контекст.ОписаниеДатыЗапрета = "" Тогда + Контекст.КоличествоДнейРазрешения = 0; + Возврат; + КонецЕсли; + + РасчетныеДатыЗапрета = РасчетДатыЗапрета( + Контекст.ОписаниеДатыЗапрета, Контекст.НачалоДня); + + Если РассчитатьДатуЗапрета Тогда + Контекст.ДатаЗапрета = РасчетныеДатыЗапрета.Текущая; + КонецЕсли; + + ТекстНадписи = ""; + + Если Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета Тогда + Сутки = 60*60*24; + + СкорректироватьКоличествоДнейРазрешения( + Контекст.ОписаниеДатыЗапрета, Контекст.КоличествоДнейРазрешения); + + СрокРазрешения = РасчетныеДатыЗапрета.Текущая + Контекст.КоличествоДнейРазрешения * Сутки; + + Если Контекст.НачалоДня > СрокРазрешения Тогда + ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запрещен ввод и редактирование данных за все прошлые периоды + |по %1 включительно (%2). + |Отсрочка, разрешавшая ввод и редактирование данных + |за период с %3 по %4, истекла %5.'"), + Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета]), + Формат(РасчетныеДатыЗапрета.Предыдущая + Сутки, "ДЛФ=Д"), Формат(РасчетныеДатыЗапрета.Текущая, "ДЛФ=Д"), + Формат(СрокРазрешения, "ДЛФ=Д")); + Иначе + Если РассчитатьДатуЗапрета Тогда + Контекст.ДатаЗапрета = РасчетныеДатыЗапрета.Предыдущая; + КонецЕсли; + ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '• По %1 включительно запрещен ввод и редактирование данных + | за все прошлые периоды по %2 + | и действует отсрочка, разрешающая ввод и редактирование данных + | за период с %4 по %5; + |• С %6 начнет действовать запрет на ввод и редактирование данных + | за все прошлые периоды по %5 (%3).'"), + Формат(СрокРазрешения, "ДЛФ=Д"), Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета]), + Формат(РасчетныеДатыЗапрета.Предыдущая + Сутки, "ДЛФ=Д"), Формат(РасчетныеДатыЗапрета.Текущая, "ДЛФ=Д"), + Формат(СрокРазрешения + Сутки, "ДЛФ=Д")); + КонецЕсли; + Иначе + Контекст.КоличествоДнейРазрешения = 0; + ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запрещен ввод и редактирование данных за все прошлые периоды + |по %1 (%2)'"), + Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета])); + КонецЕсли; + + Контекст.ТекстНадписиОтносительнойДатыЗапрета = ТекстНадписи; + +КонецПроцедуры + +Процедура ОбновитьОтображениеДатыЗапретаПриИзменении(Контекст) Экспорт + + Если Не Контекст.ВыбранРасширенныйРежим Тогда + + Если Контекст.ОписаниеДатыЗапрета = "" Или Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Тогда + Контекст.ВыбранРасширенныйРежим = Ложь; + Контекст.Элементы.РасширенныйРежим.Видимость = Ложь; + Контекст.Элементы.ГруппаРежимыРаботы.ТекущаяСтраница = Контекст.Элементы.ПростойРежим; + Иначе + Контекст.ВыбранРасширенныйРежим = Истина; + Контекст.Элементы.РасширенныйРежим.Видимость = Истина; + Контекст.Элементы.ГруппаРежимыРаботы.ТекущаяСтраница = Контекст.Элементы.РасширенныйРежим; + КонецЕсли; + КонецЕсли; - Сутки = 60*60*24; - - Если Контекст.ДатаЗапрета <> '00010101' И Контекст.ОписаниеДатыЗапрета = "" Тогда - Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата"; - ИначеЕсли Контекст.ДатаЗапрета = '00010101' И Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Тогда - Контекст.ОписаниеДатыЗапрета = ""; - КонецЕсли; - Если Контекст.ОписаниеДатыЗапрета = "ПроизвольнаяДата" Тогда - Контекст.Элементы.СвойстваДатыЗапрета.ТекущаяСтраница = - Контекст.Элементы.НетПояснения; - - Контекст.Элементы.ПроизвольнаяДата.ТекущаяСтраница = - Контекст.Элементы.ПроизвольнаяДатаИспользуется; - + Контекст.Элементы.СвойстваДатыЗапрета.ТекущаяСтраница = Контекст.Элементы.НетПояснения; + Контекст.Элементы.ПроизвольнаяДата.ТекущаяСтраница = Контекст.Элементы.ПроизвольнаяДатаИспользуется; Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета = Ложь; - Контекст.КоличествоДнейРазрешения = 0; - Иначе - Контекст.Элементы.СвойстваДатыЗапрета.ТекущаяСтраница = - Контекст.Элементы.ОтносительнаяДата; - - Контекст.Элементы.ПроизвольнаяДата.ТекущаяСтраница = - Контекст.Элементы.ПроизвольнаяДатаНеИспользуется; - - Если Контекст.ОписаниеДатыЗапрета = "ПредыдущийДень" Тогда - Контекст.Элементы.РазрешитьИзменениеДанныхДоДатыЗапрета.Доступность = Ложь; - Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета = Ложь; - Иначе - Контекст.Элементы.РазрешитьИзменениеДанныхДоДатыЗапрета.Доступность = Истина; - КонецЕсли; - РасчетныеДатыЗапрета = РасчетДатыЗапрета( - Контекст.ОписаниеДатыЗапрета, Контекст.НачалоДня); - - Если РассчитатьДатуЗапрета Тогда - Контекст.ДатаЗапрета = РасчетныеДатыЗапрета.Текущая; - КонецЕсли; - ТекстНадписи = ""; - Контекст.Элементы.КоличествоДнейРазрешения.Доступность = Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета; - Если Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета Тогда - - СкорректироватьКоличествоДнейРазрешения( - Контекст.ОписаниеДатыЗапрета, Контекст.КоличествоДнейРазрешения); - СрокРазрешения = РасчетныеДатыЗапрета.Текущая + Контекст.КоличествоДнейРазрешения * Сутки; - - Если Контекст.НачалоДня > СрокРазрешения Тогда - ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Запрещен ввод и редактирование данных за все прошлые периоды - |по %1 включительно (%2). - |Отсрочка, разрешавшая ввод и редактирование данных - |за период с %3 по %4, истекла %5.'"), - Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета]), - Формат(РасчетныеДатыЗапрета.Предыдущая + Сутки, "ДЛФ=Д"), Формат(РасчетныеДатыЗапрета.Текущая, "ДЛФ=Д"), - Формат(СрокРазрешения, "ДЛФ=Д")); - Иначе - Если РассчитатьДатуЗапрета Тогда - Контекст.ДатаЗапрета = РасчетныеДатыЗапрета.Предыдущая; - КонецЕсли; - ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '• По %1 включительно запрещен ввод и редактирование данных - | за все прошлые периоды по %2 - | и действует отсрочка, разрешающая ввод и редактирование данных - | за период с %4 по %5; - |• С %6 начнет действовать запрет на ввод и редактирование данных - | за все прошлые периоды по %5 (%3).'"), - Формат(СрокРазрешения, "ДЛФ=Д"), Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета]), - Формат(РасчетныеДатыЗапрета.Предыдущая + Сутки, "ДЛФ=Д"), Формат(РасчетныеДатыЗапрета.Текущая, "ДЛФ=Д"), - Формат(СрокРазрешения + Сутки, "ДЛФ=Д")); - КонецЕсли; - Иначе - Контекст.КоличествоДнейРазрешения = 0; - ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запрещен ввод и редактирование данных за все прошлые периоды - |по %1 (%2)'"), - Формат(Контекст.ДатаЗапрета, "ДЛФ=Д"), НРег(ОписанияДатЗапрета()[Контекст.ОписаниеДатыЗапрета])); - КонецЕсли; - Контекст.Элементы.ПояснениеНепроизвольнойДаты.Заголовок = ТекстНадписи; + Возврат; КонецЕсли; + Если Контекст.ОписаниеДатыЗапрета = "" Тогда + Контекст.Элементы.СвойстваДатыЗапрета.ТекущаяСтраница = Контекст.Элементы.НетПояснения; + Контекст.Элементы.ПроизвольнаяДата.ТекущаяСтраница = Контекст.Элементы.ПроизвольнаяДатаНеИспользуется; + Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета = Ложь; + Возврат; + КонецЕсли; + + Контекст.Элементы.СвойстваДатыЗапрета.ТекущаяСтраница = Контекст.Элементы.ОтносительнаяДата; + Контекст.Элементы.ПроизвольнаяДата.ТекущаяСтраница = Контекст.Элементы.ПроизвольнаяДатаНеИспользуется; + + Если Контекст.ОписаниеДатыЗапрета = "ПредыдущийДень" Тогда + Контекст.Элементы.РазрешитьИзменениеДанныхДоДатыЗапрета.Доступность = Ложь; + Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета = Ложь; + Иначе + Контекст.Элементы.РазрешитьИзменениеДанныхДоДатыЗапрета.Доступность = Истина; + КонецЕсли; + + Контекст.Элементы.КоличествоДнейРазрешения.Доступность = Контекст.РазрешитьИзменениеДанныхДоДатыЗапрета; + Контекст.Элементы.ПояснениеНепроизвольнойДаты.Заголовок = Контекст.ТекстНадписиОтносительнойДатыЗапрета; + КонецПроцедуры Функция РасчетДатыЗапрета(Знач ВариантДатыЗапрета, Знач ТекущаяДатаНаСервере) diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl index 66e555ad1..51a2cb395 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl @@ -1,11 +1,6 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Даты запрета изменения". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции -// См. комментарий в вызывающей функции ДатыЗапретаИзменения.ШаблонДанныхДляПроверки(). +// См. ДатыЗапретаИзменения.ШаблонДанныхДляПроверки. Функция ШаблонДанныхДляПроверки() Экспорт ДанныеДляПроверки = Новый ТаблицаЗначений; @@ -14,7 +9,7 @@ "Дата", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата))); ДанныеДляПроверки.Колонки.Добавить( - "Раздел", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения")); + "Раздел", Новый ОписаниеТипов("Строка,ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения")); ДанныеДляПроверки.Колонки.Добавить( "Объект", Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.Тип); diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl index 979c63146..3163f55d5 100644 --- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl @@ -1,27 +1,28 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Запустить выполнение процедуры в фоновом задании, если это возможно. // При выполнении любого из следующих условий запуск выполняется не в фоне, а сразу в основном потоке: // * если приложение запущено в режиме отладки (параметр /C РежимОтладки) - для упрощения отладки конфигурации; -// * если в файловой ИБ имеются активные фоновые задания - для снижения времени ожидания пользователя. +// * если в файловой ИБ имеются активные фоновые задания - для снижения времени ожидания пользователя; +// * если выполняется процедура модуля внешней обработки или внешнего отчета. // -// Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. +// Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. +// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. // // Параметры: -// ИмяПроцедуры - Строка - имя экспортной процедуры, которую необходимо выполнить в фоне. +// ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля, модуля менеджера объекта +// или модуля обработки, которую необходимо выполнить в фоне. +// Например, "МойОбщийМодуль.МояПроцедура", "Отчет.ЗагруженныеДанные.Сформировать" +// или "Обработка.ЗагрузкаДанных.МодульОбъекта.Загрузить". // У процедуры может быть два или три формальных параметра: -// * Параметры - Структура - произвольные параметры ПараметрыПроцедуры. Обязательно; +// * Параметры - Структура - произвольные параметры ПараметрыПроцедуры; // * АдресРезультата - Строка - адрес временного хранилища, в которое нужно // поместить результат работы процедуры. Обязательно; // * АдресДополнительногоРезультата - Строка - если в ПараметрыВыполнения установлен -// параметр ДополнительныйРезультат, то содержит адрес дополнительного временного хранилища, -// в которое нужно поместить результат работы процедуры. Опционально. +// параметр ДополнительныйРезультат, то содержит адрес дополнительного временного +// хранилища, в которое нужно поместить результат работы процедуры. Опционально. +// При необходимости выполнить в фоне функцию, ее следует обернуть в процедуру, +// а ее результат возвращать через второй параметр АдресРезультата. // ПараметрыПроцедуры - Структура - произвольные параметры вызова процедуры ИмяПроцедуры. // ПараметрыВыполнения - Структура - см. функцию ПараметрыВыполненияВФоне. // @@ -43,6 +44,13 @@ // Функция ВыполнитьВФоне(Знач ИмяПроцедуры, Знач ПараметрыПроцедуры, Знач ПараметрыВыполнения) Экспорт + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ДлительныеОперации.ВыполнитьВФоне", "ПараметрыВыполнения", + ПараметрыВыполнения, Тип("Структура")); + Если ПараметрыВыполнения.ЗапуститьНеВФоне И ПараметрыВыполнения.ЗапуститьВФоне Тогда + ВызватьИсключение НСтр("ru = 'Параметры ""ВсегдаНеВФоне"" и ""ВсегдаВФоне"" + |не могут одновременно принимать значение Истина в ДлительныеОперации.ВыполнитьВФоне.'"); + КонецЕсли; + АдресРезультата = ?(ПараметрыВыполнения.АдресРезультата <> Неопределено, ПараметрыВыполнения.АдресРезультата, ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы)); @@ -56,14 +64,8 @@ Результат.Вставить("ПодробноеПредставлениеОшибки", ""); Результат.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив)); - Если ПараметрыВыполнения.ЗапуститьНеВФоне И ПараметрыВыполнения.ЗапуститьВФоне Тогда - Результат.Статус = "Ошибка"; - ТекстИсключения = НСтр("ru = 'Параметры длительной операции ""%1"" и ""%2"" - |не могут одновременно принимать значение Истина.'"); - ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, "ВсегдаНеВФоне", "ВсегдаВФоне"); - Результат.КраткоеПредставлениеОшибки = ТекстИсключения; - Результат.ПодробноеПредставлениеОшибки = ТекстИсключения; - Возврат Результат; + Если ПараметрыВыполнения.БезРасширений Тогда + ПараметрыВыполнения.БезРасширений = ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения); КонецЕсли; ПараметрыЭкспортнойПроцедуры = Новый Массив; @@ -75,33 +77,28 @@ ПараметрыЭкспортнойПроцедуры.Добавить(Результат.АдресДополнительногоРезультата); КонецЕсли; - ЗапущеноЗаданийВФайловойИБ = 0; - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() - И Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда - Отбор = Новый Структура; - Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - ЗапущеноЗаданийВФайловойИБ = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество(); - КонецЕсли; - // Выполнить в основном потоке. - Если ОбщегоНазначенияКлиентСервер.РежимОтладки() - Или ПараметрыВыполнения.ЗапуститьНеВФоне - Или (ЗапущеноЗаданийВФайловойИБ > 0 И Не ПараметрыВыполнения.ЗапуститьВФоне) Тогда + Если Не ПараметрыВыполнения.БезРасширений + И (ОбщегоНазначенияКлиентСервер.РежимОтладки() Или ПараметрыВыполнения.ЗапуститьНеВФоне + Или (ЕстьФоновыеЗаданияВФайловойИБ() И Не ПараметрыВыполнения.ЗапуститьВФоне) + Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры)) Тогда Попытка - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры); + ВыполнитьПроцедуру(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры); Результат.Статус = "Выполнено"; Исключение Результат.Статус = "Ошибка"; Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки); КонецПопытки; Возврат Результат; КонецЕсли; // Выполнить в фоне. Попытка - Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры, - ПараметрыВыполнения.КлючФоновогоЗадания, ПараметрыВыполнения.НаименованиеФоновогоЗадания); + Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, + ПараметрыВыполнения, ПараметрыЭкспортнойПроцедуры); Исключение Результат.Статус = "Ошибка"; Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда @@ -114,6 +111,13 @@ Возврат Результат; КонецПопытки; + Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда + Результат.Статус = "Ошибка"; + Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Возврат Результат; + КонецЕсли; + Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор; ЗаданиеВыполнено = Ложь; @@ -159,20 +163,25 @@ // работы процедуры. Если не задан, адрес формируется автоматически. // * ЗапуститьВФоне - Булево - если Истина, то задание будет всегда выполняться в фоне, // за исключением режима отладки. +// В файловом варианте, при наличии ранее запущенных заданий, +// новое задание становится в очередь и начинает выполняться после завершения предыдущих. // * ЗапуститьНеВФоне - Булево - если Истина, задание всегда будет запускаться непосредственно, // без использования фонового задания. +// * БезРасширений - Булево - если Истина, то фоновое задание будет запущено без подключения +// расширений конфигурации. // Функция ПараметрыВыполненияВФоне(Знач ИдентификаторФормы) Экспорт Результат = Новый Структура; Результат.Вставить("ИдентификаторФормы", ИдентификаторФормы); Результат.Вставить("ДополнительныйРезультат", Ложь); - Результат.Вставить("ОжидатьЗавершение", ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 0.8)); + Результат.Вставить("ОжидатьЗавершение", ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2)); Результат.Вставить("НаименованиеФоновогоЗадания", ""); Результат.Вставить("КлючФоновогоЗадания", ""); Результат.Вставить("АдресРезультата", Неопределено); Результат.Вставить("ЗапуститьНеВФоне", Ложь); Результат.Вставить("ЗапуститьВФоне", Ложь); + Результат.Вставить("БезРасширений", Ложь); Возврат Результат; КонецФункции @@ -227,9 +236,8 @@ КонецФункции -// ------------------------------ - // Запускает выполнение процедуры в фоновом задании. +// Является менее функциональным аналогом ВыполнитьВФоне, предусмотрена для обратной совместимости. // // Параметры: // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, @@ -287,18 +295,22 @@ Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Или ЗапущеноЗаданий > 0 Тогда - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры); Результат.ЗаданиеВыполнено = Истина; Иначе ВремяОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2); - Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры,, НаименованиеЗадания); + ПараметрыВыполнения = ПараметрыВыполненияВФоне(Неопределено); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания; + Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры, + ПараметрыВыполнения, ПараметрыЭкспортнойПроцедуры); Попытка Задание.ОжидатьЗавершения(ВремяОжидания); Исключение // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания. КонецПопытки; - Результат.ЗаданиеВыполнено = ЗаданиеВыполнено(Задание.УникальныйИдентификатор); + Статус = ОперацияВыполнена(Задание.УникальныйИдентификатор); + Результат.ЗаданиеВыполнено = Статус.Статус = "Выполнено"; Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор; КонецЕсли; @@ -457,73 +469,42 @@ КонецФункции +Функция СообщениеПрогресса() Экспорт + Возврат "СтандартныеПодсистемы.ДлительныеОперации"; +КонецФункции + Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт - - ИмяМетода = Параметры.ИмяМетода; - ВременнаяСтруктура = Новый Структура; - Попытка - ВременнаяСтруктура.Вставить(ИмяМетода); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода обработки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Имя метода ""%1"" не соответствует требованиям образования имен переменных.'"), ИмяМетода); - КонецПопытки; - - ПараметрыВыполнения = Параметры.ПараметрыВыполнения; Если Параметры.ЭтоВнешняяОбработка Тогда - Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - Обработка = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Параметры.ДополнительнаяОбработкаСсылка); + Ссылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДополнительнаяОбработкаСсылка"); + Если ЗначениеЗаполнено(Ссылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + Обработка = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки").ОбъектВнешнейОбработки(Ссылка); Иначе - Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки); + ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные); + Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки, БезопасныйРежим()); КонецЕсли; Иначе Обработка = Обработки[Параметры.ИмяОбработки].Создать(); КонецЕсли; - Выполнить("Обработка." + ИмяМетода + "(ПараметрыВыполнения, АдресХранилища)"); - + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить(Параметры.ПараметрыВыполнения); + ПараметрыМетода.Добавить(АдресХранилища); + ОбщегоНазначения.ВыполнитьМетодОбъекта(Обработка, Параметры.ИмяМетода, ПараметрыМетода); КонецПроцедуры -Функция СообщениеПрогресса() Экспорт - Возврат "СтандартныеПодсистемы.ДлительныеОперации"; -КонецФункции - -// Получает сообщения пользователю, отфильтровывает служебные сообщения о состоянии длительной операции. -// -// Параметры: -// УдалятьПолученные - Булево - Признак необходимости удаления полученных сообщений. -// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. -// -// Возвращаемое значение: -//  Массив - ФиксированныйМассив - Массив объектов СообщениеПользователю, которые были сформированы в -// фоновом задании. -Функция СообщенияПользователю(УдалятьПолученные = Ложь, ИдентификаторЗадания = Неопределено) Экспорт - - Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда - ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); - Если ФоновоеЗадание <> Неопределено Тогда - ВсеСообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(УдалятьПолученные); - КонецЕсли; +Процедура ВыполнитьПроцедуруМодуляОбъектаОтчета(Параметры, АдресХранилища) Экспорт + Если Параметры.ЭтоВнешнийОтчет Тогда + ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОтчетов", Метаданные); + Отчет = ВнешниеОтчеты.Создать(Параметры.ИмяОтчета, БезопасныйРежим()); Иначе - ВсеСообщения = ПолучитьСообщенияПользователю(УдалятьПолученные); + Отчет = Отчеты[Параметры.ИмяОтчета].Создать(); КонецЕсли; - Результат = Новый Массив; - - Для Каждого Сообщение Из ВсеСообщения Цикл - Если СтрНачинаетсяС(Сообщение.Текст, "{" + СообщениеПрогресса() + "}") Тогда - Если УдалятьПолученные Тогда - Сообщение.Сообщить(); - КонецЕсли; - Иначе - Результат.Добавить(Сообщение); - КонецЕсли; - КонецЦикла; - - Возврат Новый ФиксированныйМассив(Результат); - -КонецФункции + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить(Параметры.ПараметрыВыполнения); + ПараметрыМетода.Добавить(АдресХранилища); + ОбщегоНазначения.ВыполнитьМетодОбъекта(Отчет, Параметры.ИмяМетода, ПараметрыМетода); +КонецПроцедуры #КонецОбласти @@ -540,25 +521,18 @@ КонецФункции -// Запуск фонового задания с контекстом клиента. Например, передаются ПараметрыКлиентаНаСервере. -// Запуск выполняется с помощью процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме. -// -// Параметры: -// ИмяМетода - Строка - как в функции Выполнить менеджера фоновых заданий. -// Параметры - Массив - как в функции Выполнить менеджера фоновых заданий. -// Ключ - Строка - как в функции Выполнить менеджера фоновых заданий. -// Наименование - Строка - как в функции Выполнить менеджера фоновых заданий. -// -// Возвращаемое значение: -// ФоновоеЗадание. -// -Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, ПараметрыПроцедуры = Неопределено, - КлючФоновогоЗадания = "", НаименованиеФоновогоЗадания = "") Экспорт +Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, + ПараметрыВыполнения, ПараметрыПроцедуры = Неопределено) Экспорт + + КлючФоновогоЗадания = ПараметрыВыполнения.КлючФоновогоЗадания; + НаименованиеФоновогоЗадания = ?(ПустаяСтрока(ПараметрыВыполнения.НаименованиеФоновогоЗадания), + ИмяПроцедуры, ПараметрыВыполнения.НаименованиеФоновогоЗадания); Если ТекущийРежимЗапуска() = Неопределено Тогда - Возврат ФоновыеЗадания.Выполнить(ИмяПроцедуры, ПараметрыПроцедуры, КлючФоновогоЗадания, - ?(ПустаяСтрока(НаименованиеФоновогоЗадания), ИмяПроцедуры, НаименованиеФоновогоЗадания)); + Возврат ВыполнитьФоновоеЗадание(ПараметрыВыполнения, + ИмяПроцедуры, ПараметрыПроцедуры, + КлючФоновогоЗадания, НаименованиеФоновогоЗадания) КонецЕсли; @@ -570,9 +544,9 @@ ПараметрыПроцедурыФоновогоЗадания = Новый Массив; ПараметрыПроцедурыФоновогоЗадания.Добавить(ВсеПараметры); - Возврат ФоновыеЗадания.Выполнить("ДлительныеОперации.ВыполнитьСКонтекстомКлиента", - ПараметрыПроцедурыФоновогоЗадания, КлючФоновогоЗадания, - ?(ПустаяСтрока(НаименованиеФоновогоЗадания), ИмяПроцедуры, НаименованиеФоновогоЗадания)); + Возврат ВыполнитьФоновоеЗадание(ПараметрыВыполнения, + "ДлительныеОперации.ВыполнитьСКонтекстомКлиента", ПараметрыПроцедурыФоновогоЗадания, + КлючФоновогоЗадания, НаименованиеФоновогоЗадания); КонецФункции @@ -586,7 +560,40 @@ Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений(); УстановитьПривилегированныйРежим(Ложь); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры); + ВыполнитьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры); + +КонецПроцедуры + +Процедура ВыполнитьПроцедуру(ИмяПроцедуры, ПараметрыПроцедуры) + + ЧастиИмени = СтрРазделить(ИмяПроцедуры, "."); + ЭтоПроцедураМодуляОбработки = (ЧастиИмени.Количество() = 4) И ВРег(ЧастиИмени[2]) = "МОДУЛЬОБЪЕКТА"; + Если Не ЭтоПроцедураМодуляОбработки Тогда + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыПроцедуры); + Возврат; + КонецЕсли; + + ЭтоОбработка = ВРег(ЧастиИмени[0]) = "ОБРАБОТКА"; + ЭтоОтчет = ВРег(ЧастиИмени[0]) = "ОТЧЕТ"; + Если ЭтоОбработка Или ЭтоОтчет Тогда + МенеджерОбъекта = ?(ЭтоОтчет, Отчеты, Обработки); + ОбработкаОтчетОбъект = МенеджерОбъекта[ЧастиИмени[1]].Создать(); + ОбщегоНазначения.ВыполнитьМетодОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры); + Возврат; + КонецЕсли; + + ЭтоВнешняяОбработка = ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА"; + ЭтоВнешнийОтчет = ВРег(ЧастиИмени[0]) = "ВНЕШНИЙОТЧЕТ"; + Если ЭтоВнешняяОбработка Или ЭтоВнешнийОтчет Тогда + ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные); + МенеджерОбъекта = ?(ЭтоВнешнийОтчет, ВнешниеОтчеты, ВнешниеОбработки); + ОбработкаОтчетОбъект = МенеджерОбъекта.Создать(ЧастиИмени[1], БезопасныйРежим()); + ОбщегоНазначения.ВыполнитьМетодОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры); + Возврат; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный формат параметра ИмяПроцедуры (переданное значение: %1)'"), ИмяПроцедуры); КонецПроцедуры @@ -663,22 +670,51 @@ КонецФункции -Процедура ВыполнитьКомандуОтчетаИлиОбработки(ПараметрыКоманды, АдресРезультата) Экспорт +Функция ЕстьФоновыеЗаданияВФайловойИБ() - Если ПараметрыКоманды.Свойство("ДополнительнаяОбработкаСсылка") - И ЗначениеЗаполнено(ПараметрыКоманды.ДополнительнаяОбработкаСсылка) - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + ЗапущеноЗаданийВФайловойИБ = 0; + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() И Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда + Отбор = Новый Структура; + Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + ЗапущеноЗаданийВФайловойИБ = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество(); + КонецЕсли; + Возврат ЗапущеноЗаданийВФайловойИБ > 0; + +КонецФункции + +Функция ВозможноВыполнитьВФоне(ИмяПроцедуры) + + ЧастиИмени = СтрРазделить(ИмяПроцедуры, "."); + Если ЧастиИмени.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + ЭтоВнешняяОбработка = (ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА"); + ЭтоВнешнийОтчет = (ВРег(ЧастиИмени[0]) = "ВНЕШНИЙОТЧЕТ"); + Возврат Не (ЭтоВнешняяОбработка Или ЭтоВнешнийОтчет); + +КонецФункции + +Функция ВыполнитьФоновоеЗадание(ПараметрыВыполнения, ИмяМетода, Параметры, Ключ, Наименование) + + Если ТекущийРежимЗапуска() = Неопределено + И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата); - - Иначе - - Объект = ОбщегоНазначения.ОбъектПоПолномуИмени(ПараметрыКоманды.ПолноеИмяОбъекта); - Объект.ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата); + Сеанс = ПолучитьТекущийСеансИнформационнойБазы(); + Если ПараметрыВыполнения.ОжидатьЗавершение = Неопределено И Сеанс.ИмяПриложения = "BackgroundJob" Тогда + ВызватьИсключение НСтр("ru = 'В файловой информационной базе невозможно одновременно выполнять более одного фонового задания'"); + ИначеЕсли Сеанс.ИмяПриложения = "COMConnection" Тогда + ВызватьИсключение НСтр("ru = 'В файловой информационной базе можно запустить фоновое задание только из клиентского приложения'"); + КонецЕсли; КонецЕсли; -КонецПроцедуры + Если ПараметрыВыполнения.БезРасширений Тогда + Возврат РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений(ИмяМетода, Параметры, Ключ, Наименование); + Иначе + Возврат ФоновыеЗадания.Выполнить(ИмяМетода, Параметры, Ключ, Наименование); + КонецЕсли; + +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ДлительныеОперацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ДлительныеОперацииВызовСервера/Module.bsl index 21632c0c1..49f36f390 100644 --- a/SSL/src/CommonModules/ДлительныеОперацииВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперацииВызовСервера/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция ОперацииВыполнены(Знач ЗаданияДляПроверки, ЗаданияДляОтмены) Экспорт diff --git a/SSL/src/CommonModules/ДлительныеОперацииГлобальный/Module.bsl b/SSL/src/CommonModules/ДлительныеОперацииГлобальный/Module.bsl index 1a8abda84..80013f1c8 100644 --- a/SSL/src/CommonModules/ДлительныеОперацииГлобальный/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперацииГлобальный/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Процедура КонтрольДлительныхОпераций() Экспорт @@ -107,7 +101,7 @@ Если Статус.Статус = "Выполнено" Тогда - ПоказатьОповещение(ДлительнаяОперация); + ДлительныеОперацииКлиент.ПоказатьОповещение(ДлительнаяОперация); ВыполнитьОповещение(ДлительнаяОперация, Статус); Возврат Истина; @@ -118,6 +112,7 @@ ИначеЕсли Статус.Статус = "Отменено" Тогда + ВыполнитьОповещение(ДлительнаяОперация, Статус); Возврат Истина; КонецЕсли; @@ -135,31 +130,24 @@ КонецФункции -Процедура ПоказатьОповещение(ДлительнаяОперация) - - Оповещение = ДлительнаяОперация.ОповещениеПользователя; - Если Не Оповещение.Показать Тогда - Возврат; - КонецЕсли; - - ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")), - Оповещение.НавигационнаяСсылка, Оповещение.Пояснение); - -КонецПроцедуры - Процедура ВыполнитьОповещение(Знач ДлительнаяОперация, Знач Статус) Если ДлительнаяОперация.ОповещениеОЗавершении = Неопределено Тогда Возврат; КонецЕсли; - Результат = Новый Структура; - Результат.Вставить("Статус", Статус.Статус); - Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата); - Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата); - Результат.Вставить("КраткоеПредставлениеОшибки", Статус.КраткоеПредставлениеОшибки); - Результат.Вставить("ПодробноеПредставлениеОшибки", Статус.ПодробноеПредставлениеОшибки); - Результат.Вставить("Сообщения", Статус.Сообщения); + Если Статус.Статус = "Отменено" Тогда + Результат = Неопределено; + Иначе + Результат = Новый Структура; + Результат.Вставить("Статус", Статус.Статус); + Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата); + Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата); + Результат.Вставить("КраткоеПредставлениеОшибки", Статус.КраткоеПредставлениеОшибки); + Результат.Вставить("ПодробноеПредставлениеОшибки", Статус.ПодробноеПредставлениеОшибки); + Результат.Вставить("Сообщения", Статус.Сообщения); + КонецЕсли; + ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОЗавершении, Результат); КонецПроцедуры diff --git a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl index d992fe3f1..459861bb4 100644 --- a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl @@ -1,12 +1,8 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Ожидать завершения выполнение процедуры в фоновом задании и открыть форму ожидания длительной операции. +// Ожидать завершения выполнения процедуры в фоновом задании и открыть форму ожидания длительной операции. +// Применяется совместно с функцией ДлительныеОперации.ВыполнитьВФоне для повышения отзывчивости пользовательского +// интерфейса, заменяя длительный серверный вызов на запуск фонового задания. // // Параметры: // ДлительнаяОперация - Структура - см. возвращаемое значение функции ДлительныеОперации.ВыполнитьВФоне. @@ -25,7 +21,7 @@ // ** Сообщения - ФиксированныйМассив, Неопределено - массив объектов СообщениеПользователю, // сформированных в процедуре-обработчике длительной операции. // * ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. -// ПараметрыОжидания - Структура - см. функцию ПараметрыОжидания. +// ПараметрыОжидания - Структура - см. ДлительныеОперацииКлиент.ПараметрыОжидания. // Процедура ОжидатьЗавершение(Знач ДлительнаяОперация, Знач ОповещениеОЗавершении = Неопределено, Знач ПараметрыОжидания = Неопределено) Экспорт @@ -46,6 +42,10 @@ Иначе Результат = Неопределено; КонецЕсли; + + Если ДлительнаяОперация.Статус = "Выполнено" И ПараметрыОжидания <> Неопределено Тогда + ПоказатьОповещение(ПараметрыОжидания); + КонецЕсли; ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Результат); КонецЕсли; Возврат; @@ -78,7 +78,10 @@ КонецПроцедуры -// Возвращает пустую структуру для параметра ПараметрыОжидания процедуры ОжидатьЗавершение. +// Возвращает пустую структуру для параметра ПараметрыОжидания процедуры ДлительныеОперацииКлиент.ОжидатьЗавершение. +// +// Параметры: +// ФормаВладелец - УправляемаяФорма, Неопределено - форма, из которой вызывается длительная операция. // // Возвращаемое значение: // Структура - параметры выполнения задания: @@ -105,13 +108,16 @@ // * ВыводитьСообщения - Булево - выводить в оповещения о завершении и прогресс сообщения, // сформированные в процедуре-обработчике длительной операции. // * Интервал - Число - интервал в секундах между проверками готовности длительной операции. -// По умолчанию 0 - после каждой проверки интервал увеличивается с 1 до 15 секунд с коэффициентом 1.4. +// По умолчанию 0 - после каждой проверки интервал увеличивается с 1 до 15 секунд +// с коэффициентом 1.4. // * ОповещениеПользователя - Структура - содержит свойства: // ** Показать - Булево - если Истина, то по завершении длительной операции вывести оповещение пользователя. // ** Текст - Строка - текст оповещения пользователя. // ** НавигационнаяСсылка - Строка - навигационная ссылка оповещения пользователя. // ** Пояснение - Строка - пояснение оповещения пользователя. -// +// +// * ПолучатьРезультат - Булево - Служебный параметр. Не предназначен для использования. +// Функция ПараметрыОжидания(ФормаВладелец) Экспорт Результат = Новый Структура; @@ -190,7 +196,7 @@ // Закрывает форму-индикатор длительной операции. // // Параметры: -// СсылкаНаФорму - УправляемаяФорма - ссылка на форму-индикатор длительной операции. +// ФормаДлительнойОперации - УправляемаяФорма - ссылка на форму-индикатор длительной операции. // Процедура ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации) Экспорт @@ -254,4 +260,16 @@ КонецПроцедуры +Процедура ПоказатьОповещение(ДлительнаяОперация) Экспорт + + Оповещение = ДлительнаяОперация.ОповещениеПользователя; + Если Не Оповещение.Показать Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")), + Оповещение.НавигационнаяСсылка, Оповещение.Пояснение); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl index 58c26fef7..2596f6970 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Подключает и возвращает имя, под которым подключен внешний отчет или обработка. @@ -24,19 +19,11 @@ СтандартнаяОбработка = Истина; Результат = Неопределено; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПодключенииВнешнейОбработки"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл + ИнтеграцияСТехнологиейСервиса.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + Если Не СтандартнаяОбработка Тогда + Возврат Результат; + КонецЕсли; - Обработчик.Модуль.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); - - Если Не СтандартнаяОбработка Тогда - Возврат Результат; - КонецЕсли; - - КонецЦикла; - // Проверка корректности переданных параметров. Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки") Или Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда @@ -63,9 +50,17 @@ ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки"); АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить()); - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + + Если ИспользуютсяПрофилиБезопасности Тогда - БезопасныйРежим = РаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Ссылка); + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Ссылка); Если БезопасныйРежим = Неопределено Тогда БезопасныйРежим = Истина; @@ -127,18 +122,10 @@ СтандартнаяОбработка = Истина; Результат = Неопределено; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриСозданииВнешнейОбработки"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриСозданииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); - - Если Не СтандартнаяОбработка Тогда - Возврат Результат; - КонецЕсли; - - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриСозданииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + Если Не СтандартнаяОбработка Тогда + Возврат Результат; + КонецЕсли; // Подключение ИмяОбработки = ПодключитьВнешнююОбработку(Ссылка); @@ -160,47 +147,6 @@ КонецФункции -// Установка параметров функциональных опций формы (требуется для формирования -// командного интерфейса формы). -// -// Параметры: -// Форма - УправляемаяФорма -// ТипФормы - Строка - Необязательный. "ФормаСписка" для форм списков и "ФормаОбъекта" для форм элементов. -// См. также функции ТипФормыСписка() и ТипФормыОбъекта() общего модуля -// ДополнительныеОтчетыИОбработкиКлиентСервер. -// -Процедура ПриСозданииНаСервере(Форма, ТипФормы = Неопределено) Экспорт - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - ПараметрыФункциональныхОпций = Новый Структура; - ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); - ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиТипФормы", Неопределено); - Форма.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФункциональныхОпций); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Форма.Элементы, - "ФормаОбщаяКомандаЗаполнениеОбъекта", - "Видимость", - Ложь); - Возврат; - КонецЕсли; - - // Установка параметров формы для команд вызова дополнительных отчетов и обработок. - Параметры = ДополнительныеОтчетыИОбработкиПовтИсп.ПараметрыФормыНазначаемогоОбъекта(Форма.ИмяФормы, ТипФормы); - Если ТипЗнч(Параметры) <> Тип("ФиксированнаяСтруктура") Тогда - Возврат; - КонецЕсли; - - ПараметрыФункциональныхОпций = Новый Структура; - ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", Параметры.СсылкаРодителя); - ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиТипФормы", ?(ТипФормы = Неопределено, Параметры.ТипФормы, ТипФормы)); - - Форма.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФункциональныхОпций); - - Если Параметры.ВыводитьПодменюЗаполнениеОбъекта Тогда - СформироватьПодменюКомандЗаполнения(Форма, Параметры); - КонецЕсли; - -КонецПроцедуры - // Формирует печатную форму по внешнему источнику. // // Параметры: @@ -208,109 +154,88 @@ // ПараметрыИсточника - Структура - структура со свойствами: // * ИдентификаторКоманды - Строка - список макетов, перечисленных через запятую. // * ОбъектыНазначения - Массив -// КоллекцияПечатныхФорм - ТаблицаЗначений - см. описание процедуры Печать() в документации. -// ОбъектыПечати - СписокЗначений - см. описание процедуры Печать() в документации. -// ПараметрыВывода - Структура - см. описание процедуры Печать() в документации. +// КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (возвращаемый параметр). +// ОбъектыПечати - СписокЗначений - соответствие между объектами и именами областей печати +// табличного документа. Значение - Объект, представление - имя области, +// в которой был выведен объект (возвращаемый параметр). +// ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов +// (возвращаемый параметр). // Процедура ПечатьПоВнешнемуИсточнику(ДополнительнаяОбработкаСсылка, ПараметрыИсточника, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПечатьПоВнешнемуИсточнику( + ДополнительнаяОбработкаСсылка, + ПараметрыИсточника, + КоллекцияПечатныхФорм, + ОбъектыПечати, + ПараметрыВывода); КонецЕсли; - ВнешняяОбработкаОбъект = ОбъектВнешнейОбработки(ДополнительнаяОбработкаСсылка); - Если ВнешняяОбработкаОбъект = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Внешняя обработка ""%1"" (тип ""%2"") не обслуживается подсистемой ""%3""'"), - Строка(ДополнительнаяОбработкаСсылка), - Строка(ТипЗнч(ДополнительнаяОбработкаСсылка)), - ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы(Истина)); - КонецЕсли; - - КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ПараметрыИсточника.ИдентификаторКоманды); - ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода(); - ПараметрыВывода.Вставить("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); - - ВнешняяОбработкаОбъект.Печать( - ПараметрыИсточника.ОбъектыНазначения, - КоллекцияПечатныхФорм, - ОбъектыПечати, - ПараметрыВывода); - - // Проверим, все ли макеты были сформированы. - Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл - Если ПечатнаяФорма.ТабличныйДокумент = Неопределено Тогда - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В обработчике печати не был сформирован табличный документ для: %1'"), - ПечатнаяФорма.ИмяМакета); - ВызватьИсключение(ТекстСообщенияОбОшибке); - КонецЕсли; - - ПечатнаяФорма.ТабличныйДокумент.КоличествоЭкземпляров = ПечатнаяФорма.Экземпляров; - КонецЦикла; - КонецПроцедуры // Формирует шаблон сведений о внешнем отчете или обработке для последующего заполнения. // // Параметры: -// ВерсияБСП - Строка - Версия библиотеки стандартных подсистем, на которую рассчитывают механизмы внешнего объекта. -// См. также СтандартныеПодсистемыСервер.ВерсияБиблиотеки(). +// ВерсияБСП - Строка - версия Библиотеки стандартных подсистем, на которую рассчитывают механизмы внешней обработки +// или отчета. См. СтандартныеПодсистемыСервер.ВерсияБиблиотеки. // // Возвращаемое значение: -// ПараметрыРегистрации - Структура - Параметры внешнего объекта. -// -// * Вид - Строка - Вид внешнего объекта. -// Для определения вида рекомендуется использовать функции +// Структура - параметры внешнего отчета или обработки: +// * Вид - Строка - Вид внешнего отчета или обработки. Для указания вида рекомендуется использовать функции // ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<ИмяВида>. -// Также Вид можно указать явно: -// ** "ПечатнаяФорма" -// ** "ЗаполнениеОбъекта" -// ** "СозданиеСвязанныхОбъектов" -// ** "Отчет" -// ** "ДополнительнаяОбработка" -// ** "ДополнительныйОтчет" -// ** "ШаблонСообщения". +// Также вид можно указать явно: +// "ПечатнаяФорма", +// "ЗаполнениеОбъекта", +// "СозданиеСвязанныхОбъектов", +// "Отчет", +// "ШаблонСообщения", +// "ДополнительнаяОбработка" или +// "ДополнительныйОтчет". // -// * Версия - Строка - Версия объекта. +// * Версия - Строка - Версия отчета или обработки (далее - обработки). // Задается в формате: "<Старший номер>.<Младший номер>". // -// * Назначение - Массив - Необязательный. -// Объекты конфигурации, для которых предназначен этот объект. -// ** Строка - Полное имя объекта метаданных. +// * Назначение - Массив - Полные имена объектов конфигурации (Строка), для которых предназначен эта обработка. +// Необязательное свойство. // -// * Наименование - Строка - Необязательный. Представление для администратора (наименование элемента справочника). -// Если не заполнено, то берется представление объекта метаданных внешнего объекта. +// * Наименование - Строка - Представление для администратора (наименование элемента справочника). +// Если не заполнено, то берется представление объекта метаданных внешней обработки. +// Необязательное свойство. // -// * БезопасныйРежим - Булево - Необязательный. Признак подключения внешней обработки в безопасном режиме. -// Значение по умолчанию Истина (обработка будет выполняться безопасно). -// В безопасном режиме: -// Игнорируется привилегированный режим. -// Запрещены внешние по отношению к платформе 1С:Предприятия действия: -// COM; -// Загрузка внешних компонентов; -// Запуск внешних приложений и команд операционной системы; -// Доступ к файловой системе, кроме временных файлов; -// Доступ к Интернету. +// * БезопасныйРежим - Булево - Признак подключения внешней обработки в безопасном режиме. +// Значение по умолчанию Истина (обработка будет выполняться безопасно). +// В безопасном режиме: +// Игнорируется привилегированный режим. +// Запрещены внешние по отношению к платформе 1С:Предприятия действия: +// COM; +// Загрузка внешних компонентов; +// Запуск внешних приложений и команд операционной системы; +// Доступ к файловой системе, кроме временных файлов; +// Доступ к Интернету. +// Необязательное свойство. // -// * Разрешения - Массив - Необязательный. -// Дополнительные разрешения, необходимые внешней обработке при работе в безопасном режиме. -// ** ОбъектXDTO {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}PermissionBase - Разрешение. -// Для формирования описания разрешения рекомендуется использовать функции -// РаботаВБезопасномРежиме.Разрешение<ВидРазрешения>(<ПараметрыРазрешения>). +// * Разрешения - Массив - Дополнительные разрешения, необходимые внешней обработке при работе в безопасном режиме. +// Элемент массива - ОбъектXDTO - разрешение типа +// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}PermissionBase. +// Для формирования описания разрешения рекомендуется использовать функции +// РаботаВБезопасномРежиме.Разрешение<ВидРазрешения>(<ПараметрыРазрешения>). +// Необязательное свойство. // -// * Информация - Строка - Необязательный. Краткая информация по внешнему объекту. -// В этом параметре для администратора рекомендуется указать описание возможностей внешнего объекта. -// Если не заполнено, то берется комментарий объекта метаданных внешнего объекта. +// * Информация - Строка - Краткая информация о внешней обработке. +// В этом параметре для администратора рекомендуется дать описание ее возможностей. +// Если не заполнено, то берется комментарий объекта метаданных внешней обработки. // -// * ВерсияБСП - Строка - Необязательный. Версия библиотеки, на которую рассчитывают механизмы внешнего объекта. -// Подробнее - см. СтандартныеПодсистемыСервер.ВерсияБиблиотеки(). +// * ВерсияБСП - Строка - Необязательный. Версия библиотеки, на которую рассчитывают механизмы внешней обработки. +// См. СтандартныеПодсистемыСервер.ВерсияБиблиотеки. +// Необязательное свойство. // -// * ОпределитьНастройкиФормы - Булево - Необязательный. -// Флажок тесной интеграции дополнительного отчета с общей формой отчета. -// Позволяет переопределять некоторые настройки формы и подписываться на ее события. -// Если Истина, тогда в модуле объекта отчета следует определить процедуру по шаблону: +// * ОпределитьНастройкиФормы - Булево - только для дополнительных отчетов, подключенных к общей форме ФормаОтчета. +// Позволяет переопределять некоторые настройки общей формы отчета и +// подписываться на ее события. +// Если Истина, то в модуле объекта отчета следует определить процедуру по шаблону: // // // Настройки общей формы отчета подсистемы "Варианты отчетов". // // @@ -327,19 +252,15 @@ // // Код процедуры. // КонецПроцедуры // -// Внимание. Этот флажок работает только для дополнительных отчетов, подключенных к общей форме ФормаОтчета. // Подробнее см. в документации к подсистемам "Дополнительные отчеты и обработки" и "Варианты отчетов". +// Необязательное свойство. // -// * Команды - ТаблицаЗначений - Необязательный для отчетов. Настройки команд, поставляемых внешним объектом. -// -// ** Идентификатор - Строка - Внутреннее имя команды. -// Для внешних печатных форм (когда Вид = "ПечатнаяФорма"): +// * Команды - ТаблицаЗначений - Настройки команд, поставляемых внешней обработкой (необязательно для отчетов): +// ** Идентификатор - Строка - Внутреннее имя команды. Для внешних печатных форм (когда Вид = "ПечатнаяФорма"): // Идентификатор может содержать имена одной или нескольких команд печати, // разделенных запятыми. Подробнее см. описание колонки Идентификатор // в функции СоздатьКоллекциюКомандПечати() общего модуля УправлениеПечатью. -// // ** Представление - Строка - Пользовательское представление команды. -// // ** Использование - Строка - Тип команды: // "ВызовКлиентскогоМетода", // "ВызовСерверногоМетода", @@ -347,20 +268,17 @@ // "ОткрытиеФормы" или // "СценарийВБезопасномРежиме". // Для получения типов команд рекомендуется использовать функции -// ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКоманды<ИмяТипа>(). -// В комментариям к этим функциям также даны шаблоны процедур-обработчиков команд. -// +// ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКоманды<ИмяТипа>. +// В комментариях к этим функциям также даны шаблоны процедур-обработчиков команд. // ** ПоказыватьОповещение - Булево - если Истина, то при запуске команды выводится оповещение "Команда выполняется...". // Действует для всех типов команд, кроме команд по открытию формы (Использование = "ОткрытиеФормы"). -// // ** Модификатор - Строка - Дополнительная классификация команды. // Для внешних печатных форм (когда Вид = "ПечатнаяФорма"): -// *** "ПечатьMXL" - для печатных форм на основе табличных макетов. +// "ПечатьMXL" - для печатных форм на основе табличных макетов. // Для загрузки данных из файла (когда Вид = "ПечатнаяФорма" и Использование = "ЗагрузкаДанныхИзФайла"): // Модификатор является обязательным для заполнения // и должен содержать полное имя объекта метаданных (справочника), // для которого выполняется загрузка данных. -// // ** Скрыть - Булево - Необязательный. Признак того, что это служебная команда. // Если установить в значение Истина, то команда скрывается в карточке дополнительного объекта. // @@ -393,33 +311,6 @@ Возврат ПараметрыРегистрации; КонецФункции -// Выполняет назначаемую команду контекстно из формы объекта назначения. -// Предназначена для вызова кодом этой подсистемы из формы элемента назначаемого объекта -// (например, справочника или документа). -// -// Важно: проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" -// должна выполняться вызывающим кодом. -// -// Параметры: -// Форма - УправляемаяФорма - Форма, из которой вызвана команда. -// ИмяЭлемента - Строка - Имя команды формы, которая была нажата. -// РезультатВыполнения - Структура - для служебного использования. -// -Процедура ВыполнитьНазначаемуюКомандуНаСервере(Форма, ИмяЭлемента, РезультатВыполнения = Неопределено) Экспорт - - ОписаниеКоманды = ОписаниеКомандыОбработки(ИмяЭлемента, - Форма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище").Действие); - - ВнешнийОбъект = ОбъектВнешнейОбработки(ОписаниеКоманды.Ссылка); - ИдентификаторКоманды = ОписаниеКоманды.Идентификатор; - - ПараметрыКоманды = Новый Структура; - ПараметрыКоманды.Вставить("ЭтаФорма", Форма); - - РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, Неопределено); - -КонецПроцедуры - // Выполняет команду обработки и возвращает результат ее выполнения. // // Важно: проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" @@ -435,8 +326,8 @@ // выполнения. // // Возвращаемое значение: -// * Структура - Результат выполнения, который далее передается на клиент. -// * Неопределено - Если был передан АдресРезультата. +// Структура - Результат выполнения, который далее передается на клиент. +// Неопределено - Если был передан АдресРезультата. // Функция ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата = Неопределено) Экспорт @@ -479,7 +370,8 @@ // Формирует список разделов, в которых доступна команда вызова дополнительных отчетов. // // Возвращаемое значение: -// Массив - массив объектов метаданных Подсистема - метаданные разделов, в которые выведен список команд дополнительных отчетов. +// Массив - массив объектов метаданных Подсистема - метаданные разделов, в которые выведен список команд +// дополнительных отчетов. // Функция РазделыДополнительныхОтчетов() Экспорт РазделыМетаданные = Новый Массив; @@ -513,52 +405,6 @@ Возврат РазделыМетаданные; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Процедуры используемые при обмене данными. - -// Переопределяет стандартное поведение при загрузке данных. -// Реквизит РегламентноеЗаданиеGUID табличной части Команды не переносится, -// т.к. связан с регламентным заданием текущей базы. -// -Процедура ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента) Экспорт - - Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ДополнительныеОтчетыИОбработки") - И ЭлементДанных.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда - - // Таблица уникальных идентификаторов регламентных заданий. - ТекстЗапроса = - "ВЫБРАТЬ - | Команды.Ссылка КАК Ссылка, - | Команды.Идентификатор КАК Идентификатор, - | Команды.РегламентноеЗаданиеGUID КАК РегламентноеЗаданиеGUID - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Команды КАК Команды - |ГДЕ - | Команды.Ссылка = &Ссылка"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.Параметры.Вставить("Ссылка", ЭлементДанных.Ссылка); - - ИдентификаторыРегламентныхЗаданий = Запрос.Выполнить().Выгрузить(); - - // Заполнение идентификаторов регламентных заданий в таблице команд из данных текущей БД. - Для Каждого СтрокаКоманда Из ЭлементДанных.Команды Цикл - Найденные = ИдентификаторыРегламентныхЗаданий.НайтиСтроки(Новый Структура("Идентификатор", СтрокаКоманда.Идентификатор)); - Если Найденные.Количество() = 0 Тогда - СтрокаКоманда.РегламентноеЗаданиеGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - Иначе - СтрокаКоманда.РегламентноеЗаданиеGUID = Найденные[0].РегламентноеЗаданиеGUID; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - #Область УстаревшиеПроцедурыИФункции // Устарела. Следует использовать ОбъектВнешнейОбработки. @@ -580,222 +426,454 @@ КонецФункции +// Устарела. Следует использовать ПодключаемыеКоманды.ПриСозданииНаСервере. +// +// Параметры: +// Форма - УправляемаяФорма - Форма. +// ТипФормы - Строка - Тип формы. +// +Процедура ПриСозданииНаСервере(Форма, ТипФормы = Неопределено) Экспорт + Возврат; +КонецПроцедуры + +// Устарела. Следует использовать ПодключаемыеКоманды.ВыполнитьКоманду. +// +// Выполняет назначаемую команду контекстно из формы объекта назначения. +// Предназначена для вызова кодом этой подсистемы из формы элемента назначаемого объекта +// (например, справочника или документа). +// +// Важно: проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" +// должна выполняться вызывающим кодом. +// +// Параметры: +// Форма - УправляемаяФорма - Форма, из которой вызвана команда. +// ИмяЭлемента - Строка - Имя команды формы, которая была нажата. +// РезультатВыполнения - Структура - для служебного использования. +// +Процедура ВыполнитьНазначаемуюКомандуНаСервере(Форма, ИмяЭлемента, РезультатВыполнения = Неопределено) Экспорт + + Возврат; + +КонецПроцедуры + #КонецОбласти #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// Объявляет служебные события подсистемы ДополнительныеОтчетыИОбработки: -// -// Серверные события: -// ПриОбновленииПроизводственныхКалендарей. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается при определении наличия у текущего пользователя права на добавление дополнительного - // отчета или обработки в область данных. - // - // Параметры: - // ДополнительнаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки, элемент справочника, - // который записывается пользователем. - // Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия права, - // СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения - // стандартной обработки проверки права. - // - // Синтаксис: - // Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеПраваДобавления"); - - // Вызывается при проверке возможности загрузки дополнительного отчета или обработки из файла. - // - // Параметры: - // ДополнительнаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, - // Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия возможности - // загрузки дополнительного отчета или обработки из файла, - // СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения - // стандартной обработки проверки возможности загрузки дополнительного отчета или обработки из файла. - // - // Синтаксис: - // Процедура ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла"); - - // Вызывается при проверке возможности выгрузки дополнительного отчета или обработки в файл. - // - // Параметры: - // ДополнительнаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, - // Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия возможности - // выгрузки дополнительного отчета или обработки в файл, - // СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения - // стандартной обработки проверки возможности выгрузки дополнительного отчета или обработки в файл. - // - // Синтаксис: - // Процедура ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеВозможностиВыгрузкиОбработкиВФайл"); - - // Вызывается при проверке необходимости отображения расширенной информации о дополнительных - // отчетах и обработках в пользовательском интерфейсе. - // - // Параметры: - // ДополнительнаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, - // Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия необходимости - // отображения расширенной информации о дополнительных отчетах и обработках в пользовательском - // интерфейсе. - // СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения - // стандартной обработки проверки наличия необходимости отображения расширенной информации о - // дополнительных отчетах и обработках в пользовательском интерфейсе. - // - // Синтаксис: - // Процедура ПриПроверкеНеобходимостиОтображенияРасширеннойИнформации(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеНеобходимостиОтображенияРасширеннойИнформации"); - - // Заполняет виды публикации дополнительных отчетов и обработок, недоступные для использования - // в текущей модели информационной базы. - // - // Параметры: - // НедоступныеВидыПубликации - Массив строк. - // - // Синтаксис: - // Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриЗаполненииНедоступныхВидовПубликации"); - - // Вызывается из события ПередЗаписью справочника. - // ДополнительныеОтчетыИОбработки, выполняет проверку правомерности изменения реквизитов - // элементов данного справочника для дополнительных обработок, полученных из - // каталога дополнительных обработок менеджера сервиса. - // - // Параметры: - // Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, - // Отказ - булево, флаг отказа от выполнения записи элемента справочника. - // - // Синтаксис: - // Процедура ПередЗаписьюДополнительнойОбработки(Знач Источник, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПередЗаписьюДополнительнойОбработки"); - - // Вызывается из события ПередУдалением справочника. - // ДополнительныеОтчетыИОбработки. - // - // Параметры: - // Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, - // Отказ - булево, флаг отказа от выполнения удаления элемента справочника из информационной базы. - // - // Синтаксис: - // Процедура ПередУдалениемДополнительнойОбработки(Знач Источник, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПередУдалениемДополнительнойОбработки"); - - // Вызывается при получении регистрационных данных для нового дополнительного отчета или обработки. - // - // Параметры: - // Объект - СправочникОбъект.ДополнительныеОтчетыИОбработки - Объект дополнительной обработки. - // РегистрационныеДанные - Структура - См. описание функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(). - // СтандартнаяОбработка - Булево - Признак продолжения стандартной обработки этого события. - // - // Синтаксис: - // Процедура ПриПолученииРегистрационныхДанных(Знач Объект, РегистрационныеДанные, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПолученииРегистрационныхДанных"); - - // Вызывается при подключении внешней обработки. - // - // Параметры: - // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки, - // СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки подключения - // внешней обработки, - // Результат - Строка - имя подключенного внешнего отчета или обработки (в том случае, если в обработчике - // для параметра СтандартнаяОбработка было установлено значение Ложь). - // - // Синтаксис: - // Процедура ПриПодключенииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПодключенииВнешнейОбработки"); - - // Вызывается при создании объекта внешней обработки. - // - // Параметры: - // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки, - // СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки подключения - // внешней обработки, - // Результат - ВнешняяОбработкаОбъект, ВнешнийОтчетОбъект - объект подключенного внешнего отчета или - // обработки (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). - // - // Синтаксис: - // Процедура ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриСозданииВнешнейОбработки"); - - // Вызывается при получении разрешений сессии безопасного режима. - // - // Параметры: - // КлючСессии - УникальныйИдентификатор, - // ОписанияРазрешений - ТаблицаЗначений: - // * ВидРазрешения - Строка, - // * Параметры - ХранилищеЗначения, - // СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки. - // - // Синтаксис: - // Процедура ПриПолученииРазрешенийСессииБезопасногоРежима(Знач КлючСессии, ОписанияРазрешений, СтандартнаяОбработка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПолученииРазрешенийСессииБезопасногоРежима"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныйМодуль = "ДополнительныеОтчетыИОбработки"; - - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - Событие = "СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - Событие = "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. +// Определяет список объектов метаданных, к которым может быть применена назначаемая обработка переданного вида. // // Параметры: -// Обработчики - ТаблицаЗначений - См. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). +// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид внешней обработки. // +// Возвращаемое значение: +// ТаблицаЗначений - Описание объектов метаданных. +// * Метаданные - ОбъектМетаданных - Объект метаданных, подключенный к данному виду. +// * ПолноеИмя - Строка - Полное имя объекта метаданных, например "Справочник.Валюты". +// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта метаданных. +// * Вид - Строка - Вид объекта метаданных. +// * Представление - Строка - Представление объекта метаданных. +// * ПолноеПредставление - Строка - Представление имени и вида объекта метаданных. +// Неопределено - Если передан некорректный Вид. +// +Функция ПодключенныеОбъектыМетаданных(Вид) Экспорт + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Метаданные"); + Результат.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных, СправочникСсылка.ИдентификаторыОбъектовРасширений")); + Результат.Колонки.Добавить("Вид", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("ПолноеПредставление", Новый ОписаниеТипов("Строка")); + + Результат.Индексы.Добавить("Ссылка"); + Результат.Индексы.Добавить("Вид"); + Результат.Индексы.Добавить("ПолноеИмя"); + + МассивТиповИлиМетаданных = Новый Массив; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта + Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда + + МассивТиповИлиМетаданных = Метаданные.ОпределяемыеТипы.ОбъектСДополнительнымиКомандами.Тип.Типы(); + + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ШаблонСообщения Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда + МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); + МассивТиповИлиМетаданных = МодульШаблоныСообщенийСлужебный.ИсточникиШаблоновСообщений() + Иначе + Возврат Результат; + КонецЕсли; + + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МассивТиповИлиМетаданных = МодульУправлениеПечатью.ИсточникиКомандПечати() + Иначе + Возврат Результат; + КонецЕсли; + + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + + МассивТиповИлиМетаданных = РазделыДополнительныхОбработок(); + + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + + МассивТиповИлиМетаданных = РазделыДополнительныхОтчетов(); + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + Для Каждого ТипИлиМетаданные Из МассивТиповИлиМетаданных Цикл + Если ТипЗнч(ТипИлиМетаданные) = Тип("Тип") Тогда + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипИлиМетаданные); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + Иначе + ОбъектМетаданных = ТипИлиМетаданные; + КонецЕсли; + + СтрокаТаблицы = Результат.Добавить(); + СтрокаТаблицы.Метаданные = ОбъектМетаданных; + + Если ОбъектМетаданных = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() Тогда + СтрокаТаблицы.ПолноеИмя = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); + СтрокаТаблицы.Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); + СтрокаТаблицы.Вид = "Подсистема"; + СтрокаТаблицы.Представление = НСтр("ru = 'Рабочий стол'"); + Иначе + СтрокаТаблицы.ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + СтрокаТаблицы.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); + СтрокаТаблицы.Вид = Лев(СтрокаТаблицы.ПолноеИмя, СтрНайти(СтрокаТаблицы.ПолноеИмя, ".") - 1); + СтрокаТаблицы.Представление = ОбъектМетаданных.Представление(); + КонецЕсли; + + СтрокаТаблицы.ПолноеПредставление = СтрокаТаблицы.Представление + " (" + СтрокаТаблицы.Вид + ")"; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Формирует запрос для получения таблицы команд дополнительных отчетов или обработок. +// +// Параметры: +// ВидОбработок - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид обработки. +// Размещение - СправочникСсылка.ИдентификаторыОбъектовМетаданных, Строка - Ссылка или полное имя объекта метаданных, +// к которому привязаны искомые дополнительные отчеты и обработки. +// Глобальные обработки размещаются в разделах, контекстные - в справочниках и документах. +// ЭтоФормаОбъекта - Булево - Необязательный. +// Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. +// Истина - только отчеты и обработки, привязанные к формам объектов. +// Ложь - только отчеты и обработки, привязанные к формам списков. +// ТипыКоманд - ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок - Тип получаемых команд. +// - Массив - Типы команд, которые необходимо получить. +// * ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок +// ТолькоВключенные - Булево - Необязательный. +// Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. +// Истина - только отчеты и обработки, привязанные к формам объектов. +// Ложь - только отчеты и обработки, привязанные к формам списков. +// +// Возвращаемое значение: +// ТаблицаЗначений - Команды дополнительных отчетов или обработок. +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка дополнительного отчета или обработки. +// * Идентификатор - Строка - Идентификатор команды, как он задан разработчиком дополнительного объекта. +// * ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок - +// Способ вызова команды дополнительного объекта. +// * Представление - Строка - Наименование команды в пользовательском интерфейсе. +// * ПоказыватьОповещение - Булево - Показывать оповещение пользователю после выполнения команды. +// * Модификатор - Строка - Модификатор команды. +// +Функция НовыйЗапросПоДоступнымКомандам(ВидОбработок, Размещение, ЭтоФормаОбъекта = Неопределено, ТипыКоманд = Неопределено, ТолькоВключенные = Истина) Экспорт + Запрос = Новый Запрос; + + Если ТипЗнч(Размещение) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + СсылкаРодителяИлиРаздела = Размещение; + Иначе + Если ЗначениеЗаполнено(Размещение) Тогда + СсылкаРодителяИлиРаздела = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(Размещение); + Иначе + СсылкаРодителяИлиРаздела = Неопределено; + КонецЕсли; + КонецЕсли; + + Если СсылкаРодителяИлиРаздела <> Неопределено Тогда // Есть фильтр по родителю. + ЭтоГлобальныеОбработки = ( + ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет + Или ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка); + + // Запросы принципиально отличаются для глобальных обработок и назначаемых. + Если ЭтоГлобальныеОбработки Тогда + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ДопОтчетыИОбработки.Ссылка + |ПОМЕСТИТЬ втСсылки + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ТаблицаРазделы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки + | ПО (ТаблицаРазделы.Раздел = &СсылкаРаздела) + | И ТаблицаРазделы.Ссылка = ДопОтчетыИОбработки.Ссылка + |ГДЕ + | ДопОтчетыИОбработки.Вид = &Вид + | И НЕ ДопОтчетыИОбработки.ПометкаУдаления + | И ДопОтчетыИОбработки.Публикация = &Публикация + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ТаблицаКоманды.Ссылка, + | ТаблицаКоманды.Идентификатор, + | ТаблицаКоманды.ЗаменяемыеКоманды, + | ТаблицаКоманды.ВариантЗапуска, + | ТаблицаКоманды.Представление, + | ТаблицаКоманды.ПоказыватьОповещение, + | ТаблицаКоманды.Модификатор, + | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ) КАК Использование + |ПОМЕСТИТЬ ИтоговаяТаблица + |ИЗ + | втСсылки КАК ТаблицаСсылки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды + | ПО ТаблицаСсылки.Ссылка = ТаблицаКоманды.Ссылка + | И (ТаблицаКоманды.Скрыть = ЛОЖЬ) + | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд)) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК БыстрыйДоступ + | ПО (ТаблицаКоманды.Ссылка = БыстрыйДоступ.ДополнительныйОтчетИлиОбработка) + | И (ТаблицаКоманды.Идентификатор = БыстрыйДоступ.ИдентификаторКоманды) + | И (БыстрыйДоступ.Пользователь = &ТекущийПользователь) + |ГДЕ + | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ)"; + Запрос.УстановитьПараметр("СсылкаРаздела", СсылкаРодителяИлиРаздела); + + Если Не ТолькоВключенные Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, + "ГДЕ + | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ)", + ""); + КонецЕсли; + + Иначе + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ТаблицаНазначение.Ссылка + |ПОМЕСТИТЬ втСсылки + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК ТаблицаНазначение + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки + | ПО (ТаблицаНазначение.ОбъектНазначения = &СсылкаРодителя) + | И ТаблицаНазначение.Ссылка = ДопОтчетыИОбработки.Ссылка + | И (ДопОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ) + | И (ДопОтчетыИОбработки.Вид = &Вид) + | И (ДопОтчетыИОбработки.Публикация = &Публикация) + | И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА) + | И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ТаблицаКоманды.Ссылка, + | ТаблицаКоманды.Идентификатор, + | ТаблицаКоманды.ЗаменяемыеКоманды, + | ТаблицаКоманды.ВариантЗапуска, + | ТаблицаКоманды.Представление, + | ТаблицаКоманды.ПоказыватьОповещение, + | ТаблицаКоманды.Модификатор, + | НЕОПРЕДЕЛЕНО КАК Использование + |ПОМЕСТИТЬ ИтоговаяТаблица + |ИЗ + | втСсылки КАК ТаблицаСсылки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды + | ПО ТаблицаСсылки.Ссылка = ТаблицаКоманды.Ссылка + | И (ТаблицаКоманды.Скрыть = ЛОЖЬ) + | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд))"; + + Запрос.УстановитьПараметр("СсылкаРодителя", СсылкаРодителяИлиРаздела); + + КонецЕсли; + + Иначе + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ТаблицаКоманды.Ссылка, + | ТаблицаКоманды.Идентификатор, + | ТаблицаКоманды.ЗаменяемыеКоманды, + | ТаблицаКоманды.ВариантЗапуска, + | ТаблицаКоманды.Представление КАК Представление, + | ТаблицаКоманды.ПоказыватьОповещение, + | ТаблицаКоманды.Модификатор, + | НЕОПРЕДЕЛЕНО КАК Использование + |ПОМЕСТИТЬ ИтоговаяТаблица + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки + | ПО ТаблицаКоманды.Ссылка = ДопОтчетыИОбработки.Ссылка + | И (ДопОтчетыИОбработки.Вид = &Вид) + | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд)) + | И (ДопОтчетыИОбработки.Публикация = &Публикация) + | И (ДопОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ) + | И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА) + | И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА) + | И (ТаблицаКоманды.Скрыть = ЛОЖЬ)"; + + КонецЕсли; + + // Отключение отборов по форме списка и объекта. + Если ЭтоФормаОбъекта <> Истина Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА)", ""); + КонецЕсли; + Если ЭтоФормаОбъекта <> Ложь Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА)", ""); + КонецЕсли; + + Если ТипыКоманд = Неопределено Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд))", ""); + Иначе + Запрос.УстановитьПараметр("ТипыКоманд", ТипыКоманд); + КонецЕсли; + + Запрос.УстановитьПараметр("Вид", ВидОбработок); + Если Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок") Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Публикация = &Публикация", "Публикация <> &Публикация"); + Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); + Иначе + Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется); + КонецЕсли; + Запрос.УстановитьПараметр("ТекущийПользователь", ПользователиКлиентСервер.АвторизованныйПользователь()); + Запрос.Текст = ТекстЗапроса; + + Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса() Тогда + АдаптироватьЗапросПоДоступнымКомандамКМоделиСервиса(Запрос); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПОМЕСТИТЬ ИтоговаяТаблица", ""); + Запрос.Текст = Запрос.Текст + " + | + |УПОРЯДОЧИТЬ ПО + | Представление"; + КонецЕсли; + + Возврат Запрос; +КонецФункции + +// Обработчик подключенной команды заполнения. +// +// Параметры +// МассивСсылок - Массив - Массив ссылок выбранных объектов, для которых выполняется команда. +// ПараметрыВыполнения - Структура - Контекст команды. +// * ОписаниеКоманды - Структура - Сведения о выполняемой команде. +// ** Идентификатор - Строка - Идентификатор команды. +// ** Представление - Строка - Представление команды в форме. +// ** Имя - Строка - Имя команды в форме. +// * Форма - УправляемаяФорма - Форма, из которой была вызвана команда. +// * Источник - ДанныеФормыСтруктура, ТаблицаФормы - Объект или список формы с полем "Ссылка". +// +Процедура ОбработчикКомандыЗаполнения(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт + ВыполняемаяКоманда = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры; + + ВнешнийОбъект = ОбъектВнешнейОбработки(ВыполняемаяКоманда.Ссылка); + + ПараметрыКоманды = Новый Структура; + ПараметрыКоманды.Вставить("ЭтаФорма", ПараметрыВыполнения.Форма); + + ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ВыполняемаяКоманда.Идентификатор, ПараметрыКоманды, Неопределено); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики подписок на события. + +// Удаление ссылок подсистем перед их удалением. +Процедура ПередУдалениемИдентификатораОбъектаМетаданных(ИОМОбъект, Отказ) Экспорт + Если ИОМОбъект.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ИОМСсылка = ИОМОбъект.Ссылка; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | РазделыОтчетовИОбработок.Ссылка + |ПОМЕСТИТЬ втСсылки + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК РазделыОтчетовИОбработок + |ГДЕ + | РазделыОтчетовИОбработок.Раздел = &ИОМСсылка + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | РазделыОтчетовИОбработок.Ссылка + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК РазделыОтчетовИОбработок + |ГДЕ + | РазделыОтчетовИОбработок.ОбъектНазначения = &ИОМСсылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | втСсылки.Ссылка + |ИЗ + | втСсылки КАК втСсылки"; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИОМСсылка", ИОМСсылка); + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СправочникОбъект = Выборка.Ссылка.ПолучитьОбъект(); + + Найденные = СправочникОбъект.Разделы.НайтиСтроки(Новый Структура("Раздел", ИОМСсылка)); + Для Каждого СтрокаТаблицы Из Найденные Цикл + СправочникОбъект.Разделы.Удалить(СтрокаТаблицы); + КонецЦикла; + + Найденные = СправочникОбъект.Назначение.НайтиСтроки(Новый Структура("ОбъектНазначения", ИОМСсылка)); + Для Каждого СтрокаТаблицы Из Найденные Цикл + СправочникОбъект.Назначение.Удалить(СтрокаТаблицы); + КонецЦикла; + + СправочникОбъект.Записать(); + КонецЦикла; +КонецПроцедуры + +// Обновляет отчеты и обработки в справочнике из общих макетов. +// +// Параметры: +// ОтчетыИОбработки - ТаблицаЗначений - Таблица отчетов и обработок в общих макетах. +// * ОбъектМетаданных - ОбъектМетаданных - Отчет или обработка из конфигурации. +// * СтарыеИменаОбъектов - Массив - Старые имена объектов для поиска старых версий этого отчета или обработки. +// ** Строка - Старое имя объекта. +// * СтарыеИменаФайлов - Массив - Старые имена файлов для поиска старых версий этого отчета или обработки. +// ** Строка - Старое имя файла. +// +Процедура ЗагрузитьДополнительныеОтчетыИОбработкиИзМетаданных(ОтчетыИОбработки) Экспорт + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда + Возврат; + КонецЕсли; + + СопоставитьОбработкиКонфигурацииСОбработкамиСправочника(ОтчетыИОбработки); + Если ОтчетыИОбработки.Количество() = 0 Тогда + Возврат; // Обновление не требуется. + КонецЕсли; + + ВыгрузитьОтчетыИОбработкиВФайлы(ОтчетыИОбработки); + Если ОтчетыИОбработки.Количество() = 0 Тогда + Возврат; // Выгрузка провалилась. + КонецЕсли; + + ЗарегистрироватьОтчетыИОбработки(ОтчетыИОбработки); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -810,7 +888,7 @@ Обработчик.Версия = "2.1.3.2"; Обработчик.Процедура = "ДополнительныеОтчетыИОбработки.ЗаменитьИменаОбъектовМетаданныхНаСсылки"; - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда Обработчик = Обработчики.Добавить(); Обработчик.ВыполнятьВГруппеОбязательных = Истина; Обработчик.ОбщиеДанные = Истина; @@ -826,13 +904,7 @@ КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -842,61 +914,33 @@ КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// См. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтакс-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// См. описание обработчика события ПриПолученииДанныхОтГлавного() в синтакс-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - // В коробке. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + Или Не ПравоДоступа("Редактирование", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) + Или Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда Возврат; КонецЕсли; - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; - КонецЕсли; - - // Есть права на данные справочника. МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Редактирование", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) - Или МодульТекущиеДелаСервер.ДелоОтключено("ДополнительныеОтчетыИОбработки") Тогда - Возврат; + Если МодульТекущиеДелаСервер.ДелоОтключено("ДополнительныеОтчетыИОбработки") Тогда + Возврат; // Дело отключено в переопределяемом модуле. КонецЕсли; - // Есть раздел "Администрирование". Подсистема = Метаданные.Подсистемы.Найти("Администрирование"); Если Подсистема = Неопределено Или Не ПравоДоступа("Просмотр", Подсистема) @@ -917,16 +961,26 @@ КонецЕсли; КонецЕсли; - КоличествоДополнительныхОтчетовИОбработок = КоличествоДополнительныхОтчетовИОбработок(); + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДополнительныеОтчетыИОбработки.Ссылка) КАК Количество + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + |ГДЕ + | ДополнительныеОтчетыИОбработки.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется) + | И ДополнительныеОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ + | И ДополнительныеОтчетыИОбработки.ЭтоГруппа = ЛОЖЬ"; + Количество = Запрос.Выполнить().Выгрузить()[0].Количество; Для Каждого Раздел Из Разделы Цикл ИдентификаторРаздела = "ПроверитьСовместимостьСТекущейВерсией" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); Дело = ТекущиеДела.Добавить(); Дело.Идентификатор = "ДополнительныеОтчетыИОбработки"; - Дело.ЕстьДела = ВывестиДело И КоличествоДополнительныхОтчетовИОбработок > 0; + Дело.ЕстьДела = ВывестиДело И Количество > 0; Дело.Представление = НСтр("ru = 'Дополнительные отчеты и обработки'"); - Дело.Количество = КоличествоДополнительныхОтчетовИОбработок; + Дело.Количество = Количество; Дело.Форма = "Справочник.ДополнительныеОтчетыИОбработки.Форма.ПроверкаДополнительныхОтчетовИОбработок"; Дело.Владелец = ИдентификаторРаздела; @@ -954,22 +1008,7 @@ КонецПроцедуры -// Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. -// -// Параметры: -// ВидыДоступа - ТаблицаЗначений - с колонками: -// * Имя - Строка - имя используемое в описании поставляемых -// профилей групп доступа и текстах ОДД. -// * Представление - Строка - представляет вид доступа в профилях и группах доступа. -// * ТипЗначений - Тип - тип ссылки значений доступа. -// Например, Тип("СправочникСсылка.Номенклатура"). -// * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. -// Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). -// * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно -// выбрать несколько групп значений (Групп доступа номенклатуры). -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); @@ -979,57 +1018,18 @@ КонецПроцедуры -// Заполняет использование видов доступа в зависимости от функциональных опций конфигурации, -// например, ИспользоватьГруппыДоступаНоменклатуры. -// -// Параметры: -// ВидДоступа - Строка - имя вида доступа заданное в процедуре ПриЗаполненииВидовДоступа. -// Использование - Булево - начальное значение Истина. -// -Процедура ПриЗаполненииИспользованияВидаДоступа(ИмяВидаДоступа, Использование) Экспорт +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа. +Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт УстановитьПривилегированныйРежим(Истина); - Если ИмяВидаДоступа = "ДополнительныеОтчетыИОбработки" Тогда + Если ВидДоступа = "ДополнительныеОтчетыИОбработки" Тогда Использование = Константы.ИспользоватьДополнительныеОтчетыИОбработки.Получить(); КонецЕсли; КонецПроцедуры -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в -// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому -// ограничивается текущий объект таблицы. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, -// которые используются для этого вида доступа. Т.е. перечислить типы, -// которые соответствуют полю, использованному в шаблоне ограничения доступа -// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" -// нужно перечислить только те типы поля, которые есть у поля. -// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -1047,8 +1047,300 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт + + // СовместноДляПользователейИВнешнихПользователей. + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ЧтениеДополнительныхОтчетовИОбработок.Имя); + +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриПолученииПрочихНастроек. +Процедура ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт + + // Получает настройки дополнительных отчетов и обработок для переданного пользователя. + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") + Или Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам) Тогда + Возврат; + КонецЕсли; + + // Название строки настроек, отображаемое в дереве настроек обработки. + НазваниеНастройки = НСтр("ru = 'Настройки быстрого доступа к дополнительным отчетам и обработкам'"); + + // Картинка строки настроек + КартинкаНастройки = ""; + + // Список дополнительных отчетов и обработок, находящихся в быстром доступе у пользователя. + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка КАК Объект, + | ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды КАК Идентификатор, + | ПользовательскиеНастройкиДоступаКОбработкам.Пользователь КАК Пользователь + |ИЗ + | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + |ГДЕ + | Пользователь = &Пользователь"; + + Запрос.Параметры.Вставить("Пользователь", СведенияОПользователе.ПользовательСсылка); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + НастройкаБыстрогоДоступа = Новый Структура; + НастройкаБыстрогоДоступа.Вставить("НазваниеНастройки", НазваниеНастройки); + НастройкаБыстрогоДоступа.Вставить("КартинкаНастройки", КартинкаНастройки); + НастройкаБыстрогоДоступа.Вставить("СписокНастроек", РезультатЗапроса); + + Настройки.Вставить("НастройкаБыстрогоДоступа", НастройкаБыстрогоДоступа); + +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриСохраненииПрочихНастроек. +Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт + + // Сохраняет команды дополнительных отчетов и обработок указанным пользователям. + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда + Возврат; + КонецЕсли; + + Если Настройки.ИдентификаторНастройки <> "НастройкаБыстрогоДоступа" Тогда + Возврат; + КонецЕсли; + + Для Каждого ЭлементСтрока Из Настройки.ЗначениеНастройки Цикл + + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; + Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; + Запись.Пользователь = СведенияОПользователе.ПользовательСсылка; + Запись.Доступно = Истина; + + Запись.Записать(Истина); + + КонецЦикла; + +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриУдаленииПрочихНастроек. +Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт + + // Очищает команды дополнительных отчетов и обработок у указанного пользователя. + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда + Возврат; + КонецЕсли; + + Если Настройки.ИдентификаторНастройки <> "НастройкаБыстрогоДоступа" Тогда + Возврат; + КонецЕсли; + + Для Каждого ЭлементСтрока Из Настройки.ЗначениеНастройки Цикл + + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; + Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; + Запись.Пользователь = СведенияОПользователе.ПользовательСсылка; + + Запись.Прочитать(); + + Запись.Удалить(); + + КонецЦикла; + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ДополнительныеОтчетыИОбработки.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + Если ВидыПодключаемыхКоманд.Найти("ЗаполнениеОбъектов", "Имя") = Неопределено Тогда + Вид = ВидыПодключаемыхКоманд.Добавить(); + Вид.Имя = "ЗаполнениеОбъектов"; + Вид.ИмяПодменю = "ПодменюЗаполнить"; + Вид.Заголовок = НСтр("ru = 'Заполнить'"); + Вид.Картинка = БиблиотекаКартинок.ЗаполнитьФорму; + Вид.Отображение = ОтображениеКнопки.Картинка; + КонецЕсли; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт + Если НастройкиФормы.ЭтоФормаОбъекта Тогда + ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыОбъекта(); + Иначе + ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыСписка(); + КонецЕсли; + УстанавливатьПараметрыФО = (Метаданные.ОбщиеКоманды.Найти("СозданиеСвязанныхОбъектов") <> Неопределено); + Если УстанавливатьПараметрыФО Тогда + НастройкиФормы.ФункциональныеОпции.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); + НастройкиФормы.ФункциональныеОпции.Вставить("ДополнительныеОтчетыИОбработкиТипФормы", ТипФормы); + КонецЕсли; + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда + Возврат; + КонецЕсли; + + ИОМы = Новый Массив; + БыстрыйПоискПоИОМам = Новый Соответствие; + Для Каждого Источник Из Источники.Строки Цикл + Для Каждого ДокументРегистратор Из Источник.Строки Цикл + ИОМы.Добавить(ДокументРегистратор.СсылкаМетаданных); + БыстрыйПоискПоИОМам.Вставить(ДокументРегистратор.СсылкаМетаданных, ДокументРегистратор); + КонецЦикла; + ИОМы.Добавить(Источник.СсылкаМетаданных); + БыстрыйПоискПоИОМам.Вставить(Источник.СсылкаМетаданных, Источник); + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Назначение.ОбъектНазначения, + | Назначение.ИспользоватьЗаполнениеОбъекта КАК ИспользоватьЗаполнениеОбъекта, + | Назначение.ИспользоватьОтчеты КАК ИспользоватьОтчеты, + | Назначение.ИспользоватьСозданиеСвязанныхОбъектов КАК ИспользоватьСозданиеСвязанныхОбъектов + |ИЗ + | РегистрСведений.НазначениеДополнительныхОбработок КАК Назначение + |ГДЕ + | Назначение.ОбъектНазначения В(&ИОМы) + | И Назначение.ТипФормы = &ТипФормы"; + Запрос.УстановитьПараметр("ИОМы", ИОМы); + Если ТипФормы = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Назначение.ТипФормы = &ТипФормы", ""); + Иначе + Запрос.УстановитьПараметр("ТипФормы", ТипФормы); + КонецЕсли; + + ТипыЗаполнениеОбъекта = Новый Массив; + ТипыОтчетов = Новый Массив; + ТипыСозданияСвязанныхОбъектов = Новый Массив; + + ТаблицаРегистра = Запрос.Выполнить().Выгрузить(); + Для Каждого СтрокаТаблицы Из ТаблицаРегистра Цикл + Источник = БыстрыйПоискПоИОМам[СтрокаТаблицы.ОбъектНазначения]; + Если Источник = Неопределено Тогда + Продолжить; + КонецЕсли; + Если СтрокаТаблицы.ИспользоватьЗаполнениеОбъекта Тогда + ПодключаемыеКоманды.ДополнитьМассивТипов(ТипыЗаполнениеОбъекта, Источник.ТипСсылкиДанных); + КонецЕсли; + Если СтрокаТаблицы.ИспользоватьОтчеты Тогда + ПодключаемыеКоманды.ДополнитьМассивТипов(ТипыОтчетов, Источник.ТипСсылкиДанных); + КонецЕсли; + Если СтрокаТаблицы.ИспользоватьСозданиеСвязанныхОбъектов Тогда + ПодключаемыеКоманды.ДополнитьМассивТипов(ТипыСозданияСвязанныхОбъектов, Источник.ТипСсылкиДанных); + КонецЕсли; + КонецЦикла; + + Если ТипыЗаполнениеОбъекта.Количество() > 0 Тогда + Команда = Команды.Добавить(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда + Команда.Вид = "ЗаполнениеОбъектов"; + Команда.Представление = НСтр("ru = 'Дополнительные обработки заполнения...'"); + Команда.Важность = "СмТакже"; + Иначе + Команда.Вид = "КоманднаяПанель"; + Команда.Представление = НСтр("ru = 'Заполнение...'"); + КонецЕсли; + Команда.ИзменяетВыбранныеОбъекты = Истина; + Команда.Порядок = 50; + Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОткрытьСписокКоманд"; + Команда.РежимЗаписи = "Записывать"; + Команда.МножественныйВыбор = Истина; + Команда.ТипПараметра = Новый ОписаниеТипов(ТипыЗаполнениеОбъекта); + Команда.ДополнительныеПараметры = Новый Структура("Вид, ЭтоОтчет", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта(), Ложь); + ИначеЕсли НастройкиФормы.ЭтоФормаОбъекта Тогда + ПриОпределенииКомандЗаполненияПодключенныхКОбъекту(Команды, ИОМы, БыстрыйПоискПоИОМам); + КонецЕсли; + + Если ТипыОтчетов.Количество() > 0 Тогда + Команда = Команды.Добавить(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + Команда.Вид = "Отчеты"; + Команда.Важность = "СмТакже"; + Команда.Представление = НСтр("ru = 'Дополнительные отчеты...'"); + Иначе + Команда.Вид = "КоманднаяПанель"; + Команда.Представление = НСтр("ru = 'Отчеты...'"); + КонецЕсли; + Команда.Порядок = 50; + Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОткрытьСписокКоманд"; + Команда.РежимЗаписи = "Записывать"; + Команда.МножественныйВыбор = Истина; + Команда.ТипПараметра = Новый ОписаниеТипов(ТипыОтчетов); + Команда.ДополнительныеПараметры = Новый Структура("Вид, ЭтоОтчет", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет(), Истина); + КонецЕсли; + + Если ТипыСозданияСвязанныхОбъектов.Количество() > 0 Тогда + Если УстанавливатьПараметрыФО И ИОМы.Количество() = 1 Тогда + НастройкиФормы.ФункциональныеОпции.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", ИОМы[0]); + Иначе + Команда = Команды.Добавить(); + Команда.Вид = ?(УстанавливатьПараметрыФО, "КоманднаяПанель", "СозданиеНаОсновании"); + Команда.Представление = НСтр("ru = 'Создание связанных объектов...'"); + Команда.Картинка = БиблиотекаКартинок.ВводНаОсновании; + Команда.Порядок = 50; + Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОткрытьСписокКоманд"; + Команда.РежимЗаписи = "Записывать"; + Команда.МножественныйВыбор = Истина; + Команда.ТипПараметра = Новый ОписаниеТипов(ТипыСозданияСвязанныхОбъектов); + Команда.ДополнительныеПараметры = Новый Структура("Вид, ЭтоОтчет", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов(), Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Добавляет отчеты подсистемы "Дополнительные отчеты и обработки", +// в модулях объектов которых есть процедура ОпределитьНастройкиФормы(). +// +// Параметры: +// ОтчетыСНастройками - Массив - Ссылки отчетов, в модулях объектов которых есть процедура ОпределитьНастройкиФормы(). +// +// Места использования: +// ВариантыОтчетовПовтИсп.Параметры(). +// +Процедура ПриОпределенииОтчетовСНастройками(ОтчетыСНастройками) Экспорт + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда + Возврат; + КонецЕсли; + Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда + Возврат; + КонецЕсли; + ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса = ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса(); + Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + КонецЕсли; + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ДополнительныеОтчетыИОбработки.Ссылка + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + |ГДЕ + | ДополнительныеОтчетыИОбработки.ИспользуетХранилищеВариантов + | И ДополнительныеОтчетыИОбработки.ТеснаяИнтеграцияСФормойОтчета + | И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления + | И ДополнительныеОтчетыИОбработки.Вид В(&ВидыОтчетов)"; + ВидыОтчетов = Новый Массив; + ВидыОтчетов.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет); + ВидыОтчетов.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); + Запрос.УстановитьПараметр("ВидыОтчетов", ВидыОтчетов); + УстановитьПривилегированныйРежим(Истина); + ДопОтчетыСНастройками = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Для Каждого Ссылка Из ДопОтчетыСНастройками Цикл + Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса + И Не МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ЭтоПоставляемаяОбработка(Ссылка) Тогда + Продолжить; + КонецЕсли; + ОтчетыСНастройками.Добавить(Ссылка); + КонецЦикла; +КонецПроцедуры // Получает ссылку дополнительного отчета, если он подключен к хранилищу подсистемы Варианты отчетов. // @@ -1066,17 +1358,17 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Таблица.Ссылка + | ДополнительныеОтчетыИОбработки.Ссылка |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК Таблица + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки |ГДЕ - | Таблица.ИмяОбъекта = &ИмяОбъекта - | И Таблица.ПометкаУдаления = ЛОЖЬ - | И Таблица.ИспользуетХранилищеВариантов = ИСТИНА - | И Таблица.Вид В (&ВидДополнительныйОтчет, &ВидОтчет) - | И Таблица.Публикация = &ПубликацияИспользуется"; + | ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта + | И ДополнительныеОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ + | И ДополнительныеОтчетыИОбработки.ИспользуетХранилищеВариантов = ИСТИНА + | И ДополнительныеОтчетыИОбработки.Вид В (&ВидДополнительныйОтчет, &ВидОтчет) + | И ДополнительныеОтчетыИОбработки.Публикация = &ПубликацияИспользуется"; Если ОтчетИнформация.ПоУмолчаниюВсеПодключеныКХранилищу Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Таблица.ИспользуетХранилищеВариантов = ИСТИНА", ""); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ДополнительныеОтчетыИОбработки.ИспользуетХранилищеВариантов = ИСТИНА", ""); КонецЕсли; Запрос.УстановитьПараметр("ИмяОбъекта", ОтчетИнформация.ОтчетИмя); Запрос.УстановитьПараметр("ВидОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); @@ -1123,13 +1415,13 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ - | Таблица.Ссылка + | ДополнительныеОтчетыИОбработки.Ссылка |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК Таблица + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки |ГДЕ - | Таблица.ИспользуетХранилищеВариантов - | И Таблица.Вид В (&ВидДополнительныйОтчет, &ВидОтчет) - | И НЕ Таблица.Ссылка В (&ДоступныеОтчеты)"; + | ДополнительныеОтчетыИОбработки.ИспользуетХранилищеВариантов + | И ДополнительныеОтчетыИОбработки.Вид В (&ВидДополнительныйОтчет, &ВидОтчет) + | И НЕ ДополнительныеОтчетыИОбработки.Ссылка В (&ДоступныеОтчеты)"; Запрос.УстановитьПараметр("ДоступныеОтчеты", ДоступныеОтчеты); Запрос.УстановитьПараметр("ВидОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); @@ -1391,521 +1683,60 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - - // СовместноДляПользователейИВнешнихПользователей. - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ЧтениеДополнительныхОтчетовИОбработок.Имя); - -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт - - // Получает настройки дополнительных отчетов и обработок для переданного пользователя. - - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; - КонецЕсли; - - // Название строки настроек, отображаемое в дереве настроек обработки. - НазваниеНастройки = НСтр("ru = 'Настройки быстрого доступа к дополнительным отчетам и обработкам'"); - - // Картинка строки настроек - КартинкаНастройки = ""; - - // Список дополнительных отчетов и обработок, находящихся в быстром доступе у пользователя. - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка КАК Объект, - | ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды КАК Идентификатор, - | ПользовательскиеНастройкиДоступаКОбработкам.Пользователь КАК Пользователь - |ИЗ - | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам - |ГДЕ - | Пользователь = &Пользователь"; - - Запрос.Параметры.Вставить("Пользователь", СведенияОПользователе.ПользовательСсылка); - - РезультатЗапроса = Запрос.Выполнить().Выгрузить(); - - НастройкаБыстрогоДоступа = Новый Структура; - НастройкаБыстрогоДоступа.Вставить("НазваниеНастройки", НазваниеНастройки); - НастройкаБыстрогоДоступа.Вставить("КартинкаНастройки", КартинкаНастройки); - НастройкаБыстрогоДоступа.Вставить("СписокНастроек", РезультатЗапроса); - - Настройки.Вставить("НастройкаБыстрогоДоступа", НастройкаБыстрогоДоступа); - -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт - - // Сохраняет команды дополнительных отчетов и обработок указанным пользователям. - - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; - КонецЕсли; - - Если Настройки.ИдентификаторНастройки <> "НастройкаБыстрогоДоступа" Тогда - Возврат; - КонецЕсли; - - Для Каждого ЭлементСтрока Из Настройки.ЗначениеНастройки Цикл - - Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); - - Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; - Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; - Запись.Пользователь = СведенияОПользователе.ПользовательСсылка; - Запись.Доступно = Истина; - - Запись.Записать(Истина); - - КонецЦикла; - -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт - - // Очищает команды дополнительных отчетов и обработок у указанного пользователя. - - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; - КонецЕсли; - - Если Настройки.ИдентификаторНастройки <> "НастройкаБыстрогоДоступа" Тогда - Возврат; - КонецЕсли; - - Для Каждого ЭлементСтрока Из Настройки.ЗначениеНастройки Цикл - - Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); - - Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; - Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; - Запись.Пользователь = СведенияОПользователе.ПользовательСсылка; - - Запись.Прочитать(); - - Запись.Удалить(); - - КонецЦикла; - -КонецПроцедуры - -// Добавляет отчеты подсистемы "Дополнительные отчеты и обработки", -// в модулях объектов которых есть процедура ОпределитьНастройкиФормы(). -// -// Параметры: -// ОтчетыСНастройками - Массив - Ссылки отчетов, в модулях объектов которых есть процедура ОпределитьНастройкиФормы(). -// -// Места использования: -// ВариантыОтчетовПовтИсп.Параметры(). -// -Процедура ПриОпределенииОтчетовСНастройками(ОтчетыСНастройками) Экспорт - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда - Возврат; - КонецЕсли; - Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда - Возврат; - КонецЕсли; - ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса = ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса(); - Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ДополнительныеОтчетыИОбработки.Ссылка - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки - |ГДЕ - | ДополнительныеОтчетыИОбработки.ИспользуетХранилищеВариантов - | И ДополнительныеОтчетыИОбработки.ТеснаяИнтеграцияСФормойОтчета - | И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления - | И ДополнительныеОтчетыИОбработки.Вид В(&ВидыОтчетов)"; - ВидыОтчетов = Новый Массив; - ВидыОтчетов.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет); - ВидыОтчетов.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); - Запрос.УстановитьПараметр("ВидыОтчетов", ВидыОтчетов); - УстановитьПривилегированныйРежим(Истина); - ДопОтчетыСНастройками = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - Для Каждого Ссылка Из ДопОтчетыСНастройками Цикл - Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса - И Не МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ЭтоПоставляемаяОбработка(Ссылка) Тогда - Продолжить; - КонецЕсли; - ОтчетыСНастройками.Добавить(Ссылка); - КонецЦикла; -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ДополнительныеОтчетыИОбработки.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -// Определяет список объектов метаданных, к которым может быть применена назначаемая обработка переданного вида. -// -// Параметры: -// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид внешней обработки. -// -// Возвращаемое значение: -// ТаблицаЗначений - Описание объектов метаданных. -// * Метаданные - ОбъектМетаданных - Объект метаданных, подключенный к данному виду. -// * ПолноеИмя - Строка - Полное имя объекта метаданных, например "Справочник.Валюты". -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта метаданных. -// * Вид - Строка - Вид объекта метаданных. -// * Представление - Строка - Представление объекта метаданных. -// * ПолноеПредставление - Строка - Представление имени и вида объекта метаданных. -// Неопределено - Если передан некорректный Вид. -// -Функция ПодключенныеОбъектыМетаданных(Вид) Экспорт - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("Метаданные"); - Результат.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных, СправочникСсылка.ИдентификаторыОбъектовРасширений")); - Результат.Колонки.Добавить("Вид", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("ПолноеПредставление", Новый ОписаниеТипов("Строка")); - - МассивТиповИлиМетаданных = Новый Массив; - - Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда - - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта.ТипПараметраКоманды.Типы(); - - ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда - - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ОтчетыОбъекта.ТипПараметраКоманды.Типы(); - - ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МассивТиповИлиМетаданных = МодульУправлениеПечатью.ИсточникиКомандПечати() - Иначе - Возврат Результат; - КонецЕсли; - - ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда - - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.СозданиеСвязанныхОбъектов.ТипПараметраКоманды.Типы(); - - ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда - - МассивТиповИлиМетаданных = РазделыДополнительныхОбработок(); - - ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда - - МассивТиповИлиМетаданных = РазделыДополнительныхОтчетов(); - - Иначе - - Возврат Неопределено; - - КонецЕсли; - - Для Каждого ТипИлиМетаданные Из МассивТиповИлиМетаданных Цикл - Если ТипЗнч(ТипИлиМетаданные) = Тип("Тип") Тогда - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипИлиМетаданные); - Если ОбъектМетаданных = Неопределено Тогда - Продолжить; - КонецЕсли; - Иначе - ОбъектМетаданных = ТипИлиМетаданные; - КонецЕсли; - - СтрокаТаблицы = Результат.Добавить(); - СтрокаТаблицы.Метаданные = ОбъектМетаданных; - - Если ОбъектМетаданных = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() Тогда - СтрокаТаблицы.ПолноеИмя = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); - СтрокаТаблицы.Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); - СтрокаТаблицы.Вид = "Подсистема"; - СтрокаТаблицы.Представление = НСтр("ru = 'Рабочий стол'"); - Иначе - СтрокаТаблицы.ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); - СтрокаТаблицы.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); - СтрокаТаблицы.Вид = Лев(СтрокаТаблицы.ПолноеИмя, СтрНайти(СтрокаТаблицы.ПолноеИмя, ".") - 1); - СтрокаТаблицы.Представление = ОбъектМетаданных.Представление(); - КонецЕсли; - - СтрокаТаблицы.ПолноеПредставление = СтрокаТаблицы.Представление + " (" + СтрокаТаблицы.Вид + ")"; - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Формирует запрос для получения таблицы команд дополнительных отчетов или обработок. -// -// Параметры: -// ВидОбработок - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид обработки. -// Размещение - СправочникСсылка.ИдентификаторыОбъектовМетаданных, Строка - Ссылка или полное имя объекта метаданных, -// к которому привязаны искомые дополнительные отчеты и обработки. -// Глобальные обработки размещаются в разделах, контекстные - в справочниках и документах. -// ЭтоФормаОбъекта - Булево - Необязательный. -// Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. -// Истина - только отчеты и обработки, привязанные к формам объектов. -// Ложь - только отчеты и обработки, привязанные к формам списков. -// ТипыКоманд - ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок - Тип получаемых команд. -// - Массив - Типы команд, которые необходимо получить. -// * ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок -// ТолькоВключенные - Булево - Необязательный. -// Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. -// Истина - только отчеты и обработки, привязанные к формам объектов. -// Ложь - только отчеты и обработки, привязанные к формам списков. -// -// Возвращаемое значение: -// ТаблицаЗначений - Команды дополнительных отчетов или обработок. -// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка дополнительного отчета или обработки. -// * Идентификатор - Строка - Идентификатор команды, как он задан разработчиком дополнительного объекта. -// * ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок - -// Способ вызова команды дополнительного объекта. -// * Представление - Строка - Наименование команды в пользовательском интерфейсе. -// * ПоказыватьОповещение - Булево - Показывать оповещение пользователю после выполнения команды. -// * Модификатор - Строка - Модификатор команды. -// -Функция НовыйЗапросПоДоступнымКомандам(ВидОбработок, Размещение, ЭтоФормаОбъекта = Неопределено, ТипыКоманд = Неопределено, ТолькоВключенные = Истина) Экспорт - Запрос = Новый Запрос; - - Если ТипЗнч(Размещение) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - СсылкаРодителяИлиРаздела = Размещение; - Иначе - Если ЗначениеЗаполнено(Размещение) Тогда - СсылкаРодителяИлиРаздела = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(Размещение); - Иначе - СсылкаРодителяИлиРаздела = Неопределено; - КонецЕсли; - КонецЕсли; - - Если СсылкаРодителяИлиРаздела <> Неопределено Тогда // Есть фильтр по родителю. - ЭтоГлобальныеОбработки = ( - ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет - Или ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка); - - // Запросы принципиально отличаются для глобальных обработок и назначаемых. - Если ЭтоГлобальныеОбработки Тогда - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ - | ДопОтчетыИОбработки.Ссылка - |ПОМЕСТИТЬ втСсылки - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ТаблицаРазделы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки - | ПО (ТаблицаРазделы.Раздел = &СсылкаРаздела) - | И ТаблицаРазделы.Ссылка = ДопОтчетыИОбработки.Ссылка - |ГДЕ - | ДопОтчетыИОбработки.Вид = &Вид - | И НЕ ДопОтчетыИОбработки.ПометкаУдаления - | И ДопОтчетыИОбработки.Публикация = &Публикация - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ТаблицаКоманды.Ссылка, - | ТаблицаКоманды.Идентификатор, - | ТаблицаКоманды.ЗаменяемыеКоманды, - | ТаблицаКоманды.ВариантЗапуска, - | ТаблицаКоманды.Представление, - | ТаблицаКоманды.ПоказыватьОповещение, - | ТаблицаКоманды.Модификатор, - | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ) КАК Использование - |ПОМЕСТИТЬ ИтоговаяТаблица - |ИЗ - | втСсылки КАК ТаблицаСсылки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды - | ПО ТаблицаСсылки.Ссылка = ТаблицаКоманды.Ссылка - | И (ТаблицаКоманды.Скрыть = ЛОЖЬ) - | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд)) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК БыстрыйДоступ - | ПО (ТаблицаКоманды.Ссылка = БыстрыйДоступ.ДополнительныйОтчетИлиОбработка) - | И (ТаблицаКоманды.Идентификатор = БыстрыйДоступ.ИдентификаторКоманды) - | И (БыстрыйДоступ.Пользователь = &ТекущийПользователь) - |ГДЕ - | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ)"; - Запрос.УстановитьПараметр("СсылкаРаздела", СсылкаРодителяИлиРаздела); - - Если Не ТолькоВключенные Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "ГДЕ - | ЕСТЬNULL(БыстрыйДоступ.Доступно, ЛОЖЬ)", - ""); - КонецЕсли; - - Иначе - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ - | ТаблицаНазначение.Ссылка - |ПОМЕСТИТЬ втСсылки - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК ТаблицаНазначение - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки - | ПО (ТаблицаНазначение.ОбъектНазначения = &СсылкаРодителя) - | И ТаблицаНазначение.Ссылка = ДопОтчетыИОбработки.Ссылка - | И (ДопОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ) - | И (ДопОтчетыИОбработки.Вид = &Вид) - | И (ДопОтчетыИОбработки.Публикация = &Публикация) - | И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА) - | И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ТаблицаКоманды.Ссылка, - | ТаблицаКоманды.Идентификатор, - | ТаблицаКоманды.ЗаменяемыеКоманды, - | ТаблицаКоманды.ВариантЗапуска, - | ТаблицаКоманды.Представление, - | ТаблицаКоманды.ПоказыватьОповещение, - | ТаблицаКоманды.Модификатор, - | НЕОПРЕДЕЛЕНО КАК Использование - |ПОМЕСТИТЬ ИтоговаяТаблица - |ИЗ - | втСсылки КАК ТаблицаСсылки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды - | ПО ТаблицаСсылки.Ссылка = ТаблицаКоманды.Ссылка - | И (ТаблицаКоманды.Скрыть = ЛОЖЬ) - | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд))"; - - Запрос.УстановитьПараметр("СсылкаРодителя", СсылкаРодителяИлиРаздела); - - КонецЕсли; - - Иначе - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ТаблицаКоманды.Ссылка, - | ТаблицаКоманды.Идентификатор, - | ТаблицаКоманды.ЗаменяемыеКоманды, - | ТаблицаКоманды.ВариантЗапуска, - | ТаблицаКоманды.Представление КАК Представление, - | ТаблицаКоманды.ПоказыватьОповещение, - | ТаблицаКоманды.Модификатор, - | НЕОПРЕДЕЛЕНО КАК Использование - |ПОМЕСТИТЬ ИтоговаяТаблица - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки - | ПО ТаблицаКоманды.Ссылка = ДопОтчетыИОбработки.Ссылка - | И (ДопОтчетыИОбработки.Вид = &Вид) - | И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд)) - | И (ДопОтчетыИОбработки.Публикация = &Публикация) - | И (ДопОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ) - | И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА) - | И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА) - | И (ТаблицаКоманды.Скрыть = ЛОЖЬ)"; - - КонецЕсли; - - // Отключение отборов по форме списка и объекта. - Если ЭтоФормаОбъекта <> Истина Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ДопОтчетыИОбработки.ИспользоватьДляФормыОбъекта = ИСТИНА)", ""); - КонецЕсли; - Если ЭтоФормаОбъекта <> Ложь Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ДопОтчетыИОбработки.ИспользоватьДляФормыСписка = ИСТИНА)", ""); - КонецЕсли; - - Если ТипыКоманд = Неопределено Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И (ТаблицаКоманды.ВариантЗапуска В (&ТипыКоманд))", ""); - Иначе - Запрос.УстановитьПараметр("ТипыКоманд", ТипыКоманд); - КонецЕсли; - - Запрос.УстановитьПараметр("Вид", ВидОбработок); - Если Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок") Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Публикация = &Публикация", "Публикация <> &Публикация"); - Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); - Иначе - Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется); - КонецЕсли; - Запрос.УстановитьПараметр("ТекущийПользователь", ПользователиКлиентСервер.АвторизованныйПользователь()); - Запрос.Текст = ТекстЗапроса; - - ЗапросАдаптированКМоделиСервиса = ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса() - И АдаптироватьЗапросПоДоступнымКомандамКМоделиСервиса(Запрос); - Если Не ЗапросАдаптированКМоделиСервиса Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПОМЕСТИТЬ ИтоговаяТаблица", ""); - Запрос.Текст = Запрос.Текст + " - | - |УПОРЯДОЧИТЬ ПО - | Представление"; - КонецЕсли; - - Возврат Запрос; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// -// Обработчики подписок на события. +// Для вызова из обработчиков обновления. -// Удаление ссылок подсистем перед их удалением. -Процедура ПередУдалениемИдентификатораОбъектаМетаданных(ИОМОбъект, Отказ) Экспорт - Если ИОМОбъект.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; +// [2.0.1] Замена имен рабочих мест на ссылки разделов (справочник ИдентификаторыОбъектовМетаданных). +// +// Параметры: +// ИменаРазделовИИдентификаторы - Соответствие - +// * Ключ - Строка - Имя рабочего места (команды), которое ранее указывалось в процедурах: +// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОбработок(); +// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОтчетов(). +// * Значение - ОбъектМетаданных: Подсистема - Раздел командного интерфейса (подсистема первого уровня), +// в котором размещается данное рабочее место (команда). +// +Процедура ЗаменитьИменаРазделовНаИдентификаторы(ИменаРазделовИИдентификаторы) Экспорт + ИдентификаторРабочегоСтола = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); - ИОМСсылка = ИОМОбъект.Ссылка; + МассивИменРазделов = Новый Массив; + Для Каждого КлючИЗначение Из ИменаРазделовИИдентификаторы Цикл + Если КлючИЗначение.Значение = ИдентификаторРабочегоСтола Тогда + ИменаРазделовИИдентификаторы.Вставить(КлючИЗначение.Ключ, Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); + Иначе + ИменаРазделовИИдентификаторы.Вставить(КлючИЗначение.Ключ, ОбщегоНазначения.ИдентификаторОбъектаМетаданных(КлючИЗначение.Значение)); + КонецЕсли; + МассивИменРазделов.Добавить(КлючИЗначение.Ключ); + КонецЦикла; ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Таблица.Ссылка - |ПОМЕСТИТЬ втСсылки + | ТЧРазделы.Ссылка |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК Таблица + | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ТЧРазделы |ГДЕ - | Таблица.Раздел = &ИОМСсылка - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | Таблица.Ссылка - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК Таблица - |ГДЕ - | Таблица.ОбъектНазначения = &ИОМСсылка - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | втСсылки.Ссылка - |ИЗ - | втСсылки КАК втСсылки"; + | ТЧРазделы.УдалитьИмяРаздела В (&МассивИменРазделов)"; Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ИОМСсылка", ИОМСсылка); + Запрос.УстановитьПараметр("МассивИменРазделов", МассивИменРазделов); Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - СправочникОбъект = Выборка.Ссылка.ПолучитьОбъект(); + // Получение экземпляра объекта. + Объект = Выборка.Ссылка.ПолучитьОбъект(); - Найденные = СправочникОбъект.Разделы.НайтиСтроки(Новый Структура("Раздел", ИОМСсылка)); - Для Каждого СтрокаТаблицы Из Найденные Цикл - СправочникОбъект.Разделы.Удалить(СтрокаТаблицы); - КонецЦикла; + Для Каждого СтрокаРаздел Из Объект.Разделы Цикл + ИОМ = ИменаРазделовИИдентификаторы.Получить(СтрокаРаздел.УдалитьИмяРаздела); + Если ИОМ = Неопределено Тогда + Продолжить; + КонецЕсли; + СтрокаРаздел.Раздел = ИОМ; + СтрокаРаздел.УдалитьИмяРаздела = ""; + КонецЦикла; - Найденные = СправочникОбъект.Назначение.НайтиСтроки(Новый Структура("ОбъектНазначения", ИОМСсылка)); - Для Каждого СтрокаТаблицы Из Найденные Цикл - СправочникОбъект.Назначение.Удалить(СтрокаТаблицы); - КонецЦикла; - - СправочникОбъект.Записать(); + // Запись объекта + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); КонецЦикла; КонецПроцедуры @@ -1919,9 +1750,65 @@ // [1.0.7.1] Процедура обновления записей о доступности дополнительных обработок. Процедура ОбновитьПользовательскиеНастройкиДоступаКОбработкам() Экспорт - ПользователиСДопОбработками = ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам(); + ПользователиСДопОбработками = ПользователиСДоступомКДополнительнымОбработкам(); - ТаблицаЗаписей = ПолучитьТаблицуЗаписей(ПользователиСДопОбработками); + ТекстЗапроса = + "ВЫБРАТЬ + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, + | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок + | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + ОбработкиСКомандами = Запрос.Выполнить().Выгрузить(); + + ТаблицаЗаписей = Новый ТаблицаЗначений; + ТаблицаЗаписей.Колонки.Добавить("Обработка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")); + ТаблицаЗаписей.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + ТаблицаЗаписей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи")); + ТаблицаЗаписей.Колонки.Добавить("Доступно", Новый ОписаниеТипов("Булево")); + + Для Каждого ОбработкаКоманда Из ОбработкиСКомандами Цикл + Для Каждого Пользователь Из ПользователиСДопОбработками Цикл + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Обработка = ОбработкаКоманда.Обработка; + НоваяСтрока.Идентификатор = ОбработкаКоманда.Идентификатор; + НоваяСтрока.Пользователь = Пользователь; + НоваяСтрока.Доступно = Истина; + КонецЦикла; + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, + | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор, + | Пользователи.Ссылка КАК Пользователь, + | ПользовательскиеНастройкиДоступаКОбработкам.Доступно КАК Доступно + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок + | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + | ПО (ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка = ДополнительныеОтчетыИОбработки.Ссылка) + | И (ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды = КомандыДополнительныхОтчетовИОбработок.Идентификатор) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО (Пользователи.Ссылка = ПользовательскиеНастройкиДоступаКОбработкам.Пользователь)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + ИсключенияПерсональногоДоступа = Запрос.Выполнить().Выгрузить(); + + ПоискСтрок = Новый Структура("Обработка, Идентификатор, Пользователь"); + Для Каждого ИсключениеПерсональногоДоступа Из ИсключенияПерсональногоДоступа Цикл + ЗаполнитьЗначенияСвойств(ПоискСтрок, ИсключениеПерсональногоДоступа); + Найденные = ТаблицаЗаписей.НайтиСтроки(ПоискСтрок); + Для Каждого СтрокаТаблицы Из Найденные Цикл + СтрокаТаблицы.Доступно = НЕ ИсключениеПерсональногоДоступа.Доступно; // Инвертируем исключением доступа. + КонецЦикла; + КонецЦикла; Для Каждого Пользователь Из ПользователиСДопОбработками Цикл НаборЗаписей = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьНаборЗаписей(); @@ -2026,60 +1913,6 @@ КонецПроцедуры -// Замена имен рабочих мест на ссылки справочника ИдентификаторыОбъектовМетаданных. -// -// Параметры: -// ИменаРазделовИИдентификаторы - Соответствие - -// * Ключ - Строка - Имя рабочего места (команды), которое ранее указывалось в процедурах: -// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОбработок(); -// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОтчетов(). -// * Значение - ОбъектМетаданных: Подсистема - Раздел командного интерфейса (подсистема первого уровня), -// в котором размещается данное рабочее место (команда). -// -Процедура ЗаменитьИменаРазделовНаИдентификаторы(ИменаРазделовИИдентификаторы) Экспорт - ИдентификаторРабочегоСтола = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); - - МассивИменРазделов = Новый Массив; - Для Каждого КлючИЗначение Из ИменаРазделовИИдентификаторы Цикл - Если КлючИЗначение.Значение = ИдентификаторРабочегоСтола Тогда - ИменаРазделовИИдентификаторы.Вставить(КлючИЗначение.Ключ, Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); - Иначе - ИменаРазделовИИдентификаторы.Вставить(КлючИЗначение.Ключ, ОбщегоНазначения.ИдентификаторОбъектаМетаданных(КлючИЗначение.Значение)); - КонецЕсли; - МассивИменРазделов.Добавить(КлючИЗначение.Ключ); - КонецЦикла; - - ТекстЗапроса = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ТЧРазделы.Ссылка - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ТЧРазделы - |ГДЕ - | ТЧРазделы.УдалитьИмяРаздела В (&МассивИменРазделов)"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("МассивИменРазделов", МассивИменРазделов); - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - // Получение экземпляра объекта. - Объект = Выборка.Ссылка.ПолучитьОбъект(); - - Для Каждого СтрокаРаздел Из Объект.Разделы Цикл - ИОМ = ИменаРазделовИИдентификаторы.Получить(СтрокаРаздел.УдалитьИмяРаздела); - Если ИОМ = Неопределено Тогда - Продолжить; - КонецЕсли; - СтрокаРаздел.Раздел = ИОМ; - СтрокаРаздел.УдалитьИмяРаздела = ""; - КонецЦикла; - - // Запись объекта - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецЦикла; -КонецПроцедуры - // [2.1.3.2] Замена имен объектов назначения на ссылки справочника ИдентификаторыОбъектовМетаданных. Процедура ЗаменитьИменаОбъектовМетаданныхНаСсылки() Экспорт @@ -2125,7 +1958,7 @@ // [2.1.3.22] Включение функциональной опции ИспользоватьДополнительныеОтчетыИОбработки для локального режима. Процедура ВключитьФункциональнуюОпцию() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -2318,23 +2151,25 @@ // Возвращает имя рабочего места команды. Функция ПредставлениеРаздела(Раздел) Экспорт Если Раздел = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() - ИЛИ Раздел = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда + Или Раздел = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда Возврат НСтр("ru = 'Рабочий стол'"); - КонецЕсли; - - Если ТипЗнч(Раздел) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Раздел, "Синоним, ПометкаУдаления"); - Если Реквизиты.ПометкаУдаления Тогда - Возврат Неопределено; - КонецЕсли; - ПредставлениеРаздела = Реквизиты.Синоним; - ИначеЕсли ТипЗнч(Раздел) = Тип("ОбъектМетаданных") Тогда - ПредставлениеРаздела = Раздел.Представление(); Иначе - ПредставлениеРаздела = Метаданные.Подсистемы.Найти(Раздел).Представление(); + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Раздел ""%1""'"), + ПредставлениеОбъектаМетаданных(Раздел)); КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Раздел ""%1""'"), ПредставлениеРаздела); +КонецФункции + +// Возвращает имя рабочего места команды. +Функция ПредставлениеОбъектаМетаданных(Объект) Экспорт + Если ТипЗнч(Объект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Объект); + ИначеЕсли ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда + ОбъектМетаданных = Объект; + Иначе + ОбъектМетаданных = Метаданные.Подсистемы.Найти(Объект); + КонецЕсли; + Возврат ОбъектМетаданных.Представление(); КонецФункции // Проверяет наличие права добавления дополнительных отчетов и обработок. @@ -2343,21 +2178,13 @@ Результат = Ложь; СтандартнаяОбработка = Истина; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеПраваДобавления"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); - - Если Не СтандартнаяОбработка Тогда - Возврат Результат; - КонецЕсли; - - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); Если СтандартнаяОбработка Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Результат = Пользователи.ЭтоПолноправныйПользователь(, Истина); Иначе Результат = Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок"); @@ -2382,21 +2209,12 @@ Результат = Ложь; СтандартнаяОбработка = Истина; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеВозможностиВыгрузкиОбработкиВФайл"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Обработка, Результат, СтандартнаяОбработка); - - Если Не СтандартнаяОбработка Тогда - Возврат Результат; - КонецЕсли; - - КонецЦикла; - - Если СтандартнаяОбработка Тогда - Возврат Истина; + ИнтеграцияСТехнологиейСервиса.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Обработка, Результат, СтандартнаяОбработка); + Если Не СтандартнаяОбработка Тогда + Возврат Результат; КонецЕсли; + + Возврат Истина; КонецФункции @@ -2412,22 +2230,13 @@ Результат = Ложь; СтандартнаяОбработка = Истина; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Обработка, Результат, СтандартнаяОбработка); + ИнтеграцияСТехнологиейСервиса.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Обработка, Результат, СтандартнаяОбработка); - Если Не СтандартнаяОбработка Тогда - Возврат Результат; - КонецЕсли; - - КонецЦикла; - - Если СтандартнаяОбработка Тогда - Возврат Истина; + Если Не СтандартнаяОбработка Тогда + Возврат Результат; КонецЕсли; + + Возврат Истина; КонецФункции @@ -2449,14 +2258,7 @@ Функция НедоступныеВидыПубликации() Экспорт Результат = Новый Массив; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриЗаполненииНедоступныхВидовПубликации"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииНедоступныхВидовПубликации(Результат); - КонецЦикла; - + ИнтеграцияСТехнологиейСервиса.ПриЗаполненииНедоступныхВидовПубликации(Результат); Возврат Результат; КонецФункции @@ -2472,14 +2274,7 @@ // Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПередЗаписьюДополнительнойОбработки"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); - - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); КонецПроцедуры @@ -2492,20 +2287,14 @@ // Процедура ПередУдалениемДополнительнойОбработки(Источник, Отказ) Экспорт - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПередУдалениемДополнительнойОбработки"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПередУдалениемДополнительнойОбработки(Источник, Отказ); - - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПередУдалениемДополнительнойОбработки(Источник, Отказ); КонецПроцедуры -// Определяет используется-ли в текущем сеансе фильтр подключенных ДОиО по версии модели сервиса. -Функция ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса() - Возврат ОбщегоНазначенияПовтИсп.РазделениеВключено() +// Определяет, используется ли в текущем сеансе фильтр подключенных дополнительных отчетов и обработок +// для модели сервиса. +Функция ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса() Экспорт + Возврат ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса"); КонецФункции @@ -2542,7 +2331,7 @@ КонецПроцедуры // Запись предупреждения в журнал регистрации по дополнительному отчету или обработке. -Процедура ЗаписатьПредупреждение(Ссылка, ТекстСообщения, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт +Процедура ЗаписатьПредупреждение(Ссылка, ТекстСообщения, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Уровень = УровеньЖурналаРегистрации.Предупреждение; ЗаписатьВЖурнал(Уровень, Ссылка, ТекстСообщения, Реквизит1, Реквизит2, Реквизит3); КонецПроцедуры @@ -2575,187 +2364,8 @@ //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. -// Вывод команд заполнения в формах объектов. -Процедура СформироватьПодменюКомандЗаполнения(Форма, Параметры) - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ - | ДополнительныеОтчетыИОбработкиНазначение.Ссылка - |ПОМЕСТИТЬ втСсылки - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК ДополнительныеОтчетыИОбработкиНазначение - |ГДЕ - | ДополнительныеОтчетыИОбработкиНазначение.ОбъектНазначения = &ОбъектНазначения - | И ДополнительныеОтчетыИОбработкиНазначение.Ссылка.Вид = &Вид - | И ДополнительныеОтчетыИОбработкиНазначение.Ссылка.ИспользоватьДляФормыОбъекта = ИСТИНА - | И ДополнительныеОтчетыИОбработкиНазначение.Ссылка.Публикация = &Публикация - | И ДополнительныеОтчетыИОбработкиНазначение.Ссылка.ПометкаУдаления = ЛОЖЬ - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ДополнительныеОтчетыИОбработкиКоманды.Ссылка, - | ДополнительныеОтчетыИОбработкиКоманды.Идентификатор, - | ДополнительныеОтчетыИОбработкиКоманды.ВариантЗапуска, - | ДополнительныеОтчетыИОбработкиКоманды.Представление КАК Представление, - | ДополнительныеОтчетыИОбработкиКоманды.ПоказыватьОповещение, - | ДополнительныеОтчетыИОбработкиКоманды.Модификатор, - | ДополнительныеОтчетыИОбработкиКоманды.Ссылка.Вид - |ИЗ - | втСсылки КАК втСсылки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ДополнительныеОтчетыИОбработкиКоманды - | ПО втСсылки.Ссылка = ДополнительныеОтчетыИОбработкиКоманды.Ссылка - | - |УПОРЯДОЧИТЬ ПО - | Представление"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ОбъектНазначения", Параметры.СсылкаРодителя); - Запрос.УстановитьПараметр("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта); - Запрос.УстановитьПараметр("ВариантЗапуска", Перечисления.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы); - Если Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок") Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Публикация = &Публикация", "Публикация <> &Публикация"); - Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); - Иначе - Запрос.УстановитьПараметр("Публикация", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется); - КонецЕсли; - Запрос.Текст = ТекстЗапроса; - - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - Возврат; - КонецЕсли; - - // Определение группы, в которую будут добавлены команды. - Элементы = Форма.Элементы; - - ПредустановленныеКоманды = Новый Массив; - Подменю = Элементы.Найти("ПодменюЗаполнитьСмТакже"); - Если Подменю = Неопределено Тогда - Подменю = Элементы.Найти("ПодменюЗаполнитьОбычное"); - КонецЕсли; - Если Подменю = Неопределено Тогда - Подменю = Элементы.Найти("ПодменюЗаполнить"); - КонецЕсли; - Если Подменю = Неопределено Тогда - Подменю = Элементы.Найти("ПодменюДополнительныхОбработокЗаполнения"); - КонецЕсли; - Если Подменю = Неопределено Тогда - КоманднаяПанель = Элементы.Найти("КоманднаяПанель"); - Если КоманднаяПанель = Неопределено Тогда - КоманднаяПанель = Форма.КоманднаяПанель; - КонецЕсли; - Подменю = Элементы.Вставить("ПодменюДополнительныхОбработокЗаполнения", Тип("ГруппаФормы"), КоманднаяПанель); - Подменю.Заголовок = НСтр("ru = 'Заполнить'"); - Подменю.Вид = ВидГруппыФормы.Подменю; - Подменю.Картинка = БиблиотекаКартинок.ЗаполнитьФорму; - Подменю.Отображение = ОтображениеКнопки.КартинкаИТекст; - Иначе - Для Каждого Элемент Из Подменю.ПодчиненныеЭлементы Цикл - ПредустановленныеКоманды.Добавить(Элемент); - КонецЦикла; - КонецЕсли; - - ТаблицаКоманд = Результат.Выгрузить(); - ТаблицаКоманд.Колонки.Добавить("ИмяЭлемента", Новый ОписаниеТипов("Строка")); - ТаблицаКоманд.Колонки.Добавить("ЭтоОтчет", Новый ОписаниеТипов("Булево")); - - Для НомерЭлемента = 0 По ТаблицаКоманд.Количество() - 1 Цикл - ОписаниеКоманды = ТаблицаКоманд[НомерЭлемента]; - ИмяЭлемента = "КомандаДополнительнойОбработки" + Формат(НомерЭлемента, "ЧГ="); - ОписаниеКоманды.ИмяЭлемента = ИмяЭлемента; - - Команда = Форма.Команды.Добавить(ИмяЭлемента); - Команда.Действие = "Подключаемый_ВыполнитьНазначаемуюКоманду"; - Команда.Заголовок = ОписаниеКоманды.Представление; - - Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Подменю); - Элемент.ИмяКоманды = ИмяЭлемента; - Элемент.ТолькоВоВсехДействиях = Ложь; - КонецЦикла; - Команда = Форма.Команды.Добавить("АдресКомандДополнительныхОбработокВоВременномХранилище"); - Команда.Действие = ПоместитьВоВременноеХранилище(ТаблицаКоманд, Форма.УникальныйИдентификатор); - - Для Каждого Элемент Из ПредустановленныеКоманды Цикл - Элементы.Переместить(Элемент, Подменю); - КонецЦикла; - -КонецПроцедуры - -Функция ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище) Экспорт - ТаблицаКоманд = ПолучитьИзВременногоХранилища(АдресТаблицыКомандВоВременномХранилище); - Для Каждого КомандаОбработки Из ТаблицаКоманд.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)) Цикл - Возврат ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(КомандаОбработки); - КонецЦикла; -КонецФункции - // Для внутреннего использования. -Функция ПолучитьТаблицуЗаписей(ПользователиСДопОбработками) - - ТекстЗапроса = - "ВЫБРАТЬ - | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, - | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок - | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка)"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - ОбработкиСКомандами = Запрос.Выполнить().Выгрузить(); - - ТаблицаЗаписей = Новый ТаблицаЗначений; - ТаблицаЗаписей.Колонки.Добавить("Обработка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")); - ТаблицаЗаписей.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); - ТаблицаЗаписей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи")); - ТаблицаЗаписей.Колонки.Добавить("Доступно", Новый ОписаниеТипов("Булево")); - - Для Каждого ОбработкаКоманда Из ОбработкиСКомандами Цикл - Для Каждого Пользователь Из ПользователиСДопОбработками Цикл - НоваяСтрока = ТаблицаЗаписей.Добавить(); - НоваяСтрока.Обработка = ОбработкаКоманда.Обработка; - НоваяСтрока.Идентификатор = ОбработкаКоманда.Идентификатор; - НоваяСтрока.Пользователь = Пользователь; - НоваяСтрока.Доступно = Истина; - КонецЦикла; - КонецЦикла; - - ТекстЗапроса = - "ВЫБРАТЬ - | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, - | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор, - | Пользователи.Ссылка КАК Пользователь, - | ПользовательскиеНастройкиДоступаКОбработкам.Доступно КАК Доступно - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок - | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам - | ПО (ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка = ДополнительныеОтчетыИОбработки.Ссылка) - | И (ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды = КомандыДополнительныхОтчетовИОбработок.Идентификатор) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи - | ПО (Пользователи.Ссылка = ПользовательскиеНастройкиДоступаКОбработкам.Пользователь)"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - ИсключенияПерсональногоДоступа = Запрос.Выполнить().Выгрузить(); - - ПоискСтрок = Новый Структура("Обработка, Идентификатор, Пользователь"); - Для Каждого ИсключениеПерсональногоДоступа Из ИсключенияПерсональногоДоступа Цикл - ЗаполнитьЗначенияСвойств(ПоискСтрок, ИсключениеПерсональногоДоступа); - Найденные = ТаблицаЗаписей.НайтиСтроки(ПоискСтрок); - Для Каждого СтрокаТаблицы Из Найденные Цикл - СтрокаТаблицы.Доступно = НЕ ИсключениеПерсональногоДоступа.Доступно; // Инвертируем исключением доступа. - КонецЦикла; - КонецЦикла; - - Возврат ТаблицаЗаписей; - -КонецФункции - -// Для внутреннего использования. -Функция ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам() +Функция ПользователиСДоступомКДополнительнымОбработкам() Результат = Новый Массив; @@ -2890,7 +2500,7 @@ ОписаниеКоманды = СведенияОВнешнемОбъекте.Команды.Найти(ИдентификаторКоманды, "Идентификатор"); Если ОписаниеКоманды = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1 не обнаружена!'"), ИдентификаторКоманды); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1 не обнаружена.'"), ИдентификаторКоманды); КонецЕсли; ЭтоСценарийВБезопасномРежиме = (ОписаниеКоманды.Использование = "СценарийВБезопасномРежиме"); @@ -2977,6 +2587,519 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Процедуры используемые при обмене данными. + +// Переопределяет стандартное поведение при загрузке данных. +// Реквизит РегламентноеЗаданиеGUID табличной части Команды не переносится, +// т.к. связан с регламентным заданием текущей базы. +// +Процедура ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента) + + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + + // Стандартную обработку не переопределяем. + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ДополнительныеОтчетыИОбработки") + И ЭлементДанных.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + + // Таблица уникальных идентификаторов регламентных заданий. + ТекстЗапроса = + "ВЫБРАТЬ + | Команды.Ссылка КАК Ссылка, + | Команды.Идентификатор КАК Идентификатор, + | Команды.РегламентноеЗаданиеGUID КАК РегламентноеЗаданиеGUID + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Команды КАК Команды + |ГДЕ + | Команды.Ссылка = &Ссылка"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("Ссылка", ЭлементДанных.Ссылка); + + ИдентификаторыРегламентныхЗаданий = Запрос.Выполнить().Выгрузить(); + + // Заполнение идентификаторов регламентных заданий в таблице команд из данных текущей БД. + Для Каждого СтрокаКоманда Из ЭлементДанных.Команды Цикл + Найденные = ИдентификаторыРегламентныхЗаданий.НайтиСтроки(Новый Структура("Идентификатор", СтрокаКоманда.Идентификатор)); + Если Найденные.Количество() = 0 Тогда + СтрокаКоманда.РегламентноеЗаданиеGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); + Иначе + СтрокаКоманда.РегламентноеЗаданиеGUID = Найденные[0].РегламентноеЗаданиеGUID; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Сопоставление элементов справочника объектам метаданных конфигурации. + +Процедура СопоставитьОбработкиКонфигурацииСОбработкамиСправочника(ОтчетыИОбработки) + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДополнительныеОтчетыИОбработки.Ссылка, + | ДополнительныеОтчетыИОбработки.Версия, + | ДополнительныеОтчетыИОбработки.ИмяОбъекта, + | ДополнительныеОтчетыИОбработки.ИмяФайла + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки"; + + ОбработкиИзКонфигурации = Запрос.Выполнить().Выгрузить(); + Для Каждого ОбработкаКонфигурации Из ОбработкиИзКонфигурации Цикл + ОбработкаКонфигурации.ИмяОбъекта = ВРег(ОбработкаКонфигурации.ИмяОбъекта); + ОбработкаКонфигурации.ИмяФайла = ВРег(ОбработкаКонфигурации.ИмяФайла); + КонецЦикла; + ОбработкиИзКонфигурации.Колонки.Добавить("Найдена", Новый ОписаниеТипов("Булево")); + + ОтчетыИОбработки.Колонки.Добавить("Имя"); + ОтчетыИОбработки.Колонки.Добавить("ИмяФайла"); + ОтчетыИОбработки.Колонки.Добавить("ПолноеИмя"); + ОтчетыИОбработки.Колонки.Добавить("Вид"); + ОтчетыИОбработки.Колонки.Добавить("Расширение"); + ОтчетыИОбработки.Колонки.Добавить("Менеджер"); + ОтчетыИОбработки.Колонки.Добавить("Сведения"); + ОтчетыИОбработки.Колонки.Добавить("ДанныеИзСправочника"); + ОтчетыИОбработки.Колонки.Добавить("Ссылка"); + + ОбратныйИндекс = ОтчетыИОбработки.Количество(); + Пока ОбратныйИндекс > 0 Цикл + ОбратныйИндекс = ОбратныйИндекс - 1; + СтрокаТаблицы = ОтчетыИОбработки[ОбратныйИндекс]; + + СтрокаТаблицы.Имя = СтрокаТаблицы.ОбъектМетаданных.Имя; + СтрокаТаблицы.ПолноеИмя = СтрокаТаблицы.ОбъектМетаданных.ПолноеИмя(); + СтрокаТаблицы.Вид = ВРег(СтрРазделить(СтрокаТаблицы.ПолноеИмя, ".")[0]); + Если СтрокаТаблицы.Вид = "ОТЧЕТ" Тогда + СтрокаТаблицы.Расширение = "erf"; + МенеджерИзМетаданныхКонфигурации = Отчеты[СтрокаТаблицы.Имя]; + ИначеЕсли СтрокаТаблицы.Вид = "ОБРАБОТКА" Тогда + СтрокаТаблицы.Расширение = "epf"; + МенеджерИзМетаданныхКонфигурации = Обработки[СтрокаТаблицы.Имя]; + Иначе + ОтчетыИОбработки.Удалить(ОбратныйИндекс); + Продолжить; // Неподдерживаемый вид объекта метаданных. + КонецЕсли; + СтрокаТаблицы.ИмяФайла = СтрокаТаблицы.Имя + "." + СтрокаТаблицы.Расширение; + СтрокаТаблицы.СтарыеИменаФайлов.Вставить(0, СтрокаТаблицы.ИмяФайла); + СтрокаТаблицы.СтарыеИменаОбъектов.Вставить(0, СтрокаТаблицы.Имя); + + СтрокаТаблицы.Сведения = МенеджерИзМетаданныхКонфигурации.Создать().СведенияОВнешнейОбработке(); + + // Поиск в справочнике. + ДанныеИзСправочника = Неопределено; + Для Каждого ИмяФайла Из СтрокаТаблицы.СтарыеИменаФайлов Цикл + ДанныеИзСправочника = ОбработкиИзКонфигурации.Найти(ВРег(ИмяФайла), "ИмяФайла"); + Если ДанныеИзСправочника <> Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + Если ДанныеИзСправочника = Неопределено Тогда + Для Каждого ИмяОбъекта Из СтрокаТаблицы.СтарыеИменаОбъектов Цикл + ДанныеИзСправочника = ОбработкиИзКонфигурации.Найти(ВРег(ИмяОбъекта), "ИмяОбъекта"); + Если ДанныеИзСправочника <> Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ДанныеИзСправочника = Неопределено Тогда + Продолжить; // Будет зарегистрирована новая обработка. + КонецЕсли; + + Если ВерсияЧислом(ДанныеИзСправочника.Версия) >= ВерсияЧислом(СтрокаТаблицы.Сведения.Версия) + И СтрокаТаблицы.Сведения.Версия <> Метаданные.Версия Тогда + // Обновление не требуется, т.к. в справочнике уже актуальная версия обработки. + ОтчетыИОбработки.Удалить(ОбратныйИндекс); + Иначе + // Регистрация ссылки для последующего обновления. + СтрокаТаблицы.Ссылка = ДанныеИзСправочника.Ссылка; + КонецЕсли; + ОбработкиИзКонфигурации.Удалить(ДанныеИзСправочника); + + КонецЦикла; + + ОтчетыИОбработки.Колонки.Удалить("СтарыеИменаФайлов"); + ОтчетыИОбработки.Колонки.Удалить("СтарыеИменаОбъектов"); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Выгрузка отчетов и обработок конфигурации в файлы внешних отчетов и обработок. + +Функция ВыгрузитьОтчетыИОбработкиВФайлы(ОтчетыИОбработки) + ОтчетыИОбработки.Колонки.Добавить("ДвоичныеДанные"); + + // /DumpConfigFiles <каталог выгрузки> [-Module] [-Template] [-Help] [-AllWritable] - выгрузка свойств объектов + // метаданных конфигурации. + // <Каталог выгрузки> - каталог расположения файлов свойств; + // Module - признак необходимости выгрузки модулей; + // Template - признак необходимости выгрузки шаблонов; + // Help - признак необходимости выгрузки справочной информации; + // AllWritable - признак выгрузки свойств только доступных для записи объектов. + Кавычка = """"; + Параметры = Новый Структура; + Параметры.Вставить("РабочийКаталог", СтандартныеПодсистемыСервер.СоздатьКаталогВременныхФайлов("ARADP")); + КлючЗапуска = " /DumpConfigToFiles " + Кавычка + Параметры.РабочийКаталог + Кавычка; + Выгрузка = ПакетныйЗапускКонфигуратора(Параметры, КлючЗапуска); + Если Не Выгрузка.Успех Тогда + ТекстОшибки = СокрЛП( + НСтр("ru = 'Не удалось выгрузить отчеты и обработки конфигурации во внешние файлы:'") + + Символы.ПС + Выгрузка.Кратко + + Символы.ПС + Выгрузка.Подробно); + ЗаписатьПредупреждение(Неопределено, ТекстОшибки); + ОтчетыИОбработки.Очистить(); + КонецЕсли; + + ОбратныйИндекс = ОтчетыИОбработки.Количество(); + Пока ОбратныйИндекс > 0 Цикл + ОбратныйИндекс = ОбратныйИндекс - 1; + СтрокаТаблицы = ОтчетыИОбработки[ОбратныйИндекс]; + + Если СтрокаТаблицы.Вид = "ОТЧЕТ" Тогда + КаталогВида = Параметры.РабочийКаталог + "Reports" + ПолучитьРазделительПути(); + ИначеЕсли СтрокаТаблицы.Вид = "ОБРАБОТКА" Тогда + КаталогВида = Параметры.РабочийКаталог + "DataProcessors" + ПолучитьРазделительПути(); + Иначе + ЗаписатьОшибку(СтрокаТаблицы.Ссылка, НСтр("ru = 'Неподдерживаемый вид объектов метаданных: ""1""'"), СтрокаТаблицы.Вид); + ОтчетыИОбработки.Удалить(ОбратныйИндекс); + Продолжить; + КонецЕсли; + + ПолноеИмяСхемыОбъекта = КаталогВида + СтрокаТаблицы.Имя + ".xml"; + ТекстСхемы = ПрочитатьТекстовыйФайл(ПолноеИмяСхемыОбъекта); + Если ТекстСхемы = Неопределено Тогда + ЗаписатьОшибку(СтрокаТаблицы.Ссылка, НСтр("ru = 'Не обнаружен файл ""%1"".'"), ПолноеИмяСхемыОбъекта); + ОтчетыИОбработки.Удалить(ОбратныйИндекс); + Продолжить; + КонецЕсли; + Если СтрокаТаблицы.Вид = "ОТЧЕТ" Тогда + ТекстСхемы = СтрЗаменить(ТекстСхемы, "Report", "ExternalReport"); + ТекстСхемы = СтрЗаменить(ТекстСхемы, "ExternalReportTabularSection", "ReportTabularSection"); + ИначеЕсли СтрокаТаблицы.Вид = "ОБРАБОТКА" Тогда + ТекстСхемы = СтрЗаменить(ТекстСхемы, "DataProcessor", "ExternalDataProcessor"); + КонецЕсли; + ЗаписатьТекстовыйФайл(ПолноеИмяСхемыОбъекта, ТекстСхемы); + + Если СтрокаТаблицы.Вид = "ОБРАБОТКА" Тогда + ДокументDOM = ПрочитатьДокументDOM(ПолноеИмяСхемыОбъекта); + Разыменователь = Новый РазыменовательПространствИменDOM(ДокументDOM); + XMLИзменен = Ложь; + + ВыраженияПоискаУдаляемыхУзлов = Новый Массив; + ВыраженияПоискаУдаляемыхУзлов.Добавить("//xmlns:Command"); + ВыраженияПоискаУдаляемыхУзлов.Добавить("//*[contains(@name, 'ExternalDataProcessorManager.')]"); + ВыраженияПоискаУдаляемыхУзлов.Добавить("//xmlns:UseStandardCommands"); + ВыраженияПоискаУдаляемыхУзлов.Добавить("//xmlns:IncludeHelpInContents"); + ВыраженияПоискаУдаляемыхУзлов.Добавить("//xmlns:ExtendedPresentation"); + ВыраженияПоискаУдаляемыхУзлов.Добавить("//xmlns:Explanation"); + + Для Каждого Выражение Из ВыраженияПоискаУдаляемыхУзлов Цикл + РезультатXPath = ВычислитьВыражениеXPath(Выражение, ДокументDOM, Разыменователь); + ЭлементDOM = РезультатXPath.ПолучитьСледующий(); + Пока ЭлементDOM <> Неопределено Цикл + ЭлементDOM.РодительскийУзел.УдалитьДочерний(ЭлементDOM); + XMLИзменен = Истина; + ЭлементDOM = РезультатXPath.ПолучитьСледующий(); + КонецЦикла; + КонецЦикла; + + Если XMLИзменен Тогда + ЗаписатьДокументDOM(ДокументDOM, ПолноеИмяСхемыОбъекта); + КонецЕсли; + КонецЕсли; + + // /LoadExternalDataProcessorOrReportFromFiles <ПутьКФайлуВыгрузки> <ПутьКОбработке> + // - создание внешних отчетов и обработок из XML. + // <ПутьКФайлуВыгрузки> - путь к файлу в формате XML, из которого требуется создать внешний отчет или обработку. + // <ПутьКОбработке> - путь к файлу внешней обработки (.epf) или отчета (.erf), в который будет записан результат + // загрузки из XML-файла. + // Дополнительно можно указать адрес строки подключения к информационной базе, например, с помощью параметра /IBName. + // При этом, если во внешней обработке есть внешние ссылки, они будут разрешаться относительно указанной + // информационной базы. Если информационная база не указана, внешние ссылки разрешаться не будут. + ПолноеИмяФайла = Параметры.РабочийКаталог + СтрокаТаблицы.ИмяФайла; + КлючЗапуска = " /LoadExternalDataProcessorOrReportFromFiles " + Кавычка + ПолноеИмяСхемыОбъекта + Кавычка + " " + Кавычка + ПолноеИмяФайла + Кавычка; + СозданиеОбработки = ПакетныйЗапускКонфигуратора(Параметры, КлючЗапуска); + Если Не СозданиеОбработки.Успех Тогда + ТекстОшибки = НСтр("ru = 'Не удалось создать ""%1"" из внешнего файла ""%2"":%3'"); + ЗаписатьПредупреждение(Неопределено, ТекстОшибки, СтрокаТаблицы.ПолноеИмя, ПолноеИмяСхемыОбъекта, Символы.ПС + СокрЛП(СозданиеОбработки.Кратко + Символы.ПС + СозданиеОбработки.Подробно)); + ОтчетыИОбработки.Удалить(ОбратныйИндекс); + Продолжить; + КонецЕсли; + СтрокаТаблицы.ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); + КонецЦикла; + + Если Параметры.КаталогКопии1CD <> Неопределено Тогда + СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(Параметры.КаталогКопии1CD); + КонецЕсли; + СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(Параметры.РабочийКаталог); + +КонецФункции + +Функция ПакетныйЗапускКонфигуратора(Параметры, КлючЗапуска) + Результат = Новый Структура("Успех, Кратко, Подробно", Ложь, "", ""); + Кавычка = """"; + ОбразецПараметров = Новый Структура("РабочийКаталог, Пользователь, Пароль, КаталогBIN, ПутьККонфигурации, КаталогКопии1CD"); + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Параметры, ОбразецПараметров, Ложь); + Если Не ЗначениеЗаполнено(Параметры.Пользователь) Тогда + Параметры.Пользователь = ИмяПользователя(); + КонецЕсли; + Если Не ФайлСуществует(Параметры.РабочийКаталог) Тогда + СоздатьКаталог(Параметры.РабочийКаталог); + КонецЕсли; + Если Не ЗначениеЗаполнено(Параметры.КаталогBIN) Тогда + Параметры.КаталогBIN = КаталогПрограммы(); + КонецЕсли; + Если Не ЗначениеЗаполнено(Параметры.ПутьККонфигурации) Тогда + Параметры.ПутьККонфигурации = СтрокаСоединенияИнформационнойБазы(); + Если ОткрытКонфигуратор() Тогда + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + КаталогИнформационнойБазы = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(Параметры.ПутьККонфигурации).file; + Параметры.КаталогКопии1CD = Параметры.РабочийКаталог + "BaseCopy" + ПолучитьРазделительПути(); + СоздатьКаталог(Параметры.КаталогКопии1CD); + КопироватьФайл(КаталогИнформационнойБазы + "\1Cv8.1CD", Параметры.КаталогКопии1CD + "1Cv8.1CD"); + Параметры.ПутьККонфигурации = "File=" + Кавычка + Параметры.КаталогКопии1CD + Кавычка + ";"; + Иначе + Результат.Кратко = НСтр("ru = 'Для выгрузки модулей необходимо закрыть конфигуратор.'"); + Возврат Результат; + КонецЕсли; + КонецЕсли; + Параметры.ПутьККонфигурации = СтрЗаменить(Параметры.ПутьККонфигурации, Кавычка, Кавычка + Кавычка); + КонецЕсли; + + ИмяФайлаСообщений = Параметры.РабочийКаталог + "Выгрузка.log"; + + КодВозврата = NULL; + ЗапуститьПриложение(Кавычка + Параметры.КаталогBIN + "1cv8.exe" + Кавычка + " DESIGNER" + + " /IBConnectionString " + Кавычка + Параметры.ПутьККонфигурации + Кавычка + + ?(Параметры.Пользователь = "", + "", + " /N " + Кавычка + Параметры.Пользователь + Кавычка + " /P " + Кавычка + Параметры.Пароль + Кавычка) + + КлючЗапуска + + " /Out " + Кавычка + ИмяФайлаСообщений + Кавычка + + " /DisableStartupDialogs" // Без стартового диалога и диалогов аутентификации. + + " /DisableStartupMessages" // Без стартовых предупреждений. + , + , + Истина, + КодВозврата); + + Если КодВозврата = 0 Тогда + Результат.Успех = Истина; + Иначе + Результат.Кратко = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выгрузить конфигурацию в XML (код ошибки ""%1"")'"), + КодВозврата); + Если ФайлСуществует(ИмяФайлаСообщений) Тогда + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаСообщений, , , , Ложь); + Сообщения = СокрЛП(ЧтениеТекста.Прочитать()); + ЧтениеТекста.Закрыть(); + Если Сообщения <> "" Тогда + Результат.Подробно = СтрЗаменить(Символы.ПС + Сообщения, Символы.ПС, Символы.ПС + Символы.Таб); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(ИмяФайлаСообщений); + Возврат Результат; +КонецФункции + +Функция ФайлСуществует(ПолноеИмяФайла) + Файл = Новый Файл(ПолноеИмяФайла); + Возврат Файл.Существует(); +КонецФункции + +Функция ОткрытКонфигуратор() + Сеансы = ПолучитьСеансыИнформационнойБазы(); + Для Каждого Сеанс Из Сеансы Цикл + Если ВРег(Сеанс.ИмяПриложения) = "DESIGNER" Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; +КонецФункции + +Функция ПрочитатьТекстовыйФайл(ПолноеИмяФайла) + Если Не ФайлСуществует(ПолноеИмяФайла) Тогда + Возврат Неопределено; + КонецЕсли; + ЧтениеТекста = Новый ЧтениеТекста(ПолноеИмяФайла); + Текст = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + Возврат Текст; +КонецФункции + +Процедура ЗаписатьТекстовыйФайл(ПолноеИмяФайла, Текст) + ЗаписьТекста = Новый ЗаписьТекста(ПолноеИмяФайла, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); +КонецПроцедуры + +Функция ПрочитатьДокументDOM(ПутьКФайлу) + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ПутьКФайлу); + ПостроительDOM = Новый ПостроительDOM; + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + + Возврат ДокументDOM; +КонецФункции + +Функция ВычислитьВыражениеXPath(Выражение, ДокументDOM, Разыменователь) + Возврат ДокументDOM.ВычислитьВыражениеXPath(Выражение, ДокументDOM, Разыменователь); +КонецФункции + +Процедура ЗаписатьДокументDOM(ДокументDOM, ИмяФайла) + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.ОткрытьФайл(ИмяФайла); + ЗаписьDOM = Новый ЗаписьDOM; + ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Пакетная регистрация внешних отчетов и обработок в справочнике. + +Процедура ЗарегистрироватьОтчетыИОбработки(ОтчетыИОбработки) + + Для Каждого СтрокаТаблицы Из ОтчетыИОбработки Цикл + // Обновление/добавление. + Если СтрокаТаблицы.Ссылка = Неопределено Тогда + СправочникОбъект = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент(); + СправочникОбъект.ИспользоватьДляФормыОбъекта = Истина; + СправочникОбъект.ИспользоватьДляФормыСписка = Истина; + СправочникОбъект.Ответственный = Пользователи.ТекущийПользователь(); + Иначе + СправочникОбъект = СтрокаТаблицы.Ссылка.ПолучитьОбъект(); + КонецЕсли; + + ЭтоОтчет = (СтрокаТаблицы.Вид = "ОТЧЕТ"); + АдресДанных = ПоместитьВоВременноеХранилище(СтрокаТаблицы.ДвоичныеДанные); + Менеджер = ?(ЭтоОтчет, ВнешниеОтчеты, ВнешниеОбработки); + Если ОбщегоНазначения.ЕстьЗащитаОтОпасныхДействий() Тогда + ИмяОбъекта = Менеджер.Подключить(АдресДанных, , Истина, + ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений()); + Иначе + ИмяОбъекта = Менеджер.Подключить(АдресДанных, , Истина); + КонецЕсли; + ВнешнийОбъект = Менеджер.Создать(ИмяОбъекта); + + ВнешнийОбъектМетаданные = ВнешнийОбъект.Метаданные(); + ОбработкаСведения = СтрокаТаблицы.Сведения; + Если ОбработкаСведения.Наименование = Неопределено ИЛИ ОбработкаСведения.Информация = Неопределено Тогда + Если ОбработкаСведения.Наименование = Неопределено Тогда + ОбработкаСведения.Наименование = ВнешнийОбъектМетаданные.Представление(); + КонецЕсли; + Если ОбработкаСведения.Информация = Неопределено Тогда + ОбработкаСведения.Информация = ВнешнийОбъектМетаданные.Комментарий; + КонецЕсли; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(СправочникОбъект, ОбработкаСведения, "Наименование, БезопасныйРежим, Версия, Информация"); + + // Выгрузка настроек команд, которые переопределяются администратором. + ПоискЗаданий = Новый Соответствие; + Для Каждого СтараяКоманда Из СправочникОбъект.Команды Цикл + Если ЗначениеЗаполнено(СтараяКоманда.РегламентноеЗаданиеGUID) Тогда + ПоискЗаданий.Вставить(ВРег(СтараяКоманда.Идентификатор), СтараяКоманда.РегламентноеЗаданиеGUID); + КонецЕсли; + КонецЦикла; + + ПараметрыРегистрации = Новый Структура; + ПараметрыРегистрации.Вставить("АдресДанныхОбработки", АдресДанных); + ПараметрыРегистрации.Вставить("ЭтоОтчет", ЭтоОтчет); + ПараметрыРегистрации.Вставить("ОтключатьКонфликтующие", Ложь); + ПараметрыРегистрации.Вставить("ИмяФайла", СтрокаТаблицы.ИмяФайла); + ПараметрыРегистрации.Вставить("ОтключатьПубликацию", Ложь); + + СправочникОбъект.ИмяОбъекта = Неопределено; + СправочникОбъект.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется; + СправочникОбъект.Вид = ПолучитьВидОбработкиПоСтроковомуПредставлениюВида( + ОбработкаСведения.Вид); + + Результат = ЗарегистрироватьОбработку(СправочникОбъект, ПараметрыРегистрации); + Если Не Результат.Успех И Результат.ИмяОбъектаЗанято Тогда + ПараметрыРегистрации.Вставить("ОтключатьКонфликтующие", Истина); + ПараметрыРегистрации.Вставить("Конфликтующие", Результат.Конфликтующие); + Результат = ЗарегистрироватьОбработку(СправочникОбъект, ПараметрыРегистрации); + КонецЕсли; + Если Не Результат.Успех Тогда + Если Результат.ИмяОбъектаЗанято Тогда + Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя ""%1"" занято объектами ""%2""'"), + ИмяОбъекта, + Строка(Результат.Конфликтующие)); + КонецЕсли; + ЗаписьЖурналаРегистрации( + ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы(Ложь), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.ОбщиеМакеты.Найти(СтрокаТаблицы.ИмяМакета), + , + Результат.ТекстОшибки); + Продолжить; + КонецЕсли; + + СправочникОбъект.ХранилищеОбработки = Новый ХранилищеЗначения(СтрокаТаблицы.ДвоичныеДанные); + СправочникОбъект.ИмяОбъекта = ВнешнийОбъектМетаданные.Имя; + СправочникОбъект.ИмяФайла = СтрокаТаблицы.ИмяФайла; + + // Очистка и загрузка новых команд. + Для Каждого Команда Из СправочникОбъект.Команды Цикл + РегламентноеЗаданиеGUID = ПоискЗаданий.Получить(ВРег(Команда.Идентификатор)); + Если РегламентноеЗаданиеGUID <> Неопределено Тогда + Команда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеGUID; + ПоискЗаданий.Удалить(ВРег(Команда.Идентификатор)); + КонецЕсли; + КонецЦикла; + + // Удаление неактуальных заданий. + Для Каждого КлючИЗначение Из ПоискЗаданий Цикл + Попытка + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(КлючИЗначение.Значение); + Задание.Удалить(); + Исключение + ЗаписьЖурналаРегистрации( + ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ДополнительныеОтчетыИОбработки, + СправочникОбъект.Ссылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при удалении задания ""%1"":%2'"), + КлючИЗначение.Значение, + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки; + КонецЦикла; + + Если ПроверитьГлобальнаяОбработка(СправочникОбъект.Вид) Тогда + ТаблицаОбъектовМетаданных = ПодключенныеОбъектыМетаданных(СправочникОбъект.Вид); + Для Каждого СтрокаТаблицы Из ТаблицаОбъектовМетаданных Цикл + РазделСсылка = СтрокаТаблицы.Ссылка; + СтрокаРаздела = СправочникОбъект.Разделы.Найти(РазделСсылка, "Раздел"); + Если СтрокаРаздела = Неопределено Тогда + СтрокаРаздела = СправочникОбъект.Разделы.Добавить(); + СтрокаРаздела.Раздел = РазделСсылка; + КонецЕсли; + КонецЦикла; + Иначе + Для Каждого ОписаниеНазначения Из ОбработкаСведения.Назначение Цикл + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОписаниеНазначения); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + ОбъектНазначенияСсылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); + СтрокаНазначения = СправочникОбъект.Назначение.Найти(ОбъектНазначенияСсылка, "ОбъектНазначения"); + Если СтрокаНазначения = Неопределено Тогда + СтрокаНазначения = СправочникОбъект.Назначение.Добавить(); + СтрокаНазначения.ОбъектНазначения = ОбъектНазначенияСсылка; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СправочникОбъект, , Истина); + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Другие @@ -3028,6 +3151,12 @@ Возврат Результат; КонецЕсли; + Если РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма + И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + Результат.ТекстОшибки = НСтр("ru = 'Работа с печатными формами не поддерживается.'"); + Возврат Результат; + КонецЕсли; + // Если отчет публикуется, то необходим контроль уникальности имени объекта, // под которым дополнительный отчет регистрируется в системе. Если Объект.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется Тогда @@ -3221,17 +3350,11 @@ // Для внутреннего использования. Функция ПолучитьРегистрационныеДанные(Знач Объект, Знач ПараметрыРегистрации, Знач РезультатРегистрации) - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПолученииРегистрационныхДанных"); - + РегистрационныеДанные = Новый Структура; - СтандартнаяОбработка = Истина; - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка); - КонецЦикла; - + ИнтеграцияСТехнологиейСервиса.ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка); Если СтандартнаяОбработка Тогда ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, ПараметрыРегистрации, РезультатРегистрации); КонецЕсли; @@ -3331,20 +3454,123 @@ #КонецЕсли КонецПроцедуры -// Только для внутреннего использования. -// -Функция КоличествоДополнительныхОтчетовИОбработок() - +// Вывод команд заполнения в формах объектов. +Процедура ПриОпределенииКомандЗаполненияПодключенныхКОбъекту(Команды, ИОМы, БыстрыйПоискПоИОМам) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ДополнительныеОтчетыИОбработки.Наименование + | Таблица.Ссылка, + | Таблица.Команды.( + | Идентификатор, + | ВариантЗапуска, + | Представление, + | ПоказыватьОповещение, + | Скрыть + | ), + | Таблица.Назначение.( + | ОбъектНазначения + | ) |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки"; + | Справочник.ДополнительныеОтчетыИОбработки КАК Таблица + |ГДЕ + | Таблица.Назначение.ОбъектНазначения В(&ИОМы) + | И Таблица.Вид = &Вид + | И Таблица.ИспользоватьДляФормыОбъекта = ИСТИНА + | И Таблица.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется) + | И Таблица.Публикация <> ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена) + | И Таблица.ПометкаУдаления = ЛОЖЬ"; + Запрос.УстановитьПараметр("ИОМы", ИОМы); + Запрос.УстановитьПараметр("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта); + Если Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок") Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Таблица.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)", ""); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Таблица.Публикация <> ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена)", ""); + КонецЕсли; - Результат = Запрос.Выполнить().Выгрузить(); - Возврат Результат.Количество(); + КлючиПараметровОбработчика = "Ссылка, Идентификатор, ВариантЗапуска, Представление, ПоказыватьОповещение, ЭтоОтчет"; + ЗаполнениеФормы = Перечисления.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы; + ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса = ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса(); + Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + КонецЕсли; + + Таблица = Запрос.Выполнить().Выгрузить(); + Для Каждого ОтчетИлиОбработка Из Таблица Цикл + Если ИспользуетсяТеснаяИнтеграцияСПодсистемойВМоделиСервиса + И Не МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ЭтоПоставляемаяОбработка(ОтчетИлиОбработка.Ссылка) Тогда + Продолжить; + КонецЕсли; + + ТипыЗаполнениеОбъекта = Новый Массив; + Для Каждого СтрокаТаблицыНазначение Из ОтчетИлиОбработка.Назначение Цикл + Источник = БыстрыйПоискПоИОМам[СтрокаТаблицыНазначение.ОбъектНазначения]; + Если Источник = Неопределено Тогда + Продолжить; + КонецЕсли; + ПодключаемыеКоманды.ДополнитьМассивТипов(ТипыЗаполнениеОбъекта, Источник.ТипСсылкиДанных); + КонецЦикла; + + Для Каждого СтрокаТаблицы Из ОтчетИлиОбработка.Команды Цикл + Если СтрокаТаблицы.Скрыть Тогда + Продолжить; + КонецЕсли; + Команда = Команды.Добавить(); + Команда.Вид = "ЗаполнениеОбъектов"; + Команда.Представление = СтрокаТаблицы.Представление; + Команда.Важность = "СмТакже"; + Команда.Порядок = 50; + Команда.ИзменяетВыбранныеОбъекты = Истина; + Если СтрокаТаблицы.ВариантЗапуска = ЗаполнениеФормы Тогда + Команда.Обработчик = "ДополнительныеОтчетыИОбработки.ОбработчикКомандыЗаполнения"; + Команда.РежимЗаписи = "НеЗаписывать"; + Иначе + Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОбработчикКомандыЗаполнения"; + Команда.РежимЗаписи = "Записывать"; + КонецЕсли; + Команда.ТипПараметра = Новый ОписаниеТипов(ТипыЗаполнениеОбъекта); + Команда.ДополнительныеПараметры = Новый Структура(КлючиПараметровОбработчика); + ЗаполнитьЗначенияСвойств(Команда.ДополнительныеПараметры, СтрокаТаблицы); + Команда.ДополнительныеПараметры.Ссылка = ОтчетИлиОбработка.Ссылка; + Команда.ДополнительныеПараметры.ЭтоОтчет = Ложь; + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +// Преобразует строковое представление версии в числовое. +// +Функция ВерсияЧислом(ВерсияСтрокой) + Если ПустаяСтрока(ВерсияСтрокой) Или ВерсияСтрокой = "0.0.0.0" Тогда + Возврат 0; + КонецЕсли; + + Разряд = 0; + + Результат = 0; + + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + Остаток = ВерсияСтрокой; + ПозицияТочки = СтрНайти(Остаток, "."); + Пока ПозицияТочки > 0 Цикл + ЧислоСтрокой = Лев(Остаток, ПозицияТочки - 1); + Число = ОписаниеТипаЧисло.ПривестиЗначение(ЧислоСтрокой); + Результат = Результат * 1000 + Число; + Остаток = Сред(Остаток, ПозицияТочки + 1); + ПозицияТочки = СтрНайти(Остаток, "."); + Разряд = Разряд + 1; + КонецЦикла; + + Число = ОписаниеТипаЧисло.ПривестиЗначение(Остаток); + Результат = Результат * 1000 + Число; + Разряд = Разряд + 1; + + // Номера версии после 4 точки возвращает после запятой. + // Например, для версии "1.2.3.4.5.6.7" вернет 1002003004,005006007. + Если Разряд > 4 Тогда + Результат = Результат / Pow(1000, Разряд - 4); + КонецЕсли; + + Возврат Результат; КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl deleted file mode 100644 index b8f9ff073..000000000 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl +++ /dev/null @@ -1,835 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", расширение безопасного режима. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -#Область УстаревшиеПроцедурыИФункции - -// Создает объект ЧтениеXML и инициализирует его данными файла, помещенном во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, -// ПараметрыЧтения - ПараметрыЧтенияXML, которые будут использоваться при чтении. -// -// Возвращаемое значение: ЧтениеXML. -// -Функция ЧтениеXMLИзДвоичныхДанных(Знач АдресДвоичныхДанных, Знач ПараметрыЧтения = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Строка = ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаИзДвоичныхДанных( - АдресДвоичныхДанных); - - ЧтениеXML = Новый ЧтениеXML(); - ЧтениеXML.УстановитьСтроку(Строка); - - Возврат ЧтениеXML; - -КонецФункции - -// Записывает содержимое объекта ЗаписьXML во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ЗаписьXML - объект типа ЗаписьXML или КаноническаяЗаписьXML, содержимое которого необходимо записать. -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ЗаписьXMLВДвоичныеДанные(Знач ЗаписьXML, Знач Адрес) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Строка = ЗаписьXML.Закрыть(); - Возврат ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаВДвоичныеДанные( - Строка, - , - , - , - Адрес); - -КонецФункции - -// Создает объект ЧтениеHTML и инициализирует его данными файла, помещенном во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, -// Кодировка - строка, указывает кодировку, которая будет использоваться в механизме -// разбора HTML для преобразования. -// -// Возвращаемое значение: ЧтениеXML. -// -Функция ЧтениеHTMLИзДвоичныхДанных(Знач АдресДвоичныхДанных, Знач Кодировка = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Строка = ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаИзДвоичныхДанных( - АдресДвоичныхДанных); - - ЧтениеHTML = Новый ЧтениеHTML(); - ЧтениеHTML.УстановитьСтроку(Строка); - - Возврат ЧтениеHTML; - -КонецФункции - -// Записывает содержимое объекта ЗаписьHTML во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ЗаписьHTML - объект типа ЗаписьHTML, содержимое которого необходимо записать. -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ЗаписьHTMLВДвоичныеДанные(Знач ЗаписьHTML, Знач Адрес) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Строка = ЗаписьHTML.Закрыть(); - Возврат ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаВДвоичныеДанные( - Строка, - , - , - , - Адрес); - -КонецФункции - -// Создает объект ЧтениеFastInfoset и инициализирует его данными файла, помещенном во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла. -// -// Возвращаемое значение: ЧтениеFastInfoset. -// -Функция ЧтениеFastInfosetИзДвоичныхДанных(Знач АдресДвоичныхДанных) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Данные = ПолучитьИзВременногоХранилища(АдресДвоичныхДанных); - ЧтениеFastInfoset = Новый ЧтениеFastInfoset(); - ЧтениеFastInfoset.УстановитьДвоичныеДанные(Данные); - - Возврат ЧтениеFastInfoset; - -КонецФункции - -// Записывает содержимое объекта ЗаписьFastInfoSet во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ЗаписьFastInfoSet - объект типа ЗаписьFastInfoSet, содержимое которого необходимо записать. -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ЗаписьFastInfosetВДвоичныеДанные(Знач ЗаписьFastInfoset, Знач Адрес) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Данные = ЗаписьFastInfoset.Закрыть(); - Адрес = ПоместитьВоВременноеХранилище(Данные, Адрес); - - Возврат Адрес; - -КонецФункции - -// Функция выполняет создание COM-объекта для использования его в дополнительных -// отчетах и обработках, выполняющихся в контексте сервера. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}CreateComObject -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// ProgId - строка, ProgID класса COM, с которым он зарегистрирован в системе. -// Например, "Excel.Application". -// -// Результат: -// COMОбъект -// -Функция СоздатьComОбъект(Знач КлючСессии, Знач ProgId) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеСозданиеCOMОбъекта( - ProgId)); - - Возврат Новый COMОбъект(ProgId); - -КонецФункции - -// Функция выполняет подключение внешней компоненты из общего макета конфигурации, -// для использования ее в дополнительных отчетах и обработках, выполняющихся в -// контексте сервера. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}AttachAddin -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// ИмяОбщегоМакета - строка, имя общего макета конфигурации, в котором расположена -// внешняя компонента. Например, "КомпонентаПечатьШтрихкодов", -// СимволическоеИмя - строка, символическое имя подключаемой внешней компоненты, -// ТипКомпоненты - ТипВнешнейКомпоненты. -// -// Результат: Булево, Истина - подключение прошло успешно. -// -// -Функция ПодключитьВнешнююКомпонентуИзОбщегоМакетаКонфигурации(Знач КлючСессии, Знач ИмяОбщегоМакета, Знач СимволическоеИмя, Знач ТипКомпоненты) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПодключениеВнешнейКомпонентыИзОбщегоМакетаКонфигурации( - ИмяОбщегоМакета)); - - Возврат ПодключитьВнешнююКомпоненту( - "ОбщийМакет." + ИмяОбщегоМакета, - СимволическоеИмя, - ТипКомпоненты); - -КонецФункции - -// Функция выполняет подключение внешней компоненты из макета объекта метаданных конфигурации, -// для использования ее в дополнительных отчетах и обработках, выполняющихся в -// контексте сервера. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}AttachAddin -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима, -// ОбъектМетаданных, ОбъектМетаданных, которому принадлежит макет с внешней компонентой, -// ИмяМакета - строка, имя макета конфигурации, в котором расположена -// внешняя компонента. Например, "КомпонентаПечатьШтрихкодов", -// СимволическоеИмя - строка, символическое имя подключаемой внешней компоненты, -// ТипКомпоненты - ТипВнешнейКомпоненты. -// -// Результат: Булево, Истина - подключение прошло успешно. -// -// -Функция ПодключитьВнешнююКомпонентуИзМакетаКонфигурации(Знач КлючСессии, Знач ОбъектМетаданных, Знач ИмяМакета, Знач СимволическоеИмя, Знач ТипКомпоненты) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПодключениеВнешнейКомпонентыИзМакетаКонфигурации( - ОбъектМетаданных, ИмяМакета)); - - Возврат ПодключитьВнешнююКомпоненту( - ОбъектМетаданных.ПолноеИмя() + ".Макет." + ИмяМакета, - СимволическоеИмя, - ТипКомпоненты); - -КонецФункции - -// Выполняет получение файла из внешнего объекта, помещает полученный файл во временное хранилище -// и возвращает адрес двоичных данных полученного файла во временном хранилище. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}GetFileFromExternalSoftware -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// ВнешнийОбъект - ВнешнийОбъект, внешний объект, из которого необходимо получить файл, -// ИмяМетода - строка, имя метода внешнего объекта, который необходимо вызвать для получения -// файла из внешнего объекта, -// Параметры - Массив(Произвольный), параметры вызова метода получения файла из внешнего объекта. -// Для параметра, в качестве которого должно передаваться имя файла в файловой системе, в массив -// следует добавлять ОбъектXDTO. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}InternalFileHandler. -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение: -// Строка, адрес во временном хранилище. -// -Функция ПолучитьФайлИзВнешнегоОбъекта(Знач КлючСессии, ВнешнийОбъект, Знач ИмяМетода, Знач Параметры, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПолучениеФайлаИзВнешнегоОбъекта()); - - ПроверитьКорректностьИмениМетодаВнешнегоОбъекта(ИмяМетода); - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - СтрокаПараметров = СформироватьСтрокуПараметровДляМетодаВнешнегоОбъекта(Параметры); - Выполнить("ВнешнийОбъект." + ИмяМетода + "(" + СтрокаПараметров + ");"); - - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - - Возврат Адрес; - -КонецФункции - -// Выполняет получение файла из временного хранилища и передает его во внешний объект. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}SendFileToExternalSoftware -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// ВнешнийОбъект - ВнешнийОбъект, внешний объект, из которого необходимо получить файл, -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла. -// ИмяМетода - строка, имя метода внешнего объекта, который необходимо вызвать для передачи -// файла во внешний объект, -// Параметры - Массив(Произвольный), параметры вызова метода передачи файла во внешний объект. -// Для параметра, в качестве которого должно передаваться имя файла в файловой системе, в массив -// следует добавлять ОбъектXDTO. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}InternalFileHandler. -// -Процедура ПередатьФайлВоВнешнийОбъект(Знач КлючСессии, ВнешнийОбъект, Знач АдресДвоичныхДанных, Знач ИмяМетода, Знач Параметры) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПередачаФайлаВоВнешнийОбъект()); - - ПроверитьКорректностьИмениМетодаВнешнегоОбъекта(ИмяМетода); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - СтрокаПараметров = СформироватьСтрокуПараметровДляМетодаВнешнегоОбъекта(Параметры); - Выполнить("ВнешнийОбъект." + ИмяМетода + "(" + СтрокаПараметров + ");"); - - Попытка - УдалитьФайлы(ВременныйФайл); - Исключение - ДополнительныеОтчетыИОбработки.ЗаписатьПредупреждение( - Неопределено, - НСтр("ru = 'Не удалось удалить временный файл ""%1"": - |%2'"), - ВременныйФайл, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; -КонецПроцедуры - -// Функция выполняет получение файла из сети Интернет по протоколам HTTP(S)/FTP. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}GetFileFromInternet -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// URL - строка, URL файла, который необходимо загрузить, -// Порт - число, номер сетевого порта, -// ИмяПользователя - строка, имя пользователя для авторизации на удаленном сервере -// (необходимо указывать только если для получения файла по указанному URL -// требуется прохождение авторизации), -// Пароль - строка, пароль пользователя для прохождения авторизации на удаленном -// сервере (необходимо указывать только если для получения файла по указанному URL -// требуется прохождение авторизации), -// Таймаут - таймаут на выполнение операции в секундах, по-умолчанию - 20 секунд, -// максимальное значение - 10 минут. -// -// Результат: -// Строка, адрес во временном хранилище, по которому был помещен файл, полученный по -// указанному URL. -// -Функция ПолучитьФайлИзИнтернета(Знач КлючСессии, Знач URL, Знач Порт = 0, Знач ИмяПользователя = "", Знач Пароль = "", Знач Таймаут = 20,Знач ЗащищенноеСоединение = Неопределено, Знач ПассивноеСоединение = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - ВызватьИсключение НСтр("ru = 'В данной конфигурации не поддерживается вызов функции ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПолучитьФайлИзИнтернета!'"); - КонецЕсли; - - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - - Если Порт = 0 Тогда - - ПолнаяСтруктураURL = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL); - - Если НЕ ПустаяСтрока(ПолнаяСтруктураURL.Порт) Тогда - ИмяСервера = ПолнаяСтруктураURL.Хост; - Порт = ПолнаяСтруктураURL.Порт; - КонецЕсли; - - КонецЕсли; - - Если Таймаут > 600 Тогда - Таймаут = 600; - КонецЕсли; - - СтруктураURL = МодульПолучениеФайловИзИнтернетаКлиентСервер.РазделитьURL(URL); - Протокол = СтруктураURL.Протокол; - ИмяСервера = СтруктураURL.ИмяСервера; - ПутьКФайлуНаСервере = СтруктураURL.ПутьКФайлуНаСервере; - - Если Порт = 0 Тогда - - Если ВРег(Протокол) = "HTTP" Тогда - Порт = 80; - ИначеЕсли ВРег(Протокол) = "FTP" Тогда - Порт = 21; - ИначеЕсли ВРег(Протокол) = "HTTPS" Тогда - Порт = 443; - КонецЕсли; - - КонецЕсли; - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПолучениеДанныхИзИнтернет( - ВРег(Протокол), ИмяСервера, Порт)); - - Если ВРег(Протокол) = "HTTPS" Тогда - ЗащищенноеСоединение = Истина; - КонецЕсли; - - Прокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Протокол); - - Если ВРег(Протокол) = "FTP" Тогда - Попытка - Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, ПассивноеСоединение, Таймаут); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании FTP-соединения с сервером %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - Иначе - Если ЗащищенноеСоединение = Истина Тогда - ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL; - Иначе - ЗащищенноеСоединение = Неопределено; - КонецЕсли; - - Попытка - Соединение = Новый HTTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, Таймаут, ЗащищенноеСоединение); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании HTTP-соединения с сервером %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - КонецЕсли; - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - - Попытка - Соединение.Получить(ПутьКФайлуНаСервере, ВременныйФайл); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при получении файла с сервера %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл)); - - УдалитьФайлы(ВременныйФайл); - - Возврат АдресХранилища; - -КонецФункции - -// Функция выполняет передачу файла в сеть Интернет по протоколам HTTP(S)/FTP. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}SendFileToInternet -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, который необходимо передать в Интернет. -// URL - строка, URL файла, который необходимо загрузить, -// Порт - число, номер сетевого порта, -// ИмяПользователя - строка, имя пользователя для авторизации на удаленном сервере -// (необходимо указывать только если для получения файла по указанному URL -// требуется прохождение авторизации), -// Пароль - строка, пароль пользователя для прохождения авторизации на удаленном -// сервере (необходимо указывать только если для получения файла по указанному URL -// требуется прохождение авторизации), -// Таймаут - таймаут на выполнение операции в секундах, по-умолчанию - 20 секунд, -// максимальное значение - 10 минут. -// -Функция ПередатьФайлВИнтернет(Знач КлючСессии, Знач АдресДвоичныхДанных, Знач URL, Знач Порт = 0, Знач ИмяПользователя = "", Знач Пароль = "", Знач Таймаут = 20,Знач ЗащищенноеСоединение = Неопределено, Знач ПассивноеСоединение = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - ВызватьИсключение НСтр("ru = 'В данной конфигурации не поддерживается вызов функции ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПередатьФайлВИнтернет!'"); - КонецЕсли; - - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - - Если Порт = 0 Тогда - - ПолнаяСтруктураURL = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL); - - Если НЕ ПустаяСтрока(ПолнаяСтруктураURL.Порт) Тогда - ИмяСервера = ПолнаяСтруктураURL.Хост; - Порт = ПолнаяСтруктураURL.Порт; - КонецЕсли; - - КонецЕсли; - - Если Таймаут > 600 Тогда - Таймаут = 600; - КонецЕсли; - - СтруктураURL = МодульПолучениеФайловИзИнтернетаКлиентСервер.РазделитьURL(URL); - Протокол = СтруктураURL.Протокол; - ИмяСервера = СтруктураURL.ИмяСервера; - ПутьКФайлуНаСервере = СтруктураURL.ПутьКФайлуНаСервере; - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеПередачаДанныхВИнтернет( - ВРег(Протокол), ИмяСервера, Порт)); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - - Если ВРег(Протокол) = "HTTPS" Тогда - ЗащищенноеСоединение = Истина; - КонецЕсли; - - Прокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Протокол); - - Если ВРег(Протокол) = "FTP" Тогда - Попытка - Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, ПассивноеСоединение, Таймаут); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании FTP-соединения с сервером %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - Иначе - Если ЗащищенноеСоединение = Истина Тогда - ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL; - Иначе - ЗащищенноеСоединение = Неопределено; - КонецЕсли; - - Попытка - Соединение = Новый HTTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, Таймаут, ЗащищенноеСоединение); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании HTTP-соединения с сервером %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - КонецЕсли; - - Попытка - Соединение.Записать(ВременныйФайл, ПутьКФайлуНаСервере); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Ошибка при передаче файла на сервер %1:'") + Символы.ПС + "%2"; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - -КонецФункции - -// Функция создает объект WSПрокси для подключения к веб-сервису. -// -// Объекту, вызывающему функцию, должно быть предоставлено разрешение. -// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1}SoapConnect -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// АдресWSDL - Строка - месторасположение wsdl. -// URIПространстваИмен - Строка - URI пространства имен web-сервиса. -// ИмяСервиса - Строка - имя сервиса. -// ИмяТочкиПодключения - Строка - если не задано, образуется как <ИмяСервиса>Soap. -// ИмяПользователя - Строка - имя пользователя для входа на сервер. -// Пароль - Строка - пароль пользователя. -// Таймаут - Число - таймаут на операции выполняемые через полученное прокси. -// -// Возвращаемое значение: WSПрокси. -// -Функция WSСоединение(Знач КлючСессии, Знач АдресWSDL, Знач URIПространстваИмен, Знач ИмяСервиса, Знач ИмяТочкиПодключения = "", Знач ИмяПользователя = "", Знач Пароль = "", Знач Таймаут = 20) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Если Таймаут > 600 Тогда - Таймаут = 600; - КонецЕсли; - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьЛегитимностьВыполненияОперации(КлючСессии, - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.РазрешениеWSСоединение( - АдресWSDL)); - - ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси(); - ПараметрыПодключения.АдресWSDL = АдресWSDL; - ПараметрыПодключения.URIПространстваИмен = URIПространстваИмен; - ПараметрыПодключения.ИмяСервиса = ИмяСервиса; - ПараметрыПодключения.ИмяТочкиПодключения = ИмяТочкиПодключения; - ПараметрыПодключения.ИмяПользователя = ИмяПользователя; - ПараметрыПодключения.Пароль = Пароль; - ПараметрыПодключения.Таймаут = Таймаут; - - Возврат ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения); - -КонецФункции - -// Функция выполняет запись документов с проведением / отменой проведения. -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима; -// ОбрабатываемыеДокументы - Массив(ДокументОбъект), массив документов, которые необходимо записать, -// РежимЗаписи - РежимЗаписиДокумента, режим, в котором необходимо записывать документы. -// РежимПроведения - РежимПроведенияДокумента, режим, в котором необходимо проводить документы. -// -Функция ПроведениеДокументов(Знач КлючСессии, ОбрабатываемыеДокументы, Знач РежимЗаписи = Неопределено, Знач РежимПроведения = Неопределено) Экспорт - - ПараметрыЗаписи = Новый Структура; - - Если РежимЗаписи <> Неопределено Тогда - - ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписи); - - КонецЕсли; - - Если РежимПроведения <> Неопределено Тогда - - ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведения); - - КонецЕсли; - - ЗаписатьОбъекты(КлючСессии, ОбрабатываемыеДокументы, ПараметрыЗаписи); - -КонецФункции - -// Функция - выполняет запись объектов. -// -// Параметры: -// КлючСессии - УникальныйИдентификатор - ключ сессии расширения безопасного режима. -// ОбрабатываемыеОбъекты - Массив - объекты, которые необходимо записать. -// Допустимые типы: -// СправочникОбъект; -// КонстантаМенеджерЗначения; -// ПланВидовХарактеристикОбъект; -// ПланСчетовОбъект; -// ПланВидовРасчетаОбъект; -// ПланОбменаОбъект; -// БизнесПроцессОбъект; -// ЗадачаОбъект; -// ДокументОбъект; -// РегистрСведенийНаборЗаписей; -// РегистрНакопленияНаборЗаписей; -// ПоследовательностьНаборЗаписей; -// РегистрБухгалтерииНаборЗаписей; -// РегистрРасчетаНаборЗаписей. -// ПараметрыЗаписи - Структура - параметры записи объектов (необязательный) -// <РежимЗаписи> (необязательный). Тип: РежимЗаписиДокумента. Значение по умолчанию: Запись. -// <РежимПроведения> (необязательный). Тип: РежимПроведенияДокумента. Значение по умолчанию: Неоперативный. -// <Замещать> (необязательный). Тип: Булево. Значение по умолчанию: Истина. -// <ТолькоЗапись> (необязательный). Тип: Булево. Значение по умолчанию: Ложь. -// <ЗаписьФактическогоПериодаДействия> (необязательный). Тип: Булево. Значение по умолчанию: Истина. -// <ЗаписьПерерасчетов> (необязательный). Тип: Булево. Значение по умолчанию: Истина. -// -// Возвращаемое значение: -// - -// -Функция ЗаписатьОбъекты(Знач КлючСессии, ОбрабатываемыеОбъекты, Знач ПараметрыЗаписи = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - // Инициализация параметров, передаваемых методу "Записать". - Если ПараметрыЗаписи = Неопределено Тогда - - ПараметрыЗаписи = Новый Структура; - - КонецЕсли; - - // Параметры для документов. - Если НЕ ПараметрыЗаписи.Свойство("РежимЗаписи") Тогда - - ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись); - - КонецЕсли; - - Если НЕ ПараметрыЗаписи.Свойство("РежимПроведения") Тогда - - ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Неоперативный); - - КонецЕсли; - - // Параметры для регистров и последовательностей. - Если НЕ ПараметрыЗаписи.Свойство("Замещать") Тогда - - ПараметрыЗаписи.Вставить("Замещать", Истина); - - КонецЕсли; - - // Параметры для регистров расчета. - Если НЕ ПараметрыЗаписи.Свойство("ТолькоЗапись") Тогда - - ПараметрыЗаписи.Вставить("ТолькоЗапись", Ложь); - - КонецЕсли; - - Если НЕ ПараметрыЗаписи.Свойство("ЗаписьФактическогоПериодаДействия") Тогда - - ПараметрыЗаписи.Вставить("ЗаписьФактическогоПериодаДействия", Истина); - - КонецЕсли; - - Если НЕ ПараметрыЗаписи.Свойство("ЗаписьПерерасчетов") Тогда - - ПараметрыЗаписи.Вставить("ЗаписьПерерасчетов", Истина); - - КонецЕсли; - - // Запись объектов. - Для каждого ОбрабатываемыйОбъект Из ОбрабатываемыеОбъекты Цикл - - НачатьТранзакцию(); - - Попытка - - МетаданныеОбрабатываемогоОбъекта = ОбрабатываемыйОбъект.Метаданные(); - - // СправочникОбъект, КонстантаМенеджерЗначения, ПланВидовХарактеристикОбъект, ПланСчетовОбъект, - // ПланВидовРасчетаОбъект, ПланОбменаОбъект, БизнесПроцессОбъект, ЗадачаОбъект. - Если ОбщегоНазначения.ЭтоСправочник(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоКонстанта(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоПланВидовХарактеристик(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоПланОбмена(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоБизнесПроцесс(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоЗадача(МетаданныеОбрабатываемогоОбъекта) Тогда - - ОбрабатываемыйОбъект.Записать(); - - // ДокументОбъект. - ИначеЕсли ОбщегоНазначения.ЭтоДокумент(МетаданныеОбрабатываемогоОбъекта) Тогда - - ОбрабатываемыйОбъект.Записать(ПараметрыЗаписи.РежимЗаписи, ПараметрыЗаписи.РежимПроведения); - - // РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, - // ПоследовательностьНаборЗаписей, РегистрБухгалтерииНаборЗаписей. - ИначеЕсли ОбщегоНазначения.ЭтоРегистрСведений(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоРегистрНакопления(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоПоследовательность(МетаданныеОбрабатываемогоОбъекта) - ИЛИ ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеОбрабатываемогоОбъекта) Тогда - - ОбрабатываемыйОбъект.Записать(ПараметрыЗаписи.Замещать); - - // РегистрРасчетаНаборЗаписей. - ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(МетаданныеОбрабатываемогоОбъекта) Тогда - - ОбрабатываемыйОбъект.Записать( - ПараметрыЗаписи.Замещать, - ПараметрыЗаписи.ТолькоЗапись, - ПараметрыЗаписи.ЗаписьФактическогоПериодаДействия, - ПараметрыЗаписи.ЗаписьПерерасчетов); - - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - - КонецЦикла; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПроверитьКорректностьИмениМетодаВнешнегоОбъекта(Знач ИмяМетода) - - ЗапрещенныеСимволы = Новый Массив(); - ЗапрещенныеСимволы.Добавить(","); - ЗапрещенныеСимволы.Добавить("("); - ЗапрещенныеСимволы.Добавить(")"); - ЗапрещенныеСимволы.Добавить(";"); - - Для Каждого ЗапрещенныйСимвол Из ЗапрещенныеСимволы Цикл - - Если СтрНайти(ИмяМетода, ЗапрещенныйСимвол) > 0 Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 не является корректным именем метода для COM-объекта или объекта внешней компоненты!'"), ИмяМетода); - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Функция СформироватьСтрокуПараметровДляМетодаВнешнегоОбъекта(Знач Параметры) - - СтрокаПараметров = ""; - Итератор = 0; - Для Каждого Параметр Из Параметры Цикл - - Если Не ПустаяСтрока(СтрокаПараметров) Тогда - СтрокаПараметров = СтрокаПараметров + ", "; - КонецЕсли; - - ПередачаФайла = Ложь; - Если ТипЗнч(Параметр) = Тип("ТипОбъектаXDTO") Тогда - Если Параметр = ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ПараметрПередаваемыйФайл() Тогда - ПередачаФайла = Истина; - КонецЕсли; - КонецЕсли; - - Если ПередачаФайла Тогда - СтрокаПараметров = СтрокаПараметров + "ВременныйФайл"; - Иначе - СтрокаПараметров = СтрокаПараметров + "Параметры[" + Формат(Итератор, "ЧДЦ=0; ЧН=0; ЧГ=0") + "]"; - КонецЕсли; - - Итератор = Итератор + 1; - - КонецЦикла; - - Возврат СтрокаПараметров; - -КонецФункции - -Процедура ПроверитьКорректностьВызоваПоОкружению() - - Если Не ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьКорректностьВызоваПоОкружению() Тогда - - ВызватьИсключение НСтр("ru = 'Некорректный вызов функции общего модуля ДополнительныеОтчетыИОбработкиВБезопасномРежиме! - |Экспортируемые функции данного модуля для использования в безопасном режиме должны вызываться только - |из сценария!'"); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/ДополнительныеОтчетыИОбработкиВБезопасномРежиме.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/ДополнительныеОтчетыИОбработкиВБезопасномРежиме.mdo deleted file mode 100644 index d68fa6ada..000000000 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/ДополнительныеОтчетыИОбработкиВБезопасномРежиме.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - ДополнительныеОтчетыИОбработкиВБезопасномРежиме - - ru - Дополнительные отчеты и обработки в безопасном режиме - - true - true - true - diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/Module.bsl deleted file mode 100644 index fe1f085a9..000000000 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/Module.bsl +++ /dev/null @@ -1,382 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", расширение безопасного режима. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область УстаревшийПрограммныйИнтерфейс - -// Создает объект ТекстовыйДокумент и инициализирует его данными файла, помещенном во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, -// ТипФайла - КодировкаТекста или строка - кодировка текста в открываемом файле, -// см. описание метода ТекстовыйДокумент.Прочитать() в синтаксис-помощнике, -// РазделительСтрок - строка, строка, являющаяся разделителем строк, -// см. описание метода ТекстовыйДокумент.Прочитать() в синтаксис-помощнике. -// -// Возвращаемое значение: ТекстовыйДокумент. -// -Функция ТекстовыйДокументИзДвоичныхДанных(Знач АдресДвоичныхДанных, Знач ТипФайла = Неопределено, Знач РазделительСтрок = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - ТекстовыйДокумент = Новый ТекстовыйДокумент(); - ТекстовыйДокумент.Прочитать(ВременныйФайл, ТипФайла, РазделительСтрок); - УдалитьФайлы(ВременныйФайл); - - Возврат ТекстовыйДокумент; - -КонецФункции - -// Записывает текстовый документ во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ТекстовыйДокумент - ТекстовыйДокумент, который необходимо сохранить, -// ТипФайла - КодировкаТекста или строка - кодировка текста в открываемом файле, -// см. описание метода ТекстовыйДокумент.Записать() в синтаксис-помощнике, -// РазделительСтрок - строка, строка, являющаяся разделителем строк, -// см. описание метода ТекстовыйДокумент.Записать() в синтаксис-помощнике, -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ТекстовыйДокументВДвоичныеДанные(Знач ТекстовыйДокумент, Знач ТипФайла = Неопределено, Знач РазделительСтрок = Неопределено, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - ТекстовыйДокумент.Записать(ВременныйФайл, ТипФайла, РазделительСтрок); - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - - Возврат Адрес; - -КонецФункции - -// Создает объект ТабличныйДокумент и инициализирует его данными файла, помещенном во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла. -// -// Возвращаемое значение: ТабличныйДокумент. -// -Функция ТабличныйДокументИзДвоичныхДанных(Знач АдресДвоичныхДанных) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - ТабличныйДокумент = Новый ТабличныйДокумент(); - ТабличныйДокумент.Прочитать(ВременныйФайл); - УдалитьФайлы(ВременныйФайл); - - Возврат ТабличныйДокумент; - -КонецФункции - -// Записывает табличный документ во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ТабличныйДокумент - ТабличныйДокумент, который необходимо сохранить, -// ТипФайла - ТипФайлаТабличногоДокумента - формат, в котором будет сохранен табличный документ, -// см. описание метода ТабличныйДокумент.Записать() в синтаксис-помощнике, -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ТабличныйДокументВДвоичныеДанные(Знач ТабличныйДокумент, Знач ТипФайла = Неопределено, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - ТабличныйДокумент.Записать(ВременныйФайл, ТипФайла); - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - - Возврат Адрес; - -КонецФункции - -// Записывает форматированный документ во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// ФорматированныйДокумент - ФорматированныйДокумент, который необходимо сохранить, -// ТипФайла - ТипФайлаФорматированногоДокумента - формат, в котором будет сохранен форматированный документ, -// см. описание метода ФорматированныйДокумент.Записать() в синтаксис-помощнике, -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище. -// В синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция ФорматированныйДокументВДвоичныеДанные(Знач ФорматированныйДокумент, Знач ТипФайла = Неопределено, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - ФорматированныйДокумент.Записать(ВременныйФайл, ТипФайла); - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - - Возврат Адрес; - -КонецФункции - -// Возвращает текстовое содержимое из файла, помещенного во временное хранилище -// по адресу, переданному в качестве значения параметра АдресДвоичныхДанных. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, -// Кодировка - КодировкаТекста или строка - кодировка текста читаемого файла, -// см. описание метода ЧтениеТекста.Открыть() в синтаксис-помощнике, -// РазделительСтрок - строка, строка, являющаяся разделителем строк в файле, -// см. описание метода ЧтениеТекста.Открыть() в синтаксис-помощнике, -// КонвертируемыйРазделительСтрок - строка, строка, являющаяся разделителем строк при конвертации -// в стандартный перевод строк, см. описание метода ЧтениеТекста.Открыть() -// в синтаксис-помощнике. -// -// Возвращаемое значение: строка. -// -Функция СтрокаИзДвоичныхДанных(Знач АдресДвоичныхДанных, Знач Кодировка = Неопределено, Знач РазделительСтрок = Неопределено, Знач КонвертируемыйРазделительСтрок = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - Чтение = Новый ЧтениеТекста(); - Чтение.Открыть(ВременныйФайл, Кодировка, РазделительСтрок, КонвертируемыйРазделительСтрок); - Результат = Чтение.Прочитать(); - Чтение.Закрыть(); - УдалитьФайлы(ВременныйФайл); - - Возврат Результат; - -КонецФункции - -// Записывает переданную строку во временный файл, помещает двоичные данные во временное хранилище -// и возвращает адрес двоичных данных файла во временном хранилище. -// -// Параметры: -// Строка - ФорматированныйДокумент, который необходимо сохранить, -// Кодировка - КодировкаТекста или строка - кодировка текста читаемого файла, -// см. описание метода ЧтениеТекста.Открыть() в синтаксис-помощнике, -// РазделительСтрок - строка, строка, являющаяся разделителем строк в файле, -// см. описание метода ЧтениеТекста.Открыть() в синтаксис-помощнике, -// КонвертируемыйРазделительСтрок - строка, строка, являющаяся разделителем строк при конвертации -// в стандартный перевод строк, см. описание метода ЧтениеТекста.Открыть() -// в синтаксис-помощнике. -// Адрес - строка или УникальныйИдентификатор, адрес во временном хранилище, по которому надо поместить данные -// или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и -// вернуть новый адрес, см. описание метода глобального контекста ПоместитьВоВременноеХранилище -// в синтаксис-помощнике. -// -// Возвращаемое значение - строка, адрес во временном хранилище. -// -Функция СтрокаВДвоичныеДанные(Знач Строка, Знач Кодировка = Неопределено, Знач РазделительСтрок = Неопределено, Знач КонвертируемыйРазделительСтрок = Неопределено, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - Запись = Новый ЗаписьТекста(); - Запись.Открыть(ВременныйФайл, Кодировка, РазделительСтрок, Ложь, КонвертируемыйРазделительСтрок); - Запись.Записать(Строка); - Запись.Закрыть(); - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - - Возврат Адрес; - -КонецФункции - -// Функция выполняет распаковку zip-архива. -// -// Параметры: -// АдресДвоичныхДанных - строка, адрес во временном хранилище, по которому были -// помещены двоичные данные файла, -// Пароль - строка, пароль для доступа к ZIP файлу, если файл зашифрован, -// ИдентификаторФормы - УникальныйИдентификатор, уникальный идентификатор формы, -// см. описание метода глобального контекста ПоместитьВоВременноеХранилище -// в синтаксис-помощнике. -// -// Возвращаемое значение: -// Соответствие: -// Ключом соответствия являются имена файлов и каталог, содержащихся в архиве, -// Значением соответствия для файлов из архива является адрес во временном -// хранилище, по которому помещены двоичные данные файла, -// для каталогов - аналогичное соответствие. -// -Функция РаспаковатьАрхив(Знач АдресДвоичныхДанных, Знач Пароль = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - ВременныйФайл = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПолучитьФайлИзВременногоХранилища(АдресДвоичныхДанных); - КаталогРаспаковки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогРаспаковки); - Чтение = Новый ЧтениеZipФайла(); - Чтение.Открыть(ВременныйФайл, Пароль); - Чтение.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.Восстанавливать); - Чтение.Закрыть(); - ОписаниеАрхива = Новый Соответствие; - ИтерацияРаспаковкиАрхива(КаталогРаспаковки + "\", ОписаниеАрхива, ИдентификаторФормы); - УдалитьФайлы(ВременныйФайл); - УдалитьФайлы(КаталогРаспаковки); - - Возврат ОписаниеАрхива; - -КонецФункции - -// Функция выполняет упаковку файлов в zip-архив. -// -// Параметры: -// ОписаниеАрхива - Соответствие: -// Ключом соответствия являются имена файлов и каталог, содержащихся в архиве, -// Значением соответствия для файлов из архива является адрес во временном -// хранилище, по которому помещены двоичные данные файла, -// для каталогов - аналогичное соответствие, -// Пароль - строка, пароль для доступа к ZIP файлу, если файл зашифрован, -// Комментарий - строка, комментарий, описывающий zip-файл, -// МетодСжатия - МетодСжатияZIP - метод сжатия, которым будет сжиматься zip-файл, -// УровеньСжатия - УровеньСжатияZIP - уровень сжатия данных, -// МетодШифрования - МетодШифрованияZIP - алгоритм шифрования, которым будет -// зашифрован zip-файл, -// ИдентификаторФормы - УникальныйИдентификатор, уникальный идентификатор формы, -// см. описание метода глобального контекста ПоместитьВоВременноеХранилище -// в синтаксис-помощнике. -// -// Возвращаемое значение: -// Строка, адрес во временном хранилище, по которому были помещены двоичные данные -// упакованного архива. -// -Функция УпаковатьФайлыВАрхив(Знач ОписаниеАрхива, Знач Пароль = Неопределено, Знач Комментарий = Неопределено, Знач МетодСжатия = Неопределено, Знач УровеньСжатия = Неопределено, Знач МетодШифрования = Неопределено, Знач Адрес = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Если МетодСжатия = Неопределено Тогда - МетодСжатия = МетодСжатияZIP.Сжатие; - КонецЕсли; - - Если УровеньСжатия = Неопределено Тогда - УровеньСжатия = УровеньСжатияZIP.Оптимальный; - КонецЕсли; - - Если МетодШифрования = Неопределено Тогда - МетодШифрования = МетодШифрованияZIP.Zip20; - КонецЕсли; - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - КаталогУпаковки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогУпаковки); - ИтерацияУпаковкиАрхива(ОписаниеАрхива, КаталогУпаковки + "\"); - Запись = Новый ЗаписьZipФайла(); - Запись.Открыть(ВременныйФайл, Пароль, Комментарий, МетодСжатия, УровеньСжатия, МетодШифрования); - Запись.Добавить(КаталогУпаковки, - РежимСохраненияПутейZIP.СохранятьОтносительныеПути, - РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); - Запись.Записать(); - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), Адрес); - УдалитьФайлы(ВременныйФайл); - УдалитьФайлы(КаталогУпаковки); - - Возврат Адрес; - -КонецФункции - -// Выполняет сценарий дополнительного отчета или обработки в безопасном режиме. -// -// Параметры: -// КлючСессии - УникальныйИдентификатор, ключ сессии расширения безопасного режима, -// АдресСценария - строка, адрес во временном хранилище, по которому расположена таблица значений, -// являющаяся сценарием, -// КлючЗапуска - СправочникСсылка.ДополнительныеОтчетыИОбработки, ключ запуска, переданный -// дополнительной обработке при ее инициализации. -// -// Возвращаемое значение: Произвольный. -// -Функция ВыполнитьСценарийВБезопасномРежиме(Знач КлючСессии, Знач АдресСценария, ПараметрыВыполнения = Неопределено, СохраняемыеПараметры = Неопределено, ОбъектыНазначения = Неопределено) Экспорт - - ПроверитьКорректностьВызоваПоОкружению(); - - Сценарий = ПолучитьИзВременногоХранилища(АдресСценария); - ИсполняемыйОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки( - Справочники.ДополнительныеОтчетыИОбработки.ПолучитьСсылку(КлючСессии)); - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ВыполнитьСценарийБезопасногоРежима( - КлючСессии, Сценарий, ИсполняемыйОбъект, ПараметрыВыполнения, СохраняемыеПараметры, ОбъектыНазначения); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Для внутреннего использования. -Функция ИтерацияРаспаковкиАрхива(Знач КаталогРаспаковки, ОписаниеАрхива, Знач ИдентификаторФормы) - - Содержимое = НайтиФайлы(КаталогРаспаковки, "*" , Ложь); - Для Каждого ЭлементСодержимого Из Содержимое Цикл - Если ЭлементСодержимого.ЭтоКаталог() Тогда - - ОписаниеАрхива.Вставить(ЭлементСодержимого.Имя, - ИтерацияРаспаковкиАрхива( - ЭлементСодержимого.Путь + "\", Новый Соответствие(), ИдентификаторФормы)); - - Иначе - - ОписаниеАрхива.Вставить(ЭлементСодержимого.Имя, - ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ЭлементСодержимого.ПолноеИмя), - ИдентификаторФормы)); - - КонецЕсли; - КонецЦикла; - -КонецФункции - -// Для внутреннего использования. -Процедура ИтерацияУпаковкиАрхива(Знач ОписаниеАрхива, Знач КаталогУпаковки) - - Для Каждого ЭлементАрхива Из ОписаниеАрхива Цикл - - Если ТипЗнч(ЭлементАрхива.Значение) = Тип("Соответствие") Тогда - - ИмяПодкаталога = КаталогУпаковки + ЭлементАрхива.Ключ; - СоздатьКаталог(ИмяПодкаталога); - ИтерацияУпаковкиАрхива(ЭлементАрхива.Значение, ИмяПодкаталога + "\"); - - Иначе - - ПолучитьИзВременногоХранилища(ЭлементАрхива.Значение).Записать( - КаталогУпаковки + ЭлементАрхива.Ключ); - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ПроверитьКорректностьВызоваПоОкружению() - - Если Не ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПроверитьКорректностьВызоваПоОкружению() Тогда - - ВызватьИсключение НСтр("ru = 'Некорректный вызов функции общего модуля ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера! - |Экспортируемые функции данного модуля для использования в безопасном режиме должны вызываться только - |из сценария или из контекста клиентского приложения!'"); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.mdo deleted file mode 100644 index c05db85c2..000000000 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера/ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера - - ru - Дополнительные отчеты и обработки в безопасном режиме вызов сервера - - true - true - diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс/Module.bsl index 92ce6d6e8..f5e13e1d3 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс/Module.bsl @@ -1,37 +1,49 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА РАЗРЕШЕНИЙ ДОПОЛНИТЕЛЬНЫХ ОТЧЕТОВ И ОБРАБОТОК -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - пространство имен текущей. +// Функция Пакет() Экспорт Возврат "http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/" + Версия(); КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - версия. +// Функция Версия() Экспорт Возврат "1.0.0.1"; КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает название программного интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - идентификатор программного интерфейса. +// Функция ПрограммныйИнтерфейс() Экспорт Возврат "ApplicationExtensionsPermissions"; КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Выполняет регистрацию поддерживаемых версий интерфейса сообщений. // // Параметры: -// СтруктураПоддерживаемыхВерсий - структура: -// Ключ - название программного интерфейса. -// Значение - массив поддерживаемых версий. +// СтруктураПоддерживаемыхВерсий - Структура - в качестве ключа передается название программного интерфейса, +// а в качестве значения массив поддерживаемых версий. // Процедура ЗарегистрироватьИнтерфейс(Знач СтруктураПоддерживаемыхВерсий) Экспорт @@ -41,83 +53,122 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - массив обработчиков. // Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида действия, соответствующего вызову метода конфигурации. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидДействияВызовМетодаКонфигурации() Экспорт Возврат "МетодКонфигурации"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида действия, соответствующего вызову метода обработки. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидДействияВызовМетодаОбработки() Экспорт Возврат "МетодОбработки"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему ключу запуска. // +// Возвращаемое значение: +// Строка - вида параметра. +// Функция ВидПараметраКлючСессии() Экспорт Возврат "КлючСессии"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему фиксированному значению. // +// Возвращаемое значение: +// Строка - идентификатор вида параметра. +// Функция ВидПараметраЗначение() Экспорт Возврат "ФиксированноеЗначение"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему сохраняемому значению. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидПараметраСохраняемоеЗначение() Экспорт Возврат "СохраняемоеЗначение"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему коллекции сохраняемых значений. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидПараметраКоллекцияСохраняемыхЗначений() Экспорт Возврат "КоллекцияСохраняемыхЗначений"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему параметру выполнения команды. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидПараметраПараметрВыполненияКоманды() Экспорт Возврат "ПараметрВыполненияКоманды"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает идентификатор вида параметра, соответствующему коллекции объектов назначения. // +// Возвращаемое значение: +// Строка - идентификатор вида действия. +// Функция ВидПараметраОбъектыНазначения() Экспорт Возврат "ОбъектыНазначения"; // Не локализуется КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Конструктор пустой таблицы значений, которая используется в качестве описания сценария, // выполняемого в безопасном режиме. // -// Возвращаемое значение: ТаблицаЗначений. +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * ВидДействия - Строка - идентификатор вида действия, +// * ИмяМетода - Строка - идентификатор имени метода, +// * Параметры - ТаблицаЗначений - таблица параметров, +// * СохранениеРезультата - Строка - сохранение результата. // Функция НовыйСценарий() Экспорт @@ -131,18 +182,19 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в сценарий выполнения обработки в безопасном режиме этап сценария, содержащий // выполнение метода конфигурации. // // Параметры: -// Сценарий, ТаблицаЗначений, структура колонок должна соответствовать результату, возвращаемому. -// Функцией НовыйСценарий(), -// ИмяМетода - Строка, имя метода конфигурации, вызов которого предполагается на этапе выполнения +// Сценарий - ТаблицаЗначений - см. НовыйСценарий, +// ИмяМетода - Строка - имя метода конфигурации, вызов которого предполагается на этапе выполнения // этапа сценария, -// СохранениеРезультата - Строка, имя сохраняемого значения сценария, в котором будет сохранен +// СохранениеРезультата - Строка - имя сохраняемого значения сценария, в котором будет сохранен // результат выполнения метода, переданного в качестве значения параметра ИмяМетода. // -// Возвращаемое значение: СтрокаТаблицыЗначений. +// Возвращаемое значение: +// СтрокаТаблицыЗначений - см. НовыйСценарий. // Функция ДобавитьМетодКонфигурации(Сценарий, Знач ИмяМетода, Знач СохранениеРезультата = "") Экспорт @@ -150,18 +202,19 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в сценарий выполнения обработки в безопасном режиме этап сценария, содержащий // выполнение метода обработки. // // Параметры: -// Сценарий, ТаблицаЗначений, структура колонок должна соответствовать результату, возвращаемому. -// Функцией НовыйСценарий(), -// ИмяМетода - Строка, имя метода конфигурации, вызов которого предполагается на этапе выполнения +// Сценарий - ТаблицаЗначений - см. НовыйСценарий, +// ИмяМетода - Строка - имя метода конфигурации, вызов которого предполагается на этапе выполнения // этапа сценария, -// СохранениеРезультата - Строка, имя сохраняемого значения сценария, в котором будет сохранен +// СохранениеРезультата - Строка - имя сохраняемого значения сценария, в котором будет сохранен // результат выполнения метода, переданного в качестве значения параметра ИмяМетода. // -// Возвращаемое значение: СтрокаТаблицыЗначений. +// Возвращаемое значение: +// СтрокаТаблицыЗначений - см. НовыйСценарий. // Функция ДобавитьМетодОбработки(Сценарий, Знач ИмяМетода, Знач СохранениеРезультата = "") Экспорт @@ -169,10 +222,14 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Конструктор пустой таблицы значений, которая используется в качестве описания // параметров элементов сценария, выполняемого в безопасном режиме. // -// Возвращаемое значение: ТаблицаЗначений. +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * Вид - Строка - вид параметра, +// * Значение - Произвольный - значение параметра. // Функция НоваяТаблицаПараметров() Экспорт @@ -184,11 +241,11 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров ключ запуска текущей обработки. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации -// или ДобавитьМетодОбработки. +// Этап - СтрокаТаблицыЗначений - см. ДобавитьМетодКонфигурации или см.ДобавитьМетодОбработки. // Процедура ДобавитьКлючСессии(Этап) Экспорт @@ -196,12 +253,12 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров фиксированное значение. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации. -// или ДобавитьМетодОбработки, -// Значение - Произвольный, фиксированное значение. +// Этап - СтрокаТаблицыЗначений - см. ДобавитьМетодКонфигурации или см. ДобавитьМетодОбработки, +// Значение - Произвольный - фиксированное значение. // Процедура ДобавитьЗначение(Этап, Знач Значение) Экспорт @@ -209,12 +266,12 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров фиксированное значение. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации. -// или ДобавитьМетодОбработки, -// СохраняемоеЗначение - Строка, имя переменной сохраняемого значения внутри сценария. +// Этап - СтрокаТаблицыЗначений - см. ДобавитьМетодКонфигурации или см. ДобавитьМетодОбработки, +// СохраняемоеЗначение - Строка - имя переменной сохраняемого значения внутри сценария. // Процедура ДобавитьСохраняемоеЗначение(Этап, Знач СохраняемоеЗначение) Экспорт @@ -222,11 +279,11 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров коллекцию сохраняемых значений. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации -// или ДобавитьМетодОбработки. +// Этап - СтрокаТаблицыЗначений - см. ДобавитьМетодКонфигурации или см. ДобавитьМетодОбработки. // Процедура ДобавитьКоллекциюСохраняемыхЗначений(Этап) Экспорт @@ -234,12 +291,12 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров параметр выполнения команды. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации. -// или ДобавитьМетодОбработки, -// ИмяПараметра - Строка, имя параметра выполнения команды. +// Этап - СтрокаТаблицыЗначений - см. ДобавитьМетодКонфигурации или см. ДобавитьМетодОбработки, +// ИмяПараметра - Строка - имя параметра выполнения команды. // Процедура ДобавитьПараметрВыполненияКоманды(Этап, Знач ИмяПараметра) Экспорт @@ -247,11 +304,11 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Добавляет в таблицу параметров коллекцию объектов назначения. // // Параметры: -// Этап - СтрокаТаблицыЗначений, возвращенная методами ДобавитьМетодКонфигурации -// или ДобавитьМетодОбработки. +// Этап - СтрокаТаблицыЗначений- см. ДобавитьМетодКонфигурации или см. ДобавитьМетодОбработки. // Процедура ДобавитьОбъектыНазначения(Этап) Экспорт @@ -259,14 +316,15 @@ КонецПроцедуры +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}CreateComObject // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипСозданиеCOMОбъекта(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -274,14 +332,17 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}CreateComObject // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ProgId - Строка - ProgID класса COM, с которым он зарегистрирован в системе. +// Например, "Excel.Application". +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеСозданиеCOMОбъекта(Знач ProgId, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -293,14 +354,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}AttachAddin // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипПодключениеВнешнейКомпоненты(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -308,14 +370,16 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}AttachAddin // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИмяОбщегоМакета - Строка - имя общего макета, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПодключениеВнешнейКомпонентыИзОбщегоМакетаКонфигурации(Знач ИмяОбщегоМакета, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -327,14 +391,17 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}AttachAddin // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ОбъектМетаданных - ОбъектМетаданных - объект метаданных, +// ИмяМакета - Строка - имя макета, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПодключениеВнешнейКомпонентыИзМакетаКонфигурации(Знач ОбъектМетаданных, Знач ИмяМакета, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -346,14 +413,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}GetFileFromExternalSoftware // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипПолучениеФайлаИзВнешнегоОбъекта(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -361,14 +429,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}GetFileFromExternalSoftware // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПолучениеФайлаИзВнешнегоОбъекта(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -379,14 +448,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SendFileToExternalSoftware // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипПередачаФайлаВоВнешнийОбъект(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -394,14 +464,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SendFileToExternalSoftware // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПередачаФайлаВоВнешнийОбъект(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -412,14 +483,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}GetFileFromInternet // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO- тип сообщения. // Функция ТипПолучениеДанныхИзИнтернет(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -427,14 +499,18 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}GetFileFromInternet // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// Протокол - Строка - протокол, +// Сервер - Строка - сервер, +// Порт - Строка - порт, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПолучениеДанныхИзИнтернет(Знач Протокол, Знач Сервер, Знач Порт, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -448,14 +524,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SendFileToInternet // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипПередачаДанныхВИнтернет(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -463,14 +540,18 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SendFileToInternet // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// Протокол - Строка- используемый протокол передачи данных, +// Сервер - Строка - сервер, +// Порт - Строка - порт, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПередачаДанныхВИнтернет(Знач Протокол, Знач Сервер, Знач Порт, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -484,14 +565,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SoapConnect // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипWSСоединение(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -499,14 +581,16 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}SoapConnect // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// АдресWSDL - Строка - адрес публикации WSDL, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеWSСоединение(Знач АдресWSDL, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -518,14 +602,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}DocumentPosting // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ТипПроведениеДокументов(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -533,14 +618,17 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает объект {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}DocumentPosting // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ОбъектМетаданных - ОбъектМетаданных - объект метаданных, +// РежимЗаписи - РежимЗаписиДокумента - режим записи документа, +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ОбъектXDTO +// ОбъектXDTO - разрешение. // Функция РазрешениеПроведениеДокументов(Знач ОбъектМетаданных, Знач РежимЗаписи, Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -557,14 +645,15 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}InternalFileHandler // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция ПараметрПередаваемыйФайл(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -572,10 +661,12 @@ КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает значение, соответствующее любому значению ограничителя (*) при // регистрации разрешений, запрашиваемых дополнительной обработкой. // -// Возвращаемое значение: Неопределено. +// Возвращаемое значение: +// Неопределено - любое значение. // Функция ЛюбоеЗначение() Экспорт @@ -585,6 +676,8 @@ #КонецОбласти +#КонецОбласти + #Область СлужебныеПроцедурыИФункции Функция СоздатьТипСообщения(Знач ИспользуемыйПакет, Знач Тип) @@ -630,10 +723,12 @@ // Если у обработки есть команды, которые являются сценарием - добавляем права на работу с каталогом временных // файлов. + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ОтборСценариев = Новый Структура("ВариантЗапуска", Перечисления.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме); ЕстьСценарии = ДополнительныйОтчетИлиОбработка.Команды.НайтиСтроки(ОтборСценариев).Количество() > 0; Если ЕстьСценарии Тогда - Результат.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); + Результат.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); КонецЕсли; // Преобразуем разрешения в нотации "расширения" безопасного режима. @@ -642,7 +737,7 @@ Если Разрешение.Тип() = ТипПолучениеДанныхИзИнтернет(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( Разрешение.Protocol, Разрешение.Host, Разрешение.Port)); @@ -650,7 +745,7 @@ ИначеЕсли Разрешение.Тип() = ТипПередачаДанныхВИнтернет(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( Разрешение.Protocol, Разрешение.Host, Разрешение.Port)); @@ -660,7 +755,7 @@ СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Разрешение.WsdlDestination); Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( СтруктураURI.Схема, СтруктураURI.ИмяСервера, СтруктураURI.Порт)); @@ -668,29 +763,29 @@ ИначеЕсли Разрешение.Тип() = ТипСозданиеCOMОбъекта(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса( + МодульРаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса( Разрешение.ProgId, ИдентификаторCOMКлассаВРежимеОбратнойСовместимости(Разрешение.ProgId))); ИначеЕсли Разрешение.Тип() = ТипПодключениеВнешнейКомпоненты(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты( Разрешение.TemplateName)); ИначеЕсли Разрешение.Тип() = ТипПолучениеФайлаИзВнешнегоОбъекта(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); ИначеЕсли Разрешение.Тип() = ТипПередачаФайлаВоВнешнийОбъект(Пакет()) Тогда Результат.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина)); ИначеЕсли Разрешение.Тип() = ТипПроведениеДокументов(Пакет()) Тогда - Результат.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима()); + Результат.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима()); КонецЕсли; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl index 1b8a8f66f..85dfacaab 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl @@ -1,71 +1,36 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", расширение безопасного режима. -// Процедуры и функции с повторным использованием возвращаемых значений. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает массив методов, которые могут быть выполнены расширением безопасного // режима. // -// Возвращаемое значение: Массив(Строка). +// Возвращаемое значение: +// Массив - массив строк, в которых хранятся разрешенные методы. // Функция ПолучитьРазрешенныеМетоды() Экспорт Результат = Новый Массив(); - // ДополнительныеОтчетыИОбработкиВБезопасномРежиме - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЧтениеXMLИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЗаписьXMLВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЧтениеHTMLИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЗаписьHTMLВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЧтениеFastInfosetИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЗаписьFastInfosetВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.СоздатьComОбъект"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПодключитьВнешнююКомпонентуИзОбщегоМакетаКонфигурации"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПодключитьВнешнююКомпонентуИзМакетаКонфигурации"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПолучитьФайлИзВнешнегоОбъекта"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПередатьФайлВоВнешнийОбъект"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПолучитьФайлИзИнтернета"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПередатьФайлВИнтернет"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.WSСоединение"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПроведениеДокументов"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ЗаписатьОбъекты"); - // ДополнительныеОтчетыИОбработкиВБезопасномРежиме - - // ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ТекстовыйДокументИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ТекстовыйДокументВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ТабличныйДокументИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ТабличныйДокументВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ФорматированныйДокументВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаИзДвоичныхДанных"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.СтрокаВДвоичныеДанные"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.РаспаковатьАрхив"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.УпаковатьФайлыВАрхив"); - Результат.Добавить("ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера.ВыполнитьСценарийВБезопасномРежиме"); - // Конец ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера - Возврат Новый ФиксированныйМассив(Результат); КонецФункции +// Устарела. Будет удалена в следующей редакции библиотеки. // Возвращает словарь синонимов видов разрешений дополнительных отчетов и обработок // и их параметров (для отображения в пользовательском интерфейсе). // // Возвращаемое значение: -// ФиксированноеСоответствие: -// Ключ - ТипXDTO, соответствующий виду разрешения, -// Значение - Структура, ключи: -// Представление - строка, краткое представление вида разрешения, -// Описание - строка, подробное описание вида разрешения, -// Параметры - ТаблицаЗначений, колонки: -// Имя - строка, имя свойства, определенного для ТипаXDTO, -// Описание - строка, описание последствий параметра разрешения для -// указанного значения параметра, -// ОписаниеЛюбогоЗначения - строка, описание последствий параметра -// разрешения для неуказанного значения параметра. +// ФиксированноеСоответствие - ключи: +// * Ключ - ТипXDTO - соответствующий виду разрешения, +// * Значение - Структура - ключи: +// * Представление - Строка - краткое представление вида разрешения, +// * Описание - Строка - подробное описание вида разрешения, +// * Параметры - ТаблицаЗначений - колонки: +// * Имя - Строка - имя свойства, определенного для ТипаXDTO, +// * Описание - Строка - описание последствий параметра разрешения для указанного значения параметра, +// * ОписаниеЛюбогоЗначения - Строка - описание последствий параметра разрешения для неуказанного значения параметра. // Функция Словарь() Экспорт @@ -100,7 +65,7 @@ |отчетом или обработкой для совершения действий, не предполагаемых администратором |информационной базы. | - |Используйте данный дополнительный отчет или обработку только в том случае, если Вы доверяете + |Используйте данный дополнительный отчет или обработку только в том случае, если доверяете |ее разработчику и контролируйте ограничения (сервер, протокол и порт), накладываемые на |выданные разрешения.'"); @@ -129,7 +94,7 @@ |отчетом или обработкой для совершения действий, не предполагаемых администратором |информационной базы. | - |Используйте данный дополнительный отчет или обработку только в том случае, если Вы доверяете + |Используйте данный дополнительный отчет или обработку только в том случае, если доверяете |ее разработчику и контролируйте ограничения (адрес подключения), накладываемые на |выданные разрешения.'"); @@ -157,7 +122,7 @@ |информационной базы, а также для несанкционированного обхода ограничений, накладываемых на дополнительную обработку |в безопасном режиме. | - |Используйте данный дополнительный отчет или обработку только в том случае, если Вы доверяете + |Используйте данный дополнительный отчет или обработку только в том случае, если доверяете |ее разработчику и контролируйте ограничения (программный идентификатор), накладываемые на |выданные разрешения.'"); @@ -185,7 +150,7 @@ |информационной базы, а также для несанкционированного обхода ограничений, накладываемых на дополнительную обработку |в безопасном режиме. | - |Используйте данный дополнительный отчет или обработку только в том случае, если Вы доверяете + |Используйте данный дополнительный отчет или обработку только в том случае, если доверяете |ее разработчику и контролируйте ограничения (имя макета, из которого выполняется подключение внешней |компоненты), накладываемые на выданные разрешения.'"); @@ -261,6 +226,8 @@ #КонецОбласти +#КонецОбласти + #Область СлужебныеПроцедурыИФункции Процедура ДобавитьПараметр(Знач ТаблицаПараметров, Знач Имя, Знач Описание, Знач ОписаниеЛюбогоЗначения) diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl index 032109e5c..051f2cecc 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl @@ -1,38 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", расширение безопасного режима, -// служебные процедуры и функции. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриРегистрацииМенеджеровВнешнихМодулей"].Добавить( - "ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); - -КонецПроцедуры - -// Вызывается при регистрации менеджеров внешних модулей. -// -// Параметры: -// Менеджеры - Массив(ОбщийМодуль). -// -Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт - - Менеджеры.Добавить(ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный); - -КонецПроцедуры - // Возвращает шаблон имени профиля безопасности для внешнего модуля. // Функция должна возвращать одно и то же значение при многократном вызове. // @@ -108,24 +75,6 @@ КонецФункции -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - НовыеЗапросы = ЗапросыРазрешенийДополнительныхОбработок(); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ЗапросыРазрешений, НовыеЗапросы); - -КонецПроцедуры - Функция ЗапросыРазрешенийДополнительныхОбработок(Знач ЗначениеФО = Неопределено) Экспорт Если ЗначениеФО = Неопределено Тогда @@ -182,9 +131,11 @@ ОчиститьРазрешения = Истина; КонецЕсли; + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + Если Не ОчиститьРазрешения Тогда - БылиРазрешения = РаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка) <> Неопределено; + БылиРазрешения = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка) <> Неопределено; ЕстьРазрешения = Объект.Разрешения.Количество() > 0; Если БылиРазрешения Или ЕстьРазрешения Тогда @@ -193,7 +144,7 @@ ЗапрашиваемыеРазрешения = Новый Массив(); Для Каждого РазрешениеВДанных Из РазрешенияВДанных Цикл - Разрешение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаВБезопасномРежимеСлужебный.Пакет(), РазрешениеВДанных.ВидРазрешения)); + Разрешение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(МодульРаботаВБезопасномРежимеСлужебный.Пакет(), РазрешениеВДанных.ВидРазрешения)); СвойстваВДанных = РазрешениеВДанных.Параметры.Получить(); ЗаполнитьЗначенияСвойств(Разрешение, СвойстваВДанных); ЗапрашиваемыеРазрешения.Добавить(Разрешение); @@ -217,7 +168,7 @@ КонецЕсли; - Возврат РаботаВБезопасномРежимеСлужебный.ЗапросРазрешенийДляВнешнегоМодуля(Объект.Ссылка, ЗапрашиваемыеРазрешения); + Возврат МодульРаботаВБезопасномРежимеСлужебный.ЗапросРазрешенийДляВнешнегоМодуля(Объект.Ссылка, ЗапрашиваемыеРазрешения); КонецФункции @@ -325,74 +276,6 @@ КонецФункции -// Только для внутреннего использования. -Процедура ПроверитьЛегитимностьВыполненияОперации(Знач КлючСессии, Знач Разрешение) Экспорт - - ТипТребуемогоРазрешения = Разрешение.Тип(); - - РазрешенияСессии = ПолучитьРазрешенияСессииРасширенияБезопасногоРежима(КлючСессии); - ОграниченияРазрешения = РазрешенияСессии.Получить(ТипТребуемогоРазрешения); - - Если ОграниченияРазрешения = Неопределено Тогда - - ВызватьИсключение ТекстИсключенияРазрешениеНеПредоставлено( - КлючСессии, ТипТребуемогоРазрешения); - - Иначе - - ПроверяемыеОграничения = ТипТребуемогоРазрешения.Свойства; - Для Каждого ПроверяемоеОграничение Из ПроверяемыеОграничения Цикл - - ЗначениеОграничения = Неопределено; - Если ОграниченияРазрешения.Свойство(ПроверяемоеОграничение.ЛокальноеИмя, ЗначениеОграничения) Тогда - - Если ЗначениеЗаполнено(ЗначениеОграничения) Тогда - - Ограничитель = Разрешение.ПолучитьXDTO(ПроверяемоеОграничение); - - Если ЗначениеОграничения <> Ограничитель.Значение Тогда - - ВызватьИсключение ТекстИсключенияРазрешениеНеПредоставленоДляОграничителя( - КлючСессии, ТипТребуемогоРазрешения, ПроверяемоеОграничение, Ограничитель.Значение); - - КонецЕсли; - - КонецЕсли; - - Иначе - - Если Не ПроверяемоеОграничение.ВозможноПустое Тогда - - ВызватьИсключение ТекстИсключенияНеУстановленОбязательныйОграничитель( - КлючСессии, ТипТребуемогоРазрешения, ПроверяемоеОграничение); - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -// Для внутреннего использования. -Функция ПолучитьФайлИзВременногоХранилища(Знач АдресДвоичныхДанных) Экспорт - - ВременныйФайл = ПолучитьИмяВременногоФайла(); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресДвоичныхДанных); - ДвоичныеДанные.Записать(ВременныйФайл); - Возврат ВременныйФайл; - -КонецФункции - -// Только для внутреннего использования. -Функция ПроверитьКорректностьВызоваПоОкружению() Экспорт - - Возврат БезопасныйРежим() = Ложь; - -КонецФункции - // Только для внутреннего использования. Функция СформироватьПредставлениеРазрешений(Знач Разрешения) Экспорт @@ -520,89 +403,26 @@ КонецФункции -#КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -#Область СлужебныеПроцедурыИФункции +// См. ИнтеграцияСтандартныхПодсистем.ПриРегистрацииМенеджеровВнешнихМодулей. +Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт + + Менеджеры.Добавить(ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный); + +КонецПроцедуры -// Только для внутреннего использования. -Функция ПолучитьРазрешенияСессииРасширенияБезопасногоРежима(Знач КлючСессии) +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - УстановитьПривилегированныйРежим(Истина); - - СтандартнаяОбработка = Истина; - ОписанияРазрешений = Неопределено; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПолученииРазрешенийСессииБезопасногоРежима"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриПолученииРазрешенийСессииБезопасногоРежима(КлючСессии, ОписанияРазрешений, СтандартнаяОбработка); - - КонецЦикла; - - Если СтандартнаяОбработка Тогда - - Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПолучитьСсылку(КлючСессии); - ТекстЗапроса = - "ВЫБРАТЬ - | Разрешения.ВидРазрешения КАК ВидРазрешения, - | Разрешения.Параметры КАК Параметры - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки.Разрешения КАК Разрешения - |ГДЕ - | Разрешения.Ссылка = &Ссылка"; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Ссылка", Ссылка); - ОписанияРазрешений = Запрос.Выполнить().Выгрузить(); - + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; КонецЕсли; - Результат = Новый Соответствие(); + НовыеЗапросы = ЗапросыРазрешенийДополнительныхОбработок(); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ЗапросыРазрешений, НовыеЗапросы); - Для Каждого ОписаниеРазрешения Из ОписанияРазрешений Цикл - - ТипРазрешения = ФабрикаXDTO.Тип( - ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.Пакет(), - ОписаниеРазрешения.ВидРазрешения); - - Результат.Вставить(ТипРазрешения, ОписаниеРазрешения.Параметры.Получить()); - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -// Только для внутреннего использования. -Функция ТекстИсключенияРазрешениеНеПредоставлено(Знач КлючСессии, Знач ТипТребуемогоРазрешения) - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Дополнительному отчету или обработке %1 не предоставлено разрешение {%2}%3!'"), - Строка(КлючСессии), ТипТребуемогоРазрешения.URIПространстваИмен, ТипТребуемогоРазрешения.Имя); - -КонецФункции - -// Только для внутреннего использования. -Функция ТекстИсключенияРазрешениеНеПредоставленоДляОграничителя(Знач КлючСессии, Знач ТипТребуемогоРазрешения, Знач ПроверяемоеОграничение, Знач Ограничитель) - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для дополнительного отчета или обработки %1 - |не предоставлено разрешение {%2}%3 при значении - |ограничителя %4 равном %5!'"), - Строка(КлючСессии), ТипТребуемогоРазрешения.URIПространстваИмен, ТипТребуемогоРазрешения.Имя, - ПроверяемоеОграничение.ЛокальноеИмя, Ограничитель); - -КонецФункции - -// Только для внутреннего использования. -Функция ТекстИсключенияНеУстановленОбязательныйОграничитель(Знач КлючСессии, Знач ТипТребуемогоРазрешения, Знач ПроверяемоеОграничение) - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для дополнительного отчета или обработки %1 - |при предоставлении разрешения {%2}%3 не был указан обязательный ограничитель %4!'"), - Строка(КлючСессии), ТипТребуемогоРазрешения.URIПространстваИмен, ТипТребуемогоРазрешения.Имя, - ПроверяемоеОграничение.ЛокальноеИмя); - -КонецФункции +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl index 160e09de7..ebff082cb 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl @@ -1,13 +1,15 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Подключает внешнюю обработку (отчет). // Подробнее - см. ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(). // +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Подключаемая обработка. +// +// Возвращаемое значение: +// Строка - Имя подключенного отчета или обработки. +// Неопределено - Если передана некорректная ссылка. +// Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт Возврат ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка); @@ -17,6 +19,14 @@ // Создает и возвращает экземпляр внешней обработки (отчета). // Подробнее - см. ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). // +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Подключаемый отчет или обработка. +// +// Возвращаемое значение: +// ВнешняяОбработкаОбъект - Объект подключенной обработки. +// ВнешнийОтчетОбъект - Объект подключенного отчета. +// Неопределено - Если передана некорректная ссылка. +// Функция ОбъектВнешнейОбработки(Ссылка) Экспорт Возврат ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Ссылка); @@ -25,9 +35,15 @@ #Область УстаревшиеПроцедурыИФункции -// Устарела. Следует использовать ОбъектВнешнейОбработки. -// Создает и возвращает экземпляр внешней обработки (отчета). -// Подробнее - см. ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). +// Устарела. Следует использовать ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). +// +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Подключаемый отчет или обработка. +// +// Возвращаемое значение: +// ВнешняяОбработкаОбъект - Объект подключенной обработки. +// ВнешнийОтчетОбъект - Объект подключенного отчета. +// Неопределено - Если передана некорректная ссылка. // Функция ПолучитьОбъектВнешнейОбработки(Ссылка) Экспорт @@ -65,10 +81,6 @@ Возврат ПоместитьВоВременноеХранилище(ХранилищеОбработки.Получить(), ИдентификаторФормы); КонецФункции -Функция ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище) Экспорт - Возврат ДополнительныеОтчетыИОбработки.ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище); -КонецФункции - // Запускает длительную операцию. Функция ЗапуститьДлительнуюОперацию(Знач УникальныйИдентификатор, Знач ПараметрыКоманды) Экспорт ИмяМетода = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду"; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl index 2fe33b9c0..e22bf2add 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму с доступными командами. // // Параметры: -// ПараметрКоманды - Передается "как есть" из параметров обработчика команды. -// ПараметрыВыполненияКоманды - Передается "как есть" из параметров обработчика команды. +// ПараметрКоманды - Произвольный - Передается "как есть" из параметров обработчика команды. +// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды - Передается "как есть" из параметров обработчика команды. // Вид - Строка - Вид обработки, который можно получить из серии функций: // ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<...>. // ИмяРаздела - Строка - Имя раздела командного интерфейса, из которого вызывается команда. @@ -68,9 +63,13 @@ // Возвращает пустую структуру параметров выполнения команды в фоне. // -// Возвращаемое значение: -// Структура - со свойствами: -// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Передается "как есть" из параметров формы. +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка выполняемой дополнительной обработки или отчета. +// +// Возвращаемое значение: +// Структура - Шаблон параметров выполнения команды в фоне. +// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Передается "как есть" из +// параметров формы. // * СопровождающийТекст - Строка - Текст длительной операции. // * ОбъектыНазначения - Массив - Ссылки объектов, для которых выполняется команда. // Используется для назначаемых дополнительных обработок. @@ -78,9 +77,9 @@ // Используется для назначаемых дополнительных обработок вида "Создание связанных объектов". // * ФормаВладелец - УправляемаяФорма - форма объекта или списка, из которой была вызвана команда. // -Функция ПараметрыВыполненияКомандыВФоне(ДополнительнаяОбработкаСсылка) Экспорт +Функция ПараметрыВыполненияКомандыВФоне(Ссылка) Экспорт - Результат = Новый Структура("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); + Результат = Новый Структура("ДополнительнаяОбработкаСсылка", Ссылка); Результат.Вставить("СопровождающийТекст"); Результат.Вставить("ОбъектыНазначения"); Результат.Вставить("СозданныеОбъекты"); @@ -102,9 +101,15 @@ // При добавлении собственных параметров рекомендуется использовать префикс в их именах, // исключающий конфликты со стандартными параметрами, например "Контекст...". // Обработчик - ОписаниеОповещения - Описание процедуры, которая принимает результат выполнения фонового задания. -// Подробнее см. описание параметра ОповещениеОЗавершении процедуры ДлительныеОперацииКлиент.ОжидатьЗавершение(). +// См. описание 2го параметра (ОповещениеОЗавершении) процедуры ДлительныеОперацииКлиент.ОжидатьЗавершение(). // Параметры процедуры: // * Задание - Структура, Неопределено - Сведения о фоновом задании. +// ** Статус - Строка - "Выполнено" (задание завершено) или "Ошибка" (в задании возникло исключение). +// ** АдресРезультата - Строка - Адрес временного хранилища, по которому размещен результат процедуры. +// Результат заполняется в структуре ПараметрыВыполнения.РезультатВыполнения обработчика команды. +// ** КраткоеПредставлениеОшибки - Строка - Краткая информация об исключении, если Статус = "Ошибка". +// ** ПодробноеПредставлениеОшибки - Строка - Подробная информация об исключении, если Статус = "Ошибка". +// ** Сообщения - ФиксированныйМассив, Неопределено - Сообщения из фонового задания. // * ДополнительныеПараметры - Значение, которое было указано при создании объекта ОписаниеОповещения. // // Пример: @@ -119,16 +124,24 @@ Процедура ВыполнитьКомандуВФоне(Знач ИдентификаторКоманды, Знач ПараметрыКоманды, Знач Обработчик) Экспорт ИмяПроцедуры = "ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне"; - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ИдентификаторКоманды", + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + ИмяПроцедуры, + "ИдентификаторКоманды", ИдентификаторКоманды, Тип("Строка")); - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ПараметрыКоманды", + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + ИмяПроцедуры, + "ПараметрыКоманды", ПараметрыКоманды, Тип("Структура")); - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ПараметрыКоманды.ДополнительнаяОбработкаСсылка", + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + ИмяПроцедуры, + "ПараметрыКоманды.ДополнительнаяОбработкаСсылка", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДополнительнаяОбработкаСсылка"), Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки")); - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Обработчик", + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + ИмяПроцедуры, + "Обработчик", Обработчик, Новый ОписаниеТипов("ОписаниеОповещения, УправляемаяФорма")); @@ -147,7 +160,7 @@ Иначе Форма = Обработчик; Обработчик = Неопределено; - ПолучатьРезультат = Истина; + ПолучатьРезультат = Истина; // для обратной совместимости КонецЕсли; Задание = ДополнительныеОтчетыИОбработкиВызовСервера.ЗапуститьДлительнуюОперацию(Форма.УникальныйИдентификатор, ПараметрыКоманды); @@ -164,7 +177,7 @@ НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма); НастройкиОжидания.ТекстСообщения = СопровождающийТекст; НастройкиОжидания.ВыводитьОкноОжидания = Истина; - НастройкиОжидания.ПолучатьРезультат = ПолучатьРезультат; + НастройкиОжидания.ПолучатьРезультат = ПолучатьРезультат; // для обратной совместимости НастройкиОжидания.ВыводитьСообщения = Истина; ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); @@ -182,6 +195,20 @@ КонецФункции +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Отображает результат выполнения команды. +// +// Параметры: +// Форма - УправляемаяФорма - Форма. +// РезультатВыполнения - Структура - Результат выполнения. +// +Процедура ПоказатьРезультатВыполненияКоманды(Форма, РезультатВыполнения) Экспорт + Возврат; +КонецПроцедуры + +// Устарела. Следует использовать ПодключаемыеКомандыКлиент.ВыполнитьКоманду. +// // Выполняет назначаемую команду на клиенте, используя только неконтекстные серверные вызов. // Возвращает Ложь если для выполнения команды требуется серверный вызов. // @@ -195,57 +222,15 @@ // Ложь - Для выполнения требуется контекстный вызов сервера. // Функция ВыполнитьНазначаемуюКомандуНаКлиенте(Форма, ИмяЭлемента) Экспорт - ОчиститьСообщения(); - - ВыполняемаяКоманда = ДополнительныеОтчетыИОбработкиВызовСервера.ОписаниеКомандыОбработки(ИмяЭлемента, - Форма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище").Действие); - - Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы") Тогда - Возврат Ложь; // Для выполнения команды требуется контекстный вызов сервера. - КонецЕсли; - - Объект = Форма.Объект; - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Форма", Форма); - ДополнительныеПараметры.Вставить("Объект", Объект); - ДополнительныеПараметры.Вставить("ВыполняемаяКоманда", ВыполняемаяКоманда); - - Если Объект.Ссылка.Пустая() Или Форма.Модифицированность Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для выполнения команды ""%1"" необходимо записать данные.'"), - ВыполняемаяКоманда.Представление); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Записать и продолжить'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Обработчик = Новый ОписаниеОповещения("ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да); - Иначе - ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение(-1, ДополнительныеПараметры); - КонецЕсли; - - Возврат Истина; // Для выполнения команды достаточно клиентского контекста. + Возврат Ложь; КонецФункции -#Область УстаревшиеПроцедурыИФункции - -// Устарела. Отображает результат выполнения команды. -// -Процедура ПоказатьРезультатВыполненияКоманды(Форма, РезультатВыполнения) Экспорт - -КонецПроцедуры - #КонецОбласти #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Открывает форму подбора дополнительных отчетов. // Места использования: // Справочник.РассылкиОтчетов.Форма.ФормаЭлемента.ДобавитьДополнительныйОтчет. @@ -303,6 +288,83 @@ КонецФункции +// Обработчик команды, открывающей список команд дополнительных отчетов и обработок. +// +// Параметры: +// МассивСсылок - Массив - Массив ссылок выбранных объектов, для которых выполняется команда. +// ПараметрыВыполнения - Структура - Контекст команды. +// * ОписаниеКоманды - Структура - Сведения о выполняемой команде. +// ** Идентификатор - Строка - Идентификатор команды. +// ** Представление - Строка - Представление команды в форме. +// ** Имя - Строка - Имя команды в форме. +// * Форма - УправляемаяФорма - Форма, из которой была вызвана команда. +// * Источник - ДанныеФормыСтруктура, ТаблицаФормы - Объект или список формы с полем "Ссылка". +// +Процедура ОткрытьСписокКоманд(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт + Контекст = Новый Структура; + Контекст.Вставить("Источник", ПараметрыВыполнения.Форма); + Вид = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры.Вид; + ОткрытьФормуКомандДополнительныхОтчетовИОбработок(МассивСсылок, Контекст, Вид); +КонецПроцедуры + +// Обработчик команды заполнения. +// +// Параметры: +// МассивСсылок - Массив - Массив ссылок выбранных объектов, для которых выполняется команда. +// ПараметрыВыполнения - Структура - Контекст команды. +// * ОписаниеКоманды - Структура - Сведения о выполняемой команде. +// ** Идентификатор - Строка - Идентификатор команды. +// ** Представление - Строка - Представление команды в форме. +// ** Имя - Строка - Имя команды в форме. +// * Форма - УправляемаяФорма - Форма, из которой была вызвана команда. +// * Источник - ДанныеФормыСтруктура, ТаблицаФормы - Объект или список формы с полем "Ссылка". +// +Процедура ОбработчикКомандыЗаполнения(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт + Форма = ПараметрыВыполнения.Форма; + Объект = ПараметрыВыполнения.Источник; + ВыполняемаяКоманда = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры; + + ПараметрыВызоваСервера = Новый Структура; + ПараметрыВызоваСервера.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); + ПараметрыВызоваСервера.Вставить("ДополнительнаяОбработкаСсылка", ВыполняемаяКоманда.Ссылка); + ПараметрыВызоваСервера.Вставить("ОбъектыНазначения", Новый Массив); + ПараметрыВызоваСервера.Вставить("ИмяФормы", Форма.ИмяФормы); + ПараметрыВызоваСервера.ОбъектыНазначения.Добавить(Объект.Ссылка); + + ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда); + + // Контроль за результатом выполнения поддерживается только для серверных методов. + // Если открывается форма или вызывается клиентский метод, то вывод результата выполнения выполняется обработкой. + Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда + + ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); + Если ВыполняемаяКоманда.ЭтоОтчет Тогда + ОткрытьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + Иначе + ОткрытьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + КонецЕсли; + + ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда + + ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); + Если ВыполняемаяКоманда.ЭтоОтчет Тогда + ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + Иначе + ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + КонецЕсли; + ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения); + + ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода") + Или ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда + + ПараметрыВызоваСервера.Вставить("РезультатВыполнения", Новый Структура); + ДополнительныеОтчетыИОбработкиВызовСервера.ВыполнитьКоманду(ПараметрыВызоваСервера, Неопределено); + Форма.Прочитать(); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -443,93 +505,18 @@ СтандартнаяОбработка = Истина; ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ОбъектыНазначения, СтандартнаяОбработка); - - Параметры = Новый Структура; - Параметры.Вставить("ВыполняемаяКоманда", ВыполняемаяКоманда); - Параметры.Вставить("Форма", Форма); - Если СтандартнаяОбработка Тогда - ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОткрытиеПечатнойФормыЗавершение", ЭтотОбъект, Параметры); - УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыНазначения, Форма); - Иначе - ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, Параметры); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюСлужебныйКлиент"); + МодульУправлениеПечатьюСлужебныйКлиент.ВыполнитьОткрытиеПечатнойФормы( + ВыполняемаяКоманда.Ссылка, + ВыполняемаяКоманда.Идентификатор, + ОбъектыНазначения, + Форма, + СтандартнаяОбработка); КонецЕсли; КонецПроцедуры -// Продолжение процедуры ВыполнитьОткрытиеПечатнойФормы. -Процедура ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, ДополнительныеПараметры) Экспорт - - ВыполняемаяКоманда = ДополнительныеПараметры.ВыполняемаяКоманда; - Форма = ДополнительныеПараметры.Форма; - - ПараметрыИсточника = Новый Структура; - ПараметрыИсточника.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); - ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначения); - - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("ИсточникДанных", ВыполняемаяКоманда.Ссылка); - ПараметрыОткрытия.Вставить("ПараметрыИсточника", ПараметрыИсточника); - ПараметрыОткрытия.Вставить("ПараметрКоманды", ОбъектыНазначения); - - ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, Форма); - -КонецПроцедуры - -// Обработчик продолжения выполнения назначаемой команды на клиенте. -Процедура ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение(Ответ, ДополнительныеПараметры) Экспорт - Форма = ДополнительныеПараметры.Форма; - Если Ответ = КодВозвратаДиалога.Да Тогда - ОчиститьСообщения(); - Если Не Форма.Записать() Тогда - Возврат; - КонецЕсли; - ИначеЕсли Ответ <> -1 Тогда - Возврат; - КонецЕсли; - - ВыполняемаяКоманда = ДополнительныеПараметры.ВыполняемаяКоманда; - Объект = ДополнительныеПараметры.Объект; - - ПараметрыВызоваСервера = Новый Структура; - ПараметрыВызоваСервера.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); - ПараметрыВызоваСервера.Вставить("ДополнительнаяОбработкаСсылка", ВыполняемаяКоманда.Ссылка); - ПараметрыВызоваСервера.Вставить("ОбъектыНазначения", Новый Массив); - ПараметрыВызоваСервера.Вставить("ИмяФормы", Форма.ИмяФормы); - ПараметрыВызоваСервера.ОбъектыНазначения.Добавить(Объект.Ссылка); - - ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда); - - // Контроль за результатом выполнения поддерживается только для серверных методов. - // Если открывается форма или вызывается клиентский метод, то вывод результата выполнения выполняется обработкой. - Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда - - ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); - Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ОткрытьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); - Иначе - ОткрытьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); - КонецЕсли; - - ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда - - ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); - Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); - Иначе - ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); - КонецЕсли; - ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения); - - ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода") - Или ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда - - ПараметрыВызоваСервера.Вставить("РезультатВыполнения", Новый Структура); - ДополнительныеОтчетыИОбработкиВызовСервера.ВыполнитьКоманду(ПараметрыВызоваСервера, Неопределено); - Форма.Прочитать(); - - КонецЕсли; -КонецПроцедуры - // Показывает диалог установки расширения, затем выгружает данные дополнительного отчета или обработки. Процедура ВыгрузитьВФайл(ПараметрыВыгрузки) Экспорт ТекстСообщения = НСтр("ru = 'Для выгрузки внешней обработки (отчета) в файл рекомендуется установить расширение для веб-клиента 1С:Предприятие.'"); @@ -586,7 +573,7 @@ // Обработчик результата работы процедуры ВыгрузитьВФайл. Процедура ОбработкаРезультатаНеТребуется(ПолученныеФайлы, ДополнительныеПараметры) Экспорт - // Обработка результата не требуется. + Возврат; КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl index 685f00fea..2aab0dc90 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняет дополнительные действия перед формированием печатной формы. diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl index a768895ed..1b380d698 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl @@ -1,14 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// // Имена видов объектов. // Печатная форма. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных печатных форм. +// Функция ВидОбработкиПечатнаяФорма() Экспорт Возврат "ПечатнаяФорма"; // Внутренний идентификатор. @@ -16,6 +15,10 @@ КонецФункции // Заполнение объекта. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных обработок заполнения. +// Функция ВидОбработкиЗаполнениеОбъекта() Экспорт Возврат "ЗаполнениеОбъекта"; // Внутренний идентификатор. @@ -23,27 +26,43 @@ КонецФункции // Создание связанных объектов. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных обработок создания связанных объектов. +// Функция ВидОбработкиСозданиеСвязанныхОбъектов() Экспорт Возврат "СозданиеСвязанныхОбъектов"; // Внутренний идентификатор. КонецФункции -// Создание связанных объектов. -Функция ВидОбработкиШаблонСообщения() Экспорт - - Возврат "ШаблонСообщения"; // Внутренний идентификатор. - -КонецФункции - // Назначаемый отчет. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных контекстных отчетов. +// Функция ВидОбработкиОтчет() Экспорт Возврат "Отчет"; // Внутренний идентификатор. КонецФункции +// Создание связанных объектов. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных контекстных отчетов. +// +Функция ВидОбработкиШаблонСообщения() Экспорт + + Возврат "ШаблонСообщения"; // Внутренний идентификатор. + +КонецФункции + // Дополнительная обработка. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных глобальных обработок. +// Функция ВидОбработкиДополнительнаяОбработка() Экспорт Возврат "ДополнительнаяОбработка"; // Внутренний идентификатор. @@ -51,6 +70,10 @@ КонецФункции // Дополнительный отчет. +// +// Возвращаемое значение: +// Строка - Имя вида дополнительных глобальных отчетов. +// Функция ВидОбработкиДополнительныйОтчет() Экспорт Возврат "ДополнительныйОтчет"; // Внутренний идентификатор. @@ -72,6 +95,12 @@ // // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка обработки. // // Может использоваться для чтения параметров обработки. // // Пример см. в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). +// // * РезультатВыполнения - Структура - Результат выполнения команды. +// // Может использоваться для передачи результата с сервера или из фонового задания в исходную точку. +// // В частности, возвращается функциями ДополнительныеОтчетыИОбработки.ВыполнитьКоманду() +// // и ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(), +// // а также может быть получено из временного хранилища +// // в обработчике ожидания процедуры ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). // // // Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт // // Реализация логики команды. @@ -122,22 +151,12 @@ // // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка обработки. // // Может использоваться для чтения параметров обработки. // // Пример см. в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). -// // -// Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) Экспорт -// // Реализация логики команды. -// КонецПроцедуры -// -// Для обработок создания связанных объектов (Вид = "ШаблонСообщения"): -// // Обработчик серверных команд. -// // -// // Параметры: -// // ИдентификаторКоманды - Строка - Имя команды, определенное в функции СведенияОВнешнейОбработке(). -// // ОбъектыНазначения - Массив - Ссылки объектов, для которых вызвана команда. -// // СозданныеОбъекты - Массив - Ссылки новых объектов, созданных в результате выполнения команды. -// // ПараметрыВыполнения - Структура - Контекст выполнения команды. -// // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка обработки. -// // Может использоваться для чтения параметров обработки. -// // Пример см. в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). +// // * РезультатВыполнения - Структура - Результат выполнения команды. +// // Может использоваться для передачи результата с сервера или из фонового задания в исходную точку. +// // В частности, возвращается функциями ДополнительныеОтчетыИОбработки.ВыполнитьКоманду() +// // и ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(), +// // а также может быть получено из временного хранилища +// // в обработчике ожидания процедуры ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). // // // Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) Экспорт // // Реализация логики команды. @@ -154,6 +173,12 @@ // // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка обработки. // // Может использоваться для чтения параметров обработки. // // Пример см. в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). +// // * РезультатВыполнения - Структура - Результат выполнения команды. +// // Может использоваться для передачи результата с сервера или из фонового задания в исходную точку. +// // В частности, возвращается функциями ДополнительныеОтчетыИОбработки.ВыполнитьКоманду() +// // и ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(), +// // а также может быть получено из временного хранилища +// // в обработчике ожидания процедуры ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). // // // Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт // // Реализация логики команды. @@ -307,6 +332,9 @@ // // Может использоваться для чтения параметров обработки. // // Пример см. в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). // // +// // Возвращаемое значение: +// // ТаблицаЗначений - Подробнее см. ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий(). +// // // Функция СформироватьСценарий(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт // Сценарий = ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий(); // // Формирование сценария. @@ -386,6 +414,10 @@ // Имена типов форм. Используются при настройке назначаемых объектов. // Идентификатор формы списка. +// +// Возвращаемое значение: +// Строка - Идентификатор форм списков. +// Функция ТипФормыСписка() Экспорт Возврат "ФормаСписка"; // Внутренний идентификатор. @@ -393,6 +425,10 @@ КонецФункции // Идентификатор формы объекта. +// +// Возвращаемое значение: +// Строка - Идентификатор форм объектов. +// Функция ТипФормыОбъекта() Экспорт Возврат "ФормаОбъекта"; // Внутренний идентификатор. @@ -403,6 +439,10 @@ // Другие процедуры и функции. // Фильтр для диалогов выбора или сохранения дополнительных отчетов и обработок. +// +// Возвращаемое значение: +// Строка - Фильтр для диалогов выбора или сохранения дополнительных отчетов и обработок. +// Функция ФильтрДиалоговВыбораИСохранения() Экспорт Фильтр = НСтр("ru = 'Внешние отчеты и обработки (*.%1, *.%2)|*.%1;*.%2|Внешние отчеты (*.%1)|*.%1|Внешние обработки (*.%2)|*.%2'"); @@ -412,6 +452,10 @@ КонецФункции // Идентификатор, который используется для рабочего стола. +// +// Возвращаемое значение: +// Строка - Идентификатор, который используется для рабочего стола. +// Функция ИдентификаторРабочегоСтола() Экспорт Возврат "РабочийСтол"; // Внутренний идентификатор. @@ -434,3 +478,22 @@ КонецФункции #КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Определяет, задано ли расписание регламентного задания. +// +// Параметры: +// Расписание - РасписаниеРегламентногоЗадания - расписание регламентного задания. +// +// Возвращаемое значение: +// Булево - Истина, если расписание регламентного задания задано. +// +Функция РасписаниеЗадано(Расписание) Экспорт + + Возврат Расписание = Неопределено + Или Строка(Расписание) <> Строка(Новый РасписаниеРегламентногоЗадания); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl index 0e8aa8329..b8a76d272 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl @@ -1,24 +1,17 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет разделы, в которых доступна команда вызова дополнительных обработок. +// В Разделы необходимо добавить метаданные тех разделов, +// в которых размещены команды вызова. +// +// Для рабочего стола вместо Метаданных необходимо добавлять +// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). // // Параметры: // Разделы - Массив - Разделы, в которых размещены команды вызова дополнительных обработок. // * ОбъектМетаданных: Подсистема - Метаданные раздела (подсистемы). // * Строка - Для рабочего стола. // -// Описание: -// В Разделы необходимо добавить метаданные тех разделов, -// в которых размещены команды вызова. -// -// Для рабочего стола вместо Метаданных необходимо добавлять. -// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). -// Процедура ОпределитьРазделыСДополнительнымиОбработками(Разделы) Экспорт @@ -26,19 +19,17 @@ КонецПроцедуры // Определяет разделы, в которых доступна команда вызова дополнительных отчетов. +// В Разделы необходимо добавить метаданные тех разделов, +// в которых размещены команды вызова. +// +// Для рабочего стола вместо Метаданных необходимо добавлять +// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). // // Параметры: // Разделы - Массив - Разделы, в которых размещены команды вызова дополнительных отчетов. // * ОбъектМетаданных: Подсистема - Метаданные раздела (подсистемы). // * Строка - Для рабочего стола. // -// Описание: -// В Разделы необходимо добавить метаданные тех разделов, -// в которых размещены команды вызова. -// -// Для рабочего стола вместо Метаданных необходимо добавлять. -// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). -// Процедура ОпределитьРазделыСДополнительнымиОтчетами(Разделы) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl index c69525fce..de20fce31 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", процедуры -// и функции с повторным использованием возвращаемых значений. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Виды публикации дополнительных обработок, доступные в программе. @@ -30,7 +24,7 @@ Возврат ""; КонецЕсли; - Результат = Новый Структура("ЭтоФормаОбъекта, ТипФормы, СсылкаРодителя, ВыводитьПодменюЗаполнениеОбъекта"); + Результат = Новый Структура("ЭтоФормаОбъекта, ТипФормы, СсылкаРодителя"); ФормаМетаданные = Метаданные.НайтиПоПолномуИмени(ПолноеИмяФормы); Если ФормаМетаданные = Неопределено Тогда @@ -64,15 +58,11 @@ Если Результат.ЭтоФормаОбъекта Тогда // Форма объекта Результат.ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыОбъекта(); - РодительТип = Тип(СтрЗаменить(РодительМетаданные.ПолноеИмя(), ".", "Ссылка.")); - Результат.ВыводитьПодменюЗаполнениеОбъекта = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта.ТипПараметраКоманды.СодержитТип(РодительТип); Иначе // Форма списка Результат.ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыСписка(); - Результат.ВыводитьПодменюЗаполнениеОбъекта = Ложь; КонецЕсли; Возврат Новый ФиксированнаяСтруктура(Результат); - КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl index 8e1b804e1..ac94cee8f 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl @@ -1,154 +1,89 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Дополнительные отчеты и обработки", процедуры и функции по управлению -// регламентными заданиями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Создает новое регламентное задание в информационной базе. +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РегламентныеЗаданияСервер.ДобавитьЗадание(). // // Параметры: -// Наименование - строка, наименование регламентного задания. +// Наименование - Строка - Наименование регламентного задания. // -// Возвращаемое значение: РегламентноеЗадание. +// Возвращаемое значение: +// Неопределено - Следует использовать РегламентныеЗаданияСервер.ДобавитьЗадание(). // Функция СоздатьНовоеЗадание(Знач Наименование) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.СоздатьНовоеЗадание(); - КонецЕсли; - - Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗапускДополнительныхОбработок"); - Задание.Использование = Ложь; - Задание.Наименование = Наименование; - Задание.Записать(); - - Возврат Задание; + Возврат Неопределено; КонецФункции -// Возвращает идентификатор регламентного задания (для сохранения в данных информационной базы). +// Устарела. Следует использовать РегламентныеЗаданияСервер.УникальныйИдентификатор(). // -// Задание - РегламентноеЗадание. +// Параметры: +// Задание - РегламентноеЗадание - Регламентное задание. // -// Возвращаемое значение: УникальныйИдентификатор. +// Возвращаемое значение: +// Неопределено - Следует использовать РегламентныеЗаданияСервер.УникальныйИдентификатор(). // Функция ПолучитьИдентификаторЗадания(Знач Задание) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.ПолучитьИдентификаторЗадания(Задание); - КонецЕсли; - - Возврат Задание.УникальныйИдентификатор; + Возврат Неопределено; КонецФункции -// Устанавливает параметры регламентного задания. +// Устарела. Следует использовать РегламентныеЗаданияСервер.ИзменитьЗадание(). // // Параметры: -// Задание - РегламентноеЗадание, -// Использование - булево, флаг использования регламентного задания, -// Наименование - строка, наименование регламентного задания, -// Параметры - Массив(Произвольный), параметры регламентного задания, -// Расписание - РасписаниеРегламентногоЗадания. +// Задание - РегламентноеЗадание - Регламентное задание. +// Использование - Булево - Флаг использования регламентного задания. +// Наименование - Строка - Наименование регламентного задания. +// Параметры - Массив - Параметры регламентного задания. +// Расписание - РасписаниеРегламентногоЗадания - Расписание регламентного задания. // Процедура УстановитьПараметрыЗадания(Задание, Использование, Наименование, Параметры, Расписание) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.УстановитьПараметрыЗадания(Задание, Использование, Параметры, Расписание); - Возврат; - КонецЕсли; - - Задание.Использование = Использование; - Задание.Наименование = Наименование; - Задание.Параметры = Параметры; - Задание.Расписание = Расписание; - - Задание.Записать(); + Возврат; КонецПроцедуры -// Возвращает параметры регламентного задания. +// Устарела. Следует использовать РегламентныеЗаданияСервер.НайтиЗадания(). // // Параметры: -// Задание - РегламентноеЗадание. +// Задание - РегламентноеЗадание - Регламентное задание. // -// Возвращаемое значение: Структура, ключи: -// Использование - булево, флаг использования регламентного задания, -// Наименование - строка, наименование регламентного задания, -// Параметры - Массив(Произвольный), параметры регламентного задания, -// Расписание - РасписаниеРегламентногоЗадания. +// Возвращаемое значение: +// Неопределено - Следует использовать РегламентныеЗаданияСервер.НайтиЗадания(). // Функция ПолучитьПараметрыЗадания(Знач Задание) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.ПолучитьПараметрыЗадания(Задание); - КонецЕсли; - - Результат = Новый Структура(); - Результат.Вставить("Использование", Задание.Использование); - Результат.Вставить("Наименование", Задание.Наименование); - Результат.Вставить("Параметры", Задание.Параметры); - Результат.Вставить("Расписание", Задание.Расписание); - - Возврат Результат; + Возврат Неопределено; КонецФункции -// Выполняет поиск задания по идентификатору (предположительно, сохраненному в данных -// информационной базы). +// Устарела. Следует использовать РегламентныеЗаданияСервер.Задание(). // -// Параметры: Идентификатор - УникальныйИдентификатор. +// Параметры: +// Идентификатор - УникальныйИдентификатор - Идентификатор регламентного задания. // -// Возвращаемое значение: РегламентноеЗадание. +// Возвращаемое значение: +// Неопределено - Следует использовать РегламентныеЗаданияСервер.НайтиЗадания(). // Функция НайтиЗадание(Знач Идентификатор) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.НайтиЗадание(Идентификатор); - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(Идентификатор) Тогда - Возврат Неопределено; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор); - - Возврат Задание; + Возврат Неопределено; КонецФункции -// Удаляет регламентное задание из информационной базы. +// Устарела. Следует использовать РегламентныеЗаданияСервер.УдалитьЗадание(). // // Параметры: -// Задание - РегламентноеЗадание. +// Задание - РегламентноеЗадание - Регламентное задание. // Процедура УдалитьЗадание(Знач Задание) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.УдалитьЗадание(Задание); - Возврат; - КонецЕсли; - - Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда - Задание.Удалить(); - КонецЕсли; + Возврат; КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl index 6a17488fe..b8d7bb1d7 100644 --- a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl @@ -1,16 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Внутренние процедуры и функции для работы с журналом регистрации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Процедура пакетной записи сообщений в журнал регистрации. -// +// После записи переменная СобытияДляЖурналаРегистрации очищается. +// // Параметры: -// СобытияДляЖурналаРегистрации - СписокЗначений - клиентская глобальная переменная. -// После записи переменная очищается. +// СобытияДляЖурналаРегистрации - СписокЗначений - где Значение - Структура со свойствами: +// * ИмяСобытия - Строка - Имя записываемого события. +// * ПредставлениеУровня - Строка - Представление значений коллекции УровеньЖурналаРегистрации. +// Доступные значения: "Информация", "Ошибка", "Предупреждение", "Примечание". +// * Комментарий - Строка - Комментарий события. +// * ДатаСобытия - Дата - Дата события, подставляется в комментарий при записи. +// Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт Если ТипЗнч(СобытияДляЖурналаРегистрации) <> Тип("СписокЗначений") Тогда @@ -96,7 +96,7 @@ СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число")); СобытияЖурнала.Колонки.Добавить("АдресДанных", Новый ОписаниеТипов("Строка")); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СобытияЖурнала.Колонки.Добавить("РазделениеДанныхСеанса", Новый ОписаниеТипов("Строка")); СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка")); КонецЕсли; @@ -105,8 +105,8 @@ МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); @@ -137,8 +137,8 @@ КонецЕсли; // Преобразование массива "ПредставлениеРазделенияДанныхСеанса" в список значений. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ПолноеПредставлениеРазделенияДанныхСеанса = ""; РазделениеДанныхСеанса = СобытиеЖурнала.РазделениеДанныхСеанса; diff --git a/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl index 7591c83a5..b5431a22a 100644 --- a/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl @@ -1,16 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Процедуры и функции для работы с журналом регистрации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Процедура пакетной записи сообщений в журнал регистрации. -// +// После записи переменная СобытияДляЖурналаРегистрации очищается. +// // Параметры: -// СобытияДляЖурналаРегистрации - СписокЗначений, клиентская глобальная переменная. -// После записи переменная очищается. +// СобытияДляЖурналаРегистрации - СписокЗначений - где Значение - Структура со свойствами: +// * ИмяСобытия - Строка - Имя записываемого события. +// * ПредставлениеУровня - Строка - Представление значений коллекции УровеньЖурналаРегистрации. +// Доступные значения: "Информация", "Ошибка", "Предупреждение", "Примечание". +// * Комментарий - Строка - Комментарий события. +// * ДатаСобытия - Дата - Дата события, подставляется в комментарий при записи. +// Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации); diff --git a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl index 6e70c8cf5..e075b91ae 100644 --- a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Внутренние процедуры и функции для работы с журналом регистрации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Записывает сообщение в журнал регистрации. @@ -62,14 +56,20 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - // Открывает форму журнала регистрации с установленным отбором. // // Параметры: -// Отбор - Структура - поля и значения, по которым необходимо отфильтровать журнал. +// Отбор - Структура - со свойствами: +// * Пользователь - Строка, СписокЗначений - имя или список пользователей +// информационной базы. +// * СобытиеЖурналаРегистрации - Строка, Массив - идентификатор события. +// * ДатаНачала - Дата - начало интервала отображаемых событий. +// * ДатаОкончания - Дата - конец интервала отображаемых событий. +// * Данные - Произвольный - данные любого типа. +// * Сеанс - СписокЗначений - список выбираемых сеансов. +// * Уровень - Строка, Массив - представление уровня важности +// события журнала регистрации. +// * ИмяПриложения - Массив - массив идентификаторов приложения. // Владелец - УправляемаяФорма - форма, из которой открывается журнал регистрации. // Процедура ОткрытьЖурналРегистрации(Знач Отбор = Неопределено, Владелец = Неопределено) Экспорт @@ -78,6 +78,10 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + // Открывает форму для просмотра дополнительных данных события. // // Параметры: diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl index 275c4ce0a..aedbe547a 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl @@ -1,4 +1,3 @@ - #Область ПрограммныйИнтерфейс // Функция - Заполнить описание колонок. @@ -65,4 +64,32 @@ КонецПроцедуры +// Удаляет временный файл. +// Если при попытке удаления возникает ошибка, она игнорируется - файл будет удален позднее. +// +Процедура УдалитьВременныйФайл(ПолноеИмяФайла) Экспорт + + Если ПустаяСтрока(ПолноеИмяФайла) Тогда + Возврат; + КонецЕсли; + + Попытка + УдалитьФайлы(ПолноеИмяФайла) + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + ,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось удалить временный файл + |%1 по причине: %2'"), ПолноеИмяФайла, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки + +КонецПроцедуры + +// Имя событие для записи в журнал регистрации. +// +Функция СобытиеЖурналаРегистрации() + + Возврат НСтр("ru = 'Загрузка данных из файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + +КонецФункции + + #КонецОбласти diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиент/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиент/Module.bsl index ca864ce7a..7a4eacccb 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиент/Module.bsl @@ -1,4 +1,3 @@ - #Область ПрограммныйИнтерфейс // Создает новую структуру параметров для загрузки данных из файла в табличную часть. diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиентСервер/Module.bsl index 7d0331212..ac79d715b 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаКлиентСервер/Module.bsl @@ -1,18 +1,24 @@ - #Область ПрограммныйИнтерфейс // Создает структуру описания колонок для макета загрузки данных из файла. // +// Параметры: +// Имя -Строка - Имя колонки. +// Тип - ОписаниеТипов - Тип колонки. +// Заголовок - Строка - Заголовок колонки выводимый в бланке для загрузки. +// Ширина - Число - Ширина колонки. +// Подсказка - Строка - Подсказка выводимая в заголовке колонки. +// // Возвращаемое значение: // Структура - Структура с описание колонки. -// * Имя - Строка - Имя колонки. -// * Тип - ОписаниеТипов - Тип колонки. -// * Заголовок - Строка - Заголовок колонки выводимый в бланке для загрузки. -// * Ширина - Число - Ширина колонки. -// * Подсказка - Строка - Подсказка выводимая в заголовке колонки. -// * ОбязательнаяДляЗаполнения - Булево - Истина, если колонка обязательно должна содержать значения. -// * Группа - Строка - Имя группы колонок. -// * Родитель - Строка - Используется для связи динамической колонки с реквизитом табличной части объекта. +// * Имя - Строка - Имя колонки. +// * Тип - ОписаниеТипов - Тип колонки. +// * Заголовок - Строка - Заголовок колонки выводимый в бланке для загрузки. +// * Ширина - Число - Ширина колонки. +// * Подсказка - Строка - Подсказка выводимая в заголовке колонки. +// * ОбязательнаяДляЗаполнения - Булево - Истина, если колонка обязательно должна содержать значения. +// * Группа - Строка - Имя группы колонок. +// * Родитель - Строка - Используется для связи динамической колонки с реквизитом табличной части объекта. // Функция ОписаниеКолонкиМакета(Имя, Тип, Заголовок = Неопределено, Ширина = 0, Подсказка = "") Экспорт diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl index c91443b38..317bf6268 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Загрузка данных из файла". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". diff --git a/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl index c38bb0840..ac8fc8ee6 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl @@ -1,17 +1,29 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Заметки пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Добавляет признак изменения пометки удаления документа. +// Состав параметров процедуры соответствует подписке на событие ПередЗаписью объекта Документ. +// Описание см. в синтакс-помощнике. +// +// Параметры: +// Источник - ДокументОбъект - источник события подписки. +// Отказ - Булево - признак отказа от записи. Если установить Истина, то запись выполнена не +// будет, и будет вызвано исключение. +// РежимЗаписи - РежимЗаписиДокумента - текущий режим записи документа-источника. +// РежимПроведения - РежимПроведенияДокумента - текущий режим проведения документа-источника. +// Процедура УстановитьСтатусИзмененияПометкиУдаленияДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт ЗаметкиПользователяСлужебный.УстановитьСтатусИзмененияПометкиУдаления(Источник); КонецПроцедуры // Добавляет признак изменения пометки удаления объекта. +// Состав параметров процедуры соответствует подписке на событие ПередЗаписью объектов кроме Документ. +// Описание см. в синтакс-помощнике. +// +// Параметры: +// Источник - Объект - источник события подписки. +// Отказ - Булево - признак отказа от записи. Если установить Истина, то запись выполнена не +// будет, и будет вызвано исключение. +// Процедура УстановитьСтатусИзмененияПометкиУдаленияОбъекта(Источник, Отказ) Экспорт ЗаметкиПользователяСлужебный.УстановитьСтатусИзмененияПометкиУдаления(Источник); КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl index 81c606193..ef058ef8d 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl @@ -1,53 +1,14 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Заметки пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.НапоминанияПользователя\ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания"].Добавить( - "ЗаметкиПользователяСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ЗаметкиПользователяСлужебный"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "ЗаметкиПользователяСлужебный"); - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Справочники.Заметки.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -58,6 +19,44 @@ КонецПроцедуры +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не ПравоДоступа("Редактирование", Метаданные.Справочники.Заметки) + Или Не ПолучитьФункциональнуюОпцию("ИспользоватьЗаметки") + Или МодульТекущиеДелаСервер.ДелоОтключено("ЗаметкиПользователя") Тогда + Возврат; + КонецЕсли; + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Заметки.ПолноеИмя()); + + КоличествоЗаметок = КоличествоЗаметок(); + + Для Каждого Раздел Из Разделы Цикл + ИдентификаторЗаметки = "ЗаметкиПользователя" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторЗаметки; + Дело.ЕстьДела = КоличествоЗаметок > 0; + Дело.Представление = НСтр("ru = 'Мои заметки'"); + Дело.Количество = КоличествоЗаметок; + Дело.Форма = "Справочник.Заметки.Форма.ВсеЗаметки"; + Дело.Владелец = Раздел; + КонецЦикла; + +КонецПроцедуры + +// См. НапоминанияПользователяПереопределяемый.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания. +Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, МассивРеквизитов) Экспорт + + Если ТипЗнч(Источник) = Тип("СправочникСсылка.Заметки") Тогда + МассивРеквизитов.Очистить(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -128,66 +127,6 @@ КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Редактирование", Метаданные.Справочники.Заметки) - Или Не ПолучитьФункциональнуюОпцию("ИспользоватьЗаметки") - Или МодульТекущиеДелаСервер.ДелоОтключено("ЗаметкиПользователя") Тогда - Возврат; - КонецЕсли; - - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Заметки.ПолноеИмя()); - - КоличествоЗаметок = КоличествоЗаметок(); - - Для Каждого Раздел Из Разделы Цикл - ИдентификаторЗаметки = "ЗаметкиПользователя" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИдентификаторЗаметки; - Дело.ЕстьДела = КоличествоЗаметок > 0; - Дело.Представление = НСтр("ru = 'Мои заметки'"); - Дело.Количество = КоличествоЗаметок; - Дело.Форма = "Справочник.Заметки.Форма.ВсеЗаметки"; - Дело.Владелец = Раздел; - КонецЦикла; - -КонецПроцедуры - -// Переопределяет массив реквизитов объекта, относительно которых разрешается устанавливать время напоминания. -// Например, можно скрыть те реквизиты с датами, которые являются служебными или не имеют смысла для -// установки напоминаний: дата документа или задачи и прочие. -// -// Параметры: -// Источник - Любая ссылка - Ссылка на объект, для которого формируется массив реквизитов с датами. -// МассивРеквизитов - Массив - Массив имен реквизитов (из метаданных), содержащих даты. -// -Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, МассивРеквизитов) Экспорт - - Если ТипЗнч(Источник) = Тип("СправочникСсылка.Заметки") Тогда - МассивРеквизитов.Очистить(); - КонецЕсли; - -КонецПроцедуры - Функция КоличествоЗаметок() Запрос = Новый Запрос; diff --git a/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl b/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl index 0c97de8ac..5d9fcd597 100644 --- a/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl @@ -1,95 +1,133 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Заполнение объектов" (сервер). -// Обслуживает команды заполнения. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс +// Список объектов, в которых используются команды заполнения. +// +// Возвращаемое значение: +// Массив из ОбъектМетаданных - Объекты метаданных с командами заполнения. +// +Функция ОбъектыСКомандамиЗаполнения() Экспорт + Массив = Новый Массив; + ЗаполнениеОбъектовПереопределяемый.ПриОпределенииОбъектовСКомандамиЗаполнения(Массив); + Возврат Массив; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. +// Обработчики событий подсистем конфигурации. -// См. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -Процедура ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(СтруктураНастроек) Экспорт - СтруктураНастроек.Вставить("ДобавитьКомандыЗаполнения", Новый ОписаниеТипов("Булево")); +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. +Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт + Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); + Настройка.Ключ = "ДобавитьКомандыЗаполнения"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево"); КонецПроцедуры -// См. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -Процедура ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю) Экспорт - Если Форма.Элементы.Найти("ПодменюЗаполнить") <> Неопределено Тогда - ИспользуемыеПодменю.Добавить("ПодменюЗаполнить"); - КонецЕсли; - Если Форма.Элементы.Найти("ПодменюЗаполнитьОбычное") <> Неопределено Тогда - ИспользуемыеПодменю.Добавить("ПодменюЗаполнитьОбычное"); - КонецЕсли; +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + Вид = ВидыПодключаемыхКоманд.Добавить(); + Вид.Имя = "ЗаполнениеОбъектов"; + Вид.ИмяПодменю = "ПодменюЗаполнить"; + Вид.Заголовок = НСтр("ru = 'Заполнить'"); + Вид.Порядок = 60; + Вид.Картинка = БиблиотекаКартинок.ЗаполнитьФорму; + Вид.Отображение = ОтображениеКнопки.КартинкаИТекст; КонецПроцедуры -// Формирование списка команд, подключенных к форме. -// Событие возникает в процессе вызова модуля повторного использования. -// Подробнее - см. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -// -// Параметры: -// НастройкиФормы - Структура - Сведения о форме, в которой выводятся команды. Для чтения. -// * ИмяФормы - Строка - Полное имя формы, в которой выводятся подключаемые команды. -// * ИспользуемыеПодменю - Массив из Строк - Имена групп формы, которые используются в этой форме. -// НастройкиОбъекта - Структура - Сведения о родительском объекте, к которому принадлежит форма. Для чтения. -// Состав полей см. в ПодключаемыеКоманды.НастройкиОбъекта(). -// НастройкиРасширений - ТаблицаЗначений - Настройки расширений, подключенных к этому объекту метаданных. Для чтения. -// * ПолноеИмя - Строка - Полное имя объекта расширения. -// * Менеджер - Произвольный - Модуль менеджера объекта расширения. -// Состав колонок определяется в процедуре ПриОпределенииИменИТиповНастроекПоставщиков. -// Команды - ТаблицаЗначений - Таблица команд для вывода в подменю. Для изменения. -// Состав колонок см. в ПодключаемыеКоманды.ТаблицаКоманд(). -// -Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды) Экспорт - Если Не ПравоДоступа("Изменение", НастройкиОбъекта.Метаданные) Тогда - Возврат; - КонецЕсли; +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт КомандыЗаполнения = Команды.СкопироватьКолонки(); + КомандыЗаполнения.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево")); + КомандыЗаполнения.Индексы.Добавить("Обработана"); - ЕстьПодменюОбычное = НастройкиФормы.ИспользуемыеПодменю.Найти("ПодменюЗаполнитьОбычное") <> Неопределено; - ЕстьПодменюЗаполнить = НастройкиФормы.ИспользуемыеПодменю.Найти("ПодменюЗаполнить") <> Неопределено; - ГруппаПоУмолчанию = ?(ЕстьПодменюОбычное, "ПодменюЗаполнитьОбычное", ?(ЕстьПодменюЗаполнить, "ПодменюЗаполнить", "")); - СтандартнаяОбработка = ЗначениеЗаполнено(ГруппаПоУмолчанию) И НастройкиОбъекта.Менеджер <> Неопределено; - - ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения(КомандыЗаполнения, НастройкиОбъекта, СтандартнаяОбработка); + СтандартнаяОбработка = Источники.Строки.Количество() > 0; + ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения(КомандыЗаполнения, НастройкиФормы, СтандартнаяОбработка); + КомандыЗаполнения.ЗаполнитьЗначения(Истина, "Обработана"); + ДопустимыеТипы = Новый Массив; // Типы источников, которые пользователь может изменять (см. ниже проверку права "Изменение"). Если СтандартнаяОбработка Тогда - НастройкиОбъекта.Менеджер.ДобавитьКомандыЗаполнения(КомандыЗаполнения, НастройкиОбъекта); - ДобавленныеКоманды = КомандыЗаполнения.НайтиСтроки(Новый Структура("Менеджер", "")); - Для Каждого КомандаЗаполнения Из ДобавленныеКоманды Цикл - КомандаЗаполнения.Менеджер = НастройкиОбъекта.ПолноеИмя; + ОбъектыСКомандамиЗаполнения = ОбъектыСКомандамиЗаполнения(); + Для Каждого Источник Из Источники.Строки Цикл + Для Каждого ДокументРегистратор Из Источник.Строки Цикл + Если Не ДокументРегистратор.ЭтоЖурналДокументов + И Не ПравоДоступа("Изменение", ДокументРегистратор.Метаданные) Тогда + Продолжить; + КонецЕсли; + ПодключаемыеКоманды.ДополнитьМассивТипов(ДопустимыеТипы, ДокументРегистратор.ТипСсылкиДанных); + Если ОбъектыСКомандамиЗаполнения.Найти(ДокументРегистратор.Метаданные) <> Неопределено Тогда + ПриДобавленииКомандЗаполнения(КомандыЗаполнения, ДокументРегистратор, НастройкиФормы); + КонецЕсли; + КонецЦикла; + Если Не Источник.ЭтоЖурналДокументов + И Не ПравоДоступа("Изменение", Источник.Метаданные) Тогда + Продолжить; + КонецЕсли; + ПодключаемыеКоманды.ДополнитьМассивТипов(ДопустимыеТипы, Источник.ТипСсылкиДанных); + Если ОбъектыСКомандамиЗаполнения.Найти(Источник.Метаданные) <> Неопределено Тогда + ПриДобавленииКомандЗаполнения(КомандыЗаполнения, Источник, НастройкиФормы); + КонецЕсли; КонецЦикла; КонецЕсли; - РасширенияЗаполнения = НастройкиРасширений.НайтиСтроки(Новый Структура("ДобавитьКомандыЗаполнения", Истина)); - Для Каждого Расширение Из РасширенияЗаполнения Цикл - Расширение.Менеджер.ДобавитьКомандыЗаполнения(КомандыЗаполнения, НастройкиОбъекта); - ДобавленныеКоманды = КомандыЗаполнения.НайтиСтроки(Новый Структура("Менеджер", "")); - Для Каждого КомандаЗаполнения Из ДобавленныеКоманды Цикл - КомандаЗаполнения.Менеджер = Расширение.ПолноеИмя; - КонецЦикла; + Если ДопустимыеТипы.Количество() = 0 Тогда + Возврат; // Все закрыто и команд расширений с допустимыми типами тоже не будет. + КонецЕсли; + + Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыЗаполнения", Истина)); + Для Каждого ПодключенныйОбъект Из Найденные Цикл + ПриДобавленииКомандЗаполнения(КомандыЗаполнения, ПодключенныйОбъект, НастройкиФормы, ДопустимыеТипы); КонецЦикла; - Если КомандыЗаполнения.Количество() = 0 Тогда - Возврат; - КонецЕсли; - Для Каждого КомандаЗаполнения Из КомандыЗаполнения Цикл Команда = Команды.Добавить(); ЗаполнитьЗначенияСвойств(Команда, КомандаЗаполнения); + Команда.Вид = "ЗаполнениеОбъектов"; Если Команда.Порядок = 0 Тогда Команда.Порядок = 50; КонецЕсли; - Если ПустаяСтрока(Команда.Группа) Или (Команда.Группа = "ПодменюЗаполнить" И ЕстьПодменюОбычное) Тогда - Команда.Группа = ГруппаПоУмолчанию; - КонецЕсли; Если Команда.РежимЗаписи = "" Тогда Команда.РежимЗаписи = "Записывать"; КонецЕсли; - Если Команда.МножественныйВыбор = Неопределено Тогда - Команда.МножественныйВыбор = Истина; + Если КомандаЗаполнения.ИзменяетВыбранныеОбъекты = Неопределено Тогда + Команда.ИзменяетВыбранныеОбъекты = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры #КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные для служебного программного интерфейса + +Процедура ПриДобавленииКомандЗаполнения(Команды, СведенияОбОбъекте, НастройкиФормы, ДопустимыеТипы = Неопределено) + СведенияОбОбъекте.Менеджер.ДобавитьКомандыЗаполнения(Команды, НастройкиФормы); + ДобавленныеКоманды = Команды.НайтиСтроки(Новый Структура("Обработана", Ложь)); + Для Каждого Команда Из ДобавленныеКоманды Цикл + Если Не ЗначениеЗаполнено(Команда.Менеджер) Тогда + Команда.Менеджер = СведенияОбОбъекте.ПолноеИмя; + КонецЕсли; + Если Не ЗначениеЗаполнено(Команда.ТипПараметра) Тогда + Команда.ТипПараметра = СведенияОбОбъекте.ТипСсылкиДанных; + КонецЕсли; + Если ДопустимыеТипы <> Неопределено И Не ТипВМассиве(Команда.ТипПараметра, ДопустимыеТипы) Тогда + Команды.Удалить(Команда); + Продолжить; + КонецЕсли; + Команда.Обработана = Истина; + КонецЦикла; +КонецПроцедуры + +Функция ТипВМассиве(ТипИлиОписаниеТипов, МассивТипов) + Если ТипЗнч(ТипИлиОписаниеТипов) = Тип("ОписаниеТипов") Тогда + Для Каждого Тип Из ТипИлиОписаниеТипов.Типы() Цикл + Если МассивТипов.Найти(Тип) <> Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь + Иначе + Возврат МассивТипов.Найти(ТипИлиОписаниеТипов) <> Неопределено; + КонецЕсли; +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl index 87b41d515..207b150d1 100644 --- a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl @@ -1,42 +1,58 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Заполнение объектов" (сервер, переопределяемый). -// Обслуживает команды заполнения. -// Выполняется на сервере, изменяется под специфику прикладной конфигурации, -// но предназначен для использования только данной подсистемой. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Определение списка глобальных команд заполнения. -// Событие возникает в процессе вызова модуля повторного использования. +// Определяет список объектов конфигурации, в модулях менеджеров которых предусмотрена процедура +// ДобавитьКомандыЗаполнения, формирующая команды заполнения объектов. +// Синтаксис процедуры ДобавитьКомандыЗаполнения см. в документации. // // Параметры: -// КомандыЗаполнения - ТаблицаЗначений - Таблица команд для вывода в подменю. Для изменения. +// Объекты - Массив - объекты метаданных (ОбъектМетаданных) с командами заполнения. +// +// Пример: +// Объекты.Добавить(Метаданные.Справочники.Организации); +// +Процедура ПриОпределенииОбъектовСКомандамиЗаполнения(Объекты) Экспорт + +КонецПроцедуры + +// Вызывается для формирования списка команд заполнения КомандыЗаполнения, однократно для при первой необходимости, +// а затем результат кэшируется с помощью модуля с повторным использованием возвращаемых значений. +// Здесь можно определить команды заполнения, общие для большинства объектов конфигурации. +// +// Параметры: +// КомандыЗаполнения - ТаблицаЗначений - сформированные команды для вывода в подменю. // // Общие настройки: // * Идентификатор - Строка - Идентификатор команды. // // Настройки внешнего вида: // * Представление - Строка - Представление команды в форме. -// * Группа - Строка - Имя группы в командной панели, в которой будет выводиться эта команда. -// * Порядок - Число - Порядок размещения команды в подменю. Используется для настройки под конкретное рабочее место. -// * Картинка - Картинка - Картинка команды. Необязательный. +// * Важность - Строка - Группа в подменю, в которой следует вывести эту команду. +// Допустимо использовать: "Важное", "Обычное" и "СмТакже". +// * Порядок - Число - Порядок размещения команды в подменю. Используется для настройки под конкретное +// рабочее место. +// * Картинка - Картинка - Картинка команды. // -// Настройки видимости: +// Настройки видимости и доступности: // * ТипПараметра - ОписаниеТипов - Типы объектов, для которых предназначена эта команда. // * ВидимостьВФормах - Строка - Имена форм через запятую, в которых должна отображаться команда. // Используется когда состав команд отличается для различных форм. // * ФункциональныеОпции - Строка - Имена функциональных опций через запятую, определяющих видимость команды. +// * УсловияВидимости - Массив - Определяет видимость команды в зависимости от контекста. +// Для регистрации условий следует использовать процедуру +// ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды(). +// Условия объединяются по "И". +// * ИзменяетВыбранныеОбъекты - Булево - Определяет доступность команды в ситуации, +// когда у пользователя нет прав на изменение объекта. +// Если Истина, то в описанной выше ситуации кнопка будет недоступна. +// Необязательный. Значение по умолчанию: Истина. // // Настройки процесса выполнения: -// * ИмяСписка - Строка - Имя таблицы формы, связанной с динамическим списком, для которого выводится команда. -// Используется когда в форме несколько списков и команда предназначена для второстепенного списка. // * МножественныйВыбор - Булево, Неопределено - Если Истина, то команда поддерживает множественный выбор. // В этом случае в параметре выполнения будет передан список ссылок. // Необязательный. Значение по умолчанию: Истина. // * РежимЗаписи - Строка - Действия, связанные с записью объекта, которые выполняются перед обработчиком команды. -// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается вся форма. -// В этом режиме рекомендуется работать напрямую с формой, +// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается +// вся форма. В этом режиме рекомендуется работать напрямую с формой, // которая передается в структуре 2 параметра обработчика команды. // ** "ЗаписыватьТолькоНовые" - Записывать новые объекты. // ** "Записывать" - Записывать новые и модифицированные объекты. @@ -57,16 +73,13 @@ // Формат "<ИмяПроцедуры>" используется в следующих случаях: // - Если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. // - Если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. -// * ДополнительныеПараметры - Неопределено, ФиксированнаяСтруктура - Необязательный. Параметры обработчика, указанного в Обработчик. +// * ДополнительныеПараметры - ФиксированнаяСтруктура - Необязательный. Параметры обработчика, указанного в Обработчик. // -// Параметры - Структура - Сведения о родительском объекте, к которому принадлежит форма и прочие параметры. Для чтения. -// * Метаданные - ОбъектМетаданных - Метаданные объекта. -// * ПолноеИмя - Строка - Полное имя объекта. Например: "Документ.ИмяДокумента". -// * Менеджер - Произвольный - Модуль менеджера объекта. -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта. -// * ЭтоЖурналДокументов - Булево - Истина если объект является журналом документов. +// Параметры - Структура - Сведения о контексте исполнения. +// * ИмяФормы - Строка - Полное имя формы. // -// СтандартнаяОбработка - Булево - Если установить в Ложь, то событие "ДобавитьКомандыЗаполнения" менеджера объекта не будет вызвано. +// СтандартнаяОбработка - Булево - Если установить в Ложь, то событие "ДобавитьКомандыЗаполнения" менеджера объекта не +// будет вызвано. // Процедура ПередДобавлениемКомандЗаполнения(КомандыЗаполнения, Параметры, СтандартнаяОбработка) Экспорт diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl index 713565ca6..f863b1a3d 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Запрет редактирования реквизитов объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Принимает в качестве параметра форму объекта, к которому подключена подсистема, diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl index 277a8d6ce..691fe1650 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Запрет редактирования реквизитов объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Разрешает редактирование заблокированных элементов формы, связанных с заданными реквизитами. diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl index 8d11b85aa..35264b24c 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Запрет редактирования реквизитов объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl index 2190d06f6..f4c0ef955 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl @@ -144,6 +144,8 @@ // Дополняет массив блокируемых элементов формы связанными элементами. Процедура ЗаполнитьСвязанныеЭлементы(Форма) + Отбор = Новый Структура("ИмяРеквизита", Неопределено); + Для Каждого ЭлементФормы Из Форма.Элементы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") @@ -153,18 +155,15 @@ РазложенныйПутьКДанным = СтрРазделить(ЭлементФормы.ПутьКДанным, ".", Ложь); Если РазложенныйПутьКДанным.Количество() = 2 Тогда - - Для Каждого ПараметрЗапрета Из Форма.ПараметрыЗапретаРедактированияРеквизитов Цикл - Если ПараметрЗапрета.ИмяРеквизита = РазложенныйПутьКДанным[1] Тогда - ПараметрЗапрета.БлокируемыеЭлементы.Добавить(ЭлементФормы.Имя); - Прервать; - КонецЕсли; - КонецЦикла; - + Отбор.ИмяРеквизита = РазложенныйПутьКДанным[1]; + Строки = Форма.ПараметрыЗапретаРедактированияРеквизитов.НайтиСтроки(Отбор); + Если Строки.Количество() > 0 Тогда + Строки[0].БлокируемыеЭлементы.Добавить(ЭлементФормы.Имя); + КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl index 75e9e781e..79f249918 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Запрет редактирования реквизитов объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Процедура РазрешитьРедактированиеРеквизитовОбъектаПослеПредупреждения(ОбработкаПродолжения) Экспорт diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl index 297f30393..fad55a04b 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl @@ -1,21 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Защита персональных данных". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Процедура выполняет подготовку формы настройки системы -// для управления областями персональных данных, +// Выполняет подготовку формы настройки системы для управления областями персональных данных, // а также считывает текущее состояние использования события "Доступ. Доступ". -// -// В форме должны быть созданы: +// В форме должны быть созданы // - реквизит типа дерево значений, имя которого - "ОбластиПерсональныхДанных", -// - таблица формы, связанная с этим реквизитом, -// имя которой так же - "ОбластиПерсональныхДанных". +// - таблица формы, связанная с реквизитом "ОбластиПерсональныхДанных". // // Параметры: -// Форма - форма настройки системы. +// Форма - УправляемаяФорма - форма настройки системы. // Процедура ПриСозданииФормыНастройкиРегистрацииСобытий(Форма) Экспорт @@ -55,20 +47,19 @@ Форма.Элементы[ИмяДереваОбластей].ВертикальныеЛинии = Ложь; Форма.Элементы[ИмяДереваОбластей].РежимВыделенияСтроки = РежимВыделенияСтрокиТаблицы.Строка; - ЗначениеВДанныеФормы(ПолучитьИспользованиеСобытияДоступ(), Форма[ИмяДереваОбластей]); + ЗначениеВДанныеФормы(ИспользованиеСобытияДоступ(), Форма[ИмяДереваОбластей]); КонецПроцедуры -// Процедура выполняет преобразование данных формы настройки системы +// Выполняет преобразование данных формы настройки системы // и установку использования события доступ для отмеченных областей. -// -// В форме должны быть созданы: +// В форме должны быть созданы // - реквизит типа дерево значений, имя которого - "ОбластиПерсональныхДанных", // - таблица формы, связанная с этим реквизитом, // имя которой так же - "ОбластиПерсональныхДанных". // // Параметры: -// Форма - форма настройки системы. +// Форма - УправляемаяФорма - форма настройки системы. // Процедура ПриЗаписиФормыНастройкиРегистрацииСобытий(Форма) Экспорт @@ -89,7 +80,7 @@ КонецПроцедуры -// Процедура устанавливает режим использования события "Доступ. Доступ" +// Устанавливает режим использования события "Доступ. Доступ" // журнала регистрации, контроль которого предусмотрен требованиями. // Федерального закона от 27.07.2006 N152-ФЗ "О персональных данных" // и подзаконных актов. @@ -97,9 +88,9 @@ // сведения о которых заполняются в потребителе. // // Параметры: -// Использование - булево, если Истина - события будут регистрироваться. -// ОбластиИспользования - массив областей персональных данных, -// для которых производится установка использования (необязательный). +// Использование - Булево - если Истина, то события будут регистрироваться. +// ОбластиИспользования - Массив - массив областей персональных данных, +// для которых производится установка использования (необязательный). // Процедура УстановитьИспользованиеСобытияДоступ(Использование, ОбластиИспользования = Неопределено) Экспорт @@ -160,19 +151,16 @@ КонецПроцедуры -// Функция составляет дерево используемых областей персональных данных. +// Составляет дерево используемых областей персональных данных. // -// Параметры: -// нет +// Возвращаемое значение: +// ДеревоЗначений - дерево областей данных с колонками: +// * Имя - Строка - идентификатор области персональных данных. +// * Представление - Строка - пользовательское представление области данных. +// * Использование - Булево - признак того, что для области данных +// установлена регистрация события "Доступ. Доступ". // -// Возвращаемое значение -// Дерево значений - дерево областей данных с колонками: -// Имя - строка, идентификатор области персональных данных. -// Представление - строка, пользовательское представление области данных. -// Использование - булево, признак того, что для области данных -// установлена регистрация события "Доступ. Доступ". -// -Функция ПолучитьИспользованиеСобытияДоступ() Экспорт +Функция ИспользованиеСобытияДоступ() Экспорт // Создание дерева областей ДеревоОбластейДанных = ДеревоОбластейПерсональныхДанных(); @@ -212,20 +200,27 @@ КонецПроцедуры -// Функция получает сведения о действующем на указанную дату согласии субъекта на обработку персональных данных. +// Возвращает сведения о действующем на указанную дату согласии субъекта на обработку персональных данных. // Получение сведений производится в привилегированном режиме. // // Параметры: -// Субъект - тип ОпределяемыйТип.СубъектПерсональныхДанных, субъект, наличие согласия которого определяется, -// Организация - тип СправочникСсылка.Организации, оператор персональных данных, которому предоставлено согласие, -// Дата - (необязательный), тип Дата, дата, на которую запрашивается состояние, если не указана, выбирается последняя запись. -// ИсключаемыйРегистратор - (необязательный), тип ДокументСсылка, текущий документ, -// передается для того, чтобы при поиске согласия игнорировать выполненные текущим документом движения. +// Субъект - ОпределяемыйТип.СубъектПерсональныхДанных - субъект, наличие согласия которого определяется, +// Организация - СправочникСсылка.Организации - оператор персональных данных, которому предоставлено согласие, +// Дата - Дата - дата, на которую запрашивается состояние, если не указана, выбирается последняя запись. +// ИсключаемыйРегистратор - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных - текущий документ; +// передается для того, чтобы при поиске согласия игнорировать выполненные текущим документом движения. // -// Возвращаемое значение - если обнаружено действующее согласие, тип Структура с полями ДатаПолучения, СрокДействия, ДокументОснование. -// Неопределено, если согласие не предоставлялось, или срок действия предоставленного согласия истек. +// Возвращаемое значение: +// Неопределено, Структура - Неопределено, если согласие не предоставлялось, +// или срок действия предоставленного согласия истек; +// Если обнаружено действующее согласие, то Структура со свойствами: +// * ДатаПолучения - Дата - дата получения согласия. +// * СрокДействия - Дата - дата, до которой будет действовать согласие. +// Если не указана, то согласие действует бессрочно. +// * ДокументОснование - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных - документ-основание. // -Функция ДействующееСогласиеНаОбработкуПерсональныхДанных(Субъект, Организация, Знач Дата = Неопределено, ИсключаемыйРегистратор = Неопределено) Экспорт +Функция ДействующееСогласиеНаОбработкуПерсональныхДанных(Субъект, Организация, Знач Дата = Неопределено, + ИсключаемыйРегистратор = Неопределено) Экспорт Если Дата = Неопределено Тогда Дата = ТекущаяДатаСеанса(); @@ -306,24 +301,32 @@ КонецФункции +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ИспользованиеСобытияДоступ. +// Составляет дерево используемых областей персональных данных. +// +// Возвращаемое значение: +// ДеревоЗначений - дерево областей данных с колонками: +// * Имя - Строка - идентификатор области персональных данных. +// * Представление - Строка - пользовательское представление области данных. +// * Использование - Булево - признак того, что для области данных +// установлена регистрация события "Доступ. Доступ". +// +Функция ПолучитьИспользованиеСобытияДоступ() Экспорт + + Возврат ИспользованиеСобытияДоступ(); + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.Печать\ПриОпределенииОбъектовСКомандамиПечати"].Добавить("ЗащитаПерсональныхДанных"); - - // Текущие дела. - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ЗащитаПерсональныхДанных"); - КонецЕсли; - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. // Определяет объекты, в которых есть процедура ДобавитьКомандыПечати(). // @@ -336,25 +339,10 @@ КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - описание дел - таблица значений с колонками: -// * Идентификатор - Строка - Внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - Если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - Если Истина, дело будет выделено красным цветом. -// * Представление - Строка - Представление дела, выводимое пользователю. -// * Количество - Число - Количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - Полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - Параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, ОбъектМетаданных - Строковый идентификатор дела, которое будет владельцем для -// текущего или объект метаданных подсистема. -// * Подсказка - Строка - Текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; // Модель сервиса. КонецЕсли; @@ -390,33 +378,36 @@ КонецПроцедуры -// Содержит описание таблиц и полей объектов для проверки запретов изменения данных. -// -// Параметры: -// ИсточникиДанных - ТаблицаЗначений - с колонками: -// * Таблица - Строка - полное имя объекта метаданных, -// например, Метаданные.Документы.ПриходнаяНакладная.ПолноеИмя(). -// * ПолеДаты - Строка - имя реквизита объекта или табличной части, -// например "Дата", "Товары.ДатаОтгрузки". -// * Раздел - Строка - имя предопределенного элемента -// "ПланВидовХарактеристикСсылка.РазделыДатЗапрета". -// * ПолеОбъекта - Строка - имя реквизита объекта или реквизита табличной части, -// например "Организация", "Товары.Склад". -// -// Для добавления строки имеется процедура ДобавитьСтроку в общем модуле ДатыЗапретаИзменения. -// +// См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения. +Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт + + Раздел = Разделы.Добавить(); + Раздел.Имя = "ОбработкаПерсональныхДанных"; + Раздел.Идентификатор = Новый УникальныйИдентификатор("527c98a3-3bfc-4bf9-8ec7-0247fdfa7a29"); + Раздел.Представление = НСтр("ru = 'Обработка персональных данных'"); + +КонецПроцедуры + +// См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения. Процедура ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); - МодульДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, - Метаданные.Документы.СогласиеНаОбработкуПерсональныхДанных.ПолноеИмя(), - "ДатаПолучения", "ОбработкаПерсональныхДанных"); - МодульДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, - Метаданные.Документы.ОтзывСогласияНаОбработкуПерсональныхДанных.ПолноеИмя(), - "ДатаОтзыва", "ОбработкаПерсональныхДанных"); - КонецЕсли; + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); + МодульДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, + Метаданные.Документы.СогласиеНаОбработкуПерсональныхДанных.ПолноеИмя(), + "ДатаПолучения", "ОбработкаПерсональныхДанных"); + + МодульДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, + Метаданные.Документы.ОтзывСогласияНаОбработкуПерсональныхДанных.ПолноеИмя(), + "ДатаОтзыва", "ОбработкаПерсональныхДанных"); + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СогласияНаОбработкуПерсональныхДанныхДействующие); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СогласияНаОбработкуПерсональныхДанныхИстекающие); КонецПроцедуры #КонецОбласти @@ -425,7 +416,7 @@ Процедура ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - // Загрузка при обмене данными проверяется внутри вызова. + // ОбменДанными.Загрузка проверяется внутри вызова. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); @@ -437,7 +428,7 @@ Процедура ПроверитьДатуЗапретаИзмененияПередУдалением(Источник, Отказ) Экспорт - // Загрузка при обмене данными проверяется внутри вызова. + // ОбменДанными.Загрузка проверяется внутри вызова. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl index 541846587..2a56249e5 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl @@ -1,16 +1,15 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Защита персональных данных". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Осуществляет переход к форме подготовки согласие на обработку персональных данных, -// используется как обработчик печати. +// Осуществляет переход к форме подготовки согласия на обработку персональных данных, +// используется как клиентский обработчик печати (поэтому является функцией, а не процедурой). // // Параметры: -// ПараметрыПечати - структура параметров обработки команды печати, -// должна содержать поля ОбъектыПечати и Форма. +// ПараметрыПечати - Структура - параметры обработки команды печати: +// * ОбъектыПечати - Массив - в первом элементе ожидается субъект персональных данных; +// * Форма - УправляемаяФорма - форма, из которой выполняется печать. +// +// Возвращаемое значение: +// Неопределено - не требуется, т.к. функция является клиентским обработчиком печати. // Функция ОткрытьФормуСогласиеНаОбработкуПерсональныхДанных(ПараметрыПечати) Экспорт @@ -19,7 +18,6 @@ КонецЕсли; Субъект = ПараметрыПечати.ОбъектыПечати[0]; - ОткрытьФорму("Документ.СогласиеНаОбработкуПерсональныхДанных.ФормаОбъекта", Новый Структура("Субъект", Субъект), ПараметрыПечати.Форма); КонецФункции @@ -35,11 +33,6 @@ СоставДокументов = ПараметрыПечати.ОбъектыПечати; ФормаИсточник = ПараметрыПечати.Форма; - ТекстСообщения = ?(СоставДокументов.Количество() > 1, - НСтр("ru = 'Выполняется формирование печатных форм...'"), - НСтр("ru = 'Выполняется формирование печатной формы...'")); - Состояние(ТекстСообщения); - МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати(ИмяМенеджераПечати, ИмяМакета, СоставДокументов); Для Каждого Согласие Из СоставДокументов Цикл @@ -48,6 +41,10 @@ КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + Процедура НапечататьСогласиеНаОбработкуПерсональныхДанныхСубъекта(Согласие, МакетИДанныеОбъекта, ИмяМакета) ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета]; diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl index 0092f9f57..811e54c33 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl @@ -1,22 +1,14 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Защита персональных данных". -// Модуль предназначен для размещения переопределяемых процедур подсистемы. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Процедура обеспечивает сбор сведений о хранении данных, -// относящихся к персональным +// Обеспечивает сбор сведений о хранении данных, относящихся к персональным. // // Параметры: -// ТаблицаСведений - таблица значений с полями: -// Объект - строка, содержащая полное имя объекта метаданных, -// ПоляРегистрации - строка, в которой перечислены имена полей регистрации, -// отдельные поля регистрации отделяются запятой, -// альтернативные - символом "|", -// ПоляДоступа - строка, в которой перечислены через запятую имена полей доступа. -// ОбластьДанных - строка с идентификатором области данных, необязательно для заполнения. +// ТаблицаСведений - ТаблицаЗначений - таблица с полями: +// * Объект - Строка - полное имя объекта метаданных; +// * ПоляРегистрации - Строка - имена полей регистрации, отдельные поля регистрации отделяются запятой, +// альтернативные - символом "|"; +// * ПоляДоступа - Строка - имена полей доступа через запятую. +// * ОбластьДанных - Строка - идентификатор области данных, необязательно для заполнения. // Процедура ЗаполнитьСведенияОПерсональныхДанных(ТаблицаСведений) Экспорт @@ -24,13 +16,13 @@ КонецПроцедуры -// Процедура обеспечивает составление коллекции областей персональных данных. +// Обеспечивает составление коллекции областей персональных данных. // // Параметры: -// ОбластиПерсональныхДанных - таблица значений с полями: -// Имя - идентификатор области данных. -// Представление - пользовательское представление области данных. -// Родитель - идентификатор родительской области данных. +// ОбластиПерсональныхДанных - ТаблицаЗначений - таблица с полями: +// * Имя - Строка - идентификатор области данных. +// * Представление - Строка - пользовательское представление области данных. +// * Родитель - Строка - идентификатор родительской области данных. // Процедура ЗаполнитьОбластиПерсональныхДанных(ОбластиПерсональныхДанных) Экспорт @@ -38,12 +30,12 @@ КонецПроцедуры -// Процедура вызывается при заполнении формы "Согласие на обработку персональных данных" -// данными, переданных в качестве параметров, субъектов. +// Вызывается при заполнении формы "Согласие на обработку персональных данных" данными, +// переданных в качестве параметров, субъектов. // // Параметры: -// СубъектыПерсональныхДанных - данные формы коллекция, содержащая сведения о субъектах. -// ДатаАктуальности - дата, на которую нужно заполнить сведения. +// СубъектыПерсональныхДанных - ДанныеФормыКоллекция - содержит сведения о субъектах. +// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. // Процедура ДополнитьДанныеСубъектовПерсональныхДанных(СубъектыПерсональныхДанных, ДатаАктуальности) Экспорт @@ -51,13 +43,12 @@ КонецПроцедуры -// Процедура вызывается при заполнении формы "Согласие на обработку персональных данных" -// данными организации. +// Вызывается при заполнении формы "Согласие на обработку персональных данных" данными организации. // // Параметры: -// Организация - организация - оператор персональных данных. -// ДанныеОрганизации - структура с данными об организации (адрес, ФИО ответственного и т.д.). -// ДатаАктуальности - дата, на которую нужно заполнить сведения. +// Организация - ОпределяемыйТип.Организация - оператор персональных данных. +// ДанныеОрганизации - Структура - данные об организации (адрес, ФИО ответственного и т.д.). +// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. // Процедура ДополнитьДанныеОрганизацииОператораПерсональныхДанных(Организация, ДанныеОрганизации, ДатаАктуальности) Экспорт diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl index f179a489c..04a933cd8 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Защита персональных данных". -// Служебные процедуры и функции подсистемы. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Функция определяет перечень событий журнала регистрации diff --git a/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервиса/Module.bsl b/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервиса/Module.bsl new file mode 100644 index 000000000..ab79060a2 --- /dev/null +++ b/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервиса/Module.bsl @@ -0,0 +1,761 @@ +//////////////////////////////////////////////////////////////////////////////// +// Интеграция с Библиотекой технологий сервиса (БТС) +// Здесь размещена обработка программных событий, возникающих в подсистемах БСП, +// и в обратную сторону. +// + + +// Обработка программных событий, возникающих в подсистемах БТС. +// Только для вызовов из библиотеки БТС в БСП. + +#Область ПрограммныйИнтерфейс + +#Область ВыгрузкаЗагрузкаДанных + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + СтандартныеПодсистемыСервер.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); + МодульРаботаСБанками.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); + МодульКалендарныеГрафики.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + СтандартныеПодсистемыСервер.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса") Тогда + МодульАдресныйКлассификаторВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторВМоделиСервисаСлужебный"); + МодульАдресныйКлассификаторВМоделиСервисаСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); + МодульПользователиСлужебный.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); + МодульПроверкаКонтрагентов.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + МодульКурсыВалютСлужебныйВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +// Обработка программных событий, возникающих в подсистемах БСП. +// Только для вызовов из библиотеки БСП в БТС. + +#Область СлужебныйПрограммныйИнтерфейс + +#Область БазоваяФункциональность + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + +КонецПроцедуры + +// См. ПриОтправкеДанныхГлавному в синтаксис-помощнике. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + КонецЕсли; + +КонецПроцедуры + +// См. ПриОтправкеДанныхПодчиненному в синтаксис-помощнике. +Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + КонецЕсли; + +КонецПроцедуры + +// См. ПриПолученииДанныхОтГлавного в синтаксис-помощнике. +Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + +КонецПроцедуры + +// См. ПриПолученииДанныхОтПодчиненного в синтаксис-помощнике. +Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриВключенииРазделенияПоОбластямДанных(); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ДополнительныеОтчетыИОбработки + +// Вызывается при определении наличия у текущего пользователя права на добавление дополнительного +// отчета или обработки в область данных. +// +// Параметры: +// ДополнительнаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки, элемент справочника, +// который записывается пользователем. +// Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия права, +// СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения +// стандартной обработки проверки права. +// +Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при проверке возможности загрузки дополнительного отчета или обработки из файла. +// +// Параметры: +// ДополнительнаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, +// Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия возможности +// загрузки дополнительного отчета или обработки из файла, +// СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения +// стандартной обработки проверки возможности загрузки дополнительного отчета или обработки из файла. +// +Процедура ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при проверке возможности выгрузки дополнительного отчета или обработки в файл. +// +// Параметры: +// ДополнительнаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, +// Результат - Булево, в этот параметр в данной процедуре устанавливается флаг наличия возможности +// выгрузки дополнительного отчета или обработки в файл, +// СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения +// стандартной обработки проверки возможности выгрузки дополнительного отчета или обработки в файл. +// +Процедура ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Заполняет виды публикации дополнительных отчетов и обработок, недоступные для использования +// в текущей модели информационной базы. +// +// Параметры: +// НедоступныеВидыПубликации - Массив строк. +// +Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриЗаполненииНедоступныхВидовПубликации(НедоступныеВидыПубликации); + КонецЕсли; + +КонецПроцедуры + +// Процедура должна вызываться из события ПередЗаписью справочника +// ДополнительныеОтчетыИОбработки, выполняет проверку правомерности изменения реквизитов +// элементов данного справочника для дополнительных обработок, полученных из +// каталога дополнительных обработок менеджера сервиса. +// +// Параметры: +// Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, +// Отказ - булево, флаг отказа от выполнения записи элемента справочника. +// +Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); + КонецЕсли; + +КонецПроцедуры + +// Процедура должна вызываться из события ПередУдалением справочника +// ДополнительныеОтчетыИОбработки. +// +// Параметры: +// Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, +// Отказ - булево, флаг отказа от выполнения удаления элемента справочника из информационной базы. +// +Процедура ПередУдалениемДополнительнойОбработки(Источник, Отказ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПередУдалениемДополнительнойОбработки(Источник, Отказ); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при получении регистрационных данных для нового дополнительного отчета +// или обработки. +// +Процедура ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при подключении внешней обработки. +// +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки, +// СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки подключения +// внешней обработки, +// Результат - Строка - имя подключенного внешнего отчета или обработки (в том случае, если в обработчике +// для параметра СтандартнаяОбработка было установлено значение Ложь). +// +Процедура ПриПодключенииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при создании объекта внешней обработки. +// +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки, +// СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки подключения +// внешней обработки, +// Результат - ВнешняяОбработкаОбъект, ВнешнийОтчетОбъект - объект подключенного внешнего отчета или +// обработки (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). +// +Процедура ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриСозданииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при получении разрешений сессии безопасного режима. +// +// Параметры: +// КлючСессии - УникальныйИдентификатор, +// ОписанияРазрешений - ТаблицаЗначений: +// * ВидРазрешения - Строка, +// * Параметры - ХранилищеЗначения, +// СтандартнаяОбработка - Булево, флаг необходимости выполнения стандартной обработки. +// +Процедура ПриПолученииРазрешенийСессииБезопасногоРежима(Знач КлючСессии, ОписанияРазрешений, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПолученииРазрешенийСессииБезопасногоРежима(КлючСессии, ОписанияРазрешений, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Вызывается перед записью изменений регламентного задания дополнительных отчетов и обработок в модели сервиса. +// +// Параметры: +// Объект - СправочникОбъект.ДополнительныеОтчетыИОбработки - Объект дополнительного отчета или обработки. +// Команда - СправочникТабличнаяЧастьСтрока.ДополнительныеОтчетыИОбработки.Команды - Описание команды. +// Задание - РегламентноеЗадание, СтрокаТаблицыЗначений - Описание регламентного задания. +// См. описание возвращаемого значения функции РегламентныеЗаданияСервер.Задание(). +// Изменения - Структура - Значения реквизитов задания, которые необходимо изменить. +// См. описание 2го параметра процедуры РегламентныеЗаданияСервер.ИзменитьЗадание(). +// Если установить Неопределено, то регламентное задание не будет изменено. +// +Процедура ПередОбновлениемЗадания(Объект, Команда, Задание, Изменения) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПередОбновлениемЗадания(Объект, Команда, Задание, Изменения); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Пользователи + +// Вызывается, если не удалось найти пользователя в справочнике, который +// соответствует текущему пользователю ИБ. При этом можно включить автоматическое +// создание элемента справочника Пользователи для текущего пользователя. +// +// Параметры: +// СоздатьПользователя - Булево - (возвращаемое значение) - если указать Истина, +// то автоматически будет создан пользователь в справочнике. +// Переопределить свойства создаваемого пользователя можно перед его записью +// в процедуре ПриАвтоматическомСозданииТекущегоПользователяВСправочнике. +// +Процедура ПриОтсутствииТекущегоПользователяВСправочнике(СоздатьПользователя) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОтсутствииТекущегоПользователяВСправочнике(СоздатьПользователя); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при автоматическом создании элемента справочника Пользователи в момент +// интерактивного входа пользователя или при первом обращении из кода. +// +// Параметры: +// НовыйПользователь - СправочникОбъект.Пользователи - новый пользователь перед записью. +// +Процедура ПриАвтоматическомСозданииТекущегоПользователяВСправочнике(НовыйПользователь) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриАвтоматическомСозданииТекущегоПользователяВСправочнике(НовыйПользователь); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при авторизации нового пользователя информационной базы. +// +// Параметры: +// ПользовательИБ - ПользовательИнформационнойБазы, текущий пользователь информационной базы, +// СтандартнаяОбработка - Булево, значение может быть установлено внутри обработчика, в этом случае +// стандартная обработка авторизации нового пользователя ИБ выполняться не будет. +// +Процедура ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при начале обработки пользователя информационной базы. +// +// Параметры: +// ПараметрыОбработки - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ(). +// ОписаниеПользователяИБ - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ(). +// +Процедура ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); + КонецЕсли; + +КонецПроцедуры + +// Вызывается перед записью пользователя информационной базы. +// +// Параметры: +// ПользовательИБ - ПользовательИнформационнойБазы - пользователь, который будет записан. +// +Процедура ПередЗаписьюПользователяИБ(ПользовательИБ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПередЗаписьюПользователяИБ(ПользовательИБ); + КонецЕсли; + +КонецПроцедуры + +// Вызывается перед удалением пользователя информационной базы. +// +// Параметры: +// ПользовательИБ - ПользовательИнформационнойБазы - пользователь, который будет удален. +// +Процедура ПередУдалениемПользователяИБ(ПользовательИБ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПередУдалениемПользователяИБ(ПользовательИБ); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрофилиБезопасности + +// Вызывается при проверке возможности настройки профилей безопасности. +// +// Параметры: +// Отказ - Булево. Если для информационной базы недоступно использование профилей безопасности - +// значение данного параметра нужно установить равным Истина. +// +Процедура ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов. +Процедура ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ПрограммныйМодуль, Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения, Знач УдаляемыеРазрешения, СтандартнаяОбработка, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(ПрограммныйМодуль, Владелец, РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеСозданияПрофиляБезопасности. +Процедура ПриЗапросеСозданияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриЗапросеСозданияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеУдаленияПрофиляБезопасности. +Процедура ПриЗапросеУдаленияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриЗапросеУдаленияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриПодключенииВнешнегоМодуля. +Процедура ПриПодключенииВнешнегоМодуля(Знач ВнешнийМодуль, БезопасныйРежим) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриПодключенииВнешнегоМодуля(ВнешнийМодуль, БезопасныйРежим); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_БазоваяФункциональностьВМоделиСервиса + +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. +Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при определении псевдонима пользователя для отображения в интерфейсе. +// +// Параметры: +// ИдентификаторПользователя - УникальныйИдентификатор, +// Псевдоним - Строка, псевдоним пользователя. +// +Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при определении списка метаданных, которые являются не разделенными +// и которые можно записывать из разделенного сеанса. Процедура должна в массив Исключения добавить ссылки +// на исключаемые при проверке объекты метаданных. Эти метаданные могут отсутствовать в подписках, которые +// проверяют запрет на запись неразделенных данных из разделенного сеанса. +Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииИсключенийНеразделенныхДанных(Исключения); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ОбменСообщениями + +// См. ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений. +Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииОбработчиковКаналовСообщений(Обработчики); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений. +Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений. +Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ПриОпределенииВерсииИнтерфейсаКорреспондента. +Процедура ПриОпределенииВерсииИнтерфейсаКорреспондента(Знач ИнтерфейсСообщения, Знач ПараметрыПодключения, Знач ПредставлениеПолучателя, Результат) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииВерсииИнтерфейсаКорреспондента(ИнтерфейсСообщения, ПараметрыПодключения, ПредставлениеПолучателя, Результат); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ОчередьЗаданий + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ПоставляемыеДанные + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область УправлениеДоступом + +// Вызывается при обновлении ролей пользователя информационной базы. +// +// Параметры: +// ИдентификаторПользователяИБ - УникальныйИдентификатор, +// Отказ - Булево. При установке значения параметра в значение Ложь внутри обработчика события +// обновление ролей для этого пользователя информационной базы будет пропущено. +// +Процедура ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСП = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСП"); + МодульТехнологияСервисаИнтеграцияСБСП.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервиса/ИнтеграцияСТехнологиейСервиса.mdo b/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервиса/ИнтеграцияСТехнологиейСервиса.mdo new file mode 100644 index 000000000..abb6216c7 --- /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..48ee45272 --- /dev/null +++ b/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервисаКлиент/Module.bsl @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////////// +// Интеграция с Библиотекой технологий сервиса (БТС) +// Здесь размещена обработка программных событий, возникающих в подсистемах БСП, +// и в обратную сторону. +// + + +// Обработка программных событий, возникающих в подсистемах БСП. +// Только для вызовов из библиотеки БСП в БТС. + +#Область СлужебныйПрограммныйИнтерфейс + +#Область БазоваяФункциональность + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСПКлиент"); + МодульТехнологияСервисаИнтеграцияСБСПКлиент.ПриНачалеРаботыСистемы(Параметры); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. +Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСПКлиент"); + МодульТехнологияСервисаИнтеграцияСБСПКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ЗавершениеРаботыПользователей + +// Вызывается при завершении сеанса средствами подсистемы ЗавершениеРаботыПользователей. +// +// Параметры: +// ФормаВладелец - УправляемаяФорма, из которой выполняется завершение сеанса, +// НомераСеансов - Число (8,0,+) - номер сеанса, который будет завершен, +// СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки завершения сеанса +// (подключение к агенту сервера через COM-соединение или сервер администрирования с +// запросом параметров подключения к кластеру у текущего пользователя). Может быть +// установлен в значение Ложь внутри обработчика события, в этом случае стандартная +// обработка завершения сеанса выполняться не будет, +// ОповещениеПослеЗавершенияСеанса - ОписаниеОповещения - описание оповещения, которое должно +// быть вызвано после завершения сеанса (для автоматического обновления списка активных +// пользователей). При установке значения параметра СтандартнаяОбработка равным Ложь, +// после успешного завершения сеанса, для переданного описания оповещения должна быть +// выполнена обработка с помощью метода ВыполнитьОбработкуОповещения (в качестве значения +// параметра Результат следует передавать КодВозвратаДиалога.ОК при успешном завершении +// сеанса). Параметр может быть опущен - в этом случае выполнять обработку оповещения не +// следует. +// +Процедура ПриЗавершенииСеансов(ФормаВладелец, Знач НомераСеансов, СтандартнаяОбработка, Знач ОповещениеПослеЗавершенияСеанса = Неопределено) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСПКлиент"); + МодульТехнологияСервисаИнтеграцияСБСПКлиент.ПриЗавершенииСеансов(ФормаВладелец, НомераСеансов, СтандартнаяОбработка, ОповещениеПослеЗавершенияСеанса); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрофилиБезопасности + +// См. РаботаВБезопасномРежимеКлиентПереопределяемый.ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов. +Процедура ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов(Знач ИдентификаторыЗапросов, ФормаВладелец, + ОповещениеОЗакрытии, СтандартнаяОбработка) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервисаИнтеграцияСБСПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ТехнологияСервисаИнтеграцияСБСПКлиент"); + МодульТехнологияСервисаИнтеграцияСБСПКлиент.ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов(ИдентификаторыЗапросов, + ФормаВладелец, ОповещениеОЗакрытии, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервисаКлиент/ИнтеграцияСТехнологиейСервисаКлиент.mdo b/SSL/src/CommonModules/ИнтеграцияСТехнологиейСервисаКлиент/ИнтеграцияСТехнологиейСервисаКлиент.mdo new file mode 100644 index 000000000..f5c008884 --- /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 index 0681cd305..3088430ce 100644 --- a/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl @@ -1,19 +1,192 @@ //////////////////////////////////////////////////////////////////////////////// -// Интеграция подсистем друг с другом. +// Интеграция подсистем библиотеки друг с другом. +// Здесь размещена обработка программных событий, возникающих в подсистемах-источниках, +// в тех случаях, когда подсистем-приемников более одной или их список заранее неизвестен. // -//////////////////////////////////////////////////////////////////////////////// #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "БазоваяФункциональность". +#Область БазоваяФункциональность -// См. описание в процедуре ЗаполнитьВсеПараметрыРаботыРасширений -// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт + + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); + МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); + МодульПользователиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + КонецЕсли; + + ПользователиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + ИнтеграцияСТехнологиейСервиса.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + СтандартныеПодсистемыСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда + МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); + МодульАнализЖурналаРегистрацииСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда + МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); + МодульВызовОнлайнПоддержки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда + МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); + МодульЗаметкиПользователяСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); + МодульНапоминанияПользователяСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); + МодульПроверкаКонтрагентов.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда + МодульСтруктураПодчиненностиСлужебный = ОбщегоНазначения.ОбщийМодуль("СтруктураПодчиненностиСлужебный"); + МодульСтруктураПодчиненностиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда + МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); + МодульТекущиеДелаСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; + +КонецПроцедуры + +// См. РегистрСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений. Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт - ПодключаемыеКоманды.ПриЗаполненииВсехПараметровРаботыРасширений(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриЗаполненииВсехПараметровРаботыРасширений(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ПриЗаполненииВсехПараметровРаботыРасширений(); + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); @@ -22,9 +195,7 @@ КонецПроцедуры -// См. описание в процедуре ОчиститьВсеПараметрыРаботыРасширений -// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. -// +// См. РегистрСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений. Процедура ПриОчисткеВсехПараметровРаботыРасширений() Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда @@ -34,94 +205,434 @@ КонецПроцедуры -// Определение имен и типов общих настроек подключаемых объектов (отчетов и обработок). -// -// Параметры: -// СтруктураНастроек - Структура - Структура настроек, которые могут определяться в этом объекте. Для изменения. -// * Ключ - Строка - Имя настройки. -// * Значение - ОписаниеТипов - Тип настройки. -// -Процедура ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(СтруктураНастроек) Экспорт +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(СтруктураНастроек); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда - МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); - МодульЗаполнениеОбъектов.ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(СтруктураНастроек); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + ПользователиСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. +Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + ПользователиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. +Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + ПользователиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. +Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + ПользователиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПослеПолученияДанных. +Процедура ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла) Экспорт + + ПользователиСлужебный.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); КонецЕсли; КонецПроцедуры -// Заполнение параметров получения списка команд этой формы. -// Событие возникает перед вызовом модуля повторного использования для определения параметров -// форм, в которых выводятся подключаемые команды. -// -// Параметры: -// Форма - УправляемаяФорма - Форма, в которой выводятся подключаемые команды. Для чтения. -// ИспользуемыеПодменю - Массив из Строк - Имена групп формы, которые используются в этой форме. Для изменения. -// -Процедура ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю) Экспорт +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда - МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); - МодульЗаполнениеОбъектов.ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); + МодульОчередьЗаданийСлужебный.ПриВключенииРазделенияПоОбластямДанных(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВключенииРазделенияПоОбластямДанных(); + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриВключенииРазделенияПоОбластямДанных(); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриВключенииРазделенияПоОбластямДанных(); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт + + ИнтеграцияСТехнологиейСервиса.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); + МодульИнтерфейсыСообщенийВМоделиСервиса.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); КонецЕсли; КонецПроцедуры -// Формирование списка команд, подключенных к форме. -// Событие возникает в процессе вызова модуля повторного использования. -// -// Параметры: -// НастройкиФормы - Структура - Сведения о форме, в которой выводятся команды. Для чтения. -// * ИмяФормы - Строка - Полное имя формы, в которой выводятся подключаемые команды. -// * ИспользуемыеПодменю - Массив из Строк - Имена групп формы, которые используются в этой форме. -// НастройкиОбъекта - Структура - Сведения о родительском объекте, к которому принадлежит форма. Для чтения. -// Состав полей см. в ПодключаемыеКоманды.НастройкиОбъекта(). -// НастройкиРасширений - ТаблицаЗначений - Настройки расширений, подключенных к этому объекту метаданных. Для чтения. -// * ПолноеИмя - Строка - Полное имя объекта расширения. -// * Менеджер - Произвольный - Модуль менеджера объекта расширения. -// Состав колонок определяется в процедуре ПриОпределенииИменИТиповНастроекПоставщиков. -// Команды - ТаблицаЗначений - Таблица команд для вывода в подменю. Для изменения. -// Состав колонок см. в ПодключаемыеКоманды.ТаблицаКоманд(). -// -Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды) Экспорт +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды); + ИнтеграцияСТехнологиейСервиса.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда - МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); - МодульЗаполнениеОбъектов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда + МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); + МодульИнформацияПриЗапуске.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); + МодульНапоминанияПользователяСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); + МодульОбновлениеКонфигурации.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); + МодульОценкаПроизводительностиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); + МодульРаботаСБанками.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + МодульРезервноеКопированиеИБСервер.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + ИнтеграцияСТехнологиейСервиса.ПриДобавленииПараметровРаботыКлиента(Параметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); + МодульНапоминанияПользователяСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); + МодульОбновлениеКонфигурации.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда + МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); + МодульОтправкаSMS.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); + МодульПолучениеФайловИзИнтернетаСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + МодульРезервноеКопированиеИБСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + СтандартныеПодсистемыСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Групповое изменение объектов". +#КонецОбласти -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +#Область ВариантыОтчетов + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда + МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); + МодульАнализЖурналаРегистрацииСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда + МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); + МодульАнкетирование.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда + МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); + МодульПоискИУдалениеДублей.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + ПользователиСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + МодульРаботаВБезопасномРежимеСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов. +Процедура ПриОпределенииОбъектовСКомандамиОтчетов(Объекты) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда + МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); + МодульАнкетирование.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ГрупповоеИзменениеОбъектов + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт СтандартныеПодсистемыСервер.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); @@ -202,8 +713,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); - МодульОбменСообщениями.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -211,11 +722,6 @@ МодульУправлениеДоступомСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); - МодульФайловыеФункцииСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); - КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); @@ -223,45 +729,35 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Даты запрета изменения". +#КонецОбласти -// Содержит описание таблиц и полей объектов для проверки запретов изменения данных. -// -// Параметры: -// ИсточникиДанных - ТаблицаЗначений - с колонками: -// * Таблица - Строка - полное имя объекта метаданных, -// например, Метаданные.Документы.ПриходнаяНакладная.ПолноеИмя(). -// * ПолеДаты - Строка - имя реквизита объекта или табличной части, -// например "Дата", "Товары.ДатаОтгрузки". -// * Раздел - Строка - имя предопределенного элемента -// "ПланВидовХарактеристикСсылка.РазделыДатЗапрета". -// * ПолеОбъекта - Строка - имя реквизита объекта или реквизита табличной части, -// например "Организация", "Товары.Склад". -// -// Для добавления строки имеется процедура ДобавитьСтроку в общем модуле ДатыЗапретаИзменения. -// -Процедура ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт +#Область ДатыЗапретаИзменений + +// См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения. +Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда - Модуль = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - Модуль.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных); + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Загрузка данных из файла". +// См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения. +Процедура ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных); + КонецЕсли; + +КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// Обработчики - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +#КонецОбласти + +#Область ЗагрузкаДанныхИзФайла + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт СтандартныеПодсистемыСервер.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); @@ -316,24 +812,18 @@ МодульВзаимодействия.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); - МодульФайловыеФункцииСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Запрет редактирования реквизитов объектов". +#КонецОбласти -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность редактирования реквизитов -// с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Запрет редактирования реквизитов объектов". -// В качестве значения - пустую строку. -// +#Область ЗапретРедактированияРеквизитовОбъектов + +// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда @@ -348,10 +838,422 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Пользователи". +// См. УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. +Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + КонецЕсли; + +КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +#КонецОбласти + +#Область НапоминанияПользователя + +// См. НапоминанияПользователяПереопределяемый.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания. +Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда + МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); + МодульЗаметкиПользователяСлужебный.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбменДанными + +// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. +Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); + МодульПользователиСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбновлениеВерсииИБ + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда + МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); + МодульАнкетирование.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); + МодульРаботаСКурсамиВалют.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда + МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); + МодульВызовОнлайнПоддержки.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда + МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); + МодульИнформацияПриЗапуске.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); + МодульКалендарныеГрафики.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); + МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); + МодульПолнотекстовыйПоискСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); + МодульПолучениеФайловИзИнтернетаСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); + МодульПользователиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); + + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + МодульКурсыВалютСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); + МодульОчередьЗаданийСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); + МодульПроверкаКонтрагентов.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + МодульРезервноеКопированиеИБСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + СтандартныеПодсистемыСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда + МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. +Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, + Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда + МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); + МодульИнформацияПриЗапуске.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ОчередьЗаданий + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииОбработчиковОшибок. +Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ПодключаемыеКоманды + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда + МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); + МодульЗаполнениеОбъектов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкаПорядкаЭлементов") Тогда + МодульНастройкаПорядкаЭлементов = ОбщегоНазначения.ОбщийМодуль("НастройкаПорядкаЭлементов"); + МодульНастройкаПорядкаЭлементов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + КонецЕсли; + +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. +Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда + МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); + МодульЗаполнениеОбъектов.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); + КонецЕсли; + +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаполнениеОбъектов") Тогда + МодульЗаполнениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗаполнениеОбъектов"); + МодульЗаполнениеОбъектов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкаПорядкаЭлементов") Тогда + МодульНастройкаПорядкаЭлементов = ОбщегоНазначения.ОбщийМодуль("НастройкаПорядкаЭлементов"); + МодульНастройкаПорядкаЭлементов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Пользователи + +// См. ПользователиПереопределяемый.ПриОпределенииНастроек. Процедура ПриОпределенииНастроек(Настройки) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -361,7 +1263,7 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда @@ -411,6 +1313,11 @@ МодульОценкаПроизводительностиСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриОпределенииНазначенияРолей(НазначениеРолей); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); МодульТекущиеДелаСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); @@ -418,7 +1325,7 @@ КонецПроцедуры -// См. процедуру ИзменитьДействияВФорме в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииДействийВФорме. Процедура ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -606,7 +1513,7 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриПолученииПрочихНастроек. Процедура ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт // Добавление настроек дополнительных отчетов и обработок. @@ -617,7 +1524,7 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриСохраненииПрочихНастроек. Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда @@ -627,7 +1534,7 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриУдаленииПрочихНастроек. Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда @@ -654,10 +1561,352 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Регламентные задания". +#КонецОбласти -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. +#Область ПрофилиБезопасности + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности. +Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); + МодульПолучениеФайловИзИнтернетаСлужебный.ПриВключенииИспользованияПрофилейБезопасности(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + МодульРезервноеКопированиеИБСервер.ПриВключенииИспользованияПрофилейБезопасности(); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда + МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); + МодульОтправкаSMS.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); + МодульОценкаПроизводительностиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); + МодульРаботаСБанками.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); + МодульСклонениеПредставленийОбъектов.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + СтандартныеПодсистемыСервер.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при регистрации менеджеров внешних модулей. +// +// Параметры: +// Менеджеры - Массив - ссылки на модули. +// +Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_БазоваяФункциональностьВМоделиСервиса + +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. +Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт + + ИнтеграцияСТехнологиейСервиса.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ОбменСообщениями + +// См. ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений. +Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); + МодульИнтерфейсыСообщенийВМоделиСервиса.ПриОпределенииОбработчиковКаналовСообщений(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); + МодульПоставляемыеДанные.ПриОпределенииОбработчиковКаналовСообщений(Обработчики); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриОпределенииОбработчиковКаналовСообщений(Обработчики); + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений. +Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт + + ИнтеграцияСТехнологиейСервиса.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений. +Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт + + ИнтеграцияСТехнологиейСервиса.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ОчередьЗаданий + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. +Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); + КонецЕсли; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + МодульУправлениеЭлектроннойПочтой = ОбщегоНазначения.ОбщийМодуль("УправлениеЭлектроннойПочтой"); + МодульУправлениеЭлектроннойПочтой.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + + ПользователиСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + + СтандартныеПодсистемыСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда + МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); + КонецЕсли; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + ИнтеграцияСТехнологиейСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + МодульКурсыВалютСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + МодульОбновлениеПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); + МодульОбновлениеПоставляемыеДанные.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); + МодульПроверкаКонтрагентов.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаВМоделиСервиса_ПоставляемыеДанные + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса") Тогда + МодульАдресныйКлассификаторВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторВМоделиСервисаСлужебный"); + МодульАдресныйКлассификаторВМоделиСервисаСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса") Тогда + МодульБанкиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("БанкиСлужебныйВМоделиСервиса"); + МодульБанкиСлужебныйВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + МодульКурсыВалютСлужебныйВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; + + ИнтеграцияСТехнологиейСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + +КонецПроцедуры + +#КонецОбласти + +#Область РегламентныеЗадания + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда @@ -676,8 +1925,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектовСобытия = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектовСобытия"); - МодульВерсионированиеОбъектовСобытия.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда @@ -700,6 +1949,11 @@ МодульПолнотекстовыйПоискСервер.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); @@ -710,22 +1964,255 @@ МодульУправлениеДоступомСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); - МодульФайловыеФункцииСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); - КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); МодульЦентрМониторингаСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда + МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); + МодульВнешниеКомпонентыСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); + КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Интеграция с подсистемой "Управление доступом". +#КонецОбласти + +#Область ТекущиеДела + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда + МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); + МодульЗаметкиПользователяСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + ОбновлениеИнформационнойБазыСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); + МодульПолнотекстовыйПоискСервер.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + ПользователиСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); + МодульРаботаСБанками.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + МодульРезервноеКопированиеИБСервер.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + СтандартныеПодсистемыСервер.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульСправочникиПрофилиГруппДоступа = ОбщегоНазначения.ОбщийМодуль("Справочники.ПрофилиГруппДоступа"); + МодульСправочникиПрофилиГруппДоступа.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область УправлениеДоступом + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт + + // Вызов в подсистему Пользователи должен быть первым. + ПользователиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииВидовДоступа(ВидыДоступа); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриЗаполненииВидовДоступа(ВидыДоступа); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа. +Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов. +Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа. +Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. +Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + МодульВзаимодействия.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); + МодульПользователиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда + МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); + МодульШаблоныСообщенийСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; + + +КонецПроцедуры // Возвращает менеджер временных таблиц, содержащий временную таблицу пользователей // некоторых дополнительных групп пользователей, например, пользователей групп @@ -774,3 +2261,5 @@ КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистемКлиент/Module.bsl b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистемКлиент/Module.bsl new file mode 100644 index 000000000..2fd367e18 --- /dev/null +++ b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистемКлиент/Module.bsl @@ -0,0 +1,245 @@ +//////////////////////////////////////////////////////////////////////////////// +// Интеграция подсистем библиотеки друг с другом. +// Здесь размещена обработка программных событий, возникающих в подсистемах-источниках, +// в тех случаях, когда подсистем-приемников более одной или их список заранее неизвестен. +// + +#Область СлужебныйПрограммныйИнтерфейс + +#Область БазоваяФункциональность + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + // Начало замера времени запуска программы. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + Параметры.Модули.Добавить(МодульОценкаПроизводительностиКлиент); + КонецЕсли; + + // Проверка минимальных прав на вход в программу. + Параметры.Модули.Добавить(ПользователиСлужебныйКлиент); + + // Проверка блокировки информационной базы для обновления. + Параметры.Модули.Добавить(ОбновлениеИнформационнойБазыКлиент); + + // Проверка минимально допустимой версии платформы для запуска. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", СтандартныеПодсистемыКлиент, 2)); + + // Проверка необходимости восстановления связи с главным узлом. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", СтандартныеПодсистемыКлиент, 3)); + + // Проверка блокировки области данных для обслуживания. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВМоделиСервисаКлиент"); + Параметры.Модули.Добавить(МодульРаботаВМоделиСервисаКлиент); + КонецЕсли; + + // Подтверждение легальности перед началом обновления ИБ. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует( + "СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + + МодульПроверкаЛегальностиПолученияОбновленияКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); + + Параметры.Модули.Добавить(МодульПроверкаЛегальностиПолученияОбновленияКлиент); + КонецЕсли; + + // Запрос у пользователя продолжения с повтором или без повтора загрузки сообщения обмена данными. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиКлиент"); + Параметры.Модули.Добавить(МодульОбменДаннымиКлиент); + КонецЕсли; + + // Проверка статуса обработчиков отложенного обновления. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 2)); + + // Загрузка/обновление параметров работы программы. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 3)); + + // Настройка автономного рабочего места при первом запуске. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует( + "ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + + МодульАвтономнаяРаботаСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АвтономнаяРаботаСлужебныйКлиент"); + Параметры.Модули.Добавить(МодульАвтономнаяРаботаСлужебныйКлиент); + КонецЕсли; + + // Проверка авторизации пользователя. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ПользователиСлужебныйКлиент, 2)); + + // Проверка блокировки входа в информационную базу. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + Параметры.Модули.Добавить(МодульСоединенияИБКлиент); + КонецЕсли; + + // Обновление информационной базы. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 4)); + + // Обработка ключа запуска ВыполнитьОбновлениеИЗавершитьРаботу. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 5)); + + // Смена пароля при входе, если требуется. + Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ПользователиСлужебныйКлиент, 3)); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + // Открытие помощника настройки подчиненного узла РИБ при первом запуске. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиКлиент"); + Параметры.Модули.Добавить(МодульОбменДаннымиКлиент); + КонецЕсли; + + // Открытие описания изменений системы. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеВерсииИБ") Тогда + МодульОбновлениеИнформационнойБазыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеИнформационнойБазыКлиент"); + Параметры.Модули.Добавить(МодульОбновлениеИнформационнойБазыКлиент); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент"); + Параметры.Модули.Добавить(МодульОбновлениеКонфигурацииКлиент); + КонецЕсли; + + // Показывает форму блокировки работы с внешними ресурсами, если нужно. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РегламентныеЗаданияКлиент"); + Параметры.Модули.Добавить(МодульРегламентныеЗаданияКлиент); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеИБКлиент"); + Параметры.Модули.Добавить(МодульРезервноеКопированиеИБКлиент); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + МодульЦентрМониторингаКлиентСлужебный = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиентСлужебный"); + Параметры.Модули.Добавить(МодульЦентрМониторингаКлиентСлужебный); + КонецЕсли; + + ИнтеграцияСТехнологиейСервисаКлиент.ПриНачалеРаботыСистемы(Параметры); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + СтандартныеПодсистемыКлиент.ПослеНачалаРаботыСистемы(); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанкамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСБанкамиКлиент"); + МодульРаботаСБанкамиКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалютКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКурсамиВалютКлиент"); + МодульРаботаСКурсамиВалютКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + МодульСоединенияИБКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда + МодульИнформацияПриЗапускеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнформацияПриЗапускеКлиент"); + МодульИнформацияПриЗапускеКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("НапоминанияПользователяКлиент"); + МодульНапоминанияПользователяКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиКлиент"); + МодульОбменДаннымиКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + + ОбновлениеИнформационнойБазыКлиент.ПослеНачалаРаботыСистемы(); + ПользователиСлужебныйКлиент.ПослеНачалаРаботыСистемы(); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульНастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент"); + МодульНастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент.ПослеНачалаРаботыСистемы(); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриОбработкеПараметровЗапуска. +Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + МодульСоединенияИБКлиент.ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. +Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент"); + МодульОбновлениеКонфигурацииКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); + МодульРаботаСФайламиСлужебныйКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеИБКлиент"); + МодульРезервноеКопированиеИБКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + КонецЕсли; + + ИнтеграцияСТехнологиейСервисаКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + +КонецПроцедуры + +#КонецОбласти + +#Область РезервноеКопированиеИБ + +// Проверяет возможность выполнения резервного копирования в пользовательском режиме. +// +// Параметры: +// Результат - Булево (возвращаемое значение). +// +Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеИБКлиент"); + МодульРезервноеКопированиеИБКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанныхКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеОбластейДанныхКлиент"); + МодульРезервноеКопированиеОбластейДанныхКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при предложении создать резервную копию. +Процедура ПриПредложенииПользователюСоздатьРезервнуюКопию() Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеИБКлиент"); + МодульРезервноеКопированиеИБКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию(); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанныхКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РезервноеКопированиеОбластейДанныхКлиент"); + МодульРезервноеКопированиеОбластейДанныхКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистемКлиент/ИнтеграцияСтандартныхПодсистемКлиент.mdo b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистемКлиент/ИнтеграцияСтандартныхПодсистемКлиент.mdo new file mode 100644 index 000000000..747fcb113 --- /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 index c3a85b745..3da01f9bb 100644 --- a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Интерфейсы сообщений в модели сервиса". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает поддерживаемые версии интерфейса сообщений, поддерживаемые текущей // информационной базой. // // Параметры: -// ИмяИнтерфейса - строка, имя программного интерфейса сообщений. +// ИмяИнтерфейса - Строка - Имя программного интерфейса сообщений. // // Возвращаемое значение: // Массив (элементы - строка), номера поддерживаемых версий в формате РР.{П|ПП}.ЗЗ.СС. @@ -33,10 +28,10 @@ // Возвращает версии интерфейса сообщений, поддерживаемые ИБ-корреспондентом. // // Параметры: -// ИнтерфейсСообщения - строка, имя программного интерфейса сообщений. -// ПараметрыПодключения - структура, параметры подключения к ИБ-корреспонденту. -// ПредставлениеПолучателя - строка, представление ИБ-корреспондента. -// ИнтерфейсТекущейИБ - строка, имя программного интерфейса текущей ИБ (используется +// ИнтерфейсСообщения - Строка - Имя программного интерфейса сообщений. +// ПараметрыПодключения - Структура - Параметры подключения к ИБ-корреспонденту. +// ПредставлениеПолучателя - Строка - Представление ИБ-корреспондента. +// ИнтерфейсТекущейИБ - Строка - Имя программного интерфейса текущей ИБ (используется // для обеспечения обратной совместимости с предыдущими версиями БСП). // // Возвращаемое значение: @@ -51,16 +46,11 @@ ВерсияКорреспондента = ВыборВерсииКорреспондента(ИнтерфейсТекущейИБ, ВерсииКорреспондента); КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииВерсииИнтерфейсаКорреспондента"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииВерсииИнтерфейсаКорреспондента( + ИнтеграцияСТехнологиейСервиса.ПриОпределенииВерсииИнтерфейсаКорреспондента( ИнтерфейсСообщения, ПараметрыПодключения, ПредставлениеПолучателя, ВерсияКорреспондента); - КонецЦикла; ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ПриОпределенииВерсииИнтерфейсаКорреспондента( ИнтерфейсСообщения, @@ -77,7 +67,7 @@ // Параметры: // URIПакета - Строка - URI пакета XDTO, типы сообщений из которого // требуется получить. -// БазовыйТип - ТипXDTO, базовый тип. +// БазовыйТип - ТипXDTO - базовый тип. // // Возвращаемое значение: // ФиксированныйМассив(Строка) - имена каналов найденные в пакете. @@ -103,7 +93,7 @@ // Параметры: // URIПакета - Строка - URI пакета XDTO, типы сообщений из которого // требуется получить, -// БазовыйТип - ТипXDTO, базовый тип. +// БазовыйТип - ТипXDTO - базовый тип. // // Возвращаемое значение: // Массив(ТипОбъектаXDTO) - типы сообщений найденные в пакете. @@ -133,19 +123,13 @@ // обработчиками интерфейсов отправляемых сообщений. // // Возвращаемое значение: -// ФиксированныйМассив. +// ФиксированныйМассив - Элементами массива являются общие модули. // Функция ПолучитьОбработчикиИнтерфейсовОтправляемыхСообщений() Экспорт МассивОбработчиков = Новый Массив(); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовОтправляемыхСообщений"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений( МассивОбработчиков); @@ -157,19 +141,13 @@ // обработчиками интерфейсов принимаемых сообщений. // // Возвращаемое значение: -// ФиксированныйМассив. +// ФиксированныйМассив - Элементами массива являются общие модули. // Функция ПолучитьОбработчикиИнтерфейсовПринимаемыхСообщений() Экспорт МассивОбработчиков = Новый Массив(); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовПринимаемыхСообщений"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений( МассивОбработчиков); @@ -180,9 +158,7 @@ // Возвращает соответствие названий программных интерфейсов сообщений и их обработчиков. // // Возвращаемое значение: -// ФиксированноеСоответствие: -// Ключ - строка, название программного интерфейса, -// Значение - ОбщийМодуль. +// ФиксированноеСоответствие - в котором Ключ - строка, название программного интерфейса, Значение - ОбщийМодуль. // Функция ПолучитьИнтерфейсыОтправляемыхСообщений() Экспорт @@ -200,9 +176,7 @@ // в вызывающем коде). // // Возвращаемое значение: -// ФиксированноеСоответствие: -// Ключ - строка, название программного интерфейса. -// Значение - строка, номер версии. +// ФиксированноеСоответствие - в котором Ключ - строка, название программного интерфейса, Значение - строка, номер версии. // Функция ПолучитьВерсииОтправляемыхСообщений() Экспорт @@ -219,7 +193,7 @@ // Возвращает массив обработчиков трансляции для сообщений модели сервиса. // // Возвращаемое значение: -// Массив(ОбщийМодуль). +// Массив - Содержит общие модули с обработчиками трансляции сообщений. // Функция ПолучитьОбработчикиТрансляцииСообщений() Экспорт @@ -243,92 +217,10 @@ #Область СлужебныйПрограммныйИнтерфейс -// Объявляет события подсистемы ОчередьЗаданий: -// -// Серверные события: -// РегистрацияИнтерфейсовПринимаемыхСообщений -// РегистрацияИнтерфейсовОтправляемыхСообщений -// ПриОпределенииВерсииИнтерфейсаКорреспондента. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов - // принимаемых сообщений. - // - // Параметры: - // МассивОбработчиков - массив. - // - // Синтаксис: - // Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт - // - // (То же, что ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовПринимаемыхСообщений"); - - // Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов - // отправляемых сообщений. - // - // Параметры: - // МассивОбработчиков - массив. - // - // - // Синтаксис: - // Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт - // - // (То же, что ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовОтправляемыхСообщений"); - - // Вызывается при определении версии интерфейса сообщений, поддерживаемой как ИБ-корреспондентом, - // так и текущей ИБ. В данной процедуре предполагается реализовывать механизмы поддержки обратной совместимости - // со старыми версиями ИБ-корреспондентов. - // - // Параметры: - // ИнтерфейсСообщения - строка, название программного интерфейса сообщения, для которого определяется версия. - // ПараметрыПодключения - структура, параметры подключения к ИБ-корреспонденту. - // ПредставлениеПолучателя - строка, представление ИБ-корреспондента. - // Результат - строка, определяемая версия. Значение данного параметра может быть изменено в данной процедуре. - // - // - // Синтаксис: - // Процедура ПриОпределенииВерсииИнтерфейсаКорреспондента(Знач ИнтерфейсСообщения, Знач ПараметрыПодключения, Знач ПредставлениеПолучателя, Результат) Экспорт - // - // (То же, что ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ПриОпределенииВерсииИнтерфейсаКорреспондента). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииВерсииИнтерфейсаКорреспондента"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"].Добавить( - "ИнтерфейсыСообщенийВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( - "ИнтерфейсыСообщенийВМоделиСервиса"); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - //////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. +// Обработчики событий подсистем конфигурации. -// Получает список обработчиков сообщений, которые обрабатывают подсистемы библиотеки. -// -// Параметры: -// Обработчики - ТаблицаЗначений - состав полей см. в ОбменСообщениями.НоваяТаблицаОбработчиковСообщений. -// +// См. ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений. Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт ОбработчикиИнтерфейсов = ПолучитьОбработчикиИнтерфейсовПринимаемыхСообщений(); @@ -357,31 +249,17 @@ КонецПроцедуры -// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию подсистем, -// используя в качестве ключей названия подсистем. -// Обеспечивает функциональность Web-сервиса InterfaceVersion. -// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). -// -// Параметры: -// СтруктураПоддерживаемыхВерсий - Структура: -// - Ключи = Названия подсистем. -// - Значения = Массивы названий поддерживаемых версий. -// -// Пример реализации: -// -// // СервисПередачиФайлов -// МассивВерсий = Новый Массив; -// МассивВерсий.Добавить("1.0.1.1"); -// МассивВерсий.Добавить("1.0.2.1"); -// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); -// // Конец СервисПередачиФайлов -// +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт ЗарегистрироватьВерсииПринимаемыхСообщений(СтруктураПоддерживаемыхВерсий); КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Заполняет переданную структуру поддерживаемых версий поддерживаемыми версиями принимаемых // сообщений. // diff --git a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl index c5fbb9002..146c2a5e4 100644 --- a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl @@ -1,16 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Интерфейсы сообщений в модели сервиса", переопределяемые -// процедуры и функции. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов // принимаемых сообщений. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - Элементами массива являются общие модули. // Процедура ЗаполнитьОбработчикиПринимаемыхСообщений(МассивОбработчиков) Экспорт @@ -20,7 +14,7 @@ // отправляемых сообщений. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - Элементами массива являются общие модули. // Процедура ЗаполнитьОбработчикиОтправляемыхСообщений(МассивОбработчиков) Экспорт @@ -31,10 +25,10 @@ // со старыми версиями ИБ-корреспондентов. // // Параметры: -// ИнтерфейсСообщения - строка, название программного интерфейса сообщения, для которого определяется версия. -// ПараметрыПодключения - структура, параметры подключения к ИБ-корреспонденту. -// ПредставлениеПолучателя - строка, представление ИБ-корреспондента. -// Результат - строка, определяемая версия. Значение данного параметра может быть изменено в данной процедуре. +// ИнтерфейсСообщения - Строка - Название программного интерфейса сообщения, для которого определяется версия. +// ПараметрыПодключения - Структура - Параметры подключения к ИБ-корреспонденту. +// ПредставлениеПолучателя - Строка - Представление ИБ-корреспондента. +// Результат - Строка - Определяемая версия. Значение данного параметра может быть изменено в данной процедуре. // Процедура ПриОпределенииВерсииИнтерфейсаКорреспондента(Знач ИнтерфейсСообщения, Знач ПараметрыПодключения, Знач ПредставлениеПолучателя, Результат) Экспорт diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl index 567009992..aee420a6a 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl @@ -1,103 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Информация при запуске". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "ИнформацияПриЗапускеКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныйМодуль = "ИнформацияПриЗапуске"; - - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - Обработчики обновления. -// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.ОбщиеДанные = Истина; - Обработчик.УправлениеОбработчиками = Ложь; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Версия = "*"; - Обработчик.Процедура = "ИнформацияПриЗапуске.ОперативноеОбновлениеОбщихДанных"; - Обработчик.Комментарий = НСтр("ru = 'Актуализирует данные первого показа.'"); - Обработчик.Приоритет = 100; -КонецПроцедуры - -// Вызывается после завершения монопольного обновления данных ИБ. -// -// Параметры: -// ПредыдущаяВерсия - Строка - версия подсистемы до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсия - Строка - версия подсистемы после обновления. -// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков обновления -// подсистемы, сгруппированных по номеру версии. -// Процедура обхода выполненных обработчиков: -// -// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл -// -// Если Версия.Версия = "*" Тогда -// // Обработчик, который может выполнятся при каждой смене версии. -// Иначе -// // Обработчик, который выполняется для определенной версии. -// КонецЕсли; -// -// Для Каждого Обработчик Из Версия.Строки Цикл -// ... -// КонецЦикла; -// -// КонецЦикла; -// -// ВыводитьОписаниеОбновлений - Булево (возвращаемое значение)- если установить Истина, -// тогда выводить форму с описанием обновлений. -// МонопольныйРежим - Булево - признак выполнения обновления в монопольном режиме. -// Истина - обновление выполнялось в монопольном режиме. -// -Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, - Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - - ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ИнформацияПриЗапуске", Неопределено, Неопределено); - -КонецПроцедуры - -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры - Структура - Параметры запуска. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - Параметры.Вставить("ИнформацияПриЗапуске", Новый ФиксированнаяСтруктура(ГлобальныеНастройки())); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Прочие процедуры служебного программного интерфейса. - // Актуализирует данные подсистемы с учетом режима работы программы. // Пример использования: после очистки хранилищ настроек. // @@ -117,9 +19,8 @@ ПоУмолчанию = Новый Структура("ОбщиеДанные, РазделенныеДанные, Оперативное, Отложенное, Полное"); Если Настройки.Количество() < ПоУмолчанию.Количество() Тогда - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - Если РежимРаботы.МодельСервиса Тогда - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда // Разделенный сеанс. + Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ПоУмолчанию.ОбщиеДанные = Ложь; ПоУмолчанию.РазделенныеДанные = Истина; Иначе // Неразделенный сеанс. @@ -127,7 +28,7 @@ ПоУмолчанию.РазделенныеДанные = Ложь; КонецЕсли; Иначе - Если РежимРаботы.Автономный Тогда // АРМ. + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда // АРМ. ПоУмолчанию.ОбщиеДанные = Ложь; ПоУмолчанию.РазделенныеДанные = Истина; Иначе // Коробка. @@ -162,6 +63,35 @@ Возврат Результат; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.ОбщиеДанные = Истина; + Обработчик.УправлениеОбработчиками = Ложь; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Версия = "*"; + Обработчик.Процедура = "ИнформацияПриЗапуске.ОперативноеОбновлениеОбщихДанных"; + Обработчик.Комментарий = НСтр("ru = 'Актуализирует данные первого показа.'"); + Обработчик.Приоритет = 100; +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. +Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, + Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт + + ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ИнформацияПриЗапуске", Неопределено, Неопределено); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + Параметры.Вставить("ИнформацияПриЗапуске", Новый ФиксированнаяСтруктура(ГлобальныеНастройки())); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -169,7 +99,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// [*] Актуализирует данные первого показа. +// Актуализирует данные первого показа. Процедура ОперативноеОбновлениеОбщихДанных() Экспорт ОбновитьКэшПервогоПоказа(Обработки.ИнформацияПриЗапуске); @@ -179,13 +109,14 @@ //////////////////////////////////////////////////////////////////////////////// // Служебные процедуры и функции. -// [*] Актуализирует данные первого показа. +// Актуализирует данные первого показа. Процедура ОбновитьКэшПервогоПоказа(НосительМакетов) // Формирование общей информации о пакетах страниц. ПакетыСтраниц = ПакетыСтраниц(НосительМакетов); // Извлечение данных пакетов и запись их в регистр. + УстановитьПривилегированныйРежим(Истина); НаборЗаписей = РегистрыСведений.ПакетыИнформацииПриЗапуске.СоздатьНаборЗаписей(); Для Каждого Пакет Из ПакетыСтраниц Цикл СоставПакета = ИзвлечьФайлыПакета(НосительМакетов, Пакет.ИмяМакета); @@ -201,6 +132,7 @@ Запись.Состав = Новый ХранилищеЗначения(ПакетыСтраниц); ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей, Ложь, Ложь); + УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры @@ -237,8 +169,10 @@ КонецЕсли; Если Настройки.Показывать Тогда + УстановитьПривилегированныйРежим(Истина); ЗаписьРегистра = РегистрыСведений.ПакетыИнформацииПриЗапуске.Получить(Новый Структура("Номер", 0)); ПакетыСтраниц = ЗаписьРегистра.Состав.Получить(); + УстановитьПривилегированныйРежим(Ложь); Если ПакетыСтраниц = Неопределено Тогда Настройки.Показывать = Ложь; Иначе @@ -356,7 +290,7 @@ Результат.Вставить("МинимальныйПриоритет", 100); Результат.Вставить("ПодготовленныеПакеты", Неопределено); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() Или ПолучитьФункциональнуюОпцию("РаботаВАвтономномРежиме") Тогда КолонкаПоказывать = ПакетыСтраниц.Колонки.ПоказыватьВМоделиСервиса; Иначе diff --git a/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl index ffdddeca9..5fc1e39bd 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl @@ -1,23 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Информация при запуске". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Вызывается после запуска конфигурации, подключает обработчик ожидания, который открывает окно информации. -Процедура ПослеНачалаРаботыСистемы() Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.Свойство("ИнформацияПриЗапуске") И ПараметрыКлиента.ИнформацияПриЗапуске.Показывать Тогда - ПодключитьОбработчикОжидания("ПоказатьИнформациюПослеЗапуска", 0.2, Истина); - КонецЕсли; - -КонецПроцедуры - // Вызывается из обработчика ожидания, открывает окно информации. Процедура Показать() Экспорт @@ -30,4 +12,17 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("ИнформацияПриЗапуске") И ПараметрыКлиента.ИнформацияПриЗапуске.Показывать Тогда + ПодключитьОбработчикОжидания("ПоказатьИнформациюПослеЗапуска", 0.2, Истина); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/ИнформацияПриЗапускеПереопределяемый/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапускеПереопределяемый/Module.bsl index ca01bfbb7..9a7937156 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапускеПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапускеПереопределяемый/Module.bsl @@ -1,22 +1,15 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Информация при запуске". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определение настроек отображения информации при запуске. // // Параметры: -// Настройки - Коллекция настроек подсистемы. Реквизиты: +// Настройки - Структура - Настройки подсистемы. // * Показывать - Булево - Показывать ли информацию в текущем сеансе. -// - Истина - Информация будет показана после входа в программу. -// - Ложь - Информация не будет показана. +// Истина - Информация будет показана после входа в программу. +// Ложь - Информация не будет показана. // Процедура ОпределитьНастройки(Настройки) Экспорт - - КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl index 62da2f576..8b53e72ff 100644 --- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -1,25 +1,20 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Календарные графики". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Функция возвращает массив дат, которые отличается указанной даты на количество дней, -// входящих в указанный график. +// Возвращает даты, которые отличаются от указанной даты ДатаОт на количество дней, +// входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - график (или производственный календарь), который необходимо использовать, -// тип СправочникСсылка.Календари или СправочникСсылка.ПроизводственныеКалендари. -// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата. -// МассивДней - массив с количеством дней, на которые нужно увеличить дату начала, тип Массив,Число. -// РассчитыватьСледующуюДатуОтПредыдущей - нужно ли рассчитывать следующую дату от предыдущей или -// все даты рассчитываются от переданной даты. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета дат. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или +// все даты рассчитываются от переданной даты. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // -// Возвращаемое значение -// Массив - массив дат, увеличенных на количество дней, входящих в график, -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// Неопределено, Массив - массив дат, увеличенных на количество дней, входящих в график, +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатыПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт @@ -114,19 +109,19 @@ КонецФункции -// Функция возвращает дату, которая отличается указанной даты на количество дней, -// входящих в указанный график. +// Возвращает дату, которая отличается указанной даты ДатаОт на количество дней, +// входящих в указанный график или производственный календарь ГрафикРаботы. // // Параметры: -// ГрафикРаботы - график (или производственный календарь), который необходимо использовать, -// тип СправочникСсылка.Календари или СправочникСсылка.ПроизводственныеКалендари. -// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата. -// КоличествоДней - количество дней, на которые нужно увеличить дату начала, тип Число. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета даты. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // -// Возвращаемое значение -// Дата - дата, увеличенная на количество дней, входящих в график. -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график. +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатаПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт @@ -152,18 +147,18 @@ КонецФункции -// Функция определяет количество дней, входящих в график, для указанного периода. +// Определяет количество дней, входящих в график, для указанного периода. // // Параметры: -// ГрафикРаботы - график (или производственный календарь), который необходимо использовать, -// тип СправочникСсылка.Календари или СправочникСсылка.ПроизводственныеКалендари. -// ДатаНачала - дата начала периода. -// ДатаОкончания - дата окончания периода. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета дней. +// ДатаНачала - Дата - дата начала периода. +// ДатаОкончания - Дата - дата окончания периода. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // -// Возвращаемое значение -// Число - количество дней между датами начала и окончания. -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// Число - количество дней между датами начала и окончания. +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция РазностьДатПоКалендарю(Знач ГрафикРаботы, Знач ДатаНачала, Знач ДатаОкончания, ВызыватьИсключение = Истина) Экспорт @@ -327,24 +322,26 @@ КонецФункции -// Функция определяет для каждой даты дату ближайшего к ней рабочего дня. +// Определяет для каждой даты дату ближайшего к ней рабочего дня. // // Параметры: -// График - ссылка на график работы или производственный календарь. -// НачальныеДаты - массив дат. -// ПолучатьПредшествующие - способ получения ближайшей даты, -// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, -// если Ложь - получаются даты не ранее начальной даты. -// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика. -// ИгнорироватьНезаполненностьГрафика - булево, если Истина, то в любом случае будет возвращено соответствие. -// Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. +// График - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета. +// НачальныеДаты - Массив - массив дат (Дата). +// ПолучатьПредшествующие - Булево - способ получения ближайшей даты: +// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, +// если Ложь - получаются даты не ранее начальной даты. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. +// Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. // // Возвращаемое значение: -// РабочиеДаты - соответствие, где ключ - дата из переданного массива, -// значение - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Соответствие, Неопределено - соответствие, где ключ - дата из переданного массива, +// значение - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // -Функция ДатыБлижайшихРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие = Ложь, ВызыватьИсключение = Истина, ИгнорироватьНезаполненностьГрафика = Ложь) Экспорт +Функция ДатыБлижайшихРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие = Ложь, ВызыватьИсключение = Истина, + ИгнорироватьНезаполненностьГрафика = Ложь) Экспорт Если Не ЗначениеЗаполнено(График) Тогда Если ВызыватьИсключение Тогда @@ -439,19 +436,19 @@ // Составляет расписания работы для дат, включенных в указанные графики на указанный период. // Если расписание на предпраздничный день не задано, то оно определяется так, как если бы этот день был бы рабочим. -// -// ВНИМАНИЕ! Для работы метода обязательно наличие подсистемы ГрафикиРаботы. +// Необходимо учитывать, что для работы этой функции обязательно наличие подсистемы ГрафикиРаботы. // // Параметры: -// Графики - массив элементов типа СправочникСсылка.Календари. -// ДатаНачала - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // -// Возвращаемое значение - таблица значений с колонками. -// ГрафикРаботы -// ДатаГрафика -// ВремяНачала -// ВремяОкончания +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * ГрафикРаботы - СправочникСсылка.Календари - график работы. +// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. +// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. +// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. // Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -464,10 +461,15 @@ КонецФункции -// Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками. -// Подробнее см. комментарий к функции РасписанияРаботыНаПериод. +// Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками, соответствующими возвращаемому значению +// функции РасписанияРаботыНаПериод. +// Необходимо учитывать, что для работы этой функции обязательно наличие подсистемы ГрафикиРаботы. // -// ВНИМАНИЕ! Для работы метода обязательно наличие подсистемы ГрафикиРаботы. +// Параметры: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -481,11 +483,11 @@ КонецПроцедуры -// Заполняет реквизит в форме, в том случае, если в используется единственный производственный календарь. +// Заполняет реквизит в форме, в том случае, если используется единственный производственный календарь. // // Параметры: -// Форма -// ПутьРеквизита - строка, путь к данным, например: "Объект.ПроизводственныйКалендарь". +// Форма - УправляемаяФорма - форма, в которой требуется заполнить реквизит. +// ПутьРеквизита - Строка - путь к данным, например: "Объект.ПроизводственныйКалендарь". // Процедура ЗаполнитьПроизводственныйКалендарьВФорме(Форма, ПутьРеквизита) Экспорт @@ -501,11 +503,39 @@ КонецПроцедуры -// Позволяет получить производственный календарь, -// составленный в соответствии с ст. 112 ТК РФ. +// Возвращает основной производственный календарь, используемый в учете. // -// Возвращаемое значение - ссылка на элемент справочника Производственные календари, -// Неопределено, в случае если производственный календарь не обнаружен. +// Возвращаемое значение: +// СправочникСсылка.ПроизводственныеКалендари, Неопределено - основной производственный календарь или +// Неопределено, в случае если он не обнаружен. +// +Функция ОсновнойПроизводственныйКалендарь() Экспорт + + Если Метаданные.Обработки.Найти("ЗаполнениеКалендарныхГрафиков") = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульКалендарныеГрафики.ОсновнойПроизводственныйКалендарь(); + + ПроизводственныйКалендарь = Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ"); + + Если ПроизводственныйКалендарь.Пустая() Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ПроизводственныйКалендарь; + +КонецФункции + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ОсновнойПроизводственныйКалендарь. +// Возвращает производственный календарь, составленный в соответствии с ст. 112 ТК РФ. +// +// Возвращаемое значение: +// СправочникСсылка.ПроизводственныеКалендари, Неопределено - производственный календарь РФ или +// Неопределено, в случае если он не обнаружен. // Функция ПроизводственныйКалендарьРоссийскойФедерации() Экспорт @@ -519,27 +549,82 @@ КонецФункции -#Область УстаревшиеПроцедурыИФункции - -// Устарела. См. функцию ДатыПоКалендарю +// Устарела. Следует использовать ДатыПоКалендарю. +// Возвращает даты, которые отличаются от указанной даты ДатаОт на количество дней, +// входящих в указанный график ГрафикРаботы. +// +// Параметры: +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета дат. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или +// все даты рассчитываются от переданной даты. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// +// Возвращаемое значение: +// Неопределено, Массив - массив дат, увеличенных на количество дней, входящих в график, +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ПолучитьМассивДатПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт Возврат ДатыПоКалендарю(ГрафикРаботы, ДатаОт, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей, ВызыватьИсключение); КонецФункции -// Устарела. См. функцию ДатаПоКалендарю. +// Устарела. Следует использовать ДатаПоКалендарю. +// Возвращает дату, которая отличается указанной даты ДатаОт на количество дней, +// входящих в указанный график или производственный календарь ГрафикРаботы. +// +// Параметры: +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета даты. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// +// Возвращаемое значение: +// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график. +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ПолучитьДатуПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт Возврат ДатаПоКалендарю(ГрафикРаботы, ДатаОт, КоличествоДней, ВызыватьИсключение); КонецФункции -// Устарела. См. функцию РазностьДатПоКалендарю +// Устарела. Следует использовать РазностьДатПоКалендарю +// Определяет количество дней, входящих в график, для указанного периода. +// +// Параметры: +// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета дней. +// ДатаНачала - Дата - дата начала периода. +// ДатаОкончания - Дата - дата окончания периода. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// +// Возвращаемое значение: +// Число - количество дней между датами начала и окончания. +// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ПолучитьРазностьДатПоКалендарю(Знач ГрафикРаботы, Знач ДатаНачала, Знач ДатаОкончания, ВызыватьИсключение = Истина) Экспорт Возврат РазностьДатПоКалендарю(ГрафикРаботы, ДатаНачала, ДатаОкончания, ВызыватьИсключение); КонецФункции -// Устарела. См. функцию ДатыБлижайшихРабочихДней +// Устарела. Следует использовать ДатыБлижайшихРабочихДней +// Определяет для каждой даты дату ближайшего к ней рабочего дня. +// +// Параметры: +// График - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или +// производственный календарь, который необходимо использовать для расчета. +// НачальныеДаты - Массив - массив дат (Дата). +// ПолучатьПредшествующие - Булево - способ получения ближайшей даты: +// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, +// если Ложь - получаются даты не ранее начальной даты. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. +// Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. +// +// Возвращаемое значение: +// Соответствие, Неопределено - соответствие, где ключ - дата из переданного массива, +// значение - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ПолучитьДатыРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие = Ложь, ВызыватьИсключение = Истина, ИгнорироватьНезаполненностьГрафика = Ложь) Экспорт Возврат ДатыБлижайшихРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие, ВызыватьИсключение, ИгнорироватьНезаполненностьГрафика); @@ -551,49 +636,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Объявляет служебные события подсистемы КалендарныеГрафики: -// -// Серверные события: -// ПриОбновленииПроизводственныхКалендарей. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается при изменении данных производственных календарей. - // - // Параметры: - // - УсловияОбновления - таблица значений с колонками. - // - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, - // - Год - год, за который изменились данные. - // - // Синтаксис: - // Процедура ПриОбновленииПроизводственныхКалендарей(УсловияОбновления) Экспорт - // - // (То же, что КалендарныеГрафикиПереопределяемый.ПриОбновленииПроизводственныхКалендарей). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.КалендарныеГрафики\ПриОбновленииПроизводственныхКалендарей"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления" - ].Добавить("КалендарныеГрафики"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке" - ].Добавить("КалендарныеГрафики"); - КонецЕсли; - -КонецПроцедуры - // Создает временную таблицу ВТПриращениеДней, в которой для каждого элемента из МассивДней // формируется строка с индексом элемента и значением - количеством дней. // @@ -641,43 +683,36 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - - // ТолькоДляПользователейСистемы. - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.ДобавлениеИзменениеКалендарныхГрафиков.Имя); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок -// при загрузке данных в другую информационную базу. +// Предназначена для обновления связанных с производственным календарем элементов, +// например, Графиков работы. // // Параметры: -// Типы - Массив(ОбъектМетаданных). +// ТаблицаИзменений - таблица с колонками. +// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, +// - Год - год, за который нужно обновить данные. // -Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт +Процедура РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаИзменений) Экспорт - Типы.Добавить(Метаданные.Справочники.ПроизводственныеКалендари); + КалендарныеГрафикиПереопределяемый.ПриОбновленииПроизводственныхКалендарей(ТаблицаИзменений); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений); + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() Тогда + ЗапланироватьОбновлениеДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений); + Возврат; + КонецЕсли; + + КалендарныеГрафикиПереопределяемый.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы. +// Обработчики событий подсистем конфигурации. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -689,7 +724,6 @@ Обработчик = Обработчики.Добавить(); Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "КалендарныеГрафики.ОбновитьДанныеПроизводственныхКалендарей"; - Обработчик.РежимВыполнения = "Монопольно"; Обработчик.Версия = "1.0.0.1"; Обработчик.ОбщиеДанные = Истина; @@ -709,18 +743,60 @@ Обработчик.ОбщиеДанные = Истина; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.6.86"; + Обработчик.Версия = "2.4.1.1"; Обработчик.Процедура = "КалендарныеГрафики.ОбновитьДанныеПроизводственныхКалендарей"; - Обработчик.РежимВыполнения = "Монопольно"; + Обработчик.РежимВыполнения = "Оперативно"; Обработчик.ОбщиеДанные = Истина; + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "КалендарныеГрафики.ОбновитьДанныеЗависимыеОтПроизводственныхКалендарей"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "КалендарныеГрафики.ЗаполнитьДанныеОбновленияДанныхЗависимыхОтПроизводственныхКалендарей"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ЗапускатьИВПодчиненномУзлеРИБСФильтрами = Истина; + Обработчик.ЧитаемыеОбъекты = "РегистрСведений.ДанныеПроизводственногоКалендаря"; + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.ДанныеПроизводственногоКалендаря"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("b1082291-b482-418f-82ab-3c96e93072cc"); + Обработчик.Комментарий = НСтр("ru = 'Обновление данных, зависимых от производственных календарей.'"); + КонецЕсли; + КонецПроцедуры +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт + + // ТолькоДляПользователейСистемы. + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.ДобавлениеИзменениеКалендарныхГрафиков.Имя); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + Типы.Добавить(Метаданные.Справочники.ПроизводственныеКалендари); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + // Обновляет справочник Производственные календари из одноименного макета. // Процедура ОбновитьПроизводственныеКалендари() Экспорт - ТекстовыйДокумент = Справочники.ПроизводственныеКалендари.ПолучитьМакет("ОписаниеКалендарей"); + Если Метаданные.Обработки.Найти("ЗаполнениеКалендарныхГрафиков") = Неопределено Тогда + Возврат; + КонецЕсли; + + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + ТекстовыйДокумент = МодульКалендарныеГрафики.ПолучитьМакет("ПроизводственныеКалендари"); ТаблицаКалендарей = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()).Данные; Справочники.ПроизводственныеКалендари.ОбновитьПроизводственныеКалендари(ТаблицаКалендарей); @@ -735,7 +811,64 @@ ТаблицаДанных = Справочники.ПроизводственныеКалендари.ДанныеПроизводственныхКалендарейИзМакета(); // Обновляем данные производственных календарей. - Справочники.ПроизводственныеКалендари.ОбновитьДанныеПроизводственныхКалендарей(ТаблицаДанных); + ТаблицаИзменений = Справочники.ПроизводственныеКалендари.ОбновитьДанныеПроизводственныхКалендарей(ТаблицаДанных); + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + ПараметрыОбработчика = ОбновлениеИнформационнойБазыСлужебный.ПараметрыОтложенногоОбработчикаОбновления( + "КалендарныеГрафики.ОбновитьДанныеЗависимыеОтПроизводственныхКалендарей"); + Если ПараметрыОбработчика <> Неопределено И ПараметрыОбработчика.Свойство("ТаблицаИзменений") Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТаблицаИзменений, ПараметрыОбработчика.ТаблицаИзменений); + КонецЕсли; + ПараметрыОбработчика = Новый Структура("ТаблицаИзменений"); + ПараметрыОбработчика.ТаблицаИзменений = ТаблицаИзменений; + ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПараметрыОтложенногоОбработчикаОбновления( + "КалендарныеГрафики.ОбновитьДанныеЗависимыеОтПроизводственныхКалендарей", ПараметрыОбработчика); + Иначе + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.ЗапланироватьОбновлениеГрафиковРаботы(ТаблицаИзменений); + КонецЕсли; + ЗапланироватьОбновлениеДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений); + КонецЕсли; + +КонецПроцедуры + +// Обновляет данные, зависимые от производственных календарей. +// +Процедура ОбновитьДанныеЗависимыеОтПроизводственныхКалендарей(ПараметрыОбновления) Экспорт + + Если Не ПараметрыОбновления.Свойство("ТаблицаИзменений") Тогда + ПараметрыОбновления.ОбработкаЗавершена = Истина; + Возврат; + КонецЕсли; + + ТаблицаИзменений = ПараметрыОбновления.ТаблицаИзменений; + ТаблицаИзменений.Свернуть("КодПроизводственногоКалендаря, Год"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(ТаблицаИзменений); + КонецЕсли; + + КалендарныеГрафикиПереопределяемый.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(ТаблицаИзменений); + + ПараметрыОбновления.ОбработкаЗавершена = Истина; + +КонецПроцедуры + +Процедура ЗаполнитьДанныеОбновленияДанныхЗависимыхОтПроизводственныхКалендарей(ПараметрыОбновления) Экспорт + +КонецПроцедуры + +// Процедура выполняет обновление данных, зависимых от производственных календарей, +// по всем областям данных. +// +Процедура ЗапланироватьОбновлениеДанныхЗависимыхОтПроизводственныхКалендарей(Знач УсловияОбновления) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ЗапланироватьОбновлениеДанныхЗависимыхОтПроизводственныхКалендарей(УсловияОбновления); + КонецЕсли; КонецПроцедуры @@ -816,7 +949,7 @@ | ПО ОшибочныеДанные.ПроизводственныйКалендарь = ПроизводственныеКалендари.Ссылка"; ТаблицаДанных = Запрос.Выполнить().Выгрузить(); - Справочники.ПроизводственныеКалендари.РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаДанных); + РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаДанных); КонецПроцедуры diff --git a/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl index 0f5de514e..832ae0f5b 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl @@ -1,19 +1,27 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Календарные графики". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при изменении данных производственных календарей. +// В случае, если разделение включено, выполняется в не разделенном режиме. // // Параметры: -// - УсловияОбновления - таблица значений с колонками. -// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, -// - Год - год, за который изменились данные. +// УсловияОбновления - ТаблицаЗначений - таблица с колонками: +// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; +// * Год - Число - календарный год, за который изменились данные. // Процедура ПриОбновленииПроизводственныхКалендарей(УсловияОбновления) Экспорт КонецПроцедуры +// Вызывается при изменении данных, зависимых от производственных календарей. +// В случае, если разделение включено, выполняется в областях данных. +// +// Параметры: +// УсловияОбновления - ТаблицаЗначений - таблица с колонками: +// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; +// * Год - Число - календарный год, за который изменились данные. +// +Процедура ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(УсловияОбновления) Экспорт + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl index 0f0c83120..3b3a300f9 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl @@ -1,50 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Календарные графики в модели сервиса". -// -//////////////////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( - "КалендарныеГрафикиСлужебныйВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "КалендарныеГрафикиСлужебныйВМоделиСервиса"); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ ПОЛУЧЕНИЯ ПОСТАВЛЯЕМЫХ ДАННЫХ - -// Регистрирует обработчики поставляемых данных за день и за все время. -// -Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "ПроизвКалендари"; - Обработчик.КодОбработчика = "ДанныеПроизводственныхКалендарей"; - Обработчик.Обработчик = КалендарныеГрафикиСлужебныйВМоделиСервиса; - -КонецПроцедуры +#Область СлужебныйПрограммныйИнтерфейс // Вызывается при получении уведомления о новых данных. // В теле следует проверить, необходимы ли эти данные приложению, // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево, возвращаемое. +// Дескриптор - ОбъектXDTO - Дескриптор. +// Загружать - Булево - Истина, если загружать, Ложь - иначе. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -57,9 +20,10 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - строка. Полное имя извлеченного файла. Файл будет автоматически удален -// после завершения процедуры. +// Дескриптор - ОбъектXDTO - Дескриптор. +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален +// после завершения процедуры. Если в менеджере сервиса не был +// указан файл - значение аргумента равно Неопределено. // Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт @@ -90,67 +54,22 @@ // Обновляем данные производственных календарей. ТаблицаДанных = Справочники.ПроизводственныеКалендари.ДанныеПроизводственныхКалендарейИзXML(ЧтениеXML); - Справочники.ПроизводственныеКалендари.ОбновитьДанныеПроизводственныхКалендарей(ТаблицаДанных); + ТаблицаИзменений = Справочники.ПроизводственныеКалендари.ОбновитьДанныеПроизводственныхКалендарей(ТаблицаДанных); + КалендарныеГрафики.РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаИзменений); КонецПроцедуры // Вызывается при отмене обработки данных в случае сбоя. // +// Параметры: +// Дескриптор - ОбъектXDTO - Дескриптор. +// Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт ПоставляемыеДанные.ОбластьОбработана(Дескриптор.FileGUID, "ДанныеПроизводственныхКалендарей", Неопределено); КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Зарегистрировать обработчики поставляемых данных. -// -// При получении уведомления о доступности новых общих данных, вызывается процедуры. -// ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. -// В процедуру передается Дескриптор - ОбъектXDTO Descriptor. -// -// В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, -// данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. -// ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. -// Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. -// -// Параметры: -// Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. -// Колонки: -// ВидДанных, строка - код вида данных, обрабатываемый обработчиком. -// КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. -// Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: -// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт -// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт -// ОбработкаДанныхОтменена(Дескриптор) Экспорт -// -Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - - ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); - -КонецПроцедуры - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("КалендарныеГрафикиСлужебныйВМоделиСервиса.ОбновитьГрафикиРаботы"); - -КонецПроцедуры - // Вызывается при изменении производственных календарей. // Процедура ЗапланироватьОбновлениеГрафиковРаботы(Знач УсловияОбновления) Экспорт @@ -170,6 +89,66 @@ КонецПроцедуры +// Вызывается при изменении производственных календарей. +// +Процедура ЗапланироватьОбновлениеДанныхЗависимыхОтПроизводственныхКалендарей(Знач УсловияОбновления) Экспорт + + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить(УсловияОбновления); + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("ИмяМетода" , "КалендарныеГрафикиПереопределяемый.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей"); + ПараметрыЗадания.Вставить("Параметры" , ПараметрыМетода); + ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3); + ПараметрыЗадания.Вставить("ОбластьДанных", -1); + + УстановитьПривилегированныйРежим(Истина); + ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("КалендарныеГрафикиСлужебныйВМоделиСервиса.ОбновитьГрафикиРаботы"); + СоответствиеИменПсевдонимам.Вставить("КалендарныеГрафикиПереопределяемый.ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Регистрирует обработчики поставляемых данных за день и за все время. +// +// Параметры: +// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки. +// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. +// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. +// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры: +// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт +// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт +// ОбработкаДанныхОтменена(Дескриптор) Экспорт +// +Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "ПроизвКалендари"; + Обработчик.КодОбработчика = "ДанныеПроизводственныхКалендарей"; + Обработчик.Обработчик = КалендарныеГрафикиСлужебныйВМоделиСервиса; + +КонецПроцедуры + // Процедура для вызова из очереди заданий, помещается туда в ЗапланироватьОбновлениеГрафиковРаботы. // // Параметры: @@ -211,7 +190,7 @@ Для каждого ОбластьДанных Из ОбластиДляОбновления Цикл УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); УстановитьПривилегированныйРежим(Ложь); НачатьТранзакцию(); diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl deleted file mode 100644 index e533f364b..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl +++ /dev/null @@ -1,17 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контроль динамического обновления конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Проверить, что информационная база была обновлена динамически. -// -Функция КонфигурацияБДБылаИзмененаДинамически() Экспорт - - Возврат КонфигурацияБазыДанныхИзмененаДинамически() - Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически(); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo deleted file mode 100644 index f0608d9fc..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - КонтрольДинамическогоОбновленияКонфигурацииВызовСервера - - ru - Контроль динамического обновления конфигурации вызов сервера - - true - true - diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl deleted file mode 100644 index 6497438b3..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl +++ /dev/null @@ -1,19 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контроль динамического обновления конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// Обработчик ожидания проверяет, что информационная база была обновлена динамически, и -// сообщает об этом пользователю. -// -Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт - - Параметры.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", - КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.КонфигурацияБДБылаИзмененаДинамически()); - -КонецПроцедуры - - -#КонецОбласти diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo deleted file mode 100644 index cf2d60611..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - КонтрольДинамическогоОбновленияКонфигурацииСлужебный - - ru - Контроль динамического обновления конфигурации служебный - - true - true - true - diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/Module.bsl deleted file mode 100644 index 81168882e..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/Module.bsl +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контроль динамического обновления конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// Обработчик ожидания проверяет, что информационная база была обновлена динамически, и -// сообщает об этом пользователю. -// -Процедура ПриВыполненииСтандартныхПериодическихПроверок(Параметры, ОбработкаПродолжения) Экспорт - - Контекст = Новый Структура; - Контекст.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - - Если Не Параметры.КонфигурацияБазыДанныхИзмененаДинамически Тогда - ВыполнитьОбработкуОповещения(Контекст.ОбработкаПродолжения); - Возврат; - КонецЕсли; - - ТекстСообщения = - НСтр("ru = 'Версия программы обновлена (внесены изменения в конфигурацию информационной базы). - |Для дальнейшей работы рекомендуется перезапустить программу. - |Перезапустить?'"); - - ОписаниеОповещения = Новый ОписаниеОповещения( - "ПриВыполненииСтандартныхПериодическихПроверокЗавершение", ЭтотОбъект, Контекст); - - ПоказатьВопрос(ОписаниеОповещения, ТекстСообщения, РежимДиалогаВопрос.ДаНет); - -КонецПроцедуры - -// Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок. -Процедура ПриВыполненииСтандартныхПериодическихПроверокЗавершение(Ответ, Контекст) Экспорт - - Если Ответ = КодВозвратаДиалога.Да Тогда - СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); - ЗавершитьРаботуСистемы(Истина, Истина); - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Контекст.ОбработкаПродолжения); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент.mdo deleted file mode 100644 index b6852172c..000000000 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент/КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент - - ru - Контроль динамического обновления конфигурации служебный клиент - - true - true - diff --git a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl index 9b345a143..fbc583942 100644 --- a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl @@ -1,38 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты в модели сервиса". -// -//////////////////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "КурсыВалютСлужебныйВМоделиСервиса"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( - "КурсыВалютСлужебныйВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "КурсыВалютСлужебныйВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "КурсыВалютСлужебныйВМоделиСервиса"); - КонецЕсли; - -КонецПроцедуры +#Область СлужебныйПрограммныйИнтерфейс // Загрузить полный список курсов за все время. // @@ -53,57 +20,38 @@ КонецПроцедуры -// Вызывается после загрузки данных в область. -// Обновляет курсы валют из поставляемых данных. +// Вызывается при изменении способа установки курса валюты. // -Процедура ОбновитьКурсыВалют() Экспорт +// Валюта - СправочникСсылка.Валюты +// +Процедура ЗапланироватьКопированиеКурсовВалюты(Знач Валюта) Экспорт - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Валюты.Код - |ИЗ - | Справочник.Валюты КАК Валюты - |ГДЕ - | Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)"; - Выборка = Запрос.Выполнить().Выбрать(); + Если Валюта.СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета Тогда + Возврат; + КонецЕсли; - // Копируем курсы. Это необходимо делать синхронно, т.к. за вызовом ОбновитьКурсыВалют - // следует обновление ИБ, которое пытается заблокировать базу. Копирование курсов - - // длительный процесс, который в асинхронном режиме может начаться в произвольный момент - // и помешать блокировке. - Пока Выборка.Следующий() Цикл - КопироватьКурсыВалюты(Выборка.Код); - КонецЦикла; + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить(Валюта.Код); + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("ИмяМетода", "КурсыВалютСлужебныйВМоделиСервиса.КопироватьКурсыВалюты"); + ПараметрыЗадания.Вставить("Параметры", ПараметрыМетода); + УстановитьПривилегированныйРежим(Истина); + ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ ПОЛУЧЕНИЯ ПОСТАВЛЯЕМЫХ ДАННЫХ - -// Регистрирует обработчики поставляемых данных за день и за все время. -// -Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "КурсыВалютЗаДень"; - Обработчик.КодОбработчика = "КурсыВалютЗаДень"; - Обработчик.Обработчик = КурсыВалютСлужебныйВМоделиСервиса; - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "КурсыВалют"; - Обработчик.КодОбработчика = "КурсыВалют"; - Обработчик.Обработчик = КурсыВалютСлужебныйВМоделиСервиса; - -КонецПроцедуры +// Обработчики событий подсистем конфигурации. // Вызывается при получении уведомления о новых данных. // В теле следует проверить, необходимы ли эти данные приложению, // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево, возвращаемое. +// Дескриптор - ОбъектXDTO - Дескриптор. +// Загружать - Булево - Истина, если загружать, Ложь - иначе. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -127,8 +75,8 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено. Полное имя извлеченного файла. Файл будет автоматически удален +// Дескриптор - ОбъектXDTO - Дескриптор. +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. // @@ -144,21 +92,16 @@ // Вызывается при отмене обработки данных в случае сбоя. // +// Параметры: +// Дескриптор - ОбъектXDTO - Дескриптор. +// Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт ПоставляемыеДанные.ОбластьОбработана(Дескриптор.FileGUID, "КурсыВалютЗаДень", Неопределено); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -167,81 +110,22 @@ КонецПроцедуры -// Вызывается при обновлении с прошлых версий, где не выставлялся флажок ЗагружаетсяИзИнтернета. -// -Процедура ПреобразованиеСвязейВалют() Экспорт - Перем Запрос, Выборка, НаборЗаписей, Запись; - Перем КлассификаторXML, КлассификаторТаблица, Валюта, НайденнаяСтрока; - - КлассификаторXML = Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); - КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; - КлассификаторТаблица.Индексы.Добавить("Code"); - - Выборка = Справочники.Валюты.Выбрать(); - Пока Выборка.Следующий() Цикл - Валюта = Выборка.ПолучитьОбъект(); - НайденнаяСтрока = КлассификаторТаблица.Найти(Валюта.Код, "Code"); - Если НайденнаяСтрока <> Неопределено И НайденнаяСтрока.RBCLoading = "истина" Тогда - Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт СоответствиеИменПсевдонимам.Вставить("КурсыВалютСлужебныйВМоделиСервиса.КопироватьКурсыВалюты"); КонецПроцедуры -// Зарегистрировать обработчики поставляемых данных. -// -// При получении уведомления о доступности новых общих данных, вызывается процедуры. -// ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. -// В процедуру передается Дескриптор - ОбъектXDTO Descriptor. -// -// В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, -// данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. -// ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. -// Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. -// -// Параметры: -// Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. -// Колонки: -// ВидДанных, строка - код вида данных, обрабатываемый обработчиком. -// КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. -// Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: -// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт -// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт -// ОбработкаДанныхОтменена(Дескриптор) Экспорт -// +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); КонецПроцедуры -// Вызывается после окончания загрузки данных из локальной версии -// в область данных сервиса или наоборот. -// -Процедура ПослеЗагрузкиДанныхИзДругойМодели() Экспорт +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда // Создаем связи между разделенными и неразделенными валютами, копируем курсы. @@ -250,6 +134,66 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Вызывается при обновлении с прошлых версий, где не выставлялся флажок ЗагружаетсяИзИнтернета. +// +Процедура ПреобразованиеСвязейВалют() Экспорт + РаботаСКурсамиВалют.ПреобразованиеСвязейВалют(); +КонецПроцедуры + +// Вызывается после загрузки данных в область. +// Обновляет курсы валют из поставляемых данных. +// +Процедура ОбновитьКурсыВалют() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Валюты.Код + |ИЗ + | Справочник.Валюты КАК Валюты + |ГДЕ + | Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)"; + Выборка = Запрос.Выполнить().Выбрать(); + + // Копируем курсы. Это необходимо делать синхронно, т.к. за вызовом ОбновитьКурсыВалют + // следует обновление ИБ, которое пытается заблокировать базу. Копирование курсов - + // длительный процесс, который в асинхронном режиме может начаться в произвольный момент + // и помешать блокировке. + Пока Выборка.Следующий() Цикл + КопироватьКурсыВалюты(Выборка.Код); + КонецЦикла; + +КонецПроцедуры + +// Регистрирует обработчики поставляемых данных за день и за все время. +// +// Параметры: +// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки. +// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. +// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. +// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры: +// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт +// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт +// ОбработкаДанныхОтменена(Дескриптор) Экспорт +// +Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "КурсыВалютЗаДень"; + Обработчик.КодОбработчика = "КурсыВалютЗаДень"; + Обработчик.Обработчик = КурсыВалютСлужебныйВМоделиСервиса; + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "КурсыВалют"; + Обработчик.КодОбработчика = "КурсыВалют"; + Обработчик.Обработчик = КурсыВалютСлужебныйВМоделиСервиса; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Сериализация/десериализация файла курсов. @@ -468,7 +412,7 @@ Попытка - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); ЗапросВалюты = Новый Запрос; ЗапросВалюты.Текст = @@ -524,7 +468,7 @@ Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Комментарий, ВыборкаВалюты.Код, ДатаКурсов); ИмяСобытия = НСтр("ru = 'Поставляемые данные.Отмена загрузки курсов валюты'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,, ВыборкаВалюты.Ссылка, Комментарий); - КонецЕсли; + КонецЕсли; // Проверка наличие установленного курса и кратности валюты на 1 января 1980 года. РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(ВыборкаВалюты.Ссылка); @@ -547,28 +491,6 @@ КонецПроцедуры -// Вызывается при изменении способа установки курса валюты. -// -// Валюта - СправочникСсылка.Валюты -// -Процедура ЗапланироватьКопированиеКурсовВалюты(Знач Валюта) Экспорт - - Если Валюта.СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета Тогда - Возврат; - КонецЕсли; - - ПараметрыМетода = Новый Массив; - ПараметрыМетода.Добавить(Валюта.Код); - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода", "КурсыВалютСлужебныйВМоделиСервиса.КопироватьКурсыВалюты"); - ПараметрыЗадания.Вставить("Параметры", ПараметрыМетода); - - УстановитьПривилегированныйРежим(Истина); - ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - -КонецПроцедуры - // Вызывается после загрузки данных в область или при изменении способа установки курса валюты. // Копирует курсы одной валюты за все даты из // неразделенного xml файла в разделенный регистр. @@ -608,7 +530,7 @@ НаборЗаписей.Записать(); - // Проверка наличия установленного курса и кратности валюты на 1 января 1980 года. + // Проверка наличие установленного курса и кратности валюты на 1 января 1980 года. РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(ВалютаСсылка); КонецПроцедуры diff --git a/SSL/src/CommonModules/НапоминанияПользователяВызовСервера/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяВызовСервера/Module.bsl index 2915c80e3..37ddb8d8f 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполняет запрос по напоминаниям для текущего пользователя на момент времени ТекущаяДатаСеанса() + 30минут. diff --git a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl index f1be462e1..88f9a8267 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Открывает форму текущих напоминаний пользователя. // Процедура ПроверитьТекущиеНапоминания() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); ИнтервалПроверкиНапоминаний = ПараметрыРаботыКлиента.НастройкиНапоминаний.ИнтервалПроверкиНапоминаний; // Открываем форму текущих оповещений. diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl index 61b2bfd53..1b21150f4 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Запускает периодическую проверку текущих напоминаний пользователя. @@ -91,10 +86,13 @@ #Область СлужебныйПрограммныйИнтерфейс -// Активизирует обработчик ожидания, проверяющий текущие напоминания пользователя. +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда Возврат; КонецЕсли; @@ -121,13 +119,8 @@ // а также для уменьшения количества серверных вызовов. ИмяПараметра = "СтандартныеПодсистемы.ФормаОповещения"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - #Если ВебКлиент Тогда - Окно = Неопределено; - #Иначе - Окно = ВариантОткрытияОкна.ОтдельноеОкно; - #КонецЕсли ИмяФормыОповещения = "РегистрСведений.НапоминанияПользователя.Форма.ФормаОповещения"; - ПараметрыПриложения.Вставить(ИмяПараметра, ПолучитьФорму(ИмяФормыОповещения, , , , Окно)); + ПараметрыПриложения.Вставить(ИмяПараметра, ПолучитьФорму(ИмяФормыОповещения)); КонецЕсли; ФормаОповещения = ПараметрыПриложения[ИмяПараметра]; ФормаОповещения.Открыть(); diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl index 7585ee4fe..796608640 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполняет запрос по напоминаниям для текущего пользователя на 30 минут вперед от текущего времени. diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl index 8709b5130..ddfaec068 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает массив текстовых представлений стандартных интервалов времени. @@ -90,7 +85,7 @@ КонецЕсли; КонецЕсли; - + Возврат СокрП(Результат); КонецФункции @@ -105,67 +100,61 @@ // Число - интервал времени в секундах. Функция ПолучитьИнтервалВремениИзСтроки(Знач СтрокаСоВременем) Экспорт + Если ПустаяСтрока(СтрокаСоВременем) Тогда + Возврат 0; + КонецЕсли; + + СтрокаСоВременем = НРег(СтрокаСоВременем); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, Символы.НПП," "); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, ".",","); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, "+",""); + + ПодстрокаСЦифрами = ""; + ПодстрокаСБуквами = ""; + + ПредыдущийСимволЭтоЦифра = Ложь; + ЕстьДробнаяЧасть = Ложь; + ЕстьЕдиницаИзмерения = Ложь; + Результат = 0; - Если Не ПустаяСтрока(СтрокаСоВременем) Тогда - СтрокаСоВременем = НРег(СтрокаСоВременем); - - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, Символы.НПП," "); - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, ".",","); - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, "+",""); - - ПодстрокаСЦифрами = ""; - ПодстрокаСБуквами = ""; - СтрокаДляВычисления = "0"; - - ПредыдущийСимволЭтоЦифра = Ложь; - ЕстьДробнаяЧасть = Ложь; - ЕстьЕдиницаИзмерения = Ложь; - - Для Позиция = 1 По СтрДлина(СтрокаСоВременем) Цикл - ТекущийКодСимвола = КодСимвола(СтрокаСоВременем,Позиция); - Символ = Сред(СтрокаСоВременем,Позиция,1); - Если (ТекущийКодСимвола >= КодСимвола("0") И ТекущийКодСимвола <= КодСимвола("9")) - ИЛИ (Символ="," И ПредыдущийСимволЭтоЦифра И Не ЕстьДробнаяЧасть) Тогда - Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда - СтрокаДляВычисления = СтрокаДляВычисления - + "+" - + ?(ПустаяСтрока(ПодстрокаСЦифрами),"1",ПодстрокаСЦифрами) - + "*" - + ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); - ПодстрокаСЦифрами = ""; - ПодстрокаСБуквами = ""; + Для Позиция = 1 По СтрДлина(СтрокаСоВременем) Цикл + ТекущийКодСимвола = КодСимвола(СтрокаСоВременем,Позиция); + Символ = Сред(СтрокаСоВременем,Позиция,1); + Если (ТекущийКодСимвола >= КодСимвола("0") И ТекущийКодСимвола <= КодСимвола("9")) + ИЛИ (Символ="," И ПредыдущийСимволЭтоЦифра И Не ЕстьДробнаяЧасть) Тогда + Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда + ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); + Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) + * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); - ПредыдущийСимволЭтоЦифра = Ложь; - ЕстьДробнаяЧасть = Ложь; - ЕстьЕдиницаИзмерения = Ложь; - КонецЕсли; + ПодстрокаСЦифрами = ""; + ПодстрокаСБуквами = ""; - ПодстрокаСЦифрами = ПодстрокаСЦифрами + Сред(СтрокаСоВременем,Позиция,1); - - ПредыдущийСимволЭтоЦифра = Истина; - Если Символ = "," Тогда - ЕстьДробнаяЧасть = Истина; - КонецЕсли; - Иначе - Если Символ = " " И ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами)="0" Тогда - ПодстрокаСБуквами = ""; - КонецЕсли; - - ПодстрокаСБуквами = ПодстрокаСБуквами + Сред(СтрокаСоВременем,Позиция,1); ПредыдущийСимволЭтоЦифра = Ложь; + ЕстьДробнаяЧасть = Ложь; + ЕстьЕдиницаИзмерения = Ложь; КонецЕсли; - КонецЦикла; - - Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда - СтрокаДляВычисления = СтрокаДляВычисления - + "+" - + ?(ПустаяСтрока(ПодстрокаСЦифрами),"1",ПодстрокаСЦифрами) - + "*" - + ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); + + ПодстрокаСЦифрами = ПодстрокаСЦифрами + Сред(СтрокаСоВременем,Позиция,1); + + ПредыдущийСимволЭтоЦифра = Истина; + Если Символ = "," Тогда + ЕстьДробнаяЧасть = Истина; + КонецЕсли; + Иначе + Если Символ = " " И ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами)="0" Тогда + ПодстрокаСБуквами = ""; + КонецЕсли; + + ПодстрокаСБуквами = ПодстрокаСБуквами + Сред(СтрокаСоВременем,Позиция,1); + ПредыдущийСимволЭтоЦифра = Ложь; КонецЕсли; - - СтрокаДляВычисления = СтрЗаменить(СтрокаДляВычисления,",","."); - Результат = Вычислить(СтрокаДляВычисления); + КонецЦикла; + + Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда + ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); + Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) + * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); КонецЕсли; Возврат Результат; diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиентСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиентСерверПереопределяемый/Module.bsl index af6bed291..9773c7bcd 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиентСерверПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиентСерверПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область УстаревшиеПроцедурыИФункции @@ -26,7 +21,7 @@ // Переопределяет варианты расписаний для выбора пользователем. // // Параметры: -// Расписания - Соответствие: +// Расписания - Соответствие - коллекция расписаний: // * Ключ - Строка - представление расписания; // * Значение - РасписаниеРегламентногоЗадания - вариант расписания. Процедура ПриПолученииСтандартныхРасписанийДляНапоминания(Расписания) Экспорт diff --git a/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl index cbc3af8a5..2182fcfdb 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Переопределяет настройки подсистемы. @@ -23,9 +18,9 @@ // // Параметры: // Источник - ЛюбаяСсылка - ссылка на объект, для которого формируется массив реквизитов с датами; -// МассивРеквизитов - Массив - имена реквизитов (из метаданных), содержащих даты. +// РеквизитыСДатами - Массив - имена реквизитов (из метаданных), содержащих даты. // -Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, МассивРеквизитов) Экспорт +Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl index cf770dcd7..0bc22e944 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl @@ -1,69 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Напоминания пользователя". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Объявляет события подсистемы НапоминанияПользователя: -// -// Серверные события: -// ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Переопределяет массив реквизитов объекта, относительно которых разрешается устанавливать время напоминания. - // Например, можно скрыть те реквизиты с датами, которые являются служебными или не имеют смысла для - // установки напоминаний: дата документа или задачи и прочие. - // -// Параметры: - // Источник - Любая ссылка - Ссылка на объект, для которого формируется массив реквизитов с датами. - // МассивРеквизитов - Массив - Массив имен реквизитов (из метаданных), содержащих даты. - // - // Синтаксис: - // Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, МассивРеквизитов) Экспорт - // - // (То же, что - // НапоминанияПользователяПереопределяемый.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.НапоминанияПользователя\ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания"); - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "НапоминанияПользователяКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "НапоминанияПользователяСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "НапоминанияПользователяСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "НапоминанияПользователяСлужебный"); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров запуска. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт Параметры.Вставить("НастройкиНапоминаний", @@ -71,12 +11,7 @@ КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт Параметры.Вставить("НастройкиНапоминаний", @@ -84,13 +19,7 @@ КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl index e32a44b32..64b58a5ad 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Настройка порядка элементов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Заполняет значение реквизита дополнительного упорядочивания у объекта. @@ -68,7 +63,7 @@ // Возвращает структуру с информацией о метаданных объекта. // // Параметры: -// Ссылка - ссылка на объект. +// МетаданныеОбъекта - ОбъектМетаданных - метаданные перемещаемого объекта. // // Возвращаемое значение: // Структура - информация из метаданных объекта. @@ -111,6 +106,72 @@ #КонецОбласти +#Область СлужебныйПрограммныйИнтерфейс + +// Перемещает элемент вверх или вниз в списке. +Процедура Подключаемый_ПереместитьЭлемент(Ссылка, ПараметрыВыполнения) Экспорт + Направление = ПараметрыВыполнения.ОписаниеКоманды.Идентификатор; + ТекстОшибки = НастройкаПорядкаЭлементовСлужебный.ПереместитьЭлемент(ПараметрыВыполнения.Источник, Ссылка, Направление); + ПараметрыВыполнения.Результат.Текст = ТекстОшибки; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + Вид = ВидыПодключаемыхКоманд.Добавить(); + Вид.Имя = "НастройкаПорядкаЭлементов"; + Вид.ИмяПодменю = "НастройкаПорядкаЭлементов"; + Вид.Заголовок = НСтр("ru = 'Настройка порядка элементов'"); + Вид.ВидГруппыФормы = ВидГруппыФормы.ГруппаКнопок; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт + + ОбъектыСНастраиваемымПорядком = Новый Массив; + Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ОбъектСНастраиваемымПорядком.Тип.Типы() Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + ОбъектыСНастраиваемымПорядком.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + + ВыводитьКоманды = Ложь; + Для Каждого Источник Из Источники.Строки Цикл + Если ОбъектыСНастраиваемымПорядком.Найти(Источник.ПолноеИмя) <> Неопределено Тогда + ВыводитьКоманды = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не ВыводитьКоманды Тогда + Возврат; + КонецЕсли; + + Команда = Команды.Добавить(); + Команда.Вид = "НастройкаПорядкаЭлементов"; + Команда.Идентификатор = "Вверх"; + Команда.Представление = НСтр("ru = 'Переместить элемент вверх'"); + Команда.Порядок = 1; + Команда.Картинка = БиблиотекаКартинок.ПереместитьВверх; + Команда.ИзменяетВыбранныеОбъекты = Истина; + Команда.МножественныйВыбор = Ложь; + Команда.Обработчик = "НастройкаПорядкаЭлементов.Подключаемый_ПереместитьЭлемент"; + Команда.ОтображениеКнопки = ОтображениеКнопки.Картинка; + Команда.Назначение = "ДляСписка"; + + Команда = Команды.Добавить(); + Команда.Вид = "НастройкаПорядкаЭлементов"; + Команда.Идентификатор = "Вниз"; + Команда.Представление = НСтр("ru = 'Переместить элемент вниз'"); + Команда.Порядок = 2; + Команда.Картинка = БиблиотекаКартинок.ПереместитьВниз; + Команда.ИзменяетВыбранныеОбъекты = Истина; + Команда.МножественныйВыбор = Ложь; + Команда.Обработчик = "НастройкаПорядкаЭлементов.Подключаемый_ПереместитьЭлемент"; + Команда.ОтображениеКнопки = ОтображениеКнопки.Картинка; + Команда.Назначение = "ДляСписка"; + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции Функция УОбъектаЕстьРеквизитДопУпорядочивания(Объект, Информация) diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl deleted file mode 100644 index a6e7ad1dc..000000000 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl +++ /dev/null @@ -1,166 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Настройка порядка элементов". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Обработчик команды "Переместить вверх" формы списка. -// -// Параметры: -// РеквизитФормыСписок - ДинамическийСписок - реквизит формы, содержащий список; -// ЭлементФормыСписок - ТаблицаФормы - элемент формы, содержащий список. -// -Процедура ПереместитьЭлементВверхВыполнить(РеквизитФормыСписок, ЭлементФормыСписок) Экспорт - - ПереместитьЭлемент(РеквизитФормыСписок, ЭлементФормыСписок, "Вверх"); - -КонецПроцедуры - -// Обработчик команды "Переместить вниз" формы списка. -// -// Параметры: -// РеквизитФормыСписок - ДинамическийСписок - реквизит формы, содержащий список; -// ЭлементФормыСписок - ТаблицаФормы - элемент формы, содержащий список. -// -Процедура ПереместитьЭлементВнизВыполнить(РеквизитФормыСписок, ЭлементФормыСписок) Экспорт - - ПереместитьЭлемент(РеквизитФормыСписок, ЭлементФормыСписок, "Вниз"); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПереместитьЭлемент(СписокРеквизит, СписокЭлемент, Направление) - - Если СписокЭлемент.ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("СписокРеквизит", СписокРеквизит); - Параметры.Вставить("СписокЭлемент", СписокЭлемент); - Параметры.Вставить("Направление", Направление); - - ОписаниеОповещения = Новый ОписаниеОповещения("ПереместитьЭлементПроверкаВыполнена", ЭтотОбъект, Параметры); - - ПроверитьСписокПередОперацией(ОписаниеОповещения, СписокРеквизит); - -КонецПроцедуры - -Процедура ПереместитьЭлементПроверкаВыполнена(РезультатПроверки, ДополнительныеПараметры) Экспорт - - Если РезультатПроверки <> Истина Тогда - Возврат; - КонецЕсли; - - СписокЭлемент = ДополнительныеПараметры.СписокЭлемент; - СписокРеквизит = ДополнительныеПараметры.СписокРеквизит; - Направление = ДополнительныеПараметры.Направление; - - ОтображениеСписком = (СписокЭлемент.Отображение = ОтображениеТаблицы.Список); - - ТекстОшибки = НастройкаПорядкаЭлементовСлужебныйВызовСервера.ИзменитьПорядокЭлементов( - СписокЭлемент.ТекущиеДанные.Ссылка, СписокРеквизит, ОтображениеСписком, Направление); - - Если Не ПустаяСтрока(ТекстОшибки) Тогда - ПоказатьПредупреждение(, ТекстОшибки); - КонецЕсли; - - СписокЭлемент.Обновить(); - -КонецПроцедуры - -Процедура ПроверитьСписокПередОперацией(ОбработчикРезультата, СписокРеквизит) - - Параметры = Новый Структура; - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Параметры.Вставить("СписокРеквизит", СписокРеквизит); - - Если Не СортировкаВСпискеУстановленаПравильно(СписокРеквизит) Тогда - ТекстВопроса = НСтр("ru = 'Для изменения порядка элементов необходимо настроить сортировку списка - |по полю ""Порядок"". Настроить необходимую сортировку?'"); - ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьСписокПередОперациейОтветПоСортировкеПолучен", ЭтотОбъект, Параметры); - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Настроить'")); - Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не настраивать'")); - ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да); - Возврат; - КонецЕсли; - - ПереместитьЭлементПроверкаВыполнена(Истина, ОбработчикРезультата.ДополнительныеПараметры); - -КонецПроцедуры - -Процедура ПроверитьСписокПередОперациейОтветПоСортировкеПолучен(РезультатОтвета, ДополнительныеПараметры) Экспорт - - Если РезультатОтвета <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - СписокРеквизит = ДополнительныеПараметры.СписокРеквизит; - - ПользовательскиеНастройкиПорядка = Неопределено; - Для Каждого Элемент Из СписокРеквизит.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл - Если ТипЗнч(Элемент) = Тип("ПорядокКомпоновкиДанных") Тогда - ПользовательскиеНастройкиПорядка = Элемент; - Прервать; - КонецЕсли; - КонецЦикла; - - ОбщегоНазначенияКлиентСервер.Проверить(ПользовательскиеНастройкиПорядка <> Неопределено, НСтр("ru = 'Пользовательская настройка порядка не найдена.'")); - - ПользовательскиеНастройкиПорядка.Элементы.Очистить(); - Элемент = ПользовательскиеНастройкиПорядка.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); - Элемент.Использование = Истина; - Элемент.Поле = Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания"); - Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; - -КонецПроцедуры - -Функция СортировкаВСпискеУстановленаПравильно(Список) - - ПользовательскиеНастройкиПорядка = Неопределено; - Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл - Если ТипЗнч(Элемент) = Тип("ПорядокКомпоновкиДанных") Тогда - ПользовательскиеНастройкиПорядка = Элемент; - Прервать; - КонецЕсли; - КонецЦикла; - - Если ПользовательскиеНастройкиПорядка = Неопределено Тогда - Возврат Истина; - КонецЕсли; - - ЭлементыПорядка = ПользовательскиеНастройкиПорядка.Элементы; - - // Найдем первый используемый элемент порядка. - Элемент = Неопределено; - Для Каждого ЭлементПорядка Из ЭлементыПорядка Цикл - Если ЭлементПорядка.Использование Тогда - Элемент = ЭлементПорядка; - Прервать; - КонецЕсли; - КонецЦикла; - - Если Элемент = Неопределено Тогда - // Не установлена никакая сортировка. - Возврат Ложь; - КонецЕсли; - - Если ТипЗнч(Элемент) = Тип("ЭлементПорядкаКомпоновкиДанных") Тогда - Если Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда - ПолеРеквизита = Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания"); - Если Элемент.Поле = ПолеРеквизита Тогда - Возврат Истина; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl index 86a813352..d4033b3ea 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl @@ -1,127 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Настройка порядка элементов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции -// Для внутреннего использования. -// -Функция СоседнийЭлемент(ПеремещаемыйЭлемент, Список, Знач Направление) - - // Подготовка текста запроса к основной таблице списка. - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | * - |ИЗ - | &Таблица КАК Таблица - |ГДЕ - | Таблица.РеквизитДопУпорядочивания > &РеквизитДопУпорядочивания - |УПОРЯДОЧИТЬ ПО - | Таблица.РеквизитДопУпорядочивания"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", Список.ОсновнаяТаблица); - - Если Направление = "Вверх" Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ">", "<"); - ТекстЗапроса = ТекстЗапроса + " УБЫВ"; - КонецЕсли; - - Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещения(ПеремещаемыйЭлемент.Метаданные()); - - ПостроительЗапроса = Новый ПостроительЗапроса(ТекстЗапроса); - ПостроительЗапроса.ЗаполнитьНастройки(); - Если Информация.ЕстьРодитель Тогда - ДобавитьПростойОтборВПостроительЗапроса(ПостроительЗапроса, "Родитель", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПеремещаемыйЭлемент, "Родитель")); - КонецЕсли; - - Если Информация.ЕстьВладелец Тогда - ДобавитьПростойОтборВПостроительЗапроса(ПостроительЗапроса, "Владелец", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПеремещаемыйЭлемент, "Владелец")); - КонецЕсли; - - Если Информация.ЕстьГруппы Тогда - Если Информация.ДляГрупп И Не Информация.ДляЭлементов Тогда - ДобавитьПростойОтборВПостроительЗапроса(ПостроительЗапроса, "ЭтоГруппа", Истина); - ИначеЕсли Не Информация.ДляГрупп И Информация.ДляЭлементов Тогда - ДобавитьПростойОтборВПостроительЗапроса(ПостроительЗапроса, "ЭтоГруппа", Ложь); - КонецЕсли; - КонецЕсли; - - ПостроительЗапроса.Параметры.Вставить("РеквизитДопУпорядочивания", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПеремещаемыйЭлемент, "РеквизитДопУпорядочивания")); - - Запрос = ПостроительЗапроса.ПолучитьЗапрос(); - - // Подготовка схемы компоновки данных, аналогичной списку. - - СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(Запрос.Текст); - - КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных; - АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных); - КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); - КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(Список.КомпоновщикНастроек.ПолучитьНастройки()); - КомпоновщикНастроекКомпоновкиДанных.Настройки.УсловноеОформление.Элементы.Очистить(); - - УстановитьНастройкуСтруктурыВыводаРезультата(КомпоновщикНастроекКомпоновкиДанных.Настройки); - - Для Каждого Параметр Из Запрос.Параметры Цикл - КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра( - Параметр.Ключ, Параметр.Значение); - КонецЦикла; - - // Проверка доступности полей в отборе. - Если Не ПоляОтбораВСпискеДоступных(КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки().Отбор.Элементы, КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки().Отбор.ДоступныеПоляОтбора.Элементы) Тогда - ВызватьИсключение НСтр("ru = 'Для перемещения элемента необходимо отключить все отборы в списке.'"); - КонецЕсли; - - // Вывод результата запроса - - РезультатКомпоновки = Новый ТаблицаЗначений; - КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; - - МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, - КомпоновщикНастроекКомпоновкиДанных.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); - - ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; - ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); - - ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; - ПроцессорВывода.УстановитьОбъект(РезультатКомпоновки); - ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); - - СоседнийЭлемент = Неопределено; - Если РезультатКомпоновки.Количество() > 0 Тогда - СоседнийЭлемент = РезультатКомпоновки[0].Ссылка; - КонецЕсли; - - Возврат СоседнийЭлемент; - -КонецФункции - -// Выполняет перемещение элемента вверх или вниз по списку. -// -// Параметры: -// Ссылка - Ссылка - ссылка на перемещаемый элемент; -// Список - ДинамическийСписок - список, в котором требуется переместить элемент; -// ОтображениеСписком - Булево - Истина, если у элемента формы, связанного со списком, включен режим отображения -// "Список"; -// Направление - Строка - направление перемещения элемента: "Вверх" или "Вниз" по списку. -// -// Возвращаемое значение: -// Строка - описание ошибки. -Функция ИзменитьПорядокЭлементов(Ссылка, Список, ОтображениеСписком, Направление) Экспорт - - Результат = ПроверитьВозможностьПеремещения(Ссылка, Список, ОтображениеСписком); - - Если ПустаяСтрока(Результат) Тогда - ПроверитьУпорядочиваниеЭлементов(Ссылка.Метаданные()); - ПередвинутьЭлемент(Ссылка, Список, Направление); - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Возвращает значение реквизита доп. упорядочивания для нового объекта. // // Параметры: @@ -177,155 +55,6 @@ КонецФункции -// Меняет местами выбранный элемент списка с соседним отображаемым элементом. -Процедура ПередвинутьЭлемент(Знач ПеремещаемыйЭлементСсылка, Знач Список, Знач Направление) - - СоседнийЭлементСсылка = СоседнийЭлемент(ПеремещаемыйЭлементСсылка, Список, Направление); - Если СоседнийЭлементСсылка = Неопределено Тогда - Возврат; - КонецЕсли; - - НачатьТранзакцию(); - Попытка - ЗаблокироватьДанныеДляРедактирования(ПеремещаемыйЭлементСсылка); - ЗаблокироватьДанныеДляРедактирования(СоседнийЭлементСсылка); - - ПеремещаемыйЭлементОбъект = ПеремещаемыйЭлементСсылка.ПолучитьОбъект(); - СоседнийЭлементОбъект = СоседнийЭлементСсылка.ПолучитьОбъект(); - - ПеремещаемыйЭлементОбъект.РеквизитДопУпорядочивания = ПеремещаемыйЭлементОбъект.РеквизитДопУпорядочивания - + СоседнийЭлементОбъект.РеквизитДопУпорядочивания; - СоседнийЭлементОбъект.РеквизитДопУпорядочивания = ПеремещаемыйЭлементОбъект.РеквизитДопУпорядочивания - - СоседнийЭлементОбъект.РеквизитДопУпорядочивания; - ПеремещаемыйЭлементОбъект.РеквизитДопУпорядочивания = ПеремещаемыйЭлементОбъект.РеквизитДопУпорядочивания - - СоседнийЭлементОбъект.РеквизитДопУпорядочивания; - - ПеремещаемыйЭлементОбъект.Записать(); - СоседнийЭлементОбъект.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -Процедура ДобавитьПростойОтборВПостроительЗапроса(ПостроительЗапроса, ИмяПоля, Значение) - Отбор = ПостроительЗапроса.Отбор; - ЭлементОтбораПостроителяЗапроса = Отбор.Добавить(ИмяПоля); - ЭлементОтбораПостроителяЗапроса.ВидСравнения = ВидСравнения.Равно; - ЭлементОтбораПостроителяЗапроса.Значение = Значение; - ЭлементОтбораПостроителяЗапроса.Использование = Истина; -КонецПроцедуры - -Функция СписокСодержитОтборПоВладельцу(Список) - - ТребуемыеОтборы = Новый Массив; - ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Владелец")); - ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Owner")); - - Для Каждого Отбор Из Список.КомпоновщикНастроек.ПолучитьНастройки().Отбор.Элементы Цикл - Если ТребуемыеОтборы.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция СписокСодержитОтборПоРодителю(Список) - - ТребуемыеОтборы = Новый Массив; - ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Родитель")); - ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Parent")); - - Для Каждого Отбор Из Список.КомпоновщикНастроек.ПолучитьНастройки().Отбор.Элементы Цикл - Если ТребуемыеОтборы.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция ПроверитьВозможностьПеремещения(Ссылка, Список, ОтображениеСписком) - - ПараметрыДоступа = ПараметрыДоступа("Изменение", Ссылка.Метаданные(), "Ссылка"); - Если Не ПараметрыДоступа.Доступность Тогда - Возврат НСтр("ru = 'Недостаточно прав для изменения порядка элементов.'"); - КонецЕсли; - - Для Каждого ЭлементГруппировки Из Список.КомпоновщикНастроек.ПолучитьНастройки().Структура Цикл - Если ЭлементГруппировки.Использование Тогда - Возврат НСтр("ru = 'Для изменения порядка элементов необходимо отключить все группировки.'"); - КонецЕсли; - КонецЦикла; - - Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещения(Ссылка.Метаданные()); - - // Для иерархических справочников может быть установлен отбор по родителю, если нет, - // то способ отображения должен быть иерархический или в виде дерева. - Если Информация.ЕстьРодитель И ОтображениеСписком И Не СписокСодержитОтборПоРодителю(Список) Тогда - Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить режим просмотра ""Дерево"" или ""Иерархический список"".'"); - КонецЕсли; - - // Для подчиненных справочников должен быть установлен отбор по владельцу. - Если Информация.ЕстьВладелец И Не СписокСодержитОтборПоВладельцу(Список) Тогда - Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить отбор по полю ""Владелец"".'"); - КонецЕсли; - - // Проверка признака "Использование" у реквизита РеквизитДопУпорядочивания по отношению к перемещаемому элементу. - Если Информация.ЕстьГруппы Тогда - ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ЭтоГруппа"); - Если ЭтоГруппа И Не Информация.ДляГрупп Или Не ЭтоГруппа И Не Информация.ДляЭлементов Тогда - Возврат НСтр("ru = 'Выбранный элемент нельзя перемещать.'"); - КонецЕсли; - КонецЕсли; - - Возврат ""; - -КонецФункции - -Функция СхемаКомпоновкиДанных(ТекстЗапроса) - - СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; - - ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); - ИсточникДанных.Имя = "ИсточникДанных1"; - ИсточникДанных.ТипИсточникаДанных = "local"; - - НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - НаборДанных.ИсточникДанных = "ИсточникДанных1"; - НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; - НаборДанных.Запрос = ТекстЗапроса; - НаборДанных.Имя = "НаборДанных1"; - - Возврат СхемаКомпоновкиДанных; - -КонецФункции - -Процедура УстановитьНастройкуСтруктурыВыводаРезультата(Настройки) - - Настройки.Структура.Очистить(); - Настройки.Выбор.Элементы.Очистить(); - - ГруппировкаКомпоновкиДанных = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); - ГруппировкаКомпоновкиДанных.Использование = Истина; - - ПолеГруппировки = ГруппировкаКомпоновкиДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); - ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); - ПолеГруппировки.Использование = Истина; - - ПолеВыбора = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); - ПолеВыбора.Использование = Истина; - -КонецПроцедуры - Функция ПроверитьУпорядочиваниеЭлементов(МетаданныеТаблицы) Если Не ПравоДоступа("Изменение", МетаданныеТаблицы) Тогда Возврат Ложь; @@ -429,27 +158,218 @@ КонецФункции -Функция ПолеОтбораВСпискеДоступных(ИмяПроверяемогоПоля, КоллекцияДоступныхПолейОтбора) - Для Каждого ПолеОтбора Из КоллекцияДоступныхПолейОтбора Цикл - Если ПолеОтбора.Поле = ИмяПроверяемогоПоля Тогда - Возврат Истина; +Функция ПереместитьЭлемент(ЭлементСписок, ТекущийЭлементСсылка, Направление) Экспорт + + ПараметрыДоступа = ПараметрыДоступа("Изменение", ТекущийЭлементСсылка.Метаданные(), "Ссылка"); + Если Не ПараметрыДоступа.Доступность Тогда + Возврат НСтр("ru = 'Недостаточно прав для изменения порядка элементов.'"); + КонецЕсли; + + Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещения(ТекущийЭлементСсылка.Метаданные()); + НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); + + // Для иерархических справочников может быть установлен отбор по родителю, если нет, + // то способ отображения должен быть иерархический или в виде дерева. + ОтображениеСписком = ЭлементСписок.Отображение = ОтображениеТаблицы.Список; + Если Информация.ЕстьРодитель И ОтображениеСписком И Не СписокСодержитОтборПоРодителю(НастройкиКомпоновкиДанных) Тогда + Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить режим просмотра ""Дерево"" или ""Иерархический список"".'"); + КонецЕсли; + + // Для подчиненных справочников должен быть установлен отбор по владельцу. + Если Информация.ЕстьВладелец И Не СписокСодержитОтборПоВладельцу(НастройкиКомпоновкиДанных) Тогда + Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить отбор по полю ""Владелец"".'"); + КонецЕсли; + + // Проверка признака "Использование" у реквизита РеквизитДопУпорядочивания по отношению к перемещаемому элементу. + Если Информация.ЕстьГруппы Тогда + ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийЭлементСсылка, "ЭтоГруппа"); + Если ЭтоГруппа И Не Информация.ДляГрупп Или Не ЭтоГруппа И Не Информация.ДляЭлементов Тогда + Возврат НСтр("ru = 'Выбранный элемент нельзя перемещать.'"); + КонецЕсли; + КонецЕсли; + + ПроверитьУпорядочиваниеЭлементов(ТекущийЭлементСсылка.Метаданные()); + + НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); + ТекстОшибки = ПроверитьСортировкуВСписке(НастройкиКомпоновкиДанных); + Если Не ПустаяСтрока(ТекстОшибки) Тогда + Возврат ТекстОшибки; + КонецЕсли; + + ГруппировкаКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0]; + + ПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных.Выбор.ДоступныеПоляВыбора.Элементы.Найти("Ссылка").Поле; + ЕстьПолеСсылка = Ложь; + Для Каждого ВыбранноеПолеКомпоновкиДанных Из ГруппировкаКомпоновкиДанных.Выбор.Элементы Цикл + Если ВыбранноеПолеКомпоновкиДанных.Поле = ПолеКомпоновкиДанных Тогда + ЕстьПолеСсылка = Истина; + Прервать; КонецЕсли; КонецЦикла; - Возврат Ложь; + Если Не ЕстьПолеСсылка Тогда + ВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПолеКомпоновкиДанных.Использование = Истина; + ВыбранноеПолеКомпоновкиДанных.Поле = ПолеКомпоновкиДанных; + КонецЕсли; + + СхемаКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемуюСхемуКомпоновкиДанных(); + ДеревоЗначений = ВыполнитьЗапрос(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных); + Если ДеревоЗначений = Неопределено Тогда + Возврат НСтр("ru = 'Для изменения порядка элементов необходимо сбросить настройки списка + |(Меню Еще - Установить стандартные настройки).'"); + КонецЕсли; + + СтрокаДереваЗначений = ДеревоЗначений.Строки.Найти(ТекущийЭлементСсылка, "Ссылка", Истина); + Родитель = СтрокаДереваЗначений.Родитель; + Если Родитель = Неопределено Тогда + Родитель = ДеревоЗначений; + КонецЕсли; + + ИндексТекущего = Родитель.Строки.Индекс(СтрокаДереваЗначений); + ИндексСоседнего = ИндексТекущего; + Если Направление = "Вверх" Тогда + Если ИндексТекущего > 0 Тогда + ИндексСоседнего = ИндексТекущего - 1; + КонецЕсли; + Иначе // Вниз + Если ИндексТекущего < Родитель.Строки.Количество() - 1 Тогда + ИндексСоседнего = ИндексТекущего + 1; + КонецЕсли; + КонецЕсли; + + Если ИндексТекущего <> ИндексСоседнего Тогда + СоседняяСтрока = Родитель.Строки.Получить(ИндексСоседнего); + СоседнийЭлементСсылка = СоседняяСтрока.Ссылка; + + Элементы = Новый Массив; + Элементы.Добавить(ТекущийЭлементСсылка); + Элементы.Добавить(СоседнийЭлементСсылка); + + ПоменятьЭлементыМестами(ТекущийЭлементСсылка, СоседнийЭлементСсылка); + КонецЕсли; + + Возврат ""; КонецФункции -Функция ПоляОтбораВСпискеДоступных(КоллекцияПроверяемыхОтборов, КоллекцияДоступныхПолей) - Результат = Истина; - Для Каждого ПолеОтбора Из КоллекцияПроверяемыхОтборов Цикл - Если ПолеОтбора.Использование Тогда - Если ТипЗнч(ПолеОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда - Результат = Результат И ПоляОтбораВСпискеДоступных(ПолеОтбора.Элементы, КоллекцияДоступныхПолей); - Иначе - Результат = Результат И ПолеОтбораВСпискеДоступных(ПолеОтбора.ЛевоеЗначение, КоллекцияДоступныхПолей); - КонецЕсли; - КонецЕсли; - КонецЦикла; +Функция ВыполнитьЗапрос(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных) + + Результат = Новый ДеревоЗначений; + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + Попытка + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, + НастройкиКомпоновкиДанных, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + Исключение + ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Неопределено; + КонецПопытки; + + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ПроцессорВывода.УстановитьОбъект(Результат); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + Возврат Результат; КонецФункции +Процедура ПоменятьЭлементыМестами(ПервыйЭлементСсылка, ВторойЭлементСсылка) + + НачатьТранзакцию(); + Попытка + ЗаблокироватьДанныеДляРедактирования(ПервыйЭлементСсылка); + ЗаблокироватьДанныеДляРедактирования(ВторойЭлементСсылка); + + ПервыйЭлементОбъект = ПервыйЭлементСсылка.ПолучитьОбъект(); + ВторойЭлементОбъект = ВторойЭлементСсылка.ПолучитьОбъект(); + + ИндексПервого = ПервыйЭлементОбъект.РеквизитДопУпорядочивания; + ИндексВторого = ВторойЭлементОбъект.РеквизитДопУпорядочивания; + + ПервыйЭлементОбъект.РеквизитДопУпорядочивания = ИндексВторого; + ВторойЭлементОбъект.РеквизитДопУпорядочивания = ИндексПервого; + + ПервыйЭлементОбъект.Записать(); + ВторойЭлементОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция ПроверитьСортировкуВСписке(НастройкиКомпоновкиДанных) + + ЭлементыПорядка = НастройкиКомпоновкиДанных.Порядок.Элементы; + + ДополнительныеПоляПорядка = Новый Массив; + ДополнительныеПоляПорядка.Добавить(Новый ПолеКомпоновкиДанных("ДополнительноеПолеПорядка1")); + ДополнительныеПоляПорядка.Добавить(Новый ПолеКомпоновкиДанных("ДополнительноеПолеПорядка2")); + ДополнительныеПоляПорядка.Добавить(Новый ПолеКомпоновкиДанных("ДополнительноеПолеПорядка3")); + + Элемент = Неопределено; + Для Каждого ЭлементПорядка Из ЭлементыПорядка Цикл + Если ЭлементПорядка.Использование Тогда + Элемент = ЭлементПорядка; + Если ДополнительныеПоляПорядка.Найти(Элемент.Поле) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Прервать; + КонецЕсли; + КонецЦикла; + + СортировкаПравильная = Ложь; + Если Элемент <> Неопределено И ТипЗнч(Элемент) = Тип("ЭлементПорядкаКомпоновкиДанных") Тогда + Если Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда + ПолеРеквизита = Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания"); + Если Элемент.Поле = ПолеРеквизита Тогда + СортировкаПравильная = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + РеквизитДопУпорядочивания = НастройкиКомпоновкиДанных.Порядок.ДоступныеПоляПорядка.НайтиПоле(Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания")); + Если Не СортировкаПравильная Тогда + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Для перемещения элементов необходимо настроить сортировку + |в списке по полю ""%1"" (по возрастанию)'"), РеквизитДопУпорядочивания.Заголовок); + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция СписокСодержитОтборПоВладельцу(НастройкиКомпоновкиДанных) + + ТребуемыеОтборы = Новый Массив; + ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Владелец")); + ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Owner")); + + Для Каждого Отбор Из НастройкиКомпоновкиДанных.Отбор.Элементы Цикл + Если ТребуемыеОтборы.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция СписокСодержитОтборПоРодителю(НастройкиКомпоновкиДанных) + + ТребуемыеОтборы = Новый Массив; + ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Родитель")); + ТребуемыеОтборы.Добавить(Новый ПолеКомпоновкиДанных("Parent")); + + Для Каждого Отбор Из НастройкиКомпоновкиДанных.Отбор.Элементы Цикл + Если ТребуемыеОтборы.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/Module.bsl deleted file mode 100644 index 9dd5b4a4d..000000000 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/Module.bsl +++ /dev/null @@ -1,16 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Настройка порядка элементов". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// См. эту функцию в модуле НастройкаПорядкаЭлементовСлужебный. -Функция ИзменитьПорядокЭлементов(Ссылка, ДинамическийСписок, ОтображениеСписком, Направление) Экспорт - - Возврат НастройкаПорядкаЭлементовСлужебный.ИзменитьПорядокЭлементов( - Ссылка, ДинамическийСписок, ОтображениеСписком, Направление); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/НастройкаПорядкаЭлементовСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/НастройкаПорядкаЭлементовСлужебныйВызовСервера.mdo deleted file mode 100644 index 5c7d8a240..000000000 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебныйВызовСервера/НастройкаПорядкаЭлементовСлужебныйВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - НастройкаПорядкаЭлементовСлужебныйВызовСервера - - ru - Настройка порядка элементов служебный вызов сервера - - true - true - diff --git a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl index c11dbf462..cec302f38 100644 --- a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Управление разрешениями в профилях безопасности из текущей ИБ. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверяет завершение операции применения разрешений на использование внешних ресурсов. diff --git a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный/Module.bsl b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный/Module.bsl index c05e51b0a..9956bcd99 100644 --- a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный/Module.bsl +++ b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Управление разрешениями в профилях безопасности из текущей ИБ. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполняет асинхронную обработку оповещения о закрытии форм мастера настройки разрешений на diff --git a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl index ef46efe2a..b5f881976 100644 --- a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl +++ b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl @@ -1,24 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Управление разрешениями в профилях безопасности из текущей ИБ. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции +#Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Запуск клиентского приложения. -// +// Обработчики событий подсистем конфигурации. -// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. -// Вызывается после завершения действий ПриНачалеРаботыСистемы. -// Используется для подключения обработчиков ожидания, которые не должны вызываться -// в случае интерактивных действий перед и при начале работы системы. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиентаПриЗапуске.ОтображатьПомощникНастройкиРазрешений Тогда Если ПараметрыРаботыКлиентаПриЗапуске.ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов Тогда @@ -32,6 +20,10 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Применение запросов разрешений на использование внешних ресурсов. // @@ -125,10 +117,9 @@ // Выполняет запуск мастера настройки разрешений на использование служебных ресурсов. // // Параметры: -// Идентификаторы - Массив(УникальныйИдентификатор) - идентификаторы запросов на использование внешних ресурсов, -// для применения которых вызывается мастер, -// ФормаВладелец - УправляемаяФорма или Неопределено - форма, по отношению которой мастер открывается в -// псевдо-модальном режиме, +// Идентификаторы - Массив - идентификаторы (УникальныйИдентификатор) запросов на использование внешних ресурсов, +// для применения которых вызывается мастер. +// ФормаВладелец - УправляемаяФорма, Неопределено - форма, по отношению которой открывался мастер. // ОповещениеОЗакрытии - ОписаниеОповещения или Неопределено - описание оповещения, обработка которого должна быть // выполнена после завершения работы мастера, // РежимВключения - Булево - флаг того, что мастер вызывается при выполнении включения использования для информационной @@ -191,6 +182,10 @@ КонецПроцедуры // Выполняет переход к диалогу настройки разрешений в профилях безопасности. +// Результатом операции является открытии формы: +// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов", +// для которой в качестве описания оповещения о закрытии установлена процедура +// ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера. // // Параметры: // Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на @@ -198,10 +193,6 @@ // Состояние - Структура, описывающая состояние мастера настройки разрешений (см. // СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов))). // -// Результатом операции является открытии формы. -// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов", для которой -// в качестве описания оповещения о закрытии установлена процедура -// ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов() или аварийное прерывание работы мастера. // Процедура ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт @@ -252,6 +243,10 @@ КонецПроцедуры // Выполняет переход к диалогу ожидания применения настроек профилей безопасности кластером серверов. +// Результатом операции является открытии формы: +// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений", для которой +// в качестве описания оповещения о закрытии установлена процедура +// ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера. // // Параметры: // Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на @@ -263,11 +258,6 @@ // Состояние - Структура - описывающая состояние мастера настройки разрешений (см. // СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов))). // -// Результатом операции является открытии формы -// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений", для которой -// в качестве описания оповещения о закрытии установлена процедура -// ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов() или аварийное прерывание работы мастера. -// Процедура ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт Если Результат = КодВозвратаДиалога.ОК ИЛИ Результат = КодВозвратаДиалога.Пропустить Тогда @@ -312,15 +302,14 @@ КонецПроцедуры // Выполняет завершение работы мастера применения разрешений на использование внешних ресурсов. +// Результатом операции является обработка описания оповещения, которое изначально было передано из формы, для которой +// открывался мастер. // // Параметры: // Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на // использование внешних ресурсов (используемые значения - ОК и Отмена), -// Состояние - Структура, описывающая состояние мастера настройки разрешений (см. -// СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов))). -// -// Результатом операции является обработка описания оповещения, которое изначально было передано из формы, для которой -// мастер открывался в псевдо-модальном режиме. +// Состояние - Структура - описывает состояние мастера настройки разрешений. +// См. СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов. // Процедура ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт @@ -342,11 +331,10 @@ КонецПроцедуры // Асинхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения, -// которое изначально было передано из формы, для которой мастер открывался в псевдо-модальном режиме, возвращая -// код возврата ОК. +// которое изначально было передано из формы, для которой открывался мастер, возвращая код возврата ОК. // // Параметры: -// ОписаниеОповещения - ОписаниеОповещения, которое было передано из вызывающего кода. +// ОписаниеОповещения - ОписаниеОповещения - которое было передано из вызывающего кода. // Процедура ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Знач ОписаниеОповещения) @@ -361,11 +349,10 @@ КонецПроцедуры // Асинхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения, -// которое изначально было передано из формы, для которой мастер открывался в псевдо-модальном режиме, возвращая -// код возврата Отмена. +// которое изначально было передано из формы, для которой открывался мастер, возвращая код возврата Отмена. // // Параметры: -// ОписаниеОповещения - ОписаниеОповещения, которое было передано из вызывающего кода. +// ОписаниеОповещения - ОписаниеОповещения - которое было передано из вызывающего кода. // Процедура ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Знач ОписаниеОповещения) @@ -380,7 +367,7 @@ КонецПроцедуры // Синхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения, -// которое изначально было передано из формы, для которой мастер открывался в псевдо-модальном режиме. +// которое изначально было передано из формы, для которой открывался мастер. // // Параметры: // КодВозврата - КодВозвратаДиалога. @@ -405,17 +392,17 @@ // разрешений на использование внешних ресурсов. // // Параметры: -// Результат - Произвольный, результат закрытия формы, для которой в псевдо-модальном режиме открывался мастер -// настройки разрешений на использование внешних ресурсов. В теле процедуры не используется, параметр требуется -// для назначения процедуры в качестве описания оповещения о закрытия формы. -// Состояние - Структура - описывающая состояние проверки завершения операции (см. -// СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца()). +// Результат - Произвольный - результат закрытия формы, для которой открывался мастер настройки разрешений +// на использование внешних ресурсов. В теле процедуры не используется, параметр требуется +// для назначения процедуры в качестве описания оповещения о закрытия формы. +// Состояние - Структура - описывает состояние проверки завершения операции. +// См. СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца. // // Результатом выполнения данной процедуры является запуск мастера настройки разрешений на использование // внешних ресурсов в режиме проверки завершения операции, в рамках которой ранее применялись разрешения // на использование внешних ресурсов (с штатным прохождением всех операций), после завершения работы которого // будет вызвана обработка описания оповещения, в качестве которого установлена процедура. -// ПослеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца(). +// ПослеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца. // Процедура ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца(Результат, Состояние) Экспорт @@ -432,10 +419,8 @@ // Обрабатывает проверку применения запросов на использование внешних ресурсов. // // Параметры: -// Проверка - Структура - состояние выполнения проверки применения разрешений на использование -// внешних ресурсов (подробнее см. результат, возвращаемый функции. -// НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера. -// ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов(). +// Проверка - Структура - состояние выполнения проверки применения разрешений на использование внешних ресурсов +// См. НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов. // Процедура ПослеПроверкиПримененияРазрешенийНаИспользованиеВнешнихРесурсов(Знач Проверка) @@ -468,7 +453,7 @@ // // Параметры: // ФормаВладелец - УправляемаяФорма - форма, которая должна блокироваться до окончания применения разрешений, -// ОповещениеОЗакрытии - ОписаниеОповещения - которое будет вызвано при успешном предоставлении разрешений. +// ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений. // Процедура НачатьВключениеИспользованияПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт @@ -482,7 +467,7 @@ // // Параметры: // ФормаВладелец - УправляемаяФорма - форма, которая должна блокироваться до окончания применения разрешений, -// ОповещениеОЗакрытии - ОписаниеОповещения - которое будет вызвано при успешном предоставлении разрешений. +// ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений. // Процедура НачатьОтключениеИспользованияПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт @@ -497,7 +482,7 @@ // // Параметры: // ФормаВладелец - УправляемаяФорма - форма, которая должна блокироваться до окончания применения разрешений, -// ОповещениеОЗакрытии - ОписаниеОповещения - которое будет вызвано при успешном предоставлении разрешений. +// ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений. // Процедура НачатьВосстановлениеПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт @@ -507,20 +492,22 @@ КонецПроцедуры // Проверяет необходимость отображения помощника настройки разрешений на использование -// внешних (относительно кластера серверов 1С:Предприятия) ресурсов. +// внешних (относительно кластера серверов 1С:Предприятия) ресурсов. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево. // Функция ОтображатьПомощникНастройкиРазрешений() - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ОтображатьПомощникНастройкиРазрешений; + Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ОтображатьПомощникНастройкиРазрешений; КонецФункции // Конструктор структуры, которая используется для хранения состояния работы мастера // настройки разрешений на использование внешних ресурсов. // -// Возвращаемое значение: Структура - описание полей см. в теле функции. +// Возвращаемое значение: +// Структура - описание полей см. в теле функции. // Функция СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов() @@ -564,7 +551,8 @@ // Конструктор структуры, которая используется для хранения состояния проверки завершения // операции, в рамках которой применялись запросы разрешений на использование внешних ресурсов. // -// Возвращаемое значение: Структура - описание полей см. в теле функции. +// Возвращаемое значение: +// Структура - описание полей см. в теле функции. // Функция СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца() @@ -584,7 +572,8 @@ // Возвращает длительность ожидания применения изменений в настройках профилей безопасности // в кластере серверов. // -// Возвращаемое значение - Число - длительность ожидания применения изменений (в секундах). +// Возвращаемое значение: +// Число - длительность ожидания применения изменений (в секундах). // Функция ДлительностьОжиданияПримененияИзменений() @@ -595,16 +584,16 @@ // Планирует (с помощью подмены значения свойства формы ОписаниеОповещенияОЗакрытии) вызов мастера // для проверки завершения операции после закрытия формы, из которой мастер вызывался. // -// Параметры: -// ФормаВладелец - УправляемаяФорма или Неопределено - форма, после закрытия которой требуется выполнить -// проверку завершения операций, в рамках которых ранее применялись запросы разрешений на использование -// внешних ресурсов, -// ИдентификаторыЗапросов - Массив(УникальныйИдентификатор) - идентификаторы запросов разрешений на -// использование внешних ресурсов, которые были применены в рамках операции, завершение которой проверяется. -// // Результатом выполнения данной процедуры является вызов процедуры. -// ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца() после закрытия формы, для которой в псевдо-модальном -// режиме открывался мастер настройки разрешений на использование внешних ресурсов. +// ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца после закрытия формы, для которой +// открывался мастер настройки разрешений на использование внешних ресурсов. +// +// Параметры: +// ФормаВладелец - УправляемаяФорма, Неопределено - форма, после закрытия которой требуется выполнить +// проверку завершения операций, в рамках которых ранее применялись запросы разрешений на использование +// внешних ресурсов. +// ИдентификаторыЗапросов - Массив - идентификаторы (УникальныйИдентификатор) запросов разрешений на +// использование внешних ресурсов, которые были применены в рамках операции, завершение которой проверяется. // Процедура ЗапланироватьПроверкуПримененияРазрешенийПослеЗакрытияФормыВладельца(ВладелецФормы, ИдентификаторыЗапросов) diff --git a/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/Module.bsl b/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/Module.bsl new file mode 100644 index 000000000..066160ae5 --- /dev/null +++ b/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/Module.bsl @@ -0,0 +1,86 @@ + +#Область ПрограммныйИнтерфейс + +// Предназначена для внесения изменений в форму Обслуживание обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура ОбслуживаниеПриСозданииНаСервере(Форма) Экспорт + + + +КонецПроцедуры + +// Предназначена для внесения изменений в форму ОбщиеНастройки обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура ОбщиеНастройкиПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму Обслуживание обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура НастройкиПользователейИПравПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму ИнтернетПоддержкаИСервисы обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура ИнтернетПоддержкаИСервисыПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму Органайзер обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура ОрганайзерПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму СинхронизацияДанных обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура СинхронизацияДанныхПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму НастройкиРаботыСФайлами обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура НастройкиРаботыСФайламиПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +// Предназначена для внесения изменений в форму ПечатныеФормыОтчетыИОбработки обработки +// ПанельАдминистрированияБСП без снятия формы с поддержки. +// +// Параметры: +// Форма - УправляемаяФорма - для внесения изменений. +// +Процедура ПечатныеФормыОтчетыИОбработкиПриСозданииНаСервере(Форма) Экспорт + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/НастройкиПрограммыПереопределяемый.mdo b/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/НастройкиПрограммыПереопределяемый.mdo new file mode 100644 index 000000000..24c7c2f69 --- /dev/null +++ b/SSL/src/CommonModules/НастройкиПрограммыПереопределяемый/НастройкиПрограммыПереопределяемый.mdo @@ -0,0 +1,11 @@ + + + НастройкиПрограммыПереопределяемый + + ru + Настройки программы переопределяемый + + true + true + true + diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl index 47cef8a5f..e08274e26 100644 --- a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными". -// Процедуры и функции для выгрузки и загрузки данных в XML-схему. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область ИнициализацияОбмена @@ -11,10 +5,10 @@ // Используется в модуле менеджера обмена при заполнении таблицы правил конвертации объектов. // // Параметры: -// ПравилаКонвертации - таблица значений. +// ПравилаКонвертации - ТаблицаЗначений - таблица, содержащая правила конвертации объектов. // -// Возвращаемое значение -// Строка таблицы значений правил конвертации. +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Строка таблицы значений правил конвертации. // Функция ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации) Экспорт @@ -27,10 +21,10 @@ // Инициализирует компоненты обмена. // // Параметры: -// НаправлениеОбмена - строка ("Отправка" либо "Получение"). +// НаправлениеОбмена - строка - "Отправка" либо "Получение". // -// Возвращаемое значение -// Структура. Содержит компоненты обмена: правила обмена и параметры обмена. +// Возвращаемое значение: +// Структура - Содержит компоненты обмена: правила обмена и параметры обмена. // Функция ИнициализироватьКомпонентыОбмена(НаправлениеОбмена) Экспорт @@ -39,7 +33,8 @@ |XMLСхема, |МенеджерОбмена, |УзелКорреспондента, - |УзелКорреспондентаОбъект"); + |УзелКорреспондентаОбъект, + |ВерсияФорматаМенеджераОбмена"); КомпонентыОбмена.Вставить("НаправлениеОбмена", НаправлениеОбмена); КомпонентыОбмена.Вставить("ЭтоОбменЧерезПланОбмена", Истина); @@ -129,10 +124,17 @@ XMLСхема = КомпонентыОбмена.XMLСхема; МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена; + // Вычисление версии формата менеджера обмена - от этого зависит формирование правил. + Попытка + КомпонентыОбмена.Вставить("ВерсияФорматаМенеджераОбмена",МенеджерОбмена.ВерсияФорматаМенеджераОбмена()); + Исключение + КомпонентыОбмена.Вставить("ВерсияФорматаМенеджераОбмена", "1"); + КонецПопытки; + // Инициализация таблиц правил обмена. КомпонентыОбмена.Вставить("ПравилаОбработкиДанных", ТаблицаПравилОбработкиДанных(XMLСхема, МенеджерОбмена, НаправлениеОбмена)); КомпонентыОбмена.Вставить("ПравилаКонвертацииОбъектов", ТаблицаПравилКонвертации( - XMLСхема, МенеджерОбмена, НаправлениеОбмена, КомпонентыОбмена.ПравилаОбработкиДанных)); + XMLСхема, МенеджерОбмена, НаправлениеОбмена, КомпонентыОбмена.ПравилаОбработкиДанных, КомпонентыОбмена.ВерсияФорматаМенеджераОбмена)); КомпонентыОбмена.Вставить("ПравилаКонвертацииПредопределенныхДанных", ТаблицаПравилКонвертацииПредопределенныхДанных(XMLСхема, МенеджерОбмена, НаправлениеОбмена)); @@ -144,14 +146,14 @@ // Инициализирует таблицу значений для хранения правил конвертации свойств объекта. // // Возвращаемое значение: -// Таблица значений +// ТаблицаЗначений - таблица для хранения правил конвертации свойств. // Функция ИнициализироватьТаблицуСвойствДляПравилаКонвертации() Экспорт ТаблицаПКС = Новый ТаблицаЗначений; ТаблицаПКС.Колонки.Добавить("СвойствоКонфигурации", Новый ОписаниеТипов("Строка")); ТаблицаПКС.Колонки.Добавить("СвойствоФормата", Новый ОписаниеТипов("Строка")); - ТаблицаПКС.Колонки.Добавить("ПравилоКонвертацииСвойства", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(50))); + ТаблицаПКС.Колонки.Добавить("ПравилоКонвертацииСвойства", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(50))); ТаблицаПКС.Колонки.Добавить("ИспользуетсяАлгоритмКонвертации", Новый ОписаниеТипов("Булево")); ТаблицаПКС.Колонки.Добавить("ОбработкаКлючевогоСвойства", Новый ОписаниеТипов("Булево")); ТаблицаПКС.Колонки.Добавить("ОбработкаПоисковогоСвойства", Новый ОписаниеТипов("Булево")); @@ -161,6 +163,22 @@ КонецФункции +// Заполняет колонку со свойствами табличных частей пустой таблицей значений с определенными колонками. +// Используется в текущем модуле, а также в модуле менеджера обмена при заполнении таблицы правил конвертации объектов. +// +// Параметры: +// ПравилоКонвертации - СтрокаТаблицыЗначений - правило конвертации объектов. +// ИмяКолонки - Строка - имя заполняемой колонки таблицы правил конвертации. +Процедура ИнициализироватьСвойстваТабличныхЧастей(ПравилоКонвертации, ИмяКолонки = "СвойстваТабличныхЧастей") Экспорт + СвойстваТабличныхЧастей = Новый ТаблицаЗначений; + СвойстваТабличныхЧастей.Колонки.Добавить("ТЧКонфигурации", Новый ОписаниеТипов("Строка")); + СвойстваТабличныхЧастей.Колонки.Добавить("ТЧФормата", Новый ОписаниеТипов("Строка")); + СвойстваТабличныхЧастей.Колонки.Добавить("Свойства", Новый ОписаниеТипов("ТаблицаЗначений")); + СвойстваТабличныхЧастей.Колонки.Добавить("ИспользуетсяАлгоритмКонвертации", Новый ОписаниеТипов("Булево")); + + ПравилоКонвертации[ИмяКолонки] = СвойстваТабличныхЧастей; +КонецПроцедуры + #КонецОбласти #Область ВедениеПротокола @@ -168,7 +186,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ИмяФайлаПротоколаОбмена - Строка, содержит полное имя файла протокола. +// ИмяФайлаПротоколаОбмена - Строка - содержит полное имя файла протокола. // Процедура ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена) Экспорт @@ -215,13 +233,16 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// Код - Число. Код сообщения. -// СтруктураЗаписи - Структура. Структура записи протокола. -// ВзвестиФлагОшибок - Если истина, то - это сообщение об ошибке. Взводится ФлагОшибки. +// Код - Число - Код сообщения. +// СтруктураЗаписи - Структура - Структура записи протокола. +// ВзвестиФлагОшибок - Булево - Если истина, то - это сообщение об ошибке. Взводится ФлагОшибки. // Уровень - Число - отступ слева, количество табуляций. // Выравнивание - Число - отступ в тексте, для выравнивания текста выводимого в виде Ключ - Значение. // БезусловнаяЗаписьВПротоколОбмена - Булево - флаг безусловной записи информации в протокол. // +// Возвращаемое значение: +// Строка - текст ошибки, которая была записана в протокол. +// Функция ЗаписатьВПротоколВыполнения(КомпонентыОбмена, Код = "", СтруктураЗаписи=Неопределено, @@ -268,7 +289,8 @@ КонецЕсли; - КомпонентыОбмена.СтрокаСообщенияОбОшибке = Стр; + ЛитералПеревода = ?(ПустаяСтрока(КомпонентыОбмена.СтрокаСообщенияОбОшибке), "", Символы.ПС); + КомпонентыОбмена.СтрокаСообщенияОбОшибке = КомпонентыОбмена.СтрокаСообщенияОбОшибке + ЛитералПеревода + Стр; Если ВзвестиФлагОшибок Тогда @@ -311,12 +333,12 @@ КонецЕсли; - ПозицияСсылки = Найти(КомпонентыОбмена.СтрокаСообщенияОбОшибке, "e1cib/data/"); + ПозицияСсылки = СтрНайти(КомпонентыОбмена.СтрокаСообщенияОбОшибке, "e1cib/data/"); Если ПозицияСсылки > 0 Тогда - ПозицияУИД = Найти(КомпонентыОбмена.СтрокаСообщенияОбОшибке, "?ref="); + ПозицияУИД = СтрНайти(КомпонентыОбмена.СтрокаСообщенияОбОшибке, "?ref="); СтрокаСсылки = Сред(КомпонентыОбмена.СтрокаСообщенияОбОшибке, ПозицияСсылки, ПозицияУИД - ПозицияСсылки + 37); - ПерваяТочка = Найти(СтрокаСсылки, "e1cib/data/"); - ВтораяТочка = Найти(СтрокаСсылки, "?ref="); + ПерваяТочка = СтрНайти(СтрокаСсылки, "e1cib/data/"); + ВтораяТочка = СтрНайти(СтрокаСсылки, "?ref="); ПредставлениеТипа = Сред(СтрокаСсылки, ПерваяТочка + 11, ВтораяТочка - ПерваяТочка - 11); ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".ПустаяСсылка")); ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(СтрокаСсылки, ВтораяТочка + 5)); @@ -343,10 +365,10 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// Имя - Строка, имя правила. +// Имя - Строка - имя правила. // // Возвращаемое значение: -// Строка таблицы правил обмена, в которой содержится искомое правило. +// СтрокаТаблицыЗначений - Строка таблицы правил обмена, в которой содержится искомое правило. // Функция ПКОПоИмени(КомпонентыОбмена, Имя) Экспорт @@ -470,8 +492,8 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// Объект - Ссылка на объект информационной базы. -// ПравилоОбработки - Строка таблицы значений правил обработки данных, +// Объект - ЛюбаяСсылка - Ссылка на объект информационной базы. +// ПравилоОбработки - СтрокаТаблицыЗначений - Строка таблицы значений правил обработки данных, // соответствующая правилу обработки типа выгружаемого объекта. // Если ПравилоОбработки не задано, оно будет найдено по объекту метаданных выгружаемого объекта. // @@ -479,15 +501,17 @@ ЗаписьXML = КомпонентыОбмена.ФайлОбмена; Если ТипЗнч(Объект) <> Тип("Структура") Тогда - Попытка + + ОбъектМетаданныхТекущий = Объект.Метаданные(); + + Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданныхТекущий) Тогда ТекОбъект = Объект.Ссылка; - Исключение + Иначе ТекОбъект = Объект; - КонецПопытки; + КонецЕсли; КомпонентыОбмена.ВыгруженныеОбъекты.Добавить(ТекОбъект); - ОбъектМетаданныхТекущий = Объект.Метаданные(); Попытка ПравилоОбработки = ПОДПоОбъектуМетаданных(КомпонентыОбмена, ОбъектМетаданныхТекущий); Исключение @@ -527,11 +551,14 @@ Попытка Если Не ТекущееПКО.Значение Тогда // Если правил конвертации несколько, и некоторые из них не используются - - // необходимо выгрузить удаление объекта на случай если ранее он был выгружен по этим правилам. + // необходимо выгрузить удаление объекта на случай если ранее он был выгружен по этим правилам. Если НесколькоПКО Тогда - ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО"); - ВыгрузитьУдаление(КомпонентыОбмена, Объект.Ссылка, ПравилоКонвертации); + ЕстьКолонкаОчисткаДанных = КомпонентыОбмена.ПравилаОбработкиДанных.Колонки.Найти("ОчисткаДанных") <> Неопределено; + Если Не ЕстьКолонкаОчисткаДанных Или ПравилоОбработки.ОчисткаДанных Тогда + ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО"); + ВыгрузитьУдаление(КомпонентыОбмена, Объект.Ссылка, ПравилоКонвертации); + КонецЕсли; КонецЕсли; Продолжить; @@ -614,6 +641,9 @@ // Приемник - ОбъектXDTO - объект, в который будет помещен результат. // СсылкиИзОбъекта - Массив - содержит общий список выгруженных по ссылкам объектов. // ПроведеноЗаполнениеСвойств - Булево - параметр для определения заполненности общих составных свойств. +// +// Возвращаемое значение: +// ОбъектXDTO - результат преобразования. // Функция ОбъектXDTOИзДанныхXDTO( КомпонентыОбмена, @@ -682,7 +712,6 @@ Если ТипСвойства = "ОбщееСоставноеСвойство" Тогда ПроведеноЗаполнениеВложенныхСвойств = Ложь; - Если ТипЗнч(Источник) = Тип("Структура") И СвойствоНайдено Тогда ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств); @@ -690,7 +719,7 @@ ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Источник, Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств); КонецЕсли; - + Если Не ПроведеноЗаполнениеВложенныхСвойств Тогда Продолжить; КонецЕсли; @@ -825,10 +854,13 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// Источник - Ссылка на выгружаемый объект информационной базы. -// ПравилоКонвертации - Строка таблицы правил конвертации объектов, в соответствии с которой выполняется -// преобразование. -// СтекВыгрузки - массив, содержит ссылки на выгружаемые объекты с учетом вложенности. +// Источник - ЛюбаяСсылка - Ссылка на выгружаемый объект информационной базы. +// ПравилоКонвертации - СтрокаТаблицыЗначений - Строка таблицы правил конвертации объектов, +// в соответствии с которой выполняется преобразование. +// СтекВыгрузки - массив - ссылки на выгружаемые объекты с учетом вложенности. +// +// Возвращаемое значение: +// Структура - результат преобразования. // Функция ДанныеXDTOИзДанныхИБ(КомпонентыОбмена, Источник, Знач ПравилоКонвертации, СтекВыгрузки = Неопределено) Экспорт @@ -906,6 +938,36 @@ 1); КонецЦикла; + // Выполнение ПКС для ТЧ (прямая конвертация). + Если СтекВыгрузки.Количество() = 1 Тогда + Для Каждого ТЧИСвойства Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл + Если НЕ (ЗначениеЗаполнено(ТЧИСвойства.ТЧКонфигурации) И ЗначениеЗаполнено(ТЧИСвойства.ТЧФормата)) Тогда + Продолжить; + КонецЕсли; + // ТЧ пустая. + Если Источник[ТЧИСвойства.ТЧКонфигурации].Количество() = 0 Тогда + Продолжить; + КонецЕсли; + НоваяТЧПриемника = СоздатьТЧПриемникаПоПКС(ТЧИСвойства.Свойства); + Для Каждого СтрокаТЧКонфигурации Из Источник[ТЧИСвойства.ТЧКонфигурации] Цикл + СтрокаТЧПриемник = НоваяТЧПриемника.Добавить(); + Для Каждого ПКС Из ТЧИСвойства.Свойства Цикл + Если ПКС.ИспользуетсяАлгоритмКонвертации Тогда + Продолжить; + КонецЕсли; + ВыгрузитьСвойство( + КомпонентыОбмена, + СтрокаТЧКонфигурации, + СтрокаТЧПриемник, + ПКС, + СтекВыгрузки, + 1); + КонецЦикла; + КонецЦикла; + Приемник.Вставить(ТЧИСвойства.ТЧФормата, НоваяТЧПриемника); + КонецЦикла; + КонецЕсли; + // {Обработчик: ПриОтправкеДанных} Начало Если ПравилоКонвертации.ЕстьОбработчикПриОтправкеДанных Тогда @@ -934,7 +996,15 @@ Если СтекВыгрузки.Количество() = 1 И ПКС.ОбработкаКлючевогоСвойства Тогда Приемник.КлючевыеСвойства.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства); Иначе - Приемник.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства); + СвойствоФормата_Имя = СокрЛП(ПКС.СвойствоФормата); + ВложенныеСвойства = СтрРазделить(СвойствоФормата_Имя,".",Ложь); + // Указано полное имя свойства, входящего в группу общих свойств. + Если ВложенныеСвойства.Количество() > 1 Тогда + УказаноПолноеИмяСвойства = Истина; + ПолучитьЗначениеВложенныхСвойств(Приемник, ВложенныеСвойства, ЗначениеСвойства); + Иначе + Приемник.Свойство(СвойствоФормата_Имя, ЗначениеСвойства); + КонецЕсли; КонецЕсли; Если ЗначениеСвойства = Неопределено Тогда Продолжить; @@ -966,17 +1036,23 @@ Для Каждого ТЧИСвойства Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл - ПКСДляТЧ = ТЧИСвойства.Значение; - ИмяТЧПриемника = ТЧИСвойства.Ключ; + Если НЕ ТЧИСвойства.ИспользуетсяАлгоритмКонвертации Тогда + Продолжить; + КонецЕсли; + ПКСДляТЧ = ТЧИСвойства.Свойства; + ИмяТЧПриемника = ТЧИСвойства.ТЧФормата; ТЧПриемника = Неопределено; Если Не Приемник.Свойство(ИмяТЧПриемника, ТЧПриемника) Тогда Продолжить; КонецЕсли; + // Создаем новую ТЗ, в которой нет ограничений типа для колонок. + НоваяТЧПриемника = СоздатьТЧПриемникаПоПКС(ПКСДляТЧ); + // Убираем лишние колонки, которые могли добавить в приемнике. УдаляемыеКолонки = Новый Массив; Для Каждого Колонка Из ТЧПриемника.Колонки Цикл - Если ПКСДляТЧ.Найти(Колонка.Имя, "СвойствоФормата") = Неопределено Тогда + Если НоваяТЧПриемника.Колонки.Найти(Колонка.Имя) = Неопределено Тогда УдаляемыеКолонки.Добавить(Колонка); КонецЕсли; КонецЦикла; @@ -984,12 +1060,7 @@ ТЧПриемника.Колонки.Удалить(Колонка); КонецЦикла; - // Создаем новую ТЗ, в которой нет ограничений типа для колонок и копируем в нее данные. - НоваяТЧПриемника = Новый ТаблицаЗначений; - Для Каждого ПКС Из ПКСДляТЧ Цикл - ИмяКолонки = ПКС.СвойствоФормата; - НоваяТЧПриемника.Колонки.Добавить(ИмяКолонки); - КонецЦикла; + // Копируем данные в новую таблицу приемника. Для Каждого СтрокаТЧПриемника Из ТЧПриемника Цикл СтрокаНовойТЧПриемника = НоваяТЧПриемника.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаНовойТЧПриемника, СтрокаТЧПриемника); @@ -1000,6 +1071,10 @@ Для Каждого ПКС Из ПКСДляТЧ Цикл + Если НЕ ПКС.ИспользуетсяАлгоритмКонвертации Тогда + Продолжить; + КонецЕсли; + ВыгрузитьСвойство( КомпонентыОбмена, Источник, @@ -1033,11 +1108,12 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ДанныеИБ - Ссылка на выгружаемый объект информационной базы. -// ПолучательСвойства - Структура, в которой должно храниться значение выгруженного свойства. -// ПКС - Строка таблицы правил конвертации свойств, в соответствии с которой выполняется преобразование. -// СтекВыгрузки - Массив, содержит ссылки на выгружаемые объекты с учетом вложенности. -// ЭтапВыгрузки - Число +// ДанныеИБ - ЛюбаяСсылка - ссылка на выгружаемый объект информационной базы. +// ПолучательСвойства - Структура - Получатель данных типа Структура, в которой должно храниться значение выгруженного свойства. +// ПКС - СтрокаТаблицыЗначений - Строка таблицы правил конвертации свойств, в соответствии с которой +// выполняется преобразование. +// СтекВыгрузки - Массив - ссылки на выгружаемые объекты с учетом вложенности. +// ЭтапВыгрузки - Число - содержит информацию об этапе выгрузки // 1 - выгрузка до выполнения алгоритма ПриОтправкеДанных, // 2 - выгрузка после выполнения алгоритма ПриОтправкеДанных. // @@ -1047,27 +1123,81 @@ Возврат; КонецЕсли; + СвойствоФормата_Имя = СокрЛП(ПКС.СвойствоФормата); + ВложенныеСвойства = СтрРазделить(СвойствоФормата_Имя,".",Ложь); + // Указано полное имя свойства, входящего в группу общих свойств. + УказаноПолноеИмяСвойства = Ложь; + Если ВложенныеСвойства.Количество() > 1 Тогда + УказаноПолноеИмяСвойства = Истина; + СвойствоФормата_Имя = ВложенныеСвойства[ВложенныеСвойства.Количество()-1]; + КонецЕсли; + ЗначениеСвойства = Неопределено; Если ЭтапВыгрузки = 1 Тогда Если ЗначениеЗаполнено(ПКС.СвойствоКонфигурации) Тогда ЗначениеСвойства = ДанныеИБ[ПКС.СвойствоКонфигурации]; - ИначеЕсли Не ДанныеИБ.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства) Тогда - // Это ПКС из ПКО с источником-структурой и в источнике не нашлось нужного свойства. - Возврат; + ИначеЕсли ТипЗнч(ДанныеИБ) = Тип("Структура") Тогда + // Это ПКС из ПКО с источником-структурой + Если УказаноПолноеИмяСвойства Тогда + ПолучитьЗначениеВложенныхСвойств(ДанныеИБ, ВложенныеСвойства, ЗначениеСвойства); + Иначе + ДанныеИБ.Свойство(СвойствоФормата_Имя, ЗначениеСвойства); + КонецЕсли; + Если ЗначениеСвойства = Неопределено Тогда + Возврат; + КонецЕсли; КонецЕсли; Иначе Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда - - Если ПолучательСвойства.Владелец().Колонки.Найти(ПКС.СвойствоФормата) = Неопределено Тогда - Возврат; + КолонкиТЧ = ПолучательСвойства.Владелец().Колонки; + УровеньМаксимальный = ВложенныеСвойства.Количество() - 1; + Если УказаноПолноеИмяСвойства Тогда + Для Уровень = 0 По УровеньМаксимальный Цикл + ИмяКолонки = ВложенныеСвойства[Уровень]; + Если КолонкиТЧ.Найти(ИмяКолонки) = Неопределено Тогда + Продолжить; + КонецЕсли; + ЗначениеВКолонке = ПолучательСвойства[ИмяКолонки]; + Если Уровень = УровеньМаксимальный Тогда + ЗначениеСвойства = ЗначениеВКолонке; + ИначеЕсли ТипЗнч(ЗначениеВКолонке) = Тип("Структура") Тогда + // Значение вложенного свойства упаковано в структуру, которая может быть многоуровневой. + ИсточникВложенногоСвойства = ЗначениеВКолонке; + ЗначениеВложенногоСвойства = Неопределено; + Для УровеньПодчиненный = Уровень + 1 По УровеньМаксимальный Цикл + ИмяВложенногоСвойства = ВложенныеСвойства[УровеньПодчиненный]; + Если НЕ ИсточникВложенногоСвойства.Свойство(ИмяВложенногоСвойства, ЗначениеВложенногоСвойства) Тогда + Продолжить; + КонецЕсли; + Если УровеньПодчиненный = УровеньМаксимальный Тогда + ЗначениеСвойства = ЗначениеВложенногоСвойства; + ИначеЕсли ТипЗнч(ЗначениеВложенногоСвойства) = Тип("Структура") Тогда + ИсточникВложенногоСвойства = ЗначениеВложенногоСвойства; + ЗначениеВложенногоСвойства = Неопределено; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; Иначе - ЗначениеСвойства = ПолучательСвойства[ПКС.СвойствоФормата]; + Если КолонкиТЧ.Найти(СвойствоФормата_Имя) = Неопределено Тогда + Возврат; + Иначе + ЗначениеСвойства = ПолучательСвойства[СвойствоФормата_Имя]; + КонецЕсли; + КонецЕсли; + Иначе + Если УказаноПолноеИмяСвойства Тогда + ПолучитьЗначениеВложенныхСвойств(ДанныеИБ, ВложенныеСвойства, ЗначениеСвойства); + Иначе + ПолучательСвойства.Свойство(СвойствоФормата_Имя, ЗначениеСвойства); + КонецЕсли; + Если ЗначениеСвойства = Неопределено + И Не (СтекВыгрузки.Количество() = 1 И ПолучательСвойства.КлючевыеСвойства.Свойство(СвойствоФормата_Имя, ЗначениеСвойства)) Тогда + Возврат; КонецЕсли; - - ИначеЕсли Не ПолучательСвойства.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства) - И Не (СтекВыгрузки.Количество() = 1 И ПолучательСвойства.КлючевыеСвойства.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства)) Тогда - Возврат; КонецЕсли; КонецЕсли; @@ -1118,12 +1248,20 @@ Если Не ПолучательСвойства.Свойство("КлючевыеСвойства") Тогда ПолучательСвойства.Вставить("КлючевыеСвойства", Новый Структура); КонецЕсли; - ПолучательСвойства.КлючевыеСвойства.Вставить(ПКС.СвойствоФормата, ЗначениеСвойства); + ПолучательСвойства.КлючевыеСвойства.Вставить(СвойствоФормата_Имя, ЗначениеСвойства); Иначе Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда - ПолучательСвойства[ПКС.СвойствоФормата] = ЗначениеСвойства; + Если УказаноПолноеИмяСвойства Тогда + ПоместитьЗначениеВложенныхСвойств(ПолучательСвойства, ВложенныеСвойства, ЗначениеСвойства, Истина); + Иначе + ПолучательСвойства[СвойствоФормата_Имя] = ЗначениеСвойства; + КонецЕсли; Иначе - ПолучательСвойства.Вставить(ПКС.СвойствоФормата, ЗначениеСвойства); + Если УказаноПолноеИмяСвойства Тогда + ПоместитьЗначениеВложенныхСвойств(ПолучательСвойства, ВложенныеСвойства, ЗначениеСвойства, Ложь); + Иначе + ПолучательСвойства.Вставить(СвойствоФормата_Имя, ЗначениеСвойства); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -1443,6 +1581,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. +// ТаблицыДляЗагрузки - ТаблицаЗначений - Таблица, в которую следует загрузить данные (при интерактивном сопоставлении данных). // Процедура ПроизвестиЧтениеДанных(КомпонентыОбмена, ТаблицыДляЗагрузки = Неопределено) Экспорт @@ -1672,6 +1811,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. +// ПараметрыАнализа - Структура - параметры интерактивной загрузки данных. // Процедура ПроизвестиЧтениеДанныхВРежимеАнализа(КомпонентыОбмена, ПараметрыАнализа = Неопределено) Экспорт @@ -1804,7 +1944,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ИмяФайлаОбмена - строка. +// ИмяФайлаОбмена - строка - имя файла обмена. // Процедура ОткрытьФайлВыгрузки(КомпонентыОбмена, ИмяФайлаОбмена = "") Экспорт @@ -1894,7 +2034,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ИмяФайлаОбмена - строка. +// ИмяФайлаОбмена - строка - Имя файла обмена. // Процедура ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена) Экспорт @@ -1955,8 +2095,8 @@ ФорматОбмена = РазложитьФорматОбмена(Header.Format); КомпонентыОбмена.ВерсияФорматаОбмена = ФорматОбмена.Версия; - КомпонентыОбмена.МенеджерОбмена = МенеджерОбменаВерсииФормата(КомпонентыОбмена.УзелКорреспондента, - КомпонентыОбмена.ВерсияФорматаОбмена); + КомпонентыОбмена.МенеджерОбмена = МенеджерОбменаВерсииФормата(КомпонентыОбмена.ВерсияФорматаОбмена, + КомпонентыОбмена.УзелКорреспондента); Если ЭтоОбменЧерезПланОбмена Тогда @@ -2079,23 +2219,10 @@ КонецПроцедуры -Функция СообщениеОтНеобновленнойНастройки(ЧтениеXML) - Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента - И ЧтениеXML.ЛокальноеИмя = "ФайлОбмена" Тогда - Пока ЧтениеXML.ПрочитатьАтрибут() Цикл - Если ЧтениеXML.ЛокальноеИмя = "ВерсияФормата" - ИЛИ ЧтениеXML.ЛокальноеИмя = "ВерсияКонфигурацииИсточника" Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Возврат Ложь; -КонецФункции - // Выполняет преобразование объекта XDTO в структуру с данными. // // Параметры: -// ОбъектXDTO - Значение типа ОбъектXDTO, которое необходимо преобразовать. +// ОбъектXDTO - ОбъектXDTO - Значение, которое необходимо преобразовать. // // Возвращаемое значение: // Структура - Структура, имитирующая объект XDTO. @@ -2138,7 +2265,7 @@ // выполнения обмена (ПКО, ПКПД, ПОД и т.д.). // // Возвращаемое значение: -// Ссылка на объект информационной базы. +// СправочникСсылка, ДокументСсылка и т.п. - ссылка на объект информационной базы. // Функция СсылкаОбъектаПоУИДОбъектаXDTO(УИДОбъектаXDTO, ТипЗначенияОбъектаИБ, КомпонентыОбмена) Экспорт @@ -2162,24 +2289,37 @@ // Записывает объект в информационную базу. // // Параметры: -// Объект - Записываемый объект. +// КомпонентыОбмена - Структура - Содержит все необходимые данные, +// инициализированные при начале выполнения обмена (ПКО, ПКПД, ПОД и т.д.). +// Объект - Произвольный - СправочникОбъект, ДокументОбъект и др записываемый объект. // Тип - Строка - Тип объекта строкой. +// ЗаписатьОбъект - Булево - переменная принимает значение Ложь если запись объекта не была выполнена. +// ОтправкаНазад - Булево - служебный флаг для установки соответствующего параметра обмена данными объекта. +// УникальныйИдентификаторСтрокой - строка - уникальный идентификатор объекта в виде строки. // Процедура ЗаписатьОбъектВИБ(КомпонентыОбмена, Объект, Тип, ЗаписатьОбъект = Ложь, Знач ОтправкаНазад = Ложь, УникальныйИдентификаторСтрокой = "") Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) - И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Попытка изменения неразделенных данных (%1: %2) в разделенном режиме.'"); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, - Объект.Метаданные().ПолноеИмя(), Строка(Объект)); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя()); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; - КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями; - ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке,, Ложь); + Если Не ЭтоРазделенныйОбъектМетаданных Тогда - Возврат; + СтрокаСообщенияОбОшибке = НСтр("ru = 'Попытка изменение неразделенных данных (%1) в разделенном режиме.'"); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, Объект.Метаданные().ПолноеИмя()); + + КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями; + ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке,, Ложь); + + Возврат; + + КонецЕсли; КонецЕсли; @@ -2206,7 +2346,7 @@ ЗаписатьОбъект = Ложь; - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Объект = Объект; Если Тип <> Неопределено Тогда @@ -2267,13 +2407,13 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// Объект - ДокументОбъект (загруженный документ). -// РегистрироватьПроблемыВРезультатахОбмена - Булево. +// Объект - ДокументОбъект - Загруженный документ. +// РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. // Процедура ВыполнитьПроведениеДокументаПриЗагрузке( КомпонентыОбмена, Объект, - РегистрироватьПроблемыВРезультатахОбмена = Ложь) Экспорт + РегистрироватьПроблемыВРезультатахОбмена = Истина) Экспорт ОписаниеОшибки = ""; ДокументПроведенУспешно = Ложь; @@ -2330,9 +2470,11 @@ // Отменяет проведение объекта в информационной базе. // // Параметры: -// Объект - ДокументОбъект (документ для отмены проведения). -// Отправитель - Ссылка на узел плана обмена, который является отправителем данных. +// Объект - ДокументОбъект - Документ для отмены проведения. +// Отправитель - ПланОбменаСсылка - Ссылка на узел плана обмена, который является отправителем данных. // +// Возвращаемое значение: +// Булево - признак успешной отмены проведения. Функция ОтменитьПроведениеОбъектаВИБ(Объект, Отправитель) Экспорт РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьУстранениеПроблемы(Объект, @@ -2369,13 +2511,14 @@ // Процедура заполняет табличную часть объекта с учетом предыдущей версии табличной части (до загрузки данных). // // Параметры: -// ТабличнаяЧастьОбъектаПослеОбработки - Табличная часть, которая содержит измененные данные. -// ТабличнаяЧастьОбъектаДоОбработки - Таблица значений, содержимое табличной части объекта до загрузки данных. -// КлючевыеПоля - Колонки, по которым происходит поиск строк в табличной части (строка через +// ТабличнаяЧастьОбъектаПослеОбработки - ТабличнаяЧасть - Табличная часть, которая содержит измененные данные. +// ТабличнаяЧастьОбъектаДоОбработки - ТаблицаЗначений - Таблица значений, содержимое табличной части объекта до +// загрузки данных. +// КлючевыеПоля - Строка - Колонки, по которым происходит поиск строк в табличной части (строка через // запятую). -// КолонкиДляВключения - Другие колонки (кроме ключевых), значения которых должны измениться (строка +// КолонкиДляВключения - Строка - Другие колонки (кроме ключевых), значения которых должны измениться (строка // через запятую). -// КолонкиДляИсключения - Колонки, значения которых не должны измениться (строка через запятую). +// КолонкиДляИсключения - Строка - Колонки, значения которых не должны измениться (строка через запятую). // Процедура ЗаполнитьТабличнуюЧастьОбъектаНачальнымиДанными( ТабличнаяЧастьОбъектаПослеОбработки, @@ -2446,12 +2589,10 @@ // Таблица значений // Функция ПравилаРегистрацииОбъектов(УзелПланаОбмена) Экспорт - ПравилаРегистрацииОбъектов = ОбменДаннымиВызовСервера.ПараметрыСеансаПравилаРегистрацииОбъектов().Получить(); - Отбор = Новый Структура; - Отбор.Вставить("ИмяПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); - - ТаблицаПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(Отбор, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага"); + ПравилаРегистрацииОбъектов = ОбменДаннымиСобытия.ПравилаРегистрацииОбъектовПланаОбмена( + ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); + ТаблицаПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага"); ТаблицаПравилаРегистрацииОбъектов.Индексы.Добавить("ОбъектМетаданныхИмя"); Возврат ТаблицаПравилаРегистрацииОбъектов; @@ -2529,10 +2670,12 @@ // Возвращает менеджер обмена данными, соответствующий указанной версии формата обмена. // // Параметры: -// УзелИнформационнойБазы - ссылка на узел - корреспондент. // ВерсияФормата - Строка. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить менеджер обмена. +// Если обмен через формат осуществляется без использования плана обмена, +// УзелИнформационнойБазы не передается. // -Функция МенеджерОбменаВерсииФормата(Знач УзелИнформационнойБазы, Знач ВерсияФормата) Экспорт +Функция МенеджерОбменаВерсииФормата(Знач ВерсияФормата, Знач УзелИнформационнойБазы = Неопределено) Экспорт Результат = ВерсииФорматаОбмена(УзелИнформационнойБазы).Получить(ВерсияФормата); @@ -2582,50 +2725,6 @@ Возврат СокрЛП(Результат); КонецФункции -// Сравнить две строки версий. -// -// Параметры: -// СтрокаВерсии1 - Строка - номер версии в формате 0.0.0 либо 0.0. -// СтрокаВерсии2 - Строка - второй сравниваемый номер версии. -// -// Возвращаемое значение: -// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны. -// Меньше 0 если СтрокаВерсии1 < СтрокаВерсии2. -Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) - - Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0", СтрокаВерсии1); - Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0", СтрокаВерсии2); - Версия1 = СтрРазделить(Строка1, "."); - Если Версия1.Количество() < 2 ИЛИ Версия1.Количество() > 3 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1); - КонецЕсли; - Версия2 = СтрРазделить(Строка2, "."); - Если Версия2.Количество() < 2 ИЛИ Версия2.Количество() > 3 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2); - КонецЕсли; - - Результат = 0; - Если СокрЛП(СтрокаВерсии1) = СокрЛП(СтрокаВерсии2) Тогда - Возврат 0; - КонецЕсли; - - // В последнем разряде может быть beta - это минимальная версия, не совместимая ни с какой другой. - Если Версия1.Количество() = 3 И СокрЛП(Версия1[2]) = "beta" Тогда - Возврат -1; - ИначеЕсли Версия2.Количество() = 3 И СокрЛП(Версия2[2]) = "beta" Тогда - Возврат 1; - КонецЕсли; - // Значимыми при сравнении являются первые 2 разряда (всегда число). - Для Разряд = 0 По 1 Цикл - Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]); - Если Результат <> 0 Тогда - Возврат Результат; - КонецЕсли; - КонецЦикла; - Возврат Результат; - -КонецФункции - #КонецОбласти #Область Прочее @@ -2719,6 +2818,7 @@ #Область СлужебныеПроцедурыИФункции #Область ИнициализацияОбмена + Функция ТаблицаПравилОбработкиДанных(XMLСхема, МенеджерОбмена , НаправлениеОбмена) // Инициализация таблицы правил обработки данных. @@ -2766,36 +2866,49 @@ ПОД.ИмяТаблицыДляВыборки = ПОД.ОбъектВыборкиМетаданные.ПолноеИмя(); КонецЕсли; - КонецЦикла; + Если НаправлениеОбмена = "Отправка" Тогда + ПравилаОбработкиДанных.Индексы.Добавить("Имя"); + ПравилаОбработкиДанных.Индексы.Добавить("ОбъектВыборкиМетаданные"); + Иначе + ПравилаОбработкиДанных.Индексы.Добавить("ОбъектВыборкиФормат"); + ПравилаОбработкиДанных.Индексы.Добавить("ТипСсылкиXDTO"); + КонецЕсли; + Возврат ПравилаОбработкиДанных; КонецФункции -Функция ТаблицаПравилКонвертации(XMLСхема, МенеджерОбмена , НаправлениеОбмена, ПравилаОбработкиДанных) +Функция ТаблицаПравилКонвертации(XMLСхема, МенеджерОбмена , НаправлениеОбмена, ПравилаОбработкиДанных, ВерсияФорматаМенеджераОбмена) // Инициализация таблицы правил конвертации. ПравилаКонвертации = Новый ТаблицаЗначений; - ПравилаКонвертации.Колонки.Добавить("ИмяПКО", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(50))); + ПравилаКонвертации.Колонки.Добавить("ИмяПКО", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(50))); ПравилаКонвертации.Колонки.Добавить("ОбъектДанных"); ПравилаКонвертации.Колонки.Добавить("ОбъектФормата", Новый ОписаниеТипов("Строка")); - ПравилаКонвертации.Колонки.Добавить("ТипПолученныхДанныхСтрокой", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300))); - ПравилаКонвертации.Колонки.Добавить("ИмяТаблицыПолученныхДанных", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300))); - ПравилаКонвертации.Колонки.Добавить("ПредставлениеТипаПолученныхДанных", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300))); + ПравилаКонвертации.Колонки.Добавить("ТипПолученныхДанныхСтрокой", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300))); + ПравилаКонвертации.Колонки.Добавить("ИмяТаблицыПолученныхДанных", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300))); + ПравилаКонвертации.Колонки.Добавить("ПредставлениеТипаПолученныхДанных", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300))); ПравилаКонвертации.Колонки.Добавить("Свойства", Новый ОписаниеТипов("ТаблицаЗначений")); ПравилаКонвертации.Колонки.Добавить("ПоляПоиска", Новый ОписаниеТипов("Массив")); - ПравилаКонвертации.Колонки.Добавить("СвойстваТабличныхЧастей", Новый ОписаниеТипов("Структура")); - ПравилаКонвертации.Колонки.Добавить("ПоляПредставленияОбъекта", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300))); + ПравилаКонвертации.Колонки.Добавить("ПоляПредставленияОбъекта", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300))); ПравилаКонвертации.Колонки.Добавить("РеквизитыШапкиПолученныхДанных", Новый ОписаниеТипов("Массив")); ПравилаКонвертации.Колонки.Добавить("ПриОтправкеДанных", Новый ОписаниеТипов("Строка")); ПравилаКонвертации.Колонки.Добавить("ПриКонвертацииДанныхXDTO", Новый ОписаниеТипов("Строка")); ПравилаКонвертации.Колонки.Добавить("ПередЗаписьюПолученныхДанных", Новый ОписаниеТипов("Строка")); ПравилаКонвертации.Колонки.Добавить("ПослеЗагрузкиВсехДанных", Новый ОписаниеТипов("Строка")); - ПравилаКонвертации.Колонки.Добавить("РасширеннаяСсылка", Новый ОписаниеТипов("Булево")); ПравилаКонвертации.Колонки.Добавить("ПравилоДляГруппыСправочника", Новый ОписаниеТипов("Булево")); - ПравилаКонвертации.Колонки.Добавить("ВариантИдентификации", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(60))); + ПравилаКонвертации.Колонки.Добавить("ВариантИдентификации", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(60))); ПравилаКонвертации.Колонки.Добавить("РазрешитьСоздаватьОбъектИзСтруктуры", Неопределено); + Если ВерсияФорматаМенеджераОбмена = "1" Тогда + ОписаниеТиповСвойстваТЧ = Новый ОписаниеТипов("Структура"); + ПравилаКонвертации.Колонки.Добавить("СвойстваТабличныхЧастейОбработанные", Новый ОписаниеТипов("ТаблицаЗначений")); + Иначе + ОписаниеТиповСвойстваТЧ = Новый ОписаниеТипов("ТаблицаЗначений"); + КонецЕсли; + ПравилаКонвертации.Колонки.Добавить("СвойстваТабличныхЧастей", ОписаниеТиповСвойстваТЧ); + МенеджерОбмена.ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации); Если НаправлениеОбмена = "Получение" Тогда @@ -2831,25 +2944,25 @@ ПравилаКонвертации.Колонки.Добавить("МенеджерОбъекта"); ПравилаКонвертации.Колонки.Добавить("ПолноеИмя"); - ПравилаКонвертации.Колонки.Добавить("ЭтоДокумент"); - ПравилаКонвертации.Колонки.Добавить("ЭтоРегистр"); - ПравилаКонвертации.Колонки.Добавить("ЭтоСправочник"); - ПравилаКонвертации.Колонки.Добавить("ЭтоПеречисление"); - ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовХарактеристик"); - ПравилаКонвертации.Колонки.Добавить("ЭтоБизнесПроцесс"); - ПравилаКонвертации.Колонки.Добавить("ЭтоЗадача"); - ПравилаКонвертации.Колонки.Добавить("ЭтоПланСчетов"); - ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовРасчета"); - ПравилаКонвертации.Колонки.Добавить("ЭтоКонстанта"); + ПравилаКонвертации.Колонки.Добавить("ЭтоДокумент", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоРегистр", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоСправочник", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоПеречисление", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовХарактеристик", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоБизнесПроцесс", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоЗадача", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоПланСчетов", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовРасчета", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЭтоКонстанта", Новый ОписаниеТипов("Булево")); ПравилаКонвертации.Колонки.Добавить("ДокументМожетПроводиться", Новый ОписаниеТипов("Булево")); - ПравилаКонвертации.Колонки.Добавить("ЭтоСсылочныйТип"); + ПравилаКонвертации.Колонки.Добавить("ЭтоСсылочныйТип", Новый ОписаниеТипов("Булево")); - ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриОтправкеДанных", Новый ОписаниеТипов("Булево")); - ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриКонвертацииДанныхXDTO", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриОтправкеДанных", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриКонвертацииДанныхXDTO", Новый ОписаниеТипов("Булево")); ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПередЗаписьюПолученныхДанных", Новый ОписаниеТипов("Булево")); - ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПослеЗагрузкиВсехДанных", Новый ОписаниеТипов("Булево")); + ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПослеЗагрузкиВсехДанных", Новый ОписаниеТипов("Булево")); РазрешитьПроведениеДокумента = Метаданные.СвойстваОбъектов.Проведение.Разрешить; @@ -2899,7 +3012,7 @@ ПравилоКонвертации.ЕстьОбработчикПриКонвертацииДанныхXDTO = Не ПустаяСтрока(ПравилоКонвертации.ПриКонвертацииДанныхXDTO); ПравилоКонвертации.ЕстьОбработчикПередЗаписьюПолученныхДанных = Не ПустаяСтрока(ПравилоКонвертации.ПередЗаписьюПолученныхДанных); ПравилоКонвертации.ЕстьОбработчикПослеЗагрузкиВсехДанных = Не ПустаяСтрока(ПравилоКонвертации.ПослеЗагрузкиВсехДанных); - + Иначе ПравилоКонвертации.ЕстьОбработчикПриОтправкеДанных = Не ПустаяСтрока(ПравилоКонвертации.ПриОтправкеДанных); КонецЕсли; @@ -2909,36 +3022,26 @@ ПравилоКонвертации.ПолноеИмя = ПравилоКонвертации.ОбъектДанных.ПолноеИмя(); ПравилоКонвертации.МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПравилоКонвертации.ПолноеИмя); - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоРегистр = ОбщегоНазначения.ЭтоРегистр(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоДокумент = ОбщегоНазначения.ЭтоДокумент(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоСправочник = ОбщегоНазначения.ЭтоСправочник(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоПеречисление = ОбщегоНазначения.ЭтоПеречисление(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоПланВидовХарактеристик = ОбщегоНазначения.ЭтоПланВидовХарактеристик(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоБизнесПроцесс = ОбщегоНазначения.ЭтоБизнесПроцесс(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоЗадача = ОбщегоНазначения.ЭтоЗадача(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоПланСчетов = ОбщегоНазначения.ЭтоПланСчетов(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоПланВидовРасчета = ОбщегоНазначения.ЭтоПланВидовРасчета(ПравилоКонвертации.ОбъектДанных); + ПравилоКонвертации.ЭтоКонстанта = ОбщегоНазначения.ЭтоКонстанта(ПравилоКонвертации.ОбъектДанных); ПравилоКонвертации.ТипДанных = Тип(ИмяТипаДанныхПоОбъектуМетаданных(ПравилоКонвертации.ОбъектДанных)); - Иначе - ИмяБазовогоТипа = ""; - КонецЕсли; - - ПравилоКонвертации.ЭтоДокумент = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаДокументы()); - ПравилоКонвертации.ЭтоСправочник = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаСправочники()); - ПравилоКонвертации.ЭтоПеречисление = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПеречисления()); - ПравилоКонвертации.ЭтоПланВидовХарактеристик = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик()); - ПравилоКонвертации.ЭтоБизнесПроцесс = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаБизнесПроцессы()); - ПравилоКонвертации.ЭтоЗадача = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаЗадачи()); - ПравилоКонвертации.ЭтоПланСчетов = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыСчетов()); - ПравилоКонвертации.ЭтоПланВидовРасчета = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовРасчета()); - ПравилоКонвертации.ЭтоКонстанта = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаКонстанты()); - - Если ПравилоКонвертации.ОбъектДанных <> Неопределено Тогда - Если ПравилоКонвертации.ЭтоДокумент Тогда ПравилоКонвертации.ДокументМожетПроводиться = ПравилоКонвертации.ОбъектДанных.Проведение = РазрешитьПроведениеДокумента; КонецЕсли; - ПравилоКонвертации.ЭтоРегистр = ОбщегоНазначения.ЭтоРегистр(ПравилоКонвертации.ОбъектДанных); - - Иначе - ПравилоКонвертации.ЭтоРегистр = Ложь; КонецЕсли; + ПравилоКонвертации.ЭтоСсылочныйТип = ПравилоКонвертации.ЭтоДокумент Или ПравилоКонвертации.ЭтоСправочник Или ПравилоКонвертации.ЭтоПланВидовХарактеристик @@ -3004,29 +3107,56 @@ КонецЕсли; - Для Каждого ТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл - Для Каждого ПКС Из ТЧ.Значение Цикл - - ПКС.ИмяТЧ = ТЧ.Ключ; - + Если ВерсияФорматаМенеджераОбмена = "1" Тогда + ИнициализироватьСвойстваТабличныхЧастей(ПравилоКонвертации, "СвойстваТабличныхЧастейОбработанные"); + Для Каждого ТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл + СтрокаСвойстваТабличныхЧастей = ПравилоКонвертации.СвойстваТабличныхЧастейОбработанные.Добавить(); + СтрокаСвойстваТабличныхЧастей.ИспользуетсяАлгоритмКонвертации = Истина; + СтрокаСвойстваТабличныхЧастей.Свойства = ТЧ.Значение; + Если НаправлениеОбмена = "Получение" Тогда + СтрокаСвойстваТабличныхЧастей.ТЧКонфигурации = ТЧ.Ключ; + Иначе + СтрокаСвойстваТабличныхЧастей.ТЧФормата = ТЧ.Ключ; + КонецЕсли; КонецЦикла; - КонецЦикла; - + Иначе + // Заполнение информации о конвертации свойств табличных частей. + Для Каждого ПКСТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл + Для Каждого ПКС Из ПКСТЧ.Свойства Цикл + Если ПКС.ИспользуетсяАлгоритмКонвертации Тогда + ПКСТЧ.ИспользуетсяАлгоритмКонвертации = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЕсли; КонецЦикла; + Если ВерсияФорматаМенеджераОбмена = "1" Тогда + ПравилаКонвертации.Колонки.Удалить(ПравилаКонвертации.Колонки.СвойстваТабличныхЧастей); + ПравилаКонвертации.Колонки.Добавить("СвойстваТабличныхЧастей", Новый ОписаниеТипов("ТаблицаЗначений")); + Для Каждого ПравилоКонвертации Из ПравилаКонвертации Цикл + ИнициализироватьСвойстваТабличныхЧастей(ПравилоКонвертации); + Для Каждого СвойствоТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастейОбработанные Цикл + СтрокаСвойстваТабличныхЧастей = ПравилоКонвертации.СвойстваТабличныхЧастей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаСвойстваТабличныхЧастей, СвойствоТЧ); + Для Каждого ПКС Из СтрокаСвойстваТабличныхЧастей.Свойства Цикл + Если ПКС.ИспользуетсяАлгоритмКонвертации Тогда + СтрокаСвойстваТабличныхЧастей.ИспользуетсяАлгоритмКонвертации = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + ПравилаКонвертации.Колонки.Удалить(ПравилаКонвертации.Колонки.СвойстваТабличныхЧастейОбработанные); + КонецЕсли; + // Добавляем индексы таблицы правил конвертации. - Если НаправлениеОбмена = "Отправка" Тогда - - ПравилаКонвертации.Индексы.Добавить("ТипДанных"); - ПравилаКонвертации.Индексы.Добавить("ТипXDTO"); - ПравилаКонвертации.Индексы.Добавить("РасширеннаяСсылка"); - - Иначе - - ПравилаКонвертации.Индексы.Добавить("ТипXDTO"); + ПравилаКонвертации.Индексы.Добавить("ИмяПКО"); + ПравилаКонвертации.Индексы.Добавить("ТипДанных"); + ПравилаКонвертации.Индексы.Добавить("ТипXDTO"); + Если НаправлениеОбмена = "Получение" Тогда ПравилаКонвертации.Индексы.Добавить("ТипСсылкиXDTO"); - ПравилаКонвертации.Индексы.Добавить("ТипДанных"); - КонецЕсли; Возврат ПравилаКонвертации; @@ -3052,18 +3182,9 @@ КонецЦикла; - // Добавляем индексы таблицы правил конвертации. - Если НаправлениеОбмена = "Отправка" Тогда - - ПравилаКонвертации.Индексы.Добавить("ТипДанных"); - ПравилаКонвертации.Индексы.Добавить("ТипXDTO"); - - Иначе - - ПравилаКонвертации.Индексы.Добавить("ТипXDTO"); - ПравилаКонвертации.Индексы.Добавить("ТипДанных"); - - КонецЕсли; + ПравилаКонвертации.Индексы.Добавить("ИмяПКПД"); + ПравилаКонвертации.Индексы.Добавить("ТипДанных"); + ПравилаКонвертации.Индексы.Добавить("ТипДанных,ТипXDTO"); Возврат ПравилаКонвертации; @@ -3396,6 +3517,88 @@ Возврат Ложь; КонецФункции +Процедура ПолучитьЗначениеВложенныхСвойств(ИсточникСвойства, ВложенныеСвойства, ЗначениеСвойства) + ИмяКонечногоСвойства = ВложенныеСвойства[ВложенныеСвойства.Количество()-1]; + Если ИсточникСвойства.Свойство(ИмяКонечногоСвойства, ЗначениеСвойства) Тогда + Возврат; + КонецЕсли; + ТекущийИсточникСвойства = ИсточникСвойства; + ТекущееЗначениеСвойства = Неопределено; + Для Уровень = 0 По ВложенныеСвойства.Количество()-2 Цикл + Если НЕ ТекущийИсточникСвойства.Свойство(ВложенныеСвойства[Уровень], ТекущееЗначениеСвойства) Тогда + Прервать; + КонецЕсли; + Если Уровень = ВложенныеСвойства.Количество()-2 Тогда + ЗначениеСвойства = ТекущееЗначениеСвойства; + ИначеЕсли ТипЗнч(ТекущееЗначениеСвойства) <> Тип("Структура") Тогда + Прервать; + Иначе + ТекущийИсточникСвойства = ТекущееЗначениеСвойства; + ТекущееЗначениеСвойства = Неопределено; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Процедура ПоместитьЗначениеВложенныхСвойств(ПолучательСвойства, ВложенныеСвойства, ЗначениеСвойства, ЭтоСтрокаТЧ) + ИмяСвойства = ВложенныеСвойства[0]; + ЗначениеВложенныхСвойств = Неопределено; + Если ЭтоСтрокаТЧ Тогда + Если ПолучательСвойства.Владелец().Колонки.Найти(ИмяСвойства) = Неопределено Тогда + ПолучательСвойства.Владелец().Колонки.Добавить(ИмяСвойства); + Иначе + ЗначениеВложенныхСвойств = ПолучательСвойства[ИмяСвойства]; + КонецЕсли; + Иначе + Если НЕ ПолучательСвойства.Свойство(ИмяСвойства, ЗначениеВложенныхСвойств) Тогда + ПолучательСвойства.Вставить(ИмяСвойства); + КонецЕсли; + КонецЕсли; + Если ЗначениеВложенныхСвойств = Неопределено Тогда + ЗначениеВложенныхСвойств = Новый Структура; + КонецЕсли; + СтруктураВложенныхСвойств = ЗначениеВложенныхСвойств; + МаксимальныйУровень = ВложенныеСвойства.Количество() - 1; + Для Уровень = 1 По МаксимальныйУровень Цикл + ИмяВложенногоСвойства = ВложенныеСвойства[Уровень]; + Если Уровень = МаксимальныйУровень Тогда + СтруктураВложенныхСвойств.Вставить(ИмяВложенногоСвойства, ЗначениеСвойства); + Прервать; + КонецЕсли; + ПолучательВложенногоСвойства = Неопределено; + СтруктураВложенныхСвойств.Свойство(ИмяВложенногоСвойства, ПолучательВложенногоСвойства); + Если ПолучательВложенногоСвойства = Неопределено Тогда + ПолучательВложенногоСвойства = Новый Структура; + КонецЕсли; + ПолучательВложенногоСвойства.Вставить(ИмяВложенногоСвойства, Новый Структура); + СтруктураВложенныхСвойств = ПолучательВложенногоСвойства; + КонецЦикла; + ПолучательСвойства[ИмяСвойства] = ЗначениеВложенныхСвойств; +КонецПроцедуры + +Функция СоздатьТЧПриемникаПоПКС(ПКСДляТЧ) + + НоваяТЧПриемника = Новый ТаблицаЗначений; + Для Каждого ПКС Из ПКСДляТЧ Цикл + ИмяКолонки = СокрЛП(ПКС.СвойствоФормата); + // Возможно, это ПКС для вложенных свойств. + Если СтрНайти(ИмяКолонки, ".") > 0 Тогда + ВложенныеСвойства = СтрРазделить(ИмяКолонки,".",Ложь); + МаксимальныйИндекс = ВложенныеСвойства.Количество() - 1; + Для Индекс = 0 По МаксимальныйИндекс Цикл + ИмяВложенногоСвойства = ВложенныеСвойства[Индекс]; + Если НоваяТЧПриемника.Колонки.Найти(ИмяВложенногоСвойства) = Неопределено Тогда + НоваяТЧПриемника.Колонки.Добавить(ИмяВложенногоСвойства); + КонецЕсли; + КонецЦикла; + Иначе + НоваяТЧПриемника.Колонки.Добавить(ИмяКолонки); + КонецЕсли; + КонецЦикла; + + Возврат НоваяТЧПриемника; + +КонецФункции + #КонецОбласти #Область ПолучениеДанных @@ -3483,7 +3686,6 @@ КонецЕсли; ИначеЕсли СтрНайти(ЗначениеXDTO.Тип().Имя, "ОбщиеСвойства") > 0 Тогда - Если ТипЗнч(Приемник) = Тип("Структура") Тогда ПриемникГруппыСвойств = Новый Структура; Для Каждого ПодСвойство Из ЗначениеXDTO.Свойства() Цикл @@ -3627,25 +3829,74 @@ КонецЦикла; - Если СоставСвойств = "СвойстваПоиска" Или НомерЭтапа = 1 Тогда - // Табличные части конвертируются только после выполнения обработчика ПКО. + Если СоставСвойств = "СвойстваПоиска" Тогда Возврат; КонецЕсли; - + + // Конвертация табличных частей. Для Каждого ТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл - Если ПолученныеДанные.ДополнительныеСвойства.Свойство(ТЧ.Ключ) Тогда + Если НомерЭтапа = 1 И ЗначениеЗаполнено(ТЧ.ТЧКонфигурации) И ЗначениеЗаполнено(ТЧ.ТЧФормата) Тогда + + // Прямая конвертация табличных частей. + ТЧФормата = Неопределено; + Если НЕ ДанныеXDTO.Свойство(ТЧ.ТЧФормата, ТЧФормата) Тогда + Продолжить; + ИначеЕсли ТЧФормата.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + МассивКолонокТЧ = Новый Массив; + Для Каждого КолонкаТЧ Из ТЧФормата.Колонки Цикл + МассивКолонокТЧ.Добавить(КолонкаТЧ.Имя); + КонецЦикла; + + ИменаКолонокСтрокой = СтрСоединить(МассивКолонокТЧ, ","); + Для НомерСтроки = 1 По ТЧФормата.Количество() Цикл + + ДанныеСтрокиXDTO = ТЧФормата[НомерСтроки - 1]; + СтрокаТЧ = ПолученныеДанные[ТЧ.ТЧКонфигурации].Добавить(); + СтруктураДанныхСтрокиXDTO = Новый Структура(ИменаКолонокСтрокой); + ЗаполнитьЗначенияСвойств(СтруктураДанныхСтрокиXDTO, ДанныеСтрокиXDTO); + + Для Каждого ПКС Из ТЧ.Свойства Цикл + Если ПКС.ИспользуетсяАлгоритмКонвертации Тогда + Продолжить; + КонецЕсли; + КонвертацияСвойстваСтруктурыОбъектаXDTO( + КомпонентыОбмена, + СтруктураДанныхСтрокиXDTO, + ПолученныеДанные.ДополнительныеСвойства, + СтрокаТЧ, + ПКС, + НомерЭтапа); + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + + Если НомерЭтапа = 2 И ТЧ.ИспользуетсяАлгоритмКонвертации + И ПолученныеДанные.ДополнительныеСвойства.Свойство(ТЧ.ТЧКонфигурации) Тогда + МассивСтруктурСДаннымиСтрок = ПолученныеДанные.ДополнительныеСвойства[ТЧ.ТЧКонфигурации]; + КоличествоСтрокТЧКонфигурации = ПолученныеДанные[ТЧ.ТЧКонфигурации].Количество(); - МассивСтруктурСДаннымиСтрок = ПолученныеДанные.ДополнительныеСвойства[ТЧ.Ключ]; Для НомерСтроки = 1 По МассивСтруктурСДаннымиСтрок.Количество() Цикл СтруктураСДаннымиСтроки = МассивСтруктурСДаннымиСтрок[НомерСтроки - 1]; - Если НомерЭтапа = 2 Тогда - СтрокаТЧ = ПолученныеДанные[ТЧ.Ключ].Добавить(); + // Возможно, строка уже была добавлена при прямой конвертации + Если НомерСтроки <= КоличествоСтрокТЧКонфигурации Тогда + СтрокаТЧ = ПолученныеДанные[ТЧ.ТЧКонфигурации][НомерСтроки - 1]; + Иначе + СтрокаТЧ = ПолученныеДанные[ТЧ.ТЧКонфигурации].Добавить(); КонецЕсли; - Для Каждого ПКС Из ТЧ.Значение Цикл + Для Каждого ПКС Из ТЧ.Свойства Цикл + + Если НЕ ПКС.ИспользуетсяАлгоритмКонвертации Тогда + Продолжить; + КонецЕсли; КонвертацияСвойстваСтруктурыОбъектаXDTO( КомпонентыОбмена, @@ -3653,14 +3904,12 @@ ПолученныеДанные.ДополнительныеСвойства, СтрокаТЧ, ПКС, - НомерЭтапа); + НомерЭтапа, + ТЧ.ТЧКонфигурации); КонецЦикла; КонецЦикла; - - Иначе - Продолжить; КонецЕсли; КонецЦикла; @@ -3684,7 +3933,8 @@ ДополнительныеСвойства, ПриемникДанных, ПКС, - НомерЭтапа = 1) + НомерЭтапа = 1, + ИмяТЧ = "") // Обрабатывается ПКС где указано только свойство формата - оно используется только при выгрузке. Если СокрЛП(ПКС.СвойствоКонфигурации) = "" Тогда Возврат; @@ -3707,8 +3957,14 @@ ИсточникДанных = ДанныеXDTO; КонецЕсли; - Если ИсточникДанных.Свойство(ПКС.СвойствоФормата) Тогда - ЗначениеСвойства = ИсточникДанных[ПКС.СвойствоФормата]; + СвойствоФормата_Имя = СокрЛП(ПКС.СвойствоФормата); + ПозицияТочки = СтрНайти(СвойствоФормата_Имя, "."); + // Указано полное имя свойства, входящего в группу общих свойств. + Если ПозицияТочки > 0 Тогда + ВложенныеСвойства = СтрРазделить(СвойствоФормата_Имя,".",Ложь); + ПолучитьЗначениеВложенныхСвойств(ИсточникДанных, ВложенныеСвойства, ЗначениеСвойства); + Иначе + ИсточникДанных.Свойство(СвойствоФормата_Имя, ЗначениеСвойства); КонецЕсли; ИначеЕсли НомерЭтапа = 2 Тогда @@ -3721,8 +3977,8 @@ // и представляют из себя структуру, содержащую инструкцию для конвертации, либо значение XDTO. // Если приемником значения является строка табличной части, то значение свойства располагается // в ДополнительныеСвойства[ИмяТабличнойЧасти][ИндексСтроки]. - Если ЗначениеЗаполнено(ПКС.ИмяТЧ) Тогда - ИсточникДанных = ДополнительныеСвойства[ПКС.ИмяТЧ][ПриемникДанных.НомерСтроки - 1]; + Если ЗначениеЗаполнено(ИмяТЧ) Тогда + ИсточникДанных = ДополнительныеСвойства[ИмяТЧ][ПриемникДанных.НомерСтроки - 1]; Иначе ИсточникДанных = ДополнительныеСвойства; КонецЕсли; @@ -3875,9 +4131,9 @@ Если АнализироватьПубличныеИдентификаторы Тогда // Из поиска необходимо исключить уже сопоставленные ранее объекты. - ТекстСоединения = " ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПУБ - | ПО ПУБ.Ссылка = Таблица.Ссылка И ПУБ.УзелИнформационнойБазы = &УзелОбмена"; - УсловиеОтбора = УсловиеОтбора + Символы.ПС + " И ПУБ.Ссылка is null"; + ТекстСоединения = " ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПубличныеИдентификаторы + | ПО ПубличныеИдентификаторы.Ссылка = Таблица.Ссылка И ПубличныеИдентификаторы.УзелИнформационнойБазы = &УзелОбмена"; + УсловиеОтбора = УсловиеОтбора + Символы.ПС + " И ПубличныеИдентификаторы.Ссылка is null"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", ТекстСоединения + Символы.ПС + " ГДЕ"); Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена); КонецЕсли; @@ -3918,9 +4174,10 @@ ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные, ПоляКопии); КонецЕсли; - Для Каждого ТабличнаяЧасть Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл - ДанныеИБ[ТабличнаяЧасть.Ключ].Очистить(); - ДанныеИБ[ТабличнаяЧасть.Ключ].Загрузить(ПолученныеДанные[ТабличнаяЧасть.Ключ].Выгрузить()); + Для Каждого КонвертацииТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл + ИмяТЧ = КонвертацииТЧ.ТЧКонфигурации; + ДанныеИБ[ИмяТЧ].Очистить(); + ДанныеИБ[ИмяТЧ].Загрузить(ПолученныеДанные[ИмяТЧ].Выгрузить()); КонецЦикла; КонецПроцедуры @@ -3999,7 +4256,7 @@ Объект.ПометкаУдаления = Ложь; // фиксируем событие в ЖР - ЗП = ПолучитьСтруктуруЗаписиПротокола(80); + ЗП = ЗаписьПротоколаОбмена(80); ЗП.ТипОбъекта = ТипОбъекта; ЗП.Объект = Строка(Объект); @@ -4511,10 +4768,8 @@ Если Объект.ДополнительныеСвойства.Свойство("НайденЗапретЗагрузкиДанных") Тогда Возврат; КонецЕсли; - - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Объект.Метаданные()); - - Если ИмяБазовогоТипа = "Документы" Тогда + МетаданныеОбъекта = Объект.Метаданные(); + Если ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Тогда ОбменДаннымиСервер.УстановитьОбменДаннымиЗагрузка(Объект, Ложь); РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьУстранениеПроблемы(Объект, Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); @@ -4522,10 +4777,10 @@ ОбменДаннымиСервер.УстановитьОбменДаннымиЗагрузка(Объект); - // Дли иерархических объектов пометку удаления ставим только у конкретного объекта. - Если ИмяБазовогоТипа = "Справочники" - Или ИмяБазовогоТипа = "ПланыВидовХарактеристик" - Или ИмяБазовогоТипа = "ПланыСчетов" Тогда + // Для иерархических объектов пометку удаления ставим только у конкретного объекта. + Если ОбщегоНазначения.ЭтоСправочник(МетаданныеОбъекта) + Или ОбщегоНазначения.ЭтоПланВидовХарактеристик(МетаданныеОбъекта) + Или ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Тогда Объект.УстановитьПометкуУдаления(Истина, Ложь); Иначе Объект.УстановитьПометкуУдаления(Истина); @@ -4533,6 +4788,19 @@ КонецПроцедуры +Функция СообщениеОтНеобновленнойНастройки(ЧтениеXML) + Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента + И ЧтениеXML.ЛокальноеИмя = "ФайлОбмена" Тогда + Пока ЧтениеXML.ПрочитатьАтрибут() Цикл + Если ЧтениеXML.ЛокальноеИмя = "ВерсияФормата" + ИЛИ ЧтениеXML.ЛокальноеИмя = "ВерсияКонфигурацииИсточника" Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Возврат Ложь; +КонецФункции + // Снимает признак активности движений документа. // // Параметры: @@ -4892,7 +5160,7 @@ // Возвращаемое значение: // Объект типа структура // -Функция ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") +Функция ЗаписьПротоколаОбмена(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") СтруктураОшибки = Новый Структура(); СтруктураОшибки.Вставить("ТипОбъекта"); @@ -4949,9 +5217,12 @@ Функция ПредставлениеОбъектаДляПротокола(Объект) ТипОбъекта = ТипЗнч(Объект); + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта); ПредставлениеОбъекта = Строка(Объект); НавигационнаяСсылка = ""; - Если ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда + Если МетаданныеОбъекта <> Неопределено + И ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) + И ЗначениеЗаполнено(Объект.Ссылка) Тогда НавигационнаяСсылка = " (" + ПолучитьНавигационнуюСсылку(Объект) + ")"; Иначе Если ТипОбъекта = Тип("ОбъектXDTO") Тогда @@ -4991,10 +5262,6 @@ ПредставлениеОбъекта = Строка(Объект.Ссылка); НавигационнаяСсылка = " (" + ПолучитьНавигационнуюСсылку(Объект.Ссылка) + ")"; КонецЕсли; - ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда - Если ЗначениеЗаполнено(Объект.Ссылка) Тогда - НавигационнаяСсылка = " (" + ПолучитьНавигационнуюСсылку(Объект) + ")"; - КонецЕсли; КонецЕсли; КонецЕсли; @@ -5096,6 +5363,50 @@ КонецФункции +// Сравнить две строки версий. +// +// Параметры: +// СтрокаВерсии1 - Строка - номер версии в формате 0.0.0 либо 0.0. +// СтрокаВерсии2 - Строка - второй сравниваемый номер версии. +// +// Возвращаемое значение: +// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны. +// Меньше 0 если СтрокаВерсии1 < СтрокаВерсии2. +Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) + + Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0", СтрокаВерсии1); + Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0", СтрокаВерсии2); + Версия1 = СтрРазделить(Строка1, "."); + Если Версия1.Количество() < 2 ИЛИ Версия1.Количество() > 3 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1); + КонецЕсли; + Версия2 = СтрРазделить(Строка2, "."); + Если Версия2.Количество() < 2 ИЛИ Версия2.Количество() > 3 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2); + КонецЕсли; + + Результат = 0; + Если СокрЛП(СтрокаВерсии1) = СокрЛП(СтрокаВерсии2) Тогда + Возврат 0; + КонецЕсли; + + // В последнем разряде может быть beta - это минимальная версия, не совместимая ни с какой другой. + Если Версия1.Количество() = 3 И СокрЛП(Версия1[2]) = "beta" Тогда + Возврат -1; + ИначеЕсли Версия2.Количество() = 3 И СокрЛП(Версия2[2]) = "beta" Тогда + Возврат 1; + КонецЕсли; + // Значимыми при сравнении являются первые 2 разряда (всегда число). + Для Разряд = 0 По 1 Цикл + Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]); + Если Результат <> 0 Тогда + Возврат Результат; + КонецЕсли; + КонецЦикла; + Возврат Результат; + +КонецФункции + #КонецОбласти #Область Прочее @@ -5201,10 +5512,10 @@ |ИЗ | #ПолноеИмя#.Изменения КАК ТаблицаИзменений |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК РПИ - |ПО РПИ.УзелИнформационнойБазы = &Узел И РПИ.Ссылка = ТаблицаИзменений.Ссылка + | РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПубличныеИдентификаторы + |ПО ПубличныеИдентификаторы.УзелИнформационнойБазы = &Узел И ПубличныеИдентификаторы.Ссылка = ТаблицаИзменений.Ссылка |ГДЕ ТаблицаИзменений.Узел = &Узел И ТаблицаИзменений.НомерСообщения <= &НомерСообщения - | И РПИ.Идентификатор ЕСТЬ NULL"; + | И ПубличныеИдентификаторы.Идентификатор ЕСТЬ NULL"; Для Каждого ЭлементСостава Из СоставПланаОбмена Цикл Если НЕ ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ЭлементСостава.Метаданные) Тогда Продолжить; @@ -5239,5 +5550,4 @@ #КонецОбласти -#КонецОбласти - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl index 2e99c7a8e..7145a3ac5 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// Модуль предназначен для работы с внешним соединением. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает данные списка объектов заданного объекта метаданных в виде системного представления. diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl index 5decd88a9..6f82ca1f1 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl @@ -9,13 +9,10 @@ // В качестве устанавливаемого значения используется текущая дата компьютера (сервера). // В момент изменения значения этой константы повторно-используемые значения // для подсистемы обмена данными становятся неактуальными и требуют повторной инициализации. -// -// Параметры: -// Нет. // Процедура СброситьКэшМеханизмаРегистрацииОбъектов() Экспорт - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда УстановитьПривилегированныйРежим(Истина); // Записываем дату и время компьютера сервера - ТекущаяДата() @@ -78,6 +75,56 @@ #Область СлужебныеПроцедурыИФункции +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + // Инициализация параметров сеанса должна выполняться без обращения к параметрам работы программы. + + Если ИмяПараметра = "РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском" Тогда + ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском = Новый ФиксированнаяСтруктура(Новый Структура); + УстановленныеПараметры.Добавить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском"); + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + // Процедура обновления повторно-используемых значений и параметров сеанса. + ОбновитьКэшМеханизмаРегистрацииОбъектов(); + + // Зарегистрируем имена параметров, которые установлены при. + // Выполнении ОбменДаннымиВызовСервера.ОбновитьКэшМеханизмаРегистрацииОбъектов. + УстановленныеПараметры.Добавить("ПравилаВыборочнойРегистрацииОбъектов"); + УстановленныеПараметры.Добавить("ПравилаРегистрацииОбъектов"); + УстановленныеПараметры.Добавить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + + ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); + УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); + + ПараметрыСеанса.ПриоритетныеДанныеОбмена = Новый ФиксированныйМассив(Новый Массив); + УстановленныеПараметры.Добавить("ПриоритетныеДанныеОбмена"); + + ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); + УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); + + СтруктураПроверки =Новый Структура; + СтруктураПроверки.Вставить("ПроверятьРасхождениеВерсий", Ложь); + СтруктураПроверки.Вставить("ЕстьОшибка", Ложь); + СтруктураПроверки.Вставить("ТекстОшибки", ""); + + ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных = Новый ФиксированнаяСтруктура(СтруктураПроверки); + УстановленныеПараметры.Добавить("ОшибкаРасхожденияВерсийПриПолученииДанных"); + + Иначе + + ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); + УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); + + ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); + УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); + КонецЕсли; + +КонецПроцедуры + // Выполняет процесс обмена данными отдельно для каждой строки настройки обмена. // Процесс обмена данными состоит из двух стадий: // - инициализация обмена - подготовка подсистемы обмена данными к процессу обмена @@ -116,7 +163,7 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда АктуальнаяДата = ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); @@ -182,7 +229,7 @@ СтруктураНастроекОбмена.Вставить("РезультатВыполненияОбмена", Перечисления.РезультатыВыполненияОбмена.Выполнено); СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене", ДействиеПриОбмене); СтруктураНастроекОбмена.Вставить("КоличествоОбъектовОбработано", 0); - СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); СтруктураНастроекОбмена.Вставить("ДатаНачала", ДатаНачала); СтруктураНастроекОбмена.Вставить("ДатаОкончания", ТекущаяДатаСеанса()); СтруктураНастроекОбмена.Вставить("ЭтоОбменВРИБ", ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)); @@ -270,11 +317,11 @@ // Возвращает ключ сообщения журнала регистрации по строке действия. // -Функция ПолучитьКлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой) Экспорт +Функция КлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой) Экспорт УстановитьПривилегированныйРежим(Истина); - Возврат ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене[ДействиеПриОбменеСтрокой]); + Возврат ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене[ДействиеПриОбменеСтрокой]); КонецФункции @@ -293,7 +340,7 @@ СостоянияОбменовДанными = ОбменДаннымиСервер.СостоянияОбменовДанными(УзелИнформационнойБазы, ДействиеПриОбмене); Отбор = Новый Структура; - Отбор.Вставить("СобытиеЖурналаРегистрации", ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + Отбор.Вставить("СобытиеЖурналаРегистрации", ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); Отбор.Вставить("ДатаНачала", СостоянияОбменовДанными.ДатаНачала); Отбор.Вставить("ДатаОкончания", СостоянияОбменовДанными.ДатаОкончания); @@ -455,7 +502,7 @@ УстановитьПривилегированныйРежим(Истина); Если ОбменДаннымиПовтИсп.ИспользуемыеПланыОбмена().Количество() > 0 - И (НЕ БезопасныйРежим() ИЛИ Пользователи.ЭтоПолноправныйПользователь()) Тогда + И (БезопасныйРежим() = ЛОЖЬ ИЛИ Пользователи.ЭтоПолноправныйПользователь()) Тогда НаборЗаписейКонфликта = РегистрыСведений.РезультатыОбменаДанными.СоздатьНаборЗаписей(); НаборЗаписейКонфликта.Отбор.ПроблемныйОбъект.Установить(Источник); @@ -501,61 +548,6 @@ //////////////////////////////////////////////////////////////////////////////// // Обмен данными под полными правами. -// Устанавливает параметры сеанса подсистемы обмена данными. -// -// Параметры: -// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить. -// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса. -// -Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт - - // Инициализация параметров сеанса должна выполняться без обращения к параметрам работы программы. - - Если ИмяПараметра = "РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском" Тогда - ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском = Новый ФиксированнаяСтруктура(Новый Структура); - УстановленныеПараметры.Добавить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском"); - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - // Процедура обновления повторно-используемых значений и параметров сеанса. - ОбновитьКэшМеханизмаРегистрацииОбъектов(); - - // Зарегистрируем имена параметров, которые установлены при. - // Выполнении ОбменДаннымиВызовСервера.ОбновитьКэшМеханизмаРегистрацииОбъектов. - УстановленныеПараметры.Добавить("ПравилаВыборочнойРегистрацииОбъектов"); - УстановленныеПараметры.Добавить("ПравилаРегистрацииОбъектов"); - УстановленныеПараметры.Добавить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО"); - - ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); - УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); - - ПараметрыСеанса.ПриоритетныеДанныеОбмена = Новый ФиксированныйМассив(Новый Массив); - УстановленныеПараметры.Добавить("ПриоритетныеДанныеОбмена"); - - ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); - УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); - - СтруктураПроверки =Новый Структура; - СтруктураПроверки.Вставить("ПроверятьРасхождениеВерсий", Ложь); - СтруктураПроверки.Вставить("ЕстьОшибка", Ложь); - СтруктураПроверки.Вставить("ТекстОшибки", ""); - - ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных = Новый ФиксированнаяСтруктура(СтруктураПроверки); - УстановленныеПараметры.Добавить("ОшибкаРасхожденияВерсийПриПолученииДанных"); - - Иначе - - ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); - УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); - - ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); - УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); - КонецЕсли; - -КонецПроцедуры - // Проверяет режим запуска, устанавливает привилегированный режим и выполняет обработчик. // Процедура ВыполнитьОбработчикВПривилегированномРежиме(Значение, Знач СтрокаОбработчика) Экспорт @@ -564,7 +556,7 @@ ВызватьИсключение НСтр("ru = 'Метод не поддерживается в режиме управляемого приложения.'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение НСтр("ru = 'Метод не поддерживается при работе в модели сервиса.'"); КонецЕсли; @@ -590,8 +582,9 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - - Возврат РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(УникальныйНомерЗадания)); + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(УникальныйНомерЗадания); + + Возврат Задание; КонецФункции // Возвращает структуру со значениями свойств объекта, полученных запросом из ИБ. @@ -603,19 +596,19 @@ // Возвращаемое значение: // Структура - структура со значениями свойств объекта. // -Функция ПолучитьЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, Знач СвойстваОбъектаСтрокой, Знач ОбъектМетаданныхИмя) Экспорт +Функция ЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, Знач СвойстваОбъектаСтрокой, Знач ОбъектМетаданныхИмя) Экспорт Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Тогда ВызватьИсключение НСтр("ru = 'Метод не поддерживается в режиме управляемого приложения.'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение НСтр("ru = 'Метод не поддерживается при работе в модели сервиса.'"); КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Возврат ОбменДаннымиСобытия.ПолучитьЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, СвойстваОбъектаСтрокой, ОбъектМетаданныхИмя); + Возврат ОбменДаннымиСобытия.ЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, СвойстваОбъектаСтрокой, ОбъектМетаданныхИмя); КонецФункции // Возвращает массив узлов плана обмена по заданным параметрам запроса и тексту запроса к таблице плана обмена. @@ -856,7 +849,8 @@ // Функция ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Знач УзелИнформационнойБазы) Экспорт - Запрос = РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(УзелИнформационнойБазы); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Запрос = МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(УзелИнформационнойБазы); Возврат ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Запрос); КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиГлобальный/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиГлобальный/Module.bsl index 9dc9bc6a2..cc2f1067a 100644 --- a/SSL/src/CommonModules/ОбменДаннымиГлобальный/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиГлобальный/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполняет проверку необходимости обновления конфигурации базы данных в подчиненном узле. // Процедура ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзла() Экспорт - ТребуетсяОбновление = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ТребуетсяОбновлениеКонфигурацииУзлаРИБ; + ТребуетсяОбновление = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ТребуетсяОбновлениеКонфигурацииУзлаРИБ; ПроверитьНеобходимостьОбновления(ТребуетсяОбновление); КонецПроцедуры @@ -18,7 +13,7 @@ // Процедура ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзлаПриЗапуске() Экспорт - ТребуетсяОбновление = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ТребуетсяОбновлениеКонфигурацииУзлаРИБ; + ТребуетсяОбновление = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ТребуетсяОбновлениеКонфигурацииУзлаРИБ; ПроверитьНеобходимостьОбновления(ТребуетсяОбновление); КонецПроцедуры @@ -28,7 +23,7 @@ Если ТребуетсяОбновлениеКонфигурацииУзлаРИБ Тогда Пояснение = НСтр("ru = 'Получено обновление программы из ""%1"". |Необходимо установить обновление программы, после чего синхронизация данных будет продолжена.'"); - Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Пояснение, СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ГлавныйУзел); + Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Пояснение, СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ГлавныйУзел); ПоказатьОповещениеПользователя(НСтр("ru = 'Установить обновление'"), "e1cib/app/Обработка.ВыполнениеОбменаДанными", Пояснение, БиблиотекаКартинок.Предупреждение32); Оповестить("ВыполненОбменДанными"); diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl index 8df6e0212..2617e1dfa 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -8,7 +8,7 @@ // Процедура-обработчик закрытия формы настройки узлов плана обмена. // // Параметры: -// Форма - управляемая форма, из которой вызвана процедура. +// Форма - УправляемаяФорма - форма, из которой вызвана процедура. // Процедура ФормаНастройкиУзловКомандаЗакрытьФорму(Форма) Экспорт @@ -25,7 +25,7 @@ // Процедура-обработчик закрытия формы настройки узла плана обмена. // // Параметры: -// Форма - управляемая форма, из которой вызвана процедура. +// Форма - УправляемаяФорма - форма, из которой вызвана процедура. // Процедура ФормаНастройкиУзлаКомандаЗакрытьФорму(Форма) Экспорт @@ -36,7 +36,7 @@ // Процедура-обработчик закрытия формы настройки значений по умолчанию узла плана обмена. // // Параметры: -// Форма - управляемая форма, из которой вызвана процедура. +// Форма - УправляемаяФорма - форма, из которой вызвана процедура. // Процедура ФормаНастройкиЗначенийПоУмолчаниюКомандаЗакрытьФорму(Форма) Экспорт @@ -216,7 +216,7 @@ // // Параметры: // Элемент - УправляемаяФорма, ТаблицаФормы - Элемент для обработки выбора. -// ВыбранноеЗначение - см. описание параметра ВыбранноеЗначение события ОбработкаВыбора. +// ВыбранноеЗначение - Произвольный - см. описание параметра ВыбранноеЗначение события ОбработкаВыбора. // ДанныеФормыКоллекция - ДанныеФормыКоллекция - Для режима подбора из списка. // Процедура ОбработчикВыбораЭлементовБазыКорреспондентаОбработкаВыбора(Знач Элемент, Знач ВыбранноеЗначение, Знач ДанныеФормыКоллекция=Неопределено) Экспорт @@ -259,8 +259,11 @@ // Проверяет установку флага "Использовать" для всех строк таблицы. // -// Таблица - ТаблицаЗначений - проверяемая таблица. +// Параметры: +// Таблица - ТаблицаЗначений - проверяемая таблица. // +// Возвращаемое значение: +// Булево - признак использования всех элементов. Функция ВТаблицеОтмеченыВсеЭлементы(Таблица) Экспорт Для Каждого Элемент Из Таблица Цикл @@ -276,6 +279,35 @@ Возврат Истина; КонецФункции +// Выполняет удаление настройки синхронизации данных. +// +// Параметры: +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, соответствующий отключаемому обмену. +// +Процедура УдалитьНастройкуСинхронизации(Знач УзелИнформационнойБазы) Экспорт + + Если ОбменДаннымиВызовСервера.УзелЯвляетсяГлавным(УзелИнформационнойБазы) Тогда + ТекстПредупреждения = НСтр("ru = 'Отключение информационной базы от главного узла можно выполнить + |с помощью параметра запуска конфигуратора /ResetMasterNode.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Иначе + + ТекстВопроса = НСтр("ru = 'Удалить настройку синхронизации данных?'"); + + // В режиме сервиса с помощью этой процедуры выполняется удаление настройки обмена с локальной версией. + // В этом случае вместо "Удалить настройку" используем оборот "Отключить синхронизацию". + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыРаботыКлиента.РазделениеВключено Тогда + ТекстВопроса = НСтр("ru = 'Отключить синхронизацию с %1?'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Строка(УзелИнформационнойБазы)); + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, УзелИнформационнойБазы); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -304,17 +336,17 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. +// Обработчики событий подсистем конфигурации. -// Процедура-обработчик запуска клиентского сеанса приложения. -// Если выполняется запуск ИБ для подчиненного узла РИБ, -// с необходимостью повтора загрузки сообщения обмена, тогда -// пользователю предлагается принять решение о повторной загрузке -// или продолжении без загрузки. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Если выполняется запуск ИБ для подчиненного узла РИБ, + // с необходимостью повтора загрузки сообщения обмена, тогда + // пользователю предлагается принять решение о повторной загрузке + // или продолжении без загрузки. + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") Тогда Возврат; @@ -325,13 +357,10 @@ КонецПроцедуры -// Процедура-обработчик запуска клиентского сеанса приложения. -// Если выполняется первый запуск ИБ для подчиненного узла РИБ, -// то открывается форма помощника создания обмена данными. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиента.Свойство("ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла") Тогда Для Каждого Окно Из ПолучитьОкна() Цикл @@ -347,9 +376,10 @@ КонецПроцедуры +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных ИЛИ ПараметрыРаботыКлиента.РазделениеВключено Тогда Возврат; КонецЕсли; @@ -482,7 +512,7 @@ // Только для внутреннего использования. // -Процедура ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском(Параметры, Контекст) Экспорт Форма = ОткрытьФорму( "РегистрСведений.НастройкиТранспортаОбмена.Форма.ПовторнаяСинхронизацияДанныхПередЗапуском", , , , , , @@ -589,6 +619,7 @@ // Обработчик немодального завершения диалога выбора каталога. // Процедура ОбработчикВыбораФайловогоКаталогаЗавершение(Знач Результат, Знач ДополнительныеПараметры) Экспорт + Если Результат <> Истина Тогда Возврат; КонецЕсли; @@ -600,13 +631,28 @@ ЗаполнитьЗначенияСвойств(Диалог, ДополнительныеПараметры.ПараметрыДиалога); Диалог.Каталог = Объект[ИмяСвойства]; - Если Диалог.Выбрать() Тогда - Объект[ИмяСвойства] = Диалог.Каталог; + ОписаниеОповещенияДиалогаВыбора = Новый ОписаниеОповещения( + "ОбработчикВыбораФайловогоКаталогаЗавершениеПослеВыбораВДиалоге", + ЭтотОбъект, ДополнительныеПараметры); + Диалог.Показать(ОписаниеОповещенияДиалогаВыбора); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +// +Процедура ОбработчикВыбораФайловогоКаталогаЗавершениеПослеВыбораВДиалоге(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт + + Если ВыбранныеФайлы <> Неопределено Тогда + + ИмяСвойства = ДополнительныеПараметры.ИмяСвойства; + Объект = ДополнительныеПараметры.Объект; + + Объект[ИмяСвойства] = ВыбранныеФайлы[0]; Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда - Результат = ?(Диалог.МножественныйВыбор, Диалог.ВыбранныеФайлы, Диалог.Каталог); - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, ВыбранныеФайлы[0]); КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -899,7 +945,7 @@ Результат = Новый Структура("Имя, Хранение, ОписаниеОшибки"); ДополнительныеПараметры.Вставить("Результат", Результат); - Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры); Если Не Подключено Тогда // У нас нет расширения, используем диалог выбора из НачатьПомещениеФайла. @@ -924,22 +970,9 @@ КонецПроцедуры -// Продолжение процедуры (см. выше). -// -Процедура ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалоге(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт - - Если ВыбранныеФайлы <> Неопределено - И ВыбранныеФайлы.Количество() = 1 Тогда - - Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры); - НачатьПомещениеФайла(Оповещение, , ВыбранныеФайлы[0], Ложь, ДополнительныеПараметры.ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - // Обработчик немодального завершения выбора и передачи файлов на сервер. // -Процедура ВыбратьИПередатьФайлыНаСерверЗавершение(Знач Успешно, Знач Адрес, Знач ВыбранноеИмяФайла, Знач ДополнительныеПараметры) Экспорт +Процедура ВыбратьИПередатьФайлНаСерверЗавершение(Знач Успешно, Знач Адрес, Знач ВыбранноеИмяФайла, Знач ДополнительныеПараметры) Экспорт Если Не Успешно Тогда Возврат; КонецЕсли; @@ -952,6 +985,42 @@ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); КонецПроцедуры +// Продолжение процедуры (см. выше). +// +Процедура ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалоге(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт + + Если ВыбранныеФайлы <> Неопределено + И ВыбранныеФайлы.Количество() = 1 Тогда + + Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалогеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + СписокДляПередачи = Новый Массив; + СписокДляПередачи.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбранныеФайлы[0])); + + НачатьПомещениеФайлов( + Оповещение, + СписокДляПередачи,, + Ложь, + ДополнительныеПараметры.ИдентификаторФормы); + + КонецЕсли; + +КонецПроцедуры + +// Обработчик немодального завершения выбора и передачи файлов на сервер. +// +Процедура ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалогеЗавершение(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт + + Для Индекс = 0 По ПомещенныеФайлы.ВГраница() Цикл + Результат = ДополнительныеПараметры.Результат; + Результат.Имя = ПомещенныеФайлы[Индекс].Имя; + Результат.Хранение = ПомещенныеФайлы[Индекс].Хранение; + КонецЦикла; + + // Оповещаем исходного вызывающего. + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); + +КонецПроцедуры + // Запускает получение файла с сервера интерактивно, без расширения для работы с файлами. // // Параметры: @@ -1107,7 +1176,7 @@ // Процедура ПерейтиВЖурналРегистрацииСобытийДанных(УзелИнформационнойБазы, ПараметрыВыполненияКоманды, ДействиеПриОбменеСтрокой) Экспорт - СобытиеЖурналаРегистрации = ОбменДаннымиВызовСервера.ПолучитьКлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой); + СобытиеЖурналаРегистрации = ОбменДаннымиВызовСервера.КлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрации); @@ -1216,22 +1285,6 @@ ОткрытьФорму("Обработка.РегистрацияИзмененийДляОбменаДанными.Форма", ПараметрыФормы,, УзелИнформационнойБазы); КонецПроцедуры -// Выполняет удаление настройки синхронизации данных. -// -Процедура УдалитьНастройкуСинхронизации(Знач УзелИнформационнойБазы) Экспорт - - Если ОбменДаннымиВызовСервера.УзелЯвляетсяГлавным(УзелИнформационнойБазы) Тогда - ТекстПредупреждения = НСтр("ru = 'Отключение информационной базы от главного узла можно выполнить - |с помощью параметра запуска конфигуратора /ResetMasterNode.'"); - ПоказатьПредупреждение(, ТекстПредупреждения); - Иначе - ТекстВопроса = НСтр("ru = 'Удалить настройку синхронизации данных?'"); - ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, УзелИнформационнойБазы); - ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - КонецЕсли; - -КонецПроцедуры - // Обработчик оповещения // Процедура УдалитьНастройкуСинхронизацииЗавершение(Ответ, УзелИнформационнойБазы) Экспорт @@ -1239,8 +1292,13 @@ Если Ответ = КодВозвратаДиалога.Да Тогда ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеУдаленияРазрешений", ЭтотОбъект, УзелИнформационнойБазы); - Запросы = ОбменДаннымиВызовСервера.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(УзелИнформационнойБазы); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, Неопределено, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = ОбменДаннымиВызовСервера.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(УзелИнформационнойБазы); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, Неопределено, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецЕсли; @@ -1318,12 +1376,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов из других подсистем. - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Обновляет конфигурацию базы данных. // Процедура УстановитьОбновлениеКонфигурации(ЗавершениеРаботыСистемы = Ложь) Экспорт @@ -1338,28 +1390,14 @@ КонецПроцедуры -// Используется для открытия формы группового изменения объектов. -// -// Параметры: -// Список - ТаблицаФормы - элемент формы списка, содержащий ссылки на изменяемые объекты. -// -Процедура ПриИзмененииВыделенныхОбъектов(Список) Экспорт - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда - МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); - МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Список); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события открытия инструкции по восстановлению/изменению пароля синхронизации данных +// Открывает инструкцию по восстановлению/изменению пароля синхронизации данных // с автономным рабочим местом. // -Процедура ПриОткрытииИнструкцииКакИзменитьПарольСинхронизацииДанных(Знач АдресДляВосстановленияПароляУчетнойЗаписи) Экспорт +Процедура ОткрытьИнструкциюКакИзменитьПарольСинхронизацииДанных(Знач АдресДляВосстановленияПароляУчетнойЗаписи) Экспорт Если ПустаяСтрока(АдресДляВосстановленияПароляУчетнойЗаписи) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Адрес для восстановления пароля учетной записи не задан.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Адрес инструкции для восстановления пароля учетной записи не задан.'")); Иначе @@ -1369,22 +1407,6 @@ КонецПроцедуры -// Открывает отчет о версии или о сравнении версий. -// -// Параметры: -// Ссылка - Ссылка на объект -// СравниваемыеВерсии - Массив - Содержит массив сравниваемых версий, -// если версия одна, то открывается отчет о версии. -// -Процедура ПриОткрытииФормыОтчетаПоВерсии(Ссылка, СравниваемыеВерсии) Экспорт - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); - МодульВерсионированиеОбъектовКлиент.ПриОткрытииФормыОтчетаПоВерсии(Ссылка, СравниваемыеВерсии); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl index 07c928107..f016bf0dd 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Для внутреннего использования. diff --git a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl index da6bf0833..e70f31146 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет префикс кодов и номеров объектов информационной базы по умолчанию. @@ -19,15 +14,14 @@ // Определяет список планов обмена, которые используют функционал подсистемы обмена данными. // // Параметры: -// ПланыОбменаПодсистемы - Массив - Массив планов обмена конфигурации, -// которые используют функционал подсистемы обмена данными. -// Элементами массива являются объекты метаданных планов обмена. +// ПланыОбменаПодсистемы - Массив - Массив планов обмена конфигурации, +// которые используют функционал подсистемы обмена данными. +// Элементами массива являются объекты метаданных планов обмена. // -// Пример тела процедуры: -// -// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменБезИспользованияПравилКонвертации); -// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменСБиблиотекойСтандартныхПодсистем); -// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.РаспределеннаяИнформационнаяБаза); +// Пример: +// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменБезИспользованияПравилКонвертации); +// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменСБиблиотекойСтандартныхПодсистем); +// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.РаспределеннаяИнформационнаяБаза); // Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт @@ -46,35 +40,35 @@ // // Параметры: // -// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения стандартной (системной) обработки +// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения стандартной (системной) обработки // события. -// Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная -// обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие. -// Значение по умолчанию - Истина. +// Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная +// обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие. +// Значение по умолчанию - Истина. // -// Получатель - ПланОбменаСсылка - Узел плана обмена, для которого выполняется выгрузка данных. +// Получатель - ПланОбменаСсылка - Узел плана обмена, для которого выполняется выгрузка данных. // -// ИмяФайлаСообщения - Строка - Имя файла, в который необходимо выполнить выгрузку данных. -// Если этот параметр заполнен, то система ожидает, -// что данные будут выгружены в файл. После выгрузки система выполнит отправку данных из этого файла. -// Если параметр пустой, то система ожидает, что данные будут выгружены в параметр ДанныеСообщения. +// ИмяФайлаСообщения - Строка - Имя файла, в который необходимо выполнить выгрузку данных. +// Если этот параметр заполнен, то система ожидает, +// что данные будут выгружены в файл. После выгрузки система выполнит отправку данных из этого файла. +// Если параметр пустой, то система ожидает, что данные будут выгружены в параметр ДанныеСообщения. // -// ДанныеСообщения - Произвольный - Если параметр ИмяФайлаСообщения пустой, -// то система ожидает, что данные будут выгружены в этот параметр. +// ДанныеСообщения - Произвольный - Если параметр ИмяФайлаСообщения пустой, +// то система ожидает, что данные будут выгружены в этот параметр. // -// КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, -// которые помещаются в сообщение в рамках одной транзакции базы данных. -// При необходимости в обработчике следует реализовать логику -// установки транзакционных блокировок на выгружаемые данные. -// Значение параметра задается в настройках подсистемы обмена данными. +// КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, +// которые помещаются в сообщение в рамках одной транзакции базы данных. +// При необходимости в обработчике следует реализовать логику +// установки транзакционных блокировок на выгружаемые данные. +// Значение параметра задается в настройках подсистемы обмена данными. // -// ИмяСобытияЖурналаРегистрации - Строка - Имя события журнала регистрации текущего сеанса обмена данными. -// Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) с заданным именем события. -// Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. +// ИмяСобытияЖурналаРегистрации - Строка - Имя события журнала регистрации текущего сеанса обмена данными. +// Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) с заданным именем события. +// Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. // -// КоличествоОтправленныхОбъектов - Число - Счетчик отправленных объектов. -// Используется для определения количества отправленных объектов -// для последующей фиксации в протоколе обмена. +// КоличествоОтправленныхОбъектов - Число - Счетчик отправленных объектов. +// Используется для определения количества отправленных объектов +// для последующей фиксации в протоколе обмена. // Процедура ПриВыгрузкеДанных(СтандартнаяОбработка, Получатель, @@ -97,34 +91,34 @@ // // Параметры: // -// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения -// стандартной (системной) обработки события. -// Если в теле процедуры-обработчика установить данному параметру значение Ложь, -// стандартная обработка события производиться не будет. -// Отказ от стандартной обработки не отменяет действие. -// Значение по умолчанию: Истина. +// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения +// стандартной (системной) обработки события. +// Если в теле процедуры-обработчика установить данному параметру значение Ложь, +// стандартная обработка события производиться не будет. +// Отказ от стандартной обработки не отменяет действие. +// Значение по умолчанию: Истина. // -// Отправитель - ПланОбменаСсылка - Узел плана обмена, для которого выполняется загрузка данных. +// Отправитель - ПланОбменаСсылка - Узел плана обмена, для которого выполняется загрузка данных. // -// ИмяФайлаСообщения - Строка - Имя файла, из которого требуется выполнить загрузку данных. -// Если параметр не заполнен, то данные для загрузки передаются через параметр ДанныеСообщения. +// ИмяФайлаСообщения - Строка - Имя файла, из которого требуется выполнить загрузку данных. +// Если параметр не заполнен, то данные для загрузки передаются через параметр ДанныеСообщения. // -// ДанныеСообщения - Произвольный - Параметр содержит данные, которые необходимо загрузить. -// Если параметр ИмяФайлаСообщения пустой, -// то данные для загрузки передаются через этот параметр. +// ДанныеСообщения - Произвольный - Параметр содержит данные, которые необходимо загрузить. +// Если параметр ИмяФайлаСообщения пустой, +// то данные для загрузки передаются через этот параметр. // -// КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, -// которые читаются из сообщения и записываются в базу данных в рамках одной транзакции. -// При необходимости в обработчике следует реализовать логику записи данных в транзакции. -// Значение параметра задается в настройках подсистемы обмена данными. +// КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, +// которые читаются из сообщения и записываются в базу данных в рамках одной транзакции. +// При необходимости в обработчике следует реализовать логику записи данных в транзакции. +// Значение параметра задается в настройках подсистемы обмена данными. // -// ИмяСобытияЖурналаРегистрации - Строка - Имя события журнала регистрации текущего сеанса обмена данными. -// Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) с заданным именем события. -// Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. +// ИмяСобытияЖурналаРегистрации - Строка - Имя события журнала регистрации текущего сеанса обмена данными. +// Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) с заданным именем события. +// Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. // -// КоличествоПолученныхОбъектов - Число -Счетчик полученных объектов. -// Используется для определения количества загруженных объектов -// для последующей фиксации в протоколе обмена. +// КоличествоПолученныхОбъектов - Число -Счетчик полученных объектов. +// Используется для определения количества загруженных объектов +// для последующей фиксации в протоколе обмена. // Процедура ПриЗагрузкеДанных(СтандартнаяОбработка, Отправитель, @@ -152,14 +146,17 @@ // // Параметры: // -// Получатель - ПланОбменаСсылка - Узел плана обмена, в который требуется выгрузить данные. +// Получатель - ПланОбменаСсылка - Узел плана обмена, в который требуется выгрузить данные. // -// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения стандартной (системной) обработки +// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения стандартной (системной) обработки // события. -// Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события -// производиться не будет. -// Отказ от стандартной обработки не отменяет действие. -// Значение по умолчанию - Истина. +// Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события +// производиться не будет. +// Отказ от стандартной обработки не отменяет действие. +// Значение по умолчанию - Истина. +// +// Отбор - Массив или ОбъектМетаданных - определяет отбор по объектам метаданных, для которых следует выполнить +// регистрацию изменений. // Процедура РегистрацияИзмененийНачальнойВыгрузкиДанных(Знач Получатель, СтандартнаяОбработка, Отбор) Экспорт @@ -182,26 +179,26 @@ // так и во всех остальных обменах, в том числе в обменах по правилам обмена. // // Параметры: -// ЭлементДанных - Элемент данных, прочитанный из сообщения обмена данными. -// Элементами данных могут быть КонстантаМенеджерЗначения.<Имя константы>, -// объекты базы данных (кроме объекта "Удаление объекта"), наборы записей регистров, последовательностей или -// перерасчетов. +// ЭлементДанных - Произвольный - элемент данных, прочитанный из сообщения обмена данными. +// Элементами данных могут быть КонстантаМенеджерЗначения.<Имя константы>, +// объекты базы данных (кроме объекта "Удаление объекта"), наборы записей регистров, +// последовательностей или перерасчетов. // -// ПолучениеЭлемента - ПолучениеЭлементаДанных - Определяет, будет ли прочитанный элемент данных записан в базу данных +// ПолучениеЭлемента - ПолучениеЭлементаДанных - Определяет, будет ли прочитанный элемент данных записан в базу данных // или нет в случае коллизии. -// При вызове обработчика параметр имеет значение Авто, что означает действия по умолчанию -// (принимать от главного, игнорировать от подчиненного). -// Значение данного параметра может быть переопределено в обработчике. +// При вызове обработчика параметр имеет значение Авто, что означает действия по умолчанию +// (принимать от главного, игнорировать от подчиненного). +// Значение данного параметра может быть переопределено в обработчике. // -// Отправитель - ПланОбменаСсылка - Узел плана обмена, от имени которого выполняется получение данных. +// Отправитель - ПланОбменаСсылка - Узел плана обмена, от имени которого выполняется получение данных. // -// ПолучениеОтГлавного - Булево - В распределенной информационной базе обозначает признак получения данных от главного +// ПолучениеОтГлавного - Булево - В распределенной информационной базе обозначает признак получения данных от главного // узла. -// Истина - выполняется получение данных от главного узла, Ложь - от подчиненного. -// В обменах по правилам обмена принимает значение Истина - если в правилах обмена приоритет объекта -// при коллизии установлен в значение "Выше" (значение по умолчанию) или не указан; -// Ложь - если в правилах обмена приоритет объекта при коллизии установлен в значение "Ниже" или "Совпадает". -// Во всех остальных типах обмена данными параметр принимает значение Истина. +// Истина - выполняется получение данных от главного узла, Ложь - от подчиненного. +// В обменах по правилам обмена принимает значение Истина - если в правилах обмена приоритет объекта +// при коллизии установлен в значение "Выше" (значение по умолчанию) или не указан; +// Ложь - если в правилах обмена приоритет объекта при коллизии установлен в значение "Ниже" или "Совпадает". +// Во всех остальных типах обмена данными параметр принимает значение Истина. // Процедура ПриКоллизииИзмененийДанных(Знач ЭлементДанных, ПолучениеЭлемента, Знач Отправитель, Знач ПолучениеОтГлавного) Экспорт @@ -221,8 +218,8 @@ // ВерсииФормата - Соответствие - Соответствие номера версии формата, // общему модулю, в котором находятся обработчики выгрузки/загрузки для данной версии. // -// Пример тела процедуры: -// ВерсииФормата.Вставить("1.0.beta", <ИмяОбщегоМодуляСПравиламиКонвертации>); +// Пример: +// ВерсииФормата.Вставить("1.2", <ИмяОбщегоМодуляСПравиламиКонвертации>); // Процедура ПриПолученииДоступныхВерсийФормата(ВерсииФормата) Экспорт @@ -234,6 +231,9 @@ // Устарела. Следует использовать ПриОпределенииПрефиксаИнформационнойБазыПоУмолчанию. // +// Возвращаемое значение: +// Строка - префикс этой информационной базы. +// Функция ПрефиксИнформационнойБазыПоУмолчанию() Экспорт КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl index 13cb95dda..90333df9b 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl @@ -1,22 +1,17 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Возвращает признак использования плана обмена в обмене данными. // Если план обмена содержит хотя бы один узел кроме предопределенного, // то считается, что он используется. // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. -// Отправитель - ПланОбменаСсылка - Значение параметра устанавливается, если необходимо -// определить есть ли другие узлы обмена, кроме того, из -// которого был получен объект. +// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. +// Отправитель - ПланОбменаСсылка - Значение параметра устанавливается, если необходимо +// определить есть ли другие узлы обмена, кроме того, из +// которого был получен объект. // // Возвращаемое значение: -// Истина - план обмена используется, Ложь - нет. +// Булево. Истина - план обмена используется, Ложь - нет. // Функция ОбменДаннымиВключен(Знач ИмяПланаОбмена, Знач Отправитель = Неопределено) Экспорт @@ -40,7 +35,7 @@ КонецФункции -// Возвращает Истина, если сеанс запущен в автономном рабочем месте. +// См. ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто. // Функция ЭтоАвтономноеРабочееМесто() Экспорт @@ -52,32 +47,24 @@ Иначе - Возврат ОбменДаннымиСервер.ГлавныйУзел() <> Неопределено - И ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() - И ОбменДаннымиСервер.ГлавныйУзел().Метаданные().Имя = ОбменДаннымиПовтИсп.ПланОбменаАвтономнойРаботы(); + ГлавныйУзелЭтойИнформационнойБазы = ОбменДаннымиСервер.ГлавныйУзел(); + Возврат ГлавныйУзелЭтойИнформационнойБазы <> Неопределено + И ЭтоУзелАвтономногоРабочегоМеста(ГлавныйУзелЭтойИнформационнойБазы); КонецЕсли; КонецФункции -// Определяет, является ли переданный узел плана обмена автономным рабочим местом. +// См. ОбменДаннымиСервер.ЭтоУзелАвтономногоРабочегоМеста. // Функция ЭтоУзелАвтономногоРабочегоМеста(Знач УзелИнформационнойБазы) Экспорт - Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() - И УзелИнформационнойБазы.Метаданные().Имя = ОбменДаннымиПовтИсп.ПланОбменаАвтономнойРаботы(); + Возврат АвтономнаяРаботаПоддерживается() + И УзелИнформационнойБазы.Метаданные().Имя = ПланОбменаАвтономнойРаботы(); + КонецФункции -// Возвращает ссылку на узел плана обмена, найденный по его коду. -// Если узел не найден, возвращается Неопределено. -// -// Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. -// КодУзла - Строка - Код узла плана обмена. -// -// Возвращаемое значение: -// ПланОбменаСсылка - ссылка на найденный узел плана обмена. -// Неопределено - в случае, если узел плана обмена не найден. +// См. ОбменДаннымиСервер.УзелПланаОбменаПоКоду. // Функция НайтиУзелПланаОбменаПоКоду(ИмяПланаОбмена, КодУзла) Экспорт @@ -109,52 +96,16 @@ Возврат Выборка.Ссылка; КонецФункции -// Возвращает назначенный для плана обмена режим регистрации изменений, -// применяемый при выполнении записи данных в рамках обновления информационной базы. -// -// Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. -// -// Возвращаемое значение: -// "Все" - регистрируются все данные (например, для обмена РИБ с отбором), -// "ТолькоНовые" - регистрируются только новые объекты ссылочных типов (например, для обмена по правилам), -// "ОпределяетсяЛогикойОбновления" - решение о регистрации принимается на уровне логики обновления. -// -Функция РежимРегистрацииДанныхДляПланаОбменаПриОбновленииИнформационнойБазы(ИмяПланаОбмена) Экспорт - - Возврат ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, - "РежимРегистрацииДанныхПриОбновленииИнформационнойБазы"); - -КонецФункции - -// Устанавливает внешнее соединение с информационной базой и возвращает описание соединения. -// -// Параметры: -// Параметры - Структура - параметры для установки внешнего соединения с информационной базой. -// Свойства см. в функции -// ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения: -// -// * ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - -// клиент-серверный; -// * КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы; -// * ИмяСервера1СПредприятия - Строка - Имя сервера1С:Предприятия; -// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия; -// * АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании -// внешнего подключения к информационной базе; -// * ИмяПользователя - Строка - Имя пользователя информационной базы; -// * ПарольПользователя - Строка - Пароль пользователя информационной базы. +// См. ОбменДаннымиСервер.ВнешнееСоединениеСБазой. // Функция УстановитьВнешнееСоединениеСБазой(Параметры) Экспорт // Преобразуем настройки - параметры внешнего соединения в параметры транспорта. НастройкиТранспорта = ОбменДаннымиСервер.НастройкиТранспортаПоПараметрамВнешнегоСоединения(Параметры); Возврат ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиТранспорта); + КонецФункции -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - //////////////////////////////////////////////////////////////////////////////// // Механизм регистрации объектов на узлах планов обмена (МРО). @@ -257,7 +208,7 @@ СообщенияОбОшибках.Вставить(5, НСтр("ru = 'Ошибка открытия файла обмена'")); СообщенияОбОшибках.Вставить(6, НСтр("ru = 'Ошибка при загрузке правил обмена'")); СообщенияОбОшибках.Вставить(7, НСтр("ru = 'Ошибка формата правил обмена'")); - СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Не корректно указано имя файла для выгрузки данных'")); + СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Некорректно указано имя файла для выгрузки данных'")); СообщенияОбОшибках.Вставить(9, НСтр("ru = 'Ошибка формата файла обмена'")); СообщенияОбОшибках.Вставить(10, НСтр("ru = 'Не указано имя файла для выгрузки данных (Имя файла данных)'")); СообщенияОбОшибках.Вставить(11, НСтр("ru = 'Ссылка на несуществующий объект метаданных в правилах обмена'")); @@ -448,6 +399,15 @@ #Область СлужебныеПроцедурыИФункции +// См. ОбменДаннымиСервер.РежимРегистрацииДанныхДляПланаОбменаПриОбновленииИнформационнойБазы. +// +Функция РежимРегистрацииДанныхДляПланаОбменаПриОбновленииИнформационнойБазы(ИмяПланаОбмена) Экспорт + + Возврат ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, + "РежимРегистрацииДанныхПриОбновленииИнформационнойБазы"); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Механизм регистрации объектов на узлах планов обмена (МРО). @@ -563,6 +523,8 @@ // Функция ПользовательскийСоставПланаОбмена(Знач Получатель) Экспорт + УстановитьПривилегированныйРежим(Истина); + Результат = Новый Соответствие; СвойстваПолучателя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Получатель, @@ -571,6 +533,7 @@ Приоритеты = ПриоритетыРежимовВыгрузкиОбъектов(); ИмяПланаОбмена = Получатель.Метаданные().Имя; Правила = ОбменДаннымиПовтИсп.ПравилаРегистрацииОбъектовПланаОбмена(ИмяПланаОбмена); + Правила.Индексы.Добавить("ОбъектМетаданныхИмя"); Для Каждого Элемент Из Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав Цикл @@ -603,6 +566,8 @@ КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + Возврат Результат; КонецФункции @@ -912,10 +877,17 @@ Для Каждого ИмяПланаОбмена Из ПланыОбменаБСП() Цикл - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + + Если ЭтоРазделеннаяКонфигурация Тогда - Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) Тогда + Если МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, + МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()) Тогда Результат.Добавить(ИмяПланаОбмена); @@ -1087,7 +1059,7 @@ КонецЦикла; - Возврат ОбщегоНазначения.ДеревоМетаданныхКонфигурации(Отбор); + Возврат ОбменДаннымиСервер.ДеревоМетаданныхКонфигурации(Отбор); КонецФункции @@ -1095,7 +1067,7 @@ // Функция СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена) Экспорт - СтруктураНастроекОбмена = ОбменДаннымиСервер.ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы( + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных, Неопределено, @@ -1334,15 +1306,21 @@ Функция ИмяПрофиляБезопасности(Знач ИмяПланаОбмена) Экспорт + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Возврат Неопределено; + КонецЕсли; + Если Справочники.ИдентификаторыОбъектовМетаданных.ДанныеОбновлены() Тогда ИдентификаторПланаОбмена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.ПланыОбмена[ИмяПланаОбмена]); - ИмяПрофиляБезопасности = РаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(ИдентификаторПланаОбмена); + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + ИмяПрофиляБезопасности = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(ИдентификаторПланаОбмена); Иначе ИмяПрофиляБезопасности = Неопределено; КонецЕсли; Если ИмяПрофиляБезопасности = Неопределено Тогда - ИмяПрофиляБезопасности = Константы.ПрофильБезопасностиИнформационнойБазы.Получить(); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИмяПрофиляБезопасности = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы(); Если ПустаяСтрока(ИмяПрофиляБезопасности) Тогда ИмяПрофиляБезопасности = Неопределено; КонецЕсли; @@ -1368,7 +1346,7 @@ ВидТранспортаСообщенийОбмена, ИспользоватьНастройкиТранспорта = Истина) Экспорт - Возврат ОбменДаннымиСервер.ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы( + Возврат ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( УзелИнформационнойБазы, ДействиеПриОбмене, ВидТранспортаСообщенийОбмена, @@ -1384,7 +1362,7 @@ // Функция НастройкиОбменаДанными(НастройкаВыполненияОбмена, НомерСтроки) Экспорт - Возврат ОбменДаннымиСервер.ПолучитьСтруктуруНастроекОбмена(НастройкаВыполненияОбмена, НомерСтроки); + Возврат ОбменДаннымиСервер.НастройкиОбменаДанными(НастройкаВыполненияОбмена, НомерСтроки); КонецФункции @@ -1392,7 +1370,7 @@ // Функция НастройкиТранспортаУзлаПланаОбмена(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт - Возврат ОбменДаннымиСервер.ПолучитьСтруктуруНастроекТранспорта(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена); + Возврат ОбменДаннымиСервер.НастройкиТранспортаОбмена(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена); КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl index 697fb6944..d57f36579 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Процедура-обработчик события "ПриСозданииНаСервере" для формы узла плана обмена. @@ -133,7 +128,7 @@ Если Данные <> Неопределено И ТипЗнч(Данные) = Тип("Соответствие") Тогда - Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(Форма.ПараметрыВнешнегоСоединения); + Подключение = ВнешнееСоединениеСБазой(Форма.ПараметрыВнешнегоСоединения); СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; ВнешнееСоединение = Подключение.Соединение; @@ -267,8 +262,8 @@ // Параметры: // Объект - ПланОбменаОбъект - узел плана обмена, для которого выполняется обработчик. // Ссылка - ПланОбменаСсылка - ссылка на узел плана обмена, для которого выполняется обработчик. -// -// Возвращаемое значение: +// +// Возвращаемое значение: // Булево - если Истина, то необходимо выполнить обработчик "ПослеВыгрузкиДанных"; Ложь - нет. // Функция НадоВыполнитьОбработчикПослеВыгрузкиДанных(Объект, Ссылка) Экспорт @@ -282,8 +277,8 @@ // Параметры: // Объект - ПланОбменаОбъект - узел плана обмена, для которого выполняется обработчик. // Ссылка - ПланОбменаСсылка - ссылка на узел плана обмена, для которого выполняется обработчик. -// -// Возвращаемое значение: +// +// Возвращаемое значение: // Булево - если Истина, то необходимо выполнить обработчик "ПослеЗагрузкиДанных"; Ложь - нет. // Функция НадоВыполнитьОбработчикПослеЗагрузкиДанных(Объект, Ссылка) Экспорт @@ -295,7 +290,7 @@ // Возвращает префикс этой информационной базы. // // Возвращаемое значение: -// Строка +// Строка - префикс этой информационной базы. // Функция ПрефиксИнформационнойБазы() Экспорт @@ -313,7 +308,8 @@ // Строка - версия конфигурации корреспондента. // // Пример: -// Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбменДаннымиСервер.ВерсияКорреспондента(Корреспондент), "2.1.5.1") >= 0 Тогда ... +// Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбменДаннымиСервер.ВерсияКорреспондента(Корреспондент), "2.1.5.1") +// >= 0 Тогда ... // Функция ВерсияКорреспондента(Знач Корреспондент) Экспорт @@ -329,7 +325,21 @@ // Процедура УстановитьПрефиксИнформационнойБазы(Знач Префикс) Экспорт - Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(Префикс)); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") + И Не ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла() Тогда + + МодульПрефиксацияОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовСлужебный"); + + ПараметрыИзмененияПрефикса = Новый Структура("НовыйПрефиксИБ, ПродолжитьНумерацию", + СокрЛП(Префикс), Истина); + МодульПрефиксацияОбъектовСлужебный.ИзменитьПрефиксИБ(ПараметрыИзмененияПрефикса); + + Иначе + // Изменение данных с целью перенумерации справочников и документов не должно выполняться + // - в случае, если подсистема префиксации не встроена, + // - при первом запуске подчиненного узла РИБ. + Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(Префикс)); + КонецЕсли; ОбменДаннымиВызовСервера.СброситьКэшМеханизмаРегистрацииОбъектов(); @@ -396,7 +406,7 @@ // Параметры: // УзелПланаОбмена - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить переопределяемое // имя. -// ИмяПараметраСИменемУзла - Имя параметра, в настройках по умолчанию, из которого необходимо получить имя узла. +// ИмяПараметраСИменемУзла - Строка - Имя параметра, в настройках по умолчанию, из которого необходимо получить имя узла. // // Возвращаемое значение: // Строка - переопределяемое имя плана обмена как оно заданно в конфигураторе. @@ -446,10 +456,7 @@ // Возвращает массив всех видов транспорта сообщений обмена, определенных в конфигурации. // -// Параметры: -// Нет. -// -// Возвращаемое значение: +// Возвращаемое значение: // Массив - Элементы массива имеют тип "ПеречислениеСсылка.ВидыТранспортаСообщенийОбмена". // Функция ВсеТранспортыСообщенийОбменаКонфигурации() Экспорт @@ -530,7 +537,7 @@ // Узлы - Массив - массив значений ПланОбменаСсылка. // // Возвращаемое значение: -// Число +// Число - количество нерассмотренных проблем обмена данными. // Функция КоличествоНерассмотренныхПроблем(Узлы = Неопределено) Экспорт @@ -710,8 +717,8 @@ // Возвращает представление даты синхронизации. // // Параметры: -// ДатаСинхронизации - Дата. Абсолютная дата синхронизации данных. -// +// ДатаСинхронизации - Дата - Абсолютная дата синхронизации данных. +// // Возвращаемое значение: // Строка - строковое представление даты. // @@ -727,21 +734,21 @@ // Возвращает представление относительной даты синхронизации. // // Параметры: -// ДатаСинхронизации - Дата. Абсолютная дата синхронизации данных. +// ДатаСинхронизации - Дата - Абсолютная дата синхронизации данных. // // Возвращаемое значение: -// Строка: -// Никогда (Т = пустая дата). -// Сейчас (Т < 5 мин) -// 5 минут назад (5 мин < Т < 15 мин) -// 15 минут назад (15 мин < Т < 30 мин) -// 30 минут назад (30 мин < Т < 1 час) -// 1 час назад (1 час < Т < 2 час) -// 2 часа назад (2 час < Т < 3 час). -// Сегодня, 12:44:12 (3 час < Т < вчера). -// Вчера, 22:30:45 (вчера < Т < позавчера). -// Позавчера, 21:22:54 (позавчера < Т < поза-позавчера). -// <12 Марта 2012г.> (поза-позавчера < Т). +// Строка - представление относительной даты синхронизации. +// *Никогда (Т = пустая дата). +// *Сейчас (Т < 5 мин) +// *5 минут назад (5 мин < Т < 15 мин) +// *15 минут назад (15 мин < Т < 30 мин) +// *30 минут назад (30 мин < Т < 1 час) +// *1 час назад (1 час < Т < 2 час) +// *2 часа назад (2 час < Т < 3 час). +// *Сегодня, 12:44:12 (3 час < Т < вчера). +// *Вчера, 22:30:45 (вчера < Т < позавчера). +// *Позавчера, 21:22:54 (позавчера < Т < поза-позавчера). +// *<12 Марта 2012г.> (поза-позавчера < Т). // Функция ОтносительнаяДатаСинхронизации(Знач ДатаСинхронизации) Экспорт @@ -843,10 +850,10 @@ // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. // СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СтрокаСообщенияПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. // // Возвращаемое значение: -// WSПрокси +// WSПрокси - объект WSПрокси веб-сервиса Exchange. // Функция ПолучитьWSПрокси(СтруктураНастроек, СтрокаСообщенияОбОшибке = "", СообщениеПользователю = "") Экспорт @@ -870,10 +877,10 @@ // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. // СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СтрокаСообщенияПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. // // Возвращаемое значение: -// WSПрокси +// WSПрокси - объект WSПрокси веб-сервиса Exchange_2_0_1_6. // Функция ПолучитьWSПрокси_2_0_1_6(СтруктураНастроек, СтрокаСообщенияОбОшибке = "", СообщениеПользователю = "") Экспорт @@ -897,10 +904,11 @@ // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. // СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СтрокаСообщенияПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// Таймаут - число - таймаут. // // Возвращаемое значение: -// WSПрокси +// WSПрокси - объект WSПрокси веб-сервиса Exchange_2_0_1_7. // Функция ПолучитьWSПрокси_2_1_1_7(СтруктураНастроек, СтрокаСообщенияОбОшибке = "", СообщениеПользователю = "", Таймаут = 600) Экспорт @@ -915,11 +923,8 @@ // Возвращает допустимое количество элементов, обрабатываемых в одной транзакции загрузки данных. // -// Параметры: -// Нет. -// // Возвращаемое значение: -// Число +// Число - допустимое количество элементов, обрабатываемых в одной транзакции загрузки данных. // Функция КоличествоЭлементовВТранзакцииЗагрузкиДанных() Экспорт @@ -930,11 +935,8 @@ // Возвращает допустимое количество элементов, обрабатываемых в одной транзакции выгрузки данных. // -// Параметры: -// Нет. -// // Возвращаемое значение: -// Число +// Число - допустимое количество элементов, обрабатываемых в одной транзакции выгрузки данных. // Функция КоличествоЭлементовВТранзакцииВыгрузкиДанных() Экспорт @@ -942,10 +944,177 @@ КонецФункции +// Возвращает таблицу с данными узлов всех настроенных обменов БСП. +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица значений с колонками: +// * УзелИнформационнойБазы - ПланОбменаСсылка - ссылка на узел плана обмена. +// * Наименование - Строка - Наименование узла плана обмена. +// * ИмяПланаОбмена - Строка - Имя плана обмена. +// +Функция УзлыОбменаБСП() Экспорт + + Запрос = Новый Запрос(ТекстЗапросаПланыОбменаДляМонитора()); + УстановитьПривилегированныйРежим(Истина); + УзлыОбменаБСП = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(Ложь); + + Возврат УзлыОбменаБСП; + +КонецФункции + +// Определяет, используются ли типовых правила конвертации для плана обмена. +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. +// +// Возвращаемое значение: +// Булево - если Истина, то используются; Ложь - нет. +// +Функция ИспользуютсяТиповыеПравила(ИмяПланаОбмена) Экспорт + + Возврат РегистрыСведений.ПравилаДляОбменаДанными.ИспользуютсяТиповыеПравила(ИмяПланаОбмена); + +КонецФункции + +// Устанавливает внешнее соединение с информационной базой и возвращает описание соединения. +// +// Параметры: +// Параметры - Структура - параметры для установки внешнего соединения с информационной базой. +// Свойства см. в функции +// ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения: +// +// * ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - +// клиент-серверный; +// * КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы; +// * ИмяСервера1СПредприятия - Строка - Имя сервера1С:Предприятия; +// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия; +// * АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании +// внешнего подключения к информационной базе; +// * ИмяПользователя - Строка - Имя пользователя информационной базы; +// * ПарольПользователя - Строка - Пароль пользователя информационной базы. +// +// Возвращаемое значение: +// Структура - Описание соединения +// * Соединение - COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в +// случае ошибки; +// * КраткоеОписаниеОшибки - Строка - краткое описание ошибки; +// * ПодробноеОписаниеОшибки - Строка - подробное описание ошибки; +// * ОшибкаПодключенияКомпоненты - Булево - флаг ошибки подключения COM. +// +Функция ВнешнееСоединениеСБазой(Параметры) Экспорт + + Возврат ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(Параметры) + +КонецФункции + +// Возвращает назначенный для плана обмена режим регистрации изменений, +// применяемый при выполнении записи данных в рамках обновления информационной базы. +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. +// +// Возвращаемое значение: +// "Все" - регистрируются все данные (например, для обмена РИБ с отбором), +// "ТолькоНовые" - регистрируются только новые объекты ссылочных типов (например, для обмена по правилам), +// "ОпределяетсяЛогикойОбновления" - решение о регистрации принимается на уровне логики обновления. +// +Функция РежимРегистрацииДанныхДляПланаОбменаПриОбновленииИнформационнойБазы(ИмяПланаОбмена) Экспорт + + Возврат ОбменДаннымиПовтИсп.РежимРегистрацииДанныхДляПланаОбменаПриОбновленииИнформационнойБазы(ИмяПланаОбмена); + +КонецФункции + #Область ДляВызоваИзДругихПодсистем // ТехнологияСервиса.ОбменДаннымиВМоделиСервиса +// Возвращает ссылку на узел плана обмена, найденный по его коду. +// Если узел не найден, возвращается Неопределено. +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. +// КодУзла - Строка - Код узла плана обмена. +// +// Возвращаемое значение: +// ПланОбменаСсылка - ссылка на найденный узел плана обмена. +// Неопределено - в случае, если узел плана обмена не найден. +// +Функция УзелПланаОбменаПоКоду(ИмяПланаОбмена, КодУзла) Экспорт + + Возврат ОбменДаннымиПовтИсп.НайтиУзелПланаОбменаПоКоду(ИмяПланаОбмена, КодУзла); + +КонецФункции + +// Возвращает Истина, если сеанс запущен в автономном рабочем месте. +// Возвращаемое значение: +// Булево - признак запуска в автономном рабочем месте. +// +Функция ЭтоАвтономноеРабочееМесто() Экспорт + + Возврат ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто(); + +КонецФункции + +// Определяет, является ли переданный узел плана обмена автономным рабочим местом. +// +// Параметры: +// УзелИнформационнойБазы - ПланОбменаСсылка - проверяемый узел. +// +// Возвращаемое значение: +// Булево - признак того что переданный узел является автономным рабочим местом. +// +Функция ЭтоУзелАвтономногоРабочегоМеста(Знач УзелИнформационнойБазы) Экспорт + + Возврат ОбменДаннымиПовтИсп.ЭтоУзелАвтономногоРабочегоМеста(УзелИнформационнойБазы); + +КонецФункции + +// Удаляет набор записей в регистре по переданным значениям структуры. +// +// Параметры: +// СтруктураЗаписи - Структура - структура, по значениям которой необходимо удалить набор записей. +// +Процедура УдалитьЗаписиСостоянияОбменовДанными(СтруктураЗаписи) Экспорт + + УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, "СостоянияОбменовДанными"); + +КонецПроцедуры + +// Удаляет набор записей в регистре по переданным значениям структуры. +// +// Параметры: +// СтруктураЗаписи - Структура - структура, по значениям которой необходимо удалить набор записей. +// +Процедура УдалитьЗаписиСостоянияУспешныхОбменовДанными(СтруктураЗаписи) Экспорт + + УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, "СостоянияУспешныхОбменовДанными"); + +КонецПроцедуры + +// Удаляет поставляемые правила для плана обмена (очищает данные в регистре). +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена, для которого удаляются правила. +// +Процедура УдалитьПоставляемыеПравила(ИмяПланаОбмена) Экспорт + + РегистрыСведений.ПравилаДляОбменаДанными.УдалитьПоставляемыеПравила(ИмяПланаОбмена); + +КонецПроцедуры + +// Загружает поставляемые правила для плана обмена. +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. +// ИмяФайлаПравил - Строка - полное имя файла правил обмена (*.zip). +// +Процедура ЗагрузитьПоставляемыеПравила(ИмяПланаОбмена, ИмяФайлаПравил) Экспорт + + РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьПоставляемыеПравила(ИмяПланаОбмена, ИмяФайлаПравил); + +КонецПроцедуры + // Возвращает идентификатор настройки обмена, соответствующий конкретному корреспонденту. // // Параметры: @@ -1037,175 +1206,7 @@ #Область СлужебныйПрограммныйИнтерфейс -#Область ОбъявлениеСлужебныхСобытий - -// Объявляет служебные события подсистемы ОбменДанными: -// -// Серверные события: -// ПриВыгрузкеДанных, -// ПриЗагрузкеДанных. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Используется для переопределения стандартной обработки выгрузки данных. - // В данном обработчике должна быть реализована логика выгрузки данных: - // выборка данных для выгрузки, сериализация данных в файл сообщения или сериализация данных в поток. - // После выполнения обработчика выгруженные данные будут отправлены получателю подсистемой обмена данными. - // Формат сообщения для выгрузки может быть произвольным. - // В случае ошибок при отправке данных следует прерывать выполнение обработчика - // методом ВызватьИсключение с описанием ошибки. - // - // Параметры: - // СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения - // стандартной (системной) обработки события. Если в теле процедуры-обработчика установить - // данному параметру значение Ложь, стандартная обработка события производиться не будет. - // Отказ от стандартной обработки не отменяет действие. - // Значение по умолчанию: Истина. - // Получатель - ПланОбменаСсылка - узел плана обмена, для которого выполняется выгрузка данных. - // ИмяФайлаСообщения - Строка - имя файла, в который необходимо выполнить выгрузку данных. - // Если этот параметр заполнен, то система ожидает, что данные будут выгружены в файл. - // После выгрузки система выполнит отправку данных из этого файла. - // Если параметр пустой, то система ожидает, что данные будут выгружены в параметр ДанныеСообщения. - // ДанныеСообщения - Произвольный - если параметр ИмяФайлаСообщения пустой, то система ожидает, - // что данные будут выгружены в этот параметр. - // КоличествоЭлементовВТранзакции - Число - определяет максимальное число элементов данных, - // которые помещаются в сообщение в рамках одной транзакции базы данных. - // При необходимости в обработчике следует реализовать логику установки - // транзакционных блокировок на выгружаемые данные. - // Значение параметра задается в настройках подсистемы обмена данными. - // ИмяСобытияЖурналаРегистрации - Строка - имя события журнала регистрации текущего сеанса обмена данными. - // Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) - // с заданным именем события. Соответствует параметру ИмяСобытия метода - // глобального контекста ЗаписьЖурналаРегистрации. - // КоличествоОтправленныхОбъектов - Число - Счетчик отправленных объектов. - // Используется для определения количества отправленных объектов для последующей фиксации в протоколе обмена. - // - // Синтаксис: - // Процедура ПриВыгрузкеДанныхСлужебный(СтандартнаяОбработка, - // Получатель, - // ИмяФайлаСообщения, - // ДанныеСообщения, - // КоличествоЭлементовВТранзакции, - // ИмяСобытияЖурналаРегистрации, - // КоличествоОтправленныхОбъектов) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ОбменДанными\ПриВыгрузкеДанныхСлужебный"); - - // Используется для переопределения стандартной обработки загрузки данных. - // В данном обработчике должна быть реализована логика загрузки данных: - // необходимые проверки перед загрузкой данных, сериализация данных из файла сообщения или сериализация данных из - // потока. - // Формат сообщения для загрузки может быть произвольным. - // В случае ошибок при получении данных следует прерывать выполнение обработчика - // методом ВызватьИсключение с описанием ошибки. - // - // Параметры: - // - // СтандартнаяОбработка - Булево - - // В данный параметр передается признак выполнения стандартной (системной) обработки события. - // Если в теле процедуры-обработчика установить данному параметру значение Ложь, - // стандартная обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие. - // Значение по умолчанию: Истина. - // Отправитель - ПланОбменаСсылка - узел плана обмена, для которого выполняется загрузка данных. - // ИмяФайлаСообщения - Строка - имя файла, из которого требуется выполнить загрузку данных. - // Если параметр не заполнен, то данные для загрузки передаются через параметр ДанныеСообщения. - // ДанныеСообщения - Произвольный - Параметр содержит данные, которые необходимо загрузить. - // Если параметр ИмяФайлаСообщения пустой, то данные для загрузки передаются через этот параметр. - // КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, - // которые читаются из сообщения и записываются в базу данных в рамках одной транзакции. - // При необходимости в обработчике следует реализовать логику записи данных в транзакции. - // Значение параметра задается в настройках подсистемы обмена данными. - // ИмяСобытияЖурналаРегистрации - Строка - имя события журнала регистрации текущего сеанса обмена данными. - // Используется для записи в журнал регистрации данных (ошибок, предупреждений, информации) - // с заданным именем события. - // Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. - // КоличествоПолученныхОбъектов - Число - счетчик полученных объектов. - // Используется для определения количества загруженных объектов - // для последующей фиксации в протоколе обмена. - // - // Синтаксис: - // Процедура ПриЗагрузкеДанныхСлужебный(СтандартнаяОбработка, - // Отправитель, - // ИмяФайлаСообщения, - // ДанныеСообщения, - // КоличествоЭлементовВТранзакции, - // ИмяСобытияЖурналаРегистрации, - // КоличествоПолученныхОбъектов) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный"); - - // Обработчик начальной настройки ИБ после создания узла РИБ. - // Вызывается в момент первого запуска подчиненного узла РИБ (в том числе АРМ). - // - // Синтаксис: - // Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ОбменДанными\ПриНастройкеПодчиненногоУзлаРИБ"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "ОбменДаннымиКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "ОбменДаннымиКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "ОбменДаннымиСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриРегистрацииМенеджеровВнешнихМодулей"].Добавить( - "ОбменДаннымиСервер"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииПоставляемыхПрофилейГруппДоступа"].Добавить( - "ОбменДаннымиСервер"); - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ОбменДаннымиСервер"); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиУсловныхВызовов +#Область РазличногоНазначения // Выполняет загрузку приоритетных данных, полученных из главного узла РИБ. Процедура ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБ(Отказ = Ложь) Экспорт @@ -1228,7 +1229,7 @@ Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ИспользоватьСинхронизациюДанных = Константы.ИспользоватьСинхронизациюДанных.СоздатьМенеджерЗначения(); ИспользоватьСинхронизациюДанных.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); @@ -1324,23 +1325,6 @@ КонецПроцедуры -// Выполняет загрузку сообщения обмена, которое содержало -// изменения конфигурации, до обновления информационной базы. -// -Процедура ПередОбновлениемИнформационнойБазы(ПриЗапускеКлиентскогоПриложения, Перезапустить) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - Если НЕ ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда - ВыполнитьСинхронизациюПриОтсутствииОбновленияИнформационнойБазы(ПриЗапускеКлиентскогоПриложения, Перезапустить); - Иначе - ЗагрузитьСообщениеПередОбновлениемИнформационнойБазы(); - КонецЕсли; - -КонецПроцедуры - // Выполняет инициализацию XML файла, для записи информации об объектах // отмеченных к обработке обновления, для передачи их в подчиненный узел РИБ. // @@ -1524,7 +1508,7 @@ МенеджерОбъектаОтбора = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ТипЗначенияОтбора); - Если Найти(ВРег(ТипЗначенияОтбора), "ПЕРЕЧИСЛЕНИЕ") > 0 Тогда + Если СтрНайти(ВРег(ТипЗначенияОтбора), "ПЕРЕЧИСЛЕНИЕ") > 0 Тогда СсылкаНаЗначение = МенеджерОбъектаОтбора[ЗначениеОтбора]; Иначе СсылкаНаЗначение = МенеджерОбъектаОтбора.ПолучитьСсылку(Новый УникальныйИдентификатор(ЗначениеОтбора)); @@ -1581,7 +1565,8 @@ // Процедура ЗавершитьЗаписьФайлаСДаннымиОбновления(Параметры) Экспорт - Если Не СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ("СФильтром") Тогда + Если Не СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ("СФильтром") + Или ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда Возврат; КонецЕсли; @@ -1634,21 +1619,6 @@ КонецПроцедуры -// Выполняет действия после обновления информационной базы, в т.ч. выгрузку сообщения обмена, -// которое содержало изменения конфигурации, до обновления информационной базы. -// -Процедура ПослеОбновленияИнформационнойБазы() Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ЗарегистрироватьОбновлениеДанныхИнформационнойБазы(); - - ВыгрузитьСообщениеПослеОбновленияИнформационнойБазы(); - -КонецПроцедуры - // Возвращает Истина, если настройка подчиненного узла РИБ не завершена и // требуется обновления параметров работы программы, которые не участвуют в РИБ. // @@ -1661,434 +1631,6 @@ КонецФункции -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации; - Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюДанных; - Зависимость.РаботаетСВнешнимиРесурсами = Истина; - - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияДанных; - Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость.Параметризуется = Истина; -КонецПроцедуры - -#КонецОбласти - -#Область ОбновлениеИнформационнойБазы - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Приоритет = 1; - Обработчик.ОбщиеДанные = Истина; - Обработчик.МонопольныйРежим = Ложь; - Обработчик.Процедура = "ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.1.2"; - Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.1.2"; - Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьРежимВыгрузкиОбъектовДляВсехУзловИнформационнойБазы"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.1.2"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ОбменДаннымиСервер.ОбновитьРегламентныеЗаданияСценариевОбменовДанными"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.1.2.0"; - Обработчик.Процедура = "ОбменДаннымиСервер.ОбновитьКонстантуНастройкаПодчиненногоУзлаРИБЗавершена"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.0.1.10"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ОбменДаннымиСервер.ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.1.5"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьПризнакСохраненияПароляДляОбменаЧерезИнтернет"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.2.12"; - Обработчик.Процедура = "ОбменДаннымиСервер.СброситьНастройкиМонитораОбмена"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.2.21"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ОбменДаннымиСервер.ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ_2_1_2_21"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.2.4"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных_2_2_2_4"; - -КонецПроцедуры - -// Выполняет обновление правил конвертации/регистрации объектов. -// Обновление выполняется для всех планов обмена, подключенных к подсистеме. -// Обновление правил выполняется только для типовых правил. -// Если для плана обмена правила были загружены из файла, то такие правила не обновляются. -// -Процедура ВыполнитьОбновлениеПравилДляОбменаДанными() Экспорт - - // Для сценария, когда в конфигурации был удален или переименован план обмена. - УдалитьНеактуальныеЗаписиВРегистреПравилДляОбменаДанными(); - - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") - И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - ПравилаОбменаЗагруженныеИзФайла = Новый Массив; - ПравилаРегистрацииЗагруженныеИзФайла = Новый Массив; - - ВыполнитьПроверкуНаличияПравилОбменаЗагруженныхИзФайла(ПравилаОбменаЗагруженныеИзФайла, ПравилаРегистрацииЗагруженныеИзФайла); - ВыполнитьОбновлениеВерсииТиповыхПравилДляОбменаДанными(ПравилаОбменаЗагруженныеИзФайла, ПравилаРегистрацииЗагруженныеИзФайла); - -КонецПроцедуры - -// Устанавливает признак того, что для всех узлов планов обмена необходимо выполнить процедуру -// корректировки информации сопоставления при следующем обмене данными. -// -Процедура УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы() Экспорт - - РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы(); - -КонецПроцедуры - -// Устанавливает для всех узлов универсального обмена данными значения реквизитов-флагов режимов выгрузки значение -// "Выгружать по условию". -// -Процедура УстановитьРежимВыгрузкиОбъектовДляВсехУзловИнформационнойБазы() Экспорт - - СписокПлановОбмена = ОбменДаннымиПовтИсп.СписокПлановОбменаБСП(); - - Для Каждого Элемент Из СписокПлановОбмена Цикл - - ИмяПланаОбмена = Элемент.Значение; - - Если Метаданные.ПланыОбмена[ИмяПланаОбмена].РаспределеннаяИнформационнаяБаза Тогда - Продолжить; - КонецЕсли; - - МассивУзлов = ОбменДаннымиПовтИсп.УзлыПланаОбмена(ИмяПланаОбмена); - - Для Каждого Узел Из МассивУзлов Цикл - - ИменаРеквизитов = ОбщегоНазначения.ИменаРеквизитовПоТипу(Узел, Тип("ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена")); - - Если ПустаяСтрока(ИменаРеквизитов) Тогда - Продолжить; - КонецЕсли; - - ИменаРеквизитов = СтрЗаменить(ИменаРеквизитов, " ", ""); - - Реквизиты = СтрРазделить(ИменаРеквизитов, ","); - - ОбъектМодифицирован = Ложь; - - УзелОбъект = Узел.ПолучитьОбъект(); - - Для Каждого ИмяРеквизита Из Реквизиты Цикл - - Если Не ЗначениеЗаполнено(УзелОбъект[ИмяРеквизита]) Тогда - - УзелОбъект[ИмяРеквизита] = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию; - - ОбъектМодифицирован = Истина; - - КонецЕсли; - - КонецЦикла; - - Если ОбъектМодифицирован Тогда - - УзелОбъект.ДополнительныеСвойства.Вставить("ПолучениеСообщенияОбмена"); - УзелОбъект.Записать(); - - КонецЕсли; - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -// Обновляет данные регламентных заданий для всех сценариев обменов данных, кроме помеченных на удаление. -// -Процедура ОбновитьРегламентныеЗаданияСценариевОбменовДанными() Экспорт - - ТекстЗапроса = " - |ВЫБРАТЬ - | СценарииОбменовДанными.Ссылка - |ИЗ - | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными - |ГДЕ - | НЕ СценарииОбменовДанными.ПометкаУдаления - |"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - Отказ = Ложь; - - Объект = Выборка.Ссылка.ПолучитьОбъект(); - - Справочники.СценарииОбменовДанными.ОбновитьДанныеРегламентногоЗадания(Отказ, Неопределено, Объект); - - Если Отказ Тогда - ВызватьИсключение НСтр("ru = 'Ошибка при обновлении регламентного задания для сценария обмена данными.'"); - КонецЕсли; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - - КонецЦикла; - -КонецПроцедуры - -// Устанавливает значение константы НастройкаПодчиненногоУзлаРИБЗавершена в Истина для подчиненного узла РИБ, -// т.к. в базе уже настроен обмен в РИБ по факту. -// -Процедура ОбновитьКонстантуНастройкаПодчиненногоУзлаРИБЗавершена() Экспорт - - Если ЭтоПодчиненныйУзелРИБ() - И РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаДляУзлаЗаданы(ГлавныйУзел()) Тогда - - Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Установить(Истина); - - ОбновитьПовторноИспользуемыеЗначения(); - - КонецЕсли; - -КонецПроцедуры - -// Переустанавливает значение константы ИспользоватьСинхронизациюДанных при необходимости. -// -Процедура ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ() Экспорт - - Если Константы.ИспользоватьСинхронизациюДанных.Получить() Тогда - - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - - КонецЕсли; - -КонецПроцедуры - -// Переустанавливает значение константы ИспользоватьСинхронизациюДанных при необходимости. -// Т.к. константа стала неразделенной и ее значение сбросилось. -// -Процедура ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ_2_1_2_21() Экспорт - - Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - - Иначе - - Если ПолучитьИспользуемыеПланыОбмена().Количество() > 0 Тогда - - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -// Устанавливает количество элементов в транзакции загрузки данных равным единице. -// -Процедура УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных_2_2_2_4() Экспорт - - УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных(1); - -КонецПроцедуры - -// Устанавливает значение реквизита WSЗапомнитьПароль в РС.НастройкиТранспортаОбмена в значение Истина. -// -Процедура УстановитьПризнакСохраненияПароляДляОбменаЧерезИнтернет() Экспорт - - ТекстЗапроса = - "ВЫБРАТЬ - | НастройкиТранспортаОбмена.Узел КАК Узел - |ИЗ - | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена - |ГДЕ - | НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.WS)"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - // обновляем запись в РС - СтруктураЗаписи = Новый Структура; - СтруктураЗаписи.Вставить("Узел", Выборка.Узел); - СтруктураЗаписи.Вставить("WSЗапомнитьПароль", Истина); - РегистрыСведений.НастройкиТранспортаОбмена.ОбновитьЗапись(СтруктураЗаписи); - - КонецЦикла; - -КонецПроцедуры - -// Очищает сохраненные настройки общей формы СинхронизацияДанных. -// -Процедура СброситьНастройкиМонитораОбмена() Экспорт - - МассивНастроекФормы = Новый Массив; - МассивНастроекФормы.Добавить("/НастройкиФормы"); - МассивНастроекФормы.Добавить("/НастройкиОкна"); - МассивНастроекФормы.Добавить("/НастройкиОкнаВебКлиента"); - МассивНастроекФормы.Добавить("/ТекущиеДанные"); - - Для Каждого ЭлементФормы Из МассивНастроекФормы Цикл - ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.СинхронизацияДанных" + ЭлементФормы, Неопределено, Неопределено); - КонецЦикла; - -КонецПроцедуры - -// Предназначена для перевода паролей в безопасное хранилище. -// Используется в обработчике обновления ИБ. -Процедура ПеренестиПаролиВБезопасноеХранилище() Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | НастройкиТранспортаОбмена.Узел, - | НастройкиТранспортаОбмена.УдалитьCOMПарольПользователя, - | НастройкиТранспортаОбмена.УдалитьFTPСоединениеПароль, - | НастройкиТранспортаОбмена.УдалитьWSПароль, - | НастройкиТранспортаОбмена.УдалитьПарольАрхиваСообщенияОбмена - |ИЗ - | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена"; - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - Пока РезультатЗапроса.Следующий() Цикл - Если НЕ ПустаяСтрока(РезультатЗапроса.УдалитьCOMПарольПользователя) - ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьFTPСоединениеПароль) - ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьWSПароль) - ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьПарольАрхиваСообщенияОбмена) Тогда - НачатьТранзакцию(); - Попытка - УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьCOMПарольПользователя, "COMПарольПользователя"); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьFTPСоединениеПароль, "FTPСоединениеПароль"); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьWSПароль, "WSПароль"); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьПарольАрхиваСообщенияОбмена, "ПарольАрхиваСообщенияОбмен"); - УстановитьПривилегированныйРежим(Ложь); - НастройкиТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.СоздатьМенеджерЗаписи(); - НастройкиТранспортаОбмена.Узел = РезультатЗапроса.Узел; - НастройкиТранспортаОбмена.Прочитать(); - НастройкиТранспортаОбмена.УдалитьCOMПарольПользователя = ""; - НастройкиТранспортаОбмена.УдалитьFTPСоединениеПароль = ""; - НастройкиТранспортаОбмена.УдалитьWSПароль = ""; - НастройкиТранспортаОбмена.УдалитьПарольАрхиваСообщенияОбмена = ""; - НастройкиТранспортаОбмена.Записать(); - ЗафиксироватьТранзакцию(); - Исключение - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); - ОтменитьТранзакцию(); - КонецПопытки; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Выполняет выгрузку сообщения обмена, которое содержало -// изменения конфигурации, до обновления информационной базы. -// -Процедура ВыгрузитьСообщениеПослеОбновленияИнформационнойБазы() - - // После успешной загрузки и обновления ИБ режим повтора можно отключить. - ОтключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); - - Попытка - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда - - УзелИнформационнойБазы = ГлавныйУзел(); - - Если УзелИнформационнойБазы <> Неопределено Тогда - - ВыполнитьВыгрузку = Истина; - - НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспорта(УзелИнформационнойБазы); - - ВидТранспорта = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; - - Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS - И Не НастройкиТранспорта.WSЗапомнитьПароль Тогда - - ВыполнитьВыгрузку = Ложь; - - РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьПризнакОтправкиДанных(УзелИнформационнойБазы); - - КонецЕсли; - - Если ВыполнитьВыгрузку Тогда - - // Только выгрузка. - Отказ = Ложь; - - ПараметрыОбмена = ПараметрыОбмена(); - ПараметрыОбмена.ВидТранспортаСообщенийОбмена = ВидТранспорта; - ПараметрыОбмена.ВыполнятьЗагрузку = Ложь; - ПараметрыОбмена.ВыполнятьВыгрузку = Истина; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ПараметрыОбмена, Отказ); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиУсловныхВызововИзДругихПодсистем - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.СценарииОбменовДанными.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - #КонецОбласти #Область ПрогрессБар @@ -2125,11 +1667,14 @@ КонецЕсли; ФайлСДанными = Новый Файл(ИмяФайлаОбмена); - // Размер сразу переводим в мегабайты. - Результат.РазмерФайлаСообщенияОбмена = Окр(ФайлСДанными.Размер() / 1048576, 1); + Если Не ФайлСДанными.Существует() Тогда + Возврат Результат; + КонецЕсли; ФайлОбмена = Новый ЧтениеXML; Попытка + // Размер сразу переводим в мегабайты. + Результат.РазмерФайлаСообщенияОбмена = Окр(ФайлСДанными.Размер() / 1048576, 1); ФайлОбмена.ОткрытьФайл(ИмяФайлаОбмена); Исключение Возврат Результат; @@ -2191,6 +1736,7 @@ Возврат Результат; КонецФункции + // Рассчитывает процент выгрузки и записывает в виде сообщения пользователю. // // Параметры: @@ -2453,25 +1999,10 @@ Возврат Результат; КонецФункции -// Получает настройки прокси сервера. -// -Функция НастройкиПроксиСервера(ЗащищенноеСоединение) - - Прокси = Неопределено; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - Протокол = ?(ЗащищенноеСоединение = Неопределено, "ftp", "ftps"); - Прокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Протокол); - КонецЕсли; - - Возврат Прокси; - -КонецФункции - Функция ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла() Экспорт - Возврат Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто() + Возврат Не ОбщегоНазначения.РазделениеВключено() + И Не ЭтоАвтономноеРабочееМесто() И ЭтоПодчиненныйУзелРИБ() И Не Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Получить(); @@ -2492,6 +2023,7 @@ Функция ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов() Экспорт Запросы = Новый Массив; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл @@ -2511,15 +2043,15 @@ Пока Выборка.Следующий() Цикл - Запросы.Добавить(РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Выборка.Узел)); + Запросы.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Выборка.Узел)); КонецЦикла; КонецЦикла; - Запросы.Добавить(РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( + Запросы.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляLinux))); - Запросы.Добавить(РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( + Запросы.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов( ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляWindows))); Возврат Запросы; @@ -2557,107 +2089,6 @@ Возврат ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения, ФильтрВыборки); КонецФункции -// Определяет настройки по умолчанию для плана обмена, которые затем могут быть переопределены -// в модуле менеджера плана обмена в функции ОпределитьНастройки(). -// -// Возвращаемое значение: -// Структура - содержит поля: -// * ПредупреждатьОНесоответствииВерсийПравилОбмена - Булево - Признак необходимости проверки на -// расхождение версий в правилах конвертации. -// Проверка выполняется при загрузке комплекта -// правил, при отправке данных и при получении -// данных. -// * ПутьКФайлуКомплектаПравилНаПользовательскомСайте - Строка - Содержит путь к файлу комплекта правил в -// виде архива на пользовательском сайте в -// разделе конфигурации. -// * ПутьКФайлуКомплектаПравилВКаталогеШаблонов - Строка - Содержит относительный путь к файлу -// комплекта правил в каталоге шаблонов -// 1С:Предприятия. -// * ЗаголовокКомандыДляСозданияНовогоОбменаДанными - Строка - Содержит представление команды, выводимое в -// пользовательском интерфейсе при создании -// новой настройки обмена данными. -// * ЗаголовокПомощникаСозданияОбмена - Строка - Содержит представление заголовка формы -// помощника создания обмена данными выводимое -// в пользовательском интерфейсе. -// * ИмяПланаОбменаДляПереходаНаНовыйОбмен - Строка - Если для плана обмена свойство установлено, в -// рабочих местах управления настройками не будет -// предлагаться настроить этот вид обмена. -// Существующие обмены этого вида будут продолжать -// отображаться в списке настроенных обменов. -// Получении сообщения обмена в новом формате будет -// инициировать переход на новый вид обмена. -// * НаименованиеКонфигурацииКорреспондента - Строка - Содержит представление наименования -// конфигурации корреспондента выводимое в -// пользовательском интерфейсе. -// * ЗаголовокУзлаПланаОбмена - Строка - Содержит представление узла плана обмена -// выводимое в пользовательском интерфейсе. -// * ВариантыНастроекОбмена - Массив - Список возможных настроек плана обмена. -// Используется для создания заготовленных -// шаблонов с заполненным настройками планов -// обмена. -// * ОтображатьНастройкуОтборовНаУзле - Булево - Признак отображения настроек отборов на узле -// в помощнике создания обмена. -// * ОтображатьЗначенияПоУмолчаниюНаУзле - Булево - Признак отображения значений по умолчанию в -// помощнике создания обмена. -// * ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента - Булево - Признак отображения настроек отборов на узле -// базы-корреспондента в помощнике создания -// обмена. -// * ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента - Булево - Признак отображения значений по умолчанию -// базы-корреспондента в помощнике создания -// обмена. -// * ВидГруппыДляВариантовНастроек - ВидГруппыФормы - вариант вида группы для отображения в -// дереве команд создания обмена вариантов настроек. -// * НазначениеПланаОбмена - Строка - Вариант назначения плана обмена. -// * ОписанияВариантовНастроекОбмена - ТаблицаЗначений - определяет порядок использования вариантов -// настроек обмена в зависимости от вида корреспондента: -// *ИдентификаторНастройки - Строка - выбирается из -// перечня, заданного в ВариантыНастроекОбмена. -// *ИмяКорреспондента - Строка - выбирается исходя из -// значения, заданного в функции ИмяКонфигурацииИсточника -// модуля менеджера плана обмена на стороне корреспондента. -// В случае, если параметр не заполнен, функциональность -// вариантов настроек плана обмена при настройке -// синхронизации с другим приложением в сервисе -// не используется. -// -Функция НастройкиПланаОбменаПоУмолчанию(ИмяПланаОбмена) - - // Получаем значения по умолчанию для плана обмена. - МетаданныеПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена]; - - ЗаголовокФормыПомощника = НСтр("ru='Синхронизация данных с %Программа% (настройка)'"); - ЗаголовокФормыПомощника = СтрЗаменить(ЗаголовокФормыПомощника, "%Программа%", МетаданныеПланаОбмена.Синоним); - - Параметры = Новый Структура; - - Параметры.Вставить("ПредупреждатьОНесоответствииВерсийПравилОбмена", Истина); - Параметры.Вставить("ПутьКФайлуКомплектаПравилНаПользовательскомСайте", ""); - Параметры.Вставить("ПутьКФайлуКомплектаПравилВКаталогеШаблонов", ""); - Параметры.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", МетаданныеПланаОбмена.Синоним); - Параметры.Вставить("ЗаголовокПомощникаСозданияОбмена", ЗаголовокФормыПомощника); - Параметры.Вставить("ИмяПланаОбменаДляПереходаНаНовыйОбмен", ""); - Параметры.Вставить("НаименованиеКонфигурацииКорреспондента", МетаданныеПланаОбмена.Синоним); - Параметры.Вставить("ЗаголовокУзлаПланаОбмена", МетаданныеПланаОбмена.Синоним); - Параметры.Вставить("ВариантыНастроекОбмена", Новый Массив()); - Параметры.Вставить("ОтображатьНастройкуОтборовНаУзле", Истина); - Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзле", Истина); - Параметры.Вставить("ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента", Истина); - Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", Истина); - Параметры.Вставить("ЭтоПланОбменаXDTO", Ложь); - Параметры.Вставить("ВидГруппыДляВариантовНастроек", ВидГруппыФормы.Подменю); - Параметры.Вставить("НазначениеПланаОбмена", - ?(МетаданныеПланаОбмена.РаспределеннаяИнформационнаяБаза, "РИБ", "СинхронизацияСДругойПрограммой")); - - ОписанияВариантовНастроекОбмена = Новый ТаблицаЗначений; - ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка"); - ОписанияВариантовНастроекОбмена.Колонки.Добавить("ИдентификаторНастройки", ОписаниеТиповСтрока); - ОписанияВариантовНастроекОбмена.Колонки.Добавить("ИмяКорреспондента", ОписаниеТиповСтрока); - Параметры.Вставить("ОписанияВариантовНастроекОбмена", ОписанияВариантовНастроекОбмена); - - Возврат Параметры; - -КонецФункции - // Получает значение настройки плана обмена по ее имени. // Для несуществующих параметров возвращается Неопределено. // @@ -2824,10 +2255,10 @@ МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - ПолучитьТаблицуПлановОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена, ДополнительныеСвойстваПланаОбмена); - ПолучитьТаблицуРезультатовОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена); + ПолучитьПланыОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена, ДополнительныеСвойстваПланаОбмена); + ПолучитьРезультатыОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ДополнительныеСвойстваПланаОбмена]", ПолучитьДополнительныеСвойстваПланаОбменаСтрокой(ДополнительныеСвойстваПланаОбмена)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой(ДополнительныеСвойстваПланаОбмена)); Если ТолькоОшибочные Тогда Отбор = " @@ -3121,12 +2552,6 @@ КонецФункции -Функция ПолноеИмяФайлаДанныхОтложенногоОбновления() - - Возврат ПолучитьИмяВременногоФайла(".xml"); - -КонецФункции - // Процедура удаления существующих движений документа при перепроведении (отмене проведения). // // Параметры: @@ -3235,33 +2660,187 @@ КонецПроцедуры -#КонецОбласти +// Возвращает признак необходимости загрузки сообщения обмена данными. +// +// Возвращаемое значение: +// Булево - если Истина, то необходимо загрузить сообщение; Ложь - нет. +// +Функция ЗагрузитьСообщениеОбменаДанными() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.ЗагрузитьСообщениеОбменаДанными.Получить(); + +КонецФункции + +// Предназначена для перевода паролей в безопасное хранилище. +// Используется в обработчике обновления ИБ. +Процедура ПеренестиПаролиВБезопасноеХранилище() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | НастройкиТранспортаОбмена.Узел, + | НастройкиТранспортаОбмена.УдалитьCOMПарольПользователя, + | НастройкиТранспортаОбмена.УдалитьFTPСоединениеПароль, + | НастройкиТранспортаОбмена.УдалитьWSПароль, + | НастройкиТранспортаОбмена.УдалитьПарольАрхиваСообщенияОбмена + |ИЗ + | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена"; + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + Пока РезультатЗапроса.Следующий() Цикл + Если НЕ ПустаяСтрока(РезультатЗапроса.УдалитьCOMПарольПользователя) + ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьFTPСоединениеПароль) + ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьWSПароль) + ИЛИ НЕ ПустаяСтрока(РезультатЗапроса.УдалитьПарольАрхиваСообщенияОбмена) Тогда + НачатьТранзакцию(); + Попытка + УстановитьПривилегированныйРежим(Истина); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьCOMПарольПользователя, "COMПарольПользователя"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьFTPСоединениеПароль, "FTPСоединениеПароль"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьWSПароль, "WSПароль"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РезультатЗапроса.Узел, РезультатЗапроса.УдалитьПарольАрхиваСообщенияОбмена, "ПарольАрхиваСообщенияОбмен"); + УстановитьПривилегированныйРежим(Ложь); + НастройкиТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.СоздатьМенеджерЗаписи(); + НастройкиТранспортаОбмена.Узел = РезультатЗапроса.Узел; + НастройкиТранспортаОбмена.Прочитать(); + НастройкиТранспортаОбмена.УдалитьCOMПарольПользователя = ""; + НастройкиТранспортаОбмена.УдалитьFTPСоединениеПароль = ""; + НастройкиТранспортаОбмена.УдалитьWSПароль = ""; + НастройкиТранспортаОбмена.УдалитьПарольАрхиваСообщенияОбмена = ""; + НастройкиТранспортаОбмена.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); + ОтменитьТранзакцию(); + КонецПопытки; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры #КонецОбласти -#Область СлужебныеПроцедурыИФункции +#Область ОбработчикиСобытийПодсистемКонфигурации -#Область ОбработчикиСобытийПодсистемБСП +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") + Или ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Приоритет = 1; + Обработчик.ОбщиеДанные = Истина; + Обработчик.МонопольныйРежим = Ложь; + Обработчик.Процедура = "ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.1.2"; + Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.1.2"; + Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьРежимВыгрузкиОбъектовДляВсехУзловИнформационнойБазы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.1.2"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "ОбменДаннымиСервер.ОбновитьРегламентныеЗаданияСценариевОбменовДанными"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.1.2.0"; + Обработчик.Процедура = "ОбменДаннымиСервер.ОбновитьКонстантуНастройкаПодчиненногоУзлаРИБЗавершена"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.0.1.10"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "ОбменДаннымиСервер.ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.1.5"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьПризнакСохраненияПароляДляОбменаЧерезИнтернет"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.2.12"; + Обработчик.Процедура = "ОбменДаннымиСервер.СброситьНастройкиМонитораОбмена"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.2.21"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "ОбменДаннымиСервер.ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ_2_1_2_21"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.2.4"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных_2_2_2_4"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "ОбменДаннымиСервер.УдалитьРольНастройкаСинхронизацииДанных"; + Обработчик.РежимВыполнения = "Оперативно"; + +КонецПроцедуры -// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию подсистем, -// используя в качестве ключей названия подсистем. -// Обеспечивает функциональность Web-сервиса InterfaceVersion. -// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). -// -// Параметры: -// СтруктураПоддерживаемыхВерсий - Структура: -// - Ключи = Названия подсистем. -// - Значения = Массивы названий поддерживаемых версий. -// -// Пример реализации: -// -// // СервисПередачиФайлов -// МассивВерсий = Новый Массив; -// МассивВерсий.Добавить("1.0.1.1"); -// МассивВерсий.Добавить("1.0.2.1"); -// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); -// // Конец СервисПередачиФайлов -// +// См. ОбновлениеИнформационнойБазыБСП.ПередОбновлениемИнформационнойБазы. +Процедура ПередОбновлениемИнформационнойБазы(ПриЗапускеКлиентскогоПриложения, Перезапустить) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + Если НЕ ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда + ВыполнитьСинхронизациюПриОтсутствииОбновленияИнформационнойБазы(ПриЗапускеКлиентскогоПриложения, Перезапустить); + Иначе + ЗагрузитьСообщениеПередОбновлениемИнформационнойБазы(); + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. +Процедура ПослеОбновленияИнформационнойБазы() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ЗарегистрироватьОбновлениеДанныхИнформационнойБазы(); + + ВыгрузитьСообщениеПослеОбновленияИнформационнойБазы(); + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.СценарииОбменовДанными.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда + Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт + + Обработчики.Вставить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПравилаВыборочнойРегистрацииОбъектов", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПравилаРегистрацииОбъектов", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПаролиСинхронизацииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПриоритетныеДанныеОбмена", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ОшибкаРасхожденияВерсийПриПолученииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПараметрыСеансаСинхронизацииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт МассивВерсий = Новый Массив; @@ -3271,8 +2850,7 @@ КонецПроцедуры -// Добавляет параметры работы клиентской логики для подсистемы обмена данными. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -3301,27 +2879,7 @@ КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). -// -Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - - Библиотека = "СтандартныеПодсистемы"; - - ОбщегоНазначения.ДобавитьПереименование( - Итог, "2.1.2.5", "Роль.ВыполнениеОбменовДанными", "Роль.ВыполнениеСинхронизацииДанных", Библиотека); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -3330,20 +2888,7 @@ КонецПроцедуры -// Вызывается при включении разделения данных по областям данных. -// -Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - - Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - КонецЕсли; - -КонецПроцедуры - -// Заполняет описания поставляемых профилей групп доступа и -// переопределяет параметры обновления профилей и групп доступа. -// Подробнее см. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт // Профиль "Синхронизация данных с другими программами". @@ -3365,25 +2910,46 @@ КонецПроцедуры -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + ПриЗаполненииСпискаТекущихДелПредупрежденияСинхронизации(ТекущиеДела); + ПриЗаполненииСпискаТекущихДелНеобходимоОбновление(ТекущиеДела); + ПриЗаполненииСпискаТекущихДелПроверитьСовместимостьСТекущейВерсией(ТекущиеДела); + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации; + Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюДанных; + Зависимость.РаботаетСВнешнимиРесурсами = Истина; + + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияДанных; + Зависимость.РаботаетСВнешнимиРесурсами = Истина; + Зависимость.Параметризуется = Истина; +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт + + Библиотека = "СтандартныеПодсистемы"; + + ОбщегоНазначения.ДобавитьПереименование( + Итог, "2.1.2.5", "Роль.ВыполнениеОбменовДанными", "Роль.ВыполнениеСинхронизацииДанных", Библиотека); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт Массив.Добавить(Метаданные.РегистрыСведений.РезультатыОбменаДанными.ПолноеИмя()); КонецПроцедуры -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда @@ -3394,184 +2960,19 @@ КонецПроцедуры -// Вызывается при регистрации менеджеров внешних модулей. -// -// Параметры: -// Менеджеры - Массив(ОбщийМодуль). -// +// См. ИнтеграцияСтандартныхПодсистем.ПриРегистрацииМенеджеровВнешнихМодулей. Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт Менеджеры.Добавить(ОбменДаннымиСервер); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - ПриЗаполненииСпискаТекущихДелПредупрежденияСинхронизации(ТекущиеДела); - ПриЗаполненииСпискаТекущихДелНеобходимоОбновление(ТекущиеДела); - ПриЗаполненииСпискаТекущихДелПроверитьСовместимостьСТекущейВерсией(ТекущиеДела); - -КонецПроцедуры +#КонецОбласти #КонецОбласти -#Область ОбработчикиУсловныхВызововИзДругихПодсистем +#Область СлужебныеПроцедурыИФункции -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// -Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт - - Обработчики.Вставить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - - Обработчики.Вставить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПравилаВыборочнойРегистрацииОбъектов", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПравилаРегистрацииОбъектов", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПаролиСинхронизацииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПриоритетныеДанныеОбмена", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ОшибкаРасхожденияВерсийПриПолученииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПараметрыСеансаСинхронизацииДанных", "ОбменДаннымиВызовСервера.УстановкаПараметровСеанса"); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиУсловныхВызововВДругиеПодсистемы - -// Определяет используется ли в конфигурации групповое изменение объектов. -// -// Параметры: -// Используется - Булево - Истина, если используется, Ложь - иначе. -// -Процедура ПриОпределенииИспользованияГрупповогоИзмененияОбъектов(Используется) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда - Используется = Истина; - КонецЕсли; - -КонецПроцедуры - -// Определяет используется ли в конфигурации подсистема даты запрета изменения. -// -// Параметры: -// Используется - Булево - Истина, если используется, Ложь - иначе. -// -Процедура ПриОпределенииИспользованияДатЗапретаИзменения(Используется) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - Используется = Истина; - КонецЕсли; - -КонецПроцедуры - -// Устанавливает признак игнорирования версии объекта. -// -// Параметры: -// Ссылка - Ссылка на игнорируемый объект. -// НомерВерсии - Число - Номер версии игнорируемого объекта. -// Игнорировать - Булево Признак игнорирования версии. -// -Процедура ПриИгнорированииВерсииОбъекта(Ссылка, НомерВерсии, Игнорировать) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ИгнорироватьВерсиюОбъекта(Ссылка, НомерВерсии, Игнорировать); - КонецЕсли; - -КонецПроцедуры - -// Обработчик перехода на версию объекта. -// -// Параметры: -// ОбъектСсылка - Ссылка - Ссылка на объект, для которого имеется версия. -// НомерВерсииДляПерехода - Число - Номер версии, на которую необходимо выполнить переход. -// НомерИгнорируемойВерсии - Число - Номер версии, на которую необходимо проигнорировать. -// ПропуститьПроверкуЗапретаИзменения - Булево - Признак пропуска проверки даты запрета загрузки. -// -Процедура ПриПереходеНаВерсиюОбъекта(ОбъектСсылка, НомерВерсии) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ОбъектСсылка, НомерВерсии); - КонецЕсли; - -КонецПроцедуры - -// Обработчик установки константы ИспользоватьСинхронизациюДанных. -// -// Параметры: -// Отказ - Булево. Флаг отказа включения синхронизации данных. -// Если установить в значение Истина, то синхронизация включена не будет. -// -Процедура ПриВключенииСинхронизацииДанных(Отказ) Экспорт - - Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации); - - Если Не Задание.Использование Тогда - Задание.Использование = Истина; - Задание.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Обработчик снятия константы ИспользоватьСинхронизациюДанных. -// -// Параметры: -// Отказ - Булево. Флаг отказа отключения синхронизации данных. -// Если установить в значение Истина, то синхронизация отключена не будет. -// -Процедура ПриОтключенииСинхронизацииДанных(Отказ) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); - МодульОбменДаннымиВМоделиСервиса.ПриОтключенииСинхронизацииДанных(Отказ); - КонецЕсли; - - Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации); - - Если Задание.Использование Тогда - Задание.Использование = Ложь; - Задание.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Обработчик механизма регистрации объектов "После определения получателей". -// Событие возникает в транзакции записи данных в ИБ, когда определены -// получатели изменений данных по правилам регистрации объектов. -// -// Параметры: -// Данные. Записываемый объект, представляющий данные - документ, элемент справочника, -// счет бухгалтерского учета, менеджер записи константы, набор записей регистра и т. п. -// Получатели - Массив - Массив узлов планов обмена на которых будут зарегистрированы изменения текущих данных. -// ИмяПланаОбмена - Строка - Имя плана обмена, как объекта метаданных, -// для которого выполняются правила регистрации объектов. -// -Процедура ПослеОпределенияПолучателей(Данные, Получатели, Знач ИмяПланаОбмена) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); - МодульОбменДаннымиВМоделиСервиса.ПослеОпределенияПолучателей(Данные, Получатели, ИмяПланаОбмена); - КонецЕсли; - -КонецПроцедуры - -// Обработчик пропуска проверки даты запрета изменения. -// Процедура ПропуститьПроверкуЗапретаИзменения(Пропустить = Истина) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда @@ -3583,14 +2984,258 @@ Процедура ПриПродолженииНастройкиПодчиненногоУзлаРИБ() Экспорт - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбменДанными\ПриНастройкеПодчиненногоУзлаРИБ"); + ИнтеграцияСтандартныхПодсистем.ПриНастройкеПодчиненногоУзлаРИБ(); + ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ(); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриНастройкеПодчиненногоУзлаРИБ(); +КонецПроцедуры + +#Область ОбновлениеИнформационнойБазы + +// Выполняет обновление правил конвертации/регистрации объектов. +// Обновление выполняется для всех планов обмена, подключенных к подсистеме. +// Обновление правил выполняется только для типовых правил. +// Если для плана обмена правила были загружены из файла, то такие правила не обновляются. +// +Процедура ВыполнитьОбновлениеПравилДляОбменаДанными() Экспорт + + Если Не Константы.ИспользоватьСинхронизациюДанных.Получить() + И Не ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + // Для сценария, когда в конфигурации был удален или переименован план обмена. + УдалитьНеактуальныеЗаписиВРегистреПравилДляОбменаДанными(); + + ПравилаОбменаЗагруженныеИзФайла = Новый Массив; + ПравилаРегистрацииЗагруженныеИзФайла = Новый Массив; + + ВыполнитьПроверкуНаличияПравилОбменаЗагруженныхИзФайла(ПравилаОбменаЗагруженныеИзФайла, ПравилаРегистрацииЗагруженныеИзФайла); + ВыполнитьОбновлениеВерсииТиповыхПравилДляОбменаДанными(ПравилаОбменаЗагруженныеИзФайла, ПравилаРегистрацииЗагруженныеИзФайла); + +КонецПроцедуры + +// Устанавливает признак того, что для всех узлов планов обмена необходимо выполнить процедуру +// корректировки информации сопоставления при следующем обмене данными. +// +Процедура УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы() Экспорт + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьНеобходимостьВыполненияКорректировкиИнформацииСопоставленияДляВсехУзловИнформационнойБазы(); + +КонецПроцедуры + +// Устанавливает для всех узлов универсального обмена данными значения реквизитов-флагов режимов выгрузки значение +// "Выгружать по условию". +// +Процедура УстановитьРежимВыгрузкиОбъектовДляВсехУзловИнформационнойБазы() Экспорт + + СписокПлановОбмена = ОбменДаннымиПовтИсп.СписокПлановОбменаБСП(); + + Для Каждого Элемент Из СписокПлановОбмена Цикл + + ИмяПланаОбмена = Элемент.Значение; + + Если Метаданные.ПланыОбмена[ИмяПланаОбмена].РаспределеннаяИнформационнаяБаза Тогда + Продолжить; + КонецЕсли; + + МассивУзлов = ОбменДаннымиПовтИсп.УзлыПланаОбмена(ИмяПланаОбмена); + + Для Каждого Узел Из МассивУзлов Цикл + + ИменаРеквизитов = ОбщегоНазначения.ИменаРеквизитовПоТипу(Узел, Тип("ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена")); + + Если ПустаяСтрока(ИменаРеквизитов) Тогда + Продолжить; + КонецЕсли; + + ИменаРеквизитов = СтрЗаменить(ИменаРеквизитов, " ", ""); + + Реквизиты = СтрРазделить(ИменаРеквизитов, ","); + + ОбъектМодифицирован = Ложь; + + УзелОбъект = Узел.ПолучитьОбъект(); + + Для Каждого ИмяРеквизита Из Реквизиты Цикл + + Если Не ЗначениеЗаполнено(УзелОбъект[ИмяРеквизита]) Тогда + + УзелОбъект[ИмяРеквизита] = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию; + + ОбъектМодифицирован = Истина; + + КонецЕсли; + + КонецЦикла; + + Если ОбъектМодифицирован Тогда + + УзелОбъект.ДополнительныеСвойства.Вставить("ПолучениеСообщенияОбмена"); + УзелОбъект.Записать(); + + КонецЕсли; + + КонецЦикла; + КонецЦикла; - ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ(); +КонецПроцедуры + +// Обновляет данные регламентных заданий для всех сценариев обменов данных, кроме помеченных на удаление. +// +Процедура ОбновитьРегламентныеЗаданияСценариевОбменовДанными() Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ + | СценарииОбменовДанными.Ссылка + |ИЗ + | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными + |ГДЕ + | НЕ СценарииОбменовДанными.ПометкаУдаления + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Отказ = Ложь; + + Объект = Выборка.Ссылка.ПолучитьОбъект(); + + Справочники.СценарииОбменовДанными.ОбновитьДанныеРегламентногоЗадания(Отказ, Неопределено, Объект); + + Если Отказ Тогда + ВызватьИсключение НСтр("ru = 'Ошибка при обновлении регламентного задания для сценария обмена данными.'"); + КонецЕсли; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + + КонецЦикла; + +КонецПроцедуры + +// Устанавливает значение константы НастройкаПодчиненногоУзлаРИБЗавершена в Истина для подчиненного узла РИБ, +// т.к. в базе уже настроен обмен в РИБ по факту. +// +Процедура ОбновитьКонстантуНастройкаПодчиненногоУзлаРИБЗавершена() Экспорт + + Если ЭтоПодчиненныйУзелРИБ() + И РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаДляУзлаЗаданы(ГлавныйУзел()) Тогда + + Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Установить(Истина); + + ОбновитьПовторноИспользуемыеЗначения(); + + КонецЕсли; + +КонецПроцедуры + +// Переустанавливает значение константы ИспользоватьСинхронизациюДанных при необходимости. +// +Процедура ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ() Экспорт + + Если Константы.ИспользоватьСинхронизациюДанных.Получить() Тогда + + Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); + + КонецЕсли; + +КонецПроцедуры + +// Переустанавливает значение константы ИспользоватьСинхронизациюДанных при необходимости. +// Т.к. константа стала неразделенной и ее значение сбросилось. +// +Процедура ПроверитьУстановкуФункциональныхОпцийПриОбновленииИБ_2_1_2_21() Экспорт + + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда + + Если ОбщегоНазначения.РазделениеВключено() Тогда + + Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); + + Иначе + + Если ПолучитьИспользуемыеПланыОбмена().Количество() > 0 Тогда + + Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Устанавливает количество элементов в транзакции загрузки данных равным единице. +// +Процедура УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных_2_2_2_4() Экспорт + + УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных(1); + +КонецПроцедуры + +// Устанавливает значение реквизита WSЗапомнитьПароль в РС.НастройкиТранспортаОбмена в значение Истина. +// +Процедура УстановитьПризнакСохраненияПароляДляОбменаЧерезИнтернет() Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | НастройкиТранспортаОбмена.Узел КАК Узел + |ИЗ + | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена + |ГДЕ + | НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.WS)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + // обновляем запись в РС + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("Узел", Выборка.Узел); + СтруктураЗаписи.Вставить("WSЗапомнитьПароль", Истина); + РегистрыСведений.НастройкиТранспортаОбмена.ОбновитьЗапись(СтруктураЗаписи); + + КонецЦикла; + +КонецПроцедуры + +// Очищает сохраненные настройки общей формы СинхронизацияДанных. +// +Процедура СброситьНастройкиМонитораОбмена() Экспорт + + МассивНастроекФормы = Новый Массив; + МассивНастроекФормы.Добавить("/НастройкиФормы"); + МассивНастроекФормы.Добавить("/НастройкиОкна"); + МассивНастроекФормы.Добавить("/НастройкиОкнаВебКлиента"); + МассивНастроекФормы.Добавить("/ТекущиеДанные"); + + Для Каждого ЭлементФормы Из МассивНастроекФормы Цикл + ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.СинхронизацияДанных" + ЭлементФормы, Неопределено, Неопределено); + КонецЦикла; + +КонецПроцедуры + +// Удаляет роль НастройкаСинхронизацииДанных из всех профилей, в которые она входит. +Процедура УдалитьРольНастройкаСинхронизацииДанных() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + НовыеРоли = Новый Массив; + ЗаменяемыеРоли = Новый Соответствие; + ЗаменяемыеРоли.Вставить("? НастройкаСинхронизацииДанных", НовыеРоли); + + МодульУправлениеДоступом.ЗаменитьРолиВПрофилях(ЗаменяемыеРоли); КонецПроцедуры @@ -3668,7 +3313,7 @@ И ОбменДаннымиВызовСервера.ТребуетсяУстановкаОбновления(); Пока Выборка.Следующий() Цикл - ОтказПоСтрокеСценария = Ложь; + Если ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Выборка.УзелИнформационнойБазы) Тогда // Обмен по расписанию не выполняется. @@ -3681,13 +3326,13 @@ КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(Выборка.ВыполняемоеДействие); - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(ОтказПоСтрокеСценария, Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, КоличествоЭлементовВТранзакции); + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, КоличествоЭлементовВТранзакции); ИначеЕсли Выборка.ОбменЧерезВебСервис Тогда ПараметрыОбмена = ПараметрыОбмена(); ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Выборка.УзелИнформационнойБазы, - Выборка.ВыполняемоеДействие, ПараметрыОбмена, ОтказПоСтрокеСценария); + Выборка.ВыполняемоеДействие, ПараметрыОбмена, Отказ); Иначе @@ -3697,7 +3342,7 @@ // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". Если СтруктураНастроекОбмена.Отказ Тогда - ОтказПоСтрокеСценария = Истина; + Отказ = Истина; // Фиксируем в ЖР лог по обмену данными. ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); @@ -3720,14 +3365,12 @@ Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - ОтказПоСтрокеСценария = Истина; + Отказ = Истина; КонецЕсли; КонецЕсли; - Если ОтказПоСтрокеСценария Тогда - Отказ = Истина; - КонецЕсли; + КонецЦикла; КонецПроцедуры @@ -3740,8 +3383,7 @@ // Процедура ВыполнитьОбменДаннымиПоРегламентномуЗаданию(КодСценарияОбмена) Экспорт - // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, - // т.к. необходимые действия выполняются в частном порядке. + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияДанных); ПроверитьВозможностьВыполненияОбменов(); @@ -3876,7 +3518,7 @@ ТекущийУзелПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена); КодТекущегоУзлаПланаОбмена = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийУзелПланаОбмена, "Код"); - ШаблонИмениФайлаСообщения = ПолучитьШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); + ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); // Параметры, которые будут определены в функции. ДатаФайлаСообщенияОбмена = Дата('00010101'); @@ -3908,7 +3550,7 @@ // Добавляем две записи в ЖР: одну для загрузки данных, другую для выгрузки данных. СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ДанныеСоединения.ПодробноеОписаниеОшибки); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); @@ -3992,7 +3634,7 @@ СтрокаСообщенияОбОшибке = ""; // Получаем прокси веб-сервиса для узла информационной базы. - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке, ПараметрыАутентификации); + Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке, ПараметрыАутентификации); Если Прокси = Неопределено Тогда @@ -4000,7 +3642,7 @@ Сообщение = НСтр("ru = 'Ошибка при установке подключения ко второй информационной базе: %1'"); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, СтрокаСообщенияОбОшибке); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; @@ -4022,7 +3664,7 @@ Сообщение = НСтр("ru = 'При выгрузке данных возникли ошибки во второй информационной базе: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; @@ -4030,7 +3672,7 @@ Если ДлительнаяОперация Тогда СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание получения данных от базы-корреспондента...'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), СтруктураНастроекОбмена); Возврат Результат; @@ -4044,7 +3686,7 @@ Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; @@ -4057,13 +3699,13 @@ Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; КонецПопытки; - ШаблонИмениФайлаСообщения = ПолучитьШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); + ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); @@ -4125,7 +3767,7 @@ Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; @@ -4138,7 +3780,7 @@ Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); Возврат Результат; @@ -4147,7 +3789,7 @@ ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); ТекущийУзелПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена); - ШаблонИмениФайлаСообщения = ПолучитьШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); + ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); @@ -4314,42 +3956,59 @@ КонецФункции -// Заполняет настройку обмена КаталогСбораИнформацииОбОбменах из параметров запуска. -Процедура УстановитьНастройкуКаталогСбораИнформацииОбОбменах(СтруктураНастроекОбмена) - // Каталог сбора информации об обменах. - ПараметрЗапускаКлиента = ""; +// Выполняет выгрузку сообщения обмена, которое содержало +// изменения конфигурации, до обновления информационной базы. +// +Процедура ВыгрузитьСообщениеПослеОбновленияИнформационнойБазы() + + // После успешной загрузки и обновления ИБ режим повтора можно отключить. + ОтключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); + Попытка - ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); - Исключение - // Параметр может быть не инициализирован - это не ошибка. - Возврат; - КонецПопытки; - Если ЗначениеЗаполнено(ПараметрЗапускаКлиента) Тогда - СтруктураПараметровЗапуска = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(ПараметрЗапускаКлиента); - КаталогСбораИнформацииОбОбменах = ""; - Если СтруктураПараметровЗапуска.Свойство("КаталогСбораИнформацииОбОбменах", КаталогСбораИнформацииОбОбменах) Тогда - СтруктураНастроекОбмена.КаталогСбораИнформацииОбОбменах = КаталогСбораИнформацииОбОбменах; + Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда + + УзелИнформационнойБазы = ГлавныйУзел(); + + Если УзелИнформационнойБазы <> Неопределено Тогда + + ВыполнитьВыгрузку = Истина; + + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспорта(УзелИнформационнойБазы); + + ВидТранспорта = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; + + Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS + И Не НастройкиТранспорта.WSЗапомнитьПароль Тогда + + ВыполнитьВыгрузку = Ложь; + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьПризнакОтправкиДанных(УзелИнформационнойБазы); + + КонецЕсли; + + Если ВыполнитьВыгрузку Тогда + + // Только выгрузка. + Отказ = Ложь; + + ПараметрыОбмена = ПараметрыОбмена(); + ПараметрыОбмена.ВидТранспортаСообщенийОбмена = ВидТранспорта; + ПараметрыОбмена.ВыполнятьЗагрузку = Ложь; + ПараметрыОбмена.ВыполнятьВыгрузку = Истина; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ПараметрыОбмена, Отказ); + + КонецЕсли; + + КонецЕсли; + КонецЕсли; - КонецЕсли; -КонецПроцедуры - -// Создает копию файла сообщения обмена при загрузке в каталог КаталогСбораИнформацииОбОбменах. -Процедура СоздатьКопиюФайлаСообщенияОбмена(СтруктураНастроекОбмена, ИмяФайлаСообщенияОбмена) - Если НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.КаталогСбораИнформацииОбОбменах) Тогда - Возврат; - КонецЕсли; - // Имя вложенного каталога по настройкам обмена. - ИмяПодкаталога1 = СтруктураНастроекОбмена.ИмяПланаОбмена + "_" - + СтруктураНастроекОбмена.УзелИнформационнойБазыКод; - ИмяПодкаталога2 = Формат(СтруктураНастроекОбмена.ДатаНачала,"ДЛФ=ДВ"); - ПолныйПутьКФайлу = СтруктураНастроекОбмена.КаталогСбораИнформацииОбОбменах + "\" + ИмяПодкаталога1 + "\" - + ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяПодкаталога2, "_"); - КраткоеИмяФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяФайлаСообщенияОбмена).Имя; - ВложенныйКаталог = Новый Файл(ПолныйПутьКФайлу); - Если НЕ ВложенныйКаталог.Существует() Тогда - СоздатьКаталог(ПолныйПутьКФайлу); - КонецЕсли; - КопироватьФайл(ИмяФайлаСообщенияОбмена, ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ПолныйПутьКФайлу, КраткоеИмяФайла)); + + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецПроцедуры #КонецОбласти @@ -4612,7 +4271,7 @@ СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазыНаименование", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелИнформационнойБазы, "Наименование")); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("КлючСообщенияЖурналаРегистрации", ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("КлючСообщенияЖурналаРегистрации", КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбмена", Неопределено); СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбменаСтрокой", ""); @@ -4648,7 +4307,7 @@ УстановитьПривилегированныйРежим(Истина); - Возврат РегистрыСведений.ПравилаДляОбменаДанными.ПолучитьЗачитанныеПравилаКонвертацииОбъектов(ИмяПланаОбмена, ПолучатьПравилаКорреспондента); + Возврат РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(ИмяПланаОбмена, ПолучатьПравилаКорреспондента); КонецФункции @@ -4691,7 +4350,7 @@ СтрокаСообщенияОбОшибке = ""; // Получаем прокси веб-сервиса для узла информационной базы. - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы( + Прокси = WSПроксиДляУзлаИнформационнойБазы( УзелИнформационнойБазы, СтрокаСообщенияОбОшибке, ПараметрыОбмена.ПараметрыАутентификации); @@ -4757,7 +4416,7 @@ Если СтандартнаяОбработка Тогда Попытка - Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда + Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(СообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда УдалитьФайлы(ФайлСообщенияОбмена); КонецЕсли; Исключение @@ -4772,7 +4431,7 @@ СтрокаСообщенияОбОшибке = ""; // Получаем прокси веб-сервиса для узла информационной базы. - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы( + Прокси = WSПроксиДляУзлаИнформационнойБазы( УзелИнформационнойБазы, СтрокаСообщенияОбОшибке, ПараметрыОбмена.ПараметрыАутентификации); @@ -4808,7 +4467,7 @@ СтрокаСообщенияОбОшибке = ""; // Получаем прокси веб-сервиса для узла информационной базы. - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы( + Прокси = WSПроксиДляУзлаИнформационнойБазы( УзелИнформационнойБазы, СтрокаСообщенияОбОшибке, ПараметрыОбмена.ПараметрыАутентификации); @@ -4919,7 +4578,7 @@ УстановитьПривилегированныйРежим(Истина); // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = ПолучитьСтруктуруНастроекОбменаДляВнешнегоСоединения( + СтруктураНастроекОбмена = НастройкиОбменаДляВнешнегоСоединения( УзелИнформационнойБазы, ДействиеПриОбмене, КоличествоЭлементовВТранзакции); @@ -5267,23 +4926,16 @@ Если ЭтоПодчиненныйУзелРИБ() И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда - СохраненноеСообщениеОбмена = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); + СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("ДвоичныеДанные") Тогда - - СтандартнаяОбработка = Ложь; - - СообщениеОбмена = ПолучитьИмяВременногоФайла("xml"); - - СохраненноеСообщениеОбмена.Записать(СообщениеОбмена); - - ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); - - УстановитьПривилегированныйРежим(Истина); - УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Истина); - УстановитьПривилегированныйРежим(Ложь); - - ИначеЕсли ТипЗнч(СохраненноеСообщениеОбмена) = Тип("Структура") Тогда + // Приведение к новому формату хранения и повторное зачитывание + // значения константы СообщениеОбменаДаннымиИзГлавногоУзла. + УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СохраненноеСообщениеОбмена, Получатель); + СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); + КонецЕсли; + + Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("Структура") Тогда СтандартнаяОбработка = Ложь; @@ -5354,7 +5006,7 @@ Если ОбновитьСообщениеВКэше Тогда - СтароеСообщение = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); + СтароеСообщение = СообщениеОбменаДаннымиИзГлавногоУзла(); ОбновитьКэш = Ложь; НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); @@ -5386,7 +5038,7 @@ КонецЕсли; - Если СообщениеПрочитано И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если СообщениеПрочитано И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ВыполнитьОбработчики(Получатель, "ПослеПолученияДанных"); КонецЕсли; @@ -5483,6 +5135,7 @@ ТекстовыйФайл = Новый ТекстовыйДокумент; ТекстовыйФайл.Прочитать(ИмяФайлаСообщенияОбмена, КодировкаТекста.UTF8); СообщениеОбмена = ТекстовыйФайл.ПолучитьТекст(); + УдалитьФайлы(ИмяФайлаСообщенияОбмена); КонецЕсли; СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); @@ -5526,7 +5179,6 @@ // Процедура ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, Знач ИмяФайлаСообщенияОбмена = "", СообщениеОбмена = "", Знач ТолькоПараметры = Ложь) - СоздатьКопиюФайлаСообщенияОбмена(СтруктураНастроекОбмена, ИмяФайлаСообщенияОбмена); Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда // Обмен в РИБ Отказ = Ложь; @@ -5987,6 +5639,12 @@ #Область ФункцииСвойства +Функция ПолноеИмяФайлаДанныхОтложенногоОбновления() + + Возврат ПолучитьИмяВременногоФайла(".xml"); + +КонецФункции + // Возвращает имя файла сообщения обмена данными по данным узла-отправителя и узла-получателя. // Функция ИмяФайлаСообщенияОбмена(КодУзлаОтправителя, КодУзлаПолучателя) @@ -6200,6 +5858,20 @@ КонецПроцедуры +// Получает настройки прокси сервера. +// +Функция НастройкиПроксиСервера(ЗащищенноеСоединение) + + Прокси = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); + Протокол = ?(ЗащищенноеСоединение = Неопределено, "ftp", "ftps"); + Прокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Протокол); + КонецЕсли; + + Возврат Прокси; + +КонецФункции #КонецОбласти #Область СервисПередачиФайлов @@ -6219,7 +5891,7 @@ // Возвращаемое значение функции. ИмяФайлаРезультата = ""; - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); + Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); ОбменВыполняетсяВОднойСети = ОбменДаннымиПовтИсп.ОбменВыполняетсяВОднойЛокальнойСети(УзелИнформационнойБазы, ПараметрыАутентификации); @@ -6245,7 +5917,7 @@ // Протоколирование событий обмена. СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Начало получения сообщения обмена из Интернета (количество частей файла %1).'"), @@ -6299,11 +5971,7 @@ Файл = Новый Файл(ИмяФайла); - ВременныйКаталог = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременныйКаталог); - - ИмяФайлаРезультата = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, Файл.Имя); - + ИмяФайлаРезультата = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов(), Файл.Имя); ПереместитьФайл(ИмяФайла, ИмяФайлаРезультата); Попытка @@ -6333,7 +6001,7 @@ // Возвращаемое значение функции. ИдентификаторФайла = Неопределено; - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); + Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); ОбменВыполняетсяВОднойСети = ОбменДаннымиПовтИсп.ОбменВыполняетсяВОднойЛокальнойСети(УзелИнформационнойБазы, ПараметрыАутентификации); @@ -6399,8 +6067,8 @@ ИмяФайла = ""; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриПолученииФайлаИзХранилища(ИдентификаторФайла, ИмяФайла); @@ -6435,8 +6103,8 @@ СтруктураЗаписи.Вставить("ИмяФайлаСообщения", Файл.Имя); СтруктураЗаписи.Вставить("ДатаЗакладкиСообщения", ТекущаяУниверсальнаяДата()); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриПомещенииФайлаВХранилище(СтруктураЗаписи); @@ -6457,7 +6125,7 @@ // Функция ОбменВыполняетсяВОднойЛокальнойСети(Знач УзелИнформационнойБазы, Знач ПараметрыАутентификации = Неопределено) Экспорт - Прокси = ПолучитьWSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); + Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы,, ПараметрыАутентификации); ИмяВременногоФайла = СтрЗаменить("test{GUID}.tmp", "GUID", Строка(Новый УникальныйИдентификатор)); @@ -6712,9 +6380,13 @@ КонецЕсли; Иначе // Регистры (прочие) - + ЕстьПериодВРегистре = ОбщегоНазначения.ЭтоРегистрБухгалтерии(ЭлементСоставаПланаОбмена.Метаданные) + ИЛИ ОбщегоНазначения.ЭтоРегистрНакопления(ЭлементСоставаПланаОбмена.Метаданные) + ИЛИ (ОбщегоНазначения.ЭтоРегистрСведений(ЭлементСоставаПланаОбмена.Метаданные) + И ЭлементСоставаПланаОбмена.Метаданные.ПериодичностьРегистраСведений + <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический); Если ОтборПоДатеНачалаВыгрузкиИОрганизациям - И ЭлементСоставаПланаОбмена.Метаданные.Измерения.Найти("Период") <> Неопределено + И ЕстьПериодВРегистре // Регистрация по дате и организациям. И ЭлементСоставаПланаОбмена.Метаданные.Измерения.Найти("Организация") <> Неопределено Тогда @@ -6734,7 +6406,7 @@ Продолжить; // Регистрация по дате - ИначеЕсли ЭлементСоставаПланаОбмена.Метаданные.Измерения.Найти("Период") <> Неопределено Тогда + ИначеЕсли ЕстьПериодВРегистре Тогда Выборка = ВыборкаРегистраторовНаборовЗаписейПоДатеНачалаВыгрузки(ПолноеИмяОбъекта, ДатаНачалаВыгрузки); @@ -7162,19 +6834,18 @@ // Процедура ВыполнитьКонтрольЗаписиНеразделенныхДанных(Знач Данные) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() И Не ЭтоРазделенныйОбъект(Данные) Тогда - ПредставлениеИсключения = НСтр("ru = 'Нарушение прав доступа!'"); - ТекстИсключения = НСтр("ru = 'Нарушение прав доступа!'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ТекстИсключения = НСтр("ru = 'Недостаточно прав для выполнения действия.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации( ТекстИсключения, УровеньЖурналаРегистрации.Ошибка, Данные.Метаданные()); - ВызватьИсключение ПредставлениеИсключения; + ВызватьИсключение ТекстИсключения; КонецЕсли; КонецПроцедуры @@ -7183,8 +6854,15 @@ ПолноеИмя = Объект.Метаданные().ПолноеИмя(); - Возврат ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ПолноеИмя, ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) - ИЛИ ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ПолноеИмя, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмя); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Возврат ЭтоРазделенныйОбъектМетаданных; + КонецФункции #КонецОбласти @@ -7260,8 +6938,8 @@ |; |"; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДаннымиОбластейДанных"); Иначе ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДанными"); @@ -7319,8 +6997,8 @@ | И СостоянияОбменовДанными.ДействиеПриОбмене = &ДействиеПриОбмене |"; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДаннымиОбластейДанных"); Иначе ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДанными"); @@ -7659,7 +7337,7 @@ // Возвращаемое значение: // СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. // -Функция ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы( +Функция НастройкиОбменаДляУзлаИнформационнойБазы( УзелИнформационнойБазы, ДействиеПриОбмене, ВидТранспортаСообщенийОбмена, @@ -7677,8 +7355,6 @@ УстановитьНастройкиРежимаОтладкиДляСтруктуры(СтруктураНастроекОбмена); - УстановитьНастройкуКаталогСбораИнформацииОбОбменах(СтруктураНастроекОбмена); - // Проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР. ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена, ИспользоватьНастройкиТранспорта); @@ -7708,7 +7384,7 @@ Возврат СтруктураНастроекОбмена; КонецФункции -Функция ПолучитьСтруктуруНастроекОбменаДляВнешнегоСоединения(УзелИнформационнойБазы, ДействиеПриОбмене, КоличествоЭлементовВТранзакции) +Функция НастройкиОбменаДляВнешнегоСоединения(УзелИнформационнойБазы, ДействиеПриОбмене, КоличествоЭлементовВТранзакции) // Возвращаемое значение функции. СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); @@ -7740,7 +7416,7 @@ СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, "Код"); // Получаем ключ сообщения для ЖР. - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM; @@ -7767,7 +7443,7 @@ // Возвращаемое значение: // СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. // -Функция ПолучитьСтруктуруНастроекОбмена(НастройкаВыполненияОбмена, НомерСтроки) Экспорт +Функция НастройкиОбменаДанными(НастройкаВыполненияОбмена, НомерСтроки) Экспорт // Возвращаемое значение функции. СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); @@ -7807,7 +7483,7 @@ // Получает структуру настроек транспорта для выполнения обмена данными. // -Функция ПолучитьСтруктуруНастроекТранспорта(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт +Функция НастройкиТранспортаОбмена(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт // Возвращаемое значение функции. СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); @@ -7895,7 +7571,7 @@ СтруктураНастроекОбмена.ИмяОбработкиТранспортаСообщенийОбмена = ИмяОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена.ВидТранспортаОбмена); // Получаем ключ сообщения для ЖР. - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); // СтруктураНастроекОбмена.НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспорта(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ВидТранспортаОбмена); @@ -7959,7 +7635,7 @@ СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод = СтруктураНастроекОбмена.ТекущийУзелПланаОбмена.Код; // Получаем ключ сообщения для ЖР. - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); КонецПроцедуры @@ -8022,8 +7698,6 @@ СтруктураНастроекОбмена.Вставить("СообщениеПриОбмене", ""); СтруктураНастроекОбмена.Вставить("СтрокаСообщенияОбОшибке", ""); - СтруктураНастроекОбмена.Вставить("КаталогСбораИнформацииОбОбменах", ""); - Возврат СтруктураНастроекОбмена; КонецФункции @@ -8176,11 +7850,11 @@ Если СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - ОбработкаОбменаДанными = ПолучитьОбработкуОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена); + ОбработкаОбменаДанными = ОбработкаОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена); ИначеЕсли СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - ОбработкаОбменаДанными = ПолучитьОбработкуОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена); + ОбработкаОбменаДанными = ОбработкаОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена); КонецЕсли; @@ -8195,8 +7869,25 @@ ЭтоИсходящееСообщение = СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных; + Транслитерация = Неопределено; + СловарьНастроек = Новый Соответствие; + СловарьНастроек.Вставить(Перечисления.ВидыТранспортаСообщенийОбмена.FILE, "FILEТранслитерироватьИменаФайловСообщенийОбмена"); + СловарьНастроек.Вставить(Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL, "EMAILТранслитерироватьИменаФайловСообщенийОбмена"); + СловарьНастроек.Вставить(Перечисления.ВидыТранспортаСообщенийОбмена.FTP, "FTPТранслитерироватьИменаФайловСообщенийОбмена"); + + ИмяСвойстваТранслитерация = СловарьНастроек.Получить(СтруктураНастроекОбмена.ВидТранспортаОбмена); + Если ЗначениеЗаполнено(ИмяСвойстваТранслитерация) Тогда + СтруктураНастроекОбмена.НастройкиТранспорта.Свойство(ИмяСвойстваТранслитерация, Транслитерация); + КонецЕсли; + + Транслитерация = ?(Транслитерация = Неопределено, Ложь, Транслитерация); + // Заполняем общие реквизиты, одинаковые для всех обработок транспорта. - ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения = ПолучитьШаблонИмениФайлаСообщения(СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, СтруктураНастроекОбмена.УзелИнформационнойБазы, ЭтоИсходящееСообщение); + ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения( + СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ЭтоИсходящееСообщение, + Транслитерация); // Заполняем настойки транспорта, различные для каждой обработки транспорта. ЗаполнитьЗначенияСвойств(ОбработкаТранспортаСообщенийОбмена, СтруктураНастроекОбмена.НастройкиТранспорта); @@ -8208,7 +7899,7 @@ КонецПроцедуры -Функция ПолучитьОбработкуОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена) +Функция ОбработкаОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена) МенеджерОбработки = ?(ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы), Обработки.КонвертацияОбъектовXDTO, @@ -8238,7 +7929,7 @@ КонецФункции -Функция ПолучитьОбработкуОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена) +Функция ОбработкаОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена) МенеджерОбработки = ?(ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы), Обработки.КонвертацияОбъектовXDTO, @@ -8279,7 +7970,7 @@ Процедура УстановитьПравилаОбменаВыгрузкиДанных(ОбработкаОбменаДаннымиXML, СтруктураНастроекОбмена) - ПравилаКонвертацииОбъектов = РегистрыСведений.ПравилаДляОбменаДанными.ПолучитьЗачитанныеПравилаКонвертацииОбъектов(СтруктураНастроекОбмена.ИмяПланаОбмена); + ПравилаКонвертацииОбъектов = РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(СтруктураНастроекОбмена.ИмяПланаОбмена); Если ПравилаКонвертацииОбъектов = Неопределено Тогда @@ -8307,7 +7998,7 @@ Процедура УстановитьПравилаОбменаЗагрузкиДанных(ОбработкаОбменаДаннымиXML, СтруктураНастроекОбмена) - ПравилаКонвертацииОбъектов = РегистрыСведений.ПравилаДляОбменаДанными.ПолучитьЗачитанныеПравилаКонвертацииОбъектов(СтруктураНастроекОбмена.ИмяПланаОбмена, Истина); + ПравилаКонвертацииОбъектов = РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(СтруктураНастроекОбмена.ИмяПланаОбмена, Истина); Если ПравилаКонвертацииОбъектов = Неопределено Тогда @@ -8395,7 +8086,7 @@ КонецЕсли; - Если Не Результат.Пустой() И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не Результат.Пустой() И Не ОбщегоНазначения.РазделениеВключено() Тогда ТаблицаНастроек = Результат.Выгрузить(); СтрокаТаблицы = ТаблицаНастроек[0]; @@ -8460,7 +8151,7 @@ Результат = Запрос.Выполнить(); - Если Результат.Пустой() Или ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Результат.Пустой() Или ОбщегоНазначения.РазделениеВключено() Тогда ОбработкаОбменаДанными.ОтладкаОбработчиковВыгрузки = Ложь; ОбработкаОбменаДанными.ИмяФайлаВнешнейОбработкиОтладкиВыгрузки = ""; @@ -8483,14 +8174,21 @@ КонецПроцедуры -Функция ПолучитьШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, ЭтоИсходящееСообщение) +Функция ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, ЭтоИсходящееСообщение, Транслитерация = Ложь) УзелОтправитель = ?(ЭтоИсходящееСообщение, ТекущийУзелПланаОбмена, УзелИнформационнойБазы); УзелПолучатель = ?(ЭтоИсходящееСообщение, УзелИнформационнойБазы, ТекущийУзелПланаОбмена); - Возврат ИмяФайлаСообщенияОбмена(СокрЛП(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелОтправитель, "Код")), - СокрЛП(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелПолучатель, "Код"))); - // + // Учитываем настройку транслитерации для узла плана обмена. + КодОтправителя = СокрЛП(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелОтправитель, "Код")); + КодПолучателя = СокрЛП(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелПолучатель, "Код")); + Если Транслитерация Тогда + КодОтправителя = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(КодОтправителя); + КодПолучателя = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(КодПолучателя); + КонецЕсли; + + Возврат ИмяФайлаСообщенияОбмена(КодОтправителя, КодПолучателя); + КонецФункции #КонецОбласти @@ -8499,7 +8197,7 @@ Функция КоличествоПроблемОбменаДанными(УзлыОбмена = Неопределено) - Возврат РегистрыСведений.РезультатыОбменаДанными.КоличествоПроблем(УзлыОбмена, Неопределено); + Возврат РегистрыСведений.РезультатыОбменаДанными.КоличествоПроблем(УзлыОбмена); КонецФункции @@ -8522,17 +8220,14 @@ // Параметры: // Объект - ДокументОбъект - Документ при отложенном проведении которого возникли ошибки. // УзелОбмена - ПланОбменаСсылка - Узел информационной базы из которой получен документ. -// СообщениеОбОшибке - Сообщение об ошибке для журнала регистрации. +// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. +// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). +// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые +// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова +// данного метода в буфере сообщений системы не содержалось сообщений. // РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. // -// Примечание: СообщениеОбОшибке содержит в себе текст сообщения для журнала регистрации. -// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). -// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые -// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова -// данного метода в буфере сообщений системы не содержалось сообщений. -// -// Пример вызова процедуры при загрузке документа в информационную базу: -// +// Пример: // Процедура ПровестиДокументПриЗагрузке(Документ, УзелОбмена) // Документ.ОбменДанными.Загрузка = Истина; // Документ.Записать(); @@ -8547,7 +8242,7 @@ // КонецПопытки; // // Если Отказ Тогда -// ЗарегистрироватьОшибкуПроведенияДокумента(Документ, УзелОбмена, СообщениеОбОшибке); +// ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Документ, УзелОбмена, СообщениеОбОшибке); // КонецЕсли; // // КонецПроцедуры; @@ -8556,12 +8251,12 @@ Объект, УзелОбмена, ТекстИсключения, - РегистрироватьПроблемыВРезультатахОбмена = Ложь) Экспорт + РегистрироватьПроблемыВРезультатахОбмена = Истина) Экспорт СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); ТекстСообщения = ТекстИсключения; Для Каждого Сообщение Из СообщенияПользователю Цикл - Если Найти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда + Если СтрНайти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда Продолжить; КонецЕсли; ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; @@ -8594,16 +8289,13 @@ // Параметры: // Объект - Объект ссылочного типа - Объект при отложенной записи которого возникли ошибки. // УзелОбмена - ПланОбменаСсылка - Узел информационной базы из которой получен объект. -// СообщениеОбОшибке - Сообщение об ошибке для журнала регистрации. -// -// Примечание: СообщениеОбОшибке содержит в себе текст сообщения для журнала регистрации. -// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). -// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые -// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова -// данного метода в буфере сообщений системы не содержалось сообщений. -// -// Пример вызова процедуры при записи объекта в информационную базу: +// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. +// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). +// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые +// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова +// данного метода в буфере сообщений системы не содержалось сообщений. // +// Пример: // Процедура ЗаписатьОбъектПриЗагрузке(Объект, УзелОбмена) // Объект.ОбменДанными.Загрузка = Истина; // Объект.Записать(); @@ -8618,7 +8310,7 @@ // КонецПопытки; // // Если Отказ Тогда -// ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, УзелОбмена, СообщениеОбОшибке); +// ОбменДаннымиСервер.ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, УзелОбмена, СообщениеОбОшибке); // КонецЕсли; // // КонецПроцедуры; @@ -8628,7 +8320,7 @@ СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); ТекстСообщения = ТекстИсключения; Для Каждого Сообщение Из СообщенияПользователю Цикл - Если Найти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда + Если СтрНайти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда Продолжить; КонецЕсли; ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; @@ -8791,7 +8483,7 @@ МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - ПолучитьТаблицуПлановОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена, ""); + ПолучитьПланыОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена, ""); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -8831,7 +8523,7 @@ КонецФункции -Функция ПолучитьДополнительныеСвойстваПланаОбменаСтрокой(Знач СвойстваСтрокой) +Функция ДополнительныеСвойстваПланаОбменаСтрокой(Знач СвойстваСтрокой) Результат = ""; @@ -8854,16 +8546,20 @@ Результат = Новый Массив; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Для Каждого ИмяПланаОбмена Из ПланыОбменаМассив Цикл - Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) - ИЛИ ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Если ЭтоРазделенныйОбъектМетаданных Тогда Результат.Добавить(ИмяПланаОбмена); @@ -8875,10 +8571,14 @@ Для Каждого ИмяПланаОбмена Из ПланыОбменаМассив Цикл - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) - И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Если Не ЭтоРазделенныйОбъектМетаданных Тогда Результат.Добавить(ИмяПланаОбмена); @@ -8954,7 +8654,67 @@ КонецПроцедуры -Процедура ПолучитьТаблицуПлановОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбменаМассив, Знач ДополнительныеСвойстваПланаОбмена) +Процедура ПолучитьПланыОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбменаМассив, Знач ДополнительныеСвойстваПланаОбмена) + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + // Логика по формированию запроса вынесена в отдельную функцию. + ПараметрыЗапроса = ПараметрыЗапросаПланыОбменаДляМонитора(); + ПараметрыЗапроса.ПланыОбменаМассив = ПланыОбменаМассив; + ПараметрыЗапроса.ДополнительныеСвойстваПланаОбмена = ДополнительныеСвойстваПланаОбмена; + ПараметрыЗапроса.РезультатВоВременнуюТаблицу = Истина; + Запрос.Текст = ТекстЗапросаПланыОбменаДляМонитора(ПараметрыЗапроса); + Запрос.Выполнить(); + +КонецПроцедуры + +// Функция для объявления структуры параметров функции ТекстЗапросаПланыОбменаДляМонитора. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Структура. +// +Функция ПараметрыЗапросаПланыОбменаДляМонитора() + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("ПланыОбменаМассив"); + ПараметрыЗапроса.Вставить("ДополнительныеСвойстваПланаОбмена", ""); + ПараметрыЗапроса.Вставить("РезультатВоВременнуюТаблицу", Ложь); + + Возврат ПараметрыЗапроса; + +КонецФункции + +// Возвращает текст запроса для получения данных узлов планов обмена. +// +// Параметры: +// ПараметрыЗапроса - Структура - структура параметров (см. функцию ПараметрыЗапросаПланыОбменаДляМонитора): +// * ПланыОбменаМассив - Массив - имена планов обмена БСП. По умолчанию все планы обмена БСП. +// * ДополнительныеСвойстваПланаОбмена - Строка - свойства узлов, значения которых необходимо получить. +// по умолчанию пустая строка. +// * РезультатВоВременнуюТаблицу - Булево - Если Истина, в запросе будет описано помещение результата +// во временную таблицу ПланыОбменаКонфигурации. +// По умолчанию Ложь. +// +// Возвращаемое значение: +// Строка - Результирующий текст запроса. +// +Функция ТекстЗапросаПланыОбменаДляМонитора(ПараметрыЗапроса = Неопределено) + + Если ПараметрыЗапроса = Неопределено Тогда + ПараметрыЗапроса = ПараметрыЗапросаПланыОбменаДляМонитора(); + КонецЕсли; + + ПланыОбменаМассив = ПараметрыЗапроса.ПланыОбменаМассив; + ДополнительныеСвойстваПланаОбмена = ПараметрыЗапроса.ДополнительныеСвойстваПланаОбмена; + РезультатВоВременнуюТаблицу = ПараметрыЗапроса.РезультатВоВременнуюТаблицу; + + Если Не ЗначениеЗаполнено(ПланыОбменаМассив) Тогда + ПланыОбменаМассив = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); + КонецЕсли; ПланыОбменаМетода = ФильтрПлановОбменаПоПризнакуРазделенияДанных(ПланыОбменаМассив); @@ -8967,8 +8727,6 @@ ДополнительныеСвойстваПланаОбменаСтрокой = ?(ПустаяСтрока(ДополнительныеСвойстваПланаОбмена), "", ДополнительныеСвойстваПланаОбмена + ", "); - Запрос = Новый Запрос; - ШаблонЗапроса = " | |ОБЪЕДИНИТЬ ВСЕ @@ -9052,7 +8810,7 @@ | УзелИнформационнойБазы, | Наименование, | ИмяПланаОбмена - |ПОМЕСТИТЬ ПланыОбменаКонфигурации + | [ПомещениеВоВременнуюТаблицу] |ИЗ | ( | [ТекстЗапроса] @@ -9060,20 +8818,21 @@ |; |"; + + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ПомещениеВоВременнуюТаблицу]", + ?(РезультатВоВременнуюТаблицу, "ПОМЕСТИТЬ ПланыОбменаКонфигурации", "")); ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ТекстЗапроса]", ТекстЗапроса); ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой); - Запрос.Текст = ТекстЗапросаРезультат; - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - Запрос.Выполнить(); + Возврат ТекстЗапросаРезультат; -КонецПроцедуры +КонецФункции -Процедура ПолучитьТаблицуРезультатовОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбменаМассив) +Процедура ПолучитьРезультатыОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбменаМассив) Запрос = Новый Запрос; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстЗапросаРезультат = " |ВЫБРАТЬ @@ -9312,7 +9071,7 @@ Уровень = ?(ЭтоОшибка, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); - КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, Уровень,,, Комментарий); @@ -9531,7 +9290,7 @@ // Возвращает ключ сообщения журнала регистрации. // -Функция ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене) Экспорт +Функция КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене) Экспорт ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); @@ -9658,11 +9417,9 @@ Знач ИмяСобытияЖурналаРегистрации, КоличествоОтправленныхОбъектов) - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбменДанными\ПриВыгрузкеДанныхСлужебный"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриВыгрузкеДанныхСлужебный( + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриВыгрузкеДанных( СтандартнаяОбработка, Получатель, ИмяФайлаСообщения, @@ -9670,7 +9427,7 @@ КоличествоЭлементовВТранзакции, ИмяСобытияЖурналаРегистрации, КоличествоОтправленныхОбъектов); - КонецЦикла; + КонецЕсли; КонецПроцедуры @@ -9700,11 +9457,10 @@ Знач ИмяСобытияЖурналаРегистрации, КоличествоПолученныхОбъектов) - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗагрузкеДанныхСлужебный( + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + МодульОбменСообщениямиВнутренний.ПриЗагрузкеДанных( СтандартнаяОбработка, Отправитель, ИмяФайлаСообщения, @@ -9712,7 +9468,7 @@ КоличествоЭлементовВТранзакции, ИмяСобытияЖурналаРегистрации, КоличествоПолученныхОбъектов); - КонецЦикла; + КонецЕсли; КонецПроцедуры @@ -9750,7 +9506,7 @@ СтруктураНастроекОбмена.Вставить("РезультатВыполненияОбмена", Перечисления.РезультатыВыполненияОбмена.Ошибка); СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене", ДействиеПриОбмене); СтруктураНастроекОбмена.Вставить("КоличествоОбъектовОбработано", 0); - СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); СтруктураНастроекОбмена.Вставить("ДатаНачала", ДатаНачала); СтруктураНастроекОбмена.Вставить("ДатаОкончания", ТекущаяДатаСеанса()); СтруктураНастроекОбмена.Вставить("ЭтоОбменВРИБ", ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)); @@ -10353,7 +10109,7 @@ Если ПараметрыПодключения.ТипСоединения = "ВнешнееСоединение" Тогда - Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); + Подключение = ВнешнееСоединениеСБазой(ПараметрыПодключения); СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; ВнешнееСоединение = Подключение.Соединение; @@ -10686,7 +10442,7 @@ Результат.КодЭтогоУзла = СвойстваЭтогоУзла.Код; Результат.ВерсияКонфигурации = Метаданные.Версия; - Результат.НаименованиеИнформационнойБазыПоУмолчанию = ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), + Результат.НаименованиеИнформационнойБазыПоУмолчанию = ?(ОбщегоНазначения.РазделениеВключено(), Метаданные.Синоним, ОбменДаннымиПовтИсп.ИмяЭтойИнформационнойБазы()); Иначе @@ -10703,7 +10459,7 @@ Возврат Результат; КонецФункции -Функция ПолучитьДеревоИнформацииСтатистики(ИнформацияСтатистики, Знач ВключатьУдалениеОбъектов = Ложь) Экспорт +Функция ИнформацияСтатистики(ИнформацияСтатистики, Знач ВключатьУдалениеОбъектов = Ложь) Экспорт ОтборМассив = ИнформацияСтатистики.ВыгрузитьКолонку("ИмяТаблицыПриемника"); @@ -10981,6 +10737,14 @@ // Параметры: // СтруктураНастроек - структура настроек транспорта COM обмена. // +// Возвращаемое значение: +// Структура - +// * Соединение - COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в +// случае ошибки; +// * КраткоеОписаниеОшибки - Строка - краткое описание ошибки; +// * ПодробноеОписаниеОшибки - Строка - подробное описание ошибки; +// * ОшибкаПодключенияКомпоненты - Булево - флаг ошибки подключения COM. +// Функция УстановитьВнешнееСоединениеСБазой(СтруктураНастроек) Экспорт Результат = ОбщегоНазначенияКлиентСервер.УстановитьВнешнееСоединениеСБазой( @@ -11046,7 +10810,7 @@ КонецФункции -Функция ПолучитьWSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке = "", ПараметрыАутентификации = Неопределено) +Функция WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке = "", ПараметрыАутентификации = Неопределено) СтруктураНастроек = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаWS(УзелИнформационнойБазы, ПараметрыАутентификации); @@ -11325,7 +11089,7 @@ Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Не ОбменДаннымиПовтИсп.ПланОбменаИспользуетсяВМоделиСервиса(ИмяПланаОбмена) Тогда Продолжить; КонецЕсли; @@ -11351,7 +11115,7 @@ Для Каждого ЗаписьПланаОбмена Из Результат Цикл Если ЗаписьПланаОбмена.Количество <= 1 - И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда // только ЭтотУзел + И Не ОбщегоНазначения.РазделениеВключено() Тогда // только ЭтотУзел Продолжить; КонецЕсли; @@ -11772,16 +11536,6 @@ Возврат Результат; КонецФункции -// Возвращает признак необходимости загрузки сообщения обмена данными. -// -Функция ЗагрузитьСообщениеОбменаДанными() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Возврат Константы.ЗагрузитьСообщениеОбменаДанными.Получить(); - -КонецФункции - Функция ВариантОбменаДанными(Знач Корреспондент) Экспорт Результат = "Синхронизация"; @@ -12145,6 +11899,10 @@ // Функция ВыгрузкаСсылкиИзИнтерактивногоДополненияРазрешена(УзелОбмена, Ссылка) Экспорт + // В случае вызова из схемы компоновки данных при работе механизма дополнения к выгрузке + // включается безопасный режим, который нужно отключить на время выполнения этой функции. + УстановитьОтключениеБезопасногоРежима(Истина); + ДополнительныеСвойства = Новый Структура("ИнтерактивноеДополнениеВыгрузки", Истина); Возврат ВыгрузкаСсылкиРазрешена(УзелОбмена, Ссылка, ДополнительныеСвойства); @@ -12169,6 +11927,7 @@ КонецПроцедуры Функция ИнтерактивноеИзменениеВыгрузки_ОбъектПоНастройкам(Знач Настройки) + ОбъектОтчета = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); ЗаполнитьЗначенияСвойств(ОбъектОтчета, Настройки, , "КомпоновщикОтбораВсехДокументов"); @@ -12209,22 +11968,7 @@ КонецФункции -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДелПредупрежденияСинхронизации(ТекущиеДела) МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -12254,22 +11998,7 @@ КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДелНеобходимоОбновление(ТекущиеДела) МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -12308,22 +12037,7 @@ КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДелПроверитьСовместимостьСТекущейВерсией(ТекущиеДела) МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -12416,11 +12130,11 @@ КонецЕсли; Для Каждого Движение Из МетаданныеДокумента.Движения Цикл - // В запросе получаем имена регистров, по которым есть хотя бы одно движение. - // Например, - // ВЫБРАТЬ Первые 1 "РегистрНакопления.ТоварыНаСкладах" + // В запросе получаем имена регистров, по которым есть хотя бы одно движение + // например, + // ВЫБРАТЬ Первые 1 «РегистрНакопления.ТоварыНаСкладах» // ИЗ РегистрНакопления.ТоварыНаСкладах - // ГДЕ Регистратор = &Регистратор. + // ГДЕ Регистратор = &Регистратор // Имя регистра приводим к Строка(200), см. ниже. ТекстЗапроса = ТекстЗапроса + " @@ -12478,6 +12192,224 @@ КонецФункции +// Определяет настройки по умолчанию для плана обмена, которые затем могут быть переопределены +// в модуле менеджера плана обмена в функции ОпределитьНастройки(). +// +// Возвращаемое значение: +// Структура - содержит поля: +// * ПредупреждатьОНесоответствииВерсийПравилОбмена - Булево - Признак необходимости проверки на +// расхождение версий в правилах конвертации. +// Проверка выполняется при загрузке комплекта +// правил, при отправке данных и при получении +// данных. +// * ПутьКФайлуКомплектаПравилНаПользовательскомСайте - Строка - Содержит путь к файлу комплекта правил в +// виде архива на пользовательском сайте в +// разделе конфигурации. +// * ПутьКФайлуКомплектаПравилВКаталогеШаблонов - Строка - Содержит относительный путь к файлу +// комплекта правил в каталоге шаблонов +// 1С:Предприятия. +// * ЗаголовокКомандыДляСозданияНовогоОбменаДанными - Строка - Содержит представление команды, выводимое в +// пользовательском интерфейсе при создании +// новой настройки обмена данными. +// * ЗаголовокПомощникаСозданияОбмена - Строка - Содержит представление заголовка формы +// помощника создания обмена данными выводимое +// в пользовательском интерфейсе. +// * ИмяПланаОбменаДляПереходаНаНовыйОбмен - Строка - Если для плана обмена свойство установлено, в +// рабочих местах управления настройками не будет +// предлагаться настроить этот вид обмена. +// Существующие обмены этого вида будут продолжать +// отображаться в списке настроенных обменов. +// Получении сообщения обмена в новом формате будет +// инициировать переход на новый вид обмена. +// * НаименованиеКонфигурацииКорреспондента - Строка - Содержит представление наименования +// конфигурации корреспондента выводимое в +// пользовательском интерфейсе. +// * ЗаголовокУзлаПланаОбмена - Строка - Содержит представление узла плана обмена +// выводимое в пользовательском интерфейсе. +// * ВариантыНастроекОбмена - Массив - Список возможных настроек плана обмена. +// Используется для создания заготовленных +// шаблонов с заполненным настройками планов +// обмена. +// * ОтображатьНастройкуОтборовНаУзле - Булево - Признак отображения настроек отборов на узле +// в помощнике создания обмена. +// * ОтображатьЗначенияПоУмолчаниюНаУзле - Булево - Признак отображения значений по умолчанию в +// помощнике создания обмена. +// * ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента - Булево - Признак отображения настроек отборов на узле +// базы-корреспондента в помощнике создания +// обмена. +// * ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента - Булево - Признак отображения значений по умолчанию +// базы-корреспондента в помощнике создания +// обмена. +// * ВидГруппыДляВариантовНастроек - ВидГруппыФормы - вариант вида группы для отображения в +// дереве команд создания обмена вариантов настроек. +// * НазначениеПланаОбмена - Строка - Вариант назначения плана обмена. +// * ОписанияВариантовНастроекОбмена - ТаблицаЗначений - определяет порядок использования вариантов +// настроек обмена в зависимости от вида корреспондента: +// *ИдентификаторНастройки - Строка - выбирается из +// перечня, заданного в ВариантыНастроекОбмена. +// *ИмяКорреспондента - Строка - выбирается исходя из +// значения, заданного в функции ИмяКонфигурацииИсточника +// модуля менеджера плана обмена на стороне корреспондента. +// В случае, если параметр не заполнен, функциональность +// вариантов настроек плана обмена при настройке +// синхронизации с другим приложением в сервисе +// не используется. +// +Функция НастройкиПланаОбменаПоУмолчанию(ИмяПланаОбмена) + + // Получаем значения по умолчанию для плана обмена. + МетаданныеПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена]; + + ЗаголовокФормыПомощника = НСтр("ru='Синхронизация данных с %Программа% (настройка)'"); + ЗаголовокФормыПомощника = СтрЗаменить(ЗаголовокФормыПомощника, "%Программа%", МетаданныеПланаОбмена.Синоним); + + Параметры = Новый Структура; + + Параметры.Вставить("ПредупреждатьОНесоответствииВерсийПравилОбмена", Истина); + Параметры.Вставить("ПутьКФайлуКомплектаПравилНаПользовательскомСайте", ""); + Параметры.Вставить("ПутьКФайлуКомплектаПравилВКаталогеШаблонов", ""); + Параметры.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", МетаданныеПланаОбмена.Синоним); + Параметры.Вставить("ЗаголовокПомощникаСозданияОбмена", ЗаголовокФормыПомощника); + Параметры.Вставить("ИмяПланаОбменаДляПереходаНаНовыйОбмен", ""); + Параметры.Вставить("НаименованиеКонфигурацииКорреспондента", МетаданныеПланаОбмена.Синоним); + Параметры.Вставить("ЗаголовокУзлаПланаОбмена", МетаданныеПланаОбмена.Синоним); + Параметры.Вставить("ВариантыНастроекОбмена", Новый Массив()); + Параметры.Вставить("ОтображатьНастройкуОтборовНаУзле", Истина); + Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзле", Истина); + Параметры.Вставить("ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента", Истина); + Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", Истина); + Параметры.Вставить("ЭтоПланОбменаXDTO", Ложь); + Параметры.Вставить("ВидГруппыДляВариантовНастроек", ВидГруппыФормы.Подменю); + Параметры.Вставить("НазначениеПланаОбмена", + ?(МетаданныеПланаОбмена.РаспределеннаяИнформационнаяБаза, "РИБ", "СинхронизацияСДругойПрограммой")); + + ОписанияВариантовНастроекОбмена = Новый ТаблицаЗначений; + ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка"); + ОписанияВариантовНастроекОбмена.Колонки.Добавить("ИдентификаторНастройки", ОписаниеТиповСтрока); + ОписанияВариантовНастроекОбмена.Колонки.Добавить("ИмяКорреспондента", ОписаниеТиповСтрока); + Параметры.Вставить("ОписанияВариантовНастроекОбмена", ОписанияВариантовНастроекОбмена); + + Возврат Параметры; + +КонецФункции + +// Получает дерево метаданных конфигурации с заданным отбором по объектам метаданных. +// +// Параметры: +// Отбор - Структура - содержит значения элементов отбора. +// Если параметр задан, то будет получено дерево метаданных в соответствии с заданным отбором: +// Ключ - Строка - имя свойства элемента метаданных; +// Значение - Массив - множество значений для отбора. +// +// Пример инициализации переменной "Отбор": +// +// Массив = Новый Массив; +// Массив.Добавить("Константа.ИспользоватьСинхронизациюДанных"); +// Массив.Добавить("Справочник.Валюты"); +// Массив.Добавить("Справочник.Организации"); +// Отбор = Новый Структура; +// Отбор.Вставить("ПолноеИмя", Массив); +// +// Возвращаемое значение: +// ДеревоЗначений - дерево описания метаданных конфигурации. +// +Функция ДеревоМетаданныхКонфигурации(Отбор = Неопределено) Экспорт + + ИспользоватьОтбор = (Отбор <> Неопределено); + + КоллекцииОбъектовМетаданных = Новый ТаблицаЗначений; + КоллекцииОбъектовМетаданных.Колонки.Добавить("Имя"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("Синоним"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("Картинка"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("КартинкаОбъекта"); + + НоваяСтрокаКоллекцииОбъектовМетаданных("Константы", НСтр("ru = 'Константы'"), БиблиотекаКартинок.Константа, БиблиотекаКартинок.Константа, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("Справочники", НСтр("ru = 'Справочники'"), БиблиотекаКартинок.Справочник, БиблиотекаКартинок.Справочник, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("Документы", НСтр("ru = 'Документы'"), БиблиотекаКартинок.Документ, БиблиотекаКартинок.ДокументОбъект, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыВидовХарактеристик", НСтр("ru = 'Планы видов характеристик'"), БиблиотекаКартинок.ПланВидовХарактеристик, БиблиотекаКартинок.ПланВидовХарактеристикОбъект, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыСчетов", НСтр("ru = 'Планы счетов'"), БиблиотекаКартинок.ПланСчетов, БиблиотекаКартинок.ПланСчетовОбъект, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыВидовРасчета", НСтр("ru = 'Планы видов расчета'"), БиблиотекаКартинок.ПланВидовРасчета, БиблиотекаКартинок.ПланВидовРасчетаОбъект, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыСведений", НСтр("ru = 'Регистры сведений'"), БиблиотекаКартинок.РегистрСведений, БиблиотекаКартинок.РегистрСведений, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыНакопления", НСтр("ru = 'Регистры накопления'"), БиблиотекаКартинок.РегистрНакопления, БиблиотекаКартинок.РегистрНакопления, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыБухгалтерии", НСтр("ru = 'Регистры бухгалтерии'"), БиблиотекаКартинок.РегистрБухгалтерии, БиблиотекаКартинок.РегистрБухгалтерии, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыРасчета", НСтр("ru = 'Регистры расчета'"), БиблиотекаКартинок.РегистрРасчета, БиблиотекаКартинок.РегистрРасчета, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("БизнесПроцессы", НСтр("ru = 'Бизнес-процессы'"), БиблиотекаКартинок.БизнесПроцесс, БиблиотекаКартинок.БизнесПроцессОбъект, КоллекцииОбъектовМетаданных); + НоваяСтрокаКоллекцииОбъектовМетаданных("Задачи", НСтр("ru = 'Задачи'"), БиблиотекаКартинок.Задача, БиблиотекаКартинок.ЗадачаОбъект, КоллекцииОбъектовМетаданных); + + // Возвращаемое значение функции. + ДеревоМетаданных = Новый ДеревоЗначений; + ДеревоМетаданных.Колонки.Добавить("Имя"); + ДеревоМетаданных.Колонки.Добавить("ПолноеИмя"); + ДеревоМетаданных.Колонки.Добавить("Синоним"); + ДеревоМетаданных.Колонки.Добавить("Картинка"); + + Для Каждого СтрокаКоллекции Из КоллекцииОбъектовМетаданных Цикл + + СтрокаДерева = ДеревоМетаданных.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаКоллекции); + Для Каждого ОбъектМетаданных Из Метаданные[СтрокаКоллекции.Имя] Цикл + + Если ИспользоватьОтбор Тогда + + ОбъектПрошелФильтр = Истина; + Для Каждого ЭлементОтбора Из Отбор Цикл + + Значение = ?(ВРег(ЭлементОтбора.Ключ) = ВРег("ПолноеИмя"), ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных[ЭлементОтбора.Ключ]); + Если ЭлементОтбора.Значение.Найти(Значение) = Неопределено Тогда + ОбъектПрошелФильтр = Ложь; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Не ОбъектПрошелФильтр Тогда + Продолжить; + КонецЕсли; + + КонецЕсли; + + СтрокаДереваОМ = СтрокаДерева.Строки.Добавить(); + СтрокаДереваОМ.Имя = ОбъектМетаданных.Имя; + СтрокаДереваОМ.ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + СтрокаДереваОМ.Синоним = ОбъектМетаданных.Синоним; + СтрокаДереваОМ.Картинка = СтрокаКоллекции.КартинкаОбъекта; + + КонецЦикла; + + КонецЦикла; + + // Удаляем строки без подчиненных элементов. + Если ИспользоватьОтбор Тогда + + // Используем обратный порядок обхода дерева значений. + КоличествоЭлементовКоллекции = ДеревоМетаданных.Строки.Количество(); + + Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл + + ТекущийИндекс = КоличествоЭлементовКоллекции - ОбратныйИндекс; + СтрокаДерева = ДеревоМетаданных.Строки[ТекущийИндекс]; + Если СтрокаДерева.Строки.Количество() = 0 Тогда + ДеревоМетаданных.Строки.Удалить(ТекущийИндекс); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Возврат ДеревоМетаданных; + +КонецФункции + +Процедура НоваяСтрокаКоллекцииОбъектовМетаданных(Имя, Синоним, Картинка, КартинкаОбъекта, Таб) + + НоваяСтрока = Таб.Добавить(); + НоваяСтрока.Имя = Имя; + НоваяСтрока.Синоним = Синоним; + НоваяСтрока.Картинка = Картинка; + НоваяСтрока.КартинкаОбъекта = КартинкаОбъекта; + +КонецПроцедуры + #КонецОбласти #Область РаботаСКонстантойСообщениеОбменаИзГлавногоУзла @@ -12487,7 +12419,7 @@ // Возвращаемое значение - Структура - Информация о расположении файла сообщения обмена (текущий формат). // - ДвоичныеДанные - Сообщение обмена в информационной базе (устаревший формат). // -Функция ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла() +Функция СообщениеОбменаДаннымиИзГлавногоУзла() Возврат Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); @@ -12521,7 +12453,7 @@ // Процедура ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла() Экспорт - СообщениеОбмена = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); + СообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); Если ТипЗнч(СообщениеОбмена) = Тип("Структура") Тогда @@ -12541,7 +12473,7 @@ Процедура СформироватьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -12555,14 +12487,15 @@ Процедура ЗапросВнешнихРесурсовДляКаталогаСообщенийОбменаДанными(ЗапросыРазрешений, Объект) Экспорт ЗначениеКонстанты = Объект.Значение; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Если Не ПустаяСтрока(ЗначениеКонстанты) Тогда Разрешения = Новый Массив(); - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( ЗначениеКонстанты, Истина, Истина)); ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Объект.Метаданные()))); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl index 1a3a7c253..6e652df59 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl @@ -431,7 +431,7 @@ КомпонентыОбмена.XMLСхема = ОбменДаннымиXDTOСервер.ФорматОбмена( КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.ВерсияФорматаОбмена); КомпонентыОбмена.МенеджерОбмена = ОбменДаннымиXDTOСервер.МенеджерОбменаВерсииФормата( - КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.ВерсияФорматаОбмена); + КомпонентыОбмена.ВерсияФорматаОбмена, КомпонентыОбмена.УзелКорреспондента); КомпонентыОбмена.ТаблицаПравилаРегистрацииОбъектов = ОбменДаннымиXDTOСервер.ПравилаРегистрацииОбъектов( КомпонентыОбмена.УзелКорреспондента); КомпонентыОбмена.СвойстваУзлаПланаОбмена = ОбменДаннымиXDTOСервер.СвойстваУзлаПланаОбмена( diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl index 5c497bc19..d653a8afa 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Процедура-обработчик события "ПередЗаписью" документов для механизма регистрации объектов на узлах. @@ -11,8 +6,8 @@ // ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется механизм регистрации. // Источник - ДокументОбъект - источник события. // Отказ - Булево - флаг отказа от выполнения обработчика. -// РежимЗаписи - см. в синтаксис-помощнике РежимЗаписиДокумента. -// РежимПроведения - см. в синтаксис-помощнике РежимПроведенияДокумента. +// РежимЗаписи - РежимЗаписиДокумента - см. в синтаксис-помощнике РежимЗаписиДокумента. +// РежимПроведения - РежимПроведенияДокумента - см. в синтаксис-помощнике РежимПроведенияДокумента. // Процедура МеханизмРегистрацииОбъектовПередЗаписьюДокумента(ИмяПланаОбмена, Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт @@ -26,7 +21,7 @@ // // Параметры: // ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется механизм регистрации. -// Источник - источник события, кроме типа ДокументОбъект. +// Источник - СправочникОбъект, ПланВидовХарактеристикОбъект - источник события, кроме типа ДокументОбъект. // Отказ - Булево - флаг отказа от выполнения обработчика. // Процедура МеханизмРегистрацииОбъектовПередЗаписью(ИмяПланаОбмена, Источник, Отказ) Экспорт @@ -68,7 +63,7 @@ // // Параметры: // ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется механизм регистрации. -// Источник - источник события. +// Источник - СправочникОбъект, ДокументОбъект, ПланВидовХарактеристикОбъект - источник события. // Отказ - Булево - флаг отказа от выполнения обработчика. // Процедура МеханизмРегистрацииОбъектовПередУдалением(ИмяПланаОбмена, Источник, Отказ) Экспорт @@ -84,7 +79,7 @@ // Процедура дополняет список узлов-получателей объекта переданными значениями. // // Параметры: -// Объект - объект, для которого выполняется правило регистрации. +// Объект - СправочникОбъект, ДокументОбъект и т.п. - объект, для которого выполняется правило регистрации. // Узлы - Массив - узлы плана обмена, которые необходимо добавить в список узлов-получателей объекта. // Процедура ДополнитьПолучателей(Объект, Узлы) Экспорт @@ -109,7 +104,7 @@ // Процедура вычитает из списка узлов-получателей объекта переданные значения. // // Параметры: -// Объект - объект, для которого выполняется правило регистрации. +// Объект - СправочникОбъект, ДокументОбъект и т.п. - объект, для которого выполняется правило регистрации. // Узлы - Массив - узлы плана обмена, которые необходимо вычесть из списка узлов-получателей объекта. // Процедура СократитьПолучателей(Объект, Узлы) Экспорт @@ -128,10 +123,11 @@ // полученных узлах. // // Параметры: -// Объект - объект, для которого необходимо выполнить правила регистрации и выполнить регистрацию на узлах. +// Объект - Произвольный - СправочникОбъект, ДокументОбъект и т.п. объект, для которого необходимо выполнить +// правила регистрации, и выполнить регистрацию на узлах. // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. -// Отправитель (необязательный) - ПланОбменаСсылка - узел плана обмена от которого принимается сообщение обмена -// при загрузке данных: если задан, то регистрация объекта не этом узле выполнятся не будет. +// Отправитель - ПланОбменаСсылка - узел плана обмена от которого принимается сообщение обмена. +// Если задан, то регистрация объекта не этом узле выполнятся не будет. // Процедура ВыполнитьПравилаРегистрацииДляОбъекта(Объект, ИмяПланаОбмена, Отправитель = Неопределено) Экспорт @@ -153,6 +149,9 @@ // Массив - Массив - Исходный массив. // МассивВычитания - Массив - Массив, вычитаемый из исходного массива. // +// Возвращаемое значение: +// Массив - результат вычитания. +// Функция СократитьМассив(Массив, МассивВычитания) Экспорт Возврат ОбщегоНазначенияКлиентСервер.СократитьМассив(Массив, МассивВычитания); @@ -165,7 +164,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе, список узлов для которого необходимо // получить. // -// Возвращаемое значение: +// Возвращаемое значение: // Массив - список всех узлов заданного плана обмена. // Функция ВсеУзлыПланаОбмена(ИмяПланаОбмена) Экспорт @@ -186,8 +185,8 @@ // Функция определяет массив узлов-получателей для объекта при заданном плане обмена. // // Параметры: -// Объект - объект, для которого необходимо выполнить правила регистрации и определить список -// узлов-получателей. +// Объект - Произвольный - СправочникОбъект, ДокументОбъект и т.п. объект, для которого необходимо выполнить +// правила регистрации, и определить список узлов-получателей. // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. // // Возвращаемое значение: @@ -209,14 +208,15 @@ // Определяет признак авторегистрации объекта метаданных в составе плана обмена. // // Параметры: -// ОбъектМетаданных (обязательный) - объект метаданных, для которого требуется получить признак авторегистрации. -// ИмяПланаОбмена (обязательный) - Строка - имя плана обмена, как оно задано в конфигураторе, в состав которого входит -// объект метаданных. +// ОбъектМетаданных - ОбъектМетаданных - объект, для которого требуется получить признак авторегистрации. +// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе, в состав которого входит +// объект метаданных. // // Возвращаемое значение: -// Истина - объект метаданных имеет признак авторегистрации "Разрешена" в составе плана обмена; -// Ложь - объект метаданных имеет признак авторегистрации "Запрещена" в составе плана обмена -// или объект метаданных не входит в состав плана обмена. +// Булево - признак наличия авторегистрации в плане обмена +// * Истина - объект метаданных имеет признак авторегистрации "Разрешена" в составе плана обмена; +// * Ложь - объект метаданных имеет признак авторегистрации "Запрещена" в составе плана обмена +// или объект метаданных не входит в состав плана обмена. // Функция АвтоРегистрацияРазрешена(ОбъектМетаданных, ИмяПланаОбмена) Экспорт @@ -229,7 +229,7 @@ // модуля ДатыЗапретаИзмененияПереопределяемый. // // Параметры: -// Данные - СправочникОбъект.<Имя>, +// Данные - Произвольный - СправочникОбъект.<Имя>, // ДокументОбъект.<Имя>, // ПланВидовХарактеристикОбъект.<Имя>, // ПланСчетовОбъект.<Имя>, @@ -243,7 +243,7 @@ // РегистрБухгалтерииНаборЗаписей.<Имя>, // РегистрРасчетаНаборЗаписей.<Имя> - набор записей. // -// УзелПланаОбмена - ПланыОбменаОбъект.<Имя плана обмена> - узел, +// УзелПланаОбмена - ПланыОбменаОбъект - узел, // для которого будет выполнена проверка. // // Возвращаемое значение: @@ -304,12 +304,12 @@ И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель.Ссылка) И ТипЗнч(ЭлементДанных) <> Тип("УдалениеОбъекта") Тогда - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ЭлементДанных.Метаданные()); + ОбъектМетаданных = ЭлементДанных.Метаданные(); - Если ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаСправочники() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыСчетов() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовРасчета() Тогда + Если ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных) Тогда Если ЭлементДанных.Предопределенный Тогда @@ -490,7 +490,7 @@ ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Источник.Ссылка); // Получает реквизиты ссылочного типа, которые предположительно используются как фильтры фильтров правил регистрации. - ТаблицаРеквизитовСсылочногоТипа = ПолучитьРеквизитыОбъектаСсылочногоТипа(Источник, ИмяПланаОбмена); + ТаблицаРеквизитовСсылочногоТипа = РеквизитыОбъектаСсылочногоТипа(Источник, ИмяПланаОбмена); // Определяем признак модифицированности узла относительно выбранных реквизитов. ОбъектМодифицирован = ОбъектМодифицированПоРеквизитам(Источник, ТаблицаРеквизитовСсылочногоТипа); @@ -593,9 +593,16 @@ КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + // Код и наименование узла в сервисе менять нельзя. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() + Если ОбщегоНазначения.РазделениеВключено() + И НЕ СеансЗапущенБезРазделителей И Не Источник.ЭтоНовый() И ДанныеРазличаются(Источник, Источник.Ссылка.ПолучитьОбъект(), "Код, Наименование") Тогда @@ -740,7 +747,7 @@ Возврат; // Запись узла при получении сообщения обмена (универсальный обмен данными). ИначеЕсли Не ОбменДаннымиПовтИсп.ЭтоУзелРазделенногоОбменаДаннымиБСП(Источник.Ссылка) Тогда Возврат; - ИначеЕсли Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ИначеЕсли Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -874,19 +881,29 @@ ОбъектМетаданных = Объект.Метаданные(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если Не РазделенныйПланОбмена(ИмяПланаОбмена) Тогда ВызватьИсключение НСтр("ru = 'Регистрация изменений для неразделенных планов обмена не поддерживается.'"); КонецЕсли; - ЭтоРазделенныеДанные = ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( - ОбъектМетаданных.ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + ОбъектМетаданных.ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); + Иначе + ЭтоРазделенныеДанные = Ложь; + КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ЭтоСовместноРазделенныеДанные = ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( - ОбъектМетаданных.ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоСовместноРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + ОбъектМетаданных.ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных()); + Иначе + ЭтоСовместноРазделенныеДанные = Ложь; + КонецЕсли; Если Не ЭтоРазделенныеДанные И Не ЭтоСовместноРазделенныеДанные Тогда ВызватьИсключение НСтр("ru = 'Регистрация изменений неразделенных данных в разделенном режиме.'"); @@ -957,8 +974,10 @@ ВыполнитьПравилаРегистрацииОбъектовДляПланаОбмена(МассивУзловРезультат, Объект, ИмяПланаОбмена, ДополнительныеПараметры); - // Обработчик "После определения получателей". - ОбменДаннымиСервер.ПослеОпределенияПолучателей(Объект, МассивУзловРезультат, ИмяПланаОбмена); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса.ПослеОпределенияПолучателей(Объект, МассивУзловРезультат, ИмяПланаОбмена); + КонецЕсли; ДополнитьПолучателей(Объект, МассивУзловРезультат); @@ -967,12 +986,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными.Правила регистрации объектов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ТекстСообщенияДляПользователя = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в правилах регистрации объекта: %1. Подробнее см. в журнале регистрации.'"), - ИмяПланаОбмена); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияДляПользователя); - + ОбработатьОшибкуПравилРегистрации(ИмяПланаОбмена); Отказ = Истина; КонецПопытки; @@ -1077,15 +1091,15 @@ Если ПустаяСтрока(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) Тогда // реквизиты Шапки объекта - ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = ПолучитьТаблицуРеквизитовРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = ПолучитьТаблицуРеквизитовРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); Иначе // реквизиты ТЧ объекта - ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); КонецЕсли; @@ -1093,7 +1107,7 @@ КонецФункции -Функция ПолучитьТаблицуРеквизитовРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) +Функция РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) ТекстЗапроса = " |ВЫБРАТЬ " + СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации @@ -1110,7 +1124,7 @@ КонецФункции -Функция ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) +Функция РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) ТекстЗапроса = " |ВЫБРАТЬ "+ СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации @@ -1128,7 +1142,7 @@ КонецФункции -Функция ПолучитьТаблицуРеквизитовРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) +Функция РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) СтруктураРеквизитовРегистрации = СтрокаТаблицыРеквизитовРегистрации.СтруктураРеквизитовРегистрации; @@ -1151,7 +1165,7 @@ Возврат ТаблицаРеквизитовРегистрации; КонецФункции -Функция ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) +Функция РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) ТаблицаРеквизитовРегистрации = Объект[СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти].Выгрузить(, СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); @@ -1491,7 +1505,7 @@ Если Замещение И Не Выгрузка Тогда - СтарыйНаборЗаписей = ПолучитьНаборЗаписей(Объект); + СтарыйНаборЗаписей = НаборЗаписей(Объект); // Определяем массив узлов-получателей по старому набору записей. ОпределитьМассивПолучателейПоНаборуЗаписей(МассивУзловРезультат, СтарыйНаборЗаписей, ПРО, ОбъектМетаданных, ИмяПланаОбмена, Истина, Ложь); @@ -1646,7 +1660,7 @@ Выгрузка) // Получаем структуру значений свойств для объекта. - ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(Источник, ПРО); + ЗначенияСвойствОбъекта = ЗначенияСвойствДляОбъекта(Источник, ПРО); // Определяем массив узлов для регистрации объекта. МассивУзлов = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ПРО, ИмяПланаОбмена, Источник, Выгрузка); @@ -1659,12 +1673,12 @@ // Получаем структуру значений свойств для ссылки. #Если ВнешнееСоединение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда - ЗначенияСвойствСсылки = ОбменДаннымиВызовСервера.ПолучитьЗначенияСвойствДляСсылки(Источник.Ссылка, ПРО.СвойстваОбъекта, ПРО.СвойстваОбъектаСтрокой, ПРО.ОбъектМетаданныхИмя); + ЗначенияСвойствСсылки = ОбменДаннымиВызовСервера.ЗначенияСвойствДляСсылки(Источник.Ссылка, ПРО.СвойстваОбъекта, ПРО.СвойстваОбъектаСтрокой, ПРО.ОбъектМетаданныхИмя); #Иначе УстановитьПривилегированныйРежим(Истина); - ЗначенияСвойствСсылки = ПолучитьЗначенияСвойствДляСсылки(Источник.Ссылка, ПРО.СвойстваОбъекта, ПРО.СвойстваОбъектаСтрокой, ПРО.ОбъектМетаданныхИмя); + ЗначенияСвойствСсылки = ЗначенияСвойствДляСсылки(Источник.Ссылка, ПРО.СвойстваОбъекта, ПРО.СвойстваОбъектаСтрокой, ПРО.ОбъектМетаданныхИмя); УстановитьПривилегированныйРежим(Ложь); #КонецЕсли @@ -1724,7 +1738,7 @@ // ПРОП // Получаем структуру значений свойств для объекта. - ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(СтрокаНабора, ПРО_СтрокиНабора); + ЗначенияСвойствОбъекта = ЗначенияСвойствДляОбъекта(СтрокаНабора, ПРО_СтрокиНабора); Если ЭтоВерсияОбъектаДоИзменения Тогда @@ -1756,7 +1770,7 @@ // Возвращаемое значение: // Структура - Структура со значениями свойств объекта. // -Функция ПолучитьЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, Знач СвойстваОбъектаСтрокой, Знач ОбъектМетаданныхИмя) Экспорт +Функция ЗначенияСвойствДляСсылки(Ссылка, СвойстваОбъекта, Знач СвойстваОбъектаСтрокой, Знач ОбъектМетаданныхИмя) Экспорт ЗначенияСвойств = СкопироватьСтруктуру(СвойстваОбъекта); @@ -1951,13 +1965,13 @@ Возврат МассивУзловРезультат; КонецФункции -Функция ПолучитьЗначенияСвойствДляОбъекта(Объект, ПРО) +Функция ЗначенияСвойствДляОбъекта(Объект, ПРО) ЗначенияСвойств = Новый Структура; Для Каждого Элемент Из ПРО.СвойстваОбъекта Цикл - ЗначенияСвойств.Вставить(Элемент.Ключ, ПолучитьЗначениеСвойстваОбъекта(Объект, Элемент.Значение)); + ЗначенияСвойств.Вставить(Элемент.Ключ, ЗначениеСвойстваОбъекта(Объект, Элемент.Значение)); КонецЦикла; @@ -1965,7 +1979,7 @@ КонецФункции -Функция ПолучитьЗначениеСвойстваОбъекта(Объект, СтрокаСвойствОбъекта) +Функция ЗначениеСвойстваОбъекта(Объект, СтрокаСвойствОбъекта) Значение = Объект; @@ -2028,9 +2042,15 @@ Функция РазделенныйПланОбмена(Знач ИмяПланаОбмена) - Возврат ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( - "ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + "ПланОбмена." + ИмяПланаОбмена, МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); + Иначе + ЭтоРазделенныеДанные = Ложь; + КонецЕсли; + + Возврат ЭтоРазделенныеДанные; КонецФункции @@ -2045,29 +2065,28 @@ // Функция НаборЗаписейПоТипу(ОбъектМетаданных) - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); - - Если ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыСведений() Тогда + Если ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Тогда Результат = РегистрыСведений[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыНакопления() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоРегистрНакопления(ОбъектМетаданных) Тогда Результат = РегистрыНакопления[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыБухгалтерии() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоРегистрБухгалтерии(ОбъектМетаданных) Тогда Результат = РегистрыБухгалтерии[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыРасчета() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(ОбъектМетаданных) Тогда Результат = РегистрыРасчета[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПоследовательности() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоПоследовательность(ОбъектМетаданных) Тогда Результат = Последовательности[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПерерасчеты() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(ОбъектМетаданных.Родитель()) + И Метаданные.РегистрыРасчета[ОбъектМетаданных.Родитель().Имя].Перерасчеты.Содержит(ОбъектМетаданных) Тогда Результат = РегистрыРасчета[ОбъектМетаданных.Родитель().Имя].Перерасчеты[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); @@ -2097,7 +2116,7 @@ Иначе - СтрокаДерева.ЗначениеСвойства = ПолучитьЗначениеСвойстваОбъекта(Объект, СтрокаДерева.СвойствоОбъекта); + СтрокаДерева.ЗначениеСвойства = ЗначениеСвойстваОбъекта(Объект, СтрокаДерева.СвойствоОбъекта); КонецЕсли; @@ -2173,8 +2192,7 @@ |Алгоритм: |// {Начало алгоритма} |[ЗначениеКонстанты] - |// {Окончание алгоритма} - |'"); + |// {Окончание алгоритма}'"); СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ПРО.ИмяПланаОбмена); СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМетаданныхИмя]", ПРО.ОбъектМетаданныхИмя); СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Описание]", ИнформацияОбОшибке().Описание); @@ -2513,11 +2531,13 @@ КонецЕсли; - Если Не Анализ И ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать + И Не (ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель) И СозданиеНачальногоОбраза) + И Не Анализ Тогда // При отказе в выгрузке объекта необходимо удалить регистрацию изменений. ПланыОбмена.УдалитьРегистрациюИзменений(Получатель, ЭлементДанных); КонецЕсли; - + КонецПроцедуры Функция ДанныеСоответствуютФильтруПравилРегистрации(ЭлементДанных, Знач Получатель) @@ -2528,15 +2548,13 @@ ОбъектМетаданных = ЭлементДанных.Метаданные(); - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); - - Если ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаСправочники() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаДокументы() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыСчетов() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовРасчета() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаБизнесПроцессы() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаЗадачи() Тогда + Если ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных) + ИЛИ ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных) Тогда // Определяем массив узлов для регистрации объекта. МассивУзловДляРегистрацииОбъекта = Новый Массив; @@ -2557,12 +2575,9 @@ КонецЕсли; - ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыСведений() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыНакопления() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыБухгалтерии() - ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыРасчета() Тогда + ИначеЕсли ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) Тогда - ИсключаяСвойства = ?(ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыНакопления(), "ВидДвижения", ""); + ИсключаяСвойства = ?(ОбщегоНазначения.ЭтоРегистрНакопления(ОбъектМетаданных), "ВидДвижения", ""); ДанныеДляПроверки = НаборЗаписейПоТипу(ОбъектМетаданных); @@ -2759,7 +2774,7 @@ КонецПроцедуры -Функция ПолучитьРеквизитыОбъектаСсылочногоТипа(Объект, ИмяПланаОбмена) +Функция РеквизитыОбъектаСсылочногоТипа(Объект, ИмяПланаОбмена) // Выполняем инициализацию таблицы. Результат = ОбменДаннымиСервер.ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); @@ -2768,7 +2783,7 @@ ОбъектМетаданныхПолноеИмя = ОбъектМетаданных.ПолноеИмя(); // Получаем реквизиты шапки - Реквизиты = ПолучитьРеквизитыСсылочногоТипа(ОбъектМетаданных.Реквизиты, ИмяПланаОбмена); + Реквизиты = РеквизитыСсылочногоТипа(ОбъектМетаданных.Реквизиты, ИмяПланаОбмена); Если Реквизиты.Количество() > 0 Тогда @@ -2783,7 +2798,7 @@ // Получаем реквизиты табличных частей. Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл - Реквизиты = ПолучитьРеквизитыСсылочногоТипа(ТабличнаяЧасть.Реквизиты, ИмяПланаОбмена); + Реквизиты = РеквизитыСсылочногоТипа(ТабличнаяЧасть.Реквизиты, ИмяПланаОбмена); Если Реквизиты.Количество() > 0 Тогда @@ -2800,7 +2815,7 @@ Возврат Результат; КонецФункции -Функция ПолучитьРеквизитыСсылочногоТипа(Реквизиты, ИмяПланаОбмена) +Функция РеквизитыСсылочногоТипа(Реквизиты, ИмяПланаОбмена) // Возвращаемое значение функции. Результат = Новый Структура; @@ -2841,6 +2856,16 @@ КонецФункции +Процедура ОбработатьОшибкуПравилРегистрации(ИмяПланаОбмена) + + Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() + И РегистрыСведений.ПравилаДляОбменаДанными.ИспользуютсяПравилаИзФайла(ИмяПланаОбмена) Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ОбменДанными=%1", ИмяПланаОбмена); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); + КонецЕсли; + +КонецПроцедуры + // Создает новый экземпляр объекта Структура, заполняет объект данными указанной структуры. // // Параметры: @@ -3075,7 +3100,7 @@ Если ТипЗнч(Значение) = Тип("Массив") Тогда - ДанныеРеквизита = ПолучитьСсылочныйТипИзПервогоРеквизитаТабличнойЧастиПланаОбмена(ИмяПланаОбмена, Ключ); + ДанныеРеквизита = СсылочныйТипИзПервогоРеквизитаТабличнойЧастиПланаОбмена(ИмяПланаОбмена, Ключ); Если ДанныеРеквизита = Неопределено Тогда Продолжить; @@ -3131,7 +3156,7 @@ КонецПроцедуры -Функция ПолучитьСсылочныйТипИзПервогоРеквизитаТабличнойЧастиПланаОбмена(Знач ИмяПланаОбмена, Знач ИмяТабличнойЧасти) +Функция СсылочныйТипИзПервогоРеквизитаТабличнойЧастиПланаОбмена(Знач ИмяПланаОбмена, Знач ИмяТабличнойЧасти) ТабличнаяЧасть = Метаданные.ПланыОбмена[ИмяПланаОбмена].ТабличныеЧасти[ИмяТабличнойЧасти]; @@ -3178,7 +3203,7 @@ // Возвращаемое значение: // НаборЗаписей, содержащий текущее значение в информационной базе. // -Функция ПолучитьНаборЗаписей(Знач Данные) +Функция НаборЗаписей(Знач Данные) ОбъектМетаданных = Данные.Метаданные(); @@ -3224,12 +3249,6 @@ МетаданныеОбъекта = ЭлементДанных.Метаданные(); ЭтоСсылочныйТип = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта); - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Отправитель); - Если Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) - И Не ОбменДаннымиПовтИсп.ПланОбменаСодержитОбъект(ИмяПланаОбмена, МетаданныеОбъекта.ПолноеИмя()) Тогда - Возврат; - КонецЕсли; - ЕстьКоллизия = ПланыОбмена.ИзменениеЗарегистрировано(Отправитель, ЭлементДанных); // Выполняем дополнительную проверку на изменение объекта @@ -3247,8 +3266,8 @@ ОбъектВБазе = Неопределено; КонецЕсли; - СтрокаОбъектаДоИзменения = ПолучитьДанныеОбъектаСтрокойДоИзменения(ЭлементДанных, МетаданныеОбъекта, ЭтоСсылочныйТип, СсылкаСуществует, ОбъектВБазе); - СтрокаОбъектаПослеИзменения = ПолучитьДанныеОбъектаСтрокойПослеИзменения(ЭлементДанных, МетаданныеОбъекта); + СтрокаОбъектаДоИзменения = ДанныеОбъектаСтрокойДоИзменения(ЭлементДанных, МетаданныеОбъекта, ЭтоСсылочныйТип, СсылкаСуществует, ОбъектВБазе); + СтрокаОбъектаПослеИзменения = ДанныеОбъектаСтрокойПослеИзменения(ЭлементДанных, МетаданныеОбъекта); // Если значения совпадают, то коллизии нет. Если СтрокаОбъектаДоИзменения = СтрокаОбъектаПослеИзменения Тогда @@ -3349,15 +3368,14 @@ // Регистрирует запрет на загрузку данных по причине установленной даты запрета загрузки данных // в журнале регистрации. Для ссылочных типов при наличии подсистемы ВерсионированиеОбъектов // регистрирует его так же в мониторе проблем обмена. -// +// Для проверки наличия запрета загрузки по дате см. процедуру +// общего модуля ДатыЗапретаИзменения.ПроверитьДатыЗапретаЗагрузкиДанных. +// // Параметры: // Объект - Объект ссылочного типа для которого выполняется регистрация запрета. // УзелОбмена - ПланОбменаСсылка - Узел информационной базы из которой получен объект. // СообщениеОбОшибке - Строка - Подробное описание причины отказа от загрузки. // -// Примечание: Для проверки наличия запрета загрузки по дате см. процедуру -// общего модуля ДатыЗапретаИзменения.ПроверитьДатыЗапретаЗагрузкиДанных. -// Процедура ЗарегистрироватьЗапретЗагрузкиДанныхПоДате(ЭлементДанных, Отправитель, СообщениеОбОшибке) ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), @@ -3428,7 +3446,7 @@ КонецПроцедуры -Функция ПолучитьДанныеОбъектаСтрокойДоИзменения(Объект, МетаданныеОбъекта, ЭтоСсылочныйТип, СсылкаСуществует, ОбъектВБазе) +Функция ДанныеОбъектаСтрокойДоИзменения(Объект, МетаданныеОбъекта, ЭтоСсылочныйТип, СсылкаСуществует, ОбъектВБазе) // Возвращаемое значение функции. СтрокаОбъекта = ""; @@ -3453,7 +3471,7 @@ Иначе // Набор записей - СтарыйНаборЗаписей = ПолучитьНаборЗаписей(Объект); + СтарыйНаборЗаписей = НаборЗаписей(Объект); СтрокаОбъекта = ОбщегоНазначения.ЗначениеВСтрокуXML(СтарыйНаборЗаписей); КонецЕсли; @@ -3462,7 +3480,7 @@ КонецФункции -Функция ПолучитьДанныеОбъектаСтрокойПослеИзменения(Объект, МетаданныеОбъекта) +Функция ДанныеОбъектаСтрокойПослеИзменения(Объект, МетаданныеОбъекта) // Возвращаемое значение функции. СтрокаОбъекта = ""; diff --git a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl index c7084b564..1cdcb90ab 100644 --- a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl @@ -1,26 +1,20 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениями: механизм обмена сообщениями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняет отправку сообщения в адресный канал сообщений. // Соответствует типу отправки "Конечная точка/Конечная точка". // // Параметры: -// КаналСообщений - Строка. Идентификатор адресного канала сообщений. -// ТелоСообщения (необязательный) - Произвольный. Тело сообщения системы, которое необходимо отправить. -// Получатель (необязательный) - Неопределено; ПланОбменаСсылка.ОбменСообщениями; Массив. -// Неопределено - получатель сообщения не указан. Сообщение будет отправлено конечным точкам, -// которые определяются настройками текущей информационной системы: -// в обработчике ОбменСообщениямиПереопределяемый.ПолучателиСообщения (программно) -// и в регистре сведений НастройкиОтправителя (настройка системы). -// ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, который соответствует конечной точке, -// для которой предназначено сообщение. Сообщение будет отправлено только этой конечной точке. -// Массив - массив получателей сообщения; элементы массива должны иметь тип ПланОбменаСсылка.ОбменСообщениями. -// Сообщение будет отправлено всем конечным точкам, указанным в массиве. -// Значение по умолчанию: Неопределено. +// КаналСообщений - Строка - Идентификатор адресного канала сообщений. +// ТелоСообщения - Произвольный - Тело сообщения системы, которое необходимо отправить. +// Получатель - Неопределено - получатель сообщения не указан. Сообщение будет отправлено конечным точкам, +// которые определяются настройками текущей информационной системы: +// в обработчике ОбменСообщениямиПереопределяемый.ПолучателиСообщения (программно) +// и в регистре сведений НастройкиОтправителя (настройка системы). +// - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, который соответствует конечной точке, +// для которой предназначено сообщение. Сообщение будет отправлено +// только этой конечной точке. +// - Массив - массив получателей сообщения; элементы массива должны иметь тип ПланОбменаСсылка.ОбменСообщениями. +// Сообщение будет отправлено всем конечным точкам, указанным в массиве. // Процедура ОтправитьСообщение(КаналСообщений, ТелоСообщения = Неопределено, Получатель = Неопределено) Экспорт @@ -28,22 +22,21 @@ КонецПроцедуры -// Выполняет отправку быстрого сообщения в адресный канал сообщений. +// Выполняет отправку сообщения в адресный канал сообщений. // Соответствует типу отправки "Конечная точка/Конечная точка". // // Параметры: -// КаналСообщений - Строка. Идентификатор адресного канала сообщений. -// ТелоСообщения (необязательный) - Произвольный. Тело сообщения системы, которое необходимо отправить. -// Получатель (необязательный) - Неопределено; ПланОбменаСсылка.ОбменСообщениями; Массив. -// Неопределено - получатель сообщения не указан. Сообщение будет отправлено конечным точкам, -// которые определяются настройками текущей информационной системы: -// в обработчике ОбменСообщениямиПереопределяемый.ПолучателиСообщения (программно) -// и в регистре сведений НастройкиОтправителя (настройка системы). -// ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, который соответствует конечной точке, -// для которой предназначено сообщение. Сообщение будет отправлено только этой конечной точке. -// Массив - массив получателей сообщения; элементы массива должны иметь тип ПланОбменаСсылка.ОбменСообщениями. -// Сообщение будет отправлено всем конечным точкам, указанным в массиве. -// Значение по умолчанию: Неопределено. +// КаналСообщений - Строка - Идентификатор адресного канала сообщений. +// ТелоСообщения - Произвольный - Тело сообщения системы, которое необходимо отправить. +// Получатель - Неопределено - получатель сообщения не указан. Сообщение будет отправлено конечным точкам, +// которые определяются настройками текущей информационной системы: +// в обработчике ОбменСообщениямиПереопределяемый.ПолучателиСообщения (программно) +// и в регистре сведений НастройкиОтправителя (настройка системы). +// - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, который соответствует конечной точке, +// для которой предназначено сообщение. Сообщение будет отправлено +// только этой конечной точке. +// - Массив - массив получателей сообщения; элементы массива должны иметь тип ПланОбменаСсылка.ОбменСообщениями. +// Сообщение будет отправлено всем конечным точкам, указанным в массиве. // Процедура ОтправитьСообщениеСейчас(КаналСообщений, ТелоСообщения = Неопределено, Получатель = Неопределено) Экспорт @@ -57,8 +50,8 @@ // Настройка подписок на широковещательный канал выполняется через регистр сведений ПодпискиПолучателей. // // Параметры: -// КаналСообщений - Строка. Идентификатор широковещательного канала сообщений. -// ТелоСообщения (необязательный) - Произвольный. Тело сообщения системы, которое необходимо отправить. +// КаналСообщений - Строка - Идентификатор широковещательного канала сообщений. +// ТелоСообщения - Произвольный - Тело сообщения системы, которое необходимо отправить. // Процедура ОтправитьСообщениеПодписчикам(КаналСообщений, ТелоСообщения = Неопределено) Экспорт @@ -72,8 +65,8 @@ // Настройка подписок на широковещательный канал выполняется через регистр сведений ПодпискиПолучателей. // // Параметры: -// КаналСообщений - Строка. Идентификатор широковещательного канала сообщений. -// ТелоСообщения (необязательный) - Произвольный. Тело сообщения системы, которое необходимо отправить. +// КаналСообщений - Строка - Идентификатор широковещательного канала сообщений. +// ТелоСообщения - Произвольный - Тело сообщения системы, которое необходимо отправить. // Процедура ОтправитьСообщениеПодписчикамСейчас(КаналСообщений, ТелоСообщения = Неопределено) Экспорт @@ -159,7 +152,7 @@ Запрос.УстановитьПараметр("НедоступныеКонечныеТочки", НедоступныеКонечныеТочки); - РезультатЗапроса = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос); + РезультатЗапроса = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос); Если РезультатЗапроса.Пустой() Тогда Прервать; @@ -278,101 +271,6 @@ #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -// Объявляет события подсистемы РаботаВМоделиСервиса.ОбменСообщениями: -// -// Серверные события: -// -// ПриОпределенииОбработчиковКаналовСообщений, -// ПриОпределенииПолучателейСообщения, -// ПриОтправкеСообщения, -// ПриПолученииСообщения. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Получает список обработчиков сообщений, которые обрабатывают подсистемы библиотеки. - // - // Параметры: - // Обработчики - ТаблицаЗначений - состав полей см. в ОбменСообщениями.НоваяТаблицаОбработчиковСообщений. - // - // Синтаксис: - // Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт - // - // Для использования в других библиотеках. - // - // (То же, что ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"); - - // Обработчик получения динамического списка конечных точек сообщений. - // - // Параметры: - // КаналСообщений - Строка - Идентификатор канала сообщений, для которого необходимо определить конечные точки. - // Получатели - Массив - Массив конечных точек, в которые следует адресовать сообщение. - // Массив должен быть заполнен элементами типа ПланОбменаСсылка.ОбменСообщениями. - // Этот параметр необходимо определить в теле обработчика. - // - // Синтаксис: - // Процедура ПриОпределенииПолучателейСообщения(Знач КаналСообщений, Получатели) Экспорт - // - // (То же, что ОбменСообщениямиПереопределяемый.ПолучателиСообщения). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииПолучателейСообщения"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОбменСообщениямиВнутренний"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриВыгрузкеДанныхСлужебный"].Добавить( - "ОбменСообщениями"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный"].Добавить( - "ОбменСообщениями"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( - "ОбменСообщениями"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОбменСообщениями"); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.СообщенияСистемы.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции Процедура ОтправитьСообщениеВКаналСообщений(КаналСообщений, ТелоСообщения, Получатель, ЭтоБыстроеСообщение = Ложь) @@ -431,13 +329,6 @@ Получатели = РегистрыСведений.НастройкиОтправителя.ПодписчикиКаналаСообщений(КаналСообщений); // Получатели сообщения из кода. - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииПолучателейСообщения"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииПолучателейСообщения(КаналСообщений, ДинамическиПодключенныеПолучатели); - КонецЦикла; - ОбменСообщениямиПереопределяемый.ПолучателиСообщения(КаналСообщений, ДинамическиПодключенныеПолучатели); // Получаем массив уникальных получателей из двух массивов. @@ -500,7 +391,7 @@ СправочникДляСообщения = Справочники.СообщенияСистемы; СтандартнаяОбработка = Истина; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); ПереопределенныйСправочник = МодульСообщенияВМоделиСервисаРазделениеДанных.ПриВыбореСправочникаДляСообщения(ТелоСообщения); Если ПереопределенныйСправочник <> Неопределено Тогда @@ -531,7 +422,7 @@ КонецЕсли; СтандартнаяОбработкаЗаписи = Истина; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПередЗаписьюСообщения(НовоеСообщение, СтандартнаяОбработкаЗаписи); КонецЕсли; @@ -550,7 +441,6 @@ Попытка Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Константа.БлокировкаОтправкиБыстрыхСообщений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); БлокировкаОтправкиБыстрыхСообщений = Константы.БлокировкаОтправкиБыстрыхСообщений.Получить(); @@ -578,7 +468,6 @@ Попытка Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Константа.БлокировкаОтправкиБыстрыхСообщений"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Константы.БлокировкаОтправкиБыстрыхСообщений.Установить(Дата('00010101')); @@ -617,206 +506,4 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Обработчик при выгрузке данных. -// Используется для переопределения стандартной обработки выгрузки данных. -// В данном обработчике должна быть реализована логика выгрузки данных: -// выборка данных для выгрузки, сериализация данных в файл сообщения или сериализация данных в поток. -// После выполнения обработчика выгруженные данные будут отправлены получателю подсистемой обмена данными. -// Формат сообщения для выгрузки может быть произвольным. -// В случае ошибок при отправке данных следует прерывать выполнение обработчика -// методом ВызватьИсключение с описанием ошибки. -// -// Параметры: -// -// СтандартнаяОбработка - Булево - -// В данный параметр передается признак выполнения стандартной (системной) обработки события. -// Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная -// обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие. -// Значение по умолчанию: Истина. -// -// Получатель - ПланОбменаСсылка - -// Узел плана обмена, для которого выполняется выгрузка данных. -// -// ИмяФайлаСообщения - Строка - -// Имя файла, в который необходимо выполнить выгрузку данных. Если этот параметр заполнен, то система ожидает, -// что данные будут выгружены в файл. После выгрузки система выполнит отправку данных из этого файла. -// Если параметр пустой, то система ожидает, что данные будут выгружены в параметр ДанныеСообщения. -// -// ДанныеСообщения - Произвольный - -// Если параметр ИмяФайлаСообщения пустой, то система ожидает, что данные будут выгружены в этот параметр. -// -// КоличествоЭлементовВТранзакции - Число - -// Определяет максимальное число элементов данных, которые помещаются в сообщение в рамках одной транзакции базы -// данных. -// При необходимости в обработчике следует реализовать логику установки транзакционных блокировок на выгружаемые -// данные. -// Значение параметра задается в настройках подсистемы обмена данными. -// -// ИмяСобытияЖурналаРегистрации - Строка - -// Имя события журнала регистрации текущего сеанса обмена данными. Используется для записи в журнал регистрации -// данных (ошибок, предупреждений, информации) с заданным именем события. -// Соответствует параметру ИмяСобытия метода глобального контекста ЗаписьЖурналаРегистрации. -// -// КоличествоОтправленныхОбъектов - Число - -// Счетчик отправленных объектов. Используется для определения количества отправленных объектов -// для последующей фиксации в протоколе обмена. -// -Процедура ПриВыгрузкеДанныхСлужебный(СтандартнаяОбработка, - Получатель, - ИмяФайлаСообщения, - ДанныеСообщения, - КоличествоЭлементовВТранзакции, - ИмяСобытияЖурналаРегистрации, - КоличествоОтправленныхОбъектов) Экспорт - - ОбменСообщениямиВнутренний.ПриВыгрузкеДанных(СтандартнаяОбработка, - Получатель, - ИмяФайлаСообщения, - ДанныеСообщения, - КоличествоЭлементовВТранзакции, - ИмяСобытияЖурналаРегистрации, - КоличествоОтправленныхОбъектов); - -КонецПроцедуры - -// Обработчик при загрузке данных. -// Используется для переопределения стандартной обработки загрузки данных. -// В данном обработчике должна быть реализована логика загрузки данных: -// необходимые проверки перед загрузкой данных, сериализация данных из файла сообщения или сериализация данных из -// потока. -// Формат сообщения для загрузки может быть произвольным. -// В случае ошибок при получении данных следует прерывать выполнение обработчика -// методом ВызватьИсключение с описанием ошибки. -// -// Параметры: -// -// СтандартнаяОбработка - Булево - В данный параметр передается признак выполнения -// стандартной (системной) обработки события. Если в теле процедуры-обработчика -// установить данному параметру значение Ложь, стандартная обработка -// события производиться не будет. -// Отказ от стандартной обработки не отменяет действие. -// Значение по умолчанию: Истина. -// Отправитель - ПланОбменаСсылка -Узел плана обмена, для которого выполняется загрузка данных. -// ИмяФайлаСообщения - Строка - Имя файла, из которого требуется выполнить загрузку данных. -// Если параметр не заполнен, то данные для загрузки -// передаются через параметр ДанныеСообщения. -// ДанныеСообщения - Произвольный -Параметр содержит данные, которые необходимо загрузить. -// Если параметр ИмяФайлаСообщения пустой, -// то данные для загрузки передаются через этот параметр. -// КоличествоЭлементовВТранзакции - Число - Определяет максимальное число элементов данных, которые читаются из -// сообщения и записываются в базу данных в рамках одной транзакции. -// При необходимости в обработчике следует реализовать логику записи данных в -// транзакции. -// Значение параметра задается в настройках подсистемы обмена данными. -// ИмяСобытияЖурналаРегистрации - Строка - Имя события журнала регистрации текущего сеанса обмена данными. -// Используется для записи в журнал регистрации данных -// (ошибок, предупреждений, информации) с заданным именем события. -// Соответствует параметру ИмяСобытия метода глобального контекста -// ЗаписьЖурналаРегистрации. -// КоличествоПолученныхОбъектов - Число - Счетчик полученных объектов. Используется для определения -// количества загруженных объектов для последующей фиксации в протоколе обмена. -// -Процедура ПриЗагрузкеДанныхСлужебный(СтандартнаяОбработка, - Отправитель, - ИмяФайлаСообщения, - ДанныеСообщения, - КоличествоЭлементовВТранзакции, - ИмяСобытияЖурналаРегистрации, - КоличествоПолученныхОбъектов) Экспорт - - ОбменСообщениямиВнутренний.ПриЗагрузкеДанных(СтандартнаяОбработка, - Отправитель, - ИмяФайлаСообщения, - ДанныеСообщения, - КоличествоЭлементовВТранзакции, - ИмяСобытияЖурналаРегистрации, - КоличествоПолученныхОбъектов); - -КонецПроцедуры - -// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию подсистем, -// используя в качестве ключей названия подсистем. -// Обеспечивает функциональность Web-сервиса InterfaceVersion. -// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). -// -// Параметры: -// СтруктураПоддерживаемыхВерсий - Структура: -// - Ключи = Названия подсистем. -// - Значения = Массивы названий поддерживаемых версий. -// -// Пример реализации: -// -// // СервисПередачиФайлов -// МассивВерсий = Новый Массив; -// МассивВерсий.Добавить("1.0.1.1"); -// МассивВерсий.Добавить("1.0.2.1"); -// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); -// // Конец СервисПередачиФайлов -// -Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт - - МассивВерсий = Новый Массив; - МассивВерсий.Добавить("2.0.1.6"); - МассивВерсий.Добавить("2.1.1.7"); - МассивВерсий.Добавить("2.1.1.8"); - СтруктураПоддерживаемыхВерсий.Вставить("ОбменСообщениями", МассивВерсий); - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - МассивСправочников = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений(); - Для Каждого СправочникСообщений Из МассивСправочников Цикл - Типы.Добавить(СправочникСообщений.ПустаяСсылка().Метаданные()); - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Обработчик события при отправке сообщения. -// Обработчик данного события вызывается перед помещением сообщения в XML-поток. -// Обработчик вызывается для каждого отправляемого сообщения. -// -// Параметры: -// КаналСообщений - Строка - Идентификатор канала сообщений, из которого получено сообщение. -// ТелоСообщения - Произвольный - Тело полученного сообщения. В обработчике события -// тело сообщения может быть изменено, например, дополнено информацией. -// -Процедура ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); - МодульСообщенияВМоделиСервиса.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события при получении сообщения. -// Обработчик данного события вызывается при получении сообщения из XML-потока. -// Обработчик вызывается для каждого получаемого сообщения. -// -// Параметры: -// КаналСообщений - Строка - Идентификатор канала сообщений, из которого получено сообщение. -// ТелоСообщения - Произвольный - Тело полученного сообщения. В обработчике события -// тело сообщения может быть изменено, например, дополнено информацией. -// -Процедура ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); - МодульСообщенияВМоделиСервиса.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl index f9a12aa68..a3f9be6ee 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl @@ -1,16 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениямиВнутренний. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс +// Только для внутреннего использования. +Функция ЭтотУзел() Экспорт + + Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел(); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистемы Обмена данными. -// Обработчик события ПриВыгрузкеДанных подсистемы Обмена данными. -// Описание обработчика см. ОбщийМодуль.ОбменДаннымиПереопределяемый.ПриВыгрузкеДанных(). -// +// См. ОбменДаннымиПереопределяемый.ПриВыгрузкеДанных. Процедура ПриВыгрузкеДанных(СтандартнаяОбработка, Получатель, ИмяФайлаСообщения, @@ -93,9 +93,7 @@ // {Обработчик события: ПриОтправкеСообщения} Начало. ТелоСообщения = СтрокаТаблицы.Данные.ТелоСообщения.Получить(); - ПриОтправкеСообщенияБСП(СтрокаТаблицы.Данные.Наименование, ТелоСообщения, СтрокаТаблицы.Данные); - - ПриОтправкеСообщения(СтрокаТаблицы.Данные.Наименование, ТелоСообщения); + ПриОтправкеСообщения(СтрокаТаблицы.Данные.Наименование, ТелоСообщения, СтрокаТаблицы.Данные); СтрокаТаблицы.Данные.ТелоСообщения = Новый ХранилищеЗначения(ТелоСообщения); // {Обработчик события: ПриОтправкеСообщения} Окончание. @@ -134,9 +132,7 @@ КонецПроцедуры -// Обработчик события ПриЗагрузкеДанных подсистемы Обмена данными. -// Описание обработчика см. ОбщийМодуль.ОбменДаннымиПереопределяемый.ПриЗагрузкеДанных(). -// +// См. ОбменДаннымиПереопределяемый.ПриЗагрузкеДанных. Процедура ПриЗагрузкеДанных(СтандартнаяОбработка, Отправитель, ИмяФайлаСообщения, @@ -150,7 +146,7 @@ КонецЕсли; МодульРаботаВМоделиСервиса = Неопределено; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; @@ -213,9 +209,7 @@ // {Обработчик: ПриПолученииСообщения} Начало ТелоСообщения = Данные.ТелоСообщения.Получить(); - ПриПолученииСообщенияБСП(Данные.Наименование, ТелоСообщения, Данные); - - ПриПолученииСообщения(Данные.Наименование, ТелоСообщения); + ПриПолученииСообщения(Данные.Наименование, ТелоСообщения, Данные); Данные.ТелоСообщения = Новый ХранилищеЗначения(ТелоСообщения); // {Обработчик: ПриПолученииСообщения} Окончание @@ -266,14 +260,14 @@ Если Не ОбщегоНазначения.СсылкаСуществует(Ссылка) Тогда Продолжить; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(Ссылка.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Данные.Ссылка, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Ссылка.Метаданные(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда + ОбластьДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Данные.Ссылка, РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()); КонецЕсли; Иначе - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(Данные.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда - ОбластьДанных = Данные[ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()]; + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Данные.Метаданные(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда + ОбластьДанных = Данные[РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()]; КонецЕсли; КонецЕсли; @@ -288,13 +282,13 @@ Продолжить; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить обмен сообщениями по причине: область данных %1 заблокирована!'"), + НСтр("ru = 'Не удалось выполнить обмен сообщениями по причине: область данных %1 заблокирована.'"), ОбластьДанных); КонецЕсли; КонецЕсли; ТребуетсяВосстановлениеРазделения = Истина; - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); КонецЕсли; @@ -303,7 +297,7 @@ // сообщений, получателем которых выступает ИБ-корреспондент). Если ТипЗнч(Данные) <> Тип("УдалениеОбъекта") И ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель, Данные) Тогда Если ТребуетсяВосстановлениеРазделения Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; Продолжить; КонецЕсли; @@ -313,7 +307,7 @@ Данные.Записать(); Если ТребуетсяВосстановлениеРазделения Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; КонецЦикла; @@ -339,15 +333,7 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -358,6 +344,39 @@ КонецПроцедуры +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.СообщенияСистемы.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + МассивСправочников = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений(); + Для Каждого СправочникСообщений Из МассивСправочников Цикл + Типы.Добавить(СправочникСообщений.ПустаяСсылка().Метаданные()); + КонецЦикла; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт + + МассивВерсий = Новый Массив; + МассивВерсий.Добавить("2.0.1.6"); + МассивВерсий.Добавить("2.1.1.7"); + МассивВерсий.Добавить("2.1.1.8"); + СтруктураПоддерживаемыхВерсий.Вставить("ОбменСообщениями", МассивВерсий); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + // Устанавливает код этой конечной точки, если не установлен. // Процедура УстановитьКодЭтойКонечнойТочки() Экспорт @@ -375,20 +394,6 @@ //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции. -// Только для внутреннего использования. -Функция ЭтотУзел() Экспорт - - Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел(); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Экспортные служебные процедуры и функции. - // Обработчик регламентного задания для отправки и получения сообщений системы. // Процедура ОтправитьИПолучитьСообщенияПоРегламентномуЗаданию() Экспорт @@ -421,7 +426,7 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(), УровеньЖурналаРегистрации.Информация,,, @@ -439,7 +444,7 @@ КонецЕсли; МодульРаботаВМоделиСервиса = Неопределено; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; @@ -450,8 +455,8 @@ Для Каждого СправочникСообщений Из СправочникиСообщений Цикл ПолноеИмяСправочника = СправочникСообщений.ПустаяСсылка().Метаданные().ПолноеИмя(); - ЭтоНеразделенныйСправочник = Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() - ИЛИ Не ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяСправочника, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + ЭтоНеразделенныйСправочник = Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() + ИЛИ Не РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяСправочника, РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()); Если ЭтоНеразделенныйСправочник И Не ОбрабатыватьСообщенияВНеразделенныхДанных Тогда Продолжить; @@ -508,7 +513,7 @@ Запрос.УстановитьПараметр("Отбор", Отбор); Запрос.Текст = ТекстЗапроса; - РезультатЗапроса = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос); + РезультатЗапроса = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос); Выборка = РезультатЗапроса.Выбрать(); @@ -544,7 +549,7 @@ Иначе ОбъектСообщения.КоличествоПопытокОбработкиСообщения = СчетчикПопыток; КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ОбъектСообщения); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектСообщения); ОбъектСообщения.Прочитать(); ЗафиксироватьТранзакцию(); Исключение @@ -625,19 +630,19 @@ // Наличие ссылок на справочник не должно препятствовать или замедлять удаление элементов справочника. ОбъектСообщения.ОбменДанными.Загрузка = Истина; - ОбщегоНазначения.УдалитьВспомогательныеДанные(ОбъектСообщения); + РаботаВМоделиСервиса.УдалитьВспомогательныеДанные(ОбъектСообщения); Иначе ОбъектСообщения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ОбъектСообщения); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектСообщения); КонецЕсли; - Если ОбрабатыватьСообщенияВНеразделенныхДанных И ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбрабатыватьСообщенияВНеразделенныхДанных И РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После обработки сообщения канала %1 не было выключено разделение сеанса!'"), + НСтр("ru = 'После обработки сообщения канала %1 не было выключено разделение сеанса.'"), ЗаголовокСообщения.КаналСообщений); ЗаписьЖурналаРегистрации( @@ -647,7 +652,7 @@ , ТекстСообщенияОбОшибке); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; @@ -916,9 +921,7 @@ // {Обработчик события: ПриОтправкеСообщения} Начало. ТелоСообщения = Данные.ТелоСообщения.Получить(); - ПриОтправкеСообщенияБСП(Данные.Наименование, ТелоСообщения, Данные); - - ПриОтправкеСообщения(Данные.Наименование, ТелоСообщения); + ПриОтправкеСообщения(Данные.Наименование, ТелоСообщения, Данные); Данные.ТелоСообщения = Новый ХранилищеЗначения(ТелоСообщения); // {Обработчик события: ПриОтправкеСообщения} Окончание. @@ -936,7 +939,7 @@ Процедура СериализоватьДанныеИзПотока(Отправитель, Поток, ЗагруженныеОбъекты, ДанныеПрочитаныЧастично) Экспорт МодульРаботаВМоделиСервиса = Неопределено; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; @@ -958,7 +961,7 @@ Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда - ВызватьИсключение НСтр("ru = 'Передача объекта УдалениеОбъекта через механизм быстрых сообщений не поддерживается!'"); + ВызватьИсключение НСтр("ru = 'Передача объекта УдалениеОбъекта через механизм быстрых сообщений не поддерживается.'"); Иначе @@ -969,9 +972,7 @@ // {Обработчик: ПриПолученииСообщения} Начало ТелоСообщения = Данные.ТелоСообщения.Получить(); - ПриПолученииСообщенияБСП(Данные.Наименование, ТелоСообщения, Данные); - - ПриПолученииСообщения(Данные.Наименование, ТелоСообщения); + ПриПолученииСообщения(Данные.Наименование, ТелоСообщения, Данные); Данные.ТелоСообщения = Новый ХранилищеЗначения(ТелоСообщения); // {Обработчик: ПриПолученииСообщения} Окончание @@ -988,9 +989,9 @@ КонецЕсли; ТребуетсяВосстановлениеРазделения = Ложь; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(Данные.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Данные.Метаданные(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда - ОбластьДанных = Данные[ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()]; + ОбластьДанных = Данные[РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()]; Если МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(ОбластьДанных) Тогда // Сообщение для заблокированной области не может быть принято. @@ -999,20 +1000,20 @@ Продолжить; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить обмен сообщениями по причине: область данных %1 заблокирована!'"), + НСтр("ru = 'Не удалось выполнить обмен сообщениями по причине: область данных %1 заблокирована.'"), ОбластьДанных); КонецЕсли; КонецЕсли; ТребуетсяВосстановлениеРазделения = Истина; - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); КонецЕсли; // В случае коллизии изменений приоритет отдаем текущей информационной базе. Если ПланыОбмена.ИзменениеЗарегистрировано(Отправитель, Данные) Тогда Если ТребуетсяВосстановлениеРазделения Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; Продолжить; КонецЕсли; @@ -1022,7 +1023,7 @@ Данные.Записать(); Если ТребуетсяВосстановлениеРазделения Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; ЗагруженныеОбъекты.Добавить(Данные.Ссылка); @@ -1124,7 +1125,7 @@ // Только для внутреннего использования. Функция НаименованиеЭтогоУзлаПоУмолчанию() Экспорт - Возврат ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), Метаданные.Синоним, ОбменДаннымиПовтИсп.ИмяЭтойИнформационнойБазы()); + Возврат ?(РаботаВМоделиСервисаПовтИсп.РазделениеВключено(), Метаданные.Синоним, ОбменДаннымиПовтИсп.ИмяЭтойИнформационнойБазы()); КонецФункции @@ -1376,12 +1377,7 @@ Результат = НоваяТаблицаОбработчиковСообщений(); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииОбработчиковКаналовСообщений(Результат); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриОпределенииОбработчиковКаналовСообщений(Результат); ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений(Результат); @@ -1402,25 +1398,23 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий отправки и получения сообщений. -Процедура ПриОтправкеСообщенияБСП(Знач КаналСообщений, ТелоСообщения, ОбъектСообщения) +Процедура ПриОтправкеСообщения(Знач КаналСообщений, ТелоСообщения, ОбъектСообщения) - ОбменСообщениями.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); - -КонецПроцедуры - -Процедура ПриОтправкеСообщения(Знач КаналСообщений, ТелоСообщения) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + МодульСообщенияВМоделиСервиса.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); + КонецЕсли; ОбменСообщениямиПереопределяемый.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения); КонецПроцедуры -Процедура ПриПолученииСообщенияБСП(Знач КаналСообщений, ТелоСообщения, ОбъектСообщения) +Процедура ПриПолученииСообщения(Знач КаналСообщений, ТелоСообщения, ОбъектСообщения) - ОбменСообщениями.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); - -КонецПроцедуры - -Процедура ПриПолученииСообщения(Знач КаналСообщений, ТелоСообщения) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + МодульСообщенияВМоделиСервиса.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); + КонецЕсли; ОбменСообщениямиПереопределяемый.ПриПолученииСообщения(КаналСообщений, ТелоСообщения); diff --git a/SSL/src/CommonModules/ОбменСообщениямиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиВызовСервера/Module.bsl index 3b9892e7c..84dfce5ad 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполняет отправку и получение сообщений системы. diff --git a/SSL/src/CommonModules/ОбменСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиКлиент/Module.bsl index 746d0438f..dfb00ed9f 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиКлиент/Module.bsl @@ -1,29 +1,21 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениямиКлиент: механизм обмена сообщениями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Выполняет отправку и получение сообщений системы. // Процедура ОтправитьИПолучитьСообщения() Экспорт - Состояние(НСтр("ru = 'Выполняется отправка и получение сообщений.'"),, - НСтр("ru = 'Пожалуйста, подождите...'"), БиблиотекаКартинок.Информация32); - Отказ = Ложь; ОбменСообщениямиВызовСервера.ОтправитьИПолучитьСообщения(Отказ); Если Отказ Тогда - Состояние(НСтр("ru = 'Возникли ошибки при отправке и получении сообщений!'"),, + ПоказатьОповещениеПользователя(НСтр("ru = 'Возникли ошибки при отправке и получении сообщений.'"),, НСтр("ru = 'Используйте журнал регистрации для диагностики ошибок.'"), БиблиотекаКартинок.Ошибка32); Иначе - Состояние(НСтр("ru = 'Отправка и получение сообщений успешно завершены.'"),,, БиблиотекаКартинок.Информация32); + ПоказатьОповещениеПользователя(НСтр("ru = 'Отправка и получение сообщений успешно завершены.'"),,, БиблиотекаКартинок.Информация32); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменСообщениямиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиПереопределяемый/Module.bsl index 17e3bc090..34e52829e 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиПереопределяемый/Module.bsl @@ -1,16 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениямиПереопределяемый: механизм обмена сообщениями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Получает список обработчиков сообщений, которые обрабатывает // данная информационная система. // // Параметры: -// Обработчики - ТаблицаЗначений - состав полей см. в ОбменСообщениями.НоваяТаблицаОбработчиковСообщений. -// +// Обработчики - - ТаблицаЗначений - с колонками: +// * Канал - Строка - Канал сообщения. +// * Обработчик - ОбщийМодуль - Обработчик сообщения. +// Процедура ПолучитьОбработчикиКаналовСообщений(Обработчики) Экспорт diff --git a/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl index b675fe830..ca4bb316e 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениямиПовтИсп: механизм обмена сообщениями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает ссылку на объект WSПрокси для заданного узла обмена. @@ -32,7 +27,7 @@ МассивСправочников = Новый Массив(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриЗаполненииСправочниковСообщений(МассивСправочников); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl index 80f7ca004..7a8b1a759 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// Серверные процедуры и функции обновления информационной базы -// при смене версии конфигурации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -44,7 +37,8 @@ // Объект - Произвольный - записываемый объект ссылочного типа. Например, СправочникОбъект. // РегистрироватьНаУзлахПлановОбмена - Булево - включает регистрацию на узлах планов обмена при записи объекта. // ВключитьБизнесЛогику - Булево - включает бизнес-логику при записи объекта. -// ДокументРежимЗаписи - ДокументРежимЗаписи - имеет смысл только для данных типа ДокументОбъект - режим записи документа. +// ДокументРежимЗаписи - ДокументРежимЗаписи - имеет смысл только для данных типа ДокументОбъект - режим +// записи документа. // Если параметр не передан, то документ записывается в режиме "Запись". // Процедура ЗаписатьОбъект(Знач Объект, Знач РегистрироватьНаУзлахПлановОбмена = Неопределено, @@ -84,7 +78,9 @@ // РегистрНакопленияНаборЗаписей, // РегистрБухгалтерииНаборЗаписей, // РегистрРасчетаНаборЗаписей - набор записей, который необходимо записать. -// Замещать - Булево - Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям. +// Замещать - Булево - Определяет режим замещения существующей записи в соответствии с +// текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут +// дописаны к уже существующим в информационной базе записям. // РегистрироватьНаУзлахПлановОбмена - Булево - включает регистрацию на узлах планов обмена при записи объекта. // ВключитьБизнесЛогику - Булево - включает бизнес-логику при записи объекта. // @@ -132,7 +128,7 @@ // Возвращает строковую константу для формирования сообщений журнала регистрации. // // Возвращаемое значение: -// Строка +// Строка - текст события журнала регистрации. // Функция СобытиеЖурналаРегистрации() Экспорт @@ -232,7 +228,7 @@ ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда Обработан = Ложь; Иначе - Обработан = РаботаВБезопасномРежиме.ВычислитьВБезопасномРежиме( + Обработан = ОбщегоНазначения.ВычислитьВБезопасномРежиме( СвойстваОбработчика.ПроцедураПроверки + "(Параметры)", МетаданныеИОтбор); КонецЕсли; @@ -388,10 +384,12 @@ // * ЭтоДвижения - Булево - в параметре Данные функции переданы ссылки на регистраторы, по которым нужно обновить движения, // Значение по умолчанию - ЛОЖЬ. // * ПолноеИмяРегистра - Строка - полное имя регистра, по которому нужно обновить данные. Например, РегистрНакопления.ТоварыНаСкладах. -// * ОтметитьВсеРегистраторы - Булево - необходимо отметить к обработке все проведенные документы переданного во втором параметре типа. -// В этом случае в параметре Данные процедуры можно передавать ОбъектМетаданных:Документ или ДокументСсылка. -// * ЭтоНезависимыйРегистрСведений - Булево - в параметре Данные функции передана таблица со значениями измерений, по которым нужно обновлять данные, -// Значение по умолчанию - ЛОЖЬ. +// * ОтметитьВсеРегистраторы - Булево - необходимо отметить к обработке все проведенные документы переданного во +// втором параметре типа. +// В этом случае в параметре Данные процедуры можно передавать +// ОбъектМетаданных:Документ или ДокументСсылка. +// * ЭтоНезависимыйРегистрСведений - Булево - в параметре Данные функции передана таблица со значениями измерений, +// по которым нужно обновлять данные, Значение по умолчанию - ЛОЖЬ. // Функция ДополнительныеПараметрыОтметкиОбработки() Экспорт @@ -405,12 +403,15 @@ КонецФункции -// Основные параметры процедуры ОбновлениеИнформационнойБазы.ОтметитьКОбработке, которые инициализируются механизмом регистрации изменений +// Основные параметры процедуры ОбновлениеИнформационнойБазы.ОтметитьКОбработке, +// которые инициализируются механизмом регистрации изменений // и не должны переопределяться в коде процедур отметки к обработке обработчиков обновления. // -// ВозвращаемоеЗначение - Структура: -// *Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. -// *ЗаписьИзмененийДляПодчиненногоУзлаРИБСФильтрами - ЗаписьFastInfoset - параметр существует, только если внедрена подсистема ОбменДанными. +// Возвращаемое значение: +// Структура - со свойствами: +// * Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. +// * ЗаписьИзмененийДляПодчиненногоУзлаРИБСФильтрами - ЗаписьFastInfoset - параметр +// существует, только если внедрена подсистема ОбменДанными. // Функция ОсновныеПараметрыОтметкиКОбработке() Экспорт @@ -547,17 +548,22 @@ КонецФункции // Отмечает, что переданные данные необходимо обновить. +// Важно: не рекомендуется передавать в параметр Данные сразу все данные, которые +// необходимо зарегистрировать к обработке, т.к. большие коллекции типа Массив +// или ТаблицаЗначений могут занять существенный объем памяти сервера и привести +// к сильному снижению производительности системы. Рекомендуется получать и передавать +// данные небольшими порциями, например, по 1000 объектов. // // Параметры: -// Параметры - Структура - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. -// Данные - Ссылка, Массив, НаборЗаписей - данные, по которым нужно зарегистрировать изменения. -// - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: -// - все измерения регистра должны входить в основной отбор -// - в таблице должны быть только колонки, соответствующие по именам измерениям регистра, -// по которым нужно регистрировать необходимость обработки -// - запись наборов в процессе обновления должна проходить с тем же отбором, -// что и регистрация необходимости обработки -// - в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. +// ОсновныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. +// Данные - Ссылка, Массив, НаборЗаписей - данные, по которым нужно зарегистрировать изменения. +// - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: +// - все измерения регистра должны входить в основной отбор +// - в таблице должны быть только колонки, соответствующие по именам измерениям регистра, +// по которым нужно регистрировать необходимость обработки +// - запись наборов в процессе обновления должна проходить с тем же отбором, +// что и регистрация необходимости обработки +// - в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. // ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки. // Процедура ОтметитьКОбработке(ОсновныеПараметры, Данные, ДополнительныеПараметры = Неопределено) Экспорт @@ -672,8 +678,8 @@ // Отмечает, что по переданным регистраторам нужно переформировать движения. // // Параметры: -// Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. -// Регистраторы - Массив - массив ссылок регистраторов. +// Параметры - Структура - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. +// Регистраторы - Массив - массив ссылок регистраторов. // ПолноеИмяРегистра - Строка - полное имя регистра, для которого необходимо обновить движения. // Процедура ОтметитьРегистраторыКОбработке(Параметры, Регистраторы, ПолноеИмяРегистра) Экспорт @@ -685,31 +691,25 @@ КонецПроцедуры - // Дополнительные параметры выборки данных для обработки. -// +// // Возвращаемое значение: // Структура - поля структуры: -// * ВыбиратьПорциями - Булево - выбирать данные для обработки порциями. -// Если выбираются документы, то в порция определяется с учетом упорядочивания по убыванию по дате документа. -// Если выбираются регистраторы регистра, то в порция определяется с учетом упорядочивания по убыванию -// по дате регистратора , если передано полное имя документа. Если полное имя документа не передано -// - упорядочивание происходит по периоду регистра: -// - берется максимальная дата по каждому регистратору -// - если по регистратору нет записей - он в топе. -// * ИмяВременнойТаблицы - Строка - параметр актуален для методов, создающих временные таблицы. Если имя не задано (поведение по умолчанию), -// то временная таблица будет создана с именем, указанным в описании каждого метода. -// * ДополнительныеИсточникиДанных - Соответствие - параметр актуален для методов, выбирающих регистраторы и ссылки для обработки. -// В ключах соответствия могут лежать -// - пути к реквизитам шапки документа или реквизитам табличных частей, которые участвуют -// в соединениях с другими таблицами (в т.ч. неявных соединениях при обращении "через точку"). -// Процедуры проверяют блокировку данных этих таблиц обработчиками меньших очередей. -// Формат имен <ИмяРеквизита> или <ИмяТабличной>.<ИмяРеквизитаТабличнойЧасти>. -// Например, "Контрагент" или "Товары.Номенклатура" -// - имена регистров, подчиненных регистратору. -// Процедуры проверяют блокировку данных этих таблиц обработчиками регистров меньших очередей. -// Формат имен <КлассРегистра>.<ИмяРегистра>. -// Например, "РегистрНакопления.ТоварыНаСкладах". +// *ВыбиратьПорциями - Булево - выбирать данные для обработки порциями. +// Если выбираются документы, то в порция определяется с учетом упорядочивания по убыванию по дате документа. +// Если выбираются регистраторы регистра, то в порция определяется с учетом упорядочивания по убыванию +// по дате регистратора , если передано полное имя документа. Если полное имя документа не передано +// - упорядочивание происходит по периоду регистра: +// - берется максимальная дата по каждому регистратору +// - если по регистратору нет записей - он в топе. +// *ИмяВременнойТаблицы - Строка - параметр актуален для методов, создающих временные таблицы. Если имя не задано (поведение по умолчанию), +// то временная таблица будет создана с именем, указанным в описании каждого метода. +// *ДополнительныеИсточникиДанных - Соответствие - параметр актуален для методов, выбирающих регистраторы и ссылки для обработки. +// В ключах соответствия лежат пути к реквизитам шапки документа +// или реквизитам табличных частей, +// которые участвуют в соединениях с другими таблицами (в т.ч. неявных соединениях при обращении +// "через точку"). Процедуры проверяют блокировку данных этих таблиц обработчиками меньших очередей. +// Формат имен <ИмяРеквизита> или <ИмяТабличной>.<ИмяРеквизитаТабличнойЧасти>. // Функция ДополнительныеПараметрыВыборкиДанныхДляОбработки() Экспорт @@ -741,7 +741,8 @@ // // Возвращаемое значение: // Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по двум причинам +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по +// двум причинам // - все обработано или все, что нужно обработать, еще заблокировано обработчиками с меньшей очередью. // * ЕстьДанныеДляОбработки - Булево - в очереди есть ссылки для обработки, т.е. еще не все обработано. // * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. @@ -1161,7 +1162,8 @@ // // Возвращаемое значение: // Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по двум причинам +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по +// двум причинам // - все обработано или все, что нужно обработать, еще заблокировано обработчиками с меньшей очередью. // * ЕстьДанныеДляОбработки - Булево - в очереди есть ссылки для обработки, т.е. еще не все обработано. // * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. @@ -1314,7 +1316,8 @@ // ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // // Возвращаемое значение: -// ВыборкаИзРезультатаЗапроса - выборка значений измерений, которые нужно обработать, имена полей соответствует именам измерений регистра. +// ВыборкаИзРезультатаЗапроса - выборка значений измерений, которые нужно обработать, имена полей соответствует именам +// измерений регистра. // Если по измерению не регистрировалась необходимость обработки, то в выборке по этому измерению будет // пустое значение. // @@ -1430,7 +1433,8 @@ // // Возвращаемое значение: // Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по двум причинам +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по +// двум причинам // - все обработано или все, что нужно обработать, еще заблокировано обработчиками с меньшей очередью. // * ЕстьДанныеДляОбработки - Булево - в очереди есть данные для обработки, т.е. еще не все обработано. // * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. @@ -1462,11 +1466,17 @@ |; | |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 500 + |ВЫБРАТЬ | &ТекстВыборкиИзмерений |ПОМЕСТИТЬ #ВТДляОбработкиИзмерения |ИЗ | ВТДляОбработкиИзмеренияПолная КАК ТаблицаИзменений + |ГДЕ + | &ТекстУсловияОтбораПорции В + | (ВЫБРАТЬ ПЕРВЫЕ 500 + | &ТекстВыборкиИзмерений + | ИЗ + | ВТДляОбработкиИзмеренияПолная КАК ТаблицаИзменений) |; | |//////////////////////////////////////////////////////////////////////////////// @@ -1495,6 +1505,7 @@ КонецЕсли; ТекстВыборкиИзмерений = ""; ТекстУсловияСоединенияИзмерений = "ИСТИНА"; + ТекстУсловияОтбораПорции = ""; ПервоеИзмерение = Истина; РегистрПериодический = @@ -1508,6 +1519,9 @@ ТекстВыборкиИзмерений = ТекстВыборкиИзмерений + " | ТаблицаИзменений." + Измерение.Имя + " КАК " + Измерение.Имя + ","; + ТекстУсловияОтбораПорции = ТекстУсловияОтбораПорции + " + | ТаблицаИзменений." + Измерение.Имя + ","; + ТекстУсловияСоединенияИзмерений = ТекстУсловияСоединенияИзмерений + " | И ТаблицаИзменений." + Измерение.Имя + " = ВТЗаблокированоИзмерения." + Измерение.Имя + " | ИЛИ ТаблицаИзменений." + Измерение.Имя + " = &ПустоеЗначениеИзмерения"+ Измерение.Имя + " @@ -1520,6 +1534,8 @@ Если РегистрПериодический Тогда ТекстВыборкиИзмерений = ТекстВыборкиИзмерений + " | ТаблицаИзменений.Период КАК Период,"; + ТекстУсловияОтбораПорции = ТекстУсловияОтбораПорции + " + | ТаблицаИзменений.Период,"; КонецЕсли; ПервоеИзмерение = Ложь; @@ -1527,6 +1543,8 @@ КонецЦикла; ТекстВыборкиИзмерений = Лев(ТекстВыборкиИзмерений, СтрДлина(ТекстВыборкиИзмерений) - 1); + ТекстУсловияОтбораПорции = Лев(ТекстУсловияОтбораПорции, СтрДлина(ТекстУсловияОтбораПорции) - 1); + ТекстУсловияОтбораПорции = "("+ТекстУсловияОтбораПорции+")"; Если ПустаяСтрока(ДополнительныеПараметры.ИмяВременнойТаблицы) Тогда ИмяВременнойТаблицы = "ВТДляОбработки" + ИмяОбъекта; @@ -1540,6 +1558,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ВТЗаблокированоИзмерения","ВТЗаблокировано" + ИмяОбъекта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ВТДляОбработкиИзмерения",ИмяВременнойТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстУсловияОтбораПорции",ТекстУсловияОтбораПорции); СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяОбъекта, МенеджерВременныхТаблиц); ДобавитьПроверкуБлокировкиДополнительныхИсточниковДляНезависимогоРегистра(Очередь, @@ -1572,21 +1591,24 @@ // Проверяет, есть ли еще необработанные данные. // // Параметры: -// Очередь - Число, Неопределено - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, которые он будет обрабатывать. -// Неопределено - проверяется, завершена ли обработка в целом; -// Массив - проверяется есть данные для обработки в списке очередей. -// ПолноеИмяМетаданныеОбъекта - Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или его метаданные. -// Например, "Документ.ПриходныйОрдерНаТовары" -// - Массив - массив полных имен объектов или объектов метаданных, в массиве не должно быть независимых регистров сведений. +// Очередь - Число - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, +// которые он будет обрабатывать. +// - Неопределено - проверяется, завершена ли обработка в целом; +// - Массив - проверяется есть данные для обработки в списке очередей. +// ПолноеИмяМетаданныеОбъекта- Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или +// его метаданные. Например, "Документ.ПриходныйОрдерНаТовары" +// - Массив - массив полных имен объектов или объектов метаданных, +// в массиве не должно быть независимых регистров сведений. // Отбор - ЛюбаяСсылка, Структура, Неопределено, Массив - отбор данных для проверки. -// Если передано Неопределено - проверяется по всему типу объекта, -// Если объект - регистр, подчиненный регистратору, то в отборе - ссылка на регистратор или массив ссылок. -// Если объект ссылочного типа, то в отборе - или ссылка, или массив ссылок. -// Если объект - независимый регистр сведений, то в отборе - структура со значениями измерений. -// Ключ структуры - имя измерения, значение - значение отбора (можно передать массив значений). -// +// Если передано Неопределено - проверяется по всему типу объекта, +// Если объект - регистр, подчиненный регистратору, то в отборе - ссылка +// на регистратор или массив ссылок. +// Если объект ссылочного типа, то в отборе - или ссылка, или массив ссылок. +// Если объект - независимый регистр сведений, то в отборе - структура со значениями измерений. +// Ключ структуры - имя измерения, значение - значение отбора (можно передать массив значений). +// // Возвращаемое значение: -// Булево +// Булево - Истина, если еще не все данные обработаны. // Функция ЕстьДанныеДляОбработки(Очередь, ПолноеИмяМетаданныеОбъекта, Отбор = Неопределено) Экспорт @@ -1756,21 +1778,24 @@ // Проверяет, что все данные обработаны. // // Параметры: -// Очередь - Число, Неопределено - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, которые он будет обрабатывать. -// Неопределено - проверяется, завершена ли обработка в целом; -// Массив - проверяется есть данные для обработки в списке очередей. -// ПолноеИмяМетаданныеОбъекта - Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или его метаданные. -// Например, "Документ.ПриходныйОрдерНаТовары" -// - Массив - массив полных имен объектов или объектов метаданных, в массиве не должно быть независимых регистров сведений. +// Очередь - Число - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, +// которые он будет обрабатывать. +// - Неопределено - проверяется, завершена ли обработка в целом; +// - Массив - проверяется есть данные для обработки в списке очередей. +// ПолноеИмяМетаданныеОбъекта- Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или +// его метаданные. Например, "Документ.ПриходныйОрдерНаТовары" +// - Массив - массив полных имен объектов или объектов метаданных, +// в массиве не должно быть независимых регистров сведений. // Отбор - ЛюбаяСсылка, Структура, Неопределено, Массив - отбор данных для проверки. -// Если передано Неопределено - проверяется по всему типу объекта, -// Если объект - регистр, подчиненный регистратору, то в отборе - ссылка на регистратор или массив ссылок. -// Если объект ссылочного типа, то в отборе - или ссылка, или массив ссылок. -// Если объект - независимый регистр сведений, то в отборе - структура со значениями измерений. -// Ключ структуры - имя измерения, значение - значение отбора (можно передать массив значений). +// Если передано Неопределено - проверяется по всему типу объекта, +// Если объект - регистр, подчиненный регистратору, то в отборе - ссылка +// на регистратор или массив ссылок. +// Если объект ссылочного типа, то в отборе - или ссылка, или массив ссылок. +// Если объект - независимый регистр сведений, то в отборе - структура со значениями измерений. +// Ключ структуры - имя измерения, значение - значение отбора (можно передать массив значений). // // Возвращаемое значение: -// Булево +// Булево - Истина, если еще не все данные обработаны. // Функция ОбработкаДанныхЗавершена(Очередь, ПолноеИмяМетаданныеОбъекта, Отбор = Неопределено) Экспорт @@ -1781,14 +1806,15 @@ // Проверяет есть заблокированные меньшими очередями обработки данные. // // Параметры: -// Очередь - Число, Неопределено - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, которые он будет -// обрабатывать. -// ПолноеИмяМетаданныеОбъекта - Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или его метаданные. -// Например, "Документ.ПриходныйОрдерНаТовары" -// - Массив - массив полных имен объектов или объектов метаданных, в массиве не должно быть независимых регистров сведений. +// Очередь - Число, Неопределено - очередь, к которой отнесен обработчик и в которой +// зарегистрированы данные, которые он будет обрабатывать. +// ПолноеИмяМетаданныеОбъекта - Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или +// его метаданные. Например, "Документ.ПриходныйОрдерНаТовары" +// - Массив - массив полных имен объектов или объектов метаданных, +// в массиве не должно быть независимых регистров сведений. // // Возвращаемое значение: -// Булево +// Булево - Истина, если данный объект заблокирован для обработки меньшими очередями. // Функция ЕстьЗаблокированныеПредыдущимиОчередямиДанные(Очередь, ПолноеИмяМетаданныеОбъекта) Экспорт @@ -1799,17 +1825,19 @@ // Проверяет завершилась ли обработка данных обработчиками, отнесенными на более раннюю очередь. // // Параметры: -// Очередь - Число, Неопределено - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, которые он будет обрабатывать. -// Неопределено - проверяется, завершена ли обработка в целом; -// Массив - проверяется есть данные для обработки в списке очередей. -// Данные - ЛюбаяСсылка, НаборЗаписей, Объект, ДанныеФормыСтруктура - ссылка на объект, сам объект -// или набор записей, который необходимо проверить. Если ДополнительныеПараметры.ЭтоДвижения = Истина, то Данные - это регистратор -// указанного в ДополнительныеПараметры регистра. -// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки. -// МетаданныеИОтбор - Структура - см. ОбновлениеИнформационнойБазы.МетаданныеИОтборПоДанным. +// Очередь - Число - очередь, к которой отнесен обработчик и в которой зарегистрированы данные, +// которые он будет обрабатывать. +// - Неопределено - проверяется, завершена ли обработка в целом; +// - Массив - проверяется есть данные для обработки в списке очередей. +// Данные - ЛюбаяСсылка, НаборЗаписей, Объект, ДанныеФормыСтруктура - ссылка на объект, сам объект +// или набор записей, который необходимо проверить. +// Если ДополнительныеПараметры.ЭтоДвижения = Истина, то Данные - это регистратор +// указанного в ДополнительныеПараметры регистра. +// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки. +// МетаданныеИОтбор - Структура - см. ОбновлениеИнформационнойБазы.МетаданныеИОтборПоДанным. // // Возвращаемое значение: -// Булево +// Булево - Истина, если переданный объект обновлен на новую версию и его можно изменять. // Функция МожноЧитатьИМенять(Очередь, Данные, ДополнительныеПараметры = Неопределено, МетаданныеИОтбор = Неопределено) Экспорт @@ -1838,27 +1866,29 @@ КонецФункции // Создает временную таблицу заблокированных данных. -// Имя таблицы: ВТЗаблокированы<ИмяОбъекта>, например ВТЗаблокированоНоменклатура. +// Имя таблицы: ВТЗаблокированы<ИмяОбъекта>, например ВТЗаблокированоНоменклатура. // Колонки таблицы -// для объектов ссылочного типа: -// * Ссылка -// для регистров, подчиненных регистратору -// * Регистратор -// для регистров с непосредственной записью -// * колонки, соответствующие измерениям регистра. +// для объектов ссылочного типа: +// * Ссылка +// для регистров, подчиненных регистратору +// * Регистратор +// для регистров с непосредственной записью +// * колонки, соответствующие измерениям регистра. // // Параметры: -// Очередь,Неопределено - Число - очередь обработки, в которой выполняется текущий обработчик. Если передано Неопределенно, то проверяется во всех очередях. -// ПолноеИмяОбъекта - Строка - полное имя объекта, для которого выполняется проверка, например, Справочник.Номенклатура. -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. -// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, -// параметр ВыбиратьПорциями игнорируется, заблокированные данные всегда помещаются в таблицу целиком. +// Очередь - Число, Неопределено - очередь обработки, в которой выполняется текущий обработчик. +// Если передано Неопределенно, то проверяется во всех очередях. +// ПолноеИмяОбъекта - Строка - полное имя объекта, для которого выполняется проверка, +// например, Справочник.Номенклатура. +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, +// параметр ВыбиратьПорциями игнорируется, заблокированные данные всегда помещаются в +// таблицу целиком. // -// // Возвращаемое значение: -// Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. -// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. +// Структура - структура со свойствами: +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. +// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. // Функция СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяОбъекта, МенеджерВременныхТаблиц, ДополнительныеПараметры = Неопределено) Экспорт @@ -2017,23 +2047,25 @@ КонецФункции // Создает временную таблицу заблокированных ссылок. -// Имя таблицы: ВТЗаблокировано. -// Колонки таблицы -// * Ссылка +// Имя таблицы: ВТЗаблокировано. +// Колонки таблицы: +// * Ссылка. // // Параметры: -// Очередь,Неопределено - Число - очередь обработки, в которой выполняется текущий обработчик. Если передано Неопределенно, то проверяется во всех очередях. -// ПолныеИменаОбъектов - Строка, Массив - полные имена объектов, для которых выполняется проверка, например, Справочник.Номенклатура. +// Очередь - Число, Неопределено - очередь обработки, в которой выполняется +// текущий обработчик. Если передано Неопределенно, то проверяется во всех очередях. +// ПолныеИменаОбъектов - Строка, Массив - полные имена объектов, для которых выполняется проверка, +// например, Справочник.Номенклатура. // Могут быть переданы объекты ссылочного типа, или регистры, подчиненные регистратору. -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. -// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, -// параметр ВыбиратьПорциями игнорируется, заблокированные данные всегда помещаются в таблицу целиком. +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, +// параметр ВыбиратьПорциями игнорируется, заблокированные данные +// всегда помещаются в таблицу целиком. // -// // Возвращаемое значение: -// Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. -// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. +// Структура - структура со свойствами: +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. +// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. // Функция СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок(Очередь, ПолныеИменаОбъектов, МенеджерВременныхТаблиц, ДополнительныеПараметры = Неопределено) Экспорт @@ -2189,22 +2221,26 @@ // - по ним соединяется с основной таблицей регистра // - из основной таблицы получаются значения изменений // - делается группировка -// Имя таблицы: ВТЗаблокированы<ИмяОбъекта>, например ВТЗаблокированоТоварыНаСкладах +// Имя таблицы: ВТЗаблокированы<ИмяОбъекта>, например ВТЗаблокированоТоварыНаСкладах // Колонки таблицы соответствуют переданным измерениям. // // Параметры: -// Очередь,Неопределено - Число - очередь обработки, в которой выполняется текущий обработчик. Если передано Неопределенно, то проверяется во всех очередях. -// ПолноеИмяРегистра - Строка - имя регистра, движения по которому нужно переформировать. -// Например, РегистрНакопления.ТоварыНаСкладах -// Измерения - Строка, Массив - имя измерений, по которым нужно проверить блокировку перечисленные через запятую или массив имен. -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. -// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, -// параметр ВыбиратьПорциями игнорируется, заблокированные данные всегда помещаются в таблицу целиком. +// Очередь - Число, Неопределено - очередь обработки, в которой выполняется +// текущий обработчик. Если передано Неопределенно, +// то проверяется во всех очередях. +// ПолноеИмяРегистра - Строка - имя регистра, движения по которому нужно переформировать. +// Например, РегистрНакопления.ТоварыНаСкладах +// Измерения - Строка, Массив - имя измерений, по которым нужно проверить блокировку +// перечисленные через запятую или массив имен. +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки, +// параметр ВыбиратьПорциями игнорируется, заблокированные данные +// всегда помещаются в таблицу целиком. // // Возвращаемое значение: -// Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. -// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. +// Структура - структура со свойствами: +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. +// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. // Функция СоздатьВременнуюТаблицуЗначенийЗаблокированныхИзмерений(Очередь, ПолноеИмяРегистра, Измерения, МенеджерВременныхТаблиц, ДополнительныеПараметры = Неопределено) Экспорт @@ -2297,12 +2333,16 @@ КонецФункции -// Функция для проверки объектов при открытии форм и перед записью. Может использоваться как функция проверки по умолчанию, если +// Функция для проверки объектов при открытии форм и перед записью. +// Может использоваться как функция проверки по умолчанию, если // достаточно логики - заблокированные объекты зарегистрированы на узлах плана обмена ОбновлениеИнформационнойБазы. -// Данные - ЛюбаяСсылка, НаборЗаписей, Объект, ДанныеФормыСтруктура - ссылка на объект, сам объект -// или набор записей, который необходимо проверить. +// +// Параметры: // МетаданныеИОтбор - Структура - см. ОбновлениеИнформационнойБазы.МетаданныеИОтборПоДанным. // +// Возвращаемое значение: +// Булево - Истина, если объект обновлен и доступен для изменения. +// Функция ДанныеОбновленыНаНовуюВерсиюПрограммы(МетаданныеИОтбор) Экспорт Возврат МожноЧитатьИМенять(Неопределено, МетаданныеИОтбор.Данные,,МетаданныеИОтбор); @@ -2315,7 +2355,7 @@ // Проверить необходимость обновления информационной базы при смене версии конфигурации. // // Возвращаемое значение: -// Булево +// Булево - Истина, если требуется обновление. // Функция НеобходимоОбновлениеИнформационнойБазы() Экспорт @@ -2326,12 +2366,12 @@ // Возвращает Истина, если в данный момент выполняется обновление ИБ. // // Возвращаемое значение: -// Булево +// Булево - Истина, если обновление выполняется. // Функция ВыполняетсяОбновлениеИнформационнойБазы() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат НеобходимоОбновлениеИнформационнойБазы(); КонецЕсли; @@ -2384,22 +2424,26 @@ // * БлокируемыеОбъекты - Строка - необходимо заполнять для обработчиков отложенного обновления, // для остальных заполнение не требуется. Полные имена объектов через запятую, // которые следует блокировать от изменения до завершения процедуры обработки данных. -// -// 4) Для обработчиков обновления в библиотеках (конфигурации) с параллельным режимом выполнения отложенных обработчиков: -// +// Если заполнено, то также требуется заполнить и свойство ПроцедураПроверки. // * ПроцедураПроверки - Строка - необходимо заполнять для обработчиков отложенного обновления, // для остальных заполнение не требуется. Имя функции, которая для переданного объекта // определяет, завершена ли для него процедура обработки данных. // Если переданный объект обработан, то следует вернуть значение Истина. -// Вызывается из процедуры ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан. +// Вызывается из процедуры ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан. // Параметры, передаваемые в функцию: // Параметры - Структура - см. ОбновлениеИнформационнойБазы.МетаданныеИОтборПоДанным. +// +// 4) Для обработчиков обновления в библиотеках (конфигурации) с параллельным режимом выполнения отложенных обработчиков: +// // * ПроцедураЗаполненияДанныхОбновления - Строка - указывается процедура, которая регистрирует данные, // подлежащие обновлению данным обработчиком. // * ЗапускатьТолькоВГлавномУзле - Булево - только для обработчиков отложенного обновления с режимом выполнения Параллельно. -// Указать Истина, если обработчик обновления должен выполняться только в главном узле РИБ. -// * ЗапускатьИВПодчиненномУзлеРИБСФильтрами - Булево - только для обработчиков отложенного обновления с режимом выполнения Параллельно, -// Указать Истина, если обработчик обновления должен также выполняться в подчиненном узле РИБ с фильтрами. +// Указать Истина, если обработчик обновления должен выполняться только в главном +// узле РИБ. +// * ЗапускатьИВПодчиненномУзлеРИБСФильтрами - Булево - только для обработчиков отложенного обновления с режимом +// выполнения Параллельно, +// Указать Истина, если обработчик обновления должен также выполняться в +// подчиненном узле РИБ с фильтрами. // * ЧитаемыеОбъекты - Строка - Объекты, которые обработчик обновления будет читать при обработке данных. // * ИзменяемыеОбъекты - Строка - Объекты, которые обработчик обновления будет изменять при обработке данных. // * ПриоритетыВыполнения - ТаблицаЗначений - Таблица приоритетов выполнения между отложенными обработчиками, @@ -2445,8 +2489,8 @@ Обработчики = Новый ТаблицаЗначений; // Общие свойства. Обработчики.Колонки.Добавить("НачальноеЗаполнение", Новый ОписаниеТипов("Булево")); - Обработчики.Колонки.Добавить("Версия", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); - Обработчики.Колонки.Добавить("Процедура", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("Версия", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("Процедура", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("РежимВыполнения", Новый ОписаниеТипов("Строка")); // Для библиотек. Обработчики.Колонки.Добавить("ВыполнятьВГруппеОбязательных", Новый ОписаниеТипов("Булево")); @@ -2455,17 +2499,17 @@ Обработчики.Колонки.Добавить("ОбщиеДанные", Новый ОписаниеТипов("Булево")); Обработчики.Колонки.Добавить("УправлениеОбработчиками", Новый ОписаниеТипов("Булево")); // Для отложенных обработчиков обновления. - Обработчики.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); Обработчики.Колонки.Добавить("ПроцедураПроверки", Новый ОписаниеТипов("Строка")); Обработчики.Колонки.Добавить("БлокируемыеОбъекты", Новый ОписаниеТипов("Строка")); // Для параллельного режима отложенного обновления. - Обработчики.Колонки.Добавить("ПроцедураЗаполненияДанныхОбновления", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("ПроцедураЗаполненияДанныхОбновления", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("ОчередьОтложеннойОбработки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4))); Обработчики.Колонки.Добавить("ЗапускатьТолькоВГлавномУзле", Новый ОписаниеТипов("Булево")); Обработчики.Колонки.Добавить("ЗапускатьИВПодчиненномУзлеРИБСФильтрами", Новый ОписаниеТипов("Булево")); - Обработчики.Колонки.Добавить("ЧитаемыеОбъекты", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); - Обработчики.Колонки.Добавить("ИзменяемыеОбъекты", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("ЧитаемыеОбъекты", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("ИзменяемыеОбъекты", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("ПриоритетыВыполнения"); // Устарело. Обратная совместимость с редакцией "2.2". @@ -2480,13 +2524,13 @@ // изменяющими или читающими одни и те же данные. Для использования в описании обработчиков обновления. // // Возвращаемое значение: -// Таблица значений с колонками: +// ТаблицаЗначений - с колонками: // * Порядок - Строка - порядок выполнения текущего обработчика относительно других. // Допустимые варианты - "До", "После", "Любой". // * Идентификатор - УникальныйИдентификатор - идентификатор процедуры, с которой настраивается взаимосвязь. // * Процедура - Строка - полное имя процедуры, с которой настраивается взаимосвязь. // -// Например: +// Пример: // Приоритет = ПриоритетыВыполненияОбработчика().Добавить(); // Приоритет.Порядок = "До"; // Приоритет.Процедура = "Документ.ЗаказПокупателя.ОбновитьДанныеДляПереходаНаНовуюВерсию"; @@ -2494,9 +2538,9 @@ Функция ПриоритетыВыполненияОбработчика() Экспорт Приоритеты = Новый ТаблицаЗначений; - Приоритеты.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Приоритеты.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Приоритеты.Колонки.Добавить("Идентификатор"); - Приоритеты.Колонки.Добавить("Процедура", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Приоритеты.Колонки.Добавить("Процедура", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Возврат Приоритеты; @@ -2509,6 +2553,10 @@ // ИдентификаторБиблиотеки - Строка - имя конфигурации или идентификатор библиотеки. // ВерсияМетаданныхИБ - Строка - версия метаданных, до которой необходимо выполнить обновление. // ОбработчикиОбновления - Соответствие - список обработчиков обновления. +// ОперативноеОбновление - Булево - Истина, если обновление оперативное. +// ХодВыполненияОбработчиков- Структура - со свойствами: +// * ВсегоОбработчиков - Строка - общее количество выполняемых обработчиков. +// * ВыполненоОбработчиков - Булево - количество выполненных обработчиков. // // Возвращаемое значение: // ДеревоЗначений - выполненные обработчики обновления. @@ -2530,6 +2578,7 @@ // Выполнить неинтерактивное обновление данных ИБ. // Для вызова через внешнее соединение. +// При вызове метода с подключенными расширениями, модифицирующими роли конфигурации, будет вызвано исключение. // // Для использования в других библиотеках и конфигурациях. // @@ -2645,7 +2694,7 @@ // Возвращаемое значение: // Строка - версия. // -// Пример использования: +// Пример: // ВерсияКонфигурацииИБ = ВерсияИБ(Метаданные.Имя); // Функция ВерсияИБ(Знач ИдентификаторБиблиотеки) Экспорт @@ -2714,6 +2763,32 @@ КонецПроцедуры +// Возвращает номер очереди отложенного обработчика обновления по его полному +// имени или уникальному идентификатору. +// +// Параметры: +// ИмяИлиИдентификатор - Строка, УникальныйИдентификатор - полное имя отложенного обработчика +// или его идентификатор. Подробнее см. НоваяТаблицаОбработчиковОбновления, +// описание свойств Процедура и Идентификатор. +// +// Возвращаемое значение: +// Число, Неопределено - номер очереди переданного обработчика, если +// обработчик не найден будет возвращено Неопределено. +// +Функция ОчередьОтложенногоОбработчикаОбновления(ИмяИлиИдентификатор) Экспорт + + Результат = ОбновлениеИнформационнойБазыСлужебныйПовтИсп.ОчередьОтложенногоОбработчикаОбновления(); + + Если ТипЗнч(ИмяИлиИдентификатор) = Тип("УникальныйИдентификатор") Тогда + ОчередьПоИдентификатору = Результат["ПоИдентификатору"]; + Возврат ОчередьПоИдентификатору[ИмяИлиИдентификатор]; + Иначе + ОчередьПоИмени = Результат["ПоИмени"]; + Возврат ОчередьПоИмени[ИмяИлиИдентификатор]; + КонецЕсли; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2721,14 +2796,14 @@ Процедура ДобавитьПроверкуБлокировкиДополнительныхИсточников(Очередь, ТекстЗапроса, ПолноеИмяОбъекта, ПолноеИмяРегистра, МенеджерВременныхТаблиц, ЭтоСозданиеВременнойТаблицы, ДополнительныеПараметры) Если ДополнительныеПараметры.ДополнительныеИсточникиДанных.Количество() = 0 Тогда - + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТекстЗапросаСоединениеСДопИсточникамиПоШапке", ""); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТекстЗапросаСоединениеСДопИсточникамиПоТЧ", ""); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоДопИсточникамСсылкам", "ИСТИНА"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоДопИсточникамРегистрам", "ИСТИНА"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТекстЗапросаСоединениеСДопИсточникамиРегистрами", ""); - Иначе + Иначе ДополнительныеИсточникиСсылки = Новый Массив; ДополнительныеИсточникиРегистры = Новый Массив; @@ -2746,6 +2821,8 @@ КонецЦикла; + #Область ДополнительныеИсточникиСсылки + Если ДополнительныеИсточникиСсылки.Количество() > 0 Тогда Если ПолноеИмяОбъекта = Неопределено Тогда @@ -2985,7 +3062,10 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТекстЗапросаСоединениеСДопИсточникамиПоТЧ", ""); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоДопИсточникамСсылкам", "ИСТИНА"); КонецЕсли; + #КонецОбласти + #Область ДополнительныеИсточникиРегистры + Если ДополнительныеИсточникиРегистры.Количество() > 0 Тогда ТекстЗапросаСоединениеСДопИсточникамиРегистрами = ""; @@ -3058,7 +3138,8 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоДопИсточникамРегистрам", "ИСТИНА"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТекстЗапросаСоединениеСДопИсточникамиРегистрами", ""); КонецЕсли; - КонецЕсли; + #КонецОбласти + КонецЕсли; КонецПроцедуры Функция ЭтоПримитивныйТип(ПроверяемыйТип) diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl index fc11dea3e..f20762127 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl @@ -1,10 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы библиотеки СтандартныеПодсистемы (БСП). -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ОбновлениеВерсииИБ + //////////////////////////////////////////////////////////////////////////////// // Сведения о библиотеке (или конфигурации). @@ -33,7 +32,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "СтандартныеПодсистемы"; - Описание.Версия = "2.3.7.10"; + Описание.Версия = "2.4.1.80"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0"; @@ -46,120 +45,106 @@ // для всех поддерживаемых версий библиотеки или конфигурации. // Вызывается перед началом обновления данных ИБ для построения плана обновления. // -// Обработчики - ТаблицаЗначений - описание полей, см. в процедуре. -// ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. +// Параметры: +// Обработчики - ТаблицаЗначений - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. // -// Пример добавления процедуры-обработчика в список: +// Пример: +// Для добавления своей процедуры-обработчика в список: // Обработчик = Обработчики.Добавить(); // Обработчик.Версия = "1.1.0.0"; // Обработчик.Процедура = "ОбновлениеИБ.ПерейтиНаВерсию_1_1_0_0"; -// Обработчик.РежимВыполнения = "Монопольно"; +// Обработчик.РежимВыполнения = "Оперативно"; // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - // Обработчики этого события для подсистем БСП добавляются через подписку на служебное событие: - // "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления". - // - // Процедуры обработки этого события всех подсистем БСП имеют то же имя, что и эта процедура, - // но размещены в своих подсистемах. - // Чтобы найти процедуры можно выполнить глобальный поиск по имени процедуры. - // Чтобы найти модули в которых размещены процедуры, можно выполнить поиск по имени события. - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Если Обработчик.Подсистема <> "СтандартныеПодсистемы" Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В подсистеме %1 вместо подписки на служебное событие ПриДобавленииОбработчиковОбновления - |следует использовать одноименную процедуре в общем модуле ОбновлениеИнформационнойБазы<ИмяПодсистемы>.'"), - Обработчик.Подсистема); - Продолжить; - КонецЕсли; - Обработчик.Модуль.ПриДобавленииОбработчиковОбновления(Обработчики); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриДобавленииОбработчиковОбновления(Обработчики); КонецПроцедуры -// Вызывается перед процедурами-обработчиками обновления данных ИБ. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПередОбновлениемИнформационнойБазы. Процедура ПередОбновлениемИнформационнойБазы() Экспорт - // Обработчики этого события для подсистем БСП добавляются через подписку на служебное событие: - // "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПередОбновлениемИнформационнойБазы". - // - // Процедуры обработки этого события всех подсистем БСП имеют то же имя, что и эта процедура, - // но размещены в своих подсистемах. - // Чтобы найти процедуры можно выполнить глобальный поиск по имени процедуры. - // Чтобы найти модули в которых размещены процедуры, можно выполнить поиск по имени события. - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПередОбновлениемИнформационнойБазы"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Если Обработчик.Подсистема <> "СтандартныеПодсистемы" Тогда - Продолжить; - КонецЕсли; - Обработчик.Модуль.ПередОбновлениемИнформационнойБазы(); - КонецЦикла; - КонецПроцедуры -// Вызывается после завершения обновления данных ИБ. -// -// Параметры: -// ПредыдущаяВерсия - Строка - версия до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсия - Строка - версия после обновления. -// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков обновления, -// сгруппированных по номеру версии. -// ВыводитьОписаниеОбновлений - Булево - если установить Истина, то будет выведена форма -// с описанием обновлений. По умолчанию, Истина. -// Возвращаемое значение. -// МонопольныйРежим - Булево - Истина, если обновление выполнялось в монопольном режиме. -// -// Пример обхода выполненных обработчиков обновления: -// -// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл -// -// Если Версия.Версия = "*" Тогда -// // Обработчик, который может выполнятся при каждой смене версии. -// Иначе -// // Обработчик, который выполняется для определенной версии. -// КонецЕсли; -// -// Для Каждого Обработчик Из Версия.Строки Цикл -// ... -// КонецЦикла; -// -// КонецЦикла; -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновленияИнформационнойБазы. Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - - // Вызываем процедуры-обработчики служебного события "ПослеОбновленияИнформационнойБазы". - // (Для быстрого перехода к процедурам-обработчикам выполнить глобальный поиск по имени события.). - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Если Обработчик.Подсистема <> "СтандартныеПодсистемы" Тогда - Продолжить; - КонецЕсли; - Обработчик.Модуль.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, - ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); - КонецЦикла; - + + ИнтеграцияСтандартныхПодсистем.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + КонецПроцедуры -// Вызывается при подготовке табличного документа с описанием изменений в программе. -// -// Параметры: -// Макет - ТабличныйДокумент - описание обновления всех библиотек и конфигурации. -// Макет можно дополнить или заменить. -// См. также общий макет ОписаниеИзмененийСистемы. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриПодготовкеМакетаОписанияОбновлений. Процедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) Экспорт КонецПроцедуры +// Позволяет переопределить режим обновления данных информационной базы. +// Для использования в редких (нештатных) случаях перехода, не предусмотренных в +// стандартной процедуре определения режима обновления. +// +// Параметры: +// РежимОбновленияДанных - Строка - в обработчике можно присвоить одно из значений: +// "НачальноеЗаполнение" - если это первый запуск пустой базы (области данных); +// "ОбновлениеВерсии" - если выполняется первый запуск после обновление конфигурации базы данных; +// "ПереходСДругойПрограммы" - если выполняется первый запуск после обновление конфигурации базы данных, +// в которой изменилось имя основной конфигурации. +// +// СтандартнаяОбработка - Булево - если присвоить Ложь, то стандартная процедура +// определения режима обновления не выполняется, +// а используется значение РежимОбновленияДанных. +// +Процедура ПриОпределенииРежимаОбновленияДанных(РежимОбновленияДанных, СтандартнаяОбработка) Экспорт + +КонецПроцедуры + +// Добавляет в список процедуры-обработчики перехода с другой программы (с другим именем конфигурации). +// Например, для перехода между разными, но родственными конфигурациями: базовая -> проф -> корп. +// Вызывается перед началом обновления данных ИБ. +// +// Параметры: +// Обработчики - ТаблицаЗначений - с колонками: +// * ПредыдущееИмяКонфигурации - Строка - имя конфигурации, с которой выполняется переход; +// или "*", если нужно выполнять при переходе с любой конфигурации. +// * Процедура - Строка - полное имя процедуры-обработчика перехода с программы +// ПредыдущееИмяКонфигурации. +// Например, "ОбновлениеИнформационнойБазыУПП.ЗаполнитьУчетнуюПолитику" +// Обязательно должна быть экспортной. +// +// Пример: +// Обработчик = Обработчики.Добавить(); +// Обработчик.ПредыдущееИмяКонфигурации = "УправлениеТорговлей"; +// Обработчик.Процедура = "ОбновлениеИнформационнойБазыУПП.ЗаполнитьУчетнуюПолитику"; +// +Процедура ПриДобавленииОбработчиковПереходаСДругойПрограммы(Обработчики) Экспорт + +КонецПроцедуры + +// Вызывается после выполнения всех процедур-обработчиков перехода с другой программы (с другим именем конфигурации), +// и до начала выполнения обновления данных ИБ. +// +// Параметры: +// ПредыдущееИмяКонфигурации - Строка - имя конфигурации до перехода. +// ПредыдущаяВерсияКонфигурации - Строка - имя предыдущей конфигурации (до перехода). +// Параметры - Структура - +// * ВыполнитьОбновлениеСВерсии - Булево - по умолчанию Истина. Если установить Ложь, +// то будут выполнена только обязательные обработчики обновления (с версией "*"). +// * ВерсияКонфигурации - Строка - номер версии после перехода. +// По умолчанию, равен значению версии конфигурации в свойствах метаданных. +// Для того чтобы выполнить, например, все обработчики обновления с версии ПредыдущаяВерсияКонфигурации, +// следует установить значение параметра в ПредыдущаяВерсияКонфигурации. +// Для того чтобы выполнить вообще все обработчики обновления, установить значение "0.0.0.1". +// * ОчиститьСведенияОПредыдущейКонфигурации - Булево - по умолчанию Истина. +// Для случаев когда предыдущая конфигурация совпадает по имени с подсистемой текущей конфигурации, следует +// указать Ложь. +// +Процедура ПриЗавершенииПереходаСДругойПрограммы(ПредыдущееИмяКонфигурации, ПредыдущаяВерсияКонфигурации, Параметры) Экспорт + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl index c4ff95aa4..dffd3745e 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// Серверные процедуры и функции обновления информационной базы -// при смене версии конфигурации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Для интеграции с подсистемой "Обновление конфигурации". diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыГлобальный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыГлобальный/Module.bsl index c7719cd5c..aedbc13fd 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыГлобальный/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверяет статус отложенного обновления. Если обновление завершилось @@ -10,7 +5,7 @@ // Процедура ПроверитьСтатусОтложенногоОбновления() Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ПоказатьСообщениеОбОшибочныхОбработчиках") Тогда ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ"); diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl index a9d5120fe..d8b1970e5 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl @@ -1,60 +1,18 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// Клиентские процедуры и функции для интерактивного обновления информационной базы. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыПрограммы. -Процедура ПроверитьСтатусОбработчиковОтложенногоОбновления(Параметры) Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.Свойство("НеобходимоВыполнитьОбработчикиОтложенногоОбновления") Тогда - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ИнтерактивнаяОбработкаПроверкиСтатусаОтложенногоОбновления", - ЭтотОбъект); - КонецЕсли; - +// Открывает форму отложенных обработчиков. +// +Процедура ПоказатьОтложенныеОбработчики() Экспорт + ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ОтложенныеОбработчики"); КонецПроцедуры -// Вызывается из модуля СтандартныеПодсистемыКлиент в блоке ПередНачаломРаботыСистемы. -// -// Параметры: -// Параметры - Структура - См. описание первого параметра -// функции ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОбновлениеИнформационнойБазы(). -// -Процедура ОбновитьИнформационнуюБазу(Параметры) Экспорт - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - ЗакрытьФормуИндикацииХодаОбновленияЕслиОткрыта(Параметры); - Возврат; - КонецЕсли; - - Если ПараметрыРаботыКлиента.Свойство("НеобходимоОбновлениеИнформационнойБазы") Тогда - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "НачатьОбновлениеИнформационнойБазы", ЭтотОбъект); - Иначе - Если ПараметрыРаботыКлиента.Свойство("ЗагрузитьСообщениеОбменаДанными") Тогда - Перезапустить = Ложь; - ОбновлениеИнформационнойБазыСлужебныйВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(Истина, Перезапустить); - Если Перезапустить Тогда - Параметры.Отказ = Истина; - Параметры.Перезапустить = Истина; - КонецЕсли; - КонецЕсли; - ЗакрытьФормуИндикацииХодаОбновленияЕслиОткрыта(Параметры); - КонецЕсли; - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// Вызывается перед интерактивным началом работы пользователя с областью данных. -// Соответствует событию ПередНачаломРаботыСистемы модулей приложения. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если Не ПараметрыКлиента.РазделениеВключено Или Не ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда ОбновлениеИнформационнойБазыКлиентПереопределяемый.ПриОпределенииВозможностиОбновления(ПараметрыКлиента.ВерсияДанныхОсновнойКонфигурации); КонецЕсли; @@ -84,10 +42,89 @@ КонецПроцедуры -// Открывает форму отложенных обработчиков. -// -Процедура ПоказатьОтложенныеОбработчики() Экспорт - ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ОтложенныеОбработчики"); +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы2(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("НеобходимоВыполнитьОбработчикиОтложенногоОбновления") Тогда + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПроверкиСтатусаОтложенногоОбновления", + ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы3(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы") Тогда + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ЗагрузитьОбновитьПараметрыРаботыПрограммы", ОбновлениеИнформационнойБазыКлиент, Параметры); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы4(Параметры) Экспорт + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + ЗакрытьФормуИндикацииХодаОбновленияЕслиОткрыта(Параметры); + Возврат; + КонецЕсли; + + Если ПараметрыРаботыКлиента.Свойство("НеобходимоОбновлениеИнформационнойБазы") Тогда + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "НачатьОбновлениеИнформационнойБазы", ЭтотОбъект); + Иначе + Если ПараметрыРаботыКлиента.Свойство("ЗагрузитьСообщениеОбменаДанными") Тогда + Перезапустить = Ложь; + ОбновлениеИнформационнойБазыСлужебныйВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(Истина, Перезапустить); + Если Перезапустить Тогда + Параметры.Отказ = Истина; + Параметры.Перезапустить = Истина; + КонецЕсли; + КонецЕсли; + ЗакрытьФормуИндикацииХодаОбновленияЕслиОткрыта(Параметры); + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы5(Параметры) Экспорт + + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() + И СтрНайти(ПараметрЗапуска, "ВыполнитьОбновлениеИЗавершитьРаботу") > 0 Тогда + + ПрекратитьРаботуСистемы(); + + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Возврат; + КонецЕсли; + + ПоказатьОписаниеИзмененийСистемы(); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + + Если ПараметрыКлиента.Свойство("ПоказатьСообщениеОбОшибочныхОбработчиках") + Или ПараметрыКлиента.Свойство("ПоказатьОповещениеОНевыполненныхОбработчиках") Тогда + ПодключитьОбработчикОжидания("ПроверитьСтатусОтложенногоОбновления", 2, Истина); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -123,7 +160,7 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыПрограммы. -Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммы(Параметры, Неопределен) Экспорт +Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммы(Параметры, Контекст) Экспорт ИмяФормы = "Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОбновленияИБ"; Форма = ОткрытьФорму(ИмяФормы,,,,,, Новый ОписаниеОповещения( @@ -152,7 +189,7 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПроверитьСтатусОбработчиковОтложенногоОбновления. -Процедура ИнтерактивнаяОбработкаПроверкиСтатусаОтложенногоОбновления(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПроверкиСтатусаОтложенногоОбновления(Параметры, Контекст) Экспорт ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ОтложенноеОбновлениеНеЗавершено", , , , , , Новый ОписаниеОповещения("ПослеЗакрытияФормыПроверкиСтатусаОтложенногоОбновления", @@ -176,7 +213,7 @@ // Процедура ПоказатьОписаниеИзмененийСистемы() - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиента.ПоказатьОписаниеИзмененийСистемы Тогда ПараметрыФормы = Новый Структура; @@ -210,37 +247,4 @@ Возврат "e1cib/app/Обработка.РезультатыОбновленияПрограммы"; КонецФункции -// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. -// Вызывается после завершения действий ПриНачалеРаботыСистемы. -// Используется для подключения обработчиков ожидания, которые не должны вызываться -// в случае интерактивных действий перед и при начале работы системы. -// -Процедура ПослеНачалаРаботыСистемы() Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - - Если ПараметрыКлиента.Свойство("ПоказатьСообщениеОбОшибочныхОбработчиках") - Или ПараметрыКлиента.Свойство("ПоказатьОповещениеОНевыполненныхОбработчиках") Тогда - ПодключитьОбработчикОжидания("ПроверитьСтатусОтложенногоОбновления", 2, Истина); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Вызывается при интерактивном начале работы пользователя с областью данных. -// Соответствует событию ПриНачалеРаботыСистемы модулей приложения. -// -Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат; - КонецЕсли; - - ПоказатьОписаниеИзмененийСистемы(); - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl index e9e53049b..b1f620657 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl @@ -1,19 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при нажатии на гиперссылку или двойном щелчке на ячейке -// табличного документа с описанием изменений системы. +// табличного документа с описанием изменений системы (общий макет ОписаниеИзмененийСистемы). // // Параметры: // Область - ОбластьЯчеекТабличногоДокумента - область документа, на // которой произошло нажатие. // -// См. также общий макет ОписаниеИзмененийСистемы. -// Процедура ПриНажатииНаГиперссылкуВДокументеОписанияОбновлений(Знач Область) Экспорт diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl index 624f6cf79..9ef93d56c 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -1,92 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Вызывается перед обработчиками обновления данных ИБ. -// -Процедура ПередОбновлениемИнформационнойБазы() Экспорт - -КонецПроцедуры - -// Вызывается после завершении обновления данных ИБ. -// -// Параметры: -// ПредыдущаяВерсияИБ - Строка - версия ИБ до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсияИБ - Строка - версия ИБ после обновления. -// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков -// обновления, сгруппированных по номеру версии. -// Для перебора выполненных обработчиков: -// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл -// -// Если Версия.Версия = "*" Тогда -// группа обработчиков, которые выполняются всегда. -// Иначе -// группа обработчиков, которые выполняются для определенной версии. -// КонецЕсли; -// -// Для Каждого Обработчик Из Версия.Строки Цикл -// ... -// КонецЦикла; -// -// КонецЦикла; -// -// ВыводитьОписаниеОбновлений - Булево - если Истина, то выводить форму с описанием -// обновлений. -// МонопольныйРежим - Булево - признак выполнения обновления в монопольном режиме. -// Истина - обновление выполнялось в монопольном режиме. -// -Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ, - Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - -КонецПроцедуры - -// Вызывается при подготовке табличного документа с описанием изменений программы. -// -// Параметры: -// Макет - ТабличныйДокумент - описание обновлений. -// -// См. также общий макет ОписаниеИзмененийСистемы. -// -Процедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) Экспорт - -КонецПроцедуры - -// Вызывается для получения списка обработчиков обновления, которые нужно пропустить. -// Отключать можно только обработчики обновления с номером версии "*". -// -// Пример добавления отключаемого обработчика в список: -// НовоеИсключение = ОтключаемыеОбработчики.Добавить(); -// НовоеИсключение.ИдентификаторБиблиотеки = "СтандартныеПодсистемы"; -// НовоеИсключение.Версия = "*"; -// НовоеИсключение.Процедура = "ВариантыОтчетов.Обновить"; -// -// Версия - номер версии конфигурации, в которой нужно отключить -// выполнение обработчика. -// -Процедура ПриОтключенииОбработчиковОбновления(ОтключаемыеОбработчики) Экспорт - -КонецПроцедуры - -// Позволяет переопределить очередь отложенных обработчиков обновления, выполняемых в -// параллельном режиме. -// -// Параметры: -// ОбработчикИОчередь - Соответствие, где: -// * Ключ - Строка - полное имя обработчика обновления. -// * Значение - Число - номер очереди, который необходимо установить обработчику. -// -Процедура ПриФормированииОчередейОтложенныхОбработчиков(ОбработчикИОчередь) Экспорт - - -КонецПроцедуры - // Позволяет переопределить различные сообщения, выводимые пользователю. // // Параметры: -// Параметры - Структура со свойствами: +// Параметры - Структура - со свойствами: // * ПоясненияДляРезультатовОбновления - Строка - текст подсказки, указывающий путь // к форме "Результаты обновления программы". // * ПараметрыСообщенияОНевыполненныхОтложенныхОбработчиках - Структура - сообщение о @@ -104,6 +21,132 @@ +КонецПроцедуры + +// Вызывается перед процедурами-обработчиками обновления данных ИБ. +// Здесь можно разместить любую нестандартную логику обновления данных, +// например, иначе проинициализировать сведения о версиях тех или иных подсистем +// с помощью ОбновлениеИнформационнойБазы.ВерсияИБ, ОбновлениеИнформационнойБазы.УстановитьВерсиюИБ, +// и ОбновлениеИнформационнойБазы.ЗарегистрироватьНовуюПодсистему. +// +// Пример: +// Для того чтобы отменить штатную процедуру перехода с другой программы, регистрируем +// сведения о том, что основная конфигурации уже актуальной версии: +// ВерсииПодсистем = ОбновлениеИнформационнойБазы.ВерсииПодсистем(); +// Если ВерсииПодсистем.Количество() > 0 И ВерсииПодсистем.Найти(Метаданные.Имя, "ИмяПодсистемы") = Неопределено Тогда +// ОбновлениеИнформационнойБазы.ЗарегистрироватьНовуюПодсистему(Метаданные.Имя, Метаданные.Версия); +// КонецЕсли; +// +Процедура ПередОбновлениемИнформационнойБазы() Экспорт + +КонецПроцедуры + +// Вызывается после завершения обновления данных ИБ. +// В зависимости от тех или иных условий можно отключить штатное открытие формы +// с описанием изменений в новой версии программы при первом входе в нее (после обновления), +// а также выполнить другие действия. +// +// Не рекомендуется выполнять в данной процедуре какую-либо обработку данных. +// Такие процедуры следует оформлять штатными обработчиками обновления, выполняемыми на каждую версию "*". +// +// Параметры: +// ПредыдущаяВерсияИБ - Строка - версия до обновления. "0.0.0.0" для "пустой" ИБ. +// ТекущаяВерсияИБ - Строка - версия после обновления. Как правило, соответствует Метаданные.Версия. +// ИтерацииОбновления - Массив - массив структур, описывающих сведения об обновлении каждой +// библиотеки и конфигурации, с ключами: +// * Подсистема - Строка - имя библиотеки или конфигурации. +// * Версия - Строка - например, "2.1.3.39". Номер версии библиотеки (конфигурации). +// * ЭтоОсновнаяКонфигурация - Булево - Истина, если это основная конфигурация, а не библиотека. +// * Обработчики - ТаблицаЗначений - все обработчики обновления библиотеки, описание колонок +// см. в ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. +// * ВыполненныеОбработчики - ДеревоЗначений - выполненные обработчики обновления, библиотеке и номеру версии, +// описание колонок см. в ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. +// * ИмяОсновногоСерверногоМодуля - Строка - имя модуля библиотеки (конфигурации), который предоставляет +// основные сведения о ней: имя, версия и т.д. +// * ОсновнойСерверныйМодуль - ОбщийМодуль - общий модуль библиотеки (конфигурации), который предоставляет +// основные сведения о ней: имя, версия и т.д. +// * ПредыдущаяВерсия - Строка - например, "2.1.3.30". Номер версии библиотеки (конфигурации) до обновления. +// ВыводитьОписаниеОбновлений - Булево - если установить Ложь, то не будет открыта форма +// с описанием изменений в новой версии программы. По умолчанию, Истина. +// МонопольныйРежим - Булево - признак того, что обновление выполнилось в монопольном режиме. +// +// Пример: +// Для обхода выполненных обработчиков обновления: +// Для Каждого ИтерацияОбновления Из ИтерацииОбновления Цикл +// Для Каждого Версия Из ИтерацияОбновления.ВыполненныеОбработчики.Строки Цикл +// +// Если Версия.Версия = "*" Тогда +// // Группа обработчиков, которые выполняются регулярно при каждой смене версии. +// Иначе +// // Группа обработчиков, которые выполнились для определенной версии. +// КонецЕсли; +// +// Для Каждого Обработчик Из Версия.Строки Цикл +// ... +// КонецЦикла; +// +// КонецЦикла; +// КонецЦикла; +// +Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ, + Знач ИтерацииОбновления, ВыводитьОписаниеОбновлений, Знач МонопольныйРежим) Экспорт + + +КонецПроцедуры + +// Вызывается при подготовке документа с описанием изменений в новой версии программы, +// которое выводится пользователю при первом входа в программу (после обновления). +// +// Параметры: +// Макет - ТабличныйДокумент - описание изменений в новой версии программы, автоматически +// сформированное из общего макета ОписаниеИзмененийСистемы. +// Макет можно программно модифицировать или заменить на другой. +// +Процедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) Экспорт + +КонецПроцедуры + +// Позволяет переопределить очередь отложенных обработчиков обновления, выполняемых в +// параллельном режиме. Может понадобиться, когда отложенные обработчики библиотек +// обрабатывают те же данные, что и обработчики основной конфигурации. +// Например, есть обработчики библиотеки и конфигурации, которые обрабатывают справочник +// Контрагенты, при этом обработчик конфигурации должен выполниться раньше, чтобы данные +// обновились корректно. В таком случае в данной процедуре нужно указать новый номер очереди +// для обработчика библиотеки, который будет больше, чем у обработчика конфигурации. +// +// Параметры: +// ОбработчикИОчередь - Соответствие - где: +// * Ключ - Строка - полное имя обработчика обновления. +// * Значение - Число - номер очереди, который необходимо установить обработчику. +// +Процедура ПриФормированииОчередейОтложенныхОбработчиков(ОбработчикИОчередь) Экспорт + + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Вызывается для получения списка обработчиков обновления, вызов которых нужно пропустить. +// Отключать можно только обработчики обновления с номером версии "*". +// +// Параметры: +// ОтключаемыеОбработчики - ТаблицаЗначений - с колонками: +// * ИдентификаторБиблиотеки - Строка - имя конфигурации или идентификатор библиотеки. +// * Версия - - Строка - номер версии конфигурации, в которой нужно отключить +// выполнение обработчика. +// * Процедура - - Строка - имя процедуры обработчика обновления, +// которого необходимо отключить. +// +// Пример: +// НовоеИсключение = ОтключаемыеОбработчики.Добавить(); +// НовоеИсключение.ИдентификаторБиблиотеки = "СтандартныеПодсистемы"; +// НовоеИсключение.Версия = "*"; +// НовоеИсключение.Процедура = "ВариантыОтчетов.Обновить"; +// +Процедура ПриОтключенииОбработчиковОбновления(ОтключаемыеОбработчики) Экспорт + КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl index 3b5fa0a2e..0b9334f95 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl @@ -1,155 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// Серверные процедуры и функции обновления информационной базы -// при смене версии конфигурации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Объявляет события подсистемы ОбновлениеВерсииИБ: -// -// Серверные события: -// ПриДобавленииОбработчиковОбновления, -// ПередОбновлениемИнформационнойБазы, -// ПослеОбновленияИнформационнойБазы. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. - // - // Параметры: - // Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления - // общего модуля ОбновлениеИнформационнойБазы. - // - // Синтаксис: - // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - // - // Для использования в других библиотеках. - // - // (Аналог функции ОбновлениеИнформационнойБазыПереопределяемый.ОбработчикиОбновления). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"); - - // Вызывается перед обработчиками обновления данных ИБ. - // - // Синтаксис: - // Процедура ПередОбновлениемИнформационнойБазы() Экспорт - // - // (То же, что ОбновлениеИнформационнойБазыПереопределяемый.ПередОбновлениемИнформационнойБазы). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПередОбновлениемИнформационнойБазы"); - - // Вызывается после завершения монопольного обновления версии ИБ. - // - // Параметры: - // ПредыдущаяВерсия - Строка - версия подсистемы до обновления. "0.0.0.0" для "пустой" ИБ. - // ТекущаяВерсия - Строка - версия подсистемы после обновления. - // ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков обновления - // подсистемы, сгруппированных по номеру версии. - // Процедура обхода выполненных обработчиков: - // - // Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл - // - // Если Версия.Версия = "*" Тогда - // // Обработчик, который может выполнятся при каждой смене версии. - // Иначе - // // Обработчик, который выполняется для определенной версии. - // КонецЕсли; - // - // Для Каждого Обработчик Из Версия.Строки Цикл - // ... - // КонецЦикла; - // - // КонецЦикла; - // - // ВыводитьОписаниеОбновлений - Булево (возвращаемое значение)- если установить Истина, - // тогда выводить форму с описанием обновлений. - // МонопольныйРежим - Булево - признак выполнения обновления в монопольном режиме. - // Истина - обновление выполнялось в монопольном режиме. - // - // Синтаксис: - // Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, - // Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - // - // (То же, что ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновленияИнформационнойБазы). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "ОбновлениеИнформационнойБазыКлиент"); - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "ОбновлениеИнформационнойБазыКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "ОбновлениеИнформационнойБазыСлужебный"); - КонецЕсли; - -КонецПроцедуры - -// Инициализирует параметр сеанса ВыполняетсяОбновлениеИБ. -// -Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт - - Если ИмяПараметра = "ВыполняетсяОбновлениеИБ" Тогда - ПараметрыСеанса.ВыполняетсяОбновлениеИБ = ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); - УстановленныеПараметры.Добавить("ВыполняетсяОбновлениеИБ"); - ИначеЕсли ИмяПараметра = "ПараметрыОбработчикаОбновления" Тогда - ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(НовыеПараметрыОбработчикаОбновления()); - УстановленныеПараметры.Добавить("ПараметрыОбработчикаОбновления"); - КонецЕсли; - -КонецПроцедуры - // Проверить необходимость обновления неразделенных данных информационной базы // при смене версии конфигурации. // @@ -157,7 +7,7 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВерсияМетаданных = Метаданные.Версия; Если ПустаяСтрока(ВерсияМетаданных) Тогда @@ -170,7 +20,7 @@ Возврат Истина; КонецЕсли; - Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда УстановитьПривилегированныйРежим(Истина); Запустить = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ЗапуститьОбновлениеИнформационнойБазы"); @@ -219,9 +69,9 @@ // Функция ВыполнитьОбновлениеИнформационнойБазы(ПараметрыОбновления) Экспорт - Если НЕ ПараметрыОбновления.ПриЗапускеКлиентскогоПриложения Тогда + Если Не ПараметрыОбновления.ПриЗапускеКлиентскогоПриложения Тогда Попытка - СтандартныеПодсистемыСервер.ЗагрузитьОбновитьПараметрыРаботыПрограммы(); + РегистрыСведений.ПараметрыРаботыПрограммы.ЗагрузитьОбновитьПараметрыРаботыПрограммы(); Исключение ЗаписатьОшибку(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; @@ -247,7 +97,7 @@ // Установка привилегированного режима для возможности обновления ИБ в модели сервиса, // в случае когда администратор области данных выполняет вход в область до завершения обновления области. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -331,11 +181,9 @@ КонецЕсли; Исключение - Если Не БлокировкаУстановленаРанее Тогда РазблокироватьИБ(БлокировкаИБ); КонецЕсли; - ВызватьИсключение; КонецПопытки; @@ -343,8 +191,8 @@ ДлительныеОперации.СообщитьПрогресс(10); КонецЕсли; - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() + Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СформироватьСписокОтложенныхОбработчиковОбновления(ИтерацииОбновления); КонецЕсли; @@ -383,11 +231,9 @@ КонецЕсли; Исключение - Если Не БлокировкаУстановленаРанее Тогда РазблокироватьИБ(БлокировкаИБ); КонецЕсли; - ВызватьИсключение; КонецПопытки; @@ -441,8 +287,8 @@ ОбновитьПовторноИспользуемыеЗначения(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ПараметрыСеанса.ВыполняетсяОбновлениеИБ = Ложь; КонецЕсли; @@ -519,7 +365,7 @@ | И УдалитьВерсииПодсистем.ОбластьДанных = &ОбластьДанных"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ИмяПодсистемы", ИдентификаторБиблиотеки); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Запрос.УстановитьПараметр("ОбластьДанных", -1); Иначе Запрос.УстановитьПараметр("ОбластьДанных", 0); @@ -571,6 +417,38 @@ КонецПроцедуры +// Записывает информацию о результате регистрации отложенных обработчиков на плане обмена. +// +Процедура ОтметитьРегистрациюОтложенныхОбработчиковОбновления(ИмяПодсистемы = Неопределено, Значение = Истина) Экспорт + + СтандартнаяОбработка = Истина; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОтметкеРегистрацииОтложенныхОбработчиковОбновления(ИмяПодсистемы, Значение, СтандартнаяОбработка); + КонецЕсли; + + Если Не СтандартнаяОбработка Тогда + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); + Если ИмяПодсистемы <> Неопределено Тогда + НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); + КонецЕсли; + НаборЗаписей.Прочитать(); + + Если НаборЗаписей.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого ЗаписьРегистра Из НаборЗаписей Цикл + ЗаписьРегистра.ВыполненаРегистрацияОтложенныхОбработчиков = Значение; + КонецЦикла; + НаборЗаписей.Записать(); + +КонецПроцедуры + // Возвращает режим обновления данных информационной базы. // Допускается вызывать только до начала обновления информационной базы (иначе возвращает "ОбновлениеВерсии"). // @@ -665,11 +543,11 @@ ВыбиратьРазделенныеОбработчики = Истина; ВыбиратьНеразделенныеОбработчики = Истина; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ПараметрыОтбора.ПолучатьРазделенные Тогда ВыбиратьНеразделенныеОбработчики = Ложь; Иначе - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ВыбиратьНеразделенныеОбработчики = Ложь; Иначе ВыбиратьРазделенныеОбработчики = Ложь; @@ -687,8 +565,9 @@ Схема.Параметры.Найти("ВесВерсииДо").Значение = ВесВерсии(Схема.Параметры.Найти("ВерсияДо").Значение); Схема.Параметры.Найти("ОперативноеОбновление").Значение = (ПараметрыОтбора.РежимОбновления = "Оперативно"); Схема.Параметры.Найти("ОтложенноеОбновление").Значение = (ПараметрыОтбора.РежимОбновления = "Отложенно"); - Если ПараметрыОтбора.УчитыватьПервыйОбменВРИБ И Не СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ("СФильтром") Тогда + Если ПараметрыОтбора.УчитыватьПервыйОбменВРИБ Тогда Схема.Параметры.Найти("ПервыйОбменВРИБ").Значение = ПараметрыОтбора.ПервыйОбменВРИБ; + Схема.Параметры.Найти("ЭтоРИБСФильтром").Значение = СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ("СФильтром"); КонецЕсли; Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных; @@ -714,32 +593,6 @@ КонецФункции -Процедура ОтметитьОбработчикиНовыхПодсистем(ВсеОбработчики) - - // Список объектов новых подсистем. - ОбъектыНовыхПодсистем = Новый Массив; - Для Каждого ИмяПодсистемы Из СведенияОбОбновленииИнформационнойБазы().НовыеПодсистемы Цикл - Подсистема = Метаданные.НайтиПоПолномуИмени(ИмяПодсистемы); - Если Подсистема = Неопределено Тогда - Продолжить; - КонецЕсли; - Для Каждого ОбъектМетаданных Из Подсистема.Состав Цикл - ОбъектыНовыхПодсистем.Добавить(ОбъектМетаданных.ПолноеИмя()); - КонецЦикла; - КонецЦикла; - - // Определение обработчиков новых подсистем. - ВсеОбработчики.Колонки.Добавить("ЭтоНоваяПодсистема", Новый ОписаниеТипов("Булево")); - Для Каждого ОписаниеОбработчика Из ВсеОбработчики Цикл - Позиция = СтрНайти(ОписаниеОбработчика.Процедура, ".", НаправлениеПоиска.СКонца); - ИмяМенеджера = Лев(ОписаниеОбработчика.Процедура, Позиция - 1); - Если ОбъектыНовыхПодсистем.Найти(ИмяОбъектаМетаданныхПоИмениМенеджера(ИмяМенеджера)) <> Неопределено Тогда - ОписаниеОбработчика.ЭтоНоваяПодсистема = Истина; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - // Для внутреннего использования. // Функция НеобходимоВыполнитьОбновление(Знач ВерсияМетаданных, Знач ВерсияДанных) Экспорт @@ -752,8 +605,8 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Истина; // В неразделенном режиме отложенное обновление не выполняется. КонецЕсли; @@ -801,7 +654,7 @@ Возврат Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда Возврат Ложь; КонецЕсли; @@ -918,7 +771,8 @@ Параметры.Вставить("ВерсияДанныхОсновнойКонфигурации", ВерсияИБ(Метаданные.Имя)); // Проверка продолжения работы. - ОписаниеОшибки = ИнформационнаяБазаЗаблокированаДляОбновления(); + ЭтоВызовПередНачаломРаботыСистемы = Параметры.ПолученныеПараметрыКлиента <> Неопределено; + ОписаниеОшибки = ИнформационнаяБазаЗаблокированаДляОбновления(, ЭтоВызовПередНачаломРаботыСистемы); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда Параметры.Вставить("ИнформационнаяБазаЗаблокированаДляОбновления", ОписаниеОшибки); // Работа будет завершена. @@ -944,7 +798,7 @@ Возврат Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат Ложь; КонецЕсли; @@ -975,7 +829,7 @@ // Возвращаемое значение: // Строка - если база не заблокирована, тогда пустая строка, иначе сообщение о причине блокировки. // -Функция ИнформационнаяБазаЗаблокированаДляОбновления(УчитыватьПривилегированныйРежим = Истина) Экспорт +Функция ИнформационнаяБазаЗаблокированаДляОбновления(УчитыватьПривилегированныйРежим = Истина, ПриЗапуске = Неопределено) Экспорт Сообщение = ""; @@ -994,8 +848,8 @@ |(роли ""Администратор системы"" и ""Полные права"").'"); УстановитьПривилегированныйРежим(Истина); - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); - ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); УстановитьПривилегированныйРежим(Ложь); Если НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Тогда @@ -1025,6 +879,29 @@ КонецЕсли; Если ЕстьПраваНаОбновлениеИнформационнойБазы(УчитыватьПривилегированныйРежим, Истина) Тогда + Если ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() + И ПриЗапуске = Истина Тогда + Результат = ОтметкаНачалаОбновления(); + + Если Не Результат.МожноВыполнятьОбновление Тогда + Сообщение = НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию. + |Обновление уже выполняется: + | компьютер - %1 + | пользователь - %2 + | сеанс - %3 + | начат - %4 + | приложение - %5'"); + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, + Результат.СеансОбновления.ИмяКомпьютера, + Результат.СеансОбновления.Пользователь, + Результат.СеансОбновления.НомерСеанса, + Результат.СеансОбновления.НачалоСеанса, + Результат.СеансОбновления.ИмяПриложения); + Возврат Сообщение; + КонецЕсли; + КонецЕсли; + Возврат ""; КонецЕсли; @@ -1093,8 +970,8 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат НовыеСведенияОбОбновлении(); КонецЕсли; @@ -1132,7 +1009,7 @@ // Процедура ЗаписатьВремяВыполненияОбновления(ВремяНачалаОбновления, ВремяОкончанияОбновления) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -1156,51 +1033,180 @@ КонецПроцедуры -// Перезапускает отложенные обработчики, выполняющиеся только в главном узле -// при получении первого сообщения обмена. +// Только для внутреннего использования. +Процедура ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + Или СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда + + Возврат; + КонецЕсли; + + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + СведенияОбОбновлении.ЛегальнаяВерсия = Метаданные.Версия; + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + +КонецПроцедуры + +// Устанавливает флаг отображения описаний изменений версий по +// текущую версию включительно, если для пользователя флаг не +// был установлен ранее. // -Процедура ПриПолученииПервогоСообщенияОбменаРИБПослеОбновления() Экспорт +// Параметры: +// ИмяПользователя - Строка - имя пользователя, для которого +// необходимо установить флаг. +// +Процедура УстановитьФлагОтображенияОписанийДляНовогоПользователя(Знач ИмяПользователя) Экспорт - УстановитьПривилегированныйРежим(Истина); + Если ПоследняяВерсияОтображенияИзмененийСистемы(ИмяПользователя) = Неопределено Тогда + УстановитьФлагОтображенияОписанийПоТекущуюВерсию(ИмяПользователя); + КонецЕсли; - ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - Если СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Неопределено - И Не ИнформационнаяБазаФайловая Тогда - ОтключитьОтложенноеОбновление(); - ПараметрыОтбора = Новый Структура; - ПараметрыОтбора.Вставить("ИмяМетода", "ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновление"); - ПараметрыОтбора.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора); - Если МассивФоновыхЗаданий.Количество() = 1 Тогда - ФоновоеЗадание = МассивФоновыхЗаданий[0]; - ФоновоеЗадание.Отменить(); +КонецПроцедуры + +// Повторно регистрирует обновляемые данные на плане обмена +// ОбновлениеИнформационнойБазы, требуется при загрузке данных +// из сервиса в коробку и обратно. +// +Процедура ПеререгистрироватьДанныеДляОтложенногоОбновления() Экспорт + + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; + ОбрабатываемыеДанные = Новый Соответствие; + ПараметрыИнициализированы = Ложь; + + Для Каждого СтрокаБиблиотека Из СведенияОбОбновлении.ДеревоОбработчиков.Строки Цикл + + Если ОписанияБиблиотек[СтрокаБиблиотека.ИмяБиблиотеки].РежимВыполненияОтложенныхОбработчиков <> "Параллельно" Тогда + Продолжить; КонецЕсли; - КонецЕсли; + + ПараллельноСВерсии = ОписанияБиблиотек[СтрокаБиблиотека.ИмяБиблиотеки].ПараллельноеОтложенноеОбновлениеСВерсии; + + Если Не ПараметрыИнициализированы Тогда + ПараметрыОбработчикаСтруктура = ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке(); + ПараметрыОбработчикаСтруктура.ПовторнаяРегистрация = Истина; + ПараметрыИнициализированы = Истина; + КонецЕсли; + + Для Каждого СтрокаВерсия Из СтрокаБиблиотека.Строки Цикл + + Если СтрокаВерсия.НомерВерсии = "*" Тогда + Продолжить; + КонецЕсли; + + Если ЗначениеЗаполнено(ПараллельноСВерсии) + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СтрокаВерсия.НомерВерсии, ПараллельноСВерсии) < 0 Тогда + Продолжить; + КонецЕсли; + + Для Каждого Обработчик Из СтрокаВерсия.Строки Цикл + + ПараметрыОбработчикаСтруктура.Очередь = Обработчик.ОчередьОтложеннойОбработки; + ПараметрыОбработчикаСтруктура.Вставить("ДанныеОбработчика", Новый Соответствие); + + ПараметрыОбработчика = Новый Массив; + ПараметрыОбработчика.Добавить(ПараметрыОбработчикаСтруктура); + Попытка + Сообщение = НСтр("ru = 'Выполняется процедура заполнения данных + |""%1"" + |отложенного обработчика обновления + |""%2"".'"); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, + Обработчик.ПроцедураЗаполненияДанныхОбновления, + Обработчик.ИмяОбработчика); + ЗаписатьИнформацию(Сообщение); + + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик.ПроцедураЗаполненияДанныхОбновления, ПараметрыОбработчика); + Исключение + ЗаписатьОшибку(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При вызове процедуры заполнения данных + |""%1"" + |отложенного обработчика обновления + |""%2"" + |произошла ошибка: + |""%3"".'"), + Обработчик.ПроцедураЗаполненияДанныхОбновления, + Обработчик.ИмяОбработчика, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + + ВызватьИсключение; + КонецПопытки; + + ОбрабатываемыеДанные.Вставить(Обработчик.ИмяОбработчика, ПараметрыОбработчикаСтруктура.ДанныеОбработчика); + КонецЦикла; + КонецЦикла; + + КонецЦикла; - ИтерацииОбновления = ИтерацииОбновления(); - СформироватьСписокОтложенныхОбработчиковОбновления(ИтерацииОбновления, Истина); - ПеререгистрироватьДанныеДляОтложенногоОбновления(); - Если ИнформационнаяБазаФайловая Тогда - ВыполнитьОтложенноеОбновлениеСейчас(); + СведенияОбОбновлении.ОбрабатываемыеДанные = ОбрабатываемыеДанные; + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + +КонецПроцедуры + +// Возвращает параметры отложенного обработчика обновления. +// Проверяет, есть ли сохраненные параметры у обработчика обновления +// и возвращает их. +// +// Параметры: +// Идентификатор - Строка, УникальныйИдентификатор - имя процедуры обработчика или +// его уникальный идентификатор. +// +// Возвращаемое значение: +// Структура - сохраненные параметры обработчика обновления. +// +Функция ПараметрыОтложенногоОбработчикаОбновления(Идентификатор) Экспорт + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ДеревоОбработчиков = СведенияОбОбновлении.ДеревоОбработчиков.Строки; + + Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда + ОбработчикОбновления = ДеревоОбработчиков.Найти(Идентификатор, "Идентификатор", Истина); Иначе - ЗапланироватьОтложенноеОбновление(); + ОбработчикОбновления = ДеревоОбработчиков.Найти(Идентификатор, "ИмяОбработчика", Истина); КонецЕсли; + Если ОбработчикОбновления = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Параметры = ОбработчикОбновления.СтатистикаВыполнения["ПараметрыОбработчика"]; + Если Параметры = Неопределено Тогда + Параметры = Новый Структура; + КонецЕсли; + + Возврат Параметры; +КонецФункции + +// Записывает параметры отложенного обработчика обновления +// +// Параметры: +// Идентификатор - Строка, УникальныйИдентификатор - имя процедуры обработчика или +// его уникальный идентификатор. +// Параметры - Структура - параметры, которые необходимо сохранить. +// +Процедура ЗаписатьПараметрыОтложенногоОбработчикаОбновления(Идентификатор, Параметры) Экспорт + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ДеревоОбработчиков = СведенияОбОбновлении.ДеревоОбработчиков.Строки; + + Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда + ОбработчикОбновления = ДеревоОбработчиков.Найти(Идентификатор, "Идентификатор", Истина); + Иначе + ОбработчикОбновления = ДеревоОбработчиков.Найти(Идентификатор, "ИмяОбработчика", Истина); + КонецЕсли; + + Если ОбработчикОбновления = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбработчикОбновления.СтатистикаВыполнения.Вставить("ПараметрыОбработчика", Параметры); + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистемы. +// Обработчики событий подсистем конфигурации. -// Вызывается при выполнении скрипта обновления из процедуры ОбновлениеКонфигурации.ЗавершитьОбновление(). -Процедура ПослеЗавершенияОбновления() Экспорт - - ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); - -КонецПроцедуры - -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("ВыполняетсяОбновлениеИБ", "ОбновлениеИнформационнойБазыСлужебный.УстановкаПараметровСеанса"); @@ -1208,45 +1214,14 @@ КонецПроцедуры -// Объекты метаданных, содержимое которых не должно учитывается в бизнес-логике приложения. -// -// Описание: -// Для документа "Реализация товаров и услуг" настроены подсистемы "Версионирование объектов" и "Свойства". -// При этом документ может быть указан в других объектах метаданных - документах или регистрах. -// Часть ссылок имеют значение для бизнес-логики (например движения по регистрам) и должны выводиться пользователю. -// Другая часть ссылок - "техногенные" ссылки на документ из данных подсистем "Версионирование объектов" и "Свойства", -// должны скрываться от пользователя при поиске ссылок на объект. -// Например, при анализе мест использования или в подсистеме запрета редактирования ключевых реквизитов. -// Список таких "техногенных" объектов нужно перечислить в этой процедуре. -// -// Важно: -// Для избежания появления пустых "битых" ссылок рекомендуется предусмотреть процедуру очистки указанных объектов -// метаданных. -// Для измерений регистров сведений - с помощью установки флажка "Ведущее", -// тогда запись регистра сведений будет удалена вместе с удалением ссылки, указанной в измерении. -// Для других реквизитов указанных объектов - с помощью подписки на событие ПередУдалением всех типов объектов -// метаданных, которые могут быть записаны в реквизиты указанных объектов метаданных. -// В обработчике необходимо найти "техногенные" объекты, в реквизитах которых указана ссылка удаляемого объекта, -// и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. -// -// Параметры: -// ИсключенияПоискаСсылок - Массив - Объекты метаданных или их реквизиты, содержимое которых не должно учитывается в -// бизнес-логике приложения. -// * ОбъектМетаданных - Объект метаданных или его реквизит. -// * Строка - Полное имя объекта метаданных или его реквизита. -// -// Примеры: -// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); -// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); -// ИсключенияПоискаСсылок.Добавить("РегистрСведений.ВерсииОбъектов"); -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ДанныеОбработанныеВЦентральномУзлеРИБ.ПолноеИмя()); КонецПроцедуры -// См. описание процедуры СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. Процедура СобратьСтатистикуКонфигурации() Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда @@ -1286,10 +1261,179 @@ КонецПроцедуры +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. +Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + + ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза); + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт + + ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + Параметры.Вставить("НачальноеЗаполнениеДанных", РежимОбновленияДанных() = "НачальноеЗаполнение"); + Параметры.Вставить("ПоказатьОписаниеИзмененийСистемы", ПоказатьОписаниеИзмененийСистемы()); + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + СтатусОбработчиков = СтатусНевыполненныхОбработчиков(); + Если СтатусОбработчиков = "" Тогда + Возврат; + КонецЕсли; + Если СтатусОбработчиков = "СтатусОшибка" + И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда + Параметры.Вставить("ПоказатьСообщениеОбОшибочныхОбработчиках"); + Иначе + Параметры.Вставить("ПоказатьОповещениеОНевыполненныхОбработчиках"); + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.4"; + Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.УстановитьВерсиюОписанийИзменений"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.19"; + Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ПеренестиВерсииПодсистемВНеразделенныеДанные"; + Обработчик.ОбщиеДанные = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.2.7"; + Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ЗаполнитьРеквизитЭтоОсновнаяКонфигурация"; + Обработчик.ОбщиеДанные = Истина; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить("ОтложенноеОбновлениеИБ"); + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) + Или МодульТекущиеДелаСервер.ДелоОтключено("ОтложенноеОбновление") Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.РезультатыОбновленияПрограммы.ПолноеИмя()); + + СтатусОбработчиков = СтатусНевыполненныхОбработчиков(); + ЕстьОбработчикиСОшибкой = (СтатусОбработчиков = "СтатусОшибка"); + ЕстьНеВыполненныеОбработчики = (СтатусОбработчиков = "СтатусНеВыполнено"); + ЕстьПриостановленныеОбработчики = (СтатусОбработчиков = "СтатусПриостановлен"); + + Для Каждого Раздел Из Разделы Цикл + Идентификатор = "ОтложенноеОбновление" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = Идентификатор; + Дело.ЕстьДела = (ЕстьОбработчикиСОшибкой Или ЕстьНеВыполненныеОбработчики Или ЕстьПриостановленныеОбработчики); + Дело.Важное = ЕстьОбработчикиСОшибкой; + Дело.Представление = НСтр("ru = 'Обновление программы не завершено'"); + Дело.Форма = "Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ"; + Дело.Владелец = Раздел; + КонецЦикла; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПрогрессОтложенногоОбновления); +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПроверитьСоставПланаОбмена. +Процедура ПриПолученииОбъектовНачальногоОбразаПланаОбмена(Объекты) Экспорт + + Объекты.Добавить(Метаданные.РегистрыСведений.ВерсииПодсистем); + +КонецПроцедуры + +// Перезапускает отложенные обработчики, выполняющиеся только в главном узле +// при получении первого сообщения обмена. +// +Процедура ПриПолученииПервогоСообщенияОбменаРИБПослеОбновления() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + Если СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Неопределено + И Не ИнформационнаяБазаФайловая Тогда + ОтключитьОтложенноеОбновление(); + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("ИмяМетода", "ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновление"); + ПараметрыОтбора.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора); + Если МассивФоновыхЗаданий.Количество() = 1 Тогда + ФоновоеЗадание = МассивФоновыхЗаданий[0]; + ФоновоеЗадание.Отменить(); + КонецЕсли; + КонецЕсли; + + ИтерацииОбновления = ИтерацииОбновления(); + СформироватьСписокОтложенныхОбработчиковОбновления(ИтерацииОбновления, Истина); + ПеререгистрироватьДанныеДляОтложенногоОбновления(); + Если ИнформационнаяБазаФайловая Тогда + ВыполнитьОтложенноеОбновлениеСейчас(); + Иначе + ЗапланироватьОтложенноеОбновление(); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при выполнении скрипта обновления из процедуры ОбновлениеКонфигурации.ЗавершитьОбновление(). +Процедура ПослеЗавершенияОбновления() Экспорт + + ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра = "ВыполняетсяОбновлениеИБ" Тогда + ПараметрыСеанса.ВыполняетсяОбновлениеИБ = ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); + УстановленныеПараметры.Добавить("ВыполняетсяОбновлениеИБ"); + ИначеЕсли ИмяПараметра = "ПараметрыОбработчикаОбновления" Тогда + ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(НовыеПараметрыОбработчикаОбновления()); + УстановленныеПараметры.Добавить("ПараметрыОбработчикаОбновления"); + КонецЕсли; + +КонецПроцедуры + Функция НастройкиПодсистемы() Экспорт ПараметрыСообщенияОНевыполненныхОтложенныхОбработчиках = Новый Структура; @@ -1405,8 +1549,8 @@ КонецЕсли; Если ТекущаяВерсияИБ <> "0.0.0.0" - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + И ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда // Получение списка обработчиков сформированного на этапе выполнения неразделенных обработчиков. ВыполняемыеОбработчики = ПолучитьПланОбновления(ИдентификаторБиблиотеки, ТекущаяВерсияИБ, ВерсияМетаданных); @@ -1530,14 +1674,14 @@ ПроверятьПраваАдминистрированияСистемы = Истина; Если РазделенныеДанные = Неопределено Тогда - РазделенныеДанные = НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + РазделенныеДанные = НЕ ОбщегоНазначения.РазделениеВключено() + ИЛИ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И РазделенныеДанные Тогда - Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Ложь; КонецЕсли; ПроверятьПраваАдминистрированияСистемы = Ложь; @@ -1627,8 +1771,8 @@ Если ИнформацияОбОшибке <> Неопределено Тогда РезультатОбновления = Новый Структура; - РезультатОбновления.Вставить("КраткоеСообщениеОбОшибке", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - РезультатОбновления.Вставить("ПодробноеСообщениеОбОшибке", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОбновления.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОбновления.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ИначеЕсли Не ПараметрыОбновленияИБ.ВФоне Тогда РезультатОбновления = Результат; Иначе @@ -1650,7 +1794,7 @@ КонецЕсли; БлокировкаИБ.Установлена = Истина; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда БлокировкаИБ.РежимОтладки = Ложь; Иначе БлокировкаИБ.РежимОтладки = ОбщегоНазначенияКлиентСервер.РежимОтладки(); @@ -1671,7 +1815,9 @@ // Установка монопольного режима для обновления информационной базы. ИнформацияОбОшибке = Неопределено; Попытка - ОбщегоНазначения.ЗаблокироватьИБ(); + Если НЕ МонопольныйРежим() Тогда + УстановитьМонопольныйРежим(Истина); + КонецЕсли; Возврат ИтерацииОбновления; Исключение Если ВозможноОперативноеОбновление(ИтерацииОбновления) Тогда @@ -1698,12 +1844,9 @@ МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.РазблокироватьВерсииОбластиДанных(БлокировкаИБ.КлючЗаписи); КонецЕсли; - ИспользуетсяЗавершениеРаботыПользователей = Ложь; - ПриОпределенииИспользованияПодсистемыЗавершениеРаботыПользователей(ИспользуетсяЗавершениеРаботыПользователей); - БазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - - Если БазаФайловая И Не ИсключениеПриНевозможностиБлокировкиИБ - И ИспользуетсяЗавершениеРаботыПользователей Тогда + Если Не ИсключениеПриНевозможностиБлокировкиИБ + И ОбщегоНазначения.ИнформационнаяБазаФайловая() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); Если СтрНайти(ПараметрЗапускаКлиента, "РегламентныеЗаданияОтключены") = 0 Тогда @@ -1729,9 +1872,9 @@ Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; - КонецЕсли; - ОбщегоНазначения.РазблокироватьИБ(); + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); @@ -1830,7 +1973,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение НСтр("ru = 'При работе в модели сервиса переход с другой программы не предусмотрен.'"); КонецЕсли; @@ -1856,7 +1999,7 @@ ТранзакцияАктивнаНаНачалоВыполнения = ТранзакцияАктивна(); Попытка - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик.Процедура); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик.Процедура); Исключение ИмяОбработчика = Обработчик.Процедура; @@ -2029,22 +2172,6 @@ КонецПроцедуры -// Устанавливает флаг отображения описаний изменений версий по -// текущую версию включительно, если для пользователя флаг не -// был установлен ранее. -// -// Параметры: -// ИмяПользователя - Строка - имя пользователя, для которого -// необходимо установить флаг. -// -Процедура УстановитьФлагОтображенияОписанийДляНовогоПользователя(Знач ИмяПользователя) Экспорт - - Если ПоследняяВерсияОтображенияИзмененийСистемы(ИмяПользователя) = Неопределено Тогда - УстановитьФлагОтображенияОписанийПоТекущуюВерсию(ИмяПользователя); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Механизм отложенного обновления. @@ -2322,15 +2449,7 @@ // Планирование выполнения регламентного задания. // При работе в модели сервиса - добавляется регламентное задание в очередь. Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПриВключенииОтложенногоОбновления(Истина); - Иначе - РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); - РегламентноеЗадание.Использование = Истина; - РегламентноеЗадание.Записать(); - КонецЕсли; - + ПриВключенииОтложенногоОбновления(Истина); КонецЕсли; КонецПроцедуры @@ -2339,8 +2458,7 @@ // Процедура ВыполнитьОтложенноеОбновление() Экспорт - // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, - // т.к. необходимые действия выполняются в частном порядке. + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(); Если ОбновлениеИнформационнойБазыСлужебныйПовтИсп.НеобходимоОбновлениеИнформационнойБазы() Тогда Возврат; @@ -2385,233 +2503,24 @@ КонецПроцедуры -// Только для внутреннего использования. -Процедура ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - Или СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - - Возврат; - КонецЕсли; - - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - СведенияОбОбновлении.ЛегальнаяВерсия = Метаданные.Версия; - ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт - - ОбновлениеИнформационнойБазыСобытия.ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - - ОбновлениеИнформационнойБазыСобытия.ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента); - -КонецПроцедуры - -// Добавляет параметры работы клиентской логики при запуске системы для подсистемы обмена данными в модели сервиса. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - Параметры.Вставить("НачальноеЗаполнениеДанных", РежимОбновленияДанных() = "НачальноеЗаполнение"); - Параметры.Вставить("ПоказатьОписаниеИзмененийСистемы", ПоказатьОписаниеИзмененийСистемы()); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - СтатусОбработчиков = СтатусНевыполненныхОбработчиков(); - Если СтатусОбработчиков = "" Тогда - Возврат; - КонецЕсли; - Если СтатусОбработчиков = "СтатусОшибка" - И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда - Параметры.Вставить("ПоказатьСообщениеОбОшибочныхОбработчиках"); - Иначе - Параметры.Вставить("ПоказатьОповещениеОНевыполненныхОбработчиках"); - КонецЕсли; - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений"; - КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.4"; - Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.УстановитьВерсиюОписанийИзменений"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.19"; - Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ПеренестиВерсииПодсистемВНеразделенныеДанные"; - Обработчик.ОбщиеДанные = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.2.7"; - Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.ЗаполнитьРеквизитЭтоОсновнаяКонфигурация"; - Обработчик.ОбщиеДанные = Истина; - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("ОтложенноеОбновлениеИБ"); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) - Или МодульТекущиеДелаСервер.ДелоОтключено("ОтложенноеОбновление") Тогда - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.РезультатыОбновленияПрограммы.ПолноеИмя()); - - СтатусОбработчиков = СтатусНевыполненныхОбработчиков(); - ЕстьОбработчикиСОшибкой = (СтатусОбработчиков = "СтатусОшибка"); - ЕстьНеВыполненныеОбработчики = (СтатусОбработчиков = "СтатусНеВыполнено"); - ЕстьПриостановленныеОбработчики = (СтатусОбработчиков = "СтатусПриостановлен"); - - Для Каждого Раздел Из Разделы Цикл - Идентификатор = "ОтложенноеОбновление" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = Идентификатор; - Дело.ЕстьДела = (ЕстьОбработчикиСОшибкой Или ЕстьНеВыполненныеОбработчики Или ЕстьПриостановленныеОбработчики); - Дело.Важное = ЕстьОбработчикиСОшибкой; - Дело.Представление = НСтр("ru = 'Обновление программы не завершено'"); - Дело.Форма = "Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ"; - Дело.Владелец = Раздел; - КонецЦикла; - -КонецПроцедуры - -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// -Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПрогрессОтложенногоОбновления); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Определяет используется ли в конфигурации подсистема -// "Завершение работы пользователей". -// -// Параметры: -// Используется - Булево - Истина, если используется, Ложь - иначе. -// -Процедура ПриОпределенииИспользованияПодсистемыЗавершениеРаботыПользователей(Используется) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - Используется = Истина; - КонецЕсли; - -КонецПроцедуры - -// Снимает блокировку информационной файловой базы. -// -Процедура ПриСнятииБлокировкиФайловойБазы() Экспорт - - Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - Возврат; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); - МодульСоединенияИБ.РазрешитьРаботуПользователей(); - КонецЕсли; - -КонецПроцедуры - -// Устанавливает использование регламентного задания заполнения данных управления доступом. +// Вызывается при включении и отключении отложенного обновления. // // Параметры: // Использование - Булево - Истина, если задание нужно включить, иначе Ложь. // -Процедура ПриВключенииОтложенногоОбновления(Знач Использование) Экспорт +Процедура ПриВключенииОтложенногоОбновления(Использование) Экспорт + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + ОтборЗаданий = Новый Структура; + ОтборЗаданий.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); + Задания = РегламентныеЗаданияСервер.НайтиЗадания(ОтборЗаданий); + + Для Каждого Задание Из Задания Цикл + ПараметрыЗадания = Новый Структура("Использование", Использование); + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, ПараметрыЗадания); + КонецЦикла; + Возврат; + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); @@ -2620,56 +2529,6 @@ КонецПроцедуры -// Используется для получения объектов метаданных обязательных для плана обмена. -// Если подсистема имеет объекты метаданных обязательные для включения в состав плана обмена, -// то в параметр <Объект> необходимо добавить эти объекты метаданных. -// -// Параметры: -// Объекты - Массив. Массив объектов метаданных конфигурации, которые необходимо включить в состав плана обмена. -// РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. -// Истина - требуется получить список объектов плана обмена РИБ; -// Ложь - требуется получить список для плана обмена НЕ РИБ. -// -Процедура ПриПолученииОбязательныхОбъектовПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт - -КонецПроцедуры - -// Используется для получения объектов метаданных, которые должны входить в состав плана обмена -// и НЕ должны входить в состав подписок на события регистрации изменений для этого плана обмена. -// Эти объекты метаданных используются только в момент создания начального образа подчиненного узла -// и не мигрируют в процессе обмена. -// Если подсистема имеет объекты метаданных, которые участвуют только в создании начального образа подчиненного узла, -// то в параметр <Объект> необходимо добавить эти объекты метаданных. -// -// Параметры: -// Объекты - Массив. Массив объектов метаданных конфигурации. -// -Процедура ПриПолученииОбъектовНачальногоОбразаПланаОбмена(Объекты) Экспорт - - Объекты.Добавить(Метаданные.РегистрыСведений.ВерсииПодсистем); - -КонецПроцедуры - -// Используется для получения объектов метаданных, которые не следует включать в состав плана обмена. -// Если подсистема имеет объекты метаданных, которые не следует включать в состав плана обмена, -// то в параметр <Объект> необходимо добавить эти объекты метаданных. -// -// Параметры: -// Объекты - Массив. Массив объектов метаданных конфигурации, которые не следует включать в состав плана обмена. -// РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. -// Истина - требуется получить список объектов-исключений плана обмена РИБ; -// Ложь - требуется получить список для плана обмена НЕ РИБ. -// -Процедура ПриПолученииОбъектовИсключенийПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт - - Если РаспределеннаяИнформационнаяБаза Тогда - - Объекты.Добавить(Метаданные.Константы.РазделыОписанияИзмененийСистемы); - - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ @@ -2681,7 +2540,7 @@ Попытка - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ОбластьДляОбщихДанных = -1; Иначе ОбластьДляОбщихДанных = 0; @@ -2800,7 +2659,7 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | 1 КАК Поле1 + | 1 КАК ЕстьВерсииПодсистем |ИЗ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |; @@ -2821,7 +2680,7 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | 1 КАК Поле1 + | 1 КАК ЕстьВерсииПодсистем |ИЗ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |ГДЕ @@ -2830,7 +2689,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | 1 КАК Поле1 + | 1 КАК ЕстьВерсииПодсистем |ИЗ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |ГДЕ @@ -2839,7 +2698,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | 1 КАК Поле1 + | 1 КАК ЕстьВерсииПодсистем |ИЗ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |ГДЕ @@ -2867,7 +2726,7 @@ КонецЕсли; ФильтрыРазделенностиОбработчиков = Новый Массив; - Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ФильтрыРазделенностиОбработчиков.Добавить(Ложь); КонецЕсли; ФильтрыРазделенностиОбработчиков.Добавить(Истина); @@ -2907,8 +2766,8 @@ КонецЕсли; Если ФлагРазделенности - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + И ОбщегоНазначения.РазделениеВключено() + И НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда // При обновлении неразделенной версии ИБ, для разделенных обязательных // обработчиков обновления монопольным режимом управляет неразделенный обработчик. @@ -3086,7 +2945,7 @@ ТранзакцияАктивнаНаНачалоВыполнения = ТранзакцияАктивна(); Попытка - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик.Процедура, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик.Процедура, ПараметрыОбработчика); Исключение Если ДополнительныеПараметры.ЗаписыватьВЖурнал Тогда @@ -3181,10 +3040,13 @@ ОписаниеОбработчика.Вставить("РежимВыполнения", "Монопольно"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() - И ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОписаниеОбработчика.Вставить("ОбластьДанныхЗначение", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + + ОписаниеОбработчика.Вставить("ОбластьДанныхЗначение", + МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ОписаниеОбработчика.Вставить("ОбластьДанныхИспользование", Истина); Иначе @@ -3273,23 +3135,23 @@ Исключение НулеваяВерсия = Ложь; ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'У обработчика не правильно заполнено свойство Версия: ""%1"". + НСтр("ru = 'У обработчика неправильно заполнено свойство Версия: ""%1"". |Правильный формат, например: ""2.1.3.70"".'"), - Метаданные.Версия); + Обработчик.Версия); КонецПопытки; Если НулеваяВерсия Тогда ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'У обработчика не правильно заполнено свойство Версия: ""%1"". + НСтр("ru = 'У обработчика неправильно заполнено свойство Версия: ""%1"". |Версия не может быть нулевой.'"), - Метаданные.Версия); + Обработчик.Версия); КонецЕсли; Если НЕ ЗначениеЗаполнено(ОписаниеОшибки) И Обработчик.ВыполнятьВГруппеОбязательных <> Истина И Обработчик.Приоритет <> 0 Тогда - ОписаниеОшибки = НСтр("ru = 'У обработчика не правильно заполнено свойство Приоритет или + ОписаниеОшибки = НСтр("ru = 'У обработчика неправильно заполнено свойство Приоритет или |свойство ВыполнятьВГруппеОбязательных.'"); КонецЕсли; КонецЕсли; @@ -3299,7 +3161,7 @@ И Обработчик.РежимВыполнения <> "Оперативно" И Обработчик.РежимВыполнения <> "Отложенно" Тогда ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'У обработчика ""%1"" не правильно заполнено свойство РежимВыполнения. + НСтр("ru = 'У обработчика ""%1"" неправильно заполнено свойство РежимВыполнения. |Допустимое значение: ""Монопольно"", ""Отложенно"", ""Оперативно"".'"), Обработчик.Процедура); КонецЕсли; @@ -3365,7 +3227,7 @@ // Процедуры регистрации параллельных отложенных обработчиков обновления. ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Для Каждого СтрокаБиблиотека Из СведенияОбОбновлении.ДеревоОбработчиков.Строки Цикл Если ОписанияБиблиотек[СтрокаБиблиотека.ИмяБиблиотеки].РежимВыполненияОтложенныхОбработчиков <> "Параллельно" Тогда Продолжить; @@ -3396,23 +3258,23 @@ ТипМенеджера = Лев(ИмяМенеджера, Позиция - 1); ИменаТипов = Новый Соответствие; - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаСправочники(), "Справочник"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаДокументы(), "Документ"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаОбработки(), "Обработка"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик(), "ПланВидовХарактеристик"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаРегистрыБухгалтерии(), "РегистрБухгалтерии"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаРегистрыНакопления(), "РегистрНакопления"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаРегистрыРасчета(), "РегистрРасчета"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаРегистрыСведений(), "РегистрСведений"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаБизнесПроцессы(), "БизнесПроцесс"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаЖурналыДокументов(), "ЖурналДокументов"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаЗадачи(), "Задача"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаОтчеты(), "Отчет"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаКонстанты(), "Константа"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаПеречисления(), "Перечисление"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаПланыВидовРасчета(), "ПланВидовРасчета"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаПланыОбмена(), "ПланОбмена"); - ИменаТипов.Вставить(ОбщегоНазначения.ИмяТипаПланыСчетов(), "ПланСчетов"); + ИменаТипов.Вставить("Справочники", "Справочник"); + ИменаТипов.Вставить("Документы", "Документ"); + ИменаТипов.Вставить("Обработки", "Обработка"); + ИменаТипов.Вставить("ПланыВидовХарактеристик", "ПланВидовХарактеристик"); + ИменаТипов.Вставить("РегистрыБухгалтерии", "РегистрБухгалтерии"); + ИменаТипов.Вставить("РегистрыНакопления", "РегистрНакопления"); + ИменаТипов.Вставить("РегистрыРасчета", "РегистрРасчета"); + ИменаТипов.Вставить("РегистрыСведений", "РегистрСведений"); + ИменаТипов.Вставить("БизнесПроцессы", "БизнесПроцесс"); + ИменаТипов.Вставить("ЖурналыДокументов", "ЖурналДокументов"); + ИменаТипов.Вставить("Задачи", "Задача"); + ИменаТипов.Вставить("Отчеты", "Отчет"); + ИменаТипов.Вставить("Константы", "Константа"); + ИменаТипов.Вставить("Перечисления", "Перечисление"); + ИменаТипов.Вставить("ПланыВидовРасчета", "ПланВидовРасчета"); + ИменаТипов.Вставить("ПланыОбмена", "ПланОбмена"); + ИменаТипов.Вставить("ПланыСчетов", "ПланСчетов"); ИмяТипа = ИменаТипов[ТипМенеджера]; Если ИмяТипа = Неопределено Тогда @@ -3422,6 +3284,184 @@ Возврат ИмяТипа + Сред(ИмяМенеджера, Позиция); КонецФункции +Процедура ОтметитьОбработчикиНовыхПодсистем(ВсеОбработчики) + + // Список объектов новых подсистем. + ОбъектыНовыхПодсистем = Новый Массив; + Для Каждого ИмяПодсистемы Из СведенияОбОбновленииИнформационнойБазы().НовыеПодсистемы Цикл + Подсистема = Метаданные.НайтиПоПолномуИмени(ИмяПодсистемы); + Если Подсистема = Неопределено Тогда + Продолжить; + КонецЕсли; + Для Каждого ОбъектМетаданных Из Подсистема.Состав Цикл + ОбъектыНовыхПодсистем.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + КонецЦикла; + + // Определение обработчиков новых подсистем. + ВсеОбработчики.Колонки.Добавить("ЭтоНоваяПодсистема", Новый ОписаниеТипов("Булево")); + Для Каждого ОписаниеОбработчика Из ВсеОбработчики Цикл + Позиция = СтрНайти(ОписаниеОбработчика.Процедура, ".", НаправлениеПоиска.СКонца); + ИмяМенеджера = Лев(ОписаниеОбработчика.Процедура, Позиция - 1); + Если ОбъектыНовыхПодсистем.Найти(ИмяОбъектаМетаданныхПоИмениМенеджера(ИмяМенеджера)) <> Неопределено Тогда + ОписаниеОбработчика.ЭтоНоваяПодсистема = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. +Процедура ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь) + + СтандартнаяОбработка = Истина; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, СтандартнаяОбработка); + КонецЕсли; + + Если Не СтандартнаяОбработка Тогда + Возврат; + КонецЕсли; + + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить + ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + + // Стандартную обработку не переопределяем. + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииПодсистем") Тогда + + Если Не СозданиеНачальногоОбраза Тогда + + // Выгрузку регистра выполняем только при создании начального образа. + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Функция ОтметкаНачалаОбновления() + + ОписаниеСеанса = Новый Структура; + ОписаниеСеанса.Вставить("ИмяКомпьютера"); + ОписаниеСеанса.Вставить("ИмяПриложения"); + ОписаниеСеанса.Вставить("НачалоСеанса"); + ОписаниеСеанса.Вставить("НомерСеанса"); + ОписаниеСеанса.Вставить("НомерСоединения"); + ОписаниеСеанса.Вставить("Пользователь"); + ЗаполнитьЗначенияСвойств(ОписаниеСеанса, ПолучитьТекущийСеансИнформационнойБазы()); + ОписаниеСеанса.Пользователь = ОписаниеСеанса.Пользователь.Имя; + + ИмяПараметра = "СтандартныеПодсистемы.ОбновлениеВерсииИБ.СеансОбновленияИнформационнойБазы"; + + МожноВыполнятьОбновление = Истина; + + Блокировка = Новый БлокировкаДанных; + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ЭлементБлокировки = Блокировка.Добавить("Константа.СведенияОбОбновленииИБ"); + Иначе + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыПрограммы"); + ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + СохраненныеПараметры = СведенияОСеансеОбновления(ИмяПараметра); + + Если СохраненныеПараметры = Неопределено Тогда + СеансыСовпадают = Ложь; + Иначе + СеансыСовпадают = ДанныеСовпадают(ОписаниеСеанса, СохраненныеПараметры); + КонецЕсли; + + Если Не СеансыСовпадают Тогда + СеансОбновленияАктивен = СеансАктивен(СохраненныеПараметры); + Если СеансОбновленияАктивен Тогда + СеансОбновления = СохраненныеПараметры; + МожноВыполнятьОбновление = Ложь; + Иначе + ЗаписатьСведенияОСеансеОбновления(ИмяПараметра, ОписаниеСеанса); + СеансОбновления = ОписаниеСеанса; + КонецЕсли; + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Результат = Новый Структура; + Результат.Вставить("МожноВыполнятьОбновление", МожноВыполнятьОбновление); + Результат.Вставить("СеансОбновления", СеансОбновления); + + Возврат Результат; + +КонецФункции + +Функция СведенияОСеансеОбновления(ИмяПараметра) + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Сведения = СведенияОбОбновленииИнформационнойБазы(); + СеансОбновления = Сведения.СеансОбновления; + Иначе + СеансОбновления = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ИмяПараметра); + КонецЕсли; + + Возврат СеансОбновления; +КонецФункции + +Процедура ЗаписатьСведенияОСеансеОбновления(ИмяПараметра, ОписаниеСеанса) + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Сведения = СведенияОбОбновленииИнформационнойБазы(); + Сведения.СеансОбновления = ОписаниеСеанса; + ЗаписатьСведенияОбОбновленииИнформационнойБазы(Сведения); + Иначе + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ИмяПараметра, ОписаниеСеанса); + КонецЕсли; +КонецПроцедуры + +Функция СеансАктивен(ОписаниеСеанса) + Если ОписаниеСеанса = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы(); + + Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл + Совпадают = ДанныеСовпадают(ОписаниеСеанса, Сеанс); + Если Совпадают Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Совпадают; +КонецФункции + +Функция ДанныеСовпадают(Данные1, Данные2) + + Совпадают = Истина; + Для Каждого КлючИЗначение Из Данные1 Цикл + Если КлючИЗначение.Ключ = "Пользователь" Тогда + Продолжить; + КонецЕсли; + + Если Данные2[КлючИЗначение.Ключ] <> КлючИЗначение.Значение Тогда + Совпадают = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Совпадают; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Протоколирование хода обновления. @@ -3445,7 +3485,7 @@ ХодВыполненияОбработчиков.ВыполненоОбработчиков = ХодВыполненияОбработчиков.ВыполненоОбработчиков + 1; - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Сообщение = НСтр("ru = 'Выполняется обработчик обновления %1 (%2 из %3).'"); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( Сообщение, Обработчик.Процедура, @@ -3499,10 +3539,28 @@ КонецФункции -// Получает список версий из общего макета ОписаниеИзмененийСистемы и сохраняет его -// в константе РазделыОписанияИзмененийСистемы. +Процедура ОпределитьВыводОписанияОбновлений(ВыводитьОписаниеОбновлений) + + Если ВыводитьОписаниеОбновлений И Не ОбщегоНазначения.РазделениеВключено() Тогда + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ОбновлениеИБ", "ВывестиОписаниеИзмененийДляАдминистратора", Истина, , ИмяПользователя()); + КонецЕсли; + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + СведенияОбОбновленииИБ = СведенияОбОбновленииИнформационнойБазы(); + СведенияОбОбновленииИБ.ВыводитьОписаниеОбновлений = ВыводитьОписаниеОбновлений; + + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновленииИБ); + КонецЕсли; + +КонецПроцедуры + +// Возвращает список разделов описания изменений системы. // -Процедура ОбновитьРазделыОписанияИзменений() +// Возвращаемое значение: +// СписокЗначение - Значение - вес версии (число), +// Представление - строка версии. +// +Функция РазделыОписанияИзменений() Экспорт Разделы = Новый СписокЗначений; ВесВерсииМетаданных = ВесВерсии(Метаданные.Версия); @@ -3551,40 +3609,8 @@ Разделы.СортироватьПоЗначению(НаправлениеСортировки.Убыв); КонецЕсли; - Константы.РазделыОписанияИзмененийСистемы.Установить(Новый ХранилищеЗначения(Разделы)); -КонецПроцедуры - -Процедура ОпределитьВыводОписанияОбновлений(ВыводитьОписаниеОбновлений) - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - ОбновитьРазделыОписанияИзменений(); - КонецЕсли; - - Если ВыводитьОписаниеОбновлений И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ОбновлениеИБ", "ВывестиОписаниеИзмененийДляАдминистратора", Истина, , ИмяПользователя()); - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - СведенияОбОбновленииИБ = СведенияОбОбновленииИнформационнойБазы(); - СведенияОбОбновленииИБ.ВыводитьОписаниеОбновлений = ВыводитьОписаниеОбновлений; - - ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновленииИБ); - КонецЕсли; - -КонецПроцедуры - -// Возвращает список разделов описания изменений системы. -// -// Возвращаемое значение: -// СписокЗначение - Значение - вес версии (число), -// Представление - строка версии. -// -Функция РазделыОписанияИзменений() - - Возврат Константы.РазделыОписанияИзмененийСистемы.Получить().Получить(); + Возврат Разделы; КонецФункции @@ -3603,7 +3629,6 @@ Результат = Новый Массив; Если Разделы = Неопределено Тогда - ОбновитьРазделыОписанияИзменений(); Разделы = РазделыОписанияИзменений(); КонецЕсли; @@ -3716,15 +3741,20 @@ КонецЕсли; Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Обработчик.НомерВерсии, Библиотека.ПредыдущаяВерсия) <= 0 Тогда - // Версия проверяемого обработчика ниже текущей версии библиотеки и он не будет добавлен заново + // Версия проверяемого обработчика ниже или равна текущей версии библиотеки и он не будет добавлен заново // к выполнению. Необходимо его сохранить. Если НайденныйОбработчик = Неопределено Тогда Возврат Истина; КонецЕсли; ЗаполнитьЗначенияСвойств(Обработчик, НайденныйОбработчик); + ПараметрыОбработчика = Обработчик.СтатистикаВыполнения["ПараметрыОбработчика"]; + Обработчик.Статус = "НеВыполнено"; Обработчик.СтатистикаВыполнения.Очистить(); + Если ПараметрыОбработчика <> Неопределено Тогда + Обработчик.СтатистикаВыполнения.Вставить("ПараметрыОбработчика", ПараметрыОбработчика); + КонецЕсли; Обработчик.ИнформацияОбОшибке = ""; Обработчик.ЧислоПопыток = 0; Возврат Истина; @@ -3817,13 +3847,7 @@ Процедура ОтключитьОтложенноеОбновление() - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПриВключенииОтложенногоОбновления(Ложь); - Иначе - РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); - РегламентноеЗадание.Использование = Ложь; - РегламентноеЗадание.Записать(); - КонецЕсли; + ПриВключенииОтложенногоОбновления(Ложь); КонецПроцедуры @@ -4091,6 +4115,7 @@ СведенияОбОбновлении.Вставить("ТекущаяИтерацияОбновления", 1); СведенияОбОбновлении.Вставить("ПланОтложенногоОбновления"); СведенияОбОбновлении.Вставить("ОписаниеПроцедурЗаполнения"); + СведенияОбОбновлении.Вставить("СеансОбновления"); Если ТипЗнч(СтарыеСведения) = Тип("Структура") Тогда ЗаполнитьЗначенияСвойств(СведенияОбОбновлении, СтарыеСведения); @@ -4128,8 +4153,8 @@ Функция РежимВыполненияОтложенногоОбновления(ПараметрыОбновления) ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); - ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); ВыполнятьОтложенныеОбработчики = ПараметрыОбновления.ВыполнятьОтложенныеОбработчики; ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); @@ -4153,8 +4178,8 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат НовыеСведенияОБлокируемыхОбъектах(); КонецЕсли; @@ -4248,7 +4273,7 @@ КонецЦикла; КонецЕсли; Иначе - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяОбработчика, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяОбработчика, ПараметрыОбработчика); КонецЕсли; ЗавершениеОбработкиДанных = ТекущаяУниверсальнаяДатаВМиллисекундах(); @@ -4484,6 +4509,8 @@ КонецЕсли; КонецЦикла; + ЗаписатьСведенияОБлокируемыхОбъектах(СведенияОБлокируемыхОбъектах); + Константы.ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно.Установить(Не ЕстьОбработчикиТолькоГлавногоУзла); ОписаниеОбработчика = Новый Структура; @@ -4546,8 +4573,6 @@ КонецЕсли; КонецЦикла; - ЗаписатьСведенияОБлокируемыхОбъектах(СведенияОБлокируемыхОбъектах); - КонецПроцедуры Процедура ВключитьОтключитьОтложенныеОбработчикиОбновления(СведенияОбОбновлении) @@ -4664,85 +4689,9 @@ КонецПроцедуры -Процедура ПеререгистрироватьДанныеДляОтложенногоОбновления() - - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; - ОбрабатываемыеДанные = Новый Соответствие; - ПараметрыИнициализированы = Ложь; - - Для Каждого СтрокаБиблиотека Из СведенияОбОбновлении.ДеревоОбработчиков.Строки Цикл - - Если ОписанияБиблиотек[СтрокаБиблиотека.ИмяБиблиотеки].РежимВыполненияОтложенныхОбработчиков <> "Параллельно" Тогда - Продолжить; - КонецЕсли; - - ПараллельноСВерсии = ОписанияБиблиотек[СтрокаБиблиотека.ИмяБиблиотеки].ПараллельноеОтложенноеОбновлениеСВерсии; - - Если Не ПараметрыИнициализированы Тогда - ПараметрыОбработчикаСтруктура = ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке(); - ПараметрыОбработчикаСтруктура.ПовторнаяРегистрация = Истина; - ПараметрыИнициализированы = Истина; - КонецЕсли; - - Для Каждого СтрокаВерсия Из СтрокаБиблиотека.Строки Цикл - - Если СтрокаВерсия.НомерВерсии = "*" Тогда - Продолжить; - КонецЕсли; - - Если ЗначениеЗаполнено(ПараллельноСВерсии) - И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СтрокаВерсия.НомерВерсии, ПараллельноСВерсии) < 0 Тогда - Продолжить; - КонецЕсли; - - Для Каждого Обработчик Из СтрокаВерсия.Строки Цикл - - ПараметрыОбработчикаСтруктура.Очередь = Обработчик.ОчередьОтложеннойОбработки; - ПараметрыОбработчикаСтруктура.Вставить("ДанныеОбработчика", Новый Соответствие); - - ПараметрыОбработчика = Новый Массив; - ПараметрыОбработчика.Добавить(ПараметрыОбработчикаСтруктура); - Попытка - Сообщение = НСтр("ru = 'Выполняется процедура заполнения данных - |""%1"" - |отложенного обработчика обновления - |""%2"".'"); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, - Обработчик.ПроцедураЗаполненияДанныхОбновления, - Обработчик.ИмяОбработчика); - ЗаписатьИнформацию(Сообщение); - - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик.ПроцедураЗаполненияДанныхОбновления, ПараметрыОбработчика); - Исключение - ЗаписатьОшибку(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При вызове процедуры заполнения данных - |""%1"" - |отложенного обработчика обновления - |""%2"" - |произошла ошибка: - |""%3"".'"), - Обработчик.ПроцедураЗаполненияДанныхОбновления, - Обработчик.ИмяОбработчика, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); - - ВызватьИсключение; - КонецПопытки; - - ОбрабатываемыеДанные.Вставить(Обработчик.ИмяОбработчика, ПараметрыОбработчикаСтруктура.ДанныеОбработчика); - КонецЦикла; - КонецЦикла; - - КонецЦикла; - - СведенияОбОбновлении.ОбрабатываемыеДанные = ОбрабатываемыеДанные; - ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); - -КонецПроцедуры - Процедура ЗаполнитьДанныеДляПараллельногоОтложенногоОбновления(СведенияОбОбновлении, Параметры) - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ОтметитьРегистрациюОтложенныхОбработчиковОбновления(); Возврат; КонецЕсли; @@ -4750,7 +4699,7 @@ Если Параметры.ПриЗапускеКлиентскогоПриложения И Параметры.РежимВыполненияОтложенногоОбновления = "Отложенно" Тогда КлиентСервер = Не ОбщегоНазначения.ИнформационнаяБазаФайловая(); - Коробка = Не ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Коробка = Не ОбщегоНазначения.РазделениеВключено(); Если КлиентСервер И Коробка Тогда // Регистрация данных выполняется позже. @@ -4774,7 +4723,8 @@ КонецЦикла; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.СброситьЗначениеКонстантыСИзменениямиДляПодчиненногоУзлаРИБСФильтрами(); КонецЕсли; @@ -4830,7 +4780,7 @@ Обработчик.ИмяОбработчика); ЗаписатьИнформацию(Сообщение); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик.ПроцедураЗаполненияДанныхОбновления, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик.ПроцедураЗаполненияДанныхОбновления, ПараметрыОбработчика); // Запись прогресса обновления. Если Параметры.ВФоне Тогда @@ -4906,16 +4856,14 @@ КонецЕсли; ЕстьДанныеДляРегистрации = Истина; - ОписаниеПроцедуры.Статус = "Выполняется"; // Установка признака начала выполнения обработчика. - ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + // Установка признака начала выполнения обработчика. + ОписаниеПроцедуры.Статус = "Выполняется"; Прервать; КонецЦикла; - Если ЕстьДанныеДляРегистрации Тогда - ЗафиксироватьТранзакцию(); - Иначе - ОтменитьТранзакцию(); - КонецЕсли; + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + + ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; @@ -4949,7 +4897,7 @@ ОписаниеПроцедуры.ИмяОбработчика); ЗаписатьИнформацию(Сообщение); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ОписаниеПроцедуры.ПроцедураЗаполнения, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ОписаниеПроцедуры.ПроцедураЗаполнения, ПараметрыОбработчика); Исключение ЗаписатьОшибку(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'При вызове процедуры заполнения данных @@ -4990,36 +4938,6 @@ КонецФункции -Процедура ОтметитьРегистрациюОтложенныхОбработчиковОбновления(ИмяПодсистемы = Неопределено, Значение = Истина) Экспорт - - СтандартнаяОбработка = Истина; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОтметкеРегистрацииОтложенныхОбработчиковОбновления(ИмяПодсистемы, Значение, СтандартнаяОбработка); - КонецЕсли; - - Если Не СтандартнаяОбработка Тогда - Возврат; - КонецЕсли; - - НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); - Если ИмяПодсистемы <> Неопределено Тогда - НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); - КонецЕсли; - НаборЗаписей.Прочитать(); - - Если НаборЗаписей.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого ЗаписьРегистра Из НаборЗаписей Цикл - ЗаписьРегистра.ВыполненаРегистрацияОтложенныхОбработчиков = Значение; - КонецЦикла; - НаборЗаписей.Записать(); - -КонецПроцедуры - Процедура УстановитьПараметрыОтложенногоОбработчикаОбновления(ОбработчикОбновления, Отложенно = Ложь, Параллельно = Ложь) Если ОбработчикОбновления = Неопределено Тогда diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl index c67bb4c27..6ea85408d 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl @@ -1,211 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ в модели сервиса". -// -/////////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Выбирает все области данных с неактуальными версиями -// и при необходимости формирует фоновые задания по обновлению -// версии в них. -// -// Параметры: -// БлокироватьОбласти - Булево - устанавливать блокировку сеансов областей данных -// на время обновления областей. -// -Процедура ЗапланироватьОбновлениеОбластейДанных(Знач БлокироватьОбласти = Истина, Знач СообщениеБлокировки = "") Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - Если ПустаяСтрока(СообщениеБлокировки) Тогда - СообщениеБлокировки = Константы.СообщениеБлокировкиПриОбновленииКонфигурации.Получить(); - Если ПустаяСтрока(СообщениеБлокировки) Тогда - СообщениеБлокировки = НСтр("ru = 'Система заблокирована для выполнения обновления.'"); - КонецЕсли; - КонецЕсли; - ПараметрыБлокировки = СоединенияИБ.НовыеПараметрыБлокировкиСоединений(); - ПараметрыБлокировки.Начало = ТекущаяУниверсальнаяДата(); - ПараметрыБлокировки.Сообщение = СообщениеБлокировки; - ПараметрыБлокировки.Установлена = Истина; - ПараметрыБлокировки.Эксклюзивная = Истина; - - ВерсияМетаданных = Метаданные.Версия; - Если ПустаяСтрока(ВерсияМетаданных) Тогда - Возврат; - КонецЕсли; - - ВерсияОбщихДанных = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя, Истина); - Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоВыполнитьОбновление(ВерсияМетаданных, ВерсияОбщихДанных) Тогда - // Не выполнено обновление общих данных смысла планировать - // обновление областей нет. - Возврат; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ОбластиДанных.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных - |ИЗ - | РегистрСведений.ОбластиДанных КАК ОбластиДанных - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных - | ПО ОбластиДанных.ОбластьДанныхВспомогательныеДанные = ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные - | И (ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РейтингАктивностиОбластейДанных КАК РейтингАктивностиОбластейДанных - | ПО ОбластиДанных.ОбластьДанныхВспомогательныеДанные = РейтингАктивностиОбластейДанных.ОбластьДанныхВспомогательныеДанные - |ГДЕ - | ОбластиДанных.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется)) - | И ЕСТЬNULL(ВерсииПодсистемОбластейДанных.Версия, """") <> &Версия - | - |УПОРЯДОЧИТЬ ПО - | ЕСТЬNULL(РейтингАктивностиОбластейДанных.Рейтинг, 9999999), - | ОбластьДанных"; - Запрос.УстановитьПараметр("ИмяПодсистемы", Метаданные.Имя); - Запрос.УстановитьПараметр("Версия", ВерсияМетаданных); - Результат = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос); - Если Результат.Пустой() Тогда // Предварительное чтение, возможно с проявлениями грязного чтения. - Возврат; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ОбластиДанных.Статус КАК Статус - |ИЗ - | РегистрСведений.ОбластиДанных КАК ОбластиДанных - |ГДЕ - | ОбластиДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанных - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ВерсииПодсистемОбластейДанных.Версия КАК Версия - |ИЗ - | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных - |ГДЕ - | ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанных - | И ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"; - Запрос.УстановитьПараметр("ИмяПодсистемы", Метаданные.Имя); - - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - ЗначенияКлюча = Новый Структура; - ЗначенияКлюча.Вставить("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); - ЗначенияКлюча.Вставить("ИмяПодсистемы", ""); - КлючЗаписи = РаботаВМоделиСервиса.СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( - РегистрыСведений.ВерсииПодсистемОбластейДанных, ЗначенияКлюча); - - ОшибкаУстановкиБлокировки = Ложь; - - НачатьТранзакцию(); - Попытка - Попытка - ЗаблокироватьДанныеДляРедактирования(КлючЗаписи); // Будет снята при окончании транзакции. - Исключение - ОшибкаУстановкиБлокировки = Истина; - ВызватьИсключение; - КонецПопытки; - - Запрос.УстановитьПараметр("ОбластьДанных", Выборка.ОбластьДанных); - - Блокировка = Новый БлокировкаДанных; - - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ВерсииПодсистемОбластейДанных"); - ЭлементБлокировки.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); - ЭлементБлокировки.УстановитьЗначение("ИмяПодсистемы", Метаданные.Имя); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); - ЭлементБлокировки.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - - Блокировка.Заблокировать(); - - Результаты = Запрос.ВыполнитьПакет(); - - СтрокаОбласти = Неопределено; - Если НЕ Результаты[0].Пустой() Тогда - СтрокаОбласти = Результаты[0].Выгрузить()[0]; - КонецЕсли; - СтрокаВерсии = Неопределено; - Если НЕ Результаты[1].Пустой() Тогда - СтрокаВерсии = Результаты[1].Выгрузить()[0]; - КонецЕсли; - - Если СтрокаОбласти = Неопределено - ИЛИ СтрокаОбласти.Статус <> Перечисления.СтатусыОбластейДанных.Используется - ИЛИ (СтрокаВерсии <> Неопределено И СтрокаВерсии.Версия = ВерсияМетаданных) Тогда - - // Записи не соответствуют исходному критерию. - ЗафиксироватьТранзакцию(); - Продолжить; - КонецЕсли; - - ОтборЗадания = Новый Структура; - ОтборЗадания.Вставить("ИмяМетода", "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ВыполнитьОбновлениеТекущейОбластиДанных"); - ОтборЗадания.Вставить("Ключ", "1"); - ОтборЗадания.Вставить("ОбластьДанных", Выборка.ОбластьДанных); - Задания = ОчередьЗаданий.ПолучитьЗадания(ОтборЗадания); - Если Задания.Количество() > 0 Тогда - // Уже есть задание обновления области. - ЗафиксироватьТранзакцию(); - Продолжить; - КонецЕсли; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода" , "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ВыполнитьОбновлениеТекущейОбластиДанных"); - ПараметрыЗадания.Вставить("Параметры" , Новый Массив); - ПараметрыЗадания.Вставить("Ключ" , "1"); - ПараметрыЗадания.Вставить("ОбластьДанных", Выборка.ОбластьДанных); - ПараметрыЗадания.Вставить("ЭксклюзивноеВыполнение", Истина); - ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3); - - ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - - Если БлокироватьОбласти Тогда - СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки, Ложь, Выборка.ОбластьДанных); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - Если ОшибкаУстановкиБлокировки Тогда - Продолжить; - Иначе - ВызватьИсключение; - КонецЕсли; - - КонецПопытки; - - КонецЦикла; - -КонецПроцедуры - -// Возвращает ключ записи для регистра сведений ВерсииПодсистемОбластейДанных. -// -// Возвращаемое значение: -// РегистрСведенийКлючЗаписи. -// -Функция КлючЗаписиВерсийПодсистем() Экспорт - - ЗначенияКлюча = Новый Структура; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ЗначенияКлюча.Вставить("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); - ЗначенияКлюча.Вставить("ИмяПодсистемы", ""); - КлючЗаписи = РаботаВМоделиСервиса.СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( - РегистрыСведений.ВерсииПодсистемОбластейДанных, ЗначенияКлюча); - КонецЕсли; - - Возврат КлючЗаписи; - -КонецФункции - -#КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -222,8 +14,8 @@ Процедура СформироватьПланОбновленияОбластиДанных(ИдентификаторБиблиотеки, ВсеОбработчики, ОбязательныеРазделенныеОбработчики, ИсходнаяВерсияИБ, ВерсияМетаданныхИБ) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И Не РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда ОбработчикиОбновления = ВсеОбработчики.СкопироватьКолонки(); Для Каждого СтрокаОбработчика Из ВсеОбработчики Цикл @@ -423,46 +215,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// Устанавливает в очереди заданий флаг использования того задания, которое -// соответствует регламентному заданию для выполнения отложенного обновления. -// -// Параметры: -// Использование - Булево - новое значения флага использования. -// -Процедура ПриВключенииОтложенногоОбновления(Знач Использование) Экспорт - - Шаблон = ОчередьЗаданий.ШаблонПоИмени("ОтложенноеОбновлениеИБ"); - - ОтборЗадания = Новый Структура; - ОтборЗадания.Вставить("Шаблон", Шаблон); - Задания = ОчередьЗаданий.ПолучитьЗадания(ОтборЗадания); - - ПараметрыЗадания = Новый Структура("Использование", Использование); - ОчередьЗаданий.ИзменитьЗадание(Задания[0].Идентификатор, ПараметрыЗадания); - -КонецПроцедуры - -// Проверяет, выполнена ли общая часть обновления информационной базы. -// -Процедура ПередОбновлениемИнформационнойБазы() Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - ВерсияОбщихДанных = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя, Истина); - Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоВыполнитьОбновление(Метаданные.Версия, ВерсияОбщихДанных) Тогда - Сообщение = НСтр("ru = 'Не выполнена общая часть обновления информационной базы. - |Обратитесь к администратору.'"); - ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Сообщение); - ВызватьИсключение Сообщение; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - // Блокирует запись в регистре сведений ВерсииПодсистемОбластейДанных, которая соответствует текущей области данных, // и возвращает ключ этой записи. // @@ -472,9 +224,9 @@ Функция ЗаблокироватьВерсииОбластиДанных() Экспорт КлючЗаписи = Неопределено; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -510,10 +262,49 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// Устанавливает в очереди заданий флаг использования того задания, которое +// соответствует регламентному заданию для выполнения отложенного обновления. +// +// Параметры: +// Использование - Булево - новое значения флага использования. +// +Процедура ПриВключенииОтложенногоОбновления(Знач Использование) Экспорт + + Шаблон = ОчередьЗаданий.ШаблонПоИмени("ОтложенноеОбновлениеИБ"); + + ОтборЗадания = Новый Структура; + ОтборЗадания.Вставить("Шаблон", Шаблон); + Задания = ОчередьЗаданий.ПолучитьЗадания(ОтборЗадания); + + ПараметрыЗадания = Новый Структура("Использование", Использование); + ОчередьЗаданий.ИзменитьЗадание(Задания[0].Идентификатор, ПараметрыЗадания); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПередОбновлениемИнформационнойБазы. +Процедура ПередОбновлениемИнформационнойБазы() Экспорт + + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + ВерсияОбщихДанных = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя, Истина); + Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоВыполнитьОбновление(Метаданные.Версия, ВерсияОбщихДанных) Тогда + Сообщение = НСтр("ru = 'Не выполнена общая часть обновления информационной базы. + |Обратитесь к администратору.'"); + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Сообщение); + ВызватьИсключение Сообщение; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + // Только для внутреннего использования. Процедура ПриОпределенииВерсииИБ(Знач ИдентификаторБиблиотеки, Знач ПолучитьВерсиюОбщихДанных, СтандартнаяОбработка, ВерсияИБ) Экспорт - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() И Не ПолучитьВерсиюОбщихДанных Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() И Не ПолучитьВерсиюОбщихДанных Тогда СтандартнаяОбработка = Ложь; @@ -527,7 +318,7 @@ | И ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ИмяПодсистемы", ИдентификаторБиблиотеки); - Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ТаблицаЗначений = Запрос.Выполнить().Выгрузить(); ВерсияИБ = ""; Если ТаблицаЗначений.Количество() > 0 Тогда @@ -541,7 +332,7 @@ // Только для внутреннего использования. Процедура ПриОпределенииПервогоВходаВОбластьДанных(СтандартнаяОбработка, Результат) Экспорт - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда СтандартнаяОбработка = Ложь; @@ -553,7 +344,7 @@ |ГДЕ | ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); Результат = Запрос.Выполнить().Пустой(); КонецЕсли; @@ -563,11 +354,11 @@ // Только для внутреннего использования. Процедура ПриУстановкеВерсииИБ(Знач ИдентификаторБиблиотеки, Знач НомерВерсии, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда СтандартнаяОбработка = Ложь; - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + ОбластьДанных = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); МенеджерЗаписи = РегистрыСведений.ВерсииПодсистемОбластейДанных.СоздатьМенеджерЗаписи(); МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные = ОбластьДанных; @@ -579,10 +370,10 @@ КонецПроцедуры -// Для внутреннего использования. +// Только для внутреннего использования. Процедура ПриПроверкеРегистрацииОтложенныхОбработчиковОбновления(РегистрацияВыполнена, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда СтандартнаяОбработка = Ложь; Запрос = Новый Запрос; Запрос.Текст = @@ -594,7 +385,7 @@ | НЕ ВерсииПодсистемОбластейДанных.ВыполненаРегистрацияОтложенныхОбработчиков | И ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; - Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); Результат = Запрос.Выполнить().Выгрузить(); РегистрацияВыполнена = (Результат.Количество() = 0); КонецЕсли; @@ -604,7 +395,7 @@ // Только для внутреннего использования. Процедура ПриОтметкеРегистрацииОтложенныхОбработчиковОбновления(ИмяПодсистемы, Значение, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда СтандартнаяОбработка = Ложь; НаборЗаписей = РегистрыСведений.ВерсииПодсистемОбластейДанных.СоздатьНаборЗаписей(); @@ -625,74 +416,90 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +// Только для внутреннего использования. +Процедура ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза, СтандартнаяОбработка) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если Не РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда + Возврат; КонецЕсли; + СтандартнаяОбработка = Ложь; - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить + ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + + // Стандартную обработку не переопределяем. + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииПодсистем") Тогда + + Если СозданиеНачальногоОбраза Тогда + + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + Для Каждого СтрокаНабора Из ЭлементДанных Цикл + + ТекстЗапроса = + "ВЫБРАТЬ + | ВерсииПодсистемОбластейДанных.Версия КАК Версия + |ИЗ + | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных + |ГДЕ + | ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИмяПодсистемы", СтрокаНабора.ИмяПодсистемы); + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + СтрокаНабора.Версия = Выборка.Версия; + + Иначе + + СтрокаНабора.Версия = ""; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Иначе + + // При создании начального образа с отключенным разделением + // выгрузку регистра выполняем без дополнительной обработки. + + КонецЕсли; + + Иначе + + // Выгрузку регистра выполняем только при создании начального образа. + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + + КонецЕсли; + КонецЕсли; - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт СоответствиеИменПсевдонимам.Вставить("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ВыполнитьОбновлениеТекущейОбластиДанных"); КонецПроцедуры -// Формирует таблицу регламентных заданий -// с признаком использования в модели сервиса. -// -// Параметры: -// ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо -// заполнить регламентными заданиями и признаком использования, колонки: -// РегламентноеЗадание - Строка - имя предопределенного регламентного задания. -// Использование - Булево - Истина, если регламентное задание должно -// выполняться в модели сервиса. Ложь - если не должно. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.ВерсииПодсистемОбластейДанных); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт НоваяСтрока = ТаблицаИспользования.Добавить(); @@ -701,38 +508,11 @@ КонецПроцедуры -// Вызывается после завершения монопольного обновления данных ИБ. -// -// Параметры: -// ПредыдущаяВерсия - Строка - версия подсистемы до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсия - Строка - версия подсистемы после обновления. -// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков обновления -// подсистемы, сгруппированных по номеру версии. -// Процедура обхода выполненных обработчиков: -// -// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл -// -// Если Версия.Версия = "*" Тогда -// // Обработчик, который может выполнятся при каждой смене версии. -// Иначе -// // Обработчик, который выполняется для определенной версии. -// КонецЕсли; -// -// Для Каждого Обработчик Из Версия.Строки Цикл -// ... -// КонецЦикла; -// -// КонецЦикла; -// -// ВыводитьОписаниеОбновлений - Булево (возвращаемое значение)- если установить Истина, -// тогда выводить форму с описанием обновлений. -// МонопольныйРежим - Булево - признак выполнения обновления в монопольном режиме. -// Истина - обновление выполнялось в монопольном режиме. -// +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда ПараметрыБлокировки = СоединенияИБ.ПолучитьБлокировкуСеансовОбластиДанных(); Если НЕ ПараметрыБлокировки.Установлена Тогда @@ -776,12 +556,7 @@ КонецПроцедуры -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -798,41 +573,7 @@ КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.РегистрыСведений.ВерсииПодсистемОбластейДанных); - -КонецПроцедуры - -// Используется для получения объектов метаданных обязательных для плана обмена. -// Если подсистема имеет объекты метаданных обязательные для включения в состав плана обмена, -// то в параметр <Объект> необходимо добавить эти объекты метаданных. -// -// Параметры: -// Объекты - Массив. Массив объектов метаданных конфигурации, которые необходимо включить в состав плана обмена. -// РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. -// Истина - требуется получить список объектов плана обмена РИБ; -// Ложь - требуется получить список для плана обмена НЕ РИБ. -// -Процедура ПриПолученииОбязательныхОбъектовПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт - -КонецПроцедуры - -// Используется для получения объектов метаданных, которые не следует включать в состав плана обмена. -// Если подсистема имеет объекты метаданных, которые не следует включать в состав плана обмена, -// то в параметр <Объект> необходимо добавить эти объекты метаданных. -// -// Параметры: -// Объекты - Массив. Массив объектов метаданных конфигурации, которые не следует включать в состав плана обмена. -// РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. -// Истина - требуется получить список объектов-исключений плана обмена РИБ; -// Ложь - требуется получить список для плана обмена НЕ РИБ. -// +// См. СтандартныеПодсистемыСервер.ПроверитьСоставПланаОбмена. Процедура ПриПолученииОбъектовИсключенийПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт Если РаспределеннаяИнформационнаяБаза Тогда @@ -843,6 +584,22 @@ КонецПроцедуры +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт + + Сведения = ОбновлениеИнформационнойБазыСлужебный.СведенияОбОбновленииИнформационнойБазы(); + ОбновлениеЗавершено = Сведения.ОтложенноеОбновлениеЗавершеноУспешно; + Если ОбновлениеЗавершено <> Истина Тогда + ОбновлениеИнформационнойБазыСлужебный.ПеререгистрироватьДанныеДляОтложенногоОбновления(); + КонецЕсли; + ОбновлениеИнформационнойБазыСлужебный.ОтметитьРегистрациюОтложенныхОбработчиковОбновления(, Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ @@ -850,7 +607,7 @@ // сведений ВерсииПодсистемОбластейДанных. Процедура ПеренестиВерсииПодсистемВоВспомогательныеДанные() Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -860,7 +617,6 @@ Блокировка = Новый БлокировкаДанных(); БлокировкаРегистра = Блокировка.Добавить("РегистрСведений.ВерсииПодсистемОбластейДанных"); - БлокировкаРегистра.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ТекстЗапроса = @@ -899,6 +655,10 @@ // Процедура ПеренестиПаролиВБезопасноеХранилище() Экспорт + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.УдаленноеАдминистрированиеВМоделиСервиса") Тогда + Возврат; + КонецЕсли; + // Для служебного пользователя Менеджера сервиса. ИмяСлужебногоПользователяМенеджераСервиса = Константы.УдалитьИмяСлужебногоПользователяМенеджераСервиса.Получить(); ПарольСлужебногоПользователяМенеджераСервиса = Константы.УдалитьПарольСлужебногоПользователяМенеджераСервиса.Получить(); @@ -915,6 +675,207 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление областей данных. +// Возвращает ключ записи для регистра сведений ВерсииПодсистемОбластейДанных. +// +// Возвращаемое значение: +// РегистрСведенийКлючЗаписи.ВерсииПодсистемОбластейДанных - ключ записи регистра сведений. +// +Функция КлючЗаписиВерсийПодсистем() + + ЗначенияКлюча = Новый Структура; + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ЗначенияКлюча.Вставить("ОбластьДанныхВспомогательныеДанные", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); + ЗначенияКлюча.Вставить("ИмяПодсистемы", ""); + КлючЗаписи = РаботаВМоделиСервиса.СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( + РегистрыСведений.ВерсииПодсистемОбластейДанных, ЗначенияКлюча); + КонецЕсли; + + Возврат КлючЗаписи; + +КонецФункции + +// Выбирает все области данных с неактуальными версиями +// и при необходимости формирует фоновые задания по обновлению +// версии в них. +// +// Параметры: +// БлокироватьОбласти - Булево - устанавливать блокировку сеансов областей данных +// на время обновления областей, +// СообщениеБлокировки - Строка - сообщение блокировки. +// +Процедура ЗапланироватьОбновлениеОбластейДанных(Знач БлокироватьОбласти = Истина, Знач СообщениеБлокировки = "") + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + Если ПустаяСтрока(СообщениеБлокировки) Тогда + СообщениеБлокировки = Константы.СообщениеБлокировкиПриОбновленииКонфигурации.Получить(); + Если ПустаяСтрока(СообщениеБлокировки) Тогда + СообщениеБлокировки = НСтр("ru = 'Система заблокирована для выполнения обновления.'"); + КонецЕсли; + КонецЕсли; + ПараметрыБлокировки = СоединенияИБ.НовыеПараметрыБлокировкиСоединений(); + ПараметрыБлокировки.Начало = ТекущаяУниверсальнаяДата(); + ПараметрыБлокировки.Сообщение = СообщениеБлокировки; + ПараметрыБлокировки.Установлена = Истина; + ПараметрыБлокировки.Эксклюзивная = Истина; + + ВерсияМетаданных = Метаданные.Версия; + Если ПустаяСтрока(ВерсияМетаданных) Тогда + Возврат; + КонецЕсли; + + ВерсияОбщихДанных = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя, Истина); + Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоВыполнитьОбновление(ВерсияМетаданных, ВерсияОбщихДанных) Тогда + // Не выполнено обновление общих данных смысла планировать + // обновление областей нет. + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ОбластиДанных.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных + |ИЗ + | РегистрСведений.ОбластиДанных КАК ОбластиДанных + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных + | ПО ОбластиДанных.ОбластьДанныхВспомогательныеДанные = ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные + | И (ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РейтингАктивностиОбластейДанных КАК РейтингАктивностиОбластейДанных + | ПО ОбластиДанных.ОбластьДанныхВспомогательныеДанные = РейтингАктивностиОбластейДанных.ОбластьДанныхВспомогательныеДанные + |ГДЕ + | ОбластиДанных.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется)) + | И ЕСТЬNULL(ВерсииПодсистемОбластейДанных.Версия, """") <> &Версия + | + |УПОРЯДОЧИТЬ ПО + | ЕСТЬNULL(РейтингАктивностиОбластейДанных.Рейтинг, 9999999), + | ОбластьДанных"; + Запрос.УстановитьПараметр("ИмяПодсистемы", Метаданные.Имя); + Запрос.УстановитьПараметр("Версия", ВерсияМетаданных); + Результат = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос); + Если Результат.Пустой() Тогда // Предварительное чтение, возможно с проявлениями грязного чтения. + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ОбластиДанных.Статус КАК Статус + |ИЗ + | РегистрСведений.ОбластиДанных КАК ОбластиДанных + |ГДЕ + | ОбластиДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанных + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ВерсииПодсистемОбластейДанных.Версия КАК Версия + |ИЗ + | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных + |ГДЕ + | ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанных + | И ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"; + Запрос.УстановитьПараметр("ИмяПодсистемы", Метаданные.Имя); + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + ЗначенияКлюча = Новый Структура; + ЗначенияКлюча.Вставить("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); + ЗначенияКлюча.Вставить("ИмяПодсистемы", ""); + КлючЗаписи = РаботаВМоделиСервиса.СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( + РегистрыСведений.ВерсииПодсистемОбластейДанных, ЗначенияКлюча); + + ОшибкаУстановкиБлокировки = Ложь; + + НачатьТранзакцию(); + Попытка + Попытка + ЗаблокироватьДанныеДляРедактирования(КлючЗаписи); // Будет снята при окончании транзакции. + Исключение + ОшибкаУстановкиБлокировки = Истина; + ВызватьИсключение; + КонецПопытки; + + Запрос.УстановитьПараметр("ОбластьДанных", Выборка.ОбластьДанных); + + Блокировка = Новый БлокировкаДанных; + + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ВерсииПодсистемОбластейДанных"); + ЭлементБлокировки.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); + ЭлементБлокировки.УстановитьЗначение("ИмяПодсистемы", Метаданные.Имя); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); + ЭлементБлокировки.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", Выборка.ОбластьДанных); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + + Блокировка.Заблокировать(); + + Результаты = Запрос.ВыполнитьПакет(); + + СтрокаОбласти = Неопределено; + Если НЕ Результаты[0].Пустой() Тогда + СтрокаОбласти = Результаты[0].Выгрузить()[0]; + КонецЕсли; + СтрокаВерсии = Неопределено; + Если НЕ Результаты[1].Пустой() Тогда + СтрокаВерсии = Результаты[1].Выгрузить()[0]; + КонецЕсли; + + Если СтрокаОбласти = Неопределено + ИЛИ СтрокаОбласти.Статус <> Перечисления.СтатусыОбластейДанных.Используется + ИЛИ (СтрокаВерсии <> Неопределено И СтрокаВерсии.Версия = ВерсияМетаданных) Тогда + + // Записи не соответствуют исходному критерию. + ЗафиксироватьТранзакцию(); + Продолжить; + КонецЕсли; + + ОтборЗадания = Новый Структура; + ОтборЗадания.Вставить("ИмяМетода", "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ВыполнитьОбновлениеТекущейОбластиДанных"); + ОтборЗадания.Вставить("Ключ", "1"); + ОтборЗадания.Вставить("ОбластьДанных", Выборка.ОбластьДанных); + Задания = ОчередьЗаданий.ПолучитьЗадания(ОтборЗадания); + Если Задания.Количество() > 0 Тогда + // Уже есть задание обновления области. + ЗафиксироватьТранзакцию(); + Продолжить; + КонецЕсли; + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("ИмяМетода" , "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ВыполнитьОбновлениеТекущейОбластиДанных"); + ПараметрыЗадания.Вставить("Параметры" , Новый Массив); + ПараметрыЗадания.Вставить("Ключ" , "1"); + ПараметрыЗадания.Вставить("ОбластьДанных", Выборка.ОбластьДанных); + ПараметрыЗадания.Вставить("ЭксклюзивноеВыполнение", Истина); + ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3); + + ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + + Если БлокироватьОбласти Тогда + СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки, Ложь, Выборка.ОбластьДанных); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + Если ОшибкаУстановкиБлокировки Тогда + Продолжить; + Иначе + ВызватьИсключение; + КонецЕсли; + + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + // Выполняет обновление версии информационной базы в текущей области данных // и снимает блокировку сеансов в области, в случае если она была установлена // ранее. @@ -933,7 +894,7 @@ // Процедура ОбновлениеОбластейДанных() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -949,9 +910,9 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ВызватьИсключение НСтр("ru = 'Вызов функции ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.МинимальнаяВерсияОбластейДанных() - |недоступен из сеансов с установленным значением разделителей модели сервиса!'"); + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ВызватьИсключение НСтр("ru = 'Вызов функции ОбновлениеИнформационнойБазыСлужебныйПовтИсп.МинимальнаяВерсияОбластейДанных() + |недоступен из сеансов с установленным значением разделителей модели сервиса.'"); КонецЕсли; Запрос = Новый Запрос; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВызовСервера/Module.bsl index 05a0caf8c..9beb115ab 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВызовСервера/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// Серверные процедуры и функции обновления информационной базы -// при смене версии конфигурации. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // См. описание этой же функции в модуле ОбновлениеИнформационнойБазыСлужебный. @@ -36,7 +29,14 @@ // Снимает блокировку информационной файловой базы. Процедура СнятьБлокировкуФайловойБазы() Экспорт - ОбновлениеИнформационнойБазыСлужебный.ПриСнятииБлокировкиФайловойБазы(); + Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); + МодульСоединенияИБ.РазрешитьРаботуПользователей(); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl index e42fb0769..6a6c24c6a 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl @@ -1,7 +1,39 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". +#Область СлужебныйПрограммныйИнтерфейс + +// Возвращает минимальную версию информационной базы среди всех областей данных. // -//////////////////////////////////////////////////////////////////////////////// +// Возвращаемое значение: +// Строка - например, "2.3.1.4". +// +Функция МинимальнаяВерсияИБ() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + МинимальнаяВерсияОбластейДанных = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.МинимальнаяВерсияОбластейДанных(); + Иначе + МинимальнаяВерсияОбластейДанных = Неопределено; + КонецЕсли; + + ВерсияИБ = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя); + + Если МинимальнаяВерсияОбластейДанных = Неопределено Тогда + МинимальнаяВерсияИБ = ВерсияИБ; + Иначе + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, МинимальнаяВерсияОбластейДанных) > 0 Тогда + МинимальнаяВерсияИБ = МинимальнаяВерсияОбластейДанных; + Иначе + МинимальнаяВерсияИБ = ВерсияИБ; + КонецЕсли; + КонецЕсли; + + Возврат МинимальнаяВерсияИБ; + +КонецФункции + +#КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -30,32 +62,44 @@ КонецФункции -// Только для внутреннего использования. -Функция МинимальнаяВерсияИБ() Экспорт +// Возвращает соответствие имен и идентификаторов отложенных обработчиков +// и их очередей. +Функция ОчередьОтложенногоОбработчикаОбновления() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - - МинимальнаяВерсияОбластейДанных = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.МинимальнаяВерсияОбластейДанных(); - Иначе - МинимальнаяВерсияОбластейДанных = Неопределено; - КонецЕсли; - - ВерсияИБ = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя); - - Если МинимальнаяВерсияОбластейДанных = Неопределено Тогда - МинимальнаяВерсияИБ = ВерсияИБ; - Иначе - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, МинимальнаяВерсияОбластейДанных) > 0 Тогда - МинимальнаяВерсияИБ = МинимальнаяВерсияОбластейДанных; - Иначе - МинимальнаяВерсияИБ = ВерсияИБ; + Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); + Для Каждого ИмяПодсистемы Из ОписанияПодсистем.Порядок Цикл + ОписаниеПодсистемы = ОписанияПодсистем.ПоИменам.Получить(ИмяПодсистемы); + Если ОписаниеПодсистемы.РежимВыполненияОтложенныхОбработчиков <> "Параллельно" Тогда + Продолжить; КонецЕсли; - КонецЕсли; + + Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); + Модуль.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЦикла; - Возврат МинимальнаяВерсияИБ; + Отбор = Новый Структура; + Отбор.Вставить("РежимВыполнения", "Отложенно"); + ОтложенныеОбработчики = Обработчики.НайтиСтроки(Отбор); + + ОчередьПоИмени = Новый Соответствие; + ОчередьПоИдентификатору = Новый Соответствие; + Для Каждого ОтложенныйОбработчик Из ОтложенныеОбработчики Цикл + Если ОтложенныйОбработчик.ОчередьОтложеннойОбработки = 0 Тогда + Продолжить; + КонецЕсли; + + ОчередьПоИмени.Вставить(ОтложенныйОбработчик.Процедура, ОтложенныйОбработчик.ОчередьОтложеннойОбработки); + Если ЗначениеЗаполнено(ОтложенныйОбработчик.Идентификатор) Тогда + ОчередьПоИдентификатору.Вставить(ОтложенныйОбработчик.Идентификатор, ОтложенныйОбработчик.ОчередьОтложеннойОбработки); + КонецЕсли; + КонецЦикла; + + Результат = Новый Соответствие; + Результат.Вставить("ПоИмени", ОчередьПоИмени); + Результат.Вставить("ПоИдентификатору", ОчередьПоИдентификатору); + + Возврат Новый ФиксированноеСоответствие(Результат); КонецФункции diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/Module.bsl deleted file mode 100644 index 4efc29898..000000000 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/Module.bsl +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление версии ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры используемые при обмене данными. - -// Процедура является обработчиком события ПриОтправкеДанныхПодчиненному. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// -Процедура ПриОтправкеВерсийПодсистем(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь) Экспорт - - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить - ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииПодсистем") Тогда - - Если СозданиеНачальногоОбраза Тогда - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - Для Каждого СтрокаНабора Из ЭлементДанных Цикл - - ТекстЗапроса = - "ВЫБРАТЬ - | ВерсииПодсистемОбластейДанных.Версия КАК Версия - |ИЗ - | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных - |ГДЕ - | ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ИмяПодсистемы", СтрокаНабора.ИмяПодсистемы); - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Следующий() Тогда - - СтрокаНабора.Версия = Выборка.Версия; - - Иначе - - СтрокаНабора.Версия = ""; - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Иначе - - // При создании начального образа с отключенным разделением - // выгрузку регистра выполняем без дополнительной обработки. - - КонецЕсли; - - Иначе - - // Выгрузку регистра выполняем только при создании начального образа. - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/ОбновлениеИнформационнойБазыСобытия.mdo b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/ОбновлениеИнформационнойБазыСобытия.mdo deleted file mode 100644 index 2136688c7..000000000 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСобытия/ОбновлениеИнформационнойБазыСобытия.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - ОбновлениеИнформационнойБазыСобытия - - ru - Обновление информационной базы события - - true - true - true - diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl index 86668f928..ca85b6b38 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -1,14 +1,23 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + +// ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы + // Получает настройки обновления конфигурации. // -// Параметры: -// Настройки - Структура - См. описание свойств в функции НастройкиПоУмолчанию. +// Возвращаемое значение: +// Структура - со свойствами: +// * РежимОбновления - Число - для файловой базы 0, для клиент-серверной 2. +// * ДатаВремяОбновления - Дата - Дата запланированного обновления конфигурации. +// * ВыслатьОтчетНаПочту - Булево - Признак необходимости отправки на электронную почту отчета об обновлении. +// * АдресЭлектроннойПочты - Строка - Адрес электронной почты для отправки отчета обновлении. +// * КодЗадачиПланировщика - Число - Код задачи планировщика Windows. +// * ИмяФайлаОбновления - Строка - Имя файла, содержащего устанавливаемое обновление. +// * СоздаватьРезервнуюКопию - Число - Признак необходимости создания резервной копии. +// * ИмяКаталогаРезервнойКопииИБ - Строка - Каталог для создания резервной копии. +// * ВосстанавливатьИнформационнуюБазу - Булево - Признак необходимости восстанавливать информационную базу +// в случае возникновения ошибок в процессе обновления. // Функция НастройкиОбновленияКонфигурации() Экспорт @@ -26,7 +35,7 @@ // Сохраняет настройки обновления конфигурации. // // Параметры: -// Настройки - Структура - См. описание свойств в функции НастройкиПоУмолчанию. +// Настройки - Структура - См. возвращаемое значение процедуры НастройкиОбновленияКонфигурации. // Процедура СохранитьНастройкиОбновленияКонфигурации(Настройки) Экспорт @@ -40,33 +49,14 @@ КонецПроцедуры +// Конец ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "ОбновлениеКонфигурацииКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"].Добавить( - "ОбновлениеКонфигурацииКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ОбновлениеКонфигурации"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ОбновлениеКонфигурации"); - -КонецПроцедуры - // Вызывается при завершении обновления конфигурации через COM-соединение. // // Параметры: @@ -105,34 +95,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов из других подсистем. - -// Вызывается не через событие, т.к. нужно сделать вызов самым последним. -// -Процедура ПослеОбновленияИнформационнойБазы() Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - ЗначениеХранилища = Константы.СтатусОбновленияКонфигурации.Получить(); - - Статус = Неопределено; - Если ЗначениеХранилища <> Неопределено Тогда - Статус = ЗначениеХранилища.Получить(); - КонецЕсли; - - Если Статус <> Неопределено И Статус.ОбновлениеВыполнено И Статус.РезультатОбновленияКонфигурации <> Неопределено - И Не Статус.РезультатОбновленияКонфигурации Тогда - - Статус.РезультатОбновленияКонфигурации = Истина; - Константы.СтатусОбновленияКонфигурации.Установить(Новый ХранилищеЗначения(Статус)); - - КонецЕсли; - -КонецПроцедуры - Функция КаталогСкрипта() Экспорт КаталогСкрипта = ""; @@ -159,6 +121,62 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. +Процедура ПослеОбновленияИнформационнойБазы() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + ЗначениеХранилища = Константы.СтатусОбновленияКонфигурации.Получить(); + + Статус = Неопределено; + Если ЗначениеХранилища <> Неопределено Тогда + Статус = ЗначениеХранилища.Получить(); + КонецЕсли; + + Если Статус <> Неопределено И Статус.ОбновлениеВыполнено И Статус.РезультатОбновленияКонфигурации <> Неопределено + И Не Статус.РезультатОбновленияКонфигурации Тогда + + Статус.РезультатОбновленияКонфигурации = Истина; + Константы.СтатусОбновленияКонфигурации.Установить(Новый ХранилищеЗначения(Статус)); + + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + ПриДобавленииПараметровРаботыКлиента(Параметры); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + Или Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("НастройкиОбновления", Новый ФиксированнаяСтруктура(НастройкиОбновления())); + +КонецПроцедуры + +Процедура ПроверитьСтатусОбновления(РезультатОбновления, КаталогСкрипта) Экспорт + + // Если это первый запуск после обновления конфигурации, то запоминаем и сбрасываем статус. + РезультатОбновления = ОбновлениеКонфигурацииУспешно(КаталогСкрипта); + Если РезультатОбновления <> Неопределено Тогда + СброситьСтатусОбновленияКонфигурации(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -292,43 +310,11 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - ПриДобавленииПараметровРаботыКлиента(Параметры); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - Или Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("НастройкиОбновления", Новый ФиксированнаяСтруктура(НастройкиОбновления())); - -КонецПроцедуры - Функция ВыполнитьОтложенныеОбработчики() Экспорт Возврат Не СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() И ОбновлениеИнформационнойБазыСлужебный.СтатусНевыполненныхОбработчиков() = "СтатусНеВыполнено"; - КонецФункции +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl index f0c1db92a..9509c5863 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверка наличия активных соединений с информационной базой. diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl index 3320fc528..cc3fb02b9 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -1,12 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обновление конфигурации". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму установки обновлений. // +// Параметры: +// ПараметрыФормы - Структура - Параметры формы установки обновлений. +// Процедура ПоказатьПоискИУстановкуОбновлений(ПараметрыФормы = Неопределено) Экспорт ОткрытьФорму("Обработка.УстановкаОбновлений.Форма.Форма", ПараметрыФормы); @@ -15,14 +13,28 @@ // Отображает форму настроек создания резервной копии. // +// Параметры: +// ПараметрыРезервногоКопирования - Структура - Параметры формы резервного копирования. +// ОписаниеОповещения - ОписаниеОповещения - Описание оповещения о закрытии формы. +// Процедура ПоказатьРезервноеКопирование(ПараметрыРезервногоКопирования, ОписаниеОповещения) Экспорт ОткрытьФорму("Обработка.УстановкаОбновлений.Форма.НастройкаРезервнойКопии", ПараметрыРезервногоКопирования,,,,, ОписаниеОповещения); КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы + // Возвращает текст заголовка настроек резервного копирования для отображения на форме. // +// Параметры: +// Параметры - Структура - Параметры резервного копирования. +// +// Возвращаемое значение: +// Строка - Заголовок гиперссылки создания резервной копии. +// Функция ЗаголовокСозданияРезервнойКопии(Параметры) Экспорт Если Параметры.СоздаватьРезервнуюКопию = 0 Тогда @@ -47,25 +59,25 @@ // скрипт обновления или планирует обновление на указанное время. // // Параметры: -// Форма - УправляемаяФорма - Форма из которой устанавливается обновление. -// Параметры - Структура со свойствами: -// * РежимОбновления - Число - Вариант установки обновления. Принимаемые значения: -// 0 - сейчас, 1 - при завершении работы, 2 - планирование обновления. -// * ДатаВремяОбновления - Дата - Дата планируемого обновления. -// * ВыслатьОтчетНаПочту - Булево - Признак необходимости отправки отчета на почту. -// * АдресЭлектроннойПочты - Строка - Адрес электронной почты для отправки обновления. -// * КодЗадачиПланировщика - Число - Код задачи запланированного обновления. -// * ИмяФайлаОбновления - Строка - Имя файла устанавливаемого обновления. -// * СоздаватьРезервнуюКопию - Число - Признак необходимости создания резервной копии. -// * ИмяКаталогаРезервнойКопииИБ - Строка - Каталог сохранения резервной копии. -// * ВосстанавливатьИнформационнуюБазу - Булево - Признак необходимости восстановления базы. -// * ЗавершениеРаботыСистемы - Булево - Признак того, что установка обновления происходит при завершении работы. -// * ФайлыОбновления - Массив - Содержит значения типа Структура. -// ПараметрыАдминистрирования - Структура - Содержит параметры администрирования информационной базы и кластера. +// Форма - УправляемаяФорма - Форма из которой устанавливается обновление. +// Параметры - Структура - Структура со свойствами: +// * РежимОбновления - Число - Вариант установки обновления. Принимаемые значения: +// 0 - сейчас, 1 - при завершении работы, 2 - планирование обновления. +// * ДатаВремяОбновления - Дата - Дата планируемого обновления. +// * ВыслатьОтчетНаПочту - Булево - Признак необходимости отправки отчета на почту. +// * АдресЭлектроннойПочты - Строка - Адрес электронной почты для отправки обновления. +// * КодЗадачиПланировщика - Число - Код задачи запланированного обновления. +// * ИмяФайлаОбновления - Строка - Имя файла устанавливаемого обновления. +// * СоздаватьРезервнуюКопию - Число - Признак необходимости создания резервной копии. +// * ИмяКаталогаРезервнойКопииИБ - Строка - Каталог сохранения резервной копии. +// * ВосстанавливатьИнформационнуюБазу - Булево - Признак необходимости восстановления базы. +// * ЗавершениеРаботыСистемы - Булево - Признак того, что установка обновления происходит при завершении работы. +// * ФайлыОбновления - Массив - Содержит значения типа Структура. +// ПараметрыАдминистрирования - Структура - Содержит параметры администрирования информационной базы и кластера. // Процедура УстановитьОбновление(Форма, Параметры, ПараметрыАдминистрирования) Экспорт - // Так же при проверке возможности установки обновления выполняется + // Также при проверке возможности установки обновления выполняется // планировка обновления на указанное время (если выбран этот вариант). Если Не ВозможнаУстановкаОбновления(Параметры, ПараметрыАдминистрирования) Тогда Возврат; @@ -87,6 +99,10 @@ КонецПроцедуры +// Конец ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -113,13 +129,58 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + ПроверитьОбновлениеКонфигурации(); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. +Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт + + // Предупреждение: при выставлении своего флажка подсистема "Обновление конфигурации" очищает список + // всех ранее добавленных предупреждений. + Если ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьОбновлениеИнформационнойБазыПриЗавершенииСеанса"] = Истина Тогда + ПараметрыПредупреждения = СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы(); + ПараметрыПредупреждения.ТекстФлажка = НСтр("ru = 'Установить обновление конфигурации'"); + ПараметрыПредупреждения.ТекстПредупреждения = НСтр("ru = 'Запланирована установка обновления'"); + ПараметрыПредупреждения.Приоритет = 50; + ПараметрыПредупреждения.ВывестиОдноПредупреждение = Истина; + + ДействиеПриУстановленномФлажке = ПараметрыПредупреждения.ДействиеПриУстановленномФлажке; + ДействиеПриУстановленномФлажке.Форма = "Обработка.УстановкаОбновлений.Форма.Форма"; + ДействиеПриУстановленномФлажке.ПараметрыФормы = Новый Структура("ЗавершениеРаботыСистемы, ВыполнитьОбновление", Истина, Истина); + + Предупреждения.Добавить(ПараметрыПредупреждения); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьРезультатОбновления(РезультатОбновления, КаталогСкрипта) Экспорт + + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + + Если Не ПустаяСтрока(КаталогСкрипта) Тогда + ПрочитатьДанныеВЖурналРегистрации(РезультатОбновления, КаталогСкрипта); + КонецЕсли; + + КонецЕсли; + + РезультатОбновления = Неопределено; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ВозможнаУстановкаОбновления(Параметры, ПараметрыАдминистрирования) - ЭтоФайловаяБаза = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + ЭтоФайловаяБаза = ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая(); Если ЭтоФайловаяБаза И Параметры.СоздаватьРезервнуюКопию = 2 Тогда Файл = Новый Файл(Параметры.ИмяКаталогаРезервнойКопииИБ); @@ -251,7 +312,7 @@ Функция СформироватьФайлыСкриптаОбновления(Знач ИнтерактивныйРежим, Параметры, ПараметрыАдминистрирования) - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); ЭтоФайловаяБаза = ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая; #Если Не ВебКлиент Тогда @@ -259,6 +320,7 @@ Параметры.Свойство("КаталогПлатформы", КаталогПлатформы); КаталогПрограммы = ?(ЗначениеЗаполнено(КаталогПлатформы), КаталогПлатформы, КаталогПрограммы()); + ИмяИсполняемогоФайлаКонфигуратора = КаталогПрограммы + СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения(Истина); ИмяИсполняемогоФайлаКлиента = КаталогПрограммы + СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения(); @@ -277,22 +339,8 @@ СтрокаПутиКИнформационнойБазе = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СтрЗаменить(СтрокаПутиКИнформационнойБазе, """", "")) + "1Cv8.1CD"; АдресЭлектроннойПочты = ?(Параметры.РежимОбновления = 2 И Параметры.ВыслатьОтчетНаПочту, Параметры.АдресЭлектроннойПочты, ""); - - // Вызов КаталогВременныхФайлов вместо ПолучитьИмяВременногоФайла, так как каталог не должен удаляться - // автоматически при завершении клиентского приложения. - // В него сохраняются исполняемые файлы, лог выполнения и резервная копия, при определенной настройке. - - КаталогВременныхФайловОбновления = КаталогВременныхФайлов() + "1Cv8Update." + Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=ггММддЧЧммсс") + "\"; - - Если Параметры.СоздаватьРезервнуюКопию = 1 Тогда - КаталогРезервнойКопии = КаталогВременныхФайловОбновления; - ИначеЕсли Параметры.СоздаватьРезервнуюКопию = 2 Тогда - КаталогРезервнойКопии = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Параметры.ИмяКаталогаРезервнойКопииИБ); - Иначе - КаталогРезервнойКопии = ""; - КонецЕсли; - - СоздаватьРезервнуюКопию = ЭтоФайловаяБаза И (Параметры.СоздаватьРезервнуюКопию = 1 Или Параметры.СоздаватьРезервнуюКопию = 2); + КаталогРезервнойКопии = ?(Параметры.СоздаватьРезервнуюКопию = 2, ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Параметры.ИмяКаталогаРезервнойКопииИБ), ""); + СоздаватьРезервнуюКопию = ЭтоФайловаяБаза И Параметры.СоздаватьРезервнуюКопию <> 0; ВыполнитьОтложенныеОбработчики = Ложь; ТекстыМакетов = ОбновлениеКонфигурацииВызовСервера.ТекстыМакетов(ИнтерактивныйРежим, @@ -307,7 +355,7 @@ ВставитьПараметрСкрипта("СтрокаСоединенияИнформационнойБазы", СтрокаСоединенияИнформационнойБазы , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("СобытиеЖурналаРегистрации" , СобытиеЖурналаРегистрации() , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("АдресЭлектроннойПочты" , АдресЭлектроннойПочты , Истина, ОбластьПараметров); - ВставитьПараметрСкрипта("ИмяАдминистратораОбновления" , ИмяПользователя , Истина, ОбластьПараметров); + ВставитьПараметрСкрипта("ИмяАдминистратораОбновления" , ИмяПользователя , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("ИмяCOMСоединителя" , ПараметрыРаботыКлиента.ИмяCOMСоединителя , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("КаталогРезервнойКопии" , КаталогРезервнойКопии , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("СоздаватьРезервнуюКопию" , СоздаватьРезервнуюКопию , Ложь , ОбластьПараметров); @@ -322,7 +370,7 @@ ТекстыМакетов.МакетФайлаОбновленияКонфигурации = ОбластьПараметров + ТекстыМакетов.МакетФайлаОбновленияКонфигурации; ТекстыМакетов.Удалить("ОбластьПараметров"); - Возврат СоздатьФайлыСкрипта(КаталогВременныхФайловОбновления, ТекстыМакетов, ИнтерактивныйРежим); + Возврат СоздатьФайлыСкрипта(ТекстыМакетов, ИнтерактивныйРежим); #КонецЕсли КонецФункции @@ -369,8 +417,9 @@ Возврат "'" + Текст + "'"; КонецФункции -Функция СоздатьФайлыСкрипта(КаталогВременныхФайловОбновления, ТекстыМакетов, ИнтерактивныйРежим) +Функция СоздатьФайлыСкрипта(ТекстыМакетов, ИнтерактивныйРежим) + КаталогВременныхФайловОбновления = КаталогВременныхФайлов() + "1Cv8Update." + Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=ггММддЧЧммсс") + "\"; СоздатьКаталог(КаталогВременныхФайловОбновления); ФайлСкрипта = Новый ТекстовыйДокумент; @@ -703,17 +752,21 @@ КонецЕсли; #Если НЕ ВебКлиент Тогда - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиента.РазделениеВключено Или Не ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда Возврат; КонецЕсли; + Если ПараметрыРаботыКлиента.Свойство("ПоказатьСообщениеОбОшибочныхОбработчиках") Тогда + Возврат; // Форма результатов обновления будет показана позже. + КонецЕсли; + НастройкиОбновления = ПараметрыРаботыКлиента.НастройкиОбновления; НаличиеОбновления = НастройкиОбновления.ПроверитьПрошлыеОбновленияБазы; Если НаличиеОбновления Тогда // Надо завершить предыдущее обновление. - ПоказатьПоискИУстановкуОбновлений(); + ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ"); Возврат; КонецЕсли; @@ -728,64 +781,73 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Проверяет легальность получения обновления. При отсутствии подсистемы -// проверки легальности возвращает Истина. -// -// Параметры: -// Оповещение - ОписаниеОповещения - содержит обработчик, -// вызываемый после подтверждения легальности получения обновления. -// -Функция ПроверитьЛегальностьПолученияОбновления(Оповещение) Экспорт +Процедура ПрочитатьДанныеВЖурналРегистрации(РезультатОбновления, КаталогСкрипта) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда - МодульПроверкаЛегальностиПолученияОбновленияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); - МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПоказатьПроверкуЛегальностиПолученияОбновления(Оповещение); - Иначе - ВыполнитьОбработкуОповещения(Оповещение, Истина); + МассивФайлов = НайтиФайлы(КаталогСкрипта, "log*.txt"); + + Если МассивФайлов.Количество() = 0 Тогда + Возврат; КонецЕсли; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Доопределяет список предупреждений пользователю перед завершением работы системы. -// -// Параметры: -// Отказ - Булево - Признак отказа от выхода из программы. Если в теле процедуры-обработчика установить -// данному параметру значение Истина, то работа с программой не будет завершена. -// Предупреждения - Массив - в массив можно добавить элементы типа Структура, -// свойства которой см. в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. -// -Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт + ФайлЖурнала = МассивФайлов[0]; + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(ФайлЖурнала.ПолноеИмя); - // Предупреждение: при выставлении своего флажка подсистема "Обновление конфигурации" очищает список - // всех ранее добавленных предупреждений. - Если ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьОбновлениеИнформационнойБазыПриЗавершенииСеанса"] = Истина Тогда - ПараметрыПредупреждения = СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы(); - ПараметрыПредупреждения.ТекстФлажка = НСтр("ru = 'Установить обновление конфигурации'"); - ПараметрыПредупреждения.ТекстПредупреждения = НСтр("ru = 'Запланирована установка обновления'"); - ПараметрыПредупреждения.Приоритет = 50; - ПараметрыПредупреждения.ВывестиОдноПредупреждение = Истина; + Для НомерСтроки = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл - ДействиеПриУстановленномФлажке = ПараметрыПредупреждения.ДействиеПриУстановленномФлажке; - ДействиеПриУстановленномФлажке.Форма = "Обработка.УстановкаОбновлений.Форма.Форма"; - ДействиеПриУстановленномФлажке.ПараметрыФормы = Новый Структура("ЗавершениеРаботыСистемы, ВыполнитьОбновление", Истина, Истина); + ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки); + Если ПустаяСтрока(ТекущаяСтрока) Тогда + Продолжить; + КонецЕсли; - Предупреждения.Добавить(ПараметрыПредупреждения); - КонецЕсли; + НачатьЗапись = Ложь; + + ПредставлениеУровня = "Информация"; + Если Сред(ТекущаяСтрока, 3, 1) = "." И Сред(ТекущаяСтрока, 6, 1) = "." Тогда // Строка с датой + МассивСтроки = СтрРазделить(ТекущаяСтрока, " ", Ложь); + МассивДаты = СтрРазделить(МассивСтроки[0], "."); + МассивВремени = СтрРазделить(МассивСтроки[1], ":"); + ДатаСобытия = Дата(МассивДаты[2], МассивДаты[1], МассивДаты[0], МассивВремени[0], МассивВремени[1], МассивВремени[2]); + Если МассивСтроки[2] = "{ERR}" Тогда + ПредставлениеУровня = "Ошибка"; + КонецЕсли; + Комментарий = СокрЛП(Сред(ТекущаяСтрока, СтрНайти(ТекущаяСтрока, "}") + 2)); + + Если Комментарий = НСтр("ru = 'Обновление выполнено'") Тогда + РезультатОбновления = Истина; + Продолжить; + ИначеЕсли Комментарий = НСтр("ru = 'Обновление не выполнено'") Тогда + РезультатОбновления = Ложь; + Продолжить; + КонецЕсли; + НачатьЗапись = Истина; + Иначе + Комментарий = ТекущаяСтрока; + КонецЕсли; + + Если НачатьЗапись Тогда + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), ПредставлениеУровня, Комментарий, ДатаСобытия); + КонецЕсли; + + КонецЦикла; + + ЗаписатьСобытияВЖурналРегистрации(); КонецПроцедуры -// Вызывается при интерактивном начале работы пользователя с областью данных. -// Соответствует событию ПриНачалеРаботыСистемы модулей приложения. -// -Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт +Процедура ЗаписатьСобытияВЖурналРегистрации() Экспорт - ПроверитьОбновлениеКонфигурации(); + СобытияДляЖурналаРегистрации = ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"]; + + Если ТипЗнч(СобытияДляЖурналаРегистрации) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + Если СобытияДляЖурналаРегистрации.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl index 3fdc40bff..9b59272a0 100644 --- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -1,5 +1,4 @@ //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". // Серверные процедуры и функции общего назначения: // - для работы с данными в базе; // - для работы с прикладными типами и коллекциями значений; @@ -11,7 +10,6 @@ // - сохранение, чтение и удаление настроек из хранилищ; // - для работы с табличными документами; // - для работы с журналом регистрации; -// - для работы в режиме разделения данных; // - версионирование программных интерфейсов; // - вспомогательные процедуры и функции. // @@ -25,7 +23,9 @@ // Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы // по ссылке на объект. // -// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если доступа к одному из реквизитов нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет исключение прав доступа, +// а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено для всех реквизитов. +// // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // @@ -44,12 +44,16 @@ // - Массив, ФиксированныйМассив - имена реквизитов в формате требований // к свойствам структуры. // +// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае, +// если выборка будет пустая, то все реквизиты вернутся со значением Неопределено; +// если Ложь, то возникнет исключение при отсутствии прав на любой из реквизитов. +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных реквизитов. // Если строка затребованных реквизитов пуста, то возвращается пустая структура. // Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено. // -Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт +Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда Если ПустаяСтрока(Реквизиты) Тогда @@ -84,7 +88,7 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.Текст = - "ВЫБРАТЬ + "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + " |" + ТекстПолей + " |ИЗ | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы @@ -92,13 +96,15 @@ | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка |"; Выборка = Запрос.Выполнить().Выбрать(); - Выборка.Следующий(); Результат = Новый Структура; Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл Результат.Вставить(КлючИЗначение.Ключ); КонецЦикла; - ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Если Выборка.Следующий() Тогда + ЗаполнитьЗначенияСвойств(Результат, Выборка); + КонецЕсли; Возврат Результат; @@ -106,22 +112,26 @@ // Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. // -// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если доступа к реквизиту нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет исключение прав доступа, +// а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено. +// // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Функция не предназначена для получения значений реквизитов пустых ссылок. // // Параметры: -// Ссылка - ссылка на объект, - элемент справочника, документ, ... -// ИмяРеквизита - Строка, например, "Код". +// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. +// ИмяРеквизита - Строка - имя получаемого реквизита. +// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае, +// если выборка будет пустая, то вернется значение Неопределено. // // Возвращаемое значение: -// Произвольный - зависит от типа значения прочитанного реквизита. +// Произвольный - зависит от типа значения прочитанного реквизита. // -Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт +Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт - Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); + Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные); Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; КонецФункции @@ -129,26 +139,34 @@ // Возвращает значения реквизитов, прочитанные из информационной базы // для нескольких объектов. // -// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если доступа к одному из реквизитов какого-либо объекта нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет +// исключение прав доступа, а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено для всех +// реквизитов этого объекта. +// // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Функция не предназначена для получения значений реквизитов пустых ссылок. // // Параметры: -// МассивСсылок - массив ссылок на объекты одного типа. -// ВАЖНО! значения массива должны быть ссылками на -// объекты одного типа! -// ИменаРеквизитов - Строка, имена реквизитов перечисленные через запятую, -// в формате требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". +// МассивСсылок - Массив - массив ссылок на объекты одного типа. +// ВАЖНО! Значения массива должны быть ссылками на объекты ОДНОГО типа! +// ИменаРеквизитов - Строка - имена реквизитов перечисленные через запятую, в формате требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". // +// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя, и в случае, +// если какой-либо объект будет исключен из выборки по правам, то все реквизиты этого объекта +// вернутся со значением Неопределено; +// если Ложь, то возникнет исключение при отсутствии прав на любой из реквизитов любого +// из объектов. // Возвращаемое значение: -// Соответствие - где ключ - ссылка на объект, а Значение - структура, которая -// содержит список свойств, как список имен в строке. -// ИменаРеквизитов, со значениям реквизитов, прочитанными из информационной базы. +// Соответствие - список объектов и значений их реквизитов: +// * Ключ - ЛюбаяСсылка - ссылка на объект; +// * Значение - Структура - значения реквизитов: +// ** Ключ - Строка - имя реквизита; +// ** Значение - Произвольный - значение реквизита. // -Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов) Экспорт +Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов, ВыбратьРазрешенные = Ложь) Экспорт ЗначенияРеквизитов = Новый Соответствие; Если МассивСсылок.Количество() = 0 Тогда @@ -157,19 +175,21 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ + "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + " | Ссылка КАК Ссылка, " + ИменаРеквизитов + " |ИЗ | " + МассивСсылок[0].Метаданные().ПолноеИмя() + " КАК Таблица |ГДЕ | Таблица.Ссылка В (&МассивСсылок)"; Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); - Выборка = Запрос.Выполнить().Выбрать(); + + Для Каждого Ссылка Из МассивСсылок Цикл + ЗначенияРеквизитов.Вставить(Ссылка, Новый Структура(ИменаРеквизитов)); + КонецЦикла; + Пока Выборка.Следующий() Цикл - Результат = Новый Структура(ИменаРеквизитов); - ЗаполнитьЗначенияСвойств(Результат, Выборка); - ЗначенияРеквизитов[Выборка.Ссылка] = Результат; + ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов[Выборка.Ссылка], Выборка); КонецЦикла; Возврат ЗначенияРеквизитов; @@ -178,24 +198,31 @@ // Возвращает значения реквизита, прочитанного из информационной базы для нескольких объектов. // -// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если доступа к одному из реквизитов нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет +// исключение прав доступа, а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено для всех +// реквизитов. +// // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Функция не предназначена для получения значений реквизитов пустых ссылок. // // Параметры: -// МассивСсылок - массив ссылок на объекты одного типа. -// ВАЖНО! значения массива должны быть ссылками на -// объекты одного типа! -// ИмяРеквизита - Строка, например, "Код". +// МассивСсылок - Массив - массив ссылок на объекты одного типа. +// ВАЖНО! Значения массива должны быть ссылками на объекты ОДНОГО типа! +// ИмяРеквизита - Строка - например, "Код". +// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя, и в случае, +// если какой-либо объект будет исключен из выборки по правам, то значение реквизита +// этого объекта вернется со значением Неопределено; +// если Ложь, то возникнет исключение при отсутствии прав на любой из реквизитов любого +// из объектов. // // Возвращаемое значение: // Соответствие - Ключ - ссылка на объект, Значение - значение прочитанного реквизита. // -Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита) Экспорт +Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт - ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита); + ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные); Для Каждого Элемент Из ЗначенияРеквизитов Цикл ЗначенияРеквизитов[Элемент.Ключ] = Элемент.Значение[ИмяРеквизита]; КонецЦикла; @@ -204,13 +231,14 @@ КонецФункции -// Проверяет проведенность документов. +// Проверяет статус проведения переданных документов и возвращает +// те из них, которые не проведены. // // Параметры: -// Документы - Массив - документы, проведенность которых необходимо проверить. +// Документы - Массив - документы, статус проведения которых необходимо проверить. // // Возвращаемое значение: -// Массив - непроведенные документы из массива Документы. +// Массив - непроведенные документы. // Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт @@ -266,12 +294,12 @@ // Выполняет попытку проведения документов. // // Параметры: -// Документы - Массив - документы, которые необходимо провести. +// Документы - Массив - документы, которые необходимо провести. // // Возвращаемое значение: -// Массив - массив структур с полями: -// Ссылка - документ, который не удалось провести; -// ОписаниеОшибки - текст описания ошибки при проведении. +// Массив - массив структур со свойствами: +// * Ссылка - ДокументСсылка - документ, который не удалось провести. +// * ОписаниеОшибки - Строка - текст описания ошибки при проведении. // Функция ПровестиДокументы(Документы) Экспорт @@ -310,18 +338,16 @@ // Проверяет наличие ссылок на объект в базе данных. // // Параметры: -// Ссылка - ЛюбаяСсылка -// - Массив значений типа ЛюбаяСсылка. -// -// ИскатьСредиСлужебныхОбъектов - Булево - начальное значение Ложь, -// когда установлено Истина, тогда не будут учитываться -// исключения поиска ссылок, заданные при разработке конфигурации. -// -// ДругиеИсключения - Массив полных имен объектов метаданных, которые также -// требуется исключить из поиска ссылок. +// СсылкаИлиМассивСсылок - ЛюбаяСсылка, Массив - объект или список объектов. +// ИскатьСредиСлужебныхОбъектов - Булево - если Истина, то не будут учитываться +// исключения поиска ссылок, заданные при разработке конфигурации. +// Про исключение поиска ссылок подробнее +// см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок +// ДругиеИсключения - Массив - полные имена объектов метаданных, которые также +// требуется исключить из поиска ссылок. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если есть ссылки на объект. // Функция ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь, ДругиеИсключения = Неопределено) Экспорт @@ -340,7 +366,7 @@ ТаблицаСсылок.Колонки[2].Имя = "ОбнаруженныйМетаданные"; Если НЕ ИскатьСредиСлужебныхОбъектов Тогда - ИсключенияПоискаСсылок = ПолучитьОбщийСписокИсключенийПоискаСсылок(); + ИсключенияПоискаСсылок = ИсключенияПоискаСсылок(); Исключения = Новый Массив; Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл @@ -399,7 +425,8 @@ // "Непосредственно" - Удалять непосредственно. // // * УчитыватьПрикладныеПравила - Булево - Необязательный. Режим проверки параметра ПарыЗамен. -// Истина - По умолчанию. Проверять каждую пару "дубль-оригинал" (вызывается функция ВозможностьЗаменыЭлементов модуля менеджера). +// Истина - По умолчанию. Проверять каждую пару "дубль-оригинал" (вызывается функция +// ВозможностьЗаменыЭлементов модуля менеджера). // Ложь - Отключить прикладные проверки пар. // // * ВключатьБизнесЛогику - Булево - Необязательный. Режим записи мест использования при замене дублей на оригиналы. @@ -594,7 +621,6 @@ УстановитьПривилегированныйРежим(Истина); МестаИспользования = НайтиПоСсылкам(НаборСсылок); - УстановитьПривилегированныйРежим(Ложь); МестаИспользования.Колонки.Добавить("ПредставлениеДанных", Новый ОписаниеТипов("Строка")); МестаИспользования.Колонки.Добавить("ТипСсылки"); @@ -613,7 +639,7 @@ МетаКонстанты = Метаданные.Константы; МетаДокументы = Метаданные.Документы; - ИсключенияПоискаСсылок = ПолучитьОбщийСписокИсключенийПоискаСсылок(); + ИсключенияПоискаСсылок = ИсключенияПоискаСсылок(); КэшИзмерений = Новый Соответствие; @@ -710,6 +736,9 @@ // Возвращает описание типа, включающего в себя все возможные ссылочные типы конфигурации. // +// Возвращаемое значение: +// ОписаниеТипов - все ссылочные типы конфигурации. +// Функция ОписаниеТипаВсеСсылки() Экспорт Возврат Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов( @@ -730,13 +759,89 @@ //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции для работы с прикладными типами и коллекциями значений. -// Получает имя значения перечисления как объекта метаданных. +// Установить текст запроса, основную таблицу или динамическое считывание в динамическом списке. +// Устанавливать эти свойства следует за один вызов этой процедуры, чтобы не снижалась производительность. // // Параметры: -// Значение - значение перечисления для которого необходимо получить имя перечисления. +// Список - ТаблицаФормы - элемент формы динамического списка, для которого устанавливаются свойства. +// СтруктураПараметров - Структура - см. СтруктураСвойствДинамическогоСписка(). +// +Процедура УстановитьСвойстваДинамическогоСписка(Список, СтруктураПараметров) Экспорт + + Форма = Список.Родитель; + ТипУправляемаяФорма = Тип("УправляемаяФорма"); + + Пока ТипЗнч(Форма) <> ТипУправляемаяФорма Цикл + Форма = Форма.Родитель; + КонецЦикла; + + ДинамическийСписок = Форма[Список.ПутьКДанным]; + РежимОтладки = ОбщегоНазначенияКлиентСервер.РежимОтладки(); + + Если РежимОтладки Тогда + Язык = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); + РасположениеСписка = СтрШаблон("%1.%2", Форма.ИмяФормы, Список.ПутьКДанным); + КонецЕсли; + + ТекстЗапроса = СтруктураПараметров.ТекстЗапроса; + + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ДинамическийСписок.ТекстЗапроса = ТекстЗапроса; + + Если РежимОтладки Тогда + ИмяСобытия = НСтр("ru = 'Установка свойств динамического списка.Текст запроса'", Язык); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,, РасположениеСписка, ТекстЗапроса); + КонецЕсли; + КонецЕсли; + + ОсновнаяТаблица = СтруктураПараметров.ОсновнаяТаблица; + + Если Не ПустаяСтрока(ОсновнаяТаблица) Тогда + ДинамическийСписок.ОсновнаяТаблица = ОсновнаяТаблица; + + Если РежимОтладки Тогда + ИмяСобытия = НСтр("ru = 'Установка свойств динамического списка.Основная таблица'", Язык); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,, РасположениеСписка, ОсновнаяТаблица); + КонецЕсли; + КонецЕсли; + + ДинамическоеСчитываниеДанных = СтруктураПараметров.ДинамическоеСчитываниеДанных; + + Если ТипЗнч(ДинамическоеСчитываниеДанных) = Тип("Булево") Тогда + ДинамическийСписок.ДинамическоеСчитываниеДанных = ДинамическоеСчитываниеДанных; + + Если РежимОтладки Тогда + ИмяСобытия = НСтр("ru = 'Установка свойств динамического списка.Динамическое считывание данных'", Язык); + ЗаписьЖурналаРегистрации(ИмяСобытия, + УровеньЖурналаРегистрации.Информация,, + РасположениеСписка, + ДинамическоеСчитываниеДанных); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Создать структуру свойств динамического списка для вызова УстановитьСвойстваДинамическогоСписка(). // // Возвращаемое значение: -// Строка - имя значения перечисления как объекта метаданных. +// Структура - любое поле может иметь значение неопределено, если оно не устанавливается: +// * ТекстЗапроса - Строка - новый текст запроса. +// * ОсновнаяТаблица - Строка - имя основной таблицы. +// * ДинамическоеСчитываниеДанных - Булево - признак использования динамического считывания. +// +Функция СтруктураСвойствДинамическогоСписка() Экспорт + + Возврат Новый Структура("ТекстЗапроса, ОсновнаяТаблица, ДинамическоеСчитываниеДанных"); + +КонецФункции + +// Возвращает строковое имя значения перечисления по его ссылке. +// +// Параметры: +// Значение - ПеречислениеСсылка - значение, для которого необходимо получить имя перечисления. +// +// Возвращаемое значение: +// Строка - имя значения перечисления. // Функция ИмяЗначенияПеречисления(Значение) Экспорт @@ -753,8 +858,8 @@ // Для использования в обработчиках события ОбработкаПроверкиЗаполнения. // // Параметры: -// МассивРеквизитов - Массив - массив строк с именами реквизитов объекта. -// МассивНепроверяемыхРеквизитов - Массив строк с именами реквизитов объекта, не требующих проверки. +// МассивРеквизитов - Массив - коллекция имен реквизитов объекта. +// МассивНепроверяемыхРеквизитов - Массив - коллекция имен реквизитов объекта, не требующих проверки. // Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт @@ -769,23 +874,22 @@ КонецПроцедуры -// Преобразует таблицу значений в массив. -// Может использоваться для передачи на клиента данных, полученных -// на сервере в виде таблицы значений в том случае, если таблица -// значений содержит только такие значения, которые могут -// быть переданы на клиента. +// Преобразует таблицу значений в массив структур. +// Может использоваться для передачи на клиент данных в том случае, если таблица +// значений содержит только такие значения, которые могут +// быть переданы с сервера на клиент. // -// Полученный массив содержит структуры, каждая из которых повторяет -// структуру колонок таблицы значений. +// Полученный массив содержит структуры, каждая из которых повторяет +// структуру колонок таблицы значений. // -// Не рекомендуется использовать для преобразования таблиц значений -// с большим количеством строк. +// Не рекомендуется использовать для преобразования таблиц значений +// с большим количеством строк. // -// Параметры: -// ТаблицаЗначений - ТаблицаЗначений. +// Параметры: +// ТаблицаЗначений - ТаблицаЗначений - исходная таблица значений. // -// Возвращаемое значение: -// Массив +// Возвращаемое значение: +// Массив - коллекция строк таблицы в виде структур. // Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт @@ -808,17 +912,14 @@ КонецФункции -// Функция СтрокаТаблицыЗначенийВСтруктуру создает -// структуру со свойствами, как колонки таблицы -// значений передаваемой строки -// и устанавливает этим свойствам значения -// из строки таблицы значений. -// -// Параметры: -// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений. +// Преобразует строку таблицы значений в структуру. +// Свойства структуры и их значения совпадают с колонками переданной строки. // -// ВозвращаемоеЗначение: -// Структура +// Параметры: +// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений - строка таблицы значений. +// +// Возвращаемое значение: +// Структура - преобразованная строка таблицы значений. // Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт @@ -831,11 +932,15 @@ КонецФункции -// Создает структуру аналогичную менеджеру записи регистра сведений. -// +// Создает структуру, содержащую имена и значения измерений, ресурсов и реквизитов +// переданного менеджера записи регистра сведений. +// // Параметры: -// МенеджерЗаписи - РегистрСведенийМенеджерЗаписи, -// МетаданныеРегистра - метаданные регистра сведений. +// МенеджерЗаписи - РегистрСведенийМенеджерЗаписи - менеджер записи, из которого надо получить структуру. +// МетаданныеРегистра - ОбъектМетаданных - метаданные регистра сведений. +// +// Возвращаемое значение: +// Структура - коллекция измерений, ресурсов и реквизитов переданного менеджеру записи. // Функция СтруктураПоМенеджеруЗаписи(МенеджерЗаписи, МетаданныеРегистра) Экспорт @@ -858,14 +963,24 @@ КонецФункции -// Создает массив и копирует в него значения, содержащиеся в колонке коллекции строк. +// Создает массив и копирует в него значения, содержащиеся в колонке объекта, для +// которого доступен обход посредством оператора Для каждого … Из. // // Параметры: -// КоллекцияСтрок - коллекция, для которой доступен обход посредством -// оператора Для каждого … Из … Цикл. -// ИмяКолонки - строка с именем поля коллекции, значения которого нужно выгрузить. -// ТолькоУникальныеЗначения - булево, необязательный, если истина, -// то в массив будут включены только различающиеся значения. +// КоллекцияСтрок - ТаблицаЗначений, +// ДеревоЗначений, +// СписокЗначений, +// ТабличнаяЧасть, +// Соответствие, +// Структура - коллекция, колонку которой нужно выгрузить в массив. +// А так же другие объекты, для которых доступен обход +// посредством оператора Для каждого … Из … Цикл. +// ИмяКолонки - Строка - имя поля коллекции, значения которого нужно выгрузить. +// ТолькоУникальныеЗначения - Булево - необязательный, если истина, то в массив будут включены +// только различающиеся значения. +// +// Возвращаемое значение: +// Массив - значения колонки. // Функция ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) Экспорт @@ -886,12 +1001,9 @@ КонецФункции -// Преобразует текст формата XML в таблицу значений, +// Преобразует текст указанного формата XML в таблицу значений, // при этом колонки таблицы формируются на основе описания в XML. // -// Параметры: -// XML - текст в формате XML или ЧтениеXML. -// // Схема XML: // // @@ -913,16 +1025,17 @@ // // // -// Примеры XML-файлов см. в демонстрационной конфигурации. -// -// Пример использования: -// КлассификаторТаблица = ПрочитатьXMLВТаблицу( -// Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст()).Данные; +// Параметры: +// XML - Строка, ЧтениеXML - текст в формате XML или ЧтениеXML. // // Возвращаемое значение: -// Структура - с полями -// * ИмяТаблицы - Строка -// * Данные - ТаблицаЗначений. +// Структура - со свойствами: +// * ИмяТаблицы - Строка - имя таблицы. +// * Данные - ТаблицаЗначений - преобразованная из XML таблица. +// +// Пример: +// КлассификаторТаблица = ПрочитатьXMLВТаблицу( +// Обработки.ЗагрузкаКурсовВалют.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст()).Данные; // Функция ПрочитатьXMLВТаблицу(Знач XML) Экспорт @@ -978,31 +1091,45 @@ КонецФункции -// Функция выполняет сравнение двух коллекций строк, для которых доступен обход -// посредством оператора Для каждого … Из … Цикл. +// Функция выполняет сравнение двух коллекций строк (ТаблицаЗначений, ДеревоЗначений и т.д.), +// для которых доступен обход посредством оператора Для каждого … Из … Цикл. // Сравниваемые коллекции должны отвечать следующим требованиям: // - доступен обход посредством оператора Для каждого … Из … Цикл, // - наличие в обеих коллекциях всех колонок, перечисленных в параметре ИменаКолонок // (если ИменаКолонок не заполнен - всех колонок). -// Так же позволяет сравнивать массивы. +// Также позволяет сравнивать массивы. // // Параметры: -// КоллекцияСтрок1 - КоллекцияЗначений - коллекция, отвечающая вышеописанным требованиям; -// КоллекцияСтрок2 - КоллекцияЗначений - коллекция, отвечающая вышеописанным требованиям; -// ИменаКолонок - Строка - имена колонок через запятую, -// по которым производится сравнение. -// Не является обязательным для коллекций, -// состав колонок которых можно выявить: -// ТаблицаЗначений, СписокЗначений, Соответствие, Структура, -// если не указан - сравнение производится по всем колонкам. -// Для коллекций других типов является обязательным. -// ИсключаяКолонки - Строка - имена колонок, которые игнорируются при сравнении, необязательный. -// УчитыватьПоследовательностьСтрок - Булево - если Истина, то коллекции признаются -// идентичными только если одинаковые строки размещены -// в коллекциях на одинаковых местах. +// КоллекцияСтрок1 - ТаблицаЗначений, +// ДеревоЗначений, +// СписокЗначений, +// ТабличнаяЧасть, +// Соответствие, +// Структура - коллекция, отвечающая вышеописанным требованиям. +// А так же другие объекты, для которых доступен обход +// посредством оператора Для каждого … Из … Цикл. +// КоллекцияСтрок2 - ТаблицаЗначений, +// ДеревоЗначений, +// СписокЗначений, +// ТабличнаяЧасть, +// Соответствие, +// Структура - коллекция, отвечающая вышеописанным требованиям. +// А так же другие объекты, для которых доступен обход +// посредством оператора Для каждого … Из … Цикл. +// ИменаКолонок - Строка - имена колонок через запятую, +// по которым производится сравнение. +// Не является обязательным для коллекций, +// состав колонок которых можно выявить: +// ТаблицаЗначений, СписокЗначений, Соответствие, Структура, +// если не указан - сравнение производится по всем колонкам. +// Для коллекций других типов является обязательным. +// ИсключаяКолонки - Строка - имена колонок, которые игнорируются при сравнении, необязательный. +// УчитыватьПоследовательностьСтрок - Булево - если Истина, то коллекции признаются +// идентичными только если одинаковые строки размещены +// в коллекциях на одинаковых местах. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если идентичны. // Функция КоллекцииИдентичны(КоллекцияСтрок1, КоллекцияСтрок2, ИменаКолонок = "", ИсключаяКолонки = "", УчитыватьПоследовательностьСтрок = Ложь) Экспорт @@ -1219,16 +1346,16 @@ // Сравнивает данные сложной структуры с учетом вложенности. // // Параметры: -// Данные1 - Структура, ФиксированнаяСтруктура - -// - Соответствие, ФиксированноеСоответствие - -// - Массив, ФиксированныйМассив - -// - ХранилищеЗначения, ТаблицаЗначений - сложные типы для сравнения. -// - Строка, Число, Булево - простые типы, которые можно сравнивать на равно. +// Данные1 - Структура, ФиксированнаяСтруктура, +// Соответствие, ФиксированноеСоответствие, +// Массив, ФиксированныйМассив, +// ХранилищеЗначения, ТаблицаЗначений, +// Строка, Число, Булево - сравниваемые данные. // // Данные2 - Произвольный - те же типы, что и для параметра Данные1. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если совпадают. // Функция ДанныеСовпадают(Данные1, Данные2) Экспорт @@ -1346,12 +1473,13 @@ // ХранилищеЗначения, ОбщийМодуль, ОбъектМетаданных, ТипЗначенияXDTO, ТипОбъектаXDTO, // ЛюбаяСсылка. // -// ВызыватьИсключение - Булево - начальное значение Истина. Когда установлено. -// Ложь, тогда в случае наличия нефиксируемых данных исключение не будет -// вызвано, при этом данные будут зафиксированы на сколько возможно. +// ВызыватьИсключение - Булево - начальное значение Истина. Когда установлено Ложь, тогда в случае наличия +// нефиксируемых данных исключение не будет вызвано, при этом данные будут +// зафиксированы на сколько возможно. // // Возвращаемое значение: -// Фиксированные данные, аналогичные переданным в параметре Данные. +// ФиксированнаяСтруктура, ФиксированноеСоответствие, ФиксированныйМассив - фиксированные данные, аналогичные +// переданным в параметре Данные. // Функция ФиксированныеДанные(Данные, ВызыватьИсключение = Истина) Экспорт @@ -1417,59 +1545,73 @@ КонецФункции -// Создает копию объекта XDTO. +// Вычисляет контрольную сумму для произвольных данных по указанному алгоритму. // // Параметры: -// Фабрика - ФабрикаXDTO - фабрика, которой создан исходный объект. -// Объект - ОбъектXDTO - объект, копию которого требуется создать. -// +// Данные - Произвольный - любое сериализуемое значение. +// Алгоритм - ХешФункция - алгоритм расчета контрольной суммы. По умолчанию, MD5. +// // Возвращаемое значение: -// ОбъектXDTO - копия исходного объекта XDTO. +// Строка - контрольная сумма строкой без пробелов, 32 байта. // -Функция СкопироватьXDTO(Знач Фабрика, Знач Объект) Экспорт +Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт + Если Алгоритм = Неопределено Тогда + Алгоритм = ХешФункция.MD5; + КонецЕсли; - Запись = Новый ЗаписьXML; - Запись.УстановитьСтроку(); - Фабрика.ЗаписатьXML(Запись, Объект, , , , НазначениеТипаXML.Явное); - - XMLПредставление = Запись.Закрыть(); - - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLПредставление); - - Возврат Фабрика.ПрочитатьXML(Чтение, Объект.Тип()); + ХешированиеДанных = Новый ХешированиеДанных(Алгоритм); + Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда + Данные = ЗначениеВСтрокуXML(Данные); + КонецЕсли; + ХешированиеДанных.Добавить(Данные); + Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + Возврат Результат; КонецФункции -// Возвращает XML представление типа XDTO. +// Сокращает строку до нужной длины, при этом обрезанная часть хешируется, +// обеспечивая уникальность строки. Проверяет длину строки на входе и, в случае +// превышения максимальной длины, преобразует ее конец по алгоритму MD5 в +// уникальную строку из 32 символов. // // Параметры: -// ТипXDTO - ТипОбъектаXDTO, ТипЗначенияXDTO - тип XDTO для которого требуется получить. -// XML представление. -// +// Строка - Строка - исходная строка произвольной длины. +// МаксимальнаяДлина - Число - требуемое максимальное количество символов в строке, +// минимальное значение: 32. +// // Возвращаемое значение: -// Строка - XML представление типа XDTO. +// Строка - строка, не превышающая максимальную длину. // -Функция ПредставлениеТипаXDTO(ТипXDTO) Экспорт - - Возврат СериализаторXDTO.XMLСтрока(Новый РасширенноеИмяXML(ТипXDTO.URIПространстваИмен, ТипXDTO.Имя)) +Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) Экспорт + ОбщегоНазначенияКлиентСервер.Проверить(МаксимальнаяДлина >= 32, НСтр("ru = 'Параметр МаксимальнаяДлина не может быть меньше 32'"), + "ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой"); + Результат = Строка; + Если СтрДлина(Строка) > МаксимальнаяДлина Тогда + Результат = Лев(Строка, МаксимальнаяДлина - 32); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1)); + Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + КонецЕсли; + Возврат Результат; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Математические процедуры и функции. -// Выполняет пропорциональное распределение суммы в соответствии с заданными коэффициентами. +// Делит сумму на требуемое количество частей, размеры частей задаются коэффициентами. +// Остатки от округления распределяется на часть с наибольшим коэффициентом. // // Параметры: -// РаспределяемаяСумма - Число; -// КоэффициентыРаспределения - Массив; -// ТочностьОкругления - Число. +// РаспределяемаяСумма - Число - сумма, которую надо распределить; +// КоэффициентыРаспределения - Массив - список коэффициентов (типа Число); +// Точность - Число - количество знаков дробной части, до которых производится округление. Если параметр отрицательный, +// то число округляется до соответствующего разряда в целой части, начиная с младших разрядов. // // Возвращаемое значение: -// Массив - список распределенных сумм. -// В случае, если распределить не удалось (сумма = 0, кол-во коэффициентов = 0, -// или суммарный вес коэффициентов = 0), возвращается значение Неопределено. +// Массив - список чисел, полученный в результате распределения суммы. +// В случае если распределить не удалось (сумма = 0, кол-во коэффициентов = 0, +// или суммарный вес коэффициентов = 0), то возвращается значение Неопределено. // Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, КоэффициентыРаспределения, Знач Точность = 2) Экспорт @@ -1510,7 +1652,7 @@ // нужно проверить строку соединения не текущей информационной базы. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если файловая. // Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт @@ -1523,9 +1665,9 @@ // Переводит параметры сеанса в состояние "Не установлено". // -// Параметры: -// ПараметрыДляОчистки - Строка - имена параметров сеанса для очистки, разделенные ",". -// Исключения - Строка - имена параметров сеанса не предназначенные для очистки, разделенные ",". +// Параметры: +// ПараметрыДляОчистки - Строка - имена параметров сеанса для очистки, разделенные ",". +// Исключения - Строка - имена параметров сеанса не предназначенные для очистки, разделенные ",". // Процедура ОчиститьПараметрыСеанса(ПараметрыДляОчистки = "", Исключения = "") Экспорт @@ -1557,10 +1699,10 @@ // Возвращает описание предмета в виде текстовой строки. // // Параметры: -// СсылкаНаПредмет - ЛюбаяСсылка - объект ссылочного типа. +// СсылкаНаПредмет - ЛюбаяСсылка - объект ссылочного типа. // // Возвращаемое значение: -// Строка. +// Строка - представление предмета. // Функция ПредметСтрокой(СсылкаНаПредмет) Экспорт @@ -1582,41 +1724,90 @@ КонецФункции -// Формирует соответствие для удаления объектов. +// Возвращает исключения при поиске мест использования объектов. // // Возвращаемое значение: -// Соответствие - Исключения поиска ссылок в разрезе объектов метаданных. +// Соответствие - Исключения поиска ссылок в разрезе объектов метаданных: // * Ключ - ОбъектМетаданных - Объект метаданных, для которого применяются исключения. // * Значение - Строка, Массив - описание исключенных реквизитов. -// - "*" - Исключены все реквизиты объекта метаданных. -// - Массив из Строка - Относительные имена исключенных реквизитов. +// Если "*", то исключены все реквизиты объекта метаданных. +// Если массив строк, то содержит относительные имена исключенных реквизитов. // -Функция ПолучитьОбщийСписокИсключенийПоискаСсылок() Экспорт - МассивИсключенийСобытия = Новый Массив; - ОбработчикиСобытия = ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДобавленииИсключенийПоискаСсылок(МассивИсключенийСобытия); - КонецЦикла; +Функция ИсключенияПоискаСсылок() Экспорт - МассивИсключенийПереопределения = Новый Массив; - ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок(МассивИсключенийПереопределения); + ИсключенияПоискаИнтеграция = Новый Массив; + + ИнтеграцияСтандартныхПодсистем.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаИнтеграция); + + ИсключенияПоиска = Новый Массив; + ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоиска); + + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИсключенияПоиска, ИсключенияПоискаИнтеграция); Результат = Новый Соответствие; - ДобавитьИсключенияПоискаСсылок(Результат, МассивИсключенийСобытия); - ДобавитьИсключенияПоискаСсылок(Результат, МассивИсключенийПереопределения); + Для Каждого ИсключениеПоиска Из ИсключенияПоиска Цикл + // Определение полного имени реквизита и объекта метаданных - носителя реквизита. + Если ТипЗнч(ИсключениеПоиска) = Тип("Строка") Тогда + ПолноеИмя = ИсключениеПоиска; + МассивПодстрок = СтрРазделить(ПолноеИмя, "."); + КоличествоПодстрок = МассивПодстрок.Количество(); + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(МассивПодстрок[0] + "." + МассивПодстрок[1]); + Иначе + ОбъектМетаданных = ИсключениеПоиска; + ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + МассивПодстрок = СтрРазделить(ПолноеИмя, "."); + КоличествоПодстрок = МассивПодстрок.Количество(); + Если КоличествоПодстрок > 2 Тогда + Пока Истина Цикл + Родитель = ОбъектМетаданных.Родитель(); + Если ТипЗнч(Родитель) = Тип("ОбъектМетаданныхКонфигурация") Тогда + Прервать; + Иначе + ОбъектМетаданных = Родитель; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + // Регистрация. + Если КоличествоПодстрок < 4 Тогда + Результат.Вставить(ОбъектМетаданных, "*"); + Иначе + ПутиКРеквизитам = Результат.Получить(ОбъектМетаданных); + Если ПутиКРеквизитам = "*" Тогда + Продолжить; // Весь объект метаданных уже исключен. + ИначеЕсли ПутиКРеквизитам = Неопределено Тогда + ПутиКРеквизитам = Новый Массив; + Результат.Вставить(ОбъектМетаданных, ПутиКРеквизитам); + КонецЕсли; + // Формат реквизита: + // "<ВидОМ>.<ИмяОМ>.<ТипРеквизитаИлиТЧ>.<ИмяРеквизитаИлиТЧ>[.<ТипРеквизита>.<ИмяРеквизитаТЧ>]". + // Примеры: + // "РегистрСведений.ВерсииОбъектов.Реквизит.АвторВерсии", + // "Документ._ДемоЗаказПокупателя.ТабличнаяЧасть.СчетаНаОплату.Реквизит.Счет", + // "ПланВидовРасчета._ДемоОсновныеНачисления.СтандартнаяТабличнаяЧасть.БазовыеВидыРасчета.СтандартныйРеквизит.ВидРасчета". + // Относительный путь к реквизиту должен получиться таким, чтобы его можно было использовать в условиях запроса: + // "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]". + Если КоличествоПодстрок = 4 Тогда + ОтносительныйПутьКРеквизиту = МассивПодстрок[3]; + Иначе + ОтносительныйПутьКРеквизиту = МассивПодстрок[3] + "." + МассивПодстрок[5]; + КонецЕсли; + ПутиКРеквизитам.Добавить(ОтносительныйПутьКРеквизиту); + КонецЕсли; + КонецЦикла; Возврат Результат; + КонецФункции -// Возвращает значение в виде XML-строки. -// Преобразованы в XML-строку (сериализованы) могут быть только те объекты, -// для которых в описании указано, что они сериализуются. +// Преобразует (сериализует) любое значение в XML-строку. +// Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются. +// См. также ЗначениеИзСтрокиXML. // // Параметры: -// Значение - Произвольный. Значение, которое необходимо сериализовать в XML-строку. +// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку. // // Возвращаемое значение: -// Строка - XML-строка представления значения в сериализованном виде. +// Строка - XML-строка. // Функция ЗначениеВСтрокуXML(Значение) Экспорт @@ -1627,15 +1818,14 @@ Возврат ЗаписьXML.Закрыть(); КонецФункции -// Возвращает значение, полученное из XML-строки. -// Получены из XML-строки могут быть только те объекты, -// для которых в описании указано, что они сериализуются. +// Выполняет преобразование (десериализацию) XML-строки в значение. +// См. также ЗначениеВСтрокуXML. // // Параметры: -// СтрокаXML - строка представления значения в сериализованном виде. +// СтрокаXML - Строка - XML-строка, с сериализованным объектом.. // // Возвращаемое значение: -// Значение, полученное из переданной XML-строки. +// Произвольный - значение, полученное из переданной XML-строки. // Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт @@ -1679,7 +1869,7 @@ // Если параметр не указан - будет использоваться глобальная фабрика XDTO. // // Возвращаемое значение: -// ОбъектXDTO. +// ОбъектXDTO - XDTO-объект. // Функция ОбъектXDTOИзСтрокиXML(Знач СтрокаXML, Знач Фабрика = Неопределено) Экспорт @@ -1694,10 +1884,11 @@ КонецФункции -// Формирует из исходной строки СтрокаПоиска строку для поиска данных в запросе. +// Подготавливает строку для использования в качестве шаблона поиска в запросе. +// Экранирует служебные символы, если они есть в строке. // // Параметры: -// СтрокаПоиска - Строка - исходная строка, содержащая запрещенные символы. +// СтрокаПоиска - Строка - произвольная строка. // // Возвращаемое значение: // Строка - строка подготовленная для поиска данных в запросе. @@ -1724,7 +1915,7 @@ // - умеет делать быструю проверку доступности сервиса. // // Параметры: -// Параметры - Структура - настройки подключения (необходимо использовать функцию ПараметрыПодключенияWSПрокси): +// ПереданныеПараметры - Структура - настройки подключения (необходимо использовать функцию ПараметрыПодключенияWSПрокси): // * АдресWSDL - Строка - месторасположение wsdl. // * URIПространстваИмен - Строка - URI пространства имен web-сервиса. // * ИмяСервиса - Строка - имя сервиса. @@ -1734,12 +1925,15 @@ // * Таймаут - Число - (необязательный) таймаут на операции выполняемые через полученное прокси. // * Местоположение - Строка - (необязательный) фактический адрес сервиса. Используется, если адрес реального // расположения сервиса отличается от адреса, который указан в WSDL-файле. -// * ИспользоватьАутентификациюОС - Булево - (необязательный) включает использование авторизации NTLM или Negotiate на сервере. +// * ИспользоватьАутентификациюОС - Булево - (необязательный) включает использование авторизации NTLM или Negotiate на +// сервере. // * ДелатьКонтрольныйВызов - Булево - (необязательный) выполнять проверку доступности сервиса (требуется // поддержка этой команды веб-сервисом). +// * ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL, Неопределено - (необязательный) параметры защищенного +// соединения. // // Возвращаемое значение: -// WSПрокси. +// WSПрокси - объект WSПрокси. // Функция СоздатьWSПрокси(ПереданныеПараметры) Экспорт @@ -1754,9 +1948,7 @@ Если ДелатьКонтрольныйВызов И Таймаут <> Неопределено И Таймаут > 20 Тогда ПараметрыПодключения.Таймаут = 3; - ПараметрыПодключенияСтрокой = ЗначениеВСтрокуXML(ПараметрыПодключения); - WSПроксиPing = ОбщегоНазначенияПовтИсп.СоздатьWSПрокси(ПараметрыПодключенияСтрокой); - ПараметрыПодключения.Таймаут = Таймаут; + WSПроксиPing = РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения); Попытка WSПроксиPing.Ping(); Исключение @@ -1764,14 +1956,18 @@ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; + ПараметрыПодключения.Таймаут = Таймаут; КонецЕсли; - ПараметрыПодключенияСтрокой = ЗначениеВСтрокуXML(ПараметрыПодключения); - Возврат ОбщегоНазначенияПовтИсп.СоздатьWSПрокси(ПараметрыПодключенияСтрокой); + Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения); КонецФункции // Возвращает структуру параметров для функции СоздатьWSПрокси. +// +// Возвращаемое значение: +// Структура - коллекция параметров, см. СоздатьWSПрокси(). +// Функция ПараметрыПодключенияWSПрокси() Экспорт Результат = Новый Структура; Результат.Вставить("АдресWSDL"); @@ -1784,6 +1980,7 @@ Результат.Вставить("Местоположение"); Результат.Вставить("ИспользоватьАутентификациюОС", Ложь); Результат.Вставить("ДелатьКонтрольныйВызов", Ложь); + Результат.Вставить("ЗащищенноеСоединение", Неопределено); Возврат Результат; КонецФункции @@ -1802,117 +1999,82 @@ Возврат ОбщегоНазначенияПовтИсп.ДоступностьОбъектовПоОпциям()[ОбъектМетаданных.ПолноеИмя()] <> Ложь; КонецФункции -// Устанавливает или снимает пометку удаления для всех объектов, которые ссылаются на заданный "объект-владелец". -// -// Параметры: -// Владелец - ПланОбменаСсылка, СправочникСсылка, ДокументСсылка - ссылка на объект, который является -// "владельцем" по отношению к помечаемым на удаление объектам. -// -// ПометкаУдаления - Булево - признак установки/снятия пометки на удаление у всех "подчиненных" объектов. -// -Процедура УстановитьПометкуУдаленияПодчиненнымОбъектам(Знач Владелец, Знач ПометкаУдаления) Экспорт - - НачатьТранзакцию(); - Попытка - - СписокСсылок = Новый Массив; - СписокСсылок.Добавить(Владелец); - Ссылки = НайтиПоСсылкам(СписокСсылок); - - Для Каждого Ссылка Из Ссылки Цикл - - Если ЗначениеСсылочногоТипа(Ссылка[1]) Тогда - Ссылка[1].ПолучитьОбъект().УстановитьПометкуУдаления(ПометкаУдаления); - КонецЕсли; - - КонецЦикла; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Пытается выполнить запрос в несколько попыток. -// Используется для чтения вне транзакции часто изменяемых данных. -// При вызове в транзакции выдает ошибку. -// -// Параметры: -// Запрос - Запрос - запрос который требуется выполнить. -// -// Возвращаемое значение: -// РезультатЗапроса - результат выполнения запроса. -// -Функция ВыполнитьЗапросВнеТранзакции(Знач Запрос) Экспорт - - Если ТранзакцияАктивна() Тогда - ВызватьИсключение(НСтр("ru = 'Транзакция активна. Выполнение запроса вне транзакции невозможно.'")); - КонецЕсли; - - КоличествоПопыток = 0; - - Результат = Неопределено; - Пока Истина Цикл - Попытка - Результат = Запрос.Выполнить(); // Чтение вне транзакции, возможно появление ошибки. - // Could not continue scan with NOLOCK due to data movement - // в этом случае нужно повторить попытку чтения. - Прервать; - Исключение - КоличествоПопыток = КоличествоПопыток + 1; - Если КоличествоПопыток = 5 Тогда - ВызватьИсключение; - КонецЕсли; - КонецПопытки; - КонецЦикла; - - Возврат Результат; - -КонецФункции - -// Возвращает общие параметры базовой функциональности. -// -// Возвращаемое значение: -// Структура - структура со свойствами: -// * ИмяФормыПерсональныхНастроек - Строка - имя формы для редактирования персональных настроек. -// Ранее определялись в -// ОбщегоНазначенияПереопределяемый.ИмяФормыПерсональныхНастроек. -// * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы. -// Например, "8.3.4.365". -// Ранее определялись в -// ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы. -// * РаботаВПрограммеЗапрещена - Булево - Начальное значение Ложь. -// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - по умолчанию Истина. Если установить Ложь, то -// подтверждение при завершении работы программы не -// будет запрашиваться, если явно не разрешить в -// персональных настройках программы. -// * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных -// и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. -// Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. -// +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности. Функция ОбщиеПараметрыБазовойФункциональности() Экспорт ОбщиеПараметры = Новый Структура; ОбщиеПараметры.Вставить("ИмяФормыПерсональныхНастроек", ""); - ОбщиеПараметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", "8.3.8.1652"); - ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); // Блокировать запуск, если версия ниже минимальной. ОбщиеПараметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", Истина); ОбщиеПараметры.Вставить("ОтключитьИдентификаторыОбъектовМетаданных", Ложь); ОбщиеПараметры.Вставить("РекомендуемыйОбъемОперативнойПамяти", 2); + ОбщиеПараметры.Вставить("МинимальнаяВерсияПлатформы", "8.3.10.2168"); + ОбщиеПараметры.Вставить("РекомендуемаяВерсияПлатформы", "8.3.10.2168"); + // Устарело, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы: + ОбщиеПараметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ""); + ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); // Блокировать запуск, если версия ниже минимальной. ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры); + Минимальная = ОбщиеПараметры.МинимальнаяВерсияПлатформы; + Рекомендуемая = ОбщиеПараметры.РекомендуемаяВерсияПлатформы; + Если Не ПустаяСтрока(Минимальная) + И Не ПустаяСтрока(Рекомендуемая) + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Рекомендуемая) > 0 Тогда + ТекстСообщения = НСтр("ru = 'Минимальная версия платформы ""1С:Предприятие 8"" указана выше рекомендуемой. + |Минимальная версия - ""%1"", рекомендуемая версия - ""%2"".'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения, + ОбщиеПараметры.МинимальнаяВерсияПлатформы, + ОбщиеПараметры.РекомендуемаяВерсияПлатформы); + КонецЕсли; + + // Обратная совместимость. + МинимальноНеобходимаяВерсияПлатформы = ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы; + Если ЗначениеЗаполнено(МинимальноНеобходимаяВерсияПлатформы) Тогда + Если ОбщиеПараметры.РаботаВПрограммеЗапрещена Тогда + ОбщиеПараметры.МинимальнаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы; + ОбщиеПараметры.РекомендуемаяВерсияПлатформы = ""; + Иначе + ОбщиеПараметры.РекомендуемаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы; + ОбщиеПараметры.МинимальнаяВерсияПлатформы = ""; + КонецЕсли; + Иначе + СистемнаяИнформация = Новый СистемнаяИнформация; + Текущая = СистемнаяИнформация.ВерсияПриложения; + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Текущая) > 0 Тогда + ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Минимальная; + ОбщиеПараметры.РаботаВПрограммеЗапрещена = Истина; + Иначе + ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Рекомендуемая; + ОбщиеПараметры.РаботаВПрограммеЗапрещена = Ложь; + КонецЕсли; + КонецЕсли; + Возврат ОбщиеПараметры; КонецФункции +// Возвращает Истина, если эта информационная база подключена к 1С:Fresh. +// +// Возвращаемое значение: +// Булево - признак автономного рабочего места. +// +Функция ЭтоАвтономноеРабочееМесто() Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиПовтИсп = ОбщийМодуль("ОбменДаннымиПовтИсп"); + Возврат МодульОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто(); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + // Определяет, что эта информационная база является подчиненным узлом // распределенной информационной базы (РИБ) с фильтром. // // Возвращаемое значение: -// Булево +// Булево - Истина, если эта информационная база является подчиненным узлом РИБ с фильтром. // Функция ЭтоПодчиненныйУзелРИБСФильтром() Экспорт @@ -1934,7 +2096,7 @@ // распределенной информационной базы (РИБ). // // Возвращаемое значение: -// Булево +// Булево - Истина, если эта информационная база является подчиненным узлом РИБ. // Функция ЭтоПодчиненныйУзелРИБ() Экспорт @@ -1949,7 +2111,7 @@ // Параметры: // УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции. // -// Возвращаемое значение: +// Возвращаемое значение: // Истина - узел принадлежит плану обмена РИБ, иначе Ложь. // Функция ЭтоУзелРаспределеннойИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт @@ -1959,10 +2121,10 @@ КонецФункции // Возвращает Истина при необходимости обновления конфигурации информационной базы подчиненного узла РИБ. -// В главном узле всегда - Ложь. +// В главном узле всегда Ложь. // // Возвращаемое значение: -// Булево +// Булево - Истина, если требуется. // Функция ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ() Экспорт @@ -1989,7 +2151,7 @@ // окончания обновления ИБ, тогда требуется прекратить выполнение обработчика. // // Параметры: -// РегламентноеЗадание - ОбъектМетаданных: РегламентноеЗадание - регламентное задание, +// РегламентноеЗадание - ОбъектМетаданных.РегламентноеЗадание - регламентное задание, // из которого был вызван данный метод. Необходимо передавать для проверки доступности // по функциональным опциям. // @@ -1999,7 +2161,7 @@ Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений(); УстановитьПривилегированныйРежим(Ложь); - Если СтандартныеПодсистемыСервер.НеобходимоОбновлениеПараметровРаботыПрограммы() Тогда + Если РегистрыСведений.ПараметрыРаботыПрограммы.НеобходимоОбновление() Тогда ВызватьИсключение НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию. |Рекомендуется запрещать выполнение регламентных заданий на время обновления.'"); @@ -2007,7 +2169,7 @@ УстановитьПривилегированныйРежим(Истина); - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если Не РазделениеВключено() И ПланыОбмена.ГлавныйУзел() = Неопределено И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда @@ -2077,6 +2239,9 @@ // ВремяНачала - Дата - начальная точка интервала. // ВремяОкончания - Дата - конечная точка интервала, если не задана - берется текущая дата сеанса. // +// Возвращаемое значение: +// Строка - представление интервала времени. +// Функция ИнтервалВремениСтрокой(ВремяНачала, ВремяОкончания = Неопределено) Экспорт Если ВремяОкончания = Неопределено Тогда @@ -2119,10 +2284,19 @@ КонецФункции -// Возвращает адрес информационной базы для для пользователей, работающих в базе через Интернет. -// +// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ +// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию в сети Интернет. +// Например, если такой адрес включить в электронное письмо, то из письма за одно нажатие +// можно перейти к форме объекта в самой программе. +// // Возвращаемое значение: -// Строка - значение константы. +// Строка - адрес информационной базы, как он задан в настройке "Адрес в Интернете" в панели администрирования +// (хранится в константе АдресПубликацииИнформационнойБазыВИнтернете). +// Например, "http://1c.ru/database". +// +// Пример: +// АдресПубликацииИнформационнойБазыВЛокальнойСети() + "/" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта"; +// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта. // Функция АдресПубликацииИнформационнойБазыВИнтернете() Экспорт @@ -2132,10 +2306,19 @@ КонецФункции -// Возвращает адрес информационной базы для для пользователей, работающих в базе из локальной сети. -// +// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ +// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию локальной сети. +// Например, если такой адрес включить в электронное письмо, то из письма за одно нажатие +// можно перейти к форме объекта в самой программе. +// // Возвращаемое значение: -// Строка - значение константы. +// Строка - адрес информационной базы, как он задан в настройке "Локальный адрес" в панели администрирования +// (хранится в константе АдресПубликацииИнформационнойБазыВЛокальнойСети). +// Например, "http://localserver/base". +// +// Пример: +// АдресПубликацииИнформационнойБазыВЛокальнойСети() + "/" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта"; +// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта. // Функция АдресПубликацииИнформационнойБазыВЛокальнойСети() Экспорт @@ -2145,7 +2328,7 @@ КонецФункции -// Возвращает адрес входа в программу для указанного пользователя. +// Формирует ссылку для входа в программу для указанного пользователя. // // Параметры: // Пользователь - Строка - логин пользователя для входа в программу; @@ -2154,7 +2337,7 @@ // "ВИнтернете" или "ВЛокальнойСети". // // Возвращаемое значение: -// Строка, Неопределено. +// Строка, Неопределено - адрес входа в программу или Неопределено, если адрес не настроен. Функция АдресВходаВПрограмму(Пользователь, Пароль, ВидПубликацииИБ) Экспорт Результат = ""; @@ -2182,10 +2365,13 @@ КонецФункции -// Сохраняет персональные настройки пользователя. -// +// Сохраняет персональные настройки пользователя, относящиеся к подсистеме БазоваяФункциональность. +// Для получения настроек предусмотрены следующие функции: +// - ОбщегоНазначенияКлиент.ПредлагатьУстановкуРасширенияРаботыСФайлами(), +// - СтандартныеПодсистемыСервер.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы(). +// // Параметры: -// Структура со свойствами: +// Настройки - Структура - коллекция настроек: // * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - Признак необходимости // напоминания об установке расширения. // * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - Запрашивать подтверждение по завершении работы. @@ -2210,6 +2396,51 @@ КонецПроцедуры +// Возвращает признак работы в режиме разделения данных по областям +// (технически это признак условного разделения). +// +// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение включено. +// - Ложь, если разделение выключено или не поддерживается. +// +Функция РазделениеВключено() Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.РазделениеВключено(); + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей). +// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено +// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным. +// +// Возвращает Истина, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение не поддерживается, либо разделение выключено, +// либо разделение включено и разделители установлены. +// - Ложь, если разделение включено и разделители не установлены. +// +Функция ДоступноИспользованиеРазделенныхДанных() Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.ДоступноИспользованиеРазделенныхДанных(); + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с формами. @@ -2240,161 +2471,7 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с типами, объектами метаданных и их строковыми представлениями. -// Получает дерево метаданных конфигурации с заданным отбором по объектам метаданных. -// -// Параметры: -// Отбор - Структура - содержит значения элементов отбора. -// Если параметр задан, то будет получено дерево метаданных в соответствии с заданным отбором: -// Ключ - Строка - имя свойства элемента метаданных; -// Значение - Массив - множество значений для отбора. -// -// Пример инициализации переменной "Отбор": -// -// Массив = Новый Массив; -// Массив.Добавить("Константа.ИспользоватьСинхронизациюДанных"); -// Массив.Добавить("Справочник.Валюты"); -// Массив.Добавить("Справочник.Организации"); -// Отбор = Новый Структура; -// Отбор.Вставить("ПолноеИмя", Массив); -// -// Возвращаемое значение: -// ДеревоЗначений - дерево описания метаданных конфигурации. -// -Функция ДеревоМетаданныхКонфигурации(Отбор = Неопределено) Экспорт - - ИспользоватьОтбор = (Отбор <> Неопределено); - - КоллекцииОбъектовМетаданных = Новый ТаблицаЗначений; - КоллекцииОбъектовМетаданных.Колонки.Добавить("Имя"); - КоллекцииОбъектовМетаданных.Колонки.Добавить("Синоним"); - КоллекцииОбъектовМетаданных.Колонки.Добавить("Картинка"); - КоллекцииОбъектовМетаданных.Колонки.Добавить("КартинкаОбъекта"); - - НоваяСтрокаКоллекцииОбъектовМетаданных("Константы", НСтр("ru = 'Константы'"), БиблиотекаКартинок.Константа, БиблиотекаКартинок.Константа, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("Справочники", НСтр("ru = 'Справочники'"), БиблиотекаКартинок.Справочник, БиблиотекаКартинок.Справочник, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("Документы", НСтр("ru = 'Документы'"), БиблиотекаКартинок.Документ, БиблиотекаКартинок.ДокументОбъект, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыВидовХарактеристик", НСтр("ru = 'Планы видов характеристик'"), БиблиотекаКартинок.ПланВидовХарактеристик, БиблиотекаКартинок.ПланВидовХарактеристикОбъект, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыСчетов", НСтр("ru = 'Планы счетов'"), БиблиотекаКартинок.ПланСчетов, БиблиотекаКартинок.ПланСчетовОбъект, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("ПланыВидовРасчета", НСтр("ru = 'Планы видов расчета'"), БиблиотекаКартинок.ПланВидовРасчета, БиблиотекаКартинок.ПланВидовРасчетаОбъект, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыСведений", НСтр("ru = 'Регистры сведений'"), БиблиотекаКартинок.РегистрСведений, БиблиотекаКартинок.РегистрСведений, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыНакопления", НСтр("ru = 'Регистры накопления'"), БиблиотекаКартинок.РегистрНакопления, БиблиотекаКартинок.РегистрНакопления, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыБухгалтерии", НСтр("ru = 'Регистры бухгалтерии'"), БиблиотекаКартинок.РегистрБухгалтерии, БиблиотекаКартинок.РегистрБухгалтерии, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("РегистрыРасчета", НСтр("ru = 'Регистры расчета'"), БиблиотекаКартинок.РегистрРасчета, БиблиотекаКартинок.РегистрРасчета, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("БизнесПроцессы", НСтр("ru = 'Бизнес-процессы'"), БиблиотекаКартинок.БизнесПроцесс, БиблиотекаКартинок.БизнесПроцессОбъект, КоллекцииОбъектовМетаданных); - НоваяСтрокаКоллекцииОбъектовМетаданных("Задачи", НСтр("ru = 'Задачи'"), БиблиотекаКартинок.Задача, БиблиотекаКартинок.ЗадачаОбъект, КоллекцииОбъектовМетаданных); - - // Возвращаемое значение функции. - ДеревоМетаданных = Новый ДеревоЗначений; - ДеревоМетаданных.Колонки.Добавить("Имя"); - ДеревоМетаданных.Колонки.Добавить("ПолноеИмя"); - ДеревоМетаданных.Колонки.Добавить("Синоним"); - ДеревоМетаданных.Колонки.Добавить("Картинка"); - - Для Каждого СтрокаКоллекции Из КоллекцииОбъектовМетаданных Цикл - - СтрокаДерева = ДеревоМетаданных.Строки.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаКоллекции); - Для Каждого ОбъектМетаданных Из Метаданные[СтрокаКоллекции.Имя] Цикл - - Если ИспользоватьОтбор Тогда - - ОбъектПрошелФильтр = Истина; - Для Каждого ЭлементОтбора Из Отбор Цикл - - Значение = ?(ВРег(ЭлементОтбора.Ключ) = ВРег("ПолноеИмя"), ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных[ЭлементОтбора.Ключ]); - Если ЭлементОтбора.Значение.Найти(Значение) = Неопределено Тогда - ОбъектПрошелФильтр = Ложь; - Прервать; - КонецЕсли; - - КонецЦикла; - - Если Не ОбъектПрошелФильтр Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - - СтрокаДереваОМ = СтрокаДерева.Строки.Добавить(); - СтрокаДереваОМ.Имя = ОбъектМетаданных.Имя; - СтрокаДереваОМ.ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); - СтрокаДереваОМ.Синоним = ОбъектМетаданных.Синоним; - СтрокаДереваОМ.Картинка = СтрокаКоллекции.КартинкаОбъекта; - - КонецЦикла; - - КонецЦикла; - - // Удаляем строки без подчиненных элементов. - Если ИспользоватьОтбор Тогда - - // Используем обратный порядок обхода дерева значений. - КоличествоЭлементовКоллекции = ДеревоМетаданных.Строки.Количество(); - - Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл - - ТекущийИндекс = КоличествоЭлементовКоллекции - ОбратныйИндекс; - СтрокаДерева = ДеревоМетаданных.Строки[ТекущийИндекс]; - Если СтрокаДерева.Строки.Количество() = 0 Тогда - ДеревоМетаданных.Строки.Удалить(ТекущийИндекс); - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Возврат ДеревоМетаданных; - -КонецФункции - -// Получить представление физического места размещения информационной базы для отображения администратору. -// -// Возвращаемое значение: -// Строка - представление информационной базы. -// -// Пример возвращаемого результата: -// - для ИБ в файлом режиме: \\FileServer\1c_ib\ -// - для ИБ в серверном режиме: ServerName:1111 / information_base_name. -// -Функция ПолучитьПредставлениеИнформационнойБазы() Экспорт - - СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы(); - - Если ИнформационнаяБазаФайловая(СтрокаСоединенияСБД) Тогда - Возврат Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6); - КонецЕсли; - - // Прибавить к имени сервера имя пути информационной базы. - ПозицияПоиска = СтрНайти(ВРег(СтрокаСоединенияСБД), "SRVR="); - Если ПозицияПоиска <> 1 Тогда - Возврат Неопределено; - КонецЕсли; - - ПозицияТочкиСЗапятой = СтрНайти(СтрокаСоединенияСБД, ";"); - НачальнаяПозицияКопирования = 6 + 1; - КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; - - ИмяСервера = Сред(СтрокаСоединенияСБД, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); - - СтрокаСоединенияСБД = Сред(СтрокаСоединенияСБД, ПозицияТочкиСЗапятой + 1); - - // Позиция имени сервера - ПозицияПоиска = СтрНайти(ВРег(СтрокаСоединенияСБД), "REF="); - Если ПозицияПоиска <> 1 Тогда - Возврат Неопределено; - КонецЕсли; - - НачальнаяПозицияКопирования = 6; - ПозицияТочкиСЗапятой = СтрНайти(СтрокаСоединенияСБД, ";"); - КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; - - ИмяИБНаСервере = Сред(СтрокаСоединенияСБД, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); - ПутьКБД = ИмяСервера + "/ " + ИмяИБНаСервере; - Возврат ПутьКБД; - -КонецФункции - -// Возвращает строку реквизитов объекта метаданных с заданным типом. +// Возвращает имена реквизитов объекта заданного типа. // // Параметры: // Ссылка - ЛюбаяСсылка - ссылка на элемент базы данных, для которого требуется получить результат функции; @@ -2403,6 +2480,9 @@ // Возвращаемое значение: // Строка - строка реквизитов объекта метаданных конфигурации, разделенные символом ",". // +// Пример: +// РеквизитыОрганизации = ОбщегоНазначения.ИменаРеквизитовПоТипу(Документ.Ссылка, Тип("СправочникСсылка.Организации")); +// Функция ИменаРеквизитовПоТипу(Ссылка, Тип) Экспорт Результат = ""; @@ -2420,67 +2500,70 @@ // Возвращает имя базового типа по переданному значению объекта метаданных. // // Параметры: -// ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип. +// ОбъектМетаданных - ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип. // // Возвращаемое значение: // Строка - имя базового типа по переданному значению объекта метаданных. // +// Пример: +// ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Метаданные.Справочники.Номенклатура); = "Справочники". +// Функция ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) Экспорт Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаДокументы(); + Возврат "Документы"; ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаСправочники(); + Возврат "Справочники"; ИначеЕсли Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПеречисления(); + Возврат "Перечисления"; ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаРегистрыСведений(); + Возврат "РегистрыСведений"; ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаРегистрыНакопления(); + Возврат "РегистрыНакопления"; ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаРегистрыБухгалтерии(); + Возврат "РегистрыБухгалтерии"; ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаРегистрыРасчета(); + Возврат "РегистрыРасчета"; ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПланыОбмена(); + Возврат "ПланыОбмена"; ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПланыВидовХарактеристик(); + Возврат "ПланыВидовХарактеристик"; ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаБизнесПроцессы(); + Возврат "БизнесПроцессы"; ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаЗадачи(); + Возврат "Задачи"; ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПланыСчетов(); + Возврат "ПланыСчетов"; ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПланыВидовРасчета(); + Возврат "ПланыВидовРасчета"; ИначеЕсли Метаданные.Константы.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаКонстанты(); + Возврат "Константы"; ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаЖурналыДокументов(); + Возврат "ЖурналыДокументов"; ИначеЕсли Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаПоследовательности(); + Возврат "Последовательности"; ИначеЕсли Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных) Тогда - Возврат ИмяТипаРегламентныеЗадания(); + Возврат "РегламентныеЗадания"; ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель()) И ОбъектМетаданных.Родитель().Перерасчеты.Найти(ОбъектМетаданных.Имя) = ОбъектМетаданных Тогда - Возврат ИмяТипаПерерасчеты(); + Возврат "Перерасчеты"; Иначе @@ -2497,8 +2580,12 @@ // ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Справочник.Организации". // // Возвращаемое значение: -// СправочникМенеджер, ДокументМенеджер. +// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта. // +// Пример: +// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник.Организации"); +// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка(); +// Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) Экспорт Перем КлассОМ, ИмяОМ, Менеджер; @@ -2593,13 +2680,18 @@ // Возвращает менеджер объекта по ссылке на объект. // Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// См. так же МенеджерОбъектаПоПолномуИмени. // // Параметры: // Ссылка - ЛюбаяСсылка - объект, менеджер которого требуется получить. // // Возвращаемое значение: -// СправочникМенеджер, ДокументМенеджер. -// +// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта. +// +// Пример: +// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(СсылкаНаОрганизацию); +// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка(); +// Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт ИмяОбъекта = Ссылка.Метаданные().Имя; @@ -2637,14 +2729,13 @@ КонецФункции -// Создает и возвращает экземпляр объекта по полному имени объекта метаданных. -// Ограничение: поддерживаются только отчеты и обработки. +// Создает и возвращает экземпляр отчета или обработки по полному имени объекта метаданных. // // Параметры: -// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Отчет.БизнесПроцессы". +// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Отчет.БизнесПроцессы". // // Возвращаемое значение: -// ОтчетОбъект, ОбработкаОбъект. +// ОтчетОбъект, ОбработкаОбъект - экземпляр отчета или обработки. // Функция ОбъектПоПолномуИмени(ПолноеИмя) Экспорт МассивСтрок = СтрРазделить(ПолноеИмя, "."); @@ -2672,12 +2763,12 @@ // Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки. // // Параметры: -// ЛюбаяСсылка - значение любой ссылки информационной базы данных. +// ПроверяемаяСсылка - ЛюбаяСсылка - значение любой ссылки информационной базы данных. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если существует. // -Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт +Функция СсылкаСуществует(ПроверяемаяСсылка) Экспорт ТекстЗапроса = " |ВЫБРАТЬ @@ -2688,11 +2779,11 @@ | Ссылка = &Ссылка |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ПроверяемаяСсылка)); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); + Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка); УстановитьПривилегированныйРежим(Истина); @@ -2702,6 +2793,7 @@ // Возвращает имя вида объектов метаданных по ссылке на объект. // Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// См. так же ВидОбъектаПоТипу. // // Параметры: // Ссылка - ЛюбаяСсылка - объект, вид которого требуется получить. @@ -2717,59 +2809,57 @@ // Возвращает имя вида объектов метаданных по типу объекта. // Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// См. так же ВидОбъектаПоСсылке. // // Параметры: -// Тип - Тип - Тип прикладного объекта, определенный в конфигурации . +// ТипОбъекта - Тип - Тип прикладного объекта, определенный в конфигурации. // // Возвращаемое значение: // Строка - имя вида объектов метаданных. Например: "Справочник", "Документ". // -Функция ВидОбъектаПоТипу(Тип) Экспорт +Функция ВидОбъектаПоТипу(ТипОбъекта) Экспорт - Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Если Справочники.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "Справочник"; - ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "Документ"; - ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "БизнесПроцесс"; - ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "ПланВидовХарактеристик"; - ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "ПланСчетов"; - ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "ПланВидовРасчета"; - ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "Задача"; - ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "ПланОбмена"; - ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда Возврат "Перечисление"; Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Неверный тип значения параметра (%1)'"), Строка(Тип)); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Неверный тип значения параметра (%1)'"), Строка(ТипОбъекта)); КонецЕсли; -КонецФункции +КонецФункции // Возвращает полное имя объекта метаданных по переданному значению ссылки. -// Примеры: -// "Справочник.Номенклатура"; -// "Документ.ПриходнаяНакладная". // // Параметры: // Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ. // // Возвращаемое значение: -// Строка - полное имя объекта метаданных для указанного объекта. +// Строка - полное имя объекта метаданных для указанного объекта. Например: "Справочник.Номенклатура". // Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт @@ -2777,7 +2867,7 @@ КонецФункции -// Проверить, что значение имеет ссылочный тип данных. +// Проверяет, что переданное значение имеет ссылочный тип данных. // // Параметры: // Значение - Произвольный - проверяемое значение. @@ -2794,22 +2884,25 @@ // Проверка того, что переданный тип является ссылочным типом данных. // Для типа "Неопределено" возвращается Ложь. // -// Возвращаемое значение: -// Булево. +// Параметры: +// ПроверяемыйТип - Тип - для проверки на тип ссылка. // -Функция ЭтоСсылка(Тип) Экспорт +// Возвращаемое значение: +// Булево - Истина, если это ссылка. +// +Функция ЭтоСсылка(ПроверяемыйТип) Экспорт - Возврат Тип <> Тип("Неопределено") - И (Справочники.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) - ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип) - ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип)); + Возврат ПроверяемыйТип <> Тип("Неопределено") + И (Справочники.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ Документы.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(ПроверяемыйТип) + ИЛИ Задачи.ТипВсеСсылки().СодержитТип(ПроверяемыйТип) + ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(ПроверяемыйТип)); КонецФункции @@ -2819,7 +2912,7 @@ // Объект - ЛюбаяСсылка, Объект - проверяемый объект. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если является. // Функция ОбъектЯвляетсяГруппой(Объект) Экспорт @@ -2855,43 +2948,41 @@ КонецФункции -// Возвращает ссылку, соответствующую объекту метаданных, для -// использования в базе данных. -// Например: -// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Ссылка)); -// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); -// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Организации"); +// Возвращает ссылку, соответствующую объекту метаданных, для использования в базе данных. +// См. также ОбщегоНазначения.ИдентификаторыОбъектаМетаданных. // -// Поддерживаемые объекты метаданных: +// Поддерживаются следующие объекты метаданных. // - Подсистемы (требуется программировать переименование). // - Роли (требуется программировать переименование). -// - ПланыОбмена -// - Константы -// - Справочники -// - Документы -// - ЖурналыДокументов -// - Отчеты -// - Обработки -// - ПланыВидовХарактеристик -// - ПланыСчетов -// - ПланыВидовРасчета -// - РегистрыСведений -// - РегистрыНакопления -// - РегистрыБухгалтерии -// - РегистрыРасчета -// - БизнесПроцессы +// - ПланыОбмена. +// - Константы. +// - Справочники. +// - Документы. +// - ЖурналыДокументов. +// - Отчеты. +// - Обработки. +// - ПланыВидовХарактеристик. +// - ПланыСчетов. +// - ПланыВидовРасчета. +// - РегистрыСведений. +// - РегистрыНакопления. +// - РегистрыБухгалтерии. +// - РегистрыРасчета. +// - БизнесПроцессы. // - Задачи. // -// Подробнее см. в функции СвойстваКоллекцийОбъектовМетаданных() -// модуля менеджера справочника ИдентификаторыОбъектовМетаданных. -// // Параметры: // ОписаниеОбъектаМетаданных - ОбъектМетаданных - объект метаданных конфигурации; // - Тип - тип, который можно успешно использовать в функции Метаданные.НайтиПоТипу(); // - Строка - полное имя объекта метаданных, которое можно успешно использовать // в функции Метаданные.НайтиПоПолномуИмени(). // Возвращаемое значение: -// СправочникСсылка.ИдентификаторыОбъектовМетаданных, СправочникСсылка.ИдентификаторыОбъектовРасширений. +// СправочникСсылка.ИдентификаторыОбъектовМетаданных, СправочникСсылка.ИдентификаторыОбъектовРасширений - ссылка. +// +// Пример: +// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Ссылка)); +// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); +// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Организации"); // Функция ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных) Экспорт @@ -2899,6 +2990,51 @@ КонецФункции +// Возвращает ссылки, соответствующие объектам метаданных, для использования в базе данных. +// См. также ОбщегоНазначения.ИдентификаторОбъектаМетаданных. +// +// Поддерживаются следующие объекты метаданных. +// - Подсистемы (требуется программировать переименование). +// - Роли (требуется программировать переименование). +// - ПланыОбмена. +// - Константы. +// - Справочники. +// - Документы. +// - ЖурналыДокументов. +// - Отчеты. +// - Обработки. +// - ПланыВидовХарактеристик. +// - ПланыСчетов. +// - ПланыВидовРасчета. +// - РегистрыСведений. +// - РегистрыНакопления. +// - РегистрыБухгалтерии. +// - РегистрыРасчета. +// - БизнесПроцессы. +// - Задачи. +// +// Параметры: +// ПолныеИменаОбъектовМетаданных - Массив - со значениями: +// * Строка - полное имя объекта метаданных, которое можно успешно использовать +// в функции Метаданные.НайтиПоПолномуИмени(). +// +// Возвращаемое значение: +// Соответствие - со свойствами: +// * Ключ - Строка - полное имя указанного объекта метаданных. +// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// СправочникСсылка.ИдентификаторыОбъектовРасширений - найденный идентификатор. +// Пример: +// ПолныеИмена = Новый Массив; +// ПолныеИмена.Добавить(Метаданные.Справочники.Валюты.ПолноеИмя()); +// ПолныеИмена.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя()); +// Идентификаторы = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИмена); +// +Функция ИдентификаторыОбъектовМетаданных(ПолныеИменаОбъектовМетаданных) Экспорт + + Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторыОбъектовМетаданных(ПолныеИменаОбъектовМетаданных); + +КонецФункции + // Возвращает объект метаданных по переданному идентификатору. // // Параметры: @@ -2907,11 +3043,7 @@ // объекта метаданных конфигурации или расширения. // // Возвращаемое значение: -// ОбъектМетаданных - для типа СправочникСсылка.ИдентификаторыОбъектовМетаданных. -// ОбъектМетаданных, Неопределено - для типа СправочникСсылка.ИдентификаторыОбъектовРасширений. -// Если расширение не подключено, тогда объект метаданных невозможно вернуть и возвращается Неопределено. -// Неопределено означает, что в справочнике ИдентификаторыОбъектовРасширений найден действующий -// идентификатор, но объекта метаданных, который ему соответствует, найти не удалось. +// ОбъектМетаданных - объект метаданных, соответствующий идентификатору. // Функция ОбъектМетаданныхПоИдентификатору(Идентификатор) Экспорт @@ -2919,34 +3051,27 @@ КонецФункции -// Возвращает Истина, если объект метаданных, которому соответствует -// идентификатор объектов расширений существует в справочнике и -// не помечен на удаление, но отсутствует в кэше метаданных расширений. -// -// Параметры: -// Идентификатор - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор -// объекта метаданных расширения. -// -// Возвращаемое значение: -// Булево. -// -Функция ОбъектРасширенияОтключен(Идентификатор) Экспорт - - Возврат Справочники.ИдентификаторыОбъектовРасширений.ОбъектРасширенияОтключен(Идентификатор); - -КонецФункции - -// Для использования в процедуре ПриДобавленииПереименованийОбъектовМетаданных -// общего модуля ОбщегоНазначенияПереопределяемый для описания переименований объектов метаданных. +// Добавляет описание переименования объекта метаданных при переходе на указанную версию конфигурации. +// Добавление выполняется в структуру Итог, которая передается в +// процедуру ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. // // Параметры: -// Итог - Структура - передается в процедуру подсистемой БазоваяФункциональность. -// ВерсияИБ - Строка - версия при переходе на которую нужно выполнить переименование. -// СтароеПолноеИмя - Строка - старое полное имя объекта метаданных, которое нужно переименовать. -// НовоеПолноеИмя - Строка - новое полное имя объекта метаданных, на которое нужно переименовать. +// Итог - Структура - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +// ВерсияИБ - Строка - версия конечной конфигурации, при переходе на которую нужно +// выполнить переименование, например, "2.1.2.14". +// СтароеПолноеИмя - Строка - старое полное имя объекта метаданных, которое нужно переименовать, +// например, "Подсистема._ДемоПодсистемы". +// НовоеПолноеИмя - Строка - новое полное имя объекта метаданных, на которое нужно переименовать, +// например, "Подсистема._ДемоСервисныеПодсистемы". // ИдентификаторБиблиотеки - Строка - внутренний идентификатор библиотеки, к которой относится ВерсияИБ. // Для основной конфигурации не требуется. -// +// Например, "СтандартныеПодсистемы" - как указано +// в ОбновлениеИнформационнойБазыБСП.ПриДобавленииПодсистемы. +// Пример: +// ОбщегоНазначения.ДобавитьПереименование(Итог, "2.1.2.14", +// "Подсистема._ДемоПодсистемы", +// "Подсистема._ДемоСервисныеПодсистемы"); +// Процедура ДобавитьПереименование(Итог, ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки = "") Экспорт Справочники.ИдентификаторыОбъектовМетаданных.ДобавитьПереименование(Итог, @@ -2958,8 +3083,11 @@ // Для ссылочных типов возвращает в формате "СправочникСсылка.ИмяОбъекта" или "ДокументСсылка.ИмяОбъекта". // Для остальных типов приводит тип к строке, например "Число". // +// Параметры: +// Тип - Тип - для которого надо получить представление. +// // Возвращаемое значение: -// Строка. +// Строка - представление типа. // Функция СтроковоеПредставлениеТипа(Тип) Экспорт @@ -3019,7 +3147,12 @@ // ТипЗначения - Тип - проверяемый тип. // // Возвращаемое значение: -// Булево - Истина, если совпадает. +// Булево - Истина, если совпадает. +// +// Пример: +// Если ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево") Тогда +// // Выводим поле в виде флажка. +// КонецЕсли; // Функция ОписаниеТипаСостоитИзТипа(ОписаниеТипа, ТипЗначения) Экспорт @@ -3032,26 +3165,6 @@ КонецФункции -// Проверяет наличие табличной части у справочника. -// -// Параметры: -// ИмяСправочника - Строка - имя справочника, для которого осуществляется проверка. -// ИмяТабличнойЧасти - Строка - имя табличной части, наличие которой проверяется. -// -// Возвращаемое значение: -// Булево - Истина, если табличная часть есть. -// -// Пример: -// Если НЕ ОбщегоНазначения.НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация") Тогда -// Возврат; -// КонецЕсли; -// -Функция НаличиеТабличнойЧастиУСправочника(ИмяСправочника, ИмяТабличнойЧасти) Экспорт - - Возврат (Метаданные.Справочники[ИмяСправочника].ТабличныеЧасти.Найти(ИмяТабличнойЧасти) <> Неопределено); - -КонецФункции - // Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов. // // Параметры: @@ -3074,7 +3187,7 @@ КонецФункции -// Получает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданного. +// Возвращает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданного. // Получает значения свойств стандартных реквизитов и пользовательских реквизитов (созданных в режиме конфигуратора). // // Параметры: @@ -3086,7 +3199,7 @@ // Возвращаемое значение: // ТаблицаЗначений - описание требуемых свойств всех реквизитов объекта метаданных. // -Функция ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт +Функция ОписаниеСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт МассивСвойств = СтрРазделить(Свойства, ","); @@ -3112,75 +3225,14 @@ КонецФункции -// Возвращает состояние использования элемента состава общего реквизита. +// Создает объект ОписаниеТипов, содержащий тип Строка. // // Параметры: -// ЭлементСостава - ОбъектМетаданных - элемент состава общего реквизита, использование которого требуется -// проверить. -// МетаданныеОбщегоРеквизита - ОбъектМетаданных - объект метаданных общего реквизита, которому принадлежит -// ЭлементСостава. +// ДлинаСтроки - Число - длина строки. // // Возвращаемое значение: -// Булево - Истина, если элемент состава используется, иначе Ложь. +// ОписаниеТипов - описание типа Строка. // -Функция ЭлементСоставаОбщегоРеквизитаИспользуется(Знач ЭлементСостава, Знач МетаданныеОбщегоРеквизита) Экспорт - - Если ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать Тогда - Возврат Истина; - ИначеЕсли ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.НеИспользовать Тогда - Возврат Ложь; - Иначе - Возврат МетаданныеОбщегоРеквизита.АвтоИспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать; - КонецЕсли; - -КонецФункции - -// Возвращает признак того, что объект метаданных используется в общих реквизитах-разделителях. -// -// Параметры: -// ОбъектМетаданных - Строка, ОбъектМетаданных - Если объект метаданных задан строкой, происходит обращение к модулю -// повторного использования. -// Разделитель - Строка - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. -// -// Возвращаемое значение: -// Булево - Истина, если объект метаданных используется хотя бы в одном общем разделителе. -// -Функция ЭтоРазделенныйОбъектМетаданных(Знач ОбъектМетаданных, Знач Разделитель) Экспорт - - Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда - ПолноеИмяОбъектаМетаданных = ОбъектМетаданных; - Иначе - ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; - - РазделенныеОбъектыМетаданных = ОбщегоНазначенияПовтИсп.РазделенныеОбъектыМетаданных(Разделитель); - Возврат РазделенныеОбъектыМетаданных.Получить(ПолноеИмяОбъектаМетаданных) <> Неопределено; - -КонецФункции - -// Возвращает имя предопределенного элемента по указанной ссылке. -// Для использования вместо устаревшего метода ПолучитьИмяПредопределенного в -// конфигурациях, рассчитанных на платформу версии 8.2. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - ссылка на предопределенный элемент. -// -// Возвращаемое значение: -// Строка - имя предопределенного элемента. -// -Функция ИмяПредопределенного(Знач Ссылка) Экспорт - - Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ИмяПредопределенныхДанных"); - -КонецФункции - -// Конструктор объекта ОписаниеТипов, содержащего тип Строка. -// -// Параметры: -// ДлинаСтроки - Число. -// -// ВозвращаемоеЗначение: -// ОписаниеТипов. Функция ОписаниеТипаСтрока(ДлинаСтроки) Экспорт Массив = Новый Массив; @@ -3192,7 +3244,7 @@ КонецФункции -// Конструктор объекта ОписаниеТипов, содержащего тип Число. +// Создает объект ОписаниеТипов, содержащий тип Число. // // Параметры: // Разрядность - Число - общее количество разрядов числа (количество разрядов @@ -3200,8 +3252,8 @@ // РазрядностьДробнойЧасти - Число - число разрядов дробной части. // ЗнакЧисла - ДопустимыйЗнак - допустимый знак числа. // -// ВозвращаемоеЗначение: -// ОписаниеТипов. +// Возвращаемое значение: +// ОписаниеТипов - описание типа Число. Функция ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено) Экспорт Если ЗнакЧисла = Неопределено Тогда @@ -3214,13 +3266,13 @@ КонецФункции -// Конструктор объекта ОписаниеТипов, содержащего тип Дата. +// Создает объект ОписаниеТипов, содержащий тип Дата. // // Параметры: // ЧастиДаты - ЧастиДаты - набор вариантов использования значений типа Дата. // -// ВозвращаемоеЗначение: -// ОписаниеТипов. +// Возвращаемое значение: +// ОписаниеТипов - описание типа Дата. Функция ОписаниеТипаДата(ЧастиДаты) Экспорт Массив = Новый Массив; @@ -3239,7 +3291,7 @@ // МетаданныеОбъекта - ОбъектМетаданных - объект, в котором требуется проверить наличие реквизита. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если есть. // Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт @@ -3255,10 +3307,10 @@ // Определяет принадлежность объекта метаданных к общему типу "Документ". // // Параметры: -// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. +// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к документам. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является документом. // Функция ЭтоДокумент(ОбъектМетаданных) Экспорт @@ -3271,8 +3323,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является справочником. // Функция ЭтоСправочник(ОбъектМетаданных) Экспорт @@ -3285,8 +3337,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является перечислением. // Функция ЭтоПеречисление(ОбъектМетаданных) Экспорт @@ -3299,8 +3351,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является планом обмена. // Функция ЭтоПланОбмена(ОбъектМетаданных) Экспорт @@ -3313,8 +3365,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является планом видов характеристик. // Функция ЭтоПланВидовХарактеристик(ОбъектМетаданных) Экспорт @@ -3327,8 +3379,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является бизнес-процессом. // Функция ЭтоБизнесПроцесс(ОбъектМетаданных) Экспорт @@ -3341,8 +3393,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является задачей. // Функция ЭтоЗадача(ОбъектМетаданных) Экспорт @@ -3355,8 +3407,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является планом счетов. // Функция ЭтоПланСчетов(ОбъектМетаданных) Экспорт @@ -3369,8 +3421,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является планом видов расчета. // Функция ЭтоПланВидовРасчета(ОбъектМетаданных) Экспорт @@ -3385,8 +3437,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является регистром сведений. // Функция ЭтоРегистрСведений(ОбъектМетаданных) Экспорт @@ -3399,8 +3451,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является регистром накопления. // Функция ЭтоРегистрНакопления(ОбъектМетаданных) Экспорт @@ -3413,8 +3465,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является регистром бухгалтерии. // Функция ЭтоРегистрБухгалтерии(ОбъектМетаданных) Экспорт @@ -3427,8 +3479,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является регистром расчета. // Функция ЭтоРегистрРасчета(ОбъектМетаданных) Экспорт @@ -3443,8 +3495,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является константой. // Функция ЭтоКонстанта(ОбъектМетаданных) Экспорт @@ -3459,8 +3511,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является журналом документов. // Функция ЭтоЖурналДокументов(ОбъектМетаданных) Экспорт @@ -3475,8 +3527,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является последовательностью. // Функция ЭтоПоследовательность(ОбъектМетаданных) Экспорт @@ -3491,8 +3543,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является регламентным заданием. // Функция ЭтоРегламентноеЗадание(ОбъектМетаданных) Экспорт @@ -3507,8 +3559,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект является каким-либо регистром. // Функция ЭтоРегистр(ОбъектМетаданных) Экспорт @@ -3524,8 +3576,8 @@ // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу. // -// Возвращаемое значение: -// Булево. +// Возвращаемое значение: +// Булево - Истина, если объект ссылочного типа. // Функция ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) Экспорт @@ -3547,285 +3599,98 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Имена типов. - -// Возвращает значение для идентификации общего типа "Регистры сведений". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаРегистрыСведений() Экспорт - - Возврат "РегистрыСведений"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Регистры накопления". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаРегистрыНакопления() Экспорт - - Возврат "РегистрыНакопления"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Регистры бухгалтерии". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаРегистрыБухгалтерии() Экспорт - - Возврат "РегистрыБухгалтерии"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Регистры расчета". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаРегистрыРасчета() Экспорт - - Возврат "РегистрыРасчета"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Документы". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаДокументы() Экспорт - - Возврат "Документы"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Справочники". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаСправочники() Экспорт - - Возврат "Справочники"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Перечисления". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПеречисления() Экспорт - - Возврат "Перечисления"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Отчеты". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаОтчеты() Экспорт - - Возврат "Отчеты"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Обработки". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаОбработки() Экспорт - - Возврат "Обработки"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "ПланыОбмена". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПланыОбмена() Экспорт - - Возврат "ПланыОбмена"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Планы видов характеристик". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПланыВидовХарактеристик() Экспорт - - Возврат "ПланыВидовХарактеристик"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Бизнес-процессы". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаБизнесПроцессы() Экспорт - - Возврат "БизнесПроцессы"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Задачи". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаЗадачи() Экспорт - - Возврат "Задачи"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Планы счетов". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПланыСчетов() Экспорт - - Возврат "ПланыСчетов"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Планы видов расчета". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПланыВидовРасчета() Экспорт - - Возврат "ПланыВидовРасчета"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Константы". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаКонстанты() Экспорт - - Возврат "Константы"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Журналы документов". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаЖурналыДокументов() Экспорт - - Возврат "ЖурналыДокументов"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Последовательности". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПоследовательности() Экспорт - - Возврат "Последовательности"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "РегламентныеЗадания". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаРегламентныеЗадания() Экспорт - - Возврат "РегламентныеЗадания"; - -КонецФункции - -// Возвращает значение для идентификации общего типа "Перерасчеты". -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяТипаПерерасчеты() Экспорт - - Возврат "Перерасчеты"; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Сохранение, чтение и удаление настроек из хранилищ. -// Сохраняет настройку в хранилище общих настроек. +// Сохраняет настройку в хранилище общих настроек, как метод платформы Сохранить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// Значение - Произвольный - Настройки, которые нужно сохранить в хранилище. -// ОписаниеНастроек - ОписаниеНастроек - Вспомогательная информация о настройке. -// ИмяПользователя - Строка - Имя пользователя, настройки которого сохраняются. -// Если не указано, то сохраняются настройки текущего пользователя. -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - Сбросить кэши модулей ПовтИсп. +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// Настройки - Произвольный - см. синтакс-помощник платформы. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. +// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы. // -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Сохранить" в синтакс-помощнике. -// -Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Значение, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, - НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт - ХранилищеСохранить( - ХранилищеОбщихНастроек, + ХранилищеСохранить(ХранилищеОбщихНастроек, КлючОбъекта, КлючНастроек, - Значение, + Настройки, ОписаниеНастроек, ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); + ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Загружает настройку из хранилища общих настроек. +// Сохраняет несколько настроек в хранилище общих настроек, как метод платформы Сохранить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки. +// +// Параметры: +// НесколькоНастроек - Массив - со значениями: +// * Значение - Структура - со свойствами: +// * Объект - Строка - см. параметр КлючОбъекта в синтакс-помощнике платформы. +// * Настройка - Строка - см. параметр КлючНастроек в синтакс-помощнике платформы. +// * Значение - Произвольный - см. параметр Настройки в синтакс-помощнике платформы. +// +// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы. +// +Процедура ХранилищеОбщихНастроекСохранитьМассив(НесколькоНастроек, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт + + Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Возврат; + КонецЕсли; + + Для Каждого Элемент Из НесколькоНастроек Цикл + ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение); + КонецЦикла; + + Если ОбновитьПовторноИспользуемыеЗначения Тогда + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; + +КонецПроцедуры + +// Загружает настройку из хранилища общих настроек, как метод платформы Загрузить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Кроме того, возвращает указанное значение по умолчанию, если настройки не найдены. +// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки. +// +// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно +// - возвращаемая ссылка заменяется на указанное значение по умолчанию; +// - из данных типа Массив ссылки удаляются; +// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено; +// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// ЗначениеПоУмолчанию - Произвольный - Необязательный. -// Значение, которое необходимо подставить если настройки не были загружены. -// ОписаниеНастроек - ОписаниеНастроек - Необязательный. При чтении значения настройки в данный параметр -// записывается вспомогательная информация о настройке. -// ИмяПользователя - Строка - Необязательный. Имя пользователя, настройки которого загружаются. -// Если не указано, то загружается настройки текущего пользователя. +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не найдены. +// Если не указано, возвращается значение Неопределено. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. // // Возвращаемое значение: -// Произвольный - Настройки, загруженные из хранилища. -// Неопределено - Если настройки не найдены и параметр ЗначениеПоУмолчанию не указан. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Загрузить" в синтакс-помощнике. +// Произвольный - см. синтакс-помощник платформы. // Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт + ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт - Возврат ХранилищеЗагрузить( - ХранилищеОбщихНастроек, + Возврат ХранилищеЗагрузить(ХранилищеОбщихНастроек, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию, @@ -3834,417 +3699,193 @@ КонецФункции -// Удаляет настройку из хранилища общих настроек. +// Удаляет настройку из хранилища общих настроек, как метод платформы Удалить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// - Неопределено - Удаляются настройки для всех объектов. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// - Неопределено - Удаляются настройки со всеми ключами. -// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. -// - Неопределено - Удаляются настройки всех пользователей. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Удалить" в синтакс-помощнике. +// КлючОбъекта - Строка, Неопределено - см. синтакс-помощник платформы. +// КлючНастроек - Строка, Неопределено - см. синтакс-помощник платформы. +// ИмяПользователя - Строка, Неопределено - см. синтакс-помощник платформы. // Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт - ХранилищеУдалить( - ХранилищеОбщихНастроек, + ХранилищеУдалить(ХранилищеОбщихНастроек, КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры -// Сохраняет массив пользовательских настроек МассивСтруктур. -// Может применяться для случаев вызова с клиента. -// -// Параметры: -// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение". -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - требуется обновить повторно используемые значения. +// Сохраняет настройку в хранилище системных настроек, как метод платформы Сохранить +// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек +// более 128 символов путем хеширования части, которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки. // -Процедура ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, - НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +// Параметры: +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// Настройки - Произвольный - см. синтакс-помощник платформы. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. +// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы. +// +Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт - Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - Возврат; - КонецЕсли; - - Для Каждого Элемент Из МассивСтруктур Цикл - ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение); - КонецЦикла; - - Если НужноОбновитьПовторноИспользуемыеЗначения Тогда - ОбновитьПовторноИспользуемыеЗначения(); - КонецЕсли; + ХранилищеСохранить(ХранилищеСистемныхНастроек, + КлючОбъекта, + КлючНастроек, + Настройки, + ОписаниеНастроек, + ИмяПользователя, + ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Сохраняет массив пользовательских настроек МассивСтруктур и обновляет повторно -// используемые значения. Может применяться для случаев вызова с клиента. -// -// Параметры: -// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение". +// Загружает настройку из хранилища системных настроек, как метод платформы Загрузить, +// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек +// более 128 символов путем хеширования части, которая превышает 96 символов. +// Кроме того, возвращает указанное значение по умолчанию, если настройки не найдены. +// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки. // -Процедура ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур) Экспорт - - ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); - -КонецПроцедуры - -// Сохраняет настройку в хранилище общих настроек и обновляет повторно используемые -// значения. -// -// Параметры: -// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить, -// подробнее - см. параметры процедуры ХранилищеСохранить(). -// -Процедура ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение) Экспорт - - ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Значение,,,Истина); - -КонецПроцедуры - -// Сохраняет настройку в хранилище системных настроек. +// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно +// - возвращаемая ссылка заменяется на указанное значение по умолчанию; +// - из данных типа Массив ссылки удаляются; +// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено; +// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// Значение - Произвольный - Настройки, которые нужно сохранить в хранилище. -// ОписаниеНастроек - ОписаниеНастроек - Вспомогательная информация о настройке. -// ИмяПользователя - Строка - Имя пользователя, настройки которого сохраняются. -// Если не указано, то сохраняются настройки текущего пользователя. -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - Сбросить кэши модулей ПовтИсп. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Сохранить" в синтакс-помощнике. -// -Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Значение, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, - НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт - - ХранилищеСохранить( - ХранилищеСистемныхНастроек, - КлючОбъекта, - КлючНастроек, - Значение, - ОписаниеНастроек, - ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); - -КонецПроцедуры - -// Загружает настройку из хранилища системных настроек. -// -// Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// ЗначениеПоУмолчанию - Произвольный - Необязательный. -// Значение, которое необходимо подставить если настройки не были загружены. -// ОписаниеНастроек - ОписаниеНастроек - Необязательный. При чтении значения настройки в данный параметр -// записывается вспомогательная информация о настройке. -// ИмяПользователя - Строка - Необязательный. Имя пользователя, настройки которого загружаются. -// Если не указано, то загружается настройки текущего пользователя. +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не найдены. +// Если не указано, возвращается значение Неопределено. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. // // Возвращаемое значение: -// Произвольный - Настройки, загруженные из хранилища. -// Неопределено - Если настройки не найдены и параметр ЗначениеПоУмолчанию не указан. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Загрузить" в синтакс-помощнике. +// Произвольный - см. синтакс-помощник платформы. // Функция ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт + ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт - Возврат ХранилищеЗагрузить( - ХранилищеСистемныхНастроек, - КлючОбъекта, - КлючНастроек, - ЗначениеПоУмолчанию, - ОписаниеНастроек, + Возврат ХранилищеЗагрузить(ХранилищеСистемныхНастроек, + КлючОбъекта, + КлючНастроек, + ЗначениеПоУмолчанию, + ОписаниеНастроек, ИмяПользователя); КонецФункции -// Удаляет настройку из хранилища системных настроек. +// Удаляет настройку из хранилища системных настроек, как метод платформы Удалить, +// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек +// более 128 символов путем хеширования части, которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// - Неопределено - Удаляются настройки для всех объектов. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// - Неопределено - Удаляются настройки со всеми ключами. -// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. -// - Неопределено - Удаляются настройки всех пользователей. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Удалить" в синтакс-помощнике. +// КлючОбъекта - Строка, Неопределено - см. синтакс-помощник платформы. +// КлючНастроек - Строка, Неопределено - см. синтакс-помощник платформы. +// ИмяПользователя - Строка, Неопределено - см. синтакс-помощник платформы. // Процедура ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт - ХранилищеУдалить( - ХранилищеСистемныхНастроек, + ХранилищеУдалить(ХранилищеСистемныхНастроек, КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры -// Сохраняет настройку в хранилище настроек данных форм. +// Сохраняет настройку в хранилище настроек данных форм, как метод платформы Сохранить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// Значение - Произвольный - Настройки, которые нужно сохранить в хранилище. -// ОписаниеНастроек - ОписаниеНастроек - Вспомогательная информация о настройке. -// ИмяПользователя - Строка - Имя пользователя, настройки которого сохраняются. -// Если не указано, то сохраняются настройки текущего пользователя. -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - Сбросить кэши модулей ПовтИсп. +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// Настройки - Произвольный - см. синтакс-помощник платформы. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. +// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы. // -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Сохранить" в синтакс-помощнике. -// -Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Значение, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, - НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт - ХранилищеСохранить( - ХранилищеНастроекДанныхФорм, - КлючОбъекта, - КлючНастроек, - Значение, - ОписаниеНастроек, - ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); + ХранилищеСохранить(ХранилищеНастроекДанныхФорм, + КлючОбъекта, + КлючНастроек, + Настройки, + ОписаниеНастроек, + ИмяПользователя, + ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Загружает настройку из хранилища настроек данных форм. +// Загружает настройку из хранилища настроек данных форм, как метод платформы Загрузить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Кроме того, возвращает указанное значение по умолчанию, если настройки не найдены. +// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки. +// +// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно +// - возвращаемая ссылка заменяется на указанное значение по умолчанию; +// - из данных типа Массив ссылки удаляются; +// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено; +// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// ЗначениеПоУмолчанию - Произвольный - Необязательный. -// Значение, которое необходимо подставить если настройки не были загружены. -// ОписаниеНастроек - ОписаниеНастроек - Необязательный. При чтении значения настройки в данный параметр -// записывается вспомогательная информация о настройке. -// ИмяПользователя - Строка - Необязательный. Имя пользователя, настройки которого загружаются. -// Если не указано, то загружается настройки текущего пользователя. +// КлючОбъекта - Строка - см. синтакс-помощник платформы. +// КлючНастроек - Строка - см. синтакс-помощник платформы. +// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не найдены. +// Если не указано, возвращается значение Неопределено. +// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы. +// ИмяПользователя - Строка - см. синтакс-помощник платформы. // // Возвращаемое значение: -// Произвольный - Настройки, загруженные из хранилища. -// Неопределено - Если настройки не найдены и параметр ЗначениеПоУмолчанию не указан. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Загрузить" в синтакс-помощнике. +// Произвольный - см. синтакс-помощник платформы. // Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт + ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт - Возврат ХранилищеЗагрузить( - ХранилищеНастроекДанныхФорм, - КлючОбъекта, - КлючНастроек, - ЗначениеПоУмолчанию, + Возврат ХранилищеЗагрузить(ХранилищеНастроекДанныхФорм, + КлючОбъекта, + КлючНастроек, + ЗначениеПоУмолчанию, ОписаниеНастроек, ИмяПользователя); КонецФункции -// Удаляет настройку из хранилища настроек данных форм. +// Удаляет настройку из хранилища настроек данных форм, как метод платформы Удалить, +// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>, +// но с поддержкой длины ключа настроек более 128 символов путем хеширования части, +// которая превышает 96 символов. +// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки. // // Параметры: -// КлючОбъекта - Строка - Ключ объекта настройки. -// - Неопределено - Удаляются настройки для всех объектов. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// - Неопределено - Удаляются настройки со всеми ключами. -// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. -// - Неопределено - Удаляются настройки всех пользователей. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Удалить" в синтакс-помощнике. +// КлючОбъекта - Строка, Неопределено - см. синтакс-помощник платформы. +// КлючНастроек - Строка, Неопределено - см. синтакс-помощник платформы. +// ИмяПользователя - Строка, Неопределено - см. синтакс-помощник платформы. // Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт - ХранилищеУдалить( - ХранилищеНастроекДанныхФорм, + ХранилищеУдалить(ХранилищеНастроекДанныхФорм, КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры -// Сохраняет настройку в хранилище настроек через его менеджер. -// -// Параметры: -// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, в котором сохраняется настройка. -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// Значение - Произвольный - Настройки, которые нужно сохранить в хранилище. -// ОписаниеНастроек - ОписаниеНастроек - Вспомогательная информация о настройке. -// ИмяПользователя - Строка - Имя пользователя, настройки которого сохраняются. -// Если не указано, то сохраняются настройки текущего пользователя. -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - Сбросить кэши модулей ПовтИсп. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Сохранить" в синтакс-помощнике. -// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. -// -Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Значение, - ОписаниеНастроек, ИмяПользователя, НужноОбновитьПовторноИспользуемыеЗначения) - - Если НЕ ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - Возврат; - КонецЕсли; - - МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Значение, ОписаниеНастроек, ИмяПользователя); - - Если НужноОбновитьПовторноИспользуемыеЗначения Тогда - ОбновитьПовторноИспользуемыеЗначения(); - КонецЕсли; - -КонецПроцедуры - -// Загружает настройку из хранилища настроек через его менеджер. -// -// Параметры: -// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, из которого загружается настройка. -// КлючОбъекта - Строка - Ключ объекта настройки. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// ЗначениеПоУмолчанию - Произвольный - Необязательный. -// Значение, которое необходимо подставить если настройки не были загружены. -// ОписаниеНастроек - ОписаниеНастроек - Необязательный. При чтении значения настройки в данный параметр -// записывается вспомогательная информация о настройке. -// ИмяПользователя - Строка - Необязательный. Имя пользователя, настройки которого загружаются. -// Если не указано, то загружается настройки текущего пользователя. -// -// Возвращаемое значение: -// Произвольный - Настройки, загруженные из хранилища. -// Неопределено - Если настройки не найдены и параметр ЗначениеПоУмолчанию не указан. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Загрузить" в синтакс-помощнике. -// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. -// -Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию, - ОписаниеНастроек, ИмяПользователя) - - Результат = Неопределено; - - Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек), ОписаниеНастроек, ИмяПользователя); - КонецЕсли; - - Если Результат = Неопределено Тогда - Результат = ЗначениеПоУмолчанию; - Иначе - УстановитьПривилегированныйРежим(Истина); - Если УдалитьБитыеСсылки(Результат) Тогда - Результат = ЗначениеПоУмолчанию; - КонецЕсли; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Удаляет битые ссылки из переменной. -// -// Параметры: -// СсылкаИлиКоллекция - ЛюбаяСсылка, Произвольный - Проверяемый объект или очищаемая коллекция. -// -// Возвращаемое значение: -// Булево - -// * Истина - СсылкаИлиКоллекция ссылочного типа и объект не найден в базе данных. -// * Ложь - Когда СсылкаИлиКоллекция не ссылочного типа или объект найден в базе данных. -// -Функция УдалитьБитыеСсылки(СсылкаИлиКоллекция) - - Тип = ТипЗнч(СсылкаИлиКоллекция); - - Если Тип = Тип("Неопределено") - Или Тип = Тип("Булево") - Или Тип = Тип("Строка") - Или Тип = Тип("Число") - Или Тип = Тип("Дата") Тогда // Оптимизация - часто используемые примитивные типы. - - Возврат Ложь; // Не ссылка. - - ИначеЕсли Тип = Тип("Массив") Тогда - - Количество = СсылкаИлиКоллекция.Количество(); - Для Номер = 1 По Количество Цикл - ОбратныйИндекс = Количество - Номер; - Значение = СсылкаИлиКоллекция[ОбратныйИндекс]; - Если УдалитьБитыеСсылки(Значение) Тогда - СсылкаИлиКоллекция.Удалить(ОбратныйИндекс); - КонецЕсли; - КонецЦикла; - - Возврат Ложь; // Не ссылка. - - ИначеЕсли Тип = Тип("Структура") - Или Тип = Тип("Соответствие") Тогда - - Для Каждого КлючИЗначение Из СсылкаИлиКоллекция Цикл - Значение = КлючИЗначение.Значение; - Если УдалитьБитыеСсылки(Значение) Тогда - СсылкаИлиКоллекция.Вставить(КлючИЗначение.Ключ, Неопределено); - КонецЕсли; - КонецЦикла; - - Возврат Ложь; // Не ссылка. - - ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) - Или Справочники.ТипВсеСсылки().СодержитТип(Тип) - Или Перечисления.ТипВсеСсылки().СодержитТип(Тип) - Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) - Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) - Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) - Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) - Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) - Или Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда - // Ссылочный тип, исключая ТочкаМаршрутаБизнесПроцессаСсылка. - - Если СсылкаИлиКоллекция.Пустая() Тогда - Возврат Ложь; // Ссылка пустая. - ИначеЕсли ЗначениеРеквизитаОбъекта(СсылкаИлиКоллекция, "Ссылка") = Неопределено Тогда - СсылкаИлиКоллекция = Неопределено; - Возврат Истина; // "Битая" ссылка. - Иначе - Возврат Ложь; // Объект найден. - КонецЕсли; - - Иначе - - Возврат Ложь; // Не ссылка. - - КонецЕсли; - -КонецФункции - -// Удаляет настройку из хранилища настроек через его менеджер. -// -// Параметры: -// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, из которого удаляется настройка. -// КлючОбъекта - Строка - Ключ объекта настройки. -// - Неопределено - Удаляются настройки для всех объектов. -// КлючНастроек - Строка - Ключ сохраняемых настроек. -// - Неопределено - Удаляются настройки со всеми ключами. -// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. -// - Неопределено - Удаляются настройки всех пользователей. -// -// См. также: -// "СтандартноеХранилищеНастроекМенеджер.Удалить" в синтакс-помощнике. -// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. -// -Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя) - - Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Функции для работы с настройкой рабочей даты. @@ -4331,191 +3972,41 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Общие процедуры и функции для работы в режиме разделения данных. - -// Устанавливает монопольный доступ к информационной базе (области данных). -// -// При включенном использовании разделителей в сеансе -// начинает транзакцию и устанавливает исключительную управляемую блокировку -// на пространства блокировок всех объектов метаданных, входящих в состав разделителя ОбластьДанных. -// -// В других случаях (например, в локальном режиме работы) устанавливает монопольный режим. -// -// Параметры: -// ПроверитьОтсутствиеДругихСеансов - Булево - проверить отсутствие других -// пользовательских сеансов со значением разделителя равным текущему. -// В случае обнаружения других сеансов будет выдано исключение. -// Параметр используется только при работе в модели сервиса. -// -Процедура ЗаблокироватьИБ(Знач ПроверитьОтсутствиеДругихСеансов = Истина) Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - Если НЕ МонопольныйРежим() Тогда - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - Иначе - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(ПроверитьОтсутствиеДругихСеансов); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Снимает монопольный доступ к информационной базе (области данных). -// -// При включенном использовании разделителей в сеансе, -// - если вызов делается внутри обработчика исключения (из секции Исключении...) -// отменяет транзакцию; -// - иначе фиксирует транзакцию. -// -// В других случаях (например, в локальном режиме работы) снимает монопольный режим. -// -Процедура РазблокироватьИБ() Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - Если МонопольныйРежим() Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - Иначе - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных(); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Устанавливает разделение сеанса. -// -// Параметры: -// Использование - Булево - Использование разделителя ОбластьДанных в сеансе. -// ОбластьДанных - Число - Значение разделителя ОбластьДанных. -// -Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт - - ПриУстановкеРазделенияСеанса(Использование, ОбластьДанных); - -КонецПроцедуры - -// Возвращает значение разделителя текущей области данных. -// В случае если значение не установлено выдается ошибка. -// -// Возвращаемое значение: -// Тип значения разделителя - значение разделителя текущей области данных. -// -Функция ЗначениеРазделителяСеанса() Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат 0; - Иначе - ЗначениеРазделителя = Неопределено; - ПриПолученииЗначенияРазделителяСеанса(ЗначениеРазделителя); - Возврат ЗначениеРазделителя; - КонецЕсли; - -КонецФункции - -// Возвращает флаг использования разделителя ОбластьДанных для текущего сеанса. -// -// Возвращаемое значение: -// Булево - Истина, если разделение используется. -// -Функция ИспользованиеРазделителяСеанса() Экспорт - - ИспользованиеРазделителя = Неопределено; - ПриПолученииИспользованияРазделителяСеанса(ИспользованиеРазделителя); - Возврат ИспользованиеРазделителя; - -КонецФункции - -// Процедура инициализации разделенной информационной базы. -// -// Параметры: -// ВключитьРазделение - Булево - признак включения разделения в информационной базе. -// -Процедура УстановитьПараметрыРазделенияИнформационнойБазы(Знач ВключитьРазделение = Ложь) Экспорт - - Если ВключитьРазделение Тогда - Константы.ИспользоватьРазделениеПоОбластямДанных.Установить(Истина); - Иначе - Константы.ИспользоватьРазделениеПоОбластямДанных.Установить(Ложь); - КонецЕсли; - -КонецПроцедуры - -// Выполняет запись значения ссылочного типа, разделенных разделителем РазделительВспомогательныхДанных -// с переключением разделения сеанса на время записи. -// -// Параметры: -// ОбъектВспомогательныхДанных - ЛюбаяСсылка, УдалениеОбъекта - значение ссылочного типа или УдалениеОбъекта. -// -Процедура ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт - - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных); - Иначе - ОбъектВспомогательныхДанных.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Выполняет удаление значения ссылочного типа, разделенных разделителем РазделительВспомогательныхДанных -// с переключением разделения сеанса на время записи. -// -// Параметры: -// ОбъектВспомогательныхДанных - ЛюбаяСсылка - значение ссылочного типа. -// -Процедура УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт - - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных); - Иначе - ОбъектВспомогательныхДанных.Удалить(); - КонецЕсли; - -КонецПроцедуры - ///////////////////////////////////////////////////////////////////////////////// // Версионирование программных интерфейсов. -// Возвращает массив номеров версий, поддерживаемых интерфейсом удаленной системы. +// Возвращает номера версий программных интерфейсов удаленной системы, доступной через веб-сервис. +// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах +// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии, +// то только в этом случае допустимо вызывать у него новую функцию. +// +// В целях экономии трафика при интенсивном взаимодействии между вызывающей и вызываемой сторонами +// сведения о версиях кэшируются на одни сутки. Если для целей отладки требуется сбросить кэш раньше этого времени, +// следует удалить соответствующие записи из регистра сведений КэшПрограммныхИнтерфейсов. // // Параметры: -// Адрес - Строка - адрес web-сервиса версионирования интерфейсов; -// Пользователь - Строка - имя пользователя; -// Пароль - Строка - пароль пользователя; -// Интерфейс - Строка - имя интерфейса. +// Адрес - Строка - адрес веб-сервиса версионирования интерфейсов InterfaceVersion; +// Пользователь - Строка - имя пользователя веб-сервиса; +// Пароль - Строка - пароль пользователя веб-сервиса; +// Интерфейс - Строка - имя запрашиваемого программного интерфейса, например, "СервисПередачиФайлов". // // Возвращаемое значение: -// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. Например, -// "1.0.2.1". +// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. +// Например, "1.0.2.1". // -// Пример использования: +// Пример: +// Версии = ПолучитьВерсииИнтерфейса("http://vsrvx/sm", "ivanov",, "СервисПередачиФайлов"); +// +// Также для обратной совместимости поддерживается устаревший вариант вызова: // ПараметрыПодключения = Новый Структура; // ПараметрыПодключения.Вставить("URL", "http://vsrvx/sm"); // ПараметрыПодключения.Вставить("UserName", "ivanov"); -// МассивВерсий = ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "СервисПередачиФайлов"); -// -// Примечание: при получении версий используется кэш, время обновления которого составляет -// одни сутки. Если для целей отладки требуется обновить значения в кэше, раньше этого -// времени, следует удалить из регистра сведений КэшПрограммныхИнтерфейсов соответствующие -// записи. +// ПараметрыПодключения.Вставить("Password", ""); +// Версии = ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "СервисПередачиФайлов"); // Функция ПолучитьВерсииИнтерфейса(Знач Адрес, Знач Пользователь, Знач Пароль = Неопределено, Знач Интерфейс = Неопределено) Экспорт - Если ТипЗнч(Адрес) = Тип("Структура") Тогда + Если ТипЗнч(Адрес) = Тип("Структура") Тогда // для обратной совместимости ПараметрыПодключения = Адрес; ИмяИнтерфейса = Пользователь; Иначе @@ -4536,34 +4027,35 @@ ПараметрыПолучения.Добавить(ПараметрыПодключения); ПараметрыПолучения.Добавить(ИмяИнтерфейса); - Возврат ОбщегоНазначенияПовтИсп.ДанныеКэшаВерсий( - ИдентификаторЗаписиКэшаВерсий(ПараметрыПодключения.URL, ИмяИнтерфейса), + Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ДанныеКэшаВерсий( + РегистрыСведений.КэшПрограммныхИнтерфейсов.ИдентификаторЗаписиКэшаВерсий(ПараметрыПодключения.URL, ИмяИнтерфейса), Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ВерсииИнтерфейса, - ЗначениеВСтрокуXML(ПараметрыПолучения), + ПараметрыПолучения, Истина); КонецФункции -// Возвращает массив номеров версий, поддерживаемых интерфейсом системы, подключенной через внешнее соединение. +// Возвращает номера версий программных интерфейсов удаленной системы, подключенной через внешнее соединение. +// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах +// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии, +// то только в этом случае допустимо вызывать у него новую функцию. // // Параметры: -// ВнешнееСоединение - COMОбъект - объект COM-соединение, которое используется для работы с корреспондентом. -// ИмяИнтерфейса - Строка -. +// ВнешнееСоединение - COMОбъект - внешнее соединение, которое используется для работы с удаленной системой. +// ИмяИнтерфейса - Строка - имя запрашиваемого программного интерфейса, например, "СервисПередачиФайлов". // // Возвращаемое значение: -// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. Например, -// "1.0.2.1". +// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. +// Например, "1.0.2.1". // -// Пример использования: -// Параметры = ... -// ВнешнееСоединение = ОбщегоНазначения.УстановитьВнешнееСоединение(Параметры); -// МассивВерсий = ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, "ОбменДанными"); +// Пример: +// Версии = ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, "СервисПередачиФайлов"); // Функция ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, Знач ИмяИнтерфейса) Экспорт Попытка ВерсииИнтерфейсаXML = ВнешнееСоединение.СтандартныеПодсистемыСервер.ПоддерживаемыеВерсии(ИмяИнтерфейса); Исключение - СтрокаСообщения = НСтр("ru = 'Корреспондент не поддерживает версионирование интерфейсов подсистем. + СтрокаСообщения = НСтр("ru = 'Корреспондент не поддерживает версионирование программных интерфейсов. |Описание ошибки: %1'"); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение версий интерфейса'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), @@ -4575,14 +4067,12 @@ Возврат Новый ФиксированныйМассив(ЗначениеИзСтрокиXML(ВерсииИнтерфейсаXML)); КонецФункции -// Удаляет записи кэша версий содержащих в идентификаторе указанную -// подстроку. В качестве подстроки может использоваться, например, -// имя интерфейса более не используемого в конфигурации. +// Удаляет записи кэша версий программных интерфейсов, содержащих в идентификаторе указанную подстроку. +// В качестве подстроки может использоваться, например, имя интерфейса, более не используемого в конфигурации. // // Параметры: -// ПодстрокаПоискаИдентификаторов - Строка - подстрока поиска -// идентификаторов. Строка не может содержать символов -// %, _ и [. +// ПодстрокаПоискаИдентификаторов - Строка - подстрока поиска идентификаторов. +// Не может содержать символов %, _ и [. // Процедура УдалитьЗаписиКэшаВерсий(Знач ПодстрокаПоискаИдентификаторов) Экспорт @@ -4630,10 +4120,13 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с хранилищем паролей. - // Записывает конфиденциальные данные в безопасное хранилище. // Вызывающий код должен самостоятельно устанавливать привилегированный режим. // +// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов), +// а доступно только коду, который делает обращения только к своей части данных и +// в том контексте, который предполагает чтение или запись конфиденциальных данных. +// // Параметры: // Владелец - ПланОбменаСсылка, СправочникСсылка, Строка - ссылка на объект информационной базы, // представляющий объект-владелец сохраняемого пароля или строка до 128 символов. @@ -4641,20 +4134,34 @@ // элемент метаданных этого типа в справочнике ИдентификаторыОбъектовМетаданных // или ключ в виде строки с учетом имен подсистем. // Например, для БСП: -// Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.АдресныеОбъекты"); -// Владелец = "СтандартныеПодсистемы.УправлениеДоступом";, если нужно 1 хранилище на подсистему БСП -// Владелец = "СтандартныеПодсистемы.УправлениеДоступом.<Уточнение>";, если нужно более 1 хранилища на подсистему БСП. +// Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.АдресныеОбъекты"); +// если нужно 1 хранилище на подсистему БСП: +// Владелец = "СтандартныеПодсистемы.УправлениеДоступом"; +// если нужно более 1 хранилища на подсистему БСП: +// Владелец = "СтандартныеПодсистемы.УправлениеДоступом.<Уточнение>"; +// // Данные - Произвольный - Данные помещаемые в безопасное хранилище. Неопределенно - удаляет данные. // Ключ - Строка - Ключ сохраняемых настроек, по умолчанию "Пароль". // +// Пример: +// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) +// Если ТекущийПользовательМожетИзменятьПароль Тогда +// УстановитьПривилегированныйРежим(Истина); +// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Логин, "Логин"); +// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Пароль); +// УстановитьПривилегированныйРежим(Ложь); +// КонецЕсли; +// КонецПроцедуры +// Процедура ЗаписатьДанныеВБезопасноеХранилище(Владелец, Данные, Ключ = "Пароль") Экспорт - ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), + ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), "Владелец", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Владелец, ТипЗнч(Владелец))); - ЭтоОбластьДанных = ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + ЭтоОбластьДанных = РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных(); Если ЭтоОбластьДанных Тогда БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи(); Иначе @@ -4690,9 +4197,14 @@ // Возвращает данные из безопасного хранилища. // Вызывающий код должен самостоятельно устанавливать привилегированный режим. // +// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов), +// а доступно только коду, который делает обращения только к своей части данных и +// в том контексте, который предполагает чтение или запись конфиденциальных данных. +// // Параметры: -// Владелец - ПланОбменаСсылка, СправочникСсылка, Строка - ссылка на объект информационной базы, -// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. +// Владелец - ПланОбменаСсылка, СправочникСсылка, Строка - ссылка на объект информационной базы, +// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. +// // Ключи - Строка - Содержит список имен сохраненных данных, указанных через запятую. // ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме. // @@ -4701,15 +4213,30 @@ // то возвращается его значение, иначе структура. // Если данные отсутствуют - Неопределенно. // +// Пример: +//Процедура ПриЧтенииНаСервере(ТекущийОбъект) +// +// Если ТекущийПользовательМожетИзменятьПароль Тогда +// УстановитьПривилегированныйРежим(Истина); +// Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, "Логин"); +// Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка); +// УстановитьПривилегированныйРежим(Ложь); +// Иначе +// Элементы.ГруппаЛогинИПароль.Видимость = Ложь; +// КонецЕсли; +// +//КонецПроцедуры +// Функция ПрочитатьДанныеИзБезопасногоХранилища(Владелец, Ключи = "Пароль", ОбщиеДанные = Неопределено) Экспорт - ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), + ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), "Владелец", "ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища", Владелец, ТипЗнч(Владелец))); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РазделениеВключено() + И ДоступноИспользованиеРазделенныхДанных() Тогда Если ОбщиеДанные = Истина Тогда ИмяБезопасноеХранилищеДанных = "БезопасноеХранилищеДанных"; Иначе @@ -4732,20 +4259,38 @@ // Удаляет конфиденциальные данные в безопасное хранилище. // Вызывающий код должен самостоятельно устанавливать привилегированный режим. // +// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов), +// а доступно только коду, который делает обращения только к своей части данных и +// в том контексте, который предполагает чтение или запись конфиденциальных данных. +// // Параметры: // Владелец - ПланОбменаСсылка, СправочникСсылка, Строка - ссылка на объект информационной базы, -// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. -// Ключи - Строка - Содержит список имен удаляемых данных, указанных через запятую. -// Неопределенно - удаляет все данные. +// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. +// +// Ключи - Строка - Содержит список имен удаляемых данных, указанных через запятую. +// Неопределенно - удаляет все данные. +// +// Пример: +//Процедура ПередУдалением(Отказ) +// +// // Проверка значения свойства ОбменДанными.Загрузка отсутствует, так как удалять данные +// // из безопасного хранилища нужно даже при удалении объекта при обмене данными. +// +// УстановитьПривилегированныйРежим(Истина); +// ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(Ссылка); +// УстановитьПривилегированныйРежим(Ложь); +// +//КонецПроцедуры // Процедура УдалитьДанныеИзБезопасногоХранилища(Владелец, Ключи = Неопределено) Экспорт - ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), + ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), "Владелец", "ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища", Владелец, ТипЗнч(Владелец))); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() Тогда БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи(); Иначе БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи(); @@ -4787,14 +4332,13 @@ // Например: "СтандартныеПодсистемы.ВариантыОтчетов". // // Пример: -// // Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда // МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); // МодульВариантыОтчетов.<Имя метода>(); // КонецЕсли; // // Возвращаемое значение: -// Булево. +// Булево - Истина, если существует. // Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт @@ -4811,7 +4355,7 @@ // "ОбщегоНазначенияКлиент". // // Возвращаемое значение: -// ОбщийМодуль. +// ОбщийМодуль - общий модуль. // Функция ОбщийМодуль(Имя) Экспорт @@ -4832,16 +4376,16 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции для работы с буфером обмена. +// Процедуры и функции для работы с внутренним буфером обмена. -// Помещает выделенные строки табличной части в буфер обмена. +// Помещает выделенные строки табличной части во внутренний буфер обмена. // // Параметры: // ТабличнаяЧасть - ДанныеФормыКоллекция - Табличная часть, строки которой -// необходимо поместить в буфер обмена. +// необходимо поместить во внутренний буфер обмена. // ВыделенныеСтроки - Массив - Массив идентификаторов выделенных строк. // Источник - Строка - Произвольный строковый идентификатор, например, имя объекта, -// строки табличной части которого помещаются в буфер обмена. +// строки табличной части которого помещаются во внутренний буфер обмена. // Процедура СкопироватьСтрокиВБуферОбмена(ТабличнаяЧасть, ВыделенныеСтроки, Источник = Неопределено) Экспорт @@ -4874,12 +4418,12 @@ КонецПроцедуры -// Помещает произвольные данные в буфер обмена. +// Помещает произвольные данные во внутренний буфер обмена. // // Параметры: -// Данные - Произвольный - Данные, которые необходимо поместить в буфер обмена. +// Данные - Произвольный - Данные, которые необходимо поместить в внутренний буфер обмена. // Источник - Строка - Произвольный строковый идентификатор, например, имя объекта, -// строки табличной части которого помещаются в буфер обмена. +// строки табличной части которого помещаются во внутренний буфер обмена. // Процедура СкопироватьВБуферОбмена(Данные, Источник = Неопределено) Экспорт @@ -4901,14 +4445,14 @@ КонецПроцедуры -// Получает строки табличной части, помещенные в буфер обмена. +// Получает строки табличной части, помещенные во внутренний буфер обмена. // // Возвращаемое значение: // Структура - со свойствами: -// * Данные - Произвольный - Данные из буфера обмена. -// Например, ТаблицаЗначений при вызове СкопироватьСтрокиВБуферОбмена. +// * Данные - Произвольный - Данные из внутреннего буфера обмена. +// Например, ТаблицаЗначений при вызове СкопироватьСтрокиВБуферОбмена. // * Источник - Строка - Объект, к которому относятся данные. -// Если при помещении в буфер не был указан, то Неопределено. +// Если при помещении во внутренний буфер не был указан, то Неопределено. // Функция СтрокиИзБуфераОбмена() Экспорт @@ -4927,14 +4471,14 @@ Возврат Результат; КонецФункции -// Проверяет наличие сохраненных данных в буфере обмена. +// Проверяет наличие сохраненных данных во внутренний буфере обмена. // // Параметры: // Источник - Строка - Если передан, то проверяется наличие данных -// в буфере обмена с этим ключем. +// в внутреннем буфере обмена с этим ключем. // По умолчанию - Неопределено. // Возвращаемое значение: -// Булево. +// Булево - Истина, если пустой. // Функция ПустойБуферОбмена(Источник = Неопределено) Экспорт @@ -4978,6 +4522,267 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Функции для поддержки работы конфигурации с профилем безопасности, в котором +// запрещено подключение внешних модулей без установки безопасного режима. +// + +// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. +// При включении профилей безопасности для вызова оператора Выполнить() используется +// переход в безопасный режим с профилем безопасности, используемом для информационной базы +// (если выше по стеку не был установлен другой безопасный режим). +// +// Параметры: +// ИмяМетода - Строка - имя экспортной процедуры в формате +// <имя объекта>.<имя процедуры>, где <имя объекта> - это +// общий модуль или модуль менеджера объекта. +// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> +// в порядке расположения элементов массива. +// +// Пример: +// Параметры = Новый Массив(); +// Параметры.Добавить("1"); +// ОбщегоНазначения.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); +// +Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + + ПроверитьИмяПроцедурыКонфигурации(ИмяМетода); + + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); + Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности() + И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда + + ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы(); + Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда + + УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); + Если БезопасныйРежим() = Истина Тогда + УстановитьБезопасныйРежим(Ложь); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + ПараметрыСтрока = ""; + Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда + Для Индекс = 0 По Параметры.ВГраница() Цикл + ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; + КонецЦикла; + ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); + КонецЕсли; + + Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; + +КонецПроцедуры + +// Выполнить экспортную процедуру объекта встроенного языка по имени. +// При включении профилей безопасности для вызова оператора Выполнить() используется +// переход в безопасный режим с профилем безопасности, используемом для информационной базы +// (если выше по стеку не был установлен другой безопасный режим). +// +// Параметры: +// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект). +// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки. +// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры> +// в порядке расположения элементов массива. +// +Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + + // Проверка имени метода на корректность. + Попытка + Тест = Новый Структура(ИмяМетода, ИмяМетода); + Исключение + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Некорректное значение параметра ИмяМетода (%1) в ОбщегоНазначения.ВыполнитьМетодОбъекта'"), ИмяМетода); + КонецПопытки; + + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); + Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности() + И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда + + МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); + ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы(); + + Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда + + УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); + Если БезопасныйРежим() = Истина Тогда + УстановитьБезопасныйРежим(Ложь); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + ПараметрыСтрока = ""; + Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда + Для Индекс = 0 По Параметры.ВГраница() Цикл + ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; + КонецЦикла; + ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); + КонецЕсли; + + Выполнить "Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")"; + +КонецПроцедуры + +// Выполняет произвольный алгоритм на встроенном языке 1С:Предприятия, предварительно устанавливая +// безопасный режим выполнения кода и безопасный режим разделения данных для всех разделителей, +// присутствующих в составе конфигурации. В результате при выполнении алгоритма: +// - игнорируются попытки установки привилегированного режима, +// - запрещаются все внешние (по отношению к платформе 1С:Предприятие) действия (COM, +// загрузка внешних компонент, запуск внешних приложений и команд операционной системы, +// доступ к файловой системе и Интернет-ресурсам), +// - запрещается отключение использования разделителей сеанса, +// - запрещается изменение значений разделителей сеанса (если разделение данным разделителем не +// является условно выключенным), +// - запрещается изменение объектов, которые управляют состоянием условного разделения. +// +// Параметры: +// Алгоритм - Строка - содержащая произвольный алгоритм на встроенном языке 1С:Предприятия. +// Параметры - Произвольный - в качестве значения данного параметра может быть передано значение, +// которое требуется для выполнения алгоритма (при этом в тексте алгоритма обращение к данному +// значению должно осуществляться как к имени переменной Параметры). +// +Процедура ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено) Экспорт + + УстановитьБезопасныйРежим(Истина); + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации(); + Иначе + МассивРазделителей = Новый Массив; + КонецЕсли; + + Для Каждого ИмяРазделителя Из МассивРазделителей Цикл + + УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); + + КонецЦикла; + + Выполнить Алгоритм; + +КонецПроцедуры + +// Вычисляет переданное выражение, предварительно устанавливая безопасный режим выполнения кода +// и безопасный режим разделения данных для всех разделителей, присутствующих в составе конфигурации. +// В результате при вычислении выражения: +// - игнорируются попытки установки привилегированного режима, +// - запрещаются все внешние (по отношению к платформе 1С:Предприятие) действия (COM, +// загрузка внешних компонент, запуск внешних приложений и команд операционной системы, +// доступ к файловой системе и Интернет-ресурсам), +// - запрещается отключение использования разделителей сеанса, +// - запрещается изменение значений разделителей сеанса (если разделение данным разделителем не +// является условно выключенным), +// - запрещается изменение объектов, которые управляют состоянием условного разделения. +// +// Параметры: +// Выражение - Строка - выражение, которое требуется вычислить. Например, "МойМодуль.МояФункция(Параметры)". +// Параметры - Произвольный - в качестве значения данного параметра может быть передано значение, +// которое требуется для вычисления выражения (при этом в тексте выражения обращение к данному +// значению должно осуществляться как к имени переменной Параметры). +// +// Возвращаемое значение: +// Произвольный - результат вычисления выражения. +// +Функция ВычислитьВБезопасномРежиме(Знач Выражение, Знач Параметры = Неопределено) Экспорт + + УстановитьБезопасныйРежим(Истина); + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации(); + Иначе + МассивРазделителей = Новый Массив; + КонецЕсли; + + Для Каждого ИмяРазделителя Из МассивРазделителей Цикл + + УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); + + КонецЦикла; + + Возврат Вычислить(Выражение); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для подключения внешних компонент из макетов конфигурации. + +// Подключает компоненту, выполненную по технологии Native API и COM. +// Компонента должна храниться в макете конфигурации в виде ZIP-архива. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ПолноеИмяМакета - Строка - полное имя макета конфигурации, хранящего ZIP-архив. +// +// Возвращаемое значение: +// AddIn, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать. +// +// Пример: +// +// ПодключаемыйМодуль = ОбщегоНазначения.ПодключитьКомпонентуИзМакета( +// "CNameDecl", +// "ОбщийМакет.КомпонентаСклоненияФИО"); +// +// Если ПодключаемыйМодуль <> Неопределено Тогда +// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты. +// КонецЕсли; +// +// ПодключаемыйМодуль = Неопределено; +// +Функция ПодключитьКомпонентуИзМакета(Идентификатор, ПолноеИмяМакета) Экспорт + + ПодключаемыйМодуль = Неопределено; + + Если Не МакетСуществует(ПолноеИмяМакета) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка подключить внешнюю компоненту на сервере не из макета %1'"), ПолноеИмяМакета); + КонецЕсли; + + Местоположение = ПолноеИмяМакета; + + // Генерация уникального имени + СимволическоеИмя = "С" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + + Если ПодключитьВнешнююКомпоненту(Местоположение, СимволическоеИмя) Тогда + + Попытка + ПодключаемыйМодуль = Новый("AddIn." + СимволическоеИмя + "." + Идентификатор); + Исключение + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Создание экземпляра внешней компоненты на сервере'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ПодключаемыйМодуль = Неопределено; + + КонецПопытки; + + Иначе + + ТекстОшибки = НСтр("ru = 'При подключении внешней компоненты %1 на сервере произошла ошибка.'"); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Подключение внешней компоненты на сервере'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Идентификатор)); + + КонецЕсли; + + Возврат ПодключаемыйМодуль; + +КонецФункции + #Область УстаревшиеПроцедурыИФункции // Устарела. Следует использовать ОбщегоНазначенияКлиентСервер.ДополнитьМассив, @@ -4996,19 +4801,79 @@ КонецПроцедуры -// Устарела. Следует использовать ОбщегоНазначенияКлиентСервер.КартинкаКомментария. -// -// Получает картинку для вывода на странице с комментарием в зависимости -// от наличия текста в комментарии. +// Устарела. Следует использовать функцию ТаблицаОписанияСвойствОбъекта +// Возвращает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданного. +// Получает значения свойств стандартных реквизитов и пользовательских реквизитов (созданных в режиме конфигуратора). // // Параметры: -// Комментарий - Строка - текст комментария. +// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо получить значение свойств реквизитов. +// Например: Метаданные.Документ.РеализацияТоваровИУслуг +// Свойства - Строка - свойства реквизитов, перечисленные через запятую, значение которых необходимо получить. +// Например: "Имя, Тип, Синоним, Подсказка". // // Возвращаемое значение: -// Картинка - Картинка, которая должна отображаться на странице с комментарием. +// ТаблицаЗначений - описание требуемых свойств всех реквизитов объекта метаданных. // -Функция ПолучитьКартинкуКомментария(Комментарий) Экспорт - Возврат ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий); +Функция ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт + + Возврат ОписаниеСвойствОбъекта(ОбъектМетаданных, Свойства); + +КонецФункции + +// Устарела. Следует использовать функцию ИсключенияПоискаСсылок +// Возвращает исключения поиска ссылок при удалении объектов. +// +// Возвращаемое значение: +// Соответствие - Исключения поиска ссылок в разрезе объектов метаданных: +// * Ключ - ОбъектМетаданных - Объект метаданных, для которого применяются исключения. +// * Значение - Строка, Массив - описание исключенных реквизитов. +// Если "*", то исключены все реквизиты объекта метаданных. +// Если массив строк, то содержит относительные имена исключенных реквизитов. +// +Функция ПолучитьОбщийСписокИсключенийПоискаСсылок() Экспорт + + Возврат ИсключенияПоискаСсылок(); + +КонецФункции + +// Устарела. Следует использовать СоздатьWSПрокси. +// +// Функция возвращает объект WSПрокси созданный с переданными параметрами. +// +// Параметры: +// АдресWSDL - Строка - месторасположение wsdl. +// URIПространстваИмен - Строка - URI пространства имен web-сервиса. +// ИмяСервиса - Строка - имя сервиса. +// ИмяТочкиПодключения - Строка - если не задано, образуется как <ИмяСервиса>Soap. +// ИмяПользователя - Строка - имя пользователя для входа на сервер. +// Пароль - Строка - пароль пользователя. +// Таймаут - Число - таймаут на операции выполняемые через полученное прокси. +// ДелатьКонтрольныйВызов - Булево - (необязательный) выполнять проверку доступности сервиса (требуется +// поддержка этой команды веб-сервисом). +// +// Возвращаемое значение: +// WSПрокси - объект WSПрокси. +// +Функция WSПрокси(Знач АдресWSDL, + Знач URIПространстваИмен, + Знач ИмяСервиса, + Знач ИмяТочкиПодключения = "", + Знач ИмяПользователя, + Знач Пароль, + Знач Таймаут = 0, + Знач ДелатьКонтрольныйВызов = Ложь) Экспорт + + ПараметрыПодключения = ПараметрыПодключенияWSПрокси(); + ПараметрыПодключения.АдресWSDL = АдресWSDL; + ПараметрыПодключения.URIПространстваИмен = URIПространстваИмен; + ПараметрыПодключения.ИмяСервиса = ИмяСервиса; + ПараметрыПодключения.ИмяТочкиПодключения = ИмяТочкиПодключения; + ПараметрыПодключения.ИмяПользователя = ИмяПользователя; + ПараметрыПодключения.Пароль = Пароль; + ПараметрыПодключения.Таймаут = Таймаут; + + Возврат СоздатьWSПрокси(ПараметрыПодключения); + КонецФункции // Устарела. Следует использовать СклонениеПредставленийОбъектов.Просклонять. @@ -5052,41 +4917,441 @@ КонецФункции -// Устарела. Следует использовать СоздатьWSПрокси. +// Устарела. Следует использовать ОбщегоНазначенияКлиентСервер.КартинкаКомментария. // -// Функция возвращает объект WSПрокси созданный с переданными параметрами. +// Получает картинку для вывода на странице с комментарием в зависимости +// от наличия текста в комментарии. // // Параметры: -// АдресWSDL - Строка - месторасположение wsdl. -// URIПространстваИмен - Строка - URI пространства имен web-сервиса. -// ИмяСервиса - Строка - имя сервиса. -// ИмяТочкиПодключения - Строка - если не задано, образуется как <ИмяСервиса>Soap. -// ИмяПользователя - Строка - имя пользователя для входа на сервер. -// Пароль - Строка - пароль пользователя. -// Таймаут - Число - таймаут на операции выполняемые через полученное прокси. +// Комментарий - Строка - текст комментария. // // Возвращаемое значение: -// WSПрокси +// Картинка - Картинка, которая должна отображаться на странице с комментарием. // -Функция WSПрокси(Знач АдресWSDL, - Знач URIПространстваИмен, - Знач ИмяСервиса, - Знач ИмяТочкиПодключения = "", - Знач ИмяПользователя, - Знач Пароль, - Знач Таймаут = 0, - Знач ДелатьКонтрольныйВызов = Ложь) Экспорт +Функция ПолучитьКартинкуКомментария(Комментарий) Экспорт + Возврат ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сохранение, чтение и удаление настроек из хранилищ. + +// Устарела. Следует использовать функцию ХранилищеОбщихНастроекСохранить. +Процедура ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур) Экспорт - ПараметрыПодключения = ПараметрыПодключенияWSПрокси(); - ПараметрыПодключения.АдресWSDL = АдресWSDL; - ПараметрыПодключения.URIПространстваИмен = URIПространстваИмен; - ПараметрыПодключения.ИмяСервиса = ИмяСервиса; - ПараметрыПодключения.ИмяТочкиПодключения = ИмяТочкиПодключения; - ПараметрыПодключения.ИмяПользователя = ИмяПользователя; - ПараметрыПодключения.Пароль = Пароль; - ПараметрыПодключения.Таймаут = Таймаут; + ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); - Возврат СоздатьWSПрокси(ПараметрыПодключения); +КонецПроцедуры + +// Устарела. Следует использовать функцию ХранилищеОбщихНастроекСохранить. +Процедура ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение) Экспорт + + ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Значение,,,Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции для работы в режиме разделения данных. + +// Устарела. Следует использовать метод платформы УстановитьМонопольныйРежим(Истина). +Процедура ЗаблокироватьИБ(Знач ПроверитьОтсутствиеДругихСеансов = Истина) Экспорт + + Если Не РазделениеВключено() + Или Не ДоступноИспользованиеРазделенныхДанных() Тогда + + Если Не МонопольныйРежим() Тогда + УстановитьМонопольныйРежим(Истина); + КонецЕсли; + Иначе + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(ПроверитьОтсутствиеДругихСеансов); + Иначе + ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать метод платформы УстановитьМонопольныйРежим(Ложь). +Процедура РазблокироватьИБ() Экспорт + + Если Не РазделениеВключено() + Или Не ДоступноИспользованиеРазделенныхДанных() Тогда + + Если МонопольныйРежим() Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + Иначе + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных(); + Иначе + ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать РаботаВМоделиСервиса.УстановитьРазделениеСеанса. +Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Использование, ОбластьДанных); + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать РаботаВМоделиСервиса.ЗначениеРазделителяСеанса. +Функция ЗначениеРазделителяСеанса() Экспорт + + Если Не РазделениеВключено() Тогда + Возврат 0; + КонецЕсли; + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + КонецЕсли; + +КонецФункции + +// Устарела. Следует использовать +// ОбщегоНазначения.РазделениеВключено() +// И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(). +// +Функция ИспользованиеРазделителяСеанса() Экспорт + + Если Не РазделениеВключено() Тогда + Возврат Ложь; + КонецЕсли; + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.ИспользованиеРазделителяСеанса(); + КонецЕсли; + +КонецФункции + +// Устарела. Константа служебного назначения (должна изменяться только из библиотеки технологий сервиса). +Процедура УстановитьПараметрыРазделенияИнформационнойБазы(Знач ВключитьРазделение = Ложь) Экспорт + + Если ВключитьРазделение Тогда + Константы.ИспользоватьРазделениеПоОбластямДанных.Установить(Истина); + Иначе + Константы.ИспользоватьРазделениеПоОбластямДанных.Установить(Ложь); + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные. +Процедура ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных); + Иначе + ОбъектВспомогательныхДанных.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать РаботаВМоделиСервиса.УдалитьВспомогательныеДанные. +Процедура УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных); + Иначе + ОбъектВспомогательныхДанных.Удалить(); + КонецЕсли; + +КонецПроцедуры + +// Устарела: Необходимо использовать РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(). +// Возвращает признак того, что объект метаданных используется в общих реквизитах-разделителях. +// +// Параметры: +// ОбъектМетаданных - Строка, ОбъектМетаданных - Если объект метаданных задан строкой, происходит обращение к модулю +// повторного использования. +// Разделитель - Строка - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. +// +// Возвращаемое значение: +// Булево - Истина, если объект метаданных используется хотя бы в одном общем разделителе. +// +Функция ЭтоРазделенныйОбъектМетаданных(Знач ОбъектМетаданных, Знач Разделитель = Неопределено) Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных, Разделитель); + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции для работы с прикладными типами и коллекциями значений. + +// Устарела. Создает копию объекта XDTO. +// +// Параметры: +// Фабрика - ФабрикаXDTO - фабрика, которой создан исходный объект. +// Объект - ОбъектXDTO - объект, копию которого требуется создать. +// +// Возвращаемое значение: +// ОбъектXDTO - копия исходного объекта XDTO. +// +Функция СкопироватьXDTO(Знач Фабрика, Знач Объект) Экспорт + + Запись = Новый ЗаписьXML; + Запись.УстановитьСтроку(); + Фабрика.ЗаписатьXML(Запись, Объект, , , , НазначениеТипаXML.Явное); + + XMLПредставление = Запись.Закрыть(); + + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLПредставление); + + Возврат Фабрика.ПрочитатьXML(Чтение, Объект.Тип()); + +КонецФункции + +// Устарела. Возвращает XML представление типа XDTO. +// +// Параметры: +// ТипXDTO - ТипОбъектаXDTO, ТипЗначенияXDTO - тип XDTO для которого требуется получить. +// XML представление. +// +// Возвращаемое значение: +// Строка - XML представление типа XDTO. +// +Функция ПредставлениеТипаXDTO(ТипXDTO) Экспорт + + Возврат СериализаторXDTO.XMLСтрока(Новый РасширенноеИмяXML(ТипXDTO.URIПространстваИмен, ТипXDTO.Имя)) + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Имена типов. + +// Устарела. Возвращает значение для идентификации общего типа "Регистры сведений". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаРегистрыСведений() Экспорт + + Возврат "РегистрыСведений"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Регистры накопления". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаРегистрыНакопления() Экспорт + + Возврат "РегистрыНакопления"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Регистры бухгалтерии". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаРегистрыБухгалтерии() Экспорт + + Возврат "РегистрыБухгалтерии"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Регистры расчета". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаРегистрыРасчета() Экспорт + + Возврат "РегистрыРасчета"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Документы". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаДокументы() Экспорт + + Возврат "Документы"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Справочники". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаСправочники() Экспорт + + Возврат "Справочники"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Перечисления". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПеречисления() Экспорт + + Возврат "Перечисления"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Отчеты". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаОтчеты() Экспорт + + Возврат "Отчеты"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Обработки". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаОбработки() Экспорт + + Возврат "Обработки"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "ПланыОбмена". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПланыОбмена() Экспорт + + Возврат "ПланыОбмена"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Планы видов характеристик". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПланыВидовХарактеристик() Экспорт + + Возврат "ПланыВидовХарактеристик"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Бизнес-процессы". +// +// Возвращаемое значение: +// Строка - "БизнесПроцессы". +// +Функция ИмяТипаБизнесПроцессы() Экспорт + + Возврат "БизнесПроцессы"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Задачи". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаЗадачи() Экспорт + + Возврат "Задачи"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Планы счетов". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПланыСчетов() Экспорт + + Возврат "ПланыСчетов"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Планы видов расчета". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПланыВидовРасчета() Экспорт + + Возврат "ПланыВидовРасчета"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Константы". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаКонстанты() Экспорт + + Возврат "Константы"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Журналы документов". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаЖурналыДокументов() Экспорт + + Возврат "ЖурналыДокументов"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Последовательности". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПоследовательности() Экспорт + + Возврат "Последовательности"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "РегламентныеЗадания". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаРегламентныеЗадания() Экспорт + + Возврат "РегламентныеЗадания"; + +КонецФункции + +// Устарела. Возвращает значение для идентификации общего типа "Перерасчеты". +// +// Возвращаемое значение: +// Строка - имя типа. +// +Функция ИмяТипаПерерасчеты() Экспорт + + Возврат "Перерасчеты"; КонецФункции @@ -5096,26 +5361,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции для обработки служебных событий. - -// Возвращает обработчики указанного серверного служебного события. -// -// Параметры: -// Событие - Строка - например, -// "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов". -// -// Возвращаемое значение: -// ФиксированныйМассив со значениями типа ФиксированнаяСтруктура со свойствами: -// * Версия - Строка - версия обработчика, например, "2.1.3.4". Пустая строка, если не указана. -// * Модуль - ОбщийМодуль - серверный общий модуль. -// -Функция ОбработчикиСлужебногоСобытия(Событие) Экспорт - - Возврат СтандартныеПодсистемыПовтИсп.ОбработчикиСерверногоСобытия(Событие, Истина); - -КонецФункции - // Выгружает запрос в строку XML, которую можно вставить в Консоль запросов. // Для переноса запроса и всех его параметров в Консоль запросов, необходимо вызвать функцию в окне. // «Вычислить выражение»(Shift + F9), скопировать полученный XML в поле "Текст запроса" @@ -5141,662 +5386,145 @@ #Область СлужебныеПроцедурыИФункции -// Обновляет данные в кэше версий. -// -// Параметры: -// Идентификатор - Строка - идентификатор записи кэша. -// ТипДанных - ПеречислениеСсылка.ТипыДанныхКэшаПрограммныхИнтерфейсов - тип обновляемых данных. -// ПараметрыПолучения - Массив - дополнительные параметры получения данных в кэш. -// -Процедура ОбновитьДанныеКэшаВерсий(Знач Идентификатор, Знач ТипДанных, Знач ПараметрыПолучения) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Хранилища настроек. + +Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек, ИмяПользователя, ОбновитьПовторноИспользуемыеЗначения) - УстановитьПривилегированныйРежим(Истина); - - СтруктураКлюча = Новый Структура("Идентификатор, ТипДанных", Идентификатор, ТипДанных); - Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча); - - Попытка - ЗаблокироватьДанныеДляРедактирования(Ключ); - Исключение - // Данные уже обновляются из другого сеанса. + Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда Возврат; - КонецПопытки; + КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТаблицаКэша.ДатаОбновления КАК ДатаОбновления, - | ТаблицаКэша.Данные КАК Данные, - | ТаблицаКэша.ТипДанных КАК ТипДанных - |ИЗ - | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша - |ГДЕ - | ТаблицаКэша.Идентификатор = &Идентификатор - | И ТаблицаКэша.ТипДанных = &ТипДанных"; - Идентификатор = Идентификатор; - Запрос.УстановитьПараметр("Идентификатор", Идентификатор); - Запрос.УстановитьПараметр("ТипДанных", ТипДанных); + МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Настройки, + ОписаниеНастроек, ИмяПользователя); - НачатьТранзакцию(); - - Попытка - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); - ЭлементБлокировки.УстановитьЗначение("Идентификатор", Идентификатор); - ЭлементБлокировки.УстановитьЗначение("ТипДанных", ТипДанных); - Блокировка.Заблокировать(); - - Результат = Запрос.Выполнить(); - - // Не удерживаем транзакцию для того, чтобы другие сеансы могли выполнять чтение данных. - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - РазблокироватьДанныеДляРедактирования(Ключ); - ВызватьИсключение; - - КонецПопытки; - - Попытка - // Убедимся, что данные требуют обновления. - Если Не Результат.Пустой() Тогда - - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Если Не ЗаписьКэшаВерсийУстарела(Выборка) Тогда - РазблокироватьДанныеДляРедактирования(Ключ); - Возврат; - КонецЕсли; - - КонецЕсли; - - Набор = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей(); - Набор.Отбор.Идентификатор.Установить(Идентификатор); - Набор.Отбор.ТипДанных.Установить(ТипДанных); - - Запись = Набор.Добавить(); - Запись.Идентификатор = Идентификатор; - Запись.ТипДанных = ТипДанных; - Запись.ДатаОбновления = ТекущаяУниверсальнаяДата(); - - Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения); - Набор.ПодготовитьДанныеДляЗаписи(); - - Набор.Записать(); - - РазблокироватьДанныеДляРедактирования(Ключ); - - Исключение - - РазблокироватьДанныеДляРедактирования(Ключ); - ВызватьИсключение; - - КонецПопытки; + Если ОбновитьПовторноИспользуемыеЗначения Тогда + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; КонецПроцедуры -// Подготавливает данные для кэша программных интерфейсов. -// -// Параметры: -// ТипДанных - ПеречислениеСсылка.ТипыДанныхКэшаПрограммныхИнтерфейсов - тип обновляемых данных. -// ПараметрыПолучения - Массив - дополнительные параметры получения данных в кэш. -// -Функция ПодготовитьДанныеКэшаВерсий(Знач ТипДанных, Знач ПараметрыПолучения) Экспорт +Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию, + ОписаниеНастроек, ИмяПользователя) - Если ТипДанных = Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ВерсииИнтерфейса Тогда - Данные = ПолучитьВерсииИнтерфейсаВКэш(ПараметрыПолучения[0], ПараметрыПолучения[1]); - ИначеЕсли ТипДанных = Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ОписаниеWebСервиса Тогда - Данные = ПолучитьWSDL(ПараметрыПолучения[0], ПараметрыПолучения[1], ПараметрыПолучения[2], ПараметрыПолучения[3]); + Результат = Неопределено; + + Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек), + ОписаниеНастроек, ИмяПользователя); + КонецЕсли; + + Если Результат = Неопределено Тогда + Результат = ЗначениеПоУмолчанию; Иначе - ШаблонТекста = НСтр("ru = 'Неизвестный тип данных кэша версий: %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ТипДанных); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - Возврат Данные; - -КонецФункции - -// Возвращает факт устаревания записи кэша версий. -// -// Параметры: -// Запись - РегистрСведенийМенеджерЗаписи.КэшПрограммныхИнтерфейсов - запись, факт устаревания которой требуется -// проверить. -// -// Возвращаемое значение: -// Булево - признак устаревания записи. -// -Функция ЗаписьКэшаВерсийУстарела(Знач Запись) Экспорт - - Если ЗначениеЗаполнено(Запись.ДатаОбновления) Тогда - Возврат Запись.ДатаОбновления + 86400 < ТекущаяУниверсальнаяДата(); - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Формирует идентификатор записи кэша версий из адреса сервера и имени ресурса. -// -// Параметры: -// Адрес - Строка - адрес сервера. -// Имя - Строка - имя ресурса. -// -// Возвращаемое значение: -// Строка - идентификатор записи кэша версий. -// -Функция ИдентификаторЗаписиКэшаВерсий(Знач Адрес, Знач Имя) - - Возврат Адрес + "|" + Имя; - -КонецФункции - -// Функция возвращает объект WSОпределения созданный с переданными параметрами. -// -// Примечание: при получении определения используется кэш, обновление которого осуществляется -// при смене версии конфигурации. Если для целей отладки требуется обновить -// значения в кэше, раньше этого времени, следует удалить из регистра сведений. -// КэшПрограммныхИнтерфейсов соответствующие записи. -// -// Параметры: -// АдресWSDL - Строка - месторасположение wsdl. -// ИмяПользователя - Строка - имя пользователя для входа на сервер. -// Пароль - Строка - пароль пользователя. -// Таймаут - Число - таймаут на получение wsdl. -// -// Возвращаемое значение: -// WSОпределения -// -Функция WSОпределения(Знач АдресWSDL, Знач ИмяПользователя, Знач Пароль, Знач Таймаут = 10) Экспорт - - Если Не ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - Возврат Новый WSОпределения(АдресWSDL, ИмяПользователя, Пароль, ,Таймаут); - КонецЕсли; - - ПараметрыПолучения = Новый Массив; - ПараметрыПолучения.Добавить(АдресWSDL); - ПараметрыПолучения.Добавить(ИмяПользователя); - ПараметрыПолучения.Добавить(Пароль); - ПараметрыПолучения.Добавить(Таймаут); - - ДанныеWSDL = ОбщегоНазначенияПовтИсп.ДанныеКэшаВерсий( - АдресWSDL, - Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ОписаниеWebСервиса, - ЗначениеВСтрокуXML(ПараметрыПолучения), - Ложь); - - ИмяФайлаWSDL = ПолучитьИмяВременногоФайла("wsdl"); - - ДанныеWSDL.Записать(ИмяФайлаWSDL); - - ИнтернетПрокси = Неопределено; - Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресWSDL); - КонецЕсли; - Определения = Новый WSОпределения(ИмяФайлаWSDL, ИмяПользователя, Пароль, ИнтернетПрокси, Таймаут); - - Попытка - УдалитьФайлы(ИмяФайлаWSDL); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат Определения; -КонецФункции - -Функция ВнутренняяWSПрокси(Параметры) Экспорт - - АдресWSDL = Параметры.АдресWSDL; - URIПространстваИмен = Параметры.URIПространстваИмен; - ИмяСервиса = Параметры.ИмяСервиса; - ИмяТочкиПодключения = Параметры.ИмяТочкиПодключения; - ИмяПользователя = Параметры.ИмяПользователя; - Пароль = Параметры.Пароль; - Таймаут = Параметры.Таймаут; - Местоположение = Параметры.Местоположение; - ИспользоватьАутентификациюОС = Параметры.ИспользоватьАутентификациюОС; - - WSОпределения = ОбщегоНазначенияПовтИсп.WSОпределения(АдресWSDL, ИмяПользователя, Пароль); - - Если ПустаяСтрока(ИмяТочкиПодключения) Тогда - ИмяТочкиПодключения = ИмяСервиса + "Soap"; - КонецЕсли; - - ИнтернетПрокси = Неопределено; - Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресWSDL); - КонецЕсли; - - Протокол = ""; - Позиция = СтрНайти(АдресWSDL, "://"); - Если Позиция > 0 Тогда - Протокол = НРег(Лев(АдресWSDL, Позиция - 1)); - КонецЕсли; - - ЗащищенноеСоединение = Неопределено; - Если (Протокол = "https" Или Протокол = "ftps") Тогда - ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL; - КонецЕсли; - - Прокси = Новый WSПрокси(WSОпределения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, - ИнтернетПрокси, Таймаут, ЗащищенноеСоединение, Местоположение, ИспользоватьАутентификациюОС); - - Прокси.Пользователь = ИмяПользователя; - Прокси.Пароль = Пароль; - - Возврат Прокси; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасноеХранилищеДанных, Ключ) - - Результат = Новый Структура(Ключ); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | БезопасноеХранилищеДанных.Данные КАК Данные - |ИЗ - | РегистрСведений." + ИмяБезопасноеХранилищеДанных + " КАК БезопасноеХранилищеДанных - |ГДЕ - | БезопасноеХранилищеДанных.Владелец = &Владелец"; - - Запрос.УстановитьПараметр("Владелец", Владелец); - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - - Если РезультатЗапроса.Следующий() Тогда - Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда - СохраненныеДанные = РезультатЗапроса.Данные.Получить(); - Если ЗначениеЗаполнено(СохраненныеДанные) Тогда - ЗаполнитьЗначенияСвойств(Результат, СохраненныеДанные); - КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + Если УдалитьБитыеСсылки(Результат) Тогда + Результат = ЗначениеПоУмолчанию; КонецЕсли; КонецЕсли; Возврат Результат; + КонецФункции -Процедура НоваяСтрокаКоллекцииОбъектовМетаданных(Имя, Синоним, Картинка, КартинкаОбъекта, Таб) +// Удаляет битые ссылки из переменной. +// +// Параметры: +// СсылкаИлиКоллекция - ЛюбаяСсылка, Произвольный - Проверяемый объект или очищаемая коллекция. +// +// Возвращаемое значение: +// Булево - +// * Истина - СсылкаИлиКоллекция ссылочного типа и объект не найден в базе данных. +// * Ложь - Когда СсылкаИлиКоллекция не ссылочного типа или объект найден в базе данных. +// +Функция УдалитьБитыеСсылки(СсылкаИлиКоллекция) - НоваяСтрока = Таб.Добавить(); - НоваяСтрока.Имя = Имя; - НоваяСтрока.Синоним = Синоним; - НоваяСтрока.Картинка = Картинка; - НоваяСтрока.КартинкаОбъекта = КартинкаОбъекта; + Тип = ТипЗнч(СсылкаИлиКоллекция); -КонецПроцедуры - -Функция ПолучитьВерсииИнтерфейсаВКэш(Знач ПараметрыПодключения, Знач ИмяИнтерфейса) - - Если Не ПараметрыПодключения.Свойство("URL") - Или Не ЗначениеЗаполнено(ПараметрыПодключения.URL) Тогда + Если Тип = Тип("Неопределено") + Или Тип = Тип("Булево") + Или Тип = Тип("Строка") + Или Тип = Тип("Число") + Или Тип = Тип("Дата") Тогда // Оптимизация - часто используемые примитивные типы. - ВызватьИсключение(НСтр("ru = 'Не задан URL сервиса.'")); - КонецЕсли; - - Если ПараметрыПодключения.Свойство("UserName") - И ЗначениеЗаполнено(ПараметрыПодключения.UserName) Тогда + Возврат Ложь; // Не ссылка. - ИмяПользователя = ПараметрыПодключения.UserName; + ИначеЕсли Тип = Тип("Массив") Тогда - Если ПараметрыПодключения.Свойство("Password") Тогда - ПарольПользователя = ПараметрыПодключения.Password; + Количество = СсылкаИлиКоллекция.Количество(); + Для Номер = 1 По Количество Цикл + ОбратныйИндекс = Количество - Номер; + Значение = СсылкаИлиКоллекция[ОбратныйИндекс]; + Если УдалитьБитыеСсылки(Значение) Тогда + СсылкаИлиКоллекция.Удалить(ОбратныйИндекс); + КонецЕсли; + КонецЦикла; + + Возврат Ложь; // Не ссылка. + + ИначеЕсли Тип = Тип("Структура") + Или Тип = Тип("Соответствие") Тогда + + Для Каждого КлючИЗначение Из СсылкаИлиКоллекция Цикл + Значение = КлючИЗначение.Значение; + Если УдалитьБитыеСсылки(Значение) Тогда + СсылкаИлиКоллекция.Вставить(КлючИЗначение.Ключ, Неопределено); + КонецЕсли; + КонецЦикла; + + Возврат Ложь; // Не ссылка. + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) + Или Справочники.ТипВсеСсылки().СодержитТип(Тип) + Или Перечисления.ТипВсеСсылки().СодержитТип(Тип) + Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) + Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) + Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) + Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) + Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) + Или Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + // Ссылочный тип, исключая ТочкаМаршрутаБизнесПроцессаСсылка. + + Если СсылкаИлиКоллекция.Пустая() Тогда + Возврат Ложь; // Ссылка пустая. + ИначеЕсли ЗначениеРеквизитаОбъекта(СсылкаИлиКоллекция, "Ссылка") = Неопределено Тогда + СсылкаИлиКоллекция = Неопределено; + Возврат Истина; // "Битая" ссылка. Иначе - ПарольПользователя = Неопределено; + Возврат Ложь; // Объект найден. КонецЕсли; Иначе - ИмяПользователя = Неопределено; - ПарольПользователя = Неопределено; - КонецЕсли; - - АдресСервиса = ПараметрыПодключения.URL + "/ws/InterfaceVersion?wsdl"; - - - ПараметрыПодключения = Новый Структура; - ПараметрыПодключения.Вставить("АдресWSDL", АдресСервиса); - ПараметрыПодключения.Вставить("URIПространстваИмен", "http://www.1c.ru/SaaS/1.0/WS"); - ПараметрыПодключения.Вставить("ИмяСервиса", "InterfaceVersion"); - ПараметрыПодключения.Вставить("ИмяПользователя", ИмяПользователя); - ПараметрыПодключения.Вставить("Пароль", ПарольПользователя); - ПараметрыПодключения.Вставить("Таймаут", 3); - - ПроксиВерсионирования = СоздатьWSПрокси(ПараметрыПодключения); - - МассивXDTO = ПроксиВерсионирования.GetVersions(ИмяИнтерфейса); - Если МассивXDTO = Неопределено Тогда - Возврат Новый ФиксированныйМассив(Новый Массив); - Иначе - Сериализатор = Новый СериализаторXDTO(ПроксиВерсионирования.ФабрикаXDTO); - Возврат Новый ФиксированныйМассив(Сериализатор.ПрочитатьXDTO(МассивXDTO)); + + Возврат Ложь; // Не ссылка. + КонецЕсли; КонецФункции -Функция ПолучитьWSDL(Знач Адрес, Знач ИмяПользователя, Знач Пароль, Знач Таймаут) +Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя) - ПараметрыПолучения = Новый Структура; - Если НЕ ПустаяСтрока(ИмяПользователя) Тогда - ПараметрыПолучения.Вставить("Пользователь", ИмяПользователя); - ПараметрыПолучения.Вставить("Пароль", Пароль); + Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя); КонецЕсли; - ПараметрыПолучения.Вставить("Таймаут", Таймаут); - - ОписаниеФайла = Неопределено; - - ПриСкачиванииФайлаНаСервере(Адрес, ПараметрыПолучения, ОписаниеФайла); - - Если НЕ ОписаниеФайла.Статус Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка получения файла описания web-сервиса:'") + Символы.ПС + ОписаниеФайла.СообщениеОбОшибке) - КонецЕсли; - - ИнтернетПрокси = Неопределено; - Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Адрес); - КонецЕсли; - Определения = Новый WSОпределения(ОписаниеФайла.Путь, ИмяПользователя, Пароль, ИнтернетПрокси, Таймаут); - - Если Определения.Сервисы.Количество() = 0 Тогда - ШаблонСообщения = НСтр("ru = 'Ошибка получения файла описания web-сервиса: - |В полученном файле не содержится ни одного описания сервиса. - | - |Возможно, адрес файла описания указан неверно: - |%1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Адрес); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - Определения = Неопределено; - - ДанныеФайла = Новый ДвоичныеДанные(ОписаниеФайла.Путь); - - Попытка - УдалитьФайлы(ОписаниеФайла.Путь); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат ДанныеФайла; - -КонецФункции - -Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь) - - ТипДанных = ТипЗнч(Данные); - - Если ТипДанных = Тип("ХранилищеЗначения") - ИЛИ ТипДанных = Тип("ФиксированныйМассив") - ИЛИ ТипДанных = Тип("ФиксированнаяСтруктура") - ИЛИ ТипДанных = Тип("ФиксированноеСоответствие") Тогда - - Возврат; - КонецЕсли; - - Если ДанныеВЗначенииФиксированныхТипов Тогда - - Если ТипДанных = Тип("Булево") - ИЛИ ТипДанных = Тип("Строка") - ИЛИ ТипДанных = Тип("Число") - ИЛИ ТипДанных = Тип("Дата") - ИЛИ ТипДанных = Тип("Неопределено") - ИЛИ ТипДанных = Тип("УникальныйИдентификатор") - ИЛИ ТипДанных = Тип("Null") - ИЛИ ТипДанных = Тип("Тип") - ИЛИ ТипДанных = Тип("ХранилищеЗначения") - ИЛИ ТипДанных = Тип("ОбщийМодуль") - ИЛИ ТипДанных = Тип("ОбъектМетаданных") - ИЛИ ТипДанных = Тип("ТипЗначенияXDTO") - ИЛИ ТипДанных = Тип("ТипОбъектаXDTO") - ИЛИ ЭтоСсылка(ТипДанных) Тогда - - Возврат; - КонецЕсли; - КонецЕсли; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в функции ФиксированныеДанные общего модуля ОбщегоНазначения. - |Данные типа ""%1"" не могут быть зафиксированы.'"), - Строка(ТипДанных) ); КонецПроцедуры -Процедура ДобавитьИсключенияПоискаСсылок(Результат, МассивИсключений) - Для Каждого ЭлементМассива Из МассивИсключений Цикл - Если ТипЗнч(ЭлементМассива) = Тип("Строка") Тогда - ЭлементМетаданные = Метаданные.НайтиПоПолномуИмени(ЭлементМассива); - Иначе - ЭлементМетаданные = ЭлементМассива; - КонецЕсли; - - РодительМетаданные = ЭлементМетаданные.Родитель(); - - // Регистрация исключаемого объекта метаданных целиком (всех ссылок, которые он может содержать). - Если ТипЗнч(РодительМетаданные) = Тип("ОбъектМетаданныхКонфигурация") Тогда - Результат.Вставить(ЭлементМетаданные, "*"); - Продолжить; - КонецЕсли; - - // Регистрация исключаемого реквизита объекта метаданных. - ОтносительныйПутьКРеквизиту = ЭлементМетаданные.Имя; - РодительРодителя = РодительМетаданные.Родитель(); - Пока ТипЗнч(РодительРодителя) <> Тип("ОбъектМетаданныхКонфигурация") Цикл - ОтносительныйПутьКРеквизиту = РодительМетаданные.Имя + "." + ОтносительныйПутьКРеквизиту; - РодительМетаданные = РодительРодителя; - РодительРодителя = РодительМетаданные.Родитель(); - КонецЦикла; - - ПутиКРеквизитам = Результат.Получить(РодительМетаданные); - Если ПутиКРеквизитам = "*" Тогда - Продолжить; // - Пропуск, если весь объект метаданных уже исключен. - ИначеЕсли ПутиКРеквизитам = Неопределено Тогда - ПутиКРеквизитам = Новый Массив; - КонецЕсли; - ПутиКРеквизитам.Добавить(ОтносительныйПутьКРеквизиту); - - Результат.Вставить(РодительМетаданные, ПутиКРеквизитам); - КонецЦикла; -КонецПроцедуры - -// Возвращает строку ключа настроек, не превышающую допустимую длину. -// Проверяет длину строки на входе и, в случае превышения 128, преобразует ее конец по алгоритму MD5 в короткий -// вариант, в результате чего строка становится длиной 128 символов. -// Если исходная строка менее 128 символов, она возвращается в неизменном виде. +// Возвращает строку ключа настроек, не превышающую допустимую длину 128 символов. +// Если указанная строка превышает 128, тогда вместо символов сверх 96 символов +// добавляется их хеш-сумма по алгоритму MD5 размером 32 символа. // // Параметры: // Строка - Строка - строка произвольной длины. // +// Возвращаемое значение: +// Строка - не более 128 символов. +// Функция КлючНастроек(Знач Строка) - Результат = Строка; - Если СтрДлина(Строка) > 128 Тогда // Ключ более 128 символов вызовет исключение при обращении к хранилищу настроек. - Результат = Лев(Строка, 96); - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Сред(Строка, 97)); - Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - КонецЕсли; - Возврат Результат; + Возврат СократитьСтрокуКонтрольнойСуммой(Строка, 128); КонецФункции -// Возвращает серверный модуль менеджера по имени объекта. -Функция СерверныйМодульМенеджера(Имя) - ОбъектНайден = Ложь; - - ЧастиИмени = СтрРазделить(Имя, "."); - Если ЧастиИмени.Количество() = 2 Тогда - - ИмяВида = ВРег(ЧастиИмени[0]); - ИмяОбъекта = ЧастиИмени[1]; - - Если ИмяВида = ВРег(ИмяТипаКонстанты()) Тогда - Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыСведений()) Тогда - Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыНакопления()) Тогда - Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыБухгалтерии()) Тогда - Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыРасчета()) Тогда - Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаСправочники()) Тогда - Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаДокументы()) Тогда - Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаОтчеты()) Тогда - Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаОбработки()) Тогда - Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаБизнесПроцессы()) Тогда - Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаЖурналыДокументов()) Тогда - Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаЗадачи()) Тогда - Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыСчетов()) Тогда - Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыОбмена()) Тогда - Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыВидовХарактеристик()) Тогда - Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыВидовРасчета()) Тогда - Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда - ОбъектНайден = Истина; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если Не ОбъектНайден Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Объект метаданных ""%1"" не найден, - |либо для него не поддерживается получение модуля менеджера.'"), Имя); - КонецЕсли; - - Модуль = Вычислить(Имя); // ВычислитьВБезопасномРежиме не требуется, т.к. проверка надежная. - - Возврат Модуль; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Получить файл из Интернета по протоколу http(s), либо ftp и сохранить его во временный файл. -// -// Параметры: -// URL - Строка - url файла в формате. -// [Протокол://]<Сервер>/<Путь к файлу на сервере>. -// ПараметрыПолучения - Структура со свойствами. -// ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. -// Пользователь - Строка - пользователь от имени которого установлено соединение. -// Пароль - Строка - пароль пользователя от которого установлено соединение. -// Порт - Число - порт сервера с которым установлено соединение. -// ЗащищенноеСоединение - Булево - для случая http загрузки флаг указывает, -// что соединение должно производиться через https. -// ПассивноеСоединение - Булево - для случая ftp загрузки флаг указывает, -// что соединение должно пассивным (или активным). -// ВозвращаемоеЗначение - (выходной параметр). -// Структура, со свойствами. -// Статус - Булево - ключ присутствует в структуре всегда, значения. -// Истина - вызов функции успешно завершен. -// Ложь - вызов функции завершен неудачно. -// Путь - Строка - путь к файлу на сервере, ключ используется только -// если статус Истина. -// СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь. -// -Процедура ПриСкачиванииФайлаНаСервере(Знач Адрес, Знач ПараметрыПолучения, ВозвращаемоеЗначение) - - Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернета = ОбщийМодуль("ПолучениеФайловИзИнтернета"); - ВозвращаемоеЗначение = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Адрес, ПараметрыПолучения); - КонецЕсли; - -КонецПроцедуры - -// Устанавливает разделение сеанса. -// -// Параметры: -// Использование - Булево - Использование разделителя ОбластьДанных в сеансе. -// ОбластьДанных - Число - Значение разделителя ОбластьДанных. -// -Процедура ПриУстановкеРазделенияСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) - - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Использование, ОбластьДанных); - КонецЕсли; - -КонецПроцедуры - -// Возвращает значение разделителя текущей области данных. -// В случае если значение не установлено выдается ошибка. -// -// Параметры: -// ЗначениеРазделителя - Значение разделителя текущей области данных. Возвращаемый параметр. -// -Процедура ПриПолученииЗначенияРазделителяСеанса(ЗначениеРазделителя) - - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - ЗначениеРазделителя = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - -КонецПроцедуры - -// Возвращает флаг использования разделителя ОбластьДанных для текущего сеанса. -// -// Параметры: -// ИспользованиеРазделителя - Булево - Истина разделение используется, иначе нет. Возвращаемый параметр. -// -Процедура ПриПолученииИспользованияРазделителяСеанса(ИспользованиеРазделителя) - - Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); - ИспользованиеРазделителя = МодульРаботаВМоделиСервиса.ИспользованиеРазделителяСеанса(); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции по замене ссылок. @@ -6983,6 +6711,7 @@ Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику; Если Действие = "Запись" Тогда + Если РежимЗаписи = Неопределено Тогда Объект.Записать(); Иначе @@ -7005,6 +6734,7 @@ КонецЕсли; ИначеЕсли Действие = "НепосредственноеУдаление" Тогда + Объект.Удалить(); КонецЕсли; @@ -7073,7 +6803,8 @@ // Для последовательностей право "Изменение" может отсутствовать даже у роли "АдминистраторСистемы". Если ЭтоПоследовательность(МетаданныеОбъекта) И Не ПравоДоступа("Изменение", МетаданныеОбъекта) - И ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().ЭтоАдминистраторПрограммы Тогда + И Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда + УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -7464,16 +7195,31 @@ Иначе Информация.Технический = Ложь; Если Не Кэш.Свойство("МодельСервиса") Тогда - Кэш.Вставить("МодельСервиса", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + Кэш.Вставить("МодельСервиса", РазделениеВключено()); Если Кэш.МодельСервиса Тогда - Кэш.Вставить("ВОбластиДанных", ИспользованиеРазделителяСеанса()); - Кэш.Вставить("РазделительОсновныхДанных", ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()); - Кэш.Вставить("РазделительВспомогательныхДанных", ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + РазделительОсновныхДанных = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных(); + РазделительВспомогательныхДанных = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных(); + Иначе + РазделительОсновныхДанных = Неопределено; + РазделительВспомогательныхДанных = Неопределено; + КонецЕсли; + + Кэш.Вставить("ВОбластиДанных", РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных()); + Кэш.Вставить("РазделительОсновныхДанных", РазделительОсновныхДанных); + Кэш.Вставить("РазделительВспомогательныхДанных", РазделительВспомогательныхДанных); КонецЕсли; КонецЕсли; Если Кэш.МодельСервиса Тогда - Информация.Разделенный = ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных, Кэш.РазделительОсновныхДанных) - Или ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных, Кэш.РазделительВспомогательныхДанных); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных); + Иначе + ЭтоРазделенныйОбъектМетаданных = Истина; + КонецЕсли; + Информация.Разделенный = ЭтоРазделенныйОбъектМетаданных; КонецЕсли; КонецЕсли; @@ -7551,4 +7297,387 @@ Возврат Результат; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции. + +Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасноеХранилищеДанных, Ключ) + + Результат = Новый Структура(Ключ); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | БезопасноеХранилищеДанных.Данные КАК Данные + |ИЗ + | РегистрСведений." + ИмяБезопасноеХранилищеДанных + " КАК БезопасноеХранилищеДанных + |ГДЕ + | БезопасноеХранилищеДанных.Владелец = &Владелец"; + + Запрос.УстановитьПараметр("Владелец", Владелец); + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + + Если РезультатЗапроса.Следующий() Тогда + Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда + СохраненныеДанные = РезультатЗапроса.Данные.Получить(); + Если ЗначениеЗаполнено(СохраненныеДанные) Тогда + ЗаполнитьЗначенияСвойств(Результат, СохраненныеДанные); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь) + + ТипДанных = ТипЗнч(Данные); + + Если ТипДанных = Тип("ХранилищеЗначения") + ИЛИ ТипДанных = Тип("ФиксированныйМассив") + ИЛИ ТипДанных = Тип("ФиксированнаяСтруктура") + ИЛИ ТипДанных = Тип("ФиксированноеСоответствие") Тогда + + Возврат; + КонецЕсли; + + Если ДанныеВЗначенииФиксированныхТипов Тогда + + Если ТипДанных = Тип("Булево") + ИЛИ ТипДанных = Тип("Строка") + ИЛИ ТипДанных = Тип("Число") + ИЛИ ТипДанных = Тип("Дата") + ИЛИ ТипДанных = Тип("Неопределено") + ИЛИ ТипДанных = Тип("УникальныйИдентификатор") + ИЛИ ТипДанных = Тип("Null") + ИЛИ ТипДанных = Тип("Тип") + ИЛИ ТипДанных = Тип("ХранилищеЗначения") + ИЛИ ТипДанных = Тип("ОбщийМодуль") + ИЛИ ТипДанных = Тип("ОбъектМетаданных") + ИЛИ ТипДанных = Тип("ТипЗначенияXDTO") + ИЛИ ТипДанных = Тип("ТипОбъектаXDTO") + ИЛИ ЭтоСсылка(ТипДанных) Тогда + + Возврат; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции ФиксированныеДанные общего модуля ОбщегоНазначения. + |Данные типа ""%1"" не могут быть зафиксированы.'"), + Строка(ТипДанных) ); + +КонецПроцедуры + +// Возвращает серверный модуль менеджера по имени объекта. +Функция СерверныйМодульМенеджера(Имя) + ОбъектНайден = Ложь; + + ЧастиИмени = СтрРазделить(Имя, "."); + Если ЧастиИмени.Количество() = 2 Тогда + + ИмяВида = ВРег(ЧастиИмени[0]); + ИмяОбъекта = ЧастиИмени[1]; + + Если ИмяВида = ВРег("Константы") Тогда + Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("РегистрыСведений") Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("РегистрыНакопления") Тогда + Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("РегистрыБухгалтерии") Тогда + Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("РегистрыРасчета") Тогда + Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("Справочники") Тогда + Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("Документы") Тогда + Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("Отчеты") Тогда + Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("Обработки") Тогда + Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("БизнесПроцессы") Тогда + Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("ЖурналыДокументов") Тогда + Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("Задачи") Тогда + Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("ПланыСчетов") Тогда + Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("ПланыОбмена") Тогда + Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("ПланыВидовХарактеристик") Тогда + Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег("ПланыВидовРасчета") Тогда + Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Не ОбъектНайден Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект метаданных ""%1"" не найден, + |либо для него не поддерживается получение модуля менеджера.'"), Имя); + КонецЕсли; + + Модуль = Вычислить(Имя); // ВычислитьВБезопасномРежиме не требуется, т.к. проверка надежная. + + Возврат Модуль; +КонецФункции + +// Проверяет, что переданное имя ИмяПроцедуры является именем экспортной процедуры конфигурации. +// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма +// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить и Вычислить +// при их использовании для динамического вызова методов код конфигурации. +// +// В случае если переданная строка не является именем процедуры конфигурации, генерируется исключение. +// +// Предназначена для вызова из см. процедуру ВыполнитьМетодКонфигурации. +// +// Параметры: +// ИмяПроцедуры - Строка - проверяемое имя экспортной процедуры. +// +Процедура ПроверитьИмяПроцедурыКонфигурации(Знач ИмяПроцедуры) + + ЧастиИмени = СтрРазделить(ИмяПроцедуры, "."); + Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра ИмяПроцедуры (передано значение: ""%1"") в ОбщегоНазначения.ВыполнитьМетодКонфигурации'"), ИмяПроцедуры); + КонецЕсли; + + ИмяОбъекта = ЧастиИмени[0]; + Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра ИмяПроцедуры (передано значение: ""%1"") в ОбщегоНазначения.ВыполнитьМетодКонфигурации: + |Не найден общий модуль ""%2"".'"), + ИмяПроцедуры, + ИмяОбъекта); + КонецЕсли; + + Если ЧастиИмени.Количество() = 3 Тогда + ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; + Попытка + Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); + Исключение + Менеджер = Неопределено; + КонецПопытки; + Если Менеджер = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра ИмяПроцедуры (передано значение: ""%1"") в ОбщегоНазначения.ВыполнитьМетодКонфигурации: + |Не найден менеджер объекта ""%2"".'"), + ИмяПроцедуры, + ПолноеИмяОбъекта); + КонецЕсли; + КонецЕсли; + + ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; + ВременнаяСтруктура = Новый Структура; + Попытка + // Проверка того, что ИмяПроцедуры является допустимым идентификатором. + // Например: МояПроцедура. + ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра ИмяПроцедуры (передано значение: ""%1"") в ОбщегоНазначения.ВыполнитьМетодКонфигурации: + |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), + ИмяПроцедуры, ИмяМетодаОбъекта); + КонецПопытки; + +КонецПроцедуры + +// Возвращает менеджер объекта по имени. +// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". +// +// Возвращаемое значение: +// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... +// +Функция МенеджерОбъектаПоИмени(Имя) + Перем КлассОМ, ИмяОМ, Менеджер; + + ЧастиИмени = СтрРазделить(Имя, "."); + + Если ЧастиИмени.Количество() > 0 Тогда + КлассОМ = ВРег(ЧастиИмени[0]); + КонецЕсли; + + Если ЧастиИмени.Количество() > 1 Тогда + ИмяОМ = ЧастиИмени[1]; + КонецЕсли; + + Если КлассОМ = "ПЛАНОБМЕНА" + Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда + Менеджер = ПланыОбмена; + + ИначеЕсли КлассОМ = "СПРАВОЧНИК" + Или КлассОМ = "СПРАВОЧНИКИ" Тогда + Менеджер = Справочники; + + ИначеЕсли КлассОМ = "ДОКУМЕНТ" + Или КлассОМ = "ДОКУМЕНТЫ" Тогда + Менеджер = Документы; + + ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" + Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда + Менеджер = ЖурналыДокументов; + + ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" + Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда + Менеджер = Перечисления; + + ИначеЕсли КлассОМ = "ОБЩИЙМОДУЛЬ" + Или КлассОМ = "ОБЩИЕМОДУЛИ" Тогда + + Возврат ОбщийМодуль(ИмяОМ); + + ИначеЕсли КлассОМ = "ОТЧЕТ" + Или КлассОМ = "ОТЧЕТЫ" Тогда + Менеджер = Отчеты; + + ИначеЕсли КлассОМ = "ОБРАБОТКА" + Или КлассОМ = "ОБРАБОТКИ" Тогда + Менеджер = Обработки; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда + Менеджер = ПланыВидовХарактеристик; + + ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" + Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда + Менеджер = ПланыСчетов; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" + Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда + Менеджер = ПланыВидовРасчета; + + ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" + Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда + Менеджер = РегистрыСведений; + + ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" + Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда + Менеджер = РегистрыНакопления; + + ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" + Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда + Менеджер = РегистрыБухгалтерии; + + ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" + Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда + + Если ЧастиИмени.Количество() < 3 Тогда + // Регистр расчета + Менеджер = РегистрыРасчета; + Иначе + КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); + Если ЧастиИмени.Количество() > 3 Тогда + ИмяПодчиненногоОМ = ЧастиИмени[3]; + КонецЕсли; + Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" + Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда + // Перерасчет + Попытка + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + ИмяОМ = ИмяПодчиненногоОМ; + Исключение + Менеджер = Неопределено; + КонецПопытки; + КонецЕсли; + КонецЕсли; + + ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" + Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда + Менеджер = БизнесПроцессы; + + ИначеЕсли КлассОМ = "ЗАДАЧА" + Или КлассОМ = "ЗАДАЧИ" Тогда + Менеджер = Задачи; + + ИначеЕсли КлассОМ = "КОНСТАНТА" + Или КлассОМ = "КОНСТАНТЫ" Тогда + Менеджер = Константы; + + ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" + Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда + Менеджер = Последовательности; + КонецЕсли; + + Если Менеджер <> Неопределено Тогда + Если ЗначениеЗаполнено(ИмяОМ) Тогда + Попытка + Возврат Менеджер[ИмяОМ]; + Исключение + Менеджер = Неопределено; + КонецПопытки; + Иначе + Возврат Менеджер; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); + +КонецФункции + +// Проверка существования макета по метаданным конфигурации и расширений. +// +// Параметры: +// ПолноеИмяМакета - Строка - полное имя макета. +// +// Возвращаемое значение: +// Булево - признак существования макета. +// +Функция МакетСуществует(ПолноеИмяМакета) + + Макет = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМакета); + Если ТипЗнч(Макет) = Тип("ОбъектМетаданных") Тогда + + Шаблон = Новый Структура("ТипМакета"); + ЗаполнитьЗначенияСвойств(Шаблон, Макет); + ТипМакета = Неопределено; + Если Шаблон.Свойство("ТипМакета", ТипМакета) Тогда + Возврат ТипМакета <> Неопределено; + КонецЕсли; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl index 71f8f3091..82438b42d 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl @@ -1,106 +1,51 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции для работы с данными в базе. -// Проверяет наличие ссылок на объект в базе данных. -// -// Параметры: -// Ссылка - ЛюбаяСсылка -// - Массив значений типа ЛюбаяСсылка. -// -// ИскатьСредиСлужебныхОбъектов - Булево - начальное значение Ложь, -// когда установлено Истина, тогда не будет учитываться -// исключения поиска ссылок, заданные при разработке конфигурации. -// -// Возвращаемое значение: -// Булево. -// +// См. ОбщегоНазначения.ЕстьСсылкиНаОбъект. Функция ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь) Экспорт Возврат ОбщегоНазначения.ЕстьСсылкиНаОбъект(СсылкаИлиМассивСсылок, ИскатьСредиСлужебныхОбъектов); КонецФункции -// Проверяет проведенность документов. -// -// Параметры: -// Документы - Массив - документы, проведенность которых необходимо проверить. -// -// Возвращаемое значение: -// Массив - непроведенные документы из массива Документы. -// +// См. ОбщегоНазначения.ПроверитьПроведенностьДокументов. Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт Возврат ОбщегоНазначения.ПроверитьПроведенностьДокументов(Документы); КонецФункции -// Выполняет попытку проведения документов. -// -// Параметры: -// Документы - Массив - документы, которые необходимо провести. -// -// Возвращаемое значение: -// Массив - массив структур с полями: -// Ссылка - документ, который не удалось провести; -// ОписаниеОшибки - текст описания ошибки при проведении. -// +// См. ОбщегоНазначения.ПровестиДокументы. Функция ПровестиДокументы(Документы) Экспорт Возврат ОбщегоНазначения.ПровестиДокументы(Документы); КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Общие процедуры и функции для работы в режиме разделения данных. - -// Устанавливает разделение сеанса. -// -// Параметры: -// Использование - Булево - Использование разделителя ОбластьДанных в сеансе. -// ОбластьДанных - Число - Значение разделителя ОбластьДанных. -// -Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт - - ОбщегоНазначения.УстановитьРазделениеСеанса(Использование, ОбластьДанных); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Сохранение, чтение и удаление настроек из хранилищ. -// Сохраняет настройку в хранилище общих настроек. -// -// Параметры: -// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить, -// подробнее - см. параметры процедуры ХранилищеСохранить(). -// -Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек = Неопределено, - ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +// См. ОбщегоНазначения.ХранилищеОбщихНастроекСохранить. +Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( КлючОбъекта, КлючНастроек, - Значение, + Настройки, ОписаниеНастроек, - ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); + ИмяПользователя); КонецПроцедуры -// Загружает настройку из хранилища общих настроек. -// -// Параметры: -// Соответствуют методу ХранилищеОбщихНастроек.Загрузить, -// подробнее - см. параметры функции ХранилищеЗагрузить(). -// -Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт +// См. ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить. +Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено) Экспорт Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( КлючОбъекта, @@ -111,154 +56,129 @@ КонецФункции -// Удаляет настройку из хранилища общих настроек. -// -// Параметры: -// Соответствуют методу ХранилищеОбщихНастроек.Удалить, -// подробнее - см. параметры функции ХранилищеУдалить(). -// +// См. ОбщегоНазначения.ХранилищеОбщихНастроекУдалить. Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры -// Сохраняет массив пользовательских настроек МассивСтруктур. -// Может применяться для случаев вызова с клиента. -// -// Параметры: -// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение". -// НужноОбновитьПовторноИспользуемыеЗначения - Булево - требуется обновить повторно используемые значения. -// -Процедура ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +// См. ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив. +Процедура ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт - ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, НужноОбновитьПовторноИспользуемыеЗначения); + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Сохраняет массив пользовательских настроек МассивСтруктур и обновляет повторно -// используемые значения. Может применяться для случаев вызова с клиента. -// -// Параметры: -// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение". -// -Процедура ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур) Экспорт - - ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур); - -КонецПроцедуры - -// Сохраняет настройку в хранилище общих настроек и обновляет повторно используемые -// значения. -// -// Параметры: -// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить, -// подробнее - см. параметры процедуры ХранилищеСохранить(). -// -Процедура ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение) Экспорт - - ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение); - -КонецПроцедуры - -// Сохраняет настройку в хранилище системных настроек. -// -// Параметры: -// Соответствуют методу ХранилищеСистемныхНастроек.Сохранить, -// подробнее - см. параметры процедуры ХранилищеСохранить(). -// -Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек = Неопределено, - ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +// См. ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить. +Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить( - КлючОбъекта, - КлючНастроек, - Значение, - ОписаниеНастроек, - ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); + КлючОбъекта, + КлючНастроек, + Настройки, + ОписаниеНастроек, + ИмяПользователя, + ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Загружает настройку из хранилища системных настроек. -// -// Параметры: -// Соответствуют методу ХранилищеСистемныхНастроек.Загрузить, -// подробнее - см. параметры функции ХранилищеЗагрузить(). -// +// См. ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить. Функция ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено) Экспорт Возврат ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить( - КлючОбъекта, - КлючНастроек, - ЗначениеПоУмолчанию, - ОписаниеНастроек, + КлючОбъекта, + КлючНастроек, + ЗначениеПоУмолчанию, + ОписаниеНастроек, ИмяПользователя); КонецФункции -// Удаляет настройку из хранилища системных настроек. -// -// Параметры: -// Соответствуют методу ХранилищеСистемныхНастроек.Удалить, -// подробнее - см. параметры функции ХранилищеУдалить(). -// +// См. ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить. Процедура ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры -// Сохраняет настройку в хранилище настроек данных форм. -// -// Параметры: -// Соответствуют методу ХранилищеСистемныхНастроек.Сохранить, -// подробнее - см. параметры процедуры ХранилищеСохранить(). -// -Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек = Неопределено, - ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт +// См. ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить. +Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено, + ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить( - КлючОбъекта, - КлючНастроек, - Значение, - ОписаниеНастроек, - ИмяПользователя, - НужноОбновитьПовторноИспользуемыеЗначения); + КлючОбъекта, + КлючНастроек, + Настройки, + ОписаниеНастроек, + ИмяПользователя, + ОбновитьПовторноИспользуемыеЗначения); КонецПроцедуры -// Загружает настройку из хранилища настроек данных форм. -// -// Параметры: -// Соответствуют методу ХранилищеСистемныхНастроек.Загрузить, -// подробнее - см. параметры функции ХранилищеЗагрузить(). -// -Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, - ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт +// См. ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить. +Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, + ОписаниеНастроек = Неопределено, + ИмяПользователя = Неопределено) Экспорт Возврат ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить( - КлючОбъекта, - КлючНастроек, - ЗначениеПоУмолчанию, - ОписаниеНастроек, + КлючОбъекта, + КлючНастроек, + ЗначениеПоУмолчанию, + ОписаниеНастроек, ИмяПользователя); КонецФункции -// Удаляет настройку из хранилища настроек данных форм. -// -// Параметры: -// Соответствуют методу ХранилищеНастроекДанныхФорм.Удалить, -// подробнее - см. параметры функции ХранилищеУдалить(). -// +// См. ОбщегоНазначения.ХранилищеНастроекДанныхФормУдалить. Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт ОбщегоНазначения.ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя); КонецПроцедуры +#Область УстаревшиеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции для работы в режиме разделения данных. + +// Устарела. Следует использовать РаботаВМоделиСервиса.УстановитьРазделениеСеанса. +Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Использование, ОбластьДанных); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Сохранение, чтение и удаление настроек из хранилищ. + +// Устарела. Следует использовать функцию ХранилищеОбщихНастроекСохранить. +Процедура ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур) Экспорт + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); + +КонецПроцедуры + +// Устарела. Следует использовать функцию ХранилищеОбщихНастроекСохранить. +Процедура ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, + КлючНастроек, Настройки) Экспорт + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки,,, Истина); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl index 997baf4f9..de12c4f6f 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Задает вопрос о продолжении действия, влекущего к потере изменений. // Процедура ПодтвердитьЗакрытиеФормыСейчас() Экспорт - ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеФормы(); + ОбщегоНазначенияСлужебныйКлиент.ПодтвердитьЗакрытиеФормы(); КонецПроцедуры @@ -17,7 +12,7 @@ // Процедура ПодтвердитьЗакрытиеПроизвольнойФормыСейчас() Экспорт - ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеПроизвольнойФормы(); + ОбщегоНазначенияСлужебныйКлиент.ПодтвердитьЗакрытиеПроизвольнойФормы(); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index 22034ce0c..a10bf6957 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -1,5 +1,4 @@ //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". // Клиентские процедуры и функции общего назначения: // - для работы со списками в формах; // - для работы с журналом регистрации; @@ -19,21 +18,21 @@ // Такая ситуация возможна, например, если в списке выделена строка группировки. // // Для использования в командах, работающих с элементами динамических списков в формах. -// Пример использования: +// +// Параметры: +// Параметр - Массив, ЛюбаяСсылка - параметр команды. +// ОжидаемыйТип - Тип - ожидаемый тип параметра. +// +// Возвращаемое значение: +// Булево - Истина, если параметр ожидаемого типа. +// +// Пример: // // Если НЕ ПроверитьТипПараметраКоманды(Элементы.Список.ВыделенныеСтроки, // Тип("ЗадачаСсылка.ЗадачаИсполнителя")) Тогда // Возврат; // КонецЕсли; // ... -// -// Параметры: -// Параметр - Массив или ссылочный тип - параметр команды. -// ОжидаемыйТип - Тип - ожидаемый тип параметра. -// -// Возвращаемое значение: -// Булево - Истина, если параметр ожидаемого типа. -// Функция ПроверитьТипПараметраКоманды(Знач Параметр, Знач ОжидаемыйТип) Экспорт Если Параметр = Неопределено Тогда @@ -66,8 +65,19 @@ // Погрешность обусловлена временем выполнения серверного вызова. // Предназначена для использования вместо функции ТекущаяДата(). // +// Возвращаемое значение: +// Дата - текущая дата сеанса. +// Функция ДатаСеанса() Экспорт - Возврат ТекущаяДата() + СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПоправкаКВремениСеанса; + + Если СтандартныеПодсистемыКлиент.ЗапускПрограммыЗавершен() Тогда + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); + Иначе + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + КонецЕсли; + + Возврат ТекущаяДата() + ПараметрыКлиента.ПоправкаКВремениСеанса; + КонецФункции // Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса. @@ -76,16 +86,36 @@ // Погрешность обусловлена временем выполнения серверного вызова. // Предназначена для использования вместо функции УниверсальноеВремя(). // +// Возвращаемое значение: +// Дата - универсальная дата сеанса. +// Функция ДатаУниверсальная() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); - ДатаСеанса = ТекущаяДата() + ПараметрыРаботыКлиента.ПоправкаКВремениСеанса; - Возврат ДатаСеанса + ПараметрыРаботыКлиента.ПоправкаКУниверсальномуВремени; + + Если СтандартныеПодсистемыКлиент.ЗапускПрограммыЗавершен() Тогда + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); + Иначе + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + КонецЕсли; + + ДатаСеанса = ТекущаяДата() + ПараметрыКлиента.ПоправкаКВремениСеанса; + Возврат ДатаСеанса + ПараметрыКлиента.ПоправкаКУниверсальномуВремени; + КонецФункции // Предлагает пользователю установить расширение работы с файлами в веб-клиенте. -// // Предназначена для использования в начале участков кода, в которых ведется работа с файлами. -// Например: +// +// Параметры: +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, +// которая будет вызвана после закрытия формы со следующими параметрами: +// РасширениеПодключено - Булево - Истина, если расширение было подключено. +// ДополнительныеПараметры - Произвольный - параметры, заданные в +// ОписаниеОповещенияОЗакрытии. +// ТекстПредложения - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. +// ВозможноПродолжениеБезУстановки - Булево - если Истина, будет показана кнопка ПродолжитьБезУстановки, +// если Ложь, будет показана кнопка Отмена. +// +// Пример: // // Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); // ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'"); @@ -99,22 +129,11 @@ // // код печати документа, который работает без подключенного расширения. // // ... // КонецЕсли; -// -// Параметры: -// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, -// которая будет вызвана после закрытия формы со следующими параметрами: -// РасширениеПодключено - Булево - Истина, если расширение было подключено. -// ДополнительныеПараметры - Произвольный - параметры, заданные в -// ОписаниеОповещенияОЗакрытии. -// ТекстПредложения - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. -// ВозможноПродолжениеБезУстановки - Булево - если Истина, будет показана кнопка ПродолжитьБезУстановки, -// если Ложь, будет показана кнопка Отмена. -// Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещенияОЗакрытии, ТекстПредложения = "", ВозможноПродолжениеБезУстановки = Истина) Экспорт ОписаниеОповещенияЗавершение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение", - ЭтотОбъект, ОписаниеОповещенияОЗакрытии); + ОбщегоНазначенияСлужебныйКлиент, ОписаниеОповещенияОЗакрытии); #Если Не ВебКлиент Тогда // В тонком и толстом клиентах расширение подключено всегда. @@ -128,25 +147,15 @@ ДополнительныеПараметры.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки); Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения", - ЭтотОбъект, ДополнительныеПараметры); + ОбщегоНазначенияСлужебныйКлиент, ДополнительныеПараметры); НачатьПодключениеРасширенияРаботыСФайлами(Оповещение); КонецПроцедуры // Предлагает пользователю подключить расширение работы с файлами в веб-клиенте, // и в случае отказа выдает предупреждение о невозможности продолжения операции. -// // Предназначена для использования в начале участков кода, в которых ведется работа с файлами // только при подключенном расширении. -// Например: -// -// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); -// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'"); -// ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстСообщения); -// -// Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт -// // код печати документа, рассчитывающий на то, что расширение подключено. -// // ... // // Параметры: // ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана, если расширение @@ -161,12 +170,22 @@ // Возвращаемое значение: // Булево - Истина, если расширение подключено. // +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); +// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'"); +// ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстСообщения); +// +// Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт +// // код печати документа, рассчитывающий на то, что расширение подключено. +// // ... Процедура ПроверитьРасширениеРаботыСФайламиПодключено(ОписаниеОповещенияОЗакрытии, Знач ТекстПредложения = "", Знач ТекстПредупреждения = "") Экспорт Параметры = Новый Структура("ОписаниеОповещенияОЗакрытии,ТекстПредупреждения", ОписаниеОповещенияОЗакрытии, ТекстПредупреждения, ); - Оповещение = Новый ОписаниеОповещения("ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение", ЭтотОбъект, Параметры); + Оповещение = Новый ОписаниеОповещения("ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение", + ОбщегоНазначенияСлужебныйКлиент, Параметры); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения); КонецПроцедуры @@ -174,7 +193,7 @@ // Возвращает пользовательскую настройку "Предлагать установку расширения работы с файлами". // // Возвращаемое значение: -// Булево +// Булево - Истина, если предлагать. // Функция ПредлагатьУстановкуРасширенияРаботыСФайлами() Экспорт @@ -188,7 +207,7 @@ // Сохраняет персональные настройки пользователя. // // Параметры: -// Структура со свойствами: +// Настройки - Структура - коллекция настроек: // * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - Признак необходимости // напоминания об установке расширения. // * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - Запрашивать подтверждение по завершении работы. @@ -204,6 +223,11 @@ СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", Настройки.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы); КонецЕсли; + + Если Настройки.Свойство("ПерсональныеНастройкиРаботыСФайлами") Тогда + СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("ПерсональныеНастройкиРаботыСФайлами", + Настройки.ПерсональныеНастройкиРаботыСФайлами); + КонецЕсли; КонецПроцедуры @@ -212,11 +236,15 @@ // для того чтобы регистрация вступила в силу. // // Вызывается перед клиентским кодом, который использует менеджер COM-соединений (V83.COMConnector) -// и инициируется интерактивными действиями пользователя. Например: +// и инициируется интерактивными действиями пользователя. // -// ЗарегистрироватьCOMСоединитель(); -// // далее идет код, использующий менеджер COM-соединений (V83.COMConnector). -// // ... +// Параметры: +// ВыполнитьПерезагрузкуСеанса - Булево - если Истина, то после регистрации компоненты будет вызван диалог перезапуска сеанса. +// +// Пример: +// ЗарегистрироватьCOMСоединитель(); +// // далее идет код, использующий менеджер COM-соединений (V83.COMConnector). +// // ... // Процедура ЗарегистрироватьCOMСоединитель(Знач ВыполнитьПерезагрузкуСеанса = Истина) Экспорт @@ -226,7 +254,7 @@ Возврат; КонецЕсли; - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиентаПриЗапуске.ЭтоБазоваяВерсияКонфигурации Или ПараметрыРаботыКлиентаПриЗапуске.ЭтоУчебнаяПлатформа Тогда @@ -252,7 +280,8 @@ ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"]); ПоказатьПредупреждение(,ТекстСообщения + Символы.ПС + НСтр("ru = 'Подробности см. в Журнале регистрации.'")); ИначеЕсли ВыполнитьПерезагрузкуСеанса Тогда - Оповещение = Новый ОписаниеОповещения("ЗарегистрироватьCOMСоединительЗавершение", ЭтотОбъект); + Оповещение = Новый ОписаниеОповещения("ЗарегистрироватьCOMСоединительЗавершение", + ОбщегоНазначенияСлужебныйКлиент); ТекстВопроса = НСтр("ru = 'Для завершения перерегистрации компоненты comcntr необходимо перезапустить программу. |Перезапустить сейчас?'"); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); @@ -264,6 +293,9 @@ // Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. // +// Возвращаемое значение: +// Булево - Истина, если подключен. +// Функция КлиентПодключенЧерезВебСервер() Экспорт Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы()), "WS=") = 1; @@ -289,7 +321,7 @@ // &НаКлиенте // Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) // Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); -// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, ЗавершениеРаботы, Отказ); +// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы); // КонецПроцедуры // // &НаКлиенте @@ -337,6 +369,7 @@ // Параметры: // Форма - УправляемаяФорма - форма, которая вызывает диалог предупреждения. // Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия. +// ЗавершениеРаботы - Булево - признак завершения работы программы. // ТекстПредупреждения - Строка - текст предупреждения, выводимый пользователю. // ИмяРеквизитаЗакрытьФормуБезПодтверждения - Строка - имя реквизита, содержащего в себе признак того, нужно // выводить предупреждение или нет. @@ -378,9 +411,10 @@ // Функция получает цвет стиля по имени элемента стиля. // // Параметры: -// ИмяЦветаСтиля - строка с именем элемента. +// ИмяЦветаСтиля - Строка - имя элемента стиля. // -// Возвращаемое значение - цвет стиля. +// Возвращаемое значение: +// Цвет - цвет стиля. // Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт @@ -391,9 +425,10 @@ // Функция получает шрифт стиля по имени элемента стиля. // // Параметры: -// ИмяШрифтаСтиля - строка с именем элемента. +// ИмяШрифтаСтиля - Строка - имя элемента стиля. // -// Возвращаемое значение - шрифт стиля. +// Возвращаемое значение: +// Шрифт - шрифт стиля. // Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт @@ -429,6 +464,88 @@ КонецПроцедуры +// Оповещает открытые формы и динамические списки об изменении одного объекта. +// +// Параметры: +// Источник - ЛюбаяСсылка, +// РегистрСведенийКлючЗаписи, +// РегистрНакопленияКлючЗаписи, +// РегистрБухгалтерииКлючЗаписи, +// РегистрРасчетаКлючЗаписи - ссылка измененного объекта или ключ измененной записи регистра, об изменении +// которой(го) необходимо уведомить динамические списки и формы. +// ДополнительныеПараметры - Произвольный - любые параметры, которые необходимо передать в методе Оповестить. +// +Процедура ОповеститьОбИзмененииОбъекта(Источник, Знач ДополнительныеПараметры = Неопределено) Экспорт + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(ТипЗнч(Источник)), ДополнительныеПараметры, Источник); + ОповеститьОбИзменении(Источник); +КонецПроцедуры + +// Оповещает открытые формы и динамические списки об изменении сразу нескольких объектов. +// +// Параметры: +// Источник - Тип, ОписаниеТипов - тип или типы объектов, об изменении которых необходимо уведомить +// динамические списки и формы; +// - Массив - список измененных ссылок и/или ключей записей регистров, об изменении +// которых необходимо уведомить динамические списки и формы. +// ДополнительныеПараметры - Произвольный - любые параметры, которые необходимо передать в методе Оповестить. +// +Процедура ОповеститьОбИзмененииОбъектов(Источник, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + + Если ТипЗнч(Источник) = Тип("Тип") Тогда + ОповеститьОбИзменении(Источник); + Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Источник), ДополнительныеПараметры); + ИначеЕсли ТипЗнч(Источник) = Тип("ОписаниеТипов") Тогда + Для Каждого Тип Из Источник.Типы() Цикл + ОповеститьОбИзменении(Тип); + Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Тип), ДополнительныеПараметры); + КонецЦикла; + ИначеЕсли ТипЗнч(Источник) = Тип("Массив") Тогда + Если Источник.Количество() = 1 Тогда + ОповеститьОбИзмененииОбъекта(Источник[0], ДополнительныеПараметры); + Иначе + ОповещаемыеТипы = Новый Соответствие; + Для Каждого Ссылка Из Источник Цикл + ОповещаемыеТипы.Вставить(ТипЗнч(Ссылка)); + КонецЦикла; + Для Каждого Тип Из ОповещаемыеТипы Цикл + ОповеститьОбИзменении(Тип.Ключ); + Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Тип.Ключ), ДополнительныеПараметры); + КонецЦикла; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Возвращает тип платформы клиента. +// +// Возвращаемое значение: +// ТипПлатформы, Неопределено - тип платформы на которой запущен клиент. В режиме веб-клиента, если тип +// платформы иной, чем описан в типе ТипПлатформы, то возвращается Неопределено. +// +Функция ТипПлатформыКлиента() Экспорт + + Возврат ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента(); + +КонецФункции + +// См. ОбщегоНазначения.ИнформационнаяБазаФайловая. +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Если Не ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда + Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; + КонецЕсли; + + Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая"); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для обработки событий и вызова необязательных подсистем. @@ -450,11 +567,16 @@ // КонецЕсли; // // Возвращаемое значение: -// Булево. +// Булево - Истина, если существует. // Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт - ИменаПодсистем = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ИменаПодсистем; + ИмяПараметра = "СтандартныеПодсистемы.ПодсистемыКонфигурации"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ИменаПодсистем = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ИменаПодсистем; + ПараметрыПриложения.Вставить(ИмяПараметра, ИменаПодсистем); + КонецЕсли; + ИменаПодсистем = ПараметрыПриложения[ИмяПараметра]; Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; КонецФункции @@ -462,12 +584,12 @@ // Возвращает ссылку на общий модуль по имени. // // Параметры: -// Имя - Строка - имя общего модуля, например: +// Имя - Строка - имя общего модуля, например: // "ОбщегоНазначения", // "ОбщегоНазначенияКлиент". // // Возвращаемое значение: -// ОбщийМодуль. +// ОбщийМодуль - общий модуль. // Функция ОбщийМодуль(Имя) Экспорт @@ -526,21 +648,21 @@ // // Параметры: // МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать. -// ФормаВладелец - УправляемаяФорма - форма, в поле которой выполняется ввод комментария. +// ФормаВладелец - УправляемаяФорма - форма, в поле которой выполняется ввод комментария. // ИмяРеквизита - Строка - имя реквизита формы, в который будет помещен введенный пользователем // комментарий. // Заголовок - Строка - текст, который необходимо отобразить в заголовке формы. // По умолчанию: "Комментарий". // -// Пример использования: -// -// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); +// Пример: +// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); // Процедура ПоказатьФормуРедактированияКомментария(Знач МногострочныйТекст, Знач ФормаВладелец, Знач ИмяРеквизита, Знач Заголовок = Неопределено) Экспорт ДополнительныеПараметры = Новый Структура("ФормаВладелец,ИмяРеквизита", ФормаВладелец, ИмяРеквизита); - Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект, ДополнительныеПараметры); + Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", + ОбщегоНазначенияСлужебныйКлиент, ДополнительныеПараметры); ЗаголовокФормы = ?(Заголовок <> Неопределено, Заголовок, НСтр("ru='Комментарий'")); ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, МногострочныйТекст, ЗаголовокФормы); @@ -551,239 +673,190 @@ // Проверяет, возможно ли выполнить резервное копирование в пользовательском режиме. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево - Истина, если предлагать. // Функция ПредлагатьСоздаватьРезервныеКопии() Экспорт Результат = Ложь; - - ОбработчикиСобытия = ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат); - - КонецЦикла; - + ИнтеграцияСтандартныхПодсистемКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат); Возврат Результат; КонецФункции // Предлагает пользователю создать резервную копию. -// Процедура ПредложитьПользователюСоздатьРезервнуюКопию() Экспорт - ОбработчикиСобытия = ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.БазоваяФункциональность\ПриПредложенииПользователюСоздатьРезервнуюКопию"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриПредложенииПользователюСоздатьРезервнуюКопию(); - - КонецЦикла; + ИнтеграцияСтандартныхПодсистемКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию(); КонецПроцедуры -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - //////////////////////////////////////////////////////////////////////////////// -// Получение обработчиков клиентских событий. +// Процедуры и функции для подключения и установки внешних компонент из макетов конфигурации. -// Возвращает обработчики указанного клиентского служебного события. -// -// Параметры: -// Событие - Строка, например, -// "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей". +// Возвращает структуру параметров для см. процедуру ПодключитьКомпонентуИзМакета. // // Возвращаемое значение: -// ФиксированныйМассив со значениями типа. -// ФиксированнаяСтруктура со свойствами: -// * Версия - Строка - версия обработчика, например, "2.1.3.4". Пустая строка, если не указана. -// * Модуль - ОбщийМодуль - серверный общий модуль. -// -Функция ОбработчикиСлужебногоСобытия(Событие) Экспорт +// Структура - коллекция параметров: +// * Кэшировать - Булево - (по умолчанию Истина) использовать механизм кэширования компонент на клиенте. +// * ПредложитьУстановить - Булево - (по умолчанию Истина) предлагать устанавливать и обновлять компоненту. +// * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать +// (только для веб клиента). +// +// Пример: +// +// ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); +// ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +Функция ПараметрыПодключенияКомпоненты() Экспорт - Возврат СтандартныеПодсистемыКлиентПовтИсп.ОбработчикиКлиентскогоСобытия(Событие, Истина); + Параметры = Новый Структура; + Параметры.Вставить("Кэшировать" , Истина); + Параметры.Вставить("ПредложитьУстановить", Истина); + Параметры.Вставить("ТекстПояснения" , ""); + + Возврат Параметры; КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения(Подключено, ДополнительныеПараметры) Экспорт +// Подключает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Компонента должна храниться в макете конфигурации в виде ZIP-архива. +// Для веб-клиента предлагается диалог, подсказывающий пользователю действия по установке. +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения о подключении со следующими параметрами: +// * Результат - Структура - результат подключения компоненты: +// ** Подключено - Булево - признак подключения. +// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. +// ПараметрыПодключения - Структура, Неопределено - см. функцию ПараметрыПодключенияКомпоненты. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект); +// +// ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); +// ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для оформления заявления на выпуск сертификата требуется +// |внешняя компонента «Криптография (CryptS)».'"); +// +// ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета(Оповещение, +// "CryptS", +// "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена", +// ПараметрыПодключения); +// +// &НаКлиенте +// Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт +// +// ПодключаемыйМодуль = Неопределено; +// +// Если Результат.Подключено Тогда +// ПодключаемыйМодуль = Результат.ПодключаемыйМодуль; +// Иначе +// Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда +// ПоказатьПредупреждение(, Результат.ОписаниеОшибки); +// КонецЕсли; +// КонецЕсли; +// +// Если ПодключаемыйМодуль <> Неопределено Тогда +// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты. +// КонецЕсли; +// +// ПодключаемыйМодуль = Неопределено; +// +// КонецПроцедуры +// +Процедура ПодключитьКомпонентуИзМакета(Оповещение, Идентификатор, ПолноеИмяМакета, + ПараметрыПодключения = Неопределено) Экспорт - // Если расширение и так уже подключено, незачем про него спрашивать. - Если Подключено Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется"); - Возврат; + Параметры = ПараметрыПодключенияКомпоненты(); + Если ПараметрыПодключения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыПодключения); КонецЕсли; - // В веб клиенте под MacOS расширение не доступно. - СистемнаяИнформация = Новый СистемнаяИнформация; - ЭтоMacКлиент = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64); - Если ЭтоMacКлиент Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение); - Возврат; - КонецЕсли; + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("Идентификатор" , Идентификатор); + Контекст.Вставить("Местоположение" , ПолноеИмяМакета); + Контекст.Вставить("Кэшировать" , Параметры.Кэшировать); + Контекст.Вставить("ПредложитьУстановить", Параметры.ПредложитьУстановить); + Контекст.Вставить("ТекстПояснения" , Параметры.ТекстПояснения); - ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"; - ПервоеОбращениеЗаСеанс = ПараметрыПриложения[ИмяПараметра] = Неопределено; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, ПредлагатьУстановкуРасширенияРаботыСФайлами()); - КонецЕсли; - ПредлагатьУстановкуРасширенияРаботыСФайлами = ПараметрыПриложения[ИмяПараметра] Или ПервоеОбращениеЗаСеанс; - - Если ДополнительныеПараметры.ВозможноПродолжениеБезУстановки И Не ПредлагатьУстановкуРасширенияРаботыСФайлами Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение); - Возврат; - КонецЕсли; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТекстПредложения", ДополнительныеПараметры.ТекстПредложения); - ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", ДополнительныеПараметры.ВозможноПродолжениеБезУстановки); - ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы,,,,,ДополнительныеПараметры.ОписаниеОповещенияЗавершение); + ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпоненту(Контекст); КонецПроцедуры -Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт +// Возвращает структуру параметров для см. процедуру УстановитьКомпонентуИзМакета. +// +// Возвращаемое значение: +// Структура - коллекция параметров: +// * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать +// (только для веб клиента). +// +// Пример: +// +// ПараметрыУстановки = ОбщегоНазначенияКлиент.ПараметрыУстановкиКомпоненты(); +// ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется +// |внешняя компонента «1С:Сканеры штрихкода (NativeApi)».'"); +// +Функция ПараметрыУстановкиКомпоненты() Экспорт - РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется"); -#Если ВебКлиент Тогда - Если Действие = "БольшеНеПредлагать" - Или Действие = "РасширениеПодключено" Тогда - СистемнаяИнформация = Новый СистемнаяИнформация(); - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( - "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Ложь); - КонецЕсли; -#КонецЕсли + Параметры = Новый Структура; + Параметры.Вставить("ТекстПояснения", ""); - ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено); + Возврат Параметры; -КонецПроцедуры +КонецФункции -Процедура ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт +// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Компонента должна храниться в макете конфигурации в виде ZIP-архива. +// +// Параметры: +// Оповещение - ОписаниеОповещения - Описание оповещения об установке внешней компоненты: +// * Результат - Структура - результат установки компоненты: +// ** Установлено - Булево - признак установки. +// ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. +// ПараметрыУстановки - Структура, Неопределено - см. функцию ПараметрыУстановкиКомпоненты. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект); +// +// ПараметрыУстановки = ОбщегоНазначенияКлиент.ПараметрыУстановкиКомпоненты(); +// ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для оформления заявления на выпуск сертификата требуется +// |внешняя компонента «Криптография (CryptS)».'"); +// +// ОбщегоНазначенияКлиент.УстановитьКомпонентуИзМакета(Оповещение, +// "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена", +// ПараметрыУстановки); +// +// &НаКлиенте +// Процедура УстановитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт +// +// Если Не Результат.Установлено И Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда +// ПоказатьПредупреждение(, Результат.ОписаниеОшибки); +// КонецЕсли; +// +// КонецПроцедуры +// +Процедура УстановитьКомпонентуИзМакета(Оповещение, ПолноеИмяМакета, ПараметрыУстановки = Неопределено) Экспорт - Если РасширениеПодключено Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗакрытии); - Возврат; + Параметры = ПараметрыУстановкиКомпоненты(); + Если ПараметрыУстановки <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыУстановки); КонецЕсли; - ТекстСообщения = ДополнительныеПараметры.ТекстПредупреждения; - Если ПустаяСтрока(ТекстСообщения) Тогда - ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не установлено расширение для веб-клиента 1С:Предприятие.'") - КонецЕсли; - ПоказатьПредупреждение(, ТекстСообщения); + Контекст = Новый Структура; + Контекст.Вставить("Оповещение" , Оповещение); + Контекст.Вставить("Местоположение", ПолноеИмяМакета); + Контекст.Вставить("ТекстПояснения", Параметры.ТекстПояснения); -КонецПроцедуры - -Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт - - Если ВведенныйТекст = Неопределено Тогда - Возврат; - КонецЕсли; - - РеквизитФормы = ДополнительныеПараметры.ФормаВладелец; - - ПутьКРеквизитуФормы = СтрРазделить(ДополнительныеПараметры.ИмяРеквизита, "."); - // Если реквизит вида "Объект.Комментарий" и т.п. - Если ПутьКРеквизитуФормы.Количество() > 1 Тогда - Для Индекс = 0 По ПутьКРеквизитуФормы.Количество() - 2 Цикл - РеквизитФормы = РеквизитФормы[ПутьКРеквизитуФормы[Индекс]]; - КонецЦикла; - КонецЕсли; - - РеквизитФормы[ПутьКРеквизитуФормы[ПутьКРеквизитуФормы.Количество() - 1]] = ВведенныйТекст; - ДополнительныеПараметры.ФормаВладелец.Модифицированность = Истина; - -КонецПроцедуры - -Процедура ЗарегистрироватьCOMСоединительЗавершение(Ответ, Параметры) Экспорт - - Если Ответ = КодВозвратаДиалога.Да Тогда - ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина); - ЗавершитьРаботуСистемы(Истина, Истина); - КонецЕсли; - -КонецПроцедуры - -Процедура ПодтвердитьЗакрытиеФормы() Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); - КонецЕсли; - - Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; - Если Параметры = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; - - Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект, Параметры); - Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда - ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); - Иначе - ТекстВопроса = Параметры.ТекстПредупреждения; - КонецЕсли; - - ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , - КодВозвратаДиалога.Нет); - -КонецПроцедуры - -Процедура ПодтвердитьЗакрытиеФормыЗавершение(Ответ, Параметры) Экспорт - - Если Ответ = КодВозвратаДиалога.Да Тогда - ВыполнитьОбработкуОповещения(Параметры.ОповещениеСохранитьИЗакрыть); - ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда - Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; - Форма.Модифицированность = Ложь; - Форма.Закрыть(); - Иначе - Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; - Форма.Модифицированность = Истина; - КонецЕсли; - -КонецПроцедуры - -Процедура ПодтвердитьЗакрытиеПроизвольнойФормы() Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); - КонецЕсли; - - Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; - Если Параметры = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; - РежимВопроса = РежимДиалогаВопрос.ДаНет; - - Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение", ЭтотОбъект, Параметры); - - ПоказатьВопрос(Оповещение, Параметры.ТекстПредупреждения, РежимВопроса); - -КонецПроцедуры - -Процедура ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение(Ответ, Параметры) Экспорт - - Форма = Параметры.Форма; - Если Ответ = КодВозвратаДиалога.Да - Или Ответ = КодВозвратаДиалога.ОК Тогда - Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Истина; - Если Параметры.ОписаниеОповещенияЗакрыть <> Неопределено Тогда - ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияЗакрыть); - КонецЕсли; - Форма.Закрыть(); - Иначе - Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Ложь; - КонецЕсли; + ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпоненту(Контекст); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl index f2d488ef2..5e5196a2e 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl @@ -1,33 +1,31 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// В этом модуле содержится реализация обработчиков модуля приложения. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняется перед интерактивным началом работы пользователя с областью данных или в локальном режиме. -// // Соответствует обработчику ПередНачаломРаботыСистемы. // // Параметры: // Параметры - Структура - структура со свойствами: -// Отказ - Булево - Возвращаемое значение. Если установить Истина, -// то работа программы будет прекращена. -// Перезапустить - Булево - Возвращаемое значение. Если установить Истина и параметр. -// Отказ тоже установлен в Истина, то выполняется перезапуск программы. -// ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл -// когда Отказ и Перезапустить установлены Истина. -// ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, -// блокирующего вход в программу, следует присвоить в этот параметр -// описание обработчика оповещения, который открывает окно. -// См. пример ниже. -// ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход -// в программу, то в обработке закрытия этого окна необходимо -// выполнить оповещение ОбработкаПродолжения. -// См. пример ниже. +// * Отказ - Булево - Возвращаемое значение. Если установить Истина, то работа программы будет прекращена. +// * Перезапустить - Булево - Возвращаемое значение. Если установить Истина, и параметр Отказ тоже установлен +// в Истина, то выполняется перезапуск программы. +// +// * ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл, когда Отказ +// и Перезапустить установлены Истина. // -// Пример открытия окна, блокирующего вход в программу: +// * ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, блокирующего вход в +// программу, следует присвоить в этот параметр описание обработчика +// оповещения, который открывает окно. Смотри пример ниже. +// +// * ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход в программу, то в обработке +// закрытия этого окна необходимо выполнить оповещение ОбработкаПродолжения. Смотри пример ниже. +// +// * Модули - Массив - ссылки на модули, в которых нужно вызвать эту же процедуру после возврата. +// Модули можно добавлять только в рамках вызова в процедуру переопределяемого модуля. +// Используется для упрощения реализации нескольких последовательных асинхронных вызовов +// в разные подсистемы. См. пример ИнтеграцияСтандартныхПодсистемКлиент.ПередНачаломРаботыСистемы. +// +// Пример: +// Следующий код открывает окно, блокирующее вход в программу. // // Если ОткрытьОкноПриЗапуске Тогда // Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ОткрытьОкно", ЭтотОбъект); @@ -53,47 +51,45 @@ КонецПроцедуры // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. -// // Соответствует обработчику ПриНачалеРаботыСистемы. // // Параметры: // Параметры - Структура - структура со свойствами: -// * Отказ - Булево - Возвращаемое значение. Если установить Истина, -// то работа программы будет прекращена. -// * Перезапустить - Булево - Возвращаемое значение. Если установить Истина и параметр. -// Отказ тоже установлен в Истина, то выполняется перезапуск программы. -// * ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл -// когда Отказ и Перезапустить установлены Истина. -// * ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, -// блокирующего вход в программу, следует присвоить в этот параметр -// описание обработчика оповещения, который открывает окно. -// См. пример выше (для обработчика ПередНачаломРаботыСистемы). -// * ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход -// в программу, то в обработке закрытия этого окна необходимо -// выполнить оповещение ОбработкаПродолжения. -// См. пример выше (для обработчика ПередНачаломРаботыСистемы). +// * Отказ - Булево - Возвращаемое значение. Если установить Истина, то работа программы будет прекращена. +// * Перезапустить - Булево - Возвращаемое значение. Если установить Истина и параметр Отказ тоже установлен +// в Истина, то выполняется перезапуск программы. +// +// * ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл +// когда Отказ и Перезапустить установлены Истина. +// +// * ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, блокирующего вход +// в программу, следует присвоить в этот параметр описание обработчика оповещения, +// который открывает окно. См. пример в ПередНачаломРаботыСистемы. +// +// * ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход в программу, то в +// обработке закрытия этого окна необходимо выполнить оповещение ОбработкаПродолжения. +// См. пример в ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. // Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + + - - + КонецПроцедуры -// Обработать параметры запуска программы. -// Реализация функции может быть расширена для обработки новых параметров. +// Вызывается для обработки собственных параметров запуска программы, +// передаваемых с помощью ключа командной строки /C, например: 1cv8.exe ... /CРежимОтладки;ОткрытьИЗакрыть. // // Параметры: -// ЗначениеПараметраЗапуска - Строка - первое значение параметра запуска, -// до первого символа ";". -// ПараметрыЗапуска - Строка - параметр запуска, переданный в конфигурацию -// с помощью ключа командной строки /C. -// Отказ - Булево - Возвращаемое значение. Если установить Истина, -// то выполнение процедуры ПриНачалеРаботыСистемы будет прервано. +// ПараметрыЗапуска - Массив - массив строк разделенных символом ";" в параметре запуска, +// переданным в конфигурацию с помощью ключа командной строки /C. +// Отказ - Булево - если установить Истина, то запуск будет прерван. // -Процедура ПриОбработкеПараметровЗапуска(ЗначениеПараметраЗапуска, ПараметрыЗапуска, Отказ) Экспорт - +Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт + КонецПроцедуры // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. @@ -104,8 +100,7 @@ // Начальная страница (рабочий стол) в этот момент еще не открыта, поэтому запрещено открывать // формы напрямую, а следует использовать для этих целей обработчик ожидания. // Запрещено использовать это событие для интерактивного взаимодействия с пользователем -// (ПоказатьВопрос и аналогичные действия). Для этих целей следует использовать -// событие ПриНачалеРаботыСистемы, который поддерживает продолжение своего выполнения. +// (ПоказатьВопрос и аналогичные действия). Для этих целей следует размещать код в процедуре ПриНачалеРаботыСистемы. // Процедура ПослеНачалаРаботыСистемы() Экспорт @@ -113,24 +108,43 @@ // Выполняется перед интерактивном завершении работы пользователя с областью данных или в локальном режиме. // Соответствует обработчику ПередЗавершениемРаботыСистемы. -// Доопределяет список предупреждений пользователю перед завершением работы системы. +// Позволяет определить список предупреждений, выводимых пользователю перед завершением работы. // // Параметры: -// Отказ - Булево - Признак отказа от выхода из программы. Если в теле процедуры-обработчика установить -// данному параметру значение Истина, то работа с программой не будет завершена. -// Предупреждения - Массив - в массив можно добавить элементы типа Структура, -// свойства которой см. в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. -// +// Отказ - Булево - если установить данному параметру значение Истина, то работа с программой не будет +// завершена. +// Предупреждения - Массив - добавить элементы типа Структура, свойства которой описывают внешний вид предупреждения, +// а также дальнейшие действия. +// См. описание свойств в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. // Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт КонецПроцедуры -// Переопределяет заголовок приложения. +// Позволяет переопределить заголовок программы. // // Параметры: -// ЗаголовокПриложения - Строка - текст заголовка приложения; -// ПриЗапуске - Булево - Истина, если вызывается при начале работы программы. +// ЗаголовокПриложения - Строка - текст заголовка программы; +// ПриЗапуске - Булево - Истина, если вызывается при начале работы программы. +// В этом случае недопустимо вызывать те серверные функции конфигурации, +// которые рассчитывают на то, что запуск уже полностью завершен. +// Например, вместо СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента +// следует вызывать СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске. +// +// Пример: +// Для того чтобы в начале заголовка программы вывести название текущего проекта, следует определить параметр +// ТекущийПроект в процедуре ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента и вписать следующий код: +// +// Если ПриЗапуске Тогда +// Возврат; +// КонецЕсли; +// ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); +// ТекущийПроект = Неопределено; +// Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных И ПараметрыКлиента.Свойство("ТекущийПроект", ТекущийПроект) +// И Не ПараметрыКлиента.ТекущийПроект.Пустая() Тогда +// ЗаголовокПриложения = Строка(ПараметрыКлиента.ТекущийПроект) + " / " + ЗаголовокПриложения; +// КонецЕсли; +// Процедура ПриУстановкеЗаголовкаКлиентскогоПриложения(ЗаголовокПриложения, ПриЗапуске) Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl index a0242e49e..a93aba7b9 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl @@ -1,35 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Клиентские процедуры и функции общего назначения. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает Истина, если это веб клиент в Mac OS. -Функция ЭтоВебКлиентПодMacOS() Экспорт - -#Если Не ВебКлиент Тогда - Возврат Ложь; // Только в веб клиенте этот код работает. -#КонецЕсли - - СистемнаяИнфо = Новый СистемнаяИнформация; - Если СтрНайти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Macintosh") <> 0 Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Возвращает тип платформы клиента. -Функция ТипПлатформыКлиента() Экспорт - СистемнаяИнфо = Новый СистемнаяИнформация; - Возврат СистемнаяИнфо.ТипПлатформы; -КонецФункции - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции // Функция получает цвет стиля по имени элемента стиля. @@ -60,4 +28,26 @@ КонецФункции +// См. ОбщегоНазначенияКлиентСервер.ЭтоВебКлиентПодMacOS(). +Функция ЭтоВебКлиентПодMacOS() Экспорт + +#Если Не ВебКлиент Тогда + Возврат Ложь; // Только в веб клиенте этот код работает. +#КонецЕсли + + СистемнаяИнфо = Новый СистемнаяИнформация; + Если СтрНайти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Macintosh") <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// См. ОбщегоНазначенияКлиент.ТипПлатформыКлиента(). +Функция ТипПлатформыКлиента() Экспорт + СистемнаяИнфо = Новый СистемнаяИнформация; + Возврат СистемнаяИнфо.ТипПлатформы; +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index e0336923c..95b734c64 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -1,5 +1,4 @@ //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". // Клиентские и серверные процедуры и функции общего назначения: // - для поддержки формирования печатных форм; // - для работы с файлами; @@ -15,46 +14,43 @@ // Формирует и выводит сообщение, которое может быть связано с элементом // управления формы. // -// Параметры +// Параметры: // ТекстСообщенияПользователю - Строка - текст сообщения. -// КлючДанных - ЛюбаяСсылка - на объект информационной базы. -// Ссылка на объект информационной базы, к которому это сообщение относится, -// или ключ записи. +// КлючДанных - ЛюбаяСсылка - объект или ключ записи информационной базы, к которому это сообщение относится. // Поле - Строка - наименование реквизита формы. // ПутьКДанным - Строка - путь к данным (путь к реквизиту формы). -// Отказ - Булево - Выходной параметр. -// Всегда устанавливается в значение Истина. +// Отказ - Булево - выходной параметр, всегда устанавливается в значение Истина. // -// Пример: +// Пример: // -// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "ПолеВРеквизитеФормыОбъект", -// "Объект"); +// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ПолеВРеквизитеФормыОбъект", +// "Объект"); // -// Альтернативный вариант использования в форме объекта: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "Объект.ПолеВРеквизитеФормыОбъект"); +// Альтернативный вариант использования в форме объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "Объект.ПолеВРеквизитеФормыОбъект"); // -// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "ИмяРеквизитаФормы"); +// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ИмяРеквизитаФормы"); // -// 3. Для вывода сообщения связанного с объектом информационной базы. -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ); +// 3. Для вывода сообщения связанного с объектом информационной базы: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ); // -// 4. Для вывода сообщения по ссылке на объект информационной базы. -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ); +// 4. Для вывода сообщения по ссылке на объект информационной базы: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ); // -// Случаи некорректного использования: -// 1. Передача одновременно параметров КлючДанных и ПутьКДанным. -// 2. Передача в параметре КлючДанных значения типа отличного от допустимых. -// 3. Установка ссылки без установки поля (и/или пути к данным). +// Случаи некорректного использования: +// 1. Передача одновременно параметров КлючДанных и ПутьКДанным. +// 2. Передача в параметре КлючДанных значения типа отличного от допустимых. +// 3. Установка ссылки без установки поля (и/или пути к данным). // Процедура СообщитьПользователю( Знач ТекстСообщенияПользователю, @@ -93,9 +89,11 @@ КонецПроцедуры -// Добавляет в список ошибок новую ошибку пользователя для дальнейшей отправки -// с помощью процедуры СообщитьОшибкиПользователю(). -// Используется в процедурах ОбработкаПроверкиЗаполнения. +// Добавляет в список ошибок новую ошибку пользователя для дальнейшей отправки с помощью +// процедуры СообщитьОшибкиПользователю(). +// Предназначена для накопления списка ошибок с последующей обработкой этого списка перед тем, как вывести +// пользователю. Полученный список ошибок можно, например, отсортировать по важности, очистить от дублей, +// а также вывести пользователю в ином виде, чем выводит метод СообщитьПользователю, например, в табличный документ. // // Параметры: // Ошибки - Неопределено - будет создан новый список, @@ -154,12 +152,12 @@ КонецПроцедуры -// Сообщает ошибки добавленные с помощью процедуры ДобавитьОшибкуПользователю(). +// Выводит накопленные методом ДобавитьОшибкуПользователю ошибки, при этом использует нужные шаблоны текстов ошибок +// в зависимости от количества однотипных ошибок. // // Параметры: -// Ошибки - Неопределено - возврат, -// значение, установленное при использовании процедуры ДобавитьОшибкуПользователю(). -// Отказ - Булево, устанавливается Истина, если ошибки сообщались. +// Ошибки - Неопределено, Структура - коллекция ошибок. +// Отказ - Булево - устанавливается Истина, если ошибки сообщались. // Процедура СообщитьОшибкиПользователю(Ошибки, Отказ = Ложь) Экспорт @@ -295,10 +293,9 @@ // // Параметры: // МассивПриемник - Массив - массив, в который необходимо добавить значения. -// МассивИсточник - Массив - массив значений для заполнения, -// ТолькоУникальныеЗначения - булево, необязательный, если истина, -// то в массив будут включены только те значения, которых в нем еще нет, причем единожды. -// +// МассивИсточник - Массив - массив значений для заполнения. +// ТолькоУникальныеЗначения - Булево - если истина, то в массив будут включены только уникальные значения. +// Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт Если ТолькоУникальныеЗначения Тогда @@ -383,7 +380,7 @@ // ИмяРеквизита - Строка - имя реквизита или свойства. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если есть. // Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт @@ -402,17 +399,15 @@ // ИдентификаторПользовательскойНастройки - Строка - идентификатор настройки; // Значение - Произвольный - значение, которое требуется удалить из списка оформления. // -Процедура СнятьУсловноеОформлениеСпискаЗначений( - УсловноеОформление, - Знач ИдентификаторПользовательскойНастройки, - Знач Значение) Экспорт +Процедура СнятьУсловноеОформлениеСпискаЗначений(УсловноеОформление, Знач ИдентификаторПользовательскойНастройки, + Знач Значение) Экспорт - Для каждого ЭлементУО Из УсловноеОформление.Элементы Цикл - Если ЭлементУО.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда - Если ЭлементУО.Отбор.Элементы.Количество() = 0 Тогда + Для каждого ЭлементУсловногоОформления Из УсловноеОформление.Элементы Цикл + Если ЭлементУсловногоОформления.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда + Если ЭлементУсловногоОформления.Отбор.Элементы.Количество() = 0 Тогда Возврат; КонецЕсли; - ЭлементСписокОтбора = ЭлементУО.Отбор.Элементы[0]; + ЭлементСписокОтбора = ЭлементУсловногоОформления.Отбор.Элементы[0]; Если ЭлементСписокОтбора.ПравоеЗначение = Неопределено Тогда Возврат; КонецЕсли; @@ -499,7 +494,8 @@ // Массив - Массив - массив произвольных значений. // // Возвращаемое значение: -// Массив; +// Массив - коллекция уникальных элементов. +// Функция СвернутьМассив(Массив) Экспорт Результат = Новый Массив; ДополнитьМассив(Результат, Массив, Истина); @@ -580,10 +576,10 @@ // Преобразует РасписаниеРегламентногоЗадания в структуру. // // Параметры: -// Расписание - РасписаниеРегламентногоЗадания -. +// Расписание - РасписаниеРегламентногоЗадания - исходное расписание. // // Возвращаемое значение: -// Структура. +// Структура - расписание в виде структуры. // Функция РасписаниеВСтруктуру(Знач Расписание) Экспорт @@ -607,10 +603,10 @@ // Преобразует структуру в РасписаниеРегламентногоЗадания. // // Параметры: -// СтруктураРасписания - Структура -. +// СтруктураРасписания - Структура - расписание в виде структуры. // // Возвращаемое значение: -// РасписаниеРегламентногоЗадания. +// РасписаниеРегламентногоЗадания - расписание. // Функция СтруктураВРасписание(Знач СтруктураРасписания) Экспорт @@ -630,16 +626,17 @@ КонецФункции -// Создает копию экземпляра указанного объекта. +// Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно, +// с учетом типов дочерних элементов. При этом содержимое значений объектных типов +// (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект. // // Параметры: -// Источник - Произвольный - объект, который необходимо скопировать. +// Источник - Структура, Соответствие, Массив, СписокЗначений, ТаблицаЗначений - объект, который необходимо +// скопировать. // // Возвращаемое значение: -// Произвольный - копия объекта, переданного в параметре Источник. +// Структура, Соответствие, Массив, СписокЗначений, ТаблицаЗначений - копия объекта, переданного в параметре Источник. // -// Примечание: -// Функцию нельзя использовать для объектных типов (СправочникОбъект, ДокументОбъект и т.п.). Функция СкопироватьРекурсивно(Источник) Экспорт Перем Приемник; @@ -665,7 +662,9 @@ КонецФункции -// Создает копию значения типа Структура. +// Создает копию значения типа Структура, рекурсивно, с учетом типов значений свойств. +// Если свойства структуры содержат значения объектных типов (СправочникОбъект, ДокументОбъект и т.п.), +// то их содержимое не копируются, а возвращаются ссылки на исходный объект. // // Параметры: // СтруктураИсточник - Структура - копируемая структура. @@ -685,7 +684,9 @@ КонецФункции -// Создает копию значения типа Соответствие. +// Создает копию значения типа Соответствие, рекурсивно, с учетом типов значений. +// Если значения соответствия содержат значения объектных типов (СправочникОбъект, ДокументОбъект и т.п.), +// то их содержимое не копируются, а возвращаются ссылки на исходный объект. // // Параметры: // СоответствиеИсточник - Соответствие - соответствие, копию которого необходимо получить. @@ -705,7 +706,9 @@ КонецФункции -// Создает копию значения типа Массив. +// Создает копию значения типа Массив, рекурсивно, с учетом типов значений элементов массива. +// Если элементы массива содержат значения объектных типов (СправочникОбъект, ДокументОбъект и т.п.), +// то их содержимое не копируются, а возвращаются ссылки на исходный объект. // // Параметры: // МассивИсточник - Массив - массив, копию которого необходимо получить. @@ -725,7 +728,9 @@ КонецФункции -// Создает копию значения типа СписокЗначений. +// Создает копию значения типа СписокЗначений, рекурсивно, с учетом типов его значений. +// Если в списке значений есть значения объектных типов (СправочникОбъект, ДокументОбъект и т.п.), +// то их содержимое не копируются, а возвращаются ссылки на исходный объект. // // Параметры: // СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить. @@ -750,6 +755,14 @@ КонецФункции // Сравнивает элементы списков значений или массивов по значениям. +// +// Параметры: +// Список1 - Массив, СписокЗначений - сравниваемая коллекция элементов. +// Список2 - Массив, СписокЗначений - сравниваемая коллекция элементов. +// +// Возвращаемое значение: +// Булево - Истина, если идентичны. +// Функция СпискиЗначенийИдентичны(Список1, Список2) Экспорт СпискиИдентичны = Истина; @@ -775,6 +788,13 @@ КонецФункции // Создает массив и помещает в него переданное значение. +// +// Параметры: +// Значение - Произвольный - любое значение. +// +// Возвращаемое значение: +// Массив - массив из одного элемента. +// Функция ЗначениеВМассиве(Значение) Экспорт Массив = Новый Массив; @@ -826,7 +846,7 @@ // Версия - Строка - версия конфигурации в формате РР.ПП.ЗЗ.СС, // где СС - номер сборки, который будет удален. // -// Возвращаемое значение: +// Возвращаемое значение: // Строка - номер версии конфигурации без номера сборки в формате РР.ПП.ЗЗ. // Функция ВерсияКонфигурацииБезНомераСборки(Знач Версия) Экспорт @@ -954,7 +974,7 @@ Функция СвойствоСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт Если Структура = Неопределено Тогда - Возврат Неопределено; + Возврат ЗначениеПоУмолчанию; КонецЕсли; Результат = ЗначениеПоУмолчанию; @@ -968,6 +988,9 @@ // Возвращает имя COM-класса для работы с 1С:Предприятием 8 через COM-соединение. // +// Возвращаемое значение: +// Строка - имя COM-класса для работы с 1С:Предприятием 8 через COM-соединение. +// Функция ИмяCOMСоединителя() Экспорт СистемнаяИнфо = Новый СистемнаяИнформация; ПодстрокиВерсии = СтрРазделить(СистемнаяИнфо.ВерсияПриложения, "."); @@ -994,10 +1017,10 @@ // // СтрокаСообщенияОбОшибке - Строка - если в процессе установки внешнего соединения возникает ошибка, // то подробное описание ошибки помещается в этот параметр. +// ОшибкаПодключенияКомпоненты - Булево - (возвращаемый параметр) устанавливается Истина, если была ошибка при подключении. // // Возвращаемое значение: -// COMОбъект, Неопределенно - -// в случае успешной установки внешнего соединения возвращается указатель на COM-объект соединения; +// COMОбъект, Неопределенно - в случае успешной установки внешнего соединения возвращается указатель на COM-объект соединения; // в случае ошибки возвращается Неопределенно. // Функция УстановитьВнешнееСоединение(Параметры, СтрокаСообщенияОбОшибке = "", ОшибкаПодключенияКомпоненты = Ложь) Экспорт @@ -1016,18 +1039,18 @@ // Свойства см. в функции // ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения): // -// * ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - -// клиент-серверный; -// * КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы; -// * ИмяСервера1СПредприятия - Строка - Имя сервера1С:Предприятия; -// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия; -// * АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании -// внешнего подключения к информационной базе; -// * ИмяПользователя - Строка - Имя пользователя информационной базы; -// * ПарольПользователя - Строка - Пароль пользователя информационной базы. +// * ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - +// клиент-серверный; +// * КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы; +// * ИмяСервера1СПредприятия - Строка - Имя сервера1С:Предприятия; +// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия; +// * АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании +// внешнего подключения к информационной базе; +// * ИмяПользователя - Строка - Имя пользователя информационной базы; +// * ПарольПользователя - Строка - Пароль пользователя информационной базы. // // Возвращаемое значение: -// Структура - +// Структура - информация о соединении: // * Соединение - COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в // случае ошибки; // * КраткоеОписаниеОшибки - Строка - краткое описание ошибки; @@ -1166,6 +1189,34 @@ КонецФункции +// Преобразует локальную дату к формату "YYYY-MM-DDThh:mm:ssTZD" согласно ISO 8601. +// +// Параметры: +// ЛокальнаяДата - Дата - дата в часовом поясе сеанса. +// +// Возвращаемое значение: +// Строка - представление даты. +// +Функция ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата) Экспорт + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Смещение = СмещениеСтандартногоВремени(ЧасовойПоясСеанса()); + #Иначе + Смещение = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().СмещениеСтандартногоВремени; + #КонецЕсли + ПредставлениеСмещения = "Z"; + Если Смещение > 0 Тогда + ПредставлениеСмещения = "+"; + ИначеЕсли Смещение < 0 Тогда + ПредставлениеСмещения = "-"; + Смещение = -Смещение; + КонецЕсли; + Если Смещение <> 0 Тогда + ПредставлениеСмещения = ПредставлениеСмещения + Формат('00010101' + Смещение, "ДФ=HH:mm"); + КонецЕсли; + + Возврат Формат(ЛокальнаяДата, "ДФ=yyyy-MM-ddTHH:mm:ss; ДП=0001-01-01T00:00:00") + ПредставлениеСмещения; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Функции для работы с файлами. // @@ -1174,16 +1225,17 @@ // // Параметры: // ПутьКаталога - Строка - путь к каталогу. +// Платформа - ТипПлатформы - параметр устарел, больше не используется. // // Возвращаемое значение: // Строка - путь к каталогу с конечным символом-разделителем. // -// Примеры использования: +// Пример: // Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог"); // возвращает "C:\Мой каталог\". // Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог\"); // возвращает "C:\Мой каталог\". // Результат = ДобавитьКонечныйРазделительПути("%APPDATA%"); // возвращает "%APPDATA%\". // -Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога, Знач Удалить_Платформа = Неопределено) Экспорт +Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога, Знач Платформа = Неопределено) Экспорт Если ПустаяСтрока(ПутьКаталога) Тогда Возврат ПутьКаталога; КонецЕсли; @@ -1308,18 +1360,18 @@ // На основе RFC 3986. // // Параметры: -// СтрокаURI - Строка - ссылка на ресурс в формате: -// <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>. +// СтрокаURI - Строка - ссылка на ресурс в формате: +// <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>. // // Возвращаемое значение: -// Структура - составные части URI согласно формату: -// * Схема - Строка. -// * Логин - Строка. -// * Пароль - Строка. -// * ИмяСервера - Строка - часть <хост>:<порт> входного параметра. -// * Хост - Строка. -// * Порт - Строка. -// * ПутьНаСервере - Строка - часть <путь>?<параметры>#<якорь> входного параметра. +// Структура - составные части URI согласно формату: +// * Схема - Строка - схема из URI. +// * Логин - Строка - логин из URI. +// * Пароль - Строка - пароль из URI. +// * ИмяСервера - Строка - часть <хост>:<порт> из URI. +// * Хост - Строка - хост из URI. +// * Порт - Строка - порт из URI. +// * ПутьНаСервере - Строка - часть <путь>?<параметры>#<якорь> из URI. // Функция СтруктураURI(Знач СтрокаURI) Экспорт @@ -1386,6 +1438,13 @@ КонецФункции // Функция раскладывает Строку в массив строк, используя "./\" как разделитель. +// +// Параметры: +// Строка - Строка - исходная строка. +// +// Возвращаемое значение: +// Массив - коллекция фрагментов строки. +// Функция РазложитьСтрокуПоТочкамИСлэшам(Знач Строка) Экспорт Перем ТекущаяПозиция; @@ -1446,7 +1505,7 @@ // Расширение - Строка - Расширение для преобразования. // // Возвращаемое значение: -// Строка. +// Строка - преобразованное расширение. // Функция РасширениеБезТочки(Знач Расширение) Экспорт @@ -1464,11 +1523,11 @@ // Если расширение пустое, тогда точка не добавляется. // // Параметры: -// ИмяБезРасширения - Строка - . -// Расширение - Строка - . +// ИмяБезРасширения - Строка - имя файла без расширения. +// Расширение - Строка - расширение. // // Возвращаемое значение: -// Строка. +// Строка - имя файла с расширением. // Функция ПолучитьИмяСРасширением(ИмяБезРасширения, Расширение) Экспорт @@ -1497,11 +1556,11 @@ // Проверяет наличие недопустимых символов в имени файла. // // Параметры: -// ИмяФайла - Строка -. +// ИмяФайла - Строка - имя файла. // // Возвращаемое значение: // Массив - массив обнаруженных в имени файла недопустимых символов. -// Если недопустимых символов не обнаружено возвращается пустой массив. +// Если недопустимых символов не обнаружено - возвращается пустой массив. Функция НайтиНедопустимыеСимволыВИмениФайла(ИмяФайла) Экспорт НедопустимыеСимволы = ПолучитьНедопустимыеСимволыВИмениФайла(); @@ -1544,15 +1603,11 @@ // Функции для работы с почтовыми адресами. // -// Разбирает строку с адресами электронной почты согласно стандарту RFC 5322 с ограничениями. -// -// Ограничения: -// 1. В адресе разрешаются только буквы, цифры, символ подчеркивания, дефис и символ "@". -// 2. Символы скобок "<>[]()" допускаются, но игнорируются путем замены на пробелы. -// 3. Группы запрещены. +// Разбирает строку с адресами электронной почты. При разборе проверяет корректность адресов. // // Параметры: -// Строка - Строка - Строка, содержащая электронные адреса (mailbox-list). +// СписокАдресов - Строка - адреса электронной почты, разделитель - запятая, либо точка с запятой: +// Получатель1 <Адрес1>, Получатель 2 <Адрес2>... Получатель N <АдресN>. // // Возвращаемое значение: // Массив - содержит массив структур адресов. @@ -1562,13 +1617,14 @@ // Если текст, похожий на адрес найден, но не соответствует требованиям // стандартов, то такой текст записывается в поле "Псевдоним". // ОписаниеОшибки - Строка - текстовое представление ошибки, либо пустая строка, если ошибок нет. -Функция АдресаЭлектроннойПочтыИзСтроки(Знач Строка) Экспорт +// +Функция АдресаЭлектроннойПочтыИзСтроки(Знач СписокАдресов) Экспорт Результат = Новый Массив; // заменяем скобки на пробелы СимволыСкобок = "<>()[]"; - Строка = ЗаменитьСимволыВСтрокеНаПробелы(Строка, СимволыСкобок); + Строка = ЗаменитьСимволыВСтрокеНаПробелы(СписокАдресов, СимволыСкобок); // Приводим разделители к одному виду. Строка = СтрЗаменить(Строка, ",", ";"); @@ -1621,13 +1677,13 @@ Иначе ОписаниеОшибки = НСтр("ru = 'Строка не содержит адреса электронной почты'"); КонецЕсли; - КонецЕсли; + КонецЕсли; СтруктураАдреса = Новый Структура("Псевдоним,Адрес,ОписаниеОшибки", Псевдоним, Адрес, ОписаниеОшибки); Результат.Добавить(СтруктураАдреса); КонецЦикла; - Возврат Результат; + Возврат Результат; КонецФункции @@ -1724,24 +1780,24 @@ КонецФункции -// Функция проверяет что введенная строка с e-mail адресами введена правильно. +// Функция проверяет, что введенная строка с e-mail адресами введена правильно. // -// Формат строки: -// Z = ИмяПользователя|[Имя Пользователя] [<]пользователь@почтовый_сервер[>], Строка = Z[<разделитель*>Z]. +// Формат строки: +// Z = ИмяПользователя|[Имя Пользователя] [<]пользователь@почтовый_сервер[>], Строка = Z[<разделитель*>Z]. // -// Прим.: разделитель* - имеется в виду любой разделитель адресов. +// Прим.: разделитель* - имеется ввиду любой разделитель адресов. // // Параметры: -// СтрокаПереданныхАдресов - строка - правильная строка с почтовыми адресами. +// СтрокаПереданныхАдресов - Строка - правильная строка с почтовыми адресами. +// ВызыватьИсключение - Булево - необходимо передать Ложь, чтобы в случае неуспешного разбора не выдавалось исключение. // // Возвращаемое значение: -// Структура -// ключ Статус - булево - успех или неуспех преобразования -// в случае успеха содержит ключ Значение: -// Массив структур, где. -// Адрес- e-mail получателя. -// Представление - имя получателя -// в случае неуспеха содержит ключ СообщениеОбОшибке - строка. +// Структура - результат разбора: +// * Статус - Булево - успех или неуспех преобразования +// * Значение - Массив - (параметр доступен, если Статус = Истина) коллекция адресов в виде структур: +// ** Адрес - Строка - e-mail получателя. +// ** Представление - Строка - имя получателя. +// * СообщениеОбОшибке - Строка - (параметр доступен, если Статус = Ложь) информация об ошибке. // // ВАЖНО: Функция возвращает массив структур, в которых одно поле (любое) // может быть незаполнено. Может использоваться различными @@ -1847,11 +1903,15 @@ // Найти элемент или группу отбора по заданному имени поля или представлению. // // Параметры: -// ОбластьПоиска - контейнер с элементами и группами отбора, например. -// Список.Отбор или группа в отборе. +// ОбластьПоиска - ОтборКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных, +// ГруппаЭлементовОтбораКомпоновкиДанных - контейнер +// с элементами и группами отбора, например Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки (не используется для групп). // Представление - Строка - представление поля компоновки. // +// Возвращаемое значение: +// Массив - коллекция отборов. +// Функция НайтиЭлементыИГруппыОтбора(Знач ОбластьПоиска, Знач ИмяПоля = Неопределено, Знач Представление = Неопределено) Экспорт @@ -1875,10 +1935,14 @@ // Добавить группу отбора в коллекцию КоллекцияЭлементов. // // Параметры: -// КоллекцияЭлементов - контейнер с элементами и группами отбора, например. -// Список.Отбор.Элементы или группа в отборе. -// ТипГруппы - ТипГруппыЭлементовОтбораКомпоновкиДанных - тип группы. +// КоллекцияЭлементов - ОтборКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных, +// ГруппаЭлементовОтбораКомпоновкиДанных - контейнер +// с элементами и группами отбора, например Список.Отбор или группа в отборе. // Представление - Строка - представление группы. +// ТипГруппы - ТипГруппыЭлементовОтбораКомпоновкиДанных - тип группы. +// +// Возвращаемое значение: +// ГруппаЭлементовОтбораКомпоновкиДанных - группа отбора. // Функция СоздатьГруппуЭлементовОтбора(Знач КоллекцияЭлементов, Представление, ТипГруппы) Экспорт @@ -1906,16 +1970,18 @@ // Добавить элемент компоновки в контейнер элементов компоновки. // // Параметры: -// ОбластьДобавления - контейнер с элементами и группами отбора, например. -// Список.Отбор или группа в отборе. +// ОбластьДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Представление - Строка - представление элемента компоновки данных. // Использование - Булево - использование элемента. // РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения. // ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки // в синтакс-помощнике. +// Возвращаемое значение: +// ЭлементОтбораКомпоновкиДанных - элемент компоновки. // Функция ДобавитьЭлементКомпоновки(ОбластьДобавления, Знач ИмяПоля, @@ -1964,12 +2030,19 @@ // Изменить элемент отбора с заданным именем поля или представлением. // // Параметры: +// ОбластьПоиска - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // Представление - Строка - представление элемента компоновки данных. -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Использование - Булево - использование элемента. // РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения. +// ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки +// в синтакс-помощнике. +// +// Возвращаемое значение: +// Число - количество измененных элементов. // Функция ИзменитьЭлементыОтбора(ОбластьПоиска, Знач ИмяПоля = Неопределено, @@ -2023,8 +2096,8 @@ // Удалить элементы отбора с заданным именем поля или представлением. // // Параметры: -// ОбластьУдаления - контейнер с элементами и группами отбора, например. -// Список.Отбор или группа в отборе. +// ОбластьУдаления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор или группа в отборе.. // ИмяПоля - Строка - имя поля компоновки (не используется для групп). // Представление - Строка - представление поля компоновки. // @@ -2055,8 +2128,8 @@ // Добавить или заменить существующий элемент отбора. // // Параметры: -// ОбластьПоискаДобавления - контейнер с элементами и группами отбора, например. -// Список.Отбор или группа в отборе. +// ОбластьПоискаДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // ПравоеЗначение - произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. @@ -2120,9 +2193,6 @@ // ИдентификаторПользовательскойНастройки - Строка - Уникальный идентификатор этого отбора. // Используется для связи с пользовательскими настройками. // -// См. также: -// Одноименные свойства объекта "ЭлементОтбораКомпоновкиДанных" в синтакс-помощнике. -// Процедура УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, ИмяПоля, ПравоеЗначение = Неопределено, ВидСравнения = Неопределено, @@ -2201,9 +2271,14 @@ // // Получает значение реквизита формы. +// // Параметры: -// Форма -// ПутьРеквизита - строка, путь к данным, например: "Объект.МесяцНачисления". +// Форма - УправляемаяФорма - форма. +// ПутьРеквизита - Строка - путь к данным реквизита формы, например: "Объект.МесяцНачисления". +// +// Возвращаемое значение: +// Произвольный - реквизит формы. +// Функция ПолучитьРеквизитФормыПоПути(Форма, ПутьРеквизита) Экспорт МассивИмен = СтрРазделить(ПутьРеквизита, "."); @@ -2221,9 +2296,11 @@ // Устанавливает значение реквизиту формы. // Параметры: -// Форма -// ПутьРеквизита - строка, путь к данным, например: "Объект.МесяцНачисления". -// Значение +// Форма - УправляемаяФорма - форма-владелец реквизита. +// ПутьРеквизита - Строка - путь к данным, например: "Объект.МесяцНачисления". +// Значение - Произвольный - устанавливаемое значение. +// ТолькоЕслиНеЗаполнен - Булево - позволяет не устанавливать значение реквизита, +// если у него уже установлено какое-то значение. Процедура УстановитьРеквизитФормыПоПути(Форма, ПутьРеквизита, Значение, ТолькоЕслиНеЗаполнен = Ложь) Экспорт МассивИмен = СтрРазделить(ПутьРеквизита, "."); @@ -2243,10 +2320,13 @@ // Выполняет поиск элемента отбора в коллекции по заданному представлению. // // Параметры: -// КоллекцияЭлементов - контейнер с элементами и группами отбора, например. -// Список.Отбор.Элементы или группа в отборе. -// Представление строка - представление группы. +// КоллекцияЭлементов - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор.Элементы или группа в отборе. +// Представление - Строка - представление группы. // +// Возвращаемое значение: +// ЭлементОтбораКомпоновкиДанных - элемент отбора. +// Функция НайтиЭлементОтбораПоПредставлению(КоллекцияЭлементов, Представление) Экспорт ВозвращаемоеЗначение = Неопределено; @@ -2267,7 +2347,7 @@ // на объект, реквизит объекта или команду. // // Параметры: -// ЭлементыФормы - свойство ЭлементыФормы управляемой формы. +// ЭлементыФормы - ВсеЭлементФормы, ЭлементыФормы - коллекция элементов управляемой формы. // ИмяЭлемента - Строка - имя элемента формы. // ИмяСвойства - Строка - имя устанавливаемого свойства элемента формы. // Значение - Произвольный - новое значение элемента. @@ -2286,7 +2366,7 @@ // на объект, реквизит объекта или команду. // // Параметры: -// ЭлементыФормы - свойство ЭлементыФормы управляемой формы. +// ЭлементыФормы - ВсеЭлементФормы, ЭлементыФормы - коллекция элементов управляемой формы. // ИмяЭлемента - Строка - имя элемента формы. // ИмяСвойства - Строка - имя свойства элемента формы. // @@ -2321,13 +2401,15 @@ // Неопределено - если элемент не найден, или на него нет прав. // Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт + Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" Тогда // Для получения пустых ссылок используется стандартная функция платформы. Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); КонецЕсли; -#Если НЕ ТонкийКлиент И НЕ ВебКлиент И НЕ ТолстыйКлиентУправляемоеПриложение Тогда - Возврат СтандартныеПодсистемыПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + // Выполнение без кэширования. + Возврат СтандартныеПодсистемыСервер.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); #Иначе Возврат СтандартныеПодсистемыКлиентПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); #КонецЕсли @@ -2342,6 +2424,9 @@ // Параметрам необходимо задать требуемые значения и передать. // В метод ОбщегоНазначения.УстановитьВнешнееСоединение(). // +// Возвращаемое значение: +// Структура - коллекция параметров. +// Функция СтруктураПараметровДляУстановкиВнешнегоСоединения() Экспорт СтруктураПараметров = Новый Структура; @@ -2359,11 +2444,17 @@ // Извлекает из строки соединения с информационной базой параметры подключения // и передает параметры в структуру для установки внешнего соединения. // +// Параметры: +// СтрокаСоединения - Строка - строка соединения ИБ. +// +// Возвращаемое значение: +// Структура - см. СтруктураПараметровДляУстановкиВнешнегоСоединения. +// Функция ПолучитьПараметрыПодключенияИзСтрокиСоединенияИнформационнойБазы(Знач СтрокаСоединения) Экспорт Результат = СтруктураПараметровДляУстановкиВнешнегоСоединения(); - Параметры = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединения); + Параметры = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения); Параметры.Свойство("File", Результат.КаталогИнформационнойБазы); Параметры.Свойство("Srvr", Результат.ИмяСервера1СПредприятия); @@ -2377,15 +2468,12 @@ // Для файлового режима работы возвращает полное имя каталога, в котором расположена информационная база. // Если режим работы клиент-серверный, то возвращается пустая строка. // -// Параметры: -// Нет. -// // Возвращаемое значение: // Строка - Полное имя каталога, в котором расположена файловая информационная база. // Функция КаталогФайловойИнформационнойБазы() Экспорт - ПараметрыСоединения = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединенияИнформационнойБазы()); + ПараметрыСоединения = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединенияИнформационнойБазы()); Если ПараметрыСоединения.Свойство("File") Тогда Возврат ПараметрыСоединения.File; @@ -2397,6 +2485,13 @@ // Получает идентификатор (метод ПолучитьИдентификатор()) строки дерева значений для заданного значения поля строки // дерева. // Используется для позиционирования курсора в иерархических списках. +// +// Параметры: +// ИмяПоля - Строка - Имя колонки дерева значений, по которому выполняется поиск. +// ИдентификаторСтроки - Число - полученный в результате поиска идентификатор строки дерева значений. +// КоллекцияЭлементовДерева - ДанныеФормыКоллекцияЭлементовДерева - коллекция, в которой следует выполнять поиск. +// КлючСтроки - Произвольный - искомое значение поля. +// ПрекратитьПоиск - Булево - признак прекращения поиска. // Процедура ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементовДерева, КлючСтроки, ПрекратитьПоиск) Экспорт @@ -2434,7 +2529,7 @@ // Текст - Строка - строка, в которой требуется выполнить замену недопустимых символов. // СимволЗамены - Строка - строка, на которую требуется выполнить замену недопустимого символа в XML-строке. // -// Возвращаемое значение: +// Возвращаемое значение: // Строка - строка, полученная заменой недопустимых символов в XML-строке. // Функция ЗаменитьНедопустимыеСимволыXML(Знач Текст, СимволЗамены = " ") Экспорт @@ -2498,8 +2593,8 @@ // Расписание1 - РасписаниеРегламентногоЗадания - первое расписание. // Расписание2 - РасписаниеРегламентногоЗадания - второе расписание. // -// Возвращаемое значение -// Булево - истина, если расписания идентичны, иначе ложь. +// Возвращаемое значение: +// Булево - Истина, если одинаковые. // Функция РасписанияОдинаковые(Знач Расписание1, Знач Расписание2) Экспорт @@ -2508,6 +2603,10 @@ КонецФункции // Возвращает код основного языка конфигурации, например "ru". +// +// Возвращаемое значение: +// Строка - код языка. +// Функция КодОсновногоЯзыка() Экспорт #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда Возврат Метаданные.ОсновнойЯзык.КодЯзыка; @@ -2519,6 +2618,9 @@ // Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. // Если нет клиентского приложения, возвращается Ложь. // +// Возвращаемое значение: +// Булево - Истина, если подключен. +// Функция КлиентПодключенЧерезВебСервер() Экспорт #Если Клиент Или ВнешнееСоединение Тогда @@ -2540,7 +2642,7 @@ // Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows. // // Возвращаемое значение: -// Булево. Если нет клиентского приложения, возвращается Ложь. +// Булево - если нет клиентского приложения, возвращается Ложь. // Функция ЭтоWindowsКлиент() Экспорт @@ -2566,7 +2668,7 @@ // Возвращает Истина, если клиентское приложение запущено под управлением ОС X. // // Возвращаемое значение: -// Булево. Если нет клиентского приложения, возвращается Ложь. +// Булево - если нет клиентского приложения, возвращается Ложь. // Функция ЭтоOSXКлиент() Экспорт @@ -2592,7 +2694,7 @@ // Возвращает Истина, если клиентское приложение запущено под управлением ОС Linux. // // Возвращаемое значение: -// Булево. Если нет клиентского приложения, возвращается Ложь. +// Булево - если нет клиентского приложения, возвращается Ложь. // Функция ЭтоLinuxКлиент() Экспорт @@ -2618,7 +2720,7 @@ // Возвращает Истина, если клиентское приложение является Веб-клиентом. // // Возвращаемое значение: -// Булево. Если нет клиентского приложения, возвращается Ложь. +// Булево - если нет клиентского приложения, возвращается Ложь. // Функция ЭтоВебКлиент() Экспорт @@ -2641,6 +2743,10 @@ КонецФункции // Возвращает Истина, если это веб клиент в Mac OS. +// +// Возвращаемое значение: +// Булево - Истина, если сеанс запущен под веб-клиентом и в Mac OS. +// Функция ЭтоВебКлиентПодMacOS() Экспорт #Если ВебКлиент Тогда @@ -2662,6 +2768,9 @@ КонецФункции // Возвращает Истина, если включен режим отладки. +// +// Возвращаемое значение: +// Булево - Истина, если включен режим отладки. Функция РежимОтладки() Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда @@ -2706,7 +2815,7 @@ // ИмяПроцедурыИлиФункции - Строка - имя процедуры или функции, параметр которой проверяется. // ИмяПараметра - Строка - имя проверяемого параметра процедуры или функции. // ЗначениеПараметра - Произвольный - фактическое значение параметра. -// ОжидаемыеТипы - ОписаниеТипов, Тип - тип(ы) параметра процедуры или функции. +// ОжидаемыеТипы - ОписаниеТипов, Тип, Массив - тип(ы) параметра процедуры или функции. // ОжидаемыеТипыСвойств - Структура - если ожидаемый тип - структура, то // в этом параметре можно указать типы ее свойств. // @@ -2719,18 +2828,16 @@ Проверить(ТипЗнч(ИмяПараметра) = Тип("Строка"), НСтр("ru = 'Недопустимо значение параметра ИмяПараметра'"), Контекст); - ЭтоОписаниеТипов = ТипЗнч(ОжидаемыеТипы) = Тип("ОписаниеТипов"); - Проверить(ЭтоОписаниеТипов Или ТипЗнч(ОжидаемыеТипы) = Тип("Тип"), + ЭтоКорректныйТип = ЗначениеОжидаемогоТипа(ЗначениеПараметра, ОжидаемыеТипы); + Проверить(ЭтоКорректныйТип <> Неопределено, НСтр("ru = 'Недопустимо значение параметра ОжидаемыеТипы'"), Контекст); - ЭтоКорректныйТип = (ЭтоОписаниеТипов И ОжидаемыеТипы.СодержитТип(ТипЗнч(ЗначениеПараметра))) - Или (Не ЭтоОписаниеТипов И ОжидаемыеТипы = ТипЗнч(ЗначениеПараметра)); НедопустимыйПараметр = НСтр("ru = 'Недопустимое значение параметра %1 в %2. |Ожидалось: %3; передано значение: %4 (тип %5).'"); Проверить(ЭтоКорректныйТип, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимыйПараметр, ИмяПараметра, ИмяПроцедурыИлиФункции, - ОжидаемыеТипы, + ПредставлениеТипов(ОжидаемыеТипы), ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеПараметра))); @@ -2751,15 +2858,13 @@ Проверить(ЗначениеПараметра.Свойство(ОжидаемоеИмяСвойства, ЗначениеСвойства), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НетСвойства, ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемоеИмяСвойства, ОжидаемыйТипСвойства)); - - ЭтоОписаниеТипов = ТипЗнч(ОжидаемыйТипСвойства) = Тип("ОписаниеТипов"); - ЭтоКорректныйТип = (ЭтоОписаниеТипов И ОжидаемыйТипСвойства.СодержитТип(ТипЗнч(ЗначениеСвойства))) - Или (Не ЭтоОписаниеТипов И ОжидаемыйТипСвойства = ТипЗнч(ЗначениеСвойства)); + + ЭтоКорректныйТип = ЗначениеОжидаемогоТипа(ЗначениеСвойства, ОжидаемыйТипСвойства); Проверить(ЭтоКорректныйТип, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимоеСвойство, ОжидаемоеИмяСвойства, ИмяПараметра, ИмяПроцедурыИлиФункции, - ОжидаемыйТипСвойства, + ПредставлениеТипов(ОжидаемыеТипы), ?(ЗначениеСвойства <> Неопределено, ЗначениеСвойства, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеСвойства))); КонецЦикла; @@ -2784,7 +2889,7 @@ // В случае если распределить не удалось (сумма = 0, кол-во коэффициентов = 0, // или суммарный вес коэффициентов = 0), тогда возвращается значение Неопределено. // -Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Знач Коэффициенты, Знач Точность = 2) Экспорт +Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт Если Коэффициенты.Количество() = 0 Или Не ЗначениеЗаполнено(РаспределяемаяСумма) Тогда Возврат Неопределено; @@ -2818,40 +2923,18 @@ РаспределеннаяСумма = РаспределеннаяСумма + Результат[Индекс]; КонецЦикла; - Дельта = РаспределяемаяСумма - РаспределеннаяСумма; - - Если Дельта > 0 Тогда - - // Погрешности округления отнесем на коэффициент с максимальным весом. - Если Не РаспределеннаяСумма = РаспределяемаяСумма Тогда - Результат[ИндексМаксимальногоКоэффициента] = Результат[ИндексМаксимальногоКоэффициента] + Дельта; - КонецЕсли; - - ИначеЕсли Дельта < 0 Тогда - - // Если распределили больше чем положено, размазываем погрешность по ближайшим максимальным весам. - ЗначениеПогрешности = 1 / Pow(10, Точность); - КоличествоЭлементовПогрешности = -Дельта / ЗначениеПогрешности; - - КоэффициентыРешето = Новый Массив(Новый ФиксированныйМассив(Коэффициенты)); - - Для Сч = 1 По КоличествоЭлементовПогрешности Цикл - МаксимальныйКоэффициент = МаксимальноеЗначениеВМассиве(КоэффициентыРешето); - Индекс = КоэффициентыРешето.Найти(МаксимальныйКоэффициент); - Результат[Индекс] = Результат[Индекс] - ЗначениеПогрешности; - КоэффициентыРешето[Индекс] = 0; - КонецЦикла; - - Иначе - // Если Дельта = 0, то все идеально. + // Погрешности округления отнесем на коэффициент с максимальным весом. + Если Не РаспределеннаяСумма = РаспределяемаяСумма Тогда + Результат[ИндексМаксимальногоКоэффициента] = Результат[ИндексМаксимальногоКоэффициента] + РаспределяемаяСумма - РаспределеннаяСумма; КонецЕсли; Возврат Результат; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции // Выполняет поиск элемента в коллекции: списке значений или массиве. // @@ -3009,21 +3092,31 @@ Возврат Истина; КонецФункции -Функция МаксимальноеЗначениеВМассиве(Массив) - - МаксимальноеЗначение = 0; - - Для Индекс = 0 По Массив.Количество() - 1 Цикл - Значение = Массив[Индекс]; - - АбсолютноеЗначение = ?(Значение > 0, Значение, -Значение); - Если МаксимальноеЗначение < АбсолютноеЗначение Тогда - МаксимальноеЗначение = АбсолютноеЗначение; - КонецЕсли; - КонецЦикла; - - Возврат МаксимальноеЗначение; - +Функция ЗначениеОжидаемогоТипа(Значение, ОжидаемыеТипы) + ТипЗначения = ТипЗнч(Значение); + Если ТипЗнч(ОжидаемыеТипы) = Тип("ОписаниеТипов") Тогда + Возврат ОжидаемыеТипы.Типы().Найти(ТипЗначения) <> Неопределено; + ИначеЕсли ТипЗнч(ОжидаемыеТипы) = Тип("Тип") Тогда + Возврат ТипЗначения = ОжидаемыеТипы; + ИначеЕсли ТипЗнч(ОжидаемыеТипы) = Тип("Массив") Тогда + Возврат ОжидаемыеТипы.Найти(ТипЗначения) <> Неопределено; + КонецЕсли; + Возврат Неопределено; +КонецФункции + +Функция ПредставлениеТипов(ОжидаемыеТипы) + Если ТипЗнч(ОжидаемыеТипы) = Тип("Массив") Тогда + Результат = ""; + Для Каждого Тип Из ОжидаемыеТипы Цикл + Если Не ПустаяСтрока(Результат) Тогда + Результат = Результат + ", "; + КонецЕсли; + Результат = Результат + ?(Тип = Неопределено, "Неопределено", Строка(Тип)); + КонецЦикла; + Возврат Результат; + Иначе + Возврат Строка(ОжидаемыеТипы); + КонецЕсли; КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl index 3289ecc4d..3394ce616 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl @@ -1,18 +1,69 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. +// Позволяет настроить общие параметры подсистемы. // -// Для задания обработчиков параметров сеанса следует использовать шаблон: -// Обработчики.Вставить("<ИмяПараметраСеанса>|<НачалоИмениПараметраСеанса*>", "Обработчик"); +// Параметры: +// ОбщиеПараметры - Структура - структура со свойствами: +// * ИмяФормыПерсональныхНастроек - Строка - имя формы для редактирования персональных настроек. +// Ранее определялись в +// ОбщегоНазначенияПереопределяемый.ИмяФормыПерсональныхНастроек. +// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - по умолчанию Истина. Если установить Ложь, то +// подтверждение при завершении работы программы не +// будет запрашиваться, если явно не разрешить в +// персональных настройках программы. +// * МинимальнаяВерсияПлатформы - Строка - минимальная версии платформы, требуемая для запуска программы. +// Например, "8.3.6.1650". +// * РекомендуемаяВерсияПлатформы - Строка - рекомендуемая версия платформы для запуска программы. +// Запуск программы на версии платформы ниже указанной будет невозможен. +// Например, "8.3.8.2137". +// * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных +// и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. +// Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. +// * РекомендуемыйОбъемОперативнойПамяти - Число - объем памяти в гигабайтах, рекомендуемый для комфортной работы в +// программе. // -// Примечание. Символ '*'используется в конце имени параметра сеанса и обозначает, -// что один обработчик будет вызван для инициализации всех параметров сеанса -// с именем, начинающимся на слово НачалоИмениПараметраСеанса. +// Устарели, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы: +// * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы. +// Например, "8.3.4.365". +// Ранее определялись в +// ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы. +// * РаботаВПрограммеЗапрещена - Булево - Начальное значение Ложь. +// +Процедура ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт + + + +КонецПроцедуры + +// Определяет соответствие имен параметров сеанса и обработчиков для их установки. +// +// В указанных модулях должна быть размещена процедура обработчика, в которую передаются параметры +// ИмяПараметра - Строка - имя параметра сеанса, который требуется установить. +// УстановленныеПараметры - Массив - имена параметров, которые уже установлены. +// +// Далее пример процедуры обработчика для копирования в указанные модули. +// +//// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +//Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт +// +// Если ИмяПараметра = "ТекущийПользователь" Тогда +// ПараметрыСеанса.ТекущийПользователь = Значение; +// УстановленныеПараметры.Добавить("ТекущийПользователь"); +// КонецЕсли; +// +//КонецПроцедуры +// +// Параметры: +// Обработчики - Соответствие - со свойствами: +// * Ключ - Строка - в формате "<ИмяПараметраСеанса>|<НачалоИмениПараметраСеанса*>". +// Символ '*'используется в конце имени параметра сеанса и обозначает, +// что один обработчик будет вызван для инициализации всех параметров сеанса +// с именем, начинающимся на слово НачалоИмениПараметраСеанса. +// +// * Значение - Строка - в формате "<ИмяМодуля>.УстановкаПараметровСеанса". +// +// Пример: +// Обработчики.Вставить("ТекущийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса"); // Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт @@ -22,37 +73,76 @@ КонецПроцедуры -// Объекты метаданных, содержимое которых не должно учитывается в бизнес-логике приложения. +// Позволяет задать значения параметров, необходимых для работы клиентского кода +// при запуске конфигурации (в обработчиках событий ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы) +// без дополнительных серверных вызовов. +// Для получения значений этих параметров из клиентского кода +// см. СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске. // -// Описание: -// Для документа "Реализация товаров и услуг" настроены подсистемы "Версионирование объектов" и "Свойства". -// При этом документ может быть указан в других объектах метаданных - документах или регистрах. -// Часть ссылок имеют значение для бизнес-логики (например движения по регистрам) и должны выводиться пользователю. -// Другая часть ссылок - "техногенные" ссылки на документ из данных подсистем "Версионирование объектов" и "Свойства", -// должны скрываться от пользователя при поиске ссылок на объект. -// Например, при анализе мест использования или в подсистеме запрета редактирования ключевых реквизитов. -// Список таких "техногенных" объектов нужно перечислить в этой процедуре. -// -// Важно: -// Для избежания появления пустых "битых" ссылок рекомендуется предусмотреть процедуру очистки указанных объектов -// метаданных. -// Для измерений регистров сведений - с помощью установки флажка "Ведущее", -// тогда запись регистра сведений будет удалена вместе с удалением ссылки, указанной в измерении. -// Для других реквизитов указанных объектов - с помощью подписки на событие ПередУдалением всех типов объектов -// метаданных, которые могут быть записаны в реквизиты указанных объектов метаданных. -// В обработчике необходимо найти "техногенные" объекты, в реквизитах которых указана ссылка удаляемого объекта, -// и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. +// Важно: недопустимо использовать команды сброса кэша повторно используемых модулей, +// иначе запуск может привести к непредсказуемым ошибкам и лишним серверным вызовам. // // Параметры: -// ИсключенияПоискаСсылок - Массив - Объекты метаданных или их реквизиты, содержимое которых не должно учитывается в -// бизнес-логике приложения. -// * ОбъектМетаданных - Объект метаданных или его реквизит. -// * Строка - Полное имя объекта метаданных или его реквизита. +// Параметры - Структура - имена и значения параметров работы клиента при запуске, которые необходимо задать. +// Для установки параметров работы клиента при запуске: +// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); // -// Примеры: -// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); -// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); -// ИсключенияПоискаСсылок.Добавить("РегистрСведений.ВерсииОбъектов"); +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + + + + +КонецПроцедуры + +// Позволяет задать значения параметров, необходимых для работы клиентского кода +// конфигурации без дополнительных серверных вызовов. +// Для получения этих параметров из клиентского кода +// см. СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента. +// +// Параметры: +// Параметры - Структура - имена и значения параметров работы клиента, которые необходимо задать. +// Для установки параметров работы клиента: +// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); +// +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + + + + +КонецПроцедуры + +// Определяет объекты метаданных и отдельные реквизиты, которые исключаются из результатов поиска ссылок, +// не учитываются при монопольном удалении помеченных, замене ссылок и в отчете по местам использования. +// См. также ОбщегоНазначения.ИсключенияПоискаСсылок. +// +// Пример задачи: к документу "Реализация товаров и услуг" подключены подсистемы "Версионирование объектов" и "Свойства". +// Также этот документ может быть указан в других объектах метаданных - документах или регистрах. +// Часть ссылок имеют значение для бизнес-логики (например движения по регистрам) и должны выводиться пользователю. +// Другая часть ссылок - "техногенные" (ссылки на документ из данных подсистем "Версионирование объектов" и "Свойства") +// и должны скрываться от пользователя при удалении, анализе мест использования или запретов редактирования ключевых реквизитов. +// Список таких "техногенных" объектов нужно перечислить в этой процедуре. +// +// При этом, для избежания появления появления ссылок на несуществующие объекты +// рекомендуется предусмотреть процедуру очистки указанных объектов метаданных. +// * Для измерений регистров сведений - с помощью установки флажка "Ведущее", +// тогда запись регистра сведений будет удалена вместе с удалением ссылки, указанной в измерении. +// * Для других реквизитов указанных объектов - с помощью подписки на событие ПередУдалением всех типов объектов +// метаданных, которые могут быть записаны в реквизиты указанных объектов метаданных. +// В обработчике необходимо найти "техногенные" объекты, в реквизитах которых указана ссылка удаляемого объекта, +// и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. +// Подробнее см. в документации к подсистеме "Удаление помеченных объектов". +// +// Параметры: +// ИсключенияПоискаСсылок - Массив - объекты метаданных или их реквизиты (ОбъектМетаданных, Строка), +// которые не должно учитываться в бизнес-логике. +// Стандартные реквизиты и табличные части могут быть указаны только в виде строковых имен (см. пример ниже). +// +// Пример: +// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); +// ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); +// ИсключенияПоискаСсылок.Добавить("ПланВидовРасчета._ДемоОсновныеНачисления.СтандартнаяТабличнаяЧасть.БазовыеВидыРасчета.СтандартныйРеквизит.ВидРасчета"); // Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт @@ -60,17 +150,21 @@ КонецПроцедуры -// Доопределяет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). +// Вызывается при обновлении информационной базы для учета переименований подсистем и ролей в конфигурации. +// В противном случае, возникнет рассинхронизация между метаданными конфигурации и +// элементами справочника ИдентификаторыОбъектовМетаданных, что приведет к различным ошибкам при работе конфигурации. +// +// В этой процедуре последовательно для каждой версии конфигурации задаются переименования только подсистем и ролей, +// а переименования остальных объектов метаданных задавать не следует, т.к. они обрабатываются автоматически. // // Параметры: -// Итог - ТаблицаЗначений - таблица, которую нужно передавать, как параметр -// в процедуру ДобавитьПереименование общего модуля ОбщегоНазначения. +// Итог - ТаблицаЗначений - таблица переименований, которую требуется заполнить. +// См. ОбщегоНазначения.ДобавитьПереименование. // // Пример: -// ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", -// "Роль.ИспользованиеЭЦП", "Роль.ИспользованиеЭП", "СтандартныеПодсистемы"); +// ОбщегоНазначения.ДобавитьПереименование(Итог, "2.1.2.14", +// "Подсистема._ДемоПодсистемы", +// "Подсистема._ДемоСервисныеПодсистемы"); // Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт @@ -78,86 +172,15 @@ -КонецПроцедуры - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации, т.е. в обработчиках событий. -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы -// -// Важно: при запуске недопустимо использовать команды сброса кэша -// повторно используемых модулей, иначе запуск может привести -// к непредсказуемым ошибкам и лишним серверным вызовам. -// -// Параметры: -// Параметры - Структура - (возвращаемое значение) структура параметров работы клиента при запуске. -// -// Пример реализации: -// Для установки параметров работы клиента можно использовать шаблон: -// -// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); -// -// -Процедура ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт - - - - - -КонецПроцедуры - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - (возвращаемое значение) структура параметров работы клиента. -// -// Пример реализации: -// Для установки параметров работы клиента можно использовать шаблон: -// -// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); -// -Процедура ПараметрыРаботыКлиента(Параметры) Экспорт - - - - - -КонецПроцедуры - -// Позволяет настроить общие параметры подсистемы. -// -// Параметры: -// ОбщиеПараметры - Структура - структура со свойствами: -// * ИмяФормыПерсональныхНастроек - Строка - имя формы для редактирования персональных настроек. -// Ранее определялись в -// ОбщегоНазначенияПереопределяемый.ИмяФормыПерсональныхНастроек. -// * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы. -// Например, "8.3.4.365". -// Ранее определялись в -// ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы. -// * РаботаВПрограммеЗапрещена - Булево - Начальное значение Ложь. -// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - по умолчанию Истина. Если установить Ложь, то -// подтверждение при завершении работы программы не -// будет запрашиваться, если явно не разрешить в -// персональных настройках программы. -// * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных -// и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. -// Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. -// * РекомендуемыйОбъемОперативнойПамяти - Число - объем памяти в гигабайтах, рекомендуемый для комфортной работы в программе. -// -Процедура ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт - - - КонецПроцедуры // Позволяет виртуально отключать подсистемы для целей тестирования. -// В процедуре нельзя использовать метод ОбщегоНазначения.ПодсистемСуществует т.к. это приводит к рекурсии. +// Если подсистема отключена, то функция ОбщегоНазначения.ПодсистемаСуществует вернет Ложь. +// В этой процедуре нельзя использовать функцию ОбщегоНазначения.ПодсистемСуществует, т.к. это приводит к рекурсии. // // Параметры: -// ОтключенныеПодсистемы - Соответствие - Если подсистема отключена, то метод ОбщегоНазначения.ПодсистемаСуществует вернет Ложь. -// В соответствии ключ - имя отключенной подсистемы, значение необходимо установить в Истина. +// ОтключенныеПодсистемы - Соответствие - в ключе указывается имя отключаемой подсистемы, +// в значении - установить в Истина. // Процедура ПриОпределенииОтключенныхПодсистем(ОтключенныеПодсистемы) Экспорт @@ -165,18 +188,18 @@ КонецПроцедуры -// Обработчик события "Перед загрузкой приоритетных данных в подчиненном РИБ узле". -// Выполняет заполнение настроек размещения сообщения обмена данными или -// нестандартную загрузку приоритетных данных из главного узла. +// Вызывается перед загрузкой приоритетных данных в подчиненном узле РИБ +// и предназначена для заполнения настроек размещения сообщения обмена данными или +// для реализации нестандартной загрузки приоритетных данных из главного узла РИБ. // // К приоритетным данным относятся предопределенные элементы, а также -// элементы справочника Идентификаторы объектов метаданных. +// элементы справочника ИдентификаторыОбъектовМетаданных. // // Параметры: -// СтандартнаяОбработка - Булево, начальное значение Истина, если установить Ложь, -// тогда стандартная загрузка приоритетных данных с помощью подсистемы +// СтандартнаяОбработка - Булево - начальное значение Истина; если установить Ложь, +// то стандартная загрузка приоритетных данных с помощью подсистемы // ОбменДанными будет пропущена (тоже будет и в случае, -// если подсистемы ОбменДанными нет). +// если подсистемы ОбменДанными нет в конфигурации). // Процедура ПередЗагрузкойПриоритетныхДанныхВПодчиненномРИБУзле(СтандартнаяОбработка) Экспорт @@ -184,44 +207,138 @@ КонецПроцедуры -// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию программных интерфейсов, -// используя в качестве ключей имена программных интерфейсов. -// Обеспечивает функциональность Web-сервиса InterfaceVersion. -// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). +// Определяет список версий программных интерфейсов, доступных через web-сервис InterfaceVersion. +// См. также ОбщегоНазначения.ВерсииИнтерфейса. // // Параметры: -// СтруктураПоддерживаемыхВерсий - Структура: -// Ключ - Имя программного интерфейса, -// Значение - Массив(Строка) - поддерживаемые версии программного интерфейса. +// ПоддерживаемыеВерсии - Структура - в ключе указывается имя программного интерфейса, +// а в значениях - массив строк с поддерживаемыми версиями этого интерфейса. // -// Пример реализации: +// Пример: // // // СервисПередачиФайлов -// МассивВерсий = Новый Массив; -// МассивВерсий.Добавить("1.0.1.1"); -// МассивВерсий.Добавить("1.0.2.1"); -// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); +// Версии = Новый Массив; +// Версии.Добавить("1.0.1.1"); +// Версии.Добавить("1.0.2.1"); +// ПоддерживаемыеВерсии.Вставить("СервисПередачиФайлов", Версии); // // Конец СервисПередачиФайлов // -Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий) Экспорт +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии) Экспорт КонецПроцедуры -// Параметры функциональных опций, действие которых распространяется на командный интерфейс и рабочий стол. -// Например, если значения функциональной опции хранятся в ресурсах регистра сведений, -// то параметры функциональных опций могут определять условия отборов по измерениям регистра, -// которые будут применяться при чтении значения этой функциональной опции. +// Задает параметры функциональных опций, действие которых распространяется на командный интерфейс и рабочий стол. +// Например, если значения функциональной опции хранятся в ресурсах регистра сведений, +// то параметры функциональных опций могут определять условия отборов по измерениям регистра, +// которые будут применяться при чтении значения этой функциональной опции. +// +// См. в синтакс-помощнике методы ПолучитьФункциональнуюОпциюИнтерфейса, +// УстановитьПараметрыФункциональныхОпцийИнтерфейса и ПолучитьПараметрыФункциональныхОпцийИнтерфейса. // // Параметры: -// ОпцииИнтерфейса - Структура - Значения параметров функциональных опций, установленных для командного интерфейса. +// ОпцииИнтерфейса - Структура - значения параметров функциональных опций, установленных для командного интерфейса. // Ключ элемента структуры определяет имя параметра, а значение элемента - текущее значение параметра. // -// См. также: -// Методы глобального контекста ПолучитьФункциональнуюОпциюИнтерфейса(), -// УстановитьПараметрыФункциональныхОпцийИнтерфейса() и ПолучитьПараметрыФункциональныхОпцийИнтерфейса(). -// Процедура ПриОпределенииПараметровФункциональныхОпцийИнтерфейса(ОпцииИнтерфейса) Экспорт КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики отправки и получения данных для обмена в распределенной информационной базе. + +// Дополнительный обработчик одноименного события, возникающего при обмене данными в распределенной информационной базе. +// Выполняется после выполнения базовых алгоритмов библиотеки. +// Не выполняется, если отправка элемента данных была проигнорирована ранее. +// +// Параметры: +// Источник - ПланОбменаОбъект - узел, для которого выполняется обмен. +// ЭлементДанных - Произвольный - см. описание одноименного обработчика в синтаксис-помощнике. +// ОтправкаЭлемента - ОтправкаЭлементаДанных - см. описание одноименного обработчика в синтаксис-помощнике. +// СозданиеНачальногоОбраза - Булево - см. описание одноименного обработчика в синтаксис-помощнике. +// +Процедура ПриОтправкеДанныхПодчиненному(Источник, ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза) Экспорт + +КонецПроцедуры + +// Дополнительный обработчик одноименного события, возникающего при обмене данными в распределенной информационной базе. +// Выполняется после выполнения базовых алгоритмов библиотеки. +// Не выполняется, если отправка элемента данных была проигнорирована ранее. +// +// Параметры: +// Источник - ПланОбменаОбъект - узел, для которого выполняется обмен. +// ЭлементДанных - Произвольный - см. описание одноименного обработчика в синтаксис-помощнике. +// ОтправкаЭлемента - ОтправкаЭлементаДанных - см. описание одноименного обработчика в синтаксис-помощнике. +// +Процедура ПриОтправкеДанныхГлавному(Источник, ЭлементДанных, ОтправкаЭлемента) Экспорт + +КонецПроцедуры + +// Дополнительный обработчик одноименного события, возникающего при обмене данными в распределенной информационной базе. +// Выполняется после выполнения базовых алгоритмов библиотеки. +// Не выполняется, если получение элемента данных было проигнорировано ранее. +// +// Параметры: +// Источник - ПланОбменаОбъект - узел, для которого выполняется обмен. +// ЭлементДанных - Произвольный - см. описание одноименного обработчика в синтаксис-помощнике. +// ПолучениеЭлемента - ПолучениеЭлементаДанных - см. описание одноименного обработчика в синтаксис-помощнике. +// ОтправкаНазад - Булево - см. описание одноименного обработчика в синтаксис-помощнике. +// +Процедура ПриПолученииДанныхОтПодчиненного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Экспорт + +КонецПроцедуры + +// Дополнительный обработчик одноименного события, возникающего при обмене данными в распределенной информационной базе. +// Выполняется после выполнения базовых алгоритмов библиотеки. +// Не выполняется, если получение элемента данных было проигнорировано ранее. +// +// Параметры: +// Источник - ПланОбменаОбъект - узел, для которого выполняется обмен. +// ЭлементДанных - Произвольный - см. описание одноименного обработчика в синтаксис-помощнике. +// ПолучениеЭлемента - ПолучениеЭлементаДанных - см. описание одноименного обработчика в синтаксис-помощнике. +// ОтправкаНазад - Булево - см. описание одноименного обработчика в синтаксис-помощнике. +// +Процедура ПриПолученииДанныхОтГлавного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Экспорт + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ПриДобавленииПараметровРаботыКлиентаПриЗапуске. +// +// Позволяет задать значения параметров, необходимых для работы клиентского кода +// при запуске конфигурации (в обработчиках событий ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы) +// без дополнительных серверных вызовов. +// Для получения значений этих параметров из клиентского кода +// см. СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске. +// +// Важно: недопустимо использовать команды сброса кэша повторно используемых модулей, +// иначе запуск может привести к непредсказуемым ошибкам и лишним серверным вызовам. +// +// Параметры: +// Параметры - Структура - имена и значения параметров работы клиента при запуске, которые необходимо задать. +// Для установки параметров работы клиента при запуске: +// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); +// +Процедура ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт + +КонецПроцедуры + +// Устарела. Следует использовать ПриДобавленииПараметровРаботыКлиента. +// +// Позволяет задать значения параметров, необходимых для работы клиентского кода +// конфигурации без дополнительных серверных вызовов. +// Для получения этих параметров из клиентского кода +// см. СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента. +// +// Параметры: +// Параметры - Структура - имена и значения параметров работы клиента, которые необходимо задать. +// Для установки параметров работы клиента: +// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); +// +Процедура ПараметрыРаботыКлиента(Параметры) Экспорт + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl index 414ed321f..0feaaf18e 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl @@ -1,81 +1,96 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Необходимо использовать РаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация. // Возвращает признак наличия в конфигурации общих реквизитов-разделителей. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если это разделенная конфигурация. // Функция ЭтоРазделеннаяКонфигурация() Экспорт - ЕстьРазделители = Ложь; - Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл - Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда - ЕстьРазделители = Истина; - Прервать; - КонецЕсли; - КонецЦикла; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЕстьРазделители = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЕстьРазделители = Ложь; + КонецЕсли; Возврат ЕстьРазделители; КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.РазделителиКонфигурации. // Возвращает массив существующих в конфигурации разделителей. // -// Возвращаемое значение: ФиксированныйМассив(Строка) - массив имен общих реквизитов, которые -// являются разделителями. +// Возвращаемое значение: +// ФиксированныйМассив - массив имен общих реквизитов, которые +// являются разделителями. // Функция РазделителиКонфигурации() Экспорт - МассивРазделителей = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Разделители = МодульРаботаВМоделиСервиса.РазделителиКонфигурации(); + Иначе + Разделители = Новый Массив; + КонецЕсли; - Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл - Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда - МассивРазделителей.Добавить(ОбщийРеквизит.Имя); - КонецЕсли; - КонецЦикла; - - Возврат Новый ФиксированныйМассив(МассивРазделителей); + Возврат Разделители; КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.СоставОбщегоРеквизита. // Возвращает состав общего реквизита с заданным именем. // // Параметры: -// Имя - Строка - Имя общего реквизита. +// Имя - Строка - Имя общего реквизита. // // Возвращаемое значение: -// СоставОбщегоРеквизита. +// СоставОбщегоРеквизита - список объектов метаданных, в которые входит общий реквизит. // Функция СоставОбщегоРеквизита(Знач Имя) Экспорт - Возврат Метаданные.ОбщиеРеквизиты[Имя].Состав; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СоставОбщегоРеквизита = МодульРаботаВМоделиСервиса.СоставОбщегоРеквизита(Имя); + Иначе + СоставОбщегоРеквизита = Неопределено; + КонецЕсли; + + Возврат СоставОбщегоРеквизита; КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных. // Возвращает признак того, что объект метаданных используется в общих реквизитах-разделителях. // // Параметры: -// ИмяОбъектаМетаданных - Строка. -// Разделитель - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. +// ИмяОбъектаМетаданных - Строка - имя объекта, +// Разделитель - Строка - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если это разделенный объект. // Функция ЭтоРазделенныйОбъектМетаданных(Знач ИмяОбъектаМетаданных, Знач Разделитель) Экспорт - Возврат ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ИмяОбъектаМетаданных, Разделитель); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ИмяОбъектаМетаданных); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Возврат ЭтоРазделенныйОбъектМетаданных; КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.РазделительОсновныхДанных. // Возвращает имя общего реквизита, который является разделителем основных данных. // -// Возвращаемое значение: Строка. +// Возвращаемое значение: +// Строка - имя общего реквизита. // Функция РазделительОсновныхДанных() Экспорт @@ -89,9 +104,11 @@ КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.РазделительВспомогательныхДанных. // Возвращает имя общего реквизита, который является разделителем вспомогательных данных. // -// Возвращаемое значение: Строка. +// Возвращаемое значение: +// Строка - имя общего реквизита. // Функция РазделительВспомогательныхДанных() Экспорт @@ -105,36 +122,65 @@ КонецФункции -// Возвращает признак включения условного разделения. -// В случае вызова в неразделенной конфигурации возвращает Ложь. +// Устарела. Необходимо использовать ОбщегоНазначения.РазделениеВключено. +// Возвращает признак работы в режиме разделения данных по областям +// (технически это признак условного разделения). +// +// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение включено. +// - Ложь, если разделение выключено или не поддерживается. // Функция РазделениеВключено() Экспорт - Возврат ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ПолучитьФункциональнуюОпцию("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + РазделениеВключено = МодульРаботаВМоделиСервиса.РазделениеВключено(); + Иначе + РазделениеВключено = Ложь; + КонецЕсли; + + Возврат РазделениеВключено; КонецФункции -// Возвращает признак возможности обращения к разделенным данным из текущего сеанса. -// В случае вызова в неразделенной конфигурации возвращает Истина. +// Устарела. Необходимо использовать ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных. +// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей). +// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено +// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным. +// +// Возвращает Истина, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). // // Возвращаемое значение: -// Булево. +// Булево - Истина, если разделение не поддерживается, либо разделение выключено, +// либо разделение включено и разделители установлены. +// - Ложь, если разделение включено и разделители не установлены. // Функция ДоступноИспользованиеРазделенныхДанных() Экспорт - Возврат НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() ИЛИ ОбщегоНазначения.ИспользованиеРазделителяСеанса(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ДоступноИспользованиеРазделенныхДанных = МодульРаботаВМоделиСервиса.ДоступноИспользованиеРазделенныхДанных(); + Иначе + ДоступноИспользованиеРазделенныхДанных = Истина; + КонецЕсли; + + Возврат ДоступноИспользованиеРазделенныхДанных; КонецФункции -// Возвращает объект ПреобразованиеXSL созданный из общего макета с переданным +// Устарела. Возвращает объект ПреобразованиеXSL созданный из общего макета с переданным // именем. // // Параметры: -// ИмяОбщегоМакет - Строка - имя общего макета типа ДвоичныеДанные содержащего -// файл преобразования XSL. +// ИмяОбщегоМакета - Строка - имя общего макета типа ДвоичныеДанные содержащего +// файл преобразования XSL. // // Возвращаемое значение: -// ПреобразованиеXSL - объект ПреобразованиеXSL. +// ПреобразованиеXSL - объект ПреобразованиеXSL. // Функция ПолучитьПреобразованиеXSLИзОбщегоМакета(Знач ИмяОбщегоМакета) Экспорт @@ -143,7 +189,7 @@ ДанныеМакета.Записать(ИмяФайлаПреобразования); Преобразование = Новый ПреобразованиеXSL; - Преобразование.ЗагрузитьИзФайла(ИмяФайлаПреобразования); + Преобразование.ЗагрузитьТаблицуСтилейXSLИзФайла(ИмяФайлаПреобразования); Попытка УдалитьФайлы(ИмяФайлаПреобразования); @@ -156,20 +202,56 @@ КонецФункции +// Устарела. Необходимо использовать РаботаВМоделиСервиса.СеансЗапущенБезРазделителей. // Определяет, сеанс запущен с разделителями или без. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если сеанс запущен без разделителей. // Функция СеансЗапущенБезРазделителей() Экспорт - Возврат ПользователиИнформационнойБазы.ТекущийПользователь().РазделениеДанных.Количество() = 0; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Возврат СеансЗапущенБезРазделителей; КонецФункции +// Устарела. Для получения нужных свойств следует использовать следующие функции: +// свойство ЭтоАдминистраторСистемы - Пользователи.ЭтоПолноправныйПользователь(, Истина); +// свойство ЭтоАдминистраторПрограммы - Пользователи.ЭтоПолноправныйПользователь(); +// свойство МодельСервиса - ОбщегоНазначение.РазделениеВключено(); +// свойство Автономный - ОбщегоНазначение.ЭтоАвтономноеРабочееМесто(); +// свойство Локальный - Не Автономный И Не МодельСервиса; +// свойство Файловый - ОбщегоНазначения.ИнформационнаяБазаФайловая(); +// свойство КлиентСерверный - Не ОбщегоНазначения.ИнформационнаяБазаФайловая(); +// свойство ЛокальныйФайловый - Локальный И Файловый (см. выше); +// свойство ЛокальныйКлиентСерверный - Локальный И КлиентСерверный (см. выше); +// свойство ЭтоWindowsКлиент - ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент(); +// свойство ЭтоLinuxКлиент - ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент(); +// свойство ЭтоOSXКлиент - ОбщегоНазначенияКлиентСервер.ЭтоOSXКлиент(); +// свойство ЭтоВебКлиент - ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент(). +// // Определяет текущий режим работы программы. -// В частности используется в панелях настроек программы -// для скрытия специализированных интерфейсов, предназначенных не для всех режимов работы. +// Используется в панелях настроек программы для скрытия элементов, не предназначенных сразу для всех режимов работы. +// +// В панелях настроек программы включены 5 интерфейсов: +// - Для администратора сервиса в области данных абонента (АС). +// - Для администратора абонента (АА). +// - Для администратора локального решения в клиент-серверном режиме (ЛКС). +// - Для администратора локального решения в файловом режиме (ЛФ). +// - Для администратора автономного рабочего места (АРМ). +// +// Интерфейсы АС и АА разрезаются при помощи скрытия групп и элементов формы +// для всех ролей, кроме роли "АдминистраторСистемы". +// +// Администратор сервиса, выполнивший вход в область данных, +// должен видеть те же настройки что и администратор абонента +// вместе с настройками сервиса (неразделенными). // // Возвращаемое значение: // Структура - Настройки, описывающие права текущего пользователя и текущий режим работы программы. @@ -190,21 +272,6 @@ // * ЭтоLinuxКлиент - Булево - Истина, если клиентское приложение запущено под управлением ОС Linux. // * ЭтоВебКлиент - Булево - Истина, если клиентское приложение является Веб-клиентом. // -// Описание: -// В панелях настроек программы включены 5 интерфейсов: -// - Для администратора сервиса в области данных абонента (АС). -// - Для администратора абонента (АА). -// - Для администратора локального решения в клиент-серверном режиме (ЛКС). -// - Для администратора локального решения в файловом режиме (ЛФ). -// - Для администратора автономного рабочего места (АРМ). -// -// Интерфейсы АС и АА разрезаются при помощи скрытия групп и элементов формы -// для всех ролей, кроме роли "АдминистраторСистемы". -// -// Администратор сервиса, выполнивший вход в область данных, -// должен видеть те же настройки что и администратор абонента -// вместе с настройками сервиса (неразделенными). -// Функция РежимРаботыПрограммы() Экспорт РежимРаботы = Новый Структура; @@ -241,11 +308,14 @@ #КонецОбласти +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс +// Устарела. Необходимо использовать РаботаВМоделиСервиса.РазделенныеОбъектыМетаданных. // Возвращает список полных имен всех объектов метаданных, использующихся в общем реквизите-разделителе, -// имя которого передано в качестве значения параметра Разделитель, и значения свойств объекта метаданных, -// которые могут потребоваться для дальнейшей его обработки в универсальных алгоритмах. +// имя которого передано в качестве значения параметра Разделитель, и значения свойств объекта метаданных, +// которые могут потребоваться для дальнейшей его обработки в универсальных алгоритмах. // Для последовательностей и журналов документов определяет разделенность по входящим документам: любому из. // // Параметры: @@ -262,130 +332,14 @@ // Функция РазделенныеОбъектыМетаданных(Знач Разделитель) Экспорт - Результат = Новый Соответствие; - - // I. Перебрать состав всех общих реквизитов. - - МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(Разделитель); - Если МетаданныеОбщегоРеквизита = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий реквизит %1 не обнаружен в конфигурации!'"), Разделитель); - КонецЕсли; - - Если МетаданныеОбщегоРеквизита.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда - - СоставОбщегоРеквизита = ОбщегоНазначенияПовтИсп.СоставОбщегоРеквизита(МетаданныеОбщегоРеквизита.Имя); - - ИспользоватьОбщийРеквизит = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать; - АвтоИспользоватьОбщийРеквизит = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Авто; - АвтоИспользованиеОбщегоРеквизита = - (МетаданныеОбщегоРеквизита.АвтоИспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать); - - Для Каждого ЭлементСостава Из СоставОбщегоРеквизита Цикл - - Если (АвтоИспользованиеОбщегоРеквизита И ЭлементСостава.Использование = АвтоИспользоватьОбщийРеквизит) - ИЛИ ЭлементСостава.Использование = ИспользоватьОбщийРеквизит Тогда - - ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", ЭлементСостава.Метаданные.Имя, Разделитель, Неопределено); - Если ЭлементСостава.УсловноеРазделение <> Неопределено Тогда - ДополнительныеДанные.УсловноеРазделение = ЭлементСостава.УсловноеРазделение.ПолноеИмя(); - КонецЕсли; - - Результат.Вставить(ЭлементСостава.Метаданные.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - - // По регистрам расчета дополнительно определяется разделенность подчиненных им перерасчетов. - Если ОбщегоНазначения.ЭтоРегистрРасчета(ЭлементСостава.Метаданные) Тогда - - Перерасчеты = ЭлементСостава.Метаданные.Перерасчеты; - Для Каждого Перерасчет Из Перерасчеты Цикл - - ДополнительныеДанные.Имя = Перерасчет.Имя; - Результат.Вставить(Перерасчет.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Результат = МодульРаботаВМоделиСервиса.РазделенныеОбъектыМетаданных(Разделитель); Иначе - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Для общего реквизита %1 не используется разделение данных!'"), Разделитель); - + Результат = Новый ФиксированноеСоответствие(Новый Соответствие); КонецЕсли; - // II. Для последовательностей и журналов определять разделенность по входящим документам. - - // 1) Последовательности. Перебор с проверкой первого входящего документа. Если документов нет, считаем разделенной. - Для Каждого МетаданныеПоследовательности Из Метаданные.Последовательности Цикл - - ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", МетаданныеПоследовательности.Имя, Разделитель, Неопределено); - - Если МетаданныеПоследовательности.Документы.Количество() = 0 Тогда - - ШаблонСообщения = НСтр("ru = 'В последовательность %1 не включено ни одного документа.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, МетаданныеПоследовательности.Имя); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение разделенных объектов метаданных'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - МетаданныеПоследовательности, , ТекстСообщения); - - Результат.Вставить(МетаданныеПоследовательности.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - - Иначе - - Для Каждого МетаданныеДокумента Из МетаданныеПоследовательности.Документы Цикл - - ДополнительныеДанныеОтДокумента = Результат.Получить(МетаданныеДокумента.ПолноеИмя()); - - Если ДополнительныеДанныеОтДокумента <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(ДополнительныеДанные, ДополнительныеДанныеОтДокумента, "Разделитель,УсловноеРазделение"); - Результат.Вставить(МетаданныеПоследовательности.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - КонецЕсли; - - Прервать; - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - - // 2) Журналы. Перебор с проверкой первого входящего документа. Если документов нет, считаем разделенным. - Для Каждого МетаданныеЖурналаДокументов Из Метаданные.ЖурналыДокументов Цикл - - ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", МетаданныеЖурналаДокументов.Имя, Разделитель, Неопределено); - - Если МетаданныеЖурналаДокументов.РегистрируемыеДокументы.Количество() = 0 Тогда - - ШаблонСообщения = НСтр("ru = 'В журнал %1 не включено ни одного документа.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, МетаданныеЖурналаДокументов.Имя); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение разделенных объектов метаданных'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - МетаданныеЖурналаДокументов, , ТекстСообщения); - - Результат.Вставить(МетаданныеЖурналаДокументов.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - - Иначе - - Для Каждого МетаданныеДокумента Из МетаданныеЖурналаДокументов.РегистрируемыеДокументы Цикл - - ДополнительныеДанныеОтДокумента = Результат.Получить(МетаданныеДокумента.ПолноеИмя()); - - Если ДополнительныеДанныеОтДокумента <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(ДополнительныеДанные, ДополнительныеДанныеОтДокумента, "Разделитель,УсловноеРазделение"); - Результат.Вставить(МетаданныеЖурналаДокументов.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); - КонецЕсли; - - Прервать; - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - - Возврат Новый ФиксированноеСоответствие(Результат); + Возврат Результат; КонецФункции @@ -410,9 +364,9 @@ Возврат Ложь; КонецЕсли; - МодульОбменДаннымиПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиПовтИсп"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - Возврат МодульОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто(); + Возврат МодульОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто(); КонецФункции @@ -420,156 +374,6 @@ #Область СлужебныеПроцедурыИФункции -// Возвращает данные кэша версий из ресурса типа ХранилищеЗначения регистра КэшПрограммныхИнтерфейсов. -// -// Параметры: -// Идентификатор - Строка - идентификатор записи кэша. -// ТипДанных - ПеречислениеСсылка.ТипыДанныхКэшаПрограммныхИнтерфейсов. -// ПараметрыПолучения - Строка - массив параметров сериализованный в XML для передачи в метод обновления кэша. -// ВозвращатьУстаревшиеДанные - Булево - флаг определяющий необходимость ожидания обновления -// данных в кэше перед возвратом значения, в случае обнаружения факта их устаревания. -// Истина - всегда использовать данные из кэша, если они там есть. Ложь - ожидать -// обновления данных кэша, в случае обнаружения факта устаревания данных. -// -// Возвращаемое значение: -// Произвольный. -// -Функция ДанныеКэшаВерсий(Знач Идентификатор, Знач ТипДанных, Знач ПараметрыПолучения, Знач ИспользоватьУстаревшиеДанные = Истина) Экспорт - - ПараметрыПолучения = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыПолучения); - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТаблицаКэша.ДатаОбновления КАК ДатаОбновления, - | ТаблицаКэша.Данные КАК Данные, - | ТаблицаКэша.ТипДанных КАК ТипДанных - |ИЗ - | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша - |ГДЕ - | ТаблицаКэша.Идентификатор = &Идентификатор - | И ТаблицаКэша.ТипДанных = &ТипДанных"; - Запрос.УстановитьПараметр("Идентификатор", Идентификатор); - Запрос.УстановитьПараметр("ТипДанных", ТипДанных); - - НачатьТранзакцию(); - Попытка - // Не устанавливаем управляемую блокировку, чтобы другие сеансы могли изменять значение пока эта транзакция активна. - Результат = Запрос.Выполнить(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - ТребуетсяВыполнитьОбновление = Ложь; - ТребуетсяПеречитатьДанные = Ложь; - - Если Результат.Пустой() Тогда - - ТребуетсяВыполнитьОбновление = Истина; - ТребуетсяПеречитатьДанные = Истина; - - Иначе - - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Если ОбщегоНазначения.ЗаписьКэшаВерсийУстарела(Выборка) Тогда - ТребуетсяВыполнитьОбновление = Истина; - ТребуетсяПеречитатьДанные = НЕ ИспользоватьУстаревшиеДанные; - КонецЕсли; - КонецЕсли; - - Если ТребуетсяВыполнитьОбновление Тогда - - ОбновлениеВТекущемСеансе = ТребуетсяПеречитатьДанные - Или ОбщегоНазначения.ИнформационнаяБазаФайловая() - Или МонопольныйРежим() - Или ОбщегоНазначенияКлиентСервер.РежимОтладки() - Или ТекущийРежимЗапуска() = Неопределено; - - Если ОбновлениеВТекущемСеансе Тогда - ОбщегоНазначения.ОбновитьДанныеКэшаВерсий(Идентификатор, ТипДанных, ПараметрыПолучения); - ТребуетсяПеречитатьДанные = Истина; - Иначе - ИмяМетодаЗадания = "ОбщегоНазначения.ОбновитьДанныеКэшаВерсий"; - НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление кэша версий. Идентификатор записи %1. Тип данных %2.'"), - Идентификатор, - ТипДанных); - ПараметрыЗадания = Новый Массив; - ПараметрыЗадания.Добавить(Идентификатор); - ПараметрыЗадания.Добавить(ТипДанных); - ПараметрыЗадания.Добавить(ПараметрыПолучения); - - ОтборЗаданий = Новый Структура; - ОтборЗаданий.Вставить("ИмяМетода", ИмяМетодаЗадания); - ОтборЗаданий.Вставить("Наименование", НаименованиеЗадания); - ОтборЗаданий.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - - Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборЗаданий); - Если Задания.Количество() = 0 Тогда - // Запустим новое. - ДлительныеОперации.ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяМетодаЗадания, - ПараметрыЗадания,, НаименованиеЗадания); - КонецЕсли; - КонецЕсли; - - Если ТребуетсяПеречитатьДанные Тогда - - НачатьТранзакцию(); - Попытка - // Не устанавливаем управляемую блокировку что бы другие сеансы могли изменять значение пока эта транзакция активна. - Результат = Запрос.Выполнить(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Результат.Пустой() Тогда - ШаблонСообщения = НСтр("ru = 'Ошибка при обновлении кэша версий. Данные не получены. - |Идентификатор записи: %1 - |Тип данных: %2'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Идентификатор, ТипДанных); - - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - КонецЕсли; - - КонецЕсли; - - Возврат Выборка.Данные.Получить(); - -КонецФункции -// Возвращает объект WSОпределения созданный с переданными параметрами. -// -// Параметры: -// АдресWSDL - Строка - месторасположение wsdl. -// ИмяПользователя - Строка - имя пользователя для входа на сервер. -// Пароль - Строка - пароль пользователя. -// -// Примечание: при получении определения используется кэш, обновление которого осуществляется -// при смене версии конфигурации. Если для целей отладки требуется обновить -// значения в кэше, раньше этого времени, следует удалить из регистра сведений. -// КэшПрограммныхИнтерфейсов соответствующие записи. -// -Функция WSОпределения(Знач АдресWSDL, Знач ИмяПользователя, Знач Пароль) Экспорт - - Возврат ОбщегоНазначения.WSОпределения(АдресWSDL, ИмяПользователя, Пароль); - -КонецФункции - -Функция СоздатьWSПрокси(Параметры) Экспорт - - Возврат ОбщегоНазначения.ВнутренняяWSПрокси(ОбщегоНазначения.ЗначениеИзСтрокиXML(Параметры)); - -КонецФункции - // Параметры, применяемых к элементам командного интерфейса, связанных с параметрическими функциональными опциями. Функция ОпцииИнтерфейса() Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl new file mode 100644 index 000000000..841ff95b1 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl @@ -0,0 +1,489 @@ +//////////////////////////////////////////////////////////////////////////////// +// Клиентские процедуры и функции общего назначения +// +//////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Параметры: +// Контекст - Структура - контекст процедуры: +// * Оповещение - ОписаниеОповещения - . +// * Идентификатор - Строка - . +// * Местоположение - Строка - . +// * Кэшировать - Булево - . +// * ПредложитьУстановить - Булево - . +// * ТекстПояснения - Строка - . +// +Процедура ПодключитьКомпоненту(Контекст) Экспорт + + Если Не МестоположениеКомпонентыКорректно(Контекст.Местоположение) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Некорректное значение параметра Местоположение (%1) + |в ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпоненту'"), Контекст.Местоположение); + КонецЕсли; + + Если Контекст.Кэшировать Тогда + + // Получение из кэша экземпляра внешней компоненты. + + ПодключаемыйМодуль = Неопределено; + КэшированныеКомпоненты = ПараметрыПриложения["СтандартныеПодсистемы.ВнешниеКомпоненты.КэшированныеКомпоненты"]; + + Если ТипЗнч(КэшированныеКомпоненты) = Тип("ФиксированноеСоответствие") Тогда + ПодключаемыйМодуль = КэшированныеКомпоненты.Получить(Контекст.Местоположение); + КонецЕсли; + + Если ПодключаемыйМодуль <> Неопределено Тогда + + Результат = Новый Структура; + Результат.Вставить("Подключено", Истина); + Результат.Вставить("ПодключаемыйМодуль", ПодключаемыйМодуль); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + + КонецЕсли; + + КонецЕсли; + + СимволическоеИмя = "С" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); //генерация уникального имени + Контекст.Вставить("СимволическоеИмя", СимволическоеИмя); + + Оповещение = Новый ОписаниеОповещения( + "ПодключитьКомпонентуЗавершение", ЭтотОбъект, Контекст, + "ПодключитьКомпонентуЗавершениеПоОшибке", ЭтотОбъект); + + НачатьПодключениеВнешнейКомпоненты(Оповещение, Контекст.Местоположение, СимволическоеИмя); + +КонецПроцедуры + +// Параметры: +// Контекст - Структура - контекст процедуры: +// * Оповещение - ОписаниеОповещения - . +// * Местоположение - Строка - . +// * ТекстПояснения - Строка - . +// +Процедура УстановитьКомпоненту(Контекст) Экспорт + + Если Не МестоположениеКомпонентыКорректно(Контекст.Местоположение) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Некорректное значение параметра Местоположение (%1) + |в ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпоненту'"), Контекст.Местоположение); + КонецЕсли; + +#Если ВебКлиент Тогда + + Оповещение = Новый ОписаниеОповещения( + "УстановитьКомпонентуПослеОтветаНаВопросОбУстановке", ЭтотОбъект, Контекст); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстПояснения", Контекст.ТекстПояснения); + + ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеВнешнейКомпоненты", + ПараметрыФормы,,,,, Оповещение); + +#Иначе + + УстановитьКомпонентуНачатьУстановку(Контекст); + +#КонецЕсли + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения(Подключено, ДополнительныеПараметры) Экспорт + + // Если расширение и так уже подключено, незачем про него спрашивать. + Если Подключено Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется"); + Возврат; + КонецЕсли; + + // В веб клиенте под MacOS расширение не доступно. + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоMacКлиент = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64); + Если ЭтоMacКлиент Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение); + Возврат; + КонецЕсли; + + ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"; + ПервоеОбращениеЗаСеанс = ПараметрыПриложения[ИмяПараметра] = Неопределено; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, ОбщегоНазначенияКлиент.ПредлагатьУстановкуРасширенияРаботыСФайлами()); + КонецЕсли; + ПредлагатьУстановкуРасширенияРаботыСФайлами = ПараметрыПриложения[ИмяПараметра] Или ПервоеОбращениеЗаСеанс; + + Если ДополнительныеПараметры.ВозможноПродолжениеБезУстановки И Не ПредлагатьУстановкуРасширенияРаботыСФайлами Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение); + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстПредложения", ДополнительныеПараметры.ТекстПредложения); + ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", ДополнительныеПараметры.ВозможноПродолжениеБезУстановки); + ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы,,,,,ДополнительныеПараметры.ОписаниеОповещенияЗавершение); + +КонецПроцедуры + +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт + + РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется"); +#Если ВебКлиент Тогда + Если Действие = "БольшеНеПредлагать" + Или Действие = "РасширениеПодключено" Тогда + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь; + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Ложь); + КонецЕсли; +#КонецЕсли + + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено); + +КонецПроцедуры + +Процедура ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт + + Если РасширениеПодключено Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗакрытии); + Возврат; + КонецЕсли; + + ТекстСообщения = ДополнительныеПараметры.ТекстПредупреждения; + Если ПустаяСтрока(ТекстСообщения) Тогда + ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не установлено расширение для веб-клиента 1С:Предприятие.'") + КонецЕсли; + ПоказатьПредупреждение(, ТекстСообщения); + +КонецПроцедуры + +Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт + + Если ВведенныйТекст = Неопределено Тогда + Возврат; + КонецЕсли; + + РеквизитФормы = ДополнительныеПараметры.ФормаВладелец; + + ПутьКРеквизитуФормы = СтрРазделить(ДополнительныеПараметры.ИмяРеквизита, "."); + // Если реквизит вида "Объект.Комментарий" и т.п. + Если ПутьКРеквизитуФормы.Количество() > 1 Тогда + Для Индекс = 0 По ПутьКРеквизитуФормы.Количество() - 2 Цикл + РеквизитФормы = РеквизитФормы[ПутьКРеквизитуФормы[Индекс]]; + КонецЦикла; + КонецЕсли; + + РеквизитФормы[ПутьКРеквизитуФормы[ПутьКРеквизитуФормы.Количество() - 1]] = ВведенныйТекст; + ДополнительныеПараметры.ФормаВладелец.Модифицированность = Истина; + +КонецПроцедуры + +Процедура ЗарегистрироватьCOMСоединительЗавершение(Ответ, Параметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина); + ЗавершитьРаботуСистемы(Истина, Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеФормы() Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); + КонецЕсли; + + Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; + Если Параметры = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект, Параметры); + Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда + ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); + Иначе + ТекстВопроса = Параметры.ТекстПредупреждения; + КонецЕсли; + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , + КодВозвратаДиалога.Нет); + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеФормыЗавершение(Ответ, Параметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ВыполнитьОбработкуОповещения(Параметры.ОповещениеСохранитьИЗакрыть); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда + Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; + Форма.Модифицированность = Ложь; + Форма.Закрыть(); + Иначе + Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; + Форма.Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеПроизвольнойФормы() Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); + КонецЕсли; + + Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; + Если Параметры = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; + РежимВопроса = РежимДиалогаВопрос.ДаНет; + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение", ЭтотОбъект, Параметры); + + ПоказатьВопрос(Оповещение, Параметры.ТекстПредупреждения, РежимВопроса); + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение(Ответ, Параметры) Экспорт + + Форма = Параметры.Форма; + Если Ответ = КодВозвратаДиалога.Да + Или Ответ = КодВозвратаДиалога.ОК Тогда + Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Истина; + Если Параметры.ОписаниеОповещенияЗакрыть <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияЗакрыть); + КонецЕсли; + Форма.Закрыть(); + Иначе + Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Ложь; + КонецЕсли; + +КонецПроцедуры + +Функция ИмяОбъектаМетаданных(Тип) Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ИменаОбъектовМетаданных"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Новый Соответствие); + КонецЕсли; + ИменаОбъектовМетаданных = ПараметрыПриложения[ИмяПараметра]; + + Результат = ИменаОбъектовМетаданных[Тип]; + Если Результат = Неопределено Тогда + Результат = СтандартныеПодсистемыВызовСервера.ИмяОбъектаМетаданных(Тип); + ИменаОбъектовМетаданных.Вставить(Тип, Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция МестоположениеКомпонентыКорректно(Местоположение) + + Если СтрНачинаетсяС(Местоположение, "e1cib/") Тогда + Возврат Истина; + КонецЕсли; + + ШагиПути = СтрРазделить(Местоположение, "."); + Если ШагиПути.Количество() < 2 Тогда + Возврат Ложь; + КонецЕсли; + + Путь = Новый Структура; + Попытка + Для каждого ШагПути Из ШагиПути Цикл + Путь.Вставить(ШагПути); + КонецЦикла; + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +#Область ПодключениеВнешнейКомпоненты + +// Продолжение процедуры ПодключитьКомпоненту. +Процедура ПодключитьКомпонентуЗавершение(Подключено, Контекст) Экспорт + + ПодключаемыйМодуль = Неопределено; + + Результат = Новый Структура; + Результат.Вставить("Подключено", Подключено); + + Если Не Подключено Тогда + + Если Контекст.ПредложитьУстановить Тогда + + ПодключитьКомпонентуНачатьУстановку(Контекст); + Возврат; + + КонецЕсли; + + Результат.Вставить("ОписаниеОшибки", НСтр("ru = 'Ошибка при подключении внешней компоненты'")); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + + КонецЕсли; + + Попытка + + ПодключаемыйМодуль = Новый("AddIn." + Контекст.СимволическоеИмя + "." + Контекст.Идентификатор); + + Если ПодключаемыйМодуль = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Ошибка при создании экземпляра внешней компоненты'"); + КонецЕсли; + + Исключение + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если Контекст.Кэшировать Тогда + + // Помещение в кэш экземпляра внешней компоненты. + + Соответствие = Новый Соответствие; + КэшированныеКомпоненты = ПараметрыПриложения["СтандартныеПодсистемы.ВнешниеКомпоненты.КэшированныеКомпоненты"]; + Если ТипЗнч(КэшированныеКомпоненты) = Тип("ФиксированноеСоответствие") Тогда + Для Каждого Элемент Из КэшированныеКомпоненты Цикл + Соответствие.Вставить(Элемент.Ключ, Элемент.Значение); + КонецЦикла; + КонецЕсли; + + Соответствие.Вставить(Контекст.Местоположение, ПодключаемыйМодуль); + + ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ВнешниеКомпоненты.КэшированныеКомпоненты", + Новый ФиксированноеСоответствие(Соответствие)); + + КонецЕсли; + + Результат.Вставить("ПодключаемыйМодуль", ПодключаемыйМодуль); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Продолжение процедуры ПодключитьКомпоненту. +Процедура ПодключитьКомпонентуНачатьУстановку(Контекст) + + Оповещение = Новый ОписаниеОповещения( + "ПодключитьКомпонентуПослеУстановки", ЭтотОбъект, Контекст); + + КонтекстУстановки = Новый Структура; + КонтекстУстановки.Вставить("Оповещение" , Оповещение); + КонтекстУстановки.Вставить("Местоположение", Контекст.Местоположение); + КонтекстУстановки.Вставить("ТекстПояснения", Контекст.ТекстПояснения); + + УстановитьКомпоненту(КонтекстУстановки); + +КонецПроцедуры + +// Продолжение процедуры ПодключитьКомпоненту. +Процедура ПодключитьКомпонентуПослеУстановки(Результат, Контекст) Экспорт + + Если Не Результат.Установлено Тогда + + РезультатПодключения = Новый Структура; + РезультатПодключения.Вставить("Подключено" , Ложь); + РезультатПодключения.Вставить("ОписаниеОшибки", Результат.ОписаниеОшибки); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатПодключения); + Возврат; + + КонецЕсли; + + Контекст.ПредложитьУстановить = Ложь; // Одна попытка установки уже прошла. + ПодключитьКомпоненту(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ПодключитьКомпоненту. +Процедура ПодключитьКомпонентуЗавершениеПоОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + Результат = Новый Структура; + Результат.Вставить("Подключено" , Ложь); + Результат.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область УстановкаВнешнейКомпоненты + +// Продолжение процедуры УстановитьКомпоненту. +Процедура УстановитьКомпонентуПослеОтветаНаВопросОбУстановке(Ответ, Контекст) Экспорт + + // Результат: + // - КодВозвратаДиалога.Да - Установить. + // - КодВозвратаДиалога.Отмена - Отклонить. + // - Неопределено - Закрыто окно. + Если Ответ = КодВозвратаДиалога.Да Тогда + УстановитьКомпонентуНачатьУстановку(Контекст); + Иначе + Результат = Новый Структура; + Результат.Вставить("Установлено" , Ложь); + Результат.Вставить("ОписаниеОшибки", ""); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры УстановитьКомпоненту. +Процедура УстановитьКомпонентуНачатьУстановку(Контекст) + + Если Не МестоположениеКомпонентыКорректно(Контекст.Местоположение) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Некорректное значение параметра Местоположение (%1) + |в ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпонентуНачатьУстановку'"), Контекст.Местоположение); + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения( + "УстановитьКомпонентуЗавершение", ЭтотОбъект, Контекст, + "УстановитьКомпонентуЗавершениеПоОшибке", ЭтотОбъект); + + // Если компонента была ранее подключена, то выдается интерактивное сообщение платформой вместо исключения. + // Скорее всего ошибка платформы. + + НачатьУстановкуВнешнейКомпоненты(Оповещение, Контекст.Местоположение); + +КонецПроцедуры + +// Продолжение процедуры УстановитьКомпоненту. +Процедура УстановитьКомпонентуЗавершение(Контекст) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Установлено", Истина); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Продолжение процедуры УстановитьКомпоненту. +Процедура УстановитьКомпонентуЗавершениеПоОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + Результат = Новый Структура; + Результат.Вставить("Установлено" , Ложь); + Результат.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/ОбщегоНазначенияСлужебныйКлиент.mdo similarity index 63% rename from SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo rename to SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/ОбщегоНазначенияСлужебныйКлиент.mdo index d957d4251..54e1b7bea 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/ОбщегоНазначенияСлужебныйКлиент.mdo @@ -1,9 +1,9 @@ - - НастройкаПорядкаЭлементовКлиент + + ОбщегоНазначенияСлужебныйКлиент ru - Настройка порядка элементов клиент + Общего назначения служебный клиент true true diff --git a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl index cedb60c0f..a87908e87 100644 --- a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Отправляет SMS через настроенного поставщика услуги, возвращает идентификатор сообщения. @@ -14,12 +9,12 @@ // ПеревестиВТранслит - Булево - Истина, если требуется переводить текст сообщения в транслит перед отправкой. // // Возвращаемое значение: -// Структура: +// Структура - результат отправки: // * ОтправленныеСообщения - Массив - массив структур: -// ** НомерПолучателя - Строка. -// ** ИдентификаторСообщения - Строка. -// * ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// ** НомерПолучателя - Строка - номер получателя SMS. +// ** ИдентификаторСообщения - Строка - идентификатор SMS, присвоенный провайдером для отслеживания доставки. +// * ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, то ошибки нет. +// Функция ОтправитьSMS(НомераПолучателей, Знач Текст, ИмяОтправителя = Неопределено, ПеревестиВТранслит = Ложь) Экспорт ПроверитьПрава(); @@ -143,6 +138,9 @@ КонецФункции // Проверяет правильность сохраненных настроек отправки SMS. +// +// Возвращаемое значение: +// Булево - Истина, если отправка SMS уже настроена. Функция НастройкаОтправкиSMSВыполнена() Экспорт УстановитьПривилегированныйРежим(Истина); @@ -166,6 +164,10 @@ КонецФункции // Проверяет возможность отправки SMS для текущего пользователя. +// +// Возвращаемое значение: +// Булево - Истина, если отправка SMS настроена, и у текущего пользователя достаточно прав для отправки SMS. +// Функция ДоступнаОтправкаSMS() Экспорт Возврат Пользователи.РолиДоступны("ОтправкаSMS") И НастройкаОтправкиSMSВыполнена() Или Пользователи.ЭтоПолноправныйПользователь(); КонецФункции @@ -174,19 +176,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ОтправкаSMS"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "ОтправкаSMS"); - - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обновление ИБ. @@ -202,42 +191,46 @@ УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + Параметры.Вставить("ДоступнаОтправкаSMS", ДоступнаОтправкаSMS()); +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезБилайн.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезМТС.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезSMSRU.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезSMSЦЕНТР.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезСМСУслуги.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезGSMINFORM.Разрешения())); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ДополнительныеРазрешения())); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезБилайн.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезМТС.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезSMSRU.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезSMSЦЕНТР.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезСМСУслуги.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОтправкаSMSЧерезGSMINFORM.Разрешения())); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ДополнительныеРазрешения())); - -КонецПроцедуры - Функция ДополнительныеРазрешения() Разрешения = Новый Массив; ОтправкаSMSПереопределяемый.ПриПолученииРазрешений(Разрешения); @@ -245,16 +238,6 @@ Возврат Разрешения; КонецФункции -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - Параметры.Вставить("ДоступнаОтправкаSMS", ДоступнаОтправкаSMS()); -КонецПроцедуры - Процедура ПроверитьПрава() Экспорт Если Не Пользователи.РолиДоступны("ОтправкаSMS") Тогда ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); diff --git a/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl index 9686b328d..5e1c5f14a 100644 --- a/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму для отправки нового SMS. @@ -18,7 +13,7 @@ СтандартнаяОбработка = Истина; ОтправкаSMSКлиентПереопределяемый.ПриОтправкеSMS(НомераПолучателей, Текст, ДополнительныеПараметры, СтандартнаяОбработка); Если СтандартнаяОбработка Тогда - ПараметрыОтправки = Новый Структура("НомераПолучателей, Текст, ДополнительныеПараметры, ПараметрыРаботыКлиента"); + ПараметрыОтправки = Новый Структура("НомераПолучателей, Текст, ДополнительныеПараметры"); ПараметрыОтправки.НомераПолучателей = НомераПолучателей; ПараметрыОтправки.Текст = Текст; Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда @@ -51,7 +46,7 @@ // Процедура ПроверитьНаличиеНастроекДляОтправкиSMS(ОбработчикРезультата) - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ПараметрыРаботыКлиента.ДоступнаОтправкаSMS Тогда ВыполнитьОбработкуОповещения(ОбработчикРезультата, Истина); Иначе @@ -68,7 +63,7 @@ КонецПроцедуры Процедура ПослеНастройкиSMS(Результат, ОбработчикРезультата) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ПараметрыРаботыКлиента.ДоступнаОтправкаSMS Тогда ВыполнитьОбработкуОповещения(ОбработчикРезультата, Истина); КонецЕсли; @@ -77,7 +72,7 @@ // Продолжение процедуры ОтправитьSMS. Процедура СоздатьНовоеSMSПроверкаНастроекВыполнена(ОтправкаSMSНастроена, ПараметрыОтправки) Экспорт Если ОтправкаSMSНастроена Тогда - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") И ПараметрыРаботыКлиента.ИспользоватьПрочиеВзаимодействия Тогда Адресаты = Новый Массив; diff --git a/SSL/src/CommonModules/ОтправкаSMSКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSКлиентПереопределяемый/Module.bsl index d951d5163..218434734 100644 --- a/SSL/src/CommonModules/ОтправкаSMSКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму для отправки нового SMS. diff --git a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl index 7b543ea67..926837f1e 100644 --- a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Отправляет SMS через настроенного поставщика услуги. @@ -30,7 +25,8 @@ // Запрашивает статус доставки SMS у поставщика услуг. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный SMS при отправке; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный SMS при отправке. +// Провайдер - ПеречислениеСсылка.ПровайдерыSMS - провайдер услуги отправки SMS. // Логин - Строка - логин для доступа к услуге отправки SMS. // Пароль - Строка - пароль для доступа к услуге отправки SMS. // Результат - Строка - (возвращаемое значение) статус доставки, @@ -44,7 +40,7 @@ // Проверяет правильность сохраненных настроек отправки SMS. // // Параметры: -// НастройкиОтправкиSMS - Структура: +// НастройкиОтправкиSMS - Структура - описание текущих настроек отправки SMS: // * Провайдер - ПеречислениеСсылка.ПровайдерыSMS; // * Логин - Строка; // * Пароль - Строка; diff --git a/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl index c1ad9f4db..d6914d07e 100644 --- a/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция СтатусДоставки(ИдентификаторСообщения) Экспорт @@ -41,7 +36,7 @@ Функция НастройкиОтправкиSMS() Экспорт Результат = Новый Структура("Логин, Пароль, Провайдер, ИмяОтправителя"); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ПровайдерSMS"); УстановитьПривилегированныйРежим(Истина); НастройкиПровайдера = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "Пароль,Логин,ИмяОтправителя"); diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезGSMINFORM/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезGSMINFORM/Module.bsl index 15b393388..be19d79b1 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезGSMINFORM/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезGSMINFORM/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через GSM-INFORM. @@ -293,9 +288,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через ""GSM-INFORM"".'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl index 5ef26ef1f..5e2448cb8 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через SMS.RU. @@ -32,23 +27,10 @@ Возврат Результат; КонецЕсли; - // Получение токена. - ИмяФайлаОтвета = ВыполнитьЗапрос("auth/get_token", Новый Структура); - ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаОтвета); - Токен = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - // Подготовка передачи пароля. - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL)+Токен); - КодАвторизации = НРег(СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "")); - // Подготовка параметров запроса. ПараметрыЗапроса = Новый Структура; ПараметрыЗапроса.Вставить("login", Логин); - ПараметрыЗапроса.Вставить("token", Токен); - ПараметрыЗапроса.Вставить("sig", КодАвторизации); - + ПараметрыЗапроса.Вставить("password", Пароль); ПараметрыЗапроса.Вставить("text", Текст); ПараметрыЗапроса.Вставить("to", СтрокаПолучателей); ПараметрыЗапроса.Вставить("from", ИмяОтправителя); @@ -78,6 +60,8 @@ КонецЦикла; Иначе Результат.ОписаниеОшибки = ОписаниеОшибкиОтправки(ОтветСервера); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , Результат.ОписаниеОшибки); КонецЕсли; ЧтениеТекста.Закрыть(); УдалитьФайлы(ИмяФайлаОтвета); @@ -99,22 +83,10 @@ Логин = НастройкиОтправкиSMS.Логин; Пароль = НастройкиОтправкиSMS.Пароль; - // Получение токена. - ИмяФайлаОтвета = ВыполнитьЗапрос("auth/get_token", Новый Структура); - ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаОтвета); - Токен = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - // Подготовка передачи пароля. - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL)+Токен); - КодАвторизации = НРег(СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "")); - // Подготовка параметров запроса. ПараметрыЗапроса = Новый Структура; ПараметрыЗапроса.Вставить("login", Логин); - ПараметрыЗапроса.Вставить("token", Токен); - ПараметрыЗапроса.Вставить("sig", КодАвторизации); + ПараметрыЗапроса.Вставить("password", Пароль); ПараметрыЗапроса.Вставить("id", ИдентификаторСообщения); // отправка запроса @@ -215,7 +187,7 @@ // Отправка запроса и получение ответа. Попытка - Соединение = Новый HTTPСоединение("sms.ru", , , , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), 60); + Соединение = Новый HTTPСоединение("sms.ru", , , , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), 60, Новый ЗащищенноеСоединениеOpenSSL); Соединение.ОтправитьДляОбработки(ИмяФайлаЗапроса, "/" + ИмяМетода, ИмяФайлаОтвета, Заголовок); Результат = ИмяФайлаОтвета; Исключение @@ -297,9 +269,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через ""SMS.RU"".'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl index 8ed64ef90..55c0ee2b3 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через SMS-ЦЕНТР. @@ -33,9 +28,7 @@ КонецЕсли; // Подготовка передачи пароля. - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Пароль); - КодАвторизации = НРег(СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "")); + КодАвторизации = НРег(ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Пароль)); // Подготовка параметров запроса. ПараметрыЗапроса = Новый Структура; @@ -296,9 +289,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через ""SMS-ЦЕНТР"".'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl index f916fb785..ffa6610ea 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через Билайн. @@ -243,9 +238,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через Билайн.'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl index d881e3fa9..88d4bc32a 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через МТС. @@ -22,8 +17,7 @@ Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Знач Пароль) Экспорт Результат = Новый Структура("ОтправленныеСообщения,ОписаниеОшибки", Новый Массив, ""); - Пароль = ВычислитьХешСтрокиПоАлгоритмуMD5(Пароль); - + Пароль = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Пароль); ИдентификаторыПолучателей = Новый Массив; Для Каждого Элемент Из НомераПолучателей Цикл @@ -47,14 +41,17 @@ ArrayOfSendMessageIDs = ВебСервис.SendMessages(ArrayOfString, Лев(Текст, 1000), ИмяОтправителя, Логин, Пароль); ОтветПолучен = Истина; Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КодОшибки = КодОшибкиИзОписания(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки = ОписаниеОшибкиПоКоду(КодОшибки); + ЗаписьЖурналаРегистрации( НСтр("ru = 'Отправка SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Результат.ОписаниеОшибки = НСтр("ru = 'Не удалось отправить SMS'") - + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + Результат.ОписаниеОшибки = НСтр("ru = 'Не удалось отправить SMS'") + ": " + ТекстОшибки; КонецПопытки; Если ОтветПолучен Тогда @@ -80,15 +77,9 @@ // Строка - статус доставки. См. описание функции ОтправкаSMS.СтатусДоставки. Функция СтатусДоставки(ИдентификаторСообщения, НастройкиОтправкиSMS) Экспорт Логин = НастройкиОтправкиSMS.Логин; - Пароль = ВычислитьХешСтрокиПоАлгоритмуMD5(НастройкиОтправкиSMS.Пароль); + Пароль = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(НастройкиОтправкиSMS.Пароль); ВебСервис = ПодключитьВебСервис(); - Попытка - ArrayOfDeliveryInfo = ВебСервис.GetMessageStatus(ИдентификаторСообщения, Логин, Пароль); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Возврат "Ошибка"; - КонецПопытки; + ArrayOfDeliveryInfo = ВебСервис.GetMessageStatus(ИдентификаторСообщения, Логин, Пароль); Для Каждого DeliveryInfo Из ArrayOfDeliveryInfo.DeliveryInfo Цикл Возврат СтатусДоставкиSMS(DeliveryInfo.DeliveryStatus); КонецЦикла; @@ -133,10 +124,56 @@ КонецФункции -Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка) - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Строка); - Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); +Функция ОписанияОшибок() + ОписанияОшибок = Новый Соответствие; + ОписанияОшибок.Вставить("SYSTEM_FAILURE", НСтр("ru = 'Временная проблема на стороне МТС.'")); + ОписанияОшибок.Вставить("TOO_MANY_PARAMETERS", НСтр("ru = 'Превышено максимальное число параметров.'")); + ОписанияОшибок.Вставить("INCORRECT_PASSWORD", НСтр("ru = 'Предоставленные логин/пароль не верны.'")); + ОписанияОшибок.Вставить("MSID_FORMAT_ERROR", НСтр("ru = 'Формат номера неверный.'")); + ОписанияОшибок.Вставить("MESSAGE_FORMAT_ERROR", НСтр("ru = 'Ошибка в формате сообщения'")); + ОписанияОшибок.Вставить("WRONG_ID", НСтр("ru = 'Передан неверный идентификатор'")); + ОписанияОшибок.Вставить("MESSAGE_HANDLING_ERROR", НСтр("ru = 'Ошибка в обработке сообщения'")); + ОписанияОшибок.Вставить("NO_SUCH_SUBSCRIBER", НСтр("ru = 'Данный абонент не зарегистрирован в Услуге в учетной записи клиента (или еще не дал подтверждение).'")); + ОписанияОшибок.Вставить("TEST_LIMIT_EXCEEDED", НСтр("ru = 'Превышен лимит по количеству сообщений в тестовой эксплуатации.'")); + ОписанияОшибок.Вставить("TRUSTED_LIMIT_EXCEEDED", НСтр("ru = 'Превышен лимит по количеству сообщений для абонентов, которые были добавлены без подтверждения.'")); + ОписанияОшибок.Вставить("IP_NOT_ALLOWED", НСтр("ru = 'Доступ к сервису с данного IP невозможен (список допустимых IP-адресов можно указывается при подключении услуги).'")); + ОписанияОшибок.Вставить("MAX_LENGTH_EXCEEDED", НСтр("ru = 'Превышена максимальная длина сообщения (1000 символов).'")); + ОписанияОшибок.Вставить("OPERATION_NOT_ALLOWED", НСтр("ru = 'Пользователь услуги не имеет прав на выполнение данной операции.'")); + ОписанияОшибок.Вставить("EMPTY_MESSAGE_NOT_ALLOWED", НСтр("ru = 'Отправка пустых сообщений не допускается.'")); + ОписанияОшибок.Вставить("ACCOUNT_IS_BLOCKED", НСтр("ru = 'Учетная запись заблокирована, отправка сообщений не возможна.'")); + ОписанияОшибок.Вставить("OBJECT_ALREADY_EXISTS", НСтр("ru = 'Список рассылки с указанным названием уже существует в рамках компании.'")); + ОписанияОшибок.Вставить("MSID_IS_IN_BLACKLIST", НСтр("ru = 'Номер абонента находится в черном списке, отправка сообщений запрещена.'")); + ОписанияОшибок.Вставить("MSIDS_ARE_IN_BLACKLIST", НСтр("ru = 'Все указанные номера абонентов находятся в черном списке, отправка сообщений запрещена.'")); + ОписанияОшибок.Вставить("TIME_IS_IN_THE_PAST", НСтр("ru = 'Переданное время в прошлом.'")); + + Возврат ОписанияОшибок; +КонецФункции + +Функция ОписаниеОшибкиПоКоду(КодОшибки) + ОписанияОшибок = ОписанияОшибок(); + ТекстСообщения = ОписанияОшибок[КодОшибки]; + Если ТекстСообщения = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Отказ выполнения операции.'"); + КонецЕсли; + Возврат ТекстСообщения; +КонецФункции + +Функция КодОшибкиИзОписания(Знач ТекстОшибки) + Результат = Неопределено; + Позиция = СтрНайти(ТекстОшибки, " 0 Тогда + ТекстОшибки = Сред(ТекстОшибки, Позиция); + Позиция = СтрНайти(ТекстОшибки, " 0 Тогда + ТекстОшибки = Лев(ТекстОшибки, Позиция - 1); + Позиция = СтрНайти(ТекстОшибки, ">"); + Если Позиция > 0 Тогда + ТекстОшибки = Сред(ТекстОшибки, Позиция + 1); + Результат = ТекстОшибки; + КонецЕсли; + КонецЕсли; + КонецЕсли; + Возврат Результат; КонецФункции // Возвращает список разрешений для отправки SMS с использованием всех доступных провайдеров. @@ -150,9 +187,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через МТС.'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl index 4da2d3d28..e84d7982b 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Отправка SMS" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Отправляет SMS через СМС-Услуги. @@ -252,9 +247,11 @@ Порт = Неопределено; Описание = НСтр("ru = 'Отправка SMS через ""СМС-Услуги"".'"); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Разрешения = Новый Массив; Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); Возврат Разрешения; КонецФункции diff --git a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl index 0d1fc326f..b45180476 100644 --- a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl @@ -1,88 +1,39 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы работы с СКД. +#Область ПрограммныйИнтерфейс + +// Запускает процесс формирования отчета в форме отчета. +// После завершения формирования вызывается ОбработчикЗавершения. // -//////////////////////////////////////////////////////////////////////////////// +// Параметры: +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// ОбработчикЗавершения - ОбработчикОповещения - Обработчик, который будет вызван после формирования отчета. +// В 1й параметр процедуры, указанной в ОбработчикЗавершения, +// передается параметр: ОтчетСформирован (Булево) - Признак того, что отчет был успешно сформирован. +// +Процедура СформироватьОтчет(ФормаОтчета, ОбработчикЗавершения = Неопределено) Экспорт + Если ТипЗнч(ОбработчикЗавершения) = Тип("ОписаниеОповещения") Тогда + ФормаОтчета.ОбработчикПослеФормированияНаКлиенте = ОбработчикЗавершения; + КонецЕсли; + ФормаОтчета.ПодключитьОбработчикОжидания("Сформировать", 0.1, Истина); +КонецПроцедуры + +#КонецОбласти #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Клиентские события рассылок отчетов. +// Обработчики событий подсистем конфигурации. -// Обработчик активизации строки пользовательской настройки СКД отчета. -// -// Параметры: -// Отчет - ДанныеФормыЭлементКоллекции - Строка табличной части, описывающая отчет. -// Свойства для чтения: -// * ПолноеИмя - Строка - Полное имя отчета. Например: "Отчет.ИмяОтчета". -// * КлючВарианта - Строка - Ключ варианта отчета. -// * Отчет - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. -// * Представление - Строка - Наименование варианта отчета. -// Свойства для изменения: -// * ВнесеныИзменения - Булево - Следует установить Истина когда меняются пользовательские настройки отчета. -// КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - Все настройки отчета. -// Свойства для изменения: -// * ПользовательскиеНастройки - ПользовательскиеНастройкиКомпоновкиДанных - Все пользовательские настройки отчета. -// Все прочие свойства - только для чтения. -// ИдентификаторКД - ИдентификаторКомпоновкиДанных - Идентификатор пользовательской настройки отчета. -// Может использоваться для получения данных пользовательской настройки. Например: -// ПользовательскаяНастройкаКД = КомпоновщикНастроекКД.НайтиПоИдентификатору(ИдентификаторКД); -// ТолькоПросмотрЗначения - Булево - Флажок возможности непосредственного редактирования колонки "Значение". -// Если установить в Истина, то следует определить обработчик выбора значения в событии "ПриНачалеВыбораНастройки". -// +// См. РассылкаОтчетовКлиентПереопределяемый.ПриАктивизацииСтрокиНастройки. Процедура ПриАктивизацииСтрокиНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, ТолькоПросмотрЗначения) Экспорт КонецПроцедуры -// Обработчик начала выбора значения для строки пользовательской настройки СКД отчета. -// -// Параметры: -// Отчет - ДанныеФормыЭлементКоллекции - Строка табличной части, описывающая отчет. -// Свойства для чтения: -// * ПолноеИмя - Строка - Полное имя отчета. Например: "Отчет.ИмяОтчета". -// * КлючВарианта - Строка - Ключ варианта отчета. -// * Отчет - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. -// * Представление - Строка - Наименование варианта отчета. -// Свойства для изменения: -// * ВнесеныИзменения - Булево - Следует установить Истина когда меняются пользовательские настройки отчета. -// КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - Все настройки отчета. -// Свойства для изменения: -// * ПользовательскиеНастройки - ПользовательскиеНастройкиКомпоновкиДанных - Все пользовательские настройки отчета. -// Все прочие свойства - только для чтения. -// ИдентификаторКД - ИдентификаторКомпоновкиДанных - Идентификатор пользовательской настройки отчета. -// Может использоваться для получения данных пользовательской настройки. Например: -// ПользовательскаяНастройкаКД = КомпоновщикНастроекКД.НайтиПоИдентификатору(ИдентификаторКД); -// СтандартнаяОбработка - Булево - Если Истина, то будет использован стандартный диалог выбора. -// Если используется собственная обработка события, то следует установить в Ложь. -// ОбработчикРезультата - Обработчик результата выбора прикладной формы. -// В качестве результата в ОбработчикРезультата могут быть переданы значения типов: -// Неопределено - Пользователь отказался от выбора. -// ПользовательскиеНастройкиКомпоновкиДанных - Новые настройки отчета. -// -Процедура ПриНачалеВыбораНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, СтандартнаяОбработка, Обработчик) Экспорт +// См. РассылкаОтчетовКлиентПереопределяемый.ПриНачалеВыбораНастройки. +Процедура ПриНачалеВыбораНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, СтандартнаяОбработка, ОбработчикРезультата) Экспорт КонецПроцедуры -// Обработчик очистки значения для строки пользовательской настройки СКД отчета. -// -// Параметры: -// Отчет - ДанныеФормыЭлементКоллекции - Строка табличной части, описывающая отчет. -// Свойства для чтения: -// * ПолноеИмя - Строка - Полное имя отчета. Например: "Отчет.ИмяОтчета". -// * КлючВарианта - Строка - Ключ варианта отчета. -// * Отчет - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. -// * Представление - Строка - Наименование варианта отчета. -// Свойства для изменения: -// * ВнесеныИзменения - Булево - Следует установить Истина когда меняются пользовательские настройки отчета. -// КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - Все настройки отчета. -// Свойства для изменения: -// * ПользовательскиеНастройки - ПользовательскиеНастройкиКомпоновкиДанных - Все пользовательские настройки отчета. -// Все прочие свойства - только для чтения. -// ИдентификаторКД - ИдентификаторКомпоновкиДанных - Идентификатор пользовательской настройки отчета. -// Может использоваться для получения данных пользовательской настройки. Например: -// ПользовательскаяНастройкаКД = КомпоновщикНастроекКД.НайтиПоИдентификатору(ИдентификаторКД); -// СтандартнаяОбработка - Булево - Если Истина, то значение настройки будет очищено. -// Если значение настройки не должно быть очищено, то следует установить в Ложь. -// +// См. РассылкаОтчетовКлиентПереопределяемый.ПриОчисткеНастройки. Процедура ПриОчисткеНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, СтандартнаяОбработка) Экспорт КонецПроцедуры @@ -106,7 +57,8 @@ Возврат Неопределено; КонецЕсли; - Результат = Новый Структура("Представление, ЗначенияДляВыбора, БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, ОписаниеТипов, ВводСписком"); + Результат = Новый Структура("Представление, ЗначенияДляВыбора, ЗначенияДляВыбораЗаполнены, БыстрыйВыбор, + |ОграничиватьВыборУказаннымиЗначениями, ОписаниеТипов, ВводСписком"); ЗаполнитьЗначенияСвойств(Результат, ДополнительныеНастройки); Если ТипЗнч(ЭлементКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда @@ -117,7 +69,7 @@ Условие = ?(Результат.ВводСписком, ВидСравненияКомпоновкиДанных.ВСписке, ВидСравненияКомпоновкиДанных.Равно); КонецЕсли; - ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(Условие, ДополнительныеНастройки.ВыборГруппИЭлементов); + ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(Условие, ДополнительныеНастройки.ВыборГруппИЭлементов); // Стандартные параметры формы. Результат.Вставить("ЗакрыватьПриВыборе", Истина); @@ -234,8 +186,8 @@ Процедура СписокКомпоновщикаНачалоВыбора(Форма, Элемент, ДанныеВыбора, СтандартнаяОбработка) Экспорт СтандартнаяОбработка = Ложь; - ПараметрыФормы = ПараметрыВыбораОтбора(Форма, Элемент); - Если ПараметрыФормы = Неопределено Тогда + ПараметрыВыбора = ПараметрыВыбораОтбора(Форма, Элемент); + Если ПараметрыВыбора = Неопределено Тогда Возврат; КонецЕсли; @@ -246,7 +198,7 @@ Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Блокировать); + ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыВыбора, ЭтотОбъект, , , , Обработчик, Блокировать); КонецПроцедуры Процедура СписокКомпоновщикаЗавершениеВыбора(РезультатВыбора, ПараметрыОбработчика) Экспорт @@ -262,21 +214,24 @@ // Загрузка выбранных значений в 2 списка. СписокЗначенийВСКД = Новый СписокЗначений; - Если Не ДополнительныеНастройки.ОграничиватьВыборУказаннымиЗначениями Тогда - ДополнительныеНастройки.ЗначенияДляВыбора = Новый СписокЗначений; + ЗаполнятьЗначенияДляВыбора = Не ДополнительныеНастройки.ОграничиватьВыборУказаннымиЗначениями + Или Не ДополнительныеНастройки.ЗначенияДляВыбораЗаполнены; + Если ЗаполнятьЗначенияДляВыбора Тогда + ЗначенияДляВыбора = Новый СписокЗначений; КонецЕсли; Для Каждого ЭлементСпискаВФорме Из РезультатВыбора Цикл ЗначениеВФорме = ЭлементСпискаВФорме.Значение; - Если Не ДополнительныеНастройки.ОграничиватьВыборУказаннымиЗначениями Тогда - Если ДополнительныеНастройки.ЗначенияДляВыбора.НайтиПоЗначению(ЗначениеВФорме) <> Неопределено Тогда - Продолжить; - КонецЕсли; - ЗаполнитьЗначенияСвойств(ДополнительныеНастройки.ЗначенияДляВыбора.Добавить(), ЭлементСпискаВФорме, "Значение, Представление"); + Если ЗаполнятьЗначенияДляВыбора И ЗначенияДляВыбора.НайтиПоЗначению(ЗначениеВФорме) = Неопределено Тогда + ЗаполнитьЗначенияСвойств(ЗначенияДляВыбора.Добавить(), ЭлементСпискаВФорме, "Значение, Представление"); КонецЕсли; Если ЭлементСпискаВФорме.Пометка Тогда ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(СписокЗначенийВСКД, ЗначениеВФорме, ЭлементСпискаВФорме.Представление, Истина); КонецЕсли; КонецЦикла; + Если ЗаполнятьЗначенияДляВыбора Тогда + ДополнительныеНастройки.ЗначенияДляВыбора = ЗначенияДляВыбора; + ДополнительныеНастройки.ЗначенияДляВыбораЗаполнены = Истина; + КонецЕсли; Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда ПользовательскаяНастройкаКД.ПравоеЗначение = СписокЗначенийВСКД; Иначе @@ -364,7 +319,7 @@ Контекст.Вставить("ОбработчикРезультата", ОбработчикРезультата); Обработчик = Новый ОписаниеОповещения("ИзменитьВидСравненияЗавершение", ЭтотОбъект, Контекст); - ФормаЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выберите условие отбора ""%1""'"), ДополнительныеНастройки.Представление); + ФормаЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Условие отбора поля ""%1""'"), ДополнительныеНастройки.Представление); Список.ПоказатьВыборЭлемента(Обработчик, ФормаЗаголовок, ТекущийЭлемент); КонецПроцедуры @@ -383,78 +338,90 @@ КонецЕсли; КонецПроцедуры -Процедура ЗначениеКомпоновщикаНачалоВыбора(Форма, Элемент, ДанныеВыбора, СтандартнаяОбработка) Экспорт +Процедура ЗначениеКомпоновщикаНачалоВыбора(Форма, Элемент, ЗначенияДляВыбора, СтандартнаяОбработка) Экспорт СтандартнаяОбработка = Ложь; - ПараметрыФормы = ПараметрыВыбораОтбора(Форма, Элемент); - Если ПараметрыФормы = Неопределено Тогда + ПараметрыВыбора = ПараметрыВыбораОтбора(Форма, Элемент); + Если ПараметрыВыбора = Неопределено Тогда Возврат; КонецЕсли; - Анализ = ОтчетыКлиентСервер.АнализТипов(ПараметрыФормы.ОписаниеТипов, Ложь); - Если Не Анализ.СодержитОбъектныеТипы Тогда - СтандартнаяОбработка = Истина; - Возврат; - КонецЕсли; - - ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); + ПараметрыВыбора.Вставить("МножественныйВыбор", Ложь); Контекст = Новый Структура; - Контекст.Вставить("Форма", Форма); - Контекст.Вставить("Идентификатор", Прав(Элемент.Имя, 32)); - Контекст.Вставить("ПараметрыФормы", ПараметрыФормы); - - Обработчик = Новый ОписаниеОповещения("ЗначениеКомпоновщикаПоказатьВыборСсылкиПослеВыбораТипа", ЭтотОбъект, Контекст); - - Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; + Контекст.Вставить("Элемент", Элемент); + Контекст.Вставить("Форма", Форма); + Контекст.Вставить("Идентификатор", Прав(Элемент.Имя, 32)); + Контекст.Вставить("ПараметрыВыбора", ПараметрыВыбора); // Полное имя формы выбора. // Свойство "ФормаВыбора" недоступно на клиенте даже для чтения, // поэтому для хранения предустановленных имен форм выбора используется коллекция БыстрыйПоискИменОбъектовМетаданных. - Если ЗначениеЗаполнено(ПараметрыФормы.ПутьКФорме) Тогда - ВыполнитьОбработкуОповещения(Обработчик, ПараметрыФормы.ПутьКФорме); + Если ЗначениеЗаполнено(ПараметрыВыбора.ПутьКФорме) Тогда + Обработчик = Новый ОписаниеОповещения("ЗначениеКомпоновщикаЗавершениеВыбора", ЭтотОбъект, Контекст); + ОткрытьФорму( + ПараметрыВыбора.ПутьКФорме, + ПараметрыВыбора, + Контекст.Форма, + , + , + , + Обработчик, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); Иначе // Выбор типа из списка. + Обработчик = Новый ОписаниеОповещения("ЗначениеКомпоновщикаПоказатьВыборСсылкиПослеВыбораТипа", ЭтотОбъект, Контекст); СписокВыбора = Новый СписокЗначений; - СписокВыбора.ЗагрузитьЗначения(Анализ.ОбъектныеТипы); - + СписокВыбора.ЗагрузитьЗначения(ПараметрыВыбора.ОписаниеТипов.Типы()); Если СписокВыбора.Количество() = 1 Тогда // Один тип - выбор не требуется. ВыполнитьОбработкуОповещения(Обработчик, СписокВыбора[0]); Иначе - Форма.ПоказатьВыборИзСписка(Обработчик, СписокВыбора); + Форма.ПоказатьВыборИзМеню(Обработчик, СписокВыбора); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ЗначениеКомпоновщикаПоказатьВыборСсылкиПослеВыбораТипа(ПутьКФормеИлиЭлементСписка, Контекст) Экспорт - Если ТипЗнч(ПутьКФормеИлиЭлементСписка) = Тип("Строка") Тогда - ПутьКФорме = ПутьКФормеИлиЭлементСписка; - ИначеЕсли ТипЗнч(ПутьКФормеИлиЭлементСписка) = Тип("ЭлементСпискаЗначений") Тогда - Тип = ПутьКФормеИлиЭлементСписка.Значение; - ИмяОбъектаМетаданных = Контекст.Форма.БыстрыйПоискИменОбъектовМетаданных.Получить(Тип); - Если Контекст.ПараметрыФормы.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы Тогда - ВидОбъектаМетаданных = ВРег(СтрРазделить(ИмяОбъектаМетаданных, ".")[0]); - Если ВидОбъектаМетаданных = "СПРАВОЧНИК" Или ВидОбъектаМетаданных = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбораГруппы"; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; - КонецЕсли; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; - КонецЕсли; - Иначе + Если ТипЗнч(ПутьКФормеИлиЭлементСписка) <> Тип("ЭлементСпискаЗначений") Тогда Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗначениеКомпоновщикаЗавершениеВыбора", ЭтотОбъект, Контекст); + ПараметрыВыбора = Контекст.ПараметрыВыбора; - Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; + Тип = ПутьКФормеИлиЭлементСписка.Значение; + ПараметрыВыбораТипа = ВариантыОтчетовВызовСервера.ПараметрыВыбораТипа(Тип, ПараметрыВыбора); + Если ПараметрыВыбораТипа = Неопределено Тогда + ВыбратьЗначениеПримитивногоТипа( + Контекст.Форма, + Тип, + ПараметрыВыбора.ОписаниеТипов, + ПараметрыВыбора.Значение, + ПараметрыВыбора.Представление, + Обработчик); + ИначеЕсли ПараметрыВыбораТипа.БыстрыйВыбор Тогда + Контекст.Форма.ПоказатьВыборИзМеню(Обработчик, ПараметрыВыбораТипа.ЗначенияДляВыбора); + Иначе + ОткрытьФорму( + ПараметрыВыбораТипа.ПутьКФорме, + ПараметрыВыбора, + Контекст.Форма, + , + , + , + Обработчик, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; - ОткрытьФорму(ПутьКФорме, Контекст.ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Блокировать); КонецПроцедуры -Процедура ЗначениеКомпоновщикаЗавершениеВыбора(Ссылка, Контекст) Экспорт - Если Не Контекст.ПараметрыФормы.ОписаниеТипов.СодержитТип(ТипЗнч(Ссылка)) Или Не ЗначениеЗаполнено(Ссылка) Тогда +Процедура ЗначениеКомпоновщикаЗавершениеВыбора(СсылкаИлиЭлементСписка, Контекст) Экспорт + Если ТипЗнч(СсылкаИлиЭлементСписка) = Тип("ЭлементСпискаЗначений") Тогда + Ссылка = СсылкаИлиЭлементСписка.Значение; + Иначе + Ссылка = СсылкаИлиЭлементСписка; + КонецЕсли; + Если Не Контекст.ПараметрыВыбора.ОписаниеТипов.СодержитТип(ТипЗнч(Ссылка)) Или Не ЗначениеЗаполнено(Ссылка) Тогда Возврат; КонецЕсли; @@ -471,6 +438,8 @@ ЭлементКД.Использование = Истина; // Включение флажка. + ОтразитьИзмененияВПодчиненных(Форма, Контекст.Идентификатор, ЭлементКД); + Форма.ПользовательскиеНастройкиМодифицированы = Истина; #Если ВебКлиент Тогда Форма.ОбновитьОтображениеДанных(); // Для платформы. @@ -521,21 +490,19 @@ #КонецЕсли КонецПроцедуры -Процедура ВыбратьЗначениеПримитивногоТипа(Форма, Тип, ОписаниеТипов, ТекущееЗначение, ПредставлениеПоля, ОбработчикРезультата) Экспорт - ПараметрыОбработчика = Новый Структура("ОбработчикРезультата", ОбработчикРезультата); - Обработчик = Новый ОписаниеОповещения("ПослеВыбораЗначенияПримитивногоТипа", ЭтотОбъект, ПараметрыОбработчика); +Процедура ВыбратьЗначениеПримитивногоТипа(Форма, ТипЗначения, ОписаниеТипов, ТекущееЗначение, ПредставлениеПоля, Обработчик) Экспорт СписокВыбора = Новый СписокЗначений; - Если Тип = Тип("ВидДвиженияБухгалтерии") Тогда + Если ТипЗначения = Тип("ВидДвиженияБухгалтерии") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВыбора, ВидДвиженияБухгалтерии); - ИначеЕсли Тип = Тип("ВидДвиженияНакопления") Тогда + ИначеЕсли ТипЗначения = Тип("ВидДвиженияНакопления") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВыбора, ВидДвиженияНакопления); - ИначеЕсли Тип = Тип("ВидПериодаРегистраРасчета") Тогда + ИначеЕсли ТипЗначения = Тип("ВидПериодаРегистраРасчета") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВыбора, ВидПериодаРегистраРасчета); - ИначеЕсли Тип = Тип("ВидСчета") Тогда + ИначеЕсли ТипЗначения = Тип("ВидСчета") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВыбора, ВидСчета); - ИначеЕсли Тип = Тип("ВидТочкиМаршрутаБизнесПроцесса") Тогда + ИначеЕсли ТипЗначения = Тип("ВидТочкиМаршрутаБизнесПроцесса") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВыбора, ВидТочкиМаршрутаБизнесПроцесса); - ИначеЕсли Тип = Тип("Число") Тогда + ИначеЕсли ТипЗначения = Тип("Число") Тогда ПоказатьВводЧисла( Обработчик, ТекущееЗначение, @@ -543,7 +510,7 @@ ОписаниеТипов.КвалификаторыЧисла.Разрядность, ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти); Возврат; - ИначеЕсли Тип = Тип("Строка") Тогда + ИначеЕсли ТипЗначения = Тип("Строка") Тогда ПоказатьВводСтроки( Обработчик, ТекущееЗначение, @@ -551,7 +518,7 @@ ОписаниеТипов.КвалификаторыСтроки.Длина, ОписаниеТипов.КвалификаторыСтроки.Длина = 0 Или ОписаниеТипов.КвалификаторыСтроки.Длина > 100); Возврат; - ИначеЕсли Тип = Тип("Дата") Тогда + ИначеЕсли ТипЗначения = Тип("Дата") Тогда ПоказатьВводДаты( Обработчик, ТекущееЗначение, @@ -559,18 +526,62 @@ ОписаниеТипов.КвалификаторыДаты.ЧастиДаты); Возврат; Иначе + ПоказатьВводЗначения( + Обработчик, + ТекущееЗначение, + ПредставлениеПоля, + ОписаниеТипов); Возврат; КонецЕсли; Форма.ПоказатьВыборИзМеню(Обработчик, СписокВыбора); КонецПроцедуры -Процедура ПослеВыбораЗначенияПримитивногоТипа(ВыбранноеЗначение, ПараметрыОбработчика) Экспорт - Если ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений") Тогда - ВыполнитьОбработкуОповещения(ПараметрыОбработчика.ОбработчикРезультата, ВыбранноеЗначение.Значение); - ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Строка") - Или ТипЗнч(ВыбранноеЗначение) = Тип("Число") - Или ТипЗнч(ВыбранноеЗначение) = Тип("Дата") Тогда - ВыполнитьОбработкуОповещения(ПараметрыОбработчика.ОбработчикРезультата, ВыбранноеЗначение); +Процедура ОтразитьИзмененияВПодчиненных(Форма, ИдентификаторЭлемента, НастройкаКомпоновкиДанныхВедущего) Экспорт + + // Очистка значений при изменении значения. + Найденные = Форма.ОтключаемыеСвязи.НайтиСтроки(Новый Структура("ВедущийИдентификаторВФорме", ИдентификаторЭлемента)); + Для Каждого Связь Из Найденные Цикл + Если Не ЗначениеЗаполнено(Связь.ПодчиненныйИдентификаторВФорме) Тогда + Продолжить; + КонецЕсли; + Если Связь.ТипСвязи = "ПараметровВыбора" Тогда + Если Связь.ПодчиненныйДействие = РежимИзмененияСвязанногоЗначения.Очищать Тогда + ОчиститьЗначениеПодчиненного(Форма, НастройкаКомпоновкиДанныхВедущего, Связь.ПодчиненныйИдентификаторВФорме); + КонецЕсли; + Иначе + Продолжить; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ОчиститьЗначениеПодчиненного(Форма, НастройкаКомпоновкиДанныхВедущего, ИдентификаторПодчиненногоВФорме) + ПодчиненныйНастройкаКД = Форма.НайтиПользовательскуюНастройкуЭлемента(ИдентификаторПодчиненногоВФорме); + ПодчиненныйДополнительно = Форма.НайтиДополнительныеНастройкиЭлемента(ИдентификаторПодчиненногоВФорме); + Если ПодчиненныйДополнительно = Неопределено Или ПодчиненныйНастройкаКД = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НастройкаКомпоновкиДанныхВедущего.Использование Тогда + Если ПодчиненныйДополнительно.ВводСписком Тогда + Если ТипЗнч(ПодчиненныйНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + ПодчиненныйНастройкаКД.Значение = Новый СписокЗначений; + ИначеЕсли ТипЗнч(ПодчиненныйНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + ПодчиненныйНастройкаКД.ПравоеЗначение = Новый СписокЗначений; + КонецЕсли; + Иначе + Если ТипЗнч(ПодчиненныйНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + ПодчиненныйНастройкаКД.Значение = Неопределено; + ИначеЕсли ТипЗнч(ПодчиненныйНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + ПодчиненныйНастройкаКД.ПравоеЗначение = Неопределено; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ПодчиненныйДополнительно.БыстрыйВыбор + И Не ПодчиненныйДополнительно.ОграничиватьВыборУказаннымиЗначениями Тогда + ПодчиненныйДополнительно.ЗначенияДляВыбораЗаполнены = Ложь; + ПодчиненныйДополнительно.ЗначенияДляВыбора.Очистить(); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl index 5f249798f..233aa0bb3 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl @@ -1,79 +1,102 @@ -//////////////////////////////////////////////////////////////////////////////// -// Клиентские события формы отчета. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +// Возникает перед началом формирования отчета. +// +// Параметры: +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// Отказ - Булево - Если установить в значение Истина, то процесс формирования отчета будет остановлен. +// Для перезапуска процесса формирования +// рекомендуется использовать процедуру ОтчетыКлиент.СформироватьОтчет(). +// +Процедура ПередФормированием(ФормаОтчета, Отказ) Экспорт + +КонецПроцедуры + +// Возникает после окончания формирования отчета. +// +// Параметры: +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// ОтчетСформирован - Булево - Истина если отчет был успешно сформирован. +// +Процедура ПослеФормирования(ФормаОтчета, ОтчетСформирован) Экспорт + +КонецПроцедуры + // Обработчик расшифровки табличного документа формы отчета. +// См. "Расширение поля формы для поля табличного документа.ОбработкаРасшифровки" в синтакс-помощнике. // // Параметры: // ФормаОтчета - УправляемаяФорма - Форма отчета. // Элемент - ПолеФормы - Табличный документ. -// Расшифровка - Передается из параметров обработчика "как есть". -// СтандартнаяОбработка - Передается из параметров обработчика "как есть". -// -// См. также: -// "Расширение поля формы для поля табличного документа.ОбработкаРасшифровки" в синтакс-помощнике. +// Расшифровка - Произвольный - Значение расшифровки точки, серии или значения диаграммы. +// СтандартнаяОбработка - Булево - Признак выполнения стандартной (системной) обработки события. // Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт КонецПроцедуры // Обработчик дополнительной расшифровки (меню табличного документа формы отчета). +// См. "Расширение поля формы для поля табличного документа.ОбработкаДополнительнойРасшифровки" в синтакс-помощнике. // // Параметры: // ФормаОтчета - УправляемаяФорма - Форма отчета. // Элемент - ПолеФормы - Табличный документ. -// Расшифровка - Передается из параметров обработчика "как есть". -// СтандартнаяОбработка - Передается из параметров обработчика "как есть". -// -// См. также: -// "Расширение поля формы для поля табличного документа.ОбработкаДополнительнойРасшифровки" в синтакс-помощнике. +// Расшифровка - Произвольный - Значение расшифровки точки, серии или значения диаграммы. +// СтандартнаяОбработка - Булево - Признак выполнения стандартной (системной) обработки события. // Процедура ОбработкаДополнительнойРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт КонецПроцедуры // Обработчик команд, добавленных динамически и подключенных к обработчику "Подключаемый_Команда". +// Пример добавления команды см. ОтчетыПереопределяемый.ПриСозданииНаСервере(). // // Параметры: // ФормаОтчета - УправляемаяФорма - Форма отчета. // Команда - КомандаФормы - Команда, которая была вызвана. // Результат - Булево - Истина, если вызов команды обработан. // -// См. также: -// Пример добавления команды в комментарии к обработчику ПриСозданииНаСервере(). -// Процедура ОбработчикКоманды(ФормаОтчета, Команда, Результат) Экспорт + + КонецПроцедуры // Обработчик результата выбора подчиненной формы. +// См. "УправляемаяФорма.ОбработкаВыбора" в синтакс-помощнике. // // Параметры: // ФормаОтчета - УправляемаяФорма - Форма отчета. -// ВыбранноеЗначение - Произвольное значение - Результат выбора в подчиненной форме. +// ВыбранноеЗначение - Произвольный - Результат выбора в подчиненной форме. // ИсточникВыбора - УправляемаяФорма - Форма, где осуществлен выбор. // Результат - Булево - Истина, если результат выбора обработан. // -// См. также: -// "УправляемаяФорма.ОбработкаВыбора" в синтакс-помощнике. -// Процедура ОбработкаВыбора(ФормаОтчета, ВыбранноеЗначение, ИсточникВыбора, Результат) Экспорт КонецПроцедуры -// Обработчик широковещательного оповещения формы отчета. +// Обработчик двойного щелчка мыши, нажатия клавиши Enter или гиперссылки в табличном документе формы отчета. +// См. "Расширение поля формы для поля табличного документа.Выбор" в синтакс-помощнике. // // Параметры: // ФормаОтчета - УправляемаяФорма - Форма отчета. -// ИмяСобытия - Передается из параметров обработчика "как есть". -// Параметр - Передается из параметров обработчика "как есть". -// Источник - Передается из параметров обработчика "как есть". +// Элемент - ПолеФормы - Табличный документ. +// Область - ОбластьЯчеекТабличногоДокумента - Выбранное значение. +// СтандартнаяОбработка - Булево - Признак выполнения стандартной обработки события. // -// См. также: -// "УправляемаяФорма.ОбработкаОповещения" в синтакс-помощнике. +Процедура ОбработкаВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка) Экспорт + +КонецПроцедуры + +// Обработчик широковещательного оповещения формы отчета. +// См. "УправляемаяФорма.ОбработкаОповещения" в синтакс-помощнике. +// +// Параметры: +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// ИмяСобытия - Строка - Идентификатор события для принимающих форм. +// Параметр - Произвольный - Расширенная информация о событии. +// Источник - УправляемаяФорма, Произвольный - Источник события. +// ОповещениеОбработано - Булево - Признак того, что событие обработано. // Процедура ОбработкаОповещения(ФормаОтчета, ИмяСобытия, Параметр, Источник, ОповещениеОбработано) Экспорт diff --git a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl index 4eab26fd1..cca1c6777 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl @@ -1,16 +1,11 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы работы с СКД из формы отчета (клиент, сервер). -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Настройки формы отчета по умолчанию. // // Возвращаемое значение: -// Структура - Настройки формы отчета. +// Структура - Настройки формы отчета: // -// * ФормироватьСразу - Булево - Значение по умолчанию для флажка "Формировать сразу". +// * ФормироватьСразу - Булево - Значение по умолчанию для флажка "Формировать сразу" в форме отчета. // Когда флажок включен, то отчет будет формироваться: // - После открытия; // - После выбора пользовательских настроек; @@ -18,6 +13,14 @@ // // * ВыводитьСуммуВыделенныхЯчеек - Булево - Если Истина, то в отчете будет выводиться поле автосуммы. // +// * РазрешеноИзменятьСтруктуру - Булево - Если Ложь, то в настройках отчета будет скрыта вкладка "Структура". +// Если Истина, то вкладка "Структура" показывается для отчетов на СКД: в расширенном режиме, +// а также в простом режиме, если в пользовательские настройки выведены флажки использования группировок. +// +// * РазрешеноИзменятьВарианты - Булево - Если Ложь, то блокируются кнопки изменения вариантов этого отчета. +// Если у текущего пользователя нет прав "СохранениеДанныхПользователя" и "Добавление" справочника ВариантыОтчетов, +// то принудительно устанавливается в Ложь. +// // * Печать - Структура - Параметры печати табличного документа "по умолчанию". // ** ПолеСверху - Число - Отступ сверху при печати (в миллиметрах). // ** ПолеСлева - Число - Отступ слева при печати (в миллиметрах). @@ -36,22 +39,21 @@ // // // // Параметры: // // Форма - УправляемаяФорма - Форма отчета. -// // Отказ - Передается из параметров обработчика "как есть". -// // СтандартнаяОбработка - Передается из параметров обработчика "как есть". +// // Отказ - Булево - Признак отказа от создания формы. +// // См. описание одноименного параметра "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. +// // СтандартнаяОбработка - Булево - Признак выполнения стандартной (системной) обработки события. +// // См. описание одноименного параметра "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. // // // // См. также: -// // "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. -// // ОтчетыПереопределяемый.ПриСозданииНаСервере(). +// // Процедура для вывода добавленных команд в форму: ОтчетыСервер.ВывестиКоманду(). +// // Глобальный обработчик этого события: ОтчетыПереопределяемый.ПриСозданииНаСервере(). // // -// // Пример 1 - Добавление команды с обработчиком в ОтчетыКлиентПереопределяемый.ОбработчикКоманды: -// // Команда = Форма.Команды.Добавить("МояОсобеннаяКоманда"); +// // Пример добавления команды: +// // Команда = Форма.Команды.Добавить("<ИмяКоманды>"); // // Команда.Действие = "Подключаемый_Команда"; -// // Команда.Заголовок = НСтр("ru = 'Моя команда...'"); -// // -// // Кнопка = Форма.Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), Форма.Элементы.ГруппаПрограммныйИнтерфейс); -// // Кнопка.ИмяКоманды = Команда.Имя; -// // -// // Форма.ПостоянныеКоманды.Добавить(КомандаСоздать.Имя); +// // Команда.Заголовок = НСтр("ru = '<Представление команды...>'"); +// // ОтчетыСервер.ВывестиКоманду(Форма, Команда, "<ВидГруппы>"); +// // Обработчик команды пишется в процедуре ОтчетыКлиентПереопределяемый.ОбработчикКоманды. // // // Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт // // Обработка события. @@ -123,9 +125,7 @@ // // Форма - УправляемаяФорма - Форма отчета. // // НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек. // // -// // См. также: -// // "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике. -// // ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере(). +// // См. ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере(). // // // Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт // // Обработка события. @@ -140,8 +140,7 @@ // // Форма - УправляемаяФорма - Форма отчета. // // НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек. // // -// // См. также: -// // "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс-помощнике. +// // См. синтакс-помощник "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс-помощнике. // // // Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт // // Обработка события. @@ -157,8 +156,7 @@ // // НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных - // // Пользовательские настройки для загрузки в компоновщик настроек. // // -// // См. также: -// // "Расширение управляемой формы для отчета.ПриЗагрузкеПользовательскихНастроекНаСервере" +// // См. синтакс-помощник "Расширение управляемой формы для отчета.ПриЗагрузкеПользовательскихНастроекНаСервере" // // в синтакс-помощнике. // // // Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт @@ -263,6 +261,12 @@ // КонецПроцедуры // Функция ПолучитьНастройкиОтчетаПоУмолчанию() Экспорт + Настройки = Новый Структура; + Настройки.Вставить("ФормироватьСразу", Ложь); + Настройки.Вставить("ВыводитьСуммуВыделенныхЯчеек", Истина); + Настройки.Вставить("РазрешеноИзменятьСтруктуру", Истина); + Настройки.Вставить("РазрешеноИзменятьВарианты", Истина); + Печать = Новый Структура; Печать.Вставить("ПолеСверху", 10); Печать.Вставить("ПолеСлева", 10); @@ -272,6 +276,8 @@ Печать.Вставить("АвтоМасштаб", Истина); Печать.Вставить("МасштабПечати", Неопределено); + Настройки.Вставить("Печать", Печать); + События = Новый Структура; События.Вставить("ПриСозданииНаСервере", Ложь); События.Вставить("ПередЗагрузкойНастроекВКомпоновщик", Ложь); @@ -284,10 +290,6 @@ События.Вставить("ПриОпределенииИспользуемыхТаблиц", Ложь); События.Вставить("ДополнитьСвязиОбъектовМетаданных", Ложь); - Настройки = Новый Структура; - Настройки.Вставить("ФормироватьСразу", Ложь); - Настройки.Вставить("ВыводитьСуммуВыделенныхЯчеек", Истина); - Настройки.Вставить("Печать", Печать); Настройки.Вставить("События", События); Возврат Настройки; @@ -318,63 +320,6 @@ Возврат НайтиПараметры(НастройкиКД, ПользовательскиеНастройкиКД, ИмяПараметра)[ИмяПараметра]; КонецФункции -// Находит параметры в настройках компоновки по его имени. -// Если параметр не найден в пользовательских настройках, -// то его поиск выполняется в настройках варианта. -// -// Параметры: -// НастройкиКД - НастройкиКомпоновкиДанных, Неопределено - -// Настройки варианта отчета, в которых будет осуществляться вторая итерация поиска значения. -// ПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных, Неопределено - -// Пользовательские настройки, в которых будет осуществляться первая итерация поиска значения. -// ИменаПараметров - Строка - Имена параметров, перечисленные через запятую. -// Имя каждого параметра должно удовлетворять требованиям образования имен переменных. -// -// Возвращаемое значение: -// Структура - Найденные значения параметров. -// Ключ - имя параметра; -// Значение - найденный параметр. Неопределено если параметр не найден. -// -Функция НайтиПараметры(НастройкиКД, ПользовательскиеНастройкиКД, ИменаПараметров) - Результат = Новый Структура; - ИскомыеПараметры = Новый Соответствие; - МассивИмен = СтрРазделить(ИменаПараметров, ",", Ложь); - Количество = 0; - Для Каждого ИмяПараметра Из МассивИмен Цикл - ИскомыеПараметры.Вставить(СокрЛП(ИмяПараметра), Истина); - Количество = Количество + 1; - КонецЦикла; - - Если ПользовательскиеНастройкиКД <> Неопределено Тогда - Для Каждого ЭлементКД Из ПользовательскиеНастройкиКД.Элементы Цикл - Если ТипЗнч(ЭлементКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - ИмяПараметра = Строка(ЭлементКД.Параметр); - Если ИскомыеПараметры[ИмяПараметра] = Истина Тогда - Результат.Вставить(ИмяПараметра, ЭлементКД); - ИскомыеПараметры.Удалить(ИмяПараметра); - Количество = Количество - 1; - Если Количество = 0 Тогда - Прервать; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Если Количество > 0 Тогда - Для Каждого КлючИЗначение Из ИскомыеПараметры Цикл - Если НастройкиКД <> Неопределено Тогда - ЭлементКД = НастройкиКД.ПараметрыДанных.Элементы.Найти(КлючИЗначение.Ключ); - Иначе - ЭлементКД = Неопределено; - КонецЕсли; - Результат.Вставить(КлючИЗначение.Ключ, ЭлементКД); - КонецЦикла; - КонецЕсли; - - Возврат Результат; -КонецФункции - // Находит общую настройку по идентификатору пользовательской настройки. // // Параметры: @@ -672,6 +617,63 @@ #Область СлужебныеПроцедурыИФункции +// Находит параметры в настройках компоновки по его имени. +// Если параметр не найден в пользовательских настройках, +// то его поиск выполняется в настройках варианта. +// +// Параметры: +// НастройкиКД - НастройкиКомпоновкиДанных, Неопределено - +// Настройки варианта отчета, в которых будет осуществляться вторая итерация поиска значения. +// ПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных, Неопределено - +// Пользовательские настройки, в которых будет осуществляться первая итерация поиска значения. +// ИменаПараметров - Строка - Имена параметров, перечисленные через запятую. +// Имя каждого параметра должно удовлетворять требованиям образования имен переменных. +// +// Возвращаемое значение: +// Структура - Найденные значения параметров. +// Ключ - имя параметра; +// Значение - найденный параметр. Неопределено если параметр не найден. +// +Функция НайтиПараметры(НастройкиКД, ПользовательскиеНастройкиКД, ИменаПараметров) + Результат = Новый Структура; + ИскомыеПараметры = Новый Соответствие; + МассивИмен = СтрРазделить(ИменаПараметров, ",", Ложь); + Количество = 0; + Для Каждого ИмяПараметра Из МассивИмен Цикл + ИскомыеПараметры.Вставить(СокрЛП(ИмяПараметра), Истина); + Количество = Количество + 1; + КонецЦикла; + + Если ПользовательскиеНастройкиКД <> Неопределено Тогда + Для Каждого ЭлементКД Из ПользовательскиеНастройкиКД.Элементы Цикл + Если ТипЗнч(ЭлементКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + ИмяПараметра = Строка(ЭлементКД.Параметр); + Если ИскомыеПараметры[ИмяПараметра] = Истина Тогда + Результат.Вставить(ИмяПараметра, ЭлементКД); + ИскомыеПараметры.Удалить(ИмяПараметра); + Количество = Количество - 1; + Если Количество = 0 Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Количество > 0 Тогда + Для Каждого КлючИЗначение Из ИскомыеПараметры Цикл + Если НастройкиКД <> Неопределено Тогда + ЭлементКД = НастройкиКД.ПараметрыДанных.Элементы.Найти(КлючИЗначение.Ключ); + Иначе + ЭлементКД = Неопределено; + КонецЕсли; + Результат.Вставить(КлючИЗначение.Ключ, ЭлементКД); + КонецЦикла; + КонецЕсли; + + Возврат Результат; +КонецФункции + // Находит доступную настройку поля компоновки данных. // // Параметры: @@ -841,6 +843,9 @@ Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВСписке Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда + // Виды сравнения ВСпискеПоИерархии (В группе из списка) и НеВСпискеПоИерархии (Не в группе из списка) + // следует понимать как "В списке или в группах" и "Не в списке и не в группах". + // - Тогда более понятно почему для них используется "ГруппыИЭлементы", а не "Группы". Возврат ГруппыИЭлементы.ГруппыИЭлементы; ИначеЕсли ИсходноеЗначение = ВидСравненияКомпоновкиДанных.ВИерархии Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда @@ -853,18 +858,38 @@ // Приводит значение типа ГруппыИЭлементы к типу ИспользованиеГруппИЭлементов. // Для значения Авто и других типов возвращает значение Неопределено. // -Функция ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(ИсходноеЗначение) Экспорт - Если ИсходноеЗначение = ГруппыИЭлементы.Элементы Тогда - Возврат ИспользованиеГруппИЭлементов.Элементы; - ИначеЕсли ИсходноеЗначение = ГруппыИЭлементы.ГруппыИЭлементы Тогда - Возврат ИспользованиеГруппИЭлементов.ГруппыИЭлементы; - ИначеЕсли ИсходноеЗначение = ГруппыИЭлементы.Группы Тогда - Возврат ИспользованиеГруппИЭлементов.Группы; - ИначеЕсли ТипЗнч(ИсходноеЗначение) = Тип("ИспользованиеГруппИЭлементов") Тогда +Функция ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(ИсходноеЗначение, ЗначениеПоУмолчанию = Неопределено) Экспорт + Тип = ТипЗнч(ИсходноеЗначение); + Если Тип = Тип("ГруппыИЭлементы") Тогда + Если ИсходноеЗначение = ГруппыИЭлементы.Элементы Тогда + Возврат ИспользованиеГруппИЭлементов.Элементы; + ИначеЕсли ИсходноеЗначение = ГруппыИЭлементы.ГруппыИЭлементы Тогда + Возврат ИспользованиеГруппИЭлементов.ГруппыИЭлементы; + ИначеЕсли ИсходноеЗначение = ГруппыИЭлементы.Группы Тогда + Возврат ИспользованиеГруппИЭлементов.Группы; + ИначеЕсли ТипЗнч(ИсходноеЗначение) = Тип("ИспользованиеГруппИЭлементов") Тогда + Возврат ИсходноеЗначение; + КонецЕсли; + ИначеЕсли Тип = Тип("ИспользованиеГруппИЭлементов") Тогда Возврат ИсходноеЗначение; - Иначе - Возврат Неопределено; + ИначеЕсли Тип = Тип("ВидСравненияКомпоновкиДанных") Тогда + Если ИсходноеЗначение = ВидСравненияКомпоновкиДанных.ВСписке + Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии + Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВСписке + Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда + // Виды сравнения ВСпискеПоИерархии (В группе из списка) и НеВСпискеПоИерархии (Не в группе из списка) + // следует понимать как "В списке или в группах" и "Не в списке и не в группах". + // - Тогда более понятно почему для них используется "ГруппыИЭлементы", а не "Группы". + Возврат ИспользованиеГруппИЭлементов.ГруппыИЭлементы; + ИначеЕсли ИсходноеЗначение = ВидСравненияКомпоновкиДанных.ВИерархии + Или ИсходноеЗначение = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда + Возврат ИспользованиеГруппИЭлементов.Группы; + КонецЕсли; КонецЕсли; + Если ЗначениеПоУмолчанию <> Неопределено Тогда + Возврат ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(ЗначениеПоУмолчанию, Неопределено); + КонецЕсли; + Возврат Неопределено; КонецФункции // Определяет полный путь к элементу компоновки данных. @@ -1170,20 +1195,27 @@ //////////////////////////////////////////////////////////////////////////////// // Унификация формы отчета и формы настроек отчета. -Функция ПредставлениеЭлементаУсловногоОформления(ЭлементКД) Экспорт +Функция ПредставлениеЭлементаУсловногоОформления(ЭлементКД, НастройкаВариантаКД, Состояние) Экспорт ПредставлениеОформления = ПредставлениеОформления(ЭлементКД.Оформление); Если ПредставлениеОформления = "" Тогда ПредставлениеОформления = НСтр("ru = 'Не оформлять'"); КонецЕсли; + ДоступныСведенияИзВарианта = (НастройкаВариантаКД <> Неопределено И НастройкаВариантаКД <> ЭлементКД); - ПредставлениеПолей = Строка(ЭлементКД.Поля); + ПредставлениеПолей = ПредставлениеОформляемыхПолей(ЭлементКД.Поля, Состояние); + Если ПредставлениеПолей = "" И ДоступныСведенияИзВарианта Тогда + ПредставлениеПолей = ПредставлениеОформляемыхПолей(НастройкаВариантаКД.Поля, Состояние); + КонецЕсли; Если ПредставлениеПолей = "" Тогда ПредставлениеПолей = НСтр("ru = 'Все поля'"); Иначе ПредставлениеПолей = НСтр("ru = 'Поля:'") + " " + ПредставлениеПолей; КонецЕсли; - ПредставлениеОтбора = ПредставлениеОтбора(ЭлементКД.Отбор); + ПредставлениеОтбора = ПредставлениеОтбора(ЭлементКД.Отбор, ЭлементКД.Отбор.Элементы, Состояние); + Если ПредставлениеОтбора = "" И ДоступныСведенияИзВарианта Тогда + ПредставлениеОтбора = ПредставлениеОтбора(НастройкаВариантаКД.Отбор, НастройкаВариантаКД.Отбор.Элементы, Состояние); + КонецЕсли; Если ПредставлениеОтбора = "" Тогда Разделитель = ""; Иначе @@ -1267,11 +1299,33 @@ Возврат Результат; КонецФункции -Функция ПредставлениеОтбора(УзелКД, НаборСтрокКД = Неопределено) - Если НаборСтрокКД = Неопределено Тогда - НаборСтрокКД = УзелКД.Элементы; - КонецЕсли; +Функция ПредставлениеОформляемыхПолей(ОформляемыеПоляКД, Состояние) + Представление = ""; + Для Каждого ОформляемоеПолеКД Из ОформляемыеПоляКД.Элементы Цикл + Если Не ОформляемоеПолеКД.Использование Тогда + Продолжить; + КонецЕсли; + + ДоступноеПолеКД = ОформляемыеПоляКД.ДоступныеПоляОформляемыхПолей.НайтиПоле(ОформляемоеПолеКД.Поле); + Если ДоступноеПолеКД = Неопределено Тогда + Состояние = "ПометкаУдаления"; + ПредставлениеПоля = Строка(ОформляемоеПолеКД.Поле); + Иначе + Если ЗначениеЗаполнено(ДоступноеПолеКД.Заголовок) Тогда + ПредставлениеПоля = ДоступноеПолеКД.Заголовок; + Иначе + ПредставлениеПоля = Строка(ОформляемоеПолеКД.Поле); + КонецЕсли; + КонецЕсли; + Представление = Представление + ?(Представление = "", "", ", ") + ПредставлениеПоля; + + КонецЦикла; + + Возврат Представление; +КонецФункции + +Функция ПредставлениеОтбора(УзелКД, НаборСтрокКД, Состояние) Представление = ""; Для Каждого ЭлементКД Из НаборСтрокКД Цикл @@ -1282,7 +1336,7 @@ Если ТипЗнч(ЭлементКД) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда ПредставлениеГруппы = Строка(ЭлементКД.ТипГруппы); - ПредставлениеВложенных = ПредставлениеОтбора(УзелКД, ЭлементКД.Элементы); + ПредставлениеВложенных = ПредставлениеОтбора(УзелКД, ЭлементКД.Элементы, Состояние); Если ПредставлениеВложенных = "" Тогда Продолжить; КонецЕсли; @@ -1292,13 +1346,14 @@ ДоступноеПолеОтбораКД = УзелКД.ДоступныеПоляОтбора.НайтиПоле(ЭлементКД.ЛевоеЗначение); Если ДоступноеПолеОтбораКД = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если ЗначениеЗаполнено(ДоступноеПолеОтбораКД.Заголовок) Тогда - ПредставлениеПоля = ДоступноеПолеОтбораКД.Заголовок; - Иначе + Состояние = "ПометкаУдаления"; ПредставлениеПоля = Строка(ЭлементКД.ЛевоеЗначение); + Иначе + Если ЗначениеЗаполнено(ДоступноеПолеОтбораКД.Заголовок) Тогда + ПредставлениеПоля = ДоступноеПолеОтбораКД.Заголовок; + Иначе + ПредставлениеПоля = Строка(ЭлементКД.ЛевоеЗначение); + КонецЕсли; КонецЕсли; ПредставлениеЗначения = Строка(ЭлементКД.ПравоеЗначение); @@ -1467,6 +1522,7 @@ Результат = Новый Структура; Результат.Вставить("НужноУказыватьТипЭлемента", Ложь); Результат.Вставить("КопируетсяДеревоФормы", Ложь); + Результат.Вставить("КопируетсяДеревоЗначений", Ложь); Результат.Вставить("ИсключаяСвойства", Неопределено); Результат.Вставить("ЕстьНастройки", Ложь); Результат.Вставить("ЕстьЭлементы", Ложь); @@ -1488,6 +1544,13 @@ Результат.КопируетсяДеревоФормы = Истина; +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + ИначеЕсли ТипЭлемента = Тип("СтрокаДереваЗначений") Тогда + + Результат.КопируетсяДеревоЗначений = Истина; + +#КонецЕсли + ИначеЕсли ТипЭлемента = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда @@ -1595,13 +1658,18 @@ ЗаполнитьЗначенияСвойств(ЧтоЗаполнить, ЧемЗаполнить, , ПараметрыКопирования.ИсключаяСвойства); КонецЕсли; - Если ПараметрыКопирования.КопируетсяДеревоФормы Тогда + Если ПараметрыКопирования.КопируетсяДеревоФормы + Или ПараметрыКопирования.КопируетсяДеревоЗначений Тогда Соответствие.Вставить(ЧемЗаполнить, ЧтоЗаполнить); - КоллекцияВложенных = ЧемЗаполнить.ПолучитьЭлементы(); + КоллекцияВложенных = ?(ПараметрыКопирования.КопируетсяДеревоФормы, + ЧемЗаполнить.ПолучитьЭлементы(), + ЧемЗаполнить.Строки); Если КоллекцияВложенных.Количество() > 0 Тогда - НоваяКоллекцияВложенных = ЧтоЗаполнить.ПолучитьЭлементы(); + НоваяКоллекцияВложенных = ?(ПараметрыКопирования.КопируетсяДеревоФормы, + ЧтоЗаполнить.ПолучитьЭлементы(), + ЧтоЗаполнить.Строки); Для Каждого ПодчиненнаяСтрока Из КоллекцияВложенных Цикл СкопироватьРекурсивно(Узел, ПодчиненнаяСтрока, НоваяКоллекцияВложенных, Неопределено, Соответствие); КонецЦикла; @@ -1957,17 +2025,21 @@ Результат.Вставить("СодержитТипУИД", Ложь); Результат.Вставить("СодержитТипХранилище", Ложь); Результат.Вставить("СодержитОбъектныеТипы", Ложь); - Результат.Вставить("ОграниченнойДлины", Истина); Результат.Вставить("КоличествоТипов", 0); Результат.Вставить("КоличествоПримитивныхТипов", 0); - Результат.Вставить("ОбъектныеТипы", Новый Массив); Если ПривестиКФорме Тогда ДобавляемыеТипы = Новый Массив; ВычитаемыеТипы = Новый Массив; + Результат.Вставить("ОписаниеТиповИсходное", ИсходноеОписаниеТипов); + Результат.Вставить("ОписаниеТиповДляФормы", ИсходноеОписаниеТипов); + КонецЕсли; + + Если ИсходноеОписаниеТипов = Неопределено Тогда + Возврат Результат; КонецЕсли; МассивТипов = ИсходноеОписаниеТипов.Типы(); @@ -1978,9 +2050,9 @@ КонецЕсли; Продолжить; КонецЕсли; - #Если Сервер Тогда - Если Тип = Тип("СправочникСсылка.ВнешниеПользователи") - И Не ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей") Тогда + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + МетаданныеНастройки = Метаданные.НайтиПоТипу(Тип); + Если МетаданныеНастройки <> Неопределено И Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеНастройки) Тогда Если ПривестиКФорме Тогда ВычитаемыеТипы.Добавить(Тип); КонецЕсли; @@ -2021,15 +2093,9 @@ КонецЦикла; - Если ПривестиКФорме Тогда - Если ДобавляемыеТипы.Количество() = 0 И ВычитаемыеТипы.Количество() = 0 Тогда - ОписаниеТиповДляФормы = ИсходноеОписаниеТипов; - Иначе - ОписаниеТиповДляФормы = Новый ОписаниеТипов(ИсходноеОписаниеТипов, ДобавляемыеТипы, ВычитаемыеТипы); - КонецЕсли; - - Результат.Вставить("ОписаниеТиповИсходное", ИсходноеОписаниеТипов); - Результат.Вставить("ОписаниеТиповДляФормы", ОписаниеТиповДляФормы); + Если ПривестиКФорме + И (ДобавляемыеТипы.Количество() > 0 Или ВычитаемыеТипы.Количество() > 0) Тогда + Результат.ОписаниеТиповДляФормы = Новый ОписаниеТипов(ИсходноеОписаниеТипов, ДобавляемыеТипы, ВычитаемыеТипы); КонецЕсли; Возврат Результат; @@ -2145,4 +2211,65 @@ КонецЕсли; КонецПроцедуры +// Индекс картинки в коллекции ПиктограммыНастроекОтчета. +Функция ИндексКартинки(Тип, Состояние = Неопределено) Экспорт + Если Тип = "Группа" Тогда + Индекс = 1; + ИначеЕсли Тип = "Элемент" Тогда + Индекс = 4; + ИначеЕсли Тип = "Группировка" + Или Тип = "ГруппировкаТаблицы" + Или Тип = "ГруппировкаДиаграммы" Тогда + Индекс = 7; + ИначеЕсли Тип = "Таблица" Тогда + Индекс = 10; + ИначеЕсли Тип = "Диаграмма" Тогда + Индекс = 11; + ИначеЕсли Тип = "НастройкиВложенногоОбъекта" Тогда + Индекс = 12; + ИначеЕсли Тип = "ПараметрыДанных" Тогда + Индекс = 14; + ИначеЕсли Тип = "ПараметрДанных" Тогда + Индекс = 15; + ИначеЕсли Тип = "Отборы" Тогда + Индекс = 16; + ИначеЕсли Тип = "ЭлементОтбора" Тогда + Индекс = 17; + ИначеЕсли Тип = "ВыбранныеПоля" Тогда + Индекс = 18; + ИначеЕсли Тип = "Сортировки" Тогда + Индекс = 19; + ИначеЕсли Тип = "УсловноеОформление" Тогда + Индекс = 20; + ИначеЕсли Тип = "Настройки" Тогда + Индекс = 21; + ИначеЕсли Тип = "Структура" Тогда + Индекс = 22; + ИначеЕсли Тип = "Ресурс" Тогда + Индекс = 23; + ИначеЕсли Тип = "Предупреждение" Тогда + Индекс = 24; + ИначеЕсли Тип = "Ошибка" Тогда + Индекс = 25; + Иначе + Индекс = -2; + КонецЕсли; + + Если Состояние = "ПометкаУдаления" Тогда + Индекс = Индекс + 1; + ИначеЕсли Состояние = "Предопределенный" Тогда + Индекс = Индекс + 2; + КонецЕсли; + + Возврат Индекс; +КонецФункции + +Функция КлючУникальности(ПолноеИмяОтчета, КлючВарианта) Экспорт + Результат = ПолноеИмяОтчета; + Если ЗначениеЗаполнено(КлючВарианта) Тогда + Результат = Результат + "/КлючВарианта." + КлючВарианта; + КонецЕсли; + Возврат Результат; +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl index b19e32bf3..22f94dfef 100644 --- a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Серверные события формы отчета. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // В данной процедуре следует описать дополнительные зависимости объектов метаданных @@ -45,17 +40,15 @@ КонецПроцедуры // Вызывается в обработчике одноименного события формы отчета после выполнения кода формы. +// См. "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. и ОтчетыКлиентПереопределяемый.ОбработчикКоманды(). // // Параметры: // Форма - УправляемаяФорма - Форма отчета. -// Отказ - Передается из параметров обработчика "как есть". -// СтандартнаяОбработка - Передается из параметров обработчика "как есть". +// Отказ - Булево - Признак отказа от создания формы. +// СтандартнаяОбработка - Булево - Признак выполнения стандартной (системной) обработки события. // -// См. также: -// "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. -// ОтчетыКлиентПереопределяемый.ОбработчикКоманды(). -// -// Пример 1 - Добавление команды с обработчиком в ОтчетыКлиентПереопределяемый.ОбработчикКоманды: +// Пример: +// //Добавление команды с обработчиком в ОтчетыКлиентПереопределяемый.ОбработчикКоманды: // Команда = ФормаОтчета.Команды.Добавить("МояОсобеннаяКоманда"); // Команда.Действие = "Подключаемый_Команда"; // Команда.Заголовок = НСтр("ru = 'Моя команда...'"); @@ -70,14 +63,12 @@ КонецПроцедуры // Вызывается в обработчике одноименного события формы отчета после выполнения кода формы. +// См. "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике. // // Параметры: // Форма - УправляемаяФорма - Форма отчета. // НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек. // -// См. также: -// "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике. -// Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl index ae58e556e..873286037 100644 --- a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl @@ -1,18 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы работы с СКД из формы отчета (сервер). -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Инициализирует компоновщик на основании схемы и загружает новые настройки. -// Для вызова из обработчика события ПередЗагрузкойНастроекВКомпоновщик() формы отчета, расположенного в модуле объекта отчета. +// Для вызова из обработчика события ПередЗагрузкойНастроекВКомпоновщик формы отчета, расположенного в модуле +// объекта отчета. // // Параметры: -// ОтчетОбъект - ОтчетОбъект.*, ВнешнийОтчетОбъект.* - Отчет, для которого необходимо подключить схему. -// Контекст - Произвольный - Передается "как есть" из одноименного параметра события ПередЗагрузкойНастроекВКомпоновщик. -// СхемаКД - СхемаКомпоновкиДанных - Схема, которую необходимо подключить. -// КлючСхемы - Строка - Идентификатор новой схемы, который будет записан в дополнительные свойства пользовательских настроек. +// ОтчетОбъект - ОтчетОбъект, ВнешнийОтчетОбъект - отчет, для которого необходимо подключить схему. +// Контекст - Произвольный - передается "как есть" из одноименного параметра события +// ПередЗагрузкойНастроекВКомпоновщик. +// СхемаКД - СхемаКомпоновкиДанных - схема, которую необходимо подключить. +// КлючСхемы - Строка - идентификатор новой схемы, который будет записан в дополнительные свойства +// пользовательских настроек. // Процедура ПодключитьСхему(ОтчетОбъект, Контекст, СхемаКД, КлючСхемы) Экспорт СобытиеИзФормыОтчета = (ТипЗнч(Контекст) = Тип("УправляемаяФорма")); @@ -47,27 +45,214 @@ КонецЕсли; КонецПроцедуры +// Выводит команду в форму отчета в виде кнопки в указанную группу. +// Также регистрирует команду, защищая ее от удаления при перерисовке формы. +// Для вызова из события ПриСозданииНаСервере формы отчета. +// +// Параметры: +// ФормаОтчета - УправляемаяФорма - форма отчета, в которую добавляется команда. +// КомандаИлиКоманды - КомандаФормы - команда, с которой будут связаны выводимые кнопки. +// Если в свойстве Действие указана пустая строка, +// то при выполнении команды будет вызвана процедура ОтчетыКлиентПереопределяемый.ОбработчикКоманды. +// Если в свойстве Действие указана строка вида "<ИмяКлиентскогоОбщегоМодуля>.<ИмяЭкспортнойПроцедуры>", +// то при выполнении команды в указанном модуле будет вызвана указанная процедура с двумя параметрами, +// аналогичным двум первым параметрам процедуры ОтчетыКлиентПереопределяемый.ОбработчикКоманды. +// - Массив - набор команд (КомандаФормы), которые будут выведены в указанную группу. +// ТипГруппы - Строка - условное имя группы, в которой требуется вывести кнопку. +// "Главное" - группа с кнопками "Сформировать" и "Формировать сразу". +// "Настройки" - группа с кнопками "Настройки", "Изменить вариант отчета" и т.п. +// "РаботаСТабличнымДокументом" - группа с кнопками "Найти", "Развернуть все группы" и т.п. +// "Интеграция" - группа такими кнопками как "Печать, Сохранить, Отправить" и т.п. +// "ПодменюОтправить" - подменю в группе "Интеграция" для отправки по почте. +// "Прочее" - группа с кнопками "Изменить форму", "Справка" и т.п. +// ВНачалоГруппы - Булево - если Истина, то кнопка будет выведена в начале группы. Иначе в конце группы. +// ТолькоВоВсехДействиях - Булево - если Истина, то кнопка будет выведена только в подменю "Еще". +// Иначе и в подменю "Еще", и в командной панели формы. +// СуффиксПодгруппы - Строка - если заполнен, то команды будут объединены в подгруппу. +// СуффиксПодгруппы добавляется к имени группы справа. +// +Процедура ВывестиКоманду(ФормаОтчета, КомандаИлиКоманды, ТипГруппы, ВНачалоГруппы = Ложь, ТолькоВоВсехДействиях = Ложь, + СуффиксПодгруппы = "") Экспорт + + ПередЧемВставить = Неопределено; + Если ТипГруппы = "Главное" Тогда + Группа = ФормаОтчета.Элементы.ГруппаГлавное; + ИначеЕсли ТипГруппы = "Настройки" Тогда + Группа = ФормаОтчета.Элементы.ГруппаНастройкиОтчета; + ИначеЕсли ТипГруппы = "РаботаСТабличнымДокументом" Тогда + Группа = ФормаОтчета.Элементы.ГруппаРаботаВТаблице; + ИначеЕсли ТипГруппы = "Интеграция" Тогда + Группа = ФормаОтчета.Элементы.ГруппаВывод; + ИначеЕсли ТипГруппы = "ПодменюОтправить" Тогда + Группа = ФормаОтчета.Элементы.ГруппаОтправить; + ИначеЕсли ТипГруппы = "Прочее" Тогда + Группа = ФормаОтчета.Элементы.ОсновнаяКоманднаяПанель; + ПередЧемВставить = ?(ВНачалоГруппы, ФормаОтчета.Элементы.НовоеОкно, Неопределено); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При вызове процедуры ""%1"" передано недопустимо значение параметра ""%2"".'"), + "ОтчетыСервер.ВывестиКоманду", + "ТипГруппы"); + КонецЕсли; + Если ВНачалоГруппы И ПередЧемВставить = Неопределено Тогда + ПередЧемВставить = Группа.ПодчиненныеЭлементы[0]; + КонецЕсли; + + Если ТипЗнч(КомандаИлиКоманды) = Тип("КомандаФормы") Тогда + Команды = Новый Массив; + Команды.Добавить(КомандаИлиКоманды); + Иначе + Команды = КомандаИлиКоманды; + КонецЕсли; + + Если СуффиксПодгруппы <> "" Тогда + Подгруппа = ФормаОтчета.Элементы.Найти(Группа.Имя + СуффиксПодгруппы); + Если Подгруппа = Неопределено Тогда + Подгруппа = ФормаОтчета.Элементы.Вставить(Группа.Имя + СуффиксПодгруппы, Тип("ГруппаФормы"), Группа, ПередЧемВставить); + Если Подгруппа.Вид = ВидГруппыФормы.Подменю Тогда + Подгруппа.Вид = ВидГруппыФормы.ГруппаКнопок; + КонецЕсли; + КонецЕсли; + Группа = Подгруппа; + ПередЧемВставить = Неопределено; + КонецЕсли; + + Для Каждого Команда Из Команды Цикл + + Обработчик = ?(СтрЧислоВхождений(Команда.Действие, ".") = 0, "", Команда.Действие); + ФормаОтчета.ПостоянныеКоманды.Добавить(Команда.Имя, Обработчик); + Команда.Действие = "Подключаемый_Команда"; + + Кнопка = ФормаОтчета.Элементы.Вставить(Команда.Имя, Тип("КнопкаФормы"), Группа, ПередЧемВставить); + Кнопка.ИмяКоманды = Команда.Имя; + Кнопка.ТолькоВоВсехДействиях = ТолькоВоВсехДействиях; + + КонецЦикла; + +КонецПроцедуры + +// Оформляет ячейку в виде гиперссылки и заполняет поля адреса и представления ссылки. +// +// Параметры: +// Ячейка - ОбластьЯчеекТабличногоДокумента - область табличного документа. +// АдресСсылки - Строка - адрес ссылки, которую необходимо вывести в указанной ячейке. +// В стандартной форме отчета автоматически открываются ссылки следующих форматов: +// "http://<адрес>", "https://<адрес>", "e1cib/<адрес>", "e1c://<адрес>" +// Такие ссылки открываются при помощи процедуры ОбщегоНазначенияКлиент.ПерейтиПоСсылке. +// См. также ПредставлениеНавигационнойСсылки.НавигационнаяСсылка в синтакс-помощнике. +// Для открытия ссылок других форматов следует написать код +// в процедуре ОтчетыКлиентПереопределяемый.ОбработкаВыбораТабличногоДокумента. +// ПредставлениеСсылки - Строка, Неопределено - наименование, которую необходимо вывести в указанной ячейке. +// Если Неопределено, то выводится как есть АдресСсылки. +// +Процедура ВывестиГиперссылку(Ячейка, АдресСсылки, ПредставлениеСсылки = Неопределено) Экспорт + Ячейка.Гиперссылка = Истина; + Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт, , , , , Истина); + Ячейка.ЦветТекста = ЦветаСтиля.ГиперссылкаЦвет; + Ячейка.Расшифровка = АдресСсылки; + Ячейка.Текст = ?(ПредставлениеСсылки = Неопределено, АдресСсылки, ПредставлениеСсылки); +КонецПроцедуры + +// Определяет что отчет пустой. +// +// Параметры: +// ОтчетОбъект - ОтчетОбъект, ВнешнийОтчетОбъект - проверяемый отчет. +// ПроцессорКД - ПроцессорКомпоновкиДанных - объект, выполняющий компоновку данных в отчете. +// +// Возвращаемое значение: +// Булево - Истина, если отчет пустой. Ложь, если отчет содержит данные. +// +Функция ОтчетПустой(ОтчетОбъект, ПроцессорКД = Неопределено) Экспорт + Если ПроцессорКД = Неопределено Тогда + + Если ОтчетОбъект.СхемаКомпоновкиДанных = Неопределено Тогда + Возврат Ложь; // Не СКД отчет. + КонецЕсли; + + // Объект для создания макета компоновки данных. + КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных; + + // Выполняет компоновку макета. + МакетКД = КомпоновщикМакетаКД.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки()); + + // Пропуск проверки на то, что отчет пустой. + Если ЕстьВнешнийНаборДанных(МакетКД.НаборыДанных) Тогда + Возврат Ложь; + КонецЕсли; + + // Объект, выполняющий компоновку данных. + ПроцессорКД = Новый ПроцессорКомпоновкиДанных; + + // Инициализировать объект. + ПроцессорКД.Инициализировать(МакетКД, , , Истина); + + Иначе + + // Встать в начало компоновки. + ПроцессорКД.Сбросить(); + + КонецЕсли; + + // Объект для вывода результата компоновки в табличный документ. + ПроцессорВыводаРезультатаКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; + + // Устанавливает табличный документ, в который нужно выводить результат. + ПроцессорВыводаРезультатаКД.УстановитьДокумент(Новый ТабличныйДокумент); + + // Последовательный вывод + ПроцессорВыводаРезультатаКД.НачатьВывод(); + + // Получает следующий элемент результата компоновки. + ЭлементРезультатаКД = ПроцессорКД.Следующий(); + Пока ЭлементРезультатаКД <> Неопределено Цикл + + // Вывести элемент результата компоновки отчета в документ. + ПроцессорВыводаРезультатаКД.ВывестиЭлемент(ЭлементРезультатаКД); + + // Определить не пустой результат. + Для Каждого ЗначениеПараметраМакетаКД Из ЭлементРезультатаКД.ЗначенияПараметров Цикл + Попытка + ЗначениеЗаполнено = ЗначениеЗаполнено(ЗначениеПараметраМакетаКД.Значение); + Исключение + ЗначениеЗаполнено = Ложь; // Линия, Рамка, Цвет и другие объекты КД, которые могут фигурировать при выводе. + КонецПопытки; + Если ЗначениеЗаполнено Тогда + ПроцессорВыводаРезультатаКД.ЗакончитьВывод(); + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + // Получает следующий элемент результата компоновки. + ЭлементРезультатаКД = ПроцессорКД.Следующий(); + КонецЦикла; + + // Указание объекту о том, что вывод результата завершен. + ПроцессорВыводаРезультатаКД.ЗакончитьВывод(); + + Возврат Истина; +КонецФункции + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс // Формирует описание периода для целей сбора статистики. -// Получаемая информация не содержит конкретных дат, поэтому может считаться анонимной. +// Получаемая информация не содержит конкретных дат, поэтому может считаться анонимной. // // Параметры: -// СтандартныйПериод - СтандартныйПериод - Анализируемый период. +// Период - СтандартныйПериод - анализируемый период. // // Возвращаемое значение: -// Структура - Описание периода. -// * ВидПериода - Строка - Классификация периода. Например: "Год", "СНачалаГода" или "ДоКонцаГода". -// * СдвигПериода - Число - Количество шагов, необходимых для получения периода относительно текущей даты. -// Размер шага определяется видом периода. +// Структура - описание периода: +// * ВидПериода - Строка - Классификация периода. Например: "Год", "СНачалаГода" или "ДоКонцаГода". +// * СдвигПериода - Число - Количество шагов, необходимых для получения периода относительно текущей даты. +// Размер шага определяется видом периода. // -Функция АнализПериода(СтандартныйПериод) Экспорт - Если СтандартныйПериод.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда - Возврат АнализПроизвольногоПериода(СтандартныйПериод.ДатаНачала, СтандартныйПериод.ДатаОкончания); +Функция АнализПериода(Период) Экспорт + Если Период.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда + Возврат АнализПроизвольногоПериода(Период.ДатаНачала, Период.ДатаОкончания); Иначе - Возврат АнализСтандартногоПериода(СтандартныйПериод.Вариант); + Возврат АнализСтандартногоПериода(Период.Вариант); КонецЕсли; КонецФункции @@ -116,6 +301,7 @@ Информация.Поиск.Вставить("ПользовательскиеНастройки", Новый Соответствие); Информация.Вставить("ЕстьБыстрыеНастройки", Ложь); Информация.Вставить("ЕстьОбычныеНастройки", Ложь); + Информация.Вставить("ЕстьНесуществующиеПоля", Ложь); Информация.Вставить("ЕстьВложенныеОтчеты", Ложь); Информация.Вставить("ЕстьВложенныеОтборы", Ложь); @@ -133,7 +319,7 @@ Информация.Поиск.ПользовательскиеНастройки.Вставить(СвойстваНастройки.Идентификатор, СвойстваНастройки); КонецЦикла; - СтрокаДерева = ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, НастройкиКД, Информация.ДеревоВарианта.Строки, "Отчет"); + СтрокаДерева = ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, НастройкиКД, Информация.ДеревоВарианта.Строки, "Отчет"); СтрокаДерева.Глобальная = Истина; Информация.Вставить("ДеревоВариантаКорневаяСтрока", СтрокаДерева); Если Информация.ИдентификаторТекущегоУзлаКД = Неопределено Тогда @@ -173,6 +359,7 @@ // Тип настройки. Результат.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("Подтип", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Состояние", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("ЕстьСтруктура", Новый ОписаниеТипов("Булево")); Результат.Колонки.Добавить("ЕстьПоляИОформление", Новый ОписаниеТипов("Булево")); @@ -194,7 +381,7 @@ Возврат Результат; КонецФункции -Функция ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД, НаборСтрокДерева, Подтип = "") +Функция ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД, НаборСтрокДерева, Подтип = "") СтрокаДерева = НаборСтрокДерева.Добавить(); СтрокаДерева.УзелКД = УзелКД; СтрокаДерева.Тип = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(УзелКД)); @@ -227,7 +414,7 @@ Возврат СтрокаДерева; КонецЕсли; - ЗаполнитьПредставлениеНастройки( + ЗаполнитьПредставлениеИСостояниеНастройки( СтрокаДерева, СтрокаДерева.УзелКД, Неопределено, @@ -239,7 +426,7 @@ СтрокаДерева.СодержитУсловноеОформление = НастройкиКД.НаличиеУсловногоОформленияУЭлемента(УзелКД); КонецЕсли; - Если Не Информация.ТолькоПользовательские Тогда + Если Не Информация.ТолькоБыстрые Тогда СтрокаДерева.ВыводРазрешен = (СтрокаДерева.ИдентификаторКД = Информация.ИдентификаторТекущегоУзлаКД); КонецЕсли; @@ -254,32 +441,33 @@ КонецЕсли; Если Информация.ТолькоПользовательские Тогда СтрокаДерева.ВыводРазрешен = СвойстваНастройки.ВыводРазрешен; + СтрокаДерева.Состояние = СвойстваНастройки.Состояние; КонецЕсли; КонецЕсли; КонецЕсли; Если СтрокаДерева.ЕстьСтруктура Тогда Для Каждого ВложенныйЭлемент Из УзелКД.Структура Цикл - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, ВложенныйЭлемент, СтрокаДерева.Строки); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, ВложенныйЭлемент, СтрокаДерева.Строки); КонецЦикла; СтрокаДерева.СодержитОтборы = НастройкиКД.НаличиеОтбораУЭлемента(УзелКД); СтрокаДерева.СодержитСортировки = НастройкиКД.НаличиеПорядкаУЭлемента(УзелКД); КонецЕсли; Если СтрокаДерева.Тип = "Таблица" Тогда - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД.Строки, СтрокаДерева.Строки, "ТаблицаСтроки"); - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД.Колонки, СтрокаДерева.Строки, "ТаблицаКолонки"); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД.Строки, СтрокаДерева.Строки, "ТаблицаСтроки"); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД.Колонки, СтрокаДерева.Строки, "ТаблицаКолонки"); ИначеЕсли СтрокаДерева.Тип = "Диаграмма" Тогда - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД.Точки, СтрокаДерева.Строки, "ДиаграммаТочки"); - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД.Серии, СтрокаДерева.Строки, "ДиаграммаСерии"); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД.Точки, СтрокаДерева.Строки, "ДиаграммаТочки"); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД.Серии, СтрокаДерева.Строки, "ДиаграммаСерии"); ИначеЕсли СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыТаблицы" Или СтрокаДерева.Тип = "КоллекцияЭлементовСтруктурыДиаграммы" Тогда Для Каждого ВложенныйЭлемент Из УзелКД Цикл - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, ВложенныйЭлемент, СтрокаДерева.Строки); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, ВложенныйЭлемент, СтрокаДерева.Строки); КонецЦикла; ИначеЕсли СтрокаДерева.Тип = "НастройкиВложенногоОбъекта" Тогда Информация.ЕстьВложенныеОтчеты = Истина; - ДеревоВариантаЗарегистрироватьУзел(Информация, НастройкиКД, УзелКД.Настройки, СтрокаДерева.Строки); + ЗарегистрироватьУзелДереваВарианта(Информация, НастройкиКД, УзелКД.Настройки, СтрокаДерева.Строки); КонецЕсли; Если Не СтрокаДерева.Глобальная Тогда @@ -346,6 +534,7 @@ // Описание настройки. Результат.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("Подтип", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Состояние", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("ПолеКД"); Результат.Колонки.Добавить("Значение"); @@ -408,6 +597,7 @@ // Описание настройки. Результат.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("Подтип", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Состояние", Новый ОписаниеТипов("Строка")); Результат.Колонки.Добавить("ПолеКД"); Результат.Колонки.Добавить("Значение"); @@ -585,7 +775,7 @@ Владелец.ИмяКоллекции = ИмяКоллекции; Владелец.Глобальная = СтрокаДерева.Глобальная; Владелец.ЭлементКД = УзелКД; - Владелец.ВыводРазрешен = Не Информация.ТолькоПользовательские И СтрокаДерева.ВыводРазрешен; + Владелец.ВыводРазрешен = Не Информация.ТолькоБыстрые И СтрокаДерева.ВыводРазрешен; Если ТипЗнч(Владелец.Идентификатор) = Тип("Строка") И Не ПустаяСтрока(Владелец.Идентификатор) Тогда СвойстваНастройки = Информация.Поиск.ПользовательскиеНастройки.Получить(Владелец.Идентификатор); @@ -604,7 +794,7 @@ Если Владелец.ВыводРазрешен Тогда Если Владелец.ПользовательскаяНастройка = Неопределено Тогда - ЗаполнитьПредставлениеНастройки( + ЗаполнитьПредставлениеИСостояниеНастройки( Владелец, Владелец.ЭлементКД, Неопределено, @@ -619,22 +809,48 @@ Или ИмяКоллекции = "ПараметрыВывода" Или ИмяКоллекции = "УсловноеОформление" Тогда ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, УзелКД.Элементы, Владелец, Владелец); + ИначеЕсли Не Информация.ТолькоБыстрые // (Оптимизация) Поля и сортировки не выводятся в быстрых настройках. + И (ИмяКоллекции = "Порядок" Или ИмяКоллекции = "Выбор") Тогда + ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, УзелКД.Элементы, Владелец, Владелец); КонецЕсли; КонецПроцедуры Процедура ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, НаборЭлементов, Владелец, Родитель) + ЕстьНеПомеченные = Ложь; + ЕстьПомеченные = Ложь; + Для Каждого ЭлементКД Из НаборЭлементов Цикл НастройкаВарианта = Родитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НастройкаВарианта, Владелец, "СтрокаДерева, ИмяКоллекции, Глобальная"); - НастройкаВарианта.Идентификатор = ЭлементКД.ИдентификаторПользовательскойНастройки; НастройкаВарианта.Тип = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементКД)); НастройкаВарианта.ИдентификаторКД = УзелКД.ПолучитьИдентификаторПоОбъекту(ЭлементКД); НастройкаВарианта.Владелец = Владелец; НастройкаВарианта.ЭлементКД = ЭлементКД; - НастройкаВарианта.ВыводРазрешен = Не Информация.ТолькоПользовательские И Владелец.ВыводРазрешен; + НастройкаВарианта.ВыводРазрешен = Не Информация.ТолькоБыстрые И Владелец.ВыводРазрешен; НастройкаВарианта.ВыводитьФлажок = Истина; + Если НастройкаВарианта.Тип = "АвтоЭлементПорядка" + Или НастройкаВарианта.Тип = "АвтоВыбранноеПоле" + Или НастройкаВарианта.Тип = "ГруппаВыбранныхПолей" Тогда + // Действие не требуется. + ИначеЕсли НастройкаВарианта.Тип = "ЭлементПорядка" Тогда + НастройкаВарианта.Значение = ЭлементКД.ТипУпорядочивания; + НастройкаВарианта.ПолеКД = ЭлементКД.Поле; + НастройкаВарианта.ДоступнаяНастройкаКД = УзелКД.ДоступныеПоляПорядка.НайтиПоле(ЭлементКД.Поле); + Если НастройкаВарианта.ДоступнаяНастройкаКД = Неопределено Тогда + НастройкаВарианта.Состояние = "ПометкаУдаления"; + КонецЕсли; + ИначеЕсли НастройкаВарианта.Тип = "ВыбранноеПоле" Тогда + НастройкаВарианта.ПолеКД = ЭлементКД.Поле; + НастройкаВарианта.ДоступнаяНастройкаКД = УзелКД.ДоступныеПоляВыбора.НайтиПоле(ЭлементКД.Поле); + Если НастройкаВарианта.ДоступнаяНастройкаКД = Неопределено Тогда + НастройкаВарианта.Состояние = "ПометкаУдаления"; + КонецЕсли; + Иначе + НастройкаВарианта.Идентификатор = ЭлементКД.ИдентификаторПользовательскойНастройки; + КонецЕсли; + Если НастройкаВарианта.Тип = "ВыбранныеПоля" Или НастройкаВарианта.Тип = "Порядок" Или НастройкаВарианта.Тип = "КоллекцияЭлементовСтруктурыТаблицы" @@ -648,11 +864,7 @@ Если НастройкаВарианта.Тип = "ЭлементОтбора" Или НастройкаВарианта.Тип = "ЗначениеПараметраНастроек" Тогда ЗарегистрироватьПоле(Информация, УзелКД, ЭлементКД, НастройкаВарианта); - Если НастройкаВарианта.ДоступнаяНастройкаКД = Неопределено Тогда - НастройкаВарианта.ВыводРазрешен = Ложь; - Продолжить; - КонецЕсли; - ЗарегистрироватьТипыИСвязи(Информация, УзелКД, ЭлементКД, НастройкаВарианта); + ЗарегистрироватьТипыИСвязи(Информация, НастройкаВарианта); КонецЕсли; СвойстваНастройки = Неопределено; @@ -670,12 +882,15 @@ КонецЕсли; Если НастройкаВарианта.ВыводРазрешен Тогда - ЗаполнитьПредставлениеНастройки( + ЗаполнитьПредставлениеИСостояниеНастройки( НастройкаВарианта, НастройкаВарианта.ЭлементКД, Неопределено, НастройкаВарианта.ДоступнаяНастройкаКД); - Если НастройкаВарианта.Тип = "ЭлементОтбора" + Если НастройкаВарианта.Состояние = "ПометкаУдаления" Тогда + Информация.ЕстьНесуществующиеПоля = Истина; + НастройкаВарианта.ВыводРазрешен = Ложь; + ИначеЕсли НастройкаВарианта.Тип = "ЭлементОтбора" Или НастройкаВарианта.Тип = "ЗначениеПараметраНастроек" Тогда ПриОпределенииПараметровВыбора(Информация, НастройкаВарианта); КонецЕсли; @@ -684,6 +899,9 @@ Если НастройкаВарианта.Тип = "ГруппаЭлементовОтбора" Тогда НастройкаВарианта.Значение = ЭлементКД.ТипГруппы; ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, ЭлементКД.Элементы, Владелец, НастройкаВарианта); + ИначеЕсли НастройкаВарианта.Тип = "ГруппаВыбранныхПолей" Тогда + НастройкаВарианта.Значение = ЭлементКД.Расположение; + ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, ЭлементКД.Элементы, Владелец, НастройкаВарианта); ИначеЕсли НастройкаВарианта.Тип = "ЗначениеПараметраНастроек" Тогда ЗарегистрироватьЭлементыНастроек(Информация, УзелКД, ЭлементКД.ЗначенияВложенныхПараметров, Владелец, НастройкаВарианта); КонецЕсли; @@ -694,7 +912,18 @@ СвойстваНастройки.БыстрыйВыбор = НастройкаВарианта.БыстрыйВыбор; СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями; КонецЕсли; + + Если НастройкаВарианта.Состояние = "ПометкаУдаления" Тогда + Информация.ЕстьНесуществующиеПоля = Истина; + ЕстьПомеченные = Истина; + Иначе + ЕстьНеПомеченные = Истина; + КонецЕсли; КонецЦикла; + + Если ЕстьПомеченные И Не ЕстьНеПомеченные И Родитель <> Владелец Тогда + Родитель.Состояние = "ПометкаУдаления"; + КонецЕсли; КонецПроцедуры Процедура ЗарегистрироватьПоле(Информация, УзелКД, ЭлементКД, НастройкаВарианта) @@ -708,6 +937,7 @@ НастройкаВарианта.ИдентификаторЭлемента = ОтчетыКлиентСервер.ПривестиИдентификаторКИмени(НастройкаВарианта.Идентификатор); Если НастройкаВарианта.Тип = "ЗначениеПараметраНастроек" Тогда + НастройкаВарианта.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных." + Строка(ЭлементКД.Параметр)); ДоступныеПараметры = УзелКД.ДоступныеПараметры; Если ДоступныеПараметры = Неопределено Тогда Возврат; @@ -728,7 +958,6 @@ НастройкаВарианта.ВыводРазрешен = Ложь; КонецЕсли; НастройкаВарианта.ДоступнаяНастройкаКД = ДоступнаяНастройкаКД; - НастройкаВарианта.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных." + Строка(ЭлементКД.Параметр)); НастройкаВарианта.Значение = ЭлементКД.Значение; Если ДоступнаяНастройкаКД.ДоступенСписокЗначений Тогда НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; @@ -739,6 +968,9 @@ НастройкаВарианта.ВыводитьФлажок = Ложь; КонецЕсли; Иначе + НастройкаВарианта.ПолеКД = ЭлементКД.ЛевоеЗначение; + НастройкаВарианта.Значение = ЭлементКД.ПравоеЗначение; + НастройкаВарианта.ВидСравнения = ЭлементКД.ВидСравнения; ДоступныеПоляОтбора = УзелКД.ДоступныеПоляОтбора; Если ДоступныеПоляОтбора = Неопределено Тогда Возврат; @@ -749,9 +981,6 @@ КонецЕсли; // ДоступнаяНастройкаКД имеет тип ДоступноеПолеОтбораКомпоновкиДанных. НастройкаВарианта.ДоступнаяНастройкаКД = ДоступнаяНастройкаКД; - НастройкаВарианта.ПолеКД = ЭлементКД.ЛевоеЗначение; - НастройкаВарианта.Значение = ЭлементКД.ПравоеЗначение; - НастройкаВарианта.ВидСравнения = ЭлементКД.ВидСравнения; КонецЕсли; Если НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке @@ -777,7 +1006,7 @@ КонецПроцедуры -Процедура ЗарегистрироватьТипыИСвязи(Информация, УзелКД, ЭлементКД, НастройкаВарианта) +Процедура ЗарегистрироватьТипыИСвязи(Информация, НастройкаВарианта) /////////////////////////////////////////////////////////////////// // Информация о типах. @@ -790,12 +1019,14 @@ НастройкаВарианта.ОтмеченныеЗначения = ОтчетыКлиентСервер.ЗначенияСписком(НастройкаВарианта.Значение); КонецЕсли; НастройкаВарианта.ЗапросЗначенийВыбора = Новый Запрос; - - ТекстЗапросаСсылок = ""; + НастройкаВарианта.ЗначенияДляВыбора = Новый СписокЗначений; ИнформацияОТипах = ОтчетыКлиентСервер.АнализТипов(НастройкаВарианта.ОписаниеТипов, Истина); ИнформацияОТипах.Вставить("СодержитСсылочныеТипы", Ложь); ИнформацияОТипах.Вставить("КоличествоСБыстрымВыбором", 0); + ВсеТипыСБыстрымВыбором = ИнформацияОТипах.КоличествоТипов < 10 + И (ИнформацияОТипах.КоличествоТипов = ИнформацияОТипах.ОбъектныеТипы.Количество()); + Для Каждого Тип Из ИнформацияОТипах.ОбъектныеТипы Цикл ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); ПолноеИмя = Информация.СоответствиеИменОбъектовМетаданных.Получить(Тип); @@ -808,33 +1039,26 @@ Информация.СоответствиеИменОбъектовМетаданных.Вставить(Тип, ПолноеИмя); КонецЕсли; Если ПолноеИмя = -1 Тогда + ВсеТипыСБыстрымВыбором = Ложь; Продолжить; КонецЕсли; ИнформацияОТипах.СодержитСсылочныеТипы = Истина; - ДляВыбораЭтогоТипаИспользуетсяБыстрыйВыбор = НастройкаВарианта.БыстрыйВыбор; - Вид = ВРег(СтрЛев(ПолноеИмя, ".")); - Если Вид = "ПЕРЕЧИСЛЕНИЕ" Тогда - ДляВыбораЭтогоТипаИспользуетсяБыстрыйВыбор = Истина; - ИначеЕсли Вид = "СПРАВОЧНИК" - Или Вид = "ПЛАНВИДОВРАСЧЕТА" - Или Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" - Или Вид = "ПЛАНОБМЕНА" - Или Вид = "ПЛАНСЧЕТОВ" Тогда - Если ОбъектМетаданных.СпособВыбора = Метаданные.СвойстваОбъектов.СпособВыбора.БыстрыйВыбор Тогда - ДляВыбораЭтогоТипаИспользуетсяБыстрыйВыбор = Истина; - КонецЕсли; - КонецЕсли; - Если ДляВыбораЭтогоТипаИспользуетсяБыстрыйВыбор Тогда - ИнформацияОТипах.КоличествоСБыстрымВыбором = ИнформацияОТипах.КоличествоСБыстрымВыбором + 1; - ФрагментЗапросаИз = " ИЗ " + ПолноеИмя + Символы.ПС; - Если ТекстЗапросаСсылок = "" Тогда - ТекстЗапросаСсылок = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ Ссылка" + ФрагментЗапросаИз; - ИначеЕсли СтрНайти(ТекстЗапросаСсылок, ФрагментЗапросаИз) = 0 Тогда - ТекстЗапросаСсылок = ТекстЗапросаСсылок + Символы.ПС - + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС - + "ВЫБРАТЬ РАЗЛИЧНЫЕ Ссылка" + ФрагментЗапросаИз; + Если ВсеТипыСБыстрымВыбором Тогда + Вид = ВРег(СтрРазделить(ПолноеИмя, ".")[0]); + Если Вид <> "ПЕРЕЧИСЛЕНИЕ" Тогда + Если Вид = "СПРАВОЧНИК" + Или Вид = "ПЛАНВИДОВРАСЧЕТА" + Или Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или Вид = "ПЛАНОБМЕНА" + Или Вид = "ПЛАНСЧЕТОВ" Тогда + Если ОбъектМетаданных.СпособВыбора <> Метаданные.СвойстваОбъектов.СпособВыбора.БыстрыйВыбор Тогда + ВсеТипыСБыстрымВыбором = Ложь; + КонецЕсли; + Иначе + ВсеТипыСБыстрымВыбором = Ложь; + КонецЕсли; КонецЕсли; КонецЕсли; @@ -857,7 +1081,7 @@ КонецЦикла; // Только перечисления или типы с быстрым выбором. - Если ИнформацияОТипах.КоличествоСБыстрымВыбором = ИнформацияОТипах.КоличествоТипов Тогда + Если ВсеТипыСБыстрымВыбором И ИнформацияОТипах.ОбъектныеТипы.Количество() = ИнформацияОТипах.КоличествоТипов Тогда НастройкаВарианта.БыстрыйВыбор = Истина; КонецЕсли; @@ -868,6 +1092,9 @@ // Информация о связях и параметрах выбора. ДоступнаяНастройкаКД = НастройкаВарианта.ДоступнаяНастройкаКД; + Если ДоступнаяНастройкаКД = Неопределено Тогда + Возврат; + КонецЕсли; Если ЗначениеЗаполнено(ДоступнаяНастройкаКД.СвязьПоТипу) Тогда СтрокаСвязи = Информация.Связи.ПоТипу.Добавить(); @@ -898,12 +1125,6 @@ НастройкаВарианта.ЗначенияДляВыбора = ДоступнаяНастройкаКД.ДоступныеЗначения; НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями = НастройкаВарианта.ЗначенияДляВыбора.Количество() > 0; Иначе - Если НастройкаВарианта.БыстрыйВыбор Тогда - НастройкаВарианта.ЗапросЗначенийВыбора.Текст = ТекстЗапросаСсылок; - НастройкаВарианта.ОграничиватьВыборУказаннымиЗначениями = Истина; - КонецЕсли; - - НастройкаВарианта.ЗначенияДляВыбора = Новый СписокЗначений; НастройкиСохраненныеРанее = Информация.ДополнительныеНастройкиЭлементов[НастройкаВарианта.ИдентификаторЭлемента]; Ограничивать = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиСохраненныеРанее, "ОграничиватьВыборУказаннымиЗначениями"); Если НастройкиСохраненныеРанее <> Неопределено И Ограничивать = Ложь Тогда @@ -1024,6 +1245,10 @@ ЛучшийВариант = 99; Найденные = Информация.НастройкиВарианта.Строки.НайтиСтроки(Новый Структура("ПолеКД", СвязьПараметровВыбора.ВедущийПолеКД), Истина); Для Каждого ПотенциальныйРодитель Из Найденные Цикл + Если ПотенциальныйРодитель.Тип <> "ЭлементОтбора" + И ПотенциальныйРодитель.Тип <> "ЗначениеПараметраНастроек" Тогда + Продолжить; + КонецЕсли; Если ПотенциальныйРодитель.Родитель = Подчиненный.Родитель Тогда // Элементы в одной группе. Если Не ПустаяСтрока(ПотенциальныйРодитель.ИдентификаторЭлемента) Тогда // Ведущий выведен в пользовательские. Ведущий = ПотенциальныйРодитель; @@ -1093,6 +1318,11 @@ КонецПроцедуры Процедура УстановитьФиксированныеОтборы(СтруктураОтборов, НастройкиКД, НастройкиОтчета) Экспорт + Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") + Или СтруктураОтборов = Неопределено + Или СтруктураОтборов.Количество() = 0 Тогда + Возврат; + КонецЕсли; ПараметрыКД = НастройкиКД.ПараметрыДанных; ОтборыКД = НастройкиКД.Отбор; Недоступный = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; @@ -1179,11 +1409,6 @@ // Определение доступной настройки. Если СвойстваНастройки.Тип = "НастройкиВложенногоОбъекта" Тогда СвойстваНастройки.ДоступнаяНастройкаКД = Информация.НастройкиКД.ДоступныеОбъекты.Элементы.Найти(СвойстваНастройки.СтрокаДерева.УзелКД.ИдентификаторОбъекта); - ИначеЕсли СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" - Или СвойстваНастройки.Тип = "ЭлементОтбора" Тогда - Если СвойстваНастройки.ДоступнаяНастройкаКД = Неопределено Тогда - Возврат СвойстваНастройки; // Имя поля изменилось или поле было удалено. - КонецЕсли; КонецЕсли; Если Информация.ТолькоПользовательские Тогда @@ -1197,12 +1422,17 @@ СвойстваНастройки.ВыводитьФлажок = Истина; СвойстваНастройки.ВыводитьТолькоФлажок = Ложь; - ЗаполнитьПредставлениеНастройки( + ЗаполнитьПредставлениеИСостояниеНастройки( СвойстваНастройки, СвойстваНастройки.НастройкаВариантаКД, СвойстваНастройки.ПользовательскаяНастройкаКД, СвойстваНастройки.ДоступнаяНастройкаКД); + Если СвойстваНастройки.Состояние = "ПометкаУдаления" Тогда + Информация.ЕстьНесуществующиеПоля = Истина; + СвойстваНастройки.ВыводРазрешен = Ложь; + КонецЕсли; + Если СвойстваНастройки.Тип = "ГруппаЭлементовОтбора" Или СвойстваНастройки.Тип = "НастройкиВложенногоОбъекта" Или СвойстваНастройки.Тип = "Группировка" @@ -1303,7 +1533,7 @@ Возврат СвойстваНастройки; КонецФункции -Процедура ЗаполнитьПредставлениеНастройки(СвойстваНастройки, НастройкаВариантаКД, ПользовательскаяНастройкаКД, ДоступнаяНастройкаКД) +Процедура ЗаполнитьПредставлениеИСостояниеНастройки(СвойстваНастройки, НастройкаВариантаКД, ПользовательскаяНастройкаКД, ДоступнаяНастройкаКД) Если ПользовательскаяНастройкаКД = Неопределено Тогда ПользовательскаяНастройкаКД = НастройкаВариантаКД; КонецЕсли; @@ -1339,28 +1569,63 @@ Иначе ПредставлениеПоУмолчанию = Строка(СвойстваНастройки.Подтип); КонецЕсли; + + // Параметры и отборы. ИначеЕсли СвойстваНастройки.Тип = "Отбор" Тогда ПредставлениеПоУмолчанию = НСтр("ru = 'Отбор'"); ИначеЕсли СвойстваНастройки.Тип = "ГруппаЭлементовОтбора" Тогда ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.ТипГруппы); ИначеЕсли СвойстваНастройки.Тип = "ЭлементОтбора" Тогда ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.ЛевоеЗначение); + ИначеЕсли СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" Тогда + ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.Параметр); + + // Сортировки. ИначеЕсли СвойстваНастройки.Тип = "Порядок" Тогда ПредставлениеПоУмолчанию = НСтр("ru = 'Сортировка'"); + ИначеЕсли СвойстваНастройки.Тип = "АвтоЭлементПорядка" Тогда + ПредставлениеПоУмолчанию = НСтр("ru = 'Авто (сортировки родителя)'"); + ИначеЕсли СвойстваНастройки.Тип = "ЭлементПорядка" Тогда + ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.Поле); + + // Выбранные поля. ИначеЕсли СвойстваНастройки.Тип = "ВыбранныеПоля" Тогда ПредставлениеПоУмолчанию = НСтр("ru = 'Поля'"); + ИначеЕсли СвойстваНастройки.Тип = "ВыбранноеПоле" Тогда + ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.Поле); + ИначеЕсли СвойстваНастройки.Тип = "АвтоВыбранноеПоле" Тогда + ПредставлениеПоУмолчанию = НСтр("ru = 'Авто (поля родителя)'"); + ИначеЕсли СвойстваНастройки.Тип = "ГруппаВыбранныхПолей" Тогда + ПредставлениеПоУмолчанию = НастройкаВариантаКД.Заголовок; + Если НастройкаВариантаКД.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда + ПредставлениеПоУмолчанию = ПредставлениеПоУмолчанию + " (" + Строка(НастройкаВариантаКД.Расположение) + ")"; + КонецЕсли; + + // Оформление. ИначеЕсли СвойстваНастройки.Тип = "УсловноеОформление" Тогда ПредставлениеПоУмолчанию = НСтр("ru = 'Оформление'"); ИначеЕсли СвойстваНастройки.Тип = "ЭлементУсловногоОформления" Тогда - ПредставлениеПоУмолчанию = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления(ПользовательскаяНастройкаКД); - ИначеЕсли СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" Тогда - ПредставлениеПоУмолчанию = Строка(НастройкаВариантаКД.Параметр); + ПредставлениеПоУмолчанию = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления( + ПользовательскаяНастройкаКД, + НастройкаВариантаКД, + СвойстваНастройки.Состояние); + + // Структура. ИначеЕсли СвойстваНастройки.Тип = "Группировка" Или СвойстваНастройки.Тип = "ГруппировкаТаблицы" Или СвойстваНастройки.Тип = "ГруппировкаДиаграммы" Тогда ПредставлениеПоУмолчанию = СокрЛП(Строка(НастройкаВариантаКД.ПоляГруппировки)); Если ПустаяСтрока(ПредставлениеПоУмолчанию) Тогда ПредставлениеПоУмолчанию = НСтр("ru = '<Детальные записи>'"); + Иначе + ДоступныеПоляКД = НастройкаВариантаКД.ПоляГруппировки.ДоступныеПоляПолейГруппировок; + Для Каждого ПолеГруппировкиКД Из НастройкаВариантаКД.ПоляГруппировки.Элементы Цикл + Если ТипЗнч(ПолеГруппировкиКД) = Тип("ПолеГруппировкиКомпоновкиДанных") + И ДоступныеПоляКД.НайтиПоле(ПолеГруппировкиКД.Поле) = Неопределено Тогда + СвойстваНастройки.Состояние = "ПометкаУдаления"; + Прервать; + КонецЕсли; + КонецЦикла; КонецЕсли; ИначеЕсли СвойстваНастройки.Тип = "Таблица" Тогда ПредставлениеПоУмолчанию = НСтр("ru = 'Таблица'"); @@ -1378,6 +1643,14 @@ КонецЕсли; СвойстваНастройки.ПредставлениеПоУмолчанию = СокрЛП(ПредставлениеПоУмолчанию); + Если СвойстваНастройки.ДоступнаяНастройкаКД = Неопределено + И (СвойстваНастройки.Тип = "ЭлементОтбора" + Или СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" + Или СвойстваНастройки.Тип = "ЭлементПорядка" + Или СвойстваНастройки.Тип = "ВыбранноеПоле")Тогда + СвойстваНастройки.Состояние = "ПометкаУдаления"; + КонецЕсли; + Если Не ЗначениеЗаполнено(СвойстваНастройки.Представление) Тогда СвойстваНастройки.Представление = СвойстваНастройки.ПредставлениеПоУмолчанию; КонецЕсли; @@ -1402,18 +1675,6 @@ Возврат ОтчетОбъектИлиПолноеИмя; КонецФункции -Функция СтрЛев(Знач Строка, Знач Разделитель, Остаток = Неопределено) - Позиция = Найти(Строка, Разделитель); - Если Позиция = 0 Тогда - СтрокаДоРазделителя = Строка; - Остаток = ""; - Иначе - СтрокаДоРазделителя = Лев(Строка, Позиция - 1); - Остаток = Сред(Строка, Позиция + 1); - КонецЕсли; - Возврат СтрокаДоРазделителя; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Вывод @@ -1481,6 +1742,9 @@ Флажок = Элементы.Добавить(ФлажокИмя, Тип("ПолеФормы"), ГруппаДляФлажка); Флажок.Вид = ВидПоляФормы.ПолеФлажка; Флажок.Заголовок = ЗаголовокФлажка; + Если СтрДлина(ЗаголовокФлажка) > 40 Тогда // Если заголовок существенно длиннее остальных заголовков, переносим его. + Флажок.ВысотаЗаголовка = 2; + КонецЕсли; Флажок.ПутьКДанным = Прочее.ПутьККомпоновщику + ".ПользовательскиеНастройки[" + СвойстваНастройки.ИндексВКоллекции + "].Использование"; Флажок.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; Флажок.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); @@ -1501,9 +1765,10 @@ // Сохранение параметров выбора настройки в дополнительных свойствах пользовательских настроек. НастройкиЭлемента = Новый Структура("Представление, ВыводитьФлажок, - |ВводСписком, ОписаниеТипов, ПараметрыВыбора, ЗначенияДляВыбора, + |ВводСписком, ОписаниеТипов, ПараметрыВыбора, ЗначенияДляВыбора, ЗначенияДляВыбораЗаполнены, |БыстрыйВыбор, ОграничиватьВыборУказаннымиЗначениями, ВыборГруппИЭлементов, ФормаВыбора"); НастройкиЭлемента.ФормаВыбора = СвойстваНастройки.ДоступнаяНастройкаКД.ФормаВыбора; + НастройкиЭлемента.ЗначенияДляВыбораЗаполнены = Ложь; ЗаполнитьЗначенияСвойств(НастройкиЭлемента, СвойстваНастройки); Прочее.ДополнительныеНастройкиЭлементов.Вставить(СвойстваНастройки.ИдентификаторЭлемента, НастройкиЭлемента); КонецЕсли; @@ -1527,6 +1792,9 @@ ПолеФлажка = Элементы.Добавить(ЗначениеИмя, Тип("ПолеФормы"), Группа); ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; ПолеФлажка.Заголовок = СвойстваНастройки.Представление; + Если СтрДлина(СвойстваНастройки.Представление) > 40 Тогда // Если заголовок существенно длиннее остальных заголовков, переносим его. + ПолеФлажка.ВысотаЗаголовка = 2; + КонецЕсли; ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокЗначения_ПриИзменении"); @@ -1565,7 +1833,9 @@ ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; ПолеВвода.Заголовок = СвойстваНастройки.Представление; ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПолеВвода_ПриИзменении"); + Если СтрДлина(СвойстваНастройки.Представление) > 40 Тогда // Если заголовок существенно длиннее остальных заголовков, переносим его. + ПолеВвода.ВысотаЗаголовка = 2; + КонецЕсли; // Связь с СКД. ПолеВвода.ПутьКДанным = Прочее.ПутьККомпоновщику + ".ПользовательскиеНастройки[" + СвойстваНастройки.ИндексВКоллекции + "].Значение"; @@ -1573,22 +1843,19 @@ Если СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" Или СвойстваНастройки.Тип = "ЭлементОтбора" Тогда + ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПолеВвода_ПриИзменении"); + Если СвойстваНастройки.ВводСписком Тогда ПолеВвода.УстановитьДействие("НачалоВыбора", "Подключаемый_СписокКомпоновщика_НачалоВыбора"); - ИначеЕсли Не СвойстваНастройки.БыстрыйВыбор Тогда - // Когда есть отключаемые связи "ПоМетаданным" или "ПараметровВыбора" от подчиненного, - // тогда для выбора используется прикладная логика. - Если СвойстваНастройки.НастройкаВарианта.СвязиПараметровВыбора.Количество() > 0 - Или СвойстваНастройки.НастройкаВарианта.СвязиПоМетаданным.Количество() > 0 Тогда - ПолеВвода.УстановитьДействие("НачалоВыбора", "Подключаемый_ЗначениеКомпоновщика_НачалоВыбора"); - КонецЕсли; КонецЕсли; ПолеВвода.БыстрыйВыбор = СвойстваНастройки.БыстрыйВыбор; ЗаполнитьЗначенияСвойств(ПолеВвода, СвойстваНастройки.ДоступнаяНастройкаКД, "Маска, ФормаВыбора, ФорматРедактирования"); + ВывозитьКнопкуОчистки = Истина; Если СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" Тогда ПолеВвода.АвтоОтметкаНезаполненного = СвойстваНастройки.ДоступнаяНастройкаКД.ЗапрещатьНезаполненныеЗначения; + ВывозитьКнопкуОчистки = СвойстваНастройки.ДоступнаяНастройкаКД.Использование <> ИспользованиеПараметраКомпоновкиДанных.Всегда; КонецЕсли; ПолеВвода.ВыборГруппИЭлементов = СвойстваНастройки.ВыборГруппИЭлементов; @@ -1597,19 +1864,25 @@ // Дата, Булево, Число, Тип. ПолеВвода.КнопкаОткрытия = Ложь; ПолеВвода.КнопкаРегулирования = Ложь; - ПолеВвода.КнопкаОчистки = ИнформацияОТипах.СодержитОбъектныеТипы; + ПолеВвода.КнопкаОчистки = ИнформацияОТипах.СодержитОбъектныеТипы И ВывозитьКнопкуОчистки; ПолеВвода.РастягиватьПоГоризонтали = ИнформацияОТипах.СодержитОбъектныеТипы; Если Не СвойстваНастройки.ВводСписком Тогда - Для Каждого ЭлементСпискаВФорме Из СвойстваНастройки.ЗначенияДляВыбора Цикл - ЗаполнитьЗначенияСвойств(ПолеВвода.СписокВыбора.Добавить(), ЭлементСпискаВФорме); - КонецЦикла; - Если СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями Тогда + Если СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями + И СвойстваНастройки.ЗначенияДляВыбора.Количество() > 0 Тогда + Для Каждого ЭлементСпискаВФорме Из СвойстваНастройки.ЗначенияДляВыбора Цикл + ЗаполнитьЗначенияСвойств(ПолеВвода.СписокВыбора.Добавить(), ЭлементСпискаВФорме); + КонецЦикла; ПолеВвода.РежимВыбораИзСписка = Истина; ПолеВвода.КнопкаСоздания = Ложь; ПолеВвода.КнопкаВыбора = Ложь; ПолеВвода.КнопкаВыпадающегоСписка = Истина; ПолеВвода.РастягиватьПоГоризонтали = Истина; + ИначеЕсли СвойстваНастройки.НастройкаВарианта.СвязиПараметровВыбора.Количество() > 0 + Или СвойстваНастройки.НастройкаВарианта.СвязиПоМетаданным.Количество() > 0 Тогда + // Когда есть отключаемые связи "ПоМетаданным" или "ПараметровВыбора" от подчиненного, + // тогда для выбора используется прикладная логика. + ПолеВвода.УстановитьДействие("НачалоВыбора", "Подключаемый_ЗначениеКомпоновщика_НачалоВыбора"); КонецЕсли; // Для платформы (переопределение доступных значений на клиенте). Если СвойстваНастройки.НастройкаВарианта.СписокЗначенийПереопределен Тогда @@ -1625,7 +1898,7 @@ КонецЕсли; КонецЕсли; - // Для платформы (увеличение размера поля типа 'Дата' чтобы вмещались варианты выбора 'СтандартнаяДатаНачала'). + // Увеличение размера поля типа 'Дата' чтобы вмещались варианты выбора 'СтандартнаяДатаНачала'. Если ПолеВвода.РастягиватьПоГоризонтали = Ложь И ИнформацияОТипах.СодержитТипДата И ИнформацияОТипах.КоличествоТипов = 1 Тогда ПолеВвода.РастягиватьПоГоризонтали = Истина; ПолеВвода.АвтоМаксимальнаяШирина = Ложь; @@ -1803,7 +2076,8 @@ ТаблицаФормы.ГоризонтальныеЛинии = Ложь; ТаблицаФормы.Шапка = Ложь; ТаблицаФормы.Подвал = Ложь; - ТаблицаФормы.ИзменятьПорядокСтрок = Истина; + ТаблицаФормы.ИзменятьПорядокСтрок = Не СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями; + ТаблицаФормы.ИзменятьСоставСтрок = Не СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями; ТаблицаФормы.РастягиватьПоГоризонтали = Истина; ТаблицаФормы.РастягиватьПоВертикали = Истина; ТаблицаФормы.Высота = 3; @@ -1831,7 +2105,6 @@ ЗаполнитьЗначенияСвойств(КолонкаЗначениеЭлемент, СвойстваНастройки.ДоступнаяНастройкаКД, "Маска, ФормаВыбора, ФорматРедактирования"); КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = СвойстваНастройки.ВыборГруппИЭлементов; - Если СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями Тогда КолонкаЗначениеЭлемент.ТолькоПросмотр = Истина; КонецЕсли; @@ -2455,4 +2728,134 @@ Возврат Результат; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Отчет пустой + +// Проверяет наличие внешних наборов данных. +// +// Параметры: +// НаборыДанных - НаборыДанныхМакетаКомпоновкиДанных - Коллекция проверяемых наборов данных. +// +// Возвращаемое значение: +// Булево - Истина, если есть внешние наборы данных. +// +Функция ЕстьВнешнийНаборДанных(НаборыДанных) + + Для Каждого НаборДанных Из НаборыДанных Цикл + + Если ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъектМакетаКомпоновкиДанных") Тогда + + Возврат Истина; + + ИначеЕсли ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда + + Если ЕстьВнешнийНаборДанных(НаборДанных.Элементы) Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Параметры выбора + +Функция ПараметрыВыбораТипа(Знач Тип, Знач ПараметрыНастройки) Экспорт + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = Новый Структура("БыстрыйВыбор, ПутьКФорме, ЗначенияДляВыбора"); + + ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + Вид = ВРег(СтрРазделить(ПолноеИмя, ".")[0]); + + Если ПараметрыНастройки.БыстрыйВыбор = Истина Тогда + Результат.БыстрыйВыбор = Истина; + ИначеЕсли Вид = "ПЕРЕЧИСЛЕНИЕ" Тогда + Результат.БыстрыйВыбор = Истина; + ИначеЕсли Вид = "СПРАВОЧНИК" + Или Вид = "ПЛАНВИДОВРАСЧЕТА" + Или Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или Вид = "ПЛАНОБМЕНА" + Или Вид = "ПЛАНСЧЕТОВ" Тогда + Результат.БыстрыйВыбор = (ОбъектМетаданных.СпособВыбора = Метаданные.СвойстваОбъектов.СпособВыбора.БыстрыйВыбор); + Иначе + Результат.БыстрыйВыбор = Ложь; + КонецЕсли; + + Если Результат.БыстрыйВыбор Тогда + Результат.ЗначенияДляВыбора = ЗначенияДляВыбора(ПараметрыНастройки, Тип); + КонецЕсли; + + Если ПараметрыНастройки.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы Тогда + Если Вид = "СПРАВОЧНИК" Или Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда + Результат.ПутьКФорме = ПолноеИмя + ".ФормаВыбораГруппы"; + Иначе + Результат.ПутьКФорме = ПолноеИмя + ".ФормаВыбора"; + КонецЕсли; + Иначе + Результат.ПутьКФорме = ПолноеИмя + ".ФормаВыбора"; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ЗначенияДляВыбора(ПараметрыНастройки, ТипИлиТипы = Неопределено) Экспорт + ПараметрыПолученияДанныхВыбора = Новый Структура("Отбор, ВыборГруппИЭлементов"); + ЗаполнитьЗначенияСвойств(ПараметрыПолученияДанныхВыбора, ПараметрыНастройки); + ДополнитьСтруктуруИзПараметровВыбора(ПараметрыПолученияДанныхВыбора, ПараметрыНастройки.ПараметрыВыбора); + + ЗначенияДляВыбора = Новый СписокЗначений; + Если ТипЗнч(ТипИлиТипы) = Тип("Тип") Тогда + Типы = Новый Массив; + Типы.Добавить(ТипИлиТипы); + ИначеЕсли ТипЗнч(ТипИлиТипы) = Тип("Массив") Тогда + Типы = ТипИлиТипы; + Иначе + Типы = ПараметрыНастройки.ОписаниеТипов.Типы(); + КонецЕсли; + + Для Каждого Тип Из Типы Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + + СписокВыбора = Менеджер.ПолучитьДанныеВыбора(ПараметрыПолученияДанныхВыбора); + Для Каждого ЭлементСписка Из СписокВыбора Цикл + ЗаполнитьЗначенияСвойств(ЗначенияДляВыбора.Добавить(), ЭлементСписка); + КонецЦикла; + КонецЦикла; + Возврат ЗначенияДляВыбора; +КонецФункции + +Процедура ДополнитьСтруктуруИзПараметровВыбора(Структура, МассивПараметровВыбора) + Для Каждого ПараметрВыбора Из МассивПараметровВыбора Цикл + ТекущаяСтруктура = Структура; + МассивСтрок = СтрРазделить(ПараметрВыбора.Имя, "."); + Количество = МассивСтрок.Количество(); + Если Количество > 1 Тогда + Для Индекс = 0 По Количество-2 Цикл + Ключ = МассивСтрок[Индекс]; + Если ТекущаяСтруктура.Свойство(Ключ) И ТипЗнч(ТекущаяСтруктура[Ключ]) = Тип("Структура") Тогда + ТекущаяСтруктура = ТекущаяСтруктура[Ключ]; + Иначе + ТекущаяСтруктура = ТекущаяСтруктура.Вставить(Ключ, Новый Структура); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Ключ = МассивСтрок[Количество-1]; + ТекущаяСтруктура.Вставить(Ключ, ПараметрВыбора.Значение); + КонецЦикла; +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl index 7b1c134f0..995a7b1dc 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы, позволяющие начать и закончить замер времени выполнения ключевой операции на сервере. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Начинает замер времени ключевой операции. Закончить замер нужно явно вызовом @@ -27,11 +22,11 @@ // и записывает результат в регистр сведений ЗамерыВремени. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция. -// ВремяНачала - Число(14,0) - универсальная дата в миллисекундах, -// возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. -// ВесЗамера - Число (10,0) - количественный показатель замера, например количество строк в документе. -// Комментарий - Строка(900), Соответствие - произвольная информация замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция. +// ВремяНачала - Число - универсальная дата в миллисекундах, +// возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. +// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. +// Комментарий - Строка, Соответствие - произвольная информация замера. // Процедура ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено) Экспорт Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда @@ -52,11 +47,10 @@ // // Параметры: // КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция. -// ВремяНачала - Число(14,0) - универсальная дата в миллисекундах, -// возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. -// ВесЗамера - Число (10,0) - количественный показатель замера, например количество строк в документе. -// Комментарий - Строка(900), Соответствие - произвольная информация замера. -// при выполнении замера. +// ВремяНачала - Число - универсальная дата в миллисекундах, +// возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. +// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. +// Комментарий - Строка, Соответствие - произвольная информация замера. // Процедура ЗакончитьЗамерВремениТехнологический(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено) Экспорт Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда @@ -277,7 +271,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.КлючевыеОперации"); ЭлементБлокировки.УстановитьЗначение("Имя", ИмяКлючевойОперации); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl index 2bf3959a8..8e15d4213 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы, связанные с записью на сервере результатов замеров времени выполнения -// ключевых операций и их дальнейшем экспортом. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Функция записи массива замеров @@ -12,8 +7,8 @@ // // Возвращаемое значение: // Число - текущее значение периода записи замеров на сервере в секундах в случае записи замеров. -//Функция ЗафиксироватьДлительностьКлючевыхОпераций(Замеры, ИнформацияПрограммыПросмотра) Экспорт -Функция ЗафиксироватьДлительностьКлючевыхОпераций(АдресХранилища) Экспорт +// +Функция ЗафиксироватьДлительностьКлючевыхОпераций(ЗамерыДляЗаписи) Экспорт ПериодЗаписи = ОценкаПроизводительности.ПериодЗаписи(); @@ -25,7 +20,6 @@ Возврат ПериодЗаписи; КонецЕсли; - ЗамерыДляЗаписи = ПолучитьИзВременногоХранилища(АдресХранилища); Замеры = ЗамерыДляЗаписи.ЗамерыЗавершенные; ИнформацияПрограммыПросмотра = ЗамерыДляЗаписи.ИнформацияПрограммыПросмотра; @@ -112,7 +106,7 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Не удалось сохранить технологические замеры производительности'", Метаданные.ОсновнойЯзык.КодЯзыка), УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; - КонецЕсли; + КонецЕсли; Возврат ПериодЗаписи; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl index c7865e7d0..332121577 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Оценка производительности". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Функция определяет необходимость выполнения замеров. diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиГлобальный/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиГлобальный/Module.bsl index ea6cb24fa..4083ae32f 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиГлобальный/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Обработчики ожидания для подсистемы оценки производительности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Процедура заканчивает замер времени выполнения ключевой операции. diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl index 0252cb80a..856b89572 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Оценка производительности". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Начинает замер времени ключевой операции. @@ -161,7 +156,7 @@ // // Параметры: // УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// ВесЗамера - Число(10,0) - количественный показатель сложности +// ВесЗамера - Число - количественный показатель сложности // замера, например количество строк в документе. // Процедура УстановитьВесЗамера(УИДЗамера, ВесЗамера) Экспорт @@ -177,11 +172,14 @@ // Устанавливает комментарий операции замера. // // Параметры: -// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// Комментарий - Строка(900), Соответствие - дополнительная произвольной информации замера. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// Комментарий - Строка, Соответствие - дополнительная произвольной информации замера. +// В случае указания соответствия: +// * Ключ - Строка - имя дополнительного параметра информации замера. +// * Значение - Строка, Число, Булево - значение дополнительного параметра замера. // Процедура УстановитьКомментарийЗамера(УИДЗамера, Комментарий) Экспорт - + Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; @@ -197,29 +195,6 @@ // Признак - Булево - признак замера. Истина - замер выполнился без ошибок. // Ложь - при выполнении замера есть ошибка. // -// При проведении замеров производительности ключевые операции разделяются на "Хорошие" -// и "Плохие". Для примера, если документ при проведении прошел все проверки, не возникло исключений, -// то это "Хорошая" ключевая операция. Если же документ при проведении не прошел проверку заполнения, -// то это "Плохая" ключевая операция, т.е. не выполнялся весь программный код при проведении и такой -// замер может быть намного меньше "Хорошего". -// -// Например, -// &НаКлиенте -// Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) -// Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда -// ИдентификаторЗамераПроведение = ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина, "_ДемоПроведениеДокументаОшибка"); -// ОценкаПроизводительностиКлиент.УстановитьПризнакОшибкиЗамера(ИдентификаторЗамераПроведение, Истина); -// КонецЕсли; -// КонецПроцедуры -// -// &НаКлиенте -// Процедура ПослеЗаписи(ПараметрыЗаписи) -// Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда -// ОценкаПроизводительностиКлиент.УстановитьКлючевуюОперациюЗамера(ИдентификаторЗамераПроведение, "_ДемоПроведениеДокумента"); -// ОценкаПроизводительностиКлиент.УстановитьПризнакОшибкиЗамера(ИдентификаторЗамераПроведение, Ложь); -// КонецЕсли; -// КонецПроцедуры -// Процедура УстановитьПризнакОшибкиЗамера(УИДЗамера, Признак) Экспорт Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда @@ -234,6 +209,24 @@ #Область СлужебныйПрограммныйИнтерфейс +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительности.ВремяНачалаЗапуска"; + ВремяНачала = ПараметрыПриложения[ИмяПараметра]; + ПараметрыПриложения.Удалить(ИмяПараметра); + + НачатьЗамерВремениСоСмещением(ВремяНачала, Истина, "ОбщееВремяЗапускаПриложения"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Начинает замер времени ключевой операции. // Результат замера будет записан в регистр сведений ЗамерыВремени. // @@ -251,7 +244,7 @@ // Возвращаемое значение: // УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. // -Функция НачатьЗамерВремениСоСмещением(Смещение, АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) Экспорт +Функция НачатьЗамерВремениСоСмещением(Смещение, АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); @@ -271,10 +264,6 @@ КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - Функция ВыполнятьЗамерыПроизводительности() ВыполнятьЗамерыПроизводительности = Ложь; @@ -480,11 +469,8 @@ ЗамерыДляЗаписи = Новый Структура; ЗамерыДляЗаписи.Вставить("ЗамерыЗавершенные", ЗамерыЗавершенные); ЗамерыДляЗаписи.Вставить("ИнформацияПрограммыПросмотра", ОценкаПроизводительностиЗамерВремени["ИнформацияПрограммыПросмотра"]); - АдресХранилища = ПоместитьВоВременноеХранилище(ЗамерыДляЗаписи, Новый УникальныйИдентификатор("cd097b4b-fcda-4ac8-bf4f-f99e42ed928c")); - - НовыйПериодЗаписи = ОценкаПроизводительностиВызовСервера.ЗафиксироватьДлительностьКлючевыхОпераций(АдресХранилища); - УдалитьИзВременногоХранилища(АдресХранилища); - + НовыйПериодЗаписи = ОценкаПроизводительностиВызовСервера.ЗафиксироватьДлительностьКлючевыхОпераций(ЗамерыДляЗаписи); + ПодключитьОбработчикОжидания("ЗаписатьРезультатыАвто", НовыйПериодЗаписи, Истина); КонецЕсли; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl index f44152faf..d5ae80d04 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl @@ -1,7 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Методы, позволяющие начать и закончить замер времени выполнения ключевой операции. -// -//////////////////////////////////////////////////////////////////////////////// #Область ПрограммныйИнтерфейс #Область УстаревшиеПроцедурыИФункции @@ -12,8 +8,9 @@ // Создает ключевые операции в случае их отсутствия. // // Параметры: -// КлючевыеОперации - Массив ключевых операций -// КлючеваяОперация - Структура("ИмяКлючевойОперации, ЦелевоеВремя) +// КлючевыеОперации - Массив - массив структур, описывающих ключевые операции. Поля структур, входящих в массив: +// * ИмяКлючевойОперации - Строка - имя ключевой операции. +// * ЦелевоеВремя - Число - целевое время ключевой операции. // #Если Сервер Тогда Процедура СоздатьКлючевыеОперации(КлючевыеОперации) Экспорт @@ -23,8 +20,8 @@ // Устарела. Будет удалена в следующей редакции библиотеки. // Необходимо использовать -// на сервере - ОценкаПроизводительности.НачатьЗамерВремени. -// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремени. +// на сервере - ОценкаПроизводительности.НачатьЗамерВремени. +// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремени. // // Активизирует замер времени выполнения ключевой операции. // Может вызываться как с клиента, так и с сервера. @@ -39,28 +36,29 @@ // <ОценкаПроизводительностиКлиентСервер.ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, Комментарий = Неопределено)> // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции -// При вызове с сервера аргумент игнорируется. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. При вызове с сервера аргумент игнорируется. // // Возвращаемое значение: // Число - время начала с точностью до миллисекунд. // Функция НачатьЗамерВремени(КлючеваяОперация = Неопределено) Экспорт + Параметры = Новый Структура; Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); ВремяНачала = НачатьЗамерВремениСлужебный(Параметры); Возврат ВремяНачала; + КонецФункции // Устарела. Будет удалена в следующей редакции библиотеки. // НеобходимоИспользовать -// на сервере - ОценкаПроизводительности.НачатьЗамерВремени. -// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремени. -// на клиенте - для установки комментария замера необходимо использовать -// процедуру ОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера. +// на сервере - ОценкаПроизводительности.НачатьЗамерВремени. +// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремени. +// на клиенте - для установки комментария замера необходимо использовать +// процедуру ОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера. // // Активизирует замер времени выполнения ключевой операции с произвольным комментарием. // Может вызываться как с клиента, так и с сервера. @@ -75,17 +73,16 @@ // модуля ОценкаПроизводительностиКлиентСервер.ЗакончитьЗамерВремени. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция, -// либо Строка - название ключевой операции. -// При вызове с сервера аргумент игнорируется. -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. -// При вызове с сервера аргумент игнорируется. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. При вызове с сервера аргумент игнорируется. +// Комментарий - Строка - дополнительная информация при выполнении замера. +// При вызове с сервера аргумент игнорируется. // // Возвращаемое значение: // Число - время начала с точностью до миллисекунд. // Функция НачатьЗамерВремениСКомментарием(КлючеваяОперация, Комментарий) Экспорт + Параметры = Новый Структура; Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); Параметры.Вставить("Комментарий", Комментарий); @@ -93,6 +90,7 @@ ВремяНачала = НачатьЗамерВремениСлужебный(Параметры); Возврат ВремяНачала; + КонецФункции #Если Сервер Тогда @@ -105,11 +103,13 @@ // Вызывается только с сервера. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции -// ВремяНачала - Число (Формат ТекущаяУниверсальнаяДатаВМиллисекундах()/1000) или Дата начала замера -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. +// ВремяНачала - Число, Дата - время начала замера. Если число, то значение, возвращаемое функцией +// ТекущаяУниверсальнаяДатаВМиллисекундах, деленное на 1000. Если дата, то значение +// возвращаемое функцией ТекущаяУниверсальнаяДата. +// Комментарий - Строка - произвольная информация замера. +// Процедура ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, Комментарий = Неопределено) Экспорт ОценкаПроизводительности.ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала * 1000, 1, Комментарий); КонецПроцедуры @@ -117,8 +117,7 @@ #Если Клиент Тогда // Устарела. Будет удалена в следующей редакции библиотеки. -// Необходимо использовать -// ОценкаПроизводительностиКлиент.НачатьЗамерВремени +// Необходимо использовать ОценкаПроизводительностиКлиент.НачатьЗамерВремени. // // Активизирует замер времени выполнения ключевой операции. Для завершения замера необходимо // явно вызвать в общем модуле <ОценкаПроизводительностиГлобальный> @@ -127,13 +126,13 @@ // Результат замера будет записан в <РегистрСведений.ЗамерыВремени>. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции. -// УИДЗамера - Тип("УникальныйИдентификатор") - уникальный идентификатор замера -// должен обеспечивать уникальность замера, например использовать -// уникальный идентификатор формы. -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// Комментарий - Строка - произвольная информация замера. +// +// Возвращаемое значение: +// УникальныйИдентификатор - уникальный идентификатор замера. // Функция НачатьРучнойЗамерВремени(КлючеваяОперация, УИДЗамера = Неопределено, Комментарий = Неопределено) Экспорт Если УИДЗамера = Неопределено Тогда @@ -161,7 +160,7 @@ // Вызывается только на клиенте. // // Параметры: -// УИДЗамера - УникальныйИдентификатор. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. // Процедура ЗакончитьРучнойЗамерВремени(УИДЗамера) Экспорт ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамера); @@ -169,9 +168,9 @@ #КонецЕсли // Устарела. Будет удалена в следующей редакции библиотеки. -// НеобходимоИспользовать -// на сервере - ОценкаПроизводительности.НачатьЗамерВремениНаСервере -// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремениТехнологическийНаКлиенте +// НеобходимоИспользовать +// на сервере - ОценкаПроизводительности.НачатьЗамерВремениНаСервере +// на клиенте - ОценкаПроизводительностиКлиент.НачатьЗамерВремениТехнологическийНаКлиенте // Активизирует замер времени выполнения технологической ключевой операции. // Может вызываться как с клиента, так и с сервера. // Результат замера будет записан в <РегистрСведений.ЗамерыВремениТехнологические>. @@ -184,14 +183,12 @@ // Закончить замер нужно явно вызовом процедуры <ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, Комментарий = Неопределено)>. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции -// При вызове с сервера аргумент игнорируется. -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. При вызове с сервера аргумент игнорируется. +// Комментарий - Строка - произвольная информация замера. // // Возвращаемое значение: -// Дата или число - время начала с точностью до миллисекунд или секунд в зависимости от версии платформы. +// Дата, Число - время начала с точностью до миллисекунд или секунд в зависимости от версии платформы. // Функция НачатьЗамерВремениТехнологический(КлючеваяОперация, Комментарий = Неопределено) Экспорт Параметры = Новый Структура; @@ -213,19 +210,21 @@ // Вызывается только с сервера. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции -// ВремяНачала - Число (Формат ТекущаяУниверсальнаяДатаВМиллисекундах()/1000) или Дата начала замера -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. +// ВремяНачала - Число, Дата - время начала замера. Если число, то значение, возвращаемое функцией +// ТекущаяУниверсальнаяДатаВМиллисекундах, деленное на 1000. Если дата, то значение +// возвращаемое функцией ТекущаяУниверсальнаяДата. +// Комментарий - Строка - произвольная информация замера. +// Процедура ЗакончитьЗамерВремениТехнологический(КлючеваяОперация, ВремяНачала, Комментарий = Неопределено) Экспорт ОценкаПроизводительности.ЗакончитьЗамерВремениТехнологический(КлючеваяОперация, ВремяНачала * 1000, Комментарий); КонецПроцедуры #КонецЕсли // Устарела. Будет удалена в следующей редакции библиотеки. -// Необходимо использовать -// ОценкаПроизводительностиКлиент.НачатьЗамерВремениТехнологическийНаКлиенте +// Необходимо использовать +// ОценкаПроизводительностиКлиент.НачатьЗамерВремениТехнологическийНаКлиенте // Активизирует замер времени выполнения технологической ключевой операции с явным завершением времени // длительности ключевой операции. Вызывается только с клиента. // Для завершения замера необходимо вызвать в общем модуле <ОценкаПроизводительностиГлобальный> @@ -234,13 +233,13 @@ // Результат замера будет записан в <РегистрСведений.ЗамерыВремениТехнологические>. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция -// либо Строка - название ключевой операции. -// УИДЗамера - Тип("УникальныйИдентификатор") - уникальный идентификатор замера -// должен обеспечивать уникальность замера, например использовать -// уникальный идентификатор формы. -// Комментарий - Строка(256) для записи произвольной информации -// при выполнении замера. +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, Строка - ключевая операция или +// имя ключевой операции. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// Комментарий - Строка - произвольная информация замера. +// +// Возвращаемое значение: +// УникальныйИдентификатор - уникальный идентификатор замера. // #Если Клиент Тогда Функция НачатьРучнойЗамерВремениТехнологический(КлючеваяОперация, УИДЗамера = Неопределено, Комментарий = Неопределено) Экспорт @@ -267,7 +266,7 @@ // Вызывается только на клиенте. // // Параметры: -// УИДЗамера - УникальныйИдентификатор. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. // Процедура ЗакончитьРучнойЗамерВремениТехнологический(УИДЗамера) Экспорт ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамера); diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl index 1a21e765b..310734dfc 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Оценка производительности". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Функция возвращает ссылку на ключевую операцию по имени. diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl index 39b2b3592..69485cab8 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl @@ -1,35 +1,29 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Оценка производительности". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ОценкаПроизводительностиСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "ОценкаПроизводительностиСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОценкаПроизводительностиСлужебный"); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// +// Получает N худших замеров производительности за период. // Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. +// ДатаНачала - ДатаВремя - Начало периода выборки. +// ДатаОкончания - ДатаВремя - Окончание периода выборка. +// ТопApdexКоличество - Число - Количество худших замеров, если но, то возвращаются все замеры. // +Функция ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт + Возврат РегистрыСведений.ЗамерыВремени.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); +КонецФункции + +// Получает N худших замеров производительности технологической за период. +// Параметры: +// ДатаНачала - ДатаВремя - Начало периода выборки. +// ДатаОкончания - ДатаВремя - Окончание периода выборка. +// ТопApdexКоличество - Число - Количество худших замеров, если но, то возвращаются все замеры. +// +Функция ПолучитьТопAPDEXТехнологический(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт + Возврат РегистрыСведений.ЗамерыВремениТехнологические.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -54,38 +48,14 @@ КонецПроцедуры -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("КомментарийЗамераВремени", "ОценкаПроизводительностиСлужебный.УстановкаПараметровСеанса"); КонецПроцедуры -// Получает N худших замеров производительности за период. -// Параметры: -// ДатаНачала - ДатаВремя - Начало периода выборки. -// ДатаОкончания - ДатаВремя - Окончание периода выборка. -// ТопApdexКоличество - Число - Количество худших замеров, если но, то возвращаются все замеры. -// -Функция ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт - Возврат РегистрыСведений.ЗамерыВремени.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); -КонецФункции - -// Получает N худших замеров производительности технологической за период. -// Параметры: -// ДатаНачала - ДатаВремя - Начало периода выборки. -// ДатаОкончания - ДатаВремя - Окончание периода выборка. -// ТопApdexКоличество - Число - Количество худших замеров, если но, то возвращаются все замеры. -// -Функция ПолучитьТопAPDEXТехнологический(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт - Возврат РегистрыСведений.ЗамерыВремениТехнологические.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -94,66 +64,20 @@ КонецПроцедуры -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЭкспортОценкиПроизводительности; Зависимость.РаботаетСВнешнимиРесурсами = Истина; КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -Процедура ПервоначальноеЗаполнение() Экспорт - - Если ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда - МодульОбщегоНазначенияПовтИсп = ОбщийМодуль("ОбщегоНазначенияПовтИсп"); - Если МодульОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Константы.КоличествоЗамеровВПакетеЭкспорта.Установить(1000); - Константы.ОценкаПроизводительностиПериодЗаписи.Установить(300); - Константы.ПериодХраненияЗамеров.Установить(100); - -КонецПроцедуры - -// Устанавливает параметры сеанса подсистемы оценки производительности. -// -// Параметры: -// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить. -// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса. -// -Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт - - // Инициализация параметров сеанса должна выполняться без обращения к параметрам работы программы. - - Если ИмяПараметра = "КомментарийЗамераВремени" Тогда - ПараметрыСеанса.КомментарийЗамераВремени = ПолучитьКомментарийЗамераВремени(); - УстановленныеПараметры.Добавить("КомментарийЗамераВремени"); - Возврат; - КонецЕсли; -КонецПроцедуры - -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - БазоваяФункциональностьСуществует = ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); - Если БазоваяФункциональностьСуществует Тогда - МодульОбщегоНазначенияПовтИсп = ОбщийМодуль("ОбщегоНазначенияПовтИсп"); - Если МодульОбщегоНазначенияПовтИсп.РазделениеВключено() И МодульОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + РаботаВМоделиСервисаСуществует = ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса"); + Если РаботаВМоделиСервисаСуществует Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Если МодульРаботаВМоделиСервиса.РазделениеВключено() И МодульРаботаВМоделиСервиса.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; КонецЕсли; @@ -168,8 +92,11 @@ Если ЗначениеЗаполнено(СтруктураURI.Порт) Тогда КаталогиЭкспорта.Вставить("FTPКаталогЭкспортаПорт", СтруктураURI.Порт); КонецЕсли; + + БазоваяФункциональностьСуществует = ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); + РаботаВБезопасномРежимеСуществует = ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности"); - Если БазоваяФункциональностьСуществует Тогда + Если БазоваяФункциональностьСуществует И РаботаВБезопасномРежимеСуществует Тогда МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); ЗапросыРазрешений.Добавить( @@ -180,6 +107,51 @@ КонецПроцедуры +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + ПараметрыРаботыКлиента = Новый Структура("ПериодЗаписи, ВыполнятьЗамерыПроизводительности"); + + УстановитьПривилегированныйРежим(Истина); + ТекущийПериод = Константы.ОценкаПроизводительностиПериодЗаписи.Получить(); + ПараметрыРаботыКлиента.ПериодЗаписи = ?(ТекущийПериод >= 1, ТекущийПериод, 60); + ПараметрыРаботыКлиента.ВыполнятьЗамерыПроизводительности = Константы.ВыполнятьЗамерыПроизводительности.Получить(); + + Параметры.Вставить("ОценкаПроизводительности", Новый ФиксированнаяСтруктура(ПараметрыРаботыКлиента)); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + // Инициализация параметров сеанса должна выполняться без обращения к параметрам работы программы. + + Если ИмяПараметра = "КомментарийЗамераВремени" Тогда + ПараметрыСеанса.КомментарийЗамераВремени = ПолучитьКомментарийЗамераВремени(); + УстановленныеПараметры.Добавить("КомментарийЗамераВремени"); + Возврат; + КонецЕсли; +КонецПроцедуры + +Процедура ПервоначальноеЗаполнение() Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); + Если МодульРаботаВМоделиСервиса.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Константы.КоличествоЗамеровВПакетеЭкспорта.Установить(1000); + Константы.ОценкаПроизводительностиПериодЗаписи.Установить(300); + Константы.ПериодХраненияЗамеров.Установить(100); + +КонецПроцедуры + // Заполняет параметр сеанса "КомментарийЗамераВремени" // при запуске программы. // @@ -215,33 +187,15 @@ // Только для внутреннего использования. Функция ЗапросНаИспользованиеВнешнихРесурсов(Каталоги) Экспорт - БазоваяФункциональностьСуществует = ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); - Если БазоваяФункциональностьСуществует Тогда + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( - РазрешенияНаРесурсыСервера(Каталоги), + РазрешенияНаРесурсыСервера(Каталоги), МодульОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ВыполнятьЗамерыПроизводительности")); КонецЕсли; КонецФункции -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры (Структура) Параметры запуска. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - ПараметрыРаботыКлиента = Новый Структура("ПериодЗаписи, ВыполнятьЗамерыПроизводительности"); - - УстановитьПривилегированныйРежим(Истина); - ТекущийПериод = Константы.ОценкаПроизводительностиПериодЗаписи.Получить(); - ПараметрыРаботыКлиента.ПериодЗаписи = ?(ТекущийПериод >= 1, ТекущийПериод, 60); - ПараметрыРаботыКлиента.ВыполнятьЗамерыПроизводительности = Константы.ВыполнятьЗамерыПроизводительности.Получить(); - - Параметры.Вставить("ОценкаПроизводительности", Новый ФиксированнаяСтруктура(ПараметрыРаботыКлиента)); - -КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции. @@ -467,12 +421,12 @@ Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл СпрОбъект = Выборка.Ссылка.ПолучитьОбъект(); - СпрОбъект.ОбменДанными.Загрузка = Истина; - + ХешMD5 = Новый ХешированиеДанных(ХешФункция.MD5); ХешMD5.Добавить(СпрОбъект.Имя); ИмяХешТемп = ХешMD5.ХешСумма; СпрОбъект.ИмяХеш = СтрЗаменить(Строка(ИмяХешТемп), " ", ""); + СпрОбъект.ДополнительныеСвойства.Вставить(ОценкаПроизводительностиКлиентСервер.НеПроверятьПриоритет(), Истина); СпрОбъект.Записать(); КонецЦикла; @@ -539,7 +493,8 @@ // * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных // и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. // Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. -// * ОтключенныеПодсистемы - Соответствие - Позволяет виртуально отключать подсистемы для целей тестирования. +// * ОтключенныеПодсистемы - Соответствие - Позволяет виртуально отключать подсистемы для целей +// тестирования. // Если подсистема отключена, то метод ОбщегоНазначения.ПодсистемаСуществует // вернет Ложь. В соответствии ключ - имя отключенной подсистемы, // значение необходимо установить в Истина. diff --git a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl index 6bdee0244..993d98ed3 100644 --- a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОчередьЗаданий: Работа с очередью заданий. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -29,8 +24,8 @@ // для разделенных заданий очереди. // ИмяМетода - Строка - Имя метода (или псевдоним) обработчика задания. Не используется // для заданий созданных по шаблону. -// Могут использоваться только методы для которых зарегистрированы псевдонимы через событие. -// СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков +// Могут использоваться только методы для которых зарегистрированы псевдонимы через +// процедуру ПриОпределенииПсевдонимовОбработчиков общего модуля ОчередьЗаданийПереопределяемый. // Параметры - Массив - Параметры для передачи в обработчик задания. // Ключ - Строка - ключ задания. В пределах одной области данных не допускается // дублирование заданий с одинаковым ключом и именем метода. @@ -45,25 +40,25 @@ // Получает задания очереди по заданному отбору. // Возможно получение неконсистентных данных. +// // Параметры: -// Отбор - Структура, Массив - значения по которым, требуется отбирать задания. -// Возможные ключи структуры: -// ОбластьДанных -// ИмяМетода -// Идентификатор -// СостояниеЗадания -// Ключ -// Шаблон -// Использование -// Так же может быть передан массив структур - описаний отбора со следующими ключами: -// ВидСравнения - ВидСравнения - допустимыми значениями являются только. -// ВидСравнения.Равно -// ВидСравнения.НеРавно -// ВидСравнения.ВСписке -// ВидСравнения.НеВСписке -// Значение - Значение отбора, для видов сравнения ВСписке и НеВСписке - массив значений. -// Для видов сравнения Равно / НеРавно - сами значения. -// Все условия отбора объединяются по И. +// Отбор - Структура - значения, по которым требуется отбирать задания (объединяются по И). Возможные ключи структуры: +// * ОбластьДанных - Число - область данных, +// * ИмяМетода - Строка - имя метода, +// * Идентификатор - УникальныйИдентификатор - идентификатор задания, +// * СостояниеЗадания - ПеречислениеСсылка.СостоянияЗаданий - состояние задания, +// * Ключ - Строка - ключ задания, +// * Шаблон - СправочникСсылка.ШаблоныЗаданийОчереди - шаблон задания, +// * Использование - Булево - использование задания. +// - Массив - содержит структуры со свойствами: +// * ВидСравнения - ВидСравнения - допустимыми значениями являются: +// ВидСравнения.Равно +// ВидСравнения.НеРавно +// ВидСравнения.ВСписке +// ВидСравнения.НеВСписке +// * Значение - Значение отбора, для видов сравнения ВСписке и НеВСписке - массив значений, для видов +// сравнения Равно / НеРавно - сами значения. +// // Возвращаемое значение: // ТаблицаЗначений - таблица найденных заданий. Колонки соответствуют параметрам заданий. // @@ -135,7 +130,7 @@ // Подготовка запроса Запрос = Новый Запрос; - РазделительЗаданийОбластейДанных = ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных(); + РазделительЗаданийОбластейДанных = РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных(); СправочникиЗаданий = ОчередьЗаданийСлужебныйПовтИсп.ПолучитьСправочникиЗаданий(); ТекстЗапроса = ""; @@ -146,7 +141,7 @@ Если Не ПолучатьРазделенные Тогда - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда Продолжить; КонецЕсли; @@ -154,7 +149,7 @@ Если Не ПолучатьНеразделенные Тогда - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда + Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда Продолжить; КонецЕсли; @@ -179,7 +174,7 @@ Для Каждого Условие Из ТаблицаУсловий Цикл Если Условие.Поле = РазделительЗаданийОбластейДанных Тогда - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда + Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РазделительЗаданийОбластейДанных) Тогда Отказ = Истина; Продолжить; КонецЕсли; @@ -201,7 +196,7 @@ Продолжить; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ИмяСправочника, РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "ВЫБРАТЬ @@ -235,7 +230,7 @@ КонецЦикла; Если ПустаяСтрока(ТекстЗапроса) Тогда - ВызватьИсключение НСтр("ru = 'Некорректное значение отбора - не обнаружено на одного справочника, задания из которого подходили бы под условия в отборе!'"); + ВызватьИсключение НСтр("ru = 'Некорректное значение отбора - не обнаружено на одного справочника, задания из которого подходили бы под условия в отборе.'"); КонецЕсли; Запрос.Текст = ТекстЗапроса; @@ -244,7 +239,7 @@ Если ТранзакцияАктивна() Тогда Результат = Запрос.Выполнить().Выгрузить(); Иначе - Результат = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос).Выгрузить(); + Результат = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос).Выгрузить(); КонецЕсли; // Приведение результатов @@ -333,7 +328,7 @@ Если ПараметрыЗадания.Свойство("ЗапланированныйМоментЗапуска", ПланируемыйМоментЗапуска) Тогда СтандартнаяОбработка = Истина; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриОпределенииЗапланированногоМоментаЗапуска( @@ -378,7 +373,7 @@ СправочникДляЗадания = Справочники.ОчередьЗаданий; СтандартнаяОбработка = Истина; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); Если ПереопределенныйСправочник <> Неопределено Тогда @@ -390,7 +385,7 @@ Для каждого ОписаниеПараметра Из ОчередьЗаданийСлужебныйПовтИсп.ПараметрыЗаданийОчереди() Цикл Если ПараметрыЗадания.Свойство(ОписаниеПараметра.Имя) Тогда Если ОписаниеПараметра.РазделениеДанных Тогда - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда Продолжить; КонецЕсли; КонецЕсли; @@ -415,7 +410,7 @@ // Блокировка будет автоматически снята при завершении транзакции. КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); Возврат Задание.Ссылка; @@ -439,7 +434,13 @@ // КоличествоПовторовПриАварийномЗавершении. // // В случае если задание создано на основе шаблона, могут быть указаны -// только следующие ключи: Использование. +// только следующие ключи: +// Использование, +// ЗапланированныйМоментЗапуска, +// ЭксклюзивноеВыполнение, +// ИнтервалПовтораПриАварийномЗавершении, +// Расписание, +// КоличествоПовторовПриАварийномЗавершении. // Процедура ИзменитьЗадание(Идентификатор, ПараметрыЗадания) Экспорт @@ -448,17 +449,17 @@ Задание = ОписаниеЗаданияПоИдентификатору(Идентификатор); // Проверка попытки изменения задания другой области. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И Задание.ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() + И Задание.ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда ВызватьИсключение(ПолучитьТекстИсключенияПолученияДанныхДругойОбласти()); КонецЕсли; // Проверка попытки изменения параметров заданий с заданным шаблоном. - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( Идентификатор.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда Если ЗначениеЗаполнено(Задание.Шаблон) Тогда ОписанияПараметров = ОчередьЗаданийСлужебныйПовтИсп.ПараметрыЗаданийОчереди(); Для каждого КлючИЗначение Из ПараметрыЗадания Цикл @@ -498,7 +499,7 @@ И ЗначениеЗаполнено(ПараметрыЗадания.ЗапланированныйМоментЗапуска) Тогда СтандартнаяОбработка = Истина; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриОпределенииЗапланированногоМоментаЗапуска( @@ -573,7 +574,7 @@ Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.НеЗапланировано; КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); ЗафиксироватьТранзакцию(); Исключение @@ -600,9 +601,9 @@ Задание = Идентификатор.ПолучитьОбъект(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( Задание.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда Если ЗначениеЗаполнено(Задание.Шаблон) Тогда ШаблонСообщения = НСтр("ru = 'Задание очереди с идентификатором %1 создано на основе шаблона. |Удаление заданий с установленным шаблоном запрещено.'"); @@ -614,7 +615,7 @@ ЗаблокироватьДанныеДляРедактирования(Идентификатор); Задание.ОбменДанными.Загрузка = Истина; - ОбщегоНазначения.УдалитьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.УдалитьВспомогательныеДанные(Задание); Если НЕ ТранзакцияАктивна() Тогда // Иначе блокировка снимется при завершении транзакции. РазблокироватьДанныеДляРедактирования(Идентификатор); @@ -661,7 +662,7 @@ // Возвращает текст ошибки при попытке выполнить одновременно два задания с одним ключом. // // Возвращаемое значение: -// Строка. +// Строка - текст исключения. // Функция ПолучитьТекстИсключенияДублированиеЗаданийСОдинаковымКлючом() Экспорт @@ -669,6 +670,25 @@ КонецФункции +// Возвращает список шаблонов заданий очереди. +// +// Возвращаемое значение: +// Массив - имена предопределенных неразделенных регламентных заданий, которые используются +// в качестве шаблонов для заданий очереди. +// +Функция ШаблоныЗаданийОчереди() Экспорт + + Шаблоны = Новый Массив; + + ИнтеграцияСтандартныхПодсистем.ПриПолученииСпискаШаблонов(Шаблоны); + ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов(Шаблоны); + // Для совместимости с предыдущими версиями. + ОчередьЗаданийПереопределяемый.ЗаполнитьСписокРазделенныхРегламентныхЗаданий(Шаблоны); + + Возврат Шаблоны; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -764,17 +784,17 @@ КонецЦикла; // Область данных - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Если Параметры.Свойство("ОбластьДанных") Тогда - Если Параметры.ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда - ВызватьИсключение(НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных!'")); + Если Параметры.ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда + ВызватьИсключение(НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных.'")); КонецЕсли; Иначе ОписаниеПараметра = ОписанияПараметров.Найти(ВРег("ОбластьДанных"), "ИмяВРег"); Если ОписаниеПараметра[Режим] Тогда - Параметры.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + Параметры.Вставить("ОбластьДанных", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); КонецЕсли; КонецЕсли; @@ -842,11 +862,11 @@ // с установленными значениями разделителя. // // Возвращаемое значение: -// Строка. +// Строка - текст исключения. // Функция ПолучитьТекстИсключенияПолученияДанныхДругойОбласти() - Возврат НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных!'"); + Возврат НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных.'"); КонецФункции diff --git a/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl index c3d9a4900..191edbfec 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl @@ -1,29 +1,24 @@ -/////////////////////////////////////////////////////////////////////////////////// -// ОчередьЗаданийПереопределяемый: Работа с неразделенными регламентными заданиями. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Формирует список шаблонов заданий очереди. // // Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных +// ШаблоныЗаданий - Массив - В параметр следует добавить имена предопределенных // неразделенных регламентных заданий, которые должны использоваться в качестве // шаблонов для заданий очереди. // -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт КонецПроцедуры // Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. // // Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. +// СоответствиеИменПсевдонимам - Соответствие - +// * Ключ - Псевдоним метода, например ОчиститьОбластьДанных. +// * Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. +// В качестве значения можно указать Неопределено, в этом случае считается что имя +// совпадает с псевдонимом. // Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт @@ -33,48 +28,49 @@ // ошибок в которых они вызываются. // // Параметры: -// ОбработчикиОшибок - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода - обработчика ошибок, для вызова при возникновении ошибки. -// Обработчик ошибок вызывается в случае завершения выполнения исходного задания -// с ошибкой. Обработчик ошибок вызывается в той же области данных, что и исходное -// задание. -// Метод обработчика ошибок считается разрешенным к вызову механизмами очереди. -// Параметры обработчика ошибок: -// ПараметрыЗадания - Структура - параметры задания очереди. -// Параметры -// НомерПопытки -// КоличествоПовторовПриАварийномЗавершении -// ДатаНачалаПоследнегоЗапуска. +// ОбработчикиОшибок - Соответствие - +// * Ключ - Псевдоним метода, например ОчиститьОбластьДанных. +// * Значение - Имя метода - обработчика ошибок, для вызова при возникновении ошибки. +// Обработчик ошибок вызывается в случае завершения выполнения исходного задания +// с ошибкой. Обработчик ошибок вызывается в той же области данных, что и исходное задание. +// Метод обработчика ошибок считается разрешенным к вызову механизмами очереди. +// Параметры обработчика ошибок: +// ПараметрыЗадания - Структура - параметры задания очереди. +// Параметры +// НомерПопытки +// КоличествоПовторовПриАварийномЗавершении +// ДатаНачалаПоследнегоЗапуска. // Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт КонецПроцедуры -// Формирует таблицу регламентных заданий -// с признаком использования в модели сервиса. +// Формирует таблицу регламентных заданий с признаком использования в модели сервиса. // // Параметры: -// ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо -// заполнить регламентными заданиями и признаком использования, колонки: -// РегламентноеЗадание - Строка - имя предопределенного регламентного задания. -// Использование - Булево - Истина, если регламентное задание должно -// выполняться в модели сервиса. Ложь - если не должно. +// ТаблицаИспользования - ТаблицаЗначений - таблица значений с колонками: +// * РегламентноеЗадание - Строка - имя предопределенного регламентного задания, +// * Использование - Булево - Истина, если регламентное задание должно +// выполняться в модели сервиса, Ложь - если не должно. // Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт КонецПроцедуры -// Устарело. Рекомендуется использовать ПриПолученииСпискаШаблонов(). +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Рекомендуется использовать ПриПолученииСпискаШаблонов(). // Процедура ЗаполнитьСписокРазделенныхРегламентныхЗаданий(СписокРазделенныхРегламентныхЗаданий) Экспорт КонецПроцедуры -// Устарело. Рекомендуется использовать ПриОпределенииПсевдонимовОбработчиков(). +// Устарела. Рекомендуется использовать ПриОпределенииПсевдонимовОбработчиков(). // Процедура ПолучитьРазрешенныеМетодыОчередиЗаданий(Знач РазрешенныеМетоды) Экспорт КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl index 5a118f64c..54f2e4e97 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl @@ -1,23 +1,684 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОчередьЗаданий: Работа с очередью заданий. -// -//////////////////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс + +// Рассчитывает следующий момент запуска задания. +// +// Параметры: +// Расписание - РасписаниеРегламентногоЗадания - расписание, +// для которого требуется рассчитать момент следующего запуска. +// ЧасовойПояс - Строка. +// ДатаНачалаПоследнегоЗапуска - Дата - Дата начала последнего запуска регламентного задания. +// Если дата задана, то используется для проверки таких условий как. +// ПериодПовтораДней, ПериодНедель, ПериодПовтораВТечениеДня. +// Если дата не задана, то считается, +// что задание не выполнялось ни разу и проверка этих условий не производится. +// +// Возвращаемое значение: +// Дата - Рассчитанный следующий момент запуска задания. +// +Функция ПолучитьЗапланированныйМоментЗапускаЗадания(Знач Расписание, Знач ЧасовойПояс, + Знач ДатаНачалаПоследнегоЗапуска = '00010101', Знач ДатаЗавершенияПоследнегоЗапуска = '00010101') Экспорт + + Если ПустаяСтрока(ЧасовойПояс) Тогда + ЧасовойПояс = Неопределено; + КонецЕсли; + + Если ЗначениеЗаполнено(ДатаНачалаПоследнегоЗапуска) Тогда + ДатаНачалаПоследнегоЗапуска = МестноеВремя(ДатаНачалаПоследнегоЗапуска, ЧасовойПояс); + КонецЕсли; + + Если ЗначениеЗаполнено(ДатаЗавершенияПоследнегоЗапуска) Тогда + ДатаЗавершенияПоследнегоЗапуска = МестноеВремя(ДатаЗавершенияПоследнегоЗапуска, ЧасовойПояс); + КонецЕсли; + + ДатаРасчета = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс); + + НайденнаяДата = СледующаяДатаВыполненияРасписания(Расписание, ДатаРасчета, ДатаНачалаПоследнегоЗапуска, ДатаЗавершенияПоследнегоЗапуска); + + Если ЗначениеЗаполнено(НайденнаяДата) Тогда + Возврат УниверсальноеВремя(НайденнаяДата, ЧасовойПояс); + Иначе + Возврат НайденнаяДата; + КонецЕсли; + +КонецФункции + +// Возвращает менеджер справочника ОчередьЗаданий. +Функция СправочникОчередьЗаданий() Экспорт + + Возврат ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник.ОчередьЗаданий"); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "ОчередьЗаданийСлужебный.УстановитьИспользованиеРегламентныхЗаданий"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Приоритет = 50; + Обработчик.МонопольныйРежим = Ложь; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.9"; + Обработчик.Процедура = "ОчередьЗаданийСлужебный.ПеренестиЗаданияВОчередиВНеразделенныеДанные"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 80; + Обработчик.МонопольныйРежим = Истина; + +КонецПроцедуры + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + // Загрузка в справочник ОчередьЗаданий запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ОчередьЗаданий.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + + // Загрузка в справочник ШаблоныЗаданийОчереди запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ШаблоныЗаданийОчереди.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + + УстановитьИспользованиеРегламентныхЗаданий(); + + Если Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Получить() = 0 Тогда + Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Установить(600); + КонецЕсли; + + Если Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Получить() = 0 Тогда + Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Установить(1); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Экспортные служебные процедуры и функции. + +// Производит планирование выполнения заданий из РС ОчередьЗаданий. +// +Процедура ПланированиеОбработкиЗаданий() Экспорт + + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, + // т.к. необходимые действия выполняются в частном порядке. + + // Выбираем события в состояниях Выполняется, Завершено, НеЗапланировано, ОшибкаВыполнения. + Запрос = Новый Запрос; + + СправочникиЗаданий = ОчередьЗаданийСлужебныйПовтИсп.ПолучитьСправочникиЗаданий(); + ТекстЗапроса = ""; + Для Каждого СправочникЗаданий Из СправочникиЗаданий Цикл + + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + |" + + КонецЕсли; + + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий.СоздатьЭлемент().Метаданные().ПолноеИмя(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда + + ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ВЫБРАТЬ + | Очередь.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных, + | Очередь.Ссылка КАК Идентификатор, + | ЕСТЬNULL(Очередь.Шаблон, НЕОПРЕДЕЛЕНО) КАК Шаблон, + | ЕСТЬNULL(ЧасовыеПояса.Значение, """") КАК ЧасовойПояс, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.Расписание + | ИНАЧЕ Очередь.Шаблон.Расписание + | КОНЕЦ КАК Расписание, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.КоличествоПовторовПриАварийномЗавершении + | ИНАЧЕ Очередь.Шаблон.КоличествоПовторовПриАварийномЗавершении + | КОНЕЦ КАК КоличествоПовторовПриАварийномЗавершении, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.ИнтервалПовтораПриАварийномЗавершении + | ИНАЧЕ Очередь.Шаблон.ИнтервалПовтораПриАварийномЗавершении + | КОНЕЦ КАК ИнтервалПовтораПриАварийномЗавершении + |ИЗ + | %1 КАК Очередь + | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса + | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные + |ГДЕ + | Очередь.СостояниеЗадания В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.НеЗапланировано), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.ОшибкаВыполнения))" + , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); + + Иначе + + ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ВЫБРАТЬ + | -1 КАК ОбластьДанных, + | Очередь.Ссылка КАК Идентификатор, + | НЕОПРЕДЕЛЕНО КАК Шаблон, + | """" КАК ЧасовойПояс, + | Очередь.Расписание КАК Расписание, + | Очередь.КоличествоПовторовПриАварийномЗавершении КАК КоличествоПовторовПриАварийномЗавершении, + | Очередь.ИнтервалПовтораПриАварийномЗавершении КАК ИнтервалПовтораПриАварийномЗавершении + |ИЗ + | %1 КАК Очередь + |ГДЕ + | Очередь.СостояниеЗадания В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.НеЗапланировано), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.ОшибкаВыполнения))" + , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); + + КонецЕсли; + + КонецЦикла; + + Запрос.Текст = ТекстЗапроса; + Результат = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос); + Выборка = Результат.Выбрать(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Иначе + МодульРаботаВМоделиСервиса = Неопределено; + КонецЕсли; + + Пока Выборка.Следующий() Цикл + + Попытка + ЗаблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + Исключение + // Запись заблокирована, перейти к следующей. + Продолжить; + КонецПопытки; + + // Проверка блокировки области. + Если МодульРаботаВМоделиСервиса <> Неопределено + И Выборка.ОбластьДанных <> -1 + И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда + + // Область заблокирована, перейти к следующей записи. + Продолжить; + КонецЕсли; + + // Перепланируем завершившиеся регламентные задания и аварийно завершившиеся фоновые, удаляем выполненные фоновые. + ЗапланироватьЗадание(Выборка); + + РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + + КонецЦикла; + + // Вычисление количества требуемых исполняющих фоновых заданий. + КоличествоЗапускаемыхФоновыхЗаданий = КоличествоИсполняющихФоновыхЗаданийКЗапуску(); + + // Запуск исполняющих фоновых заданий. + ЗапуститьИсполняющееФоновоеЗадание(КоличествоЗапускаемыхФоновыхЗаданий); + +КонецПроцедуры + +// Процедура выполняет задания из РС ОчередьЗаданий. +// +// Параметры: +// КлючФоновогоЗадания - УникальныйИдентификатор - ключ необходим +// для поиска текущего фонового задания. +// +Процедура ОбработатьОчередьЗаданий(КлючФоновогоЗадания) Экспорт + + // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, + // т.к. необходимые действия выполняются в частном порядке. + + НайденноеФоновоеЗадание = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Ключ", КлючФоновогоЗадания)); + Если НайденноеФоновоеЗадание.Количество() = 1 Тогда + ИсполняющееФоновоеЗадание = НайденноеФоновоеЗадание[0]; + Иначе + Возврат; + КонецЕсли; + + МожноВыполнять = Истина; + НачалоВыполнения = ТекущаяУниверсальнаяДата(); + + МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания = + Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Получить(); + МаксимальноеКоличествоИсполняющихФоновыхЗаданий = + Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Получить(); + + Запрос = Новый Запрос; + + СправочникиЗаданий = ОчередьЗаданийСлужебныйПовтИсп.ПолучитьСправочникиЗаданий(); + ТекстЗапроса = ""; + ТекстЗапросаБлокировки = ""; + Для Каждого СправочникЗаданий Из СправочникиЗаданий Цикл + + ПерваяСтрока = ПустаяСтрока(ТекстЗапроса); + + Если Не ПерваяСтрока Тогда + + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + |" + + КонецЕсли; + + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий.СоздатьЭлемент().Метаданные().ПолноеИмя(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда + + Если ПустаяСтрока(ТекстЗапросаБлокировки) Тогда + + ТекстЗапросаБлокировки = + "ВЫБРАТЬ + | Блокировки.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные + |ПОМЕСТИТЬ Блокировки + |ИЗ + | РегистрСведений.БлокировкиСеансовОбластейДанных КАК Блокировки + |ГДЕ + | (Блокировки.НачалоБлокировки = ДАТАВРЕМЯ(1, 1, 1) + | ИЛИ Блокировки.НачалоБлокировки <= &ТекущаяУниверсальнаяДата) + | И (Блокировки.КонецБлокировки = ДАТАВРЕМЯ(1, 1, 1) + | ИЛИ Блокировки.КонецБлокировки >= &ТекущаяУниверсальнаяДата) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |"; + + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ВЫБРАТЬ + | Очередь.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных, + | Очередь.Ссылка КАК Идентификатор, + | Очередь.Использование КАК Использование, + | Очередь.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, + | Очередь.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, + | Очередь.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, + | Очередь.НомерПопытки КАК НомерПопытки, + | Очередь.Шаблон КАК Шаблон, + | ЕСТЬNULL(Очередь.Шаблон.Ссылка, НЕОПРЕДЕЛЕНО) КАК СсылкаШаблона, + | ЕСТЬNULL(ЧасовыеПояса.Значение, """") КАК ЧасовойПояс, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.Расписание + | ИНАЧЕ Очередь.Шаблон.Расписание + | КОНЕЦ КАК Расписание, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.ИмяМетода + | ИНАЧЕ Очередь.Шаблон.ИмяМетода + | КОНЕЦ КАК ИмяМетода, + | Очередь.Параметры КАК Параметры, + | Очередь.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, + | Очередь.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска + |ИЗ + | %1 КАК Очередь + | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса + | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные + |ГДЕ + | Очередь.Использование + | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата + | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано) + | И Очередь.ЭксклюзивноеВыполнение + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Очередь.ОбластьДанныхВспомогательныеДанные, + | Очередь.Ссылка, + | Очередь.Использование, + | Очередь.ЗапланированныйМоментЗапуска, + | Очередь.ИсполняющееФоновоеЗадание, + | Очередь.ЭксклюзивноеВыполнение, + | Очередь.НомерПопытки, + | Очередь.Шаблон, + | ЕСТЬNULL(Очередь.Шаблон.Ссылка, НЕОПРЕДЕЛЕНО), + | ЕСТЬNULL(ЧасовыеПояса.Значение, """"), + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.Расписание + | ИНАЧЕ Очередь.Шаблон.Расписание + | КОНЕЦ, + | ВЫБОР + | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) + | ТОГДА Очередь.ИмяМетода + | ИНАЧЕ Очередь.Шаблон.ИмяМетода + | КОНЕЦ, + | Очередь.Параметры, + | Очередь.ДатаНачалаПоследнегоЗапуска, + | Очередь.ДатаЗавершенияПоследнегоЗапуска + |ИЗ + | %1 КАК Очередь + | ЛЕВОЕ СОЕДИНЕНИЕ Блокировки КАК Блокировки + | ПО Очередь.ОбластьДанныхВспомогательныеДанные = Блокировки.ОбластьДанныхВспомогательныеДанные + | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса + | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные + |ГДЕ + | Очередь.Использование + | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата + | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано) + | И НЕ Очередь.ЭксклюзивноеВыполнение + | И Блокировки.ОбластьДанныхВспомогательныеДанные ЕСТЬ NULL " + , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); + + Иначе + + ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ВЫБРАТЬ + | -1 КАК ОбластьДанных, + | Очередь.Ссылка КАК Идентификатор, + | Очередь.Использование КАК Использование, + | Очередь.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, + | Очередь.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, + | Очередь.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, + | Очередь.НомерПопытки КАК НомерПопытки, + | НЕОПРЕДЕЛЕНО КАК Шаблон, + | НЕОПРЕДЕЛЕНО КАК СсылкаШаблона, + | """" КАК ЧасовойПояс, + | Очередь.Расписание КАК Расписание, + | Очередь.ИмяМетода КАК ИмяМетода, + | Очередь.Параметры КАК Параметры, + | Очередь.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, + | Очередь.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска + |ИЗ %1 КАК Очередь + |ГДЕ + | Очередь.Использование + | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата + | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано)" + , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); + + КонецЕсли; + + КонецЦикла; + + ТекстЗапроса = ТекстЗапросаБлокировки + + "ВЫБРАТЬ ПЕРВЫЕ 111 + | ВложенныйЗапрос.ОбластьДанных КАК ОбластьДанных, + | ВложенныйЗапрос.Идентификатор КАК Идентификатор, + | ВложенныйЗапрос.Использование КАК Использование, + | ВложенныйЗапрос.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, + | ВложенныйЗапрос.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, + | ВложенныйЗапрос.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, + | ВложенныйЗапрос.НомерПопытки КАК НомерПопытки, + | ВложенныйЗапрос.Шаблон КАК Шаблон, + | ВложенныйЗапрос.СсылкаШаблона КАК СсылкаШаблона, + | ВложенныйЗапрос.ЧасовойПояс КАК ЧасовойПояс, + | ВложенныйЗапрос.Расписание КАК Расписание, + | ВложенныйЗапрос.ИмяМетода КАК ИмяМетода, + | ВложенныйЗапрос.Параметры КАК Параметры, + | ВложенныйЗапрос.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, + | ВложенныйЗапрос.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска + |ИЗ + | (" + ТекстЗапроса + ") КАК ВложенныйЗапрос + | + |УПОРЯДОЧИТЬ ПО + | ЭксклюзивноеВыполнение УБЫВ, + | ЗапланированныйМоментЗапуска, + | ВложенныйЗапрос.ДатаЗавершенияПоследнегоЗапуска, + | Идентификатор"; + + Запрос.Текст = ТекстЗапроса; + РазмерВыборкиТекст = Формат(МаксимальноеКоличествоИсполняющихФоновыхЗаданий * 3, "ЧН=; ЧГ="); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "111", РазмерВыборкиТекст); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Иначе + МодульРаботаВМоделиСервиса = Неопределено; + КонецЕсли; + + Пока МожноВыполнять Цикл + Запрос.УстановитьПараметр("ТекущаяУниверсальнаяДата", ТекущаяУниверсальнаяДата()); + + Выборка = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать(); + + БлокировкаУстановлена = Ложь; + Пока Выборка.Следующий() Цикл + Попытка + + ЗаблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + + // Проверка блокировки области. + Если МодульРаботаВМоделиСервиса <> Неопределено + И Выборка.ОбластьДанных <> -1 + И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда + + РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + + // Область заблокирована, перейти к следующей записи. + Продолжить; + КонецЕсли; + + Если ЗначениеЗаполнено(Выборка.Шаблон) + И Выборка.СсылкаШаблона = Неопределено Тогда + + ШаблонСообщения = НСтр("ru = 'На найден шаблон задания очереди с идентификатором %1'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Выборка.Шаблон); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь заданий.Выполнение'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ТекстСообщения); + + РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + Продолжить; + КонецЕсли; + + БлокировкаУстановлена = Истина; + Прервать; + Исключение + // Не удалось установить блокировку. + БлокировкаУстановлена = Ложь; + КонецПопытки; + КонецЦикла; + + Если Не БлокировкаУстановлена Тогда + Возврат; + КонецЕсли; + + Расписание = Выборка.Расписание.Получить(); + Если Расписание <> Неопределено Тогда + // Проверка попадания в допустимые интервалы очереди. + ЧасовойПояс = Выборка.ЧасовойПояс; + + Если ПустаяСтрока(ЧасовойПояс) Тогда + ЧасовойПояс = Неопределено; + КонецЕсли; + + ВремяОбласти = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс); + Просрочено = НЕ Расписание.ТребуетсяВыполнение(ВремяОбласти); + Иначе + Просрочено = Ложь; + КонецЕсли; + + Если Просрочено Тогда + // Требуется перепланировать задание. + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Выборка.Идентификатор.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Идентификатор); + + Если Выборка.ОбластьДанных <> -1 Тогда + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, Выборка.ОбластьДанных); + КонецЕсли; + Блокировка.Заблокировать(); + + Задание = Выборка.Идентификатор.ПолучитьОбъект(); + Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.НеЗапланировано; + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); + ЗафиксироватьТранзакцию(); + Исключение + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); + Иначе + ВыполнитьЗаданиеОчереди(Выборка.Идентификатор, ИсполняющееФоновоеЗадание, Выборка.Шаблон, Выборка.ИмяМетода); + КонецЕсли; + + РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); + + // Проверка возможности дальнейшего выполнения. + ДлительностьВыполнения = ТекущаяУниверсальнаяДата() - НачалоВыполнения; + Если ДлительностьВыполнения > МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания Тогда + МожноВыполнять = Ложь; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Служебная процедура, которая вызывается для выполнения обработчика ошибок задания в случае, +// когда процесс, исполняющий задание не смог завершить выполнение самостоятельно. +// +// Параметры: +// Задание - СправочникСсылка - ссылка на задание, обработчик ошибки которого необходимо выполнить. +// ИнформацияОбОшибкеВыполненияЗадания - ИнформацияОбОшибке - информация об ошибке, с которой завершилось задание. +// +Процедура ОбработатьОшибку(Знач Задание, Знач ИнформацияОбОшибкеВыполненияЗадания = Неопределено) Экспорт + + ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание, ИнформацияОбОшибкеВыполненияЗадания); + + Если ПараметрыОбработчикаОшибок.ОбработчикСуществует Тогда + + Попытка + + ВыполнитьМетодКонфигурации(ПараметрыОбработчикаОшибок.ИмяМетода, ПараметрыОбработчикаОшибок.ПараметрыВызоваОбработчика); + + Исключение + + ШаблонКомментария = НСтр("ru = 'Ошибка при выполнении обработчика ошибок + |Псевдоним метода: %1 + |Метод обработчика ошибок: %2 + |По причине: + |%3'"); + ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, + ПараметрыОбработчикаОшибок.ИмяМетодаЗадания, + ПараметрыОбработчикаОшибок.ИмяМетода, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Очередь регламентных заданий.Ошибка обработчика ошибок'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ТекстКомментария); + + КонецПопытки; + + КонецЕсли; + + Если ОбщегоНазначения.СсылкаСуществует(Задание) + И Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОбработкаОшибкиПриАварийномЗавершении Тогда + + ЗаданиеОбъект = Задание.ПолучитьОбъект(); + ЗаданиеОбъект.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОшибкаВыполнения; + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ЗаданиеОбъект); + + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура, которая снимает задания обработчика ошибок и свои собственные. Необходима для случая, когда +// задание исполнение "ОбработатьОшибку" не смогло завершиться. +// +// Параметры: +// ПараметрыВызова - Массив - Массив параметров, который был передан заданию, ошибку выполнения которого мы обрабатываем +// используется только для определения задания, ошибку выполнения которого мы обрабатываем. +// ИнформацияОбОшибке - ОписаниеОшибки - Не используется, необходимо только потому, что этот параметр должен +// присутствовать в обработчике ошибок. +// СчетчикРекурсии - Число - Используется для подсчета количества созданных заданий снятия заданий. +// +Процедура СнятьЗаданияОбработкиОшибок(Знач ПараметрыВызова, Знач ИнформацияОбОшибке = Неопределено, Знач СчетчикРекурсии = 1) Экспорт + + НачатьТранзакцию(); + Попытка + + ЗаданиеСсылка = ПараметрыВызова.Параметры[0]; + + Если Не ОбщегоНазначения.СсылкаСуществует(ЗаданиеСсылка) Тогда + + ОтменитьТранзакцию(); + Возврат; + + КонецЕсли; + + Задание = ЗаданиеСсылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ЗаданиеСсылка); + + Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОшибкаВыполнения; + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); + + ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание); + Если ПараметрыОбработчикаОшибок.ИмяМетода = "ОчередьЗаданийСлужебный.СнятьЗаданияОбработкиОшибок" Тогда + + СнятьЗаданияОбработкиОшибок(ПараметрыОбработчикаОшибок.ПараметрыВызоваОбработчика[0], ИнформацияОбОшибке, СчетчикРекурсии + 1); + + Иначе + + ШаблонКомментария = НСтр("ru = 'Был выполнен обработчик снятие заданий. + |Псевдоним метода: %1 + |Уровень рекурсии: %2'"); + ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, + ПараметрыОбработчикаОшибок.ИмяМетодаЗадания, + СчетчикРекурсии); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Очередь регламентных заданий.Снятие заданий обработки ошибок'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + , + , + ТекстКомментария); + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + КонецПопытки; + + РазблокироватьДанныеДляРедактирования(ЗаданиеСсылка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Локальные служебные процедуры и функции. // Возвращает следующую дата выполнения расписания. // // Параметры: // Расписание - РасписаниеРегламентногоЗадания - расписание по которому // будет рассчитываться дата. -// ДатаДляПроверки - Дата (ДатаВремя) - минимальная дата на которую может +// ДатаДляПроверки - Дата - минимальная дата на которую может // быть запланировано выполнение. -// ДатаНачалаПоследнегоЗапуска - Дата (ДатаВремя) - Дата начала последнего +// ДатаНачалаПоследнегоЗапуска - Дата - Дата начала последнего // запуска задания. Если дата задана, то используется для проверки таких // условий как ПериодПовтораДней, ПериодНедель, ПериодПовтораВТечениеДня. // Если дата не задана, то считается, что задание не выполнялось ни разу // и проверка этих условий не производится. -// ДатаЗавершенияПоследнегоЗапуска - Дата (ДатаВремя) - Дата завершения +// ДатаЗавершенияПоследнегоЗапуска - Дата - Дата завершения // последнего запуска задания. Если дата задана, то используется для // проверки условия ПаузаПовтора. Если дата не задана, то считается, что // задание ни разу не завершалось, и проверка этого условия не производится. @@ -26,9 +687,12 @@ // Увеличение значения может привести к замедлению расчета на сложных // расписаниях. // +// Возвращаемое значение: +// Дата - следующая дата выполнения расписания. +// Функция СледующаяДатаВыполненияРасписания(Знач Расписание, Знач ДатаДляПроверки, Знач ДатаНачалаПоследнегоЗапуска = Неопределено, Знач ДатаЗавершенияПоследнегоЗапуска = Неопределено, - Знач МаксимальныйГоризонтПланирования = Неопределено) Экспорт + Знач МаксимальныйГоризонтПланирования = Неопределено) Если МаксимальныйГоризонтПланирования = Неопределено Тогда МаксимальныйГоризонтПланирования = 366 * 86400 * 10; @@ -359,769 +1023,6 @@ КонецФункции -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Рассчитывает следующий момент запуска задания. -// -// Параметры: -// Расписание - РасписаниеРегламентногоЗадания - расписание, -// для которого требуется рассчитать момент следующего запуска. -// ЧасовойПояс - Строка. -// ДатаНачалаПоследнегоЗапуска - Дата - Дата начала последнего запуска регламентного задания. -// Если дата задана, то используется для проверки таких условий как. -// ПериодПовтораДней, ПериодНедель, ПериодПовтораВТечениеДня. -// Если дата не задана, то считается, -// что задание не выполнялось ни разу и проверка этих условий не производится. -// -// Возвращаемое значение: -// Дата - Рассчитанный следующий момент запуска задания. -// -Функция ПолучитьЗапланированныйМоментЗапускаЗадания(Знач Расписание, Знач ЧасовойПояс, - Знач ДатаНачалаПоследнегоЗапуска = '00010101', Знач ДатаЗавершенияПоследнегоЗапуска = '00010101') Экспорт - - Если ПустаяСтрока(ЧасовойПояс) Тогда - ЧасовойПояс = Неопределено; - КонецЕсли; - - Если ЗначениеЗаполнено(ДатаНачалаПоследнегоЗапуска) Тогда - ДатаНачалаПоследнегоЗапуска = МестноеВремя(ДатаНачалаПоследнегоЗапуска, ЧасовойПояс); - КонецЕсли; - - Если ЗначениеЗаполнено(ДатаЗавершенияПоследнегоЗапуска) Тогда - ДатаЗавершенияПоследнегоЗапуска = МестноеВремя(ДатаЗавершенияПоследнегоЗапуска, ЧасовойПояс); - КонецЕсли; - - ДатаРасчета = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс); - - НайденнаяДата = СледующаяДатаВыполненияРасписания(Расписание, ДатаРасчета, ДатаНачалаПоследнегоЗапуска, ДатаЗавершенияПоследнегоЗапуска); - - Если ЗначениеЗаполнено(НайденнаяДата) Тогда - Возврат УниверсальноеВремя(НайденнаяДата, ЧасовойПояс); - Иначе - Возврат НайденнаяДата; - КонецЕсли; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Объявление служебных событий, к которым можно подключать обработчики БСП. - -// Объявляет события подсистемы ОчередьЗаданий: -// -// Серверные события: -// ПриПолученииСпискаШаблонов -// ПриОпределенииПсевдонимовОбработчиков -// ПриОпределенииОбработчиковОшибок -// ПриОпределенииИспользованияРегламентныхЗаданий. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Формирует список шаблонов заданий очереди. - // - // Параметры: - // Шаблоны - Массив строк. В параметр следует добавить имена предопределенных - // неразделенных регламентных заданий, которые должны использоваться в качестве - // шаблонов для заданий очереди. - // - // Синтаксис: - // Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - // - // (То же, что ОчередьЗаданийПереопределяемый.ЗаполнитьСписокРазделенныхРегламентныхЗаданий). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"); - - // Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. - // - // Параметры: - // СоответствиеИменПсевдонимам - Соответствие - // Ключ - Псевдоним метода, например ОчиститьОбластьДанных. - // Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. - // В качестве значения можно указать Неопределено, в этом случае считается что имя - // совпадает с псевдонимом. - // - // Синтаксис: - // Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - // - // (То же, что ОчередьЗаданийПереопределяемый.ПолучитьРазрешенныеМетодыОчередиЗаданий). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"); - - // Заполняет соответствие методов обработчиков ошибок псевдонимам методов, при возникновении - // ошибок в которых они вызываются. - // - // Параметры: - // ОбработчикиОшибок - Соответствие - // Ключ - Псевдоним метода, например ОчиститьОбластьДанных. - // Значение - Имя метода - обработчика ошибок, для вызова при возникновении ошибки. - // Обработчик ошибок вызывается в случае завершения выполнения исходного задания - // с ошибкой. Обработчик ошибок вызывается в той же области данных, что и исходное - // задание. - // Метод обработчика ошибок считается разрешенным к вызову механизмами очереди. - // Параметры обработчика ошибок: - // ПараметрыЗадания - Структура - параметры задания очереди. - // Параметры - // НомерПопытки - // КоличествоПовторовПриАварийномЗавершении - // ДатаНачалаПоследнегоЗапуска. - // ИнформацияОбОшибке - ИнформацияОбОшибке - описание ошибки, произошедшей при - // выполнении задания. - // - // Синтаксис: - // Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт - // - // (То же, что ОчередьЗаданийПереопределяемый.ПриОпределенииОбработчиковОшибок). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок"); - - // Формирует таблицу регламентных заданий с признаком использования в модели сервиса. - // - // Параметры: - // ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо - // заполнить регламентными заданиями и признаком использования, колонки: - // РегламентноеЗадание - Строка - имя предопределенного регламентного задания. - // Использование - Булево - Истина, если регламентное задание должно - // выполняться в модели сервиса. Ложь - если не должно. - // - // Синтаксис: - // Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОчередьЗаданийСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( - "ОчередьЗаданийСлужебный"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Вызывается при включении разделения данных по областям данных. -// -Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - - УстановитьИспользованиеРегламентныхЗаданий(); - - Если Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Получить() = 0 Тогда - Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Установить(600); - КонецЕсли; - - Если Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Получить() = 0 Тогда - Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Установить(1); - КонецЕсли; - -КонецПроцедуры - -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник ОчередьЗаданий запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ОчередьЗаданий.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - - // Загрузка в справочник ШаблоныЗаданийОчереди запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ШаблоныЗаданийОчереди.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// Возвращает менеджер справочника ОчередьЗаданий. -Функция СправочникОчередьЗаданий() Экспорт - - Возврат ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник.ОчередьЗаданий"); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Экспортные служебные процедуры и функции. - -// Производит планирование выполнения заданий из РС ОчередьЗаданий. -// -Процедура ПланированиеОбработкиЗаданий() Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, - // т.к. необходимые действия выполняются в частном порядке. - - // Выбираем события в состояниях Выполняется, Завершено, НеЗапланировано, ОшибкаВыполнения. - Запрос = Новый Запрос; - - СправочникиЗаданий = ОчередьЗаданийСлужебныйПовтИсп.ПолучитьСправочникиЗаданий(); - ТекстЗапроса = ""; - Для Каждого СправочникЗаданий Из СправочникиЗаданий Цикл - - Если Не ПустаяСтрока(ТекстЗапроса) Тогда - - ТекстЗапроса = ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - |" - - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий.СоздатьЭлемент().Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда - - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ - | Очередь.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных, - | Очередь.Ссылка КАК Идентификатор, - | ЕСТЬNULL(Очередь.Шаблон, НЕОПРЕДЕЛЕНО) КАК Шаблон, - | ЕСТЬNULL(ЧасовыеПояса.Значение, """") КАК ЧасовойПояс, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.Расписание - | ИНАЧЕ Очередь.Шаблон.Расписание - | КОНЕЦ КАК Расписание, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.КоличествоПовторовПриАварийномЗавершении - | ИНАЧЕ Очередь.Шаблон.КоличествоПовторовПриАварийномЗавершении - | КОНЕЦ КАК КоличествоПовторовПриАварийномЗавершении, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.ИнтервалПовтораПриАварийномЗавершении - | ИНАЧЕ Очередь.Шаблон.ИнтервалПовтораПриАварийномЗавершении - | КОНЕЦ КАК ИнтервалПовтораПриАварийномЗавершении - |ИЗ - | %1 КАК Очередь - | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса - | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные - |ГДЕ - | Очередь.СостояниеЗадания В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.НеЗапланировано), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.ОшибкаВыполнения))" - , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); - - Иначе - - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ - | -1 КАК ОбластьДанных, - | Очередь.Ссылка КАК Идентификатор, - | НЕОПРЕДЕЛЕНО КАК Шаблон, - | """" КАК ЧасовойПояс, - | Очередь.Расписание КАК Расписание, - | Очередь.КоличествоПовторовПриАварийномЗавершении КАК КоличествоПовторовПриАварийномЗавершении, - | Очередь.ИнтервалПовтораПриАварийномЗавершении КАК ИнтервалПовтораПриАварийномЗавершении - |ИЗ - | %1 КАК Очередь - |ГДЕ - | Очередь.СостояниеЗадания В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.НеЗапланировано), ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.ОшибкаВыполнения))" - , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); - - КонецЕсли; - - КонецЦикла; - - Запрос.Текст = ТекстЗапроса; - Результат = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос); - Выборка = Результат.Выбрать(); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - Иначе - МодульРаботаВМоделиСервиса = Неопределено; - КонецЕсли; - - Пока Выборка.Следующий() Цикл - - Попытка - ЗаблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - Исключение - // Запись заблокирована, перейти к следующей. - Продолжить; - КонецПопытки; - - // Проверка блокировки области. - Если МодульРаботаВМоделиСервиса <> Неопределено - И Выборка.ОбластьДанных <> -1 - И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда - - // Область заблокирована, перейти к следующей записи. - Продолжить; - КонецЕсли; - - // Перепланируем завершившиеся регламентные задания и аварийно завершившиеся фоновые, удаляем выполненные фоновые. - ЗапланироватьЗадание(Выборка); - - РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - - КонецЦикла; - - // Вычисление количества требуемых исполняющих фоновых заданий. - КоличествоЗапускаемыхФоновыхЗаданий = КоличествоИсполняющихФоновыхЗаданийКЗапуску(); - - // Запуск исполняющих фоновых заданий. - ЗапуститьИсполняющееФоновоеЗадание(КоличествоЗапускаемыхФоновыхЗаданий); - -КонецПроцедуры - -// Процедура выполняет задания из РС ОчередьЗаданий. -// -// Параметры: -// КлючФоновогоЗадания - УникальныйИдентификатор - ключ необходим -// для поиска текущего фонового задания. -// -Процедура ОбработатьОчередьЗаданий(КлючФоновогоЗадания) Экспорт - - // Вызов ПриНачалеВыполненияРегламентногоЗадания не используется, - // т.к. необходимые действия выполняются в частном порядке. - - НайденноеФоновоеЗадание = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Ключ", КлючФоновогоЗадания)); - Если НайденноеФоновоеЗадание.Количество() = 1 Тогда - ИсполняющееФоновоеЗадание = НайденноеФоновоеЗадание[0]; - Иначе - Возврат; - КонецЕсли; - - МожноВыполнять = Истина; - НачалоВыполнения = ТекущаяУниверсальнаяДата(); - - МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания = - Константы.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания.Получить(); - МаксимальноеКоличествоИсполняющихФоновыхЗаданий = - Константы.МаксимальноеКоличествоИсполняющихФоновыхЗаданий.Получить(); - - Запрос = Новый Запрос; - - СправочникиЗаданий = ОчередьЗаданийСлужебныйПовтИсп.ПолучитьСправочникиЗаданий(); - ТекстЗапроса = ""; - ТекстЗапросаБлокировки = ""; - Для Каждого СправочникЗаданий Из СправочникиЗаданий Цикл - - ПерваяСтрока = ПустаяСтрока(ТекстЗапроса); - - Если Не ПерваяСтрока Тогда - - ТекстЗапроса = ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - |" - - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий.СоздатьЭлемент().Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда - - Если ПустаяСтрока(ТекстЗапросаБлокировки) Тогда - - ТекстЗапросаБлокировки = - "ВЫБРАТЬ - | Блокировки.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные - |ПОМЕСТИТЬ Блокировки - |ИЗ - | РегистрСведений.БлокировкиСеансовОбластейДанных КАК Блокировки - |ГДЕ - | (Блокировки.НачалоБлокировки > &ТекущаяУниверсальнаяДата - | ИЛИ Блокировки.КонецБлокировки <> ДАТАВРЕМЯ(1, 1, 1) - | И Блокировки.КонецБлокировки < &ТекущаяУниверсальнаяДата) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |"; - - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ - | Очередь.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных, - | Очередь.Ссылка КАК Идентификатор, - | Очередь.Использование КАК Использование, - | Очередь.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, - | Очередь.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, - | Очередь.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, - | Очередь.НомерПопытки КАК НомерПопытки, - | Очередь.Шаблон КАК Шаблон, - | ЕСТЬNULL(Очередь.Шаблон.Ссылка, НЕОПРЕДЕЛЕНО) КАК СсылкаШаблона, - | ЕСТЬNULL(ЧасовыеПояса.Значение, """") КАК ЧасовойПояс, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.Расписание - | ИНАЧЕ Очередь.Шаблон.Расписание - | КОНЕЦ КАК Расписание, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.ИмяМетода - | ИНАЧЕ Очередь.Шаблон.ИмяМетода - | КОНЕЦ КАК ИмяМетода, - | Очередь.Параметры КАК Параметры, - | Очередь.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, - | Очередь.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска - |ИЗ - | %1 КАК Очередь - | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса - | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные - |ГДЕ - | Очередь.Использование - | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата - | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано) - | И Очередь.ЭксклюзивноеВыполнение - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | Очередь.ОбластьДанныхВспомогательныеДанные, - | Очередь.Ссылка, - | Очередь.Использование, - | Очередь.ЗапланированныйМоментЗапуска, - | Очередь.ИсполняющееФоновоеЗадание, - | Очередь.ЭксклюзивноеВыполнение, - | Очередь.НомерПопытки, - | Очередь.Шаблон, - | ЕСТЬNULL(Очередь.Шаблон.Ссылка, НЕОПРЕДЕЛЕНО), - | ЕСТЬNULL(ЧасовыеПояса.Значение, """"), - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.Расписание - | ИНАЧЕ Очередь.Шаблон.Расписание - | КОНЕЦ, - | ВЫБОР - | КОГДА Очередь.Шаблон = ЗНАЧЕНИЕ(Справочник.ШаблоныЗаданийОчереди.ПустаяСсылка) - | ТОГДА Очередь.ИмяМетода - | ИНАЧЕ Очередь.Шаблон.ИмяМетода - | КОНЕЦ, - | Очередь.Параметры, - | Очередь.ДатаНачалаПоследнегоЗапуска, - | Очередь.ДатаЗавершенияПоследнегоЗапуска - |ИЗ - | %1 КАК Очередь - | ЛЕВОЕ СОЕДИНЕНИЕ Блокировки КАК Блокировки - | ПО Очередь.ОбластьДанныхВспомогательныеДанные = Блокировки.ОбластьДанныхВспомогательныеДанные - | ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса - | ПО Очередь.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные - |ГДЕ - | Очередь.Использование - | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата - | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано) - | И НЕ Очередь.ЭксклюзивноеВыполнение - | И Блокировки.ОбластьДанныхВспомогательныеДанные ЕСТЬ NULL " - , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); - - Иначе - - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ - | -1 КАК ОбластьДанных, - | Очередь.Ссылка КАК Идентификатор, - | Очередь.Использование КАК Использование, - | Очередь.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, - | Очередь.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, - | Очередь.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, - | Очередь.НомерПопытки КАК НомерПопытки, - | НЕОПРЕДЕЛЕНО КАК Шаблон, - | НЕОПРЕДЕЛЕНО КАК СсылкаШаблона, - | """" КАК ЧасовойПояс, - | Очередь.Расписание КАК Расписание, - | Очередь.ИмяМетода КАК ИмяМетода, - | Очередь.Параметры КАК Параметры, - | Очередь.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, - | Очередь.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска - |ИЗ %1 КАК Очередь - |ГДЕ - | Очередь.Использование - | И Очередь.ЗапланированныйМоментЗапуска <= &ТекущаяУниверсальнаяДата - | И Очередь.СостояниеЗадания = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано)" - , СправочникЗаданий.ПустаяСсылка().Метаданные().ПолноеИмя()); - - КонецЕсли; - - КонецЦикла; - - ТекстЗапроса = ТекстЗапросаБлокировки + - "ВЫБРАТЬ ПЕРВЫЕ 111 - | ВложенныйЗапрос.ОбластьДанных КАК ОбластьДанных, - | ВложенныйЗапрос.Идентификатор КАК Идентификатор, - | ВложенныйЗапрос.Использование КАК Использование, - | ВложенныйЗапрос.ЗапланированныйМоментЗапуска КАК ЗапланированныйМоментЗапуска, - | ВложенныйЗапрос.ИсполняющееФоновоеЗадание КАК ИсполняющееФоновоеЗадание, - | ВложенныйЗапрос.ЭксклюзивноеВыполнение КАК ЭксклюзивноеВыполнение, - | ВложенныйЗапрос.НомерПопытки КАК НомерПопытки, - | ВложенныйЗапрос.Шаблон КАК Шаблон, - | ВложенныйЗапрос.СсылкаШаблона КАК СсылкаШаблона, - | ВложенныйЗапрос.ЧасовойПояс КАК ЧасовойПояс, - | ВложенныйЗапрос.Расписание КАК Расписание, - | ВложенныйЗапрос.ИмяМетода КАК ИмяМетода, - | ВложенныйЗапрос.Параметры КАК Параметры, - | ВложенныйЗапрос.ДатаНачалаПоследнегоЗапуска КАК ДатаНачалаПоследнегоЗапуска, - | ВложенныйЗапрос.ДатаЗавершенияПоследнегоЗапуска КАК ДатаЗавершенияПоследнегоЗапуска - |ИЗ - | (" + ТекстЗапроса + ") КАК ВложенныйЗапрос - | - |УПОРЯДОЧИТЬ ПО - | ЭксклюзивноеВыполнение УБЫВ, - | ЗапланированныйМоментЗапуска, - | ВложенныйЗапрос.ДатаЗавершенияПоследнегоЗапуска, - | Идентификатор"; - - Запрос.Текст = ТекстЗапроса; - РазмерВыборкиТекст = Формат(МаксимальноеКоличествоИсполняющихФоновыхЗаданий * 3, "ЧН=; ЧГ="); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "111", РазмерВыборкиТекст); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - Иначе - МодульРаботаВМоделиСервиса = Неопределено; - КонецЕсли; - - Пока МожноВыполнять Цикл - Запрос.УстановитьПараметр("ТекущаяУниверсальнаяДата", ТекущаяУниверсальнаяДата()); - - Выборка = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать(); - - БлокировкаУстановлена = Ложь; - Пока Выборка.Следующий() Цикл - Попытка - - ЗаблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - - // Проверка блокировки области. - Если МодульРаботаВМоделиСервиса <> Неопределено - И Выборка.ОбластьДанных <> -1 - И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда - - РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - - // Область заблокирована, перейти к следующей записи. - Продолжить; - КонецЕсли; - - Если ЗначениеЗаполнено(Выборка.Шаблон) - И Выборка.СсылкаШаблона = Неопределено Тогда - - ШаблонСообщения = НСтр("ru = 'На найден шаблон задания очереди с идентификатором %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Выборка.Шаблон); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь заданий.Выполнение'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ТекстСообщения); - - РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - Продолжить; - КонецЕсли; - - БлокировкаУстановлена = Истина; - Прервать; - Исключение - // Не удалось установить блокировку. - БлокировкаУстановлена = Ложь; - КонецПопытки; - КонецЦикла; - - Если Не БлокировкаУстановлена Тогда - Возврат; - КонецЕсли; - - Расписание = Выборка.Расписание.Получить(); - Если Расписание <> Неопределено Тогда - // Проверка попадания в допустимые интервалы очереди. - ЧасовойПояс = Выборка.ЧасовойПояс; - - Если ПустаяСтрока(ЧасовойПояс) Тогда - ЧасовойПояс = Неопределено; - КонецЕсли; - - ВремяОбласти = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс); - Просрочено = НЕ Расписание.ТребуетсяВыполнение(ВремяОбласти); - Иначе - Просрочено = Ложь; - КонецЕсли; - - Если Просрочено Тогда - // Требуется перепланировать задание. - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(Выборка.Идентификатор.Метаданные().ПолноеИмя()); - ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Идентификатор); - - Если Выборка.ОбластьДанных <> -1 Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, Выборка.ОбластьДанных); - КонецЕсли; - Блокировка.Заблокировать(); - - Задание = Выборка.Идентификатор.ПолучитьОбъект(); - Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.НеЗапланировано; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); - ЗафиксироватьТранзакцию(); - Исключение - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); - Иначе - ВыполнитьЗаданиеОчереди(Выборка.Идентификатор, ИсполняющееФоновоеЗадание, Выборка.Шаблон, Выборка.ИмяМетода); - КонецЕсли; - - РазблокироватьДанныеДляРедактирования(Выборка.Идентификатор); - - // Проверка возможности дальнейшего выполнения. - ДлительностьВыполнения = ТекущаяУниверсальнаяДата() - НачалоВыполнения; - Если ДлительностьВыполнения > МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания Тогда - МожноВыполнять = Ложь; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Служебная процедура, которая вызывается для выполнения обработчика ошибок задания в случае, -// когда процесс, исполняющий задание не смог завершить выполнение самостоятельно. -// -// Параметры: -// Задание - СправочникСсылка - ссылка на задание, обработчик ошибки которого необходимо выполнить. -// ИнформацияОбОшибкеВыполненияЗадания - ИнформацияОбОшибке - информация об ошибке, с которой завершилось задание. -// -Процедура ОбработатьОшибку(Знач Задание, Знач ИнформацияОбОшибкеВыполненияЗадания = Неопределено) Экспорт - - ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание, ИнформацияОбОшибкеВыполненияЗадания); - - Если ПараметрыОбработчикаОшибок.ОбработчикСуществует Тогда - - Попытка - - ВыполнитьМетодКонфигурации(ПараметрыОбработчикаОшибок.ИмяМетода, ПараметрыОбработчикаОшибок.ПараметрыВызоваОбработчика); - - Исключение - - ШаблонКомментария = НСтр("ru = 'Ошибка при выполнении обработчика ошибок - |Псевдоним метода: %1 - |Метод обработчика ошибок: %2 - |По причине: - |%3'"); - ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, - ПараметрыОбработчикаОшибок.ИмяМетодаЗадания, - ПараметрыОбработчикаОшибок.ИмяМетода, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Очередь регламентных заданий.Ошибка обработчика ошибок'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ТекстКомментария); - - КонецПопытки; - - КонецЕсли; - - Если ОбщегоНазначения.СсылкаСуществует(Задание) - И Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОбработкаОшибкиПриАварийномЗавершении Тогда - - ЗаданиеОбъект = Задание.ПолучитьОбъект(); - ЗаданиеОбъект.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОшибкаВыполнения; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ЗаданиеОбъект); - - КонецЕсли; - -КонецПроцедуры - -// Служебная процедура, которая снимает задания обработчика ошибок и свои собственные. Необходима для случая, когда -// задание исполнение "ОбработатьОшибку" не смогло завершиться. -// -// Параметры: -// ПараметрыВызова - Массив - Массив параметров, который был передан заданию, ошибку выполнения которого мы обрабатываем -// используется только для определения задания, ошибку выполнения которого мы обрабатываем. -// ИнформацияОбОшибке - ОписаниеОшибки - Не используется, необходимо только потому, что этот параметр должен -// присутствовать в обработчике ошибок. -// СчетчикРекурсии - Число - Используется для подсчета количества созданных заданий снятия заданий. -// -Процедура СнятьЗаданияОбработкиОшибок(Знач ПараметрыВызова, Знач ИнформацияОбОшибке = Неопределено, Знач СчетчикРекурсии = 1) Экспорт - - НачатьТранзакцию(); - Попытка - - ЗаданиеСсылка = ПараметрыВызова.Параметры[0]; - - Если Не ОбщегоНазначения.СсылкаСуществует(ЗаданиеСсылка) Тогда - - ОтменитьТранзакцию(); - Возврат; - - КонецЕсли; - - Задание = ЗаданиеСсылка.ПолучитьОбъект(); - - ЗаблокироватьДанныеДляРедактирования(ЗаданиеСсылка); - - Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОшибкаВыполнения; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); - - ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание); - Если ПараметрыОбработчикаОшибок.ИмяМетода = "ОчередьЗаданийСлужебный.СнятьЗаданияОбработкиОшибок" Тогда - - СнятьЗаданияОбработкиОшибок(ПараметрыОбработчикаОшибок.ПараметрыВызоваОбработчика[0], ИнформацияОбОшибке, СчетчикРекурсии + 1); - - Иначе - - ШаблонКомментария = НСтр("ru = 'Был выполнен обработчик снятие заданий. - |Псевдоним метода: %1 - |Уровень рекурсии: %2'"); - ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, - ПараметрыОбработчикаОшибок.ИмяМетодаЗадания, - СчетчикРекурсии); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Очередь регламентных заданий.Снятие заданий обработки ошибок'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - , - , - ТекстКомментария); - - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - - КонецПопытки; - - РазблокироватьДанныеДляРедактирования(ЗаданиеСсылка); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Локальные служебные процедуры и функции. - // Метод предназначен для вызова методов обработчиков задания и ошибок. // // Параметры: @@ -1131,7 +1032,7 @@ // Процедура ВыполнитьМетодКонфигурации(ИмяМетода, Параметры = Неопределено) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда РазделительУстановлен = Истина; ЗначениеРазделителя = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Иначе @@ -1140,7 +1041,7 @@ Если ТранзакцияАктивна() Тогда - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Перед стартом выполнения обработчика %1 есть активные транзакции!'"), + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Перед стартом выполнения обработчика %1 есть активные транзакции.'"), ИмяМетода); ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", @@ -1156,7 +1057,7 @@ Попытка - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяМетода, Параметры); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, Параметры); Если ТранзакцияАктивна() Тогда @@ -1175,9 +1076,9 @@ КонецЕсли; - Если Не(РазделительУстановлен) И ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если Не(РазделительУстановлен) И РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По завершении выполнения обработчика %1 не было выключено разделение сеанса!'"), + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По завершении выполнения обработчика %1 не было выключено разделение сеанса.'"), ИмяМетода); ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", @@ -1187,11 +1088,11 @@ , ТекстСообщенияОбОшибке); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ИначеЕсли РазделительУстановлен И ЗначениеРазделителя <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По завершении выполнения обработчика %1 было изменено значение разделителя сеанса!'"), + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По завершении выполнения обработчика %1 было изменено значение разделителя сеанса.'"), ИмяМетода); ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", @@ -1201,7 +1102,7 @@ , ТекстСообщенияОбОшибке); - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина,ЗначениеРазделителя); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина,ЗначениеРазделителя); КонецЕсли; @@ -1212,10 +1113,10 @@ ОтменитьТранзакцию(); КонецЦикла; - Если Не(РазделительУстановлен) И ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + Если Не(РазделительУстановлен) И РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ИначеЕсли РазделительУстановлен И ЗначениеРазделителя <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина,ЗначениеРазделителя); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина,ЗначениеРазделителя); КонецЕсли; ВызватьИсключение; @@ -1259,8 +1160,8 @@ Результат = Новый Структура("ИмяМетода,ИмяМетодаЗадания,ПараметрыВызоваОбработчика,ОбработчикСуществует,Задание"); Результат.Задание = Задание.Ссылка; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) + Если РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные().ПолноеИмя(), + РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) И ЗначениеЗаполнено(Задание.Шаблон) Тогда Результат.ИмяМетодаЗадания = Задание.Шаблон.ИмяМетода; @@ -1330,13 +1231,7 @@ НоваяСтрока.РегламентноеЗадание = "ПланированиеОбработкиЗаданий"; НоваяСтрока.Использование = Истина; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); Возврат ТаблицаИспользования; @@ -1424,8 +1319,8 @@ ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , Строка(ЗаписьЗадания.УникальныйИдентификатор()), Комментарий + ИмяМетода + ";" - + ?(ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ЗаписьЗадания.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()), + + ?(РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ЗаписьЗадания.Метаданные().ПолноеИмя(), + РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()), Формат(ЗаписьЗадания.ОбластьДанныхВспомогательныеДанные, "ЧН=0; ЧГ="), "-1")); КонецПроцедуры @@ -1462,11 +1357,11 @@ Попытка - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, Выборка.ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, Выборка.ОбластьДанных); Исключение - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ШаблонСообщения = НСтр("ru = 'Задание очереди с именем метода %1 в области %2 не запланировано по причине: @@ -1511,7 +1406,7 @@ Задание = Выборка.Идентификатор.ПолучитьОбъект(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные().ПолноеИмя(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда Если ЗначениеЗаполнено(Задание.Шаблон) И Выборка.Шаблон = Неопределено Тогда @@ -1526,7 +1421,7 @@ , ТекстСообщения); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ОтменитьТранзакцию(); Возврат; @@ -1547,7 +1442,7 @@ Задание.НомерПопытки = Задание.НомерПопытки + 1; Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.Запланировано; Задание.ИсполняющееФоновоеЗадание = Неопределено; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); // Задание не было выполнено, запланируем обработчик ошибки. ИначеЕсли Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.Выполняется Тогда @@ -1568,10 +1463,10 @@ ПараметрыВызова.Добавить(Задание.Ссылка); НовоеЗадание.Параметры = Новый ХранилищеЗначения(ПараметрыВызова); НовоеЗадание.ИмяМетода = "ОчередьЗаданийСлужебный.ОбработатьОшибку"; - Если ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные(),"ОбластьДанныхВспомогательныеДанные") Тогда + Если РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Задание.Метаданные(),"ОбластьДанныхВспомогательныеДанные") Тогда НовоеЗадание.ОбластьДанныхВспомогательныеДанные = Задание.ОбластьДанныхВспомогательныеДанные; КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(НовоеЗадание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(НовоеЗадание); // Останавливаем выполнение задания пока не будет выполнен обработчик ошибок. Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОбработкаОшибкиПриАварийномЗавершении; @@ -1582,7 +1477,7 @@ КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); Иначе Расписание = Выборка.Расписание.Получить(); @@ -1597,13 +1492,13 @@ Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.НеАктивно; КонецЕсли; Задание.ИсполняющееФоновоеЗадание = Неопределено; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); Иначе // Нет расписания - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных( + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() И РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( Задание.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда Если ЗначениеЗаполнено(Задание.Шаблон) Тогда // Задание по шаблону без расписания. ШаблонСообщения = НСтр("ru = 'Для шаблон заданий очереди %1 не найдено расписание'"); @@ -1615,7 +1510,7 @@ , ТекстСообщения); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ОтменитьТранзакцию(); Возврат; @@ -1629,13 +1524,13 @@ КонецЕсли; КонецЕсли; - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ЗафиксироватьТранзакцию(); Исключение - + ОтменитьТранзакцию(); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ШаблонСообщения = НСтр("ru = 'Задание очереди с именем метода %1 не запланировано по причине: @@ -1669,7 +1564,7 @@ Знач Шаблон, Знач ИмяМетода) ОбластьДанных = Неопределено; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределеннаяОбластьДанных = МодульОчередьЗаданийСлужебныйРазделениеДанных.ОпределитьОбластьДанныхДляЗадания(Ссылка); Если ПереопределеннаяОбластьДанных <> Неопределено Тогда @@ -1685,7 +1580,7 @@ Попытка Если ОбластьДанных <> -1 Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ОбластьДанных); КонецЕсли; Блокировка = Новый БлокировкаДанных; @@ -1703,13 +1598,13 @@ Задание.ИсполняющееФоновоеЗадание = ИсполняющееФоновоеЗадание.УникальныйИдентификатор; Задание.ДатаНачалаПоследнегоЗапуска = ТекущаяУниверсальнаяДата(); Задание.ДатаЗавершенияПоследнегоЗапуска = Неопределено; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); ЗафиксироватьТранзакцию(); Иначе - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ЗафиксироватьТранзакцию(); Возврат; @@ -1717,7 +1612,7 @@ Исключение - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ОтменитьТранзакцию(); ВызватьИсключение; @@ -1742,20 +1637,31 @@ ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), Ссылка); Исключение + + Пока ТранзакцияАктивна() Цикл + + ОтменитьТранзакцию(); + + КонецЦикла; + + ШаблонКомментария = + НСтр("ru = 'Не удалось выполнить обработчик %1 по причине: + |%2'"); ИнформацияОбОшибкеВыполненияЗадания = ИнформацияОбОшибке(); - ЗаписьКонтроляВыполнения(НСтр("ru = 'Очередь регламентных заданий.Завершено с ошибками'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), Ссылка, + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, ИмяМетода, ПодробноеПредставлениеОшибки(ИнформацияОбОшибкеВыполненияЗадания)); + + ЗаписьКонтроляВыполнения(НСтр("ru = 'Очередь регламентных заданий.Завершено с ошибками'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибкеВыполненияЗадания)); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Завершено с ошибками'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, + УровеньЖурналаРегистрации.Ошибка, , - ИсполняющееФоновоеЗадание, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибкеВыполненияЗадания)); - + ИсполняющееФоновоеЗадание, + ТекстСообщенияОбОшибке); КонецПопытки; @@ -1784,7 +1690,7 @@ Иначе Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.ОшибкаВыполнения; КонецЕсли; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(Задание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(Задание); КонецЕсли; @@ -1792,44 +1698,19 @@ Исключение - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "ОчередьЗаданийСлужебный.УстановитьИспользованиеРегламентныхЗаданий"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Приоритет = 50; - Обработчик.МонопольныйРежим = Ложь; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.9"; - Обработчик.Процедура = "ОчередьЗаданийСлужебный.ПеренестиЗаданияВОчередиВНеразделенныеДанные"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 80; - Обработчик.МонопольныйРежим = Истина; - -КонецПроцедуры - // Отключает регламентные задания задания используемые только в локальном режиме // и включает используемые только в модели сервиса. // @@ -1839,7 +1720,7 @@ Для Каждого Строка Из ТаблицаИспользованияРегламентныхЗаданийВМоделиСервиса Цикл - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда // Включаем регламентные задания, предназначенные для использования в модели сервиса. // Отключаем регламентные задания, предназначенные для использования в локальном режиме. @@ -1882,7 +1763,6 @@ Блокировка = Новый БлокировкаДанных(); БлокировкаСправочника = Блокировка.Добавить("Справочник.ОчередьЗаданий"); - БлокировкаСправочника.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ТекстЗапроса = @@ -1921,7 +1801,7 @@ КонецЕсли; ЗаполнитьЗначенияСвойств(НовоеЗадание, Выборка); - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(НовоеЗадание); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(НовоеЗадание); КонецЦикла; diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl index 376fdebe3..b3e12e34d 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// ОчередьЗаданийСлужебныйПовтИсп: Работа с очередью заданий. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает соответствие имен методов их псевдонимам (в верхнем регистре) @@ -25,12 +20,8 @@ КонецЦикла; МетодыКонфигурации = Новый Соответствие; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииПсевдонимовОбработчиков(МетодыКонфигурации); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриОпределенииПсевдонимовОбработчиков(МетодыКонфигурации); // Определяем методы служебных процедур для обработки ошибок заданий. МетодыКонфигурации.Вставить("ОчередьЗаданийСлужебный.ОбработатьОшибку"); @@ -63,13 +54,7 @@ ОбработчикиОшибок.Вставить("ОчередьЗаданийСлужебный.ОбработатьОшибку","ОчередьЗаданийСлужебный.СнятьЗаданияОбработкиОшибок"); ОбработчикиОшибок.Вставить("ОчередьЗаданийСлужебный.СнятьЗаданияОбработкиОшибок","ОчередьЗаданийСлужебный.СнятьЗаданияОбработкиОшибок"); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок); ОчередьЗаданийПереопределяемый.ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок); Результат = Новый Соответствие; @@ -150,6 +135,7 @@ ОписаниеПараметра.Тип = Новый ОписаниеТипов("Дата"); ОписаниеПараметра.Добавление = Истина; ОписаниеПараметра.Изменение = Истина; + ОписаниеПараметра.Шаблон = Истина; ОписаниеПараметра = Результат.Добавить(); ОписаниеПараметра.Имя = "СостояниеЗадания"; @@ -163,6 +149,7 @@ ОписаниеПараметра.Тип = Новый ОписаниеТипов("Булево"); ОписаниеПараметра.Добавление = Истина; ОписаниеПараметра.Изменение = Истина; + ОписаниеПараметра.Шаблон = Истина; ОписаниеПараметра = Результат.Добавить(); ОписаниеПараметра.Имя = "Шаблон"; @@ -201,6 +188,7 @@ ОписаниеПараметра.Тип = Новый ОписаниеТипов("Число"); ОписаниеПараметра.Добавление = Истина; ОписаниеПараметра.Изменение = Истина; + ОписаниеПараметра.Шаблон = Истина; ОписаниеПараметра = Результат.Добавить(); ОписаниеПараметра.Имя = "Расписание"; @@ -208,6 +196,7 @@ ОписаниеПараметра.Тип = Новый ОписаниеТипов("РасписаниеРегламентногоЗадания, Неопределено"); ОписаниеПараметра.Добавление = Истина; ОписаниеПараметра.Изменение = Истина; + ОписаниеПараметра.Шаблон = Истина; ОписаниеПараметра = Результат.Добавить(); ОписаниеПараметра.Имя = "КоличествоПовторовПриАварийномЗавершении"; @@ -215,6 +204,7 @@ ОписаниеПараметра.Тип = Новый ОписаниеТипов("Число"); ОписаниеПараметра.Добавление = Истина; ОписаниеПараметра.Изменение = Истина; + ОписаниеПараметра.Шаблон = Истина; Для каждого ОписаниеПараметра Из Результат Цикл ОписаниеПараметра.ИмяВРег = ВРег(ОписаниеПараметра.Имя); @@ -260,7 +250,7 @@ Если ОписаниеПараметра.РазделениеДанных Тогда - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ Не РаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(СправочникЗаданий, РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда ОписаниеПоляВыборки = ОписаниеПараметра.ЗначениеДляНеразделенныхЗаданий + " КАК " + ОписаниеПараметра.Имя; @@ -286,7 +276,7 @@ МассивСправочников = Новый Массив(); МассивСправочников.Добавить(Справочники.ОчередьЗаданий); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриЗаполненииСправочниковЗаданий(МассивСправочников); КонецЕсли; diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl index fed5f570d..640d4d468 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОчередьЗаданий: Поддержка разделенных заданий очереди. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Вызывается при заполнении массива справочников, которые могут использоваться для @@ -103,7 +98,7 @@ /// Обновляет задания очереди созданные на основе шаблонов. Процедура ОбновитьЗаданияОчередиПоШаблонам(Параметры = Неопределено) Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -225,7 +220,7 @@ // Обработчик обновления, переносит задания из РС ОчередьЗаданий в справочник ОчередьЗаданийОбластейДанных. Процедура ПеренестиЗаданияВОчередиВоВспомогательныеДанные() Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -235,7 +230,6 @@ Блокировка = Новый БлокировкаДанных(); БлокировкаСправочника = Блокировка.Добавить("Справочник.ОчередьЗаданийОбластейДанных"); - БлокировкаСправочника.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ТекстЗапроса = @@ -296,7 +290,7 @@ // Создает в текущей области данных задания по шаблонам. Процедура СоздатьЗаданияОчередиПоШаблонамВТекущейОбласти() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -359,46 +353,15 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Объявление служебных событий, к которым можно подключать обработчики БСП. +// Обработчики событий подсистем конфигурации. -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ОчередьЗаданийСлужебныйРазделениеДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( - "ОчередьЗаданийСлужебныйРазделениеДанных"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОчередьЗаданийСлужебныйРазделениеДанных"); - - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "ОчередьЗаданийСлужебныйРазделениеДанных"); - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Возврат; + КонецЕсли; + Обработчик = Обработчики.Добавить(); Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "ОчередьЗаданийСлужебныйРазделениеДанных.СоздатьЗаданияОчередиПоШаблонамВТекущейОбласти"; @@ -423,18 +386,15 @@ КонецПроцедуры -// Вызывается при включении разделения данных по областям данных. -// +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт ОбновитьЗаданияОчередиПоШаблонам(); КонецПроцедуры -// Вызывается после окончания загрузки данных из локальной версии -// в область данных сервиса или наоборот. -// -Процедура ПослеЗагрузкиДанныхИзДругойМодели() Экспорт +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт СоздатьЗаданияОчередиПоШаблонамВТекущейОбласти(); @@ -448,11 +408,7 @@ КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.ОчередьЗаданийОбластейДанных); @@ -480,7 +436,7 @@ // Функция ОбновитьШаблоныЗаданийОчереди(Параметры) - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат Новый Структура("Добавленные, Удаленные", Новый Массив, Новый Массив); КонецЕсли; @@ -502,7 +458,7 @@ ТаблицаШаблонов.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150, ДопустимаяДлина.Переменная))); ТаблицаШаблонов.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255, ДопустимаяДлина.Переменная))); - ИменаШаблонов = ШаблоныЗаданийОчереди(); + ИменаШаблонов = ОчередьЗаданий.ШаблоныЗаданийОчереди(); Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); Для Каждого Задание Из Задания Цикл @@ -634,23 +590,4 @@ КонецФункции -Функция ШаблоныЗаданийОчереди() - - Шаблоны = Новый Массив; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПолученииСпискаШаблонов(Шаблоны); - КонецЦикла; - - ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов(Шаблоны); - // Для совместимости с предыдущими версиями. - ОчередьЗаданийПереопределяемый.ЗаполнитьСписокРазделенныхРегламентныхЗаданий(Шаблоны); - - Возврат Шаблоны; - -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl index 575c6a525..300cf26f0 100644 --- a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность" (сервер). -// Обслуживает подключаемые команды. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выводит подключенные команды в форме. @@ -14,100 +9,80 @@ // (в этом случае размещается несколько вызовов этой процедуры с указанием 2го параметра), // или когда типы источников зависят от параметров открытия формы. // Состав ключей см. в функции ПараметрыРазмещения(). -// Версия_2_4 - Булево - Истина, если форма настроена для использования подключаемых команд версии 2.4.0.1 и выше. // -Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения = Неопределено, Версия_2_4 = Ложь) Экспорт +Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения = Неопределено) Экспорт + ИмяФормы = Форма.ИмяФормы; - Если Версия_2_4 Тогда - - ИмяФормы = Форма.ИмяФормы; - - ИсточникиЧерезЗапятую = ""; - Если ПараметрыРазмещения = Неопределено Тогда - ПараметрыРазмещения = ПараметрыРазмещения(); - Иначе - Если ТипЗнч(ПараметрыРазмещения.Источники) = Тип("ОписаниеТипов") Тогда - Типы = ПараметрыРазмещения.Источники.Типы(); - Для Каждого Тип Из Типы Цикл - ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); - Если ОбъектМетаданных <> Неопределено Тогда - ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; - КонецЦикла; - ИначеЕсли ТипЗнч(ПараметрыРазмещения.Источники) = Тип("Массив") Тогда - Для Каждого ОбъектМетаданных Из ПараметрыРазмещения.Источники Цикл - Если ТипЗнч(ОбъектМетаданных) = Тип("ОбъектМетаданных") Тогда - ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); - ИначеЕсли ОбъектМетаданных <> Неопределено Тогда - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( - "ПодключаемыеКоманды.ПриСозданииНаСервере", - "ПараметрыРазмещения.Источники[...]", - ОбъектМетаданных, - Новый ОписаниеТипов("ОбъектМетаданных")); - КонецЕсли; - КонецЦикла; - ИначеЕсли ПараметрыРазмещения.Источники <> Неопределено Тогда - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( - "ПодключаемыеКоманды.ПриСозданииНаСервере", - "ПараметрыРазмещения.Источники", - ПараметрыРазмещения.Источники, - Новый ОписаниеТипов("ОписаниеТипов, Массив")); - КонецЕсли; - КонецЕсли; - - ЭтоФормаОбъекта = Неопределено; - Параметры = Форма.Параметры; - ЕстьПараметрыСписка = Параметры.Свойство("Отбор") И Параметры.Свойство("ТекущаяСтрока"); - ЕстьПараметрыОбъекта = Параметры.Свойство("Ключ") И Параметры.Свойство("Основание"); - Если ЕстьПараметрыСписка <> ЕстьПараметрыОбъекта Тогда - ЭтоФормаОбъекта = ЕстьПараметрыОбъекта; - КонецЕсли; - // Для форм внешних отчетов и обработок невозможно получить метаданные имея только имя формы, - // поэтому определение источников команд выполняется до вызова ПовтИсп. - Если ИсточникиЧерезЗапятую = "" И ЭтоВнешняяФорма(ИмяФормы) Тогда - Если ЕстьПараметрыОбъекта Тогда - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Параметры.Ключ)); - Если ОбъектМетаданных <> Неопределено Тогда - ИсточникиЧерезЗапятую = ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; - КонецЕсли; - Если ИсточникиЧерезЗапятую = "" Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В формах внешних отчетов и обработок - |при вызове процедуры ""%1"" - |требуется явно указывать параметр ""%2""'"), - "ПодключаемыеКоманды.ПриСозданииНаСервере", - "ПараметрыРазмещения.Источники"); - КонецЕсли; - КонецЕсли; - - КэшФормы = ПодключаемыеКомандыПовтИсп.КэшФормы(ИмяФормы, ИсточникиЧерезЗапятую, ЭтоФормаОбъекта); - ПараметрыРазмещения.Вставить("ЕстьУсловияВидимости", КэшФормы.ЕстьУсловияВидимости); - ПараметрыРазмещения.Вставить("ЭтоФормаОбъекта", КэшФормы.ЭтоФормаОбъекта); - - Если КэшФормы.ФункциональныеОпции.Количество() > 0 Тогда - Форма.УстановитьПараметрыФункциональныхОпцийФормы(КэшФормы.ФункциональныеОпции); - КонецЕсли; - - Команды = КэшФормы.Команды.Скопировать(); - ВывестиКоманды_2_4(Форма, Команды, ПараметрыРазмещения); - + ИсточникиЧерезЗапятую = ""; + Если ПараметрыРазмещения = Неопределено Тогда + ПараметрыРазмещения = ПараметрыРазмещения(); Иначе - - ИмяФормы = Форма.ИмяФормы; - ИспользуемыеПодменю = Новый Массив; - ИнтеграцияСтандартныхПодсистем.ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю); - Если ИспользуемыеПодменю.Количество() = 0 Тогда - Возврат; + Если ТипЗнч(ПараметрыРазмещения.Источники) = Тип("ОписаниеТипов") Тогда + Типы = ПараметрыРазмещения.Источники.Типы(); + Для Каждого Тип Из Типы Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных <> Неопределено Тогда + ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); + КонецЕсли; + КонецЦикла; + ИначеЕсли ТипЗнч(ПараметрыРазмещения.Источники) = Тип("Массив") Тогда + Для Каждого ОбъектМетаданных Из ПараметрыРазмещения.Источники Цикл + Если ТипЗнч(ОбъектМетаданных) = Тип("ОбъектМетаданных") Тогда + ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); + ИначеЕсли ОбъектМетаданных <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + "ПодключаемыеКоманды.ПриСозданииНаСервере", + "ПараметрыРазмещения.Источники[...]", + ОбъектМетаданных, + Новый ОписаниеТипов("ОбъектМетаданных")); + КонецЕсли; + КонецЦикла; + ИначеЕсли ПараметрыРазмещения.Источники <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + "ПодключаемыеКоманды.ПриСозданииНаСервере", + "ПараметрыРазмещения.Источники", + ПараметрыРазмещения.Источники, + Новый ОписаниеТипов("ОписаниеТипов, Массив")); КонецЕсли; - - ИспользуемыеПодменюЧерезЗапятую = СтрСоединить(ИспользуемыеПодменю, ","); - НастройкиРазмещения = ПодключаемыеКомандыПовтИсп.НастройкиРазмещения(ИмяФормы, ИспользуемыеПодменюЧерезЗапятую); - - ВывестиКоманды(Форма, ИспользуемыеПодменю, НастройкиРазмещения.Команды.Скопировать()); - КонецЕсли; + ЭтоФормаОбъекта = Неопределено; + Параметры = Форма.Параметры; + ЕстьПараметрыСписка = Параметры.Свойство("Отбор") И Параметры.Свойство("ТекущаяСтрока"); + ЕстьПараметрыОбъекта = Параметры.Свойство("Ключ") И Параметры.Свойство("Основание"); + Если ЕстьПараметрыСписка <> ЕстьПараметрыОбъекта Тогда + ЭтоФормаОбъекта = ЕстьПараметрыОбъекта; + КонецЕсли; + // Для форм внешних отчетов и обработок невозможно получить метаданные имея только имя формы, + // поэтому определение источников команд выполняется до вызова ПовтИсп. + Если ИсточникиЧерезЗапятую = "" И ЭтоВнешняяФорма(ИмяФормы) Тогда + Если ЕстьПараметрыОбъекта Тогда + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Параметры.Ключ)); + Если ОбъектМетаданных <> Неопределено Тогда + ИсточникиЧерезЗапятую = ОбъектМетаданных.ПолноеИмя(); + КонецЕсли; + КонецЕсли; + Если ИсточникиЧерезЗапятую = "" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В формах внешних отчетов и обработок + |при вызове процедуры ""%1"" + |требуется явно указывать параметр ""%2""'"), + "ПодключаемыеКоманды.ПриСозданииНаСервере", + "ПараметрыРазмещения.Источники"); + КонецЕсли; + КонецЕсли; + + КэшФормы = ПодключаемыеКомандыПовтИсп.КэшФормы(ИмяФормы, ИсточникиЧерезЗапятую, ЭтоФормаОбъекта); + ПараметрыРазмещения.Вставить("ЕстьУсловияВидимости", КэшФормы.ЕстьУсловияВидимости); + ПараметрыРазмещения.Вставить("ЭтоФормаОбъекта", КэшФормы.ЭтоФормаОбъекта); + + Если КэшФормы.ФункциональныеОпции.Количество() > 0 Тогда + Форма.УстановитьПараметрыФункциональныхОпцийФормы(КэшФормы.ФункциональныеОпции); + КонецЕсли; + + Команды = КэшФормы.Команды.Скопировать(); + ВывестиКоманды(Форма, Команды, ПараметрыРазмещения); + КонецПроцедуры // Конструктор одноименного параметра процедуры ПриСозданииНаСервере. @@ -151,15 +126,12 @@ Возврат; КонецЕсли; - АдресНастроек = Форма.Команды.Найти("АдресНастроекКомандВоВременномХранилище").Действие; + АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд; ОписаниеКоманды = ОписаниеКоманды(ПараметрыВызова.ИмяКомандыВФорме, АдресНастроек); - Контекст = ПараметрыВыполненияКоманды(); + Контекст = ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды(); Контекст.ОписаниеКоманды = Новый Структура(ОписаниеКоманды); Контекст.Форма = Форма; - Если Не Контекст.ЭтоФормаОбъекта И ЗначениеЗаполнено(ОписаниеКоманды.ИмяСписка) Тогда - Источник = Форма.Элементы.Найти(ОписаниеКоманды.ИмяСписка); - КонецЕсли; Контекст.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура"); Контекст.Источник = Источник; Контекст.Вставить("Результат", Результат); @@ -168,7 +140,15 @@ ПараметрыЭкспортнойПроцедуры.Добавить(ПараметрыВызова.ПараметрКоманды); ПараметрыЭкспортнойПроцедуры.Добавить(Контекст); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ОписаниеКоманды.Обработчик, ПараметрыЭкспортнойПроцедуры); + Остаток = ""; + Вид = СтрЛев(ОписаниеКоманды.Обработчик, ".", Остаток); + Если НРег(Вид) = НРег("ОбщийМодуль") Тогда + Обработчик = Остаток; + Иначе + Обработчик = ОписаниеКоманды.Обработчик; + КонецЕсли; + + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыЭкспортнойПроцедуры); КонецПроцедуры // Задает условия видимости команды на форме в зависимости от контекста. @@ -206,131 +186,20 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[Событие].Добавить("ПодключаемыеКоманды"); -КонецПроцедуры - -// Обработчик обновления кэшей, связанных с расширениями. -Функция ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт - Возврат ОперативноеОбновлениеОбщихДанных(Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений")); -КонецФункции - -// Формирует таблицу общих настроек всех расширений, подключенных к объекту метаданных. -Функция НастройкиРасширенийПодключенныхКОбъектуМетаданных(СсылкаОбъектаМетаданных) Экспорт - Результат = Новый ТаблицаЗначений; - СтруктураКолонок = НастройкиПодключаемыхОтчетовИОбработок(); - Для Каждого КлючИЗначение Из СтруктураКолонок Цикл - Результат.Колонки.Добавить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; - Результат.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("Менеджер"); - - Если СсылкаОбъектаМетаданных = Неопределено Тогда - Возврат Результат; - КонецЕсли; - ПодключенныеОбъекты = ПодключаемыеКомандыПовтИсп.Параметры().ПодключенныеОбъекты[СсылкаОбъектаМетаданных]; - Если ПодключенныеОбъекты = Неопределено Тогда - Возврат Результат; - КонецЕсли; - Для Каждого ПолноеИмя Из ПодключенныеОбъекты Цикл - Настройки = НастройкиПоставщика(ПолноеИмя); - Если Настройки = Неопределено Тогда - Продолжить; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Результат.Добавить(), Настройки); - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Получает настройки интеграции объекта метаданных (отчета или обработки). -// -// Параметры: -// ПолноеИмя - Строка - Полное имя объекта метаданных. -// -// Возвращаемое значение: -// Структура - Настройки интеграции этого объекта. -// См. возвращаемое значение функции НастройкиПодключаемыхОтчетовИОбработок(). -// Дополнительно содержит следующие поля: -// * ПолноеИмя - Строка - Полное имя объекта метаданных. -// * Менеджер - ОбработкаМенеджер, ОтчетМенеджер - Менеджер объекта метаданных. -// -Функция НастройкиПоставщика(ПолноеИмя) Экспорт - ЧастиИмени = СтрРазделить(ПолноеИмя, "."); - Если ЧастиИмени.Количество() <> 2 Тогда - Возврат Неопределено; - КонецЕсли; - Вид = ВРег(ЧастиИмени[0]); - Имя = ЧастиИмени[1]; - Если Вид = "ОТЧЕТ" Тогда - Узел = Отчеты; - ИначеЕсли Вид = "ОБРАБОТКА" Тогда - Узел = Обработки; - Иначе - Возврат Неопределено; - КонецЕсли; - - Настройки = НастройкиПодключаемыхОтчетовИОбработок(); - Для Каждого КлючИЗначение Из Настройки Цикл - Настройки.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение.ПривестиЗначение()); - КонецЦикла; - - Менеджер = Узел[Имя]; - Попытка - Менеджер.ПриОпределенииНастроек(Настройки); - Исключение - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось прочитать настройки объекта %1 из модуля менеджера:'"), ПолноеИмя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Подключаемые команды'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.НайтиПоПолномуИмени(ПолноеИмя), - ПолноеИмя, - ТекстОшибки); - Возврат Неопределено; - КонецПопытки; - - Настройки.Вставить("ПолноеИмя", ПолноеИмя); - Настройки.Вставить("Менеджер", Менеджер); - Возврат Настройки; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - Обработчики обновления. -// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Ложь; - Обработчик.ОбщиеДанные = Истина; - Обработчик.УправлениеОбработчиками = Ложь; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Версия = "*"; - Обработчик.Процедура = "ПодключаемыеКоманды.ОперативноеОбновлениеОбщихДанныхКонфигурации"; - Обработчик.Приоритет = 90; -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - //////////////////////////////////////////////////////////////////////////////// // Обработчики событий. // Формирует таблицу общих настроек всех расширений, подключенных к объекту метаданных. -Функция ПодключенныеОбъекты(Источник, ПодключенныеОбъекты = Неопределено, НастройкиПрограммногоИнтерфейса = Неопределено) +Функция ПодключенныеОбъекты(ОписаниеИсточника, ПодключенныеОбъекты = Неопределено, НастройкиПрограммногоИнтерфейса = Неопределено) Экспорт + Источники = ДеревоИсточниковКоманд(); + Если ТипЗнч(ОписаниеИсточника) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Источник = Источники.Строки.Добавить(); + Источник.СсылкаМетаданных = ОписаниеИсточника; + Источник.ТипСсылкиДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОписаниеИсточника, "ЗначениеПустойСсылки"); + Иначе + Источник = ОписаниеИсточника; + КонецЕсли; + Если ПодключенныеОбъекты = Неопределено Тогда ПодключенныеОбъекты = ТаблицаПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); КонецЕсли; @@ -378,7 +247,7 @@ // * ПолноеИмя - Строка - Полное имя объекта метаданных. // * Менеджер - ОбработкаМенеджер, ОтчетМенеджер - Менеджер объекта метаданных. // -Функция НастройкиПодключаемогоОбъекта(ПолноеИмя, НастройкиПрограммногоИнтерфейса = Неопределено) +Функция НастройкиПодключаемогоОбъекта(ПолноеИмя, НастройкиПрограммногоИнтерфейса = Неопределено) Экспорт ЧастиИмени = СтрРазделить(ПолноеИмя, "."); Если ЧастиИмени.Количество() <> 2 Тогда Возврат Неопределено; @@ -420,7 +289,7 @@ // Массив - Массив - Массив типов. // ТипИлиОписаниеТипов - Тип, ОписаниеТипов - Добавляемые типы. // -Процедура ДополнитьМассивТипов(Массив, ТипИлиОписаниеТипов) +Процедура ДополнитьМассивТипов(Массив, ТипИлиОписаниеТипов) Экспорт Если ТипЗнч(ТипИлиОписаниеТипов) = Тип("ОписаниеТипов") Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Массив, ТипИлиОписаниеТипов.Типы(), Истина); ИначеЕсли ТипЗнч(ТипИлиОписаниеТипов) = Тип("Тип") И Массив.Найти(ТипИлиОписаниеТипов) = Неопределено Тогда @@ -444,7 +313,7 @@ // СтрокаДереваЗначений - Настройки объекта метаданных. См. описание 2 параметра // процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). // -Функция ЗарегистрироватьИсточник(ОбъектМетаданных, Источники, ПодключенныеОбъекты, НастройкиПрограммногоИнтерфейса) +Функция ЗарегистрироватьИсточник(ОбъектМетаданных, Источники, ПодключенныеОбъекты, НастройкиПрограммногоИнтерфейса) Экспорт Если ОбъектМетаданных = Неопределено Тогда Возврат Неопределено; КонецЕсли; @@ -480,6 +349,117 @@ Возврат Источник; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Шаблоны. + +// Шаблон сведений об объектах метаданных - источников команд. +// +// Возвращаемое значение: +// См. описание 2 параметра процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). +// +Функция ДеревоИсточниковКоманд() Экспорт + Результат = Новый ДеревоЗначений; + Результат.Колонки.Добавить("Метаданные"); + Результат.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Менеджер"); + Результат.Колонки.Добавить("СсылкаМетаданных"); + Результат.Колонки.Добавить("ТипСсылкиДанных"); + Результат.Колонки.Добавить("Вид", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("ЭтоЖурналДокументов", Новый ОписаниеТипов("Булево")); + Возврат Результат; +КонецФункции + +// Шаблон сведений об отчетах и обработках, подключенных к источникам команд. +// +// Возвращаемое значение: +// ТаблицаЗначений - Вспомогательные параметры. +// * ПолноеИмя - Строка - Полное имя объекта. Например: "Документ.ИмяДокумента". +// * Менеджер - Произвольный - Модуль менеджера объекта. +// * Размещение - Массив - Список объектов, к которым подключен отчет или обработка. +// * ТипСсылкиДанных - Тип, ОписаниеТипов - Тип объектов, к которым подключен отчет или обработка.. +// +Функция ТаблицаПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса = Неопределено) Экспорт + Если НастройкиПрограммногоИнтерфейса = Неопределено Тогда + НастройкиПрограммногоИнтерфейса = НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов(); + КонецЕсли; + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("Менеджер"); + Таблица.Колонки.Добавить("Метаданные"); + Таблица.Колонки.Добавить("ТипСсылкиДанных"); + + Для Каждого Настройка Из НастройкиПрограммногоИнтерфейса Цикл + Попытка + Таблица.Колонки.Добавить(Настройка.Ключ, Настройка.ОписаниеТипов); + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось зарегистрировать настройку программного интерфейса подключаемых объектов. + |Ключ: ""%1"", описание типов: ""%2"", описание ошибки: ""%3"".'"); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки, + Настройка.Ключ, + Строка(Настройка.ОписаниеТипов), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + КонецЦикла; + + Таблица.Индексы.Добавить("ПолноеИмя"); + + Возврат Таблица; +КонецФункции + +// Шаблон сведений об отчетах и обработках, подключенных к источникам команд. +// +// Возвращаемое значение: +// ТаблицаЗначений - Описание параметра Настройки процедуры ПриОпределенииНастроек объектов, +// включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. +// * Ключ - Строка - Имя настройки. +// * ОписаниеТипов - ОписаниеТипов - Тип настройки. +// * ВидыПодключаемыхОбъектов - Строка - Вид объекта метаданных в верхнем регистре. +// Например: "ОТЧЕТ" или "ОБРАБОТКА". +// +Функция НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов() Экспорт + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("ОписаниеТипов", Новый ОписаниеТипов("ОписаниеТипов")); + Таблица.Колонки.Добавить("ВидыПодключаемыхОбъектов", Новый ОписаниеТипов("Строка")); + + Настройка = Таблица.Добавить(); + Настройка.Ключ = "Размещение"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Массив"); + Настройка.ВидыПодключаемыхОбъектов = "Отчет, Обработка"; + + ИнтеграцияСтандартныхПодсистем.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(Таблица); + + ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(Таблица); + + Возврат Таблица; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Ложь; + Обработчик.ОбщиеДанные = Истина; + Обработчик.УправлениеОбработчиками = Ложь; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Версия = "*"; + Обработчик.Процедура = "ПодключаемыеКоманды.ОперативноеОбновлениеОбщихДанныхКонфигурации"; + Обработчик.Приоритет = 90; +КонецПроцедуры + +// Обработчик обновления кэшей, связанных с расширениями. +Функция ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт + Возврат ОперативноеОбновлениеОбщихДанных(Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений")); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Кэш формы ПриСозданииНаСервере. @@ -511,6 +491,10 @@ КонецЦикла; КонецЕсли; + Если ЭтоФормаОбъекта = Истина И ТипыИсточников.Количество() = 1 И МетаданныеРодителя <> Метаданные.НайтиПоТипу(ТипыИсточников[0]) Тогда + ЭтоФормаОбъекта = Ложь; // В форме объекта размещен список от другого типа объекта. + КонецЕсли; + Если ЭтоФормаОбъекта = Неопределено Тогда Если ТипыИсточников.Количество() > 1 Тогда ЭтоФормаОбъекта = Ложь; @@ -519,7 +503,7 @@ ЗаполнитьЗначенияСвойств(Коллекция, МетаданныеРодителя); Если МетаданныеФормы = Коллекция.ОсновнаяФормаСписка Тогда ЭтоФормаОбъекта = Ложь; - ИначеЕсли МетаданныеФормы = Коллекция.ОсновнаяФормаОбъекта Тогда + ИначеЕсли МетаданныеФормы = Коллекция.ОсновнаяФормаОбъекта И МетаданныеРодителя <> Метаданные.НайтиПоТипу(ТипыИсточников[0]) Тогда ЭтоФормаОбъекта = Истина; Иначе Если ВидВРег = ВРег("ЖурналДокументов") Тогда @@ -544,6 +528,7 @@ Контекст.Вставить("ЭтоФормаОбъекта", ЭтоФормаОбъекта); Контекст.Вставить("ФункциональныеОпции", КэшФормы.ФункциональныеОпции); + ИнтеграцияСтандартныхПодсистем.ПриОпределенииКомандПодключенныхКОбъекту(Контекст, Источники, ПодключенныеОбъекты, Команды); ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(Контекст, Источники, ПодключенныеОбъекты, Команды); // Фильтр команд по именам форм и функциональным опциям. @@ -556,6 +541,13 @@ Если Команда.ИзменяетВыбранныеОбъекты = Неопределено Тогда Команда.ИзменяетВыбранныеОбъекты = Ложь; КонецЕсли; + + // Фильтр по назначению. + Если Команда.Назначение = "ДляСписка" И Контекст.ЭтоФормаОбъекта Или Команда.Назначение = "ДляОбъекта" И Не Контекст.ЭтоФормаОбъекта Тогда + Команды.Удалить(Команда); + Продолжить; + КонецЕсли; + // Фильтр по именам форм. ВидимостьВФормах = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ВРег(Команда.ВидимостьВФормах), ",", Истина, Истина); Если ВидимостьВФормах.Количество() > 0 @@ -607,7 +599,7 @@ КэшФормы.ЕстьУсловияВидимости = КэшФормы.ЕстьУсловияВидимости Или Команда.ЕстьУсловияВидимости; Если ПустаяСтрока(Команда.Идентификатор) Тогда - Команда.Идентификатор = "Авто_" + КонтрольнаяСуммаСтрокой(Команда.Менеджер + "/" + Команда.ИмяФормы + "/" + Команда.Обработчик); + Команда.Идентификатор = "Авто_" + ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Команда.Менеджер + "/" + Команда.ИмяФормы + "/" + Команда.Обработчик); КонецЕсли; КонецЦикла; @@ -622,13 +614,16 @@ Виды.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); Виды.Колонки.Добавить("Картинка"); // Картинка, Неопределено. Виды.Колонки.Добавить("Отображение"); // ОтображениеКнопки, Неопределено. + Виды.Колонки.Добавить("ВидГруппыФормы"); // Вид с пустой группой для команд, которые следует размещать в командной панели. Вид = Виды.Добавить(); Вид.Имя = "КоманднаяПанель"; Вид.ИмяПодменю = ""; Вид.Порядок = 90; - + + ИнтеграцияСтандартныхПодсистем.ПриОпределенииВидовПодключаемыхКоманд(Виды); + ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд(Виды); Виды.Сортировать("Порядок Возр"); @@ -654,96 +649,7 @@ // Параметры: // Форма - УправляемаяФорма - форма, в которой необходимо разместить команды. // -Процедура ВывестиКоманды(Форма, ИспользуемыеПодменю, Команды) - Команды.Сортировать("Группа, Порядок Возр, Представление Возр"); - - ИмяГруппы = Неопределено; - ГруппаФормы = Неопределено; - КомандаФормы = Неопределено; - СчетчикКомандСАвтогенерируемымИменем = 0; - ИнформацияОВсехПодменю = Новый Соответствие; - - УдаляемыеКоманды = Новый Массив; - Для Каждого Команда Из Команды Цикл - // При смене группы сбрасываются счетчики. - Если ИмяГруппы <> Команда.Группа Тогда - ИмяГруппы = Команда.Группа; - ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы); - СчетчикКомандСАвтогенерируемымИменем = 0; - ИнформацияОПодменю = СформироватьИнформациюОПодменю(ИнформацияОВсехПодменю, ГруппаФормы); - КонецЕсли; - // Группы нет - команда не выводится. - Если ГруппаФормы = Неопределено Тогда - УдаляемыеКоманды.Добавить(Команда); - Продолжить; - КонецЕсли; - - // Уникальное имя добавляемого элемента. - Команда.ИмяВФорме = ОпределитьИмяКоманды(Форма, ИмяГруппы, Команда.Идентификатор, СчетчикКомандСАвтогенерируемымИменем); - - КомандаФормы = Форма.Команды.Добавить(Команда.ИмяВФорме); - КомандаФормы.Действие = "Подключаемый_ВыполнитьКоманду"; - КомандаФормы.Заголовок = Команда.Представление; - КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст; - Если ТипЗнч(Команда.Картинка) = Тип("Картинка") Тогда - КомандаФормы.Картинка = Команда.Картинка; - КонецЕсли; - Если ТипЗнч(Команда.СочетаниеКлавиш) = Тип("СочетаниеКлавиш") Тогда - КомандаФормы.СочетаниеКлавиш = Команда.СочетаниеКлавиш; - КонецЕсли; - - КнопкаФормы = Форма.Элементы.Добавить(Команда.ИмяВФорме, Тип("КнопкаФормы"), ГруппаФормы); - КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; - КнопкаФормы.ИмяКоманды = Команда.ИмяВФорме; - - ИнформацияОПодменю.КоличествоКоманд = ИнформацияОПодменю.КоличествоКоманд + 1; - ИнформацияОПодменю.ИмяПоследнейКнопки = Команда.ИмяВФорме; - КонецЦикла; - - // Формирование информации о подменю с 0 динамических команд и 1 фиксированной командой. - Для Каждого ИмяГруппы Из ИспользуемыеПодменю Цикл - СформироватьИнформациюОПодменю(ИнформацияОВсехПодменю, Форма.Элементы.Найти(ИмяГруппы)); - КонецЦикла; - - Для Каждого Команда Из УдаляемыеКоманды Цикл - Команды.Удалить(Команда); - КонецЦикла; - - // Смена вида групп, в которых всего 1 команда. - Для Каждого КлючИЗначение Из ИнформацияОВсехПодменю Цикл - ИнформацияОПодменю = КлючИЗначение.Значение; - Если ИнформацияОПодменю.КоличествоКоманд <> 1 Тогда - Продолжить; - КонецЕсли; - Подменю = Форма.Элементы.Найти(КлючИЗначение.Ключ); - Если ТипЗнч(Подменю) <> Тип("ГруппаФормы") Или Подменю.Вид <> ВидГруппыФормы.Подменю Тогда - Продолжить; - КонецЕсли; - КомандаФормы = Форма.Элементы.Найти(ИнформацияОПодменю.ИмяПоследнейКнопки); - Если ТипЗнч(КомандаФормы) <> Тип("КнопкаФормы") Тогда - Продолжить; - КонецЕсли; - Если Не ЗначениеЗаполнено(КомандаФормы.Картинка) Тогда - КомандаФормы.Картинка = Подменю.Картинка; - КонецЕсли; - Подменю.Вид = ВидГруппыФормы.ГруппаКнопок; - КонецЦикла; - - КомандаФормы = Форма.Команды.Найти("АдресНастроекКомандВоВременномХранилище"); - Если КомандаФормы = Неопределено Тогда - КомандаФормы = Форма.Команды.Добавить("АдресНастроекКомандВоВременномХранилище"); - КомандаФормы.Действие = ПоместитьВоВременноеХранилище(Команды, Форма.УникальныйИдентификатор); - Иначе - ПоместитьВоВременноеХранилище(Команды, КомандаФормы.Действие); - КонецЕсли; -КонецПроцедуры - -// Размещает подключенные команды в форме. -// -// Параметры: -// Форма - УправляемаяФорма - форма, в которой необходимо разместить команды. -// -Процедура ВывестиКоманды_2_4(Форма, Команды, ПараметрыРазмещения) +Процедура ВывестиКоманды(Форма, Команды, ПараметрыРазмещения) Элементы = Форма.Элементы; ПрефиксГрупп = ?(ЗначениеЗаполнено(ПараметрыРазмещения.ПрефиксГрупп), ПараметрыРазмещения.ПрефиксГрупп, ""); КоманднаяПанель = ПараметрыРазмещения.КоманднаяПанель; @@ -855,7 +761,9 @@ КомандаФормы = Форма.Команды.Добавить(Команда.ИмяВФорме); КомандаФормы.Действие = "Подключаемый_ВыполнитьКоманду"; КомандаФормы.Заголовок = Команда.Представление; - КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст; + КомандаФормы.Подсказка = КомандаФормы.Заголовок; + КомандаФормы.Отображение = ?(ЗначениеЗаполнено(Команда.ОтображениеКнопки), + Команда.ОтображениеКнопки, ОтображениеКнопки.КартинкаИТекст); Если ТипЗнч(Команда.Картинка) = Тип("Картинка") Тогда КомандаФормы.Картинка = Команда.Картинка; КонецЕсли; @@ -866,7 +774,6 @@ И СтрДлина(Команда.Представление) > 35 И ЗначениеЗаполнено(КомандаФормы.Картинка) Тогда КомандаФормы.Отображение = ОтображениеКнопки.Картинка; - КомандаФормы.Подсказка = КомандаФормы.Заголовок; КонецЕсли; КнопкаФормы = Элементы.Добавить(Команда.ИмяВФорме, Тип("КнопкаФормы"), ГруппаФормы); @@ -916,9 +823,9 @@ КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст; Иначе КомандаФормы.Отображение = ОтображениеКнопки.Картинка; - КомандаФормы.Подсказка = КомандаФормы.Заголовок; КонецЕсли; Подменю.Вид = ВидГруппыФормы.ГруппаКнопок; + КомандаФормы.Подсказка = КомандаФормы.Заголовок; Иначе // Добавление кнопок-заглушек, которые показываются когда в подменю скрыты все команды. ИмяКомандыЗаглушки = Подменю.Имя + "Заглушка"; @@ -965,10 +872,12 @@ Возврат ПодменюПоУмолчанию; КонецЕсли; Подменю = Элементы.Добавить(ИмяПодменю, Тип("ГруппаФормы"), КоманднаяПанель); - Подменю.Вид = ВидГруппыФормы.Подменю; + Подменю.Вид = ?(ЗначениеЗаполнено(ШаблонНового.ВидГруппыФормы), ШаблонНового.ВидГруппыФормы, ВидГруппыФормы.Подменю); Подменю.Заголовок = ШаблонНового.Заголовок; - Подменю.Картинка = ШаблонНового.Картинка; - Подменю.Отображение = ШаблонНового.Отображение; + Если ШаблонНового.ВидГруппыФормы = ВидГруппыФормы.Подменю Тогда + Подменю.Картинка = ШаблонНового.Картинка; + Подменю.Отображение = ШаблонНового.Отображение; + КонецЕсли; Иначе ГруппаПоУмолчанию = Подменю; Для Каждого Группа Из Подменю.ПодчиненныеЭлементы Цикл @@ -1018,39 +927,6 @@ Возврат Результат; КонецФункции -Функция СформироватьИнформациюОПодменю(Соответствие, ГруппаФормы) - Если ГруппаФормы = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - Подменю = ГруппаФормы; - Если ГруппаФормы.Вид = ВидГруппыФормы.ГруппаКнопок - И ТипЗнч(ГруппаФормы.Родитель) = Тип("ГруппаФормы") - И ГруппаФормы.Родитель.Вид = ВидГруппыФормы.Подменю Тогда - Подменю = ГруппаФормы.Родитель; - КонецЕсли; - ИнформацияОПодменю = Соответствие[НРег(Подменю.Имя)]; - Если ИнформацияОПодменю = Неопределено Тогда - ИнформацияОПодменю = Новый Структура("КоличествоКоманд, ИмяПоследнейКнопки", 0, ""); - Соответствие.Вставить(НРег(Подменю.Имя), ИнформацияОПодменю); - ЗарегистрироватьФиксированныеКомандыПодменю(Подменю, ИнформацияОПодменю); - КонецЕсли; - Возврат ИнформацияОПодменю; -КонецФункции - -Процедура ЗарегистрироватьФиксированныеКомандыПодменю(ГруппаФормы, ИнформацияОПодменю) - Для Каждого ЭлементФормы Из ГруппаФормы.ПодчиненныеЭлементы Цикл - Если ТипЗнч(ЭлементФормы) = Тип("КнопкаФормы") И ЭлементФормы.Видимость Тогда - ИнформацияОПодменю.КоличествоКоманд = ИнформацияОПодменю.КоличествоКоманд + 1; - ИнформацияОПодменю.ИмяПоследнейКнопки = ЭлементФормы.Имя; - ИначеЕсли ТипЗнч(ЭлементФормы) = Тип("ГруппаФормы") Тогда - ЗарегистрироватьФиксированныеКомандыПодменю(ЭлементФормы, ИнформацияОПодменю) - КонецЕсли; - Если ИнформацияОПодменю.КоличествоКоманд > 1 Тогда - Возврат; // Оптимизация. - КонецЕсли; - КонецЦикла; -КонецПроцедуры - Функция ОпределитьИмяКоманды(Форма, ИмяГруппы, ИдентификаторКоманды, СчетчикКомандСАвтогенерируемымИменем) Если ИмяСоответствуетТребованиямИменованияСвойств(ИдентификаторКоманды) Тогда ИмяКоманды = ИмяГруппы + "_" + ИдентификаторКоманды; @@ -1067,7 +943,7 @@ КонецФункции Функция ИмяСоответствуетТребованиямИменованияСвойств(Имя) - Если СтрНайти(Имя, " ") > 0 Или СтрНайти(Имя, ",") > 0 Или СтрНайти(Имя, "(") > 0 Тогда + Если ПустаяСтрока(Имя) Или СтрНайти(Имя, " ") > 0 Или СтрНайти(Имя, ",") > 0 Или СтрНайти(Имя, "(") > 0 Тогда Возврат Ложь; КонецЕсли; Попытка @@ -1112,21 +988,16 @@ КонецЕсли; ПодключенныеОбъекты = Новый Соответствие; + НастройкиПрограммногоИнтерфейса = НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов(); - ПодсистемаПодключаемыеОтчетыИОбработки = Метаданные.Подсистемы.Найти("ПодключаемыеОтчетыИОбработки"); - Если ПодсистемаПодключаемыеОтчетыИОбработки = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Не внедрена обязательная подсистема ""Подключаемые отчеты и обработки"". - |Подробнее см. документацию БСП.'"); - КонецЕсли; - - Состав = ПодсистемаПодключаемыеОтчетыИОбработки.Состав; + Состав = Метаданные.Подсистемы.ПодключаемыеОтчетыИОбработки.Состав; Для Каждого ОбъектМетаданныхПоставщика Из Состав Цикл СсылкаПодключенногоОМ = СтандартныеПодсистемыСервер.ИдентификаторОбъектаМетаданных(ОбъектМетаданныхПоставщика); Если ТипЗнч(СсылкаПодключенногоОМ) <> ФильтрПоТипуИдентификаторов Тогда Продолжить; КонецЕсли; ПолноеИмя = ОбъектМетаданныхПоставщика.ПолноеИмя(); - Настройки = НастройкиПоставщика(ПолноеИмя); + Настройки = НастройкиПодключаемогоОбъекта(ПолноеИмя, НастройкиПрограммногоИнтерфейса); Если Настройки = Неопределено Тогда Продолжить; КонецЕсли; @@ -1144,22 +1015,20 @@ КонецЦикла; Если ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - СтароеХранилищеЗначения = Константы.ПараметрыПодключаемыхКоманд.Получить(); + СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ПолноеИмяПодсистемы()); ИначеЕсли ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда - СтароеХранилищеЗначения = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы()); + СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы()); Иначе Возврат Результат; КонецЕсли; - НовоеХранилищеЗначения = Новый ХранилищеЗначения(Новый Структура("ПодключенныеОбъекты", ПодключенныеОбъекты)); - Если Не ОбщегоНазначения.ДанныеСовпадают(СтароеХранилищеЗначения, НовоеХранилищеЗначения) Тогда + НовоеЗначение = Новый Структура("ПодключенныеОбъекты", ПодключенныеОбъекты); + Если Не ОбщегоНазначения.ДанныеСовпадают(СтароеЗначение, НовоеЗначение) Тогда Результат.ЕстьИзменения = Истина; Если ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - КонстантаОбъект = Константы.ПараметрыПодключаемыхКоманд.СоздатьМенеджерЗначения(); - КонстантаОбъект.Значение = НовоеХранилищеЗначения; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(КонстантаОбъект, Ложь, Ложь); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ПолноеИмяПодсистемы(), НовоеЗначение); ИначеЕсли ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы(), НовоеХранилищеЗначения); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы(), НовоеЗначение); КонецЕсли; КонецЕсли; @@ -1167,87 +1036,6 @@ Возврат Результат; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Вызовы из модулей ПовтИсп. - -Функция НастройкиРазмещения(ИмяФормы, ИспользуемыеПодменю) Экспорт - ИспользуемыеПодменю = СтрРазделить(ИспользуемыеПодменю, ","); - - Команды = ТаблицаКоманд(); - - НастройкиФормы = Новый Структура; - НастройкиФормы.Вставить("ИмяФормы", ИмяФормы); - НастройкиФормы.Вставить("ИспользуемыеПодменю", ИспользуемыеПодменю); - - // Определение параметров объекта и заполнение списка команд. - НастройкиОбъекта = НастройкиОбъекта(); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяФормы); - Если ОбъектМетаданных <> Неопределено Тогда - ОбъектМетаданных = ОбъектМетаданных.Родитель(); - Если ОбъектМетаданных <> Неопределено Тогда - НастройкиОбъекта.Метаданные = ОбъектМетаданных; - НастройкиОбъекта.ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); - НастройкиОбъекта.Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(НастройкиОбъекта.ПолноеИмя); - НастройкиОбъекта.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НастройкиОбъекта.ПолноеИмя); - НастройкиОбъекта.ЭтоЖурналДокументов = ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных); - КонецЕсли; - КонецЕсли; - - НастройкиРасширений = НастройкиРасширенийПодключенныхКОбъектуМетаданных(НастройкиОбъекта.Ссылка); - - Попытка - ИнтеграцияСтандартныхПодсистем.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды); - Исключение - Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда - ВызватьИсключение; - Иначе - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При определении команд, подключенных к форме ""%1"", возникла ошибка: - |%2'"), - ИмяФормы, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Подключаемые команды'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - НастройкиОбъекта.Метаданные, - ИмяФормы, - ТекстОшибки); - Команды.Очистить(); - КонецЕсли; - КонецПопытки; - - // Фильтр команд по именам форм и функциональным опциям. - ЧастиИмени = СтрРазделить(ИмяФормы, "."); - КраткоеИмяФормы = ЧастиИмени[ЧастиИмени.ВГраница()]; - Количество = Команды.Количество(); - Для Номер = 1 По Количество Цикл - Команда = Команды[Количество - Номер]; - // Фильтр по именам форм. - ВидимостьВФормах = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ВРег(Команда.ВидимостьВФормах), ",", Истина, Истина); - Если ВидимостьВФормах.Количество() > 0 - И ВидимостьВФормах.Найти(ВРег(КраткоеИмяФормы)) = Неопределено - И ВидимостьВФормах.Найти(ВРег(ИмяФормы)) = Неопределено Тогда - Команды.Удалить(Команда); - Продолжить; - КонецЕсли; - // Фильтр по функциональным опциям. - ФункциональныеОпции = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Команда.ФункциональныеОпции, ",", Истина, Истина); - ВидимостьКоманды = ФункциональныеОпции.Количество() = 0; - Для Каждого ИмяОпции Из ФункциональныеОпции Цикл - Если ПолучитьФункциональнуюОпцию(СокрЛП(ИмяОпции)) Тогда - ВидимостьКоманды = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - Если Не ВидимостьКоманды Тогда - Команды.Удалить(Команда); - КонецЕсли; - КонецЦикла; - - НастройкиОбъекта.Вставить("Команды", Команды); - Возврат НастройкиОбъекта; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Вызовы из модулей ВызовСервера. @@ -1255,6 +1043,11 @@ Функция ОписаниеКоманды(ИмяКомандыВФорме, АдресНастроек) Экспорт Команды = ПолучитьИзВременногоХранилища(АдресНастроек); Команда = Команды.Найти(ИмяКомандыВФорме, "ИмяВФорме"); + Если Команда = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сведения о команде ""%1"" не найдены.'"), + ИмяКомандыВФорме); + КонецЕсли; ОписаниеКоманды = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Команда); Если ЗначениеЗаполнено(ОписаниеКоманды.ИмяФормы) Тогда @@ -1355,91 +1148,12 @@ //////////////////////////////////////////////////////////////////////////////// // Шаблоны. -// Шаблон первого параметра процедуры "ПриОпределенииНастроек" объектов, -// включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. -// -// Возвращаемое значение: -// Структура - Настройки интеграции объекта (отчета или обработки), -// включенного в состав подсистемы ПодключаемыеОтчетыИОбработки. -// -// * Размещение - Массив из ОбъектМетаданных - Массив объектов, к которым подключен этот объект. -// -// * ДобавитьКомандыПечати - Если Истина то в модуле менеджера следует определить процедуру по шаблону: -// // Заполняет список команд печати. -// // -// // Параметры: -// // КомандыПечати - ТаблицаЗначений - Подробнее см. в УправлениеПечатью.СоздатьКоллекциюКомандПечати(). -// // -// Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт -// // Код по добавлению команд печати. -// КонецПроцедуры -// -// * ДобавитьКомандыЗаполнения - Если Истина то в модуле менеджера следует определить процедуру по шаблону: -// // Определяет список команд заполнения. -// // -// // Параметры: -// // КомандыЗаполнения - ТаблицаЗначений - Таблица с командами заполнения. Для изменения. -// // См. описание 1 параметра процедуры ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения(). -// // Параметры - Структура - Вспомогательные параметры. Для чтения. -// // См. описание 2 параметра процедуры ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения(). -// // -// Процедура ДобавитьКомандыЗаполнения(КомандыЗаполнения, Параметры) Экспорт -// // Код по добавлению команд заполнения. -// КонецПроцедуры -// -Функция НастройкиПодключаемыхОтчетовИОбработок() - Настройки = Новый Структура; - Настройки.Вставить("Размещение", Новый ОписаниеТипов("Массив")); - ИнтеграцияСтандартныхПодсистем.ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(Настройки); - Возврат Настройки; -КонецФункции - // Шаблон таблицы подключаемых команд. // // Возвращаемое значение: // ТаблицаЗначений - Таблица с подключаемыми командами. -// Общие настройки: -// * Идентификатор - Строка - Идентификатор команды. -// Настройки внешнего вида: -// * Представление - Строка - Представление команды в форме. -// * Группа - Строка - Имя группы в командной панели, в которой будет выводиться эта команда. -// * Порядок - Число - Порядок размещения команды в подменю. Используется для настройки под конкретное рабочее место. -// * Картинка - Картинка - Картинка команды. Необязательный. -// * СочетаниеКлавиш - СочетаниеКлавиш - Сочетание клавиш для быстрого вызова команды. Необязательный. -// Настройки видимости: -// * ТипПараметра - ОписаниеТипов - Типы объектов, для которых предназначена эта команда. -// * ВидимостьВФормах - Строка - Имена форм через запятую, в которых должна отображаться команда. -// Используется когда состав команд отличается для различных форм. -// * ФункциональныеОпции - Строка - Имена функциональных опций через запятую, определяющих видимость команды. -// Настройки процесса выполнения: -// * ИмяСписка - Строка - Имя таблицы формы, связанной с динамическим списком, для которого выводится команда. -// Используется когда в форме несколько списков и команда предназначена для второстепенного списка. -// * МножественныйВыбор - Булево, Неопределено - Если Истина, то команда поддерживает множественный выбор. -// В этом случае в параметре выполнения будет передан список ссылок. -// Необязательный. Значение по умолчанию: Истина. -// * РежимЗаписи - Строка - Действия, связанные с записью объекта, которые выполняются перед обработчиком команды. -// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается вся форма. -// В этом режиме рекомендуется работать напрямую с формой, -// которая передается в структуре 2 параметра обработчика команды. -// ** "ЗаписыватьТолькоНовые" - Записывать только новые объекты. -// ** "Записывать" - Записывать новые и модифицированные объекты. -// ** "Проводить" - Проводить документы. -// Перед записью и проведением у пользователя запрашивается подтверждение. -// Необязательный. Значение по умолчанию: "ЗаписыватьТолькоНовые". -// * ТребуетсяРаботаСФайлами - Булево - Если Истина, то в веб-клиенте предлагается -// установить расширение работы с файлами. -// Необязательный. Значение по умолчанию: Ложь. -// Настройки обработчика: -// * Менеджер - Строка - Объект, отвечающий за выполнение команды. -// * ИмяФормы - Строка - Имя формы, которую требуется получить для выполнения команды. -// Если Обработчик не указан, то у формы вызывается метод "Открыть". -// * ПараметрыФормы - Неопределено, ФиксированнаяСтруктура - Необязательный. Параметры формы, указанной в ИмяФормы. -// * Обработчик - Строка - Описание процедуры, обрабатывающей основное действие команды. -// Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется когда процедура размещена в общем модуле. -// Формат "<ИмяПроцедуры>" используется в следующих случаях: -// - Если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. -// - Если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. -// * ДополнительныеПараметры - Неопределено, ФиксированнаяСтруктура - Необязательный. Параметры обработчика, указанного в Обработчик. +// См. описание 4го параметра (Команды) +// процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). // Функция ТаблицаКоманд() Таблица = Новый ТаблицаЗначений; @@ -1447,27 +1161,27 @@ Таблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); // Настройки внешнего вида: Таблица.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - Таблица.Колонки.Добавить("Группа", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("Подменю", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("Важность", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); Таблица.Колонки.Добавить("Картинка"); // Картинка. Таблица.Колонки.Добавить("СочетаниеКлавиш"); // СочетаниеКлавиш. + Таблица.Колонки.Добавить("ОтображениеКнопки"); // Настройки видимости и доступность: Таблица.Колонки.Добавить("ТипПараметра"); // ОписаниеТипов. Таблица.Колонки.Добавить("ВидимостьВФормах", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("Назначение", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("ФункциональныеОпции", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("УсловияВидимости", Новый ОписаниеТипов("Массив")); Таблица.Колонки.Добавить("ИзменяетВыбранныеОбъекты"); // Булево или Неопределено. // Настройки процесса выполнения: - Таблица.Колонки.Добавить("ИмяСписка", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("МножественныйВыбор"); // Булево или Неопределено. Таблица.Колонки.Добавить("РежимЗаписи", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("ТребуетсяРаботаСФайлами", Новый ОписаниеТипов("Булево")); // Настройки обработчика: Таблица.Колонки.Добавить("Менеджер", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("Обработчик", Новый ОписаниеТипов("Строка")); - Таблица.Колонки.Добавить("ДополнительныеПараметры"); // Структура или Неопределено. + Таблица.Колонки.Добавить("ДополнительныеПараметры", Новый ОписаниеТипов("Структура")); Таблица.Колонки.Добавить("ИмяФормы", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("ПараметрыФормы"); // Структура или Неопределено. Таблица.Колонки.Добавить("ИмяПараметраФормы", Новый ОписаниеТипов("Строка")); @@ -1478,123 +1192,6 @@ Возврат Таблица; КонецФункции -// Шаблон сведений об объекте метаданных, к которому принадлежит форма. -// -// Возвращаемое значение: -// Структура - Вспомогательные параметры. -// * Метаданные - ОбъектМетаданных - Метаданные объекта, к которому принадлежит форма. -// * ПолноеИмя - Строка - Полное имя объекта. Например: "Документ.ИмяДокумента". -// * Менеджер - Произвольный - Модуль менеджера объекта. -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта. -// * ЭтоЖурналДокументов - Булево - Истина если объект является журналом документов. -// -Функция НастройкиОбъекта() - Структура = Новый Структура("Метаданные, ПолноеИмя, Менеджер, Ссылка"); - Структура.Вставить("ЭтоЖурналДокументов", Ложь); - Возврат Структура; -КонецФункции - -// Шаблон второго параметра обработчика команды. -// -// Возвращаемое значение: -// Структура - Вспомогательные параметры. -// * ОписаниеКоманды - Структура - Описание команды. -// Структура аналогична таблице ПодключаемыеКоманды.ТаблицаКоманд(). -// ** Идентификатор - Строка - Идентификатор команды. -// ** Представление - Строка - Представление команды в форме. -// ** ДополнительныеПараметры - Неопределено, ФиксированнаяСтруктура - Дополнительные параметры команды. -// * Форма - УправляемаяФорма - Форма, из которой вызвана команда. -// * ЭтоФормаОбъекта - Булево - Истина, если команда вызвана из формы объекта. -// * Источник - ТаблицаФормы, ДанныеФормыСтруктура - Объект или список формы с полем "Ссылка". -// -Функция ПараметрыВыполненияКоманды() - Структура = Новый Структура("ОписаниеКоманды, Форма, Источник"); - Структура.Вставить("ЭтоФормаОбъекта", Ложь); - Возврат Структура; -КонецФункции - -// Шаблон сведений об объектах метаданных - источников команд. -// -// Возвращаемое значение: -// См. описание 2 параметра процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). -// -Функция ДеревоИсточниковКоманд() - Результат = Новый ДеревоЗначений; - Результат.Колонки.Добавить("Метаданные"); - Результат.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("Менеджер"); - Результат.Колонки.Добавить("СсылкаМетаданных"); - Результат.Колонки.Добавить("ТипСсылкиДанных"); - Результат.Колонки.Добавить("Вид", Новый ОписаниеТипов("Строка")); - Результат.Колонки.Добавить("ЭтоЖурналДокументов", Новый ОписаниеТипов("Булево")); - Возврат Результат; -КонецФункции - -// Шаблон сведений об отчетах и обработках, подключенных к источникам команд. -// -// Возвращаемое значение: -// ТаблицаЗначений - Вспомогательные параметры. -// * ПолноеИмя - Строка - Полное имя объекта. Например: "Документ.ИмяДокумента". -// * Менеджер - Произвольный - Модуль менеджера объекта. -// * Размещение - Массив - Список объектов, к которым подключен отчет или обработка. -// * ТипСсылкиДанных - Тип, ОписаниеТипов - Тип объектов, к которым подключен отчет или обработка.. -// -Функция ТаблицаПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса = Неопределено) - Если НастройкиПрограммногоИнтерфейса = Неопределено Тогда - НастройкиПрограммногоИнтерфейса = НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов(); - КонецЕсли; - Таблица = Новый ТаблицаЗначений; - Таблица.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); - Таблица.Колонки.Добавить("Менеджер"); - Таблица.Колонки.Добавить("Метаданные"); - Таблица.Колонки.Добавить("ТипСсылкиДанных"); - - Для Каждого Настройка Из НастройкиПрограммногоИнтерфейса Цикл - Попытка - Таблица.Колонки.Добавить(Настройка.Ключ, Настройка.ОписаниеТипов); - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось зарегистрировать настройку программного интерфейса подключаемых объектов. - |Ключ: ""%1"", описание типов: ""%2"", описание ошибки: ""%3"".'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстОшибки, - Настройка.Ключ, - Строка(Настройка.ОписаниеТипов), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение ТекстОшибки; - КонецПопытки; - КонецЦикла; - - Таблица.Индексы.Добавить("ПолноеИмя"); - - Возврат Таблица; -КонецФункции - -// Шаблон сведений об отчетах и обработках, подключенных к источникам команд. -// -// Возвращаемое значение: -// ТаблицаЗначений - Описание параметра Настройки процедуры ПриОпределенииНастроек объектов, -// включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. -// * Ключ - Строка - Имя настройки. -// * ОписаниеТипов - ОписаниеТипов - Тип настройки. -// * ВидыПодключаемыхОбъектов - Строка - Вид объекта метаданных в верхнем регистре. -// Например: "ОТЧЕТ" или "ОБРАБОТКА". -// -Функция НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов() - Таблица = Новый ТаблицаЗначений; - Таблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); - Таблица.Колонки.Добавить("ОписаниеТипов", Новый ОписаниеТипов("ОписаниеТипов")); - Таблица.Колонки.Добавить("ВидыПодключаемыхОбъектов", Новый ОписаниеТипов("Строка")); - - Настройка = Таблица.Добавить(); - Настройка.Ключ = "Размещение"; - Настройка.ОписаниеТипов = Новый ОписаниеТипов("Массив"); - Настройка.ВидыПодключаемыхОбъектов = "Отчет, Обработка"; - - ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(Таблица); - - Возврат Таблица; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Прочее. @@ -1605,7 +1202,7 @@ // Возвращает левую часть строки до разделителя. Правая часть строки возвращается в параметре Остаток. Функция СтрЛев(Знач Строка, Знач Разделитель, Остаток = Неопределено) - Позиция = Найти(Строка, Разделитель); + Позиция = СтрНайти(Строка, Разделитель); Если Позиция = 0 Тогда СтрокаДоРазделителя = Строка; Остаток = ""; @@ -1654,27 +1251,4 @@ Или ВидОбъектаМетаданныхНРег = НРег("ВнешнийОтчет"); КонецФункции -// Вычисляет контрольную сумму для произвольных данных по указанному алгоритму. -// -// Параметры: -// Данные - Произвольный - любое сериализуемое значение. -// Алгоритм - ХешФункция - алгоритм расчета контрольной суммы. По умолчанию, MD5. -// -// Возвращаемое значение: -// Строка - контрольная сумма строкой без пробелов, 32 байта. -Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) - Если Алгоритм = Неопределено Тогда - Алгоритм = ХешФункция.MD5; - КонецЕсли; - - ХешированиеДанных = Новый ХешированиеДанных(Алгоритм); - Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда - Данные = ОбщегоНазначения.ЗначениеВСтрокуXML(Данные); - КонецЕсли; - ХешированиеДанных.Добавить(Данные); - Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - - Возврат Результат; -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыВызовСервера/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыВызовСервера/Module.bsl index fcec6fc7f..6032a3534 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыВызовСервера/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность" (вызов сервера). -// Обслуживает подключаемые команды. -// Выполняется на сервере, может вызываться с клиента. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает описание команды по имени элемента формы. diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl index 743cee20d..8f93b95a7 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность" (клиент). -// Обслуживает подключаемые команды. -// Выполняется на клиенте. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик команды формы. @@ -12,51 +6,23 @@ // Форма - УправляемаяФорма - Форма, из которой выполняется команда. // Команда - КомандаФормы - Выполняемая команда. // Источник - ТаблицаФормы, ДанныеФормыСтруктура - Объект или список формы с полем "Ссылка". -// Версия_2_4 - Булево - Истина, если форма настроена для использования подключаемых команд версии 2.4.0.1 и выше. // -Процедура ВыполнитьКоманду(Форма, Команда, Источник, Версия_2_4 = Ложь) Экспорт +Процедура ВыполнитьКоманду(Форма, Команда, Источник) Экспорт + ИмяКоманды = Команда.Имя; + АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд; + ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек); - Если Версия_2_4 Тогда + Контекст = ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды(); + Контекст.ОписаниеКоманды = Новый Структура(ОписаниеКоманды); + Контекст.Форма = Форма; + Контекст.Источник = Источник; + Контекст.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура"); + Контекст.Вставить("ТребуетсяОпределитьСсылки", Истина); + Контекст.Вставить("ТребуетсяЗапись", Контекст.ЭтоФормаОбъекта И ОписаниеКоманды.РежимЗаписи <> "НеЗаписывать"); + Контекст.Вставить("ТребуетсяПроведение", ОписаниеКоманды.РежимЗаписи = "Проводить"); + Контекст.Вставить("ТребуетсяРаботаСФайлами", ОписаниеКоманды.ТребуетсяРаботаСФайлами И Не ПодключитьРасширениеРаботыСФайлами()); - ИмяКоманды = Команда.Имя; - АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд; - ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек); - - Контекст = ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды(); - Контекст.ОписаниеКоманды = Новый Структура(ОписаниеКоманды); - Контекст.Форма = Форма; - Контекст.Источник = Источник; - Контекст.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура"); - Контекст.Вставить("ТребуетсяОпределитьСсылки", Истина); - Контекст.Вставить("ТребуетсяЗапись", Контекст.ЭтоФормаОбъекта И ОписаниеКоманды.РежимЗаписи <> "НеЗаписывать"); - Контекст.Вставить("ТребуетсяПроведение", ОписаниеКоманды.РежимЗаписи = "Проводить"); - Контекст.Вставить("ТребуетсяРаботаСФайлами", ОписаниеКоманды.ТребуетсяРаботаСФайлами И Не ПодключитьРасширениеРаботыСФайлами()); - - ПродолжитьВыполнениеКоманды(Контекст); - - Иначе - - ИмяКоманды = Команда.Имя; - АдресНастроек = Форма.Команды.Найти("АдресНастроекКомандВоВременномХранилище").Действие; - ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек); - - Контекст = ПараметрыВыполненияКоманды(); - Контекст.ОписаниеКоманды = Новый Структура(ОписаниеКоманды); - Контекст.Форма = Форма; - Если Не Контекст.ЭтоФормаОбъекта И ЗначениеЗаполнено(ОписаниеКоманды.ИмяСписка) Тогда - Источник = Форма.Элементы.Найти(ОписаниеКоманды.ИмяСписка); - КонецЕсли; - Контекст.Источник = Источник; - Контекст.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура"); - Контекст.Вставить("ТребуетсяОпределитьСсылки", Истина); - Контекст.Вставить("ТребуетсяЗапись", Контекст.ЭтоФормаОбъекта И ОписаниеКоманды.РежимЗаписи <> "НеЗаписывать"); - Контекст.Вставить("ТребуетсяПроведение", ОписаниеКоманды.РежимЗаписи = "Проводить"); - Контекст.Вставить("ТребуетсяРаботаСФайлами", ОписаниеКоманды.ТребуетсяРаботаСФайлами И Не ПодключитьРасширениеРаботыСФайлами()); - - ПродолжитьВыполнениеКоманды(Контекст); - - КонецЕсли; - + ПродолжитьВыполнениеКоманды(Контекст); КонецПроцедуры // Запускает отложенный процесс обновления команд печати на форме. @@ -71,32 +37,6 @@ #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -//////////////////////////////////////////////////////////////////////////////// -// Шаблоны. - -// Шаблон второго параметра обработчика команды. -// -// Возвращаемое значение: -// Структура - Вспомогательные параметры. -// * ОписаниеКоманды - Структура - Описание команды. -// Структура аналогична таблице ПодключаемыеКоманды.ТаблицаКоманд(). -// ** Идентификатор - Строка - Идентификатор команды. -// ** Представление - Строка - Представление команды в форме. -// ** ДополнительныеПараметры - Неопределено, ФиксированнаяСтруктура - Дополнительные параметры команды. -// * Форма - УправляемаяФорма - Форма, из которой вызвана команда. -// * ЭтоФормаОбъекта - Булево - Истина, если команда вызвана из формы объекта. -// * Источник - ТаблицаФормы, ДанныеФормыСтруктура - Объект или список формы с полем "Ссылка". -// -Функция ПараметрыВыполненияКоманды() - Структура = Новый Структура("ОписаниеКоманды, Форма, Источник"); - Структура.Вставить("ЭтоФормаОбъекта", Ложь); - Возврат Структура; -КонецФункции - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции // Выполняет команду, подключенную к форме. @@ -123,7 +63,7 @@ |Выполнение действия ""%1"" возможно только после записи данных. |Данные будут записаны.'"), ОписаниеКоманды.Представление); - Обработчик = Новый ОписаниеОповещения("ПродолжитьВыполнениеКомандыПослеПодтверждениеЗаписи", ЭтотОбъект, Контекст); + Обработчик = Новый ОписаниеОповещения("ПродолжитьВыполнениеКомандыПослеПодтвержденияЗаписи", ЭтотОбъект, Контекст); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); Возврат; КонецЕсли; @@ -161,7 +101,10 @@ КонецЕсли; Контекст.Вставить("НепроведенныеДокументы", ИнформацияОДокументах.НеПроведенные); Обработчик = Новый ОписаниеОповещения("ПродолжитьВыполнениеКомандыПослеПодтверждениеПроведения", ЭтотОбъект, Контекст); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки); Иначе Если ИнформацияОДокументах.КоличествоНеПроведенных = 1 Тогда ТекстПредупреждения = НСтр("ru = 'Для выполнения команды необходимо предварительно провести документ. Недостаточно прав для проведения документа.'"); @@ -200,7 +143,8 @@ Если ЗначениеЗаполнено(ОписаниеКоманды.Обработчик) Тогда МассивПодстрок = СтрРазделить(ОписаниеКоманды.Обработчик, "."); Если МассивПодстрок.Количество() = 1 Тогда - КлиентскийМодуль = ПолучитьФорму(ОписаниеКоманды.ИмяФормы, ПараметрыФормы(Контекст, ПараметрКоманды), Контекст.Форма, Истина); + ПараметрыФормы = ПараметрыФормы(Контекст, ПараметрКоманды); + КлиентскийМодуль = ПолучитьФорму(ОписаниеКоманды.ИмяФормы, ПараметрыФормы, Контекст.Форма, Истина); ИмяПроцедуры = ОписаниеКоманды.Обработчик; Иначе КлиентскийМодуль = ОбщегоНазначенияКлиент.ОбщийМодуль(МассивПодстрок[0]); @@ -209,13 +153,14 @@ Обработчик = Новый ОписаниеОповещения(ИмяПроцедуры, КлиентскийМодуль, Контекст); ВыполнитьОбработкуОповещения(Обработчик, ПараметрКоманды); ИначеЕсли ЗначениеЗаполнено(ОписаниеКоманды.ИмяФормы) Тогда - ОткрытьФорму(ОписаниеКоманды.ИмяФормы, ПараметрыФормы(Контекст, ПараметрКоманды), Контекст.Форма, Истина); + ПараметрыФормы = ПараметрыФормы(Контекст, ПараметрКоманды); + ОткрытьФорму(ОписаниеКоманды.ИмяФормы, ПараметрыФормы, Контекст.Форма, Истина); КонецЕсли; КонецЕсли; КонецПроцедуры // Ветка процедуры, возникающая после диалога подтверждения записи. -Процедура ПродолжитьВыполнениеКомандыПослеПодтверждениеЗаписи(Ответ, Контекст) Экспорт +Процедура ПродолжитьВыполнениеКомандыПослеПодтвержденияЗаписи(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.ОК Тогда ОчиститьСообщения(); Контекст.Форма.Записать(); @@ -265,7 +210,7 @@ Если Контекст.ЭтоФормаОбъекта Тогда Контекст.Форма.Прочитать(); КонецЕсли; - Контекст.ОбновитьОтображениеДанных(); + Контекст.Форма.ОбновитьОтображениеДанных(); КонецЕсли; Если НепроведенныеДокументы.Количество() > 0 Тогда @@ -324,7 +269,21 @@ КонецЕсли; Контекст.ОписаниеКоманды.Удалить("ПараметрыФормы"); Результат.Вставить("ОписаниеКоманды", Контекст.ОписаниеКоманды); - Результат.Вставить("ПараметрКоманды", ПараметрКоманды); + Если ПустаяСтрока(Контекст.ОписаниеКоманды.ИмяПараметраФормы) Тогда + Результат.Вставить("ПараметрКоманды", ПараметрКоманды); + Иначе + МассивИмен = СтрРазделить(Контекст.ОписаниеКоманды.ИмяПараметраФормы, ".", Ложь); + Узел = Результат; + ВГраница = МассивИмен.ВГраница(); + Для Индекс = 0 По ВГраница-1 Цикл + Имя = СокрЛП(МассивИмен[Индекс]); + Если Не Узел.Свойство(Имя) Или ТипЗнч(Узел[Имя]) <> Тип("Структура") Тогда + Узел.Вставить(Имя, Новый Структура); + КонецЕсли; + Узел = Узел[Имя]; + КонецЦикла; + Узел.Вставить(МассивИмен[ВГраница], ПараметрКоманды); + КонецЕсли; Возврат Результат; КонецФункции diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентПовтИсп/Module.bsl index f70ea11ce..3ac4594c5 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентПовтИсп/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность" (клиент, повт. исп.). -// Обслуживает подключаемые команды. -// Выполняется на клиенте, возвращаемые значения кэшируются на время сеанса. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает описание команды по имени элемента формы. diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl index 5c004d32c..9221e5b8f 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl @@ -1,22 +1,31 @@ #Область ПрограммныйИнтерфейс -// Определение структуры параметра Настройки процедуры ПриОпределенииНастроек отчетов и обработок, -// включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. +// С помощью ПриОпределенииВидовПодключаемыхКоманд можно определить собственные виды подключаемых команд, +// помимо уже предусмотренных в стандартной поставке (печатные формы, отчеты и команды заполнения). // // Параметры: -// ВидыПодключаемыхКоманд - ТаблицаЗначений - Поддерживаемые виды команд. -// * Имя - Строка - Имя вида команд. Может соответствовать имени подсистемы, поставляющей команды. -// Должно удовлетворять требованиям именования переменных. -// Также должно быть уникальным (не совпадать с именами других видов). -// Подсистемами БСП зарезервированы следующие имена: -// "Печать", "Отчеты", "ЗаполнениеОбъектов". -// * ИмяПодменю - Строка - Имя подменю "по умолчанию" для размещения команд этого вида. -// * Заголовок - Строка - Наименование подменю. -// * Картинка - Картинка - Картинка подменю. -// * Отображение - ОтображениеКнопки - Режим отображения подменю. -// * Порядок - Число - Порядок подменю в командной панели по отношению к другим подменю. -// Используется при автоматическом создании подменю. +// ВидыПодключаемыхКоманд - ТаблицаЗначений - поддерживаемые виды команд: +// * Имя - Строка - имя вида команд. Должно удовлетворять требованиям именования переменных и +// быть уникальным (не совпадать с именами других видов). +// Может соответствовать имени подсистемы, отвечающей за вывод этих команд. +// Следующие имена зарезервированы: "Печать", "Отчеты", "ЗаполнениеОбъектов". +// * ИмяПодменю - Строка - имя подменю для размещения команд этого вида на формах объектов. +// * Заголовок - Строка - наименование подменю, выводимое пользователю. +// * Картинка - Картинка - картинка подменю. +// * Отображение - ОтображениеКнопки - режим отображения подменю. +// * Порядок - Число - порядок подменю в командной панели формы объекта по отношению +// к другим подменю. Используется при автоматическом создании подменю +// в форме объекта. // +// Пример: +// +// Вид = ВидыПодключаемыхКоманд.Добавить(); +// Вид.Имя = "Мотиваторы"; +// Вид.ИмяПодменю = "ПодменюМотиваторов"; +// Вид.Заголовок = НСтр("ru = 'Мотиваторы'"); +// Вид.Картинка = БиблиотекаКартинок.Информация; +// Вид.Отображение = ОтображениеКнопки.КартинкаИТекст; +// Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт @@ -91,88 +100,94 @@ КонецПроцедуры -// Заполнение списка команд, подключенных к форме. -// Событие возникает в процессе вызова модуля повторного использования. +// Вызывается однократно при первом формировании списка команд, выводимых в форме конкретного объекта конфигурации. +// Список добавленных команд следует вернуть в параметре Команды. +// Результат кэшируется с помощью модуля с повторными использованием возвращаемых значений (в разрезе имен форм). // // Параметры: -// НастройкиФормы - Структура - Сведения о форме, в которой выводятся команды. Для чтения. -// * ИмяФормы - Строка - Полное имя формы, в которой выводятся подключаемые команды. +// НастройкиФормы - Структура - сведения о форме, в которой выводятся команды. Для чтения. +// * ИмяФормы - Строка - полное имя формы, в которой выводятся подключаемые команды. +// Например, "Документ.Анкета.ФормаСписка". // -// Источники - ДеревоЗначений - Сведения об основных поставщиках команд этой формы. Для чтения. -// * Метаданные - ОбъектМетаданных - Метаданные объекта. -// * ПолноеИмя - Строка - Полное имя объекта. Например: "Документ.ИмяДокумента". -// * Вид - Строка - Вид объекта в верхнем регистре. Например: "СПРАВОЧНИК". -// * Менеджер - Произвольный - Модуль менеджера объекта. -// - Неопределено - Если у объекта нет модуля менеджера или если его не удалось получить. -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта метаданных. -// * ЭтоЖурналДокументов - Булево - Истина если объект является журналом документов. -// * ТипСсылкиДанных - Тип, ОписаниеТипов - Тип ссылки элемента. -// На 2 уровне могут располагаться источники, регистрируемые автоматически при регистрации владельца. +// Источники - ДеревоЗначений - сведения о поставщиках команд этой формы. +// На втором уровне дерева могут располагаться источники, регистрируемые автоматически при регистрации владельца. // Например, документы-регистраторы журналов. +// * Метаданные - ОбъектМетаданных - метаданные объекта. +// * ПолноеИмя - Строка - полное имя объекта. Например: "Документ.ИмяДокумента". +// * Вид - Строка - вид объекта в верхнем регистре. Например: "СПРАВОЧНИК". +// * Менеджер - Произвольный - модуль менеджера объекта, или Неопределено, если у объекта +// нет модуля менеджера или если его не удалось получить. +// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка объекта метаданных. +// * ЭтоЖурналДокументов - Булево - Истина если объект является журналом документов. +// * ТипСсылкиДанных - Тип, ОписаниеТипов - тип ссылки элемента. // -// ПодключенныеОтчетыИОбработки - ТаблицаЗначений - Настройки отчетов и обработок, -// подключенных к основным поставщикам команд. Для чтения. +// ПодключенныеОтчетыИОбработки - ТаблицаЗначений - отчеты и обработки, предоставляющие свои команды +// для объектов Источники: // * ПолноеИмя - Строка - Полное имя объекта метаданных. // * Менеджер - Произвольный - Модуль менеджера объекта метаданных. -// Состав колонок определяется в процедуре ПриОпределенииНастроекПрограммногоИнтерфейсаПодключаемыхОбъектов. +// Состав колонок см. в ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. // -// Команды - ТаблицаЗначений - Таблица команд для вывода в подменю. Для изменения. -// * Вид - Строка - Вид команды. -// Подробнее см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд(). -// * Идентификатор - Строка - Идентификатор команды. +// Команды - ТаблицаЗначений - записать в этот параметр сформированные команды для вывода в подменю: +// * Вид - Строка - вид команды. +// Подробнее см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +// * Идентификатор - Строка - идентификатор команды. // // Настройки внешнего вида: -// * Представление - Строка - Представление команды в форме. -// * Важность - Строка - Суффикс подгруппы в меню, в которой следует вывести эту команду. +// * Представление - Строка - представление команды в форме. +// * Важность - Строка - суффикс подгруппы в меню, в которой следует вывести эту команду. // Допустимо использовать: "Важное", "Обычное" и "СмТакже". -// * Порядок - Число - Порядок размещения команды в группе. Используется для настройки под конкретное рабочее место. -// Допустимо задавать в диапазоне от 1 до 100. По умолчанию порядок 50. -// * Картинка - Картинка - Картинка команды. Необязательный. -// * СочетаниеКлавиш - СочетаниеКлавиш - Сочетание клавиш для быстрого вызова команды. Необязательный. +// * Порядок - Число - порядок размещения команды в группе. Используется для настройки под конкретное +// рабочее место. Допустимо задавать в диапазоне от 1 до 100. По умолчанию порядок 50. +// * Картинка - Картинка - картинка команды. Необязательный. +// * СочетаниеКлавиш - СочетаниеКлавиш - сочетание клавиш для быстрого вызова команды. Необязательный. // // Настройки видимости и доступности: -// * ТипПараметра - ОписаниеТипов - Типы объектов, для которых предназначена эта команда. -// * ВидимостьВФормах - Строка - Имена форм через запятую, в которых должна отображаться команда. +// * ТипПараметра - ОписаниеТипов - типы объектов, для которых предназначена эта команда. +// * ВидимостьВФормах - Строка - имена форм через запятую, в которых должна отображаться команда. // Используется когда состав команд отличается для различных форм. -// * ФункциональныеОпции - Строка - Имена функциональных опций через запятую, определяющих видимость команды. -// * УсловияВидимости - Массив - Определяет видимость команды в зависимости от контекста. +// * Назначение - Строка - определяет вид форм, для которых предназначена команда. +// Принимаемые значения: +// "ДляСписка" - показывать команду только в форме списка, +// "ДляОбъекта" - показывать команду только в форме объекта. +// Если параметр не указан, то команда предназначена для любых видов форм. +// * ФункциональныеОпции - Строка - имена функциональных опций через запятую, определяющих видимость команды. +// * УсловияВидимости - Массив - определяет видимость команды в зависимости от контекста. // Для регистрации условий следует использовать процедуру // ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды(). // Условия объединяются по "И". -// * ИзменяетВыбранныеОбъекты - Булево - Определяет доступность команды в ситуации, +// * ИзменяетВыбранныеОбъекты - Булево - определяет доступность команды в ситуации, // когда у пользователя нет прав на изменение объекта. // Если Истина, то в описанной выше ситуации кнопка будет недоступна. // Необязательный. Значение по умолчанию: Ложь. // // Настройки процесса выполнения: -// * МножественныйВыбор - Булево - Если Истина, то команда поддерживает множественный выбор. +// * МножественныйВыбор - Булево - если Истина, то команда поддерживает множественный выбор. // В этом случае в параметре выполнения будет передан список ссылок. // Необязательный. Значение по умолчанию: Истина. // * РежимЗаписи - Строка - Действия, связанные с записью объекта, которые выполняются перед обработчиком команды. -// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается вся форма. -// В этом режиме рекомендуется работать напрямую с формой, +// ** "НеЗаписывать" - Объект не записывается, а в параметрах обработчика вместо ссылок передается +// вся форма. В этом режиме рекомендуется работать напрямую с формой, // которая передается в структуре 2 параметра обработчика команды. // ** "ЗаписыватьТолькоНовые" - Записывать новые объекты. // ** "Записывать" - Записывать новые и модифицированные объекты. // ** "Проводить" - Проводить документы. // Перед записью и проведением у пользователя запрашивается подтверждение. // Необязательный. Значение по умолчанию: "Записывать". -// * ТребуетсяРаботаСФайлами - Булево - Если Истина, то в веб-клиенте предлагается -// установить расширение работы с файлами. -// Необязательный. Значение по умолчанию: Ложь. +// * ТребуетсяРаботаСФайлами - Булево - если Истина, то в веб-клиенте предлагается +// установить расширение работы с файлами. Необязательный. Значение по умолчанию: Ложь. // // Настройки обработчика: -// * Менеджер - Строка - Объект, отвечающий за выполнение команды. -// * ИмяФормы - Строка - Имя формы, которую требуется получить для выполнения команды. +// * Менеджер - Строка - объект, отвечающий за выполнение команды. +// * ИмяФормы - Строка - имя формы, которую требуется получить для выполнения команды. // Если Обработчик не указан, то у формы вызывается метод "Открыть". -// * ИмяПараметраФормы - Строка - Имя параметра формы, в который следует передать ссылку или массив ссылок. -// * ПараметрыФормы - Неопределено, Структура - Необязательный. Параметры формы, указанной в ИмяФормы. -// * Обработчик - Строка - Описание процедуры, обрабатывающей основное действие команды. -// Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется когда процедура размещена в общем модуле. -// Формат "<ИмяПроцедуры>" используется в следующих случаях: -// - Если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. -// - Если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. -// * ДополнительныеПараметры - Структура - Необязательный. Параметры обработчика, указанного в Обработчик. +// * ИмяПараметраФормы - Строка - имя параметра формы, в который следует передать ссылку или массив ссылок. +// * ПараметрыФормы - Неопределено, Структура - параметры формы, указанной в ИмяФормы. Необязательный. +// * Обработчик - Строка - описание процедуры, обрабатывающей основное действие команды, в виде: +// "<ИмяОбщегоМодуля>.<ИмяПроцедуры>", если процедура размещена в общем модуле; +// либо "<ИмяПроцедуры>" - в следующих случаях: +// - если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; +// - если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. +// * ДополнительныеПараметры - Структура - параметры обработчика, указанного в Обработчик. Необязательный. // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl index 9049b6374..4f842e880 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl @@ -1,48 +1,38 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность" (сервер, повт. исп.). -// Обслуживает подключаемые команды. -// Выполняется на сервере, возвращаемые значения кэшируются на время сеанса. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция КэшФормы(Знач ИмяФормы, Знач ИсточникиЧерезЗапятую, Знач ЭтоФормаОбъекта) Экспорт Возврат ПодключаемыеКоманды.КэшФормы(ИмяФормы, ИсточникиЧерезЗапятую, ЭтоФормаОбъекта); КонецФункции -Функция НастройкиРазмещения(Знач ИмяФормы, Знач ИспользуемыеПодменю) Экспорт - Возврат ПодключаемыеКоманды.НастройкиРазмещения(ИмяФормы, ИспользуемыеПодменю); -КонецФункции - Функция Параметры() Экспорт - Параметры = Константы.ПараметрыПодключаемыхКоманд.Получить().Получить(); + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы("СтандартныеПодсистемы.ПодключаемыеКоманды"); Если Параметры = Неопределено Тогда ПодключаемыеКоманды.ОперативноеОбновлениеОбщихДанныхКонфигурации(); - Параметры = Константы.ПараметрыПодключаемыхКоманд.Получить().Получить(); + Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы("СтандартныеПодсистемы.ПодключаемыеКоманды"); Если Параметры = Неопределено Тогда Возврат Новый Структура("ПодключенныеОбъекты", Новый Соответствие); КонецЕсли; КонецЕсли; Если ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда - ХранилищеЗначения = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПодключаемыеКоманды.ПолноеИмяПодсистемы()); - Если ХранилищеЗначения = Неопределено Тогда - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - УстановитьПривилегированныйРежим(Истина); - Если Не ПривилегированныйРежим() Тогда - ВызватьИсключение НСтр("ru = 'Не удалось обновить вспомогательные данные расширений. Обратитесь к администратору.'"); - КонецЕсли; - КонецЕсли; + ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПодключаемыеКоманды.ПолноеИмяПодсистемы()); + Если ПараметрыРасширений = Неопределено Тогда ПодключаемыеКоманды.ПриЗаполненииВсехПараметровРаботыРасширений(); - ХранилищеЗначения = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПодключаемыеКоманды.ПолноеИмяПодсистемы()); - Если ХранилищеЗначения = Неопределено Тогда + ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПодключаемыеКоманды.ПолноеИмяПодсистемы()); + Если ПараметрыРасширений = Неопределено Тогда Возврат Параметры; КонецЕсли; КонецЕсли; - ПараметрыРасширений = ХранилищеЗначения.Получить(); ДополнитьСоответствиеСМассивами(Параметры.ПодключенныеОбъекты, ПараметрыРасширений.ПодключенныеОбъекты); КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + Возврат Параметры; КонецФункции diff --git a/SSL/src/CommonModules/ПодсистемыКонфигурацииПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПодсистемыКонфигурацииПереопределяемый/Module.bsl index ea3770c08..c94b1cceb 100644 --- a/SSL/src/CommonModules/ПодсистемыКонфигурацииПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПодсистемыКонфигурацииПереопределяемый/Module.bsl @@ -1,25 +1,19 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет список модулей библиотек и конфигурации, которые предоставляют // основные сведения о себе: имя, версия, список обработчиков обновления // а также зависимости от других библиотек. // -// Состав обязательных процедур модуля см. в области ПрограммныйИнтерфейс -// общего модуля ОбновлениеИнформационнойБазыБСП. +// Состав обязательных процедур такого модуля см. в общем модуле ОбновлениеИнформационнойБазыБСП +// (область ПрограммныйИнтерфейс). +// При этом сам модуль Библиотеки стандартных подсистем ОбновлениеИнформационнойБазыБСП +// не требуется явно добавлять в массив МодулиПодсистем. // // Параметры: // МодулиПодсистем - Массив - имена серверных общих модулей библиотек и конфигурации. -// Например: ОбновлениеИнформационнойБазыБРО - библиотека, -// ОбновлениеИнформационнойБазыБП - конфигурация. +// Например: "ОбновлениеИнформационнойБазыБРО" - библиотека, +// "ОбновлениеИнформационнойБазыБП" - конфигурация. // -// Примечание: модуль библиотеки стандартных подсистем ОбновлениеИнформационнойБазыБСП -// не требуется явно добавлять в массив МодулиПодсистем. -// Процедура ПриДобавленииПодсистем(МодулиПодсистем) Экспорт diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl index d70925f76..dd0184f5e 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Поиск и удаление дублей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Поиск дублей для указанного значения. @@ -12,7 +7,7 @@ // Например "Справочник.Номенклатура". Поддерживается поиск в справочниках, // планах видов характеристик, видах расчетов, планах счетов. // -// Элемент - Произвольный - объект с данными элемента, для которого производится поиск дублей. +// ЭталонныйОбъект - Произвольный - объект с данными элемента, для которого производится поиск дублей. // // ДополнительныеПараметры - Произвольный - Параметр для передачи в обработчики событий менеджера. // @@ -84,18 +79,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "ПоискИУдалениеДублей"); - КонецЕсли; - -КонецПроцедуры - Функция ПроверитьВозможностьЗаменыЭлементовСтрока(ПарыЗамен, ПараметрыЗамены) Экспорт Результат = ""; @@ -132,38 +115,19 @@ КонецФункции -#КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -#Область СлужебныеПроцедурыИФункции - -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.МестаИспользованияСсылок); КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // См. Обработка.ПоискИУдалениеДублей Функция ДоступныеИменаМетаРеквизитовОтбора(Знач МетаКоллекция) Результат = ""; @@ -190,6 +154,8 @@ Результат.Колонки.Добавить("Вхождения", Новый ОписаниеТипов("Число")); Результат.ЗаполнитьЗначения(1, "Вхождения"); + Результат.Индексы.Добавить("Ссылка"); + Результат.Свернуть("Ссылка", "Вхождения"); Для Каждого Ссылка Из НаборСсылок Цикл Если Результат.Найти(Ссылка, "Ссылка") = Неопределено Тогда diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl index 01ed15ea0..a8182246c 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Поиск и удаление дублей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму объединения элементов справочников, планов видов характеристик, видов расчетов и счетов. @@ -71,9 +66,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - Функция ИмяФормыОбработкиПоискИУдалениеДублей() Экспорт Возврат "Обработка.ПоискИУдалениеДублей.Форма.ПоискДублей"; КонецФункции diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl index efccb142c..1c0805453 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl @@ -1,33 +1,28 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Поиск и удаление дублей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определить объекты, в модулях менеджеров которых предусмотрена возможность параметризации -// алгоритма поиска дублей с помощью экспортных процедур ПараметрыПоискаДублей, ПриПоискеДублей -// и ВозможностьЗаменыЭлементов. +// алгоритма поиска дублей с помощью экспортных процедур ПараметрыПоискаДублей, ПриПоискеДублей +// и ВозможностьЗаменыЭлементов. // // Параметры: -// Объекты - Соответствие - Объекты, в модулях менеджеров которых размещены экспортные процедуры. -// ** Ключ - Строка - Полное имя объекта метаданных, подключенного к подсистеме "Поиск и удаление дублей". -// ** Значение - Строка - Имена экспортных процедур, определенных в модуле менеджера. -// Могут быть перечислены: -// "ПараметрыПоискаДублей", -// "ПриПоискеДублей", -// "ВозможностьЗаменыЭлементов". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены все процедуры. +// Объекты - Соответствие - объекты, в модулях менеджеров которых размещены экспортные процедуры. +// ** Ключ - Строка - полное имя объекта метаданных, подключенного к подсистеме "Поиск и удаление дублей". +// Например, "Справочник.Контрагенты". +// ** Значение - Строка - имена экспортных процедур, определенных в модуле менеджера. +// Могут быть указаны: +// "ПараметрыПоискаДублей", +// "ПриПоискеДублей", +// "ВозможностьЗаменыЭлементов". +// Каждое имя должно начинаться с новой строки. +// Если указана пустая строка, то в модуле менеджера определены все процедуры. // -// Примеры: +// Пример: +// 1. В справочнике определены все процедуры: +// Объекты.Вставить(Метаданные.Справочники.Контрагенты.ПолноеИмя(), ""); // -// 1. Определены все процедуры. -// Объекты.Вставить(Метаданные.Документы.ЗаказПокупателя.ПолноеИмя(), ""); -// -// 2. Определены процедуры ПараметрыПоискаДублей и ПриПоискеДублей. -// Объекты.Вставить(Метаданные.БизнесПроцессы.ЗаданиеСРолевойАдресацией.ПолноеИмя(), "ПараметрыПоискаДублей -// |ПриПоискеДублей"); +// 2. Определены только процедуры ПараметрыПоискаДублей и ПриПоискеДублей: +// Объекты.Вставить(Метаданные.Справочники.ЗадачиПроекта.ПолноеИмя(), "ПараметрыПоискаДублей +// |ПриПоискеДублей"); // Процедура ПриОпределенииОбъектовСПоискомДублей(Объекты) Экспорт diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl index fca32defd..ef080dc37 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Полнотекстовый поиск". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обновляет индекс полнотекстового поиска. @@ -22,6 +17,9 @@ // Возвращает, актуален ли индекс полнотекстового поиска. // Проверка функциональной опции "ИспользоватьПолнотекстовыйПоиск" выполняется в вызывающем коде. // +// Возвращаемое значение: +// Булево - Истина - полнотекстовый поиск содержит актуальные данные. +// Функция ИндексПоискаАктуален() Экспорт Возврат ( @@ -38,92 +36,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ПолнотекстовыйПоискСервер"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ПолнотекстовыйПоискСервер"); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") - Или Не Пользователи.ЭтоПолноправныйПользователь(, Истина) - Или Не ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") - Или МодульТекущиеДелаСервер.ДелоОтключено("ПолнотекстовыйПоискВДанных") Тогда - Возврат; - КонецЕсли; - - ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности(); - // Исключение, должна использоваться ТекущаяДата(). - Если ДатаАктуальностиИндекса > ТекущаяДата() Тогда - Интервал = НСтр("ru = 'менее одного дня'"); - Иначе - // Исключение, должна использоваться ТекущаяДата(). - Интервал = ОбщегоНазначения.ИнтервалВремениСтрокой(ДатаАктуальностиИндекса, ТекущаяДата()); - КонецЕсли; - // Исключение, должна использоваться ТекущаяДата(). - ДнейСПоследнегоОбновления = Цел((ТекущаяДата() - ДатаАктуальностиИндекса)/60/60/24); - - Раздел = Метаданные.Подсистемы["Администрирование"]; - ИдентификаторПолнотекстовыйПоиск = "ПолнотекстовыйПоискВДанных" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИдентификаторПолнотекстовыйПоиск; - Дело.ЕстьДела = (ДнейСПоследнегоОбновления >= 1 И Не ПолнотекстовыйПоиск.ИндексАктуален()); - Дело.Представление = НСтр("ru = 'Индекс полнотекстового поиска устарел'"); - Дело.Форма = "Обработка.ПанельАдминистрированияБСП.Форма.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов"; - Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Последнее обновление %1 назад'"), Интервал); - Дело.Владелец = Раздел; - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ПолнотекстовыйПоискСервер.ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск"; - Обработчик.Версия = "1.0.0.1"; - Обработчик.ОбщиеДанные = Истина; - -КонецПроцедуры - // Устанавливает значение константы ИспользоватьПолнотекстовыйПоиск. // Используется для синхронизации значения // функциональной опции "ИспользоватьПолнотекстовыйПоиск" @@ -143,11 +55,68 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. +Функция ИспользоватьПолнотекстовыйПоиск() Экспорт + + Возврат Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск; + +КонецФункции -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) + Или Не ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") + Или МодульТекущиеДелаСервер.ДелоОтключено("ПолнотекстовыйПоискВДанных") Тогда + Возврат; + КонецЕсли; + + ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности(); + ТекущаяДата = ТекущаяДата(); // Исключение, должна использоваться ТекущаяДата(). + Если ДатаАктуальностиИндекса > ТекущаяДата Тогда + Интервал = НСтр("ru = 'менее одного дня'"); + Иначе + Интервал = ОбщегоНазначения.ИнтервалВремениСтрокой(ДатаАктуальностиИндекса, ТекущаяДата); + КонецЕсли; + ДнейСПоследнегоОбновления = Цел((ТекущаяДата - ДатаАктуальностиИндекса)/60/60/24); + + Раздел = Метаданные.Подсистемы.Найти("Администрирование"); + Если Раздел <> Неопределено Тогда + Разделы = Новый Массив; + Разделы.Добавить(Раздел); + Иначе + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.ПолнотекстовыйПоискВДанных.ПолноеИмя()); + КонецЕсли; + + Для каждого Раздел Из Разделы Цикл + ИдентификаторПолнотекстовыйПоиск = "ПолнотекстовыйПоискВДанных" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторПолнотекстовыйПоиск; + Дело.ЕстьДела = (ДнейСПоследнегоОбновления >= 1 И Не ПолнотекстовыйПоиск.ИндексАктуален()); + Дело.Представление = НСтр("ru = 'Индекс полнотекстового поиска устарел'"); + Дело.Форма = "Обработка.ПанельАдминистрированияБСП.Форма.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов"; + Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Последнее обновление %1 назад'"), Интервал); + Дело.Владелец = Раздел; + КонецЦикла; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "ПолнотекстовыйПоискСервер.ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск"; + Обработчик.Версия = "1.0.0.1"; + Обработчик.ОбщиеДанные = Истина; + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеИндексаППД; @@ -158,12 +127,6 @@ Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск; КонецПроцедуры -Функция ИспользоватьПолнотекстовыйПоиск() Экспорт - - Возврат Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск; - -КонецФункции - #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl index 9d76bfe05..85c39b4a7 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl @@ -1,33 +1,29 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Полнотекстовый поиск". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Изменяет дерево с разделами полнотекстового поиска. +// Позволяет внести изменения в дерево с разделами полнотекстового поиска. +// По умолчанию, дерево разделов формируется на основании командного интерфейса конфигурации. // // Параметры: -// ДеревоРазделов - ДеревоЗначений, содержащие области поиска. Колонки: -// Раздел - Строка - Представление раздела: подсистемы или объекта метаданных. -// Пометка - Булево, флаг выбора объекта пользователем. Если установить флаг в значение -// Истина, то раздел по умолчанию будет отмечен в настройках. -// ЭтоОбъектМетаданных - Булево. Устанавливается в значение Истина, если это дочерний узел дерева, -// который не является подсистемой. -// ПутьКДанным - Строка - Предназначена для определения точного адреса строки в дереве. -// ОбъектМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных. Задается только для объектов метаданных, -// для подсистем остается пустым. -// Пример: -// НоваяОбластьПоиска = ДеревоРазделов.Строки.Добавить(); -// НоваяОбластьПоиска.Раздел = "МояОбластьПоиска"; +// РазделыПоиска - ДеревоЗначений - области поиска. Содержит колонки: +// ** Раздел - Строка - Представление раздела: подсистемы или объекта метаданных. +// ** Пометка - Булево, флаг выбора объекта пользователем. Если установить флаг в значение +// Истина, то раздел по умолчанию будет отмечен в настройках. +// ** ЭтоОбъектМетаданных - Булево - Устанавливается в значение Истина, если это дочерний узел дерева, +// который не является подсистемой. +// ** ПутьКДанным - Строка - Предназначена для определения точного адреса строки в дереве. +// ** ОбъектМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Задается только для объектов метаданных, +// для подсистем остается пустым. +// Пример: +// НовыйРазделПоиска = ДеревоРазделов.Строки.Добавить(); +// НовыйРазделПоиска.Раздел = "МояРазделПоиска"; // -// МетаданныеПодраздела = НоваяОбластьПоиска.Строки.Добавить(); +// МетаданныеПодраздела = НовыйРазделПоиска.Строки.Добавить(); // МетаданныеПодраздела.Раздел = "Валюты"; // МетаданныеПодраздела.ЭтоОбъектМетаданных = Истина; // МетаданныеПодраздела.ПутьКДанным = НоваяОбластьПоиска.Раздел + "," + МетаданныеПодраздела.Раздел; // МетаданныеПодраздела.ОбъектМД = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.Справочники.Валюты); // -Процедура ПриПолученииРазделовПолнотекстовогоПоиска(ДеревоРазделов) Экспорт +Процедура ПриПолученииРазделовПолнотекстовогоПоиска(РазделыПоиска) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl index 2e484c7e4..611160505 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl @@ -1,28 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Получение файлов из Интернета". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его по указанному пути на сервере. // // Параметры: // URL - Строка - url файла в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>. -// ПараметрыПолучения - Структура со свойствами: -// * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. -// * Пользователь - Строка - пользователь от имени которого установлено соединение. -// * Пароль - Строка - пароль пользователя от которого установлено соединение. -// * Порт - Число - порт сервера с которым установлено соединение. -// * Таймаут - Число - таймаут на получение файла, в секундах. -// * ЗащищенноеСоединение - Булево - признак использования защищенного соединения ftps или https. -// - ЗащищенноеСоединение - см. описание свойства ЗащищенноеСоединение объектов -// FTPСоединение и HTTPСоединение. -// - Неопределено - в случае, если защищенное соединение не используется. -// * ПассивноеСоединение - Булево - для случая ftp загрузки флаг указывает, что соединение должно пассивным -// (или активным). -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPЗапрос. -// * ИспользоватьАутентификациюОС - Булево - см. описание параметра ИспользоватьАутентификациюОС объекта HTTPСоединение. +// ПараметрыПолучения - Структура - см. ОбщегоНазначенияКлиентСервер.ПараметрыПолученияФайла. // ЗаписыватьОшибку - Булево - Признак необходимости записи ошибки в журнал регистрации при получении файла. // // Возвращаемое значение: @@ -30,74 +12,47 @@ // * Статус - Булево - результат получения файла. // * Путь - Строка - путь к файлу на сервере, ключ используется только если статус Истина. // * СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь. -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPОтвет. +// * Заголовки - Соответствие - см. в синтаксис-помощнике описание параметра Заголовки объекта HTTPОтвет. // * КодСостояния - Число - Добавляется при возникновении ошибки. -// См. описание параметра КодСостояния объекта HTTPОтвет. +// См. в синтаксис-помощнике описание параметра КодСостояния объекта HTTPОтвет. // Функция СкачатьФайлНаСервере(Знач URL, ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина) Экспорт - НастройкиПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.СтруктураПараметровПолученияФайла(); - - Если ПараметрыПолучения <> Неопределено Тогда - - ЗаполнитьЗначенияСвойств(НастройкиПолучения, ПараметрыПолучения); - - КонецЕсли; - НастройкаСохранения = Новый Соответствие; НастройкаСохранения.Вставить("МестоХранения", "Сервер"); - НастройкаСохранения.Вставить("Путь", НастройкиПолучения.ПутьДляСохранения); Возврат ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(URL, - НастройкиПолучения, НастройкаСохранения, ЗаписыватьОшибку); + ПараметрыПолучения, НастройкаСохранения, ЗаписыватьОшибку); КонецФункции -// Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его во временное хранилище.. +// Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его во временное хранилище. +// Примечание: После получения файла временное хранилище необходимо самостоятельно очистить +// при помощи метода УдалитьИзВременногоХранилища. Если этого не сделать, то файл будет находиться +// в памяти сервера до конца сеанса. // // Параметры: // URL - Строка - url файла в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>. -// ПараметрыПолучения - Структура со свойствами: -// * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. -// * Пользователь - Строка - пользователь от имени которого установлено соединение. -// * Пароль - Строка - пароль пользователя от которого установлено соединение. -// * Порт - Число - порт сервера с которым установлено соединение. -// * Таймаут - Число - таймаут на получение файла, в секундах. -// * ЗащищенноеСоединение - Булево - признак использования защищенного соединения ftps или https. -// - ЗащищенноеСоединение - см. описание свойства ЗащищенноеСоединение объектов -// FTPСоединение и HTTPСоединение. -// - Неопределено - в случае, если защищенное соединение не используется. -// * ПассивноеСоединение - Булево - для случая ftp загрузки флаг указывает, что соединение должно пассивным -// (или активным). -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPЗапрос. -// * ИспользоватьАутентификациюОС - Булево - см. описание параметра ИспользоватьАутентификациюОС объекта HTTPСоединение. +// ПараметрыПолучения - Структура - см. ОбщегоНазначенияКлиентСервер.ПараметрыПолученияФайла. // ЗаписыватьОшибку - Булево - Признак необходимости записи ошибки в журнал регистрации при получении файла. // // Возвращаемое значение: // Структура - Структура со свойствами: // * Статус - Булево - результат получения файла. -// * Путь - Строка - адрес временного хранилища с двоичными данными файла, ключ используется только если -// статус Истина. +// * Путь - Строка - адрес временного хранилища с двоичными данными файла, +// ключ используется только если статус Истина. // * СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь. -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPОтвет. +// * Заголовки - Соответствие - см. в синтаксис-помощнике описание параметра Заголовки объекта HTTPОтвет. // * КодСостояния - Число - Добавляется при возникновении ошибки. -// См. описание параметра КодСостояния объекта HTTPОтвет. +// См. в синтаксис-помощнике описание параметра КодСостояния объекта HTTPОтвет. // Функция СкачатьФайлВоВременноеХранилище(Знач URL, ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина) Экспорт - НастройкиПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.СтруктураПараметровПолученияФайла(); - - Если ПараметрыПолучения <> Неопределено Тогда - - ЗаполнитьЗначенияСвойств(НастройкиПолучения, ПараметрыПолучения); - - КонецЕсли; - НастройкаСохранения = Новый Соответствие; НастройкаСохранения.Вставить("МестоХранения", "ВременноеХранилище"); Возврат ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(URL, - НастройкиПолучения, НастройкаСохранения, ЗаписыватьОшибку); + ПараметрыПолучения, НастройкаСохранения, ЗаписыватьОшибку); КонецФункции @@ -134,7 +89,7 @@ // Функция НастройкиПроксиНаСервере() Экспорт - Если ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый Тогда + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда Возврат НастройкиПроксиНаКлиенте(); Иначе УстановитьПривилегированныйРежим(Истина); diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl index 0f8211f7d..d3d2aadfc 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl @@ -1,59 +1,41 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Получение файлов из Интернета". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его по указанному пути на клиенте. +// Недоступно при работе в веб-клиенте. При работе в веб-клиенте необходимо пользоваться аналогичными +// серверными процедурами для скачивания файлов. // // Параметры: // URL - Строка - url файла в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>. -// ПараметрыПолучения - Структура со свойствами: -// * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. -// * Пользователь - Строка - пользователь от имени которого установлено соединение. -// * Пароль - Строка - пароль пользователя от которого установлено соединение. -// * Порт - Число - порт сервера с которым установлено соединение. -// * Таймаут - Число - таймаут на получение файла, в секундах. -// * ЗащищенноеСоединение - Булево - признак использования защищенного соединения ftps или https. -// - ЗащищенноеСоединение - см. описание свойства ЗащищенноеСоединение объектов -// FTPСоединение и HTTPСоединение. -// - Неопределено - в случае, если защищенное соединение не используется. -// * ПассивноеСоединение - Булево - для случая ftp загрузки флаг указывает, что соединение должно пассивным -// (или активным). -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPЗапрос. -// * ИспользоватьАутентификациюОС - Булево - см. описание параметра ИспользоватьАутентификациюОС объекта HTTPСоединение. +// ПараметрыПолучения - Структура - см. ОбщегоНазначенияКлиентСервер.ПараметрыПолученияФайла. // ЗаписыватьОшибку - Булево - Признак необходимости записи ошибки в журнал регистрации при получении файла. // // Возвращаемое значение: // Структура - Структура со свойствами: // * Статус - Булево - результат получения файла. -// * Путь - Строка - путь к файлу на сервере, ключ используется только если статус Истина. +// * Путь - Строка - путь к файлу на клиенте, ключ используется только если статус Истина. // * СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь. -// * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPОтвет. +// * Заголовки - Соответствие - см. в синтаксис-помощнике описание параметра Заголовки объекта HTTPОтвет. // * КодСостояния - Число - Добавляется при возникновении ошибки. -// См. описание параметра КодСостояния объекта HTTPОтвет. +// См. в синтаксис-помощнике описание параметра КодСостояния объекта HTTPОтвет. // Функция СкачатьФайлНаКлиенте(Знач URL, Знач ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина) Экспорт - НастройкиПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.СтруктураПараметровПолученияФайла(); - - Если ПараметрыПолучения <> Неопределено Тогда - - ЗаполнитьЗначенияСвойств(НастройкиПолучения, ПараметрыПолучения); - - КонецЕсли; + #Если ВебКлиент Тогда + ВызватьИсключение НСтр("ru = 'Скачивание файлов на клиент недоступно при работе в веб-клиенте.'"); + #КонецЕсли НастройкаСохранения = Новый Соответствие; НастройкаСохранения.Вставить("МестоХранения", "Клиент"); - НастройкаСохранения.Вставить("Путь", НастройкиПолучения.ПутьДляСохранения); - Возврат ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(URL, НастройкиПолучения, НастройкаСохранения, ЗаписыватьОшибку); + Возврат ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(URL, ПараметрыПолучения, НастройкаСохранения, ЗаписыватьОшибку); КонецФункции // Открывает форму для ввода параметров прокси сервера. // +// Параметры: +// ПараметрыФормы - Структура - Параметры открываемой формы. +// Процедура ОткрытьФормуПараметровПроксиСервера(ПараметрыФормы = Неопределено) Экспорт ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", ПараметрыФормы); diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl index 4222f1686..31b89d4b1 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl @@ -1,23 +1,18 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Получение файлов из Интернета". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает объект ИнтернетПрокси для доступа в Интернет. // // Параметры: -// URLИлиПротокол - Строка - url в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>, -// либо идентификатор протокола (http, ftp, ...). +// URLИлиПротокол - Строка - url в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>, +// либо идентификатор протокола (http, ftp, ...). // // Возвращаемое значение: -// ИнтернетПрокси +// ИнтернетПрокси - Описывает параметры прокси-серверов для различных протоколов. // Функция ПолучитьПрокси(Знач URLИлиПротокол) Экспорт #Если Клиент Тогда - НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; + НастройкаПроксиСервера = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().НастройкиПроксиСервера; #Иначе НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); #КонецЕсли @@ -33,13 +28,13 @@ // Разделяет URL по составным частям: протокол, сервер, путь к ресурсу. // // Параметры: -// URL - Строка - ссылка на ресурс в сети Интернет. +// URL - Строка - ссылка на ресурс в сети Интернет. // // Возвращаемое значение: -// Структура: -// Протокол - Строка - протокол доступа к ресурсу. -// ИмяСервера - Строка - сервер, на котором располагается ресурс. -// ПутьКФайлуНаСервере - Строка - путь к ресурсу на сервере. +// Структура - Структура с полями: +// * Протокол - Строка - протокол доступа к ресурсу. +// * ИмяСервера - Строка - сервер, на котором располагается ресурс. +// * ПутьКФайлуНаСервере - Строка - путь к ресурсу на сервере. // Функция РазделитьURL(Знач URL) Экспорт @@ -55,6 +50,21 @@ КонецФункции // Разбирает строку URI на составные части и возвращает в виде структуры. +// На основе RFC 3986. +// +// Параметры: +// СтрокаURI - Строка - ссылка на ресурс в формате: +// <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>. +// +// Возвращаемое значение: +// Структура - Составные части URI согласно формату: +// * Схема - Строка - Схема URI. +// * Логин - Строка - Имя пользователя. +// * Пароль - Строка - Пароль пользователя. +// * ИмяСервера - Строка - Часть <хост>:<порт> входного параметра. +// * Хост - Строка - Имя сервера. +// * Порт - Строка - Порт сервера. +// * ПутьНаСервере - Строка - Часть <путь>?<параметры>#<якорь> входного параметра. // Функция СтруктураURI(Знач СтрокаURI) Экспорт @@ -62,6 +72,49 @@ КонецФункции +// Возвращает структуру параметров для получения файла из Интернета. +// +// Возвращаемое значение: +// Структура - со свойствами: +// * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. +// Не заполняется при сохранении файла во временное хранилище. +// * Пользователь - Строка - пользователь от имени которого установлено соединение. +// * Пароль - Строка - пароль пользователя от которого установлено соединение. +// * Порт - Число - порт сервера с которым установлено соединение. +// * Таймаут - Число - таймаут на получение файла, в секундах. +// * ЗащищенноеСоединение - Булево - признак использования защищенного соединения ftps или https. +// - ЗащищенноеСоединение - см. в синтаксис-помощнике описание свойства ЗащищенноеСоединение +// объектов FTPСоединение и HTTPСоединение. +// - Неопределено - в случае, если защищенное соединение не используется. +// +// Параметры только для http (https) соединения: +// * Заголовки - Соответствие - см. в синтаксис-помощнике описание параметра Заголовки объекта HTTPЗапрос. +// * ИспользоватьАутентификациюОС - Булево - см. в синтаксис-помощнике описание параметра +// ИспользоватьАутентификациюОС объекта HTTPСоединение. +// +// Параметры только для ftp (ftps) соединения: +// * ПассивноеСоединение - Булево - флаг указывает, что соединение должно пассивным (или активным). +// * УровеньИспользованияЗащищенногоСоединения - УровеньИспользованияЗащищенногоСоединенияFTP - См. описание +// одноименного свойства в синтаксис-помощнике платформы. Значение по умолчанию - Авто. +// +Функция ПараметрыПолученияФайла() Экспорт + + ПараметрыПолучения = Новый Структура; + ПараметрыПолучения.Вставить("ПутьДляСохранения", Неопределено); + ПараметрыПолучения.Вставить("Пользователь", Неопределено); + ПараметрыПолучения.Вставить("Пароль", Неопределено); + ПараметрыПолучения.Вставить("Порт", Неопределено); + ПараметрыПолучения.Вставить("Таймаут", 10); + ПараметрыПолучения.Вставить("ЗащищенноеСоединение", Неопределено); + ПараметрыПолучения.Вставить("ПассивноеСоединение", Неопределено); + ПараметрыПолучения.Вставить("Заголовки", Новый Соответствие()); + ПараметрыПолучения.Вставить("ИспользоватьАутентификациюОС", Ложь); + ПараметрыПолучения.Вставить("УровеньИспользованияЗащищенногоСоединения", Неопределено); + + Возврат ПараметрыПолучения; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -103,52 +156,28 @@ // либо адрес во временном хранилище // в случае неуспеха сообщение об ошибке. // -Функция ПодготовитьПолучениеФайла(Знач URL, Знач НастройкиПолучения, Знач НастройкаСохранения, Знач ЗаписыватьОшибку = Истина) Экспорт +Функция ПодготовитьПолучениеФайла(Знач URL, Знач ПараметрыПолучения, Знач НастройкаСохранения, Знач ЗаписыватьОшибку = Истина) Экспорт - НастройкаСоединения = Новый Соответствие; - НастройкаСоединения.Вставить("Пользователь", НастройкиПолучения.Пользователь); - НастройкаСоединения.Вставить("Пароль", НастройкиПолучения.Пароль); - НастройкаСоединения.Вставить("Порт", НастройкиПолучения.Порт); - НастройкаСоединения.Вставить("Таймаут", НастройкиПолучения.Таймаут); - НастройкаСоединения.Вставить("ЗащищенноеСоединение", НастройкиПолучения.ЗащищенноеСоединение); - НастройкаСоединения.Вставить("ИспользоватьАутентификациюОС", НастройкиПолучения.ИспользоватьАутентификациюОС); + НастройкиПолучения = ПараметрыПолученияФайла(); + Если ПараметрыПолучения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(НастройкиПолучения, ПараметрыПолучения); + КонецЕсли; - Протокол = РазделитьURL(URL).Протокол; - - Если Протокол = "ftp" Или Протокол = "ftps" Тогда - НастройкаСоединения.Вставить("ПассивноеСоединение", НастройкиПолучения.ПассивноеСоединение); - Иначе - НастройкаСоединения.Вставить("Заголовки", НастройкиПолучения.Заголовки); + Если НастройкаСохранения.Получить("МестоХранения") <> "ВременноеХранилище" Тогда + НастройкаСохранения.Вставить("Путь", НастройкиПолучения.ПутьДляСохранения); КонецЕсли; #Если Клиент Тогда - НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; + НастройкаПроксиСервера = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().НастройкиПроксиСервера; #Иначе НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); #КонецЕсли - Возврат ПолучитьФайлИзИнтернет(URL, НастройкаСохранения, НастройкаСоединения, + Возврат ПолучитьФайлИзИнтернет(URL, НастройкаСохранения, НастройкиПолучения, НастройкаПроксиСервера, ЗаписыватьОшибку); КонецФункции -Функция СтруктураПараметровПолученияФайла() Экспорт - - ПараметрыПолучения = Новый Структура; - ПараметрыПолучения.Вставить("ПутьДляСохранения", Неопределено); - ПараметрыПолучения.Вставить("Пользователь", Неопределено); - ПараметрыПолучения.Вставить("Пароль", Неопределено); - ПараметрыПолучения.Вставить("Порт", Неопределено); - ПараметрыПолучения.Вставить("Таймаут", 10); - ПараметрыПолучения.Вставить("ЗащищенноеСоединение", Неопределено); - ПараметрыПолучения.Вставить("ПассивноеСоединение", Неопределено); - ПараметрыПолучения.Вставить("Заголовки", Новый Соответствие()); - ПараметрыПолучения.Вставить("ИспользоватьАутентификациюОС", Ложь); - - Возврат ПараметрыПолучения; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. @@ -173,6 +202,7 @@ // Порт - порт прокси-сервера. // Пользователь - имя пользователя для авторизации на прокси-сервере. // Пароль - пароль пользователя. +// ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. // // НастройкаСохранения - соответствие - содержит параметры для сохранения скачанного файла. // МестоХранения - строка - может содержать @@ -192,28 +222,21 @@ Функция ПолучитьФайлИзИнтернет(Знач URL, Знач НастройкаСохранения, Знач НастройкаСоединения, Знач НастройкиПрокси, Знач ЗаписыватьОшибку, КоличествоПеренаправлений = 0) - // Объявление переменных перед первым использованием в качестве - // параметра метода Свойство, при анализе параметров получения файлов - // из ПараметрыПолучения. Содержат значения переданных параметров получения файла. - Перем ИмяСервера, ИмяПользователя, Пароль, Порт, - ЗащищенноеСоединение,ПассивноеСоединение, - ПутьКФайлуНаСервере, Протокол; - URLРазделенный = РазделитьURL(URL); ИмяСервера = URLРазделенный.ИмяСервера; ПутьКФайлуНаСервере = URLРазделенный.ПутьКФайлуНаСервере; Протокол = URLРазделенный.Протокол; - ЗащищенноеСоединение = НастройкаСоединения.Получить("ЗащищенноеСоединение"); - ПассивноеСоединение = НастройкаСоединения.Получить("ПассивноеСоединение"); - - ИмяПользователя = НастройкаСоединения.Получить("Пользователь"); - ПарольПользователя = НастройкаСоединения.Получить("Пароль"); - Порт = НастройкаСоединения.Получить("Порт"); - Таймаут = НастройкаСоединения.Получить("Таймаут"); - Заголовки = НастройкаСоединения.Получить("Заголовки"); - ИспользоватьАутентификациюОС = НастройкаСоединения.Получить("ИспользоватьАутентификациюОС"); + ЗащищенноеСоединение = НастройкаСоединения.ЗащищенноеСоединение; + ПассивноеСоединение = НастройкаСоединения.ПассивноеСоединение; + ИмяПользователя = НастройкаСоединения.Пользователь; + ПарольПользователя = НастройкаСоединения.Пароль; + Порт = НастройкаСоединения.Порт; + Таймаут = НастройкаСоединения.Таймаут; + Заголовки = НастройкаСоединения.Заголовки; + ИспользоватьАутентификациюОС = НастройкаСоединения.ИспользоватьАутентификациюОС; + УровеньИспользованияЗащищенногоСоединения = НастройкаСоединения.УровеньИспользованияЗащищенногоСоединения; Если (Протокол = "https" Или Протокол = "ftps") И ЗащищенноеСоединение = Неопределено Тогда ЗащищенноеСоединение = Истина; @@ -240,7 +263,7 @@ Если ИспользуетсяFTPПротокол Тогда Попытка Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, ПарольПользователя, - Прокси, ПассивноеСоединение, Таймаут, ЗащищенноеСоединение); + Прокси, ПассивноеСоединение, Таймаут, ЗащищенноеСоединение, УровеньИспользованияЗащищенногоСоединения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Не удалось установить FTP-соединение с сервером %1:'") + Символы.ПС + "%2"; @@ -287,10 +310,14 @@ HTTPОтвет = Соединение.Получить(HTTPЗапрос, ПутьДляСохранения); Если HTTPОтвет.КодСостояния = 301 Или HTTPОтвет.КодСостояния = 302 Тогда - НовыйURL = HTTPОтвет.Заголовки["Location"]; Если КоличествоПеренаправлений > 20 Тогда ВызватьИсключение НСтр("ru = 'Обнаружена циклическая переадресация.'"); КонецЕсли; + НовыйURL = HTTPОтвет.Заголовки["Location"]; + Если Не СтрНачинаетсяС(НовыйURL, "http") Тогда + НовыйURL = ИмяСервера + НовыйURL; + КонецЕсли; + Возврат ПолучитьФайлИзИнтернет(НовыйURL, НастройкаСохранения, НастройкаСоединения, НастройкиПрокси, ЗаписыватьОшибку, КоличествоПеренаправлений + 1); КонецЕсли; @@ -309,7 +336,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = НСтр("ru = 'Не удалось получить файл %1 с сервера:'") + Символы.ПС + "%2"; + СообщениеОбОшибке = НСтр("ru = 'Не удалось получить файл %1 с сервера:'") + Символы.ПС + "%2"; Если ЗаписыватьОшибку Тогда ЗаписатьОшибкуВЖурналРегистрации( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, URL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl index 971523571..6adbe1ba1 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl @@ -1,38 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Получение файлов из Интернета". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). +// Обработчики событий подсистем конфигурации. -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ПолучениеФайловИзИнтернетаСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ПолучениеФайловИзИнтернетаСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииИспользованияПрофилейБезопасности"].Добавить( - "ПолучениеФайловИзИнтернетаСлужебный"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -41,20 +12,14 @@ КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт Параметры.Вставить("НастройкиПроксиСервера", ПолучениеФайловИзИнтернета.НастройкиПроксиНаКлиенте()); КонецПроцедуры -// Вызывается при включении использования для информационной базы профилей безопасности. -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности. Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт // Сброс настроек прокси-сервера на системные. diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl index 2cbc0c745..e400bfb06 100644 --- a/SSL/src/CommonModules/Пользователи/Module.bsl +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -1,21 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// // Основные процедуры и функции. -// См. одноименную функцию в общем модуле ПользователиКлиентСервер. +// См. ПользователиКлиентСервер.АвторизованныйПользователь Функция АвторизованныйПользователь() Экспорт Возврат ПользователиКлиентСервер.АвторизованныйПользователь(); КонецФункции -// См. одноименную функцию в общем модуле ПользователиКлиентСервер. +// См. ПользователиКлиентСервер.ТекущийПользователь Функция ТекущийПользователь() Экспорт Возврат ПользователиКлиентСервер.ТекущийПользователь(); @@ -72,7 +67,7 @@ КонецЕсли; Если ПроверитьРольАдминистратораСистемы - И Не Роли.Содержит(РольАдминистратораСистемы(Истина)) Тогда + И Не Роли.Содержит(Метаданные.Роли.АдминистраторСистемы) Тогда Возврат Ложь; КонецЕсли; @@ -153,7 +148,7 @@ МассивИменРолей = СтрРазделить(ИменаРолей, ",", Ложь); ТребуетсяРольАдминистраторСистемы = Ложь; - НазначениеРолей = ПользователиСлужебныйПовтИсп.Параметры().НазначениеРолей; + НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей(); Для Каждого ИмяРоли Из МассивИменРолей Цикл Если НазначениеРолей.ТолькоДляАдминистраторовСистемы.Получить(ИмяРоли) <> Неопределено Тогда @@ -249,7 +244,7 @@ // Возвращает список пользователей, групп пользователей, внешних пользователей и // групп внешних пользователей. -// Используется в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. +// Для использования в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. // // Параметры: // Текст - Строка - символы введенные пользователем. @@ -258,11 +253,14 @@ // Если ФО ИспользоватьГруппыПользователей отключена, параметр игнорируется. // // ВключаяВнешнихПользователей - Неопределено, Булево - когда Неопределено, используется значение, -// возвращаемое функцией ВнешниеПользователи.ИспользоватьВнешнихПользователей(). +// возвращаемое функцией ВнешниеПользователи.ИспользоватьВнешнихПользователей. // // БезПользователей - Булево - если Истина, то элементы справочника Пользователи // исключаются из результата. // +// Возвращаемое значение: +// СписокЗначений - список значений и представлений пользователей, удовлетворяющих параметрам. +// Функция СформироватьДанныеВыбораПользователя(Знач Текст, Знач ВключаяГруппы = Истина, Знач ВключаяВнешнихПользователей = Неопределено, @@ -354,18 +352,25 @@ КонецФункции -// Процедура ЗаполнитьНомераКартинокПользователей заполняет номера картинок -// пользователей, групп пользователей, внешних пользователей и групп внешних пользователей. +// Заполняет номера картинок пользователей, групп пользователей, внешних пользователей и групп внешних пользователей +// во всех или указанной (см. параметр ИдентификаторСтроки) строк коллекции ТаблицаИлиДерево. // // Параметры: -// Таблица - ДанныеФормыКоллекция, ДанныеФормыДерево - список для заполнения. -// ИмяПоляПользователь - Строка - имя поля содержащего ссылку на пользователя, группу пользователей, -// внешнего пользователя или группу внешних пользователей. -// ИмяПоляНомераКартинки - Строка - имя поля содержащего номер картинки, который нужно установить. -// ИдентификаторСтроки - Неопределено, Число - идентификатор строки (не порядковый номер), -// когда Неопределено, заполнить картинки для всех строк таблицы. +// ТаблицаИлиДерево - ДанныеФормыКоллекция, ДанныеФормыДерево - коллекция для заполнения. +// ИмяПоляПользователь - Строка - имя колонки в коллекции ТаблицаИлиДерево, содержащего ссылку на пользователя, +// группу пользователей, внешнего пользователя или группу внешних пользователей. +// По ее значению вычисляется номер картинки. +// ИмяПоляНомераКартинки - Строка - имя колонки в коллекции ТаблицаИлиДерево с номером картинки, +// которое требуется заполнить. +// ИдентификаторСтроки - Неопределено, Число - идентификатор строки (не порядковый номер), которую требуется +// заполнить (у дерева также будут заполнены и дочерние строки); +// если Неопределено, то картинки будут заполнены во всех строках. +// ОбработатьИерархиюВторогоИТретьегоУровней - Булево - если Истина и в параметре ТаблицаИлиДерево указана +// коллекция типа ДанныеФормыДерево, то +// будут заполнены поля по четвертый уровень дерева включительно; +// иначе будут заполнены поля только на первом и втором уровне дерева. // -Процедура ЗаполнитьНомераКартинокПользователей(Знач Таблица, +Процедура ЗаполнитьНомераКартинокПользователей(Знач ТаблицаИлиДерево, Знач ИмяПоляПользователь, Знач ИмяПоляНомераКартинки, Знач ИдентификаторСтроки = Неопределено, @@ -379,20 +384,21 @@ ИначеЕсли ТипЗнч(ИдентификаторСтроки) = Тип("Массив") Тогда МассивСтрок = Новый Массив; Для каждого Идентификатор Из ИдентификаторСтроки Цикл - МассивСтрок.Добавить(Таблица.НайтиПоИдентификатору(Идентификатор)); + МассивСтрок.Добавить(ТаблицаИлиДерево.НайтиПоИдентификатору(Идентификатор)); КонецЦикла; Иначе МассивСтрок = Новый Массив; - МассивСтрок.Добавить(Таблица.НайтиПоИдентификатору(ИдентификаторСтроки)); + МассивСтрок.Добавить(ТаблицаИлиДерево.НайтиПоИдентификатору(ИдентификаторСтроки)); КонецЕсли; - Если ТипЗнч(Таблица) = Тип("ДанныеФормыДерево") Тогда + Если ТипЗнч(ТаблицаИлиДерево) = Тип("ДанныеФормыДерево") Тогда Если МассивСтрок = Неопределено Тогда - МассивСтрок = Таблица.ПолучитьЭлементы(); + МассивСтрок = ТаблицаИлиДерево.ПолучитьЭлементы(); КонецЕсли; ТаблицаПользователей = Новый ТаблицаЗначений; - ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); - Для каждого Строка Из МассивСтрок Цикл + ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, + Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); + Для Каждого Строка Из МассивСтрок Цикл ТаблицаПользователей.Добавить()[ИмяПоляПользователь] = Строка[ИмяПоляПользователь]; Если ОбработатьИерархиюВторогоИТретьегоУровней Тогда Для каждого Строка2 Из Строка.ПолучитьЭлементы() Цикл @@ -403,20 +409,29 @@ КонецЦикла; КонецЕсли; КонецЦикла; - ИначеЕсли ТипЗнч(Таблица) = Тип("ДанныеФормыКоллекция") Тогда + ИначеЕсли ТипЗнч(ТаблицаИлиДерево) = Тип("ДанныеФормыКоллекция") Тогда Если МассивСтрок = Неопределено Тогда - МассивСтрок = Таблица; + МассивСтрок = ТаблицаИлиДерево; КонецЕсли; ТаблицаПользователей = Новый ТаблицаЗначений; - ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); - Для каждого Строка Из МассивСтрок Цикл + ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, + Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); + Для Каждого Строка Из МассивСтрок Цикл + ТаблицаПользователей.Добавить()[ИмяПоляПользователь] = Строка[ИмяПоляПользователь]; + КонецЦикла; + ИначеЕсли ТипЗнч(ТаблицаИлиДерево) = Тип("Массив") Тогда + МассивСтрок = ТаблицаИлиДерево; + ТаблицаПользователей = Новый ТаблицаЗначений; + ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, + Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); + Для Каждого Строка Из ТаблицаИлиДерево Цикл ТаблицаПользователей.Добавить()[ИмяПоляПользователь] = Строка[ИмяПоляПользователь]; КонецЦикла; Иначе Если МассивСтрок = Неопределено Тогда - МассивСтрок = Таблица; + МассивСтрок = ТаблицаИлиДерево; КонецЕсли; - ТаблицаПользователей = Таблица.Выгрузить(МассивСтрок, ИмяПоляПользователь); + ТаблицаПользователей = ТаблицаИлиДерево.Выгрузить(МассивСтрок, ИмяПоляПользователь); КонецЕсли; Запрос = Новый Запрос(СтрЗаменить( @@ -464,7 +479,7 @@ Запрос.УстановитьПараметр("Пользователи", ТаблицаПользователей); НомераКартинок = Запрос.Выполнить().Выгрузить(); - Для каждого Строка Из МассивСтрок Цикл + Для Каждого Строка Из МассивСтрок Цикл НайденнаяСтрока = НомераКартинок.Найти(Строка[ИмяПоляПользователь], "Пользователь"); Строка[ИмяПоляНомераКартинки] = ?(НайденнаяСтрока = Неопределено, -2, НайденнаяСтрока.НомерКартинки); Если ОбработатьИерархиюВторогоИТретьегоУровней Тогда @@ -503,7 +518,7 @@ // Функция СоздатьАдминистратора(ПользовательИБ = Неопределено) Экспорт - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ВызватьИсключение НСтр("ru = 'Справочник Пользователи недоступен в неразделенном режиме.'"); КонецЕсли; @@ -514,7 +529,7 @@ ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); Если ПользователиИБ.Количество() = 0 Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение НСтр("ru = 'Невозможно автоматически создать первого администратора области данных.'"); КонецЕсли; @@ -523,7 +538,7 @@ ПользовательИБ.ПолноеИмя = ПользовательИБ.Имя; ПользовательИБ.Роли.Очистить(); ПользовательИБ.Роли.Добавить(Метаданные.Роли.ПолныеПрава); - РольАдминистратораСистемы = РольАдминистратораСистемы(); + РольАдминистратораСистемы = Метаданные.Роли.АдминистраторСистемы; Если НЕ ПользовательИБ.Роли.Содержит(РольАдминистратораСистемы) Тогда ПользовательИБ.Роли.Добавить(РольАдминистратораСистемы); КонецЕсли; @@ -537,44 +552,24 @@ КонецЕсли; КонецЦикла; // Первый администратор создан некорректно. - Если Метаданные.Роли.ПолныеПрава = РольАдминистратораСистемы(Истина) Тогда - ТекстОшибки = - НСтр("ru = 'Список пользователей информационной базы не пустой, однако - |не удалось найти ни одного пользователя с ролью Полные права. - | - |Вероятно, пользователи создавались в конфигураторе. - |Требуется назначить роль Полные права хотя бы одному пользователю.'"); - Иначе - ТекстОшибки = - НСтр("ru = 'Список пользователей информационной базы не пустой, однако не удалось - |найти ни одного пользователя с ролями Полные права и Администратор системы. - | - |Вероятно, пользователи создавались в конфигураторе. - |Требуется назначить роли Полные права и Администратор системы хотя бы одному пользователю.'"); - КонецЕсли; + ТекстОшибки = + НСтр("ru = 'Список пользователей информационной базы не пустой, однако не удалось + |найти ни одного пользователя с ролями Полные права и Администратор системы. + | + |Вероятно, пользователи создавались в конфигураторе. + |Требуется назначить роли Полные права и Администратор системы хотя бы одному пользователю.'"); ВызватьИсключение ТекстОшибки; КонецЕсли; Иначе Если Не ПользователиСлужебный.РолиАдминистратораДоступны(ПользовательИБ) Тогда - - Если Метаданные.Роли.ПолныеПрава = РольАдминистратораСистемы(Истина) Тогда - ТекстОшибки = - НСтр("ru = 'Невозможно создать пользователя в справочнике для пользователя - |информационной базы ""%1"", - |так как у него нет роли Полные права. - | - |Вероятно, пользователь был создан в конфигураторе. Для автоматического - |создания пользователя в справочнике требуется назначить ему роль Полные права.'"); - Иначе - ТекстОшибки = - НСтр("ru = 'Невозможно создать пользователя в справочнике для пользователя - |информационной базы ""%1"", - |так как у него нет ролей Полные права и Администратор системы. - | - |Вероятно, пользователь был создан в конфигураторе. - |Для автоматического создания пользователя в справочнике требуется - |назначить ему роли Полные права и Администратор системы.'"); - КонецЕсли; + ТекстОшибки = + НСтр("ru = 'Невозможно создать пользователя в справочнике для пользователя + |информационной базы ""%1"", + |так как у него нет ролей Полные права и Администратор системы. + | + |Вероятно, пользователь был создан в конфигураторе. + |Для автоматического создания пользователя в справочнике требуется + |назначить ему роли Полные права и Администратор системы.'"); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ПользовательИБ)); КонецЕсли; @@ -680,7 +675,11 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с пользователями информационной базы. -// Возвращает полное имя неуказанного пользователя для отображения в интерфейсах. +// Возвращает текстовое представление для случаев, когда пользователь не указан или не выбран. +// +// Возвращаемое значение: +// Строка - "<Не указан>" +// Функция ПолноеИмяНеуказанногоПользователя() Экспорт Возврат НСтр("ru = '<Не указан>'"); @@ -745,36 +744,33 @@ КонецФункции // Возвращает пустую структуру описания пользователя ИБ. +// Назначение свойств структуры соответствует свойствам объекта ПользовательИнформационнойБазы. // // Возвращаемое значение: // Структура - со свойствами: -// * УникальныйИдентификатор - УникальныйИдентификатор - -// * Имя - Строка - -// * ПолноеИмя - Строка - +// * УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор пользователя информационной базы. +// * Имя - Строка - имя пользователя информационной базы. Например, "Иванов". +// * ПолноеИмя - Строка - полное имя пользователя информационной базы. +// Например, "Иванов Иван Иванович (менеджер по продажам)" +// * АутентификацияOpenID - Булево - разрешена ли пользователю аутентификация по протоколу OpenID. // -// * АутентификацияOpenID - Булево - +// * АутентификацияСтандартная - Булево - разрешена ли стандартная аутентификация (по пользователю и паролю). +// * ПоказыватьВСпискеВыбора - Булево - показывать ли полное имя пользователя в списке для выбора при запуске. +// * Пароль - Строка, Неопределено - пароль, используемый при стандартной аутентификации. +// * СохраняемоеЗначениеПароля - Строка, Неопределено - хранимые значения пароля (хеш). +// * ПарольУстановлен - Булево - установлен ли пароль у пользователя. +// * ЗапрещеноИзменятьПароль - Булево - определяет возможность пользователя изменять свой пароль. // -// * АутентификацияСтандартная - Булево - -// * ПоказыватьВСпискеВыбора - Булево - -// * Пароль - Неопределено - -// * СохраняемоеЗначениеПароля - Неопределено - -// * ПарольУстановлен - Булево - -// * ЗапрещеноИзменятьПароль - Булево - +// * АутентификацияОС - Булево - разрешена ли аутентификация средствами операционной системы. +// * ПользовательОС - Строка - имя соответствующей учетной записи пользователя операционной системы +// (не учитывается в учебной версии платформы). // -// * АутентификацияОС - Булево - -// * ПользовательОС - Строка - (не учитывается в учебной платформе). -// -// * ОсновнойИнтерфейс - Неопределено - -// - Строка - имя интерфейса из коллекции "Метаданные.Интерфейсы". -// -// * РежимЗапуска - Неопределено - -// - Строка - значения: "Авто", "ОбычноеПриложение", "УправляемоеПриложение". -// * Язык - Неопределено - -// - Строка - имя языка из коллекции "Метаданные.Языки". -// -// * Роли - Неопределено - -// - Массив - значений типа: -// * Строка - имена ролей из коллекции "Метаданные.Роли". +// * ОсновнойИнтерфейс - Строка, Неопределено - имя основного интерфейса пользователя информационной базы +// (из коллекции Метаданные.Интерфейсы). +// * РежимЗапуска - Строка, Неопределено - "Авто", "ОбычноеПриложение" или "УправляемоеПриложение". +// * Язык - Строка, Неопределено - имя языка из коллекции Метаданные.Языки. +// * Роли - Неопределено - роли не указаны. +// - Массив - коллекция имен ролей пользователя информационной базы. // Функция НовоеОписаниеПользователяИБ() Экспорт @@ -811,116 +807,116 @@ КонецФункции -// Считывает свойства пользователя информационной базы по строковому или уникальному идентификатору. +// Возвращает свойства пользователя информационной базы в виде структуры. +// Если пользователь с указанным идентификатором или именем не существует, то возвращается Неопределено. // // Параметры: -// Идентификатор - Неопределено, Строка, УникальныйИдентификатор - идентификатор пользователя. -// Свойства - Структура - со свойствами, как в функции НовоеОписаниеПользователяИБ(). -// ОписаниеОшибки - Строка - содержит описание ошибки, если чтение не удалось. +// ИмяИлиИдентификатор - Строка, УникальныйИдентификатор - имя или идентификатор пользователя ИБ. // // Возвращаемое значение: -// Булево - если Истина, тогда пользователь прочитан, иначе см. ОписаниеОшибки. +// Структура, Неопределено - свойства пользователя, см. Пользователи.НовоеОписаниеПользователяИБ. +// Неопределено, если пользователь с указанным идентификатором или именем не существует. // -Функция ПрочитатьПользователяИБ(Знач Идентификатор, - Свойства = Неопределено, - ОписаниеОшибки = "", - ПользовательИБ = Неопределено) Экспорт +Функция СвойстваПользователяИБ(Знач ИмяИлиИдентификатор) Экспорт + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("Пользователи.СвойстваПользователяИБ", "ИмяИлиИдентификатор", + ИмяИлиИдентификатор, Новый ОписаниеТипов("Строка, УникальныйИдентификатор")); + Свойства = НовоеОписаниеПользователяИБ(); - Свойства.Роли = Новый Массив; - Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда + Если ТипЗнч(ИмяИлиИдентификатор) = Тип("УникальныйИдентификатор") Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И Идентификатор = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() + И СеансЗапущенБезРазделителей + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + И ИмяИлиИдентификатор = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор Тогда ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); Иначе - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор); + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИмяИлиИдентификатор); КонецЕсли; - ИначеЕсли ТипЗнч(Идентификатор) = Тип("Строка") Тогда - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Идентификатор); + ИначеЕсли ТипЗнч(ИмяИлиИдентификатор) = Тип("Строка") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяИлиИдентификатор); Иначе ПользовательИБ = Неопределено; КонецЕсли; Если ПользовательИБ = Неопределено Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользователь информационной базы ""%1"" не найден.'"), - Идентификатор); - Возврат Ложь; + Возврат Неопределено; КонецЕсли; СкопироватьСвойстваПользователяИБ(Свойства, ПользовательИБ); - - Возврат Истина; + Свойства.Вставить("ПользовательИБ", ПользовательИБ); + Возврат Свойства; КонецФункции -// Перезаписывает свойства пользователя ИБ, найденного по строковому или -// уникальному идентификатору, либо создает нового пользователя ИБ -// (если задано создать существующего пользователя - будет ошибка). +// Записывает новые значения свойств указанного пользователя ИБ, либо создает нового пользователя ИБ. +// Если пользователь не существует, а также при попытке создания существующего пользователя будет вызвано исключение. // // Параметры: -// Идентификатор - Строка, УникальныйИдентификатор - идентификатор пользователя. -// -// ОбновляемыеСвойства - Структура - со свойствами, как в функции НовоеОписаниеПользователяИБ(). -// Свойство может быть не задано, тогда используется прочитанное или начальное значение. -// Следующие свойства структуры используются нестандартно: -// * УникальныйИдентификатор - Неопределено - (возвращаемое значение), -// устанавливается после записи пользователя ИБ. +// ИмяИлиИдентификатор - Строка, УникальныйИдентификатор - имя или уникальный идентификатор пользователя ИБ, свойства +// которого нужно установить. Либо имя нового пользователя ИБ. +// ОбновляемыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ. +// Если какое-либо свойство в структуре не задано, то используется прочитанное или начальное значение. +// Следующие свойства структуры имеют особенности: +// * ПользовательИБ - ПользовательИнформационнойБазы - возвращаемый параметр: пользователь ИБ, свойства +// которого были записаны. +// * УникальныйИдентификатор - УникальныйИдентификатор - возвращаемый параметр: уникальный идентификатор +// записанного пользователя ИБ. // * СтарыйПароль - Неопределено, Строка - если заданный пароль -// не совпадет с существующим будет ошибка. +// не совпадет с существующим, то будет вызвано исключение. // -// СоздатьНового - Ложь - никаких дополнительных действий. -// - Неопределено, Истина - создается новый пользователь ИБ, -// когда ПользовательИБ не найден по указанному идентификатору. -// При значении Истина, если Пользователь ИБ найден -// по указанному идентификатору - будет ошибка. +// СоздатьНового - Булево - указать Истина, чтобы создать нового пользователя ИБ с именем ИмяИлиИдентификатор. // -// ОписаниеОшибки - Строка - содержит описание ошибки, если чтение не удалось. +// ЭтоВнешнийПользователь - Булево - указать Истина, если пользователь ИБ соответствует внешнему пользователю +// (элементу справочника ВнешниеПользователи). // -// Пользователь - СправочникСсылка.Пользователи, СправочникОбъект.Пользователи, -// СправочникСсылка.ВнешниеПользователи, СправочникОбъект.ВнешниеПользователи - это -// пользователь с которым сопоставлен ПользовательИБ. -// - Неопределено - ссылка или объект пользователя в справочнике, если существует. -// - ПользовательИнформационнойБазы - (Возвращаемое значение), если запись удалась. -// -// Возвращаемое значение: -// Булево - если Истина, тогда пользователь записан, иначе см. ОписаниеОшибки. -// -Функция ЗаписатьПользователяИБ(Знач Идентификатор, - Знач ОбновляемыеСвойства, - Знач СоздатьНового = Ложь, - ОписаниеОшибки = "", - Пользователь = Неопределено) Экспорт +Процедура УстановитьСвойстваПользователяИБ(Знач ИмяИлиИдентификатор, Знач ОбновляемыеСвойства, + Знач СоздатьНового = Ложь, Знач ЭтоВнешнийПользователь = Ложь) Экспорт - ПользовательИБ = Неопределено; - СтарыеСвойства = Неопределено; - - ПредварительноеЧтение = ПрочитатьПользователяИБ( - Идентификатор, СтарыеСвойства, ОписаниеОшибки, ПользовательИБ); - - Если НЕ ПредварительноеЧтение Тогда + ИмяПроцедуры = "Пользователи.УстановитьСвойстваПользователяИБ"; + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ИмяИлиИдентификатор", + ИмяИлиИдентификатор, Новый ОписаниеТипов("Строка, УникальныйИдентификатор")); + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ОбновляемыеСвойства", ОбновляемыеСвойства, Тип("Структура")); + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "СоздатьНового", СоздатьНового, Тип("Булево")); + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ЭтоВнешнийПользователь", ЭтоВнешнийПользователь, Тип("Булево")); + + СтарыеСвойства = СвойстваПользователяИБ(ИмяИлиИдентификатор); + ПользовательСуществует = СтарыеСвойства <> Неопределено; + Если ПользовательСуществует Тогда + ПользовательИБ = СтарыеСвойства.ПользовательИБ; + Иначе + ПользовательИБ = Неопределено; + СтарыеСвойства = НовоеОписаниеПользователяИБ(); + КонецЕсли; - Если СоздатьНового = Неопределено ИЛИ СоздатьНового = Истина Тогда - ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); - Иначе - Возврат Ложь; + Если Не ПользовательСуществует Тогда + + Если Не СоздатьНового Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователь информационной базы ""%1"" не существует.'"), + ИмяИлиИдентификатор); КонецЕсли; - ИначеЕсли СоздатьНового = Истина Тогда - ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( - НСтр("ru = 'Невозможно создать пользователя информационной базы - |%1, - |так как он уже существует.'"), - СтарыеСвойства.Имя, - СтарыеСвойства.УникальныйИдентификатор); - Возврат Ложь; + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); + Иначе + + Если СоздатьНового Тогда + ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'Невозможно создать пользователя информационной базы ""%1"", так как он уже существует.'"), + СтарыеСвойства.Имя, + СтарыеСвойства.УникальныйИдентификатор); + КонецЕсли; Если ОбновляемыеСвойства.Свойство("СтарыйПароль") И ТипЗнч(ОбновляемыеСвойства.СтарыйПароль) = Тип("Строка") Тогда @@ -931,119 +927,92 @@ СтарыеСвойства.УникальныйИдентификатор, СтарыйПарольСовпадает); - Если НЕ СтарыйПарольСовпадает Тогда - ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( - НСтр("ru = 'При записи пользователя информационной базы - |%1, - |старый пароль указан не верно.'"), + Если Не СтарыйПарольСовпадает Тогда + ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'При записи пользователя информационной базы ""%1"" старый пароль указан не верно.'"), СтарыеСвойства.Имя, СтарыеСвойства.УникальныйИдентификатор); - Возврат Ложь; КонецЕсли; КонецЕсли; + КонецЕсли; // Подготовка новых значений свойств. НовыеСвойства = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(СтарыеСвойства); - Для каждого КлючИЗначение Из НовыеСвойства Цикл - Если ОбновляемыеСвойства.Свойство(КлючИЗначение.Ключ) И ОбновляемыеСвойства[КлючИЗначение.Ключ] <> Неопределено Тогда - НовыеСвойства[КлючИЗначение.Ключ] = ОбновляемыеСвойства[КлючИЗначение.Ключ]; КонецЕсли; КонецЦикла; СкопироватьСвойстваПользователяИБ(ПользовательИБ, НовыеСвойства); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь; КонецЕсли; - // Попытка записи нового или измененного пользователяИБ. + // Попытка записи нового или изменение существующего пользователя ИБ. Попытка - ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, Пользователь); + ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь); Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( - НСтр("ru = 'При записи пользователя информационной базы - |%1 произошла ошибка: - | - |""%2"".'"), + ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'Не удалось записать свойства пользователя информационной базы ""%1"" по причине: + |%2.'"), ПользовательИБ.Имя, - ?(ПредварительноеЧтение, СтарыеСвойства.УникальныйИдентификатор, Неопределено), - ИнформацияОбОшибке); - Возврат Ложь; + ?(ПользовательСуществует, СтарыеСвойства.УникальныйИдентификатор, Неопределено), + ИнформацияОбОшибке()); КонецПопытки; - Если ЗначениеЗаполнено(СтарыеСвойства.Имя) - И СтарыеСвойства.Имя <> НовыеСвойства.Имя Тогда - // Перемещение настроек. - ПользователиСлужебный.СкопироватьНастройкиПользователя( - СтарыеСвойства.Имя, НовыеСвойства.Имя, Истина); + Если ЗначениеЗаполнено(СтарыеСвойства.Имя) И СтарыеСвойства.Имя <> НовыеСвойства.Имя Тогда + // Перемещение настроек пользователя + ПользователиСлужебный.СкопироватьНастройкиПользователя(СтарыеСвойства.Имя, НовыеСвойства.Имя, Истина); КонецЕсли; - Если СоздатьНового = Неопределено Или СоздатьНового = Истина Тогда - ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ.Имя, Пользователь); + Если СоздатьНового Тогда + ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ.Имя, ЭтоВнешнийПользователь); КонецЕсли; ПользователиПереопределяемый.ПриЗаписиПользователяИнформационнойБазы(СтарыеСвойства, НовыеСвойства); - ОбновляемыеСвойства.Вставить("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор); - Пользователь = ПользовательИБ; - Возврат Истина; + ОбновляемыеСвойства.Вставить("ПользовательИБ", ПользовательИБ); -КонецФункции +КонецПроцедуры // Удаляет указанного пользователя информационной базы. // // Параметры: -// Идентификатор - Строка - имя пользователя ИБ. -// - УникальныйИдентификатор - идентификатор пользователя ИБ. +// ИмяИлиИдентификатор - Строка, УникальныйИдентификатор - имя или идентификатор удаляемого пользователя ИБ. // -// ОписаниеОшибки - Строка - (возвращаемое значение) содержит описание ошибки, если удаление не удалось. -// -// Возвращаемое значение: -// Булево - если Истина пользователь успешно удален, иначе см. ОписаниеОшибки. -// -Функция УдалитьПользователяИБ(Знач Идентификатор, - ОписаниеОшибки = "", - ПользовательИБ = Неопределено) Экспорт +Процедура УдалитьПользователяИБ(Знач ИмяИлиИдентификатор) Экспорт - ПользовательИБ = Неопределено; - Свойства = Неопределено; - - Если НЕ ПрочитатьПользователяИБ(Идентификатор, Свойства, ОписаниеОшибки, ПользовательИБ) Тогда - Возврат Ложь; - Иначе - Попытка - - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПередЗаписьюПользователяИБ(ПользовательИБ.УникальныйИдентификатор); - КонецЦикла; - - ПользовательИБ.Удалить(); - - Исключение - ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( - НСтр("ru = 'При удалении пользователя информационной базы - |%1 произошла ошибка: - | - |""%2"".'"), - ПользовательИБ.Имя, - ПользовательИБ.УникальныйИдентификатор, - ИнформацияОбОшибке()); - Возврат Ложь; - КонецПопытки; + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("Пользователи.УдалитьПользователяИБ", "ИмяИлиИдентификатор", + ИмяИлиИдентификатор, Новый ОписаниеТипов("Строка, УникальныйИдентификатор")); + + СвойстваУдаляемогоПользователяИБ = СвойстваПользователяИБ(ИмяИлиИдентификатор); + Если СвойстваУдаляемогоПользователяИБ = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователь информационной базы ""%1"" не существует.'"), + ИмяИлиИдентификатор); КонецЕсли; + ПользовательИБ = СвойстваУдаляемогоПользователяИБ.ПользовательИБ; + + Попытка + + ИнтеграцияСТехнологиейСервиса.ПередУдалениемПользователяИБ(ПользовательИБ); + ПользовательИБ.Удалить(); + + Исключение + ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'Не удалось удалить пользователя информационной базы ""%1"" по причине: + |%2.'"), + ПользовательИБ.Имя, + ПользовательИБ.УникальныйИдентификатор, + ИнформацияОбОшибке()); + КонецПопытки; + ПользователиПереопределяемый.ПослеУдаленияПользователяИнформационнойБазы(СвойстваУдаляемогоПользователяИБ); - ПользователиПереопределяемый.ПослеУдаленияПользователяИнформационнойБазы(Свойства); - - Возврат Истина; - -КонецФункции +КонецПроцедуры // Копирует значения свойств пользователя ИБ с преобразованием // в/из строковых идентификаторов для основного интерфейса, @@ -1320,33 +1289,6 @@ КонецФункции -// Возвращает роль, предоставляющую права администрирования системы. -// -// Параметры: -// ДляПроверки - Булево - вернуть роль для проверки, а не для установки. -// Для базовых версий роль для установки АдминистраторСистемы, -// а роль для проверки может быть ПолныеПрава с правом Администрирование. -// -// Возвращаемое значение: -// ОбъектМетаданных - Роль. -// -Функция РольАдминистратораСистемы(ДляПроверки = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - РольАдминистратораСистемы = Метаданные.Роли.АдминистраторСистемы; - - Если ДляПроверки - И ПравоДоступа("Администрирование", Метаданные, Метаданные.Роли.ПолныеПрава) - И СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - - РольАдминистратораСистемы = Метаданные.Роли.ПолныеПрава; - КонецЕсли; - - Возврат РольАдминистратораСистемы; - -КонецФункции - // Выполняет поиск идентификаторов пользователей ИБ используемых более одного раза и // либо вызывает исключение, либо возвращает найденных пользователей ИБ для дальнейшей // обработки. @@ -1535,12 +1477,12 @@ //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции. -// Возвращает Истина, если для конфигурации возможно использование настроек входа, -// общих для пользователей (сложность пароля, смена пароля, ограничения -// срока работы в программе и другие). +// Определяет, предусмотрено ли в конфигурации использование настроек входа, общих для пользователей: +// сложность пароля, смена пароля, ограничения срока работы в программе и другие. +// См. свойство ОбщиеНастройкиВхода в ПользователиПереопределяемый.ПриОпределенииНастроек. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если в конфигурации предусмотрены общие настройки входа пользователей. // Функция ОбщиеНастройкиВходаИспользуются() Экспорт @@ -1570,13 +1512,205 @@ КонецФункции +#Область УстаревшиеПроцедурыИФункции + +// Устарела. По стандарту 488 "Стандартные роли" роль ПолныеПрава более не может +// содержать права администрирования системы (в том числе для базовых версий). +// Теперь роль администрирования системы - это всегда роль АдминистраторСистемы. +// +// Параметры: +// ДляПроверки - Булево - более не имеет значения. +// +// Возвращаемое значение: +// ОбъектМетаданных - Роль. +// +Функция РольАдминистратораСистемы(ДляПроверки = Ложь) Экспорт + + Возврат Метаданные.Роли.АдминистраторСистемы; + +КонецФункции + +// Устарела. Следует использовать Пользователи.СвойстваПользователяИБ. +// +// Считывает свойства пользователя информационной базы. +// Если пользователь с указанным идентификатором или именем не существует, +// в параметр ОписаниеОшибки будет записано сообщение. +// +// Параметры: +// Идентификатор - Строка, УникальныйИдентификатор - идентификатор или имя пользователя ИБ. +// Свойства - Структура - зачитанные свойства пользователя. См. Пользователи.НовоеОписаниеПользователяИБ. +// ОписаниеОшибки - Строка - описание ошибки, если пользователь не существует. +// ПользовательИБ - ПользовательИнформационнойБазы - служебный параметр. +// +// Возвращаемое значение: +// Булево - Истина, если свойства пользователя успешно прочитаны, иначе см. параметр ОписаниеОшибки. +// +Функция ПрочитатьПользователяИБ(Знач Идентификатор, Свойства = Неопределено, + ОписаниеОшибки = "", ПользовательИБ = Неопределено) Экспорт + + Свойства = СвойстваПользователяИБ(Идентификатор); + Результат = Свойства <> Неопределено; + Если Результат Тогда + Свойства = НовоеОписаниеПользователяИБ(); + Свойства.Роли = Новый Массив; + ПользовательИБ = Свойства.ПользовательИБ; + Иначе + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователь информационной базы ""%1"" не существует.'"), + Идентификатор); + КонецЕсли; + Возврат Результат; + +КонецФункции + +// Устарела. Следует использовать Пользователи.УстановитьСвойстваПользователяИБ. +// Перезаписывает свойства пользователя ИБ, найденного по строковому или +// уникальному идентификатору, либо создает нового пользователя ИБ +// (при попытке создания существующего пользователя будет ошибка). +// +// Параметры: +// Идентификатор - Строка, УникальныйИдентификатор - идентификатор пользователя. +// +// ОбновляемыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ. +// Если свойство в структуре не задано, то используется прочитанное или начальное значение. +// Следующие свойства структуры имеют особенности: +// * УникальныйИдентификатор - УникальныйИдентификатор - в него устанавливается уникальный идентификатор +// пользователя ИБ после его записи. +// * СтарыйПароль - Неопределено, Строка - если заданный пароль +// не совпадет с существующим, то возникнет ошибка (см. параметр ОписаниеОшибки). +// +// СоздатьНового - Ложь - никаких дополнительных действий. +// - Неопределено, Истина - создается новый пользователь ИБ, +// когда ПользовательИБ не найден по указанному идентификатору. +// При значении Истина, если Пользователь ИБ найден +// по указанному идентификатору - будет ошибка. +// +// ОписаниеОшибки - Строка - содержит описание ошибки, если чтение не удалось. +// +// Пользователь - СправочникСсылка.Пользователи, СправочникОбъект.Пользователи, +// СправочникСсылка.ВнешниеПользователи, СправочникОбъект.ВнешниеПользователи - это +// пользователь с которым сопоставлен ПользовательИБ. +// - Неопределено - ссылка или объект пользователя в справочнике, если существует. +// - ПользовательИнформационнойБазы - (Возвращаемое значение), если запись удалась. +// +// Возвращаемое значение: +// Булево - если Истина, тогда пользователь записан, иначе см. ОписаниеОшибки. +// +Функция ЗаписатьПользователяИБ(Знач Идентификатор, + Знач ОбновляемыеСвойства, + Знач СоздатьНового = Ложь, + ОписаниеОшибки = "", + Пользователь = Неопределено) Экспорт + + СтарыеСвойства = СвойстваПользователяИБ(Идентификатор); + ПредварительноеЧтение = СтарыеСвойства <> Неопределено; + Если СтарыеСвойства <> Неопределено Тогда + ПользовательИБ = СтарыеСвойства.ПользовательИБ; + Иначе + ПользовательИБ = Неопределено; + СтарыеСвойства = НовоеОписаниеПользователяИБ(); + СтарыеСвойства.Роли = Новый Массив; + КонецЕсли; + + Если НЕ ПредварительноеЧтение Тогда + + Если СоздатьНового = Неопределено ИЛИ СоздатьНового = Истина Тогда + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); + Иначе + Возврат Ложь; + КонецЕсли; + ИначеЕсли СоздатьНового = Истина Тогда + ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'Невозможно создать пользователя информационной базы + |%1, + |так как он уже существует.'"), + СтарыеСвойства.Имя, + СтарыеСвойства.УникальныйИдентификатор); + Возврат Ложь; + Иначе + Если ОбновляемыеСвойства.Свойство("СтарыйПароль") + И ТипЗнч(ОбновляемыеСвойства.СтарыйПароль) = Тип("Строка") Тогда + + СтарыйПарольСовпадает = Ложь; + + ПользователиСлужебный.СохраняемоеЗначениеСтрокиПароля( + ОбновляемыеСвойства.СтарыйПароль, + СтарыеСвойства.УникальныйИдентификатор, + СтарыйПарольСовпадает); + + Если НЕ СтарыйПарольСовпадает Тогда + ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'При записи пользователя информационной базы + |%1, + |старый пароль указан не верно.'"), + СтарыеСвойства.Имя, + СтарыеСвойства.УникальныйИдентификатор); + Возврат Ложь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + // Подготовка новых значений свойств. + НовыеСвойства = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(СтарыеСвойства); + + Для каждого КлючИЗначение Из НовыеСвойства Цикл + + Если ОбновляемыеСвойства.Свойство(КлючИЗначение.Ключ) + И ОбновляемыеСвойства[КлючИЗначение.Ключ] <> Неопределено Тогда + + НовыеСвойства[КлючИЗначение.Ключ] = ОбновляемыеСвойства[КлючИЗначение.Ключ]; + КонецЕсли; + КонецЦикла; + + СкопироватьСвойстваПользователяИБ(ПользовательИБ, НовыеСвойства); + + Если ОбщегоНазначения.РазделениеВключено() Тогда + ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь; + КонецЕсли; + + // Попытка записи нового или измененного пользователяИБ. + ЭтоВнешнийПользователь = ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") + Или ТипЗнч(Пользователь) = Тип("СправочникОбъект.ВнешниеПользователи"); + Попытка + ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОписаниеОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'При записи пользователя информационной базы + |%1 произошла ошибка: + | + |""%2"".'"), + ПользовательИБ.Имя, + ?(ПредварительноеЧтение, СтарыеСвойства.УникальныйИдентификатор, Неопределено), + ИнформацияОбОшибке); + Возврат Ложь; + КонецПопытки; + + Если ЗначениеЗаполнено(СтарыеСвойства.Имя) + И СтарыеСвойства.Имя <> НовыеСвойства.Имя Тогда + // Перемещение настроек. + ПользователиСлужебный.СкопироватьНастройкиПользователя( + СтарыеСвойства.Имя, НовыеСвойства.Имя, Истина); + КонецЕсли; + + Если СоздатьНового = Неопределено Или СоздатьНового = Истина Тогда + ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ.Имя, ЭтоВнешнийПользователь); + КонецЕсли; + + ПользователиПереопределяемый.ПриЗаписиПользователяИнформационнойБазы(СтарыеСвойства, НовыеСвойства); + + ОбновляемыеСвойства.Вставить("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор); + Пользователь = ПользовательИБ; + Возврат Истина; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - // Формирует краткое описание ошибки, которое увидит пользователь, // а также может записать подробное описание ошибки в журнал регистрации. // diff --git a/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl index 6f29b1b31..ffc45df7b 100644 --- a/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает текущего пользователя или текущего внешнего пользователя, diff --git a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl index e8dfad642..f6f84e1a3 100644 --- a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl @@ -1,29 +1,27 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Переопределяет стандартное поведение подсистемы Пользователи. // // Параметры: // Настройки - Структура - со свойствами: -// * ОбщиеНастройкиВхода - Булево - начальное значение Истина, если установить Ложь, -// тогда в панели администрирования "Настройки прав и пользователей" возможность -// открытия формы настроек входа будет скрыта, как и настройка ограничения срока действия -// в карточках пользователя и внешнего пользователя. Для базовых версий конфигурации всегда Ложь. +// * ОбщиеНастройкиВхода - Булево - определяет будут ли в панели администрирования +// "Настройки прав и пользователей" доступны настройки входа и доступность +// настроек ограничения срока действия в формах пользователя и внешнего пользователя. +// По умолчанию, Истина, а для базовых версий конфигурации - всегда Ложь. // -// * РедактированиеРолей - Булево - начальное значение Истина, если установить Ложь, тогда -// интерфейс изменения ролей в карточках пользователя, внешнего пользователя и -// группы внешних пользователей будет скрыт (в том числе для администратора). +// * РедактированиеРолей - Булево - определяет доступность интерфейса изменения ролей +// в карточках пользователя, внешнего пользователя и группы внешних пользователей +// (в том числе для администратора). По умолчанию, Истина. // Процедура ПриОпределенииНастроек(Настройки) Экспорт + + КонецПроцедуры -// Позволяет указать роли специального назначения. Все остальные роли не требуется указывать - -// это роли, которые предназначены для любых пользователей, кроме внешних пользователей. +// Позволяет указать роли, назначение которых будет контролироваться особым образом. +// Большинство ролей конфигурации не требуется здесь указывать, т.к. они предназначены для любых пользователей, +// кроме внешних пользователей. // // Параметры: // НазначениеРолей - Структура - со свойствами: @@ -70,50 +68,64 @@ КонецПроцедуры // Переопределяет поведение формы пользователя и формы внешнего пользователя, -// группы внешних пользователей. +// группы внешних пользователей, когда оно должно отличаться от поведения по умолчанию. +// +// Например, требуется скрывать/показывать или разрешать изменять/блокировать +// некоторые свойства в случаях, которые определены прикладной логикой. // // Параметры: -// Ссылка - СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи, -// СправочникСсылка.ГруппыВнешнихПользователей - ссылка на пользователя, -// внешнего пользователя или группу внешних пользователей при создании формы. +// ПользовательИлиГруппа - СправочникСсылка.Пользователи, +// СправочникСсылка.ВнешниеПользователи, +// СправочникСсылка.ГруппыВнешнихПользователей - ссылка на пользователя, +// внешнего пользователя или группу внешних пользователей при создании формы. // // ДействияВФорме - Структура - со свойствами: -// * Роли - Строка - "", "Просмотр", "Редактирование". -// * КонтактнаяИнформация - Строка - "", "Просмотр", "Редактирование". -// * СвойстваПользователяИБ - Строка - "", "Просмотр", "Редактирование". -// * СвойстваЭлемента - Строка - "", "Просмотр", "Редактирование". -// -// Для групп внешних пользователей КонтактнаяИнформация и СвойстваПользователяИБ не существуют. +// * Роли - Строка - "", "Просмотр", "Редактирование". +// Например, когда роли редактируются в другой форме можно скрыть +// их в этой форме или только блокировать редактирование. +// * КонтактнаяИнформация - Строка - "", "Просмотр", "Редактирование". +// Свойство отсутствует для групп внешних пользователей. +// Например, может потребоваться скрыть контактную информацию +// от пользователя при отсутствии прикладных прав на просмотр КИ. +// * СвойстваПользователяИБ - Строка - "", "Просмотр", "Редактирование". +// Свойство отсутствует для групп внешних пользователей. +// Например, может потребоваться показать свойства пользователя ИБ +// для пользователя, который имеет прикладные права на эти сведения. +// * СвойстваЭлемента - Строка - "", "Просмотр", "Редактирование". +// Например, Наименование, является полным именем пользователя ИБ, +// может потребоваться разрешить редактировать наименование +// для пользователя, который имеет прикладные права на кадровые операции. // -Процедура ИзменитьДействияВФорме(Знач Ссылка, Знач ДействияВФорме) Экспорт +Процедура ИзменитьДействияВФорме(Знач ПользовательИлиГруппа, Знач ДействияВФорме) Экспорт КонецПроцедуры // Доопределяет действия при записи пользователя информационной базы. -// Вызывается из процедуры ЗаписатьПользователяИБ(), если пользователь был действительно изменен. -// Используется, если при записи пользователя ИБ требуется сделать синхронные действия, -// например, обновить запись в соответствующем регистре. +// Например, если требуется синхронно обновить запись в соответствующем регистре и т.п. +// Вызывается из процедуры Пользователи.ЗаписатьПользователяИБ, если пользователь был действительно изменен. +// Если поле Имя в структуре СтарыеСвойства не заполнено, значит создается новый пользователь ИБ. // // Параметры: -// СтарыеСвойства - Структура - см. параметры возвращаемые функцией Пользователи.ПрочитатьПользователяИБ(). -// НовыеСвойства - Структура - см. параметры возвращаемые функцией Пользователи.ЗаписатьПользователяИБ(). +// СтарыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ. +// НовыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ. // Процедура ПриЗаписиПользователяИнформационнойБазы(Знач СтарыеСвойства, Знач НовыеСвойства) Экспорт КонецПроцедуры // Доопределяет действия после удаления пользователя информационной базы. -// Вызывается из процедуры УдалитьПользователяИБ(), если пользователь был удален. +// Например, если требуется синхронно обновить запись в соответствующем регистре и т.п. +// Вызывается из процедуры УдалитьПользователяИБ, если пользователь был удален. // // Параметры: -// СтарыеСвойства - Структура - см. параметры возвращаемые функцией Пользователи.ПрочитатьПользователяИБ(). +// СтарыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ. // Процедура ПослеУдаленияПользователяИнформационнойБазы(Знач СтарыеСвойства) Экспорт КонецПроцедуры // Переопределяет настройки интерфейса, устанавливаемые для новых пользователей. +// Например, можно установить начальные настройки расположения разделов командного интерфейса. // // Параметры: // НачальныеНастройки - Структура - настройки по умолчанию: @@ -131,7 +143,12 @@ КонецПроцедуры -// Дополняет список настроек переданного пользователя на вкладке "Прочее" обработки НастройкиПользователей. +// Позволяет добавить произвольную настройку на закладке "Прочее" в интерфейсе +// обработки НастройкиПользователей, чтобы ее можно было удалять и копировать другим пользователям. +// Для возможности управления настройкой нужно написать код ее по копированию (см. ПриСохраненииПрочихНастроек) +// и удалению (см. ПриУдаленииПрочихНастроек), который будет вызываться при интерактивных действиях с настройкой. +// +// Например, признак того, нужно ли показывать предупреждение при завершении работы программы. // // Параметры: // СведенияОПользователе - Структура - строковое и ссылочное представление пользователя. @@ -153,7 +170,8 @@ КонецПроцедуры -// Сохраняет настройки переданному пользователю. +// Сохраняет произвольную настройку переданному пользователю. +// См. также ПриПолученииПрочихНастроек. // // Параметры: // Настройки - Структура - структура с полями: @@ -171,7 +189,8 @@ КонецПроцедуры -// Очищает настройки переданному пользователю. +// Очищает произвольную настройку у переданного пользователя. +// См. также ПриПолученииПрочихНастроек. // // Параметры: // Настройки - Структура - структура с полями: diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl index 8810b14fb..6c30fb8fb 100644 --- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl @@ -1,177 +1,8 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Объявление служебных событий, к которым можно подключать обработчики БСП. - -// Объявляет служебные события подсистемы Пользователи: -// -// Серверные события: -// ПриСозданииПользователяВМоментВхода, -// ПриАвторизацииНовогоПользователяИБ, -// ПриНачалеОбработкиПользователяИБ, -// ПередЗаписьюПользователяИБ. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается при создании элемента справочника "Пользователи" в момент интерактивного входа пользователя. - // - // Параметры: - // НовыйПользователь - СправочникОбъект.Пользователи - новый пользователь перед записью. - // - // Синтаксис: - // Процедура ПриСозданииПользователяВМоментВхода(НовыйПользователь) Экспорт - СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриСозданииПользователяВМоментВхода"); - - // Вызывается при авторизации нового пользователя информационной базы. - // - // Параметры: - // ПользовательИБ - ПользовательИнформационнойБазы, текущий пользователь информационной базы, - // СтандартнаяОбработка - Булево, значение может быть установлено внутри обработчика, в этом случае - // стандартная обработка авторизации нового пользователя ИБ выполняться не будет. - // - // Синтаксис: - // Процедура ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка) Экспорт - СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриАвторизацииНовогоПользователяИБ"); - - // Вызывается при начале обработки пользователя информационной базы. - // - // Параметры: - // ПараметрыОбработки - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ(). - // ОписаниеПользователяИБ - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ(). - // - // Синтаксис: - // Процедура ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); - СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриНачалеОбработкиПользователяИБ"); - - // Вызывается перед записью пользователя информационной базы. - // - // Параметры: - // ИдентификаторПользователяИБ - УникальныйИдентификатор. - // - // Синтаксис: - // Процедура ПередЗаписьюПользователяИБ(ИдентификаторПользователяИБ) Экспорт - СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтПодчиненного"].Добавить( - "ПользователиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтГлавного"].Добавить( - "ПользователиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "ПользователиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриНастройкеПодчиненногоУзлаРИБ"].Добавить( - "ПользователиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "ПользователиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "ПользователиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "ПользователиСлужебный"); - КонецЕсли; - -КонецПроцедуры - /////////////////////////////////////////////////////////////////////////////// // Основные процедуры и функции. -// Заполняет параметр сеанса ТекущийПользователь или ТекущийВнешнийПользователь -// значением пользователя, найденному по пользователю информационной базы -// под которым запущен сеанс. -// Если пользователь не найден, то при наличии административных прав -// создается новый пользователь в справочнике, иначе вызывается исключение. -// -Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт - - Если ИмяПараметра <> "ТекущийПользователь" - И ИмяПараметра <> "ТекущийВнешнийПользователь" - И ИмяПараметра <> "АвторизованныйПользователь" Тогда - - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Попытка - Значения = ЗначенияПараметровСеансаТекущийПользователь(); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось установить параметр сеанса ТекущийПользователь по причине: - |""%1"". - | - |Обратитесь к администратору.'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - Если ТипЗнч(Значения) = Тип("Строка") Тогда - ВызватьИсключение Значения; - КонецЕсли; - - ПараметрыСеанса.ТекущийПользователь = Значения.ТекущийПользователь; - ПараметрыСеанса.ТекущийВнешнийПользователь = Значения.ТекущийВнешнийПользователь; - - Если ЗначениеЗаполнено(Значения.ТекущийПользователь) Тогда - ПараметрыСеанса.АвторизованныйПользователь = Значения.ТекущийПользователь; - Иначе - ПараметрыСеанса.АвторизованныйПользователь = Значения.ТекущийВнешнийПользователь; - КонецЕсли; - - УстановленныеПараметры.Добавить("ТекущийПользователь"); - УстановленныеПараметры.Добавить("ТекущийВнешнийПользователь"); - УстановленныеПараметры.Добавить("АвторизованныйПользователь"); - -КонецПроцедуры - // Вызывается при начале работы системы, чтобы проверить возможность выполнения авторизации и // вызвать заполнение значений параметров сеанса ТекущийПользователь и ТекущийВнешнийПользователь. // Также вызывается при входе в область данных. @@ -214,11 +45,8 @@ Возврат РезультатУстановкиПараметровСеанса(РегистрироватьВЖурнале); КонецЕсли; - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриАвторизацииНовогоПользователяИБ"); СтандартнаяОбработка = Истина; - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриАвторизацииНовогоПользователяИБ(ТекущийПользовательИБ, СтандартнаяОбработка); - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриАвторизацииНовогоПользователяИБ(ТекущийПользовательИБ, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда Возврат ""; @@ -306,11 +134,10 @@ // // Параметры: // ИмяПользователя - Строка - имя пользователя информационной базы, для которого сохраняются настройки. -// Пользователь - СправочникСсылка.Пользователи, СправочникОбъект.Пользователи -// СправочникСсылка.ВнешниеПользователи, СправочникОбъект.ВнешниеПользователи -// Неопределено - ссылка или объект пользователя в справочнике, если существует. +// ЭтоВнешнийПользователь - Булево - указать Истина, если пользователь ИБ соответствует внешнему пользователю +// (элементу справочника ВнешниеПользователи). // -Процедура УстановитьНачальныеНастройки(Знач ИмяПользователя, Пользователь = Неопределено) Экспорт +Процедура УстановитьНачальныеНастройки(Знач ИмяПользователя, ЭтоВнешнийПользователь = Ложь) Экспорт СистемнаяИнформация = Новый СистемнаяИнформация; @@ -346,9 +173,7 @@ НачальныеНастройки.Вставить("НастройкиКлиента", НастройкиКлиента); НачальныеНастройки.Вставить("НастройкиИнтерфейса", НастройкиИнтерфейса); НачальныеНастройки.Вставить("НастройкиТакси", НастройкиТакси); - НачальныеНастройки.Вставить("ЭтоВнешнийПользователь", - ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") - Или ТипЗнч(Пользователь) = Тип("СправочникОбъект.ВнешниеПользователи")); + НачальныеНастройки.Вставить("ЭтоВнешнийПользователь", ЭтоВнешнийПользователь); ПользователиПереопределяемый.ПриУстановкеНачальныхНастроек(НачальныеНастройки); @@ -378,7 +203,7 @@ Возврат ""; КонецЕсли; - Если ПользователиСлужебныйПовтИсп.ЭтоСеансВнешнегоПользователя() Тогда + Если ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда ИмяРолиБазовыеПрава = Метаданные.Роли.БазовыеПраваВнешнегоПользователя.Имя; Иначе ИмяРолиБазовыеПрава = Метаданные.Роли.БазовыеПрава.Имя; @@ -396,6 +221,16 @@ КонецФункции +// Только для вызова из процедуры ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы +// общего модуля СтандартныеПодсистемыВызовСервера. +// +Процедура ПроверитьПраваТекущегоПользователяПриВходе() Экспорт + + ПроверитьПраваПользователя(ПользователиИнформационнойБазы.ТекущийПользователь(), + "ПриЗапуске", ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя()); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Для работы интерфейса ролей в управляемой форме. @@ -454,7 +289,7 @@ // Функция ВсеРоли() Экспорт - Возврат ПользователиСлужебныйПовтИсп.Параметры().ВсеРоли; + Возврат ПользователиСлужебныйПовтИсп.ВсеРоли(); КонецФункции @@ -643,33 +478,188 @@ КонецПроцедуры -// Обрабатывает служебное событие ПередЗаписьюПользователяИБ, проверяет права с учетом +// Вызывает событие ПередЗаписьюПользователяИБ, проверяет права с учетом // режима разделения данных и записывает указанного пользователя ИБ. // // Параметры: // ПользовательИБ - ПользовательИнформационнойБазы - объект, который требуется записать. -// Пользователь - СправочникСсылка.Пользователи, СправочникОбъект.Пользователи, -// СправочникСсылка.ВнешниеПользователи, СправочникОбъект.ВнешниеПользователи - это -// пользователь с которым сопоставлен ПользовательИБ. +// ЭтоВнешнийПользователь - Булево - указать Истина, если пользователь ИБ соответствует внешнему пользователю +// (элементу справочника ВнешниеПользователи). // -Процедура ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, Пользователь) Экспорт +Процедура ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь = Ложь) Экспорт - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПередЗаписьюПользователяИБ(ПользовательИБ.УникальныйИдентификатор); - КонецЦикла; - - ЭтоВнешнийПользователь = ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") - Или ТипЗнч(Пользователь) = Тип("СправочникОбъект.ВнешниеПользователи"); + ИнтеграцияСТехнологиейСервиса.ПередЗаписьюПользователяИБ(ПользовательИБ); ПроверитьПраваПользователя(ПользовательИБ, "ПередЗаписью", ЭтоВнешнийПользователь); - ОбновлениеИнформационнойБазыСлужебный.УстановитьФлагОтображенияОписанийДляНовогоПользователя(ПользовательИБ.Имя); - ПользовательИБ.Записать(); КонецПроцедуры +// Проверяет корректность заполнения назначения ролей, а также корректность прав в ролях по назначению. +Процедура ПроверитьНазначениеРолей(НазначениеРолей = Неопределено, ПроверитьВсе = Ложь, СписокОшибок = Неопределено) Экспорт + + Если НазначениеРолей = Неопределено Тогда + НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей(); + КонецЕсли; + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый.'"); + + ТекстОшибки = ""; + + Назначение = Новый Структура; + Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл + Роли = Новый Соответствие; + Для Каждого КлючИЗначение Из ОписаниеНазначенияРолей.Значение Цикл + Роль = Метаданные.Роли.Найти(КлючИЗначение.Ключ); + Если Роль = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В метаданных не найдена роль ""%1"", + |указанная в назначении %2.'"), + КлючИЗначение.Ключ, ОписаниеНазначенияРолей.Ключ); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(Неопределено, ОписаниеОшибки); + КонецЕсли; + Продолжить; + КонецЕсли; + Роли.Вставить(Роль, Истина); + Для Каждого ОписаниеНазначения Из Назначение Цикл + Если ОписаниеНазначения.Значение.Получить(Роль) = Неопределено Тогда + Продолжить; + КонецЕсли; + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" указана более чем в одном назначении: + |%2, %3.'"), + Роль.Имя, ОписаниеНазначенияРолей.Ключ, ОписаниеНазначения.Ключ); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(Роль, ОписаниеОшибки); + КонецЕсли; + КонецЦикла; + КонецЦикла; + Назначение.Вставить(ОписаниеНазначенияРолей.Ключ, Роли); + КонецЦикла; + + // Проверка ролей внешних пользователей. + НедоступныеПрава = Новый Массив; + НедоступныеПрава.Добавить("Администрирование"); + НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); + НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); + НедоступныеПрава.Добавить("АдминистрированиеДанных"); + + ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.ТолькоДляВнешнихПользователей, ТекстОшибки, + НСтр("ru = 'При проверке ролей только для внешних пользователей найдены ошибки:'"), СписокОшибок); + + ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки, + НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок); + + // Проверка ролей пользователей. + Если ОбщегоНазначения.РазделениеВключено() Или ПроверитьВсе Тогда + Роли = Новый Соответствие; + Для Каждого Роль Из Метаданные.Роли Цикл + Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено + Или Назначение.ТолькоДляПользователейСистемы.Получить(Роль) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Роли.Вставить(Роль, Истина); + КонецЦикла; + НедоступныеПрава = Новый Массив; + НедоступныеПрава.Добавить("Администрирование"); + НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); + НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); + НедоступныеПрава.Добавить("ТолстыйКлиент"); + НедоступныеПрава.Добавить("ВнешнееСоединение"); + НедоступныеПрава.Добавить("Automation"); + НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОбработок"); + НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОтчетов"); + НедоступныеПрава.Добавить("РежимВсеФункции"); + + НеразделенныеДанные = НеразделенныеДанные(); + ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки, + НСтр("ru = 'При проверке ролей для пользователей приложения найдены ошибки:'"), СписокОшибок, НеразделенныеДанные); + КонецЕсли; + Если Не ОбщегоНазначения.РазделениеВключено() Или ПроверитьВсе Тогда + Роли = Новый Соответствие; + Для Каждого Роль Из Метаданные.Роли Цикл + Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено + Или Назначение.ТолькоДляВнешнихПользователей.Получить(Роль) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Роли.Вставить(Роль, Истина); + КонецЦикла; + НедоступныеПрава = Новый Массив; + НедоступныеПрава.Добавить("Администрирование"); + НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); + НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); + + ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки, + НСтр("ru = 'При проверке ролей для пользователей найдены ошибки:'"), СписокОшибок); + + ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки, + НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок); + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ВызватьИсключение ЗаголовокОшибки + ТекстОшибки; + КонецЕсли; + +КонецПроцедуры + +// Включает пользователя приемника в группы пользователей пользователя источника. +Процедура СкопироватьГруппыПользователя(Источник, Приемник) Экспорт + + ВнешнийПользователь = (ТипЗнч(Источник) = Тип("СправочникСсылка.ВнешниеПользователи")); + + Запрос = Новый Запрос; + Если ВнешнийПользователь Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыПользователейСостав.Ссылка КАК ГруппаПользователей + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыПользователейСостав + |ГДЕ + | ГруппыПользователейСостав.ВнешнийПользователь = &Пользователь"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыПользователейСостав.Ссылка КАК ГруппаПользователей + |ИЗ + | Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав + |ГДЕ + | ГруппыПользователейСостав.Пользователь = &Пользователь"; + КонецЕсли; + Запрос.УстановитьПараметр("Пользователь", Источник); + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыПользователей"); + ЭлементБлокировки.ИсточникДанных = РезультатЗапроса; + НачатьТранзакцию(); + Попытка + Пока Выборка.Следующий() Цикл + ГруппаПользователейОбъект = Выборка.ГруппаПользователей.ПолучитьОбъект(); + Строка = ГруппаПользователейОбъект.Состав.Добавить(); + Если ВнешнийПользователь Тогда + Строка.ВнешнийПользователь = Приемник; + Иначе + Строка.Пользователь = Приемник; + КонецЕсли; + + ГруппаПользователейОбъект.Записать(); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Универсальные процедуры и функции. @@ -700,72 +690,49 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов из других подсистем. +// Обработчики событий подсистем конфигурации. -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры - Структура - параметры запуска. -// Отказ - Булево - если указать Истина, значит не удалось добавить параметры и -// требуются действия на стороне клиента для успешного продолжения. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Отказ, ЭтоВызовПередНачаломРаботыСистемы) Экспорт - - Если ЭтоВызовПередНачаломРаботыСистемы Тогда - - РегистрироватьВЖурнале = Параметры.ПолученныеПараметрыКлиента <> Неопределено - И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОшибкаАвторизации"); - - ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); - - Если ОшибкаАвторизации <> "" Тогда - Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); - Отказ = Истина; - Возврат; - КонецЕсли; - - Если ТребуетсяСменитьПароль(ОшибкаАвторизации, Истина, РегистрироватьВЖурнале) Тогда - Параметры.Вставить("ТребуетсяСменитьПароль"); - СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); - - ИначеЕсли ОшибкаАвторизации <> "" Тогда - Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); - Отказ = Истина; - Возврат; - КонецЕсли; - - Иначе - - + Если Не ЭтоВызовПередНачаломРаботыСистемы Тогда КлючПредупрежденияБезопасности = КлючПредупрежденияБезопасностиПриЗапуске(); Если ЗначениеЗаполнено(КлючПредупрежденияБезопасности) Тогда Параметры.Вставить("КлючПредупрежденияБезопасности", КлючПредупрежденияБезопасности); КонецЕсли; + Возврат; + КонецЕсли; + + РегистрироватьВЖурнале = Параметры.ПолученныеПараметрыКлиента <> Неопределено + И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОшибкаАвторизации"); + + ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); + + Если ОшибкаАвторизации <> "" Тогда + Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); + Отказ = Истина; + Возврат; + КонецЕсли; + + Если ТребуетсяСменитьПароль(ОшибкаАвторизации, Истина, РегистрироватьВЖурнале) Тогда + Параметры.Вставить("ТребуетсяСменитьПароль"); + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + ИначеЕсли ОшибкаАвторизации <> "" Тогда + Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); + Отказ = Истина; + Возврат; КонецЕсли; КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); Объекты.Вставить(Метаданные.Справочники.ГруппыВнешнихПользователей.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); Объекты.Вставить(Метаданные.Справочники.Пользователи.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("ТекущийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса"); @@ -774,22 +741,7 @@ КонецПроцедуры -// Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. -// -// Параметры: -// ВидыДоступа - ТаблицаЗначений - с колонками: -// * Имя - Строка - имя используемое в описании поставляемых -// профилей групп доступа и текстах ОДД. -// * Представление - Строка - представляет вид доступа в профилях и группах доступа. -// * ТипЗначений - Тип - тип ссылки значений доступа. -// Например, Тип("СправочникСсылка.Номенклатура"). -// * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. -// Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). -// * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно -// выбрать несколько групп значений (Групп доступа номенклатуры). -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); @@ -808,9 +760,11 @@ КонецПроцедуры -// Обработчик ожидания проверяет, что срок действия учетной записи истек и нужно завершить работу. +// См. СтандартныеПодсистемыВызовСервера.ПриВыполненииСтандартныхПериодическихПроверокНаСервере. Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт + // Проверка, что срок действия учетной записи истек и нужно завершить работу. + УстановитьПривилегированныйРежим(Истина); ТребуетсяСменитьПароль(); // Обновление даты последней активности. @@ -822,8 +776,15 @@ Если ПользовательИБ = Неопределено Тогда - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Если Не ОбщегоНазначения.РазделениеВключено() + Или Не СеансЗапущенБезРазделителей Тогда Параметры.ВходВПрограммуЗапрещен = Истина; КонецЕсли; @@ -837,15 +798,7 @@ КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт // Загрузка в справочник ВнешниеПользователи запрещена. @@ -863,7 +816,7 @@ КонецПроцедуры -// См. описание процедуры СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. Процедура СобратьСтатистикуКонфигурации() Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда @@ -945,41 +898,24 @@ КонецПроцедуры -// Вызывается после загрузки данных. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт - // Сброс общего решения, принятого администратором в форме "Предупреждение безопасности". - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - + // Сброс решения, принятого администратором в форме "Предупреждение безопасности". + Если Не ОбщегоНазначения.РазделениеВключено() Тогда ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); - ПараметрыАдминистрирования.Удалить("РазрешеноОткрытиеВнешнихОтчетовИОбработок"); - ПараметрыАдминистрирования.Удалить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок"); - СтандартныеПодсистемыСервер.УстановитьПараметрыАдминистрирования(ПараметрыАдминистрирования); - - ДобавитьАдминистраторамПравоОткрытияВнешнихОтчетовИОбработок(); + Если ТипЗнч(ПараметрыАдминистрирования.ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок) <> Тип("Булево") + Или ПараметрыАдминистрирования.ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок Тогда + + ПараметрыАдминистрирования.ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок = Ложь; + СтандартныеПодсистемыСервер.УстановитьПараметрыАдминистрирования(ПараметрыАдминистрирования); + КонецЕсли; КонецЕсли; КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1023,11 +959,6 @@ Обработчик.Версия = "2.2.2.42"; Обработчик.Процедура = "ПользователиСлужебный.ДобавитьПолноправнымПользователямРольАдминистраторСистемы"; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.3.16"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ПользователиСлужебный.УдалитьКэшНеразделенныеДанныеДоступныеДляИзменения"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.3.1.16"; Обработчик.РежимВыполнения = "Оперативно"; @@ -1039,155 +970,82 @@ Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "ПользователиСлужебный.ЗаполнитьНазначениеГруппВнешнихПользователей"; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.2.4"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ПользователиСлужебный.УдалитьКэшНедоступныеРолиПоТипамПользователей"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.3.2.30"; Обработчик.НачальноеЗаполнение = Истина; Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "ПользователиСлужебный.ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора"; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.4"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "ПользователиСлужебный.ДобавитьАдминистраторамПравоОткрытияВнешнихОтчетовИОбработок"; + Если ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "ПользователиСлужебный.ДобавитьАдминистраторамПравоОткрытияВнешнихОтчетовИОбработок"; + Иначе + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "ПользователиСлужебный.ПереименоватьКлючХраненияРешенияПоОткрытиюВнешнихОтчетовИОбработок"; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 1; + КонецЕсли; КонецПроцедуры -// Доопределяет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура, в которую можно вставить параметры работы клиента при запуске. -// Ключ - имя параметра, -// Значение - значение параметра. -// -// Пример использования: -// Параметры.Вставить(<ИмяПараметра>, <Код получения значения параметра>); -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт Параметры.Вставить("ЭтоПолноправныйПользователь", Пользователи.ЭтоПолноправныйПользователь()); КонецПроцедуры -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт Массив.Добавить(Метаданные.РегистрыСведений.СоставыГруппПользователей.ПолноеИмя()); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт ПриОтправкеДанных(ЭлементДанных, ОтправкаЭлемента, Истина); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт ПриОтправкеДанных(ЭлементДанных, ОтправкаЭлемента, Ложь); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДанных(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Истина); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДанных(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Ложь); КонецПроцедуры -// Процедура-обработчик события после получения данных в главном узле от подчиненного узла распределенной ИБ. -// Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и -// записаны в ИБ. -// -// Параметры: -// Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. -// Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, -// то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, -// если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, -// если данные были загружены порциями. -// -Процедура ПослеПолученияДанныхОтПодчиненного(Отправитель, Отказ) Экспорт +// См. СтандартныеПодсистемыСервер.ПослеПолученияДанных. +Процедура ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла) Экспорт - ПослеПолученияДанных(Отправитель, Отказ, Истина); + ОбновитьРолиВнешнихПользователей(); КонецПроцедуры -// Процедура-обработчик события после получения данных в подчиненном узле от главного узла распределенной ИБ. -// Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и -// записаны в ИБ. -// -// Параметры: -// Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. -// Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, -// то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, -// если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, -// если данные были загружены порциями. -// -Процедура ПослеПолученияДанныхОтГлавного(Отправитель, Отказ) Экспорт - - ПослеПолученияДанных(Отправитель, Отказ, Ложь); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; // В модели сервиса дело не выводится. КонецЕсли; @@ -1218,41 +1076,7 @@ КонецПроцедуры -// Обработчики событий подсистемы Управление доступом. - -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта], -// например, "Документ.ПриходнаяНакладная.Чтение.Организации", -// "Документ.ПриходнаяНакладная.Чтение.Контрагенты", -// "Документ.ПриходнаяНакладная.Изменение.Организации", -// "Документ.ПриходнаяНакладная.Изменение.Контрагенты", -// "Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма", -// "Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма", -// "Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов", -// "Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо", -// "Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов", -// "Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо". -// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в -// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому -// ограничивается текущий объект таблицы. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, -// которые используются для этого вида доступа. Т.е. перечислить типы, -// которые соответствуют полю, использованному в шаблоне ограничения доступа -// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" -// нужно перечислить только те типы поля, которые есть -// у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт ДополнениеОписания = @@ -1273,9 +1097,7 @@ // Обработчики событий подсистемы Обмен данными. -// Обработчик начальной настройки ИБ после создания узла РИБ. -// Вызывается в момент первого запуска подчиненного узла РИБ (в том числе АРМ). -// +// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт ОчиститьИдентификаторыНесуществующихПользователейИБ(); @@ -1284,29 +1106,7 @@ // Обработчики событий подсистемы ВариантыОтчетов. -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СведенияОПользователях); @@ -1314,18 +1114,10 @@ // Обработчики событий подсистемы РаботаВМоделиСервиса.ОчередьЗаданий. -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт - Шаблоны.Добавить(Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей.Имя); + ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей.Имя); КонецПроцедуры @@ -1339,6 +1131,53 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра <> "ТекущийПользователь" + И ИмяПараметра <> "ТекущийВнешнийПользователь" + И ИмяПараметра <> "АвторизованныйПользователь" Тогда + + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Попытка + Значения = ЗначенияПараметровСеансаТекущийПользователь(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить параметр сеанса ТекущийПользователь по причине: + |""%1"". + | + |Обратитесь к администратору.'"), + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + Если ТипЗнч(Значения) = Тип("Строка") Тогда + ВызватьИсключение Значения; + КонецЕсли; + + ПараметрыСеанса.ТекущийПользователь = Значения.ТекущийПользователь; + ПараметрыСеанса.ТекущийВнешнийПользователь = Значения.ТекущийВнешнийПользователь; + + Если ЗначениеЗаполнено(Значения.ТекущийПользователь) Тогда + ПараметрыСеанса.АвторизованныйПользователь = Значения.ТекущийПользователь; + Иначе + ПараметрыСеанса.АвторизованныйПользователь = Значения.ТекущийВнешнийПользователь; + КонецЕсли; + + УстановленныеПараметры.Добавить("ТекущийПользователь"); + УстановленныеПараметры.Добавить("ТекущийВнешнийПользователь"); + УстановленныеПараметры.Добавить("АвторизованныйПользователь"); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. @@ -1355,7 +1194,7 @@ Возврат; КонецЕсли; - Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Объект) Тогда Возврат; КонецЕсли; @@ -1383,7 +1222,7 @@ // Процедура ИзменитьЗаданиеКонтрольАктивностиПользователей(Использование) Экспорт - СтандартныеПодсистемыСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( + РегламентныеЗаданияСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей, Использование); КонецПроцедуры @@ -1440,7 +1279,9 @@ ПодготовленныеНастройки.Вставить("Пользователи", Новый Структура(КопияНастроек)); ПодготовленныеНастройки.Вставить("ВнешниеПользователи", Настройки); + УстановитьПривилегированныйРежим(Истина); СохраненныеНастройки = Константы.НастройкиВходаПользователей.Получить().Получить(); + УстановитьПривилегированныйРежим(Ложь); Если ТипЗнч(СохраненныеНастройки) <> Тип("Структура") Тогда Возврат ПодготовленныеНастройки; КонецЕсли; @@ -1675,7 +1516,7 @@ ДополнительныеПараметры = Новый Структура; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); @@ -1816,7 +1657,7 @@ // Для форм элементов справочников Пользователи и ВнешниеПользователи. Процедура ПрочитатьСведенияОПользователе(Форма) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -1857,7 +1698,7 @@ // Для форм элементов справочников Пользователи и ВнешниеПользователи. Процедура ЗаписатьСведенияОПользователе(Форма, ТекущийОбъект) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -1867,7 +1708,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); НачатьТранзакцию(); Попытка @@ -2002,10 +1842,8 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Пользователь)).ПолноеИмя()); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", Пользователь); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); НачатьТранзакцию(); Попытка @@ -2044,7 +1882,7 @@ Если Параметры.ПриВходеВПрограмму Тогда ТекущийОбъект.ДополнительныеСвойства.Вставить("СменаПароляПриВходеВПрограмму"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ДополнительныеПараметры.ЭтоТекущийПользовательИБ Тогда ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", СтарыйПароль); @@ -2124,7 +1962,7 @@ УстановитьПривилегированныйРежим(Истина); - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстОшибки = ТекстСообщенияТекущийПользовательНедоступенВСеансеБезРазделителей(); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -2153,7 +1991,7 @@ Знач ИдентификаторПользователяИБ = Неопределено, Совпадает = Ложь) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA1); ХешированиеДанных.Добавить(Пароль); @@ -2482,10 +2320,7 @@ КонецЕсли; ПараметрыОбработки.Вставить("Действие", ОписаниеПользователяИБ.Действие); - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриНачалеОбработкиПользователяИБ"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); Если Не ПараметрыОбработки.Свойство("Действие") Тогда Возврат; @@ -2607,10 +2442,8 @@ ПараметрыОбработки.АвтоРеквизиты.ИдентификаторПользователяИБ = ПользовательОбъект.ИдентификаторПользователяИБ; - ОписаниеНовогоПользователяИБ = Неопределено; - Если Пользователи.ПрочитатьПользователяИБ( - ПользовательОбъект.ИдентификаторПользователяИБ, - ОписаниеНовогоПользователяИБ) Тогда + ОписаниеНовогоПользователяИБ = Пользователи.СвойстваПользователяИБ(ПользовательОбъект.ИдентификаторПользователяИБ); + Если ОписаниеНовогоПользователяИБ <> Неопределено Тогда ПараметрыОбработки.Вставить("НовыйПользовательИБСуществует", Истина); ПараметрыОбработки.Вставить("ОписаниеНовогоПользователяИБ", ОписаниеНовогоПользователяИБ); @@ -2748,8 +2581,8 @@ Функция ТребуетсяСоздатьПервогоАдминистратора(Знач ОписаниеПользователяИБ, Текст = Неопределено) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Ложь; КонецЕсли; @@ -2771,18 +2604,13 @@ Если ЗапретРедактированияРолей() ИЛИ Роли.Найти("ПолныеПрава") = Неопределено - ИЛИ Роли.Найти(Пользователи.РольАдминистратораСистемы().Имя) = Неопределено Тогда + ИЛИ Роли.Найти("АдминистраторСистемы") = Неопределено Тогда // Подготовка текста вопроса при записи первого администратора. - Если ВРег(Пользователи.РольАдминистратораСистемы().Имя) = ВРег("ПолныеПрава") Тогда - Текст = НСтр("ru = 'В список пользователей программы добавляется первый пользователь, - |поэтому ему автоматически будет назначена роль ""Полные права"". - |Продолжить?'"); - Иначе - Текст = НСтр("ru = 'В список пользователей программы добавляется первый пользователь, поэтому ему - |автоматически будут назначены роли ""Администратор системы"" и ""Полные права"". - |Продолжить?'"); - КонецЕсли; + Текст = + НСтр("ru = 'В список пользователей программы добавляется первый пользователь, поэтому ему + |автоматически будут назначены роли ""Администратор системы"" и ""Полные права"". + |Продолжить?'"); Если НЕ ЗапретРедактированияРолей() Тогда Возврат Истина; @@ -2805,20 +2633,20 @@ КонецФункции -// Проверяет наличие ролей администратора с учетом модели сервиса и базовых версий. +// Проверяет наличие ролей администратора с учетом модели сервиса. Функция РолиАдминистратораДоступны(ПользовательИБ = Неопределено) Экспорт Если ПользовательИБ = Неопределено Или ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь() Тогда - Возврат РольДоступна(Метаданные.Роли.ПолныеПрава) // Не заменять на РолиДоступны. - И (РольДоступна(Пользователи.РольАдминистратораСистемы(Истина)) // Не заменять на РолиДоступны. - Или ОбщегоНазначенияПовтИсп.РазделениеВключено() ); + Возврат РольДоступна(Метаданные.Роли.ПолныеПрава) // Не заменять на РолиДоступны. + И (РольДоступна(Метаданные.Роли.АдминистраторСистемы) // Не заменять на РолиДоступны. + Или ОбщегоНазначения.РазделениеВключено() ); КонецЕсли; Возврат ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) - И (ПользовательИБ.Роли.Содержит(Пользователи.РольАдминистратораСистемы(Истина)) - Или ОбщегоНазначенияПовтИсп.РазделениеВключено() ); + И (ПользовательИБ.Роли.Содержит(Метаданные.Роли.АдминистраторСистемы) + Или ОбщегоНазначения.РазделениеВключено() ); КонецФункции @@ -3988,7 +3816,7 @@ Таблица22 = Таблица2.Скопировать(, ИмяКолонки); Таблица22.Свернуть(ИмяКолонки); - Для каждого Строка Из Таблица22 Цикл + Для Каждого Строка Из Таблица22 Цикл НоваяСтрока = Таблица11.Добавить(); НоваяСтрока[ИмяКолонки] = Строка[ИмяКолонки]; КонецЦикла; @@ -4008,49 +3836,6 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Обновляет вспомогательные данные, которые зависят только -// от конфигурации. -// Записывает изменения этих данных по версиям конфигурации -// (если изменения есть), чтобы использовать эти изменения -// при обновлении остальных вспомогательных данных, например, -// в обработчике ОбновитьВспомогательныеДанныеПриОбновленииИБ. -// -Процедура ОбновитьПараметрыРаботыПользователей(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыРаботыПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры(ЕстьИзменения, ТолькоПроверка); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - // Вызывается при обновлении конфигурации на версию 1.0.5.2. // Выполняет попытку сопоставления / заполнения реквизита "ИдентификаторПользователяИБ" // для каждого элемента справочника Пользователи. @@ -4309,14 +4094,6 @@ КонецПроцедуры -// Вызывается при переходе на новую версию конфигурации 2.2.3.16. -Процедура УдалитьКэшНеразделенныеДанныеДоступныеДляИзменения() Экспорт - - СтандартныеПодсистемыСервер.УдалитьПараметрРаботыПрограммы( - "ПараметрыРаботыПользователей", "НеразделенныеДанныеДоступныеДляИзменения"); - -КонецПроцедуры - // Вызывается при переходе на новую версию конфигурации 2.3.1.16. Процедура ОчиститьРеквизитПоказыватьВСпискеВыбораУВсехПользователейИБ() Экспорт @@ -4380,14 +4157,6 @@ КонецПроцедуры -// Вызывается при переходе на новую версию конфигурации 2.3.2.4. -Процедура УдалитьКэшНедоступныеРолиПоТипамПользователей() Экспорт - - СтандартныеПодсистемыСервер.УдалитьПараметрРаботыПрограммы( - "ПараметрыРаботыПользователей", "НедоступныеРолиПоТипамПользователей"); - -КонецПроцедуры - // Вызывается при переходе на новую версию конфигурации 2.3.2.30. Процедура ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора() Экспорт @@ -4406,7 +4175,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Константа.НастройкиВходаПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -4440,54 +4208,56 @@ КонецПроцедуры -// Вызывается при переходе на новую версию конфигурации 2.3.4.4. +// Вызывается при переходе на новую версию конфигурации 2.4.1.1. Процедура ДобавитьАдминистраторамПравоОткрытияВнешнихОтчетовИОбработок() Экспорт - Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - И Не ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда - Возврат; // В подчиненных узлах изменения в профилях загружаются из главного узла. - КонецЕсли; - // Чтение общего решения, принятого администратором в форме "Предупреждение безопасности". - ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); - РешениеПринято = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыАдминистрирования, - "ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок"); - Если РешениеПринято <> Неопределено Тогда - Возврат; - КонецЕсли; - ОткрытиеРазрешено = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыАдминистрирования, - "РазрешеноОткрытиеВнешнихОтчетовИОбработок"); + ДобавляемаяРоль = Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок; + РольАдминистратора = Метаданные.Роли.АдминистраторСистемы; + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); - // Удаление старого ключа и регистрация нового ключа. - ПараметрыАдминистрирования.Удалить("РазрешеноОткрытиеВнешнихОтчетовИОбработок"); - Если ОткрытиеРазрешено <> Неопределено Тогда - ПараметрыАдминистрирования.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок", Истина); - КонецЕсли; - СтандартныеПодсистемыСервер.УстановитьПараметрыАдминистрирования(ПараметрыАдминистрирования); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + + Если ПользовательИБ.Роли.Содержит(РольАдминистратора) + И Не ПользовательИБ.Роли.Содержит(ДобавляемаяРоль) Тогда + + ПользовательИБ.Роли.Добавить(ДобавляемаяРоль); + ПользовательИБ.Записать(); + КонецЕсли; + + КонецЦикла; - // Если решение не принято, то право интерактивного открытия включается для всех администраторов. - Если ОткрытиеРазрешено = Неопределено Тогда - ОткрытиеРазрешено = Истина; - КонецЕсли; +КонецПроцедуры + +// Вызывается при переходе на новую версию конфигурации 2.4.1.1. +Процедура ПереименоватьКлючХраненияРешенияПоОткрытиюВнешнихОтчетовИОбработок() Экспорт - // Если открытие разрешено, то включаем администраторам соответствующую роль. - Если ОткрытиеРазрешено Тогда - ДобавляемаяРоль = Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок; - РольАдминистратора = Метаданные.Роли.АдминистраторСистемы; - ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); - Для Каждого ПользовательИБ Из ПользователиИБ Цикл - Если ПользовательИБ.Роли.Содержит(РольАдминистратора) - И Не ПользовательИБ.Роли.Содержит(ДобавляемаяРоль) Тогда - ПользовательИБ.Роли.Добавить(ДобавляемаяРоль); - ПользовательИБ.Записать(); + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("Константа.ПараметрыАдминистрированияИБ"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + ПараметрыАдминистрированияИБ = Константы.ПараметрыАдминистрированияИБ.Получить().Получить(); + + Если ТипЗнч(ПараметрыАдминистрированияИБ) = Тип("Структура") + И ПараметрыАдминистрированияИБ.Свойство("РазрешеноОткрытиеВнешнихОтчетовИОбработок") Тогда + + Если Не ПараметрыАдминистрированияИБ.Свойство("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок") + И ТипЗнч(ПараметрыАдминистрированияИБ.РазрешеноОткрытиеВнешнихОтчетовИОбработок) = Тип("Булево") + И ПараметрыАдминистрированияИБ.РазрешеноОткрытиеВнешнихОтчетовИОбработок Тогда + + ПараметрыАдминистрированияИБ.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок", Истина); КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Создание профиля и включение пользователей с правом в группу доступа. - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено); - КонецЕсли; + ПараметрыАдминистрированияИБ.Удалить("РазрешеноОткрытиеВнешнихОтчетовИОбработок"); + Константы.ПараметрыАдминистрированияИБ.Установить(Новый ХранилищеЗначения(ПараметрыАдминистрированияИБ)); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -4515,24 +4285,21 @@ //////////////////////////////////////////////////////////////////////////////// // Прочие пользовательские настройки. -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт +Процедура ПриПолученииПрочихНастроекПользователя(СведенияОПользователе, Настройки) Экспорт ИнтеграцияСтандартныхПодсистем.ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки); ПользователиПереопределяемый.ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки); КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт +Процедура ПриСохраненииПрочихНастроекПользователя(СведенияОПользователе, Настройки) Экспорт ИнтеграцияСтандартныхПодсистем.ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки); ПользователиПереопределяемый.ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки); КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт +Процедура ПриУдаленииПрочихНастроекПользователя(СведенияОПользователе, Настройки) Экспорт ИнтеграцияСтандартныхПодсистем.ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки); ПользователиПереопределяемый.ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки); @@ -4547,7 +4314,7 @@ // Процедура ОчиститьИдентификаторыНесуществующихПользователейИБ() - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -4639,7 +4406,7 @@ Функция ЗначенияПараметровСеансаТекущийПользователь() - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат ТекстСообщенияТекущийПользовательНедоступенВСеансеБезРазделителей(); КонецЕсли; @@ -4696,7 +4463,7 @@ Результат.Вставить("ИмяПользователя", Неопределено); Результат.Вставить("ПолноеИмяПользователя", Неопределено); Результат.Вставить("ИдентификаторПользователяИБ", Неопределено); - Результат.Вставить("ПользовательНайден", Истина); + Результат.Вставить("ПользовательНайден", Ложь); Результат.Вставить("СоздатьПользователя", Ложь); Результат.Вставить("СсылкаНового", Неопределено); Результат.Вставить("Служебный", Ложь); @@ -4713,11 +4480,11 @@ Результат.СсылкаНового = СвойстваНеуказанногоПользователя.СтандартнаяСсылка; Если СвойстваНеуказанногоПользователя.Ссылка = Неопределено Тогда - Результат.ПользовательНайден = Ложь; Результат.СоздатьПользователя = Истина; Результат.Служебный = Истина; Результат.ИдентификаторПользователяИБ = ""; Иначе + Результат.ПользовательНайден = Истина; Результат.ТекущийПользователь = СвойстваНеуказанногоПользователя.Ссылка; КонецЕсли; @@ -4750,6 +4517,7 @@ Результат.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка(); Результат.ТекущийВнешнийПользователь = Выборка.Ссылка; + Результат.ПользовательНайден = Истина; Возврат Результат; КонецЕсли; @@ -4764,40 +4532,38 @@ Если Выборка.Следующий() Тогда Результат.ТекущийПользователь = Выборка.Ссылка; + Результат.ПользовательНайден = Истина; Возврат Результат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) - И ПользователиИнформационнойБазы.ТекущийПользователь().РазделениеДанных.Количество() = 0 Тогда + ИнтеграцияСТехнологиейСервиса.ПриОтсутствииТекущегоПользователяВСправочнике( + Результат.СоздатьПользователя); + + Если Не Результат.СоздатьПользователя + И Не РолиАдминистратораДоступны() Тогда - Результат.ИдентификаторПользователяИБ = ТекущийПользовательИБ.УникальныйИдентификатор; - Результат.ПолноеИмяПользователя = ТекущийПользовательИБ.ПолноеИмя; - Результат.ПользовательНайден = Ложь; - Результат.СоздатьПользователя = Истина; - Возврат Результат; - КонецЕсли; - - Если Не РолиАдминистратораДоступны() Тогда - Результат.ПользовательНайден = Ложь; Возврат Результат; КонецЕсли; Результат.ИдентификаторПользователяИБ = ТекущийПользовательИБ.УникальныйИдентификатор; Результат.ПолноеИмяПользователя = ТекущийПользовательИБ.ПолноеИмя; + Если Результат.СоздатьПользователя Тогда + Возврат Результат; + КонецЕсли; + ПользовательПоНаименованию = СсылкаПользователяПоПолномуНаименованию( Результат.ПолноеИмяПользователя); Если ПользовательПоНаименованию <> Неопределено Тогда + Результат.ПользовательНайден = Истина; Результат.ТекущийПользователь = ПользовательПоНаименованию; Иначе - Результат.ПользовательНайден = Ложь; Результат.СоздатьПользователя = Истина; КонецЕсли; Возврат Результат; - + КонецФункции Процедура СоздатьТекущегоПользователяВСправочнике(СведенияОПользователе) @@ -4830,10 +4596,8 @@ "ОписаниеПользователяИБ", ОписаниеПользователяИБ); КонецЕсли; - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриСозданииПользователяВМоментВхода"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриСозданииПользователяВМоментВхода(НовыйПользователь); - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриАвтоматическомСозданииТекущегоПользователяВСправочнике( + НовыйПользователь); НовыйПользователь.Записать(); @@ -5463,7 +5227,7 @@ // Процедура ПроверитьПраваПользователя(ПользовательИБ, РежимПроверки, ЭтоВнешнийПользователь) - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если РазделениеВключено И ПользовательИБ.РазделениеДанных.Количество() = 0 Тогда Возврат; // Не нужно проверять неразделенных пользователей в модели сервиса. КонецЕсли; @@ -5472,47 +5236,31 @@ Возврат; // Не нужно проверять права пользователей при запуске в локальном режиме. КонецЕсли; - Если ЭтоВнешнийПользователь Тогда - - НазначениеРолейПользователя = "ДляВнешнихПользователей"; - - ИначеЕсли Не РазделениеВключено И Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) Тогда - // Пользователь с ролью АдминистраторСистемы в локальном режиме работы - // может выдавать административные права. - НазначениеРолейПользователя = "ДляАдминистраторов"; - Иначе - НазначениеРолейПользователя = "ДляПользователей"; - КонецЕсли; - НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеРолейПользователя); + НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРолиПоТипуПользователя(ЭтоВнешнийПользователь); РолиДляПроверки = Новый ТаблицаЗначений; РолиДляПроверки.Колонки.Добавить("Роль", Новый ОписаниеТипов("ОбъектМетаданных")); - РолиДляПроверки.Колонки.Добавить("ЭтоУдаляемаяРоль", Новый ОписаниеТипов("Булево")); Для Каждого Роль Из ПользовательИБ.Роли Цикл РолиДляПроверки.Добавить().Роль = Роль; КонецЦикла; РолиДляПроверки.Индексы.Добавить("Роль"); - ПрежнийПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ПользовательИБ.УникальныйИдентификатор); - - Если ПрежнийПользовательИБ <> Неопределено Тогда - Для Каждого Роль Из ПрежнийПользовательИБ.Роли Цикл - Строка = РолиДляПроверки.Найти(Роль, "Роль"); - Если Не РазделениеВключено И РежимПроверки = "ПередЗаписью" Тогда + Если Не РазделениеВключено И РежимПроверки = "ПередЗаписью" Тогда + + ПрежнийПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ПользовательИБ.УникальныйИдентификатор); + + Если ПрежнийПользовательИБ <> Неопределено Тогда + Для Каждого Роль Из ПрежнийПользовательИБ.Роли Цикл + Строка = РолиДляПроверки.Найти(Роль, "Роль"); Если Строка <> Неопределено Тогда РолиДляПроверки.Удалить(Строка); КонецЕсли; - ИначеЕсли Строка = Неопределено Тогда - Строка = РолиДляПроверки.Добавить(); - Строка.Роль = Роль; - Строка.ЭтоУдаляемаяРоль = Истина; - КонецЕсли; - КонецЦикла; + КонецЦикла; + КонецЕсли; КонецЕсли; - УдаляемыеНедоступныеРоли = ""; ДобавляемыеНедоступныеРоли = ""; НазначениеРолей = Неопределено; @@ -5522,16 +5270,10 @@ Если НедоступныеРоли.Получить(ИмяРоли) = Неопределено Тогда Продолжить; - ИначеЕсли РежимПроверки = "ПередЗаписью" - И Не ОписаниеРоли.ЭтоУдаляемаяРоль Тогда - Если ПользовательИБ.Роли.Содержит(Роль) Тогда - ПользовательИБ.Роли.Удалить(Роль); - КонецЕсли; - Продолжить; КонецЕсли; Если НазначениеРолей = Неопределено Тогда - НазначениеРолей = ПользователиСлужебныйПовтИсп.Параметры().НазначениеРолей; + НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей(); КонецЕсли; Если НазначениеРолей.ТолькоДляАдминистраторовСистемы.Получить(ИмяРоли) <> Неопределено Тогда @@ -5541,33 +5283,21 @@ И НазначениеРолей.ТолькоДляПользователейСистемы.Получить(ИмяРоли) <> Неопределено Тогда ТекстШаблона = НСтр("ru = '""%1"" (предназначена только для пользователей системы)'"); - Иначе - Если ОписаниеРоли.ЭтоУдаляемаяРоль Тогда - Продолжить; - КонецЕсли; - Если НазначениеРолей.ТолькоДляВнешнихПользователей.Получить(ИмяРоли) <> Неопределено Тогда - ТекстШаблона = НСтр("ru = '""%1"" (предназначена только для внешних пользователей)'"); - - Иначе // Это внешний пользователь. - ТекстШаблона = НСтр("ru = '""%1"" (предназначена только для пользователей)'"); - КонецЕсли; + + ИначеЕсли НазначениеРолей.ТолькоДляВнешнихПользователей.Получить(ИмяРоли) <> Неопределено Тогда + ТекстШаблона = НСтр("ru = '""%1"" (предназначена только для внешних пользователей)'"); + + Иначе // Это внешний пользователь. + ТекстШаблона = НСтр("ru = '""%1"" (предназначена только для пользователей)'"); КонецЕсли; - Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстШаблона, Роль.Представление()) + Символы.ПС; - - Если ОписаниеРоли.ЭтоУдаляемаяРоль Тогда - УдаляемыеНедоступныеРоли = УдаляемыеНедоступныеРоли + Представление; - Иначе - ДобавляемыеНедоступныеРоли = ДобавляемыеНедоступныеРоли + Представление; - КонецЕсли; + ДобавляемыеНедоступныеРоли = ДобавляемыеНедоступныеРоли + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстШаблона, Роль.Представление()) + Символы.ПС;; КонецЦикла; - УдаляемыеНедоступныеРоли = СокрЛП(УдаляемыеНедоступныеРоли); ДобавляемыеНедоступныеРоли = СокрЛП(ДобавляемыеНедоступныеРоли); - Если Не ЗначениеЗаполнено(УдаляемыеНедоступныеРоли) - И Не ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда - + Если Не ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда Возврат; КонецЕсли; @@ -5595,21 +5325,6 @@ ВызватьИсключение ТекстСообщенияВхода; КонецЕсли; - Если СтрЧислоСтрок(УдаляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(УдаляемыеНедоступныеРоли) Тогда - ТекстРегистрацииУдаления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка удалить пользователю %1 недоступную роль - |""%2"".'"), - ПользовательИБ.ПолноеИмя, УдаляемыеНедоступныеРоли); - - ИначеЕсли СтрЧислоСтрок(УдаляемыеНедоступныеРоли) > 1 Тогда - ТекстРегистрацииУдаления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка удалить пользователю %1 недоступные роли: - |%2.'"), - ПользовательИБ.ПолноеИмя, УдаляемыеНедоступныеРоли); - Иначе - ТекстРегистрацииУдаления = ""; - КонецЕсли; - Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда ТекстРегистрацииДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Попытка назначить пользователю %1 недоступную роль: @@ -5625,25 +5340,12 @@ ТекстРегистрацииДобавления = ""; КонецЕсли; - ТекстРегистрации = СокрЛП(ТекстРегистрацииУдаления + Символы.ПС + Символы.ПС + ТекстРегистрацииДобавления); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , ПользовательИБ, - ТекстРегистрации); - - Если СтрЧислоСтрок(УдаляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(УдаляемыеНедоступныеРоли) Тогда - ТекстСообщенияУдаления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользователю ""%1"" невозможно удалить недоступную роль.'"), - ПользовательИБ.ПолноеИмя); - ИначеЕсли СтрЧислоСтрок(УдаляемыеНедоступныеРоли) > 1 Тогда - ТекстСообщенияУдаления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользователю ""%1"" невозможно удалить недоступные роли.'"), - ПользовательИБ.ПолноеИмя); - Иначе - ТекстСообщенияУдаления = ""; - КонецЕсли; + ТекстРегистрацииДобавления); Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда ТекстСообщенияДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользователю ""%1"" невозможно назначить недоступную роль + НСтр("ru = 'Пользователю ""%1"" невозможно назначить недоступную роль: |%2.'"), ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); @@ -5656,9 +5358,7 @@ ТекстСообщенияДобавления = ""; КонецЕсли; - ТекстСообщения = СокрЛП(ТекстСообщенияУдаления + Символы.ПС + Символы.ПС + ТекстСообщенияДобавления); - - ВызватьИсключение ТекстСообщения; + ВызватьИсключение ТекстСообщенияДобавления; КонецПроцедуры @@ -5732,7 +5432,7 @@ // Получение прочих настроек. ПрочиеНастройкиПользователей = Новый Структура; - ПриПолученииПрочихНастроек(СведенияОПользователеИсточнике, ПрочиеНастройкиПользователей); + ПриПолученииПрочихНастроекПользователя(СведенияОПользователеИсточнике, ПрочиеНастройкиПользователей); Ключи = Новый СписокЗначений; МассивПрочихНастроек = Новый Массив; Если ПрочиеНастройкиПользователей.Количество() <> 0 Тогда @@ -5750,7 +5450,7 @@ ПрочиеНастройкиСтруктура.Вставить("ИдентификаторНастройки", ПрочаяНастройка.Ключ); ПрочиеНастройкиСтруктура.Вставить("ЗначениеНастройки", ПрочаяНастройка.Значение.СписокНастроек); КонецЕсли; - ПриСохраненииПрочихНастроек(СведенияОПользователеПриемнике, ПрочиеНастройкиСтруктура); + ПриСохраненииПрочихНастроекПользователя(СведенияОПользователеПриемнике, ПрочиеНастройкиСтруктура); КонецЦикла; КонецЕсли; @@ -5774,11 +5474,9 @@ Возврат; КонецЕсли; - ОписаниеКопируемогоПользователяИБ = Неопределено; УстановитьПривилегированныйРежим(Истина); - Если НЕ Пользователи.ПрочитатьПользователяИБ( - ИдентификаторКопируемогоПользователяИБ, - ОписаниеКопируемогоПользователяИБ) Тогда + ОписаниеКопируемогоПользователяИБ = Пользователи.СвойстваПользователяИБ(ИдентификаторКопируемогоПользователяИБ); + Если ОписаниеКопируемогоПользователяИБ = Неопределено Тогда Возврат; КонецЕсли; УстановитьПривилегированныйРежим(Ложь); @@ -5790,37 +5488,167 @@ КонецПроцедуры +Процедура ПроверитьСоставПравРолей(НедоступныеПрава, ОписаниеРолей, ОбщийТекстОшибки, ЗаголовокОшибки, СписокОшибок, НеразделенныеДанные = Неопределено) + + ТекстОшибки = ""; + + Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл + Роль = ОписаниеРоли.Ключ; + Для Каждого НедоступноеПраво Из НедоступныеПрава Цикл + Если ПравоДоступа(НедоступноеПраво, Метаданные, Роль) Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" содержит недоступное право %2.'"), + Роль, НедоступноеПраво); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(Роль, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если НеразделенныеДанные = Неопределено Тогда + Продолжить; + КонецЕсли; + Для Каждого СвойстваДанных Из НеразделенныеДанные Цикл + ОбъектМетаданных = СвойстваДанных.Значение; + Если Не ПравоДоступа("Чтение", ОбъектМетаданных, Роль) Тогда + Продолжить; + КонецЕсли; + Если ПравоДоступа("Изменение", ОбъектМетаданных, Роль) Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" содержит право Изменение неразделенного объекта %2.'"), + Роль, ОбъектМетаданных.ПолноеИмя()); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); + КонецЕсли; + КонецЕсли; + Если СвойстваДанных.Представление = "" Тогда + Продолжить; // Не ссылочный объект метаданных. + КонецЕсли; + Если ПравоДоступа("Добавление", ОбъектМетаданных, Роль) Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" содержит право Добавление неразделенного объекта %2.'"), + Роль, ОбъектМетаданных.ПолноеИмя()); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); + КонецЕсли; + КонецЕсли; + Если ПравоДоступа("Удаление", ОбъектМетаданных, Роль) Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" содержит право Удаление неразделенного объекта %2.'"), + Роль, ОбъектМетаданных.ПолноеИмя()); + Если СписокОшибок = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; + Иначе + СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ОбщийТекстОшибки = ОбщийТекстОшибки + Символы.ПС + Символы.ПС + + ЗаголовокОшибки + ТекстОшибки; + КонецЕсли; + +КонецПроцедуры + +Функция НеразделенныеДанные() + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + Возврат Неопределено; + КонецЕсли; + + Список = Новый СписокЗначений; + + ВидыМетаданных = Новый Массив; + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыОбмена, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Константы, Ложь)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Справочники, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Последовательности, Ложь)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Документы, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыВидовХарактеристик, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыСчетов, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыВидовРасчета, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.БизнесПроцессы, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Задачи, Истина)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыСведений, Ложь)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыНакопления, Ложь)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыБухгалтерии, Ложь)); + ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыРасчета, Ложь)); + + УстановитьПривилегированныйРежим(Истина); + + МодульРаботаВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаПовтИсп"); + МодельДанных = МодульРаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); + + РазделенныеОбъектыМетаданных = Новый Соответствие; + Для Каждого ЭлементМоделиДанных Из МодельДанных Цикл + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ЭлементМоделиДанных.Ключ); + РазделенныеОбъектыМетаданных.Вставить(ОбъектМетаданных, Истина); + КонецЦикла; + + Для Каждого ОписаниеВида Из ВидыМетаданных Цикл // По видам метаданных. + Для Каждого ОбъектМетаданных Из ОписаниеВида.Вид Цикл // По объектам вида. + + Если РазделенныеОбъектыМетаданных.Получить(ОбъектМетаданных) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Список.Добавить(ОбъектМетаданных, ?(ОписаниеВида.Ссылочный, "Ссылочный", "")); + КонецЦикла; + КонецЦикла; + + Возврат Список; + +КонецФункции + Функция КлючПредупрежденияБезопасностиПриЗапуске() + Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) Тогда Возврат Неопределено; // В базе без пользователей предупреждение не требуется. КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат Неопределено; // В модели сервиса предупреждение не требуется. КонецЕсли; + Если ПривилегированныйРежим() Тогда Возврат Неопределено; // С ключом запуска "/UsePrivilegedMode" предупреждение не требуется. КонецЕсли; + Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - И Не ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + И Не ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Возврат Неопределено; // В подчиненных узлах предупреждение не требуется. КонецЕсли; УстановитьПривилегированныйРежим(Истина); + Если Не ПривилегированныйРежим() Тогда + Возврат Неопределено; // В безопасном режиме предупреждение не требуется. + КонецЕсли; + ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); - РешениеПринято = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - ПараметрыАдминистрирования, - "ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок"); + РешениеПринято = ПараметрыАдминистрирования.ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок; + Если ТипЗнч(РешениеПринято) <> Тип("Булево") Тогда + РешениеПринято = Ложь; + КонецЕсли; УстановитьПривилегированныйРежим(Ложь); ЭтоАдминистраторСистемы = Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь); - Если ЭтоАдминистраторСистемы И РешениеПринято = Неопределено Тогда + Если ЭтоАдминистраторСистемы И Не РешениеПринято Тогда Возврат "ПослеОбновления"; КонецЕсли; - Если РешениеПринято <> Неопределено Тогда + Если РешениеПринято Тогда Если ПравоДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные) - Или ПравоДоступа("ИнтерактивноеОткрытиеВнешнихОтчетов", Метаданные) Тогда - ПользовательОзнакомлен = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПредупреждениеБезопасности", "ПользовательОзнакомлен", Ложь); + Или ПравоДоступа("ИнтерактивноеОткрытиеВнешнихОтчетов", Метаданные) Тогда + + ПользовательОзнакомлен = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( + "ПредупреждениеБезопасности", "ПользовательОзнакомлен", Ложь); + Если Не ПользовательОзнакомлен Тогда Возврат "ПослеПоявленияПрава"; КонецЕсли; @@ -5828,6 +5656,7 @@ КонецЕсли; Возврат Неопределено; + КонецФункции //////////////////////////////////////////////////////////////////////////////// @@ -5873,7 +5702,7 @@ ИЛИ ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ГруппыВнешнихПользователей") ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.СоставыГруппПользователей") Тогда - Если ОтПодчиненного И ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОтПодчиненного И ОбщегоНазначения.РазделениеВключено() Тогда // Получение данных из автономного рабочего места пропускается, а для соответствия // данных в узлах, текущие данные отправляются обратно в автономное рабочее место. @@ -5912,13 +5741,6 @@ КонецПроцедуры -// Переопределяет поведение после получения данных в распределенной ИБ. -Процедура ПослеПолученияДанных(Отправитель, Отказ, ОтПодчиненного) - - ОбновитьРолиВнешнихПользователей(); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Для процедур: // - ПриДобавленииПараметровРаботыКлиентаПриЗапуске, @@ -5927,7 +5749,7 @@ // Обновляет дату последней активности и проверяет необходимость смены пароля. Функция ТребуетсяСменитьПароль(ОписаниеОшибки = "", ПриЗапуске = Ложь, РегистрироватьВЖурнале = Истина) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат Ложь; КонецЕсли; @@ -5943,7 +5765,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Пользователь", ТекущийПользователь); НачатьТранзакцию(); Попытка @@ -6067,7 +5888,7 @@ Формат(МинимальнаяДлинаПароля, "ЧГ=")); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат ""; // Проверка сложности пароля в разделенном режиме невозможна. КонецЕсли; @@ -6213,10 +6034,8 @@ // Свойства старого пользователя ИБ (если существует). УстановитьПривилегированныйРежим(Истина); - ОписаниеСтарогоПользователяИБ = Неопределено; - ПараметрыОбработки.Вставить("СтарыйПользовательИБСуществует", Пользователи.ПрочитатьПользователяИБ( - СтарыйПользователь.ИдентификаторПользователяИБ, ОписаниеСтарогоПользователяИБ)); - + ОписаниеСтарогоПользователяИБ = Пользователи.СвойстваПользователяИБ(СтарыйПользователь.ИдентификаторПользователяИБ); + ПараметрыОбработки.Вставить("СтарыйПользовательИБСуществует", ОписаниеСтарогоПользователяИБ <> Неопределено); ПараметрыОбработки.Вставить("СтарыйПользовательИБТекущий", Ложь); Если ПараметрыОбработки.СтарыйПользовательИБСуществует Тогда @@ -6262,7 +6081,7 @@ ИдентификаторПользователяИБ = СтарыйПользователь.ИдентификаторПользователяИБ; СоздатьНовогоПользователяИБ = НЕ ПараметрыОбработки.СтарыйПользовательИБСуществует; Иначе - ИдентификаторПользователяИБ = Неопределено; + ИдентификаторПользователяИБ = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); СоздатьНовогоПользователяИБ = Истина; КонецЕсли; @@ -6374,17 +6193,9 @@ КонецЕсли; // Попытка записи пользователя ИБ. - ТекстОшибки = ""; - ПользовательИБ = ПользовательОбъект; - Если НЕ Пользователи.ЗаписатьПользователяИБ( - ИдентификаторПользователяИБ, - ОписаниеПользователяИБ, - СоздатьНовогоПользователяИБ, - ТекстОшибки, - ПользовательИБ) Тогда - - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Пользователи.УстановитьСвойстваПользователяИБ(ИдентификаторПользователяИБ, ОписаниеПользователяИБ, + СоздатьНовогоПользователяИБ, ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи")); + ПользовательИБ = ОписаниеПользователяИБ.ПользовательИБ; Если ПользовательОбъект.ДополнительныеСвойства.Свойство("СозданиеАдминистратора") И ЗначениеЗаполнено(ПользовательОбъект.ДополнительныеСвойства.СозданиеАдминистратора) @@ -6432,30 +6243,16 @@ Если ПараметрыОбработки.СтарыйПользовательИБСуществует Тогда УстановитьПривилегированныйРежим(Истина); - - ТекстОшибки = ""; - ПользовательИБ = Неопределено; - Если Пользователи.УдалитьПользователяИБ( - СтарыйПользователь.ИдентификаторПользователяИБ, - ТекстОшибки, - ПользовательИБ) Тогда + Пользователи.УдалитьПользователяИБ(СтарыйПользователь.ИдентификаторПользователяИБ); - // Установка идентификатора удаляемого пользователя ИБ, как результата действия Удалить. - ОписаниеПользователяИБ.Вставить("УникальныйИдентификатор", - СтарыйПользователь.ИдентификаторПользователяИБ); - - ОписаниеПользователяИБ.Вставить("РезультатДействия", "УдаленПользовательИБ"); - Иначе - ВызватьИсключение ТекстОшибки; - КонецЕсли; + // Установка идентификатора удаляемого пользователя ИБ, как результата действия Удалить. + ОписаниеПользователяИБ.Вставить("УникальныйИдентификатор", СтарыйПользователь.ИдентификаторПользователяИБ); + ОписаниеПользователяИБ.Вставить("РезультатДействия", "УдаленПользовательИБ"); ИначеЕсли ЗначениеЗаполнено(СтарыйПользователь.ИдентификаторПользователяИБ) Тогда - - ОписаниеПользователяИБ.Вставить( - "РезультатДействия", "ОчищеноСопоставлениеСНесуществующимПользователемИБ"); + ОписаниеПользователяИБ.Вставить("РезультатДействия", "ОчищеноСопоставлениеСНесуществующимПользователемИБ"); Иначе - ОписаниеПользователяИБ.Вставить( - "РезультатДействия", "НеТребуетсяУдалениеПользовательИБ"); + ОписаниеПользователяИБ.Вставить("РезультатДействия", "НеТребуетсяУдалениеПользовательИБ"); КонецЕсли; КонецФункции @@ -6541,7 +6338,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); НачатьТранзакцию(); Попытка @@ -6666,11 +6462,7 @@ Продолжить; КонецЕсли; Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Пользователь)).ПолноеИмя()); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - ЭлементБлокировки.УстановитьЗначение("Ссылка", Пользователь); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); НачатьТранзакцию(); Попытка @@ -6691,12 +6483,9 @@ ОбновляемыеСвойства.Вставить("АутентификацияСтандартная", Ложь); ОбновляемыеСвойства.Вставить("АутентификацияОС", Ложь); ОбновляемыеСвойства.Вставить("АутентификацияOpenID", Ложь); - ТекстОшибки = ""; - ТекущийПользователь = Пользователь; // В ТекущийПользователь возвращается ПользовательИБ. - Если Не Пользователи.ЗаписатьПользователяИБ(ПользовательИБ.УникальныйИдентификатор, - ОбновляемыеСвойства, Ложь, ТекстОшибки, ТекущийПользователь) Тогда - ВызватьИсключение ТекстОшибки; - КонецЕсли; + + Пользователи.УстановитьСвойстваПользователяИБ(ПользовательИБ.УникальныйИдентификатор, + ОбновляемыеСвойства, Ложь, ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); КонецЕсли; НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); @@ -6771,21 +6560,37 @@ КоллекцияРолей.Очистить(); ДобавленныеРоли = Новый Соответствие; - Для Каждого ОписаниеРоли Из ПрочитанныеРоли Цикл - Роль = ?(ТипЗнч(ПрочитанныеРоли) = Тип("Массив"), ОписаниеРоли, ОписаниеРоли.Роль); - Если ДобавленныеРоли.Получить(Роль) <> Неопределено Тогда - Продолжить; - КонецЕсли; - ДобавленныеРоли.Вставить(Роль, Истина); - Если ТипЗнч(Роль) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - ИмяРоли = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Роль, "Имя"); - ИмяРоли = ?(ИмяРоли = Неопределено, "(" + Роль.УникальныйИдентификатор() + ")", ИмяРоли); - ИмяРоли = ?(Лев(ИмяРоли, 1) = "?", Сред(ИмяРоли, 2), ИмяРоли); - КоллекцияРолей.Добавить().Роль = СокрЛП(ИмяРоли); - Иначе + Если ТипЗнч(ПрочитанныеРоли) = Тип("Массив") Тогда + Для Каждого Роль Из ПрочитанныеРоли Цикл + Если ДобавленныеРоли.Получить(Роль) <> Неопределено Тогда + Продолжить; + КонецЕсли; + ДобавленныеРоли.Вставить(Роль, Истина); КоллекцияРолей.Добавить().Роль = Роль; - КонецЕсли; - КонецЦикла; + КонецЦикла; + Иначе + ИдентификаторыРолей = Новый Массив; + Для Каждого Строка Из ПрочитанныеРоли Цикл + Если ТипЗнч(Строка.Роль) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") + Или ТипЗнч(Строка.Роль) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + ИдентификаторыРолей.Добавить(Строка.Роль); + КонецЕсли; + КонецЦикла; + ПрочитанныеРоли = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам( + ИдентификаторыРолей, Истина); + + Для Каждого ОписаниеРоли Из ПрочитанныеРоли Цикл + Если ТипЗнч(ОписаниеРоли.Значение) <> Тип("ОбъектМетаданных") Тогда + Роль = ОписаниеРоли.Ключ; + ИмяРоли = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Роль, "Имя"); + ИмяРоли = ?(ИмяРоли = Неопределено, "(" + Роль.УникальныйИдентификатор() + ")", ИмяРоли); + ИмяРоли = ?(Лев(ИмяРоли, 1) = "?", ИмяРоли, "? " + СокрЛ(ИмяРоли)); + КоллекцияРолей.Добавить().Роль = СокрЛП(ИмяРоли); + Иначе + КоллекцияРолей.Добавить().Роль = ОписаниеРоли.Значение.Имя; + КонецЕсли; + КонецЦикла; + КонецЕсли; ОбновитьДеревоРолей(Параметры); @@ -7028,7 +6833,8 @@ КонецЕсли; Синоним = ВсеРоли.Получить(Строка.Роль); Если Синоним = Неопределено Тогда - НесуществующиеРоли.Добавить(Строка.Роль, "? " + Строка.Роль); + НесуществующиеРоли.Добавить(Строка.Роль, + ?(Лев(Строка.Роль, 1) = "?", Строка.Роль, "? " + Строка.Роль)); Иначе НедоступныеРоли.Добавить(Строка.Роль, Синоним); КонецЕсли; @@ -7285,17 +7091,14 @@ Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", Новый УникальныйИдентификатор); Выгрузка = Запрос.Выполнить().Выгрузить(); + Выгрузка.Индексы.Добавить("ИдентификаторПользователяИБ"); ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); ПользователейДобавленоВКонфигураторе = 0; Для Каждого ПользовательИБ Из ПользователиИБ Цикл - СвойстваПользовательИБ = Пользователи.НовоеОписаниеПользователяИБ(); - Пользователи.ПрочитатьПользователяИБ(ПользовательИБ.УникальныйИдентификатор, СвойстваПользовательИБ); - - Строка = Выгрузка.Найти(СвойстваПользовательИБ.УникальныйИдентификатор, "ИдентификаторПользователяИБ"); - + Строка = Выгрузка.Найти(ПользовательИБ.УникальныйИдентификатор, "ИдентификаторПользователяИБ"); Если Строка = Неопределено Тогда ПользователейДобавленоВКонфигураторе = ПользователейДобавленоВКонфигураторе + 1; КонецЕсли; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl index 4d4452b34..51392b6dc 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl @@ -1,107 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи в модели сервиса". -// -/////////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Только для внутреннего использования. -Процедура ОбновитьОписаниеWebСервисаМенеджераСервиса() Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - // Кэш должен быть заполнен до записи пользователя ИБ. - РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); - УстановитьПривилегированныйРежим(Ложь); - -КонецПроцедуры - -// Только для внутреннего использования. -Функция ЕстьПравоДобавленияПользователей() Экспорт - - УстановитьПривилегированныйРежим(Истина); - Прокси = РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); - УстановитьПривилегированныйРежим(Ложь); - - ОбластьДанных = Прокси.ФабрикаXDTO.Создать( - Прокси.ФабрикаXDTO.Тип("http://www.1c.ru/SaaS/ApplicationAccess", "Zone")); - ОбластьДанных.Zone = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - - ИнформацияОбОшибке = Неопределено; - ПраваДоступаXDTO = Прокси.GetAccessRights(ОбластьДанных, - ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); - ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetAccessRights"); // Имя операции не локализуется. - - Для каждого ЭлементСпискаПрав Из ПраваДоступаXDTO.Item Цикл - Если ЭлементСпискаПрав.AccessRight = "CreateUser" Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -// Только для внутреннего использования. -Функция ДействияСНовымПользователемСервиса() Экспорт - - ДействияСПользователемСервиса = НовыеДействияСПользователемСервиса(); - ДействияСПользователемСервиса.ИзменениеПароля = Истина; - ДействияСПользователемСервиса.ИзменениеИмени = Истина; - ДействияСПользователемСервиса.ИзменениеПолногоИмени = Истина; - ДействияСПользователемСервиса.ИзменениеДоступа = Истина; - ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа = Истина; - - ДействияСКИ = ДействияСПользователемСервиса.КонтактнаяИнформация; - Для каждого КлючИЗначение Из РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO() Цикл - ДействияСКИ[КлючИЗначение.Ключ].Изменение = Истина; - КонецЦикла; - - Возврат ДействияСПользователемСервиса; - -КонецФункции - -// Только для внутреннего использования. -Функция ДействияССуществующимПользователемСервиса(Знач Пользователь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - Прокси = РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); - УстановитьПривилегированныйРежим(Ложь); - - ОбъектыДоступа = ПодготовитьОбъектыДоступаПользователя(Прокси.ФабрикаXDTO, Пользователь); - - ИнформацияОбОшибке = Неопределено; - ПраваДоступаОбъектовXDTO = Прокси.GetObjectsAccessRights(ОбъектыДоступа, - ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); - ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetObjectsAccessRights"); // Имя операции не локализуется. - - Возврат ПраваДоступаОбъектовXDTOВДействияСПользователемСервиса(Прокси.ФабрикаXDTO, ПраваДоступаОбъектовXDTO); - -КонецФункции - -// Только для внутреннего использования. -Функция ДействияСПользователемСервисаПриНедоступностиНастройкиПользователей() Экспорт - - ДействияСПользователемСервиса = НовыеДействияСПользователемСервиса(); - ДействияСПользователемСервиса.ИзменениеПароля = Ложь; - ДействияСПользователемСервиса.ИзменениеИмени = Ложь; - ДействияСПользователемСервиса.ИзменениеПолногоИмени = Ложь; - ДействияСПользователемСервиса.ИзменениеДоступа = Ложь; - ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа = Ложь; - - ДействияСКИ = ДействияСПользователемСервиса.КонтактнаяИнформация; - Для каждого КлючИЗначение Из РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO() Цикл - ДействияСКИ[КлючИЗначение.Ключ].Изменение = Ложь; - КонецЦикла; - - Возврат ДействияСПользователемСервиса; - -КонецФункции - -#КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -266,12 +162,14 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + // Обработка пользователя ИБ в ходе записи элемента справочника Пользователи и ВнешниеПользователи. // Вызывается из процедуры НачатьОбработкуПользователяИБ для поддержки модели сервиса. Процедура ПередНачаломОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки) Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -280,7 +178,7 @@ АвтоРеквизиты = ПараметрыОбработки.АвтоРеквизиты; Если ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи") - И ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + И РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда ВызватьИсключение НСтр("ru = 'Внешние пользователи не поддерживаются в модели сервиса.'"); КонецЕсли; @@ -289,7 +187,7 @@ Если ДополнительныеСвойства.Свойство("ОбработкаСообщенияКаналаУдаленногоАдминистрирования") Тогда - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() Тогда ВызватьИсключение НСтр("ru = 'Обновление пользователя по сообщению |канала удаленного администрирования @@ -341,7 +239,7 @@ // Вызывается из процедуры НачатьОбработкуПользователяИБ для поддержки модели сервиса. Процедура ПослеНачалаОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки) Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -350,7 +248,7 @@ ПараметрыОбработки.Вставить("СоздатьПользователяСервиса", Ложь); Если ПараметрыОбработки.НовыйПользовательИБСуществует - И ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + И РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Если НЕ ЗначениеЗаполнено(АвтоРеквизиты.ИдентификаторПользователяСервиса) Тогда @@ -367,7 +265,7 @@ // Вызывается из процедуры ЗавершитьОбработкуПользователяИБ для поддержки модели сервиса. Процедура ПередЗавершениемОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки) Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -386,7 +284,7 @@ // Вызывается из процедуры ЗавершитьОбработкуПользователяИБ для поддержки модели сервиса. Процедура ПриЗавершенииОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки, ОбновлятьРоли) Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -396,7 +294,7 @@ ОписаниеПользователяИБ = ПользовательОбъект.ДополнительныеСвойства.ОписаниеПользователяИБ; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.Пользователи") И ОписаниеПользователяИБ.Свойство("РезультатДействия") И НЕ ПользовательОбъект.Служебный Тогда @@ -418,6 +316,121 @@ #Область СлужебныеПроцедурыИФункции +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Структура - действия с пользователем сервиса см. НовыеДействияСПользователемСервиса. +// +Функция ДействияСПользователемСервисаПриНедоступностиНастройкиПользователей() + + ДействияСПользователемСервиса = НовыеДействияСПользователемСервиса(); + ДействияСПользователемСервиса.ИзменениеПароля = Ложь; + ДействияСПользователемСервиса.ИзменениеИмени = Ложь; + ДействияСПользователемСервиса.ИзменениеПолногоИмени = Ложь; + ДействияСПользователемСервиса.ИзменениеДоступа = Ложь; + ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа = Ложь; + + ДействияСКИ = ДействияСПользователемСервиса.КонтактнаяИнформация; + Для каждого КлючИЗначение Из РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO() Цикл + ДействияСКИ[КлючИЗначение.Ключ].Изменение = Ложь; + КонецЦикла; + + Возврат ДействияСПользователемСервиса; + +КонецФункции + +// Только для внутреннего использования. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи - пользователь. +// +// Возвращаемое значение: +// Структура - действия с пользователем сервиса см. НовыеДействияСПользователемСервиса. +// +Функция ДействияССуществующимПользователемСервиса(Знач Пользователь) + + УстановитьПривилегированныйРежим(Истина); + Прокси = РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); + УстановитьПривилегированныйРежим(Ложь); + + ОбъектыДоступа = ПодготовитьОбъектыДоступаПользователя(Прокси.ФабрикаXDTO, Пользователь); + + ИнформацияОбОшибке = Неопределено; + ПраваДоступаОбъектовXDTO = Прокси.GetObjectsAccessRights(ОбъектыДоступа, + ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetObjectsAccessRights"); // Имя операции не локализуется. + + Возврат ПраваДоступаОбъектовXDTOВДействияСПользователемСервиса(Прокси.ФабрикаXDTO, ПраваДоступаОбъектовXDTO); + +КонецФункции + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Структура - действия с пользователем сервиса см. НовыеДействияСПользователемСервиса. +// +Функция ДействияСНовымПользователемСервиса() + + ДействияСПользователемСервиса = НовыеДействияСПользователемСервиса(); + ДействияСПользователемСервиса.ИзменениеПароля = Истина; + ДействияСПользователемСервиса.ИзменениеИмени = Истина; + ДействияСПользователемСервиса.ИзменениеПолногоИмени = Истина; + ДействияСПользователемСервиса.ИзменениеДоступа = Истина; + ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа = Истина; + + ДействияСКИ = ДействияСПользователемСервиса.КонтактнаяИнформация; + Для каждого КлючИЗначение Из РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO() Цикл + ДействияСКИ[КлючИЗначение.Ключ].Изменение = Истина; + КонецЦикла; + + Возврат ДействияСПользователемСервиса; + +КонецФункции + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Булево - Истина, если есть право. +// +Функция ЕстьПравоДобавленияПользователей() + + УстановитьПривилегированныйРежим(Истина); + Прокси = РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); + УстановитьПривилегированныйРежим(Ложь); + + ОбластьДанных = Прокси.ФабрикаXDTO.Создать( + Прокси.ФабрикаXDTO.Тип("http://www.1c.ru/SaaS/ApplicationAccess", "Zone")); + ОбластьДанных.Zone = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + + ИнформацияОбОшибке = Неопределено; + ПраваДоступаXDTO = Прокси.GetAccessRights(ОбластьДанных, + ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetAccessRights"); // Имя операции не локализуется. + + Для каждого ЭлементСпискаПрав Из ПраваДоступаXDTO.Item Цикл + Если ЭлементСпискаПрав.AccessRight = "CreateUser" Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +// Только для внутреннего использования. +Процедура ОбновитьОписаниеWebСервисаМенеджераСервиса() + + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + // Кэш должен быть заполнен до записи пользователя ИБ. + РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(); + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + // Для процедуры ПриЗавершенииОбработкиПользователяИБ. Процедура ОбновитьПользователяСервиса(ПользовательОбъект, СоздатьПользователяСервиса) @@ -484,7 +497,7 @@ ИнформацияОбОшибке = Неопределено; Прокси.GrantUserAccess( - ОбщегоНазначения.ЗначениеРазделителяСеанса(), + РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), ИдентификаторПользователяСервиса, ИнформацияОбОшибке); ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GrantUserAccess"); // Имя операции не локализуется. @@ -500,10 +513,11 @@ НачатьТранзакцию(); Попытка + ВызываемыйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияПриложениямиИнтерфейс"); Сообщение = СообщенияВМоделиСервиса.НовоеСообщение( - СообщенияУправленияПриложениямиИнтерфейс.СообщениеАннулироватьДоступПользователя()); + ВызываемыйМодуль.СообщениеАннулироватьДоступПользователя()); - Сообщение.Body.Zone = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Сообщение.Body.Zone = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Сообщение.Body.UserServiceID = ПользовательОбъект.ИдентификаторПользователяСервиса; СообщенияВМоделиСервиса.ОтправитьСообщение( @@ -648,7 +662,7 @@ КонецЦикла; Иначе ШаблонСообщения = НСтр("ru = 'Получен неизвестный тип объектов доступа: %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ОбщегоНазначения.ПредставлениеТипаXDTO(ПраваДоступаОбъектаXDTO.Object.Тип())); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, РаботаВМоделиСервиса.ПредставлениеТипаXDTO(ПраваДоступаОбъектаXDTO.Object.Тип())); ВызватьИсключение(ТекстСообщения); КонецЕсли; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl index f878b2a67..800f5a4b3 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи в модели сервиса". -// -/////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Открывает форму ввода пароля пользователя сервиса. diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl index 4bcfd222c..c94d7dead 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи в модели сервиса". -// -/////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает имя подсистемы, которое должно использоваться в именах diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl index fb78ee250..d482d59f8 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверяет, что объект информационной базы используется в качестве объекта авторизации diff --git a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl index aace794be..164467f59 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Открывает форму, в которой пользователь может сменить пароль. @@ -20,6 +15,28 @@ КонецПроцедуры +// См. ПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе. +Процедура ЗапроситьПарольДляАутентификацииВСервисе(ОбработкаПродолжения, ФормаВладелец = Неопределено, ПарольПользователяСервиса = Неопределено) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + + МодульПользователиСлужебныйВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "ПользователиСлужебныйВМоделиСервисаКлиент"); + + МодульПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе( + ОбработкаПродолжения, ФормаВладелец, ПарольПользователяСервиса); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму(Параметры, ОписаниеОшибки) Экспорт + + Параметры.Отказ = Истина; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограмму", ЭтотОбъект, ОписаниеОшибки); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Для работы интерфейса ролей в управляемой форме. @@ -64,31 +81,41 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов из других подсистем. +/////////////////////////////////////////////////////////////////////////////// +// Обработчики ожидания. -// Вызывается перед интерактивным началом работы пользователя с областью данных. -// Соответствует событию ПередНачаломРаботыСистемы модулей приложения. -// +// Открывает окно предупреждения безопасности. +Процедура ПоказатьПредупреждениеБезопасности() Экспорт + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Ключ = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаботыКлиента, "КлючПредупрежденияБезопасности"); + Если ЗначениеЗаполнено(Ключ) Тогда + ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", Новый Структура("Ключ", Ключ)); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ОшибкаНедостаточноПравДляВходаВПрограмму") Тогда Параметры.ПолученныеПараметрыКлиента.Вставить("ОшибкаНедостаточноПравДляВходаВПрограмму"); - Параметры.Отказ = Истина; - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограмму", - ЭтотОбъект, + УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму(Параметры, ПараметрыКлиента.ОшибкаНедостаточноПравДляВходаВПрограмму); КонецЕсли; КонецПроцедуры -// Проверяет авторизацию пользователя и уведомляет об ошибке. -Процедура ПередНачаломРаботыСистемыДоАвторизации(Параметры) Экспорт +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы2(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Проверяет авторизацию пользователя и уведомляет об ошибке. + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ОшибкаАвторизации") Тогда Параметры.ПолученныеПараметрыКлиента.Вставить("ОшибкаАвторизации"); @@ -100,10 +127,11 @@ КонецПроцедуры -// Требует сменить пароль при необходимости. -Процедура ПередНачаломРаботыСистемыПослеОбновленияИнформационнойБазы(Параметры) Экспорт +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы3(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Требует сменить пароль при необходимости. + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ТребуетсяСменитьПароль") Тогда Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( @@ -113,20 +141,10 @@ КонецПроцедуры -// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. -// Вызывается после завершения действий ПриНачалеРаботыСистемы. -// Используется для подключения обработчиков ожидания, которые не должны вызываться -// в случае интерактивных действий перед и при начале работы системы. -// -// Начальная страница (рабочий стол) в этот момент еще не открыта, поэтому запрещено открывать -// формы напрямую, а следует использовать для этих целей обработчик ожидания. -// Запрещено использовать это событие для интерактивного взаимодействия с пользователем -// (ПоказатьВопрос и аналогичные действия). Для этих целей следует использовать -// событие ПриНачалеРаботыСистемы, который поддерживает продолжение своего выполнения. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Ключ = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаботыКлиента, "КлючПредупрежденияБезопасности"); Если ЗначениеЗаполнено(Ключ) Тогда // Небольшая задержка чтобы платформа успела отрисовать текущее окно, поверх которого выводится окно предупреждения. @@ -135,9 +153,10 @@ КонецПроцедуры -// Обработчик ожидания проверяет, что срок действия учетной записи истек и нужно завершить работу. +// См. СтандартныеПодсистемыКлиент.ПриВыполненииСтандартныхПериодическихПроверок. Процедура ПриВыполненииСтандартныхПериодическихПроверок(Параметры, ОбработкаПродолжения) Экспорт + // Проверяет, что срок действия учетной записи истек и нужно завершить работу. Если Не Параметры.ВходВПрограммуЗапрещен Тогда ВыполнитьОбработкуОповещения(ОбработкаПродолжения); Возврат; @@ -147,20 +166,6 @@ КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////// -// Обработчики ожидания. - -// Открывает окно предупреждения безопасности. -Процедура ПоказатьПредупреждениеБезопасности() Экспорт - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Ключ = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаботыКлиента, "КлючПредупрежденияБезопасности"); - Если ЗначениеЗаполнено(Ключ) Тогда - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", Новый Структура("Ключ", Ключ)); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -186,9 +191,9 @@ КонецПроцедуры // Предупреждает пользователя об ошибке авторизации. -Процедура ИнтерактивнаяОбработкаПриОшибкеАвторизации(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПриОшибкеАвторизации(Параметры, Контекст) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); СтандартныеПодсистемыКлиент.ПоказатьПредупреждениеИПродолжить( Параметры, ПараметрыКлиента.ОшибкаАвторизации); @@ -196,7 +201,7 @@ КонецПроцедуры // Предлагает пользователю сменить пароль или завершить работу. -Процедура ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске(Параметры, Контекст) Экспорт ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПриВходеВПрограмму", Истина); @@ -379,18 +384,22 @@ ПредставлениеНастройки = Лев(ПредставлениеНастройки, 24) + "..."; КонецЕсли; - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '""%1"" скопирована %2'"), - ПредставлениеНастройки, ПояснениеКомуСкопированыНастройки); + ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" скопирована %2'"), + ПредставлениеНастройки, + ПояснениеКомуСкопированыНастройки); Иначе ПрописьПредмета = Формат(КоличествоНастроек, "ЧДЦ=0") + " " + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(КоличествоНастроек, "Л = ru_RU", НСтр("ru = 'настройка,настройки,настроек,,,,,,0'")); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Скопировано %1 %2'"), - ПрописьПредмета, ПояснениеКомуСкопированыНастройки); + ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопировано %1 %2'"), + ПрописьПредмета, + ПояснениеКомуСкопированыНастройки); КонецЕсли; - Возврат ТекстПояснения; + Возврат ПояснениеОповещения; КонецФункции @@ -407,9 +416,11 @@ Функция ПояснениеПользователи(КоличествоПользователей, Пользователь) Экспорт Если КоличествоПользователей = 1 Тогда - ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'пользователю ""%1""'"), Пользователь); + ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'пользователю ""%1""'"), Пользователь); Иначе - ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 пользователям'"), КоличествоПользователей); + ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 пользователям'"), КоличествоПользователей); КонецЕсли; Возврат ПояснениеКомуСкопированыНастройки; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl index f088014d0..b3ce4067f 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает строки вида "день", "дня", "дней". @@ -29,6 +24,40 @@ КонецФункции +// Устанавливает доступность кнопки ЗаписатьИЗакрыть в формах, где +// требуется задать вопрос пользователю ПередЗаписью объекта на клиенте +// с установкой Отказ = Истина и повторным вызовом метода формы Записать. +// +// Чтобы процедуру можно было вызвать на клиенте, в форму должен быть добавлен +// реквизит ПравоРедактированиеОбъекта типа Произвольный. +// Этот реквизит инициализируется при первом вызове на стороне сервере (из обработчика +// события формы ПриСозданииНаСервере) и далее используется при вызове на клиенте, +// когда меняется свойство формы ТолькоПросмотр. +// +// Параметры: +// Форма - УправляемаяФорма - форма элемента справочника, документа, ... +// ОсновнойРеквизит - Строка - имя реквизита формы, содержащего структуру объекта. +// ИмяЭлемента - Строка - имя элемента формы с кнопкой ЗаписатьИЗакрыть. +// +Процедура УстановитьДоступностьКнопкиЗаписатьИЗакрыть(Форма, ОсновнойРеквизит = "Объект", ИмяЭлемента = "ФормаЗаписатьИЗакрыть") Экспорт + + Права = Новый Структура("ПравоРедактированияОбъекта"); + ЗаполнитьЗначенияСвойств(Права, Форма); + + Если Права.ПравоРедактированияОбъекта = Неопределено Тогда + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Права.ПравоРедактированияОбъекта = ПравоДоступа("Редактирование", Форма[ОсновнойРеквизит].Ссылка.Метаданные()); + ЗаполнитьЗначенияСвойств(Форма, Права); + #КонецЕсли + КонецЕсли; + + ДоступностьКнопки = Не Форма.ТолькоПросмотр И Права.ПравоРедактированияОбъекта; + Если Форма.Элементы[ИмяЭлемента].Доступность <> ДоступностьКнопки Тогда + Форма.Элементы[ИмяЭлемента].Доступность = ДоступностьКнопки; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl index f254b2022..20ba8bd91 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl @@ -1,42 +1,29 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Содержит сохраненные параметры, используемые подсистемой. -Функция Параметры() Экспорт +// Возвращает имена и синонимы ролей. +// +Функция ВсеРоли() Экспорт - УстановитьПривилегированныйРежим(Истина); - СохраненныеПараметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыРаботыПользователей"); - УстановитьПривилегированныйРежим(Ложь); + Массив = Новый Массив; + Соответствие = Новый Соответствие; - СтандартныеПодсистемыСервер.ПроверитьОбновлениеПараметровРаботыПрограммы( - "ПараметрыРаботыПользователей", - "НазначениеРолей, - |ВсеРоли"); + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(256))); - ПредставлениеПараметра = ""; - - Если НЕ СохраненныеПараметры.Свойство("НазначениеРолей") Тогда - ПредставлениеПараметра = НСтр("ru = 'Недоступные роли'"); + Для каждого Роль Из Метаданные.Роли Цикл + ИмяРоли = Роль.Имя; - ИначеЕсли НЕ СохраненныеПараметры.Свойство("ВсеРоли") Тогда - ПредставлениеПараметра = НСтр("ru = 'Все роли'"); - КонецЕсли; + Массив.Добавить(ИмяРоли); + Соответствие.Вставить(ИмяРоли, Роль.Синоним); + Таблица.Добавить().Имя = ИмяРоли; + КонецЦикла; - Если ЗначениеЗаполнено(ПредставлениеПараметра) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка обновления информационной базы. - |Не заполнен параметр работы пользователей: - |""%1"".'") - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(), - ПредставлениеПараметра); - КонецЕсли; + ВсеРоли = Новый Структура; + ВсеРоли.Вставить("Массив", Новый ФиксированныйМассив(Массив)); + ВсеРоли.Вставить("Соответствие", Новый ФиксированноеСоответствие(Соответствие)); + ВсеРоли.Вставить("Таблица", Таблица); - Возврат СохраненныеПараметры; + Возврат ОбщегоНазначения.ФиксированныеДанные(ВсеРоли, Ложь); КонецФункции @@ -61,14 +48,14 @@ НСтр("ru = 'Ошибка в функции НедоступныеРоли общего модуля ПользователиСлужебныйПовтИсп.'")); Если Сервис = Неопределено Тогда - Сервис = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Сервис = ОбщегоНазначения.РазделениеВключено(); КонецЕсли; - НазначениеРолей = ПользователиСлужебныйПовтИсп.Параметры().НазначениеРолей; + НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей(); НедоступныеРоли = Новый Соответствие; Для Каждого Роль Из Метаданные.Роли Цикл - Если Назначение <> "ДляАдминистраторов" + Если (Назначение <> "ДляАдминистраторов" Или Сервис) И НазначениеРолей.ТолькоДляАдминистраторовСистемы.Получить(Роль.Имя) <> Неопределено // Для внешних пользователей. Или Назначение = "ДляВнешнихПользователей" @@ -92,11 +79,87 @@ КонецФункции -// См. комментарий к одноименной процедуре в модуле ПользователиКлиентСервер. +// Возвращает недоступные роли для разделенных пользователей или внешних пользователей +// с учетом прав текущего пользователя и режима работы (локальный или модель сервиса). +// +// Параметры: +// ДляВнешнихПользователей - Булево - если истина, значит для внешних пользователей. +// +// Возвращаемое значение: +// Соответствие - со свойствами: +// * Ключ - Строка - имя роли. +// * Значение - Булево - Истина. +// +Функция НедоступныеРолиПоТипуПользователя(ДляВнешнихПользователей) Экспорт + + Если ДляВнешнихПользователей Тогда + НазначениеРолейПользователя = "ДляВнешнихПользователей"; + + ИначеЕсли Не ОбщегоНазначения.РазделениеВключено() + И Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) Тогда + + // Пользователь с ролью АдминистраторСистемы в локальном режиме работы + // может выдавать административные права. + НазначениеРолейПользователя = "ДляАдминистраторов"; + Иначе + НазначениеРолейПользователя = "ДляПользователей"; + КонецЕсли; + + Возврат ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеРолейПользователя); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает назначение ролей, определенное разработчиком. +// См. комментарий к процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - со свойствами: +// * ТолькоДляАдминистраторовСистемы - ФиксированноеСоответствие - со свойствами: +// * Ключ - Строка - имя роли. +// * Значение - Булево - Истина. +// * ТолькоДляПользователейСистемы - ФиксированноеСоответствие - со свойствами: +// * Ключ - Строка - имя роли. +// * Значение - Булево - Истина. +// * ТолькоДляВнешнихПользователей - ФиксированноеСоответствие - со свойствами: +// * Ключ - Строка - имя роли. +// * Значение - Булево - Истина. +// * СовместноДляПользователейИВнешнихПользователей - ФиксированноеСоответствие - со свойствами: +// * Ключ - Строка - имя роли. +// * Значение - Булево - Истина. +// +Функция НазначениеРолей() Экспорт + + НазначениеРолей = Пользователи.НазначениеРолей(); + + Назначение = Новый Структура; + Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл + Имена = Новый Соответствие; + Для Каждого Имя Из ОписаниеНазначенияРолей.Значение Цикл + Имена.Вставить(Имя, Истина); + КонецЦикла; + Назначение.Вставить(ОписаниеНазначенияРолей.Ключ, Новый ФиксированноеСоответствие(Имена)); + КонецЦикла; + + Возврат Новый ФиксированнаяСтруктура(Назначение); + +КонецФункции + +// См. ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя. Функция ЭтоСеансВнешнегоПользователя() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() + И СеансЗапущенБезРазделителей Тогда // Неразделенные пользователи не могут быть внешними. Возврат Ложь; КонецЕсли; @@ -124,10 +187,6 @@ КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - // Настройки работы подсистемы Пользователи. // См. также описание процедуры ПриОпределенииНастроек в общем модуле ПользователиПереопределяемый. // @@ -168,9 +227,9 @@ ИнтеграцияСтандартныхПодсистем.ПриОпределенииНастроек(Настройки); ПользователиПереопределяемый.ПриОпределенииНастроек(Настройки); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() Или СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Настройки.Вставить("ОбщиеНастройкиВхода", Ложь); КонецЕсли; @@ -252,7 +311,7 @@ ПравоДоступа("Администрирование", Метаданные))); Свойства.Вставить("РольДоступнаАдминистраторСистемы", - РольДоступна(Пользователи.РольАдминистратораСистемы(Истина))); // Не заменять на РолиДоступны. + РольДоступна(Метаданные.Роли.АдминистраторСистемы)); // Не заменять на РолиДоступны. Свойства.Вставить("РольДоступнаПолныеПрава", РольДоступна(Метаданные.Роли.ПолныеПрава)); // Не заменять на РолиДоступны. diff --git a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl index a73b9e31c..07f111e19 100644 --- a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl +++ b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// ПоставляемыеДанные: Механизм сервиса поставляемых данных. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Инициировать уведомление о всех имеющихся в МС поставляемых данных (за исключением тех, @@ -18,11 +13,11 @@ // Получить дескрипторы данных по заданным условиям. // // Параметры: -// ВидДанных - Строка. -// Фильтр - Коллекция. Элементы должны содержать поля Код (строка) и Значение (строка). +// ВидДанных - Строка - имя вида поставляемых данных. +// Фильтр - Массив - элементы должны содержать поля Код (строка) и Значение (строка). // -// Возвращаемое значение -// ОбъектXDTO типа ArrayOfDescriptor. +// Возвращаемое значение: +// ОбъектXDTO - типа ArrayOfDescriptor. // Функция ДескрипторыПоставляемыхДанныхИзМенеджера(Знач ВидДанных, Знач Фильтр = Неопределено) Экспорт Перем Прокси, Условия, ТипФильтра; @@ -66,7 +61,7 @@ // ОбработатьНовыеДанные для соответствующих обработчиков. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. +// Дескриптор - ОбъектXDTO - Descriptor. // Процедура ЗагрузитьИОбработатьДанные(Знач Дескриптор) Экспорт @@ -85,10 +80,10 @@ // не удаление и создание нового. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor или структура с полями. +// Дескриптор - ОбъектXDTO - Descriptor или структура с полями. // "ВидДанных, ДатаДобавления, ИдентификаторФайла, Характеристики", // где Характеристики - массив структур с полями "Код, Значение, Ключевая". -// ПутьКФайлу - строка. Полное имя извлеченного файла. +// ПутьКФайлу - Строка - полное имя извлеченного файла. // Процедура СохранитьПоставляемыеДанныеВКэш(Знач Дескриптор, Знач ПутьКФайлу) Экспорт @@ -117,9 +112,9 @@ КонецЦикла; ИсходнаяОбластьДанных = Неопределено; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ИсходнаяОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ИсходнаяОбластьДанных = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; НачатьТранзакцию(); @@ -143,7 +138,7 @@ Если Данные = Неопределено Тогда Данные = Выборка.ПоставляемыеДанные.ПолучитьОбъект(); Если Данные.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ПутьКСтаромуФайлу = ФайловыеФункцииСлужебный.ПолныйПутьТома(Данные.Том) + Данные.ПутьКФайлу; + ПутьКСтаромуФайлу = РаботаСФайламиСлужебный.ПолныйПутьТома(Данные.Том) + Данные.ПутьКФайлу; КонецЕсли; Иначе УдалитьПоставляемыеДанныеИзКэша(Выборка.ПоставляемыеДанные); @@ -163,7 +158,7 @@ Характеристика.Характеристика = Property.Code; Характеристика.Значение = Property.Value; КонецЦикла; - Данные.ТипХраненияФайла = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); + Данные.ТипХраненияФайла = РаботаСФайламиСлужебный.ТипХраненияФайлов(); Если Данные.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда Данные.ХранимыйФайл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ПутьКФайлу)); @@ -171,7 +166,7 @@ Данные.ПутьКФайлу = ""; Иначе // Добавление в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ПутьКФайлу, Данные.ДатаДобавления, Строка(Данные.ИдентификаторФайла), ""); + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ПутьКФайлу, Данные.ДатаДобавления, Строка(Данные.ИдентификаторФайла), ""); Данные.ХранимыйФайл = Неопределено; Данные.Том = СведенияОФайле.Том; Данные.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; @@ -202,7 +197,7 @@ Если ИсходнаяОбластьДанных <> Неопределено Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ИсходнаяОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ИсходнаяОбластьДанных); КонецЕсли; @@ -214,7 +209,7 @@ Если ИсходнаяОбластьДанных <> Неопределено Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ИсходнаяОбластьДанных); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, ИсходнаяОбластьДанных); КонецЕсли; @@ -227,7 +222,8 @@ // Удаляет файл из кэша. // // Параметры: -// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные или УникальныйИдентификатор. +// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные - ссылка на поставляемые данные, +// - УникальныйИдентификатор - уникальный идентификатор. // Процедура УдалитьПоставляемыеДанныеИзКэша(Знач СсылкаИлиИдентификатор) Экспорт Перем Данные, ПолныйПуть; @@ -247,7 +243,7 @@ КонецЕсли; Если Данные.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Данные.Том) + Данные.ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(Данные.Том) + Данные.ПутьКФайлу; УдалитьФайлы(ПолныйПуть); КонецЕсли; @@ -260,8 +256,12 @@ // Получает дескриптор данных из кэша. // // Параметры: -// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные или УникальныйИдентификатор. -// ВВидеXDTO - булево. В каком виде возвращать значения. +// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные - ссылка на поставляемые данные, +// - УникальныйИдентификатор - уникальный идентификатор, +// ВВидеXDTO - Булево - в каком виде возвращать значения. +// +// Возвращаемое значение: +// ОбъектXDTO - типа ArrayOfDescriptor. // Функция ДескрипторПоставляемыхДанныхИзКэша(Знач СсылкаИлиИдентификатор, Знач ВВидеXDTO = Ложь) Экспорт @@ -301,11 +301,11 @@ // Возвращает двоичные данные присоединенного файла. // // Параметры: -// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные -// или УникальныйИдентификатор - идентификатор файла. +// СсылкаИлиИдентификатор - СправочникСсылка.ПоставляемыеДанные - ссылка на поставляемые данные, +// - УникальныйИдентификатор - уникальный идентификатор. // // Возвращаемое значение: -// ДвоичныеДанные. +// ДвоичныеДанные - двоичные данные поставляемых данных. // Функция ПоставляемыеДанныеИзКэша(Знач СсылкаИлиИдентификатор) Экспорт @@ -326,7 +326,7 @@ Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда Возврат ФайлОбъект.ХранимыйФайл.Получить(); Иначе - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; Попытка Возврат Новый ДвоичныеДанные(ПолныйПуть) @@ -356,10 +356,10 @@ // Проверяет наличие данных с указанными ключевыми характеристиками в кэше. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. +// Дескриптор - ОбъектXDTO - Descriptor. // // Возвращаемое значение: -// Булево. +// Булево - наличие дескриптора в кэше. // Функция ЕстьВКеше(Знач Дескриптор) Экспорт @@ -378,11 +378,11 @@ // Возвращает массив ссылок на данные, удовлетворяющие заданным условиям. // // Параметры: -// ВидДанных - Строка. -// Фильтр - Коллекция. Элементы должны содержать поля Код (строка) и Значение (строка). +// ВидДанных - Строка - имя вида поставляемых данных. +// Фильтр - Массив - элементы должны содержать поля Код (строка) и Значение (строка). // -// Возвращаемое значение -// Массив +// Возвращаемое значение: +// Массив - массив ссылок на данные. // Функция СсылкиПоставляемыхДанныхИзКэша(Знач ВидДанных, Знач Фильтр = Неопределено) Экспорт @@ -394,12 +394,12 @@ // Получить данные по заданным условиям. // // Параметры: -// ВидДанных - Строка. -// Фильтр - Коллекция. Элементы должны содержать поля Код (строка) и Значение (строка). -// ВВидеXDTO - булево. В каком виде возвращать значения. +// ВидДанных - Строка - имя вида поставляемых данных. +// Фильтр - Массив - элементы должны содержать поля Код (строка) и Значение (строка). +// ВВидеXDTO - Булево - в каком виде возвращать значения. // -// Возвращаемое значение -// ОбъектXDTO типа ArrayOfDescriptor или. +// Возвращаемое значение: +// ОбъектXDTO - типа ArrayOfDescriptor или // Массив структур с полями "ВидДанных, ДатаДобавления, ИдентификаторФайла, Характеристики", // где Характеристики - массив структур с полями "Код, Значение, Ключевая". // Для получения самого файла необходимо вызвать ПолучитьПоставляемыеДанныеИзКэша. @@ -446,12 +446,12 @@ // Может быть использовано при выводе сообщений в журнал регистрации. // // Параметры: -// ДескрипторXDTO - ОбъектXDTO типа Descriptor или структура с полями. +// Дескриптор - ОбъектXDTO - типа Descriptor или структура с полями. // "ВидДанных, ДатаДобавления, ИдентификаторФайла, Характеристики", // где Характеристики - массив структур с полями "Код, Значение". // -// Возвращаемое значение -// Строка +// Возвращаемое значение: +// Строка - пользовательское представление дескриптора. // Функция ПолучитьОписаниеДанных(Знач Дескриптор) Экспорт Перем Описание, Характеристика; @@ -499,10 +499,13 @@ // необработанные области. После копирования данных в область следует вызвать ОбластьОбработана. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла поставляемых данных. -// КодОбработчика - Строка +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла поставляемых данных, +// КодОбработчика - Строка - код обработчика, // ВключаяНеразделенную - Булево - если Истина, ко всем имеющимся областям добавится область с кодом -1. // +// Возвращаемое значение: +// Массив - области требующие обработки. +// Функция ОбластиТребующиеОбработки(Знач ИдентификаторФайла, Знач КодОбработчика, Знач ВключаяНеразделенную = Ложь) Экспорт НаборЗаписей = РегистрыСведений.ОбластиТребующиеОбработкиПоставляемыхДанных.СоздатьНаборЗаписей(); @@ -539,14 +542,14 @@ // поскольку при включенном разделении запись в неразделенный регистр запрещена. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор файла поставляемых данных. -// КодОбработчика - Строка -// ОбластьДанных - Число, идентификатор обработанной области. +// ИдентификаторФайла - УникальныйИдентификатор - файла поставляемых данных, +// КодОбработчика - Строка - код обработчика, +// ОбластьДанных - Число - идентификатор обработанной области. // Процедура ОбластьОбработана(Знач ИдентификаторФайла, Знач КодОбработчика, Знач ОбластьДанных) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; НаборЗаписей = РегистрыСведений.ОбластиТребующиеОбработкиПоставляемыхДанных.СоздатьНаборЗаписей(); @@ -563,64 +566,20 @@ #Область СлужебныйПрограммныйИнтерфейс -// Объявляет события подсистемы ПоставляемыеДанные: -// -// Серверные события: -// ПриОпределенииОбработчиковПоставляемыхДанных. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Зарегистрировать обработчики поставляемых данных. - // - // При получении уведомления о доступности новых общих данных, вызывается процедуры. - // ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. - // В процедуру передается Дескриптор - ОбъектXDTO Descriptor. - // - // В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, - // данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. - // ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. - // Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. - // - // Параметры: - // Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. - // Колонки: - // ВидДанных, строка - код вида данных, обрабатываемый обработчиком. - // КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. - // Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: - // ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт - // ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт - // ОбработкаДанныхОтменена(Дескриптор) Экспорт - // - // Синтаксис: - // Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - // - // Для использования в других библиотеках. - // - // (То же, что ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"); + СоответствиеИменПсевдонимам.Вставить("СообщенияПоставляемыхДанныхОбработчикСообщения.ЗагрузитьДанные"); КонецПроцедуры -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +// См. ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений. +Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"].Добавить( - "ПоставляемыеДанные"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "ПоставляемыеДанные"); - КонецЕсли; + СообщенияПоставляемыхДанныхОбработчикСообщения.ПолучитьОбработчикиКаналовСообщений(Обработчики); КонецПроцедуры @@ -818,33 +777,4 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("СообщенияПоставляемыхДанныхОбработчикСообщения.ЗагрузитьДанные"); - -КонецПроцедуры - -// Получает список обработчиков сообщений, которые обрабатывают подсистемы библиотеки. -// -// Параметры: -// Обработчики - ТаблицаЗначений - состав полей см. в ОбменСообщениями.НоваяТаблицаОбработчиковСообщений. -// -Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт - - СообщенияПоставляемыхДанныхОбработчикСообщения.ПолучитьОбработчикиКаналовСообщений(Обработчики); - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/ПоставляемыеДанныеПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПоставляемыеДанныеПереопределяемый/Module.bsl index 4b4358299..ac9e9f609 100644 --- a/SSL/src/CommonModules/ПоставляемыеДанныеПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПоставляемыеДанныеПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// ПоставляемыеДанныеПереопределяемый: Механизм сервиса поставляемых данных. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -22,11 +17,10 @@ // Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. // // Параметры: -// Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. -// Колонки: -// ВидДанных, строка - код вида данных, обрабатываемый обработчиком. -// КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. -// Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: +// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков с колонками: +// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком. +// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя. +// * Обработчик - ОбщийМодуль - модуль, содержащий следующие процедуры: // ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт // ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт // ОбработкаДанныхОтменена(Дескриптор) Экспорт diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl index 5dc5d4548..262c09574 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl @@ -1,30 +1,28 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// Формирование номера/кода объекта для вывода в печатных формах. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Удаляет префикс информационной базы и префикс организации из переданной строки НомерОбъекта. // Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где: -// ОО - префикс организации; -// ГГ - префикс информационной базы; -// "-" - разделитель; -// ХХХ...ХХ - номер/код объекта. +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// ХХХ...ХХ - номер/код объекта. // Незначащие символы префиксов (символ ноль - "0") также удаляются. // // Параметры: -// НомерОбъекта - Строка - номер или код объекта из которого требуется удалить префиксы. -// УдалитьПрефиксОрганизации - Булево (необязательный) - признак удаления префикса организации; -// по умолчанию равен Ложь. -// УдалитьПрефиксИнформационнойБазы - Булево (необязательный) - признак удаления префикса информационной базы; -// по умолчанию равен Ложь. +// НомерОбъекта - Строка - номер или код объекта из которого требуется удалить префиксы. +// УдалитьПрефиксОрганизации - Булево - признак удаления префикса организации; +// по умолчанию равен Ложь. +// УдалитьПрефиксИнформационнойБазы - Булево - признак удаления префикса информационной базы; +// по умолчанию равен Ложь. // -// Примеры: -// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Истина) = "000001234" -// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Ложь, Истина) = "Ф-000001234" -// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Ложь) = "ГЛ-000001234" -// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Ложь, Ложь) = "ФГЛ-000001234" +// Возвращаемое значение: +// Строка - Номер объекта без префиксов. +// +// Пример: +// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Истина) = "000001234" +// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Ложь, Истина) = "Ф-000001234" +// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Ложь) = "ГЛ-000001234" +// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Ложь, Ложь) = "ФГЛ-000001234" // Функция УдалитьПрефиксыИзНомераОбъекта(Знач НомерОбъекта, УдалитьПрефиксОрганизации = Ложь, УдалитьПрефиксИнформационнойБазы = Ложь) Экспорт @@ -45,8 +43,8 @@ ПрефиксИнформационнойБазы = Лев(НомерОбъекта, 2); КонецЕсли; - ПрефиксОрганизации = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ПрефиксОрганизации, "0"); - ПрефиксИнформационнойБазы = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ПрефиксИнформационнойБазы, "0"); + ПрефиксОрганизации = СтрЗаменить(ПрефиксОрганизации, "0", ""); + ПрефиксИнформационнойБазы = СтрЗаменить(ПрефиксИнформационнойБазы, "0", ""); // Добавляем префикс организации. Если Не УдалитьПрефиксОрганизации Тогда @@ -79,8 +77,11 @@ // ХХХ...ХХ - номер/код объекта. // // Параметры: -// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули. +// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули. // +// Возвращаемое значение: +// Строка - Номер объекта без лидирующих нулей. +// Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт ПользовательскийПрефикс = ПользовательскийПрефикс(НомерОбъекта); @@ -116,8 +117,11 @@ // ХХХ...ХХ - номер/код объекта. // // Параметры: -// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули. +// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули. // +// Возвращаемое значение: +// Строка - Номер объекта без пользовательских префиксов. +// Функция УдалитьПользовательскиеПрефиксыИзНомераОбъекта(Знач НомерОбъекта) Экспорт СтрокаЦифровыхСимволов = "0123456789"; @@ -164,8 +168,11 @@ // ХХ..ХХ - номер/код объекта. // // Параметры: -// НомерОбъекта - Строка - номер или код объекта из которого требуется получить пользовательский префикс. +// НомерОбъекта - Строка - номер или код объекта из которого требуется получить пользовательский префикс. // +// Возвращаемое значение: +// Строка - Пользовательский префикс. +// Функция ПользовательскийПрефикс(Знач НомерОбъекта) Экспорт // Возвращаемое значение функции (пользовательский префикс). @@ -205,6 +212,14 @@ // отбрасывает пользовательские префиксы (опционально), // удаляет лидирующие нули в номере объекта. // +// Параметры: +// НомерОбъекта - Строка - номер или код объекта, который преобразуется для вывода на печать. +// УдалитьПрефиксИнформационнойБазы - Булево - признак удаления префикса информационной базы. +// УдалитьПользовательскийПрефикс - Булево - признак удаления пользовательского префикса. +// +// Возвращаемое значение: +// Строка - Номер на печать. +// Функция НомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт // {Обработчик: ПриПолученииНомераНаПечать} Начало @@ -237,11 +252,40 @@ #Область УстаревшиеПроцедурыИФункции // Устарела. Следует использовать ПользовательскийПрефикс. +// Получает пользовательский префикс номера/кода объекта. +// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где. +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// АА - пользовательский префикс; +// ХХ..ХХ - номер/код объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта из которого требуется получить пользовательский префикс. +// +// Возвращаемое значение: +// Строка - Пользовательский префикс. +// Функция ПолучитьПользовательскийПрефикс(Знач НомерОбъекта) Экспорт Возврат ПользовательскийПрефикс(НомерОбъекта); КонецФункции // Устарела. Следует использовать НомерНаПечать. +// Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули. +// Функция: +// отбрасывает префикс организации, +// отбрасывает префикс информационной базы (опционально), +// отбрасывает пользовательские префиксы (опционально), +// удаляет лидирующие нули в номере объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта, который преобразуется для вывода на печать. +// УдалитьПрефиксИнформационнойБазы - Булево - признак удаления префикса информационной базы. +// УдалитьПользовательскийПрефикс - Булево - признак удаления пользовательского префикса. +// +// Возвращаемое значение: +// Строка - Номер на печать. +// Функция ПолучитьНомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт Возврат НомерНаПечать(НомерОбъекта, УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс); КонецФункции diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСерверПереопределяемый/Module.bsl index 5a3fd520e..8da2cdb91 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСерверПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСерверПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик события "При получении номера на печать". @@ -19,7 +14,7 @@ // УдалитьПользовательскийПрефикс - Булево - признак удаления пользовательского префикса; // по умолчанию равен Ложь. // -// Пример реализации кода обработчика: +// Пример: // // НомерОбъекта = ПрефиксацияОбъектовКлиентСервер.УдалитьПользовательскиеПрефиксыИзНомераОбъекта(НомерОбъекта); // СтандартнаяОбработка = Ложь; diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовПереопределяемый/Module.bsl index af4db4a7d..6d404e347 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик события при изменении номера объекта. @@ -60,7 +55,7 @@ // для которых ссылка на организацию располагается в реквизите с именем отличным от стандартного имени "Организация". // // Параметры: -// Объекты - ТаблицаЗначений. +// Объекты - ТаблицаЗначений - Таблица с колонками: // * Объект - ОбъектМетаданных - Объект метаданных, для которого указывается реквизит, // содержащий ссылку на организацию. // * Реквизит - Строка - Имя реквизита, который содержит ссылку на организацию. diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl index 6d70ffa51..2ea52c686 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает таблицу префиксообразующих реквизитов, заданных в переопределяемом модуле. diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl index 9d3a3ed2a..7cc14a80a 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl @@ -3,6 +3,58 @@ // //////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +// Выполняет действия по изменению префикса информационной базы +// Дополнительно позволяет выполнить обработку данных для продолжения нумерации. +// +// Параметры: +// Параметры - Структура - Параметры выполнения процедуры: +// * НовыйПрефиксИБ - Строка - Новый префикс информационной базы. +// * ПродолжитьНумерацию - Булево - Признак необходимости продолжения нумерации. +// АдресРезультата - Строка - адрес временного хранилища, в которое нужно +// поместить результат работы процедуры. +// +Процедура ИзменитьПрефиксИБ(Параметры, АдресРезультата = "") Экспорт + + // Константа, хранящая префикс, поставляется с подсистемой "Обмен данными". + // Без нее выполнение процедуры не имеет смысла. + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Возврат; + КонецЕсли; + + НовыйПрефиксИБ = Параметры.НовыйПрефиксИБ; + ПродолжитьНумерацию = Параметры.ПродолжитьНумерацию; + + НачатьТранзакцию(); + + Попытка + + Если ПродолжитьНумерацию Тогда + ОбработатьДанныеДляПродолженияНумерации(НовыйПрефиксИБ); + КонецЕсли; + + // Константу устанавливаем в последнюю очередь, чтобы иметь доступ к предыдущему ее значению. + ПрефиксИмяКонстанты = "ПрефиксУзлаРаспределеннойИнформационнойБазы"; + Константы[ПрефиксИмяКонстанты].Установить(НовыйПрефиксИБ); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПерепрефиксацияОбъектов(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение НСтр("ru = 'Не удалось изменить префикс.'"); + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -136,9 +188,189 @@ КонецФункции +Функция ОписаниеМетаданныхИспользующихПрефиксы(РежимДиагностики = Ложь) Экспорт + + Результат = НовоеОписаниеМетаданныхИспользующихПрефиксы(); + + // Наполнение таблицы метаданных. + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл + + ИспользуетсяПрефиксИБ = Ложь; + ИспользуетсяПрефиксОрганизации = Ложь; + Если ВРег(Подписка.Обработчик) = ВРег("ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации") Тогда + ИспользуетсяПрефиксИБ = Истина; + ИспользуетсяПрефиксОрганизации = Истина; + ИначеЕсли ВРег(Подписка.Обработчик) = ВРег("ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы") Тогда + ИспользуетсяПрефиксИБ = Истина; + ИначеЕсли ВРег(Подписка.Обработчик) = ВРег("ПрефиксацияОбъектовСобытия.УстановитьПрефиксОрганизации") Тогда + ИспользуетсяПрефиксОрганизации = Истина; + Иначе + // Пропускаем подписки, не связанные с установкой префикса. + Продолжить; + КонецЕсли; + + Для Каждого ТипИсточника Из Подписка.Источник.Типы() Цикл + + МетаданныеИсточника = Метаданные.НайтиПоТипу(ТипИсточника); + ПолноеИмяОбъекта = МетаданныеИсточника.ПолноеИмя(); + + // Пропускаем уже добавленные объекты (в случае ошибочного назначения нескольких подписок), + // а также объекты, соответствующие неразделенным данным, если это разделенный режим. + Если Не РежимДиагностики Тогда + + Если Результат.Найти(ПолноеИмяОбъекта, "ПолноеИмя") <> Неопределено Тогда + Продолжить; + ИначеЕсли РазделениеВключено Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяОбъекта); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Если Не ЭтоРазделенныйОбъектМетаданных Тогда + Продолжить; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ОписаниеОбъекта = Результат.Добавить(); + ОписаниеОбъекта.Имя = МетаданныеИсточника.Имя; + ОписаниеОбъекта.ПолноеИмя = ПолноеИмяОбъекта; + ОписаниеОбъекта.ИспользуетсяПрефиксИБ = ИспользуетсяПрефиксИБ; + ОписаниеОбъекта.ИспользуетсяПрефиксОрганизации = ИспользуетсяПрефиксОрганизации; + + // Возможные виды данных с кодом или номером. + ОписаниеОбъекта.ЭтоСправочник = ОбщегоНазначения.ЭтоСправочник(МетаданныеИсточника); + ОписаниеОбъекта.ЭтоПланВидовХарактеристик = ОбщегоНазначения.ЭтоПланВидовХарактеристик(МетаданныеИсточника); + ОписаниеОбъекта.ЭтоДокумент = ОбщегоНазначения.ЭтоДокумент(МетаданныеИсточника); + ОписаниеОбъекта.ЭтоБизнесПроцесс = ОбщегоНазначения.ЭтоБизнесПроцесс(МетаданныеИсточника); + ОписаниеОбъекта.ЭтоЗадача = ОбщегоНазначения.ЭтоЗадача(МетаданныеИсточника); + + ОписаниеОбъекта.ИмяПодписки = Подписка.Имя; + + Характеристики = Новый Структура("ДлинаКода, ДлинаНомера", 0, 0); + ЗаполнитьЗначенияСвойств(Характеристики, МетаданныеИсточника); + + Если Характеристики.ДлинаКода = 0 И Характеристики.ДлинаНомера = 0 Тогда + + Если Не РежимДиагностики Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка внедрения подсистемы ""%1"" для объекта метаданных ""%2"".'"), + Метаданные.Подсистемы.СтандартныеПодсистемы.Подсистемы.ПрефиксацияОбъектов, ПолноеИмяОбъекта); + + КонецЕсли; + + Иначе + + Если ОписаниеОбъекта.ЭтоСправочник Или ОписаниеОбъекта.ЭтоПланВидовХарактеристик Тогда + ОписаниеОбъекта.ЕстьКод = Истина; + Иначе + ОписаниеОбъекта.ЕстьНомер = Истина; + КонецЕсли; + + КонецЕсли; + + // Определение периодичности номера для документа и бизнес-процесса. + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Непериодический; + Если ОписаниеОбъекта.ЭтоДокумент Тогда + ПериодичностьНомера = МетаданныеИсточника.ПериодичностьНомера; + ИначеЕсли ОписаниеОбъекта.ЭтоБизнесПроцесс Тогда + Если МетаданныеИсточника.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераБизнесПроцесса.Год Тогда + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Год; + ИначеЕсли МетаданныеИсточника.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераБизнесПроцесса.День Тогда + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.День; + ИначеЕсли МетаданныеИсточника.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераБизнесПроцесса.Квартал Тогда + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Квартал; + ИначеЕсли МетаданныеИсточника.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераБизнесПроцесса.Месяц Тогда + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Месяц; + ИначеЕсли МетаданныеИсточника.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераБизнесПроцесса.Непериодический Тогда + ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Непериодический; + КонецЕсли; + КонецЕсли; + ОписаниеОбъекта.ПериодичностьНомера = ПериодичностьНомера; + + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. +// Определяет необходимость выполнения обработчика события "ПослеЗагрузкиДанных" при обмене в РИБ. +// +// Параметры: +// НовыйПрефиксИБ - Строка - Необходим для вычисления новых кодов (номеров) элементов после изменения префикса. +// РежимАнализаДанных - Булево - Если Истина, изменения данных не происходит, функция только просчитывает, +// какие данные будут изменены и как они будут изменены. Если Ложь - изменения объекта, +// записываются в информационную базу. +// +// Возвращаемое значение: +// ТаблицаЗначений - информация об объектах, подлежащих действиям по замене префикса в номере или коде +// (см. функцию ПрефиксацияОбъектовСлужебный.ОписаниеМетаданныхИспользующихПрефиксы). +// +Функция ОбработатьДанныеДляПродолженияНумерации(Знач НовыйПрефиксИБ = "", РежимАнализаДанных = Ложь) + + ОписаниеМетаданныхИспользующихПрефиксы = ОписаниеМетаданныхИспользующихПрефиксы(); + + ДополнитьСтрокуНулямиСлева(НовыйПрефиксИБ, 2); + + Результат = НовоеОписаниеМетаданныхИспользующихПрефиксы(); + Результат.Колонки.Добавить("Ссылка"); + Результат.Колонки.Добавить("Номер"); + Результат.Колонки.Добавить("НовыйНомер"); + + ТекущийПрефиксИБ = ""; + ПрефиксацияОбъектовСобытия.ПриОпределенииПрефиксаИнформационнойБазы(ТекущийПрефиксИБ); + ДополнитьСтрокуНулямиСлева(ТекущийПрефиксИБ, 2); + + Для Каждого ОписаниеОбъекта Из ОписаниеМетаданныхИспользующихПрефиксы Цикл + + Если Не РежимАнализаДанных Тогда + // Устанавливаем исключительную блокировку на читаемые и впоследствии изменяемые виды данных. + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(ОписаниеОбъекта.ПолноеИмя); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + КонецЕсли; + + ДанныеОбъектовДляПеренумерацииПоследнегоЭлемента = ДанныеОбъектовОдногоВидаДляПеренумерацииПоследнихЭлементов( + ОписаниеОбъекта, ТекущийПрефиксИБ); + + Если ДанныеОбъектовДляПеренумерацииПоследнегоЭлемента.Пустой() Тогда + Продолжить; + КонецЕсли; + + ВыборкаОбъектов = ДанныеОбъектовДляПеренумерацииПоследнегоЭлемента.Выбрать(); + Пока ВыборкаОбъектов.Следующий() Цикл + + НоваяСтрокаРезультата = Результат.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрокаРезультата, ОписаниеОбъекта); + ЗаполнитьЗначенияСвойств(НоваяСтрокаРезультата, ВыборкаОбъектов); + НоваяСтрокаРезультата.НовыйНомер = СтрЗаменить(НоваяСтрокаРезультата.Номер, ТекущийПрефиксИБ + "-", НовыйПрефиксИБ + "-"); + + Если Не РежимАнализаДанных Тогда + ОбъектПеренумерации = НоваяСтрокаРезультата.Ссылка.ПолучитьОбъект(); + ОбъектПеренумерации[?(НоваяСтрокаРезультата.ЕстьНомер, "Номер", "Код")] = НоваяСтрокаРезультата.НовыйНомер; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОбъектПеренумерации, Истина, Ложь); + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + Функция ПериодичностьНомераДокументаГод(МетаданныеОбъекта) Возврат МетаданныеОбъекта.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Год; @@ -163,4 +395,133 @@ КонецФункции -#КонецОбласти +Функция ДанныеОбъектовОдногоВидаДляПеренумерацииПоследнихЭлементов(Знач ОписаниеОбъекта, Знач ПредыдущийПрефикс = "") + + ПолноеИмяОбъекта = ОписаниеОбъекта.ПолноеИмя; + ЕстьНомер = ОписаниеОбъекта.ЕстьНомер; + ИспользуетсяПрефиксОрганизации = ОписаниеОбъекта.ИспользуетсяПрефиксОрганизации; + + Запрос = Новый Запрос; + + ТекстыЗапросовПакета = Новый Массив; + Разделитель = + " + |; + |///////////////////////////////////////////////////////////// + |"; + + ТекстЗапроса = + "ВЫБРАТЬ + | ВыборкаПоДатеНомеру.Ссылка КАК Ссылка, + | &ИмяПоляОрганизация КАК Организация, + | &ИмяПоляКодНомер КАК Номер + |ПОМЕСТИТЬ ВыборкаПоДатеНомеру + |ИЗ + | &ИмяТаблицы КАК ВыборкаПоДатеНомеру + |ГДЕ + | &УсловиеПоДате И &ИмяПоляКодНомер ПОДОБНО &Префикс + | + |ИНДЕКСИРОВАТЬ ПО + | Номер, + | Организация"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоДате", ?(ЕстьНомер, "ВыборкаПоДатеНомеру.Дата >= &Дата", "ИСТИНА")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляКодНомер", "ВыборкаПоДатеНомеру." + ?(ЕстьНомер, "Номер", "Код")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ПолноеИмяОбъекта); + + ИмяПоляОрганизация = ?(ИспользуетсяПрефиксОрганизации, + "ВыборкаПоДатеНомеру." + ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ПолноеИмяОбъекта), "Неопределено"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляОрганизация", ИмяПоляОрганизация); + + ТекстыЗапросовПакета.Добавить(ТекстЗапроса); + + ТекстЗапроса = + "ВЫБРАТЬ + | МаксимальныеКоды.Организация КАК Организация, + | МАКСИМУМ(МаксимальныеКоды.Номер) КАК Номер + |ПОМЕСТИТЬ МаксимальныеКоды + |ИЗ + | ВыборкаПоДатеНомеру КАК МаксимальныеКоды + | + |СГРУППИРОВАТЬ ПО + | МаксимальныеКоды.Организация + | + |ИНДЕКСИРОВАТЬ ПО + | Номер, + | Организация"; + ТекстыЗапросовПакета.Добавить(ТекстЗапроса); + + ТекстЗапроса = + "ВЫБРАТЬ + | ВыборкаПоДатеНомеру.Организация КАК Организация, + | ВыборкаПоДатеНомеру.Номер КАК Номер, + | МАКСИМУМ(ВыборкаПоДатеНомеру.Ссылка) КАК Ссылка + |ИЗ + | ВыборкаПоДатеНомеру КАК ВыборкаПоДатеНомеру + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ МаксимальныеКоды КАК МаксимальныеКоды + | ПО (МаксимальныеКоды.Номер = ВыборкаПоДатеНомеру.Номер + | И МаксимальныеКоды.Организация = ВыборкаПоДатеНомеру.Организация) + | + |СГРУППИРОВАТЬ ПО + | ВыборкаПоДатеНомеру.Организация, + | ВыборкаПоДатеНомеру.Номер"; + ТекстыЗапросовПакета.Добавить(ТекстЗапроса); + + Запрос.Текст = СтрСоединить(ТекстыЗапросовПакета, Разделитель); + + Если ЕстьНомер Тогда + // Выбираем данные с начала текущего года. + СДаты = НачалоДня(НачалоГода(ТекущаяДатаСеанса())); + Запрос.УстановитьПараметр("Дата", НачалоДня(СДаты)); + КонецЕсли; + + // Обрабатываем объекты, созданные только в текущей информационной базе. + Префикс = "%[Префикс]-%"; + Префикс = СтрЗаменить(Префикс, "[Префикс]", ПредыдущийПрефикс); + Запрос.УстановитьПараметр("Префикс", Префикс); + + Возврат Запрос.Выполнить(); + +КонецФункции + +Функция НовоеОписаниеМетаданныхИспользующихПрефиксы() + + ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка"); + ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Имя", ОписаниеТиповСтрока); + Результат.Колонки.Добавить("ПолноеИмя", ОписаниеТиповСтрока); + + Результат.Колонки.Добавить("ЕстьКод", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЕстьНомер", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЭтоСправочник", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЭтоПланВидовХарактеристик", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЭтоДокумент", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЭтоБизнесПроцесс", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ЭтоЗадача", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ИспользуетсяПрефиксИБ", ОписаниеТиповБулево); + Результат.Колонки.Добавить("ИспользуетсяПрефиксОрганизации", ОписаниеТиповБулево); + + Результат.Колонки.Добавить("ПериодичностьНомера"); + + Результат.Колонки.Добавить("ИмяПодписки", ОписаниеТиповСтрока); + + Возврат Результат; + +КонецФункции + +Процедура ДополнитьСтрокуНулямиСлева(Строка, ДлинаСтроки) + + Строка = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Строка, ДлинаСтроки, "0", "Слева"); + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрацииПерепрефиксацияОбъектов() + + Возврат НСтр("ru = 'Префиксация объектов.Изменение префикса информационной базы'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl index 4b0fa43fe..38fd0354a 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Устанавливает префикс источника подписки в соответствии с префиксом организации. @@ -10,10 +5,10 @@ // обязательный реквизит шапки "Организация", с типом "СправочникСсылка.Организации". // // Параметры: -// Источник - Источник события подписки. +// Источник - Произвольный - Источник события подписки. // Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача]. -// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. -// Префикс - Строка - префикс объекта, который нужно изменить. +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. +// Префикс - Строка - префикс объекта, который нужно изменить. // Процедура УстановитьПрефиксОрганизации(Источник, СтандартнаяОбработка, Префикс) Экспорт @@ -25,10 +20,10 @@ // Ограничения на реквизиты источника не накладываются. // // Параметры: -// Источник - Источник события подписки. +// Источник - Произвольный - Источник события подписки. // Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача]. -// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. -// Префикс - Строка - префикс объекта, который нужно изменить. +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. +// Префикс - Строка - префикс объекта, который нужно изменить. // Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт @@ -41,10 +36,10 @@ // обязательный реквизит шапки "Организация", с типом "СправочникСсылка.Организации". // // Параметры: -// Источник - Источник события подписки. +// Источник - Произвольные - Источник события подписки. // Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача]. -// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. -// Префикс - Строка - префикс объекта, который нужно изменить. +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки. +// Префикс - Строка - префикс объекта, который нужно изменить. // Процедура УстановитьПрефиксИнформационнойБазыИОрганизации(Источник, СтандартнаяОбработка, Префикс) Экспорт @@ -110,7 +105,9 @@ // Параметры: // Источник - ДокументОбъект - источник события подписки. // Отказ - Булево - флаг отказа. -// +// РежимЗаписи - РежимЗаписиДокумента - В параметр передается текущий режим записи документа. +// РежимПроведения - РежимПроведенияДокумента - В данный параметр передается текущий режим проведения. +// Процедура ПроверитьНомерДокументаПоДате(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт ПроверитьНомерОбъектаПоДате(Источник); @@ -124,6 +121,8 @@ // Параметры: // Источник - ДокументОбъект - источник события подписки. // Отказ - Булево - флаг отказа. +// РежимЗаписи - РежимЗаписиДокумента - В параметр передается текущий режим записи документа. +// РежимПроведения - РежимПроведенияДокумента - В данный параметр передается текущий режим проведения. // Процедура ПроверитьНомерДокументаПоДатеИОрганизации(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт @@ -136,6 +135,9 @@ // Возвращает префикс этой информационной базы. // +// Параметры: +// ПрефиксИнформационнойБазы - Строка - Возвращаемое значение. Содержит префикс информационной базы. +// Процедура ПриОпределенииПрефиксаИнформационнойБазы(ПрефиксИнформационнойБазы) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl index 7d01536d0..7939963aa 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl @@ -5,8 +5,11 @@ #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. +// Следует использовать РаботаСФайлами.ДвоичныеДанныеФайла. // Возвращает двоичные данные присоединенного файла. -// Если двоичные данные файла не найдены в информационной базе или в томах, будет вызвано исключение. // // Параметры: // ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". @@ -16,82 +19,12 @@ // Функция ПолучитьДвоичныеДанныеФайла(Знач ПрисоединенныйФайл) Экспорт - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла", "ПрисоединенныйФайл", - ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип); - - ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, - "ТипХраненияФайла,ВладелецФайла,Наименование,Расширение,Том,ПутьКФайлу"); - - УстановитьПривилегированныйРежим(Истина); - - Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПрисоединенныеФайлы.ПрисоединенныйФайл, - | ПрисоединенныеФайлы.ХранимыйФайл - |ИЗ - | РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.ПрисоединенныйФайл = &ПрисоединенныйФайл"; - - Запрос.УстановитьПараметр("ПрисоединенныйФайл", ПрисоединенныйФайл); - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Следующий() Тогда - Возврат Выборка.ХранимыйФайл.Получить(); - КонецЕсли; - - // Запись в журнал регистрации. - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Двоичные данные файла отсутствуют в регистре ПрисоединенныеФайлы - | - |Ссылка на файл: ""%1"".'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл)); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Открытие файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя], - ПрисоединенныйФайл, - СообщениеОбОшибке); - - ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Присоединен к %1 : %2'"), - Строка(ТипЗнч(ФайлОбъект.ВладелецФайла)), - ФайлОбъект.ВладелецФайла); - - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( - ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение, - Ложь, - ПредставлениеВладельцаФайла); - Иначе - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; - - Попытка - Возврат Новый ДвоичныеДанные(ПолныйПуть); - Исключение - // Запись в журнал регистрации. - СообщениеОбОшибке = ТекстОшибкиПриПолученииФайла(ИнформацияОбОшибке(), ПрисоединенныйФайл); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Получение файла из тома'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя], - ПрисоединенныйФайл, - СообщениеОбОшибке); - - ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Присоединен к %1 : %2'"), - Строка(ТипЗнч(ФайлОбъект.ВладелецФайла)), - ФайлОбъект.ВладелецФайла); - - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( - ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение, - , - ПредставлениеВладельцаФайла); - - КонецПопытки; - КонецЕсли; + Возврат РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл); КонецФункции +// Устарела. +// Следует использовать РаботаСФайлами.ДанныеФайла. // Возвращает структуру данных файла. Используется в различных командах работы с файлами, // и как значение параметра ДанныеФайла других процедур и функций. // @@ -109,78 +42,33 @@ // Возвращаемое значение: // Структура - со свойствами: // * СсылкаНаДвоичныеДанныеФайла - Строка - адрес во временном хранилище. -// * ОтносительныйПуть - Строка - -// * ДатаМодификацииУниверсальная - Дата - -// * ИмяФайла - Строка - -// * Наименование - Строка - -// * Расширение - Строка - -// * Размер - Число - -// * Редактирует - Неопределено, СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи - -// * ПодписанЭП - Булево - -// * Зашифрован - Булево - -// * ФайлРедактируется - Булево - -// * ФайлРедактируетТекущийПользователь - Булево - +// * ОтносительныйПуть - Строка - относительный путь файла. +// * ДатаМодификацииУниверсальная - Дата - дата изменения фала. +// * ИмяФайла - Строка - имя файла без точки. +// * Наименование - Строка - наименование файла в справочнике хранения файлов. +// * Расширение - Строка - расширение файла без точки. +// * Размер - Число - размер файла. +// * Редактирует - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, +// СправочникСсылка.УчетныеЗаписиСинхронизацииФайлов, Неопределено. +// * ПодписанЭП - Булево - Истина, если файл подписан. +// * Зашифрован - Булево - Истина, если файл зашифрован. +// * ФайлРедактируется - Булево - Истина, если файл занят для редактирования. +// * ФайлРедактируетТекущийПользователь - Булево - Истина, если файл занят для редактирования текущим пользователем. // Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, Знач ДляРедактирования = Ложь) Экспорт - - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДанныеФайла", "ПрисоединенныйФайл", - ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип); - - ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден присоединенный файл ""%1"" (%2)'"), - Строка(ПрисоединенныйФайл), ПрисоединенныйФайл.Метаданные())); - - Если ДляРедактирования И Не ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда - ФайлОбъект.Заблокировать(); - ПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(ФайлОбъект); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - СсылкаНаДвоичныеДанныеФайла = Неопределено; - - Если ПолучатьСсылкуНаДвоичныеДанные Тогда - - ДвоичныеДанные = ПолучитьДвоичныеДанныеФайла(ПрисоединенныйФайл); - Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда - СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); - Иначе - СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные); - КонецЕсли; - - КонецЕсли; - - Результат = Новый Структура; - Результат.Вставить("СсылкаНаДвоичныеДанныеФайла", СсылкаНаДвоичныеДанныеФайла); - Результат.Вставить("ОтносительныйПуть", ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\"); - Результат.Вставить("ДатаМодификацииУниверсальная", ФайлОбъект.ДатаМодификацииУниверсальная); - Результат.Вставить("ИмяФайла", ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение); - Результат.Вставить("Наименование", ФайлОбъект.Наименование); - Результат.Вставить("Расширение", ФайлОбъект.Расширение); - Результат.Вставить("Размер", ФайлОбъект.Размер); - Результат.Вставить("Редактирует", ФайлОбъект.Редактирует); - Результат.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП); - Результат.Вставить("Зашифрован", ФайлОбъект.Зашифрован); - Результат.Вставить("ФайлРедактируется", ЗначениеЗаполнено(ФайлОбъект.Редактирует)); - Результат.Вставить("ФайлРедактируетТекущийПользователь", - ?(Результат.ФайлРедактируется, ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(), Ложь) ); - - Если ФайлОбъект.Зашифрован Тогда - МассивСертификатовШифрования = Новый Массив; - Для Каждого СтрокаТЧ Из ФайлОбъект.СертификатыШифрования Цикл - МассивСертификатовШифрования.Добавить(Новый Структура("Отпечаток, Представление", СтрокаТЧ.Отпечаток, СтрокаТЧ.Представление)); - КонецЦикла; - Результат.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования); - КонецЕсли; - - Возврат Результат; - + + Возврат РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл, + ИдентификаторФормы, + ПолучатьСсылкуНаДвоичныеДанные, + ДляРедактирования); + КонецФункции +// Устарела. +// Следует использовать РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту. // Заполняет массив ссылками на файлы объекта. // // Параметры: @@ -190,22 +78,12 @@ // Процедура ПолучитьПрикрепленныеФайлыКОбъекту(Знач Объект, Знач МассивФайлов) Экспорт - Если ТипЗнч(Объект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Возврат; - КонецЕсли; - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - Если ТипыВладельцев.Найти(ТипЗнч(Объект)) <> Неопределено Тогда - - МассивФайловЛокальный = ПрисоединенныеФайлыСлужебный.ПолучитьВсеПодчиненныеФайлы(Объект); - Для Каждого СсылкаНаФайл Из МассивФайловЛокальный Цикл - МассивФайлов.Добавить(СсылкаНаФайл); - КонецЦикла; - - КонецЕсли; + РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(Объект, МассивФайлов); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайлами.ДобавитьФайл. // Создает объект в справочнике для хранения файла и заполняет его реквизиты переданными свойствами. // // Параметры: @@ -215,7 +93,7 @@ // * ИмяБезРасширения - Строка - имя файла без расширения. // * РасширениеБезТочки - Строка - расширение файла (без точки вначале). // * ВремяИзмененияУниверсальное - Дата - дата и время изменения файла (UTC+0:00), -// если не указана, тогда используется ТекущаяУниверсальнаяДата(). +// если не указана, тогда используется ТекущаяУниверсальнаяДата. // АдресФайлаВоВременномХранилище - Строка - адрес, указывающий на двоичные данные во временном хранилище. // АдресВременногоХранилищаТекста - Строка - адрес, указывающий на извлеченный текст из файла во временном хранилище. // Описание - Строка - текстовое описание файла. @@ -237,586 +115,14 @@ Знач Описание = "", Знач НоваяСсылкаНаФайл = Неопределено) Экспорт - Автор = ПараметрыФайла.Автор; - ВладелецФайлов = ПараметрыФайла.ВладелецФайлов; - ИмяБезРасширения = ПараметрыФайла.ИмяБезРасширения; - РасширениеБезТочки = ПараметрыФайла.РасширениеБезТочки; - ВремяИзмененияУниверсальное = ПараметрыФайла.ВремяИзмененияУниверсальное; - - Если РасширениеБезТочки = Неопределено Тогда - ЧастиИмениФайла = СтрРазделить(ИмяБезРасширения, ".", Ложь); - Если ЧастиИмениФайла.Количество() > 1 Тогда - РасширениеБезТочки = ЧастиИмениФайла[ЧастиИмениФайла.Количество()-1]; - ИмяБезРасширения = Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - (СтрДлина(РасширениеБезТочки)+1)); - КонецЕсли; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ВремяИзмененияУниверсальное) - Или ВремяИзмененияУниверсальное > ТекущаяУниверсальнаяДата() Тогда - ВремяИзмененияУниверсальное = ТекущаяУниверсальнаяДата(); - КонецЕсли; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при добавлении присоединенного файла.'"); - - Если НоваяСсылкаНаФайл = Неопределено Тогда - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов(ВладелецФайлов, "", ЗаголовокОшибки, - НСтр("ru = 'В этом случае параметр ""НоваяСсылкаНаФайл"" должен быть указан.'")); - - НоваяСсылкаНаФайл = Справочники[ИмяСправочника].ПолучитьСсылку(); - Иначе - Если Не Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСсылкаНаФайл)) - Или Не ЗначениеЗаполнено(НоваяСсылкаНаФайл) Тогда - - ВызватьИсключение НСтр("ru = 'Ошибка при добавлении присоединенного файла. - |Ссылка на новый файл не заполнена.'"); - КонецЕсли; - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, НоваяСсылкаНаФайл.Метаданные().Имя, ЗаголовокОшибки); - КонецЕсли; - - ПрисоединенныйФайл = Справочники[ИмяСправочника].СоздатьЭлемент(); - ПрисоединенныйФайл.УстановитьСсылкуНового(НоваяСсылкаНаФайл); - - ПрисоединенныйФайл.ВладелецФайла = ВладелецФайлов; - ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; - ПрисоединенныйФайл.ДатаСоздания = ТекущаяДатаСеанса(); - ПрисоединенныйФайл.Описание = Описание; - ПрисоединенныйФайл.ПодписанЭП = Ложь; - ПрисоединенныйФайл.Наименование = ИмяБезРасширения; - ПрисоединенныйФайл.Расширение = РасширениеБезТочки; - ПрисоединенныйФайл.ТипХраненияФайла = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); - ПрисоединенныйФайл.Размер = ДвоичныеДанные.Размер(); - - СвояТранзакцияОткрыта = Ложь; - - Попытка - Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - НачатьТранзакцию(); - СвояТранзакцияОткрыта = Истина; - ПрисоединенныеФайлыСлужебный.ЗаписатьФайлВИнформационнуюБазу(НоваяСсылкаНаФайл, ДвоичныеДанные); - ПрисоединенныйФайл.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ПрисоединенныйФайл.ПутьКФайлу = ""; - Иначе - // Добавление в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ВремяИзмененияУниверсальное, - ИмяБезРасширения, РасширениеБезТочки, , ПрисоединенныйФайл.Зашифрован); - ПрисоединенныйФайл.Том = СведенияОФайле.Том; - ПрисоединенныйФайл.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - КонецЕсли; - - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - ИзвлеченныйТекст = ""; - - Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда - ИзвлеченныйТекст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - ИначеЕсли НЕ ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - // Тексты извлекаются сразу, а не в фоновом задании. - СтатусИзвлеченияТекста = ПрисоединенныеФайлыСлужебный.ИзвлечьТекст( - ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); - КонецЕсли; - - ПрисоединенныйФайл.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; - ПрисоединенныйФайл.ТекстХранилище = Новый ХранилищеЗначения(ИзвлеченныйТекст); - ПрисоединенныйФайл.Автор = Автор; - ПрисоединенныйФайл.Заполнить(Неопределено); - - ПрисоединенныйФайл.Записать(); - - Если СвояТранзакцияОткрыта Тогда - ЗафиксироватьТранзакцию(); - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - Если СвояТранзакцияОткрыта Тогда - ОтменитьТранзакцию(); - КонецЕсли; - - ШаблонСообщения = НСтр("ru = 'Ошибка при добавлении присоединенного файла ""%1"": - |%2'"); - КомментарийЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонСообщения, - ИмяБезРасширения + "." + РасширениеБезТочки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Добавление присоединенного файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - КомментарийЖурналаРегистрации); - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонСообщения, - ИмяБезРасширения + "." + РасширениеБезТочки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - Возврат ПрисоединенныйФайл.Ссылка; + Возврат РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, + АдресФайлаВоВременномХранилище, + АдресВременногоХранилищаТекста, + Описание, + НоваяСсылкаНаФайл); КонецФункции -// Возвращает новую ссылку на файл для указанного владельца, -// которую можно использовать, а затем передать в функцию ДобавитьФайл. -// -// Параметры: -// ВладелецФайлов - Ссылка - ссылка на объект, к которому добавляется файл. -// -// ИмяСправочника - Неопределено - вычислить справочник по владельцу (допустимо, -// когда справочник только один, иначе будет вызвано исключение). -// -// - Строка - имя справочника *ПрисоединенныеФайлы, отличное -// от стандартного <ИмяВладельца>ПрисоединенныеФайлы. -// -// Возвращаемое значение: -// СправочникСсылка - ссылка на новый еще несозданный присоединенный файл. -// -Функция НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при получении новой ссылки на присоединенный файл.'"); - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, ИмяСправочника, ЗаголовокОшибки); - - Возврат Справочники[ИмяСправочника].ПолучитьСсылку(); - -КонецФункции - -// Обновляет свойства файла - двоичные данные, текст, дату изменения, -// а также другие необязательные свойства. -// -// Параметры: -// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". -// ИнформацияОФайле - Структура - со свойствами: -// <обязательные> -// * АдресФайлаВоВременномХранилище - Строка - адрес новых двоичных данных файла. -// * АдресВременногоХранилищаТекста - Строка - адрес новых двоичных данных текста, -// извлеченного из файла. -// <необязательные> -// * ИмяБезРасширения - Строка - если свойство не указано или не заполнено, -// тогда не будет изменено. -// * ДатаМодификацииУниверсальная - Дата - дата последнего изменения файла, если -// свойство не указано или не заполнено, тогда будет -// установлена текущая дата сеанса. -// * Расширение - Строка - новое расширение файла. -// * Редактирует - Ссылка - новый пользователь, редактирующий файл. -// -Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт - - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла", "ПрисоединенныйФайл", - ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип); - - РеквизитыЗначения = Новый Структура; - - Если ИнформацияОФайле.Свойство("ИмяБезРасширения") И ЗначениеЗаполнено(ИнформацияОФайле.ИмяБезРасширения) Тогда - РеквизитыЗначения.Вставить("Наименование", ИнформацияОФайле.ИмяБезРасширения); - КонецЕсли; - - Если НЕ ИнформацияОФайле.Свойство("ДатаМодификацииУниверсальная") - ИЛИ НЕ ЗначениеЗаполнено(ИнформацияОФайле.ДатаМодификацииУниверсальная) - ИЛИ ИнформацияОФайле.ДатаМодификацииУниверсальная > ТекущаяУниверсальнаяДата() Тогда - - // Заполнение текущей даты в формате универсального времени. - РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ТекущаяУниверсальнаяДата()); - Иначе - РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ИнформацияОФайле.ДатаМодификацииУниверсальная); - КонецЕсли; - - Если ИнформацияОФайле.Свойство("Редактирует") Тогда - РеквизитыЗначения.Вставить("Редактирует", ИнформацияОФайле.Редактирует); - КонецЕсли; - - Если ИнформацияОФайле.Свойство("Расширение") Тогда - РеквизитыЗначения.Вставить("Расширение", ИнформацияОФайле.Расширение); - КонецЕсли; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИнформацияОФайле.АдресФайлаВоВременномХранилище); - - РеквизитыЗначения.Вставить("СтатусИзвлеченияТекста", Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен); - ИзвлеченныйТекст = ""; - - Если ЭтоАдресВременногоХранилища(ИнформацияОФайле.АдресВременногоХранилищаТекста) Тогда - - ИзвлеченныйТекст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища( - ИнформацияОФайле.АдресВременногоХранилищаТекста); - - РеквизитыЗначения.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - ИначеЕсли НЕ ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - // Тексты извлекаются сразу, а не в фоновом задании. - РеквизитыЗначения.СтатусИзвлеченияТекста = ПрисоединенныеФайлыСлужебный.ИзвлечьТекст( - ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); - КонецЕсли; - - РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения(ИзвлеченныйТекст)); - - ПрисоединенныеФайлыСлужебный.ОбновитьДвоичныеДанныеФайлаНаСервере( - ПрисоединенныйФайл, ДвоичныеДанные, РеквизитыЗначения); - -КонецПроцедуры - -// Возвращает имя формы объекта присоединенных файлов по владельцу. -// -// Параметры: -// ВладелецФайлов - Ссылка - ссылка на объект, по которому определяется имя формы. -// -// Возвращаемое значение: -// Строка - имя формы объекта присоединенных файлов по владельцу. -// -Функция ПолучитьИмяФормыОбъектаПрисоединенныхФайловПоВладельцу(Знач ВладелецФайлов) Экспорт - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при получении имени формы присоединенного файла.'"); - ОкончаниеОшибки = НСтр("ru = 'В этом случае получение формы невозможно.'"); - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, "", ЗаголовокОшибки, ОкончаниеОшибки); - - ПолноеИмяОМ = "Справочник." + ИмяСправочника; - - МетаданныеПрисоединенныхФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОМ); - - Если МетаданныеПрисоединенныхФайлов.ОсновнаяФормаОбъекта = Неопределено Тогда - ИмяФормы = ПолноеИмяОМ + ".ФормаОбъекта"; - Иначе - ИмяФормы = МетаданныеПрисоединенныхФайлов.ОсновнаяФормаОбъекта.ПолноеИмя(); - КонецЕсли; - - Возврат ИмяФормы; - -КонецФункции - -// Определяет наличие хранилища присоединенных файлов у объекта -// право Добавление в хранилище (справочник присоединенных файлов). -// -// Параметры: -// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется проверка. -// ИмяСправочника - Строка - если требуется проверка добавления в указанное хранилище. -// -// Возвращаемое значение: -// Булево - если Истина, тогда к объекту может присоединять файлы. -// -Функция КОбъектуМожноПрисоединятьФайлы(ВладелецФайлов, ИмяСправочника = "") Экспорт - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, ИмяСправочника); - - СправочникПрисоединенныеФайлы = Метаданные.Справочники.Найти(ИмяСправочника); - - ТипыХранимыхФайлов = - Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип; - - Возврат СправочникПрисоединенныеФайлы <> Неопределено - И ПравоДоступа("Добавление", СправочникПрисоединенныеФайлы) - И ТипыХранимыхФайлов.СодержитТип(Тип("СправочникСсылка." + ИмяСправочника)); - -КонецФункции - -// Конвертирует файлы из подсистемы Работа с файлами в подсистему Присоединенные файлы. -// Требует наличия подсистемы Работа с файлами. -// -// Для использования в процедурах обновления ИБ, если выполняется переход от использования -// одной подсистемы к другой в каком-либо объекте-владельце файлов. -// Выполняется последовательно для каждого элемента объекта-владельца файлов -// (элемента справочника, ПВХ, документа и т.п.). -// -// Параметры: -// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется конвертация. -// ИмяСправочника - Строка - если требуется конвертация в указанное хранилище. -// -Процедура СконвертироватьФайлыВПрисоединенные(Знач ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - Возврат; - КонецЕсли; - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при конвертации присоединенных файлов подсистемы Работа с файлами - |в присоединенные файлы подсистемы Присоединенные файлы.'"); - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, ИмяСправочника, ЗаголовокОшибки); - - УстановитьПривилегированныйРежим(Истина); - - ФайлыИсточник = МодульРаботаСФайламиСлужебныйВызовСервера.ПолучитьВсеПодчиненныеФайлы(ВладелецФайлов); - - МенеджерПрисоединенныхФайлов = Справочники[ИмяСправочника]; - - НачатьТранзакцию(); - - Попытка - - Для Каждого ФайлИсточник Из ФайлыИсточник Цикл - ФайлИсточникОбъект = ФайлИсточник.ПолучитьОбъект(); - ТекущаяВерсияОбъект = ФайлИсточникОбъект.ТекущаяВерсия.ПолучитьОбъект(); - - СсылкаНового = МенеджерПрисоединенныхФайлов.ПолучитьСсылку(); - ПрисоединенныйФайл = МенеджерПрисоединенныхФайлов.СоздатьЭлемент(); - ПрисоединенныйФайл.УстановитьСсылкуНового(СсылкаНового); - - ПрисоединенныйФайл.ВладелецФайла = ВладелецФайлов; - ПрисоединенныйФайл.Наименование = ФайлИсточникОбъект.Наименование; - ПрисоединенныйФайл.Автор = ФайлИсточникОбъект.Автор; - ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ТекущаяВерсияОбъект.ДатаМодификацииУниверсальная; - ПрисоединенныйФайл.ДатаСоздания = ФайлИсточникОбъект.ДатаСоздания; - - ПрисоединенныйФайл.Зашифрован = ФайлИсточникОбъект.Зашифрован; - ПрисоединенныйФайл.Изменил = ТекущаяВерсияОбъект.Автор; - ПрисоединенныйФайл.Описание = ФайлИсточникОбъект.Описание; - ПрисоединенныйФайл.ПодписанЭП = ФайлИсточникОбъект.ПодписанЭП; - ПрисоединенныйФайл.Размер = ТекущаяВерсияОбъект.Размер; - - ПрисоединенныйФайл.Расширение = ТекущаяВерсияОбъект.Расширение; - ПрисоединенныйФайл.Редактирует = ФайлИсточникОбъект.Редактирует; - ПрисоединенныйФайл.ТекстХранилище = ФайлИсточникОбъект.ТекстХранилище; - ПрисоединенныйФайл.ТипХраненияФайла = ТекущаяВерсияОбъект.ТипХраненияФайла; - ПрисоединенныйФайл.ПометкаУдаления = ФайлИсточникОбъект.ПометкаУдаления; - - // Если файл хранится на томе - делается ссылка на существующий файл. - ПрисоединенныйФайл.Том = ТекущаяВерсияОбъект.Том; - ПрисоединенныйФайл.ПутьКФайлу = ТекущаяВерсияОбъект.ПутьКФайлу; - - Для Каждого СертификатШифрованияСтрока Из ФайлИсточникОбъект.СертификатыШифрования Цикл - НоваяСтрока = ПрисоединенныйФайл.СертификатыШифрования.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, СертификатШифрованияСтрока); - КонецЦикла; - - Для Каждого ЭПСтрока Из ТекущаяВерсияОбъект.ЭлектронныеПодписи Цикл - НоваяСтрока = ПрисоединенныйФайл.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭПСтрока); - КонецЦикла; - ПрисоединенныйФайл.Заполнить(Неопределено); - - ПрисоединенныйФайл.Записать(); - - Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - ХранилищеФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсияОбъект.Ссылка); - ДвоичныеДанные = ХранилищеФайла.Получить(); - - МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ПрисоединенныйФайл = СсылкаНового; - МенеджерЗаписи.Прочитать(); - МенеджерЗаписи.ПрисоединенныйФайл = СсылкаНового; - МенеджерЗаписи.ХранимыйФайл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); - МенеджерЗаписи.Записать(); - КонецЕсли; - - ТекущаяВерсияОбъект.ПометкаУдаления = Истина; - ФайлИсточникОбъект.ПометкаУдаления = Истина; - - // Удаление ссылок на том в старом файле, что бы при удалении, файлы остались на месте. - Если ТекущаяВерсияОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ТекущаяВерсияОбъект.ПутьКФайлу = ""; - ТекущаяВерсияОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ФайлИсточникОбъект.ТекущаяВерсияПутьКФайлу = ""; - ФайлИсточникОбъект.ТекущаяВерсияТом = ""; - МодульРаботаСФайламиСлужебный.ПометитьНаУдалениеВерсииФайла(ФайлИсточникОбъект.Ссылка, ТекущаяВерсияОбъект.Ссылка); - КонецЕсли; - - ТекущаяВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); - ТекущаяВерсияОбъект.Записать(); - - ФайлИсточникОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); - ФайлИсточникОбъект.Записать(); - - КонецЦикла; - - ЗафиксироватьТранзакцию(); - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОтменитьТранзакцию(); - ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - КонецПопытки; - -КонецПроцедуры - -// Возвращает ссылки на объекты с файлами из подсистемы Работа с файлами. -// Требует наличия подсистемы Работа с файлами. -// -// Используется совместно с функцией СконвертироватьФайлыВПрисоединенные. -// -// Параметры: -// ТаблицаВладельцевФайлов - Строка - полное имя объекта метаданных, -// который может владеть присоединенными файлами. -// -// Возвращаемое значение: -// Массив - со значениями: -// * Ссылка - ссылка на объект у которого есть хотя бы один присоединенный файл. -// -Функция СсылкиНаОбъектыСФайлами(Знач ТаблицаВладельцевФайлов) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - Возврат Новый Массив; - КонецЕсли; - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - - Возврат МодульРаботаСФайламиСлужебный.СсылкиНаОбъектыСФайлами(ТаблицаВладельцевФайлов); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры, подключаемые к событиям управляемых форм. - -// Обработчик события ПриЗаписиНаСервере управляемой формы владельца присоединенного файла. -// -// Параметры: -// Отказ - Булево - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// ТекущийОбъект - Объект - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// ПараметрыЗаписи - Структура - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// Параметры - ДанныеФормыСтруктура - свойство Параметры управляемой формы. -// -Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры) Экспорт - - Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда - - ПрисоединенныеФайлыСлужебный.СкопироватьПрисоединенныеФайлы( - Параметры.ЗначениеКопирования, ТекущийОбъект); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры, вызываемые из модуля менеджера справочников с присоединенными файлами. - - -// Возвращает реквизиты объекта, которые разрешается редактировать -// с помощью обработки группового изменения реквизитов. -// -// Возвращаемое значение: -// Массив - список имен реквизитов объекта. -Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт - - РедактируемыеРеквизиты = Новый Массив; - РедактируемыеРеквизиты.Добавить("Описание"); - РедактируемыеРеквизиты.Добавить("Редактирует"); - - Возврат РедактируемыеРеквизиты; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Операции с электронной подписью. - -// Добавляет подпись к файлу. -// Параметры: -// ПрисоединенныйФайл - Ссылка - ссылка на присоединенный файл. -// -// СвойстваПодписи - Структура - содержит данные, которые возвращает процедура Подписать -// общего модуля ЭлектроннаяПодписьКлиент в качестве результата. -// - Массив - массив описанных выше структур. -// -// ИдентификаторФормы - УникальныйИдентификатор - если указан, то используется при блокировке объекта. -// -Процедура ДобавитьПодписьКФайлу(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы = Неопределено) Экспорт - - Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ПрисоединенныйФайл)) Тогда - СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, "Редактирует, Зашифрован"); - ПрисоединенныйФайлСсылка = ПрисоединенныйФайл; - Иначе - СтруктураРеквизитов = Новый Структура("Редактирует, Зашифрован"); - СтруктураРеквизитов.Редактирует = ПрисоединенныйФайл.Редактирует; - СтруктураРеквизитов.Зашифрован = ПрисоединенныйФайл.Зашифрован; - ПрисоединенныйФайлСсылка = ПрисоединенныйФайл.Ссылка; - КонецЕсли; - - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ДобавитьПодписьКФайлу", "ПрисоединенныйФайл", - ПрисоединенныйФайлСсылка, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип); - - Если ЗначениеЗаполнено(СтруктураРеквизитов.Редактирует) Тогда - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(ПрисоединенныйФайлСсылка); - КонецЕсли; - - Если СтруктураРеквизитов.Зашифрован Тогда - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(ПрисоединенныйФайлСсылка); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - МодульЭлектроннаяПодпись.ДобавитьПодпись(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики подписок на события. - -// Обработчик подписки на событие ОбработкаПолученияФормы для переопределения формы присоединенного файла. -// -// Параметры: -// Источник - СправочникМенеджер - менеджер справочника с именем "*ПрисоединенныеФайлы". -// ВидФормы - Строка - имя стандартной формы. -// Параметры - Структура - параметры формы. -// ВыбраннаяФорма - Строка - имя или объект метаданных открываемой формы. -// ДополнительнаяИнформация - Структура - дополнительная информация открытия формы. -// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. -// -Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, - ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт - - Если ВидФормы = "ФормаОбъекта" Тогда - ВыбраннаяФорма = "ОбщаяФорма.ПрисоединенныйФайл"; - СтандартнаяОбработка = Ложь; - - ИначеЕсли ВидФормы = "ФормаСписка" Тогда - ВыбраннаяФорма = "ОбщаяФорма.ПрисоединенныеФайлы"; - СтандартнаяОбработка = Ложь; - КонецЕсли; - -КонецПроцедуры - -// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. -// Помечает на удаление связанные файлы. -// -// Параметры: -// Источник - Объект - владелец присоединенного файла, кроме ДокументОбъект. -// Отказ - Булево - признак отказа от записи. -// -Процедура УстановитьПометкуУдаленияПрисоединенныхФайлов(Источник, Отказ) Экспорт - - Если Источник.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда - Возврат; - КонецЕсли; - - ПометитьНаУдалениеПрисоединенныеФайлы(Источник); - -КонецПроцедуры - -// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. -// Помечает на удаление связанные файлы. -// -// Параметры: -// Источник - ДокументОбъект - владелец присоединенного файла. -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// -Процедура УстановитьПометкуУдаленияПрисоединенныхФайловДокументов(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - - Если Источник.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - ПометитьНаУдалениеПрисоединенныеФайлы(Источник); - -КонецПроцедуры - -#Область УстаревшиеПроцедурыИФункции - // Устарела. Следует использовать функцию ДобавитьПрисоединенныйФайл. // // Создает объект в справочнике для хранения файла и заполняет его реквизиты переданными свойствами. @@ -827,7 +133,7 @@ // РасширениеБезТочки - Строка - расширение файла (без точки вначале). // ВремяИзменения - Дата - (не используется) дата и время изменения файла (местное время). // ВремяИзмененияУниверсальное - Дата - дата и время изменения файла (UTC+0:00), -// если не указана, тогда используется ТекущаяУниверсальнаяДата(). +// если не указана, тогда используется ТекущаяУниверсальнаяДата. // АдресФайлаВоВременномХранилище - Строка - адрес, указывающий на двоичные данные во временном хранилище. // АдресВременногоХранилищаТекста - Строка - адрес, указывающий на извлеченный текст из файла во временном хранилище. // Описание - Строка - текстовое описание файла. @@ -854,384 +160,256 @@ Знач Описание = "", Знач НоваяСсылкаНаФайл = Неопределено) Экспорт - // Если расширение не задано явно, выделяем его из имени файла. - Если РасширениеБезТочки = Неопределено Тогда - ЧастиИмениФайла = СтрРазделить(ИмяБезРасширения, ".", Ложь); - Если ЧастиИмениФайла.Количество() > 1 Тогда - РасширениеБезТочки = ЧастиИмениФайла[ЧастиИмениФайла.Количество()-1]; - ИмяБезРасширения = Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - (СтрДлина(РасширениеБезТочки)+1)); - КонецЕсли; - КонецЕсли; + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("Автор", Неопределено); + ПараметрыФайла.Вставить("ВладелецФайлов", ВладелецФайлов); + ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ВремяИзмененияУниверсальное); - Если Не ЗначениеЗаполнено(ВремяИзмененияУниверсальное) - Или ВремяИзмененияУниверсальное > ТекущаяУниверсальнаяДата() Тогда - ВремяИзмененияУниверсальное = ТекущаяУниверсальнаяДата(); - КонецЕсли; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при добавлении присоединенного файла.'"); - - Если НоваяСсылкаНаФайл = Неопределено Тогда - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов(ВладелецФайлов, "", ЗаголовокОшибки, - НСтр("ru = 'В этом случае параметр ""НоваяСсылкаНаФайл"" должен быть указан.'")); - - НоваяСсылкаНаФайл = Справочники[ИмяСправочника].ПолучитьСсылку(); - Иначе - Если Не Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСсылкаНаФайл)) - Или Не ЗначениеЗаполнено(НоваяСсылкаНаФайл) Тогда - - ВызватьИсключение НСтр("ru = 'Ошибка при добавлении присоединенного файла. - |Ссылка на новый файл не заполнена.'"); - КонецЕсли; - - ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, НоваяСсылкаНаФайл.Метаданные().Имя, ЗаголовокОшибки); - КонецЕсли; - - ПрисоединенныйФайл = Справочники[ИмяСправочника].СоздатьЭлемент(); - ПрисоединенныйФайл.УстановитьСсылкуНового(НоваяСсылкаНаФайл); - - ПрисоединенныйФайл.ВладелецФайла = ВладелецФайлов; - ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; - ПрисоединенныйФайл.ДатаСоздания = ТекущаяДатаСеанса(); - ПрисоединенныйФайл.Описание = Описание; - ПрисоединенныйФайл.ПодписанЭП = Ложь; - ПрисоединенныйФайл.Наименование = ИмяБезРасширения; - ПрисоединенныйФайл.Расширение = РасширениеБезТочки; - ПрисоединенныйФайл.ТипХраненияФайла = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); - ПрисоединенныйФайл.Размер = ДвоичныеДанные.Размер(); - - СвояТранзакцияОткрыта = Ложь; - - Попытка - Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - НачатьТранзакцию(); - СвояТранзакцияОткрыта = Истина; - ПрисоединенныеФайлыСлужебный.ЗаписатьФайлВИнформационнуюБазу(НоваяСсылкаНаФайл, ДвоичныеДанные); - ПрисоединенныйФайл.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ПрисоединенныйФайл.ПутьКФайлу = ""; - Иначе - // Добавление в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ВремяИзмененияУниверсальное, - ИмяБезРасширения, РасширениеБезТочки, , ПрисоединенныйФайл.Зашифрован); - ПрисоединенныйФайл.Том = СведенияОФайле.Том; - ПрисоединенныйФайл.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - КонецЕсли; - - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - ИзвлеченныйТекст = ""; - - Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда - ИзвлеченныйТекст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - ИначеЕсли НЕ ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - // Тексты извлекаются сразу, а не в фоновом задании. - СтатусИзвлеченияТекста = ПрисоединенныеФайлыСлужебный.ИзвлечьТекст( - ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); - КонецЕсли; - - ПрисоединенныйФайл.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; - ПрисоединенныйФайл.ТекстХранилище = Новый ХранилищеЗначения(ИзвлеченныйТекст); - ПрисоединенныйФайл.Заполнить(Неопределено); - ПрисоединенныйФайл.Записать(); - - Если СвояТранзакцияОткрыта Тогда - ЗафиксироватьТранзакцию(); - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - Если СвояТранзакцияОткрыта Тогда - ОтменитьТранзакцию(); - КонецЕсли; - - ШаблонСообщения = НСтр("ru = 'Ошибка при добавлении присоединенного файла ""%1"": - |%2'"); - КомментарийЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонСообщения, - ИмяБезРасширения + "." + РасширениеБезТочки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Добавление присоединенного файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - КомментарийЖурналаРегистрации); - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонСообщения, - ИмяБезРасширения + "." + РасширениеБезТочки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - Возврат ПрисоединенныйФайл.Ссылка; + Возврат РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, + АдресФайлаВоВременномХранилище, + АдресВременногоХранилищаТекста, + Описание, + НоваяСсылкаНаФайл); КонецФункции -#КонецОбласти +// Устарела. +// Следует использовать РаботаСФайлами.НоваяСсылкаНаФайл. +// Возвращает новую ссылку на файл для указанного владельца, +// которую можно использовать, а затем передать в функцию ДобавитьФайл. +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект, к которому добавляется файл. +// +// ИмяСправочника - Неопределено - вычислить справочник по владельцу (допустимо, +// когда справочник только один, иначе будет вызвано исключение). +// +// - Строка - имя справочника *ПрисоединенныеФайлы, отличное +// от стандартного <ИмяВладельца>ПрисоединенныеФайлы. +// +// Возвращаемое значение: +// СправочникСсылка - ссылка на новый еще несозданный присоединенный файл. +// +Функция НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт + + Возврат РаботаСФайлами.НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника); + +КонецФункции -#КонецОбласти +// Устарела. +// Следует использовать РаботаСФайлами.ОбновитьФайл. +// Обновляет свойства файла - двоичные данные, текст, дату изменения, +// а также другие необязательные свойства. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИнформацияОФайле - Структура - со свойствами: +// <обязательные> +// * АдресФайлаВоВременномХранилище - Строка - адрес новых двоичных данных файла. +// * АдресВременногоХранилищаТекста - Строка - адрес новых двоичных данных текста, +// извлеченного из файла. +// <необязательные> +// * ИмяБезРасширения - Строка - если свойство не указано или не заполнено, +// тогда не будет изменено. +// * ДатаМодификацииУниверсальная - Дата - дата последнего изменения файла, если +// свойство не указано или не заполнено, тогда будет +// установлена текущая дата сеанса. +// * Расширение - Строка - новое расширение файла. +// * Редактирует - Ссылка - новый пользователь, редактирующий файл. +// +Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт + + РаботаСФайлами.ОбновитьФайл(ПрисоединенныйФайл, ИнформацияОФайле); + +КонецПроцедуры -#Область СлужебныеПроцедурыИФункции +// Устарела. +// Следует использовать РаботаСФайлами.ИмяФормыОбъектаПрисоединенныхФайловПоВладельцу. +// Возвращает имя формы объекта присоединенных файлов по владельцу. +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект, по которому определяется имя формы. +// +// Возвращаемое значение: +// Строка - имя формы объекта присоединенных файлов по владельцу. +// +Функция ПолучитьИмяФормыОбъектаПрисоединенныхФайловПоВладельцу(Знач ВладелецФайлов) Экспорт + + Возврат РаботаСФайлами.ИмяФормыОбъектаФайловПоВладельцу(ВладелецФайлов); + +КонецФункции + +// Устарела. +// Следует использовать РаботаСФайлами.КОбъектуМожноПрисоединятьФайлы. +// Определяет наличие хранилища присоединенных файлов у объекта +// право Добавление в хранилище (справочник присоединенных файлов). +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется проверка. +// ИмяСправочника - Строка - если требуется проверка добавления в указанное хранилище. +// +// Возвращаемое значение: +// Булево - если Истина, тогда к объекту может присоединять файлы. +// +Функция КОбъектуМожноПрисоединятьФайлы(ВладелецФайлов, ИмяСправочника = "") Экспорт + + Возврат РаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(ВладелецФайлов, ИмяСправочника); + +КонецФункции + +// Устарела. Следует использовать РаботаСФайлами.ИзменитьСправочникХраненияФайлов. +// Конвертирует файлы из подсистемы Работа с файлами в подсистему Присоединенные файлы. +// Требует наличия подсистемы Работа с файлами. +// +// Для использования в процедурах обновления ИБ, если выполняется переход от использования +// одной подсистемы к другой в каком-либо объекте-владельце файлов. +// Выполняется последовательно для каждого элемента объекта-владельца файлов +// (элемента справочника, ПВХ, документа и т.п.). +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется конвертация. +// ИмяСправочника - Строка - если требуется конвертация в указанное хранилище. +// +Процедура СконвертироватьФайлыВПрисоединенные(Знач ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт + + РаботаСФайлами.ИзменитьСправочникХраненияФайлов(ВладелецФайлов, ИмяСправочника); + +КонецПроцедуры + +// Устарела. Следует использовать РаботаСФайлами.СсылкиНаОбъектыСФайлами. +// Возвращает ссылки на объекты с файлами из подсистемы Работа с файлами. +// Требует наличия подсистемы Работа с файлами. +// +// Используется совместно с функцией СконвертироватьФайлыВПрисоединенные. +// +// Параметры: +// ТаблицаВладельцевФайлов - Строка - полное имя объекта метаданных, +// который может владеть присоединенными файлами. +// +// Возвращаемое значение: +// Массив - со значениями: +// * Ссылка - ссылка на объект у которого есть хотя бы один присоединенный файл. +// +Функция СсылкиНаОбъектыСФайлами(Знач ТаблицаВладельцевФайлов) Экспорт + + Возврат РаботаСФайлами.СсылкиНаОбъектыСФайлами(ТаблицаВладельцевФайлов); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры, подключаемые к событиям управляемых форм. + +// Устарела. Следует использовать РаботаСФайлами.ПриЗаписиНаСервере. +// Обработчик события ПриЗаписиНаСервере управляемой формы владельца присоединенного файла. +// +// Параметры: +// Отказ - Булево - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// ТекущийОбъект - Объект - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// ПараметрыЗаписи - Структура - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// Параметры - ДанныеФормыСтруктура - свойство Параметры управляемой формы. +// +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры) Экспорт + + РаботаСФайлами.ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры, вызываемые из модуля менеджера справочников с присоединенными файлами. + + +// Устарела. Следует использовать РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке. +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + Возврат РаботаСФайлами.РеквизитыРедактируемыеВГрупповойОбработке(); + +КонецФункции + + +// Устарела. Следует использовать РаботаСФайлами.ДобавитьПодписьКФайлу. +//////////////////////////////////////////////////////////////////////////////// +// Операции с электронной подписью. +// Устарела. Следует использовать РаботаСФайлами.ДобавитьПодписьКФайлу. +// Добавляет подпись к файлу. +// Параметры: +// ПрисоединенныйФайл - Ссылка - ссылка на присоединенный файл. +// +// СвойстваПодписи - Структура - содержит данные, которые возвращает процедура Подписать +// общего модуля ЭлектроннаяПодписьКлиент в качестве результата. +// - Массив - массив описанных выше структур. +// +// ИдентификаторФормы - УникальныйИдентификатор - если указан, то используется при блокировке объекта. +// +Процедура ДобавитьПодписьКФайлу(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы = Неопределено) Экспорт + + РаботаСФайлами.ДобавитьПодписьКФайлу(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы); + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. -// Обработчик подписки на событие ПередЗаписью для заполнения авто реквизитов присоединенного файла. + +// Устарела. +// Следует использовать РаботаСФайлами.ОпределитьФормуПрисоединенногоФайла. +// Обработчик подписки на событие ОбработкаПолученияФормы для переопределения формы присоединенного файла. // // Параметры: -// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// Источник - СправочникМенеджер - менеджер справочника с именем "*ПрисоединенныеФайлы". +// ВидФормы - Строка - имя стандартной формы. +// Параметры - Структура - параметры формы. +// ВыбраннаяФорма - Строка - имя или объект метаданных открываемой формы. +// ДополнительнаяИнформация - Структура - дополнительная информация открытия формы. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. // -Процедура ВыполнитьДействияПередЗаписьюПрисоединенногоФайла(Источник, Отказ) Экспорт +Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, + ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт - Если Источник.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда - Возврат; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Источник.ВладелецФайла) Тогда - - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не заполнен владелец в файле - |""%1"".'"), - Источник.Наименование); - - Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Ошибка записи файла при обновлении ИБ'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - Источник.Ссылка, - ОписаниеОшибки); - Иначе - ВызватьИсключение ОписаниеОшибки; - КонецЕсли; - - КонецЕсли; - - Источник.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Источник.Расширение); - - Если Источник.ЭтоНовый() И Не ЗначениеЗаполнено(Источник.Автор) Тогда - Источник.Автор = Пользователи.АвторизованныйПользователь(); - КонецЕсли; - - Если Не Источник.ЭтоНовый() Тогда - - ИзмененаПометкаУдаления = - Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); - - Если ИзмененаПометкаУдаления И ЗначениеЗаполнено(Источник.Редактирует) Тогда - - Если Источник.Редактирует = Пользователи.АвторизованныйПользователь() Тогда - - ТекстОшибки = НСтр("ru = 'Действие недоступно, так как файл ""%1"" занят для редактирования.'"); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Источник.Наименование); - - Иначе - ТекстОшибки = НСтр("ru = 'Действие недоступно, так как файл ""%1"" занят для редактирования - |пользователем %2.'"); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, - Источник.Наименование, - Строка(Источник.Редактирует)); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; + РаботаСФайлами.ОпределитьФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, + ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) КонецПроцедуры -// Обработчик подписки на событие ПередУдалением для удаления данных, связанных с присоединенным файлом. +// Устарела. +// Следует использовать РаботаСФайлами.УстановитьПометкуУдаленияФайловПередЗаписью. +// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. +// Помечает на удаление связанные файлы. // // Параметры: -// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// -Процедура ВыполнитьДействияПередУдалениемПрисоединенногоФайла(Источник, Отказ) Экспорт +// Источник - Объект - владелец присоединенного файла, кроме ДокументОбъект. +// Отказ - Булево - признак отказа от записи. +// +Процедура УстановитьПометкуУдаленияПрисоединенныхФайлов(Источник, Отказ) Экспорт - Если Источник.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыСлужебный.ПередУдалениемПрисоединенногоФайлаСервер( - Источник.Ссылка, - Источник.ВладелецФайла, - Источник.Том, - Источник.ТипХраненияФайла, - Источник.ПутьКФайлу); - - КонецПроцедуры - -// Обработчик подписки на событие ПриЗаписи для обновления данных, связанных с присоединенным файлом. -// -// Параметры: -// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// -Процедура ВыполнитьДействияПриЗаписиПрисоединенногоФайла(Источник, Отказ) Экспорт - - Если Источник.ОбменДанными.Загрузка Тогда - ЗаписатьДанныеФайлаВРегистрПриОбмене(Источник); - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыСлужебный.ПриЗаписиПрисоединенногоФайлаСервер( - Источник.ВладелецФайла); - - ПрисоединенныеФайлыСлужебный.ПриОбновленииСостоянияОчередиИзвлеченияТекста( - Источник.Ссылка, Источник.СтатусИзвлеченияТекста); - - КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. - -// Возвращает текст сообщения об ошибке, добавляя к нему ссылку на элемент -// справочника хранимого файла. -// -Функция ТекстОшибкиПриПолученииФайла(Знач ИнформацияОбОшибке, Знач Файл) - - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - - Если Файл <> Неопределено Тогда - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 - | - |Ссылка на файл: ""%2"".'"), - СообщениеОбОшибке, - ПолучитьНавигационнуюСсылку(Файл) ); - КонецЕсли; - - Возврат СообщениеОбОшибке; - -КонецФункции - -// Возвращает идентификатор владельца присоединенного файла. -Функция ПолучитьИдентификаторОбъекта(Знач ВладелецФайлов) - - ТекстЗапроса = - "ВЫБРАТЬ - | НаличиеПрисоединенныхФайлов.ИдентификаторОбъекта - |ИЗ - | РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов - |ГДЕ - | НаличиеПрисоединенныхФайлов.ОбъектСФайлами = &ОбъектСФайлами"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("ОбъектСФайлами", ВладелецФайлов); - РезультатВыполнения = Запрос.Выполнить(); - - Если РезультатВыполнения.Пустой() Тогда - Возврат ""; - КонецЕсли; - - Выборка = РезультатВыполнения.Выбрать(); - Выборка.Следующий(); - - Возврат Выборка.ИдентификаторОбъекта; - -КонецФункции - -Процедура ПометитьНаУдалениеПрисоединенныеФайлы(Знач Источник, ИмяСправочника = Неопределено) - - Если Источник.ЭтоНовый() Тогда - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - ИсточникСсылкаПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); - - Если Источник.ПометкаУдаления = ИсточникСсылкаПометкаУдаления Тогда - Возврат; - КонецЕсли; - - Попытка - ИменаСправочников = ПрисоединенныеФайлыСлужебный.ИменаСправочниковХраненияФайлов( - ТипЗнч(Источник.Ссылка)); - Исключение - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - ВызватьИсключение НСтр("ru = 'Ошибка при пометке на удаление присоединенных файлов.'") - + Символы.ПС - + ПредставлениеОшибки; - КонецПопытки; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ВладелецФайла", Источник.Ссылка); - - ТекстЗапроса = - "ВЫБРАТЬ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Редактирует КАК Редактирует - |ИЗ - | &ИмяСправочника КАК Файлы - |ГДЕ - | Файлы.ВладелецФайла = &ВладелецФайла"; - - Для каждого ОписаниеИмениСправочника Из ИменаСправочников Цикл - - ПолноеИмяСправочника = "Справочник." + ОписаниеИмениСправочника.Ключ; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Если Источник.ПометкаУдаления И ЗначениеЗаполнено(Выборка.Редактирует) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '""%1"" не может быть удален, - |т.к. содержит присоединенный файл ""%2"", - |занятый для редактирования.'"), - Строка(Источник.Ссылка), - Строка(Выборка.Ссылка)); - КонецЕсли; - ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - ФайлОбъект.УстановитьПометкуУдаления(Источник.ПометкаУдаления); - КонецЦикла; - КонецЦикла; + РаботаСФайлами.УстановитьПометкуУдаленияПрисоединенныхФайлов(Источник, Отказ); КонецПроцедуры -Процедура ЗаписатьДанныеФайлаВРегистрПриОбмене(Знач Источник) +// Устарела. +// Следует использовать РаботаСФайлами.УстановитьПометкуУдаленияФайловДокументовПередЗаписью. +// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. +// Помечает на удаление связанные файлы. +// +// Параметры: +// Источник - ДокументОбъект - владелец присоединенного файла. +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +Процедура УстановитьПометкуУдаленияПрисоединенныхФайловДокументов(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - Перем ДвоичныеДанныеФайла; - - Если Источник.ДополнительныеСвойства.Свойство("ДвоичныеДанныеФайла", ДвоичныеДанныеФайла) Тогда - НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ПрисоединенныйФайл.Использование = Истина; - НаборЗаписей.Отбор.ПрисоединенныйФайл.Значение = Источник.Ссылка; - - Запись = НаборЗаписей.Добавить(); - Запись.ПрисоединенныйФайл = Источник.Ссылка; - Запись.ХранимыйФайл = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9)); - - НаборЗаписей.ОбменДанными.Загрузка = Истина; - НаборЗаписей.Записать(); - - Источник.ДополнительныеСвойства.Удалить("ДвоичныеДанныеФайла"); - КонецЕсли; + РаботаСФайлами.УстановитьПометкуУдаленияПрисоединенныхФайловДокументов(Источник, Отказ, РежимЗаписи, РежимПроведения); КонецПроцедуры #КонецОбласти + +#КонецОбласти + diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl index 16cdaae4d..dcda5683b 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl @@ -5,6 +5,10 @@ #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ОткрытьФайл. // Открывает файл для просмотра или редактирования. // Если файл открывается для просмотра, тогда получает файл в рабочий каталог пользователя, // при этом ищет файл в рабочем каталоге и предлагает открыть существующий или получить файл с сервера. @@ -15,17 +19,14 @@ // ДанныеФайла - Структура - данные файла. // ДляРедактирования - Булево - Истина, если файл открывается для редактирования, иначе Ложь. // -Процедура ОткрытьФайл(Знач ДанныеФайла, Знач ДляРедактирования = Истина) Экспорт +Процедура ОткрытьФайл(Знач ДанныеФайла, Знач ДляРедактирования = Ложь) Экспорт - Параметры = Новый Структура; - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - Параметры.Вставить("ДляРедактирования", ДляРедактирования); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ДляРедактирования); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ДобавитьФайлы. // Обработчик команды добавления файлов. // Предлагает пользователю выбирать файлы в диалоге выбора файлов и // пытается поместить выбранные файлы в хранилище файлов, когда: @@ -43,16 +44,12 @@ // Процедура ДобавитьФайлы(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач Фильтр = "") Экспорт - Параметры = Новый Структура; - Параметры.Вставить("ВладелецФайла", ВладелецФайла); - Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Параметры.Вставить("Фильтр", Фильтр); - - ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + РаботаСФайламиКлиент.ДобавитьФайлы(ВладелецФайла, ИдентификаторФормы, Фильтр); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ПодписатьФайл. // Подписывает присоединенный файл. // // Параметры: @@ -67,42 +64,12 @@ // Процедура ПодписатьФайл(ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - Если Не ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Не выбран файл, который нужно подписать.'")); - Возврат; - КонецЕсли; - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Добавление электронных подписей не поддерживается.'")); - Возврат; - КонецЕсли; - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - - Если Не МодульЭлектроннаяПодписьКлиент.ИспользоватьЭлектронныеПодписи() Тогда - ПоказатьПредупреждение(, - НСтр("ru = 'Чтобы добавить электронную подпись, включите - |в настройках программы использование электронных подписей.'")); - Возврат; - КонецЕсли; - - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; - - Если Не ДополнительныеПараметры.Свойство("ДанныеФайла") Тогда - ДополнительныеПараметры.Вставить("ДанныеФайла", ПолучитьДанныеФайла( - ПрисоединенныйФайл, ИдентификаторФормы)); - КонецЕсли; - - ОбработкаРезультата = Неопределено; - ДополнительныеПараметры.Свойство("ОбработкаРезультата", ОбработкаРезультата); - - ПрисоединенныеФайлыСлужебныйКлиент.ПодписатьФайл(ПрисоединенныйФайл, - ДополнительныеПараметры.ДанныеФайла, ИдентификаторФормы, ОбработкаРезультата); + РаботаСФайламиКлиент.ПодписатьФайл(ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.СохранитьВместеСЭП. // Сохраняет файл вместе вместе с ЭП. // Используется в обработчике команды сохранения файла. // @@ -113,27 +80,12 @@ // Процедура СохранитьВместеСЭП(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); - ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); - ОписаниеДанных.Вставить("Данные", Новый ОписаниеОповещения( - "ПриСохраненииДанныхФайла", ПрисоединенныеФайлыСлужебныйКлиент, Параметры)); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью(ОписаниеДанных); + РаботаСФайламиКлиент.СохранитьВместеСЭП(ПрисоединенныйФайл, ИдентификаторФормы); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.СохранитьФайлКак. // Сохраняет файл в каталог на диске. // Так же используется, как вспомогательная функция при сохранении файла с ЭП. // @@ -145,14 +97,12 @@ // Процедура СохранитьФайлКак(Знач ДанныеФайла) Экспорт - Параметры = Новый Структура; - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - - ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьФайлКакРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ПерейтиКФормеФайла. // Открывает общую форму присоединенного файла из формы элемента // справочника присоединенных файлов. Форма элемента закрывается. // @@ -173,9 +123,9 @@ Продолжить; КонецЕсли; - Если Содержимое.ИмяФормы = "ОбщаяФорма.ПрисоединенныйФайл" Тогда + Если Содержимое.ИмяФормы = "Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл" Тогда Если Содержимое.Параметры.Свойство("ПрисоединенныйФайл") - И Содержимое.Параметры.ПрисоединенныйФайл = ПрисоединенныйФайл Тогда + И Содержимое.Параметры.ПрисоединенныйФайл = ПрисоединенныйФайл Тогда ОкноКП.Активизировать(); Возврат; КонецЕсли; @@ -183,10 +133,12 @@ КонецЦикла; - ОткрытьФормуПрисоединенногоФайла(ПрисоединенныйФайл); + РаботаСФайламиКлиент.ОткрытьФормуФайла(ПрисоединенныйФайл); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ОткрытьФормуВыбораФайлов. // Открывает форму выбора файлов. // Используется в обработчике выбора для переопределения стандартного поведения. // @@ -204,10 +156,12 @@ ПараметрыФормы.Вставить("РежимВыбора", Истина); ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайлов); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, ЭлементФормы); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", ПараметрыФормы, ЭлементФормы); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ОткрытьФормуФайла. // Открывает форму присоединенного файла. // Может использоваться как обработчик открытия присоединенного файла. // @@ -217,29 +171,53 @@ // Процедура ОткрытьФормуПрисоединенногоФайла(Знач ПрисоединенныйФайл, СтандартнаяОбработка = Ложь) Экспорт - СтандартнаяОбработка = Ложь; - - Если ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - КонецЕсли; + РаботаСФайламиКлиент.ОткрытьФормуФайла(ПрисоединенныйФайл, СтандартнаяОбработка); КонецПроцедуры -// См. эту функцию в модуле ПрисоединенныеФайлы. +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ДанныеФайла. +// Возвращает структуру данных файла. Используется в различных командах работы с файлами, +// и как значение параметра ДанныеФайла других процедур и функций. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, который +// используется при получении двоичных данных файла. +// +// ПолучатьСсылкуНаДвоичныеДанные - Булево - если передать Ложь, то ссылка на двоичные данные +// не будет получена, что существенно ускорит выполнение для больших двоичных данных. +// +// ДляРедактирования - Булево - если указать Истина, то свободный файл будет захвачен для редактирования. +// +// Возвращаемое значение: +// Структура - со свойствами: +// * СсылкаНаДвоичныеДанныеФайла - Строка - адрес во временном хранилище. +// * ОтносительныйПуть - Строка - относительный путь файла. +// * ДатаМодификацииУниверсальная - Дата - дата изменения фала. +// * ИмяФайла - Строка - имя файла без точки. +// * Наименование - Строка - наименование файла в справочнике хранения файлов. +// * Расширение - Строка - расширение файла без точки. +// * Размер - Число - размер файла. +// * Редактирует - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, +// Неопределено - ссылка на пользователя, занявшего файл. +// * ПодписанЭП - Булево - Истина, если файл подписан. +// * Зашифрован - Булево - Истина, если файл зашифрован. +// * ФайлРедактируется - Булево - Истина, если файл занят для редактирования. +// * ФайлРедактируетТекущийПользователь - Булево - Истина, если файл занят для редактирования текущим пользователем. +// Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, Знач ДляРедактирования = Ложь) Экспорт - Возврат ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла( - ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные, ДляРедактирования); + Возврат РаботаСФайламиКлиент.ДанныеФайла(ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные,ДляРедактирования); КонецФункции +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ПолучитьФайл. // Получает файл из хранилища файлов в рабочий каталог пользователя. // Аналог интерактивного действия Просмотреть или Редактировать без открытия полученного файла. // Свойство ТолькоПросмотр полученного файла будет установлено в зависимости от того захвачен @@ -265,10 +243,16 @@ // Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры); + РаботаСФайламиКлиент.ПолучитьПрисоединенныйФайл( + Оповещение, + ПрисоединенныйФайл, + ИдентификаторФормы, + ДополнительныеПараметры); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.ПоместитьФайл. // Помещает файл из рабочего каталога пользователя в хранилище файлов. // Аналог интерактивного действия Закончить редактирование. // @@ -289,10 +273,16 @@ // Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры); + РаботаСФайламиКлиент.ПоместитьПрисоединенныйФайл( + Оповещение, + ПрисоединенныйФайл, + ИдентификаторФормы, + ДополнительныеПараметры); КонецПроцедуры +// Устарела. +// Следует использовать РаботаСФайламиКлиент.НапечататьФайлы. // Выполняет печать файлов. // // Параметры: @@ -301,154 +291,10 @@ // Процедура НапечататьФайлы(ДанныеФайлов, ИдентификаторФормы) Экспорт - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("НомерФайла", 0); - ПараметрыВыполнения.Вставить("ДанныеФайлов", ДанныеФайлов); - ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); - ПараметрыВыполнения.Вставить("ДляРедактирования", Ложь); - ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); - ВыполнитьОбработкуОповещения(Обработчик); + РаботаСФайламиКлиент.НапечататьФайлы(ДанныеФайлов, ИдентификаторФормы); КонецПроцедуры -// Процедура печати Файла -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения для дальнейшего вызова. -// ПараметрыВыполнения - Структура - со свойствами: -// * НомерФайла - Число - номер текущего файла, -// * ДанныеФайла - Структура - данные файла, -// * УникальныйИдентификатор - УникальныйИдентификатор. -// -Процедура НапечататьФайлыВыполнение(ОбработчикРезультата, ПараметрыВыполнения) Экспорт - - Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ПараметрыВыполнения.НомерФайла]; - - ПараметрыВыполнения.ДанныеФайла = ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла(ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы); - - Обработчик = Новый ОписаниеОповещения("НапечататьФайлПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); - - ПолучитьПрисоединенныйФайл( - Обработчик, - ДанныеФайла, - ПараметрыВыполнения.ИдентификаторФормы, - ПараметрыВыполнения) - -КонецПроцедуры - -// Процедура печати Файла после получения на диск -// -// Параметры: -// ПараметрыВыполнения - Структура - со свойствами: -// * НомерФайла - Число - номер текущего файла, -// * ДанныеФайла - Структура - данные файла, -// * УникальныйИдентификатор - УникальныйИдентификатор. -// -Процедура НапечататьФайлПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт - - Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда - Возврат; - КонецЕсли; - - Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда - Возврат; - КонецЕсли; - - НапечататьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); - - // переходим к печати следующего файла. - ПараметрыВыполнения.НомерФайла = ПараметрыВыполнения.НомерФайла + 1; - Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); - ВыполнитьОбработкуОповещения(Обработчик); - -КонецПроцедуры - -// Выполняет печать файла внешним приложением. -// -// Параметры -// ИмяОткрываемогоФайла - Строка - полное имя файла. -// -Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) Экспорт - - Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда - Возврат; - КонецЕсли; - - СистемнаяИнфо = Новый СистемнаяИнформация; - Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - - Shell = Новый COMОбъект("Shell.Application"); - Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); - - КонецЕсли; - -КонецПроцедуры - #КонецОбласти -#Область СлужебныеПроцедурыИФункции - -// Процедура предназначена для печати файла соответствующим приложением -// -// Параметры -// ДанныеФайла - Структура - данные файла. -// ИмяОткрываемогоФайла - Строка - полное имя файла. -// -Процедура НапечататьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла) - - РасширенияИсключения = - " m3u, m4a, mid, midi, mp2, mp3, mpa, rmi, wav, wma, - | 3g2, 3gp, 3gp2, 3gpp, asf, asx, avi, m1v, m2t, m2ts, m2v, m4v, mkv, mov, mp2v, mp4, mp4v, mpe, mpeg, mts, vob, wm, wmv, wmx, wvx, - | 7z, zip, rar, arc, arh, arj, ark, p7m, pak, package, - | app, com, exe, jar, dll, res, iso, isz, mdf, mds, - | cf, dt, epf, erf"; - - Расширение = НРег(ДанныеФайла.Расширение); - Если СтрНайти(РасширенияИсключения, " "+Расширение+",") > 0 Тогда - - Возврат; - - ИначеЕсли Расширение = "grs" Тогда - - Схема = Новый ГрафическаяСхема; - Схема.Прочитать(ИмяОткрываемогоФайла); - Схема.Напечатать();; - - ИначеЕсли Расширение = "mxl" Тогда - - ТабличныйДокумент = Новый ТабличныйДокумент; - ТабличныйДокумент.Прочитать(ИмяОткрываемогоФайла); - ТабличныйДокумент.Напечатать(); - - Иначе - - Попытка - - СистемнаяИнфо = Новый СистемнаяИнформация; - Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - ИмяОткрываемогоФайла = СтрЗаменить(ИмяОткрываемогоФайла, "/", "\"); - КонецЕсли; - - НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла); - - Исключение - - Инфо = ИнформацияОбОшибке(); - ПоказатьПредупреждение(,СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Описание=""%1""'"), - КраткоеПредставлениеОшибки(Инфо))); - - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl index 83340aef5..1dceb81ef 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl @@ -5,11 +5,22 @@ #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. -// См. эту процедуру в модуле ПрисоединенныеФайлы. -// Предназначена для поддержки толстого клиента (вариант клиент-сервер). +// Устарела. +// Следует использовать РаботаСФайлами.ОпределитьФормуПрисоединенногоФайла. +// Обработчик подписки на событие ОбработкаПолученияФормы для переопределения формы файла. +// +// Параметры: +// Источник - СправочникМенеджер - менеджер справочника с именем "*ПрисоединенныеФайлы". +// ВидФормы - Строка - имя стандартной формы. +// Параметры - Структура - параметры формы. +// ВыбраннаяФорма - Строка - имя или объект метаданных открываемой формы. +// ДополнительнаяИнформация - Структура - дополнительная информация открытия формы. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. // Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, ВидФормы, @@ -18,7 +29,7 @@ ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт - ПрисоединенныеФайлыСлужебныйВызовСервера.ПереопределитьПолучаемуюФормуПрисоединенногоФайла( + РаботаСФайламиСлужебныйВызовСервера.ОпределитьФормуПрисоединенногоФайла( Источник, ВидФормы, Параметры, @@ -29,3 +40,5 @@ КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыПереопределяемый/Module.bsl index 9d9b66c78..ddf9b8244 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыПереопределяемый/Module.bsl @@ -5,6 +5,9 @@ #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РаботаСФайламиПереопределяемый.ПриОпределенииСправочниковХраненияФайлов. // Позволяет переопределить справочники хранения файлов по типам владельцев. // // Параметры: @@ -22,24 +25,26 @@ КонецПроцедуры +// Устарела. Следует использовать РаботаСФайламиПереопределяемый.ПриОпределенииНастроек. // Формирует массив метаданных, которые не должны выводиться в настройках очистки файлов. // // Параметры: // МассивИсключений - Массив - метаданные, которые не должны выводиться в настройках очистки файлов. // -// Например: +// Пример: // МассивИсключений.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы); // Процедура ПриОпределенииОбъектовИсключенияОчисткиФайлов(МассивИсключений) Экспорт КонецПроцедуры +// Устарела. Следует использовать РаботаСФайламиПереопределяемый.ПриОпределенииНастроек. // Формирует массив метаданных, которые не должны выводиться в настройках синхронизации файлов. // // Параметры: // МассивИсключений -Массив - метаданные, которые не должны выводиться в настройках синхронизации файлов. // -// Например: +// Пример: // МассивИсключений.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы); // Процедура ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(МассивИсключений) Экспорт @@ -48,3 +53,5 @@ #КонецОбласти +#КонецОбласти + diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl deleted file mode 100644 index 8ddd0bd5d..000000000 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl +++ /dev/null @@ -1,2351 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Присоединенные файлы". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Используется при выгрузке файлов для перехода в сервис (БТС). -// -Процедура ВыгрузитьФайл(Знач ОбъектФайла, Знач ИмяНовогоФайла) Экспорт - - Если ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ОбъектФайла.Том) + ОбъектФайла.ПутьКФайлу; - КопироватьФайл(ПолныйПуть, ИмяНовогоФайла); - - Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза - - ДвоичныеДанныеФайла = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(ОбъектФайла.Ссылка); - ДвоичныеДанныеФайла.Записать(ИмяНовогоФайла); - - КонецЕсли; - -КонецПроцедуры - -// Используется при загрузке файлов для переходе в сервис (БТС). -// -Процедура ЗагрузитьФайл(Знач ОбъектФайла, Знач ПутьКФайлу) Экспорт - - ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); - - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - // Добавление файла в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ОбъектФайла.ДатаМодификацииУниверсальная, - ОбъектФайла.Наименование, ОбъектФайла.Расширение,, ОбъектФайла.Зашифрован); - ОбъектФайла.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - ОбъектФайла.Том = СведенияОФайле.Том; - ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; - ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - - Иначе - - ОбъектФайла.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); - ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - ОбъектФайла.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ОбъектФайла.ПутьКФайлу = ""; - ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - - КонецЕсли; - -КонецПроцедуры - -// Обновляет свойства файла - двоичные данные, текст, дату изменения, -// а также другие необязательные свойства. -// -Процедура ОбновитьПрисоединенныйФайлОбъект(Знач ПрисоединенныйФайлОбъект, Знач ИнформацияОФайле) Экспорт - - РеквизитыЗначения = Новый Структура; - - Если ИнформацияОФайле.Свойство("ИмяБезРасширения") И ЗначениеЗаполнено(ИнформацияОФайле.ИмяБезРасширения) Тогда - РеквизитыЗначения.Вставить("Наименование", ИнформацияОФайле.ИмяБезРасширения); - КонецЕсли; - - Если НЕ ИнформацияОФайле.Свойство("ДатаМодификацииУниверсальная") - ИЛИ НЕ ЗначениеЗаполнено(ИнформацияОФайле.ДатаМодификацииУниверсальная) - ИЛИ ИнформацияОФайле.ДатаМодификацииУниверсальная > ТекущаяУниверсальнаяДата() Тогда - - // Заполнение текущей даты в формате универсального времени. - РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ТекущаяУниверсальнаяДата()); - Иначе - РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ИнформацияОФайле.ДатаМодификацииУниверсальная); - КонецЕсли; - - Если ИнформацияОФайле.Свойство("Редактирует") Тогда - РеквизитыЗначения.Вставить("Редактирует", ИнформацияОФайле.Редактирует); - КонецЕсли; - - Если ИнформацияОФайле.Свойство("Расширение") Тогда - РеквизитыЗначения.Вставить("Расширение", ИнформацияОФайле.Расширение); - КонецЕсли; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИнформацияОФайле.АдресФайлаВоВременномХранилище); - - РеквизитыЗначения.Вставить("СтатусИзвлеченияТекста", Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен); - ИзвлеченныйТекст = ""; - - Если ЭтоАдресВременногоХранилища(ИнформацияОФайле.АдресВременногоХранилищаТекста) Тогда - - ИзвлеченныйТекст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища( - ИнформацияОФайле.АдресВременногоХранилищаТекста); - - РеквизитыЗначения.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - ИначеЕсли НЕ ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - // Тексты извлекаются сразу, а не в фоновом задании. - РеквизитыЗначения.СтатусИзвлеченияТекста = ИзвлечьТекст( - ДвоичныеДанные, ПрисоединенныйФайлОбъект.Расширение, ИзвлеченныйТекст); - КонецЕсли; - - РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения(ИзвлеченныйТекст)); - - ОбновитьДвоичныеДанныеФайлаНаСервере( - ПрисоединенныйФайлОбъект, ДвоичныеДанные, РеквизитыЗначения); - -КонецПроцедуры - -// Объявляет события подсистемы ПрисоединенныеФайлы: -// -// Серверные события: -// ПриОпределенииСправочниковХраненияФайлов. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Позволяет переопределить справочники хранения файлов по типам владельцев. - // - // Параметры: - // ТипВладелецФайла - Тип ссылки объекта, к которому добавляется файл. - // - // ИменаСправочников - Соответствие, содержащее в ключах имена справочников. - // При вызове содержит имя одного стандартного справочника. - // Если в значении соответствия разместить Истина только - // один раз, тогда в случаях, когда требуется один справочник, - // будет выбран такой справочник. - // Если же справочников несколько, и не один в значении не содержит. - // Истина или более одного содержат Истина, тогда будет ошибка. - // - // Синтаксис: - // Процедура ПриОпределенииСправочниковХраненияФайлов(ТипВладелецФайла, ИменаСправочников) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ПрисоединенныеФайлы\ПриОпределенииСправочниковХраненияФайлов"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриУдаленииРегистрацииИзменений"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриЗаписиИзвлеченногоТекста"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваФайловВТомах"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНаличияХранимыхФайлов"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриПолученииХранимыхФайлов"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииИмениФайлаСПутемКДвоичнымДанным"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - - СерверныеОбработчики["ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса\ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса"].Добавить( - "ПрисоединенныеФайлыСлужебный"); - - КонецЕсли; - -КонецПроцедуры - -// Размещает файлы из сформированного образа. -Процедура ДобавитьФайлыВТомаПриРазмещении(Знач СоответствиеПутейФайлов, - Знач ТипХраненияФайлов, - Знач Файлы) - - Для Каждого ЭлементСоответствия Из СоответствиеПутейФайлов Цикл - - Позиция = СтрНайти(ЭлементСоответствия.Ключ, "CatalogRef"); - - Если Позиция = 0 Тогда - Продолжить; - КонецЕсли; - - ПолныйПутьФайлаНаДиске = СоответствиеПутейФайлов.Получить(ЭлементСоответствия.Ключ); - - Если ПолныйПутьФайлаНаДиске = Неопределено Тогда - Продолжить; - КонецЕсли; - - УникальныйИдентификатор = Новый УникальныйИдентификатор(Лев(ЭлементСоответствия.Ключ, Позиция - 1)); - - ИмяСправочника = Прав(ЭлементСоответствия.Ключ, СтрДлина(ЭлементСоответствия.Ключ) - Позиция -10); - Ссылка = Справочники[ИмяСправочника].ПолучитьСсылку(УникальныйИдентификатор); - - Если Ссылка.Пустая() Тогда - Продолжить; - КонецЕсли; - - Объект = Ссылка.ПолучитьОбъект(); - - Если Объект.ТипХраненияФайла <> Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - Продолжить; - КонецЕсли; - - Если Файлы.Найти(ТипЗнч(Объект)) = Неопределено Тогда - Файлы.Добавить(ТипЗнч(Объект)); - КонецЕсли; - - // Размещение файлов в базе-приемнике внутри базы, независимо от хранения в базе-источнике. - Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - - Объект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - Объект.ПутьКФайлу = ""; - Объект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - - ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПутьФайлаНаДиске); - ОбновитьДвоичныеДанныеФайлаНаСервере(Объект, ПоместитьВоВременноеХранилище(ДвоичныеДанные)); - - Иначе // Размещение файлов в базе-приемнике внутри тома, независимо от хранения в базе-источнике. - ФайлИсходный = Новый Файл(ПолныйПутьФайлаНаДиске); - ПолныйПутьНовый = ФайлИсходный.Путь + Объект.Наименование + "." + Объект.Расширение; - ПереместитьФайл(ПолныйПутьФайлаНаДиске, ПолныйПутьНовый); - - // Добавление файла в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ПолныйПутьНовый, Объект.ДатаМодификацииУниверсальная, - Объект.Наименование, Объект.Расширение,, Объект.Зашифрован); - Объект.Том = СведенияОФайле.Том; - Объект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - Объект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; - - КонецЕсли; - - Объект.Записать(); - - Если НЕ ПустаяСтрока(ПолныйПутьНовый) Тогда - УдалитьФайлы(ПолныйПутьНовый); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -// Удаляет регистрацию в плане обмена при обмене файлами. -// -// Параметры: -// ПланОбменаСсылка - Ссылка на план обмена. -// ТипыФайлов - Массив Типов справочников с присоединенными файлами. -// -Процедура УдалитьРегистрациюИзменений(ПланОбменаСсылка, ТипыФайлов) - - Для Каждого Тип Из ТипыФайлов Цикл - ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаСсылка, Метаданные.НайтиПоТипу(Тип)); - КонецЦикла; - -КонецПроцедуры - -// Проверяет, что переданный элемент данных - это объект присоединенного файла. -Функция ЭтоЭлементПрисоединенныеФайлы(ЭлементДанных) - - Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда - Возврат Ложь; - КонецЕсли; - - МетаданныеЭлемента = ЭлементДанных.Метаданные(); - - Возврат ОбщегоНазначения.ЭтоСправочник(МетаданныеЭлемента) - И ВРег(Прав(МетаданныеЭлемента.Имя, СтрДлина("ПрисоединенныеФайлы"))) = ВРег("ПрисоединенныеФайлы"); - -КонецФункции - -// Возвращает количество версий с неизвлеченным текстом. -Функция ПолучитьКоличествоВерсийСНеизвлеченнымТекстом() - - КоличествоФайлов = 0; - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - ВсеИменаСправочников = Новый Соответствие; - - Для Каждого Тип Из ТипыВладельцев Цикл - - Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Продолжить; - КонецЕсли; - - ИменаСправочников = ИменаСправочниковХраненияФайлов(Тип); - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если ВсеИменаСправочников[КлючИЗначение.Ключ] <> Неопределено Тогда - Продолжить; - КонецЕсли; - ИмяСправочникаПрисоединенныхФайлов = КлючИЗначение.Ключ; - ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапросаДляЧислаФайловСНеизвлеченнымТекстом(ИмяСправочникаПрисоединенныхФайлов); - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - КоличествоФайлов = КоличествоФайлов + Выборка.КоличествоФайлов; - КонецЕсли - КонецЦикла; - КонецЦикла; - - Возврат КоличествоФайлов; - -КонецФункции - -// Возвращает путь к файлу на диске. Если файл хранится в информационной базе, -// предварительно сохраняет его. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на присоединенный файл. -// -// Возвращаемое значение: -// Строка - полный путь к файлу на диске. -// -Функция ПолучитьИмяФайлаСПутемКДвоичнымДанным(Знач ПрисоединенныйФайл, ПустойПутьДляПустыхДанных = Ложь) - - ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(ПрисоединенныйФайл.Расширение); - - Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПрисоединенныеФайлы.ПрисоединенныйФайл, - | ПрисоединенныеФайлы.ХранимыйФайл - |ИЗ - | РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.ПрисоединенныйФайл = &ПрисоединенныйФайл"; - - Запрос.УстановитьПараметр("ПрисоединенныйФайл", ПрисоединенныйФайл.Ссылка); - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Следующий() Тогда - ДвоичныеДанные = Выборка.ХранимыйФайл.Получить(); - - Если ПустойПутьДляПустыхДанных И ТипЗнч(ДвоичныеДанные) <> Тип("ДвоичныеДанные") Тогда - Возврат ""; - КонецЕсли; - - ДвоичныеДанные.Записать(ИмяФайлаСПутем); - - ИначеЕсли ПустойПутьДляПустыхДанных Тогда - Возврат ""; - Иначе - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( - ПрисоединенныйФайл.Наименование + "." + ПрисоединенныйФайл.Расширение); - КонецЕсли; - Иначе - Если НЕ ПрисоединенныйФайл.Том.Пустая() Тогда - ИмяФайлаСПутем = ФайловыеФункцииСлужебный.ПолныйПутьТома(ПрисоединенныйФайл.Том) + ПрисоединенныйФайл.ПутьКФайлу; - КонецЕсли; - КонецЕсли; - - Возврат ИмяФайлаСПутем; - -КонецФункции - -// Заполняет параметр КоличествоФайловВТомах. -Процедура ОпределитьКоличествоФайловВТомах(КоличествоФайловВТомах) - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - ВсеИменаСправочников = Новый Соответствие; - - Запрос = Новый Запрос; - - Для Каждого Тип Из ТипыВладельцев Цикл - - Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Продолжить; - КонецЕсли; - - ИменаСправочников = ИменаСправочниковХраненияФайлов(Тип); - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если ВсеИменаСправочников[КлючИЗначение.Ключ] <> Неопределено Тогда - Продолжить; - КонецЕсли; - ИмяСправочникаПрисоединенныхФайлов = КлючИЗначение.Ключ; - ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); - - Запрос.Текст = - "ВЫБРАТЬ - | ЕСТЬNULL(КОЛИЧЕСТВО(ПрисоединенныеФайлы.Ссылка), 0) КАК КоличествоФайлов - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске)"; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяСправочника", - "Справочник." + ИмяСправочникаПрисоединенныхФайлов); - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - КоличествоФайловВТомах = КоличествоФайловВТомах + Выборка.КоличествоФайлов; - КонецЕсли - КонецЦикла; - КонецЦикла; - -КонецПроцедуры - -// Возвращает размер файлов на томе (в байтах). -Функция ПодсчитатьРазмерФайловНаТоме(СсылкаТома) Экспорт - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - ВсеИменаСправочников = Новый Соответствие; - - Запрос = Новый Запрос; - Запрос.Параметры.Вставить("Том", СсылкаТома); - - РазмерФайловВТоме = 0; - - Для Каждого Тип Из ТипыВладельцев Цикл - - Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Продолжить; - КонецЕсли; - - ИменаСправочников = ИменаСправочниковХраненияФайлов(Тип); - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если ВсеИменаСправочников[КлючИЗначение.Ключ] <> Неопределено Тогда - Продолжить; - КонецЕсли; - ИмяСправочникаПрисоединенныхФайлов = КлючИЗначение.Ключ; - ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); - - Запрос.Текст = - "ВЫБРАТЬ - | ЕСТЬNULL(СУММА(ПрисоединенныеФайлы.Размер), 0) КАК РазмерФайлов - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.Том = &Том"; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяСправочника", - "Справочник." + ИмяСправочникаПрисоединенныхФайлов); - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - РазмерФайловВТоме = РазмерФайловВТоме + Выборка.РазмерФайлов; - КонецЕсли - КонецЦикла; - КонецЦикла; - - Возврат РазмерФайловВТоме; - -КонецФункции - -// Возвращает Истина в параметре ЕстьХранимыеФайлы, если есть хранимые файлы к объекту ВнешнийОбъект. -// Определяет есть ли хранимые файлы у внешнего объекта. -// -// Параметры: -// ВнешнийОбъект - Ссылка на внешний объект. -// ЕстьХранимыеФайлы - Булево (возвращаемое значение), варианты значений параметра: -// Истина - возврат, -// Ложь - устанавливает Истина, если объект имеет хранимые файлы. -// -Процедура ОпределитьНаличиеХранимыхФайлов(Знач ВнешнийОбъект, ЕстьХранимыеФайлы) - - Если ЕстьХранимыеФайлы = Истина Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ВнешнийОбъект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Возврат; - КонецЕсли; - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - Если ТипыВладельцев.Найти(ТипЗнч(ВнешнийОбъект)) <> Неопределено Тогда - ЕстьХранимыеФайлы = ОбъектИмеетФайлы(ВнешнийОбъект); - КонецЕсли; - -КонецПроцедуры - -// Заполняет массив ХранимыеФайлы данными хранимых файлов объекта ВнешнийОбъект. -Процедура ПолучитьХранимыеФайлы(Знач ВнешнийОбъект, Знач ХранимыеФайлы) - - Если ТипЗнч(ВнешнийОбъект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Возврат; - КонецЕсли; - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - Если ТипыВладельцев.Найти(ТипЗнч(ВнешнийОбъект)) = Неопределено Тогда - Возврат; - КонецЕсли; - - МассивФайлов = ПолучитьВсеПодчиненныеФайлы(ВнешнийОбъект); - Для Каждого Файл Из МассивФайлов Цикл - - ДанныеФайла = Новый Структура; - ДанныеФайла.Вставить("ДатаМодификацииУниверсальная", Файл.ДатаМодификацииУниверсальная); - ДанныеФайла.Вставить("Размер", Файл.Размер); - ДанныеФайла.Вставить("Наименование", Файл.Наименование); - ДанныеФайла.Вставить("Расширение", Файл.Расширение); - - ДанныеФайла.Вставить("ДвоичныеДанныеФайла", ПрисоединенныеФайлы.ПолучитьДанныеФайла( - Файл, Неопределено).СсылкаНаДвоичныеДанныеФайла); - - ДанныеФайла.Вставить("Текст", Файл.ТекстХранилище.Получить()); - - ХранимыеФайлы.Добавить(ДанныеФайла); - КонецЦикла; - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.5"; - Обработчик.Процедура = "ПрисоединенныеФайлыСлужебный.ОчиститьНекорректныеЗаписиРегистраСведенийНаличиеПрисоединенныхФайлов"; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры используемые при обмене данными и выгрузке / загрузке данных. - -// Возвращает массив справочников, выступающих в роли владельцев файлов. -// -// Возвращаемое значение: Массив(ОбъектМетаданных). -// -Функция СправочникиФайлов() Экспорт - - Результат = Новый Массив(); - - КоллекцииМетаданных = Новый Массив(); - КоллекцииМетаданных.Добавить(Метаданные.Справочники); - КоллекцииМетаданных.Добавить(Метаданные.Документы); - КоллекцииМетаданных.Добавить(Метаданные.БизнесПроцессы); - КоллекцииМетаданных.Добавить(Метаданные.Задачи); - КоллекцииМетаданных.Добавить(Метаданные.ПланыСчетов); - КоллекцииМетаданных.Добавить(Метаданные.ПланыОбмена); - КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); - КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета); - - Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл - - Для Каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл - - МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); - ПустаяСсылка = МенеджерОбъекта.ПустаяСсылка(); - ИменаСправочниковХраненияФайлов = ИменаСправочниковХраненияФайлов(ПустаяСсылка, Истина); - - Для Каждого ИмяСправочникаХраненияФайлов Из ИменаСправочниковХраненияФайлов Цикл - - Результат.Добавить(Метаданные.Справочники[ИмяСправочникаХраненияФайлов.Ключ]); - - КонецЦикла; - - КонецЦикла; - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -// Возвращает массив объектов метаданных, которые используются для хранения -// двоичных данных файлов в информационной базе. -// -// Возвращаемое значение: Массив(ОбъектМетаданных). -// -Функция ОбъектыХраненияФайловИнформационнойБазе() Экспорт - - Результат = Новый Массив(); - Результат.Добавить(Метаданные.РегистрыСведений.ПрисоединенныеФайлы); - Возврат Результат; - -КонецФункции - -// Возвращает расширение файла. -// -// Объект - СправочникОбъект. -// -Функция РасширениеФайла(Объект) Экспорт - - Возврат Объект.Расширение; - -КонецФункции - -// Для служебного использования. -Процедура ПриОтправкеФайла(ЭлементДанных, - ОтправкаЭлемента, - Знач СозданиеНачальногоОбраза = Ложь, - Получатель = Неопределено) - - // Для обменов не РИБ используется алгоритм обычного сеанса обмена, а не создания начального образа, - // т.к. параметра СозданиеНачальногоОбраза равный Истина означает начальную выгрузку данных. - Если СозданиеНачальногоОбраза И Получатель <> Неопределено - И Не ОбщегоНазначения.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель.Ссылка) Тогда - СозданиеНачальногоОбраза = Ложь; - КонецЕсли; - - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить - ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ЭтоЭлементПрисоединенныеФайлы(ЭлементДанных) Тогда - - Если СозданиеНачальногоОбраза Тогда - - Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - Если Получатель <> Неопределено - И Получатель.ДополнительныеСвойства.Свойство("РазмещатьФайлыВНачальномОбразе") Тогда - - // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ПоместитьФайлВРеквизитСправочника(ЭлементДанных); - - Иначе - - // Копируем файл из тома на диске в каталог создания начального образа. - ИмяКаталогаФайлов = Строка(ХранилищеОбщихНастроек.Загрузить("ОбменФайлами", "ВременныйКаталог")); - - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ЭлементДанных.Том) + ЭлементДанных.ПутьКФайлу; - УникальныйИдентификатор = ЭлементДанных.Ссылка.УникальныйИдентификатор(); - - НовыйПутьФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ИмяКаталогаФайлов, - Строка(УникальныйИдентификатор) + "CatalogRef_" + ЭлементДанных.Метаданные().Имя); - - ФайловыеФункцииСлужебный.СкопироватьФайлПриСозданииНачальногоОбраза(ПолныйПуть, НовыйПутьФайла); - - КонецЕсли; - - Иначе - - // Если файл хранится в ИБ, то при создании начального образа - // он будет выгружен в составе регистра сведений ПрисоединенныеФайлы. - - КонецЕсли; - - Иначе - - Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ПоместитьФайлВРеквизитСправочника(ЭлементДанных); - - Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза - - Попытка - // Помещаем данные файла из информационной базы в служебный реквизит справочника. - АдресВоВременномХранилище = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ЭлементДанных.Ссылка).СсылкаНаДвоичныеДанныеФайла; - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище), Новый СжатиеДанных(9)); - Исключение - // Возможно, файл не был найден. Отправку данных не прерываем. - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Не удалось отправить файл при обмене данными'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); - - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - КонецПопытки; - - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - ЭлементДанных.ПутьКФайлу = ""; - ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - - КонецЕсли; - - КонецЕсли; - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаличиеПрисоединенныхФайлов") Тогда - - // В каждом узле свои идентификаторы объекта. Сброс перед отправкой. - Для каждого Запись Из ЭлементДанных Цикл - Запись.ИдентификаторОбъекта = ""; - КонецЦикла; - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ПрисоединенныеФайлы") - И Не СозданиеНачальногоОбраза Тогда - - // Выгрузку регистра выполняем только при создании начального образа. - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; - - КонецЕсли; - -КонецПроцедуры - -// Для служебного использования. -Процедура ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента) - - Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ЭтоЭлементПрисоединенныеФайлы(ЭлементДанных) Тогда - - Если ПолучениеФайлаЗапрещено(ЭлементДанных) Тогда - - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - // Для существующих файлов, размещенных в томах, выполняем их удаление из томов, - // т.к. при получении нового файла он будет заново размещен в томе или информационной базе. - Если НЕ ЭлементДанных.ЭтоНовый() Тогда - - ВерсияФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭлементДанных.Ссылка, "ТипХраненияФайла, Том, ПутьКФайлу"); - - Если ВерсияФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - ПрежнийПутьНаТоме = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияФайла.Том) + ВерсияФайла.ПутьКФайлу; - - ФайловыеФункцииСлужебный.УдалитьФайлыНаСервере(ПрежнийПутьНаТоме); - - КонецЕсли; - - КонецЕсли; - - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - // По обмену пришел элемент с хранением в базе - но в базе приемнике принято хранить в томах. - // Из служебного реквизита файл размещаем на томе и меняем ТипХраненияФайла на ВТомахНаДиске. - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ЭлементДанных.ФайлХранилище.Получить(), - ЭлементДанных.ДатаМодификацииУниверсальная, ЭлементДанных.Наименование, ЭлементДанных.Расширение,, - ЭлементДанных.Зашифрован); - ЭлементДанных.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - ЭлементДанных.Том = СведенияОФайле.Том; - - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - - Иначе - - ДвоичныеДанные = ЭлементДанных.ФайлХранилище.Получить(); - - Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда - ЭлементДанных.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); - КонецЕсли; - - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ЭлементДанных.ПутьКФайлу = ""; - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - - КонецЕсли; - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаличиеПрисоединенныхФайлов") Тогда - - Набор = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьНаборЗаписей(); - Если ЭлементДанных.Отбор.ОбъектСФайлами.Использование Тогда - Набор.Отбор.ОбъектСФайлами.Установить(ЭлементДанных.Отбор.ОбъектСФайлами.Значение); - КонецЕсли; - Набор.Прочитать(); - - СтарыеДанные = Набор.Выгрузить(); - СтарыеДанные.Индексы.Добавить("ОбъектСФайлами"); - - // В каждом узле свои идентификаторы объекта. Восстановление перед загрузкой. - Для каждого Запись Из ЭлементДанных Цикл - Строка = СтарыеДанные.Найти(Запись.ОбъектСФайлами, "ОбъектСФайлами"); - Если Строка <> Неопределено Тогда - Запись.ИдентификаторОбъекта = Строка.ИдентификаторОбъекта; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -// Отменяет редактирование файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка или Объект присоединенного файла, который требуется освободить. -// -Процедура ОсвободитьФайл(Знач ПрисоединенныйФайл) Экспорт - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - Иначе - ФайлОбъект = ПрисоединенныйФайл; - КонецЕсли; - - Если ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда - ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); - ФайлОбъект.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Отмечает файл, как редактируемый. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка или Объект присоединенного файла, который требуется отметить. -// -Процедура ЗанятьФайлДляРедактированияСервер(Знач ПрисоединенныйФайл, Пользователь = Неопределено) Экспорт - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - Иначе - ФайлОбъект = ПрисоединенныйФайл; - КонецЕсли; - - Если Пользователь = Неопределено Тогда - ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(); - Иначе - ФайлОбъект.Редактирует = Пользователь; - КонецЕсли; - ФайлОбъект.Записать(); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Очистка ненужных файлов - -Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение, ДанныеДляОтчета = Ложь) Экспорт - - Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда - Если ДанныеДляОтчета Тогда - ТекстЗапроса = - "ВЫБРАТЬ - | ТИПЗНАЧЕНИЯ(СправочникПрисоединенныеФайлы.ВладелецФайла) КАК ВладелецФайла, - | СправочникПрисоединенныеФайлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; - Иначе - ТекстЗапроса = - "ВЫБРАТЬ - | СправочникПрисоединенныеФайлы.Ссылка КАК ФайлСсылка"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - |ИЗ - | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК СправочникПрисоединенныеФайлы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы - | ПО СправочникПрисоединенныеФайлы.ВладелецФайла = СправочникФайлы.Ссылка - |ГДЕ - | НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления - | И ВЫБОР - | КОГДА СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА (ВЫРАЗИТЬ(СправочникПрисоединенныеФайлы.ПутьКФайлу КАК СТРОКА(100))) <> """" - | ИЛИ НЕ СправочникПрисоединенныеФайлы.Том = ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИНАЧЕ ИСТИНА - | КОНЕЦ - | И ТИПЗНАЧЕНИЯ(СправочникПрисоединенныеФайлы.ВладелецФайла) = &ТипВладельца - | И СправочникПрисоединенныеФайлы.ДатаСоздания <= &ПериодОчистки"; - Иначе - МассивРеквизитовСТипомДата = Новый Массив; - - ТипОбъекта = ВладелецФайла; - ВсеСправочники = Справочники.ТипВсеСсылки(); - ВсеДокументы = Документы.ТипВсеСсылки(); - ЕстьТипДата = Ложь; - ТекстЗапроса = - "ВЫБРАТЬ - | СправочникФайлы.Ссылка, - | ТИПЗНАЧЕНИЯ(СправочникПрисоединенныеФайлы.ВладелецФайла) КАК ВладелецФайла, - | СправочникПрисоединенныеФайлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов,"; - Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Справочник.Реквизиты Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; - КонецЦикла; - ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Документ = Метаданные.Документы[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Документ.Реквизиты Цикл - Если Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; - КонецЦикла; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - | СправочникПрисоединенныеФайлы.Ссылка КАК ФайлСсылка - |ИЗ - | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК СправочникПрисоединенныеФайлы - | ЛЕВОЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы - | ПО СправочникПрисоединенныеФайлы.ВладелецФайла = СправочникФайлы.Ссылка - |ГДЕ - | НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления - | И ВЫБОР - | КОГДА СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА (ВЫРАЗИТЬ(СправочникПрисоединенныеФайлы.ПутьКФайлу КАК СТРОКА(100))) <> """" - | ИЛИ НЕ СправочникПрисоединенныеФайлы.Том = ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИНАЧЕ ИСТИНА - | КОНЕЦ - | И ТИПЗНАЧЕНИЯ(СправочникПрисоединенныеФайлы.ВладелецФайла) = &ТипВладельца"; - КонецЕсли; - Если МассивИсключений.Количество() > 0 Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ СправочникПрисоединенныеФайлы.ВладелецФайла В ИЕРАРХИИ (&МассивИсключений)"; - КонецЕсли; - Если ЭлементИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И СправочникПрисоединенныеФайлы.ВладелецФайла В ИЕРАРХИИ (&ЭлементИсключение)"; - КонецЕсли; - - Возврат ТекстЗапроса; - -КонецФункции - -Процедура СформироватьТекстЗапросаПолногоОбъемаФайлов(ТекстЗапроса, ДобавитьПсевдонимПоля) Экспорт - - МетаданныеСправочники = Метаданные.Справочники; - - Для Каждого Справочник Из МетаданныеСправочники Цикл - Если Справочник.Реквизиты.Найти("ВладелецФайла") <> Неопределено Тогда - - Если Не СтрЗаканчиваетсяНа(Справочник.Имя, "ПрисоединенныеФайлы") Тогда - Продолжить; - КонецЕсли; - - ТипыВладельцевФайлов = Справочник.Реквизиты.ВладелецФайла.Тип.Типы(); - - Для Каждого ТипВладельца Из ТипыВладельцевФайлов Цикл - - ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ") + " - | - |ВЫБРАТЬ - | ТИПЗНАЧЕНИЯ(СправочникПрисоединенныеФайлы.ВладелецФайла) " + ?(ДобавитьПсевдонимПоля, "КАК ВладелецФайла,",",") + " - | СправочникПрисоединенныеФайлы.Размер / 1024 / 1024 " + ?(ДобавитьПсевдонимПоля, "КАК ОбъемВсего","") + " - |ИЗ - | Справочник." + Справочник.Имя + " КАК СправочникПрисоединенныеФайлы - |ГДЕ - | НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления"; - - Если ДобавитьПсевдонимПоля Тогда - ДобавитьПсевдонимПоля = Ложь; - КонецЕсли; - - КонецЦикла; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Функция ПроверитьЦелостностьФайлов(ТаблицаФайловНаДиске, Том) Экспорт - - МетаданныеСправочники = Метаданные.Справочники; - Запрос = Новый Запрос; - - ДобавитьПсевдонимПоля = Истина; - - Для Каждого Справочник Из МетаданныеСправочники Цикл - Если Справочник.Реквизиты.Найти("ВладелецФайла") <> Неопределено Тогда - ТипыВладельцевФайлов = Справочник.Реквизиты.ВладелецФайла.Тип.Типы(); - - Если Не СтрЗаканчиваетсяНа(Справочник.Имя, "ПрисоединенныеФайлы") Тогда - Продолжить; - КонецЕсли; - - Для Каждого ТипВладельца Из ТипыВладельцевФайлов Цикл - - Запрос.Текст = Запрос.Текст + ?(ПустаяСтрока(Запрос.Текст),"", " ОБЪЕДИНИТЬ ВСЕ") + " - | - |ВЫБРАТЬ - | СправочникПрисоединенныеФайлы.Ссылка " + ?(ДобавитьПсевдонимПоля, "КАК Ссылка,",",") + " - | СправочникПрисоединенныеФайлы.Расширение " + ?(ДобавитьПсевдонимПоля, "КАК Расширение,",",") + " - | СправочникПрисоединенныеФайлы.Наименование " + ?(ДобавитьПсевдонимПоля, "КАК Наименование,",",") + " - | СправочникПрисоединенныеФайлы.Том " + ?(ДобавитьПсевдонимПоля, "КАК Том,",",") + " - | СправочникПрисоединенныеФайлы.Изменил " + ?(ДобавитьПсевдонимПоля, "КАК Отредактировал,",",") + " - | СправочникПрисоединенныеФайлы.ДатаМодификацииУниверсальная " + ?(ДобавитьПсевдонимПоля, "КАК ДатаМодификацииФайла,",",") + " - | СправочникПрисоединенныеФайлы.ПутьКФайлу " + ?(ДобавитьПсевдонимПоля, "КАК ПутьКФайлу","") + " - |ИЗ - | Справочник." + Справочник.Имя + " КАК СправочникПрисоединенныеФайлы - |ГДЕ - | СправочникПрисоединенныеФайлы.Том = &Том - | И СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | И НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления"; - - Если ДобавитьПсевдонимПоля Тогда - ДобавитьПсевдонимПоля = Ложь; - КонецЕсли; - - КонецЦикла; - КонецЕсли; - КонецЦикла; - Запрос.УстановитьПараметр("Том", Том); - РезультатЗапроса = Запрос.Выполнить(); - - Выборка = РезультатЗапроса.Выбрать(); - - ПолныйПутьТома = ФайловыеФункцииСлужебный.ПолныйПутьТома(Том); - - Пока Выборка.Следующий() Цикл - - ВерсияСсылка = Выборка.Ссылка; - ПутьКФайлу = Выборка.ПутьКФайлу; - - Если ЗначениеЗаполнено(Выборка.ПутьКФайлу) И ЗначениеЗаполнено(Выборка.Том) Тогда - - // Удаляем лишнюю точку, если у файла нет расширения. - Если ВерсияСсылка.Расширение = "" И СтрЗаканчиваетсяНа(ПутьКФайлу, ".") Тогда - ПутьКФайлу = Лев(ПутьКФайлу, СтрДлина(ПутьКФайлу) - 1); - КонецЕсли; - - ПолныйПутьФайла = ПолныйПутьТома + ПутьКФайлу; - - СуществующийФайл = ТаблицаФайловНаДиске.НайтиСтроки(Новый Структура("ПолноеИмя", ПолныйПутьФайла)); - - Если СуществующийФайл.Количество() = 0 Тогда - НесуществующийФайл = ТаблицаФайловНаДиске.Добавить(); - НесуществующийФайл.СтатусПроверки = НСтр("ru = 'Отсутствуют данные в томе на диске'"); - НесуществующийФайл.Файл = ВерсияСсылка; - НесуществующийФайл.ПолноеИмя = ПолныйПутьФайла; - НесуществующийФайл.Расширение = ВерсияСсылка.Расширение; - НесуществующийФайл.Отредактировал = Выборка.Отредактировал; - НесуществующийФайл.Том = Том; - НесуществующийФайл.ДатаРедактирования = Выборка.ДатаМодификацииФайла; - НесуществующийФайл.Имя = ВерсияСсылка.ПутьКФайлу; - НесуществующийФайл.Количество = 1; - Иначе - - СуществующийФайл[0].Файл = ВерсияСсылка; - СуществующийФайл[0].СтатусПроверки = НСтр("ru = 'Целостные данные'"); - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - -КонецФункции - -Процедура ВыполнитьОчисткуДанныхОФайле(ФайлСсылка) Экспорт - - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - Если ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда - Возврат; - КонецЕсли; - ИмяФайлаСПутем = ""; - ИмяФайлаСПутемДляУдаления = ""; - - НачатьТранзакцию(); - - Попытка - - ТекстОписания = НСтр("ru = 'Файл удален при очистке ненужных файлов.'") - + " " + Формат(ТекущаяДатаСеанса(),"ДЛФ=D") + Символы.ПС; - - Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ИмяФайлаСПутем = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; - ИмяФайлаСПутемДляУдаления = ИмяФайлаСПутем + ".del"; - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); - Если ФайлНаДиске.Существует() Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - // Переместим файл во временный. - ПереместитьФайл(ИмяФайлаСПутем, ИмяФайлаСПутемДляУдаления); - ФайлОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ФайлОбъект.ПутьКФайлу = ""; - ФайлОбъект.Описание = ТекстОписания + ФайлОбъект.Описание; - ФайлОбъект.Записать(); - ФайлОбъект.УстановитьПометкуУдаления(Истина); - // Удалим временный файл, т.к. успешно обновили данные о файле - УдалитьФайлы(ИмяФайлаСПутемДляУдаления); - КонецЕсли; - Иначе - УдалитьЗаписьИзРегистраПрисоединенныеФайлы(ФайлСсылка); - ФайлОбъект.Описание = ТекстОписания + ФайлОбъект.Описание; - ФайлОбъект.Записать(); - ФайлОбъект.УстановитьПометкуУдаления(Истина); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - - Если Не ПустаяСтрока(ИмяФайлаСПутем) Тогда - - // Записать ошибку в журнал регистрации - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очистка ненужных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,, ФайлСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - // Вернем файл на прежнее место в случае ошибки - ПереместитьФайл(ИмяФайлаСПутемДляУдаления, ИмяФайлаСПутем); - - КонецЕсли; - - КонецПопытки; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов с облачным сервисом - -Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение) Экспорт - - ТипОбъекта = ВладелецФайла; - ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)); - ЕстьТипДата = Ложь; - - ТекстЗапроса = ""; - - СправочникФайлов = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ТипВладельцаФайла); - Если ТипЗнч(ВладелецФайла) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ИдентификаторВладельца); - Иначе - СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецФайла); - КонецЕсли; - - Если Не ПустаяСтрока(ТекстЗапроса) Тогда - ТекстЗапроса= ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - |"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ - | СправочникПапок.Ссылка,"; - - ФайловыеФункцииСлужебный.ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); - - ТекстЗапроса = ТекстЗапроса + " - | СправочникФайлов.Ссылка КАК ФайлСсылка, - | СправочникФайлов.Наименование + ""."" + СправочникФайлов.Расширение КАК Наименование, - | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, - | СправочникФайлов.ВладелецФайла КАК Родитель, - | ЛОЖЬ КАК ЭтоПапка, - | ИСТИНА КАК ЕстьВБазе, - | ЛОЖЬ КАК ЕстьНаСервере, - | НЕОПРЕДЕЛЕНО КАК Изменения, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """") КАК Href, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, """") КАК Etag, - | ЛОЖЬ КАК Обработан, - | ВЫРАЗИТЬ("""" КАК СТРОКА(36)) КАК UID1C, - | """" КАК ToHref, - | """" КАК ToEtag, - | """" КАК РодительСервер, - | """" КАК НаименованиеСервер, - | ЛОЖЬ КАК ИзмененНаСервере, - | НЕОПРЕДЕЛЕНО КАК Уровень, - | """" КАК РодительСортировка, - | ЛОЖЬ КАК ЭтоФайл - |ИЗ - | Справочник." + СправочникФайлов.Имя + " КАК СправочникФайлов - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникФайлов.Ссылка) - | ЛЕВОЕ СОЕДИНЕНИЕ " + ПредставлениеТипаВладельца + "." + СправочникПапок.Имя + " КАК СправочникПапок - | ПО (СправочникФайлов.ВладелецФайла = СправочникПапок.Ссылка) - | ГДЕ - | ИСТИНА"; - - Если МассивИсключений.Количество() > 0 Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; - КонецЕсли; - Если ЭлементИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | СправочникПапок.Ссылка,"; - - ФайловыеФункцииСлужебный.ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); - - ТекстЗапроса = ТекстЗапроса + " - | СправочникПапок.Ссылка, - | " + ?(ПредставлениеТипаВладельца = "Документ", - "СправочникПапок.Представление", "СправочникПапок.Наименование") + ", - | СправочникПапок.ПометкаУдаления,"; - Если ОбщегоНазначения.ЭтоСправочник(СправочникПапок) И СправочникПапок.Иерархический Тогда - ТекстЗапроса = ТекстЗапроса + " - | ВЫБОР - | КОГДА СправочникПапок.Родитель = ЗНАЧЕНИЕ(Справочник." + СправочникПапок.Имя + ".ПустаяСсылка) - | ТОГДА НЕОПРЕДЕЛЕНО - | ИНАЧЕ СправочникПапок.Родитель - | КОНЕЦ,"; - Иначе - ТекстЗапроса = ТекстЗапроса + "Неопределено,"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - | ИСТИНА, - | ИСТИНА, - | ЛОЖЬ, - | НЕОПРЕДЕЛЕНО, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """"), - | """", - | ЛОЖЬ, - | """", - | """", - | """", - | """", - | """", - | ЛОЖЬ, - | НЕОПРЕДЕЛЕНО, - | """", - | ЛОЖЬ - |ИЗ - | " + ПредставлениеТипаВладельца + "." + СправочникПапок.Имя + " КАК СправочникПапок - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникПапок.Ссылка - | И СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись = &УчетнаяЗапись) - | ГДЕ - | ИСТИНА"; - - Если МассивИсключений.Количество() > 0 Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; - КонецЕсли; - Если ЭлементИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; - КонецЕсли; - - Возврат ТекстЗапроса; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Обновляет свойства файла при окончании редактирования. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на присоединенный файл. -// ИнформацияОФайле - Структура со свойствами: -// <обязательные> -// АдресФайлаВоВременномХранилище - Строка - адрес новых двоичных данных файла. -// АдресВременногоХранилищаТекста - Строка - адрес новых двоичных данных текста, -// извлеченного из файла. -// <необязательные> -// ДатаМодификацииУниверсальная - Дата - дата последнего изменения файла, если -// свойство не указано или не заполнено, тогда будет -// установлена текущая дата сеанса. -// Расширение - Строка - новое расширение файла. -// -Процедура ПоместитьФайлВХранилищеИОсвободить(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт - - ИнформацияОФайле.Вставить("Редактирует", Справочники.Пользователи.ПустаяСсылка()); - - ПрисоединенныеФайлы.ОбновитьПрисоединенныйФайл(ПрисоединенныйФайл, ИнформацияОФайле) - -КонецПроцедуры - -// Помещает зашифрованные данные файла в хранилище и устанавливает файлу признак Зашифрован. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на присоединенный файл. -// ЗашифрованныеДанные - Структура со свойством: -// АдресВременногоХранилища - Строка - адрес зашифрованных двоичных данных. -// МассивОтпечатков - Массив Структур отпечатков по сертификатам. -// -Процедура Зашифровать(Знач ПрисоединенныйФайл, Знач ЗашифрованныеДанные, Знач МассивОтпечатков) Экспорт - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ПрисоединенныйФайлОбъект.Заблокировать(); - Иначе - ПрисоединенныйФайлОбъект = ПрисоединенныйФайл; - КонецЕсли; - - Для Каждого ОтпечатокСтруктура Из МассивОтпечатков Цикл - НоваяСтрока = ПрисоединенныйФайлОбъект.СертификатыШифрования.Добавить(); - НоваяСтрока.Отпечаток = ОтпечатокСтруктура.Отпечаток; - НоваяСтрока.Представление = ОтпечатокСтруктура.Представление; - НоваяСтрока.Сертификат = Новый ХранилищеЗначения(ОтпечатокСтруктура.Сертификат); - КонецЦикла; - - РеквизитыЗначения = Новый Структура; - РеквизитыЗначения.Вставить("Зашифрован", Истина); - РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения("")); - ОбновитьДвоичныеДанныеФайлаНаСервере(ПрисоединенныйФайлОбъект, ЗашифрованныеДанные.АдресВременногоХранилища, РеквизитыЗначения); - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ПрисоединенныйФайлОбъект.Записать(); - ПрисоединенныйФайлОбъект.Разблокировать(); - КонецЕсли; - -КонецПроцедуры - -// Помещает расшифрованные данные файла в хранилище и снимает файлу признак Зашифрован. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на присоединенный файл. -// ЗашифрованныеДанные - Структура со свойством: -// АдресВременногоХранилища - Строка - адрес расшифрованных двоичных данных. -// -Процедура Расшифровать(Знач ПрисоединенныйФайл, Знач РасшифрованныеДанные) Экспорт - - Перем Отказ; - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ПрисоединенныйФайлОбъект.Заблокировать(); - Иначе - ПрисоединенныйФайлОбъект = ПрисоединенныйФайл; - КонецЕсли; - - ПрисоединенныйФайлОбъект.СертификатыШифрования.Очистить(); - - РеквизитыЗначения = Новый Структура; - РеквизитыЗначения.Вставить("Зашифрован", Ложь); - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилища); - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - ИзвлеченныйТекст = ""; - - Если ЭтоАдресВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилищаТекста) Тогда - ИзвлеченныйТекст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилищаТекста); - СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - ИначеЕсли НЕ ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - // Тексты извлекаются сразу, а не в фоновом задании. - СтатусИзвлеченияТекста = ИзвлечьТекст(ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); - КонецЕсли; - - ПрисоединенныйФайлОбъект.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; - - РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения(ИзвлеченныйТекст, Новый СжатиеДанных(9))); - - ОбновитьДвоичныеДанныеФайлаНаСервере(ПрисоединенныйФайлОбъект, ДвоичныеДанные, РеквизитыЗначения); - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ПрисоединенныйФайлОбъект.Записать(); - ПрисоединенныйФайлОбъект.Разблокировать(); - КонецЕсли; - -КонецПроцедуры - -// Заменяет двоичные данные файла в ИБ на данные во временном хранилище. -Процедура ОбновитьДвоичныеДанныеФайлаНаСервере(Знач ПрисоединенныйФайл, - Знач АдресФайлаВоВременномХранилищеДвоичныеДанные, - Знач РеквизитыЗначения = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - ФайлСсылка = ПрисоединенныйФайл; - Иначе - ФайлОбъект = ПрисоединенныйФайл; - ФайлСсылка = ФайлОбъект.Ссылка; - КонецЕсли; - - Если ТипЗнч(АдресФайлаВоВременномХранилищеДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда - ДвоичныеДанные = АдресФайлаВоВременномХранилищеДвоичныеДанные; - Иначе - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилищеДвоичныеДанные); - КонецЕсли; - - ФайлОбъект.Изменил = Пользователи.АвторизованныйПользователь(); - - Если ТипЗнч(РеквизитыЗначения) = Тип("Структура") Тогда - ЗаполнитьЗначенияСвойств(ФайлОбъект, РеквизитыЗначения); - КонецЕсли; - - ТранзакцияАктивна = Ложь; - - Попытка - Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - НачатьТранзакцию(); - ТранзакцияАктивна = Истина; - МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ПрисоединенныйФайл = ФайлСсылка; - МенеджерЗаписи.Прочитать(); - МенеджерЗаписи.ПрисоединенныйФайл = ФайлСсылка; - МенеджерЗаписи.ХранимыйФайл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); - МенеджерЗаписи.Записать(); - Иначе - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; - - Попытка - ФайлНаДиске = Новый Файл(ПолныйПуть); - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолныйПуть); - - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ФайлОбъект.ДатаМодификацииУниверсальная, - ФайлОбъект.Наименование, ФайлОбъект.Расширение,, ФайлОбъект.Зашифрован); - ФайлОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - ФайлОбъект.Том = СведенияОФайле.Том; - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Запись файла на диск'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники[ФайлСсылка.Метаданные().Имя], - ФайлСсылка, - ТекстОшибкиПриСохраненииФайлаВТоме(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка)); - - ВызватьИсключение ТекстОшибкиПриСохраненииФайлаВТоме(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка); - КонецПопытки; - - КонецЕсли; - - ФайлОбъект.Размер = ДвоичныеДанные.Размер(); - - ФайлОбъект.Записать(); - - Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда - ФайлОбъект.Разблокировать(); - КонецЕсли; - - Если ТранзакцияАктивна Тогда - ЗафиксироватьТранзакцию(); - КонецЕсли; - - Исключение - Если ТранзакцияАктивна Тогда - ОтменитьТранзакцию(); - КонецЕсли; - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Обновление данных присоединенного файла в хранилище файлов'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Записывает двоичные данные файла в информационную базу. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на присоединенный файл. -// ДвоичныеДанные - ДвоичныеДанные, которые требуется записать. -// -Процедура ЗаписатьФайлВИнформационнуюБазу(Знач ПрисоединенныйФайл, Знач ДвоичныеДанные) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ПрисоединенныйФайл = ПрисоединенныйФайл; - МенеджерЗаписи.ХранимыйФайл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); - МенеджерЗаписи.Записать(Истина); - -КонецПроцедуры - -// Определяет, что к объекту присоединен по крайней мере один файл. -Функция ОбъектИмеетФайлы(Знач ВладелецФайлов, Знач ФайлИсключение = Неопределено) - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Параметры.Вставить("ВладелецФайлов", ВладелецФайлов); - - ТекстЗапроса = - "ВЫБРАТЬ - | ПрисоединенныеФайлы.Ссылка - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов"; - - Если ФайлИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И ПрисоединенныеФайлы.Ссылка <> &Ссылка"; - - Запрос.Параметры.Вставить("Ссылка", ФайлИсключение); - КонецЕсли; - - ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Запрос.Текст = СтрЗаменить( - ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); - - Если НЕ Запрос.Выполнить().Пустой() Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -// Возвращает массив присоединенных файлов для указанного владельца. -// -// Параметры: -// ВладелецФайлов - Ссылка на владельца присоединенных файлов. -// -// Возвращаемое значение: -// Массив ссылок на присоединенные файлы. -// -Функция ПолучитьВсеПодчиненныеФайлы(Знач ВладелецФайлов) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); - ТекстЗапросов = ""; - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если ЗначениеЗаполнено(ТекстЗапросов) Тогда - ТекстЗапросов = ТекстЗапросов + " - |ОБЪЕДИНИТЬ ВСЕ - | - |"; - КонецЕсли; - ТекстЗапроса = - "ВЫБРАТЬ - | ПрисоединенныеФайлы.Ссылка - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); - ТекстЗапросов = ТекстЗапросов + ТекстЗапроса; - КонецЦикла; - - Запрос = Новый Запрос(ТекстЗапросов); - Запрос.УстановитьПараметр("ВладелецФайлов", ВладелецФайлов); - - Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - -КонецФункции - -// Обработчик подписки на событие "Перед удалением" присоединенного файла. -Процедура ПередУдалениемПрисоединенногоФайлаСервер(Знач Ссылка, - Знач ВладелецФайлов, - Знач Том, - Знач ТипХраненияФайла, - Знач ПутьКФайлу) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если НЕ ОбъектИмеетФайлы(ВладелецФайлов, Ссылка) Тогда - МенеджерЗаписи = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; - МенеджерЗаписи.Прочитать(); - Если МенеджерЗаписи.Выбран() Тогда - МенеджерЗаписи.ЕстьФайлы = Ложь; - МенеджерЗаписи.Записать(); - КонецЕсли; - КонецЕсли; - - Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - Если НЕ Том.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Том) + ПутьКФайлу; - Попытка - Файл = Новый Файл(ПолныйПуть); - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолныйПуть); - ПутьСПодкаталогом = Файл.Путь; - МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); - Если МассивФайловВКаталоге.Количество() = 0 Тогда - УдалитьФайлы(ПутьСПодкаталогом); - КонецЕсли; - Исключение - // Если файл не удален - ошибки не было. - КонецПопытки; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Обработчик подписки "при записи" присоединенного файла. -// -Процедура ПриЗаписиПрисоединенногоФайлаСервер(ВладелецФайлов) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ЗаписьИзменилась = Ложь; - - МенеджерЗаписи = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; - МенеджерЗаписи.Прочитать(); - - Если НЕ ЗначениеЗаполнено(МенеджерЗаписи.ОбъектСФайлами) Тогда - МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; - ЗаписьИзменилась = Истина; - КонецЕсли; - - Если НЕ МенеджерЗаписи.ЕстьФайлы Тогда - МенеджерЗаписи.ЕстьФайлы = Истина; - ЗаписьИзменилась = Истина; - КонецЕсли; - - Если ПустаяСтрока(МенеджерЗаписи.ИдентификаторОбъекта) Тогда - МенеджерЗаписи.ИдентификаторОбъекта = ПолучитьОчереднойИдентификаторОбъекта(); - ЗаписьИзменилась = Истина; - КонецЕсли; - - Если ЗаписьИзменилась Тогда - МенеджерЗаписи.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Создает у Получателя копии всех присоединенных файлов Источника. -// Источник и Получатель должны быть объектами одного типа. -// -// Параметры: -// Источник - Ссылка - объект, имеющий присоединенные файлы для копирования. -// Получатель - Ссылка - объект, к которому копируются присоединенные файлы. -// -Процедура СкопироватьПрисоединенныеФайлы(Знач Источник, Знач Получатель) Экспорт - - КопируемыеФайлы = ПолучитьВсеПодчиненныеФайлы(Источник.Ссылка); - Для Каждого КопируемыйФайл Из КопируемыеФайлы Цикл - Если КопируемыйФайл.ПометкаУдаления Тогда - Продолжить; - КонецЕсли; - МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(КопируемыйФайл); - КопияФайла = КопируемыйФайл.Скопировать(); - КопияФайлаСсылка = МенеджерОбъекта.ПолучитьСсылку(); - КопияФайла.УстановитьСсылкуНового(КопияФайлаСсылка); - КопияФайла.ВладелецФайла = Получатель.Ссылка; - КопияФайла.Редактирует = Справочники.Пользователи.ПустаяСсылка(); - - КопияФайла.ТекстХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ТекстХранилище.Получить()); - КопияФайла.ФайлХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ФайлХранилище.Получить()); - - КопияФайла.ЭлектронныеПодписи.Очистить(); - Для Каждого КопируемаяСтрокаТаблицы Из КопируемыйФайл.ЭлектронныеПодписи Цикл - КопияСтрокиТаблицы = КопияФайла.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(КопияСтрокиТаблицы, КопируемаяСтрокаТаблицы); - КопияСтрокиТаблицы.Подпись = КопируемаяСтрокаТаблицы.Подпись; - КопияСтрокиТаблицы.Сертификат = КопируемаяСтрокаТаблицы.Сертификат; - КонецЦикла; - - КопияФайла.СертификатыШифрования.Очистить(); - Для Каждого КопируемаяСтрокаТаблицы Из КопируемыйФайл.СертификатыШифрования Цикл - КопияСтрокиТаблицы = КопияФайла.СертификатыШифрования.Добавить(); - ЗаполнитьЗначенияСвойств(КопияСтрокиТаблицы, КопируемаяСтрокаТаблицы); - КопияСтрокиТаблицы.Сертификат = КопируемаяСтрокаТаблицы.Сертификат; - КонецЦикла; - - ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(КопируемыйФайл); - КопияФайла.ТипХраненияФайла = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - ЗаписатьФайлВИнформационнуюБазу(КопияФайлаСсылка, ДвоичныеДанные); - Иначе - // Добавить в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, КопияФайла.ДатаМодификацииУниверсальная, - КопияФайла.Наименование, КопияФайла.Расширение); - КопияФайла.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - КопияФайла.Том = СведенияОФайле.Том; - КонецЕсли; - КопияФайла.Записать(); - КонецЦикла; - -КонецПроцедуры - -// Извлекает текст из двоичных данных, возвращает статус извлечения. -Функция ИзвлечьТекст(Знач ДвоичныеДанные, Знач Расширение, ИзвлеченныйТекст) Экспорт - - Если ФайловыеФункцииСлужебный.ЭтоПлатформаWindows() - И ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда - - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); - ДвоичныеДанные.Записать(ИмяВременногоФайла); - - Отказ = Ложь; - ИзвлеченныйТекст = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище(ИмяВременногоФайла, , Отказ); - - Попытка - УдалитьФайлы(ИмяВременногоФайла); - Исключение - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Извлечение текста'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Если Отказ Тогда - Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; - Иначе - Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - КонецЕсли; - Иначе - ИзвлеченныйТекст = ""; - Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - КонецЕсли; - -КонецФункции - -// Очищает реквизит ИдентификаторОбъекта, если он содержит некорректные символы. -Процедура ОчиститьНекорректныеЗаписиРегистраСведенийНаличиеПрисоединенныхФайлов() Экспорт - - ТекстЗапроса = - "ВЫБРАТЬ - | НаличиеПрисоединенныхФайлов.ОбъектСФайлами, - | НаличиеПрисоединенныхФайлов.ИдентификаторОбъекта - |ИЗ - | РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов"; - - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - - НаборЗаписей = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьНаборЗаписей(); - Пока Выборка.Следующий() Цикл - Если ЕстьПосторонниеСимволыВИдентификаторе(Выборка.ИдентификаторОбъекта) Тогда - НаборЗаписей.Отбор.ОбъектСФайлами.Установить(Выборка.ОбъектСФайлами); - НаборЗаписей.Прочитать(); - Для Каждого Запись Из НаборЗаписей Цикл - Запись.ИдентификаторОбъекта = ""; - КонецЦикла; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Возвращает соответствие имен справочников и значения Булево -// для указанного владельца. -// -// Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. -// -Функция ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение = Ложь) Экспорт - - Если ТипЗнч(ВладелецФайлов) = Тип("Тип") Тогда - ТипВладельцаФайлов = ВладелецФайлов; - Иначе - ТипВладельцаФайлов = ТипЗнч(ВладелецФайлов); - КонецЕсли; - - МетаданныеВладельца = Метаданные.НайтиПоТипу(ТипВладельцаФайлов); - - ИменаСправочников = Новый Соответствие; - ИмяСтандартногоОсновногоСправочника = МетаданныеВладельца.Имя + "ПрисоединенныеФайлы"; - Если Метаданные.Справочники.Найти(ИмяСтандартногоОсновногоСправочника) <> Неопределено Тогда - ИменаСправочников.Вставить(ИмяСтандартногоОсновногоСправочника, Истина); - КонецЕсли; - - // Переопределение стандартного справочника хранения присоединенных файлов. - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ПрисоединенныеФайлы\ПриОпределенииСправочниковХраненияФайлов"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииСправочниковХраненияФайлов( - ТипВладельцаФайлов, ИменаСправочников); - КонецЦикла; - - ПрисоединенныеФайлыПереопределяемый.ПриОпределенииСправочниковХраненияФайлов( - ТипВладельцаФайлов, ИменаСправочников); - - ОсновнойСправочникУказан = Ложь; - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - - Если Метаданные.Справочники.Найти(КлючИЗначение.Ключ) = Неопределено Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. - |У владельца файлов типа ""%1"" - |указан несуществующий справочник ""%2"".'"), - Строка(ТипВладельцаФайлов), - Строка(КлючИЗначение.Ключ)); - - ИначеЕсли Не СтрЗаканчиваетсяНа(КлючИЗначение.Ключ, "ПрисоединенныеФайлы") Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. - |У владельца файлов типа ""%1"" - |указано имя справочника ""%2"" - |без окончания ""ПрисоединенныеФайлы"".'"), - Строка(ТипВладельцаФайлов), - Строка(КлючИЗначение.Ключ)); - - ИначеЕсли КлючИЗначение.Значение = Неопределено Тогда - ИменаСправочников.Вставить(КлючИЗначение.Ключ, Ложь); - - ИначеЕсли КлючИЗначение.Значение = Истина Тогда - Если ОсновнойСправочникУказан Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. - |У владельца файлов типа ""%1"" - |основной справочник указан более одного раза.'"), - Строка(ТипВладельцаФайлов), - Строка(КлючИЗначение.Ключ)); - КонецЕсли; - ОсновнойСправочникУказан = Истина; - КонецЕсли; - КонецЦикла; - - Если ИменаСправочников.Количество() = 0 Тогда - - Если НеВызыватьИсключение Тогда - Возврат ИменаСправочников; - КонецЕсли; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. - |У владельца файлов типа ""%1"" - |не имеется справочников для хранения файлов.'"), - Строка(ТипВладельцаФайлов)); - КонецЕсли; - - Возврат ИменаСправочников; - -КонецФункции - -// Возвращает имя справочника для указанного владельца или вызывает исключение, -// если их более одного. -// -// Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. -// ИмяСправочника - Строка, если заполнено, то выполняется проверка -// наличия справочника среди справочников владельца для хранения файлов. -// Если не заполнено, возвращает имя основного справочника. -// ЗаголовокОшибки - Строка - заголовок ошибки. -// - Неопределено - не вызывать исключение, а вернуть пустую строку. -// ИмяПараметра - Строка - имя требуемого параметра для определения имени справочника. -// ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено). -// -Функция ИмяСправочникаХраненияФайлов(ВладелецФайлов, ИмяСправочника = "", - ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт - - НеВызыватьИсключение = (ЗаголовокОшибки = Неопределено); - ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение); - - Если ИменаСправочников.Количество() = 0 Тогда - Если НеВызыватьИсключение Тогда - Возврат ""; - КонецЕсли; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + Символы.ПС - + НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" - |нет справочников для хранения файлов.'"), - Строка(ВладелецФайлов), - Строка(ТипЗнч(ВладелецФайлов))); - КонецЕсли; - - Если ЗначениеЗаполнено(ИмяСправочника) Тогда - Если ИменаСправочников[ИмяСправочника] <> Неопределено Тогда - Возврат ИмяСправочника; - КонецЕсли; - - Если НеВызыватьИсключение Тогда - Возврат ""; - КонецЕсли; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + Символы.ПС - + НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" - |нет справочника ""%3"" для хранения файлов.'"), - Строка(ВладелецФайлов), - Строка(ТипЗнч(ВладелецФайлов)), - Строка(ИмяСправочника)); - КонецЕсли; - - ОсновнойСправочник = ""; - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если КлючИЗначение.Значение = Истина Тогда - ОсновнойСправочник = КлючИЗначение.Ключ; - Прервать; - КонецЕсли; - КонецЦикла; - - Если ЗначениеЗаполнено(ОсновнойСправочник) Тогда - Возврат ОсновнойСправочник; - КонецЕсли; - - Если НеВызыватьИсключение Тогда - Возврат ""; - КонецЕсли; - - ШаблонПричиныОшибки = - НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" - |не указан основной справочник для хранения файлов.'") + Символы.ПС; - - ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонПричиныОшибки, Строка(ВладелецФайлов), Строка(ТипЗнч(ВладелецФайлов))); - - ТекстОшибки = ЗаголовокОшибки + Символы.ПС - + ПричинаОшибки + Символы.ПС - + ОкончаниеОшибки; - - ВызватьИсключение СокрЛП(ТекстОшибки); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт - - ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - - ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// -Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - - ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); - -КонецПроцедуры - -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// -Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - - ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); - -КонецПроцедуры - -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт - - Массив.Добавить(Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.ПолноеИмя()); - -КонецПроцедуры - -// Добавляет файл на том при "Разместить файлы начального образа". -// -Процедура ПриДобавленииФайловВТомаПриРазмещении(СоответствиеПутейФайлов, ХранитьФайлыВТомахНаДиске, ПрисоединяемыеФайлы) Экспорт - - ДобавитьФайлыВТомаПриРазмещении(СоответствиеПутейФайлов, ХранитьФайлыВТомахНаДиске, ПрисоединяемыеФайлы); - -КонецПроцедуры - -// Удаляет регистрацию изменений после "Разместить файлы начального образа". -// -Процедура ПриУдаленииРегистрацииИзменений(ПланОбменаСсылка, ПрисоединяемыеФайлы) Экспорт - - УдалитьРегистрациюИзменений(ПланОбменаСсылка, ПрисоединяемыеФайлы); - -КонецПроцедуры - -// Заполняет текст запроса для получения файлов у которых не извлечен текст. -// В качестве параметра может прийти другой запрос, с которым следует сделать объединение. -// -// Параметры: -// ТекстЗапроса - Строка (возвращаемое значение), варианты передаваемых значений: -// Пустая строка - будет возвращен требуемый текст запроса. -// Непустая строка - будет возвращен требуемый текст запроса, добавленный -// к переданному тексту посредством "ОБЪЕДИНИТЬ ВСЕ". -// -// ПолучитьВсеФайлы - Булево - начальное значение Ложь. Позволяет отключить выборку -// файлов по частям, если передать Истина. -// -Процедура ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(ТекстЗапроса, ПолучитьВсеФайлы = Ложь) Экспорт - - // Текст запроса формируется по всем справочникам присоединенных файлов. - - ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеПрисоединенныхФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); - - КоличествоТипов = ТипыВладельцев.Количество(); - Если КоличествоТипов = 0 Тогда - Возврат; - КонецЕсли; - - ВсеИменаСправочников = Новый Соответствие; - - Для каждого Тип Из ТипыВладельцев Цикл - - Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Продолжить; - КонецЕсли; - - ИменаСправочников = ИменаСправочниковХраненияФайлов(Тип); - - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Если ВсеИменаСправочников[КлючИЗначение.Ключ] <> Неопределено Тогда - Продолжить; - КонецЕсли; - ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); - КонецЦикла; - КонецЦикла; - - ЧислоФайловВВыборке = Цел(100 / ВсеИменаСправочников.Количество()); - ЧислоФайловВВыборке = ?(ЧислоФайловВВыборке < 10, 10, ЧислоФайловВВыборке); - - Для каждого КлючИЗначение Из ВсеИменаСправочников Цикл - - Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда - ТекстЗапроса = ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - | - |"; - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + ТекстЗапросаДляФайловСНеизвлеченнымТекстом( - КлючИЗначение.Ключ, - ЧислоФайловВВыборке, - ПолучитьВсеФайлы); - КонецЦикла; - -КонецПроцедуры - -// Возвращает число файлов с неизвлеченным текстом. -// -Процедура ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом(ЧислоВерсий) Экспорт - - ЧислоВерсий = 0; - ЧислоВерсий = ЧислоВерсий + ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(); - -КонецПроцедуры - -// Записывает извлеченный текст. -// -Процедура ПриЗаписиИзвлеченногоТекста(ФайлОбъект) Экспорт - - Если Не ЭтоЭлементПрисоединенныеФайлы(ФайлОбъект) Тогда - Возврат; - КонецЕсли; - - ФайлОбъект.ОбменДанными.Загрузка = Истина; - ФайлОбъект.Записать(); - -КонецПроцедуры - -// Возвращает в параметре КоличествоФайловВТомах количество файлов в томах. -// -Процедура ПриОпределенииКоличестваФайловВТомах(КоличествоФайловВТомах) Экспорт - - ОпределитьКоличествоФайловВТомах(КоличествоФайловВТомах); - -КонецПроцедуры - -// Возвращает Истина в параметре ЕстьХранимыеФайлы, если есть хранимые файлы к объекту ВнешнийОбъект. -// -Процедура ПриОпределенииНаличияХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы) Экспорт - - ОпределитьНаличиеХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы); - -КонецПроцедуры - -// Возвращает в параметре ХранимыеФайлы массив хранимых файлов к объекту ВнешнийОбъект. -// -Процедура ПриПолученииХранимыхФайлов(ВнешнийОбъект, ХранимыеФайлы) Экспорт - - ПолучитьХранимыеФайлы(ВнешнийОбъект, ХранимыеФайлы); - -КонецПроцедуры - -// Возвращает навигационную ссылку на файл (на реквизит или во временное хранилище). -// -Процедура ПриОпределенииНавигационнойСсылкиФайла(ФайлСсылка, УникальныйИдентификатор, НавигационнаяСсылка) Экспорт - - Если ЭтоЭлементПрисоединенныеФайлы(ФайлСсылка) Тогда - НавигационнаяСсылка = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ФайлСсылка, УникальныйИдентификатор).СсылкаНаДвоичныеДанныеФайла; - КонецЕсли; - -КонецПроцедуры - -// Получает полный путь к файлу на диске. -// -Процедура ПриОпределенииИмениФайлаСПутемКДвоичнымДанным(ФайлСсылка, ПутьКФайлу, ПустойПутьДляПустыхДанных = Ложь) Экспорт - - Если ЭтоЭлементПрисоединенныеФайлы(ФайлСсылка) Тогда - ПутьКФайлу = ПолучитьИмяФайлаСПутемКДвоичнымДанным(ФайлСсылка, ПустойПутьДляПустыхДанных); - КонецЕсли; - -КонецПроцедуры - -// Заполняет перечень обработчиков интеграции подсистемы. -// "ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса". -// -// Параметры: -// Обработчики - Массив(Строка), имя общего модуля обработчика. -// -Процедура ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса(Обработчики) Экспорт - - Обработчики.Добавить("ПрисоединенныеФайлыСлужебный"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Добавляет и удаляет записи в регистр сведений ОчередьИзвлеченияТекста при изменении -// состояние извлечения текста версий файлов. -// -// Параметры: -// ИсточникТекста - СправочникСсылка.ВерсииФайлов, СправочникСсылка.*ПрисоединенныеФайлы, -// файл, у которого изменилось состояние извлечения текста. -// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов, новый -// статус извлечения текста у файла. -// -Процедура ПриОбновленииСостоянияОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); - МодульФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. - -Функция ПолучениеФайлаЗапрещено(ЭлементДанных) - - Возврат ЭлементДанных.ЭтоНовый() - И НЕ ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( - ЭлементДанных.Расширение, Ложь); - -КонецФункции - -Процедура ПоместитьФайлВРеквизитСправочника(ЭлементДанных) - - Попытка - // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ЭлементДанных.ФайлХранилище = ФайловыеФункцииСлужебный.ПоместитьДвоичныеДанныеВХранилище(ЭлементДанных.Том, ЭлементДанных.ПутьКФайлу, ЭлементДанных.Ссылка.УникальныйИдентификатор()); - Исключение - // Возможно, файл не был найден. Отправку данных не прерываем. - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Не удалось отправить файл при обмене данными'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); - - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - КонецПопытки; - - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - ЭлементДанных.ПутьКФайлу = ""; - ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - -КонецПроцедуры - -// Возвращает новый идентификатор объекта. -// Для получения нового идентификатора выбирает последний идентификатор объекта -// из регистра НаличиеПрисоединенныхФайлов увеличивает его значение -// на одну единицу и возвращает полученный результат. -// -// Возвращаемое значение: -// Строка (10) - новый идентификатор объекта. -// -Функция ПолучитьОчереднойИдентификаторОбъекта() - - // Вычисление нового идентификатора объекта. - Результат = "0000000000"; // По длине ресурса ИдентификаторОбъекта. - - ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | НаличиеПрисоединенныхФайлов.ИдентификаторОбъекта КАК ИдентификаторОбъекта - |ИЗ - | РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов - | - |УПОРЯДОЧИТЬ ПО - | ИдентификаторОбъекта УБЫВ"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Идентификатор = Выборка.ИдентификаторОбъекта; - - Если ПустаяСтрока(Идентификатор) Тогда - Возврат Результат; - КонецЕсли; - - // Правила вычисления, как в обычном сложении: при - // заполнении текущего разряда следующий разряд увеличивается - // на единицу, при этом, в текущем разряде значение становится - // равным нулю. Значениями разрядов выступают символы - // [0..9] и [a..z]. Таким образом один разряд может содержать - // 36 значений. - - Позиция = 10; // 9- индекс 10-го символа - Пока Позиция > 0 Цикл - - Символ = Сред(Идентификатор, Позиция, 1); - - Если Символ = "z" Тогда - Идентификатор = Лев(Идентификатор, Позиция-1) + "0" + Прав(Идентификатор, 10 - Позиция); - Позиция = Позиция - 1; - Продолжить; - - ИначеЕсли Символ = "9" Тогда - НовыйСимвол = "a"; - Иначе - НовыйСимвол = Символ(КодСимвола(Символ)+1); - КонецЕсли; - - Идентификатор = Лев(Идентификатор, Позиция-1) + НовыйСимвол + Прав(Идентификатор, 10 - Позиция); - Прервать; - КонецЦикла; - - Результат = Идентификатор; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция ТекстЗапросаДляФайловСНеизвлеченнымТекстом(Знач ИмяСправочника, Знач ЧислоФайловВВыборке, Знач ПолучитьВсеФайлы = Ложь) - - ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ПрисоединенныеФайлы.Ссылка КАК Ссылка, - | ПрисоединенныеФайлы.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, - | ПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла, - | ПрисоединенныеФайлы.Расширение КАК Расширение, - | ПрисоединенныеФайлы.Наименование КАК Наименование - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ ПрисоединенныеФайлы.Зашифрован"; - КонецЕсли; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 1", ?( - ПолучитьВсеФайлы, - "", - "ПЕРВЫЕ " + Формат(ЧислоФайловВВыборке, "ЧГ=; ЧН=")) ); - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяСправочника); - - Возврат ТекстЗапроса; - -КонецФункции - -Функция ТекстЗапросаДляЧислаФайловСНеизвлеченнымТекстом(Знач ИмяСправочника) - - ТекстЗапроса = - "ВЫБРАТЬ - | ЕСТЬNULL(КОЛИЧЕСТВО(ПрисоединенныеФайлы.Ссылка), 0) КАК КоличествоФайлов - |ИЗ - | &ИмяСправочника КАК ПрисоединенныеФайлы - |ГДЕ - | ПрисоединенныеФайлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ ПрисоединенныеФайлы.Зашифрован"; - КонецЕсли; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяСправочника); - - Возврат ТекстЗапроса; - -КонецФункции - -// Возвращает текст сообщения об ошибке, добавляя к нему ссылку на элемент -// справочника хранимого файла. -// -Функция ТекстОшибкиПриСохраненииФайлаВТоме(Знач СообщениеОбОшибке, Знач Файл) - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка, при сохранении файла в томе: - |""%1"". - | - |Ссылка на файл: ""%2"".'"), - СообщениеОбОшибке, - ПолучитьНавигационнуюСсылку(Файл) ); - -КонецФункции - -Функция ЕстьПосторонниеСимволыВИдентификаторе(Идентификатор) - - Для Позиция = 1 По СтрДлина(Идентификатор) Цикл - Символ = Сред(Идентификатор, Позиция, 1); - Если (КодСимвола(Символ) < КодСимвола("a") Или КодСимвола(Символ) > КодСимвола("z")) - И (КодСимвола(Символ) < КодСимвола("0") Или КодСимвола(Символ) > КодСимвола("9")) Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Очистка ненужных файлов - -// Удаляет запись в регистре ПрисоединенныеФайлы. -// -// Параметры: -// ФайлСсылка - ссылка на файл. -// -Процедура УдалитьЗаписьИзРегистраПрисоединенныеФайлы(ФайлСсылка) - - УстановитьПривилегированныйРежим(Истина); - - НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ПрисоединенныйФайл.Установить(ФайлСсылка); - НаборЗаписей.Записать(); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl deleted file mode 100644 index 6b65675fb..000000000 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl +++ /dev/null @@ -1,88 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Присоединенные файлы". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// См. эту функцию в модуле ПрисоединенныеФайлы. -Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл, - Знач ИдентификаторФормы = Неопределено, - Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, - Знач ДляРедактирования = Ложь) Экспорт - - Возврат ПрисоединенныеФайлы.ПолучитьДанныеФайла( - ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные, ДляРедактирования); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// См. эту процедуру в модуле ПрисоединенныеФайлы. -Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт - - ПрисоединенныеФайлы.ОбновитьПрисоединенныйФайл(ПрисоединенныйФайл, ИнформацияОФайле); - -КонецПроцедуры - -// См. функцию ДобавитьПрисоединенныйФайл в модуле ПрисоединенныеФайлы. -Функция ДобавитьФайл(Знач ВладелецФайла, - Знач ИмяБезРасширения, - Знач РасширениеБезТочки = Неопределено, - Знач ВремяИзменения = Неопределено, - Знач ВремяИзмененияУниверсальное = Неопределено, - Знач АдресФайлаВоВременномХранилище, - Знач АдресВременногоХранилищаТекста = "", - Знач Описание = "") Экспорт - - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ВладелецФайлов", ВладелецФайла); - ПараметрыФайла.Вставить("Автор", Неопределено); - ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения); - ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); - ПараметрыФайла.Вставить("ВремяИзменения", ВремяИзменения); - ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ВремяИзмененияУниверсальное); - - Возврат ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл( - ПараметрыФайла, - АдресФайлаВоВременномХранилище, - АдресВременногоХранилищаТекста, - Описание); - -КонецФункции - -// См. эту процедуру в модуле ПрисоединенныеФайлыСлужебный. -Процедура Зашифровать(Знач ПрисоединенныйФайл, Знач ЗашифрованныеДанные, Знач МассивОтпечатков) Экспорт - - ПрисоединенныеФайлыСлужебный.Зашифровать( - ПрисоединенныйФайл, ЗашифрованныеДанные, МассивОтпечатков); - -КонецПроцедуры - -// См. эту процедуру в модуле ПрисоединенныеФайлыСлужебный. -Процедура Расшифровать(Знач ПрисоединенныйФайл, Знач РасшифрованныеДанные) Экспорт - - ПрисоединенныеФайлыСлужебный.Расшифровать(ПрисоединенныйФайл, РасшифрованныеДанные); - -КонецПроцедуры - -// См. эту процедуру в модуле ПрисоединенныеФайлы. -Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка) Экспорт - - ПрисоединенныеФайлы.ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/ПрисоединенныеФайлыСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/ПрисоединенныеФайлыСлужебныйВызовСервера.mdo deleted file mode 100644 index 735d527e4..000000000 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/ПрисоединенныеФайлыСлужебныйВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ПрисоединенныеФайлыСлужебныйВызовСервера - - ru - Присоединенные файлы служебный вызов сервера - - true - true - diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl deleted file mode 100644 index a05982d74..000000000 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl +++ /dev/null @@ -1,1705 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Присоединенные файлы". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. -Процедура ДобавитьФайлыРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; - ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; - - Если Не ДополнительныеПараметры.Свойство("Фильтр") Тогда - ДополнительныеПараметры.Вставить("Фильтр",""); - КонецЕсли; - - Если РасширениеРаботыСФайламиПодключено Тогда - - Фильтр = ДополнительныеПараметры.Фильтр; - ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; - Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда - ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; - КонецЕсли; - - ВыбранныеФайлы = Новый Массив; - - Если Не ДополнительныеПараметры.Свойство("ПолноеИмяФайла") Тогда - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ВыборФайла.МножественныйВыбор = Истина; - ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); - ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*"); - Если ВыборФайла.Выбрать() Тогда - ВыбранныеФайлы = ВыборФайла.ВыбранныеФайлы; - КонецЕсли; - Иначе - ВыбранныеФайлы.Добавить(ДополнительныеПараметры.ПолноеИмяФайла); - КонецЕсли; - - ИмяСоздаваемогоФайла = ""; - Если ДополнительныеПараметры.Свойство("ИмяСоздаваемогоФайла") Тогда - ИмяСоздаваемогоФайла = ДополнительныеПараметры.ИмяСоздаваемогоФайла; - КонецЕсли; - - Если ВыбранныеФайлы.Количество() > 0 Тогда - ПрисоединенныеФайлыМассив = Новый Массив; - ПоместитьВыбранныеФайлыВХранилище( - ВыбранныеФайлы, - ВладелецФайла, - ПрисоединенныеФайлыМассив, - ИдентификаторФормы, - ИмяСоздаваемогоФайла); - - Если ПрисоединенныеФайлыМассив.Количество() = 1 И ОткрыватьКарточкуПослеСозданияИзФайла Тогда - ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), - ПрисоединенныйФайл, - БиблиотекаКартинок.Информация32); - - ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - КонецЕсли; - - Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда - ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); - ОповеститьОбИзменении(ВладелецФайла); - Оповестить("Запись_ПрисоединенныйФайл", - Новый Структура("ЭтоНовый, ВладелецФайла", Истина, ВладелецФайла), ПрисоединенныеФайлыМассив); - КонецЕсли; - - КонецЕсли; - - Иначе // Если веб-клиент без подключенного расширения. - ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыЗавершение", ЭтотОбъект, ДополнительныеПараметры); - ПоместитьВыбранныеФайлыВХранилищеВеб(ОписаниеОповещения, ВладелецФайла, ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// См. одноименную функцию в общем модуле ПрисоединенныеФайлыКлиент. -Функция ПолучитьФайлВРабочийКаталог(Знач АдресДвоичныхДанныхФайла, - Знач ОтносительныйПуть, - Знач ДатаМодификацииУниверсальная, - Знач ИмяФайла, - Знач РабочийКаталогПользователя, - ПолноеИмяФайлаНаКлиенте) - - Если РабочийКаталогПользователя = Неопределено - ИЛИ ПустаяСтрока(РабочийКаталогПользователя) Тогда - - Возврат Ложь; - КонецЕсли; - - КаталогСохранения = РабочийКаталогПользователя + ОтносительныйПуть; - - Попытка - СоздатьКаталог(КаталогСохранения); - Исключение - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СообщениеОбОшибке = НСтр("ru = 'Ошибка создания каталога на диске:'") + " " + СообщениеОбОшибке; - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); - Возврат Ложь; - КонецПопытки; - - Файл = Новый Файл(КаталогСохранения + ИмяФайла); - Если Файл.Существует() Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(КаталогСохранения + ИмяФайла); - КонецЕсли; - - ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(КаталогСохранения + ИмяФайла, АдресДвоичныхДанныхФайла); - ПолучаемыеФайлы = Новый Массив; - ПолучаемыеФайлы.Добавить(ПолучаемыйФайл); - - ПолученныеФайлы = Новый Массив; - - Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда - ПолноеИмяФайлаНаКлиенте = ПолученныеФайлы[0].Имя; - Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте); - Файл.УстановитьУниверсальноеВремяИзменения(ДатаМодификацииУниверсальная); - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// См. одноименную функцию в общем модуле ПрисоединенныеФайлыКлиент. -Функция ПоместитьФайлВХранилище(Знач ПутьКФайлу, Знач ИдентификаторФормы) - - Результат = Новый Структура; - Результат.Вставить("ФайлПомещенВХранилище", Ложь); - - Файл = Новый Файл(ПутьКФайлу); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл); - - АдресВременногоХранилищаТекста = ""; - Если Не ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда - АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище(ПутьКФайлу, ИдентификаторФормы); - КонецЕсли; - - ПомещаемыеФайлы = Новый Массив; - ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу)); - ПомещенныеФайлы = Новый Массив; - - Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |во временное хранилище.'"), - ПутьКФайлу) ); - Возврат Результат; - КонецЕсли; - - Результат.Вставить("ФайлПомещенВХранилище", Истина); - Результат.Вставить("ДатаМодификацииУниверсальная", Файл.ПолучитьУниверсальноеВремяИзменения()); - Результат.Вставить("АдресФайлаВоВременномХранилище", ПомещенныеФайлы[0].Хранение); - Результат.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста); - Результат.Вставить("Расширение", Прав(Файл.Расширение, СтрДлина(Файл.Расширение)-1)); - - Возврат Результат; - -КонецФункции - -// Добавляет файлы перетаскиванием в список файлов. -// -// Параметры: -// ВладелецФайла - Ссылка - владелец файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// МассивИменФайлов - Массив Строк - путей к файлам. -// -Процедура ДобавитьФайлыПеретаскиванием(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач МассивИменФайлов) Экспорт - - ПрисоединенныеФайлыМассив = Новый Массив; - ПоместитьВыбранныеФайлыВХранилище( - МассивИменФайлов, - ВладелецФайла, - ПрисоединенныеФайлыМассив, - ИдентификаторФормы); - - Если ПрисоединенныеФайлыМассив.Количество() = 1 Тогда - ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), - ПрисоединенныйФайл, - БиблиотекаКартинок.Информация32); - - ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - КонецЕсли; - - Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда - ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); - ОповеститьОбИзменении(ВладелецФайла); - Оповестить("Запись_ПрисоединенныйФайл", - Новый Структура("ЭтоНовый, ВладелецФайла", Истина, ВладелецФайла), ПрисоединенныеФайлыМассив); - КонецЕсли; - -КонецПроцедуры - -// Помещает файл с диска в хранилище присоединенных файлов (веб-клиент). -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// ПрисоединенныйФайл - Ссылка, Неопределено - ссылка на добавленный файл, либо -// Неопределено, если файл не был помещен; -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ВладелецФайла - Ссылка на владельца файла. -// НастройкиРаботыСФайлами - Структура. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПоместитьВыбранныеФайлыВХранилищеВеб(ОбработчикРезультата, Знач ВладелецФайла, Знач ИдентификаторФормы) - - Параметры = Новый Структура; - Параметры.Вставить("ВладелецФайла", ВладелецФайла); - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - - ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьВыбранныеФайлыВХранилищеВебЗавершение", ЭтотОбъект, Параметры); - НачатьПомещениеФайла(ОписаниеОповещения, , ,Истина, ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьВыбранныеФайлыВХранилищеВеб. -Процедура ПоместитьВыбранныеФайлыВХранилищеВебЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт - - Если Не Результат Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); - Возврат; - КонецЕсли; - - АдресВременногоХранилищаФайла = Адрес; - ИмяФайла = ВыбранноеИмяФайла; - ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; - - СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла); - - Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда - Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); - ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |во временное хранилище.'"), - ИмяФайла); - КонецЕсли; - - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(Расширение); - - // Создание карточки Файла в базе данных. - ПрисоединенныйФайл = ПрисоединенныеФайлыСлужебныйВызовСервера.ДобавитьФайл( - ВладелецФайла, - ИмяБезРасширения, - Расширение, - , - , - АдресВременногоХранилищаФайла, - ""); - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПрисоединенныйФайл); - -КонецПроцедуры - -// Помещает отредактированные файлы в хранилище. -// Используется, как обработчик команды окончания редактирования файлов. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если -// помещение не было выполнено, то возвращается Неопределено; -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ДанныеФайла - Структура с данными файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПоместитьРедактируемыйФайлНаДискеВХранилище(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - Параметры = Новый Структура; - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. -Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; - - Если РасширениеРаботыСФайламиПодключено Тогда - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; - - ИнформацияОФайле = Неопределено; - Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте); - Если Файл.Существует() Тогда - ИнформацияОФайле = ПоместитьФайлВХранилище(ПолноеИмяФайлаНаКлиенте, ИдентификаторФормы); - Иначе - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Файл не найден в рабочем каталоге.'")); - КонецЕсли; - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); - Иначе - ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеВыполненоПомещение", ЭтотОбъект, ДополнительныеПараметры); - ПоместитьФайлНаДискеВХранилищеВеб(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. -Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - Если ИнформацияОФайле = Неопределено Или ДанныеФайла.ИмяФайла = ИнформацияОФайле.ИмяФайла Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); - Возврат; - КонецЕсли; - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Имя выбранного файла - |""%1"" - |отличается от имени файла в хранилище - |""%2"". - | - |Продолжить?'"), - ИнформацияОФайле.ИмяФайла, - ДанныеФайла.ИмяФайла); - - ДополнительныеПараметры.Вставить("ИнформацияОФайле", ИнформацияОФайле); - ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеОтветПолучен", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); -КонецПроцедуры - -// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. -Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт - Результат = Неопределено; - Если РезультатВопроса = КодВозвратаДиалога.ОК Тогда - Результат = ДополнительныеПараметры.ИнформацияОФайле; - КонецЕсли; - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); -КонецПроцедуры - -// Выбирает файл с диска и помещает его во временное хранилище на сервере. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если -// помещение не было выполнено, то возвращается Неопределено; -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ДанныеФайла - Структура с данными файла. -// ИнформацияОФайле - Структура (возвращаемое значение) - информация о файле. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ВыбратьФайлНаДискеИПоместитьВХранилище(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - Параметры = Новый Структура; - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - -КонецПроцедуры - -// Продолжение процедуры ВыбратьФайлНаДискеИПоместитьВХранилище. -Процедура ВыбратьФайлНаДискеИПоместитьВХранилищеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; - - Если РасширениеРаботыСФайламиПодключено Тогда - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.ПолноеИмяФайла = ДанныеФайла.Наименование + "." + ДанныеФайла.Расширение; - ВыборФайла.Расширение = ДанныеФайла.Расширение; - ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); - - ИнформацияОФайле = Неопределено; - Если ВыборФайла.Выбрать() Тогда - ИнформацияОФайле = ПоместитьФайлВХранилище(ВыборФайла.ПолноеИмяФайла, ИдентификаторФормы); - КонецЕсли; - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); - Иначе - ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение", ЭтотОбъект, ДополнительныеПараметры); - ПоместитьФайлНаДискеВХранилищеВеб(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ВыбратьФайлНаДискеИПоместитьВХранилище. -Процедура ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); - -КонецПроцедуры - -// Помещает файл с диска клиента во временное хранилище. -// Аналог функции ПоместитьФайлНаДискеВХранилище -// для веб-клиента без расширения для работы с файлами. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если -// помещение не было выполнено, то возвращается Неопределено; -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ДанныеФайла - Структура с данными файла. -// ИнформацияОФайле - Структура (возвращаемое значение) с информацией о файле. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПоместитьФайлНаДискеВХранилищеВеб(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) - - Параметры = Новый Структура; - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - - ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьФайлНаДискеВХранилищеВебВыполненоПомещение", ЭтотОбъект, Параметры); - НачатьПомещениеФайла(ОписаниеОповещения, , ДанныеФайла.ИмяФайла, Истина, ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьФайлНаДискеВХранилищеВеб. -Процедура ПоместитьФайлНаДискеВХранилищеВебВыполненоПомещение(Результат, АдресВременногоХранилищаФайла, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт - - Если Не Результат Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); - Возврат; - КонецЕсли; - - СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла); - - Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда - НовоеИмя = СтруктураПути.ИмяБезРасширения; - НовоеРасширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); - ИмяФайла = НовоеИмя + "." + НовоеРасширение; - ИначеЕсли Не ПустаяСтрока(СтруктураПути.ИмяБезРасширения) Тогда - НовоеИмя = СтруктураПути.ИмяБезРасширения; - НовоеРасширение = ""; - ИмяФайла = НовоеИмя; - КонецЕсли; - - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(НовоеРасширение); - - ИнформацияОФайле = Новый Структура; - ИнформацияОФайле.Вставить("ФайлПомещенВХранилище", Истина); - ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Неопределено); - ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", АдресВременногоХранилищаФайла); - ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", ""); - ИнформацияОФайле.Вставить("ИмяФайла", ИмяФайла); - ИнформацияОФайле.Вставить("Расширение", НовоеРасширение); - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); - -КонецПроцедуры - -// Открывает каталог с файлом (при необходимости получает файл из хранилища). -// Используется, как обработчик команды открытия каталога с файлом. -// -// Параметры: -// ДанныеФайла - Структура с данными файла. -// -Процедура ОткрытьКаталогСФайлом(Знач ДанныеФайла) Экспорт - - Параметры = Новый Структура; - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайломРасширениеПредложено", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - -КонецПроцедуры - -// Продолжение процедуры ОткрытьКаталогСФайлом. -Процедура ОткрытьКаталогСФайломРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - Перем ПолноеИмяФайла; - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - - Если РасширениеРаботыСФайламиПодключено Тогда - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - Если ПустаяСтрока(РабочийКаталогПользователя) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Не задан рабочий каталог'")); - Возврат; - КонецЕсли; - - ПолныйПуть = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; - Файл = Новый Файл(ПолныйПуть); - Если Не Файл.Существует() Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Каталог файла не существует. Возможно, на данном компьютере файл ""%1"" еще не открывался. - |Сохранить файл на компьютер и открыть его каталог?'"), - Файл.Имя); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(КодВозвратаДиалога.Да, НСтр("ru= 'Сохранить и открыть каталог'")); - КнопкиВопроса.Добавить(КодВозвратаДиалога.Нет, НСтр("ru= 'Отмена'")); - ДополнительныеПараметры.Вставить("РабочийКаталогПользователя", РабочийКаталогПользователя); - ДополнительныеПараметры.Вставить("ПолныйПуть", ПолныйПуть); - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайломОтветПолучен", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, КнопкиВопроса); - КонецЕсли; - - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолныйПуть); - Иначе - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОткрытьКаталогСФайлом. -Процедура ОткрытьКаталогСФайломОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт - - Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - РабочийКаталогПользователя = ДополнительныеПараметры.РабочийКаталогПользователя; - ПолныйПуть = ДополнительныеПараметры.ПолныйПуть; - - ПолноеИмяФайлаНаКлиенте = ""; - ПолучитьФайлВРабочийКаталог( - ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, - ДанныеФайла.ОтносительныйПуть, - ДанныеФайла.ДатаМодификацииУниверсальная, - ДанныеФайла.ИмяФайла, - РабочийКаталогПользователя, - ПолноеИмяФайлаНаКлиенте); - - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолныйПуть); - -КонецПроцедуры - - -// См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент. -Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Контекст.Вставить("ДанныеФайла", Неопределено); - Контекст.Вставить("ПолноеИмяПомещаемогоФайла", Неопределено); - ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла); - ДополнительныеПараметры.Свойство("ПолноеИмяФайла", Контекст.ПолноеИмяПомещаемогоФайла); - - Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") Тогда - Контекст.Вставить("ДанныеФайла", ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла( - Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Ложь)); - КонецЕсли; - - Контекст.Вставить("ЗаголовокОшибки", - НСтр("ru = 'Не удалось поместить файл с компьютера в хранилище файлов по причине:'") + Символы.ПС); - - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения( - "ПоместитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьПрисоединенныйФайл. -Процедура ПоместитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт - - Если Не РасширениеПодключено Тогда - Результат = Новый Структура; - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'В обозреватель интернет не установлено расширение для работы с файлами.'")); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - ФайловыеФункцииСлужебныйКлиент.ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( - "ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьПрисоединенныйФайл. -Процедура ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт - - Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда - Результат = Новый Структура; - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); - Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); - Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); - - Если Не ЗначениеЗаполнено(Контекст.ПолноеИмяПомещаемогоФайла) Тогда - Контекст.ПолноеИмяПомещаемогоФайла = Контекст.ПолноеИмяФайла; - КонецЕсли; - - ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(Контекст.ПолноеИмяФайла); - ПомещаемыеФайлы = Новый Массив; - ПомещаемыеФайлы.Добавить(ОписаниеФайла); - - ДействияСФайлом = Новый Массив; - - Вызовы = Новый Массив; - - Если Контекст.ПолноеИмяФайла <> Контекст.ПолноеИмяПомещаемогоФайла Тогда - Действие = Новый Структура; - Действие.Вставить("Действие", "СоздатьКаталог"); - Действие.Вставить("Файл", Контекст.КаталогФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Создание каталога не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Действие = Новый Структура; - Действие.Вставить("Действие", "УстановитьСвойства"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Действие = Новый Структура; - Действие.Вставить("Действие", "СкопироватьИзИсточника"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Источник", Контекст.ПолноеИмяПомещаемогоФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Копирование файла не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - ДобавитьВызов(Вызовы, "НачатьКопированиеФайла", Контекст.ПолноеИмяПомещаемогоФайла, Контекст.ПолноеИмяФайла,,); - КонецЕсли; - - Действие = Новый Структура; - Действие.Вставить("Действие", "УстановитьСвойства"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Истина)); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Контекст.Вставить("СвойстваФайла", Новый Структура); - Контекст.СвойстваФайла.Вставить("УниверсальноеВремяИзменения"); - Контекст.СвойстваФайла.Вставить("ИмяБезРасширения"); - Контекст.СвойстваФайла.Вставить("Расширение"); - - Действие = Новый Структура; - Действие.Вставить("Действие", "ПолучитьСвойства"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Свойства", Контекст.СвойстваФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Получение свойств файла не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Контекст.Вставить("ДействиеПомещения", Новый Структура); - Контекст.ДействиеПомещения.Вставить("Действие", "Поместить"); - Контекст.ДействиеПомещения.Вставить("Файл", Контекст.ПолноеИмяФайла); - Контекст.ДействиеПомещения.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); - ДействияСФайлом.Добавить(Контекст.ДействиеПомещения); - ДобавитьВызов(Вызовы, "НачатьПомещениеФайлов", ПомещаемыеФайлы, , Ложь, Контекст.ИдентификаторФормы); - - Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); - - НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения( - "ПоместитьПрисоединенныйФайлПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы); - -КонецПроцедуры - -Процедура ДобавитьВызов(Вызовы, Метод, П1, П2, П3, П4) - - Вызов = Новый Массив; - Вызов.Добавить(Метод); - Вызов.Добавить(П1); - Вызов.Добавить(П2); - Вызов.Добавить(П3); - Вызов.Добавить(П4); - - Вызовы.Добавить(Вызов); - -КонецПроцедуры - -// Продолжение процедуры ПоместитьПрисоединенныйФайл. -Процедура ПоместитьПрисоединенныйФайлПослеПолученияРазрешений(РазрешенияПолучены, Контекст) Экспорт - - Если РазрешенияПолучены Тогда - ФайловыеФункцииСлужебныйКлиент.ОбработатьФайл(Новый ОписаниеОповещения( - "ПоместитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), - Контекст.ДействияСФайлом, Контекст.ИдентификаторФормы); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПоместитьПрисоединенныйФайл. -Процедура ПоместитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт - - Результат = Новый Структура; - - Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда - Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - Результат.Вставить("ОписаниеОшибки", ""); - - Расширение = Контекст.СвойстваФайла.Расширение; - - ИнформацияОФайле = Новый Структура; - ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Контекст.СвойстваФайла.УниверсальноеВремяИзменения); - ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", Контекст.ДействиеПомещения.Адрес); - ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", ""); - ИнформацияОФайле.Вставить("ИмяБезРасширения", Контекст.СвойстваФайла.ИмяБезРасширения); - ИнформацияОФайле.Вставить("Расширение", Прав(Расширение, СтрДлина(Расширение)-1)); - ИнформацияОФайле.Вставить("Редактирует", Неопределено); - - Попытка - ПрисоединенныеФайлыСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл( - Контекст.ПрисоединенныйФайл, ИнформацияОФайле); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - -КонецПроцедуры - - -// См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент. -Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Контекст.Вставить("ДляРедактирования", Ложь); - Контекст.Вставить("ДанныеФайла", Неопределено); - ДополнительныеПараметры.Свойство("ДляРедактирования", Контекст.ДляРедактирования); - ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла); - - Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") - Или Не ЗначениеЗаполнено(Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда - - Контекст.Вставить("ДанныеФайла", ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла( - Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Истина, Контекст.ДляРедактирования)); - КонецЕсли; - - Контекст.Вставить("ЗаголовокОшибки", - НСтр("ru = 'Не удалось получить файл на компьютер из хранилища файлов по причине:'") + Символы.ПС); - - Если Контекст.ДляРедактирования - И Контекст.ДанныеФайла.Редактирует <> ПользователиКлиентСервер.АвторизованныйПользователь() Тогда - - Результат = Новый Структура; - Результат.Вставить("ПолноеИмяФайла", ""); - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл уже редактирует пользователь %1.'"), Строка(Контекст.ДанныеФайла.Редактирует))); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - Контекст.Вставить("ДляРедактирования", ЗначениеЗаполнено(Контекст.ДанныеФайла.Редактирует)); - - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения( - "ПолучитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПрисоединенныйФайл. -Процедура ПолучитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт - - Если Не РасширениеПодключено Тогда - Результат = Новый Структура; - Результат.Вставить("ПолноеИмяФайла", ""); - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'В обозреватель интернет не установлено расширение для работы с файлами.'")); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - ФайловыеФункцииСлужебныйКлиент.ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( - "ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПрисоединенныйФайл. -Процедура ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт - - Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда - Результат = Новый Структура; - Результат.Вставить("ПолноеИмяФайла", ""); - Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - - Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); - Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); - Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); - - ДействияСФайлом = Новый Массив; - - Действие = Новый Структура; - Действие.Вставить("Действие", "СоздатьКаталог"); - Действие.Вставить("Файл", Контекст.КаталогФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Создание каталога не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Действие = Новый Структура; - Действие.Вставить("Действие", "УстановитьСвойства"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - Действие = Новый Структура; - Действие.Вставить("Действие", "Получить"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Адрес", Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); - ДействияСФайлом.Добавить(Действие); - - СвойстваФайла = Новый Структура; - СвойстваФайла.Вставить("ТолькоЧтение", Не Контекст.ДляРедактирования); - СвойстваФайла.Вставить("УниверсальноеВремяИзменения", Контекст.ДанныеФайла.ДатаМодификацииУниверсальная); - - Действие = Новый Структура; - Действие.Вставить("Действие", "УстановитьСвойства"); - Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); - Действие.Вставить("Свойства", СвойстваФайла); - Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки - + НСтр("ru = 'Установка свойств файла не выполнено по причине:'")); - ДействияСФайлом.Добавить(Действие); - - ФайловыеФункцииСлужебныйКлиент.ОбработатьФайл(Новый ОписаниеОповещения( - "ПолучитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), - ДействияСФайлом, Контекст.ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПрисоединенныйФайл. -Процедура ПолучитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт - - Результат = Новый Структура; - - Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда - Результат.Вставить("ПолноеИмяФайла", ""); - Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); - Иначе - Результат.Вставить("ПолноеИмяФайла", Контекст.ПолноеИмяФайла); - Результат.Вставить("ОписаниеОшибки", ""); - КонецЕсли; - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Работа с электронными подписями. - -// Подписывает файл с помощью подсистемы ЭлектроннаяПодпись. -Процедура ПодписатьФайл(ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы, - ОбработчикЗавершения = Неопределено, ОбработчикПриПолученииПодписи = Неопределено) Экспорт - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - ПараметрыВыполнения.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); - ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); - ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); - - ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - - Если ОбработчикПриПолученииПодписи = Неопределено Тогда - ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); - Иначе - ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); - КонецЕсли; - - ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеДобавленияПодписей", ЭтотОбъект, ПараметрыВыполнения); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, , ОбработчикПродолжения); - -КонецПроцедуры - -// Добавляет электронные подписи к файлу-объекту из файлов-подписей на диске. -Процедура ДобавитьПодписьИзФайла(ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы, - ОбработчикЗавершения = Неопределено, ОбработчикПриПолученииПодписи = Неопределено) Экспорт - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - ПараметрыВыполнения.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); - ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); - - ОписаниеДанных.Вставить("Данные", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - - Если ОбработчикПриПолученииПодписи = Неопределено Тогда - ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); - Иначе - ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); - КонецЕсли; - - ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеДобавленияПодписей", - ЭтотОбъект, ПараметрыВыполнения); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.ДобавитьПодписьИзФайла(ОписаниеДанных,, ОбработчикПродолжения); - -КонецПроцедуры - -// Завершение процедур ПодписатьФайл, ДобавитьПодписьИзФайла. -Процедура ПослеДобавленияПодписей(ОписаниеДанных, ПараметрыВыполнения) Экспорт - - Если ОписаниеДанных.Успех Тогда - ОповеститьОбИзменении(ПараметрыВыполнения.ПрисоединенныйФайл); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПараметрыВыполнения.ПрисоединенныйФайл); - КонецЕсли; - - Если ПараметрыВыполнения.ОбработчикЗавершения <> Неопределено Тогда - ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикЗавершения, ОписаниеДанных.Успех); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Шифрование. - -// Шифрует файл в хранилище: -// - предлагает пользователю выбрать сертификаты для шифрования, -// - выполняет шифрование файла, -// - записывает зашифрованные данные вместе с отпечатками в хранилище, -// - оповещает систему и пользователя об изменениях. -// Используется в обработчике команды шифрования файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на файл, который требуется зашифровать. -// ДанныеФайла - Структура с данными файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура Зашифровать(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - Параметры = Новый Структура; - Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - ОписаниеОповещения = Новый ОписаниеОповещения("ЗашифроватьДанныеПолучены", ЭтотОбъект, Параметры); - ПолучитьЗашифрованныеДанные(ОписаниеОповещения, ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры Зашифровать. -Процедура ЗашифроватьДанныеПолучены(РезультатПолучения, ДополнительныеПараметры) Экспорт - - Если РезультатПолучения = Неопределено Тогда - Возврат; - КонецЕсли; - - ЗашифрованныеДанные = РезультатПолучения.ЗашифрованныеДанные; - МассивОтпечатков = РезультатПолучения.МассивОтпечатков; - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; - - ПрисоединенныеФайлыСлужебныйВызовСервера.Зашифровать(ПрисоединенныйФайл, ЗашифрованныеДанные, МассивОтпечатков); - ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге(ПрисоединенныйФайл, ДанныеФайла); - -КонецПроцедуры - -// Шифрует двоичные данные файла с помощью сертификатов, выбранных пользователем. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// Результат - Структура, Неопределено - если данные не были зашифрованы, то неопределено, -// иначе структура: -// ЗашифрованныеДанные - Структура - содержит зашифрованные данные файла (для записи). -// МассивОтпечатков - Массив - содержит отпечатки. -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ПрисоединенныйФайл - Ссылка на файл. -// ДанныеФайла - Структура с данными файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПолучитьЗашифрованныеДанные(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - Если ДанныеФайла.Зашифрован Тогда - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |уже зашифрован.'"), Строка(ПрисоединенныйФайл))); - ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); - Возврат; - КонецЕсли; - - Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Нельзя зашифровать занятый файл.'")); - ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); - Возврат; - КонецЕсли; - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - ДополнительныеПараметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла); - ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Данные", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - ОписаниеДанных.Вставить("Представление", ДополнительныеПараметры.ПрисоединенныйФайл); - ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); - - ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеШифрованияФайла", ЭтотОбъект, ДополнительныеПараметры); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения); - -КонецПроцедуры - -// Завершение процедуры Зашифровать. Вызывается из подсистемы ЭлектроннаяПодпись. -Процедура ПослеШифрованияФайла(ОписаниеДанных, ДополнительныеПараметры) Экспорт - - Результат = Неопределено; - - Если ОписаниеДанных.Успех Тогда - Результат = Новый Структура; - - Если ТипЗнч(ОписаниеДанных.СертификатыШифрования) = Тип("Строка") Тогда - Результат.Вставить("МассивОтпечатков", ПолучитьИзВременногоХранилища( - ОписаниеДанных.СертификатыШифрования)); - Иначе - Результат.Вставить("МассивОтпечатков", ОписаниеДанных.СертификатыШифрования); - КонецЕсли; - - ЗашифрованныеДанные = ОписаниеДанных.ЗашифрованныеДанные; - Если ТипЗнч(ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда - АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ЗашифрованныеДанные, - ДополнительныеПараметры.ИдентификаторФормы); - Иначе - АдресВременногоХранилища = ЗашифрованныеДанные; - КонецЕсли; - ЗашифрованныеДанные = Новый Структура; - ЗашифрованныеДанные.Вставить("АдресВременногоХранилища", АдресВременногоХранилища); - Результат.Вставить("ЗашифрованныеДанные", ЗашифрованныеДанные); - КонецЕсли; - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); - -КонецПроцедуры - - -// Удаляет файл из рабочего каталога, оповещает об изменениях открытые формы. -Процедура ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге(Знач ПрисоединенныйФайл, Знач ДанныеФайла) Экспорт - - ОповеститьОбИзменении(ПрисоединенныйФайл); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл); - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл: %1'"), ПрисоединенныйФайл)); - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - Параметры.Вставить("ДанныеФайла", ДанныеФайла); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталогеРасширениеПредложено", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - -КонецПроцедуры - -Процедура ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталогеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - - Если РасширениеРаботыСФайламиПодключено Тогда - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ПолныйПутьКФайлу = РабочийКаталогПользователя + ДанныеФайла.ИмяФайла; - - Файл = Новый Файл(ПолныйПутьКФайлу); - Если Файл.Существует() Тогда - Попытка - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолныйПутьКФайлу); - Исключение - // Попытка удалить файл с диска. - КонецПопытки; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Расшифровывает файл в хранилище: -// - показывает пользователю диалог с предложением расшифровать файл, -// - получает двоичные данные и массив отпечатков, -// - производит расшифровку, -// - записывает расшифрованные данные файла в хранилище. -// Используется как обработчик команды расшифровки файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на файл. -// ДанныеФайла - Структура с данными файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура Расшифровать(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - ОписаниеОповещения = Новый ОписаниеОповещения("РасшифроватьДанныеПолучены", ЭтотОбъект, ПрисоединенныйФайл); - ПолучитьРасшифрованныеДанные(ОписаниеОповещения, ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры Расшифровать. -Процедура РасшифроватьДанныеПолучены(РасшифрованныеДанные, ПрисоединенныйФайл) Экспорт - Если РасшифрованныеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыСлужебныйВызовСервера.Расшифровать(ПрисоединенныйФайл, РасшифрованныеДанные); - ОповеститьОРасшифровкеФайла(ПрисоединенныйФайл); -КонецПроцедуры - -// Получает расшифрованные данные файла. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. -// Параметры вызываемой процедуры: -// РасшифрованныеДанные - Структура, Неопределено - содержит расшифрованные данные, либо -// Неопределено, если расшифровка не была выполнена. -// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании -// объекта оповещения. -// ПрисоединенныйФайл - Ссылка на файл. -// ДанныеФайла - Структура с данными файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПолучитьРасшифрованныеДанные(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - ДополнительныеПараметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); - ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла); - ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Данные", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - ОписаниеДанных.Вставить("Представление", ДополнительныеПараметры.ПрисоединенныйФайл); - ОписаниеДанных.Вставить("СертификатыШифрования", ДополнительныеПараметры.ПрисоединенныйФайл); - ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); - - ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеРасшифровкиФайла", ЭтотОбъект, ДополнительныеПараметры); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); - -КонецПроцедуры - -// Завершение процедуры Расшифровать. Вызывается из подсистемы ЭлектроннаяПодпись. -Процедура ПослеРасшифровкиФайла(ОписаниеДанных, ДополнительныеПараметры) Экспорт - - Результат = Неопределено; - - Если ОписаниеДанных.Успех Тогда - - РасшифрованныеДанные = ОписаниеДанных.РасшифрованныеДанные; - Если ТипЗнч(РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда - АдресВременногоХранилища = ПоместитьВоВременноеХранилище(РасшифрованныеДанные, - ДополнительныеПараметры.ИдентификаторФормы); - Иначе - АдресВременногоХранилища = РасшифрованныеДанные; - #Если Не ВебКлиент Тогда - РасшифрованныеДанные = ПолучитьИзВременногоХранилища(РасшифрованныеДанные); - #КонецЕсли - КонецЕсли; - - #Если ВебКлиент Тогда - АдресВременногоХранилищаТекста = ""; - #Иначе - ИзвлекатьТекстыФайловНаСервере = - ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере; - - Если НЕ ИзвлекатьТекстыФайловНаСервере Тогда - - ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.ДанныеФайла.Расширение); - РасшифрованныеДанные.Записать(ПолныйПутьКФайлу); - - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ПолныйПутьКФайлу, ДополнительныеПараметры.ИдентификаторФормы); - - УдалитьФайлы(ПолныйПутьКФайлу); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - #КонецЕсли - - Результат = Новый Структура; - Результат.Вставить("АдресВременногоХранилища", АдресВременногоХранилища); - Результат.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста); - КонецЕсли; - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); - -КонецПроцедуры - -// Оповещает систему и пользователя о расшифровке файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на файл. -// -Процедура ОповеститьОРасшифровкеФайла(Знач ПрисоединенныйФайл) Экспорт - - ОповеститьОбИзменении(ПрисоединенныйФайл); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл); - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл: %1'"), ПрисоединенныйФайл)); - -КонецПроцедуры - -// Помещает файлы с диска в хранилище присоединенных файлов. -// -// Параметры: -// ВыбранныеФайлы - Массив - пути к файлам на диске. -// ВладелецФайла - Ссылка на владельца файла. -// НастройкиРаботыСФайлами - Структура. -// ПрисоединенныеФайлыМассив - Массив (возвращаемое значение) - заполняется ссылками -// на добавленные файлы. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ПоместитьВыбранныеФайлыВХранилище(Знач ВыбранныеФайлы, - Знач ВладелецФайла, - ПрисоединенныеФайлыМассив, - Знач ИдентификаторФормы, - Знач ИмяСоздаваемогоФайла = "") Экспорт - - ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - - ТекущаяПозиция = 0; - - ПоследнийСохраненныйФайл = Неопределено; - - Для Каждого ПолноеИмяФайла Из ВыбранныеФайлы Цикл - - ТекущаяПозиция = ТекущаяПозиция + 1; - - Файл = Новый Файл(ПолноеИмяФайла); - - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл); - - Если ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере Тогда - АдресВременногоХранилищаТекста = ""; - Иначе - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ПолноеИмяФайла, ИдентификаторФормы); - КонецЕсли; - - ВремяИзмененияУниверсальное = Файл.ПолучитьУниверсальноеВремяИзменения(); - - ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, Файл, ТекущаяПозиция, ИмяСоздаваемогоФайла); - ПоследнийСохраненныйФайл = Файл; - - ПомещаемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, ""); - ПомещаемыеФайлы.Добавить(Описание); - - ПомещенныеФайлы = Новый Массив; - - Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |во временное хранилище.'"), - Файл.ПолноеИмя) ); - Продолжить; - КонецЕсли; - - АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; - - ИмяБезРасширения = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), Файл.ИмяБезРасширения, ИмяСоздаваемогоФайла); - // Создание карточки Файла в базе данных. - ПрисоединенныйФайл = ПрисоединенныеФайлыСлужебныйВызовСервера.ДобавитьФайл( - ВладелецФайла, - ИмяБезРасширения, - ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Файл.Расширение), - , - ВремяИзмененияУниверсальное, - АдресВременногоХранилищаФайла, - АдресВременногоХранилищаТекста); - - Если ПрисоединенныйФайл = Неопределено Тогда - Продолжить; - КонецЕсли; - - ПрисоединенныеФайлыМассив.Добавить(ПрисоединенныйФайл); - - КонецЦикла; - - ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, ПоследнийСохраненныйФайл, , ИмяБезРасширения); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. - -Процедура ОбновитьСостояниеОСохраненииФайлов(Знач ВыбранныеФайлы, - Знач Файл, - Знач ТекущаяПозиция = Неопределено, - ИмяСоздаваемогоФайла = ""); - - Если Файл = Неопределено Тогда - Возврат; - КонецЕсли; - - СохраняемоеИмяФайла = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), Файл.Имя, ИмяСоздаваемогоФайла); - - РазмерВМб = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(Файл.Размер() / (1024 * 1024)); - - Если ВыбранныеФайлы.Количество() > 1 Тогда - - Если ТекущаяПозиция = Неопределено Тогда - Состояние(НСтр("ru = 'Сохранение файлов завершено.'")); - Иначе - ИндикаторПроцент = ТекущаяПозиция * 100 / ВыбранныеФайлы.Количество(); - - НадписьПодробнее = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется файл ""%1"" (%2 Мб) ...'"), СохраняемоеИмяФайла, РазмерВМб); - - ТекстСостояния = НСтр("ru = 'Сохранение нескольких файлов.'"); - - Состояние(ТекстСостояния, ИндикаторПроцент, НадписьПодробнее, БиблиотекаКартинок.Информация32); - КонецЕсли; - Иначе - Если ТекущаяПозиция = Неопределено Тогда - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохранение файла ""%1"" (%2 Мб) - |завершено.'"), СохраняемоеИмяФайла, РазмерВМб); - Иначе - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется файл ""%1"" (%2 Мб). - |Пожалуйста, подождите...'"), СохраняемоеИмяФайла, РазмерВМб); - КонецЕсли; - ПоказатьОповещениеПользователя(ТекстПояснения); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Продолжения асинхронных процедур. - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. -Процедура ОткрытьФайлРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; - - Если РасширениеРаботыСФайламиПодключено Тогда - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; - ФайлНаДиске = Новый Файл(ПолноеИмяФайлаНаКлиенте); - - ДополнительныеПараметры.Вставить("ДляРедактирования", ДляРедактирования); - ДополнительныеПараметры.Вставить("РабочийКаталогПользователя", РабочийКаталогПользователя); - ДополнительныеПараметры.Вставить("ФайлНаДиске", ФайлНаДиске); - ДополнительныеПараметры.Вставить("ПолноеИмяФайлаНаКлиенте", ПолноеИмяФайлаНаКлиенте); - - Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) И ДляРедактирования И ФайлНаДиске.Существует() Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - ПолучитьФайл = Ложь; - ИначеЕсли ФайлНаДиске.Существует() Тогда - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлДиалогПоказан", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьДиалогНужноПолучитьФайлССервера(ОписаниеОповещения, ПолноеИмяФайлаНаКлиенте, ДанныеФайла, ДляРедактирования); - Возврат; - Иначе - ПолучитьФайл = Истина; - КонецЕсли; - - ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры); - Иначе - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлНапоминаниеПоказано", ЭтотОбъект, ДополнительныеПараметры); - ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(ОписаниеОповещения); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. -Процедура ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры) Экспорт - Если ПолучитьФайл = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; - РабочийКаталогПользователя = ДополнительныеПараметры.РабочийКаталогПользователя; - ФайлНаДиске = ДополнительныеПараметры.ФайлНаДиске; - ПолноеИмяФайлаНаКлиенте = ДополнительныеПараметры.ПолноеИмяФайлаНаКлиенте; - - ФайлМожноОткрывать = Истина; - Если ПолучитьФайл Тогда - ПолноеИмяФайлаНаКлиенте = ""; - ФайлМожноОткрывать = ПолучитьФайлВРабочийКаталог( - ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, - ДанныеФайла.ОтносительныйПуть, - ДанныеФайла.ДатаМодификацииУниверсальная, - ДанныеФайла.ИмяФайла, - РабочийКаталогПользователя, - ПолноеИмяФайлаНаКлиенте); - КонецЕсли; - - Если ФайлМожноОткрывать Тогда - Если ДляРедактирования Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - Иначе - ФайлНаДиске.УстановитьТолькоЧтение(Истина); - КонецЕсли; - ОткрытьФайлПриложением(ПолноеИмяФайлаНаКлиенте, ДанныеФайла); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. -Процедура ОткрытьФайлНапоминаниеПоказано(РезультатНапоминания, ДополнительныеПараметры) Экспорт - - Если РезультатНапоминания = КодВозвратаДиалога.Отмена Или РезультатНапоминания = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); - -КонецПроцедуры - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. -Процедура ДобавитьФайлыЗавершение(ПрисоединенныйФайл, ДополнительныеПараметры) Экспорт - - Если ПрисоединенныйФайл = Неопределено Тогда - Возврат; - КонецЕсли; - - ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; - ОповеститьОбИзменении(ПрисоединенныйФайл); - ОповеститьОбИзменении(ВладелецФайла); - Оповестить("Запись_ПрисоединенныйФайл", - Новый Структура("ЭтоНовый, ВладелецФайла", Истина, ВладелецФайла), ПрисоединенныйФайл); - - ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; - Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда - ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; - КонецЕсли; - Если ОткрыватьКарточкуПослеСозданияИзФайла Тогда - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), - ПрисоединенныйФайл, - БиблиотекаКартинок.Информация32); - - ПараметрыФормы = Новый Структура("ПрисоединенныйФайл", ПрисоединенныйФайл); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП. -// Вызывается из подсистемы ЭлектроннаяПодпись после выбора подписей для сохранения. -// -Процедура ПриСохраненииДанныхФайла(Параметры, ПараметрыВыполнения) Экспорт - - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); - - ПараметрыВыполнения.Вставить("ОбработчикЗавершения", Параметры.Оповещение); - СохранитьФайлКакРасширениеПредложено(РасширениеПодключено, ПараметрыВыполнения); - -КонецПроцедуры - -// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьФайлКак. -Процедура СохранитьФайлКакРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт - - ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; - ПолноеИмяФайла = ""; - Если РасширениеРаботыСФайламиПодключено Тогда - - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.ПолноеИмяФайла = ДанныеФайла.ИмяФайла; - ВыборФайла.Расширение = ДанныеФайла.Расширение; - ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); - - Если НЕ ВыборФайла.Выбрать() Тогда - Возврат; - КонецЕсли; - - РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); - - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется файл ""%1"" (%2 Мб) - |Пожалуйста, подождите...'"), - ДанныеФайла.ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб) ); - - Состояние(ТекстПояснения); - - ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - ПолучаемыеФайлы = Новый Массив; - ПолучаемыеФайлы.Добавить(ПолучаемыйФайл); - - ПолученныеФайлы = Новый Массив; - - Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда - Состояние(НСтр("ru = 'Файл успешно сохранен.'"), , ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; - Иначе - ПолноеИмяФайла = ДанныеФайла.ИмяФайла; - ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ПолноеИмяФайла, Истина); - КонецЕсли; - - Если ДополнительныеПараметры.Свойство("ОбработчикЗавершения") Тогда - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикЗавершения, - Новый Структура("ПолноеИмяФайла", ПолноеИмяФайла)); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. - -Процедура ПоказатьДиалогНужноПолучитьФайлССервера(ОбработчикРезультата, Знач ИмяФайлаСПутем, Знач ДанныеФайла, Знач ДляРедактирования) - - СтандартныеДанныеФайла = Новый Структура; - СтандартныеДанныеФайла.Вставить("ДатаМодификацииУниверсальная", ДанныеФайла.ДатаМодификацииУниверсальная); - СтандартныеДанныеФайла.Вставить("Размер", ДанныеФайла.Размер); - СтандартныеДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", НЕ ДляРедактирования); - СтандартныеДанныеФайла.Вставить("Редактирует", ДанныеФайла.Редактирует); - - // Выяснено, что Файл в рабочем каталоге есть. - // Проверка даты изменения и принятие решения, что делать дальше. - - Параметры = Новый Структура; - Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Параметры.Вставить("ИмяФайлаСПутем", ИмяФайлаСПутем); - ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( - ОписаниеОповещения, ИмяФайлаСПутем, СтандартныеДанныеФайла); -КонецПроцедуры - -// Продолжение процедуры ПоказатьДиалогНужноПолучитьФайлССервера. -Процедура ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено(Действие, ДополнительныеПараметры) Экспорт - ИмяФайлаСПутем = ДополнительныеПараметры.ИмяФайлаСПутем; - - Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда - Файл = Новый Файл(ИмяФайлаСПутем); - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ИмяФайлаСПутем); - Результат = Истина; - ИначеЕсли Действие = "ОткрытьСуществующий" Тогда - Результат = Ложь; - Иначе // Действие = "Отмена". - Результат = Неопределено; - КонецЕсли; - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); - -КонецПроцедуры - -Процедура ОткрытьФайлПриложением(Знач ИмяОткрываемогоФайла, ДанныеФайла) - - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); - - Если РасширениеПодключено Тогда - ЗаголовокСтрока = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.Наименование, ДанныеФайла.Расширение); - - Если НРег(ДанныеФайла.Расширение) = НРег("grs") Тогда - Схема = Новый ГрафическаяСхема; - Схема.Прочитать(ИмяОткрываемогоФайла); - Схема.Показать(ЗаголовокСтрока, ИмяОткрываемогоФайла); - Возврат; - КонецЕсли; - - Если НРег(ДанныеФайла.Расширение) = НРег("mxl") Тогда - - ПомещаемыеФайлы = Новый Массив; - ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяОткрываемогоФайла)); - ПомещенныеФайлы = Новый Массив; - Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда - Возврат; - КонецЕсли; - ТабличныйДокумент = ПомещенныеФайлы[0].Хранение; - - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("ИмяДокумента", ЗаголовокСтрока); - ПараметрыОткрытия.Вставить("ПутьКФайлу", ИмяОткрываемогоФайла); - ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабличныйДокумент); - - ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия); - Возврат; - КонецЕсли; - - // Открытие Файла. - Попытка - ЗапуститьПриложение(ИмяОткрываемогоФайла); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При открытии файла - |""%1"" - |произошла ошибка: - |""%2"".'"), - ИмяОткрываемогоФайла, - ИнформацияОбОшибке.Описание)); - КонецПопытки; - КонецЕсли; -КонецПроцедуры - -// Обновляет данные файла из файла, выбранного пользователем. -// Используется, как обработчик команды обновления присоединенного файла из другого файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на файл. -// ДанныеФайла - Структура - данные файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьПрисоединенныйФайлПомещениеВыполнено", ЭтотОбъект, ПрисоединенныйФайл); - ВыбратьФайлНаДискеИПоместитьВХранилище(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); - -КонецПроцедуры - -// Продолжение процедуры ОбновитьПрисоединенныйФайл. -Процедура ОбновитьПрисоединенныйФайлПомещениеВыполнено(ИнформацияОФайле, ПрисоединенныйФайл) Экспорт - - Если ИнформацияОФайле = Неопределено - Или Не ИнформацияОФайле.ФайлПомещенВХранилище Тогда - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл(ПрисоединенныйФайл, ИнформацияОФайле); - ОповеститьОбИзменении(ПрисоединенныйФайл); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl index 4749e8f6b..bdabd0977 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область Проверка @@ -12,16 +7,14 @@ // Проверка одного контрагента по ИНН, КПП и Дате. // // Параметры: -// Параметры - Структура - Параметры запуска фонового задания. Ключи структуры: -// "Контрагент" - ОпределяемыйТип.Контрагент - Проверяемый контрагент. -// "ИНН" - Строка - ИНН Контрагента. -// "КПП" - Строка - КПП Контрагента. -// "Дата" - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, -// тогда берется текущая дата. -// "СохранятьРезультатСразуПослеПроверки" - Булево - Признак, указывающий нужно ли результат -// проверки контрагента сразу сохранять в регистр. -// "АдресХранилища" - Строка - Адрес, в который будет помещен результат проверки контрагента. -// АдресХранилища - Строка - Адрес временного хранилища, в который будет помещен результат проверки контрагента. +// Параметры - Структура - Параметры запуска фонового задания. Ключи структуры: +// * Контрагент - ОпределяемыйТип.Контрагент - Проверяемый контрагент. +// * ИНН - Строка - ИНН Контрагента. +// * КПП - Строка - КПП Контрагента. +// * Дата - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, +// тогда берется текущая дата. +// АдресХранилища - Строка - Адрес временного хранилища, в который будет помещен результат проверки контрагента. +// Процедура ПроверитьКонтрагента(Параметры, АдресХранилища) Экспорт // Готовим данные в нужном формате для передачи на проверку. @@ -29,7 +22,8 @@ НоваяСтрока = ДанныеКонтрагентов.Добавить(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - НоваяСтрока.ОбластьДанныхВспомогательныеДанные = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + НоваяСтрока.ОбластьДанныхВспомогательныеДанные = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); КонецЕсли; ЗаполнитьЗначенияСвойств(НоваяСтрока, Параметры); @@ -52,9 +46,9 @@ // Состояние контрагента // // Параметры: -// "ИНН" - Строка - ИНН Контрагента. -// "КПП" - Строка - КПП Контрагента. -// "Дата" - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, +// ИНН - Строка - ИНН Контрагента. +// КПП - Строка - КПП Контрагента. +// Дата - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, // тогда берется текущая дата. // // Возвращаемое значение: @@ -221,7 +215,7 @@ ПроверитьВебСервисомФНС(ДанныеКонтрагентов, ДополнительныеПараметры); // Дозаписываем недостающие ИНН и КПП в регистр в локальном режиме. - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда ПроверитьНепроверенныхКонтрагентов(Ложь); КонецЕсли; @@ -233,7 +227,7 @@ // 2. В режиме сервисов - обновлением ИБ в каждой области отдельно. // // Параметры: -// Параметры - Структура или Неопределено - Параметры очереди заданий в модели сервиса. +// Параметры - Структура, Неопределено - Параметры очереди заданий в модели сервиса. // В локальной версии - Неопределено. Процедура ПроверитьКонтрагентовПослеВключенияПроверки(Параметры = Неопределено) Экспорт @@ -245,7 +239,7 @@ Иначе // Это обновление ИБ. // Обновление должно выполняться только в модели сервиса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ЭтоОбновлениеИБВМоделиСервиса = Истина; Иначе Возврат; @@ -254,7 +248,7 @@ // Дозаписываем недостающие ИНН и КПП в регистр в локальном режиме, // либо в модели сервисов в отложенном обновлении из областей данных. - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда ПроверитьНепроверенныхКонтрагентов(ЭтоОбновлениеИБВМоделиСервиса, Параметры); КонецЕсли; @@ -292,22 +286,22 @@ КонецПроцедуры // Вспомогательный API. Контрагенты проверяются по данным ФНС. -// По завершению проверки в переданную таблицу добавляется колонка c состоянием контрагента. +// По завершению проверки в переданную таблицу добавляется колонка c состоянием контрагента. // // Параметры: -// ДанныеКонтрагентов - ТаблицаЗначений - Таблица, содержащая контрагентов на проверку. -// Колонки таблицы: Контрагент, ИНН, КПП, Дата. -// ВидПроверки - Строка - Может принимать одно следующих значений: -// - ИзКэша - результат проверки выбирается только из кэша. -// - АктуальныеДанные - результат проверки получается только на основе данных, возвращенных веб-сервисом проверки. -// - Смешанный - сначала выбираются данные из кэша, затем идет обращение к веб-сервису проверки. -// ДополнительныеПараметры - Структура - Может содержать один из следующих ключей. -// - ЭтоПроверкаДокумента. Особенность для документов: если дата документа больше текущей, то сервис ФСН -// выдает ошибку. Чтобы такого не было, документы с будущей датой проверяем на текущую дату. -// - ЭтоПроверкаОтчета. Для отчетов предварительная проверка не выполняется, все данные сразу уходят -// на веб-сервис ФНС. -// - ЭтоПроверкаСправочника. Для справочника часть состояний берется из кэша в режиме -// проверки ИзКэша или Смешанный. После проверки данные проверки сохраняются в регистр сведений. +// ПроверяемыеКонтрагенты - ТаблицаЗначений - Таблица, содержащая контрагентов на проверку. +// Колонки таблицы: Контрагент, ИНН, КПП, Дата. +// ВидПроверки - Строка - Может принимать одно следующих значений: +// * ИзКэша - результат проверки выбирается только из кэша. +// * АктуальныеДанные - результат проверки получается только на основе данных, возвращенных веб-сервисом проверки. +// * Смешанный - сначала выбираются данные из кэша, затем идет обращение к веб-сервису проверки. +// ДополнительныеПараметры - Структура - Может содержать один из следующих ключей. +// * ЭтоПроверкаДокумента - Булево - особенность для документов: если дата документа больше текущей, то сервис ФСН +// выдает ошибку. Чтобы такого не было, документы с будущей датой проверяем на текущую дату. +// * ЭтоПроверкаОтчета - Булево - Для отчетов предварительная проверка не выполняется, все данные сразу уходят +// на веб-сервис ФНС. +// * ЭтоПроверкаСправочника - Булево - Для справочника часть состояний берется из кэша в режиме +// проверки ИзКэша или Смешанный. После проверки данные проверки сохраняются в регистр сведений. Процедура ВыполнитьПроверкуКонтрагентов(ПроверяемыеКонтрагенты, Знач ВидПроверки = "Смешанный", Знач ДополнительныеПараметры = Неопределено) Экспорт // Проверка корректности переданного параметра. @@ -351,9 +345,9 @@ // Параметры: // Описание - ТаблицаЗначений - таблица, хранящая описание расположения контрагентов в документе. // Ссылка - ДокументСсылка - Документ, в котором выполняется проверка контрагента. -// Элемент - ЭлементыФормы - Элемент, в котором находится проверяемый контрагент или счет-фактура. +// Элемент - ПолеВвода, ДекорацияФормы - Элемент, в котором находится проверяемый контрагент или счет-фактура. // Контрагент - ОпределяемыйТип.Контрагент - Проверяемый контрагент. -// ЭлементРодитель - ЭлементыФормы - Группа, которая содержит элемент с контрагентом или +// ЭлементРодитель - ГруппаФормы - Группа, которая содержит элемент с контрагентом или // счетом-фактурой. // Данный элемент будет подкрашен по результату проверки контрагентов. Может не указываться. Процедура ДополнитьОписание( @@ -405,6 +399,11 @@ КонецПроцедуры // Устанавливает текст и видимость предупреждения про тестовый режим работы сервиса. +// +// Параметры: +// Элемент - ДекорацияФормы - Элемент, в который выводится информация про +// тестовый режим работы сервиса. +// Процедура УстановитьВидимостьИЗаголовокПредупрежденияПроТестовыйРежим(Элемент) Экспорт Если ТестовыйРежимРаботыСервисаЗавершился() Тогда @@ -434,7 +433,7 @@ // Форма - УправляемаяФорма - Форма отчета, в котором выводится результат проверки контрагентов. Процедура УстановитьНадписиВПанелиОтчетаПриСозданииНаСервере(Форма) Экспорт - СсылкаНаИнструкцию = Новый ФорматированнаяСтрока(" ", ПроверкаКонтрагентовКлиентСерверПовтИсп.СсылкаНаИнструкцию()); + СсылкаНаИнструкцию = Новый ФорматированнаяСтрока(" ", ПроверкаКонтрагентовКлиентСервер.СсылкаНаИнструкцию()); // Все контрагенты корректны ЭлементФормы = Форма.Элементы.Найти("ТекстПриКорректныхКонтрагентах"); @@ -470,7 +469,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов. -// ДополнительныеПараметры - ТаблицаФормы - Если изменения контрагента или даты произошли в табличной части. +// ПараметрыФоновогоЗадания - ТаблицаФормы - Если изменения контрагента или даты произошли в табличной части. // - ПолеФормы - Элемент управления, содержащий контрагента или счет-фактуру, в случае, // если произошло изменение в контрагенте, находящегося в шапке или в счете-фактуре, находящегося в подвале. // - Дата - Дата документа, в случае если произошло изменение даты @@ -701,11 +700,15 @@ КонецПроцедуры -// Формирует описание документа, согласно которому осуществляется проверка контрагентов и вывод -// информации о результатах проверки в форму документа. +// Формирует описание документа, согласно которому осуществляется проверка контрагентов и вывод +// информации о результатах проверки в форму документа. // // Параметры: -// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов. +// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов. +// +// Возвращаемое значение: +// ТаблицаЗначений - Таблица описания документа. +// Функция ОписаниеДокументов(Форма) Экспорт Если НЕ Форма.РеквизитыПроверкиКонтрагентов.ИнициализацияВыполненаПолностью Тогда @@ -1000,7 +1003,7 @@ // КПП - Строка - ИНН контрагента. // Дата - Дата - Дата, на которую необходимо выполнять проверку контрагента. // Возвращаемое значение: -// Булево - Истина, если данную строку необходимо выводить в отчете по некорректным контрагентам. +// Булево - Истина, если данную строку необходимо выводить в отчете по некорректным контрагентам. Функция ВыводитьСтрокуОтчета(СтруктураПараметров, Контрагент, ИНН, КПП, Дата) Экспорт Если НЕ ЭтоОтчетПоНекорректнымКонтрагентам(СтруктураПараметров) Тогда @@ -1322,7 +1325,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы. // ТекущийНомерРаздела - Число - Номер раздела для вывода (для отчетов с разделами). Процедура ОтобразитьРезультатПроверкиКонтрагентаВОтчете(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета, ТекущийНомерРаздела = Неопределено) Экспорт @@ -1399,7 +1402,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы. Процедура ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета) Экспорт @@ -1430,7 +1433,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // НомерРаздела - Число - Номер раздела для вывода. // Процедура ВывестиРазделОтчета(Форма, ПолеТабличногоДокумента, НомерРаздела) Экспорт @@ -1462,7 +1465,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы. Процедура ПереключитьРежимОтображенияОтчета(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета) Экспорт @@ -1478,7 +1481,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // НомерРаздела - Число - Номер раздела, который необходимо отобразить. Процедура ПереключитьРежимОтображенияРазделаОтчета(Форма, ПолеТабличногоДокумента, НомерРаздела) Экспорт @@ -1595,8 +1598,11 @@ // Функция возвращает таблицу разделов отчета из результата выполнения фонового задания. // // Параметры: -// РезультатВыполненияЗадания - Структура - Результат выполнения фонового задания. -// ТолькоНекорректныеКонтрагенты - Булево - Признак вывода только строк с некорректными контрагентами. +// РезультатВыполненияЗадания - Структура - Результат выполнения фонового задания. +// ТолькоНекорректныеКонтрагенты - Булево - Признак вывода только строк с некорректными контрагентами. +// +// Возвращаемое значение: +// ТаблицаЗначений - Описание разделов отчета. // Функция РазделыОтчета(РезультатВыполненияЗадания, ТолькоНекорректныеКонтрагенты = Ложь) Экспорт @@ -1640,11 +1646,14 @@ // Функция возвращает таблицу разделов отчета для формы. // // Параметры: -// Форма - УправляемаяФорма - Форма отчета. -// РезультатВыполненияЗадания - Структура, Неопределено - Результат выполнения фонового задания. -// Если не Неопределено, то результат будет прочитан из временного хранилища. -// ТолькоНекорректныеКонтрагенты - Булево, Неопределено - Признак вывода только строк с некорректными контрагентами. -// Если Неопределено, то используется настройка формы "ВыведеныВсеСтроки". +// Форма - УправляемаяФорма - Форма отчета. +// РезультатВыполненияЗадания - Структура, Неопределено - Результат выполнения фонового задания. +// Если не Неопределено, то результат будет прочитан из временного хранилища. +// ТолькоНекорректныеКонтрагенты - Булево, Неопределено - Признак вывода только строк с некорректными контрагентами. +// Если Неопределено, то используется настройка формы "ВыведеныВсеСтроки". +// +// Возвращаемое значение: +// ТаблицаЗначений - Описание разделов отчета. // Функция РазделыОтчетаВФорме(Форма, Знач РезультатВыполненияЗадания = Неопределено, Знач ТолькоНекорректныеКонтрагенты = Неопределено) Экспорт @@ -1683,7 +1692,9 @@ // Проверка наличия доступа к проверке контрагентов, запуск проверки. // // Параметры: -// Форма - УправляемаяФорма - Карточка контрагента. +// Форма - УправляемаяФорма - Карточка контрагента. +// Параметры - Структура - Параметры из процедуры ПриСозданииНаСервере. +// Процедура ПриСозданииНаСервереКонтрагент(Форма, Параметры) Экспорт ИнициализироватьРеквизитыФормыКонтрагент(Форма); @@ -1849,7 +1860,7 @@ Запрос.УстановитьПараметр("Контрагенты", Контрагенты); КонецЕсли; - Запрос.УстановитьПараметр("ЭтоМодельСервисов", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + Запрос.УстановитьПараметр("ЭтоМодельСервисов", ОбщегоНазначения.РазделениеВключено()); Запрос.УстановитьПараметр("КонтрагентНеПодлежитПроверке", Перечисления.СостоянияСуществованияКонтрагента.КонтрагентНеПодлежитПроверке); Запрос.УстановитьПараметр("ПустаяСсылка", Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка()); @@ -1929,110 +1940,14 @@ #КонецОбласти -#Область ОбновлениеИБИПодпискаНаПрограммныеСобытия - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ПроверкаКонтрагентов"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "ПроверкаКонтрагентов"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанных"].Добавить( - "ПроверкаКонтрагентов"); - КонецЕсли; - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[Событие].Добавить("ПроверкаКонтрагентов"); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.5.14"; - Обработчик.Процедура = "ПроверкаКонтрагентов.ВключитьПроверкуКонтрагентовДляРежимаСервисов"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.ОбщиеДанные = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.5.14"; - Обработчик.Процедура = "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("c4bcb537-61e2-4fbf-af66-a5854048948f"); - Обработчик.Комментарий = НСтр("ru = 'Проверяет существование контрагентов по базе ФНС. - |До завершения выполнения существование контрагента может быть определено не для всех контрагентов'"); - -КонецПроцедуры - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие - -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"); - -КонецПроцедуры - -// Вызывается после загрузки данных. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// -Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода", "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"); - ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3); - - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - КонецЕсли; - - Иначе - - // Запуск фонового задания после включения проверки не требуется. - ВключитьВыключитьПроверкуКонтрагентов(Истина); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - #Область НастройкиПроверки // Включение или отключение использования сервиса путем установки значения константе -// ИспользоватьПроверкуКонтрагентов. +// ИспользоватьПроверкуКонтрагентов. // // Параметры: -// ИспользоватьСервис - Булево - Истина, чтобы включить использование сервиса. Ложь - чтобы отключить. +// ВключитьПроверку - Булево - Включить или отключить проверку контрагентов. +// Процедура ВключитьВыключитьПроверкуКонтрагентов(ВключитьПроверку) Экспорт Если ВключитьПроверку Тогда @@ -2066,7 +1981,7 @@ // Метод обновления информационной базы для режима сервисов. Процедура ВключитьПроверкуКонтрагентовДляРежимаСервисов() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда // Запуск фонового задания после включения проверки не требуется. ВключитьВыключитьПроверкуКонтрагентов(Истина); КонецЕсли; @@ -2138,7 +2053,7 @@ Прокси, ДанныеКонтрагента); - NdsResponse = ОтветСервисаФНС(Прокси, WSЗапрос, Истина); + NdsResponse = ОтветСервисаФНС(Прокси, WSЗапрос); Если NdsResponse = Неопределено Тогда Возврат Ложь; @@ -2216,30 +2131,17 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. описание процедуры СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. -Процедура СобратьСтатистикуКонфигурации() Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - Возврат; - КонецЕсли; - - МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("ИспользуетсяПроверкаКонтрагентов", - Константы.ИспользоватьПроверкуКонтрагентов.Получить()); - -КонецПроцедуры - // Метод фонового задания по проверке контрагента из формы контрагента. // // Параметры: // Параметры - Структура - Параметры запуска фонового задания. Ключи структуры: -// "Контрагент" - ОпределяемыйТип.Контрагент - Проверяемый контрагент. -// "ИНН" - Строка - ИНН Контрагента -// "КПП" - Строка - КПП Контрагента -// "Дата" - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, тогда берется текущая +// Контрагент - ОпределяемыйТип.Контрагент - Проверяемый контрагент. +// ИНН - Строка - ИНН Контрагента +// КПП - Строка - КПП Контрагента +// Дата - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, тогда берется текущая // дата "СохранятьРезультатСразуПослеПроверки" - Булево - Признак, указывающий нужно ли результат // проверки контрагента сразу сохранять в регистр -// "АдресХранилища" - Строка - Адрес, в который будет помещен результат проверки контрагента. +// АдресХранилища - Строка - Адрес, в который будет помещен результат проверки контрагента. Процедура ПроверитьКонтрагентаФоновоеЗадание(Параметры) Экспорт // Присвоение даты находится здесь, так как ТекущаяДатаСеанса работает только на сервере. @@ -2260,17 +2162,58 @@ КонецПроцедуры -#КонецОбласти +#Область ОбработчикиСобытийПодсистемКонфигурации -#Область СлужебныеПроцедурыИФункции +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.5.14"; + Обработчик.Процедура = "ПроверкаКонтрагентов.ВключитьПроверкуКонтрагентовДляРежимаСервисов"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.ОбщиеДанные = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.5.14"; + Обработчик.Процедура = "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("c4bcb537-61e2-4fbf-af66-a5854048948f"); + Обработчик.Комментарий = НСтр("ru = 'Проверяет существование контрагентов по базе ФНС. + |До завершения выполнения существование контрагента может быть определено не для всех контрагентов'"); + +КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("ИмяМетода", "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки"); + ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3); + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + КонецЕсли; + + Иначе + + // Запуск фонового задания после включения проверки не требуется. + ВключитьВыключитьПроверкуКонтрагентов(Истина); + + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт // 2.3.3.33 @@ -2282,6 +2225,25 @@ КонецПроцедуры +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +Процедура СобратьСтатистикуКонфигурации() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + Возврат; + КонецЕсли; + + МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("ИспользуетсяПроверкаКонтрагентов", + Константы.ИспользоватьПроверкуКонтрагентов.Получить()); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + #Область РаботаСВебСервисом // Значения настроек @@ -2315,18 +2277,12 @@ Исключение - КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. - ИнформацияОбОшибке = ИнформацияОбОшибке(); - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Проверка контрагентов.Ошибка доступа к веб-сервису'", КодОсновногоЯзыка), - УровеньЖурналаРегистрации.Предупреждение, - , - , - Комментарий); + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Ошибка доступа к веб-сервису'", КодОсновногоЯзыка), + УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; + КонецПопытки; Возврат WSПрокси; @@ -2388,31 +2344,16 @@ КонецПроцедуры -Функция ОтветСервисаФНС(Прокси, WSЗапрос, ПроверкаДоступностиСервиса = Ложь) +Функция ОтветСервисаФНС(Прокси, WSЗапрос) // Получаем результат проверки от сервиса. Попытка NdsResponse = Прокси.NdsRequest2(WSЗапрос); Исключение - Если ПроверкаДоступностиСервиса Тогда - ШаблонОшибки = НСтр("ru = 'Веб-сервис %1 недоступен по причине:'"); - Иначе - ШаблонОшибки = НСтр("ru = 'Веб-сервис %1 не вернул результат проверки данных по причине:'") - КонецЕсли; - - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, - Прокси.ТочкаПодключения.Местоположение); - - ТекстОшибки = ТекстОшибки + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - // Страхуемся от ошибки "Timeout was reached". - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Проверка контрагентов.NdsRequest2'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение, - , - , - ТекстОшибки); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.NdsRequest2'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); NdsResponse = Неопределено; @@ -2452,16 +2393,9 @@ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.КонтрагентСодержитОшибкиВДанных; - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Проверка контрагентов.Формирование данных для обращения к сервису ФНС'", КодОсновногоЯзыка), - УровеньЖурналаРегистрации.Предупреждение, - , - , - Комментарий); - + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. + ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Формирование данных для обращения к сервису ФНС'", КодОсновногоЯзыка), + УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры @@ -2471,7 +2405,13 @@ ДанныеКонтрагентовДляПроверкиСервисом, МинимальныйНомерКонтрагента, МаксимальныйНомерКонтрагента) + + ВозвращенОтветПоВсемКонтрагентам = СервисВернулОтветПоВсемКонтрагентам(МаксимальныйНомерКонтрагента, NdsResponse); + Если НЕ ВозвращенОтветПоВсемКонтрагентам Тогда + Возврат; + КонецЕсли; + ИндексТекущегоОтвета = 0; Для ИндексТекущегоКонтрагента = МинимальныйНомерКонтрагента По МаксимальныйНомерКонтрагента Цикл ДанныеКонтрагента = ДанныеКонтрагентовДляПроверкиСервисом[ИндексТекущегоКонтрагента]; @@ -2488,15 +2428,11 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); - КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. ЗаписьЖурналаРегистрации( - НСтр("ru = 'Проверка контрагентов.Обработка ответа от веб-сервиса'", КодОсновногоЯзыка), - УровеньЖурналаРегистрации.Предупреждение, - , - , - Комментарий); + НСтр("ru = 'Проверка контрагентов.Обработка ответа от веб-сервиса'", КодОсновногоЯзыка), + УровеньЖурналаРегистрации.Ошибка,,, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; @@ -2507,6 +2443,32 @@ КонецПроцедуры +Функция СервисВернулОтветПоВсемКонтрагентам(МаксимальныйНомерКонтрагента, NdsResponse) + + КоличествоЗапрошенныхОтветов = МаксимальныйНомерКонтрагента + 1; + КоличествоПолученныхОтветов = NdsResponse.NP.Количество(); + + ВозвращенОтветПоВсемКонтрагентам = КоличествоЗапрошенныхОтветов = КоличествоПолученныхОтветов; + + Если НЕ ВозвращенОтветПоВсемКонтрагентам Тогда + + ТекстОшибки = НСтр("ru = 'Сервис ФНС вернул ответы не по всем контрагентам. + |Должно быть %1 ответов, сервис ФНС вернул %2.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, КоличествоЗапрошенныхОтветов, КоличествоПолученныхОтветов); + + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации. + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Проверка контрагентов.Обработка ответа от веб-сервиса'", КодОсновногоЯзыка), + УровеньЖурналаРегистрации.Ошибка,,, + ТекстОшибки); + + КонецЕсли; + + Возврат ВозвращенОтветПоВсемКонтрагентам; + +КонецФункции + #Область НастройкиВебСервиса Функция ПолучитьWSПрокси(Таймаут) @@ -2877,9 +2839,9 @@ // Процедура ОставитьРазрешенныхКонтрагентов(ДанныеКонтрагентов) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + ИЛИ НЕ ОбщегоНазначения.РазделениеВключено() Тогда ДополнительныеПараметрыДанныхКонтрагентов = ЗапомнитьДополнительныеПараметрыДанныхКонтрагентов(ДанныеКонтрагентов); @@ -3023,7 +2985,7 @@ Если ТипЗнч(ДополнительныеПараметрыПроверки) = Тип("Структура") И ДополнительныеПараметрыПроверки.Свойство("ВыполнятьПредварительнуюПроверкуКонтрагента") - И ДополнительныеПараметрыПроверки.ВыполнятьПредварительнуюПроверкуКонтрагента Тогда + И ДополнительныеПараметрыПроверки.ВыполнятьПредварительнуюПроверкуКонтрагента = Ложь Тогда Возврат; @@ -3043,9 +3005,9 @@ ДлинаИНН = СтрДлина(СокрЛП(ДанныеКонтрагента.ИНН)); // Обращение к реквизитам справочника возможно только из разделенного сеанса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + ИЛИ НЕ ОбщегоНазначения.РазделениеВключено() Тогда ЭтоЮридическоеЛицо = Ложь; СтандартнаяОбработка = Истина; @@ -3068,9 +3030,9 @@ ЯвляетсяИностранным = Ложь; // Обращение к реквизитам справочника возможно только из разделенного сеанса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + ИЛИ НЕ ОбщегоНазначения.РазделениеВключено() Тогда РаботаСКонтрагентамиПереопределяемый.ОпределитьЯвляетсяЛиКонтрагентИностранным(ДанныеКонтрагента, ЯвляетсяИностранным); @@ -3376,7 +3338,8 @@ Запрос.Текст = Текст; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); КонецЕсли; Запрос.УстановитьПараметр("Дата", НачалоДня(ТекущаяДатаСеанса())); @@ -3472,8 +3435,6 @@ "Состояние"); КонецЕсли; - ДобавитьИндексыТаблицыДанныеКонтрагента(ДанныеКонтрагентов); - Для каждого ПроверяемыйКонтрагент Из ПроверяемыеКонтрагенты Цикл ДополнительныеПараметры = Новый Структура(); @@ -3574,7 +3535,8 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда ДобавитьКолонкуОбластьДанных(ДанныеКонтрагентов); - ДанныеКонтрагентов.ЗаполнитьЗначения(ОбщегоНазначения.ЗначениеРазделителяСеанса(), "ОбластьДанныхВспомогательныеДанные"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ДанныеКонтрагентов.ЗаполнитьЗначения(МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), "ОбластьДанныхВспомогательныеДанные"); КонецЕсли; // Удаляем пустую колонку из исходной таблицы. @@ -3623,7 +3585,7 @@ НужноПоказатьПредложение = // В модели сервисов предложение не показываем. - НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + НЕ ОбщегоНазначения.РазделениеВключено() // Проверяем наличие прав И (ЕстьПравоНаИспользованиеПроверки() ИЛИ ЕстьПравоНаРедактированиеНастроек()) @@ -3700,8 +3662,6 @@ // Область данных ДобавитьКолонкуОбластьДанных(ДанныеКонтрагентов); - ДобавитьИндексыТаблицыДанныеКонтрагента(ДанныеКонтрагентов); - Возврат ДанныеКонтрагентов; КонецФункции @@ -4180,7 +4140,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - ДанныеКонтрагентов.ЗаполнитьЗначения(ОбщегоНазначения.ЗначениеРазделителяСеанса(), "ОбластьДанныхВспомогательныеДанные"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ДанныеКонтрагентов.ЗаполнитьЗначения(МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), "ОбластьДанныхВспомогательныеДанные"); КонецЕсли; Возврат ДанныеКонтрагентов; @@ -5443,7 +5404,8 @@ ДанныеКонтрагента.Вставить("Состояние", СостояниеКонтрагента); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - ДанныеКонтрагента.Вставить("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ДанныеКонтрагента.Вставить("ОбластьДанныхВспомогательныеДанные", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); КонецЕсли; УстановитьПривилегированныйРежим(Истина); diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/Module.bsl index 2e463e600..efcdf71e4 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Запуск фонового задания по проверке контрагента в карточке контрагента. @@ -23,7 +18,7 @@ Параметры.Добавить(ПараметрыЗапуска); ФоновыеЗадания.Выполнить("ПроверкаКонтрагентов.ПроверитьКонтрагентаФоновоеЗадание", - Параметры, ПараметрыЗапуска.ИНН + " " + ПараметрыЗапуска.КПП, НСтр("ru = 'Проверка контрагента'")); + Параметры,, НСтр("ru = 'Проверка контрагента'")); Исключение @@ -52,6 +47,31 @@ КонецФункции +#Область ПроцедурыПовтИсп + +// Определение цветов выделения результатов проверки контрагентов. +// +// Возвращаемое значение: +// Структура - Имена ключей - это названия цветов, которые необходимо определить. +// Список ключей см ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки(). +Функция ЦветаРезультатовПроверки() Экспорт + + Возврат ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки(); + +КонецФункции + +// Проверяет, что проверка включена и есть необходимые права. +// Возвращаемое значение: +// Булево - Истина, если есть нужные права на проверку и проверка включена. +// +Функция ИспользованиеПроверкиВозможно() Экспорт + + Возврат ПроверкаКонтрагентовВызовСервераПовтИсп.ИспользованиеПроверкиВозможно(); + +КонецФункции + +#КонецОбласти + #Область ОпределениеСостоянияКонтрагента // На основе результата предыдущей проверки (записи в регистр) определяет, @@ -85,7 +105,7 @@ // ИНН - Строка - ИНН контрагента. // КПП - Строка - КПП контрагента. // Возвращаемое значение: -// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента. +// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента. // Функция ТекущееСохраненноеСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП) Экспорт @@ -214,21 +234,6 @@ #КонецОбласти -#Область УстаревшиеПроцедурыИФункции - -// Проверяет, что проверка включена и есть необходимые права. -// Возвращаемое значение: -// Булево - Истина, если есть нужные права на проверку и проверка включена. -// -Функция ИспользованиеПроверкиВозможно() Экспорт - - Возврат ПроверкаКонтрагентов.ЕстьПравоНаИспользованиеПроверки() - И ПроверкаКонтрагентов.ПроверкаКонтрагентовВключена(); - -КонецФункции - -#КонецОбласти - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -256,7 +261,8 @@ Процедура ЗапомнитьРезультатПроверкиСправочникаПослеПредварительнойПроверки(ДанныеКонтрагента, ДополнительныеПараметры) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - ДанныеКонтрагента.Вставить("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ДанныеКонтрагента.Вставить("ОбластьДанныхВспомогательныеДанные", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); КонецЕсли; ДанныеКонтрагентов = Новый Массив; diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/Module.bsl index 52c8f3936..e8688fd8e 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/Module.bsl @@ -1,10 +1,7 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + // Определение цветов выделения результатов проверки контрагентов. // // Возвращаемое значение: @@ -50,6 +47,8 @@ И ПроверкаКонтрагентов.ПроверкаКонтрагентовВключена(); КонецФункции - + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl index 750efaf8b..9ab0a9e9d 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область Проверка @@ -54,7 +49,7 @@ // АдресХранилища - Строка - Адрес временного хранилища, в котором может содержаться // результат проверки контрагента. // Возвращаемое значение: -// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента. +// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента. // Функция ТекущееСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП, АдресХранилища = Неопределено) Экспорт @@ -150,7 +145,7 @@ // Параметр - Произвольный - Параметр обработки оповещения. // Источник - Произвольный - Источник обработки оповещения. // Возвращаемое значение: -// Булево - требует ли событие, вызванное оповещением, запуска проверки контрагентов. +// Булево - требует ли событие, вызванное оповещением, запуска проверки контрагентов. Функция СобытиеТребуетПроверкиКонтрагента(Форма, ИмяСобытия, Параметр, Источник) Экспорт ТребуетсяПроверкаКонтрагентов = Ложь; @@ -177,7 +172,8 @@ И ДополнительныеПараметры.ЭтоПроверкаПоКнопке; Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаКонтрагентовПриОткрытии = - НЕ Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаПоКнопке; + Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаКонтрагентовПриОткрытии + И НЕ Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаПоКнопке; // Для предотвращения проверки при отключенной автоматической проверке, // когда меняется контрагент в документе. @@ -494,6 +490,8 @@ // Форма - УправляемаяФорма - Карточка контрагента. Процедура ОбработатьРезультатПроверкиКонтрагентовВСправочнике(Форма) Экспорт + ПроверкаКонтрагентовКлиентСервер.ПредотвратитьСбросРедактируемогоЗначения(Форма); + СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты(); // Определение объекта и ссылки. @@ -504,8 +502,20 @@ ИНН = КонтрагентОбъект[СвойстваСправочника.ИНН]; КПП = КонтрагентОбъект[СвойстваСправочника.КПП]; - Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента = - ТекущееСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП, Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища); + Если Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаПоКнопке + И НЕ ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента) + И Форма.РеквизитыПроверкиКонтрагентов.ФоновоеЗаданиеЗапущено Тогда + + // Если это проверка по кнопке то результат получаем только из адреса временного хранилища. + Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента = + ТекущееСостояниеКонтрагента(Неопределено, Неопределено, Неопределено, Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища); + + Иначе + + Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента = + ТекущееСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП, Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища); + + КонецЕсли; ОбработатьСостояниеКонтрагентаВСправочнике(Форма); @@ -656,11 +666,6 @@ ЗакрытьФормуДлительнойОперацииВСправочнике(Форма); - Если Форма.РеквизитыПроверкиКонтрагентов.ЭтоПроверкаПоКнопке - И НЕ ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента) Тогда - УведомитьОбОтсутствииДоступа(); // в справочнике - КонецЕсли; - Иначе ПроверкаКонтрагентовКлиентСервер.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма); diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/Module.bsl index 4e5d5dab9..6edeba339 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Установить текст подсказки в документе. @@ -171,7 +166,7 @@ // Параметры: // ТаблицаФормы - ТаблицаФормы - Таблица формы, в которой располагается колонка с контрагентом. // Возвращаемое значение: -// Строка - Имя колонки с признаком, корректный ли это контрагент. +// Строка - Имя колонки с признаком, корректный ли это контрагент. // Функция ИмяПоляКартинки(ТаблицаФормы) Экспорт Возврат ТаблицаФормы.Имя + "ЭтоНекорректныйКонтрагент"; @@ -285,7 +280,7 @@ КонецЕсли; Подстроки.Добавить(Символы.ПС); - Подстроки.Добавить(ПроверкаКонтрагентовКлиентСерверПовтИсп.СсылкаНаИнструкцию()); + Подстроки.Добавить(СсылкаНаИнструкцию()); Результат = Новый Структура; Результат.Вставить("Текст", Новый ФорматированнаяСтрока(Подстроки)); @@ -517,6 +512,134 @@ КонецПроцедуры +// Ссылка на инструкцию по проверке контрагентов. +// Возвращаемое значение: +// ФорматированнаяСтрока - Ссылка на инструкцию. +// +Функция СсылкаНаИнструкцию() Экспорт + Возврат Новый ФорматированнаяСтрока(НСтр("ru = 'Подробнее о проверке'"),,,, ПутьКИнструкции()); +КонецФункции + +// Путь к инструкции по проверке контрагентов. +// Возвращаемое значение: +// Строка - Путь к инструкции по проверке контрагентов. +// +Функция ПутьКИнструкции() Экспорт + Возврат "e1cib/app/Обработка.ИнструкцияПоИспользованиюПроверкиКонтрагента"; +КонецФункции + +#Область ПроцедурыПовтИсп + +// Определение по состоянию, является ли контрагент действующим. +// +// Параметры: +// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента. +// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим. +// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим. +// Возвращаемое значение: +// Булево - Является ли контрагент действующим. +// +Функция ЭтоСостояниеДействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой = Истина, ДополнятьПустымСостоянием = Истина) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеДействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием); + +КонецФункции + +// Перечень состояний действующего контрагента. +// +// Параметры: +// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим. +// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим. +// Возвращаемое значение: +// Массив - Состояния контрагента, при которых он является действующим. +// +Функция СостоянияДействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Истина, ДополнятьПустымСостоянием = Истина) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияДействующегоКонтрагента(ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием); + +КонецФункции + +// Определение по состоянию, является ли контрагент недействующим. +// +// Параметры: +// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента. +// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается недействующим. +// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается недействующим. +// Возвращаемое значение: +// Булево - Является ли контрагент недействующим. +// +Функция ЭтоСостояниеНедействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой = Ложь, ДополнятьПустымСостоянием = Ложь) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием); + +КонецФункции + +// Перечень состояний недействующего контрагента. +// +// Параметры: +// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим. +// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим. +// Возвращаемое значение: +// Массив - Состояния контрагента, при которых он является действующим. +// +Функция СостоянияНедействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Ложь, ДополнятьПустымСостоянием = Ложь) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияНедействующегоКонтрагента(ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием); + +КонецФункции + +// Определение по состоянию, имеет ли контрагент ошибки в данных. +// +// Параметры: +// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента. +// +// Возвращаемое значение: +// Булево - Имеет ли контрагент ошибки. +// +Функция ЭтоСостояниеКонтрагентаСОшибкой(Состояние) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеКонтрагентаСОшибкой(Состояние); + +КонецФункции + +// Перечень состояний контрагента с ошибками в данных. +// +// Возвращаемое значение: +// Массив - Состояния контрагента, при которых он имеет ошибки в данных. +// +Функция СостоянияКонтрагентаСОшибкой() Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияКонтрагентаСОшибкой(); + +КонецФункции + +// Перечень недействующих состояний и состояний с ошибками. +// +// Возвращаемое значение: +// Массив - Состояния контрагента, при которых он имеет ошибки в данных. +// +Функция НекорректныеСостоянияКонтрагента() Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.НекорректныеСостоянияКонтрагента(); + +КонецФункции + +// Является ли состояние некорректным (недействующее состояние или с ошибкой). +// +// Параметры: +// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента. +// +// Возвращаемое значение: +// Булево - Имеет ли контрагент ошибки. +// +Функция ЭтоНекорректноеСостояниеКонтрагента(Состояние) Экспорт + + Возврат ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоНекорректноеСостояниеКонтрагента(Состояние); + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область ВспомогательныеПроцедурыИФункции @@ -780,7 +903,7 @@ МассивПодстрок.Добавить(Новый ФорматированнаяСтрока( СтрокаСРезультатом,, ЦветТекста,, - ПроверкаКонтрагентовКлиентСерверПовтИсп.ПутьКИнструкции())); + ПутьКИнструкции())); Результат = Новый ФорматированнаяСтрока(МассивПодстрок); diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl index a6c93c165..859ebd5c8 100644 --- a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl @@ -1,10 +1,7 @@ -//////////////////////////////////////////////////////////////////////////////// -// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + // Определение по состоянию, является ли контрагент действующим. // // Параметры: @@ -28,7 +25,7 @@ // ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим. // ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим. // Возвращаемое значение: -// Массив - Состояния контрагента, при которых он является действующим. +// Массив - Состояния контрагента, при которых он является действующим. // Функция СостоянияДействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Истина, ДополнятьПустымСостоянием = Истина) Экспорт @@ -64,7 +61,7 @@ // ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим. // ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим. // Возвращаемое значение: -// Массив - Состояния контрагента, при которых он является действующим. +// Массив - Состояния контрагента, при которых он является действующим. // Функция СостоянияНедействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Ложь, ДополнятьПустымСостоянием = Ложь) Экспорт @@ -128,6 +125,9 @@ КонецФункции // Является ли состояние некорректным (недействующее состояние или с ошибкой). +// +// Параметры: +// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента. // // Возвращаемое значение: // Булево - Имеет ли контрагент ошибки. @@ -139,7 +139,6 @@ КонецФункции - // Ссылка на инструкцию по проверке контрагентов. // Возвращаемое значение: // ФорматированнаяСтрока - Ссылка на инструкцию. @@ -158,6 +157,8 @@ #КонецОбласти +#КонецОбласти + #Область ВспомогательныеПроцедурыИФункции Процедура ДобавитьДополнительныеСостояния(МассивСостояний, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием) diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl index 24d12657b..78c825bc3 100644 --- a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Проверка легальности получения обновления". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Запрашивает у пользователя диалог с подтверждением легальности полученного @@ -17,7 +12,7 @@ // Процедура ПоказатьПроверкуЛегальностиПолученияОбновления(Оповещение, ЗавершатьРаботуСистемы = Ложь) Экспорт - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда ВыполнитьОбработкуОповещения(Оповещение, Истина); Возврат; КонецЕсли; @@ -34,12 +29,13 @@ #Область СлужебныйПрограммныйИнтерфейс -// Проверить легальность получения обновления при запуске программы. -// Должна вызываться перед обновлением информационной базы. -// -Процедура ПроверитьЛегальностьПолученияОбновленияПриЗапуске(Параметры) Экспорт +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Проверить легальность получения обновления при запуске программы. + // Процедура должна вызываться перед обновлением информационной базы. + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если Не ПараметрыКлиента.Свойство("ПроверитьЛегальностьПолученияОбновления") Тогда Возврат; @@ -51,7 +47,7 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПроверитьЛегальностьПолученияОбновленияПриЗапуске. -Процедура ИнтерактивнаяОбработкаПроверкиЛегальностиПолученияОбновления(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПроверкиЛегальностиПолученияОбновления(Параметры, Контекст) Экспорт ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПрограммноеОткрытие", Истина); diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl index 43484babf..19d941df9 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка работы с включенными профилями безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -130,7 +123,7 @@ // компонента, // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // -// Возвращаемое значение +// Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. // Предназначен только для передачи в качестве параметра в функции. // РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), @@ -153,7 +146,8 @@ // // Параметры: // Имя - Строка - имя расширения конфигурации, -// КонтрольнаяСумма - Строка - контрольная сумма расширения конфигурации. +// КонтрольнаяСумма - Строка - контрольная сумма расширения конфигурации, +// Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. @@ -177,8 +171,8 @@ // Возвращает внутреннее описание разрешения на использование приложения операционной системы. // // Параметры: -// ШаблонСтрокиЗапуска - Строка - шаблон строки запуска приложения. Подробнее см. документацию -// к платформе, +// ШаблонСтрокиЗапуска - Строка - шаблон строки запуска приложения. +// Подробнее см. документацию к платформе. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: @@ -203,8 +197,7 @@ // Возвращает внутреннее описание разрешения на использование интернет-ресурса. // // Параметры: -// Протокол: Строка - протокол, по которому выполняется взаимодействие с ресурсом. Допустимые -// значения: +// Протокол - Строка - протокол, по которому выполняется взаимодействие с ресурсом. Допустимые значения: // IMAP, // POP3, // SMTP, @@ -250,7 +243,8 @@ // Параметры: // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // -// Возвращаемое значение: ОбъектXDTO - внутреннее описание запрашиваемого разрешения. +// Возвращаемое значение: +// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. // Предназначен только для передачи в качестве параметра в функции. // РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), // РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и @@ -273,7 +267,7 @@ // Создает запрос на использование внешних ресурсов. // // Параметры: -// НовыеРазрешения - Массив(ОбъектXDTO) - массив ОбъектовXDTO, соответствующих внутренним описаниям +// НовыеРазрешения - Массив - массив ОбъектовXDTO, соответствующих внутренним описаниям // запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые // в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). // Владелец - ЛюбаяСсылка - ссылка на объект информационной базы, с которой логически связаны запрашиваемые @@ -288,7 +282,7 @@ // очистка всех разрешений, ранее запрошенных для этого же владельца. // // Возвращаемое значение: -// УникальныйИдентификатор, ссылка на записанный в ИБ запрос разрешений. После создания +// УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания // всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. // РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // @@ -311,12 +305,12 @@ // связаны с соответствующими узлами планов обмена и т.д. В том случае, если разрешение является логически // обособленным (например, отменяемые разрешения регулируется значением константы с типом Булево) - // рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных, -// ОтменяемыеРазрешения - Массив(ОбъектXDTO) - массив ОбъектовXDTO, соответствующих внутренним описаниям +// ОтменяемыеРазрешения - Массив - массив ОбъектовXDTO, соответствующих внутренним описаниям // отменяемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые // в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). // // Возвращаемое значение: -// УникальныйИдентификатор, ссылка на записанный в ИБ запрос разрешений. После создания +// УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания // всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. // РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // @@ -342,7 +336,7 @@ // рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных. // // Возвращаемое значение: -// УникальныйИдентификатор, ссылка на записанный в ИБ запрос разрешений. После создания +// УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания // всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. // РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // @@ -362,7 +356,8 @@ // Проверят установленность безопасного режима, игнорируя безопасный режим профиля безопасности, // использующегося в качестве профиля безопасности с уровнем привилегий конфигурации. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево - Истина, если безопасный режим установлен. // Функция УстановленБезопасныйРежим() Экспорт @@ -390,17 +385,81 @@ КонецФункции -// Вычисляет переданное выражение, предварительно устанавливая безопасный режим выполнения кода -// и безопасный режим разделения данных для всех разделителей, присутствующих в составе конфигурации. -// В результате при вычислении выражения: -// - игнорируются попытки установки привилегированного режима, -// - запрещаются все внешние (по отношению к платформе 1С:Предприятие) действия (COM, -// загрузка внешних компонент, запуск внешних приложений и команд операционной системы, -// доступ к файловой системе и Интернет-ресурсам), -// - запрещается отключение использования разделителей сеанса, -// - запрещается изменение значений разделителей сеанса (если разделение данным разделителем не -// является условно выключенным), -// - запрещается изменение объектов, которые управляют состоянием условного разделения. +//////////////////////////////////////////////////////////////////////////////// +// Прочее +// + +// Создает запросы на обновление разрешений конфигурации. +// +// Параметры: +// ВключаяЗапросСозданияПрофиляИБ - Булево - включать в результат запрос на создание профиля безопасности +// для текущей информационной базы. +// +// Возвращаемое значение: +// Массив - идентификаторы запросов для обновления разрешений +// конфигурации до требуемых в настоящий момент. +// +Функция ЗапросыОбновленияРазрешенийКонфигурации(Знач ВключаяЗапросСозданияПрофиляИБ = Истина) Экспорт + + Возврат РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(ВключаяЗапросСозданияПрофиляИБ); + +КонецФункции + +// Возвращает контрольные суммы файлов комплекта внешней компоненты, поставляемого в макете конфигурации. +// +// Параметры: +// ИмяМакета - Строка - имя макета конфигурации, в составе которого поставляется комплект внешней компоненты. +// +// Возвращаемое значение: +// ФиксированноеСоответствие - контрольные суммы файлов: +// * Ключ - Строка - имя файла, +// * Значение - Строка - контрольная сумма. +// +Функция КонтрольныеСуммыФайловКомплектаВнешнейКомпоненты(Знач ИмяМакета) Экспорт + + Возврат РаботаВБезопасномРежимеСлужебный.КонтрольныеСуммыФайловКомплектаВнешнейКомпоненты(ИмяМакета); + +КонецФункции + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ОбщегоНазначения.ВыполнитьМетодКонфигурации. +// +// Параметры: +// ИмяМетода - Строка - имя экспортной процедуры в формате +// <имя объекта>.<имя процедуры>, где <имя объекта> - это +// общий модуль или модуль менеджера объекта. +// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> +// в порядке расположения элементов массива. +// +Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, Параметры); +КонецПроцедуры + +// Устарела. Следует использовать ОбщегоНазначения.ВыполнитьМетодОбъекта. +// +// Параметры: +// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект), +// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки. +// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры> в порядке расположения элементов массива. +// +Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + ОбщегоНазначения.ВыполнитьМетодОбъекта(Объект, ИмяМетода, Параметры); +КонецПроцедуры + +// Устарела. Следует использовать ОбщегоНазначения.ВыполнитьВБезопасномРежиме. +// +// Параметры: +// Алгоритм - Строка - содержащая произвольный алгоритм на встроенном языке 1С:Предприятия. +// Параметры - Произвольный - в качестве значения данного параметра может быть передано значение, +// которое требуется для выполнения алгоритма (при этом в тексте алгоритма обращение к данному +// значению должно осуществляться как к имени переменной Параметры). +// +Процедура ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено) Экспорт + ОбщегоНазначения.ВыполнитьВБезопасномРежиме(Алгоритм, Параметры); +КонецПроцедуры + +// Устарела. Следует использовать ОбщегоНазначения.ВычислитьВБезопасномРежиме. // // Параметры: // Выражение - Строка - выражение, которое требуется вычислить. Например, "МойМодуль.МояФункция(Параметры)". @@ -412,363 +471,32 @@ // Произвольный - результат вычисления выражения. // Функция ВычислитьВБезопасномРежиме(Знач Выражение, Знач Параметры = Неопределено) Экспорт - - УстановитьБезопасныйРежим(Истина); - - МассивРазделителей = ОбщегоНазначенияПовтИсп.РазделителиКонфигурации(); - - Для Каждого ИмяРазделителя Из МассивРазделителей Цикл - - УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); - - КонецЦикла; - - Возврат Вычислить(Выражение); - -КонецФункции - -// Выполняет произвольный алгоритм на встроенном языке 1С:Предприятия, предварительно устанавливая -// безопасный режим выполнения кода и безопасный режим разделения данных для всех разделителей, -// присутствующих в составе конфигурации. В результате при выполнении алгоритма: -// - игнорируются попытки установки привилегированного режима, -// - запрещаются все внешние (по отношению к платформе 1С:Предприятие) действия (COM, -// загрузка внешних компонент, запуск внешних приложений и команд операционной системы, -// доступ к файловой системе и Интернет-ресурсам), -// - запрещается отключение использования разделителей сеанса, -// - запрещается изменение значений разделителей сеанса (если разделение данным разделителем не -// является условно выключенным), -// - запрещается изменение объектов, которые управляют состоянием условного разделения. -// -// Параметры: -// Алгоритм - Строка - содержащая произвольный алгоритм на встроенном языке 1С:Предприятия. -// Параметры - Произвольный - в качестве значения данного параметра может быть передано значение, -// которое требуется для выполнения алгоритма (при этом в тексте алгоритма обращение к данному -// значению должно осуществляться как к имени переменной Параметры). -// -Процедура ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено) Экспорт - - УстановитьБезопасныйРежим(Истина); - - МассивРазделителей = ОбщегоНазначенияПовтИсп.РазделителиКонфигурации(); - - Для Каждого ИмяРазделителя Из МассивРазделителей Цикл - - УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); - - КонецЦикла; - - Выполнить Алгоритм; - -КонецПроцедуры - -// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. -// При включении профилей безопасности для вызова оператора Выполнить() используется -// переход в безопасный режим с профилем безопасности, используемом для информационной базы -// (если выше по стеку не был установлен другой безопасный режим). -// -// Параметры: -// ИмяМетода - Строка - имя экспортной процедуры в формате -// <имя объекта>.<имя процедуры>, где <имя объекта> - это -// общий модуль или модуль менеджера объекта. -// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> -// в порядке расположения элементов массива. -// -// Пример: -// Параметры = Новый Массив(); -// Параметры.Добавить("1"); -// РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); -// -Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт - - ПроверитьИмяМетодаКонфигурации(ИмяМетода); - - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") И Не УстановленБезопасныйРежим() Тогда - - ПрофильИнформационнойБазы = ПрофильБезопасностиИнформационнойБазы(); - - Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда - - УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); - Если БезопасныйРежим() = Истина Тогда - УстановитьБезопасныйРежим(Ложь); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - ПараметрыСтрока = ""; - Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда - Для Индекс = 0 По Параметры.ВГраница() Цикл - ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; - КонецЦикла; - ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); - КонецЕсли; - - Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; - -КонецПроцедуры - -// Выполнить экспортную процедуру объекта встроенного языка по имени. -// При включении профилей безопасности для вызова оператора Выполнить() используется -// переход в безопасный режим с профилем безопасности, используемом для информационной базы -// (если выше по стеку не был установлен другой безопасный режим). -// -// Параметры: -// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект), -// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки. -// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры> -// в порядке расположения элементов массива. -// -Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт - - // Проверка имени метода на корректность. - Попытка - Тест = Новый Структура(ИмяМетода, ИмяМетода); - Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Некорректное значение параметра ИмяМетода (%1) в РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта'"), ИмяМетода); - КонецПопытки; - - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") И Не УстановленБезопасныйРежим() Тогда - - ПрофильИнформационнойБазы = ПрофильБезопасностиИнформационнойБазы(); - - Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда - - УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); - Если БезопасныйРежим() = Истина Тогда - УстановитьБезопасныйРежим(Ложь); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - ПараметрыСтрока = ""; - Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда - Для Индекс = 0 По Параметры.ВГраница() Цикл - ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; - КонецЦикла; - ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); - КонецЕсли; - - Выполнить "Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")"; - -КонецПроцедуры - -// Проверяет, что переданное имя является именем экспортной процедуры конфигурации. -// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма -// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить() и Вычислить() -// при их использовании для динамического вызова методов код конфигурации. -// -// В случае, если переданная строка не соответствует имени метода конфигурации - генерируется. -// -Процедура ПроверитьИмяМетодаКонфигурации(Знач ИмяМетода) Экспорт - - // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. - ЧастиИмени = СтрРазделить(ИмяМетода, "."); - Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (передано значение: ""%1"") в РаботаВБезопасномРежиме.ПроверитьИмяМетодаКонфигурации'"), ИмяМетода); - КонецЕсли; - - ИмяОбъекта = ЧастиИмени[0]; - Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (передано значение: ""%1"") в РаботаВБезопасномРежиме.ПроверитьИмяМетодаКонфигурации: - |Не найден общий модуль ""%2"".'"), - ИмяМетода, - ИмяОбъекта); - КонецЕсли; - - Если ЧастиИмени.Количество() = 3 Тогда - ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; - Попытка - Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); - Исключение - Менеджер = Неопределено; - КонецПопытки; - Если Менеджер = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (передано значение: ""%1"") в РаботаВБезопасномРежиме.ПроверитьИмяМетодаКонфигурации: - |Не найден менеджер объекта ""%2"".'"), - ИмяМетода, - ПолноеИмяОбъекта); - КонецЕсли; - КонецЕсли; - - ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; - ВременнаяСтруктура = Новый Структура; - Попытка - // Проверка того, что ИмяМетодаОбъекта является допустимым идентификатором. - // Например: МояПроцедура. - ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (передано значение: ""%1"") в РаботаВБезопасномРежиме.ПроверитьИмяМетодаКонфигурации: - |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), - ИмяМетода, - ИмяМетодаОбъекта); - КонецПопытки; - -КонецПроцедуры - -// Проверяет возможность выполнения обработчиков установки параметров сеанса. -// -// В случае, если при текущих настройках профилей безопасности (в кластере серверов и в информационной -// базе) выполнение обработчиков установки параметров сеанса невозможно - генерируется исключение, -// содержащее описание причины невозможности выполнения обработчиков установки параметров сеанса -// и перечень действий, которые можно предпринять для устранения этой причины. -// -Процедура ПроверитьВозможностьВыполненияОбработчиковУстановкиПараметровСеанса() Экспорт - - Если ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы()) Тогда - Возврат; - КонецЕсли; - - ПрофильИнформационнойБазы = ПрофильБезопасностиИнформационнойБазы(); - - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") И ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда - - // Информационная база настроена на использование с профилем безопасности, в котором запрещен - // полный доступ к внешним модулям. - - УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); - Если БезопасныйРежим() <> ПрофильИнформационнойБазы Тогда - - // Профиль ИБ не доступен для выполнения обработчиков. - - УстановитьБезопасныйРежим(Ложь); - - Если ВозможноВыполнениеОбработчиковУстановкиПараметровСеансаБезУстановкиБезопасногоРежима() Тогда - - Возврат; - - Иначе - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: профиль безопасности %1 отсутствует в кластере серверов 1С:Предприятия, или для него запрещено использование в качестве профиля безопасности безопасного режима. - | - |Для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"), - ПрофильИнформационнойБазы); - - КонецЕсли; - - КонецЕсли; - - ДоступенПривилегированныйРежим = ДоступенПереходВПривилегированныйРежим(); - - УстановитьБезопасныйРежим(Ложь); - - Если Не ДоступенПривилегированныйРежим Тогда - - // Профиль ИБ доступен для выполнения обработчиков, но в нем невозможна установка привилегированного режима. - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: профиль безопасности %1 не содержит разрешения на установку привилегированного режима. Возможно, он был отредактирован через консоль кластера. - | - |Для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"), - ПрофильИнформационнойБазы); - - КонецЕсли; - - Иначе - - // Информационная база не настроена на использование с профилем безопасности, в котором запрещен - // полный доступ к внешним модулям. - - Попытка - - ДоступенПривилегированныйРежим = Вычислить("ДоступенПереходВПривилегированныйРежим()"); - - Исключение - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: %1. - | - |Возможно, для информационной базы через консоль кластера был установлен профиль безопасности, не допускающий выполнения внешних модулей без установки безопасного режима. В этом случае для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).При этом программа будет автоматически корректно настроена на использование совместно с включенными профилями безопасности.'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Прочее -// - -// Создает запросы на обновление разрешений конфигурации. -// -// Параметры: -// ВключаяЗапросСозданияПрофиляИБ - Булево - включать в результат запрос на создание профиля безопасности -// для текущей информационной базы. -// -// Возвращаемое значение: Массив(УникальныйИдентификатор) - идентификаторы запросов для обновления разрешений -// конфигурации до требуемых в настоящий момент. -// -Функция ЗапросыОбновленияРазрешенийКонфигурации(Знач ВключаяЗапросСозданияПрофиляИБ = Истина) Экспорт - - Возврат РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(ВключаяЗапросСозданияПрофиляИБ); - -КонецФункции - -// Возвращает контрольные суммы файлов комплекта внешней компоненты, поставляемого в макете конфигурации. -// -// Параметры: -// ИмяМакета - Строка - имя макета конфигурации, в составе которого поставляется комплект внешней компоненты. -// -// Возвращаемое значение - ФиксированноеСоответствие: -// * Ключ - Строка - имя файла, -// * Значение - Строка - контрольная сумма. -// -Функция КонтрольныеСуммыФайловКомплектаВнешнейКомпоненты(Знач ИмяМакета) Экспорт - - Возврат РаботаВБезопасномРежимеСлужебный.КонтрольныеСуммыФайловКомплектаВнешнейКомпоненты(ИмяМакета); - + Возврат ОбщегоНазначения.ВычислитьВБезопасномРежиме(Выражение, Параметры); КонецФункции #КонецОбласти -#Область ПрограммныйИнтерфейс +#КонецОбласти -// Проверяет возможность выполнения обработчиков установки параметров сеанса без установки безопасного режима. +#Область СлужебныйПрограммныйИнтерфейс + +Функция ИспользуютсяПрофилиБезопасности() Экспорт + Возврат ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности"); +КонецФункции + +// Возвращает имя профиля безопасности, предоставляющего привилегии кода конфигурации. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: Строка - имя профиля безопасности. // -Функция ВозможноВыполнениеОбработчиковУстановкиПараметровСеансаБезУстановкиБезопасногоРежима() Экспорт +Функция ПрофильБезопасностиИнформационнойБазы(ПроверкаИспользования = Ложь) Экспорт - Попытка - - Результат = Вычислить("ДоступенПереходВПривилегированныйРежим()"); - Возврат Результат; - - Исключение - - ШаблонЗаписиЖР = НСтр("ru = 'При установке параметров сеанса произошла ошибка: - | - |-------------------------------------------------------------------------------------------- - |%1 - |-------------------------------------------------------------------------------------------- - | - |Запуск программы будет невозможен.'"); - - ТекстЗаписиЖР = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаписиЖР, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Установка параметров сеанса'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ТекстЗаписиЖР); - - Возврат Ложь; - - КонецПопытки; + Если ПроверкаИспользования И Не ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + Возврат ""; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.ПрофильБезопасностиИнформационнойБазы.Получить(); КонецФункции @@ -776,136 +504,6 @@ #Область СлужебныеПроцедурыИФункции -// Возвращает менеджер объекта по имени. -// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. -// -// Параметры: -// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". -// -// Возвращаемое значение: -// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... -// -Функция МенеджерОбъектаПоИмени(Имя) - Перем КлассОМ, ИмяОМ, Менеджер; - - ЧастиИмени = СтрРазделить(Имя, "."); - - Если ЧастиИмени.Количество() > 0 Тогда - КлассОМ = ВРег(ЧастиИмени[0]); - КонецЕсли; - - Если ЧастиИмени.Количество() > 1 Тогда - ИмяОМ = ЧастиИмени[1]; - КонецЕсли; - - Если КлассОМ = "ПЛАНОБМЕНА" - Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда - Менеджер = ПланыОбмена; - - ИначеЕсли КлассОМ = "СПРАВОЧНИК" - Или КлассОМ = "СПРАВОЧНИКИ" Тогда - Менеджер = Справочники; - - ИначеЕсли КлассОМ = "ДОКУМЕНТ" - Или КлассОМ = "ДОКУМЕНТЫ" Тогда - Менеджер = Документы; - - ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" - Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда - Менеджер = ЖурналыДокументов; - - ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" - Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда - Менеджер = Перечисления; - - ИначеЕсли КлассОМ = "ОТЧЕТ" - Или КлассОМ = "ОТЧЕТЫ" Тогда - Менеджер = Отчеты; - - ИначеЕсли КлассОМ = "ОБРАБОТКА" - Или КлассОМ = "ОБРАБОТКИ" Тогда - Менеджер = Обработки; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" - Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда - Менеджер = ПланыВидовХарактеристик; - - ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" - Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда - Менеджер = ПланыСчетов; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" - Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда - Менеджер = ПланыВидовРасчета; - - ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" - Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда - Менеджер = РегистрыСведений; - - ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" - Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда - Менеджер = РегистрыНакопления; - - ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" - Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда - Менеджер = РегистрыБухгалтерии; - - ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" - Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда - - Если ЧастиИмени.Количество() < 3 Тогда - // Регистр расчета - Менеджер = РегистрыРасчета; - Иначе - КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); - Если ЧастиИмени.Количество() > 3 Тогда - ИмяПодчиненногоОМ = ЧастиИмени[3]; - КонецЕсли; - Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" - Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда - // Перерасчет - Попытка - Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; - ИмяОМ = ИмяПодчиненногоОМ; - Исключение - Менеджер = Неопределено; - КонецПопытки; - КонецЕсли; - КонецЕсли; - - ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" - Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда - Менеджер = БизнесПроцессы; - - ИначеЕсли КлассОМ = "ЗАДАЧА" - Или КлассОМ = "ЗАДАЧИ" Тогда - Менеджер = Задачи; - - ИначеЕсли КлассОМ = "КОНСТАНТА" - Или КлассОМ = "КОНСТАНТЫ" Тогда - Менеджер = Константы; - - ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" - Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда - Менеджер = Последовательности; - КонецЕсли; - - Если Менеджер <> Неопределено Тогда - Если ЗначениеЗаполнено(ИмяОМ) Тогда - Попытка - Возврат Менеджер[ИмяОМ]; - Исключение - Менеджер = Неопределено; - КонецПопытки; - Иначе - Возврат Менеджер; - КонецЕсли; - КонецЕсли; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); - -КонецФункции - // Проверяет возможность перехода в привилегированный режим из текущего безопасного режима. // // Возвращаемое значение: Булево. @@ -917,18 +515,6 @@ КонецФункции -// Возвращает имя профиля безопасности, предоставляющего привилегии кода конфигурации. -// -// Возвращаемое значение: Строка - имя профиля безопасности. -// -Функция ПрофильБезопасностиИнформационнойБазы() - - УстановитьПривилегированныйРежим(Истина); - - Возврат Константы.ПрофильБезопасностиИнформационнойБазы.Получить(); - -КонецФункции - // Возвращает "предопределенный" псевдоним (alias) для каталога программы. // // Возвращаемое значение: Строка. diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиент/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиент/Module.bsl index 0adf56405..53c3498be 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиент/Module.bsl @@ -1,36 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка профилей безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Применяет ранее сохраненные в информационной базе запросы на использование внешних ресурсов. // // Параметры: -// Идентификаторы - Массив(УникальныйИдентификатор) - идентификаторы запросов, которые требуется применить, +// Идентификаторы - Массив - идентификаторы запросов, которые требуется применить, // ФормаВладелец - УправляемаяФорма - форма, которая должна блокироваться до окончания применения разрешений, // ОповещениеОЗакрытии - ОписаниеОповещения - которое будет вызвано при успешном предоставлении разрешений. // Процедура ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Знач Идентификаторы, ФормаВладелец, ОповещениеОЗакрытии) Экспорт СтандартнаяОбработка = Истина; - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов(Идентификаторы, ФормаВладелец, ОповещениеОЗакрытии, СтандартнаяОбработка); - - Если Не СтандартнаяОбработка Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - + ИнтеграцияСТехнологиейСервисаКлиент.ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов(Идентификаторы, ФормаВладелец, ОповещениеОЗакрытии, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда Возврат; КонецЕсли; @@ -60,3 +40,15 @@ КонецПроцедуры #КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ОткрытьВнешнююОбработкуИлиОтчет(Владелец) Экспорт + + ОткрытьФорму( + "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ОткрытиеВнешнейОбработкиИлиОтчетаСВыборомБезопасногоРежима",, + ЭтотОбъект,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиентПереопределяемый/Module.bsl index 25a96f089..ec4c7c57c 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеКлиентПереопределяемый/Module.bsl @@ -1,19 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка профилей безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при подтверждении запросов на использование внешних ресурсов. // // Параметры: -// Идентификаторы - Массив(УникальныйИдентификатор), идентификаторы запросов, которые требуется применить, -// ФормаВладелец - УправляемаяФорма, форма, которая должна блокироваться до окончания применения разрешений, -// ОповещениеОЗакрытии - ОписаниеОповещения, которое будет вызвано при успешном предоставлении разрешений. -// СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки применения разрешений на использование +// ИдентификаторыЗапросов - Массив - идентификаторы запросов, которые требуется применить, +// ФормаВладелец - УправляемаяФорма - форма, которая должна блокироваться до окончания применения разрешений, +// ОповещениеОЗакрытии - ОписаниеОповещения - которое будет вызвано при успешном предоставлении разрешений. +// СтандартнаяОбработка - Булево - флаг выполнения стандартной обработки применения разрешений на использование // внешних ресурсов (подключение к агенту сервера через COM-соединение или сервер администрирования с // запросом параметров подключения к кластеру у текущего пользователя). Может быть установлен в значение Ложь // внутри обработчика события, в этом случае стандартная обработка завершения сеанса выполняться не будет. diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеПереопределяемый/Module.bsl index 0866ddbec..386dababd 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеПереопределяемый/Module.bsl @@ -1,10 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка профилей безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при проверке возможности использования профилей безопасности. @@ -23,7 +16,7 @@ // Вызывается при проверке возможности настройки профилей безопасности. // // Параметры: -// Отказ - Булево. Если для информационной базы недоступно использование профилей безопасности - +// Отказ - Булево - Если для информационной базы недоступно использование профилей безопасности // значение данного параметра нужно установить равным Истина. // Процедура ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ) Экспорт @@ -61,9 +54,9 @@ // Владелец - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий объект-владелец запрашиваемых // разрешений на использование внешних ресурсов, // РежимЗамещения - Булево - флаг замещения ранее предоставленных разрешений по владельцу, -// ДобавляемыеРазрешения - Массив(ОбъектXDTO) - массив добавляемых разрешений, -// УдаляемыеРазрешения - Массив(ОбъектXDTO) - массив удаляемых разрешений, -// СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки создания запроса на использование +// ДобавляемыеРазрешения - Массив - массив ОбъектXDTO добавляемых разрешений, +// УдаляемыеРазрешения - Массив - массив ОбъектXDTO удаляемых разрешений, +// СтандартнаяОбработка - Булево - флаг выполнения стандартной обработки создания запроса на использование // внешних ресурсов. // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика // значение параметра СтандартнаяОбработка установлено в значение Ложь). @@ -80,7 +73,7 @@ // Параметры: // ПрограммныйМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий программный // модуль, для которого выполняется запрос разрешений, -// СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки, +// СтандартнаяОбработка - Булево - флаг выполнения стандартной обработки, // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика // значение параметра СтандартнаяОбработка установлено в значение Ложь). // @@ -95,7 +88,7 @@ // Параметры: // ПрограммныйМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий программный // модуль, для которого выполняется запрос разрешений, -// СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки, +// СтандартнаяОбработка - Булево - флаг выполнения стандартной обработки, // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика // значение параметра СтандартнаяОбработка установлено в значение Ложь). // diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl index 52ad9da19..7f534b6ff 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl @@ -1,12 +1,31 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка профилей безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс +// Проверяет возможность настройки профилей безопасности из текущей информационной базы. +// +// Возвращаемое значение: +// Булево - Истина, если настройка доступна. +// +Функция ДоступнаНастройкаПрофилейБезопасности() Экспорт + + Если ВозможноИспользованиеПрофилейБезопасности() Тогда + + Отказ = Ложь; + + ИнтеграцияСТехнологиейСервиса.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); + Если Не Отказ Тогда + РаботаВБезопасномРежимеПереопределяемый.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); + КонецЕсли; + + Возврат Не Отказ; + + Иначе + + Возврат Ложь; + + КонецЕсли; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Внешние модули // @@ -88,6 +107,122 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Использование профилей безопасности. +// + +//////////////////////////////////////////////////////////////////////////////// +// Преобразование ссылок к виду Тип+Идентификатор для хранения в регистрах +// разрешений. +// +// Используется нестандартный способ хранения ссылок т.к. для регистров разрешений не +// требуется обеспечение ссылочной целостности, и не требуется удаление записей из +// регистров вместе с удалением объекта. +// + +// Формирует параметры для хранения ссылки в регистрах разрешений. +// +// Параметры: +// Ссылка - ЛюбаяСсылка. +// +// Возвращаемое значение: Структура: +// * Тип - СправочникСсылка.ИдентификаторыОбъектовМетаданных, +// * Идентификатор - УникальныйИдентификатор - уникальный +// идентификатор ссылки. +// +Функция СвойстваДляРегистраРазрешений(Знач Ссылка) Экспорт + + Результат = Новый Структура("Тип,Идентификатор"); + + Если Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда + + Результат.Тип = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); + Результат.Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); + + Иначе + + Результат.Тип = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Ссылка.Метаданные()); + Результат.Идентификатор = Ссылка.УникальныйИдентификатор(); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Применение запросов разрешений на использование внешних ресурсов. +// + +// Формирует представление разрешений на использование внешних ресурсов по таблицам разрешений. +// +// Параметры: +// Таблицы - Структура - таблицы разрешений, для которых формируется представление +// (см. ТаблицыРазрешений()). +// +// Возвращаемое значение: ТабличныйДокумент, представление разрешений на использование внешних ресурсов. +// +Функция ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля, Знач ТипВладельца, Знач ИдентификаторВладельца, Знач Разрешения) Экспорт + + НачатьТранзакцию(); + + Менеджер = Обработки.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Создать(); + + Менеджер.ДобавитьЗапросРазрешенийНаИспользованиеВнешнихРесурсов( + ТипПрограммногоМодуля, + ИдентификаторПрограммногоМодуля, + ТипВладельца, + ИдентификаторВладельца, + Истина, + Разрешения, + Новый Массив()); + + Менеджер.РассчитатьПрименениеЗапросов(); + + ОтменитьТранзакцию(); + + Возврат Менеджер.Представление(Истина); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, ДоОбновленияПараметровРаботыПрограммы = Ложь) Экспорт + + Если ДоОбновленияПараметровРаботыПрограммы Тогда + Параметры.Вставить("ОтображатьПомощникНастройкиРазрешений", Ложь); + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Параметры.Вставить("ОтображатьПомощникНастройкиРазрешений", ИспользуетсяИнтерактивныйРежимЗапросаРазрешений()); + Если Не Параметры.ОтображатьПомощникНастройкиРазрешений Тогда + Возврат; + КонецЕсли; + + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда + Возврат; + КонецЕсли; + + Проверка = НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов(); + Если Проверка.РезультатПроверки Тогда + Параметры.Вставить("ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Ложь); + Иначе + Параметры.Вставить("ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Истина); + Параметры.Вставить("ПроверкаПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Проверка); + КонецЕсли; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ИспользуемыеВнешниеРесурсы); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -107,18 +242,8 @@ Результат = Неопределено; Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Создание; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеСозданияПрофиляБезопасности"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриЗапросеСозданияПрофиляБезопасности( - ПрограммныйМодуль, СтандартнаяОбработка, Результат); - - Если Не СтандартнаяОбработка Тогда - Прервать; - КонецЕсли; - - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриЗапросеСозданияПрофиляБезопасности( + ПрограммныйМодуль, СтандартнаяОбработка, Результат); Если СтандартнаяОбработка Тогда РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеСозданияПрофиляБезопасности( @@ -152,70 +277,12 @@ Отказ = Ложь; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиИспользованияПрофилейБезопасности"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПроверкеВозможностиИспользованияПрофилейБезопасности(Отказ); - Если Отказ Тогда - Прервать; - КонецЕсли; - КонецЦикла; - РаботаВБезопасномРежимеПереопределяемый.ПриПроверкеВозможностиИспользованияПрофилейБезопасности(Отказ); Возврат Не Отказ; КонецФункции -// Проверяет возможность настройки профилей безопасности из текущей информационной базы. -// -// Возвращаемое значение: Булево. -// -Функция ДоступнаНастройкаПрофилейБезопасности() Экспорт - - Если ВозможноИспользованиеПрофилейБезопасности() Тогда - - Отказ = Ложь; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиНастройкиПрофилейБезопасности"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); - Если Отказ Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не Отказ Тогда - РаботаВБезопасномРежимеПереопределяемый.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); - КонецЕсли; - - Возврат Не Отказ; - - Иначе - - Возврат Ложь; - - КонецЕсли; - -КонецФункции - -// Выполняет дополнительные (определенные бизнес-логикой) действия при включении -// использования профилей безопасности. -// -Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииИспользованияПрофилейБезопасности"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриВключенииИспользованияПрофилейБезопасности(); - КонецЦикла; - - РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности(); - -КонецПроцедуры - // Возвращает контрольные суммы файлов комплекта внешней компоненты, поставляемого в макете конфигурации. // // Параметры: @@ -245,19 +312,19 @@ Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать разрешение на использование внешней компоненты: - |некорректное имя макета %1!'"), ИмяМакета); + |некорректное имя макета %1.'"), ИмяМакета); КонецЕсли; Если Макет = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать разрешение на использование внешней компоненты, - |поставляемой в макете %1: макет %1 не обнаружен в составе конфигурации!'"), ИмяМакета); + |поставляемой в макете %1: макет %1 не обнаружен в составе конфигурации.'"), ИмяМакета); КонецЕсли; Если Метаданные.НайтиПоПолномуИмени(ИмяМакета).ТипМакета <> Метаданные.СвойстваОбъектов.ТипМакета.ДвоичныеДанные Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать разрешение на использование внешней компоненты: - |макет %1 не содержит двоичных данных!'"), ИмяМакета); + |макет %1 не содержит двоичных данных.'"), ИмяМакета); КонецЕсли; ВременныйФайл = ПолучитьИмяВременногоФайла("zip"); @@ -278,7 +345,7 @@ Если ПустаяСтрока(ФайлМанифеста) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать разрешение на использование внешней компоненты, - |поставляемой в макете %1: в архиве не обнаружен файл MANIFEST.XML!'"), ИмяМакета); + |поставляемой в макете %1: в архиве не обнаружен файл MANIFEST.XML.'"), ИмяМакета); КонецЕсли; ПотокЧтения = Новый ЧтениеXML(); @@ -325,45 +392,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Преобразование ссылок к виду Тип+Идентификатор для хранения в регистрах -// разрешений. -// -// Используется нестандартный способ хранения ссылок т.к. для регистров разрешений не -// требуется обеспечение ссылочной целостности, и не требуется удаление записей из -// регистров вместе с удалением объекта. -// - -// Формирует параметры для хранения ссылки в регистрах разрешений. -// -// Параметры: -// Ссылка - ЛюбаяСсылка. -// -// Возвращаемое значение: Структура: -// * Тип - СправочникСсылка.ИдентификаторыОбъектовМетаданных, -// * Идентификатор - УникальныйИдентификатор - уникальный -// идентификатор ссылки. -// -Функция СвойстваДляРегистраРазрешений(Знач Ссылка) Экспорт - - Результат = Новый Структура("Тип,Идентификатор"); - - Если Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда - - Результат.Тип = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); - Результат.Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - - Иначе - - Результат.Тип = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Ссылка.Метаданные()); - Результат.Идентификатор = Ссылка.УникальныйИдентификатор(); - - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Формирует ссылку из данных, хранящихся в регистрах разрешений. // // Параметры: @@ -418,18 +446,8 @@ СтандартнаяОбработка = Истина; Результат = Неопределено; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов( + ИнтеграцияСТехнологиейСервиса.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов( ПрограммныйМодуль, Владелец, РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); - - Если Не СтандартнаяОбработка Тогда - Прервать; - КонецЕсли; - - КонецЦикла; Если СтандартнаяОбработка Тогда @@ -464,18 +482,8 @@ Результат = Неопределено; Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Удаление; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеУдаленияПрофиляБезопасности"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриЗапросеУдаленияПрофиляБезопасности( + ИнтеграцияСТехнологиейСервиса.ПриЗапросеУдаленияПрофиляБезопасности( ПрограммныйМодуль, СтандартнаяОбработка, Результат); - - Если Не СтандартнаяОбработка Тогда - Прервать; - КонецЕсли; - - КонецЦикла; Если СтандартнаяОбработка Тогда РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеУдаленияПрофиляБезопасности( @@ -507,69 +515,24 @@ Результат = Новый Массив(); НачатьТранзакцию(); - Попытка - Если ВключаяЗапросСозданияПрофиляИБ Тогда Результат.Добавить(ЗапросСозданияПрофиляБезопасности(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка())); КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(Результат); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(Результат); РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(Результат); ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); ВызватьИсключение; - КонецПопытки; Возврат Результат; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Применение запросов разрешений на использование внешних ресурсов. -// - -// Формирует представление разрешений на использование внешних ресурсов по таблицам разрешений. -// -// Параметры: -// Таблицы - Структура - таблицы разрешений, для которых формируется представление -// (см. ТаблицыРазрешений()). -// -// Возвращаемое значение: ТабличныйДокумент, представление разрешений на использование внешних ресурсов. -// -Функция ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля, Знач ТипВладельца, Знач ИдентификаторВладельца, Знач Разрешения) Экспорт - - НачатьТранзакцию(); - - Менеджер = Обработки.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Создать(); - - Менеджер.ДобавитьЗапросРазрешенийНаИспользованиеВнешнихРесурсов( - ТипПрограммногоМодуля, - ИдентификаторПрограммногоМодуля, - ТипВладельца, - ИдентификаторВладельца, - Истина, - Разрешения, - Новый Массив()); - - Менеджер.РассчитатьПрименениеЗапросов(); - - ОтменитьТранзакцию(); - - Возврат Менеджер.Представление(Истина); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Внешние модули // @@ -616,7 +579,7 @@ Если РаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Запись объекта %1 недоступна: установлен безопасный режим: %2!'"), + НСтр("ru = 'Запись объекта %1 недоступна: установлен безопасный режим: %2.'"), Объект.Метаданные().ПолноеИмя(), БезопасныйРежим()); @@ -624,251 +587,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Декларация обработчиков программных событий. -// - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "РаботаВБезопасномРежимеСлужебный"); - КонецЕсли; - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. -// - -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// -Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ИспользуемыеВнешниеРесурсы); -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// ДоОбновленияПараметровРаботыПрограммы - Булево - Истина, если параметр запрашивается для работы клиентского кода -// до обновления всех параметров работы программы. Например, в подчиненном узле РИБ из формы повторной загрузки сообщения обмена. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, ДоОбновленияПараметровРаботыПрограммы = Ложь) Экспорт - - Если ДоОбновленияПараметровРаботыПрограммы Тогда - Параметры.Вставить("ОтображатьПомощникНастройкиРазрешений", Ложь); - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Параметры.Вставить("ОтображатьПомощникНастройкиРазрешений", ИспользуетсяИнтерактивныйРежимЗапросаРазрешений()); - Если Не Параметры.ОтображатьПомощникНастройкиРазрешений Тогда - Возврат; - КонецЕсли; - - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - Возврат; - КонецЕсли; - - Проверка = НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов(); - Если Проверка.РезультатПроверки Тогда - Параметры.Вставить("ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Ложь); - Иначе - Параметры.Вставить("ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Истина); - Параметры.Вставить("ПроверкаПримененияРазрешенийНаИспользованиеВнешнихРесурсов", Проверка); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Декларация программных событий. -// - -// Объявляет служебные события подсистемы БазоваяФункциональность, предназначенные -// для поддержки профилей безопасности. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается при проверке возможности использования профилей безопасности. - // - // Параметры: - // Отказ - Булево. Если для информационной базы недоступно использование профилей безопасности - - // значение данного параметра нужно установить равным Истина. - // - // Синтаксис: - // Процедура ПриПроверкеВозможностиИспользованияПрофилейБезопасности(Отказ) Экспорт - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиИспользованияПрофилейБезопасности"); - - // Вызывается при проверке возможности настройки профилей безопасности. - // - // Параметры: - // Отказ - Булево. Если для информационной базы недоступно использование профилей безопасности - - // значение данного параметра нужно установить равным Истина. - // - // Синтаксис: - // Процедура ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ) Экспорт - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиНастройкиПрофилейБезопасности"); - - // Вызывается при включении использования для информационной базы профилей безопасности. - // - // Синтаксис: - // Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииИспользованияПрофилейБезопасности"); - - // Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены - // при создании информационной базы или обновлении программы. - // - // Параметры: - // ЗапросыРазрешений - Массив - список запросов, возвращаемых функцией. - // ЗапросНаИспользованиеВнешнихРесурсов модуля РаботаВБезопасномРежиме. - // - // Синтаксис: - // Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"); - - // Вызывается при создании запроса разрешений на использование внешних ресурсов. - // - // Параметры: - // ПрограммныйМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий программный - // модуль, для которого выполняется запрос разрешений, - // Владелец - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий объект-владелец запрашиваемых - // разрешений на использование внешних ресурсов, - // РежимЗамещения - Булево - флаг замещения ранее предоставленных разрешений по владельцу, - // ДобавляемыеРазрешения - Массив(ОбъектXDTO) - массив добавляемых разрешений, - // УдаляемыеРазрешения - Массив(ОбъектXDTO) - массив удаляемых разрешений, - // СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки создания запроса на использование - // внешних ресурсов. - // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика - // значение параметра СтандартнаяОбработка установлено в значение Ложь). - // - // Синтаксис: - // Процедура ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ПрограммныйМодуль, Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения, Знач УдаляемыеРазрешения, СтандартнаяОбработка, Результат) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов"); - - // Вызывается при запросе создания профиля безопасности. - // - // Параметры: - // ПрограммныйМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий программный - // модуль, для которого выполняется запрос разрешений, - // СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки, - // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика - // значение параметра СтандартнаяОбработка установлено в значение Ложь). - // - // Синтаксис: - // Процедура ПриЗапросеСозданияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеСозданияПрофиляБезопасности"); - - // Вызывается при запросе удаления профиля безопасности. - // - // Параметры: - // ПрограммныйМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий программный - // модуль, для которого выполняется запрос разрешений, - // СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки, - // Результат - УникальныйИдентификатор - идентификатор запроса (в том случае, если внутри обработчика - // значение параметра СтандартнаяОбработка установлено в значение Ложь). - // - // Синтаксис: - // Процедура ПриЗапросеУдаленияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗапросеУдаленияПрофиляБезопасности"); - - // Вызывается при подключении внешнего модуля. В теле процедуры-обработчика может быть изменен - // безопасный режим, в котором будет выполняться подключение. - // - // Параметры: - // ВнешнийМодуль - ЛюбаяСсылка - ссылка на объект информационной базы, представляющий подключаемый - // внешний модуль, - // БезопасныйРежим - ОпределяемыйТип.БезопасныйРежим - безопасный режим, в котором внешний - // модуль будет подключен к информационной базе. Может быть изменен внутри данной процедуры. - // - // Синтаксис: - // Процедура ПриПодключенииВнешнегоМодуля(Знач ВнешнийМодуль, БезопасныйРежим) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПодключенииВнешнегоМодуля"); - - // Вызывается при регистрации менеджеров внешних модулей. - // Только для использования внутри БСП. - // - // Параметры: - // Менеджеры - Массив(ОбщийМодуль). - // - // Синтаксис: - // Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриРегистрацииМенеджеровВнешнихМодулей"); - - // КЛИЕНТСКИЕ СОБЫТИЯ. - - // Вызывается при подтверждении запросов на использование внешних ресурсов. - // - // Параметры: - // Идентификаторы - Массив(УникальныйИдентификатор), идентификаторы запросов, которые требуется применить, - // ФормаВладелец - УправляемаяФорма, форма, которая должна блокироваться до окончания применения разрешений, - // ОповещениеОЗакрытии - ОписаниеОповещения, которое будет вызвано при успешном предоставлении разрешений. - // СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки применения разрешений на использование - // внешних ресурсов (подключение к агенту сервера через COM-соединение или сервер администрирования с - // запросом параметров подключения к кластеру у текущего пользователя). Может быть установлен в значение Ложь - // внутри обработчика события, в этом случае стандартная обработка завершения сеанса выполняться не будет. - // - // Синтаксис: - // Процедура ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов(Знач ИдентификаторыЗапросов, ФормаВладелец, ОповещениеОЗакрытии, СтандартнаяОбработка) Экспорт - // - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПодтвержденииЗапросовНаИспользованиеВнешнихРесурсов"); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Использование профилей безопасности. // @@ -901,13 +619,9 @@ // Функция МенеджерыВнешнихМодулей() - Менеджеры = Новый Массив(); + Менеджеры = Новый Массив; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриРегистрацииМенеджеровВнешнихМодулей"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); Возврат Менеджеры; diff --git a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl index 7354d749a..19ed01d87 100644 --- a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl @@ -1,27 +1,58 @@ -/////////////////////////////////////////////////////////////////////////////////// -// РаботаВМоделиСервиса. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает имя общего реквизита, который является разделителем основных данных. // -// Возвращаемое значение: Строка. +// Возвращаемое значение: +// Строка - имя общего реквизита, который является разделителем основных данных. // Функция РазделительОсновныхДанных() Экспорт - Возврат Метаданные.ОбщиеРеквизиты.ОбластьДанныхОсновныеДанные.Имя; + Возврат РаботаВМоделиСервисаПовтИсп.РазделительОсновныхДанных(); КонецФункции // Возвращает имя общего реквизита, который является разделителем вспомогательных данных. // -// Возвращаемое значение: Строка. +// Возвращаемое значение: +// Строка - имя общего реквизита, который является разделителем вспомогательных данных. // Функция РазделительВспомогательныхДанных() Экспорт - Возврат Метаданные.ОбщиеРеквизиты.ОбластьДанныхВспомогательныеДанные.Имя; + Возврат РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных(); + +КонецФункции + +// Возвращает признак работы в режиме разделения данных по областям +// (технически это признак условного разделения). +// +// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение включено. +// - Ложь, если разделение выключено или не поддерживается. +// +Функция РазделениеВключено() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.РазделениеВключено(); + +КонецФункции + +// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей). +// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено +// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным. +// +// Возвращает Истина, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение не поддерживается, либо разделение выключено, +// либо разделение включено и разделители установлены. +// - Ложь, если разделение включено и разделители не установлены. +// +Функция ДоступноИспользованиеРазделенныхДанных() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных(); КонецФункции @@ -34,178 +65,6 @@ КонецПроцедуры -// Устанавливает блокировку области данных. -// -// Параметры: -// ПроверитьОтсутствиеДругихСеансов - Булево - проверить отсутствие других -// пользовательских сеансов со значением разделителя равным текущему. -// В случае обнаружения других сеансов будет выдано исключение. -// РазделяемаяБлокировка - Булево - установить разделяемую блокировку -// вместо исключительной. -// -Процедура ЗаблокироватьТекущуюОбластьДанных(Знач ПроверитьОтсутствиеДругихСеансов = Ложь, Знач РазделяемаяБлокировка = Ложь) Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ВызватьИсключение(НСтр("ru = 'Блокировка области может быть установлена только при включенном использовании разделителей'")); - КонецЕсли; - - Ключ = СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( - РегистрыСведений.ОбластиДанных, - Новый Структура(РазделительВспомогательныхДанных(), ОбщегоНазначения.ЗначениеРазделителяСеанса())); - - КоличествоПопыток = 5; - ТекущаяПопытка = 0; - Пока Истина Цикл - Попытка - ЗаблокироватьДанныеДляРедактирования(Ключ); - Прервать; - Исключение - ТекущаяПопытка = ТекущаяПопытка + 1; - - Если ТекущаяПопытка = КоличествоПопыток Тогда - ШаблонКомментария = НСтр("ru = 'Не удалось установить блокировку области данных по причине: - |%1'"); - ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииБлокировкаОбластиДанных(), - УровеньЖурналаРегистрации.Ошибка, - , - , - ТекстКомментария); - - ШаблонТекста = НСтр("ru = 'Не удалось установить блокировку области данных по причине: - |%1'"); - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - - ВызватьИсключение(Текст); - КонецЕсли; - КонецПопытки; - КонецЦикла; - - Если ПроверитьОтсутствиеДругихСеансов Тогда - - КонфликтующиеСеансы = Новый Массив(); - - Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл - Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда - Продолжить; - КонецЕсли; - - КлиентскиеПриложения = Новый Массив; - КлиентскиеПриложения.Добавить(ВРег("1CV8")); - КлиентскиеПриложения.Добавить(ВРег("1CV8C")); - КлиентскиеПриложения.Добавить(ВРег("WebClient")); - КлиентскиеПриложения.Добавить(ВРег("COMConnection")); - КлиентскиеПриложения.Добавить(ВРег("WSConnection")); - КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); - Если КлиентскиеПриложения.Найти(ВРег(Сеанс.ИмяПриложения)) = Неопределено Тогда - Продолжить; - КонецЕсли; - - КонфликтующиеСеансы.Добавить(Сеанс); - - КонецЦикла; - - Если КонфликтующиеСеансы.Количество() > 0 Тогда - - РазблокироватьДанныеДляРедактирования(Ключ); - - ТекстСеансы = ""; - Для Каждого КонфликтующийСеанс Из КонфликтующиеСеансы Цикл - - Если Не ПустаяСтрока(ТекстСеансы) Тогда - ТекстСеансы = ТекстСеансы + ", "; - КонецЕсли; - - ТекстСеансы = ТекстСеансы + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 (сеанс - %2)'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - КонфликтующийСеанс.Пользователь.Имя, - Формат(КонфликтующийСеанс.НомерСеанса, "ЧГ=0")); - - КонецЦикла; - - ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Операция не может быть выполнена, т.к. в приложении работают другие пользователи: %1'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ТекстСеансы); - - ВызватьИсключение ТекстИсключения; - - КонецЕсли; - - КонецЕсли; - - Если НЕ РазделяемаяБлокировка Тогда - УстановитьМонопольныйРежим(Истина); - Возврат; - КонецЕсли; - - МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); - - Если РазделяемаяБлокировка Тогда - РежимБлокировки = РежимБлокировкиДанных.Разделяемый; - Иначе - РежимБлокировки = РежимБлокировкиДанных.Исключительный; - КонецЕсли; - - Блокировка = Новый БлокировкаДанных; - - Для Каждого ЭлементМодели Из МодельДанных Цикл - - ПолноеИмяОбъектаМетаданных = ЭлементМодели.Ключ; - ОписаниеОбъектаМетаданных = ЭлементМодели.Значение; - - ПространствоБлокировки = ПолноеИмяОбъектаМетаданных; - - Если ЭтоПолноеИмяРегистра(ПолноеИмяОбъектаМетаданных) Тогда - - БлокироватьНаборы = Истина; - Если ЭтоПолноеИмяРегистраСведений(ПолноеИмяОбъектаМетаданных) Тогда - ОбъектМетаданныхОбласти = Метаданные.РегистрыСведений.Найти(ОписаниеОбъектаМетаданных.Имя); - Если ОбъектМетаданныхОбласти.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда - БлокироватьНаборы = Ложь; - КонецЕсли; - КонецЕсли; - - Если БлокироватьНаборы Тогда - ПространствоБлокировки = ПространствоБлокировки + ".НаборЗаписей"; - КонецЕсли; - - ИначеЕсли ЭтоПолноеИмяПоследовательности(ПолноеИмяОбъектаМетаданных) Тогда - - ПространствоБлокировки = ПространствоБлокировки + ".Записи"; - - ИначеЕсли ЭтоПолноеИмяЖурналаДокументов(ПолноеИмяОбъектаМетаданных) - ИЛИ ЭтоПолноеИмяПеречисления(ПолноеИмяОбъектаМетаданных) - ИЛИ ЭтоПолноеИмяПоследовательности(ПолноеИмяОбъектаМетаданных) - ИЛИ ЭтоПолноеИмяРегламентногоЗадания(ПолноеИмяОбъектаМетаданных) Тогда - - Продолжить; - - КонецЕсли; - - ЭлементБлокировки = Блокировка.Добавить(ПространствоБлокировки); - ЭлементБлокировки.Режим = РежимБлокировки; - - КонецЦикла; - - Блокировка.Заблокировать(); - -КонецПроцедуры - -// Снимает исключительную блокировку области с текущей области данных. -// -Процедура РазблокироватьТекущуюОбластьДанных() Экспорт - - Ключ = СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( - РегистрыСведений.ОбластиДанных, - Новый Структура(РазделительВспомогательныхДанных(), ОбщегоНазначения.ЗначениеРазделителяСеанса())); - - РазблокироватьДанныеДляРедактирования(Ключ); - - УстановитьМонопольныйРежим(Ложь); - -КонецПроцедуры - // Проверяет блокировку области данных. // // Параметры: @@ -213,7 +72,7 @@ // блокировку которой требуется проверить. // // Возвращаемое значение: -// Булево - Истина область данных заблокирована, иначе нет. +// Булево - Истина область данных заблокирована, иначе нет. // Функция ОбластьДанныхЗаблокирована(Знач ОбластьДанных) Экспорт @@ -233,20 +92,20 @@ РазблокироватьДанныеДляРедактирования(Ключ); - Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Попытка - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); + УстановитьРазделениеСеанса(Истина, ОбластьДанных); Исключение - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + УстановитьРазделениеСеанса(Ложь); Возврат Истина; КонецПопытки; - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + УстановитьРазделениеСеанса(Ложь); КонецЕсли; @@ -254,13 +113,13 @@ КонецФункции -// Подготавливает область данных к использованию. Запускает -// процедура обновления ИБ, при необходимости заполняет демонстрационными -// данными, устанавливает новый статус в регистре ОбластиДанных. +// Подготавливает область данных к использованию. Запускает процедура обновления ИБ, +// при необходимости заполняет демонстрационными данными, устанавливает новый статус в регистре ОбластиДанных. // // Параметры: -// ОбластьДанных - Тип значения разделителя - значение разделителя -// области данных, которую необходимо подготовить к использованию. +// ОбластьДанных - Число - значение разделителя области данных, которую необходимо подготовить к использованию, +// ИДФайлаВыгрузки - УникальныйИдентификатор - идентификатор файла, +// Вариант - Строка - вариант начальных данных. // Процедура ПодготовитьОбластьДанныхКИспользованию(Знач ОбластьДанных, Знач ИДФайлаВыгрузки, Знач Вариант = Неопределено) Экспорт @@ -312,10 +171,8 @@ // Копирует данные области данных в другую область данных. // // Параметры: -// ОбластьИсточник - Тип значения разделителя - значение разделителя -// области данных - источника данных. -// ОбластьПриемник - Тип значения разделителя - значение разделителя -// области данных - приемника данных. +// ОбластьИсточник - Число - значение разделителя области данных источника данных. +// ОбластьПриемник - Число - значение разделителя области данных приемника данных. // Процедура СкопироватьДанныеОбласти(Знач ОбластьИсточник, Знач ОбластьПриемник) Экспорт @@ -325,7 +182,7 @@ УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьИсточник); + УстановитьРазделениеСеанса(Истина, ОбластьИсточник); ИмяФайлаВыгрузки = Неопределено; @@ -353,7 +210,7 @@ ВызватьИсключение; КонецПопытки; - ОбщегоНазначения.УстановитьРазделениеСеанса(Неопределено, ОбластьПриемник); + УстановитьРазделениеСеанса(Неопределено, ОбластьПриемник); Попытка МодульВыгрузкаЗагрузкаОбластейДанных.ЗагрузитьТекущуюОбластьДанныхИзАрхива(ИмяФайлаВыгрузки); @@ -386,7 +243,7 @@ // дальнейшего использования области, необходимо использовать процедуру ОчиститьДанныеОбласти(). // // Параметры: -// ОбластьДанных - Число(7,0) - значение разделителя области данных которую требуется очистить, +// ОбластьДанных - Число - значение разделителя области данных которую требуется очистить, // При вызове процедуры разделение данных уже должно быть переключено в эту область. // УдалитьПользователей - Булево - флаг необходимости удаления пользователей информационной // базы для данной области данных. @@ -408,13 +265,6 @@ МенеджерЗаписи = ПолучитьМенеджерЗаписиОбластиДанных(ОбластьДанных, Перечисления.СтатусыОбластейДанных.КУдалению); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУдаленииОбластиДанных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриУдаленииОбластиДанных(ОбластьДанных); - КонецЦикла; - РаботаВМоделиСервисаПереопределяемый.ПриУдаленииОбластиДанных(ОбластьДанных); ОчиститьДанныеОбласти(УдалитьПользователей); // Вызываем очистку @@ -459,8 +309,7 @@ // разделении по областям данных), кроме переопределенных. // // Параметры: -// УдалитьПользователей - Булево, флаг необходимости удаления пользователей -// информационной базы. +// УдалитьПользователей - Булево - флаг необходимости удаления пользователей информационной базы. // Процедура ОчиститьДанныеОбласти(Знач УдалитьПользователей) Экспорт @@ -700,7 +549,7 @@ // Процедура ОбслуживаниеОбластейДанных() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -811,9 +660,11 @@ // Возвращает прокси web-сервиса для синхронизации административных действий в сервисе. // +// Параметры: +// ПарольПользователя - Строка - пароль для подключения. +// // Возвращаемое значение: -// WSПрокси. -// Прокси менеджера сервиса. +// WSПрокси - прокси менеджера сервиса. // Функция ПолучитьПроксиМенеджераСервиса(Знач ПарольПользователя = Неопределено) Экспорт @@ -847,12 +698,12 @@ // Устанавливает разделение сеанса. // // Параметры: -// Использование - Булево - Использование разделителя ОбластьДанных в сеансе. -// ОбластьДанных - Число - Значение разделителя ОбластьДанных. +// Использование - Булево - Использование разделителя ОбластьДанных в сеансе. +// ОбластьДанных - Число - Значение разделителя ОбластьДанных. // Процедура УстановитьРазделениеСеанса(Знач Использование = Неопределено, Знач ОбластьДанных = Неопределено) Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() Тогда ВызватьИсключение(НСтр("ru = 'Изменить разделение сеанса возможно только из сеанса запущенного без указания разделителей'")); КонецЕсли; @@ -874,15 +725,14 @@ // В случае если значение не установлено выдается ошибка. // // Возвращаемое значение: -// Тип значения разделителя. -// Значение разделителя текущей области данных. +// Число - значение разделителя текущей области данных. // Функция ЗначениеРазделителяСеанса() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат 0; Иначе - Если НЕ ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если Не ИспользованиеРазделителяСеанса() Тогда ВызватьИсключение(НСтр("ru = 'Не установлено значение разделителя'")); КонецЕсли; @@ -893,10 +743,10 @@ КонецФункции // Возвращает флаг использования разделителя ОбластьДанных для текущего сеанса. -// +// // Возвращаемое значение: -// Булево - Истина разделение используется, иначе нет. -// +// Булево - Истина разделение используется, иначе нет. +// Функция ИспользованиеРазделителяСеанса() Экспорт Возврат ПараметрыСеанса.ОбластьДанныхИспользование; @@ -907,13 +757,11 @@ // Возвращает добавленный параметр. // // Параметры: -// ТаблицаПараметров - Таблица значений - таблица описания параметров ИБ. -// ИмяКонстанты - Строка - имя константы, которую необходимо добавить в -// параметры ИБ. +// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров ИБ. +// ИмяКонстанты - Строка - имя константы, которую необходимо добавить в параметры ИБ. // // Возвращаемое значение: -// Строка таблицы значений. -// Строка содержащая описание добавленного параметра. +// СтрокаТаблицыЗначений - описание добавленного параметра. // Функция ДобавитьКонстантуВТаблицуПараметровИБ(Знач ТаблицаПараметров, Знач ИмяКонстанты) Экспорт @@ -930,18 +778,16 @@ // Возвращает таблицу описания параметров ИБ. // -// Возвращаемое значение: -// Таблица значений. -// Таблица описывающая параметры ИБ. -// Колонки: -// Имя - Строка - имя параметра. -// Описание - Строка - описание параметра для отображения в пользовательском интерфейсе. -// ЗапретЧтения - Булево - признак невозможности считывания параметра ИБ. Может установлен -// например для паролей. -// ЗапретЗаписи - Булево - признак невозможности изменения параметра ИБ. -// Тип - Описание типов - тип значения параметра. Допускается использовать только примитивные -// типы и перечисления присутствующие в управляющем приложении. -// +// Возвращаемое значение: +// ТаблицаЗначений - Параметры ИБ. Содержит колонки: +// * Имя - Строка - имя параметра. +// * Описание - Строка - описание параметра для отображения в пользовательском интерфейсе. +// * ЗапретЧтения - Булево - признак невозможности считывания параметра ИБ. Может быть установлен, например, для +// паролей. +// * ЗапретЗаписи - Булево - признак невозможности изменения параметра ИБ. +// * Тип - ОписаниеТипов - тип значения параметра. Допускается использовать только примитивные типы и +// перечисления, присутствующие в управляющем приложении. +// Функция ПолучитьТаблицуПараметровИБ() Экспорт ТаблицаПараметров = ПолучитьПустуюТаблицуПараметровИБ(); @@ -956,7 +802,8 @@ // Получает имя приложения, так как его задал Абонент. // -// Возвращаемое значение - Строка - имя приложения. +// Возвращаемое значение: +// Строка - имя приложения. // Функция ПолучитьИмяПриложения() Экспорт @@ -967,6 +814,9 @@ // Возвращает размер блоков в Мб для передачи больших файлов частями. // +// Возвращаемое значение: +// Число - размер блока передачи файлов в мегабайтах. +// Функция ПолучитьРазмерБлокаПередачиФайла() Экспорт УстановитьПривилегированныйРежим(Истина); @@ -982,10 +832,10 @@ // Сериализует объект структурного типа. // // Параметры: -// ЗначениеСтруктурногоТипа - Массив, Структура, Соответствие или их фиксированные аналоги. +// ЗначениеСтруктурногоТипа - Массив, Структура, Соответствие - сериализуемый объект. // // Возвращаемое значение: -// Строка - Сериализованное значение объекта структурного типа. +// Строка - Сериализованное значение объекта структурного типа. // Функция ЗаписатьСтруктурныйОбъектXDTOВСтроку(Знач ЗначениеСтруктурногоТипа) Экспорт @@ -998,10 +848,10 @@ // Кодирует строковое значение по алгоритму base64. // // Параметры: -// Строка - Строка. +// Строка - Строка - исходная строка, которую необходимо закодировать. // // Возвращаемое значение: -// Строка - base64-представление. +// Строка - закодированная строка. // Функция СтрокаВBase64(Знач Строка) Экспорт @@ -1014,10 +864,10 @@ // Декодирует base64-представление строки в исходное значение. // // Параметры: -// СтрокаBase64 - Строка. +// СтрокаBase64 - Строка - исходная строка, которую необходимо декодировать. // // Возвращаемое значение: -// Строка. +// Строка - декодированная строка. // Функция Base64ВСтроку(Знач СтрокаBase64) Экспорт @@ -1062,7 +912,8 @@ // Функция ВнутреннийАдресМенеджераСервиса() Экспорт - Возврат Константы.ВнутреннийАдресМенеджераСервиса.Получить(); + МодульРаботаВМоделиСервисаБТС = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаБТС"); + Возврат МодульРаботаВМоделиСервисаБТС.ВнутреннийАдресМенеджераСервиса(); КонецФункции @@ -1073,12 +924,8 @@ // Функция ИмяСлужебногоПользователяМенеджераСервиса() Экспорт - УстановитьПривилегированныйРежим(Истина); - Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ВнутреннийАдресМенеджераСервиса"); - ИмяСлужебногоПользователя = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "ИмяСлужебногоПользователяМенеджераСервиса", Истина); - УстановитьПривилегированныйРежим(Ложь); - - Возврат ИмяСлужебногоПользователя; + ВызываемыйМодульБТС = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаБТС"); + Возврат ВызываемыйМодульБТС.ИмяСлужебногоПользователяМенеджераСервиса(); КонецФункции @@ -1089,12 +936,8 @@ // Функция ПарольСлужебногоПользователяМенеджераСервиса() Экспорт - УстановитьПривилегированныйРежим(Истина); - Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ВнутреннийАдресМенеджераСервиса"); - ПарольСлужебногоПользователя = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "ПарольСлужебногоПользователяМенеджераСервиса", Истина); - УстановитьПривилегированныйРежим(Ложь); - - Возврат ПарольСлужебногоПользователя; + ВызываемыйМодульБТС = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаБТС"); + Возврат ВызываемыйМодульБТС.ПарольСлужебногоПользователяМенеджераСервиса(); КонецФункции @@ -1103,6 +946,12 @@ // подробное представление ошибки в журнал регистрации и вызывает // исключение с текстом краткого представления об ошибке. // +// Параметры: +// ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке, +// ИмяПодсистемы - Строка - имя подсистемы, +// ИмяВебСервиса - Строка - имя web-сервиса, +// ИмяОперации - Строка - имя операции. +// Процедура ОбработатьИнформациюОбОшибкеWebСервиса(Знач ИнформацияОбОшибке, Знач ИмяПодсистемы = "", Знач ИмяВебСервиса = "", Знач ИмяОперации = "") Экспорт Если ИнформацияОбОшибке = Неопределено Тогда @@ -1137,36 +986,108 @@ // Возвращает псевдоним пользователя, который должен использоваться в интерфейсе. // // Параметры: -// ИдентификаторПользователя - УникальныйИдентификатор. +// ИдентификаторПользователя - УникальныйИдентификатор - идентификатор пользователя. // -// Возвращаемое значение: Строка, псевдоним пользователя информационной базы -// для отображения в интерфейсе. +// Возвращаемое значение: +// Строка - псевдоним пользователя информационной базы для отображения в интерфейсе. // Функция ПсевдонимПользователяИнформационнойБазы(Знач ИдентификаторПользователя) Экспорт Псевдоним = ""; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииПсевдонимаПользователя"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним); - КонецЦикла; - + ИнтеграцияСТехнологиейСервиса.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним); Возврат Псевдоним; КонецФункции +// Получает в транзакции менеджер записи для регистра ОбластиДанных. +// +// Параметры: +// ОбластьДанных - Число - номер области данных. +// Статус - Перечисления.СтатусыОбластейДанных - ожидаемый статус области. +// +// Возвращаемое значение: +// РегистрыСведений.ОбластиДанных.МенеджерЗаписи - менеджер записи области данных. +// +Функция ПолучитьМенеджерЗаписиОбластиДанных(Знач ОбластьДанных, Знач Статус) Экспорт + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + Элемент = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); + Элемент.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", ОбластьДанных); + Элемент.Режим = РежимБлокировкиДанных.Разделяемый; + Блокировка.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные = ОбластьДанных; + МенеджерЗаписи.Прочитать(); + + Если НЕ МенеджерЗаписи.Выбран() Тогда + ШаблонСообщения = НСтр("ru = 'Область данных %1 не найдена'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ОбластьДанных); + ВызватьИсключение(ТекстСообщения); + ИначеЕсли МенеджерЗаписи.Статус <> Статус Тогда + ШаблонСообщения = НСтр("ru = 'Статус области данных %1 не равен ""%2""'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ОбластьДанных, Статус); + ВызватьИсключение(ТекстСообщения); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПодготовкаОбластиДанных(), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + КонецПопытки; + + Возврат МенеджерЗаписи; + +КонецФункции + +// Загружает данные в "типовую" область. +// +// Параметры: +// ОбластьДанных - Число - номер заполняемой области. +// ИДФайлаВыгрузки - УникальныйИдентификатор - ид файла начальных данных. +// Вариант - Строка - вариант начальных данных. +// СообщениеОбОшибке - Строка - возвращаемая, описание ошибки. +// +// Возвращаемое значение: +// Строка - один из вариантов "Успех", "ФатальнаяОшибка". +// +Функция ПодготовитьОбластьДанныхКИспользованиюИзЭталонной(Знач ОбластьДанных, Знач ИДФайлаВыгрузки, + Знач Вариант, СообщениеОбОшибке) Экспорт + + Если Константы.КопироватьОбластиДанныхИзЭталонной.Получить() Тогда + + Результат = ЗагрузитьОбластьИзПоставляемыхДанных(ОбластьДанных, ИДФайлаВыгрузки, Вариант, СообщениеОбОшибке); + Если Результат <> "Успех" Тогда + Возврат Результат; + КонецЕсли; + + Иначе + + Результат = "Успех"; + + КонецЕсли; + + ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Работа с файлами // Возвращает полное имя файла, полученного из файлового хранилища МС по его идентификатору. // // Параметры: -// ИДФайла - УникальныйИдентификатор - Идентификатор файла в файловом хранилище МС. +// ИДФайла - УникальныйИдентификатор - идентификатор файла в файловом хранилище МС. // // Возвращаемое значение: -// Строка - Полное имя извлеченного файла. +// Строка - Полное имя извлеченного файла. // Функция ПолучитьФайлИзХранилищаМенеджераСервиса(Знач ИДФайла) Экспорт @@ -1201,11 +1122,13 @@ // Добавляет файл в хранилище менеджера сервиса. // // Параметры: -// АдресДанныеФайл - Строка/ДвоичныеДанные/Файл - Адрес временного хранилища/Данные файла/Файл. -// ИмяФайла - Строка - Хранимое имя файла. +// АдресДанныеФайл - Строка - адрес файла во временном хранилище, +// - ДвоичныеДанные - двоичные данные файла, +// - Файл - файл. +// ИмяФайла - Строка - Хранимое имя файла. // // Возвращаемое значение: -// УникальныйИдентификатор - Идентификатор файла в хранилище. +// УникальныйИдентификатор - Идентификатор файла в хранилище. // Функция ПоместитьФайлВХранилищеМенеджераСервиса(Знач АдресДанныеФайл, Знач ИмяФайла = "") Экспорт @@ -1232,7 +1155,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если документ. // Функция ЭтоПолноеИмяДокумента(Знач ПолноеИмя) Экспорт @@ -1248,7 +1171,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если справочник. // Функция ЭтоПолноеИмяСправочника(Знач ПолноеИмя) Экспорт @@ -1264,7 +1187,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если перечисление. // Функция ЭтоПолноеИмяПеречисления(Знач ПолноеИмя) Экспорт @@ -1280,7 +1203,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если план обмена. // Функция ЭтоПолноеИмяПланаОбмена(Знач ПолноеИмя) Экспорт @@ -1296,7 +1219,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если план видов характеристик. // Функция ЭтоПолноеИмяПланаВидовХарактеристик(Знач ПолноеИмя) Экспорт @@ -1312,7 +1235,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если бизнес-процесс. // Функция ЭтоПолноеИмяБизнесПроцесса(Знач ПолноеИмя) Экспорт @@ -1328,7 +1251,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если задача. // Функция ЭтоПолноеИмяЗадачи(Знач ПолноеИмя) Экспорт @@ -1344,7 +1267,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если план счетов. // Функция ЭтоПолноеИмяПланаСчетов(Знач ПолноеИмя) Экспорт @@ -1360,7 +1283,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если план видов расчета. // Функция ЭтоПолноеИмяПланаВидовРасчета(Знач ПолноеИмя) Экспорт @@ -1378,7 +1301,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регистр сведений. // Функция ЭтоПолноеИмяРегистраСведений(Знач ПолноеИмя) Экспорт @@ -1394,7 +1317,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регистр накопления. // Функция ЭтоПолноеИмяРегистраНакопления(Знач ПолноеИмя) Экспорт @@ -1410,7 +1333,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регистр бухгалтерии. // Функция ЭтоПолноеИмяРегистраБухгалтерии(Знач ПолноеИмя) Экспорт @@ -1426,7 +1349,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регистр расчета. // Функция ЭтоПолноеИмяРегистраРасчета(Знач ПолноеИмя) Экспорт @@ -1445,7 +1368,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если перерасчет. // Функция ЭтоПолноеИмяПерерасчета(Знач ПолноеИмя) Экспорт @@ -1463,7 +1386,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если константа. // Функция ЭтоПолноеИмяКонстанты(Знач ПолноеИмя) Экспорт @@ -1481,7 +1404,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если журнал документов. // Функция ЭтоПолноеИмяЖурналаДокументов(Знач ПолноеИмя) Экспорт @@ -1499,7 +1422,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если последовательность. // Функция ЭтоПолноеИмяПоследовательности(Знач ПолноеИмя) Экспорт @@ -1517,7 +1440,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регламентное задание. // Функция ЭтоПолноеИмяРегламентногоЗадания(Знач ПолноеИмя) Экспорт @@ -1534,7 +1457,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если регистр. // Функция ЭтоПолноеИмяРегистра(Знач ПолноеИмя) Экспорт @@ -1552,7 +1475,7 @@ // принадлежность к заданному типу. // // Возвращаемое значение: -// Булево. +// Булево - Истина если ссылочный тип. // Функция ЭтоПолноеИмяОбъектаСсылочногоТипа(Знач ПолноеИмя) Экспорт @@ -1567,7 +1490,13 @@ КонецФункции -// Для внутреннего использования. +// Параметры выборки по полному имени объекта метаданных. +// +// Параметры: +// ПолноеИмяОбъектаМетаданных - Строка - полное имя объекта метаданных. +// +// Возвращаемое значение: +// Структура - параметры выборки. // Функция ПараметрыВыборки(Знач ПолноеИмяОбъектаМетаданных) Экспорт @@ -1597,7 +1526,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок копирования области данных. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииКопированиеОбластиДанных() Экспорт @@ -1605,7 +1537,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок блокировки области данных. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииБлокировкаОбластиДанных() Экспорт @@ -1613,7 +1548,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок подготовки области данных. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииПодготовкаОбластиДанных() Экспорт @@ -1621,7 +1559,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок получения файла из хранилища. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииПолучениеФайлаИзХранилища() Экспорт @@ -1629,7 +1570,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок добавления файла при обмене через файловую систему. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииДобавлениеФайлаОбменЧерезФС() Экспорт @@ -1637,7 +1581,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок добавления файла при обмене не через файловую систему. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииДобавлениеФайлаОбменНеЧерезФС() Экспорт @@ -1645,7 +1592,10 @@ КонецФункции -// Для внутреннего использования. +// Имя события журнала регистрации для записи ошибок удаления временного файла. +// +// Возвращаемое значение: +// Строка - имя события ошибки. // Функция СобытиеЖурналаРегистрацииУдалениеВременногоФайла() Экспорт @@ -1653,18 +1603,12 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Вызовы в другие подсистемы +// Прочее -// Формирует список параметров ИБ. -// -// Параметры: -// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. -// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). -// +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ЭтоРазделеннаяКонфигурация() Тогда ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ИспользоватьРазделениеПоОбластямДанных"); ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "РежимИспользованияИнформационнойБазы"); @@ -1674,6 +1618,17 @@ ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ВнутреннийАдресМенеджераСервиса"); + СтрокаПараметра = ТаблицаПараметров.Добавить(); + СтрокаПараметра.Имя = "ВнутреннийАдресМенеджераСервиса"; + СтрокаПараметра.Описание = НСтр("ru = 'Внутренний адрес Менеджера сервиса'"); + СтрокаПараметра.Тип = Новый ОписаниеТипов("Строка"); + + // Для совместимости с предыдущими версиями необходим параметр "URLСервиса" + СтрокаПараметра = ТаблицаПараметров.Добавить(); + СтрокаПараметра.Имя = "URLСервиса"; + СтрокаПараметра.Описание = НСтр("ru = 'Внутренний адрес Менеджера сервиса'"); + СтрокаПараметра.Тип = Новый ОписаниеТипов("Строка"); + СтрокаПараметра = ТаблицаПараметров.Добавить(); СтрокаПараметра.Имя = "ИмяСлужебногоПользователяМенеджераСервиса"; СтрокаПараметра.Описание = "ИмяСлужебногоПользователяМенеджераСервиса"; @@ -1685,10 +1640,6 @@ СтрокаПараметра.Тип = Новый ОписаниеТипов("Строка"); СтрокаПараметра.ЗапретЧтения = Истина; - // Для совместимости с предыдущими версиями. - СтрокаПараметра = ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ВнутреннийАдресМенеджераСервиса"); - СтрокаПараметра.Имя = "URLСервиса"; - СтрокаПараметра = ТаблицаПараметров.Добавить(); СтрокаПараметра.Имя = "ИмяСлужебногоПользователяСервиса"; СтрокаПараметра.Описание = "ИмяСлужебногоПользователяСервиса"; @@ -1707,12 +1658,7 @@ СтрокаПараметра.ЗапретЗаписи = Истина; СтрокаПараметра.Тип = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); КонецПроцедуры @@ -1723,20 +1669,19 @@ // Значение ключа Имя всегда содержит имя в хранилище. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор. -// ПараметрыПодключения - Структура: -// - URL - Строка - URL сервиса. Обязательно должно присутствовать и быть заполненным. -// - UserName - Строка - Имя пользователя сервиса. -// - Password - Строка - Пароль пользователя сервиса. -// ПутьВместоДанных - Булево - Что возвращать. -// ПроверятьСуществование - Булево - Проверять ли существования файла в случае ошибки его получения. +// ИдентификаторФайла - УникальныйИдентификатор - уникальный идентификатор файла, +// ПараметрыПодключения - Структура - поля: +// * URL - Строка - URL сервиса, обязательно должно присутствовать и быть заполненным, +// * UserName - Строка - имя пользователя сервиса, +// * Password - Строка - пароль пользователя сервиса, +// ПутьВместоДанных - Булево - что возвращать, +// ПроверятьСуществование - Булево - Проверять ли существования файла в случае ошибки его получения. // // Возвращаемое значение: -// ОписаниеФайла - Структура: -// Имя - Строка - имя файла в хранилище. -// Данные - ДвоичныеДанные - данные файла. -// ПолноеИмя - Строка - полное имя файла. -// - Файл будет удален автоматически по истечении срока хранения временных файлов. +// Структура - описание файла: +// * Имя - Строка - имя файла в хранилище. +// * Данные - ДвоичныеДанные - данные файла. +// * ПолноеИмя - Строка - полное имя файла (файл будет удален автоматически по истечении срока хранения временных файлов). // Функция ПолучитьФайлИзХранилища(Знач ИдентификаторФайла, Знач ПараметрыПодключения, Знач ПутьВместоДанных = Ложь, Знач ПроверятьСуществование = Ложь) Экспорт @@ -1973,11 +1918,8 @@ // Записывает тестовый файл на диск, возвращая его имя и размер. // Файл должна удалять вызывающая сторона. // -// Параметры: -// РазмерФайла - Число. -// // Возвращаемое значение: -// Строка - Имя пробного файла без пути. +// Строка - Имя пробного файла без пути. // Функция ЗаписатьПробныйФайл() Экспорт @@ -1992,16 +1934,13 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Дополнительные действия, выполняемые при изменении разделения сеанса. // Процедура ПриИзмененииОбластиДанных() Экспорт ОчиститьВсеПараметрыСеансаКромеРазделителей(); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() И ТекущийРежимЗапуска() <> Неопределено Тогда МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); @@ -2029,6 +1968,9 @@ // Регистрирует обработчики поставляемых данных за день и за все время. // +// Параметры: +// Обработчики - ТаблицаЗначений - таблица обработчиков. +// Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -2043,8 +1985,8 @@ // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево, возвращаемое. +// Дескриптор - ОбъектXDTO - Descriptor. +// Загружать - Булево - возвращаемое значение. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -2068,10 +2010,9 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено. Полное имя извлеченного файла. Файл будет автоматически удален -// после завершения процедуры. Если в менеджере сервиса не был -// указан файл - значение аргумента равно Неопределено. +// Дескриптор - ОбъектXDTO - Дескриптор, +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален после завершения процедуры, +// - Неопределено - если в менеджере сервиса не был указан файл. // Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт @@ -2083,14 +2024,354 @@ // Вызывается при отмене обработки данных в случае сбоя. // +// Параметры: +// Дескриптор - ОбъектXDTO - Дескриптор. +// Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт КонецПроцедуры +// Для общего модуля РаботаВМоделиСервисаПовтИсп. + +// Определяет, сеанс запущен с разделителями или без. +// +// Возвращаемое значение: +// Булево - Истина, если сеанс запущен без разделителей. +// +Функция СеансЗапущенБезРазделителей() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей(); + +КонецФункции + +// Возвращает признак наличия в конфигурации общих реквизитов-разделителей. +// +// Возвращаемое значение: +// Булево - Истина, если это разделенная конфигурация. +// +Функция ЭтоРазделеннаяКонфигурация() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация(); + +КонецФункции + +// Возвращает признак того, что объект метаданных используется в общих реквизитах-разделителях. +// +// Параметры: +// ОбъектМетаданных - Строка - имя объекта метаданных. +// Разделитель - Строка - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. +// +// Возвращаемое значение: +// Булево - Истина, если это разделенный объект. +// +Функция ЭтоРазделенныйОбъектМетаданных(Знач ОбъектМетаданных, Знач Разделитель = Неопределено) Экспорт + + Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда + ПолноеИмяОбъектаМетаданных = ОбъектМетаданных; + Иначе + ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); + КонецЕсли; + + Возврат РаботаВМоделиСервисаПовтИсп.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяОбъектаМетаданных, Разделитель); + +КонецФункции + +// Возвращает массив сериализуемых структурных типов, поддерживаемых в настоящее время. +// +// Возвращаемое значение: +// ФиксированныйМассив - элементы типа Тип. +// +Функция СериализуемыеСтруктурныеТипы() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СериализуемыеСтруктурныеТипы(); + +КонецФункции + +// Возвращает конечную точку для отправки сообщений в менеджер сервиса. +// +// Возвращаемое значение: +// ПланОбменСсылка.ОбменСообщениями - узел соответствующий менеджеру сервиса. +// +Функция КонечнаяТочкаМенеджераСервиса() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.КонечнаяТочкаМенеджераСервиса(); + +КонецФункции + +// Возвращает соответствие видов контактной информации пользователя видам. +// КИ используемой в XDTO модели сервиса. +// +// Возвращаемое значение: +// Соответствие - соответствие видов КИ. +// +Функция СоответствиеВидовКИПользователяXDTO() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO(); + +КонецФункции + +// Возвращает соответствие видов контактной информации XDTO видам. +// КИ пользователя. +// +// Возвращаемое значение: +// Соответствие - соответствие видов КИ. +// +Функция СоответствиеВидовКИXDTOВидамКИПользователя() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИXDTOВидамКИПользователя(); + +КонецФункции + +// Возвращает соответствие прав XDTO используемым в модели сервиса возможным +// действиям с пользователем сервиса. +// +// Возвращаемое значение: +// Соответствие - соответствие прав действиям. +// +Функция СоответствиеПравXDTOДействиямСПользователемСервиса() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СоответствиеПравXDTOДействиямСПользователемСервиса(); + +КонецФункции + +// Возвращает описание модели данных, относящихся к области данных. +// +// Возвращаемое значение: +// ФиксированноеСоответствие - модель данных области +// * Ключ - ОбъектМетаданных - объект метаданных, +// * Значение - Строка - имя общего реквизита-разделителя. +// +Функция ПолучитьМодельДанныхОбласти() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); + +КонецФункции + +// Возвращает массив существующих в конфигурации разделителей. +// +// Возвращаемое значение: +// ФиксированныйМассив - массив имен общих реквизитов, которые +// являются разделителями. +// +Функция РазделителиКонфигурации() Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.РазделителиКонфигурации(); + +КонецФункции + +// Возвращает состав общего реквизита с заданным именем. +// +// Параметры: +// Имя - Строка - Имя общего реквизита. +// +// Возвращаемое значение: +// СоставОбщегоРеквизита - список объектов метаданных, в которые входит общий реквизит. +// +Функция СоставОбщегоРеквизита(Знач Имя) Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.СоставОбщегоРеквизита(Имя); + +КонецФункции + + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать метод платформы УстановитьМонопольныйРежим(Истина). +// +// Параметры: +// ПроверитьОтсутствиеДругихСеансов - Булево - проверять отсутствие других сеансов или нет. +// РазделяемаяБлокировка - Булево - это разделяемая блокировка. +// +Процедура ЗаблокироватьТекущуюОбластьДанных(Знач ПроверитьОтсутствиеДругихСеансов = Ложь, Знач РазделяемаяБлокировка = Ложь) Экспорт + + Если НЕ РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ВызватьИсключение(НСтр("ru = 'Блокировка области может быть установлена только при включенном использовании разделителей'")); + КонецЕсли; + + Ключ = СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( + РегистрыСведений.ОбластиДанных, + Новый Структура(РазделительВспомогательныхДанных(), ЗначениеРазделителяСеанса())); + + КоличествоПопыток = 5; + ТекущаяПопытка = 0; + Пока Истина Цикл + Попытка + ЗаблокироватьДанныеДляРедактирования(Ключ); + Прервать; + Исключение + ТекущаяПопытка = ТекущаяПопытка + 1; + + Если ТекущаяПопытка = КоличествоПопыток Тогда + ШаблонКомментария = НСтр("ru = 'Не удалось установить блокировку области данных по причине: + |%1'"); + ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииБлокировкаОбластиДанных(), + УровеньЖурналаРегистрации.Ошибка, + , + , + ТекстКомментария); + + ШаблонТекста = НСтр("ru = 'Не удалось установить блокировку области данных по причине: + |%1'"); + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение(Текст); + КонецЕсли; + КонецПопытки; + КонецЦикла; + + Если ПроверитьОтсутствиеДругихСеансов Тогда + + КонфликтующиеСеансы = Новый Массив(); + + Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл + Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда + Продолжить; + КонецЕсли; + + КлиентскиеПриложения = Новый Массив; + КлиентскиеПриложения.Добавить(ВРег("1CV8")); + КлиентскиеПриложения.Добавить(ВРег("1CV8C")); + КлиентскиеПриложения.Добавить(ВРег("WebClient")); + КлиентскиеПриложения.Добавить(ВРег("COMConnection")); + КлиентскиеПриложения.Добавить(ВРег("WSConnection")); + КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); + Если КлиентскиеПриложения.Найти(ВРег(Сеанс.ИмяПриложения)) = Неопределено Тогда + Продолжить; + КонецЕсли; + + КонфликтующиеСеансы.Добавить(Сеанс); + + КонецЦикла; + + Если КонфликтующиеСеансы.Количество() > 0 Тогда + + РазблокироватьДанныеДляРедактирования(Ключ); + + ТекстСеансы = ""; + Для Каждого КонфликтующийСеанс Из КонфликтующиеСеансы Цикл + + Если Не ПустаяСтрока(ТекстСеансы) Тогда + ТекстСеансы = ТекстСеансы + ", "; + КонецЕсли; + + ТекстСеансы = ТекстСеансы + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (сеанс - %2)'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + КонфликтующийСеанс.Пользователь.Имя, + Формат(КонфликтующийСеанс.НомерСеанса, "ЧГ=0")); + + КонецЦикла; + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Операция не может быть выполнена, т.к. в приложении работают другие пользователи: %1'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ТекстСеансы); + + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + КонецЕсли; + + Если НЕ РазделяемаяБлокировка Тогда + УстановитьМонопольныйРежим(Истина); + Возврат; + КонецЕсли; + + МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); + + Блокировка = Новый БлокировкаДанных; + + Для Каждого ЭлементМодели Из МодельДанных Цикл + + ПолноеИмяОбъектаМетаданных = ЭлементМодели.Ключ; + ОписаниеОбъектаМетаданных = ЭлементМодели.Значение; + + ПространствоБлокировки = ПолноеИмяОбъектаМетаданных; + + Если ЭтоПолноеИмяРегистра(ПолноеИмяОбъектаМетаданных) Тогда + + БлокироватьНаборы = Истина; + Если ЭтоПолноеИмяРегистраСведений(ПолноеИмяОбъектаМетаданных) Тогда + ОбъектМетаданныхОбласти = Метаданные.РегистрыСведений.Найти(ОписаниеОбъектаМетаданных.Имя); + Если ОбъектМетаданныхОбласти.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда + БлокироватьНаборы = Ложь; + КонецЕсли; + КонецЕсли; + + Если БлокироватьНаборы Тогда + ПространствоБлокировки = ПространствоБлокировки + ".НаборЗаписей"; + КонецЕсли; + + ИначеЕсли ЭтоПолноеИмяПоследовательности(ПолноеИмяОбъектаМетаданных) Тогда + + ПространствоБлокировки = ПространствоБлокировки + ".Записи"; + + ИначеЕсли ЭтоПолноеИмяЖурналаДокументов(ПолноеИмяОбъектаМетаданных) + ИЛИ ЭтоПолноеИмяПеречисления(ПолноеИмяОбъектаМетаданных) + ИЛИ ЭтоПолноеИмяПоследовательности(ПолноеИмяОбъектаМетаданных) + ИЛИ ЭтоПолноеИмяРегламентногоЗадания(ПолноеИмяОбъектаМетаданных) Тогда + + Продолжить; + + КонецЕсли; + + ЭлементБлокировки = Блокировка.Добавить(ПространствоБлокировки); + + Если РазделяемаяБлокировка Тогда + + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + + КонецЕсли; + + КонецЦикла; + + Блокировка.Заблокировать(); + +КонецПроцедуры + +// Устарела. Следует использовать метод платформы УстановитьМонопольныйРежим(Ложь). +Процедура РазблокироватьТекущуюОбластьДанных() Экспорт + + Ключ = СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( + РегистрыСведений.ОбластиДанных, + Новый Структура(РазделительВспомогательныхДанных(), ЗначениеРазделителяСеанса())); + + РазблокироватьДанныеДляРедактирования(Ключ); + + УстановитьМонопольныйРежим(Ложь); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс +// Возвращает список полных имен всех объектов метаданных, использующихся в общем реквизите-разделителе, +// имя которого передано в качестве значения параметра Разделитель, и значения свойств объекта метаданных, +// которые могут потребоваться для дальнейшей его обработки в универсальных алгоритмах. +// Для последовательностей и журналов документов определяет разделенность по входящим документам: любому из. +// +// Параметры: +// Разделитель - Строка, имя общего реквизита. +// +// Возвращаемое значение: +// ФиксированноеСоответствие, +// Ключ - Строка, полное имя объекта метаданных, +// Значение - ФиксированнаяСтруктура, +// Имя - Строка, имя объекта метаданных, +// Разделитель - Строка, имя разделителя, которым разделен объект метаданных, +// УсловноеРазделение - Строка, полное имя объекта метаданных, выступающего в качестве условия использования +// разделения объекта метаданных данным разделителем. +// +Функция РазделенныеОбъектыМетаданных(Знач Разделитель) Экспорт + + Возврат РаботаВМоделиСервисаПовтИсп.РазделенныеОбъектыМетаданных(Разделитель); + +КонецФункции + // Параметры: // ЗаданиеМетаданные - ОбъектМетаданных - метаданные предопределенного регламентного задания. // Использование - Булево - Истина, если задание нужно включить, иначе Ложь. @@ -2124,7 +2405,7 @@ |Без внедрения этой библиотеки конфигурация не может использоваться в модели сервиса. | |Для использования этой конфигурации в модели сервиса требуется внедрить библиотеку - |""1С:Библиотека технологии сервиса"" версии не младше %1!'", Метаданные.ОсновнойЯзык.КодЯзыка), + |""1С:Библиотека технологии сервиса"" версии не младше %1.'", Метаданные.ОсновнойЯзык.КодЯзыка), ТребуемаяВерсияБТС()); Иначе @@ -2135,9 +2416,9 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для использования конфигурации в модели сервиса с текущей версией БСП требуется - |обновить используемую версию библиотеки ""1С:Библиотека технологии сервиса""! + |обновить используемую версию библиотеки ""1С:Библиотека технологии сервиса"". | - |Используемая версия: %1, требуется версия не младше %2!'", Метаданные.ОсновнойЯзык.КодЯзыка), + |Используемая версия: %1, требуется версия не младше %2.'", Метаданные.ОсновнойЯзык.КодЯзыка), ВерсияБТС, ТребуемаяВерсияБТС()); КонецЕсли; @@ -2161,283 +2442,58 @@ КонецПроцедуры -// Объявляет события подсистемы РаботаВМоделиСервиса: -// -// Серверные события: -// ПриУдаленииОбластиДанных, -// ПриПолученииТаблицыПараметровИБ, -// ПриУстановкеЗначенийПараметровИБ, -// ПриЗаполненииТаблицыПараметровИБ, -// ПриУстановкеПравПоУмолчанию, -// ПослеЗагрузкиДанныхИзДругойМодели. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается при удалении области данных. - // В процедуре необходимо удалить данные области данных, которые не - // могут быть удалены стандартным механизмом. - // - // Параметры: - // ОбластьДанных - Тип значения разделителя - значение разделителя - // удаляемой области данных. - // - // Синтаксис: - // Процедура ПриУдаленииОбластиДанных(Знач ОбластьДанных) Экспорт - // - // (То же, что РаботаВМоделиСервисаПереопределяемый.ПриУдаленииОбластиДанных). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУдаленииОбластиДанных"); - - // Формирует список параметров ИБ. - // - // Параметры: - // ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. - // Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). - // - // Синтаксис: - // Процедура ПриПолученииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - // - // (То же, что РаботаВМоделиСервисаПереопределяемый.ПолучитьТаблицуПараметровИБ). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриПолученииТаблицыПараметровИБ"); - - // Вызывается перед попыткой записи значений параметров ИБ в одноименные - // константы. - // - // Параметры: - // ЗначенияПараметров - Структура - значения параметров которые требуется установить. - // В случае если значение параметра устанавливается в данной процедуре из структуры - // необходимо удалить соответствующую пару КлючИЗначение. - // - // Синтаксис: - // Процедура ПриУстановкеЗначенийПараметровИБ(Знач ЗначенияПараметров) Экспорт - // - // (То же, что РаботаВМоделиСервисаПереопределяемый.ПриУстановкеЗначенийПараметровИБ). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеЗначенийПараметровИБ"); - - // Формирует список параметров ИБ. - // - // Параметры: - // ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. - // Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). - // - // Синтаксис: - // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - // - // Для использования в других библиотеках. - // - // (То же, что РаботаВМоделиСервисаПереопределяемый.ПолучитьТаблицуПараметровИБ). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"); - - // Устанавливает пользователю права по умолчанию. - // Вызывается при работе в модели сервиса, в случае обновления в менеджере - // сервиса прав пользователя без прав администрирования. - // - // Параметры: - // Пользователь - СправочникСсылка.Пользователи - пользователь, которому - // требуется установить права по умолчанию. - // - // Синтаксис: - // Процедура ПриУстановкеПравПоУмолчанию(Пользователь) Экспорт - // - // (То же, что РаботаВМоделиСервисаПереопределяемый.УстановитьПраваПоУмолчанию). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеПравПоУмолчанию"); - - // Вызывается при определении псевдонима пользователя для отображения в интерфейсе. - // - // Параметры: - // ИдентификаторПользователя - УникальныйИдентификатор, - // Псевдоним - Строка, псевдоним пользователя. - // - // Синтаксис: - // Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииПсевдонимаПользователя"); - - // Вызывается при определении списка метаданных, которые являются не разделенными - // и которые можно записывать из разделенного сеанса. Процедура должна в массив Исключения добавить ссылки - // на исключаемые при проверке объекты метаданных. Эти метаданные могут отсутствовать в подписках, которые - // проверяют запрет на запись неразделенных данных из разделенного сеанса. - - // Синтаксис: - // Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) - - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииИсключенийНеразделенныхДанных"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( - "РаботаВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "РаботаВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( - "РаботаВМоделиСервиса"); - КонецЕсли; - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РаботаВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( - "РаботаВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "РаботаВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "РаботаВМоделиСервиса"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "РаботаВМоделиСервиса"); - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанных"].Добавить( - "РаботаВМоделиСервиса"); - КонецЕсли; - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеЗначенийПараметровИБ"].Добавить( - "РаботаВМоделиСервиса"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. +// Пытается выполнить запрос в несколько попыток. +// Используется для чтения вне транзакции часто изменяемых данных. +// При вызове в транзакции выдает ошибку. // // Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. +// Запрос - Запрос - запрос который требуется выполнить. // -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт +// Возвращаемое значение: +// РезультатЗапроса - результат выполнения запроса. +// +Функция ВыполнитьЗапросВнеТранзакции(Знач Запрос) Экспорт - СоответствиеИменПсевдонимам.Вставить("РаботаВМоделиСервиса.ПодготовитьОбластьДанныхКИспользованию"); + Если ТранзакцияАктивна() Тогда + ВызватьИсключение(НСтр("ru = 'Транзакция активна. Выполнение запроса вне транзакции невозможно.'")); + КонецЕсли; - СоответствиеИменПсевдонимам.Вставить("РаботаВМоделиСервиса.ОчиститьОбластьДанных"); + КоличествоПопыток = 0; -КонецПроцедуры + Результат = Неопределено; + Пока Истина Цикл + Попытка + Результат = Запрос.Выполнить(); // Чтение вне транзакции, возможно появление ошибки. + // Could not continue scan with NOLOCK due to data movement + // в этом случае нужно повторить попытку чтения. + Прервать; + Исключение + КоличествоПопыток = КоличествоПопыток + 1; + Если КоличествоПопыток = 5 Тогда + ВызватьИсключение; + КонецЕсли; + КонецПопытки; + КонецЦикла; + + Возврат Результат; + +КонецФункции -// Формирует таблицу регламентных заданий -// с признаком использования в модели сервиса. +// Возвращает XML представление типа XDTO. // // Параметры: -// ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо -// заполнить регламентными заданиями и признаком использования, колонки: -// РегламентноеЗадание - Строка - имя предопределенного регламентного задания. -// Использование - Булево - Истина, если регламентное задание должно -// выполняться в модели сервиса. Ложь - если не должно. +// ТипXDTO - ТипОбъектаXDTO, ТипЗначенияXDTO - тип XDTO для которого требуется получить. +// XML представление. // -Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт - - НоваяСтрока = ТаблицаИспользования.Добавить(); - НоваяСтрока.РегламентноеЗадание = "ОбслуживаниеОбластейДанных"; - НоваяСтрока.Использование = Истина; - -КонецПроцедуры - -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". +// Возвращаемое значение: +// Строка - XML представление типа XDTO. // -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт +Функция ПредставлениеТипаXDTO(ТипXDTO) Экспорт - // Загрузка в классификатор валюты запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ОчередьЗаданийОбластейДанных.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; + Возврат СериализаторXDTO.XMLСтрока(Новый РасширенноеИмяXML(ТипXDTO.URIПространстваИмен, ТипXDTO.Имя)) -КонецПроцедуры +КонецФункции -/////////////////////////////////////////////////////////////////////////////// -// Проверка безопасного режима разделения данных. - -// Проверка безопасного режима разделения данных. -// Только для вызова из модуля сеанса. -// -Процедура ПриПроверкеВключенияБезопасногоРежимаРазделенияДанных() Экспорт - - Если БезопасныйРежим() = Ложь - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда - - Если НЕ БезопасныйРежимРазделенияДанных(РазделительВспомогательныхДанных()) Тогда - - УстановитьБезопасныйРежимРазделенияДанных(РазделительВспомогательныхДанных(), Истина); - - КонецЕсли; - - Если НЕ БезопасныйРежимРазделенияДанных(РазделительОсновныхДанных()) Тогда - - УстановитьБезопасныйРежимРазделенияДанных(РазделительОсновныхДанных(), Истина); - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////// -// Проверка блокировки области данных при запуске. - -// Проверка заблокированности области данных при запуске. -// Только для вызова из СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(). -// -Процедура ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И ОбластьДанныхЗаблокирована(ОбщегоНазначения.ЗначениеРазделителяСеанса()) Тогда - - ОписаниеОшибки = - НСтр("ru = 'Запуск приложения временно недоступен. - |Выполняются регламентные операции по обслуживанию приложения. - | - |Попробуйте запустить приложение через несколько минут.'"); - - КонецЕсли; - -КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Контроль неразделенных данных. @@ -2549,6 +2605,220 @@ Возврат Результат; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("РаботаВМоделиСервиса.ПодготовитьОбластьДанныхКИспользованию"); + + СоответствиеИменПсевдонимам.Вставить("РаботаВМоделиСервиса.ОчиститьОбластьДанных"); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. +Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт + + НоваяСтрока = ТаблицаИспользования.Добавить(); + НоваяСтрока.РегламентноеЗадание = "ОбслуживаниеОбластейДанных"; + НоваяСтрока.Использование = Истина; + +КонецПроцедуры + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + // Загрузка в классификатор валюты запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ОчередьЗаданийОбластейДанных.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.Константы.КлючОбластиДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ОбластиДанных); + +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + + ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса(); + + РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных(); + +КонецПроцедуры + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); + +КонецПроцедуры + +// Проверка безопасного режима разделения данных. +// Только для вызова из модуля сеанса. +// +Процедура ПриПроверкеВключенияБезопасногоРежимаРазделенияДанных() Экспорт + + Если БезопасныйРежим() = Ложь + И РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() + И НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() Тогда + + Если НЕ БезопасныйРежимРазделенияДанных(РазделительВспомогательныхДанных()) Тогда + + УстановитьБезопасныйРежимРазделенияДанных(РазделительВспомогательныхДанных(), Истина); + + КонецЕсли; + + Если НЕ БезопасныйРежимРазделенияДанных(РазделительОсновныхДанных()) Тогда + + УстановитьБезопасныйРежимРазделенияДанных(РазделительОсновныхДанных(), Истина); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Проверка заблокированности области данных при запуске. +// Только для вызова из СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(). +// +Процедура ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки) Экспорт + + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() + И ОбластьДанныхЗаблокирована(ЗначениеРазделителяСеанса()) Тогда + + ОписаниеОшибки = + НСтр("ru = 'Запуск приложения временно недоступен. + |Выполняются регламентные операции по обслуживанию приложения. + | + |Попробуйте запустить приложение через несколько минут.'"); + + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.31"; + Обработчик.Процедура = "РаботаВМоделиСервиса.ПеренестиОбластиДанных"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 99; + Обработчик.МонопольныйРежим = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.9"; + Обработчик.Процедура = "РаботаВМоделиСервиса.ОтключитьРазделениеПользователейПоРазделителюВнутреннихДанных"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.МонопольныйРежим = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "РаботаВМоделиСервиса.КонтрольНеразделенныхДанныхПриОбновлении"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 99; + Обработчик.МонопольныйРежим = Ложь; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "РаботаВМоделиСервиса.КонтрольРазделителейПриОбновлении"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 99; + Обработчик.МонопольныйРежим = Ложь; + + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "РаботаВМоделиСервиса.ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 99; + Обработчик.МонопольныйРежим = Ложь; + + КонецЕсли; + + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.4.9"; + Обработчик.Процедура = "РаботаВМоделиСервиса.ПеренестиРейтингАктивностиОбластейДанных"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.МонопольныйРежим = Истина; + + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + ПриДобавленииПараметровРаботыКлиента(Параметры); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() + ИЛИ НЕ РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПредставлениеОбластиДанных.Значение КАК Представление + |ИЗ + | Константа.ПредставлениеОбластиДанных КАК ПредставлениеОбластиДанных + |ГДЕ + | ПредставлениеОбластиДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; + УстановитьПривилегированныйРежим(Истина); + Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ЗначениеРазделителяСеанса()); + // Считаем данные условно неизменяемыми. + Результат = Запрос.Выполнить(); + УстановитьПривилегированныйРежим(Ложь); + Если НЕ Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Если РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() Тогда + Параметры.Вставить("ПредставлениеОбластиДанных", + Формат(ЗначениеРазделителяСеанса(), "ЧН=0; ЧГ=") + " - " + Выборка.Представление); + ИначеЕсли НЕ ПустаяСтрока(Выборка.Представление) Тогда + Параметры.Вставить("ПредставлениеОбластиДанных", Выборка.Представление); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт + + ПользователиСлужебный.ПослеЗагрузкиДанных(Контейнер); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный.РассчитатьИтоги(); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2592,51 +2862,6 @@ //////////////////////////////////////////////////////////////////////////////// // Подготовка областей данных -// Получает в транзакции менеджер записи для регистра ОбластиДанных. -// -// Параметры: -// ОбластьДанных - номер области данных. -// Статус - Перечисления.СтатусыОбластейДанных, ожидаемый статус области. -// -// Возвращаемое значение: -// РегистрыСведений.ОбластиДанных.МенеджерЗаписи. -// -Функция ПолучитьМенеджерЗаписиОбластиДанных(Знач ОбластьДанных, Знач Статус) - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - Элемент = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); - Элемент.УстановитьЗначение("ОбластьДанныхВспомогательныеДанные", ОбластьДанных); - Элемент.Режим = РежимБлокировкиДанных.Разделяемый; - Блокировка.Заблокировать(); - - МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные = ОбластьДанных; - МенеджерЗаписи.Прочитать(); - - Если НЕ МенеджерЗаписи.Выбран() Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 не найдена'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ОбластьДанных); - ВызватьИсключение(ТекстСообщения); - ИначеЕсли МенеджерЗаписи.Статус <> Статус Тогда - ШаблонСообщения = НСтр("ru = 'Статус области данных %1 не равен ""%2""'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ОбластьДанных, Статус); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПодготовкаОбластиДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; - - Возврат МенеджерЗаписи; - -КонецФункции - // Обновляет статус области в регистре ОбластиДанных, отправляет сообщение в менеджер сервиса. // // Параметры: @@ -2652,24 +2877,26 @@ МенеджерЗаписи = КопияМенеджера; ВключатьСообщениеОбОшибке = Ложь; + + ВызываемыйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс"); Если РезультатПодготовки = "Успех" Тогда МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется; - ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОбластьДанныхПодготовлена(); + ТипСообщения = ВызываемыйМодуль.СообщениеОбластьДанныхПодготовлена(); ИначеЕсли РезультатПодготовки = "ТребуетсяКонвертация" Тогда МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.ИмпортИзФайла; - ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОшибкаПодготовкиОбластиДанныхТребуетсяКонвертация(); + ТипСообщения = ВызываемыйМодуль.СообщениеОшибкаПодготовкиОбластиДанныхТребуетсяКонвертация(); ИначеЕсли РезультатПодготовки = "ОбластьУдалена" Тогда МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Удалена; - ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОбластьДанныхУдалена(); + ТипСообщения = ВызываемыйМодуль.СообщениеОбластьДанныхУдалена(); ИначеЕсли РезультатПодготовки = "ФатальнаяОшибка" Тогда ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПодготовкаОбластиДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); МенеджерЗаписи.ОшибкаОбработки = Истина; - ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОшибкаПодготовкиОбластиДанных(); + ТипСообщения = ВызываемыйМодуль.СообщениеОшибкаПодготовкиОбластиДанных(); ВключатьСообщениеОбОшибке = Истина; ИначеЕсли РезультатПодготовки = "ОшибкаУдаления" Тогда МенеджерЗаписи.ОшибкаОбработки = Истина; - ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОшибкаУдаленияОбластиДанных(); + ТипСообщения = ВызываемыйМодуль.СообщениеОшибкаУдаленияОбластиДанных(); ВключатьСообщениеОбОшибке = Истина; Иначе ВызватьИсключение НСтр("ru = 'Неожиданный код возврата'"); @@ -2698,39 +2925,6 @@ КонецПроцедуры -// Загружает данные в "типовую" область. -// -// Параметры: -// ОбластьДанных - номер заполняемой области. -// ИДФайлаВыгрузки - ид файла начальных данных. -// Вариант - вариант начальных данных. -// СообщениеОбОшибке - строка, возвращаемая, описание ошибки. -// -// Возвращаемое значение: -// Строка - один из вариантов "Успех", "ФатальнаяОшибка". -// -Функция ПодготовитьОбластьДанныхКИспользованиюИзЭталонной(Знач ОбластьДанных, Знач ИДФайлаВыгрузки, - Знач Вариант, СообщениеОбОшибке) - - Если Константы.КопироватьОбластиДанныхИзЭталонной.Получить() Тогда - - Результат = ЗагрузитьОбластьИзПоставляемыхДанных(ОбластьДанных, ИДФайлаВыгрузки, Вариант, СообщениеОбОшибке); - Если Результат <> "Успех" Тогда - Возврат Результат; - КонецЕсли; - - Иначе - - Результат = "Успех"; - - КонецЕсли; - - ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); - - Возврат Результат; - -КонецФункции - // Загружает данные в область из пользовательской выгрузки. // // Параметры: @@ -2795,219 +2989,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Вызывается при включении разделения данных по областям данных. -// -Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - - ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса(); - - РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных(); - -КонецПроцедуры - -// Зарегистрировать обработчики поставляемых данных. -// -// При получении уведомления о доступности новых общих данных, вызывается процедуры. -// ДоступныНовыеДанные модулей, зарегистрированных через ПолучитьОбработчикиПоставляемыхДанных. -// В процедуру передается Дескриптор - ОбъектXDTO Descriptor. -// -// В случае, если ДоступныНовыеДанные устанавливает аргумент Загружать в значение Истина, -// данные загружаются, дескриптор и путь к файлу с данными передаются в процедуру. -// ОбработатьНовыеДанные. Файл будет автоматически удален после завершения процедуры. -// Если в менеджере сервиса не был указан файл - значение аргумента равно Неопределено. -// -// Параметры: -// Обработчики, ТаблицаЗначений - таблица для добавления обработчиков. -// Колонки: -// ВидДанных, строка - код вида данных, обрабатываемый обработчиком. -// КодОбработчика, строка(20) - будет использоваться при восстановлении обработки данных после сбоя. -// Обработчик, ОбщийМодуль - модуль, содержащий следующие процедуры: -// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт -// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт -// ОбработкаДанныхОтменена(Дескриптор) Экспорт -// -Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - - ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.31"; - Обработчик.Процедура = "РаботаВМоделиСервиса.ПеренестиОбластиДанных"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 99; - Обработчик.МонопольныйРежим = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.9"; - Обработчик.Процедура = "РаботаВМоделиСервиса.ОтключитьРазделениеПользователейПоРазделителюВнутреннихДанных"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.МонопольныйРежим = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "РаботаВМоделиСервиса.КонтрольНеразделенныхДанныхПриОбновлении"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 99; - Обработчик.МонопольныйРежим = Ложь; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "РаботаВМоделиСервиса.КонтрольРазделителейПриОбновлении"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 99; - Обработчик.МонопольныйРежим = Ложь; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "РаботаВМоделиСервиса.ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 99; - Обработчик.МонопольныйРежим = Ложь; - - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.4.9"; - Обработчик.Процедура = "РаботаВМоделиСервиса.ПеренестиРейтингАктивностиОбластейДанных"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.МонопольныйРежим = Истина; - - КонецЕсли; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - ПриДобавленииПараметровРаботыКлиента(Параметры); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПредставлениеОбластиДанных.Значение КАК Представление - |ИЗ - | Константа.ПредставлениеОбластиДанных КАК ПредставлениеОбластиДанных - |ГДЕ - | ПредставлениеОбластиДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; - УстановитьПривилегированныйРежим(Истина); - Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса()); - // Считаем данные условно неизменяемыми. - Результат = Запрос.Выполнить(); - УстановитьПривилегированныйРежим(Ложь); - Если НЕ Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Если ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда - Параметры.Вставить("ПредставлениеОбластиДанных", - Формат(ОбщегоНазначения.ЗначениеРазделителяСеанса(), "ЧН=0; ЧГ=") + " - " + Выборка.Представление); - ИначеЕсли НЕ ПустаяСтрока(Выборка.Представление) Тогда - Параметры.Вставить("ПредставлениеОбластиДанных", Выборка.Представление); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.Константы.КлючОбластиДанных); - Типы.Добавить(Метаданные.РегистрыСведений.ОбластиДанных); - -КонецПроцедуры - -// Вызывается перед попыткой записи значений параметров ИБ в одноименные -// константы. -// -// Параметры: -// ЗначенияПараметров - Структура - значения параметров которые требуется установить. -// В случае если значение параметра устанавливается в данной процедуре из структуры -// необходимо удалить соответствующую пару КлючИЗначение. -// -Процедура ПриУстановкеЗначенийПараметровИБ(Знач ЗначенияПараметров) Экспорт - - // Для служебного пользователя Менеджера сервиса. - Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ВнутреннийАдресМенеджераСервиса"); - Если ЗначенияПараметров.Свойство("ИмяСлужебногоПользователяМенеджераСервиса") Тогда - УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ЗначенияПараметров.ИмяСлужебногоПользователяМенеджераСервиса, "ИмяСлужебногоПользователяМенеджераСервиса"); - УстановитьПривилегированныйРежим(Ложь); - ЗначенияПараметров.Удалить("ИмяСлужебногоПользователяМенеджераСервиса"); - КонецЕсли; - - Если ЗначенияПараметров.Свойство("ПарольСлужебногоПользователяМенеджераСервиса") Тогда - УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ЗначенияПараметров.ПарольСлужебногоПользователяМенеджераСервиса, "ПарольСлужебногоПользователяМенеджераСервиса"); - УстановитьПривилегированныйРежим(Ложь); - ЗначенияПараметров.Удалить("ПарольСлужебногоПользователяМенеджераСервиса"); - КонецЕсли; - -КонецПроцедуры - -// Вызывается после загрузки данных. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт - - ПользователиСлужебный.ПослеЗагрузкиДанных(Контейнер); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); - МодульУправлениеИтогамиИАгрегатамиСлужебный.РассчитатьИтоги(); - - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Работа с параметрами ИБ @@ -3928,9 +3909,9 @@ // Процедура КонтрольНеразделенныхДанныхПриЗаписи(Знач Источник) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.РазделениеВключено() И РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ПредставлениеИсключения = НСтр("ru = 'Нарушение прав доступа!'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ПредставлениеИсключения = НСтр("ru = 'Нарушение прав доступа.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации( ПредставлениеИсключения, @@ -3968,9 +3949,9 @@ ПроверяетсяСсылка = Ложь; КонецЕсли; - Если Не МонопольныйРежим() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПроверяемоеЗначение.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если Не МонопольныйРежим() И ЭтоРазделенныйОбъектМетаданных(ПроверяемоеЗначение.Метаданные(), РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()) Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда // В разделенном сеансе достаточно просто выполнить запись объекта. Если Записать Тогда @@ -3985,11 +3966,11 @@ // В неразделенном сеансе требуется переключение разделения сеанса для избежания // конфликта блокировок с сеансами, в которых установлено другое значение разделителя. Если ПроверяетсяСсылка Тогда - ЗначениеРазделителя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроверяемоеЗначение, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + ЗначениеРазделителя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроверяемоеЗначение, РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()); Иначе - ЗначениеРазделителя = ОбъектВспомогательныхДанных[ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()]; + ЗначениеРазделителя = ОбъектВспомогательныхДанных[РаботаВМоделиСервисаПовтИсп.РазделительВспомогательныхДанных()]; КонецЕсли; - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); + УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); ТребуетсяВосстановлениеРазделенияСеанса = Истина; Если Записать Тогда ОбъектВспомогательныхДанных.Записать(); @@ -4012,13 +3993,13 @@ КонецЕсли; Если ТребуетсяВосстановлениеРазделенияСеанса Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + УстановитьРазделениеСеанса(Ложь); КонецЕсли; Исключение Если ТребуетсяВосстановлениеРазделенияСеанса Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + УстановитьРазделениеСеанса(Ложь); КонецЕсли; ВызватьИсключение; @@ -4080,6 +4061,7 @@ КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ @@ -4235,14 +4217,10 @@ Исключения.Добавить(Метаданные.РегистрыСведений.Найти("ЗамерыОбластиСтатистики")); Исключения.Добавить(Метаданные.РегистрыСведений.Найти("СтатистикаКонфигурации")); Исключения.Добавить(Метаданные.РегистрыСведений.Найти("ПакетыДляОтправки")); - Исключения.Добавить(Метаданные.РегистрыСведений.Найти("ЗамерыСтатистики")); + Исключения.Добавить(Метаданные.РегистрыСведений.Найти("ЗамерыСтатистики")); КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииИсключенийНеразделенныхДанных"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииИсключенийНеразделенныхДанных(Исключения) - КонецЦикла; + ИнтеграцияСТехнологиейСервиса.ПриОпределенииИсключенийНеразделенныхДанных(Исключения); СтандартныеРазделители = Новый Массив; СтандартныеРазделители.Добавить(Метаданные.ОбщиеРеквизиты.ОбластьДанныхОсновныеДанные); @@ -4273,7 +4251,7 @@ ЧислоРазделителей = 0; Для Каждого СтандартныйРазделитель Из СтандартныеРазделители Цикл - Если ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(КонтролируемыйОбъектМетаданных, СтандартныйРазделитель.Имя) Тогда + Если ЭтоРазделенныйОбъектМетаданных(КонтролируемыйОбъектМетаданных, СтандартныйРазделитель.Имя) Тогда ЧислоРазделителей = ЧислоРазделителей + 1; КонецЕсли; КонецЦикла; @@ -4296,7 +4274,7 @@ ТребуетсяКонтроль = Истина; Для Каждого СтандартныйРазделитель Из СтандартныеРазделители Цикл - Если ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(КонтролируемыйОбъектМетаданных, СтандартныйРазделитель.Имя) Тогда + Если ЭтоРазделенныйОбъектМетаданных(КонтролируемыйОбъектМетаданных, СтандартныйРазделитель.Имя) Тогда ТребуетсяКонтроль = Ложь; @@ -4446,7 +4424,7 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Обнаружено нарушение структуры метаданных конфигурации: общий реквизит %1 должен |быть расположен в дереве метаданных конфигурации до общего реквизита - |%2 по порядку!'"), + |%2 по порядку.'"), РазделительВнутренний.Имя, РазделительПрикладной.Имя); diff --git a/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl index 59ec7b44c..02a83103f 100644 --- a/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl @@ -1,19 +1,12 @@ -/////////////////////////////////////////////////////////////////////////////////// -// РаботаВМоделиСервисаКлиент. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. +// Обработчики событий подсистем конфигурации. -// Вызывается перед интерактивным началом работы пользователя с областью данных. -// Соответствует событию ПередНачаломРаботыСистемы модулей приложения. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ОбластьДанныхЗаблокирована") Тогда Параметры.Отказ = Истина; diff --git a/SSL/src/CommonModules/РаботаВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервисаПереопределяемый/Module.bsl index 0b4a67995..1c822566f 100644 --- a/SSL/src/CommonModules/РаботаВМоделиСервисаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаВМоделиСервисаПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////////// -// РаботаВМоделиСервисаПереопределяемый. -// -/////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при удалении области данных. @@ -10,8 +5,7 @@ // могут быть удалены стандартным механизмом. // // Параметры: -// ОбластьДанных - Тип значения разделителя - значение разделителя -// удаляемой области данных. +// ОбластьДанных - Число - значение разделителя удаляемой области данных. // Процедура ПриУдаленииОбластиДанных(Знач ОбластьДанных) Экспорт @@ -20,8 +14,7 @@ // Формирует список параметров ИБ. // // Параметры: -// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. -// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). +// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт @@ -31,10 +24,10 @@ // констант. // // Параметры: -// ИменаПараметров - Массив строк - имена параметров, значения которых необходимо получить. -// В случае если значение параметра получается в данной процедуре, необходимо удалить -// имя обработанного параметра из массива. -// ЗначенияПараметров - Структура - значения параметров. +// ИменаПараметров - Массив - имена параметров, значения которых необходимо получить. +// В случае если значение параметра получается в данной процедуре, необходимо удалить имя обработанного параметра из +// массива. +// ЗначенияПараметров - Структура - значения параметров. // Процедура ПриПолученииЗначенийПараметровИБ(Знач ИменаПараметров, Знач ЗначенияПараметров) Экспорт @@ -44,9 +37,9 @@ // константы. // // Параметры: -// ЗначенияПараметров - Структура - значения параметров которые требуется установить. -// В случае если значение параметра устанавливается в данной процедуре из структуры -// необходимо удалить соответствую пару КлючИЗначение. +// ЗначенияПараметров - Структура - значения параметров которые требуется установить. +// В случае если значение параметра устанавливается в данной процедуре из структуры необходимо удалить соответствую +// пару КлючИЗначение. // Процедура ПриУстановкеЗначенийПараметровИБ(Знач ЗначенияПараметров) Экспорт @@ -61,6 +54,7 @@ // Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + КонецПроцедуры // Устанавливает пользователю права по умолчанию. diff --git a/SSL/src/CommonModules/РаботаВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервисаПовтИсп/Module.bsl index c244f965d..b5afcd226 100644 --- a/SSL/src/CommonModules/РаботаВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаВМоделиСервисаПовтИсп/Module.bsl @@ -1,14 +1,131 @@ -/////////////////////////////////////////////////////////////////////////////////// -// РаботаВМоделиСервисаПовтИсп. -// -/////////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс -#Область ПрограммныйИнтерфейс +// Определяет, сеанс запущен с разделителями или без. +// +// Возвращаемое значение: +// Булево - Истина, если сеанс запущен без разделителей. +// +Функция СеансЗапущенБезРазделителей() Экспорт + + Возврат ПользователиИнформационнойБазы.ТекущийПользователь().РазделениеДанных.Количество() = 0; + +КонецФункции + +// Возвращает признак наличия в конфигурации общих реквизитов-разделителей. +// +// Возвращаемое значение: +// Булево - Истина, если это разделенная конфигурация. +// +Функция ЭтоРазделеннаяКонфигурация() Экспорт + + ЕстьРазделители = Ложь; + Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл + Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда + ЕстьРазделители = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат ЕстьРазделители; + +КонецФункции + +// Возвращает признак того, что объект метаданных используется в общих реквизитах-разделителях. +// +// Параметры: +// ПолноеИмяОбъектаМетаданных - Строка - имя объекта метаданных. +// Разделитель - Строка - имя общего реквизита-разделителя, на разделение которыми проверяется объект метаданных. +// +// Возвращаемое значение: +// Булево - Истина, если это разделенный объект. +// +Функция ЭтоРазделенныйОбъектМетаданных(Знач ПолноеИмяОбъектаМетаданных, Знач Разделитель = Неопределено) Экспорт + + Если Разделитель = Неопределено Тогда + РазделениеПоОсновномуРеквизиту = РаботаВМоделиСервиса.РазделенныеОбъектыМетаданных(РазделительОсновныхДанных()); + РазделениеПоВспомогательномуРеквизиту = РаботаВМоделиСервиса.РазделенныеОбъектыМетаданных(РазделительВспомогательныхДанных()); + Результат = РазделениеПоОсновномуРеквизиту.Получить(ПолноеИмяОбъектаМетаданных) <> Неопределено + Или РазделениеПоВспомогательномуРеквизиту.Получить(ПолноеИмяОбъектаМетаданных) <> Неопределено; + Возврат Результат; + Иначе + РазделенныеОбъектыМетаданных = РаботаВМоделиСервиса.РазделенныеОбъектыМетаданных(Разделитель); + Возврат РазделенныеОбъектыМетаданных.Получить(ПолноеИмяОбъектаМетаданных) <> Неопределено; + КонецЕсли; + +КонецФункции + +// Возвращает имя общего реквизита, который является разделителем основных данных. +// +// Возвращаемое значение: +// Строка - имя общего реквизита. +// +Функция РазделительОсновныхДанных() Экспорт + + Возврат Метаданные.ОбщиеРеквизиты.ОбластьДанныхОсновныеДанные.Имя; + +КонецФункции + +// Возвращает имя общего реквизита, который является разделителем вспомогательных данных. +// +// Возвращаемое значение: +// Строка - имя общего реквизита. +// +Функция РазделительВспомогательныхДанных() Экспорт + + Возврат Метаданные.ОбщиеРеквизиты.ОбластьДанныхВспомогательныеДанные.Имя; + +КонецФункции + +// Возвращает признак работы в режиме разделения данных по областям +// (технически это признак условного разделения). +// +// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение включено. +// - Ложь, если разделение выключено или не поддерживается. +// +Функция РазделениеВключено() Экспорт + + Если Не ЭтоРазделеннаяКонфигурация() Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ПолучитьФункциональнуюОпцию("РаботаВМоделиСервиса") Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей). +// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено +// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным. +// +// Возвращает Истина, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение не поддерживается, либо разделение выключено, +// либо разделение включено и разделители установлены. +// - Ложь, если разделение включено и разделители не установлены. +// +Функция ДоступноИспользованиеРазделенныхДанных() Экспорт + + Если Не РаботаВМоделиСервиса.РазделениеВключено() Тогда + Возврат Истина; + КонецЕсли; + + Возврат РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса(); + +КонецФункции // Возвращает массив сериализуемых структурных типов, поддерживаемых в настоящее время. // // Возвращаемое значение: -// Фиксированный массив элементов типа Тип. +// ФиксированныйМассив - элементы типа Тип. // Функция СериализуемыеСтруктурныеТипы() Экспорт @@ -34,8 +151,8 @@ // Функция КонечнаяТочкаМенеджераСервиса() Экспорт - УстановитьПривилегированныйРежим(Истина); - Возврат Константы.КонечнаяТочкаМенеджераСервиса.Получить(); + ВызываемыйМодуль = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаБТС"); + Возврат ВызываемыйМодуль.КонечнаяТочкаМенеджераСервиса(); КонецФункции @@ -64,7 +181,7 @@ Функция СоответствиеВидовКИXDTOВидамКИПользователя() Экспорт Соответствие = Новый Соответствие; - Для каждого КлючИЗначение Из РаботаВМоделиСервисаПовтИсп.СоответствиеВидовКИПользователяXDTO() Цикл + Для каждого КлючИЗначение Из СоответствиеВидовКИПользователяXDTO() Цикл Соответствие.Вставить(КлючИЗначение.Значение, КлючИЗначение.Ключ); КонецЦикла; @@ -94,23 +211,23 @@ // Возвращает описание модели данных, относящихся к области данных. // // Возвращаемое значение: -// ФиксированноеСоответствие, -// Ключ - ОбъектМетаданных, -// Значение - Строка, имя общего реквизита-разделителя. +// ФиксированноеСоответствие - модель данных области +// * Ключ - ОбъектМетаданных - объект метаданных, +// * Значение - Строка - имя общего реквизита-разделителя. // Функция ПолучитьМодельДанныхОбласти() Экспорт Результат = Новый Соответствие(); - РазделительОсновныхДанных = ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных(); - ОсновныеДанныеОбласти = ОбщегоНазначенияПовтИсп.РазделенныеОбъектыМетаданных( + РазделительОсновныхДанных = РазделительОсновныхДанных(); + ОсновныеДанныеОбласти = РазделенныеОбъектыМетаданных( РазделительОсновныхДанных); Для Каждого ЭлементОсновныхДанныхОбласти Из ОсновныеДанныеОбласти Цикл Результат.Вставить(ЭлементОсновныхДанныхОбласти.Ключ, ЭлементОсновныхДанныхОбласти.Значение); КонецЦикла; - РазделительВспомогательныхДанных = ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных(); - ВспомогательныеДанныеОбласти = ОбщегоНазначенияПовтИсп.РазделенныеОбъектыМетаданных( + РазделительВспомогательныхДанных = РазделительВспомогательныхДанных(); + ВспомогательныеДанныеОбласти = РаботаВМоделиСервиса.РазделенныеОбъектыМетаданных( РазделительВспомогательныхДанных); Для Каждого ЭлементВспомогательныхДанныхОбласти Из ВспомогательныеДанныеОбласти Цикл Результат.Вставить(ЭлементВспомогательныхДанныхОбласти.Ключ, ЭлементВспомогательныхДанныхОбласти.Значение); @@ -120,4 +237,184 @@ КонецФункции +// Возвращает массив существующих в конфигурации разделителей. +// +// Возвращаемое значение: +// ФиксированныйМассив - массив имен общих реквизитов, которые +// являются разделителями. +// +Функция РазделителиКонфигурации() Экспорт + + МассивРазделителей = Новый Массив; + + Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл + Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда + МассивРазделителей.Добавить(ОбщийРеквизит.Имя); + КонецЕсли; + КонецЦикла; + + Возврат Новый ФиксированныйМассив(МассивРазделителей); + +КонецФункции + +// Возвращает состав общего реквизита с заданным именем. +// +// Параметры: +// Имя - Строка - Имя общего реквизита. +// +// Возвращаемое значение: +// СоставОбщегоРеквизита - список объектов метаданных, в которые входит общий реквизит. +// +Функция СоставОбщегоРеквизита(Знач Имя) Экспорт + + Возврат Метаданные.ОбщиеРеквизиты[Имя].Состав; + +КонецФункции + +// Возвращает список полных имен всех объектов метаданных, использующихся в общем реквизите-разделителе, +// имя которого передано в качестве значения параметра Разделитель, и значения свойств объекта метаданных, +// которые могут потребоваться для дальнейшей его обработки в универсальных алгоритмах. +// Для последовательностей и журналов документов определяет разделенность по входящим документам: любому из. +// +// Параметры: +// Разделитель - Строка, имя общего реквизита. +// +// Возвращаемое значение: +// ФиксированноеСоответствие, +// Ключ - Строка, полное имя объекта метаданных, +// Значение - ФиксированнаяСтруктура, +// Имя - Строка, имя объекта метаданных, +// Разделитель - Строка, имя разделителя, которым разделен объект метаданных, +// УсловноеРазделение - Строка, полное имя объекта метаданных, выступающего в качестве условия использования +// разделения объекта метаданных данным разделителем. +// +Функция РазделенныеОбъектыМетаданных(Знач Разделитель) Экспорт + + Результат = Новый Соответствие; + + // I. Перебрать состав всех общих реквизитов. + + МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(Разделитель); + Если МетаданныеОбщегоРеквизита = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий реквизит %1 не обнаружен в конфигурации.'"), Разделитель); + КонецЕсли; + + Если МетаданныеОбщегоРеквизита.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда + + СоставОбщегоРеквизита = СоставОбщегоРеквизита(МетаданныеОбщегоРеквизита.Имя); + + ИспользоватьОбщийРеквизит = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать; + АвтоИспользоватьОбщийРеквизит = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Авто; + АвтоИспользованиеОбщегоРеквизита = + (МетаданныеОбщегоРеквизита.АвтоИспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать); + + Для Каждого ЭлементСостава Из СоставОбщегоРеквизита Цикл + + Если (АвтоИспользованиеОбщегоРеквизита И ЭлементСостава.Использование = АвтоИспользоватьОбщийРеквизит) + ИЛИ ЭлементСостава.Использование = ИспользоватьОбщийРеквизит Тогда + + ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", ЭлементСостава.Метаданные.Имя, Разделитель, Неопределено); + Если ЭлементСостава.УсловноеРазделение <> Неопределено Тогда + ДополнительныеДанные.УсловноеРазделение = ЭлементСостава.УсловноеРазделение.ПолноеИмя(); + КонецЕсли; + + Результат.Вставить(ЭлементСостава.Метаданные.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + + // По регистрам расчета дополнительно определяется разделенность подчиненных им перерасчетов. + Если ОбщегоНазначения.ЭтоРегистрРасчета(ЭлементСостава.Метаданные) Тогда + + Перерасчеты = ЭлементСостава.Метаданные.Перерасчеты; + Для Каждого Перерасчет Из Перерасчеты Цикл + + ДополнительныеДанные.Имя = Перерасчет.Имя; + Результат.Вставить(Перерасчет.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Иначе + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Для общего реквизита %1 не используется разделение данных.'"), Разделитель); + + КонецЕсли; + + // II. Для последовательностей и журналов определять разделенность по входящим документам. + + // 1) Последовательности. Перебор с проверкой первого входящего документа. Если документов нет, считаем разделенной. + Для Каждого МетаданныеПоследовательности Из Метаданные.Последовательности Цикл + + ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", МетаданныеПоследовательности.Имя, Разделитель, Неопределено); + + Если МетаданныеПоследовательности.Документы.Количество() = 0 Тогда + + ШаблонСообщения = НСтр("ru = 'В последовательность %1 не включено ни одного документа.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, МетаданныеПоследовательности.Имя); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение разделенных объектов метаданных'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, + МетаданныеПоследовательности, , ТекстСообщения); + + Результат.Вставить(МетаданныеПоследовательности.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + + Иначе + + Для Каждого МетаданныеДокумента Из МетаданныеПоследовательности.Документы Цикл + + ДополнительныеДанныеОтДокумента = Результат.Получить(МетаданныеДокумента.ПолноеИмя()); + + Если ДополнительныеДанныеОтДокумента <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ДополнительныеДанные, ДополнительныеДанныеОтДокумента, "Разделитель,УсловноеРазделение"); + Результат.Вставить(МетаданныеПоследовательности.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + КонецЕсли; + + Прервать; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + + // 2) Журналы. Перебор с проверкой первого входящего документа. Если документов нет, считаем разделенным. + Для Каждого МетаданныеЖурналаДокументов Из Метаданные.ЖурналыДокументов Цикл + + ДополнительныеДанные = Новый Структура("Имя,Разделитель,УсловноеРазделение", МетаданныеЖурналаДокументов.Имя, Разделитель, Неопределено); + + Если МетаданныеЖурналаДокументов.РегистрируемыеДокументы.Количество() = 0 Тогда + + ШаблонСообщения = НСтр("ru = 'В журнал %1 не включено ни одного документа.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, МетаданныеЖурналаДокументов.Имя); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение разделенных объектов метаданных'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, + МетаданныеЖурналаДокументов, , ТекстСообщения); + + Результат.Вставить(МетаданныеЖурналаДокументов.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + + Иначе + + Для Каждого МетаданныеДокумента Из МетаданныеЖурналаДокументов.РегистрируемыеДокументы Цикл + + ДополнительныеДанныеОтДокумента = Результат.Получить(МетаданныеДокумента.ПолноеИмя()); + + Если ДополнительныеДанныеОтДокумента <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ДополнительныеДанные, ДополнительныеДанныеОтДокумента, "Разделитель,УсловноеРазделение"); + Результат.Вставить(МетаданныеЖурналаДокументов.ПолноеИмя(), Новый ФиксированнаяСтруктура(ДополнительныеДанные)); + КонецЕсли; + + Прервать; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + + Возврат Новый ФиксированноеСоответствие(Результат); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl new file mode 100644 index 000000000..6cd0029f6 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl @@ -0,0 +1,513 @@ +#Область ПрограммныйИнтерфейс + +// Возвращает наименование субъекта РФ для адреса или пустую строку, если субъект не определен. +// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. +// +// Параметры: +// XMLСтрока - Строка - Строка XML соответствующая XDTO пакету Адрес. +// +// Возвращаемое значение: +// Строка - Наименование региона. +// +Функция РегионАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + + Если ПустаяСтрока(XMLСтрока) Тогда + Возврат ""; + КонецЕсли; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLСтрока); + XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Адрес = XDTOАдрес.Состав; + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить субъекта РФ, ожидается адрес.'"); + КонецЕсли; + + АдресРФ = Обработки.РасширенныйВводКонтактнойИнформации.НациональныйАдрес(Адрес); + Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.СубъектРФ)); + +КонецФункции + +// Возвращает наименование города для адреса РФ или пустую строку для иностранного адреса. +// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. +// +// Параметры: +// XMLСтрока - Строка - Строка XML соответствующая XDTO пакету Адрес. +// +// Возвращаемое значение: +// Строка - Наименование города. +// +Функция ГородАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + + Если ПустаяСтрока(XMLСтрока) Тогда + Возврат ""; + КонецЕсли; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLСтрока); + XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Адрес = XDTOАдрес.Состав; + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить город, ожидается адрес.'"); + КонецЕсли; + + АдресРФ = Обработки.РасширенныйВводКонтактнойИнформации.НациональныйАдрес(Адрес); + Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.Город)); + +КонецФункции + +// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. +// +// Параметры: +// Адреса - Массив - XDTO объекты или строки XML соответствующие XDTO пакету Адрес. +// ДополнительныеПараметры - Структура - Параметры контактной информации: +// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. +// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. +// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. +// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. +// Возвращаемое значение: +// Массив - Содержит массив структур, содержимое структуры см. описание функции СведенияОбАдресе. +// +Функция СведенияОбАдресах(Адреса, ДополнительныеПараметры = Неопределено) Экспорт + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СведенияОбАдресахВВидеСтруктуры(Адреса, ДополнительныеПараметры); +КонецФункции + +// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. +// +// Параметры: +// Адрес - Строка, ОбъектXDTO - XDTO объект или строка XML соответствующие XDTO пакету Адрес. +// ДополнительныеПараметры - Структура - параметры контактной информации. +// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. +// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. +// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. +// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// * Страна - Строка - текстовое представление страны. +// * КодСтраны - Строка - код страны по ОКСМ. +// * Индекс - Строка - почтовый индекс. +// * КодРегиона - Строка - код региона РФ. +// * Регион - Строка - текстовое представление региона РФ. +// * РегионСокращение - Строка - сокращение региона. +// * Округ - Строка - текстовое представление округа. +// * ОкругСокращение - Строка - сокращение округа. +// * Район - Строка - текстовое представление района. +// * РайонСокращение - Строка - сокращение района. +// * Город - Строка - текстовое представление города. +// * ГородСокращение - Строка - сокращение города. +// * ВнутригородскойРайон - Строка - текстовое представление внутригородского района. +// * ВнутригородскойРайонСокращение - Строка - сокращение внутригородского района. +// * НаселенныйПункт - Строка - текстовое представление населенного пункта. +// * НаселенныйПунктСокращение - Строка - сокращение населенного пункта. +// * Улица - Строка - текстовое представление улицы. +// * УлицаСокращение - Строка - сокращение улицы. +// * ДополнительнаяТерритория - Строка - текстовое представление дополнительной территории. +// * ДополнительнаяТерриторияСокращение - Строка - сокращение дополнительной территории. +// * ЭлементДополнительнойТерритории - Строка - текстовое представление элемента дополнительной территории. +// * ЭлементДополнительнойТерриторииСокращение - Строка - сокращение элемента дополнительной территории. +// * Здание - Структура - структура с информацией о здании адреса. +// ** ТипЗдания - Строка - тип объекта адресации адреса РФ согласно приказу ФНС ММВ-7-1/525 от 31.08.2011. +// ** Номер - Строка - текстовое представление номера дома (только для адресов РФ). +// * Корпуса - Массив - содержит структуры(поля структуры: ТипКорпуса, Номер) с перечнем корпусов адреса. +// * Помещения - Массив - содержит структуры(поля структуры: ТипПомещения, Номер) с перечнем помещений адреса. +// * КодыКЛАДР - Структура - Коды КЛАДР, если установлен параметр КодыКЛАДР. +// ** Регион - Строка - Код КЛАДР региона. +// ** Район - Строка - Код КЛАДР район. +// ** Город - Строка - Код КЛАДР города. +// ** НаселенныйПункт - Строка - Код КЛАДР населенного пункта. +// ** Улица - Строка - Код КЛАДР улица. +// * ДополнительныеКоды - Структура - Коды ОКТМО, ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ. +Функция СведенияОбАдресе(Адрес, ДополнительныеПараметры = Неопределено) Экспорт + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры); +КонецФункции + +// Преобразует адреса нового формата XML ФИАС в адрес формата КЛАДР. +// +// Параметры: +// Данные - Строка - строка XML соответствующая XDTO пакету Адрес. +// +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// ** Страна - Строка - Представление страны. +// ** КодСтраны - Строка - Код страны по ОКСМ. +// ** Индекс - Строка - Почтовый индекс (только для адресов РФ). +// ** Регион - Строка - Представление региона РФ (только для адресов РФ). +// ** КодРегиона - Строка - Код региона РФ (только для адресов РФ). +// ** РегионСокращение - Строка - Сокращение региона (если СтарыйСоставПолей = Ложь). +// ** Район - Строка - Представление района (только для адресов РФ). +// ** РайонСокращение - Строка - Сокращение района (если СтарыйСоставПолей = Ложь). +// ** Город - Строка - Представление города (только для адресов РФ). +// ** ГородСокращение - Строка - Сокращение города (только для адресов РФ). +// ** НаселенныйПункт - Строка - Представление населенного пункта (только для адресов РФ). +// ** НаселенныйПунктСокращение - Строка - Сокращение населенного пункта (если СтарыйСоставПолей = Ложь). +// ** Улица - Строка - Представление улицы (только для адресов РФ). +// ** УлицаСокращение - Строка - Сокращение улицы (если СтарыйСоставПолей = Ложь). +// ** ТипДома - Строка - Тип дома см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Дом - Строка - Представление дома (только для адресов РФ). +// ** ТипКорпуса - Строка - Тип корпуса см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Корпус - Строка - Представление корпуса (только для адресов РФ). +// ** ТипКвартиры - Строка - Тип квартиры см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Квартира - Строка - Представление квартиры (только для адресов РФ). +// ** АдресРФ - Булево - Если Истина, то адрес российский. +// ** Представление - Строка - Представление адреса. +// +Функция АдресВФорматеКЛАДР(Знач Данные) Экспорт + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда + // Новый формат КИ + Результат = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей( + ПредыдущийФорматКонтактнойИнформацииXML(Данные)); + Представление = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(Данные); + + ИначеЕсли ПустаяСтрока(Данные) Тогда + // Генерируем пустую структуру по виду + Результат = РаботаСАдресамиКлиентСервер.СтруктураКонтактнойИнформацииПоТипу( + Перечисления.ТипыКонтактнойИнформации.Адрес); + Представление = ""; + КонецЕсли; + + Если Результат.Свойство("Страна") И СтрСравнить(Результат.Страна, ОсновнаяСтрана().Наименование) = 0 Тогда + Результат.Вставить("АдресРФ", Истина); + Иначе + Результат.Вставить("АдресРФ", Ложь); + КонецЕсли; + Результат.Вставить("Представление", Представление); + + Возврат Результат; +КонецФункции + +// Проверяет адрес на соответствие требованиям к адресной информации. +// +// Параметры: +// АдресВXML - Строка - Строка XML соответствующая XDTO пакету Адрес. +// ПараметрыПроверки - Структура, СправочникСсылка.ВидыКонтактнойИнформации - Флаги проверки адреса: +// ТолькоНациональныйАдрес - Булево - Адрес должен быть только Российским. По умолчанию ИСТИНА. +// ФорматАдреса - Строка - По какому классификатору проверять "КЛАДР" или "ФИАС". По умолчанию "КЛАДР". +// Возвращаемое значение: +// Структура - содержит структуру с полями: +// * Результат - Строка - Результат проверки: "Корректный", "НеПроверен", "СодержитОшибки". +// * СписокОшибок - СписокЗначений - Информация о ошибках. +Функция ПроверитьАдрес(Знач АдресВXML, ПараметрыПроверки = Неопределено) Экспорт + Возврат УправлениеКонтактнойИнформациейСлужебный.ПроверитьАдресВXML(АдресВXML, ПараметрыПроверки); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обратная совместимость. + +// Преобразует данные формата XML в предыдущий формат контактной информации. +// +// Параметры: +// Данные - Строка - Строка XML соответствующая XDTO пакету Адрес. +// СокращенныйСоставПолей - Булево - Если Ложь, то из состава полей будут исключены +// поля, отсутствующие в версиях БСП младше 2.1.3. +// +// Возвращаемое значение: +// Строка - набор пар ключ-значение, разделенных переносом строки. +// +Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СокращенныйСоставПолей = Ложь) Экспорт + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда + СтарыйФормат = Обработки.РасширенныйВводКонтактнойИнформации.КонтактнаяИнформацияВСтаруюСтруктуру(Данные, СокращенныйСоставПолей); + Возврат РаботаСАдресамиКлиентСервер.ПреобразоватьСписокПолейВСтроку(СтарыйФормат.ЗначенияПолей, Ложь); + КонецЕсли; + + Возврат Данные; +КонецФункции + +// Преобразует данные нового формата XML контактной информации в структуру старого формата. +// +// Параметры: +// Данные - Строка - Строка XML соответствующая XDTO пакету Адрес. +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - Параметры контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// ** Страна - Строка - Представление страны. +// ** КодСтраны - Строка - Код страны по ОКСМ. +// ** Индекс - Строка - Почтовый индекс (только для адресов РФ). +// ** Регион - Строка - Представление региона РФ (только для адресов РФ). +// ** КодРегиона - Строка - Код региона РФ (только для адресов РФ). +// ** РегионСокращение - Строка - Сокращение региона (если СтарыйСоставПолей = Ложь). +// ** Район - Строка - Представление района (только для адресов РФ). +// ** РайонСокращение - Строка - Сокращение района (если СтарыйСоставПолей = Ложь). +// ** Город - Строка - Представление города (только для адресов РФ). +// ** ГородСокращение - Строка - Сокращение города (только для адресов РФ). +// ** НаселенныйПункт - Строка - Представление населенного пункта (только для адресов РФ). +// ** НаселенныйПунктСокращение - Строка - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). +// ** Улица - Строка - Представление улицы (только для адресов РФ). +// ** УлицаСокращение - Строка - Сокращение улицы (если СтарыйСоставПолей = Ложь). +// ** ТипДома - Строка - Тип дома см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Дом - Строка - Представление дома (только для адресов РФ). +// ** ТипКорпуса - Строка - Тип корпуса см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Корпус - Строка - Представление корпуса (только для адресов РФ). +// ** ТипКвартиры - Строка - Тип квартиры см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Квартира - Строка - Представление квартиры (только для адресов РФ). +// Состав свойств для телефона: +// ** КодСтраны - Строка - Код страны. Например, +7. +// ** КодГорода - Строка - Код города. Например, 495. +// ** НомерТелефона - Строка - Номер телефона. +// ** Добавочный - Строка - Добавочный номер телефона. +// +Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации = Неопределено) Экспорт + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда + // Новый формат КИ + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей( + ПредыдущийФорматКонтактнойИнформацииXML(Данные)); + + ИначеЕсли ПустаяСтрока(Данные) И ВидКонтактнойИнформации <> Неопределено Тогда + // Генерируем по виду + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу( + ВидКонтактнойИнформации.Тип); + + КонецЕсли; + + // Возвращаем полную структуру для данного вида с заполненными полями. + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей(Данные, ВидКонтактнойИнформации); +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Определяет страну по умолчанию. +// +// Возвращаемое значение: +// СправочникСсылка.СтраныМира - Ссылка на элемент справочника страны мира страны по умолчанию. +// +Функция ОсновнаяСтрана() Экспорт + Возврат Справочники.СтраныМира.Россия; +КонецФункции + +// Возвращает пространство имен для оперирования с XDTO контактной информации. +// +// Возвращаемое значение: +// Строка - пространство имен. +// +Функция ПространствоИмен() Экспорт + Возврат "http://www.v8.1c.ru/ssl/contactinfo_ru"; +КонецФункции + +// Преобразует XML. Обратная совместимость. +// +Функция ПередЧтениемXDTOКонтактнаяИнформация(ТекстXML) Экспорт + + Если СтрНайти(ТекстXML, "Адрес") = 0 Тогда + Возврат ТекстXML; + КонецЕсли; + + Если СтрНайти(ТекстXML, "http://www.v8.1c.ru/ssl/contactinfo_ru") > 0 Тогда + Возврат ТекстXML; + КонецЕсли; + + ТекстXML = СтрЗаменить(ТекстXML, "xsi:type=""АдресРФ""", "xmlns:rf=""http://www.v8.1c.ru/ssl/contactinfo_ru"" xsi:type=""rf:АдресРФ"""); + ТекстXML = СтрЗаменить(ТекстXML, "СубъектРФ", "rf:СубъектРФ"); + ТекстXML = СтрЗаменить(ТекстXML, "Округ", "rf:Округ"); + ТекстXML = СтрЗаменить(ТекстXML, "СвРайМО", "rf:СвРайМО"); + ТекстXML = СтрЗаменить(ТекстXML, "<Район>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "", ""); + ТекстXML = СтрЗаменить(ТекстXML, "<Район/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "Город>", "rf:Город>"); + ТекстXML = СтрЗаменить(ТекстXML, "<Город/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "ВнутригРайон", "rf:ВнутригРайон"); + ТекстXML = СтрЗаменить(ТекстXML, "НаселПункт", "rf:НаселПункт"); + + ТекстXML = СтрЗаменить(ТекстXML, "Улица>", "rf:Улица>"); + ТекстXML = СтрЗаменить(ТекстXML, "<Улица/>", ""); + ТекстXML = СтрЗаменить(ТекстXML, "ОКТМО", "rf:ОКТМО"); + ТекстXML = СтрЗаменить(ТекстXML, "ОКАТО", "rf:ОКАТО"); + ТекстXML = СтрЗаменить(ТекстXML, "ДопАдрЭл", "rf:ДопАдрЭл"); + ТекстXML = СтрЗаменить(ТекстXML, "<Номер", "", "rf:Местоположение>"); + + Возврат ТекстXML; + +КонецФункции + +Функция ПередЗаписьюXDTOКонтактнаяИнформация(ТекстXML) Экспорт + + Позиция = СтрНайти(ТекстXML, "АдресРФ"""); + Если Позиция > 0 Тогда + ПозицияНачало = СтрНайти(ТекстXML, """", НаправлениеПоиска.СКонца, Позиция); + Префикс = Сред(ТекстXML, ПозицияНачало + 1, Позиция - ПозицияНачало - 2); + + ТекстXML = СтрЗаменить(ТекстXML, Префикс +":", ""); + ТекстXML = СтрЗаменить(ТекстXML, " xmlns:"+ Префикс + "=""http://www.v8.1c.ru/ssl/contactinfo_ru""", ""); + КонецЕсли; + + Возврат ТекстXML; +КонецФункции + +Функция ДополнительныеПравилаПреобразования() Экспорт + + КодыДополнительныхАдресныхЭлементов = Новый ТекстовыйДокумент; + Для Каждого ДополнительныйАдресныйЭлемент Из РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ() Цикл + КодыДополнительныхАдресныхЭлементов.ДобавитьСтроку("" + ДополнительныйАдресныйЭлемент.Код + ""); + КонецЦикла; + + КодыРегионов = Новый ТекстовыйДокумент; + ВсеРегионы = ВсеРегионы(); + Если ВсеРегионы <> Неопределено Тогда + Для Каждого Строка Из ВсеРегионы Цикл + КодыРегионов.ДобавитьСтроку("" + + Строка.Представление + ""); + КонецЦикла; + КонецЕсли; + + РасширенныйТекстПреобразования = " + | + | + | АдресРФ + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | " + РаботаСАдресамиКлиентСервер.КодСериализацииПочтовогоИндекса() + " + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |" + КодыДополнительныхАдресныхЭлементов.ПолучитьТекст() + " + | + | + | + | + |" + КодыРегионов.ПолучитьТекст() + " + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |"; + + Возврат РасширенныйТекстПреобразования; +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает список всех регионов адресного классификатора. +// +// Возвращаемое значение: +// ТаблицаЗначений - содержит колонки: +// * КодСубъектаРФ - Число - Код региона. +// * Идентификатор - УникальныйИдентификатор - Идентификатор региона. +// * Представление - Строка - Наименование и сокращение региона. +// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. +// * ДатаВерсии - Дата - UTC версия загруженных данных. +// Неопределено - если нет подсистемы адресного классификатора. +// +Функция ВсеРегионы() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Возврат МодульАдресныйКлассификаторСлужебный.СведенияОЗагрузкеСубъектовРФ(); + КонецЕсли; + Возврат Неопределено; + +КонецФункции + +#КонецОбласти + diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/ФайловыеФункцииСлужебный.mdo b/SSL/src/CommonModules/РаботаСАдресами/РаботаСАдресами.mdo similarity index 61% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебный/ФайловыеФункцииСлужебный.mdo rename to SSL/src/CommonModules/РаботаСАдресами/РаботаСАдресами.mdo index 0712e3657..8413c1366 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/ФайловыеФункцииСлужебный.mdo +++ b/SSL/src/CommonModules/РаботаСАдресами/РаботаСАдресами.mdo @@ -1,9 +1,9 @@ - - ФайловыеФункцииСлужебный + + РаботаСАдресами ru - Файловые функции служебный + Работа с адресами true true diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl new file mode 100644 index 000000000..f564d0bd3 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl @@ -0,0 +1,487 @@ +#Область ПрограммныйИнтерфейс + +// Возвращает структуру контактной информации по типу. +// +// Параметры: +// ТипКИ - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. +// ФорматАдреса - Строка - Тип возвращаемой структуры в зависимости от формата адреса: "КЛАДР" или "ФИАС" информацию. +// +// Возвращаемое значение: +// Структура - пустая структура контактной информации, ключи - имена полей, значения поля. +// +Функция СтруктураКонтактнойИнформацииПоТипу(ТипКИ, ФорматАдреса = "КЛАДР") Экспорт + + Если ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + Возврат СтруктураПолейАдреса(ФорматАдреса); + ИначеЕсли ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураПолейТелефона(); + Иначе + Возврат Новый Структура; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Возвращает XPath для района. +// +// Возвращаемое значение: +// Строка - XPath +// +Функция XPathРайона() Экспорт + + Возврат "СвРайМО/Район"; + +КонецФункции + +// Возвращает массив структур с информацией о частях адреса согласно приказу ФНС ММВ-7-1/525 от 31.08.2011. +// +// Возвращаемое значение: +// Массив - содержит структуры - описания. +// +Функция ТипыОбъектовАдресацииАдресаРФ() Экспорт + + Результат = Новый Массив; + + // Код, Наименование, Тип, Порядок, КодФИАС + // Тип: 1 - владение, 2 - здание, 3 - помещение. + + Результат.Добавить(СтрокаОбъектаАдресации("1010", НСтр("ru = 'Дом'"), 1, 1, 2)); + Результат.Добавить(СтрокаОбъектаАдресации("1020", НСтр("ru = 'Владение'"), 1, 2, 1)); + Результат.Добавить(СтрокаОбъектаАдресации("1030", НСтр("ru = 'Домовладение'"), 1, 3, 3)); + + Результат.Добавить(СтрокаОбъектаАдресации("1050", НСтр("ru = 'Корпус'"), 2, 1)); + Результат.Добавить(СтрокаОбъектаАдресации("1060", НСтр("ru = 'Строение'"), 2, 2, 1)); + Результат.Добавить(СтрокаОбъектаАдресации("1080", НСтр("ru = 'Литера'"), 2, 3, 3)); + Результат.Добавить(СтрокаОбъектаАдресации("1070", НСтр("ru = 'Сооружение'"), 2, 4, 2)); + Результат.Добавить(СтрокаОбъектаАдресации("1040", НСтр("ru = 'Участок'"), 2, 5)); + + Результат.Добавить(СтрокаОбъектаАдресации("2010", НСтр("ru = 'Квартира'"), 3, 1)); + Результат.Добавить(СтрокаОбъектаАдресации("2030", НСтр("ru = 'Офис'"), 3, 2)); + Результат.Добавить(СтрокаОбъектаАдресации("2040", НСтр("ru = 'Бокс'"), 3, 3)); + Результат.Добавить(СтрокаОбъектаАдресации("2020", НСтр("ru = 'Помещение'"), 3, 4)); + Результат.Добавить(СтрокаОбъектаАдресации("2050", НСтр("ru = 'Комната'"), 3, 5)); + Результат.Добавить(СтрокаОбъектаАдресации("2060", НСтр("ru = 'Этаж'"), 3, 6)); + // Наши сокращения для поддержки обратной совместимости при парсинге. + Результат.Добавить(СтрокаОбъектаАдресации("2010", НСтр("ru = 'кв.'"), 3, 6)); + Результат.Добавить(СтрокаОбъектаАдресации("2030", НСтр("ru = 'оф.'"), 3, 7)); + + // Уточняющие объекты + Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10200000", НСтр("ru = 'Адресная точка'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10300000", НСтр("ru = 'Садовое товарищество'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10400000", НСтр("ru = 'Элемент улично-дорожной сети, планировочной структуры дополнительного адресного элемента'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10500000", НСтр("ru = 'Промышленная зона'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10600000", НСтр("ru = 'Гаражно-строительный кооператив'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10700000", НСтр("ru = 'Территория'"))); + + Возврат Результат; +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает код дополнительной части адреса для сериализации. +// +// Параметры: +// СтрокаЗначения - Строка - значение для поиска, например "Дом", "Корпус", "Литера". +// +// Возвращаемое значение: +// Число - код +// +Функция КодСериализацииОбъектаАдресации(СтрокаЗначения) Экспорт + + Ключ = ВРег(СокрЛП(СтрокаЗначения)); + Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл + Если Элемент.Ключ = Ключ Тогда + Возврат Элемент.Код; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; +КонецФункции + +// Возвращает код дополнительной части адреса для почтового индекса. +// +// Возвращаемое значение: +// Строка - код +// +Функция КодСериализацииПочтовогоИндекса() Экспорт + + Возврат КодСериализацииОбъектаАдресации(НСтр("ru = 'Почтовый индекс'")); + +КонецФункции + +// Возвращает XPath для почтового индекса. +// +// Возвращаемое значение: +// Строка - XPath +// +Функция XPathПочтовогоИндекса() Экспорт + + Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализацииПочтовогоИндекса() + "']"; + +КонецФункции + +Функция КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "") Экспорт + + Если Уровень = 90 Тогда + Если ВРег(ТипаАдресногоЭлемента) = "ГСК" Тогда + Возврат "10600000"; + ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "СНТ" Тогда + Возврат "10300000"; + ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "ТЕР" Тогда + Возврат "10700000"; + Иначе + Возврат "10200000"; + КонецЕсли; + ИначеЕсли Уровень = 91 Тогда + Возврат "10400000"; + КонецЕсли; + + // Все остальное - считаем ориентиром. + Возврат "Местоположение"; +КонецФункции + +// Возвращает XPath для дополнительного объекта адресации по умолчанию. +// +// Параметры; +// Уровень - Число - уровень объекта. 90 - дополнительный(Варианты: ГСК, СНТ, ТЕР), 91 - подчиненный, -1 - +// Ориентир. +// +// Возвращаемое значение: +// Строка - XPath +// +Функция XPathДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "") Экспорт + КодСериализации = КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента); + Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализации + "']"; +КонецФункции + +// Возвращает XPath для номера дополнительного объекта адресации. +// +// Параметры; +// СтрокаЗначения - Строка - искомый тип, например "Дом", "Корпус". +// +// Возвращаемое значение: +// Строка - XPath +// +Функция XPathНомераДополнительногоОбъектаАдресации(СтрокаЗначения) Экспорт + + Код = КодСериализацииОбъектаАдресации(СтрокаЗначения); + Если Код = Неопределено Тогда + Код = СтрЗаменить(СтрокаЗначения, "'", ""); + КонецЕсли; + + Возврат "ДопАдрЭл/Номер[Тип='" + Код + "']"; +КонецФункции + +// Возвращает строку с описанием типа по коду части адреса. +// Противоположность функции "КодСериализацииОбъектаАдресации". +// +// Параметры: +// Код - Строка - код +// +// Возвращаемое значение: +// Число - Тип +// +Функция ТипОбъектаПоКодуСериализации(Код) Экспорт + Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл + Если Элемент.Код = Код Тогда + Возврат Элемент; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; +КонецФункции + +// Возвращает массив вариантов наименований по типу (по признаку владения, строения, и т.п). +// +// Параметры: +// Тип - Число - запрашиваемый тип. +// ДопускатьПовторыКода - Булево - Истина - будут возвращены все варианты с повторами ("квартира" - "кв." и т.п.). +// +// Возвращаемое значение: +// Массив - содержит структуры - описания. +// +Функция НаименованияОбъектовАдресацииПоТипу(Тип, ДопускатьПовторыКода = Истина) Экспорт + Результат = Новый Массив; + Повторы = Новый Соответствие; + + Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл + Если Элемент.Тип = Тип Тогда + Если ДопускатьПовторыКода Тогда + Результат.Добавить(Элемент.Наименование); + Иначе + Если Повторы.Получить(Элемент.Код) = Неопределено Тогда + Результат.Добавить(Элемент.Наименование); + КонецЕсли; + Повторы.Вставить(Элемент.Код, Истина); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Возвращает сокращения частей адреса +// +// Возвращаемое значение: +// Соответствие - Список сокращений. +// +Функция СокращенияОбъектовАдресацииАдресаРФ() Экспорт + + Результат = Новый Соответствие; + + Результат.Вставить(НСтр("ru = 'Дом'"), НСтр("ru = 'Д.'")); + Результат.Вставить(НСтр("ru = 'Владение'"), НСтр("ru = 'Вл.'")); + Результат.Вставить(НСтр("ru = 'Домовладение'"), НСтр("ru = 'Домовл.'")); + + Результат.Вставить(НСтр("ru = 'Корпус'"), НСтр("ru = 'Корп.'")); + Результат.Вставить(НСтр("ru = 'Строение'"), НСтр("ru = 'Стр.'")); + Результат.Вставить(НСтр("ru = 'Литера'"), НСтр("ru = 'Лит.'")); + Результат.Вставить(НСтр("ru = 'Сооружение'"), НСтр("ru = 'Сооруж.'")); + Результат.Вставить(НСтр("ru = 'Участок'"), НСтр("ru = 'Уч.'")); + + Результат.Вставить(НСтр("ru = 'Квартира'"), НСтр("ru = 'Кв.'")); + Результат.Вставить(НСтр("ru = 'Офис'"), НСтр("ru = 'Оф.'")); + Результат.Вставить(НСтр("ru = 'Бокс'"), НСтр("ru = 'Бокс'")); + Результат.Вставить(НСтр("ru = 'Помещение'"), НСтр("ru = 'Пом.'")); + Результат.Вставить(НСтр("ru = 'Комната'"), НСтр("ru = 'Ком.'")); + Результат.Вставить(НСтр("ru = 'Этаж'"), НСтр("ru = 'Этаж'")); + + Возврат Результат; +КонецФункции + +Функция СтрокаОбъектаАдресации(Код, Наименование, Тип = 0, Порядок = 0, КодФИАС = 0) + + СтруктураОбъектаАдресации = Новый Структура; + СтруктураОбъектаАдресации.Вставить("Код", Код); + СтруктураОбъектаАдресации.Вставить("Наименование", Наименование); + СтруктураОбъектаАдресации.Вставить("Тип", Тип); + СтруктураОбъектаАдресации.Вставить("Порядок", Порядок); + СтруктураОбъектаАдресации.Вставить("КодФИАС", КодФИАС); + СтруктураОбъектаАдресации.Вставить("Сокращение", НРег(Наименование)); + СтруктураОбъектаАдресации.Вставить("Ключ", ВРег(Наименование)); + Возврат СтруктураОбъектаАдресации; + +КонецФункции + +// Возвращает структуру, описывающую населенный пункт в иерархии младший-старший. +// +// Параметры: +// ВариантКлассификатора Строка - Требуемый вид классификатора ФИАС, КЛАДР. +// +// Возвращаемое значение: +// Структура - описание населенного пункта. +// +Функция СтруктураЧастейАдресаНаселенногоПункта(ВариантКлассификатора = "ФИАС") Экспорт + + Результат = Новый Структура; + + Результат.Вставить("Регион", ЭлементАдреснойСтруктуры(НСтр("ru = 'Регион'"), НСтр("ru = 'Регион адреса'"), "СубъектРФ", 1)); + Если ВариантКлассификатора = "ФИАС" Тогда + Результат.Вставить("Округ", ЭлементАдреснойСтруктуры(НСтр("ru = 'Округ'"), НСтр("ru = 'Округ адреса'"), "Округ", 2)); + КонецЕсли; + Результат.Вставить("Район", ЭлементАдреснойСтруктуры(НСтр("ru = 'Район'"), НСтр("ru = 'Район адреса'"), "СвРайМО/Район", 3)); + Результат.Вставить("Город", ЭлементАдреснойСтруктуры(НСтр("ru = 'Город'"), НСтр("ru = 'Город адреса'"), "Город", 4)); + Если ВариантКлассификатора = "ФИАС" Тогда + Результат.Вставить("ВнутригРайон", ЭлементАдреснойСтруктуры(НСтр("ru = 'Внутр. р-н.'"), НСтр("ru = 'Внутригородской район'"), "ВнутригРайон", 5)); + КонецЕсли; + Результат.Вставить("НаселенныйПункт", ЭлементАдреснойСтруктуры(НСтр("ru = 'Нас.пункт'"), + НСтр("ru = 'Населенный пункт адреса'"), "НаселПункт", 6, Истина)); + + Если ВариантКлассификатора <> "БезКлассификатора" Тогда + Результат.Вставить("Улица", ЭлементАдреснойСтруктуры(НСтр("ru = 'Улица'"), + НСтр("ru = 'Улица адреса'"), "Улица", 7)); + Результат.Вставить("ДополнительныйЭлемент", ЭлементАдреснойСтруктуры(НСтр("ru = 'ДополнительныйЭлемент'"), + НСтр("ru = 'Дополнительный элемент адреса'"), "ДопАдрЭл[ТипАдрЭл='10200000']", 90)); + Результат.Вставить("ПодчиненныйЭлемент", ЭлементАдреснойСтруктуры(НСтр("ru = 'Подчиненный элемент'"), + НСтр("ru = 'Подчиненный элемент адреса'"), "ДопАдрЭл[ТипАдрЭл='10400000']", 91)); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает полное наименование для населенного пункта. Под населенным пунктом понимается синтетическое +// поле, характеризующее все, что больше улицы. +// +// Параметры: +// ЧастиАдреса - Структура - Описание текущего состояния адреса. +// ВариантКлассификатора - Строка - Вариант классификатора. +// +Функция ПредставлениеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса, ВариантКлассификатора = "ФИАС") Экспорт + + Уровни = Новый Массив; + Уровни.Добавить(1); + Уровни.Добавить(3); + Уровни.Добавить(4); + Уровни.Добавить(6); + Если ВариантКлассификатора = "ФИАС" Тогда + Уровни.Добавить(2); + Уровни.Добавить(5); + КонецЕсли; + Возврат ПредставлениеПоЧастямАдреса(ЧастиАдреса,Уровни); + +КонецФункции + +#Область ПрочиеСлужебныеПроцедурыИФункции + +// Строка представления по частям адреса в нужном порядке. +// +Функция ПредставлениеПоЧастямАдреса(ЧастиАдреса, Уровни) + + Эталон = СтруктураЧастейАдресаНаселенногоПункта(); + + Порядок = Новый СписокЗначений; + Для Каждого КлючЗначение Из Эталон Цикл + Если Уровни.Найти(КлючЗначение.Значение.Уровень) <> Неопределено Тогда + Порядок.Добавить(КлючЗначение.Значение.Уровень, КлючЗначение.Ключ); + КонецЕсли; + КонецЦикла; + Порядок.СортироватьПоЗначению(НаправлениеСортировки.Убыв); + + Результат = ""; + Для Каждого ЭлементСписка Из Порядок Цикл + ИмяРеквизита = ЭлементСписка.Представление; + Если ЧастиАдреса.Свойство(ИмяРеквизита) Тогда + ЧастьПредставления = ЧастиАдреса[ИмяРеквизита].Представление; + Если Не ПустаяСтрока(ЧастьПредставления) Тогда + Результат = Результат + ", " + ЧастьПредставления; + КонецЕсли; + КонецЕсли + КонецЦикла; + + Возврат СокрЛП(Сред(Результат, 2)); +КонецФункции + +// Конструктор внутренней структуры элемента адреса. +// +Функция ЭлементАдреснойСтруктуры(Заголовок, Подсказка, ПутьXPath, Уровень, Предопределенный = Ложь) + + Результат = Новый Структура("Наименование, Сокращение, Идентификатор, Представление"); + Результат.Вставить("Заголовок", Заголовок); + Результат.Вставить("Подсказка", Подсказка); + Результат.Вставить("ПутьXPath", ПутьXPath); + Результат.Вставить("Предопределенный", Предопределенный); + Результат.Вставить("Уровень", Уровень); + + Возврат Результат; +КонецФункции + +// Возвращает пустую структура адреса. +// +// Возвращаемое значение: +// Структура - адрес, ключи - имена полей, значения поля. +// +Функция СтруктураПолейАдреса(ФорматАдреса) + + СтруктураАдреса = Новый Структура; + СтруктураАдреса.Вставить("Представление", ""); + СтруктураАдреса.Вставить("Страна", ""); + СтруктураАдреса.Вставить("НаименованиеСтраны", ""); + СтруктураАдреса.Вставить("КодСтраны",""); + СтруктураАдреса.Вставить("Индекс",""); + СтруктураАдреса.Вставить("Регион",""); + СтруктураАдреса.Вставить("РегионСокращение",""); + СтруктураАдреса.Вставить("Район",""); + СтруктураАдреса.Вставить("РайонСокращение",""); + СтруктураАдреса.Вставить("Город",""); + СтруктураАдреса.Вставить("ГородСокращение",""); + СтруктураАдреса.Вставить("НаселенныйПункт",""); + СтруктураАдреса.Вставить("НаселенныйПунктСокращение",""); + СтруктураАдреса.Вставить("Улица",""); + СтруктураАдреса.Вставить("УлицаСокращение",""); + СтруктураАдреса.Вставить("Дом",""); + СтруктураАдреса.Вставить("Корпус",""); + СтруктураАдреса.Вставить("Квартира",""); + СтруктураАдреса.Вставить("ТипДома",""); + СтруктураАдреса.Вставить("ТипКорпуса",""); + СтруктураАдреса.Вставить("ТипКвартиры",""); + СтруктураАдреса.Вставить("НаименованиеВида",""); + + Если ВРег(ФорматАдреса) = "ФИАС" Тогда + СтруктураАдреса.Вставить("Округ",""); + СтруктураАдреса.Вставить("ОкругСокращение",""); + СтруктураАдреса.Вставить("ВнутригородскойРайон",""); + СтруктураАдреса.Вставить("ВнутригородскойРайонСокращение",""); + КонецЕсли; + + Возврат СтруктураАдреса; + +КонецФункции + +// Возвращает строку списка полей. +// +// Параметры: +// СоответствиеПолей - СписокЗначений - соответствия полей. +// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. +// +// Возвращаемое значение: +// Строка - результат, преобразованный из списка. +// +Функция ПреобразоватьСписокПолейВСтроку(СоответствиеПолей, БезПустыхПолей = Истина) Экспорт + + КвартираДобавлена = Ложь; + КорпусДобавлен = Ложь; + ПредыдущиеЗначение = Неопределено; + + СтруктураЗначенийПолей = Новый Структура; + Для Каждого Элемент Из СоответствиеПолей Цикл + + Если Элемент.Представление = "Корпус" ИЛИ Элемент.Представление = "ТипКорпуса" Тогда + Если ПредыдущиеЗначение <> Неопределено И ПредыдущиеЗначение.Представление = "ТипКорпуса" + И ПредыдущиеЗначение.Значение = "Корпус" Тогда + СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); + КорпусДобавлен = Истина; + ИначеЕсли НЕ КорпусДобавлен Тогда + СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); + КонецЕсли; + ИначеЕсли Элемент.Представление = "Квартира" ИЛИ Элемент.Представление = "ТипКвартиры" Тогда + Если ПредыдущиеЗначение <> Неопределено И ПредыдущиеЗначение.Представление = "ТипКвартиры" + И ПредыдущиеЗначение.Значение = "Квартира" Тогда + СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); + КвартираДобавлена = Истина; + ИначеЕсли НЕ КвартираДобавлена Тогда + СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); + КонецЕсли; + Иначе + СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); + КонецЕсли; + ПредыдущиеЗначение = Элемент; + КонецЦикла; + + Возврат СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей); +КонецФункции + +// Возвращает строку списка полей. +// +// Параметры: +// СтруктураЗначенийПолей - Структура - структура значений полей. +// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. +// +// Возвращаемое значение: +/// Строка - результат преобразования из структуры. +// +Функция СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей = Истина) Экспорт + + Результат = ""; + Для Каждого ЗначениеПоля Из СтруктураЗначенийПолей Цикл + Если БезПустыхПолей И ПустаяСтрока(ЗначениеПоля.Значение) Тогда + Продолжить; + КонецЕсли; + + Результат = Результат + ?(Результат = "", "", Символы.ПС) + + ЗначениеПоля.Ключ + "=" + СтрЗаменить(ЗначениеПоля.Значение, Символы.ПС, Символы.ПС + Символы.Таб); + КонецЦикла; + + Возврат Результат; +КонецФункции + + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/ФайловыеФункцииСлужебныйКлиентСервер.mdo b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/РаботаСАдресамиКлиентСервер.mdo similarity index 60% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/ФайловыеФункцииСлужебныйКлиентСервер.mdo rename to SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/РаботаСАдресамиКлиентСервер.mdo index def88635c..3b1e68e7b 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/ФайловыеФункцииСлужебныйКлиентСервер.mdo +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/РаботаСАдресамиКлиентСервер.mdo @@ -1,9 +1,9 @@ - - ФайловыеФункцииСлужебныйКлиентСервер + + РаботаСАдресамиКлиентСервер ru - Файловые функции служебный клиент сервер + Работа с адресами клиент сервер true true diff --git a/SSL/src/CommonModules/РаботаСБанками/Module.bsl b/SSL/src/CommonModules/РаботаСБанками/Module.bsl index bab7dd2b6..d022f67a7 100644 --- a/SSL/src/CommonModules/РаботаСБанками/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанками/Module.bsl @@ -1,54 +1,64 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Банки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Работа с данными справочника КлассификаторБанковРФ. - -// Получает данные из справочника КлассификаторБанковРФ по значениям БИК и корреспондентского счета банка. +// Получает данные из справочника КлассификаторБанков по значениям БИК и корреспондентского счета банка. // // Параметры: // БИК - Строка - банковский идентификационный код. // КоррСчет - Строка - корреспондентский счет банка. // ЗаписьОБанке - СправочникСсылка, Строка - (возвращаемый) найденный банк. -Процедура ПолучитьДанныеКлассификатораРФ(БИК = "", КоррСчет = "", ЗаписьОБанке = "") Экспорт +Процедура ПолучитьДанныеКлассификатора(БИК = "", КоррСчет = "", ЗаписьОБанке = "") Экспорт + + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Параметры = Новый Структура; + Параметры.Вставить("БИК", БИК); + Параметры.Вставить("КоррСчет", КоррСчет); + Параметры.Вставить("ЗаписьОБанке", ЗаписьОБанке); + СтандартнаяОбработка = Истина; + Обработки[ИмяОбработки].ПриПолученииДанныхКлассификатора(Параметры, СтандартнаяОбработка); + Если Не СтандартнаяОбработка Тогда + БИК = Параметры.БИК; + КоррСчет = Параметры.КоррСчет; + ЗаписьОБанке = Параметры.ЗаписьОБанке; + Возврат; + КонецЕсли; + КонецЕсли; + Если Не ПустаяСтрока(БИК) Тогда - ЗаписьОБанке = Справочники.КлассификаторБанковРФ.НайтиПоКоду(БИК); + ЗаписьОБанке = Справочники.КлассификаторБанков.НайтиПоКоду(БИК); ИначеЕсли Не ПустаяСтрока(КоррСчет) Тогда - ЗаписьОБанке = Справочники.КлассификаторБанковРФ.НайтиПоРеквизиту("КоррСчет", КоррСчет); + ЗаписьОБанке = Справочники.КлассификаторБанков.НайтиПоРеквизиту("КоррСчет", КоррСчет); Иначе ЗаписьОБанке = ""; КонецЕсли; - Если ЗаписьОБанке = Справочники.КлассификаторБанковРФ.ПустаяСсылка() Тогда + Если ЗаписьОБанке = Справочники.КлассификаторБанков.ПустаяСсылка() Тогда ЗаписьОБанке = ""; КонецЕсли; + КонецПроцедуры // Возвращает текстовое описание причины, по которой банк отмечен недействительным. // // Параметры: -// Параметры: -// Банк - СправочникСсылка.КлассификаторБанковРФ - банк, для которого необходимо получить текст пояснения. +// Банк - СправочникСсылка.КлассификаторБанков - банк, для которого необходимо получить текст пояснения. // // Возвращаемое значение: -// ФорматированнаяСтрока. +// ФорматированнаяСтрока - пояснение. +// Функция ПояснениеНедействительногоБанка(Банк) Экспорт НаименованиеБанка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Банк, "Наименование"); ТекстЗапроса = "ВЫБРАТЬ - | КлассификаторБанковРФ.Ссылка, - | КлассификаторБанковРФ.Код КАК БИК + | КлассификаторБанков.Ссылка, + | КлассификаторБанков.Код КАК БИК |ИЗ - | Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ + | Справочник.КлассификаторБанков КАК КлассификаторБанков |ГДЕ - | КлассификаторБанковРФ.Ссылка <> &Ссылка - | И КлассификаторБанковРФ.Наименование = &Наименование - | И НЕ КлассификаторБанковРФ.ДеятельностьПрекращена"; + | КлассификаторБанков.Ссылка <> &Ссылка + | И КлассификаторБанков.Наименование = &Наименование + | И НЕ КлассификаторБанков.ДеятельностьПрекращена"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Банк); @@ -72,79 +82,54 @@ КонецФункции +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ПолучитьДанныеКлассификатора(). +// Получает данные из справочника КлассификаторБанков по значениям БИК и корреспондентского счета банка. +// +// Параметры: +// БИК - Строка - банковский идентификационный код. +// КоррСчет - Строка - корреспондентский счет банка. +// ЗаписьОБанке - СправочникСсылка, Строка - (возвращаемый) найденный банк. +Процедура ПолучитьДанныеКлассификатораРФ(БИК = "", КоррСчет = "", ЗаписьОБанке = "") Экспорт + ПолучитьДанныеКлассификатора(БИК, КоррСчет, ЗаписьОБанке); +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "РаботаСБанкамиКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "РаботаСБанками"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"].Добавить( - "РаботаСБанками"); + Если Метаданные.Обработки.Найти("ЗагрузкаКлассификатораБанков") <> Неопределено Тогда + Обработки["ЗагрузкаКлассификатораБанков"].ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "РаботаСБанками"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "РаботаСБанками"); - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РаботаСБанками"); КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - // Загрузка в классификатор КлассификаторБанковРФ запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.КлассификаторБанковРФ.ПолноеИмя(), "ПолноеИмя"); + // Загрузка в классификатор КлассификаторБанков запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.КлассификаторБанков.ПолноеИмя(), "ПолноеИмя"); Если СтрокаТаблицы <> Неопределено Тогда ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); КонецЕсли; КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.КлассификаторБанковРФ.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.КлассификаторБанков.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -153,134 +138,42 @@ КонецПроцедуры -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанковРФССайтаРБК; - Зависимость.ДоступноВМоделиСервиса = Ложь; - Зависимость.ДоступноВПодчиненномУзлеРИБ = Ложь; -КонецПроцедуры - -// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. -Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт - УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Истина)); -КонецПроцедуры - -// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. -Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт - УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Ложь)); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.69"; - Обработчик.Процедура = "РаботаСБанками.УстановитьРасписаниеРегламентногоЗадания"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.НачальноеЗаполнение = Истина; - КонецЕсли; - -КонецПроцедуры - -Процедура УстановитьРасписаниеРегламентногоЗадания() Экспорт - - ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах()); - Задержка = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 21600); // С 0 до 6 часов утра. - - Расписание = Новый РасписаниеРегламентногоЗадания; - Расписание.ПериодПовтораДней = 1; - Расписание.ПериодНедель = 1; - Расписание.ВремяНачала = '00010101000000' + Задержка; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Расписание", Расписание); - ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 600); - ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 10); - - УстановитьПараметрыРегламентногоЗадания(ПараметрыЗадания); - -КонецПроцедуры - -Процедура УстановитьПараметрыРегламентногоЗадания(ИзменяемыеПараметры) - РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанковРФССайтаРБК; - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); - - УстановитьПривилегированныйРежим(Истина); - - СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(ПараметрыЗадания); - Если СписокЗаданий.Количество() = 0 Тогда - ПараметрыЗадания = Новый Структура; - Для Каждого ИзменяемыйПараметр Из ИзменяемыеПараметры Цикл - ПараметрыЗадания.Вставить(ИзменяемыйПараметр.Ключ, ИзменяемыйПараметр.Значение); - КонецЦикла; - ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); - РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); - Иначе - Для Каждого Задание Из СписокЗаданий Цикл - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, ИзменяемыеПараметры); - КонецЦикла; + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Обработки[ИмяОбработки].ПриОпределенииНастроекРегламентныхЗаданий(Зависимости); КонецЕсли; КонецПроцедуры -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры (Структура) Параметры запуска. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - ВыводитьОповещениеОНеактуальности = ( - Не ОбщегоНазначенияПовтИсп.РазделениеВключено() // В модели сервиса обновляется автоматически. - И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() // В узле РИБ обновляется автоматически. - И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанковРФ) // Пользователь с необходимыми правами. - И Не КлассификаторАктуален()); // Классификатор уже обновлен. - - ВключитьОповещение = Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела"); - РаботаСБанкамиПереопределяемый.ПриОпределенииНеобходимостиПоказаПредупрежденияОбУстаревшемКлассификатореБанков(ВключитьОповещение); - - Параметры.Вставить("Банки", Новый ФиксированнаяСтруктура("ВыводитьОповещениеОНеактуальности", (ВыводитьОповещениеОНеактуальности И ВключитьОповещение))); + Типы.Добавить(Метаданные.Справочники.КлассификаторБанков); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) = Неопределено Тогда + Возврат; + КонецЕсли; + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() // В модели сервиса обновляется автоматически. + Если ОбщегоНазначения.РазделениеВключено() // В модели сервиса обновляется автоматически. Или ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() // В узле РИБ обновляется автоматически. - Или Не ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанковРФ) + Или Не ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанков) Или МодульТекущиеДелаСервер.ДелоОтключено("КлассификаторБанков") Тогда Возврат; КонецЕсли; - Результат = АктуальностьКлассификатораБанков(); + Результат = Обработки[ИмяОбработки].АктуальностьКлассификатораБанков(); // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.КлассификаторБанковРФ.ПолноеИмя()); + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.КлассификаторБанков.ПолноеИмя()); Для Каждого Раздел Из Разделы Цикл @@ -291,7 +184,7 @@ Дело.Важное = Результат.КлассификаторПросрочен; Дело.Представление = НСтр("ru = 'Классификатор банков устарел'"); Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Последнее обновление %1 назад'"), Результат.ВеличинаПросрочкиСтрокой); - Дело.Форма = "Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора"; + Дело.Форма = "Обработка.ЗагрузкаКлассификатораБанков.Форма.ЗагрузкаКлассификатора"; Дело.ПараметрыФормы = Новый Структура("ОткрытиеИзСписка", Истина); Дело.Владелец = Раздел; @@ -299,37 +192,59 @@ КонецПроцедуры -// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок -// при загрузке данных в другую информационную базу. -// -// Параметры: -// Типы - Массив(ОбъектМетаданных). -// -Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - Типы.Добавить(Метаданные.Справочники.КлассификаторБанковРФ); + ВыводитьОповещениеОНеактуальности = ( + Не ОбщегоНазначения.РазделениеВключено() // В модели сервиса обновляется автоматически. + И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() // В узле РИБ обновляется автоматически. + И ПравоДоступа("Изменение", Метаданные.Справочники.КлассификаторБанков) // Пользователь с необходимыми правами. + И Не КлассификаторАктуален()); // Классификатор уже обновлен. + + ВключитьОповещение = Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела"); + РаботаСБанкамиПереопределяемый.ПриОпределенииНеобходимостиПоказаПредупрежденияОбУстаревшемКлассификатореБанков(ВключитьОповещение); + + Параметры.Вставить("Банки", Новый ФиксированнаяСтруктура("ВыводитьОповещениеОНеактуальности", (ВыводитьОповещениеОНеактуальности И ВключитьОповещение))); КонецПроцедуры -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения())); + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения())); КонецПроцедуры -// Возвращает список разрешений для загрузки классификатора банков с сайта РБК. +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт + + Если Метаданные.Обработки.Найти("ЗагрузкаКлассификатораБанков") <> Неопределено Тогда + Обработки["ЗагрузкаКлассификатораБанков"].ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт + + Если Метаданные.Обработки.Найти("ЗагрузкаКлассификатораБанков") <> Неопределено Тогда + Обработки["ЗагрузкаКлассификатораБанков"].ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки(); + КонецЕсли; + +КонецПроцедуры + + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает список разрешений для загрузки классификатора банков. // // Возвращаемое значение: // Массив. @@ -337,1030 +252,35 @@ Функция Разрешения() Разрешения = Новый Массив; + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Обработки[ИмяОбработки].ДобавитьРазрешения(Разрешения); + КонецЕсли; - Протокол = "HTTP"; - Адрес = "cbrates.rbc.ru"; - Порт = Неопределено; - Описание = НСтр("ru = 'Загрузка классификатора банков из интернета.'"); - Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); - - Протокол = "HTTPS"; - Адрес = "bankregister.1c.ru"; - Порт = Неопределено; - Описание = НСтр("ru = 'Загрузка классификатора банков из интернета.'"); - Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); - Возврат Разрешения; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Работа с данными сайта РБК - -// Формирует, дополняет текст сообщения пользователю в случае, если загрузка данных классификатора проведена успешно. -// -// Параметры: -// ПараметрыЗагрузкиКлассификатора - Соответствие: -// Загружено - Число - Количество новых записей классификатора. -// Обновлено - Число - Количество обновленных записей классификатора. -// ТекстСообщения - Строка - тест сообщения о результатах загрузки. -// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. -// -Процедура ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора) - - ТекстСообщения = ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]; - Загружено = ПараметрыЗагрузкиКлассификатора["Загружено"]; - Обновлено = ПараметрыЗагрузкиКлассификатора["Обновлено"]; - - Если ПустаяСтрока(ТекстСообщения) Тогда - Если Загружено = 0 И Обновлено = 0 Тогда - ТекстСообщения = НСтр("ru ='Загрузка завершена. Изменений в классификаторе нет.'"); - Иначе - ТекстСообщения = НСтр("ru ='Загрузка классификатора банков РФ выполнена успешно.'"); - КонецЕсли; - КонецЕсли; - - Если Загружено > 0 Тогда - ТекстСообщения = ТекстСообщения + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru ='Загружено новых: %1.'"), Загружено); - КонецЕсли; - - Если Обновлено > 0 Тогда - ТекстСообщения = ТекстСообщения + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru ='Обновлено записей: %1.'"), Обновлено); - КонецЕсли; - - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - -КонецПроцедуры - -// Получает, сортирует, записывает данные классификатора БИК РФ с сайта РБК. -// -// Параметры: -// ПараметрыЗагрузкиКлассификатора - Соответствие: -// Загружено - Число - Количество новых записей классификатора. -// Обновлено - Число - Количество обновленных записей классификатора. -// ТекстСообщения - Строка - тест сообщения о результатах загрузки. -// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. -// АдресХранилища - Строка - адрес внутреннего хранилища. -Процедура ПолучитьДанныеРБК(ПараметрыЗагрузкиКлассификатора, АдресХранилища = "") Экспорт - - УстановитьПривилегированныйРежим(Истина); - ТекущаяВерсияКлассификатора = Константы.ВерсияКлассификатораБанковРФ.Получить(); - УстановитьПривилегированныйРежим(Ложь); - - ВременныйКаталог = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременныйКаталог); - - ПараметрыПолученияФайловРБК = Новый Соответствие; - ПараметрыПолученияФайловРБК.Вставить("ПутьКФайлуРБК", ""); - ПараметрыПолученияФайловРБК.Вставить("ТекстСообщения", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); - ПараметрыПолученияФайловРБК.Вставить("ВременныйКаталог", ВременныйКаталог); - ПараметрыПолученияФайловРБК.Вставить("ЕстьОбновлениеНаСервере", Истина); - ПараметрыПолученияФайловРБК.Вставить("ВерсияКлассификатора", ТекущаяВерсияКлассификатора); - - ПолучитьДанныеРБКИзИнтернета(ПараметрыПолученияФайловРБК); - - Если Не ПустаяСтрока(ПараметрыПолученияФайловРБК["ТекстСообщения"]) Тогда - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ПараметрыПолученияФайловРБК["ТекстСообщения"]); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - Если ПараметрыПолученияФайловРБК["ЕстьОбновлениеНаСервере"] Тогда - Попытка - ZIPФайлРБК = Новый ЧтениеZipФайла(ПараметрыПолученияФайловРБК["ПутьКФайлуРБК"]); - Исключение - ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным из Интернета.'"); - ТекстСообщения = ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - - Если Не ПустаяСтрока(ТекстСообщения) Тогда - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - Попытка - ZIPФайлРБК.ИзвлечьВсе(ВременныйКаталог); - Исключение - ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным из Интернета.'"); - ТекстСообщения = ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - - Если Не ПустаяСтрока(ТекстСообщения) Тогда - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - ПутьКФайлуБИКРБК = ИмяФайлаБИКСВИФТРБК(ВременныйКаталог); - ФайлБИКРБК = Новый Файл(ИмяФайлаБИКСВИФТРБК(ВременныйКаталог)); - Если Не ФайлБИКРБК.Существует() Тогда - ПутьКФайлуБИКРБК = ИмяФайлаБИКРБК(ВременныйКаталог); - КонецЕсли; - - ФайлБИКРБК = Новый Файл(ПутьКФайлуБИКРБК); - Если Не ФайлБИКРБК.Существует() Тогда - ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным из Интернета. - |Архив не содержит информацию - классификатор банков.'"); - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - ПутьКФайлуРегионовРБК = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог) + "reg.txt"; - ФайлРегионовРБК = Новый Файл(ПутьКФайлуРегионовРБК); - Если Не ФайлРегионовРБК.Существует() Тогда - ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным из Интернета. - |Архив не содержит информацию о регионах.'"); - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - ПутьКФайлуНедействующихБанков = ИмяФайлаНедействующихБанков(ВременныйКаталог); - ФайлНедействующихБанков = Новый Файл(ПутьКФайлуНедействующихБанков); - Если Не ФайлНедействующихБанков.Существует() Тогда - ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным из Интернета. - |Архив не содержит информацию о недействующих банках.'"); - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - ПараметрыЗагрузкиФайловРБК = Новый Соответствие; - ПараметрыЗагрузкиФайловРБК.Вставить("ПутьКФайлуБИКРБК", ПутьКФайлуБИКРБК); - ПараметрыЗагрузкиФайловРБК.Вставить("ПутьКФайлуРегионовРБК", ПутьКФайлуРегионовРБК); - ПараметрыЗагрузкиФайловРБК.Вставить("ПутьКФайлуНедействующихБанков", ПутьКФайлуНедействующихБанков); - ПараметрыЗагрузкиФайловРБК.Вставить("ВременныйКаталог", ВременныйКаталог); - ПараметрыЗагрузкиФайловРБК.Вставить("Загружено", ПараметрыЗагрузкиКлассификатора["Загружено"]); - ПараметрыЗагрузкиФайловРБК.Вставить("Обновлено", ПараметрыЗагрузкиКлассификатора["Обновлено"]); - ПараметрыЗагрузкиФайловРБК.Вставить("ТекстСообщения", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); - - ЗагрузитьДанныеРБК(ПараметрыЗагрузкиФайловРБК); - - Если Не ПустаяСтрока(ПараметрыЗагрузкиФайловРБК["ТекстСообщения"]) Тогда - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - Возврат; - КонецЕсли; - - УдалитьФайлы(ВременныйКаталог); - - ПараметрыЗагрузкиКлассификатора.Вставить("Загружено", ПараметрыЗагрузкиФайловРБК["Загружено"]); - ПараметрыЗагрузкиКлассификатора.Вставить("Обновлено", ПараметрыЗагрузкиФайловРБК["Обновлено"]); - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ПараметрыЗагрузкиФайловРБК["ТекстСообщения"]); - - КонецЕсли; - - Если ПараметрыПолученияФайловРБК["ВерсияКлассификатора"] > ТекущаяВерсияКлассификатора Тогда - УстановитьВерсиюКлассификатораБанков(ПараметрыПолученияФайловРБК["ВерсияКлассификатора"]); - КонецЕсли; - - ПараметрыЗагрузкиКлассификатора.Вставить("ЗагрузкаВыполнена", Истина); - ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора); - - Если НЕ ПустаяСтрока(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); - КонецЕсли; - -КонецПроцедуры - -// Получает, сортирует, записывает данные классификатора БИК РФ с сайта РБК; -// +// Получает, сортирует, записывает данные классификатора БИК РФ с сайта 1С. Процедура ЗагрузитьКлассификаторБанков() Экспорт - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанковРФССайтаРБК); - - УровеньСобытия = УровеньЖурналаРегистрации.Информация; - - Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньСобытия, , , НСтр("ru = 'Загрузка в подчиненном узле РИБ не предусмотрена'")); - Возврат; + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Обработки[ИмяОбработки].ЗагрузитьКлассификаторБанков(); КонецЕсли; - ПараметрыЗагрузкиКлассификатора = Новый Соответствие; - ПараметрыЗагрузкиКлассификатора.Вставить("Загружено", 0); - ПараметрыЗагрузкиКлассификатора.Вставить("Обновлено", 0); - ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ""); - ПараметрыЗагрузкиКлассификатора.Вставить("ЗагрузкаВыполнена", Ложь); - - ПолучитьДанныеРБК(ПараметрыЗагрузкиКлассификатора); - - Если ПараметрыЗагрузкиКлассификатора["ЗагрузкаВыполнена"] Тогда - Если ПустаяСтрока(ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]) Тогда - ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора); - КонецЕсли; - Иначе - УровеньСобытия = УровеньЖурналаРегистрации.Ошибка; - КонецЕсли; - - ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньСобытия, , , ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); - -КонецПроцедуры - -// Сортирует, записывает данные классификатора БИК РФ с сайта РБК. -// -// Параметры: -// ПараметрыЗагрузкиФайловРБК - Соответствие: -// ПутьКФайлуБИКРБК - Строка - путь к файлу с данными классификатора, размещенному во временном каталоге. -// ПутьКФайлуРегионовРБК - Строка - путь к файлу с информацией о регионах, размещенному во временном каталоге. -// Загружено - Число - количество новых записей классификатора. -// Обновлено - Число - количество обновленных записей классификатора. -// ТекстСообщения - Строка - тест сообщения о результатах загрузки. -// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. -// -Процедура ЗагрузитьДанныеРБК(ПараметрыЗагрузкиФайловРБК) - - СоответствиеРегионов = ПолучитьСоответствиеРегионов(ПараметрыЗагрузкиФайловРБК["ПутьКФайлуРегионовРБК"]); - - ТекстБИКРБК = Новый ЧтениеТекста(ПараметрыЗагрузкиФайловРБК["ПутьКФайлуБИКРБК"], "windows-1251"); - СтрокаТекстаБИКРБК = ТекстБИКРБК.ПрочитатьСтроку(); - - ДатаЗагрузки = ТекущаяУниверсальнаяДата(); - - ПараметрыЗагрузкиДанныхРБК = Новый Соответствие; - ПараметрыЗагрузкиДанныхРБК.Вставить("Загружено", ПараметрыЗагрузкиФайловРБК["Загружено"]); - ПараметрыЗагрузкиДанныхРБК.Вставить("Обновлено", ПараметрыЗагрузкиФайловРБК["Обновлено"]); - - Пока СтрокаТекстаБИКРБК <> Неопределено Цикл - - Строка = СтрокаТекстаБИКРБК; - - Если ПустаяСтрока(СокрЛП(Строка)) Тогда - Продолжить; - КонецЕсли; - - СтруктураБанк = ПолучитьСтруктуруПолейБанка(Строка, СоответствиеРегионов); - СтрокаТекстаБИКРБК = ТекстБИКРБК.ПрочитатьСтроку(); - - Если ПустаяСтрока(СтруктураБанк) Тогда - Продолжить; - КонецЕсли; - - ПараметрыЗагрузкиДанныхРБК.Вставить("СтруктураБанк", СтруктураБанк); - ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанныхРБК); - - КонецЦикла; - - // Пометка недействующих банков. - ДействующиеБанки = ДействующиеБанкиИзФайла(ПараметрыЗагрузкиФайловРБК["ПутьКФайлуБИКРБК"]); - НедействующиеБанки = НедействующиеБанкиИзФайла(ПараметрыЗагрузкиФайловРБК["ПутьКФайлуНедействующихБанков"]); - КоличествоОтмеченных = ОтметитьНедействующиеБанки(ДействующиеБанки, НедействующиеБанки); - ПараметрыЗагрузкиДанныхРБК["Обновлено"] = ПараметрыЗагрузкиДанныхРБК["Обновлено"] + КоличествоОтмеченных; - - ПараметрыЗагрузкиФайловРБК.Вставить("Загружено", ПараметрыЗагрузкиДанныхРБК["Загружено"]); - ПараметрыЗагрузкиФайловРБК.Вставить("Обновлено", ПараметрыЗагрузкиДанныхРБК["Обновлено"]); -КонецПроцедуры - -// Получает файл http://cbrates.rbc.ru/bnk/bnk.zip. -// Параметры: -// ПараметрыПолученияФайловРБК - Соответствие: -// ПутьКФайлуРБК - Строка - путь к полученному файлу, размещенному во временном каталоге. -// ВременныйКаталог - Строка - путь к временному каталогу. -// ТекстСообщения - Строка - текст сообщения об ошибке. -Процедура ПолучитьДанныеРБКИзИнтернета(ПараметрыПолученияФайловРБК) - УстановитьПривилегированныйРежим(Истина); - ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКлассификатораБанков.Получить(); - ПараметрыПолучения = ПараметрыАутентификацииНаСайте(); - УстановитьПривилегированныйРежим(Ложь); - - Если ИспользоватьАльтернативныйСервер Тогда - ФайлРБКНаВебСервере = "http://cbrates.rbc.ru/bnk/bnk.zip"; - Иначе - ФайлРБКНаВебСервере = "https://bankregister.1c.ru/bankregister/v1/bnk.zip"; - КонецЕсли; - - ВременныйФайлРБК = ПараметрыПолученияФайловРБК["ВременныйКаталог"]+ "\bnk.zip"; - ПараметрыПолучения.Вставить("ПутьДляСохранения", ВременныйФайлРБК); - - ДатаПоследнегоОбновления = ПараметрыПолученияФайловРБК["ВерсияКлассификатора"]; - ПараметрыПолучения.Вставить("Заголовки", Новый Соответствие); - ПараметрыПолучения.Заголовки.Вставить("If-Modified-Since", ДатаHTTP(ДатаПоследнегоОбновления)); - - РезультатИзИнтернета = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлРБКНаВебСервере, ПараметрыПолучения); - - Если РезультатИзИнтернета.Статус Тогда - ПараметрыПолученияФайловРБК.Вставить("ПутьКФайлуРБК", РезультатИзИнтернета.Путь); - ВерсияКлассификатора = РезультатИзИнтернета.Заголовки["Last-Modified"]; - Если ВерсияКлассификатора <> Неопределено Тогда - ВерсияКлассификатора = ПрочитатьДатуHTTP(ВерсияКлассификатора); - ПараметрыПолученияФайловРБК["ВерсияКлассификатора"] = ВерсияКлассификатора; - КонецЕсли; - Иначе - Если РезультатИзИнтернета.КодСостояния = 304 Тогда - ПараметрыПолученияФайловРБК["ЕстьОбновлениеНаСервере"] = Ложь; - Иначе - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - ДополнительноеСообщение = Символы.ПС - + НСтр("ru ='Возможно неточные или неправильные настройки подключения к Интернету.'"); - Иначе - ДополнительноеСообщение = Символы.ПС - + НСтр("ru ='Возможно неточные или неправильные настройки подключения к Интернету на сервере 1С:Предприятие.'"); - КонецЕсли; - СообщениеОбОшибке = РезультатИзИнтернета.СообщениеОбОшибке + ДополнительноеСообщение; - ПараметрыПолученияФайловРБК.Вставить("ТекстСообщения", СообщениеОбОшибке); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Функция ПараметрыАутентификацииНаСайте() - Результат = Новый Структура; - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда - МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); - Если ДанныеАутентификации <> Неопределено Тогда - Результат.Вставить("Пользователь", ДанныеАутентификации.Логин); - Результат.Вставить("Пароль", ДанныеАутентификации.Пароль); - КонецЕсли; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Преобразует дату формата rfc1123-date в обычную универсальную дату. -// См. https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html, п. 3.3.1. -Функция ПрочитатьДатуHTTP(ДатаHTTP) - Месяцы = СтрРазделить("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", ","); - ДатаВремя = СтрРазделить(ДатаHTTP, " ", Ложь); - - День = ДатаВремя[1]; - Месяц = Месяцы.Найти(ДатаВремя[2]) + 1; - Год = ДатаВремя[3]; - Время = СтрРазделить(ДатаВремя[4], ":", Истина); - Час = Время[0]; - Минута = Время[1]; - Секунда = Время[2]; - - УниверсальноеВремя = Дата(Год, Месяц, День, Час, Минута, Секунда); - Возврат УниверсальноеВремя; -КонецФункции - -// Преобразует универсальную дату в дату формата rfc1123-date. -// См. https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html, п. 3.3.1. -Функция ДатаHTTP(Знач Дата) - ДниНедели = СтрРазделить("Mon,Tue,Wed,Thu,Fri,Sat,Sun", ","); - Месяцы = СтрРазделить("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", ","); - - ШаблонДаты = "[ДеньНедели], [День] [Месяц] [Год] [Час]:[Минута]:[Секунда] GMT"; - - ПараметрыДаты = Новый Структура; - ПараметрыДаты.Вставить("ДеньНедели", ДниНедели[ДеньНедели(Дата)-1]); - ПараметрыДаты.Вставить("День", Формат(День(Дата), "ЧЦ=2; ЧВН=")); - ПараметрыДаты.Вставить("Месяц", Месяцы[Месяц(Дата)-1]); - ПараметрыДаты.Вставить("Год", Формат(Год(Дата), "ЧЦ=4; ЧВН=; ЧГ=0")); - ПараметрыДаты.Вставить("Час", Формат(Час(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); - ПараметрыДаты.Вставить("Минута", Формат(Минута(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); - ПараметрыДаты.Вставить("Секунда", Формат(Секунда(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); - - ДатаHTTP = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(ШаблонДаты, ПараметрыДаты); - - Возврат ДатаHTTP; -КонецФункции - -// Определяет по коду типа города строку типа города. -// Параметры: -// КодТипа - Строка - код типа населенного пункта. -// Возвращаемое значение: -// сокращенная строка типа населенного пункта. -// -Функция ОпределитьТипГородаПоКоду(КодТипа) - - Если КодТипа = "1" Тогда - Возврат "Г."; // ГОРОД - ИначеЕсли КодТипа = "2" Тогда - Возврат "П."; // ПОСЕЛОК - ИначеЕсли КодТипа = "3" Тогда - Возврат "С."; // СЕЛО - ИначеЕсли КодТипа = "4" Тогда - Возврат "ПГТ"; // ПОСЕЛОК ГОРОДСКОГО ТИПА - ИначеЕсли КодТипа = "5" Тогда - Возврат "СТ-ЦА"; // СТАНИЦА - ИначеЕсли КодТипа = "6" Тогда - Возврат "АУЛ"; // АУЛ - ИначеЕсли КодТипа = "7" Тогда - Возврат "РП"; // РАБОЧИЙ ПОСЕЛОК - Иначе - Возврат ""; - КонецЕсли; - -КонецФункции - -// Формирует соответствие кодов регионов и регионов. -// Параметры: -// ПутьКФайлуРегионовРБК - Строка - путь к файлу с информацией о регионах, размещенному во временном каталоге. -// Возвращаемое значение: -// СоответствиеРегионов - Соответствие - Код региона и регион. -// -Функция ПолучитьСоответствиеРегионов(ПутьКФайлуРегионовРБК) - - Разделитель = Символы.Таб; - СоответствиеРегионов = Новый Соответствие; - РегионыРБКТекстовыйДокумент = Новый ЧтениеТекста(ПутьКФайлуРегионовРБК, "windows-1251"); - СтрокаРегионовРБК = РегионыРБКТекстовыйДокумент.ПрочитатьСтроку(); - - Пока СтрокаРегионовРБК <> Неопределено Цикл - - Строка = СтрокаРегионовРБК; - СтрокаРегионовРБК = РегионыРБКТекстовыйДокумент.ПрочитатьСтроку(); - - Если (Лев(Строка,2) = "//") Или (ПустаяСтрока(Строка)) Тогда - Продолжить; - КонецЕсли; - - МассивПодстрок = СтрРазделить(Строка, Разделитель); - - Если МассивПодстрок.Количество() < 2 Тогда - Продолжить; - КонецЕсли; - - Символ1 = СокрЛП(МассивПодстрок[0]); - Символ2 = СокрЛП(МассивПодстрок[1]); - - // Дополним код региона до двух знаков. - Если СтрДлина(Символ1) = 1 Тогда - Символ1 = "0" + Символ1; - КонецЕсли; - - СоответствиеРегионов.Вставить(Символ1, Символ2); - КонецЦикла; - - Возврат СоответствиеРегионов; - -КонецФункции - -// Формирует структуру полей для банка. -// Параметры: -// Строка - Строка - Строка из текстового файла классификатора. -// Регионы - Соответствие - Код региона и регион банка. -// Возвращаемое значение: -// Банк - Структура - Реквизиты банка. -// -Функция ПолучитьСтруктуруПолейБанка(Знач Строка, Регионы) - - Результат = Новый Структура; - - СписокПолей = Новый Массив; - СписокПолей.Добавить("ТипУчастникаРасчетов"); - СписокПолей.Добавить("ИмяНаселенногоПункта"); - СписокПолей.Добавить("ТипПункта"); - СписокПолей.Добавить("Наименование"); - СписокПолей.Добавить("ПризнакКода"); - СписокПолей.Добавить("БИК"); - СписокПолей.Добавить("КоррСчет"); - СписокПолей.Добавить("СВИФТБИК"); - СписокПолей.Добавить("ИНН"); - - КоллекцияЗначений = СтрРазделить(Строка, Символы.Таб, Истина); - Для Индекс = 0 По СписокПолей.Количество() - 1 Цикл; - Значение = ""; - Если Индекс <= КоллекцияЗначений.ВГраница() Тогда - Значение = СокрЛП(КоллекцияЗначений[Индекс]); - КонецЕсли; - Результат.Вставить(СписокПолей[Индекс], Значение); - КонецЦикла; - - Если СтрДлина(Результат.БИК) <> 9 Тогда - Возврат ""; - КонецЕсли; - - Результат.ТипПункта = ОпределитьТипГородаПоКоду(Результат.ТипПункта); - Результат.Вставить("Город", СокрЛП(Результат.ТипПункта + " " + Результат.ИмяНаселенногоПункта)); - Результат.Вставить("Телефоны", ""); - Результат.Вставить("Адрес", ""); - - КодРегиона = Сред(Результат.БИК, 3, 2); - Регион = Регионы[КодРегиона]; - Если Регион = Неопределено Тогда - Регион = НСтр("ru = 'Другие территории'"); - КодРегиона = ""; - КонецЕсли; - - Результат.Вставить("КодРегиона", КодРегиона); - Результат.Вставить("Регион", Регион); - - Возврат Результат; - -КонецФункции - -// Выполняет загрузку классификатора банков РФ из файла, полученного с сайта РБК. -Функция ЗагрузитьДанныеИзФайлаРБК(ИмяФайла) Экспорт - - ПапкаСИзвлеченнымиФайлами = ИзвлечьФайлыИзАрхива(ИмяФайла); - Если ФайлыКлассификатораПолучены(ПапкаСИзвлеченнымиФайлами) Тогда - Параметры = Новый Соответствие; - ФайлБИКСВИФТ = Новый Файл(ИмяФайлаБИКСВИФТРБК(ПапкаСИзвлеченнымиФайлами)); - Если ФайлБИКСВИФТ.Существует() Тогда - Параметры.Вставить("ПутьКФайлуБИКРБК", ИмяФайлаБИКСВИФТРБК(ПапкаСИзвлеченнымиФайлами)); - Иначе - Параметры.Вставить("ПутьКФайлуБИКРБК", ИмяФайлаБИКРБК(ПапкаСИзвлеченнымиФайлами)); - КонецЕсли; - Параметры.Вставить("ПутьКФайлуРегионовРБК", ИмяФайлаРегионовРБК(ПапкаСИзвлеченнымиФайлами)); - Параметры.Вставить("ПутьКФайлуНедействующихБанков", ИмяФайлаНедействующихБанков(ПапкаСИзвлеченнымиФайлами)); - Параметры.Вставить("Загружено", 0); - Параметры.Вставить("Обновлено", 0); - Параметры.Вставить("ТекстСообщения", ""); - Параметры.Вставить("ЗагрузкаВыполнена", Неопределено); - - ЗагрузитьДанныеРБК(Параметры); - УстановитьВерсиюКлассификатораБанков(); - КонецЕсли; - -КонецФункции - -Функция ФайлыКлассификатораПолучены(ПапкаСФайлами) - - Результат = Истина; - - ИменаФайловДляПроверки = Новый Массив; - ИменаФайловДляПроверки.Добавить(ИмяФайлаБИКРБК(ПапкаСФайлами)); - ИменаФайловДляПроверки.Добавить(ИмяФайлаРегионовРБК(ПапкаСФайлами)); - ИменаФайловДляПроверки.Добавить(ИмяФайлаНедействующихБанков(ПапкаСФайлами)); - - Для Каждого ИмяФайла Из ИменаФайловДляПроверки Цикл - Файл = Новый Файл(ИмяФайла); - Если Не Файл.Существует() Тогда - ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден файл %1'"), ИмяФайла)); - Результат = Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ИзвлечьФайлыИзАрхива(ZipФайл) - - ВременнаяПапка = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременнаяПапка); - - Попытка - ЧтениеZipФайла = Новый ЧтениеZipФайла(ZipФайл); - ЧтениеZipФайла.ИзвлечьВсе(ВременнаяПапка); - Исключение - ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - УдалитьФайлы(ВременнаяПапка); - КонецПопытки; - - Возврат ВременнаяПапка; - -КонецФункции - -Функция ИмяФайлаРегионовРБК(ПапкаСФайламиКлассификатора) - - Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "reg.txt"; - -КонецФункции - -Функция ИмяФайлаБИКРБК(ПапкаСФайламиКлассификатора) - - Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkseek.txt"; - -КонецФункции - -Функция ИмяФайлаБИКСВИФТРБК(ПапкаСФайламиКлассификатора) - - Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkseek_swift.txt"; - -КонецФункции - -Функция ИмяФайлаНедействующихБанков(ПапкаСФайламиКлассификатора) - - Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkdel.txt"; - -КонецФункции - -Процедура ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки) - - ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); - -КонецПроцедуры - -Функция ИмяСобытияВЖурналеРегистрации() - УстановитьПривилегированныйРежим(Истина); - ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКлассификатораБанков.Получить(); - УстановитьПривилегированныйРежим(Ложь); - - Если ИспользоватьАльтернативныйСервер Тогда - Возврат НСтр("ru = 'Загрузка классификатора банков.РБК'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - КонецЕсли; - - Возврат НСтр("ru = 'Загрузка классификатора банков.1С'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - -КонецФункции - -Функция НедействующиеБанкиИзФайла(ПутьКФайлу) - - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("БИК", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(9))); - Результат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100))); - Результат.Колонки.Добавить("ДатаЗакрытия", Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Дата))); - - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251"); - - Строка = ЧтениеТекста.ПрочитатьСтроку(); - Пока Строка <> Неопределено Цикл - СведенияОБанке = СтрРазделить(Строка, Символы.Таб); - Если СведенияОБанке.Количество() <> 8 Тогда - Продолжить; - КонецЕсли; - Банк = Результат.Добавить(); - Банк.БИК = СведенияОБанке[6]; - Банк.Наименование = СведенияОБанке[4]; - Банк.ДатаЗакрытия = СведенияОБанке[1]; - - Строка = ЧтениеТекста.ПрочитатьСтроку(); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ДействующиеБанкиИзФайла(ПутьКФайлу) - - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("БИК", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(9))); - Результат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100))); - - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251"); - - Строка = ЧтениеТекста.ПрочитатьСтроку(); - Пока Строка <> Неопределено Цикл - СведенияОБанке = СтрРазделить(Строка, Символы.Таб); - Строка = ЧтениеТекста.ПрочитатьСтроку(); - - Если СведенияОБанке.Количество() < 7 Тогда - Продолжить; - КонецЕсли; - Банк = Результат.Добавить(); - Банк.БИК = СведенияОБанке[5]; - Банк.Наименование = СведенияОБанке[3]; - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ОтметитьНедействующиеБанки(ДействующиеБанки, НедействующиеБанки) - - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - - Запрос.Текст = - "ВЫБРАТЬ - | НедействующиеБанки.БИК КАК БИК - |ПОМЕСТИТЬ НедействующиеБанки - |ИЗ - | &НедействующиеБанки КАК НедействующиеБанки - |ГДЕ - | НЕ НедействующиеБанки.БИК В (&БИК) - | - |ИНДЕКСИРОВАТЬ ПО - | БИК"; - Запрос.УстановитьПараметр("НедействующиеБанки", НедействующиеБанки); - Запрос.УстановитьПараметр("БИК", ДействующиеБанки.ВыгрузитьКолонку("БИК")); - Запрос.Выполнить(); - - Запрос.Текст = - "ВЫБРАТЬ - | КлассификаторБанковРФ.Ссылка - |ИЗ - | НедействующиеБанки КАК НедействующиеБанки - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ - | ПО НедействующиеБанки.БИК = КлассификаторБанковРФ.Код - |ГДЕ - | КлассификаторБанковРФ.ДеятельностьПрекращена = ЛОЖЬ - | - |СГРУППИРОВАТЬ ПО - | КлассификаторБанковРФ.Ссылка"; - - ВыборкаБанков = Запрос.Выполнить().Выбрать(); - Пока ВыборкаБанков.Следующий() Цикл - БанкОбъект = ВыборкаБанков.Ссылка.ПолучитьОбъект(); - БанкОбъект.ДеятельностьПрекращена = Истина; - БанкОбъект.Записать(); - КонецЦикла; - - Возврат ВыборкаБанков.Количество(); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Работа с данными диска ИТС - -// Сортирует, записывает данные классификатора БИК РФ с диска ИТС. -// -// Параметры: -// ПараметрыЗагрузкиФайловИТС - Соответствие: -// ПодготовкаИТСАдресДвоичныхДанных - ВременноеХранилище - Обработка подготовки данных БИК ИТС. -// ДанныеИТСАдресДвоичныхДанных - ВременноеХранилище - Файл данных БИК ИТС. -// Загружено - Число - Количество новых записей классификатора. -// Обновлено - Число - Количество обновленных записей классификатора. -// ТекстСообщения - Строка - тест сообщения о результатах загрузки. -// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. -// -Процедура ЗагрузитьДанныеДискИТС(ПараметрыЗагрузкиФайловИТС) Экспорт - - ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); - СоздатьКаталог(ВременныйКаталог); - - ПодготовкаИТСДвоичныеДанные = ПолучитьИзВременногоХранилища(ПараметрыЗагрузкиФайловИТС["ПодготовкаИТСАдресДвоичныхДанных"]); - ПодготовкаИТСПуть = ВременныйКаталог + "BIKr5v82_MA.epf"; - ПодготовкаИТСДвоичныеДанные.Записать(ПодготовкаИТСПуть); - ОбработкаПодготовкиДанныхИТС = Новый Файл(ПодготовкаИТСПуть); - - ДанныеИТСДвоичныеДанные = ПолучитьИзВременногоХранилища(ПараметрыЗагрузкиФайловИТС["ДанныеИТСАдресДвоичныхДанных"]); - ПутьКДаннымИТС = ВременныйКаталог + "Morph.dlc"; - ДанныеИТСДвоичныеДанные.Записать(ПутьКДаннымИТС); - ДанныеИТС = Новый ТекстовыйДокумент; - ДанныеИТС.Прочитать(ПутьКДаннымИТС); - - ТаблицаКлассификатора = Новый ТаблицаЗначений; - ТаблицаКлассификатора.Колонки.Добавить("БИК"); - ТаблицаКлассификатора.Колонки.Добавить("Наименование"); - ТаблицаКлассификатора.Колонки.Добавить("КоррСчет"); - ТаблицаКлассификатора.Колонки.Добавить("Город"); - ТаблицаКлассификатора.Колонки.Добавить("Адрес"); - ТаблицаКлассификатора.Колонки.Добавить("Телефоны"); - ТаблицаКлассификатора.Колонки.Добавить("КодРегиона"); - ТаблицаКлассификатора.Колонки.Добавить("Регион"); - - ВнешняяОбработкаПодготовкиДанныхИТС = ВнешниеОбработки.Создать(ОбработкаПодготовкиДанныхИТС.ПолноеИмя); - - КоличествоСтрок = ДанныеИТС.КоличествоСтрок(); - - СтрокаВерсии = ДанныеИТС.ПолучитьСтроку(1); - - КоличествоЧастей = Окр(КоличествоСтрок/1000); - СоответствиеРегионов = ""; - ТекстСообщения = ""; - ДатаВерсии = ""; - - Для НомерЧасти = 1 По КоличествоЧастей Цикл - ВнешняяОбработкаПодготовкиДанныхИТС.СортироватьДанныеКлассификатора(ДанныеИТС, ТаблицаКлассификатора, - СоответствиеРегионов, ДатаВерсии, - НомерЧасти, ТекстСообщения); - Если Не ПустаяСтрока(ТекстСообщения) Тогда - Возврат; - КонецЕсли; - - ПараметрыЗагрузкиДанныхИТС = Новый Соответствие; - ПараметрыЗагрузкиДанныхИТС.Вставить("ТаблицаКлассификатора", ТаблицаКлассификатора); - ПараметрыЗагрузкиДанныхИТС.Вставить("Загружено", ПараметрыЗагрузкиФайловИТС["Загружено"]); - ПараметрыЗагрузкиДанныхИТС.Вставить("Обновлено", ПараметрыЗагрузкиФайловИТС["Обновлено"]); - - ЗаписатьДанныеКлассификатора(ПараметрыЗагрузкиДанныхИТС); - - ПараметрыЗагрузкиФайловИТС.Вставить("Загружено", ПараметрыЗагрузкиДанныхИТС["Загружено"]); - ПараметрыЗагрузкиФайловИТС.Вставить("Обновлено", ПараметрыЗагрузкиДанныхИТС["Обновлено"]); - - КонецЦикла; - - УстановитьВерсиюКлассификатораБанков(ДатаВерсии); - УдалитьФайлы(ВременныйКаталог); - - Если ПустаяСтрока(ПараметрыЗагрузкиФайловИТС["ТекстСообщения"]) Тогда - ПараметрыЗагрузкиФайловИТС.Вставить("ЗагрузкаВыполнена", Истина); - ДополнитьТекстСообщения(ПараметрыЗагрузкиФайловИТС); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Запись обработанных данных - -/// Записывает/перезаписывает в справочник КлассификаторБанковРФ данные банка. -// Параметры: -// ПараметрыЗагрузкиДанных - Соответствие: -// СтруктураБанк - Структура или СтрокаТаблицыЗначений - Данные банка. -// Загружено - Число - Количество новых записей классификатора. -// Обновлено - Число - Количество обновленных записей классификатора. -// -Процедура ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанных) - - ФлагНовый = Ложь; - ФлагОбновленный = Ложь; - Регион = ""; - - СтруктураБанк = ПараметрыЗагрузкиДанных["СтруктураБанк"]; - Загружено = ПараметрыЗагрузкиДанных["Загружено"]; - Обновлено = ПараметрыЗагрузкиДанных["Обновлено"]; - - ТекущийРегион = Справочники.КлассификаторБанковРФ.НайтиПоКоду(СтруктураБанк.КодРегиона); - Если ТекущийРегион.Пустая() Тогда - Регион = Справочники.КлассификаторБанковРФ.СоздатьГруппу(); - Иначе - Если ТекущийРегион.ЭтоГруппа Тогда - Регион = ТекущийРегион.ПолучитьОбъект(); - Иначе - Регион = Справочники.КлассификаторБанковРФ.СоздатьГруппу(); - КонецЕсли; - КонецЕсли; - - Если СокрЛП(Регион.Код) <> СокрЛП(СтруктураБанк.КодРегиона) Тогда - Регион.Код = СокрЛП(СтруктураБанк.КодРегиона); - КонецЕсли; - - Если СокрЛП(Регион.Наименование) <> СокрЛП(СтруктураБанк.Регион) Тогда - Регион.Наименование = СокрЛП(СтруктураБанк.Регион); - КонецЕсли; - - Если Регион.Модифицированность() Тогда - Регион.Записать(); - КонецЕсли; - - ЗаписываемыйЭлементСправочникаКлассификаторБанковРФ = - Справочники.КлассификаторБанковРФ.НайтиПоКоду(СтруктураБанк.БИК); - - Если ЗаписываемыйЭлементСправочникаКлассификаторБанковРФ.Пустая() Тогда - КлассификаторБанковОбъект = Справочники.КлассификаторБанковРФ.СоздатьЭлемент(); - ФлагНовый = Истина; - Иначе - КлассификаторБанковОбъект = ЗаписываемыйЭлементСправочникаКлассификаторБанковРФ.ПолучитьОбъект(); - КонецЕсли; - - Если КлассификаторБанковОбъект.ДеятельностьПрекращена Тогда - КлассификаторБанковОбъект.ДеятельностьПрекращена = Ложь; - КонецЕсли; - - Если КлассификаторБанковОбъект.Код <> СтруктураБанк.БИК Тогда - КлассификаторБанковОбъект.Код = СтруктураБанк.БИК; - КонецЕсли; - - Если СтруктураБанк.Свойство("СВИФТБИК") Тогда - Если КлассификаторБанковОбъект.СВИФТБИК <> СтруктураБанк.СВИФТБИК Тогда - Если Не ПустаяСтрока(СтруктураБанк.СВИФТБИК) Тогда - КлассификаторБанковОбъект.СВИФТБИК = СтруктураБанк.СВИФТБИК; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если СтруктураБанк.Свойство("ИНН") Тогда - Если КлассификаторБанковОбъект.ИНН <> СтруктураБанк.ИНН Тогда - Если Не ПустаяСтрока(СтруктураБанк.ИНН) Тогда - КлассификаторБанковОбъект.ИНН = СтруктураБанк.ИНН; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.Наименование <> СтруктураБанк.Наименование Тогда - Если Не ПустаяСтрока(СтруктураБанк.Наименование) Тогда - КлассификаторБанковОбъект.Наименование = СтруктураБанк.Наименование; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.КоррСчет <> СтруктураБанк.КоррСчет Тогда - Если Не ПустаяСтрока(СтруктураБанк.КоррСчет) Тогда - КлассификаторБанковОбъект.КоррСчет = СтруктураБанк.КоррСчет; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.Город <> СтруктураБанк.Город Тогда - Если Не ПустаяСтрока(СтруктураБанк.Город) Тогда - КлассификаторБанковОбъект.Город = СтруктураБанк.Город; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.Адрес <> СтруктураБанк.Адрес Тогда - Если Не ПустаяСтрока(СтруктураБанк.Адрес) Тогда - КлассификаторБанковОбъект.Адрес = СтруктураБанк.Адрес; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.Телефоны <> СтруктураБанк.Телефоны Тогда - Если Не ПустаяСтрока(СтруктураБанк.Телефоны) Тогда - КлассификаторБанковОбъект.Телефоны = СтруктураБанк.Телефоны; - КонецЕсли; - КонецЕсли; - - Если Не ПустаяСтрока(Регион) Тогда - Если КлассификаторБанковОбъект.Родитель <> Регион.Ссылка Тогда - КлассификаторБанковОбъект.Родитель = Регион.Ссылка; - КонецЕсли; - КонецЕсли; - - Если КлассификаторБанковОбъект.Модифицированность() Тогда - ФлагОбновленный = Истина; - КлассификаторБанковОбъект.Записать(); - КонецЕсли; - - Если ФлагНовый Тогда - Загружено = Загружено + 1; - ИначеЕсли ФлагОбновленный Тогда - Обновлено = Обновлено + 1; - КонецЕсли; - - ПараметрыЗагрузкиДанных.Вставить("Загружено", Загружено); - ПараметрыЗагрузкиДанных.Вставить("Обновлено", Обновлено); - -КонецПроцедуры - -// Записывает/перезаписывает в справочник КлассификаторБанковРФ данные банков. -// Параметры: -// ПараметрыЗагрузкиДанныхИТС - Соответствие: -// ТаблицаКлассификатора - ТаблицаЗначений - Данные банков. -// Загружено - Число - Количество новых записей классификатора. -// Обновлено - Число - Количество обновленных записей классификатора. -// -Процедура ЗаписатьДанныеКлассификатора(ПараметрыЗагрузкиДанныхИТС) - - ТаблицаБанков = ПараметрыЗагрузкиДанныхИТС["ТаблицаКлассификатора"]; - - ПараметрыЗагрузкиДанных = Новый Соответствие; - ПараметрыЗагрузкиДанных.Вставить("Загружено", ПараметрыЗагрузкиДанныхИТС["Загружено"]); - ПараметрыЗагрузкиДанных.Вставить("Обновлено", ПараметрыЗагрузкиДанныхИТС["Обновлено"]); - - Для СчетчикБанков = 1 По ТаблицаБанков.Количество() Цикл - - СтрокаТаблицыБанков = ТаблицаБанков.Получить(СчетчикБанков - 1); - - ПараметрыЗагрузкиДанных.Вставить("СтруктураБанк", СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыБанков)); - ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанных); - - КонецЦикла; - - ПараметрыЗагрузкиДанныхИТС.Вставить("Загружено", ПараметрыЗагрузкиДанных["Загружено"]); - ПараметрыЗагрузкиДанныхИТС.Вставить("Обновлено", ПараметрыЗагрузкиДанных["Обновлено"]); - -КонецПроцедуры - -Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицы) - Результат = Новый Структура; - Для Каждого Колонка Из СтрокаТаблицы.Владелец().Колонки Цикл - Результат.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]); - КонецЦикла; - Возврат Результат; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Прочие процедуры и функции - -// Устанавливает значение даты загрузки данных классификатора. -// -// Параметры: -// ДатаВерсии - ДатаВремя - Дата загрузки данных классификатора. -Процедура УстановитьВерсиюКлассификатораБанков(ДатаВерсии = "") - УстановитьПривилегированныйРежим(Истина); - Если ТипЗнч(ДатаВерсии) <> Тип("Дата") Тогда - Константы.ВерсияКлассификатораБанковРФ.Установить(ТекущаяУниверсальнаяДата()); - Иначе - Константы.ВерсияКлассификатораБанковРФ.Установить(ДатаВерсии); - КонецЕсли; КонецПроцедуры // Определяет нужно ли обновление данных классификатора. // Функция КлассификаторАктуален() Экспорт - УстановитьПривилегированныйРежим(Истина); - ПоследнееОбновление = Константы.ВерсияКлассификатораБанковРФ.Получить(); - ДопустимаяПросрочка = 30*60*60*24; - Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда - Возврат Ложь; // Пошла просрочка. + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Возврат Обработки[ИмяОбработки].КлассификаторАктуален(); КонецЕсли; Возврат Истина; -КонецФункции - -Функция АктуальностьКлассификатораБанков() - - УстановитьПривилегированныйРежим(Истина); - ПоследнееОбновление = Константы.ВерсияКлассификатораБанковРФ.Получить(); - ДопустимаяПросрочка = 60*60*24; - - Результат = Новый Структура; - Результат.Вставить("КлассификаторУстарел", Ложь); - Результат.Вставить("КлассификаторПросрочен", Ложь); - Результат.Вставить("ВеличинаПросрочкиСтрокой", ""); - - Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда - Результат.ВеличинаПросрочкиСтрокой = ОбщегоНазначения.ИнтервалВремениСтрокой(ПоследнееОбновление, ТекущаяДатаСеанса()); - - ВеличинаПросрочки = (ТекущаяДатаСеанса() - ПоследнееОбновление); - ДнейПросрочено = Цел(ВеличинаПросрочки/60/60/24); - - Результат.КлассификаторУстарел = ДнейПросрочено >= 1; - Результат.КлассификаторПросрочен = ДнейПросрочено >= 7; - КонецЕсли; - - Возврат Результат; КонецФункции diff --git a/SSL/src/CommonModules/РаботаСБанкамиГлобальный/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиГлобальный/Module.bsl index 7a8051898..8f13c34fc 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиГлобальный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Банки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выводит оповещение о необходимости обновления классификатора банков. diff --git a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl index 81e61da30..889b3927a 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl @@ -1,15 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Банки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Вызывается после запуска конфигурации, подключает обработчик ожидания. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("Банки") И ПараметрыКлиента.Банки.ВыводитьОповещениеОНеактуальности Тогда ПодключитьОбработчикОжидания("РаботаСБанкамиВывестиОповещениеОНеактуальности", 45, Истина); КонецЕсли; @@ -58,7 +55,15 @@ // Возвращает навигационную ссылку для оповещений. // Функция НавигационнаяСсылкаФормыЗагрузки() - Возврат "e1cib/data/Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора"; + Возврат "e1cib/data/Обработка.ЗагрузкаКлассификатораБанков.Форма.ЗагрузкаКлассификатора"; КонецФункции +Процедура ОткрытьФормуЗагрузкиКлассификатора(Владелец, ОткрытиеИзСписка = Ложь) Экспорт + Если ОткрытиеИзСписка Тогда + ПараметрыФормы = Новый Структура("ОткрытиеИзСписка"); + КонецЕсли; + ИмяФормы = "Обработка.ЗагрузкаКлассификатораБанков.Форма.ЗагрузкаКлассификатора"; + ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец); +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl index 55d59d57a..6cedd27b2 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl @@ -1,14 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Банки". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Включает/отключает показ предупреждений о необходимости обновления классификатора банков. // // Параметры: -// ПоказыватьПредупреждение - Булево. +// ПоказыватьПредупреждение - Булево - при установке значения Ложь предупреждения показываться не будут. +// Процедура ПриОпределенииНеобходимостиПоказаПредупрежденияОбУстаревшемКлассификатореБанков(ПоказыватьПредупреждение) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентПереопределяемый/Module.bsl index 034b639cb..a45e0870b 100644 --- a/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Работа с контрагентами. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область ПроверкаКонтрагентов diff --git a/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентСерверПереопределяемый/Module.bsl index 862f89b60..8fcf9f45c 100644 --- a/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентСерверПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКонтрагентамиКлиентСерверПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Работа с контрагентами -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область ПроверкаКонтрагентовВДокументах @@ -83,15 +78,16 @@ КонецПроцедуры // Отображение результата проверки контрагента в справочнике. -// Обязательна к заполнению. +// Обязательна к заполнению. // // Параметры: -// Форма - УправляемаяФорма - Форма справочника, в котором выполнялась проверка контрагента. -// Результат проверки хранится в реквизите РеквизитыПроверкиКонтрагентов(Структура) формы контрагента. -// Структуру полей РеквизитыПроверкиКонтрагентов см. в процедуре ИнициализироватьРеквизитыФормыКонтрагент ОМ -// ПроверкаКонтрагентов. -// ПредставлениеРезультатаПроверки - ФорматированнаяСтрока или пустая Строка - представление результата проверки -// контрагента. +// Форма - УправляемаяФорма - Форма справочника, в котором выполнялась проверка контрагента. +// Результат проверки хранится в реквизите РеквизитыПроверкиКонтрагентов(Структура) формы контрагента. +// Структуру полей РеквизитыПроверкиКонтрагентов см. в процедуре ИнициализироватьРеквизитыФормыКонтрагент ОМ +// ПроверкаКонтрагентов. +// ПредставлениеРезультатаПроверки - ФорматированнаяСтрока, Строка - представление результата проверки +// контрагента. +// Процедура ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма, ПредставлениеРезультатаПроверки) Экспорт diff --git a/SSL/src/CommonModules/РаботаСКонтрагентамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСКонтрагентамиПереопределяемый/Module.bsl index f0a9ab4ca..b3d946c9e 100644 --- a/SSL/src/CommonModules/РаботаСКонтрагентамиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКонтрагентамиПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Работа с контрагентами. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс #Область ПроверкаКонтрагентовВДокументах @@ -81,7 +76,7 @@ // Определение даты в счете-фактуре. // // Параметры: -// СчетФактураОбъект - ДанныеФормыСтруктура или ДокументОбъект - Счет-фактура, чью дату необходимо получить. +// СчетФактураОбъект - ДанныеФормыСтруктура, ДокументОбъект - Счет-фактура, чью дату необходимо получить. // Дата - Дата - Результат, дата счета-фактуры. Процедура ОпределитьДатуВСчетеФактуре(СчетФактураОбъект, Дата) Экспорт @@ -157,15 +152,16 @@ // Прорисовать состояния контрагентов в документе. // // Параметры: -// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов. -// СостояниеПроверки - Перечисления.СостоянияПроверкиКонтрагентов - Указывает, в каком состояние проверка: -// завершилась, не завершилась, выполняется или отсутствует доступ к веб-сервису. -// ДополнительныеПараметры - Неопределено или Структура - Параметры, показывающие в каком элементе формы произошло -// изменение и это изменение вызвало запуск проверки контрагента. Описание структуры см в -// ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания. +// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов. +// СостояниеПроверки - Перечисления.СостоянияПроверкиКонтрагентов - Указывает, в каком состояние проверка: +// завершилась, не завершилась, выполняется или отсутствует доступ к веб-сервису. +// ДополнительныеПараметры - Неопределено, Структура - Параметры, показывающие в каком элементе формы произошло +// изменение и это изменение вызвало запуск проверки контрагента. Описание структуры см в +// ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания. // СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной -// процедуре. -// Пример см в ПроверкаКонтрагентов.ПрорисоватьСостоянияКонтрагентовВДокументе. +// процедуре. +// Пример см в ПроверкаКонтрагентов.ПрорисоватьСостоянияКонтрагентовВДокументе. +// Процедура ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, СостояниеПроверки, ДополнительныеПараметры = Неопределено, СтандартнаяОбработка = Истина) Экспорт КонецПроцедуры @@ -231,7 +227,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы. // СтандартнаяОбработка - Булево - Определяет, выполнять ли действие, определенное в данной процедуре или выполнить // стандартную обработку. @@ -243,7 +239,7 @@ // // Параметры: // Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов. -// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет. +// ПолеТабличногоДокумента - ПолеФормы - поле, в которое необходимо выводить отчет. // НомерРаздела - Число - Номер раздела отчета. // СтандартнаяОбработка - Булево - Определяет, выполнять ли действие, определенное в данной процедуре или выполнить // стандартную обработку. diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl index 178eb71a4..31269d0d5 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Добавляет в справочник валют валюты из классификатора. @@ -14,39 +9,14 @@ // Массив, СправочникСсылка.Валюты - ссылки созданных валют. // Функция ДобавитьВалютыПоКоду(Знач Коды) Экспорт - Перем КлассификаторXML, КлассификаторТаблица, ЗаписьОКВ, НоваяСтрока, Результат; - КлассификаторXML = Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); - КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Результат = Обработки["ЗагрузкаКурсовВалют"].ДобавитьВалютыПоКоду(Коды); + Иначе + Результат = Новый Массив(); + КонецЕсли; - Результат = Новый Массив(); - - Для каждого Код Из Коды Цикл - ЗаписьОКВ = КлассификаторТаблица.Найти(Код, "Code"); - Если ЗаписьОКВ = Неопределено Тогда - Продолжить; - КонецЕсли; - - ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(ЗаписьОКВ.Code); - Если ВалютаСсылка.Пустая() Тогда - НоваяСтрока = Справочники.Валюты.СоздатьЭлемент(); - НоваяСтрока.Код = ЗаписьОКВ.Code; - НоваяСтрока.Наименование = ЗаписьОКВ.CodeSymbol; - НоваяСтрока.НаименованиеПолное = ЗаписьОКВ.Name; - Если ЗаписьОКВ.RBCLoading Тогда - НоваяСтрока.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета; - Иначе - НоваяСтрока.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; - КонецЕсли; - НоваяСтрока.ПараметрыПрописиНаРусском = ЗаписьОКВ.NumerationItemOptions; - НоваяСтрока.Записать(); - Результат.Добавить(НоваяСтрока.Ссылка); - Иначе - Результат.Добавить(ВалютаСсылка); - КонецЕсли - КонецЦикла; - - Возврат Результат; + Возврат Результат; КонецФункции @@ -87,9 +57,9 @@ Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, ВыводитьСуммуБезКопеек = Ложь) Экспорт Сумма = ?(СуммаЧислом < 0, -СуммаЧислом, СуммаЧислом); - ПараметрыПредмета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Валюта, "ПараметрыПрописиНаРусском"); + ПараметрыПрописи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Валюта, "ПараметрыПрописи"); - Результат = ЧислоПрописью(Сумма, "Л=ru_RU;ДП=Ложь", ПараметрыПредмета.ПараметрыПрописиНаРусском); + Результат = ЧислоПрописью(Сумма, "Л=ru_RU;ДП=Ложь", ПараметрыПрописи); Если ВыводитьСуммуБезКопеек И Цел(Сумма) = Сумма Тогда Результат = Лев(Результат, СтрНайти(Результат, "0") - 1); @@ -131,66 +101,8 @@ // Процедура ЗагрузитьАктуальныйКурс(ПараметрыЗагрузки = Неопределено, АдресРезультата = Неопределено) Экспорт - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют); - - ИмяСобытия = ИмяСобытияЖурналаРегистрации(); - - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , , - НСтр("ru = 'Начата регламентная загрузка курсов валют'")); - - ТекущаяДата = ТекущаяДатаСеанса(); - - СостояниеЗагрузки = Неопределено; - ПриЗагрузкеВозниклиОшибки = Ложь; - - Если ПараметрыЗагрузки = Неопределено Тогда - ТекстЗапроса = - "ВЫБРАТЬ - | КурсыВалют.Валюта КАК Валюта, - | КурсыВалют.Валюта.Код КАК КодВалюты, - | МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса - |ИЗ - | РегистрСведений.КурсыВалют КАК КурсыВалют - |ГДЕ - | КурсыВалют.Валюта.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета) - | И НЕ КурсыВалют.Валюта.ПометкаУдаления - | - |СГРУППИРОВАТЬ ПО - | КурсыВалют.Валюта, - | КурсыВалют.Валюта.Код"; - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - - КонецПериода = ТекущаяДата; - Пока Выборка.Следующий() Цикл - НачалоПериода = ?(Выборка.ДатаКурса = '198001010000', НачалоГода(ДобавитьМесяц(ТекущаяДата, -12)), Выборка.ДатаКурса + 60*60*24); - СписокВалют = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Выборка); - ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки); - КонецЦикла; - Иначе - Результат = ЗагрузитьКурсыВалютПоПараметрам(ПараметрыЗагрузки.СписокВалют, - ПараметрыЗагрузки.НачалоПериода, ПараметрыЗагрузки.КонецПериода, ПриЗагрузкеВозниклиОшибки); - КонецЕсли; - - Если АдресРезультата <> Неопределено Тогда - ПоместитьВоВременноеХранилище(Результат, АдресРезультата); - КонецЕсли; - - Если ПриЗагрузкеВозниклиОшибки Тогда - ЗаписьЖурналаРегистрации( - ИмяСобытия, - УровеньЖурналаРегистрации.Ошибка, - , - , - НСтр("ru = 'Во время регламентного задания загрузки курсов валют возникли ошибки'")); - ВызватьИсключение НСтр("ru = 'Загрузка курсов не выполнена. Подробности см. в журнале регистрации.'"); - Иначе - ЗаписьЖурналаРегистрации( - ИмяСобытия, - УровеньЖурналаРегистрации.Информация, - , - , - НСтр("ru = 'Завершена регламентная загрузка курсов валют.'")); + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ЗагрузитьАктуальныйКурс(ПараметрыЗагрузки, АдресРезультата); КонецЕсли; КонецПроцедуры @@ -199,55 +111,18 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "РаботаСКурсамиВалютКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РаботаСКурсамиВалют"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "РаботаСКурсамиВалют"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "РаботаСКурсамиВалют"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "РаботаСКурсамиВалют"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "РаботаСКурсамиВалют"); - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") = Неопределено Тогда + Возврат; + КонецЕсли; + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() // В модели сервиса обновляется автоматически. + Если ОбщегоНазначения.РазделениеВключено() // В модели сервиса обновляется автоматически. Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Или Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.КурсыВалют) Или МодульТекущиеДелаСервер.ДелоОтключено("КлассификаторВалют") Тогда @@ -276,15 +151,7 @@ КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// Обработчики - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт // Загрузка в классификатор валюты запрещена. @@ -295,35 +162,19 @@ КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Справочники.Валюты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют; - Зависимость.ДоступноВМоделиСервиса = Ложь; - Зависимость.ДоступноВАвтономномРабочемМесте = Ложь; + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ПриОпределенииНастроекРегламентныхЗаданий(Зависимости); + КонецЕсли; КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -332,31 +183,10 @@ КонецПроцедуры -// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. -Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт - УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Истина)); -КонецПроцедуры - -// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. -Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт - УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Ложь)); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. -// -// Параметры: -// Параметры - Структура - Параметры запуска. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.РазделениеВключено() Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда КурсыОбновляютсяОтветственными = Ложь; // В модели сервиса обновляются автоматически. ИначеЕсли НЕ ПравоДоступа("Изменение", Метаданные.РегистрыСведений.КурсыВалют) Тогда КурсыОбновляютсяОтветственными = Ложь; // Пользователь не может обновлять курсы валют. @@ -371,37 +201,74 @@ КонецПроцедуры -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт Массив.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя()); КонецПроцедуры -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения())); + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения())); КонецПроцедуры -// Возвращает список разрешений для загрузки курсов валют с сайта РБК. +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.4.4"; + Обработчик.Процедура = "РаботаСКурсамиВалют.ОбновитьСведенияОВалюте937"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.3.10"; + Обработчик.Процедура = "РаботаСКурсамиВалют.ЗаполнитьСпособУстановкиКурсаВалют"; + Обработчик.РежимВыполнения = "Монопольно"; + + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + +КонецПроцедуры + +Процедура ПреобразованиеСвязейВалют() Экспорт + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ПреобразованиеСвязейВалют(); + КонецЕсли; +КонецПроцедуры + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт + + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя); + КонецЕсли; + +КонецПроцедуры + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт + + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + Обработки["ЗагрузкаКурсовВалют"].ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает список разрешений для загрузки курсов валют с сайта 1С. // // Возвращаемое значение: // Массив. @@ -409,21 +276,11 @@ Функция Разрешения() Разрешения = Новый Массив; + ИмяОбработки = "ЗагрузкаКурсовВалют"; + Если Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено Тогда + Обработки[ИмяОбработки].ДобавитьРазрешения(Разрешения); + КонецЕсли; - Протокол = "HTTP"; - Адрес = "cbrates.rbc.ru"; - Порт = Неопределено; - Описание = НСтр("ru = 'Загрузка курсов валют из Интернета.'"); - Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); - - Протокол = "HTTPS"; - Адрес = "currencyrates.1c.ru"; - Порт = Неопределено; - Описание = НСтр("ru = 'Загрузка курсов валют из Интернета.'"); - Разрешения.Добавить( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); - Возврат Разрешения; КонецФункции @@ -457,7 +314,7 @@ КонецПроцедуры -// Возвращает массив валют, курсы которых загружаются с сайта РБК. +// Возвращает массив валют, курсы которых загружаются с сайта 1С. // Функция ЗагружаемыеВалюты() Экспорт @@ -658,75 +515,6 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.0.5.9"; - Обработчик.Процедура = "РаботаСКурсамиВалют.ОбновитьФорматХраненияПрописиНаРусскомЯзыке"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.4.4"; - Обработчик.Процедура = "РаботаСКурсамиВалют.ОбновитьСведенияОВалюте937"; - Обработчик.РежимВыполнения = "Монопольно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.3.10"; - Обработчик.Процедура = "РаботаСКурсамиВалют.ЗаполнитьСпособУстановкиКурсаВалют"; - Обработчик.РежимВыполнения = "Монопольно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.10"; - Обработчик.Процедура = "Справочники.Валюты.ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("dc79c561-8657-4852-bbc5-38ced6996fff"); - Обработчик.Комментарий = НСтр("ru = 'Отключает ошибочно включенную загрузку курсов валюты ""Российский рубль (643)"" из интернета.'"); - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.Валюты.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "Справочник.Валюты"; - Обработчик.ИзменяемыеОбъекты = "Справочник.Валюты"; - - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.69"; - Обработчик.Процедура = "РаботаСКурсамиВалют.УстановитьРасписаниеРегламентногоЗадания"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.НачальноеЗаполнение = Истина; - КонецЕсли; - -КонецПроцедуры - -// Обработчик обновления формата хранения прописей при переходе на более новую версию БСП. -// -Процедура ОбновитьФорматХраненияПрописиНаРусскомЯзыке() Экспорт - - ВыборкаВалют = Справочники.Валюты.Выбрать(); - - Пока ВыборкаВалют.Следующий() Цикл - Объект = ВыборкаВалют.ПолучитьОбъект(); - СтрокаПараметров = СтрЗаменить(Объект.ПараметрыПрописиНаРусском, ",", Символы.ПС); - Род1 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)), 1)); - Род2 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)), 1)); - Объект.ПараметрыПрописиНаРусском = - СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)) + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)) + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)) + ", " - + Род1 + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)) + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)) + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)) + ", " - + Род2 + ", " - + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецЦикла; - -КонецПроцедуры - // Обновляет сведения о валюте, согласно документу "Изменение 33/2012 ОКВ Общероссийский классификатор валют. // ОК (МК (ИСО 4217) 003-97) 014-2000" (принято и введено в действие Приказом Росстандарта от 12.12.2012 N 1883-ст). // @@ -752,65 +540,10 @@ Иначе Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; КонецЕсли; - Валюта.Записать(); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); КонецЦикла; КонецПроцедуры -Процедура УстановитьРасписаниеРегламентногоЗадания() Экспорт - - ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах()); - Задержка = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 21600); // С 0 до 6 часов утра. - - Расписание = Новый РасписаниеРегламентногоЗадания; - Расписание.ПериодПовтораДней = 1; - Расписание.ПериодНедель = 1; - Расписание.ВремяНачала = '00010101000000' + Задержка; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Расписание", Расписание); - ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 600); - ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 10); - - УстановитьПараметрыРегламентногоЗадания(ПараметрыЗадания); - -КонецПроцедуры - -Процедура УстановитьПараметрыРегламентногоЗадания(ИзменяемыеПараметры) - РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют; - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); - - УстановитьПривилегированныйРежим(Истина); - - СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(ПараметрыЗадания); - Если СписокЗаданий.Количество() = 0 Тогда - ПараметрыЗадания = Новый Структура; - Для Каждого ИзменяемыйПараметр Из ИзменяемыеПараметры Цикл - ПараметрыЗадания.Вставить(ИзменяемыйПараметр.Ключ, ИзменяемыйПараметр.Значение); - КонецЦикла; - ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); - РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); - Иначе - Для Каждого Задание Из СписокЗаданий Цикл - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, ИзменяемыеПараметры); - КонецЦикла; - КонецЕсли; -КонецПроцедуры - -Функция ПараметрыАутентификацииНаСайте() - Результат = Новый Структура; - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда - МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); - Если ДанныеАутентификации <> Неопределено Тогда - Результат.Вставить("Пользователь", ДанныеАутентификации.Логин); - Результат.Вставить("Пароль", ДанныеАутентификации.Пароль); - КонецЕсли; - КонецЕсли; - - Возврат Результат; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обновление курсов валют @@ -861,286 +594,4 @@ Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции -// Процедура для загрузки курсов валют по определенному периоду. -// -// Параметры: -// Валюты - Любая коллекция - со следующими полями: -// КодВалюты - числовой код валюты. -// Валюта - ссылка на валюту. -// НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов. -// ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов. -// -// Возвращаемое значение: -// Массив состояния загрузки - каждый элемент - структура с полями. -// Валюта - загружаемая валюта. -// СтатусОперации - завершилась ли загрузка успешно. -// Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение). -// -Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, ПриЗагрузкеВозниклиОшибки = Ложь) - - СостояниеЗагрузки = Новый Массив; - - ПараметрыПолучения = Неопределено; - ИмяФайлаДневногоКурса = Формат(ОкончаниеПериодаЗагрузки, "ДФ=/yyyy/MM/dd"); - - УстановитьПривилегированныйРежим(Истина); - ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКурсовВалют.Получить(); - УстановитьПривилегированныйРежим(Ложь); - - Если ИспользоватьАльтернативныйСервер Тогда - СерверИсточник = "http://cbrates.rbc.ru"; - Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда - ШаблонИмениФайла = СерверИсточник + "/tsv/%1" + ИмяФайлаДневногоКурса + ".tsv"; - Иначе - ШаблонИмениФайла = СерверИсточник + "/tsv/cb/%1.tsv"; - КонецЕсли; - Иначе - СерверИсточник = "https://currencyrates.1c.ru/exchangerate/v1"; - Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда - ШаблонИмениФайла = СерверИсточник + "/%1" + ИмяФайлаДневногоКурса + ".tsv"; - Иначе - ШаблонИмениФайла = СерверИсточник + "/%1.tsv"; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - ПараметрыПолучения = ПараметрыАутентификацииНаСайте(); - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - - ВалютыЗагружаемыеИзИнтернета = ВалютыЗагружаемыеИзИнтернета(); - - Для Каждого Валюта Из Валюты Цикл - Если ВалютыЗагружаемыеИзИнтернета.Найти(Валюта.Валюта) = Неопределено Тогда - ПриЗагрузкеВозниклиОшибки = Истина; - СтатусОперации = Ложь; - ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2): - |Курсы данной валюты не предоставляются.'"), - Валюта.КодВалюты, - Валюта.Валюта); - - ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ПоясняющееСообщение); - Иначе - ФайлНаВебСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, Валюта.КодВалюты); - Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере, ПараметрыПолучения); - - Если Результат.Статус Тогда - ПоясняющееСообщение = ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, Результат.Путь, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС; - УдалитьФайлы(Результат.Путь); - СтатусОперации = ПустаяСтрока(ПоясняющееСообщение); - Иначе - ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2): - |%3 - |Возможно, нет доступа к веб сайту с курсами валют, либо указана несуществующая валюта.'"), - Валюта.КодВалюты, - Валюта.Валюта, - Результат.СообщениеОбОшибке); - СтатусОперации = Ложь; - ПриЗагрузкеВозниклиОшибки = Истина; - КонецЕсли; - КонецЕсли; - СостояниеЗагрузки.Добавить(Новый Структура("Валюта,СтатусОперации,Сообщение", Валюта.Валюта, СтатусОперации, ПоясняющееСообщение)); - - КонецЦикла; - - Возврат СостояниеЗагрузки; - -КонецФункции - -// Загружает информацию о курсе валюты Валюта из файла ПутьКФайлу в регистр -// сведений курсов валют. При этом файл с курсами разбирается, и записываются -// только те данные, которые удовлетворяют периоду (НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки). -// -Функция ЗагрузитьКурсВалютыИзФайла(Знач Валюта, Знач ПутьКФайлу, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки) - - СтатусЗагрузки = 1; - - ЧислоЗагружаемыхДнейВсего = 1 + (ОкончаниеПериодаЗагрузки - НачалоПериодаЗагрузки) / ( 24 * 60 * 60); - - ЧислоЗагруженныхДней = 0; - - Если ЭтоАдресВременногоХранилища(ПутьКФайлу) Тогда - ИмяФайла = ПолучитьИмяВременногоФайла(); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПутьКФайлу); - ДвоичныеДанные.Записать(ИмяФайла); - Иначе - ИмяФайла = ПутьКФайлу; - КонецЕсли; - - Текст = Новый ТекстовыйДокумент(); - - - Текст.Прочитать(ИмяФайла, КодировкаТекста.ANSI); - - ДатаЗапрета = Неопределено; - Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл - - Стр = Текст.ПолучитьСтроку(НомерСтроки); - Если (Стр = "") ИЛИ (СтрНайти(Стр, Символы.Таб) = 0) Тогда - Продолжить; - КонецЕсли; - - Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда - ДатаКурса = ОкончаниеПериодаЗагрузки; - Иначе - ДатаКурсаСтр = ВыделитьПодСтроку(Стр); - ДатаКурса = Дата(Лев(ДатаКурсаСтр,4), Сред(ДатаКурсаСтр,5,2), Сред(ДатаКурсаСтр,7,2)); - КонецЕсли; - - Кратность = Число(ВыделитьПодСтроку(Стр)); - Курс = Число(ВыделитьПодСтроку(Стр)); - - Если ДатаКурса > ОкончаниеПериодаЗагрузки Тогда - Прервать; - КонецЕсли; - - Если ДатаКурса < НачалоПериодаЗагрузки Тогда - Продолжить; - КонецЕсли; - - НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Валюта.Установить(Валюта); - НаборЗаписей.Отбор.Период.Установить(ДатаКурса); - Запись = НаборЗаписей.Добавить(); - Запись.Валюта = Валюта; - Запись.Период = ДатаКурса; - Запись.Курс = Курс; - Запись.Кратность = Кратность; - - Записывать = Истина; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - Если МодульДатыЗапретаИзмененияСлужебный.ЗапретИзмененияПроверяется(Метаданные.РегистрыСведений.КурсыВалют) Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); - Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); - Если Не Записывать Тогда - Если ДатаЗапрета = Неопределено Тогда - ДатаЗапрета = ДатаКурса; - Иначе - ДатаЗапрета = Макс(ДатаЗапрета, ДатаКурса); - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если Записывать Тогда - НаборЗаписей.Записать(); - КонецЕсли; - - ЧислоЗагруженныхДней = ЧислоЗагруженныхДней + 1; - КонецЦикла; - - Если ЭтоАдресВременногоХранилища(ПутьКФайлу) Тогда - УдалитьФайлы(ИмяФайла); - УдалитьИзВременногоХранилища(ПутьКФайлу); - КонецЕсли; - - ПояснениеОЗагрузке = ""; - Если ЧислоЗагружаемыхДнейВсего <> ЧислоЗагруженныхДней Тогда - Если ЧислоЗагруженныхДней = 0 Тогда - ПояснениеОЗагрузке = НСтр("ru = 'Курсы валюты %1 (%2) не загружены. Нет данных.'"); - Иначе - ПояснениеОЗагрузке = НСтр("ru = 'Загружены не все курсы по валюте %1 (%2).'"); - КонецЕсли; - КонецЕсли; - - Если Не ПустаяСтрока(ПояснениеОЗагрузке) Тогда - ПояснениеОЗагрузке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПояснениеОЗагрузке, Валюта.Наименование, Валюта.Код); - КонецЕсли; - - Если ДатаЗапрета <> Неопределено Тогда - ПояснениеОЗагрузке = ПояснениеОЗагрузке + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка курсов валюты %1(%2) ограничена датой запрета изменений %3. - |Курсы запрещенного периода были пропущены при загрузке.'"), Валюта.Наименование, Валюта.Код, Формат(ДатаЗапрета, "ДЛФ=D")); - КонецЕсли; - - ПояснениеОЗагрузке = СокрЛП(ПояснениеОЗагрузке); - - СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); - СписокОшибок = Новый Массив; - Для Каждого СообщениеПользователю Из СообщенияПользователю Цикл - СписокОшибок.Добавить(СообщениеПользователю.Текст); - КонецЦикла; - СписокОшибок = ОбщегоНазначенияКлиентСервер.СвернутьМассив(СписокОшибок); - ПояснениеОЗагрузке = ПояснениеОЗагрузке + ?(ПустаяСтрока(ПояснениеОЗагрузке), "", Символы.ПС) + СтрСоединить(СписокОшибок, Символы.ПС); - - Возврат ПояснениеОЗагрузке; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Локальные служебные процедуры и функции. - -// Выделяет из переданной строки первое значение -// до символа "TAB". -// -// Параметры: -// ИсходнаяСтрока - Строка - строка для разбора. -// -// Возвращаемое значение: -// подстроку до символа "TAB" -// -Функция ВыделитьПодСтроку(ИсходнаяСтрока) - - Перем ПодСтрока; - - Поз = СтрНайти(ИсходнаяСтрока,Символы.Таб); - Если Поз > 0 Тогда - ПодСтрока = Лев(ИсходнаяСтрока,Поз-1); - ИсходнаяСтрока = Сред(ИсходнаяСтрока,Поз + 1); - Иначе - ПодСтрока = ИсходнаяСтрока; - ИсходнаяСтрока = ""; - КонецЕсли; - - Возврат ПодСтрока; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Обновляет связи между справочником валют и файлом поставляемых курсов -// в зависимости от способа установки курса валют. -// -// Параметры: -// Валюта - СправочникОбъект.Валюты. -// -Функция ПриОбновленииКурсовВалютВМоделиСервиса(Валюта) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда - МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); - МодульКурсыВалютСлужебныйВМоделиСервиса.ЗапланироватьКопированиеКурсовВалюты(Валюта); - КонецЕсли; - -КонецФункции - -Функция ВалютыЗагружаемыеИзИнтернета() - КлассификаторXML = Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); - КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; - - НайденныеСтроки = КлассификаторТаблица.НайтиСтроки(Новый Структура("RBCLoading", "истина")); - ЗагружаемыеПоКлассификатору = КлассификаторТаблица.Скопировать(НайденныеСтроки, "Code").ВыгрузитьКолонку("Code"); - - ТекстЗапроса = - "ВЫБРАТЬ - | Валюты.Ссылка КАК Ссылка - |ИЗ - | Справочник.Валюты КАК Валюты - |ГДЕ - | НЕ Валюты.ПометкаУдаления - | И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета) - | И Валюты.Код В(&ЗагружаемыеПоКлассификатору)"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ЗагружаемыеПоКлассификатору", ЗагружаемыеПоКлассификатору); - Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - - Возврат Результат; -КонецФункции - -Функция ИмяСобытияЖурналаРегистрации() - Возврат НСтр("ru = 'Валюты.Загрузка курсов валют'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl index 5530f8cf0..c243fe30f 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверяет актуальность курсов всех валют. diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl index 5d91affeb..f7429b78d 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выводит оповещение о необходимости обновления курсов валют. diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl index aa3cd08d1..fe311c3c0 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl @@ -1,14 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Вызывается после запуска конфигурации, подключает обработчик ожидания. +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("Валюты") И ПараметрыКлиента.Валюты.КурсыОбновляютсяОтветственными Тогда ПодключитьОбработчикОжидания("РаботаСКурсамиВалютВывестиОповещениеОНеактуальности", 15, Истина); КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl index cbd59dcb4..eebbc6174 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Пересчитывает Сумму из Текущей валюты в Новую валюту по параметрам их курсов. diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/Module.bsl index b09419d40..17053b1d1 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/Module.bsl @@ -1,14 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Валюты". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Включает/отключает показ предупреждений о необходимости обновления курсов валют. // // Параметры: -// ПоказыватьПредупреждение - Булево. +// ПоказыватьПредупреждение - Булево - при установке значения Ложь предупреждения показываться не будут. +// Процедура ПриОпределенииНеобходимостиПоказаПредупрежденияОбУстаревшихКурсахВалют(ПоказыватьПредупреждение) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl index e18f0f698..7af165865 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl @@ -1,34 +1,26 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// -// - #Область ПрограммныйИнтерфейс // Выполняет отправку почтовых сообщений. +// Функция может вызвать исключение, которое требуется обработать. // // Параметры: // УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка на // учетную запись электронной почты. -// ПараметрыПисьма - Структура - содержит всю необходимую информацию о письме: +// ПараметрыОтправки - Структура - содержит всю необходимую информацию о письме: // -// * Кому - Массив структур, строка - (обязательный) Интернет адрес получателя письма. -// Адрес - строка - почтовый адрес. -// Представление - строка - имя адресата. +// * Кому - Массив, Строка - интернет адреса получателей письма. +// - Массив - коллекция структур адресов: +// * Адрес - Строка - почтовый адрес (должно быть обязательно заполнено). +// * Представление - Строка - имя адресата. +// - Строка - интернет адреса получателей письма, разделитель - ";". // // * ПолучателиСообщения - Массив - массив структур, описывающий получателей: -// * ИсточникКонтактнойИнформации - СправочникСсылка - владелец контактной информации. -// * Адрес - Строка - Почтовый адрес получателя сообщения. -// * Представление - Строка - представление адресата. +// ** Адрес - Строка - Почтовый адрес получателя сообщения. +// ** Представление - Строка - представление адресата. // -// * Копии - Массив - коллекция структур адресов: -// * Адрес - строка - почтовый адрес (должно быть обязательно заполнено). -// * Представление - строка - имя адресата. -// -// - Строка - интернет адреса получателей письма, разделитель - ";". +// * Копии - Массив, Строка - адреса получателей копий письма. См. описание поля Кому. // -// * СлепыеКопии - Массив, Строка - см. описание поля Копии. +// * СкрытыеКопии - Массив, Строка - адреса получателей скрытых копий письма. См. описание поля Кому. // // * Тема - Строка - (обязательный) тема почтового сообщения. // * Тело - Строка - (обязательный) текст почтового сообщения (простой текст в кодировке win-1251). @@ -54,68 +46,85 @@ // умолчанию). // РазмеченныйТекст/ТипыТекстовЭлектронныхПисем.РазмеченныйТекст - текст почтового сообщения в формате // Rich Text. +// * Соединение - ИнтернетПочта - существующее соединение с почтовым сервером. Если не указано, то создается новое. +// * ПротоколПочты - Строка - если указано значение "IMAP", то письмо будет передано по протоколу IMAP, иначе - по +// протоколу SMTP. +// * ИдентификаторСообщения - Строка - (возвращаемый параметр) идентификатор отправленного почтового сообщения на SMTP +// сервере; +// * ОшибочныеПолучатели - Соответствие - (возвращаемый параметр) список адресов, по которым отправка не выполнена. +// См. возвращаемое значение метода ИнтернетПочта.Послать() в синтакс-помощнике. // -// Соединение - ИнтернетПочта - существующее соединение с почтовым сервером. Если не указано, то соединение -// устанавливается в теле функции. -// ПротоколПочты - Строка - если указано значение "IMAP", то письмо будет передано по протоколу IMAP. -// в другом случае по протоколу SMTP. +// Соединение - ИнтернетПочта - (параметр устарел) см. параметр ПараметрыОтправки.Соединение. +// ПротоколПочты - Строка - (параметр устарел) см. параметр ПараметрыОтправки.Соединение. // // Возвращаемое значение: -// Строка - идентификатор отправленного почтового сообщения на SMTP сервере. -// -// ПРИМЕЧАНИЕ: функция может вызвать исключение, которое требуется обработать. -// -Функция ОтправитьПочтовоеСообщение(Знач УчетнаяЗапись, - Знач ПараметрыПисьма, - Знач Соединение = Неопределено, - ПротоколПочты = "") Экспорт +// Строка - Идентификатор сообщения. +Функция ОтправитьПочтовоеСообщение(Знач УчетнаяЗапись, Знач ПараметрыОтправки, + Знач Соединение = Неопределено, ПротоколПочты = "") Экспорт + + Если Соединение <> Неопределено Тогда + ПараметрыОтправки.Вставить("Соединение", Соединение); + КонецЕсли; + + Если Не ПустаяСтрока(ПротоколПочты) Тогда + ПараметрыОтправки.Вставить("ПротоколПочты", ПротоколПочты); + КонецЕсли; Если ТипЗнч(УчетнаяЗапись) <> Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Или НЕ ЗначениеЗаполнено(УчетнаяЗапись) Тогда ВызватьИсключение НСтр("ru = 'Учетная запись не заполнена или заполнена неправильно.'"); КонецЕсли; - Если ПараметрыПисьма = Неопределено Тогда + Если ПараметрыОтправки = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Не заданы параметры отправки.'"); КонецЕсли; - ТипЗнчКому = ?(ПараметрыПисьма.Свойство("Кому"), ТипЗнч(ПараметрыПисьма.Кому), Неопределено); - ТипЗнчКопии = ?(ПараметрыПисьма.Свойство("Копии"), ТипЗнч(ПараметрыПисьма.Копии), Неопределено); - ТипЗнчСлепыеКопии = ?(ПараметрыПисьма.Свойство("СлепыеКопии"), ТипЗнч(ПараметрыПисьма.СлепыеКопии), Неопределено); + ТипЗнчКому = ?(ПараметрыОтправки.Свойство("Кому"), ТипЗнч(ПараметрыОтправки.Кому), Неопределено); + ТипЗнчКопии = ?(ПараметрыОтправки.Свойство("Копии"), ТипЗнч(ПараметрыОтправки.Копии), Неопределено); + СкрытыеКопии = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыОтправки, "СкрытыеКопии"); + Если СкрытыеКопии = Неопределено Тогда + СкрытыеКопии = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыОтправки, "СлепыеКопии"); + КонецЕсли; - Если ТипЗнчКому = Неопределено И ТипЗнчКопии = Неопределено И ТипЗнчСлепыеКопии = Неопределено Тогда + Если ТипЗнчКому = Неопределено И ТипЗнчКопии = Неопределено И СкрытыеКопии = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Не указано ни одного получателя.'"); КонецЕсли; Если ТипЗнчКому = Тип("Строка") Тогда - ПараметрыПисьма.Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.Кому); + ПараметрыОтправки.Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыОтправки.Кому); ИначеЕсли ТипЗнчКому <> Тип("Массив") Тогда - ПараметрыПисьма.Вставить("Кому", Новый Массив); + ПараметрыОтправки.Вставить("Кому", Новый Массив); КонецЕсли; Если ТипЗнчКопии = Тип("Строка") Тогда - ПараметрыПисьма.Копии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.Копии); + ПараметрыОтправки.Копии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыОтправки.Копии); ИначеЕсли ТипЗнчКопии <> Тип("Массив") Тогда - ПараметрыПисьма.Вставить("Копии", Новый Массив); + ПараметрыОтправки.Вставить("Копии", Новый Массив); КонецЕсли; - Если ТипЗнчСлепыеКопии = Тип("Строка") Тогда - ПараметрыПисьма.СлепыеКопии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.СлепыеКопии); - ИначеЕсли ТипЗнчСлепыеКопии <> Тип("Массив") Тогда - ПараметрыПисьма.Вставить("СлепыеКопии", Новый Массив); + Если ТипЗнч(СкрытыеКопии) = Тип("Строка") Тогда + ПараметрыОтправки.СкрытыеКопии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СкрытыеКопии); + ИначеЕсли ТипЗнч(СкрытыеКопии) <> Тип("Массив") Тогда + ПараметрыОтправки.Вставить("СкрытыеКопии", Новый Массив); КонецЕсли; - Если ПараметрыПисьма.Свойство("АдресОтвета") И ТипЗнч(ПараметрыПисьма.АдресОтвета) = Тип("Строка") Тогда - ПараметрыПисьма.АдресОтвета = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.АдресОтвета); + Если ПараметрыОтправки.Свойство("АдресОтвета") И ТипЗнч(ПараметрыОтправки.АдресОтвета) = Тип("Строка") Тогда + ПараметрыОтправки.АдресОтвета = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыОтправки.АдресОтвета); КонецЕсли; - ИдентификаторСообщения = РаботаСПочтовымиСообщениямиСлужебный.ОтправитьСообщение(УчетнаяЗапись, ПараметрыПисьма, Соединение, ПротоколПочты); + РаботаСПочтовымиСообщениямиСлужебный.ОтправитьСообщение(УчетнаяЗапись, ПараметрыОтправки); + РаботаСПочтовымиСообщениямиПереопределяемый.ПослеОтправкиПисьма(ПараметрыОтправки); - Если ЗначениеЗаполнено(ИдентификаторСообщения) Тогда - РаботаСПочтовымиСообщениямиПереопределяемый.ПослеОтправкиПисьма(ПараметрыПисьма); + Если ПараметрыОтправки.ОшибочныеПолучатели.Количество() > 0 Тогда + ТекстОшибки = НСтр("ru = 'Следующие почтовые адреса не были приняты почтовым сервером:'"); + Для Каждого ОшибочныйПолучатель Из ПараметрыОтправки.ОшибочныеПолучатели Цикл + ТекстОшибки = ТекстОшибки + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1: %2", + ОшибочныйПолучатель.Ключ, ОшибочныйПолучатель.Значение); + КонецЦикла; + ВызватьИсключение ТекстОшибки; КонецЕсли; - Возврат ИдентификаторСообщения; + Возврат ПараметрыОтправки.ИдентификаторСообщения; КонецФункции @@ -147,10 +156,11 @@ // Кодировка, СпособКодированияНеASCIIСимволов, Частичное // заполняется если статус Истина. // -// В режиме тестирования возвращается Истина. -// Прим. ** - в случае, если вложениями являются другие почтовые сообщения, -// они сами не возвращаются но возвращаются их вложения - двоичные -// данные и их тексты в виде двоичных данных, рекурсивно. +// В режиме тестирования возвращается Истина. +// +// Прим. ** - в случае, если вложениями являются другие почтовые сообщения, +// они сами не возвращаются но возвращаются их вложения - двоичные +// данные и их тексты в виде двоичных данных, рекурсивно. // Функция ЗагрузитьПочтовыеСообщения(Знач УчетнаяЗапись, Знач ПараметрыЗагрузки = Неопределено) Экспорт @@ -232,6 +242,8 @@ | ТОГДА УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты <> """" | ИНАЧЕ ИСТИНА | КОНЕЦ + | И (УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ИЛИ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = &ТекущийПользователь) | |УПОРЯДОЧИТЬ ПО | Приоритет, @@ -242,6 +254,7 @@ Запрос.Параметры.Вставить("ДляОтправки", ДляОтправки); Запрос.Параметры.Вставить("ДляПолучения", ДляПолучения); Запрос.Параметры.Вставить("ВключатьСистемнуюУчетнуюЗапись", ВключатьСистемнуюУчетнуюЗапись); + Запрос.Параметры.Вставить("ТекущийПользователь", Пользователи.ТекущийПользователь()); Возврат Запрос.Выполнить().Выгрузить(); @@ -262,7 +275,8 @@ // Проверяет, что системная учетная запись доступна (может быть использована). // // Возвращаемое значение: -// Булево. +// Булево - Истина, если доступна. +// Функция ПроверитьСистемнаяУчетнаяЗаписьДоступна() Экспорт Возврат РаботаСПочтовымиСообщениямиСлужебный.ПроверитьСистемнаяУчетнаяЗаписьДоступна(); @@ -271,6 +285,10 @@ // Возвращает Истину, если доступна по меньшей мере одна настроенная учетная запись для отправки почты, // либо достаточно прав на настройку учетной записи. +// +// Возвращаемое значение: +// Булево - Истина, если доступна. +// Функция ДоступнаОтправкаПисем() Экспорт Если ПравоДоступа("Изменение", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты) Тогда @@ -290,9 +308,12 @@ | НЕ УчетныеЗаписиЭлектроннойПочты.ПометкаУдаления | И УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки | И УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты <> """" - | И УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты <> """""; + | И УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты <> """" + | И (УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ИЛИ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = &ТекущийПользователь)"; Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("ТекущийПользователь", Пользователи.ТекущийПользователь()); Выборка = Запрос.Выполнить().Выбрать(); Возврат Выборка.Следующий(); @@ -307,7 +328,8 @@ // ДляПолучения - Булево - проверять параметры, необходимые для получения почты. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если настроена. +// Функция УчетнаяЗаписьНастроена(УчетнаяЗапись, Знач ДляОтправки = Неопределено, Знач ДляПолучения = Неопределено) Экспорт Параметры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "АдресЭлектроннойПочты,СерверВходящейПочты,СерверИсходящейПочты,ИспользоватьДляПолучения,ИспользоватьДляОтправки"); Если ДляОтправки = Неопределено Тогда @@ -321,4 +343,15 @@ Или ДляОтправки И ПустаяСтрока(Параметры.СерверИсходящейПочты)); КонецФункции +// Выполняет проверку настроек учетной записи электронной почты. +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - проверяемая учетная запись; +// СообщениеОбОшибке - Строка - текст сообщения об ошибке, либо пустая строка, если ошибок не было; +// ДополнительноеСообщение - Строка - сообщения о том, какие проверки были выполнены для учетной записи. +// +Процедура ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, СообщениеОбОшибке, ДополнительноеСообщение) Экспорт + РаботаСПочтовымиСообщениямиСлужебный.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, СообщениеОбОшибке, ДополнительноеСообщение); +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl index 390943e57..60af97e50 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверка учетной записи электронной почты. @@ -28,5 +23,37 @@ Функция УчетнаяЗаписьНастроена(УчетнаяЗапись) Экспорт Возврат РаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(УчетнаяЗапись, Ложь, Ложь); КонецФункции + +Функция СведенияДляОтправки(ПараметрыОтправки) Экспорт + Перем Вложения; + ПараметрыОтправки.Свойство("Вложения", Вложения); + ПараметрыОтправки.Вложения = РаботаСПочтовымиСообщениямиСлужебный.ОписанияВложений(Вложения); + + Результат = Новый Структура; + Результат.Вставить("ЕстьДоступныеУчетныеЗаписиДляОтправки", ЕстьДоступныеУчетныеЗаписиДляОтправки()); + Результат.Вставить("ДоступноПравоДобавленияУчетныхЗаписей", ДоступноПравоДобавленияУчетныхЗаписей()); + Результат.Вставить("ПоказыватьДиалогВыбораФорматаСохраненияВложений", ЕстьТабличныеДокументыВоВложениях(ПараметрыОтправки.Вложения)); + + Возврат Результат; +КонецФункции + +Функция ЕстьТабличныеДокументыВоВложениях(Вложения) + Если Вложения = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого ОписаниеВложения Из Вложения Цикл + Если ТипЗнч(ПолучитьИзВременногоХранилища(ОписаниеВложения.АдресВоВременномХранилище)) = Тип("ТабличныйДокумент") Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; +КонецФункции + +Функция ПодготовитьВложения(Вложения, НастройкиСохранения) Экспорт + РаботаСПочтовымиСообщениямиСлужебный.ПодготовитьВложения(Вложения, НастройкиСохранения); +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl index 04ab3e1ea..842a3317e 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -1,59 +1,89 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму создания нового письма. // // Параметры: -// ПараметрыОтправки - Структура - параметры для заполнения в форме отправки нового письма (все необязательные): -// * Отправитель - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, с которой может -// быть отправлено почтовое сообщение; -// - СписокЗначений - список учетных записей, доступных для выбора в форме: -// ** Представление - Строка- наименование учетной записи; -// ** Значение - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись. -// -// * Получатель - список почтовых адресов. -// - Строка - список адресов в формате: -// [ПредставлениеПолучателя1] <Адрес1>; [[ПредставлениеПолучателя2] <Адрес2>;...] -// - СписокЗначений - Список адресов. -// ** Представление - Строка - представление получателя, -// ** Значение - Строка - почтовый адрес. -// - Массив - массив структур, описывающий получателей: -// ** Адрес - Строка - почтовый адрес получателя сообщения; -// ** Представление - Строка - представление адресата; -// ** ИсточникКонтактнойИнформации - СправочникСсылка - владелец контактной информации. -// -// * Тема - Строка - тема письма. -// -// * Текст - Строка - тело письма. -// -// * Вложения - Массив - файлы, которые необходимо приложить к письму (описания в виде структур): -// ** Структура - описание вложения: -// *** Представление - Строка - имя файла вложения; -// *** АдресВоВременномХранилище - Строка - адрес двоичных данных вложения во временном хранилище. -// *** Кодировка - Строка - кодировка вложения (используется, если отличается от кодировки письма). -// *** Идентификатор - Строка - (необязательный) используется для отметки картинок, отображаемых в теле письма. -// -// * УдалятьФайлыПослеОтправки - Булево - удалять временные файлы после отправки сообщения. -// +// ПараметрыОтправкиПисьма - Структура - см. ПараметрыОтправкиПисьма(). // ОповещениеОЗакрытииФормы - ОписаниеОповещения - процедура, в которую необходимо передать управление после закрытия -// формы отправки письма. +// формы отправки письма. // -Процедура СоздатьНовоеПисьмо(ПараметрыОтправки = Неопределено, ОповещениеОЗакрытииФормы = Неопределено) Экспорт +Процедура СоздатьНовоеПисьмо(ПараметрыОтправкиПисьма = Неопределено, ОповещениеОЗакрытииФормы = Неопределено) Экспорт - Если ПараметрыОтправки = Неопределено Тогда - ПараметрыОтправки = Новый Структура; + ПараметрыОтправки = ПараметрыОтправкиПисьма(); + Если ПараметрыОтправкиПисьма <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыОтправки, ПараметрыОтправкиПисьма, Истина); КонецЕсли; + + СведенияДляОтправки = РаботаСПочтовымиСообщениямиВызовСервера.СведенияДляОтправки(ПараметрыОтправки); + ПараметрыОтправки.Вставить("ПоказыватьДиалогВыбораФорматаСохраненияВложений", СведенияДляОтправки.ПоказыватьДиалогВыбораФорматаСохраненияВложений); ПараметрыОтправки.Вставить("ОповещениеОЗакрытииФормы", ОповещениеОЗакрытииФормы); - ОписаниеОповещения = Новый ОписаниеОповещения("СоздатьНовоеПисьмоПроверкаУчетнойЗаписиВыполнена", ЭтотОбъект, ПараметрыОтправки); - ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); + Если СведенияДляОтправки.ЕстьДоступныеУчетныеЗаписиДляОтправки Тогда + СоздатьНовоеПисьмоПроверкаУчетнойЗаписиВыполнена(Истина, ПараметрыОтправки); + Иначе + ОбработчикРезультата = Новый ОписаниеОповещения("СоздатьНовоеПисьмоПроверкаУчетнойЗаписиВыполнена", ЭтотОбъект, ПараметрыОтправки); + Если СведенияДляОтправки.ДоступноПравоДобавленияУчетныхЗаписей Тогда + ОткрытьФорму("Справочник.УчетныеЗаписиЭлектроннойПочты.Форма.ПомощникНастройкиУчетнойЗаписи", + Новый Структура("КонтекстныйРежим", Истина), , , , , ОбработчикРезультата); + Иначе + ТекстСообщения = НСтр("ru = 'Для отправки письма требуется настройка учетной записи электронной почты. + |Обратитесь к администратору.'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочтыЗавершение", ЭтотОбъект, ОбработчикРезультата); + ПоказатьПредупреждение(ОписаниеОповещения, ТекстСообщения); + КонецЕсли; + КонецЕсли; КонецПроцедуры +// Возвращает пустую структуру с параметрами отправки письма. +// +// Возвращаемое значение: +// Структура - параметры для заполнения в форме отправки нового письма (все необязательные): +// * Отправитель - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, с которой может +// быть отправлено почтовое сообщение; +// - СписокЗначений - список учетных записей, доступных для выбора в форме: +// ** Представление - Строка- наименование учетной записи; +// ** Значение - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись. +// +// * Получатель - Строка - список адресов в формате: +// [ПредставлениеПолучателя1] <Адрес1>; [[ПредставлениеПолучателя2] <Адрес2>;...] +// - СписокЗначений - Список адресов. +// ** Представление - Строка - представление получателя, +// ** Значение - Строка - почтовый адрес. +// - Массив - массив структур, описывающий получателей: +// ** Адрес - Строка - почтовый адрес получателя сообщения; +// ** Представление - Строка - представление адресата; +// ** ИсточникКонтактнойИнформации - СправочникСсылка - владелец контактной информации. +// +// * Копии - СписокЗначений, Строка - см. описание поля Получатель. +// * СкрытыеКопии - СписокЗначений, Строка - см. описание поля Получатель. +// * Тема - Строка - тема письма. +// * Текст - Строка - тело письма. +// +// * Вложения - Массив - файлы, которые необходимо приложить к письму (описания в виде структур): +// ** Представление - Строка - имя файла вложения; +// ** АдресВоВременномХранилище - Строка - адрес двоичных данных либо табличного документа во временном хранилище. +// ** Кодировка - Строка - кодировка вложения (используется, если отличается от кодировки письма). +// ** Идентификатор - Строка - (необязательный) используется для отметки картинок, отображаемых в теле письма. +// +// * УдалятьФайлыПослеОтправки - Булево - удалять временные файлы после отправки сообщения. +// * Предмет - ЛюбаяСсылка - предмет письма. +Функция ПараметрыОтправкиПисьма() Экспорт + ПараметрыПисьма = Новый Структура; + + ПараметрыПисьма.Вставить("Отправитель", Неопределено); + ПараметрыПисьма.Вставить("Получатель", Неопределено); + ПараметрыПисьма.Вставить("Копии", Неопределено); + ПараметрыПисьма.Вставить("СкрытыеКопии", Неопределено); + ПараметрыПисьма.Вставить("Тема", Неопределено); + ПараметрыПисьма.Вставить("Текст", Неопределено); + ПараметрыПисьма.Вставить("Вложения", Неопределено); + ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", Неопределено); + ПараметрыПисьма.Вставить("Предмет", Неопределено); + + Возврат ПараметрыПисьма; +КонецФункции + // Если у пользователя нет настроенной учетной записи для отправки писем, то в зависимости от прав либо показывает // помощник настройки новой учетной записи, либо выводит сообщение о невозможности отправки. // Предназначена для сценариев, в которых требуется выполнить настройку учетной записи перед запросом дополнительных @@ -81,49 +111,44 @@ #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -// Отправляет табличные документы по электронной почте. -// -// Параметры: -// ТабличныеДокументы - СписокЗначений - Табличные документы для отправки. -// * Значение - ТабличныйДокумент - Отправляемый документ. -// * Представление - Строка - Наименование документа. -// Используется при сохранении в файл и для вложений. -// Заголовок - Строка - Необязательный. Заголовок диалога сохранения табличных документов в файл. -// ПараметрыОтправки - Структура - Необязательный. Параметры письма. -// * Тема - Строка - Тема письма. -// * Текст - Строка - Текст письма. -// -// Порядок работы: -// 1. Проверяется наличие учетной записи, настроенной для отправки. -// Если учетной записи нет, то открывается помощник настройки. -// 2. Открывается диалог сохранения табличных документов в файлы. -// Табличные документы сохраняются в файлы. -// 3. Открывается диалог отправки письма. -// -Процедура ОтправитьТабличныеДокументы(ТабличныеДокументы, ЗаголовокСохранения = Неопределено, ПараметрыОтправки = Неопределено) Экспорт - Контекст = Новый Структура; - Контекст.Вставить("ТабличныеДокументы", ТабличныеДокументы); - Контекст.Вставить("Заголовок", ЗаголовокСохранения); - Контекст.Вставить("ПараметрыОтправки", ПараметрыОтправки); - Обработчик = Новый ОписаниеОповещения("ОтправитьТабличныеДокументыПроверкаУчетнойЗаписиВыполнена", ЭтотОбъект, Контекст); - ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(Обработчик); -КонецПроцедуры - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции // Продолжение процедуры СоздатьНовоеПисьмо. Процедура СоздатьНовоеПисьмоПроверкаУчетнойЗаписиВыполнена(УчетнаяЗаписьНастроена, ПараметрыОтправки) Экспорт - Перем Отправитель, Получатель, Вложения, Тема, Текст, УдалятьФайлыПослеОтправки; Если УчетнаяЗаписьНастроена <> Истина Тогда Возврат; КонецЕсли; + Если ПараметрыОтправки.ПоказыватьДиалогВыбораФорматаСохраненияВложений Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("СоздатьНовоеПисьмоПодготовитьВложения", ЭтотОбъект, ПараметрыОтправки); + ОткрытьФорму("ОбщаяФорма.ВыборФорматаВложений", , , , , , ОписаниеОповещения); + Возврат; + КонецЕсли; + + СоздатьНовоеПисьмоВложенияПодготовлены(Истина, ПараметрыОтправки); + +КонецПроцедуры + +Процедура СоздатьНовоеПисьмоПодготовитьВложения(НастройкиСохранения, ПараметрыОтправки) Экспорт + Если ТипЗнч(НастройкиСохранения) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + РаботаСПочтовымиСообщениямиВызовСервера.ПодготовитьВложения(ПараметрыОтправки.Вложения, НастройкиСохранения); + + СоздатьНовоеПисьмоВложенияПодготовлены(Истина, ПараметрыОтправки); +КонецПроцедуры + +// Продолжение процедуры СоздатьНовоеПисьмо. +Процедура СоздатьНовоеПисьмоВложенияПодготовлены(ВложенияПодготовлены, ПараметрыОтправки) + + Если ВложенияПодготовлены <> Истина Тогда + Возврат; + КонецЕсли; + ОповещениеОЗакрытииФормы = ПараметрыОтправки.ОповещениеОЗакрытииФормы; + ПараметрыОтправки.Удалить("ОповещениеОЗакрытииФормы"); СтандартнаяОбработка = Истина; РаботаСПочтовымиСообщениямиКлиентПереопределяемый.ПередОткрытиемФормыОтправкиПисьма(ПараметрыОтправки, ОповещениеОЗакрытииФормы, СтандартнаяОбработка); @@ -132,21 +157,12 @@ Возврат; КонецЕсли; - ПараметрыОтправки.Свойство("Отправитель", Отправитель); - ПараметрыОтправки.Свойство("Получатель", Получатель); - ПараметрыОтправки.Свойство("Тема", Тема); - ПараметрыОтправки.Свойство("Текст", Текст); - ПараметрыОтправки.Свойство("Вложения", Вложения); - ПараметрыОтправки.Свойство("УдалятьФайлыПослеОтправки", УдалятьФайлыПослеОтправки); - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") - И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().СозданиеИсходящихПисемДоступно Тогда - МодульВзаимодействияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВзаимодействияКлиент"); - МодульВзаимодействияКлиент.ОткрытьФормуОтправкиПочтовогоСообщения(Отправитель, - Получатель, Тема, Текст, Вложения, , ОповещениеОЗакрытииФормы); + И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().СозданиеИсходящихПисемДоступно Тогда + МодульВзаимодействияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВзаимодействияКлиент"); + МодульВзаимодействияКлиент.ОткрытьФормуОтправкиПисьма(ПараметрыОтправки, ОповещениеОЗакрытииФормы); Иначе - ОткрытьПростуюФормуОтправкиПочтовогоСообщения(Отправитель, Получатель, - Тема,Текст, Вложения, УдалятьФайлыПослеОтправки, ОповещениеОЗакрытииФормы); + ОткрытьПростуюФормуОтправкиПочтовогоСообщения(ПараметрыОтправки, ОповещениеОЗакрытииФормы); КонецЕсли; КонецПроцедуры @@ -157,18 +173,7 @@ // // Параметры см. в описании функции СоздатьНовоеПисьмо. // -Процедура ОткрытьПростуюФормуОтправкиПочтовогоСообщения(Отправитель, - Получатель, Тема,Текст, СписокФайлов, УдалятьФайлыПослеОтправки, ОписаниеОповещенияОЗакрытии) - - ПараметрыПисьма = Новый Структура; - - ПараметрыПисьма.Вставить("УчетнаяЗапись", Отправитель); - ПараметрыПисьма.Вставить("Кому", Получатель); - ПараметрыПисьма.Вставить("Тема", Тема); - ПараметрыПисьма.Вставить("Тело", Текст); - ПараметрыПисьма.Вставить("Вложения", СписокФайлов); - ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", УдалятьФайлыПослеОтправки); - +Процедура ОткрытьПростуюФормуОтправкиПочтовогоСообщения(ПараметрыПисьма, ОписаниеОповещенияОЗакрытии) ОткрытьФорму("ОбщаяФорма.ОтправкаСообщения", ПараметрыПисьма, , , , , ОписаниеОповещенияОЗакрытии); КонецПроцедуры @@ -180,7 +185,6 @@ // Процедура ПроверитьУчетнуюЗапись(Знач УчетнаяЗапись) Экспорт ОчиститьСообщения(); - Состояние(НСтр("ru = 'Проверка учетной записи'"),,НСтр("ru = 'Выполняется проверка учетной записи. Подождите...'")); ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(Неопределено, УчетнаяЗапись); КонецПроцедуры @@ -212,46 +216,4 @@ ВыполнитьОбработкуОповещения(ОбработчикРезультата, Ложь); КонецПроцедуры -// Продолжение процедуры ОтправитьТабличныеДокументы. -Процедура ОтправитьТабличныеДокументыПроверкаУчетнойЗаписиВыполнена(УчетнаяЗаписьНастроена, Контекст) Экспорт - Если УчетнаяЗаписьНастроена <> Истина Тогда - Возврат; - КонецЕсли; - - ПараметрыФормы = Новый Структура("ТабличныеДокументы, Заголовок"); - ЗаполнитьЗначенияСвойств(ПараметрыФормы, Контекст); - - Обработчик = Новый ОписаниеОповещения("ОтправитьТабличныеДокументыСохранениеВыполнено", ЭтотОбъект, Контекст); - - ОткрытьФорму("ОбщаяФорма.ОтправкаТабличныхДокументовПоПочте", ПараметрыФормы, , , , , Обработчик); -КонецПроцедуры - -// Продолжение процедуры ОтправитьТабличныеДокументыПроверкаУчетнойЗаписиВыполнена. -Процедура ОтправитьТабличныеДокументыСохранениеВыполнено(СохраненныеДокументы, Контекст) Экспорт - Если СохраненныеДокументы = Неопределено Или СохраненныеДокументы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ПараметрыОтправки = Контекст.ПараметрыОтправки; - Если ТипЗнч(ПараметрыОтправки) <> Тип("Структура") Тогда - ПараметрыОтправки = Новый Структура; - КонецЕсли; - - Вложения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыОтправки, "Вложения"); - Если ТипЗнч(Вложения) = Тип("СписокЗначений") И Вложения.Количество() > 0 Тогда - Для Каждого ДокументВложение Из СохраненныеДокументы Цикл - ЗаполнитьЗначенияСвойств(Вложения.Добавить(), ДокументВложение); - КонецЦикла; - Иначе - ПараметрыОтправки.Вставить("Вложения", СохраненныеДокументы); - КонецЕсли; - - УдалятьФайлыПослеОтправки = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыОтправки, "УдалятьФайлыПослеОтправки"); - Если ТипЗнч(УдалятьФайлыПослеОтправки) <> Тип("Булево") Тогда - ПараметрыОтправки.Вставить("УдалятьФайлыПослеОтправки", Истина); - КонецЕсли; - - СоздатьНовоеПисьмо(ПараметрыОтправки); -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиентПереопределяемый/Module.bsl index 45a0c494b..d1d9f0085 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается перед открытием формы нового письма. diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl index 35318347a..f532f110d 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl @@ -1,10 +1,15 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +// Переопределяет настройки подсистемы. +// +// Параметры: +// Настройки - Структура - настройки подсистемы: +// * ДоступноПолучениеПисем - Булево - показывать настройки получения писем в учетных записях. +// +Процедура ПриОпределенииНастроек(Настройки) Экспорт + +КонецПроцедуры + // Позволяет выполнить дополнительные операции после отправки почтового сообщения. // // Параметры: @@ -24,7 +29,7 @@ // // - Строка - интернет адреса получателей письма, разделитель - ";". // -// * СлепыеКопии - Массив, Строка - см. описание поля Копии. +// * СкрытыеКопии - Массив, Строка - см. описание поля Копии. // // * Тема - Строка - (обязательный) тема почтового сообщения. // * Тело - Строка - (обязательный) текст почтового сообщения (простой текст в кодировке win-1251). diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl index 6a4f7ae16..dd96b1a1b 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl @@ -1,26 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с почтовыми сообщениями". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - // Предназначена для перевода паролей в безопасное хранилище. // Используется в обработчике обновления ИБ. Процедура ПеренестиПаролиВБезопасноеХранилище() Экспорт @@ -136,101 +115,98 @@ КонецФункции -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +// Функция необходима для интеграции с подсистемой "Обмен данными". +// Возвращает ссылку на учетную запись электронной почты этой базы, соответствующую учетной записи +// электронной почты базы-корреспондента, с которой выполняется настройка обмена (см. параметры). +// Выполняется поиск записи по имени предопределенного или по адресу или создание новой записи (если не найдена). +// Значения реквизитов учетной записи этой базы приводятся в соответствие значениям реквизитов учетной записи корреспондента. +// Параметры: +// УзелПланаОбмена - СправочникОбъект.УчетныеЗаписиЭлектроннойПочты - учетная запись электронной почты, +// базы-корреспондента, полученная из файла настройки синхронизации данных путем +// десериализации с помощью метода ПрочитатьXML. +// +// Возвращаемое значение: +// СправочникОбъект.УчетныеЗаписиЭлектроннойПочты - ссылка на учетную запись этой информационной базы. +// +Функция УчетнаяЗаписьЭтойБазыПоДаннымУчетнойЗаписиКорреспондента(УчетнаяЗаписьКорреспондента) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриНастройкеПодчиненногоУзлаРИБ"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); + УчетнаяЗаписьЭтойБазы = Неопределено; + // Для предопределенной записи - перезаписываем предопределенный элемент текущей ИБ. + Если УчетнаяЗаписьКорреспондента.Предопределенный Тогда + УчетнаяЗаписьЭтойБазы = Справочники.УчетныеЗаписиЭлектроннойПочты[УчетнаяЗаписьКорреспондента.ИмяПредопределенныхДанных].ПолучитьОбъект(); + Иначе + // Для обычной записи ищем существующую запись с тем же адресом. + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 + | Ссылка + |ИЗ Справочник.УчетныеЗаписиЭлектроннойПочты + |ГДЕ АдресЭлектроннойПочты = &АдресЭлектроннойПочты"; + Запрос.УстановитьПараметр("АдресЭлектроннойПочты", УчетнаяЗаписьКорреспондента.АдресЭлектроннойПочты); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + УчетнаяЗаписьЭтойБазы = Выборка.Ссылка.ПолучитьОбъект(); + КонецЕсли; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); + Если УчетнаяЗаписьЭтойБазы <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(УчетнаяЗаписьЭтойБазы, УчетнаяЗаписьКорреспондента,,"ИмяПредопределенныхДанных, Родитель, Владелец, Ссылка"); + Иначе + УчетнаяЗаписьЭтойБазы = УчетнаяЗаписьКорреспондента; КонецЕсли; - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); + УчетнаяЗаписьЭтойБазы.Записать(); - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "РаботаСПочтовымиСообщениямиСлужебный"); + Возврат УчетнаяЗаписьЭтойБазы; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И Не ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); РазрешенияУчетныхЗаписей = Справочники.УчетныеЗаписиЭлектроннойПочты.РазрешенияУчетныхЗаписей(); Для Каждого ОписаниеРазрешений Из РазрешенияУчетныхЗаписей Цикл - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(ОписаниеРазрешений.Значение, ОписаниеРазрешений.Ключ)); + ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( + ОписаниеРазрешений.Значение, ОписаниеРазрешений.Ключ)); КонецЦикла; КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДанных(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДанных(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); КонецПроцедуры -// Обработчик начальной настройки ИБ после создания узла РИБ. -// Вызывается в момент первого запуска подчиненного узла РИБ (в том числе АРМ). -// +// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт ОтключитьИспользованиеУчетныхЗаписей(); КонецПроцедуры -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -244,22 +220,7 @@ КонецПроцедуры -// Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. -// -// Параметры: -// ВидыДоступа - ТаблицаЗначений - с колонками: -// * Имя - Строка - имя используемое в описании поставляемых -// профилей групп доступа и текстах ОДД. -// * Представление - Строка - представляет вид доступа в профилях и группах доступа. -// * ТипЗначений - Тип - тип ссылки значений доступа. -// Например, Тип("СправочникСсылка.Номенклатура"). -// * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. -// Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). -// * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно -// выбрать несколько групп значений (Групп доступа номенклатуры). -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); @@ -269,39 +230,7 @@ КонецПроцедуры -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах. -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -314,19 +243,16 @@ Описание = Описание + " |Справочник.УчетныеЗаписиЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты + |Справочник.УчетныеЗаписиЭлектроннойПочты.Чтение.Пользователи + |Справочник.УчетныеЗаписиЭлектроннойПочты.Изменение.Пользователи + |Справочник.УчетныеЗаписиЭлектроннойПочты.Изменение.УчетныеЗаписиЭлектроннойПочты |"; КонецЕсли; КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -335,50 +261,16 @@ НовоеИмя = "Роль.ЧтениеУчетныхЗаписейЭлектроннойПочты"; ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.3.11", СтароеИмя, НовоеИмя, Библиотека); + СтароеИмя = "Роль.ЧтениеУчетныхЗаписейЭлектроннойПочты"; + НовоеИмя = "Роль.ДобавлениеИзменениеУчетныхЗаписейЭлектроннойПочты"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.4.1.1", СтароеИмя, НовоеИмя, Библиотека); + КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Преобразует внутренние форматы вложений к двоичным данным. -Функция ПривестиВложениеДляВставкиВПисьмо(Вложение) - Если ТипЗнч(Вложение) = Тип("Строка") И ЭтоАдресВременногоХранилища(Вложение) Тогда - Возврат ПривестиВложениеДляВставкиВПисьмо(ПолучитьИзВременногоХранилища(Вложение)); - - ИначеЕсли ТипЗнч(Вложение) = Тип("Картинка") Тогда - Возврат Вложение.ПолучитьДвоичныеДанные(); - - ИначеЕсли ТипЗнч(Вложение) = Тип("Файл") И Вложение.Существует() И Вложение.ЭтоФайл() Тогда - Возврат Новый ДвоичныеДанные(Вложение.ПолноеИмя); - - Иначе - Возврат Вложение; - КонецЕсли; -КонецФункции - -// Преобразует коды текст письма к формату вставки картинок. -Функция ПривестиТекстПисьмаДляВставкиКартинок(ТекстПисьма) - // Конвертация HTML текста в ДокументHTML. - Построитель = Новый ПостроительDOM; - ЧтениеHTML = Новый ЧтениеHTML; - ЧтениеHTML.УстановитьСтроку(ТекстПисьма); - ДокументHTML = Построитель.Прочитать(ЧтениеHTML); - - // Замена имен картинок в документе HTML на идентификаторы. - Для Каждого Картинка Из ДокументHTML.Картинки Цикл - АтрибутИсточникКартинки = Картинка.Атрибуты.ПолучитьИменованныйЭлемент("src"); - АтрибутИсточникКартинки.ТекстовоеСодержимое = "cid:" + АтрибутИсточникКартинки.ТекстовоеСодержимое; - КонецЦикла; - - // Конвертация ДокументHTML обратно в текст HTML. - ЗаписьDOM = Новый ЗаписьDOM; - ЗаписьHTML = Новый ЗаписьHTML; - ЗаписьHTML.УстановитьСтроку(); - ЗаписьDOM.Записать(ДокументHTML, ЗаписьHTML); - Возврат ЗаписьHTML.Закрыть(); -КонецФункции - // Проверяет, что предопределенная системная учетная запись электронной почты // доступна для использования. // @@ -407,34 +299,29 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Состав параметров см. в РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение. -// -Функция ОтправитьСообщение(Знач УчетнаяЗапись, - Знач ПараметрыПисьма, - Соединение = Неопределено, - ПротоколПочты = "") Экспорт +Процедура ОтправитьСообщение(Знач УчетнаяЗапись, Знач ПараметрыОтправки) Экспорт + Перем Кому, Тема, Тело, Вложения, АдресОтвета, ТипТекста, Копии, СкрытыеКопии, ПротоколПочты, Соединение; - // Объявление переменных перед первым использованием в качестве - // параметра метода Свойство структуры ПараметрыПисьма. - // Переменные содержат значения переданных в функцию параметров. - Перем Кому, Тема, Тело, Вложения, АдресОтвета, ТипТекста, Копии, СлепыеКопии; + ПараметрыОтправки.Свойство("Соединение", Соединение); + ПараметрыОтправки.Свойство("ПротоколПочты", ПротоколПочты); + ПараметрыОтправки.Вставить("ИдентификаторСообщения", ""); + ПараметрыОтправки.Вставить("ОшибочныеПолучатели", Новый Соответствие); - Если Не ПараметрыПисьма.Свойство("Тема", Тема) Тогда + Если Не ПараметрыОтправки.Свойство("Тема", Тема) Тогда Тема = ""; КонецЕсли; - Если Не ПараметрыПисьма.Свойство("Тело", Тело) Тогда + Если Не ПараметрыОтправки.Свойство("Тело", Тело) Тогда Тело = ""; КонецЕсли; - Кому = ПараметрыПисьма.Кому; + Кому = ПараметрыОтправки.Кому; Если ТипЗнч(Кому) = Тип("Строка") Тогда Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому); КонецЕсли; - ПараметрыПисьма.Свойство("Вложения", Вложения); + ПараметрыОтправки.Свойство("Вложения", Вложения); Письмо = Новый ИнтернетПочтовоеСообщение; Письмо.Тема = Тема; @@ -445,24 +332,24 @@ Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателя.Представление; КонецЦикла; - Если ПараметрыПисьма.Свойство("Копии", Копии) Тогда - // Формируем адрес получателя поля Копии. + // Формируем адрес получателя поля Копии. + Если ПараметрыОтправки.Свойство("Копии", Копии) Тогда Для Каждого ПочтовыйАдресПолучателяКопии Из Копии Цикл Получатель = Письмо.Копии.Добавить(ПочтовыйАдресПолучателяКопии.Адрес); Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяКопии.Представление; КонецЦикла; КонецЕсли; - Если ПараметрыПисьма.Свойство("СлепыеКопии", СлепыеКопии) Тогда - // Формируем адрес получателя поля Копии. - Для Каждого ПочтовыйАдресПолучателяСлепыеКопии Из СлепыеКопии Цикл - Получатель = Письмо.СлепыеКопии.Добавить(ПочтовыйАдресПолучателяСлепыеКопии.Адрес); - Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяСлепыеКопии.Представление; + // Формируем адрес получателя поля СкрытыеКопии. + Если ПараметрыОтправки.Свойство("СкрытыеКопии", СкрытыеКопии) Тогда + Для Каждого СведенияОПолучателе Из СкрытыеКопии Цикл + Получатель = Письмо.СлепыеКопии.Добавить(СведенияОПолучателе.Адрес); + Получатель.ОтображаемоеИмя = СведенияОПолучателе.Представление; КонецЦикла; КонецЕсли; // Формируем адрес ответа, если необходимо. - Если ПараметрыПисьма.Свойство("АдресОтвета", АдресОтвета) Тогда + Если ПараметрыОтправки.Свойство("АдресОтвета", АдресОтвета) Тогда Для Каждого ПочтовыйАдресОтвета Из АдресОтвета Цикл ПочтовыйАдресОбратный = Письмо.ОбратныйАдрес.Добавить(ПочтовыйАдресОтвета.Адрес); ПочтовыйАдресОбратный.ОтображаемоеИмя = ПочтовыйАдресОтвета.Представление; @@ -470,13 +357,19 @@ КонецЕсли; // Получение реквизитов отправителя. - РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ИмяПользователя,АдресЭлектроннойПочты"); + РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ИмяПользователя,АдресЭлектроннойПочты,ОтправлятьСкрытыеКопииПисемНаЭтотАдрес"); // Добавляем к письму имя отправителя. Письмо.ИмяОтправителя = РеквизитыОтправителя.ИмяПользователя; Письмо.Отправитель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя; Письмо.Отправитель.Адрес = РеквизитыОтправителя.АдресЭлектроннойПочты; + // Добавляем скрытую копию на адрес отправителя. + Если РеквизитыОтправителя.ОтправлятьСкрытыеКопииПисемНаЭтотАдрес Тогда + Получатель = Письмо.СлепыеКопии.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты); + Получатель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя; + КонецЕсли; + // Добавляем вложения к письму. Если Вложения <> Неопределено Тогда Для Каждого Вложение Из Вложения Цикл @@ -491,84 +384,111 @@ Иначе // Поддержка обратной совместимости с 2.2.1. Если ТипЗнч(Вложение.Значение) = Тип("Структура") Тогда НовоеВложение = Письмо.Вложения.Добавить(Вложение.Значение.ДвоичныеДанные, Вложение.Ключ); - НовоеВложение.Идентификатор = Вложение.Значение.Идентификатор; + Если Вложение.Значение.Свойство("Идентификатор") Тогда + НовоеВложение.Идентификатор = Вложение.Значение.Идентификатор; + КонецЕсли; Если Вложение.Значение.Свойство("Кодировка") Тогда НовоеВложение.Кодировка = Вложение.Значение.Кодировка; КонецЕсли; + Если Вложение.Значение.Свойство("ТипСодержимого") Тогда + НовоеВложение.ТипСодержимого = Вложение.Значение.ТипСодержимого; + КонецЕсли; + Если Вложение.Значение.Свойство("Имя") Тогда + НовоеВложение.Имя = Вложение.Значение.Имя; + КонецЕсли; Иначе - Письмо.Вложения.Добавить(ПривестиВложениеДляВставкиВПисьмо(Вложение.Значение), Вложение.Ключ); + ИнтернетПочтовоеВложение = Письмо.Вложения.Добавить(Вложение.Значение, Вложение.Ключ); + Если ТипЗнч(Вложение.Значение) = Тип("ИнтернетПочтовоеСообщение") Тогда + ИнтернетПочтовоеВложение.ТипСодержимого = "message/rfc822"; + КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; - Если ПараметрыПисьма.Свойство("Картинки") И ТипЗнч(ПараметрыПисьма.Картинки) = Тип("Структура") Тогда - Тело = ПривестиТекстПисьмаДляВставкиКартинок(Тело); + Для Каждого Вложение Из Письмо.Вложения Цикл + Если Не ЗначениеЗаполнено(Вложение.ТипСодержимого) Тогда + ТипСодержимого = ОпределитьТипСодержимогоПоИмениФайла(Вложение.Имя); + Если ЗначениеЗаполнено(ТипСодержимого) Тогда + Вложение.ТипСодержимого = ТипСодержимого; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ПараметрыОтправки.Свойство("ИдентификаторыОснований") Тогда + Письмо.УстановитьПолеЗаголовка("References", ПараметрыОтправки.ИдентификаторыОснований); + КонецЕсли; + + ТипТекста = Неопределено; + Если ТипЗнч(Тело) = Тип("ФорматированныйДокумент") Тогда + СодержимоеПисьма = ПолучитьHTMLФорматированногоДокументаДляПисьма(Тело); + Тело = СодержимоеПисьма.ТекстHTML; + Картинки = СодержимоеПисьма.Картинки; + ТипТекста = ТипТекстаПочтовогоСообщения.HTML; - // Запись картинок с именами в качестве идентификаторов. - Для Каждого КлючИЗначение Из ПараметрыПисьма.Картинки Цикл - НовоеВложение = Письмо.Вложения.Добавить(ПривестиВложениеДляВставкиВПисьмо(КлючИЗначение.Значение), КлючИЗначение.Ключ); - НовоеВложение.Идентификатор = КлючИЗначение.Ключ; + ДополнительныеВложения = Новый Массив; + Для Каждого Картинка Из Картинки Цикл + ИмяКартинки = Картинка.Ключ; + ДанныеКартинки = Картинка.Значение; + Вложение = Письмо.Вложения.Добавить(ДанныеКартинки.ПолучитьДвоичныеДанные(), ИмяКартинки); + Вложение.Идентификатор = ИмяКартинки; КонецЦикла; КонецЕсли; - - // Установим строку с идентификаторами оснований. - Если ПараметрыПисьма.Свойство("ИдентификаторыОснований") Тогда - Письмо.УстановитьПолеЗаголовка("References", ПараметрыПисьма.ИдентификаторыОснований); + Текст = Письмо.Тексты.Добавить(Тело); + Если ЗначениеЗаполнено(ТипТекста) Тогда + Текст.ТипТекста = ТипТекста; КонецЕсли; - // добавляем текст - Текст = Письмо.Тексты.Добавить(Тело); - Если ПараметрыПисьма.Свойство("ТипТекста", ТипТекста) Тогда - Если ТипЗнч(ТипТекста) = Тип("Строка") Тогда - Если ТипТекста = "HTML" Тогда - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; - ИначеЕсли ТипТекста = "RichText" Тогда - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; + Если ТипТекста = Неопределено Тогда + Если ПараметрыОтправки.Свойство("ТипТекста", ТипТекста) Тогда + Если ТипЗнч(ТипТекста) = Тип("Строка") Тогда + Если ТипТекста = "HTML" Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; + ИначеЕсли ТипТекста = "RichText" Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; + Иначе + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + КонецЕсли; + ИначеЕсли ТипЗнч(ТипТекста) = Тип("ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем") Тогда + Если ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML + ИЛИ ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; + ИначеЕсли ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.РазмеченныйТекст Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; + Иначе + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + КонецЕсли; Иначе - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; - КонецЕсли; - ИначеЕсли ТипЗнч(ТипТекста) = Тип("ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем") Тогда - Если ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML - ИЛИ ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками Тогда - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; - ИначеЕсли ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.РазмеченныйТекст Тогда - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; - Иначе - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + Текст.ТипТекста = ТипТекста; КонецЕсли; Иначе - Текст.ТипТекста = ТипТекста; + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; КонецЕсли; - Иначе - Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; КонецЕсли; - // Зададим важность Важность = Неопределено; - Если ПараметрыПисьма.Свойство("Важность", Важность) Тогда + Если ПараметрыОтправки.Свойство("Важность", Важность) Тогда Письмо.Важность = Важность; КонецЕсли; - // Зададим кодировку Кодировка = Неопределено; - Если ПараметрыПисьма.Свойство("Кодировка", Кодировка) Тогда + Если ПараметрыОтправки.Свойство("Кодировка", Кодировка) Тогда Письмо.Кодировка = Кодировка; КонецЕсли; - Если ПараметрыПисьма.Свойство("ОбрабатыватьТексты") И НЕ ПараметрыПисьма.ОбрабатыватьТексты Тогда + Если ПараметрыОтправки.Свойство("ОбрабатыватьТексты") И НЕ ПараметрыОтправки.ОбрабатыватьТексты Тогда ОбрабатыватьТекстСообщения = ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать; Иначе ОбрабатыватьТекстСообщения = ОбработкаТекстаИнтернетПочтовогоСообщения.Обрабатывать; КонецЕсли; - Если ПараметрыПисьма.Свойство("УведомитьОДоставке") Тогда - Письмо.УведомитьОДоставке = ПараметрыПисьма.УведомитьОДоставке; + Если ПараметрыОтправки.Свойство("УведомитьОДоставке") Тогда + Письмо.УведомитьОДоставке = ПараметрыОтправки.УведомитьОДоставке; Письмо.АдресаУведомленияОДоставке.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты); КонецЕсли; - Если ПараметрыПисьма.Свойство("УведомитьОПрочтении") Тогда - Письмо.УведомитьОПрочтении = ПараметрыПисьма.УведомитьОПрочтении; + Если ПараметрыОтправки.Свойство("УведомитьОПрочтении") Тогда + Письмо.УведомитьОПрочтении = ПараметрыОтправки.УведомитьОПрочтении; Письмо.АдресаУведомленияОПрочтении.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты); КонецЕсли; @@ -578,17 +498,14 @@ Соединение.Подключиться(Профиль); КонецЕсли; - Соединение.Послать(Письмо, - ОбрабатыватьТекстСообщения, - ?(ПротоколПочты = "IMAP", ПротоколИнтернетПочты.IMAP, ПротоколИнтернетПочты.SMTP)); + ОшибочныеПолучатели = Соединение.Послать(Письмо, ОбрабатыватьТекстСообщения, + ?(ПротоколПочты = "IMAP", ПротоколИнтернетПочты.IMAP, ПротоколИнтернетПочты.SMTP)); + + ПараметрыОтправки.Вставить("ИдентификаторСообщения", Письмо.ИдентификаторСообщения); + ПараметрыОтправки.Вставить("ОшибочныеПолучатели", ОшибочныеПолучатели); - Возврат Письмо.ИдентификаторСообщения; - -КонецФункции +КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Состав параметров см. в РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения. -// Функция ЗагрузитьСообщения(Знач УчетнаяЗапись, Знач ПараметрыЗагрузки = Неопределено) Экспорт @@ -680,6 +597,7 @@ ПриводитьСообщенияКТипу = Истина; КонецЕсли; + НаборСообщений = НаборПисем; Если ПриводитьСообщенияКТипу Тогда Если ПараметрыЗагрузки.Свойство("Колонки") Тогда НаборСообщений = ПолучитьАдаптированныйНаборПисем(НаборПисем, ПараметрыЗагрузки.Колонки); @@ -714,11 +632,10 @@ ИначеЕсли ТипЗнч(ПолеПисьма) = Тип("ИнтернетПочтовыеВложения") Тогда Вложения = Новый Соответствие; Для Каждого Вложение Из ПолеПисьма Цикл - ИмяВложения = Вложение.Имя; Если ТипЗнч(Вложение.Данные) = Тип("ДвоичныеДанные") Тогда - Вложения.Вставить(ИмяВложения, Вложение.Данные); + Вложения.Вставить(Вложение.Имя, Вложение.Данные); Иначе - ЗаполнитьВложенныеВложения(Вложения, ИмяВложения, Вложение.Данные); + ЗаполнитьВложенияПоПисьму(Вложения, Вложение.Данные); КонецЕсли; КонецЦикла; ПолеПисьма = Вложения; @@ -762,24 +679,24 @@ Возврат Результат; КонецФункции -Процедура ЗаполнитьВложенныеВложения(Вложения, ИмяВложения, ИнтернетПочтовоеСообщение) +Процедура ЗаполнитьВложенияПоПисьму(Вложения, Письмо) - Для Каждого ИнтернетПочтовоеВложение Из ИнтернетПочтовоеСообщение.Вложения Цикл - ИмяВложения = ИнтернетПочтовоеВложение.Имя; - Если ТипЗнч(ИнтернетПочтовоеВложение.Данные) = Тип("ДвоичныеДанные") Тогда - Вложения.Вставить(ИмяВложения, ИнтернетПочтовоеВложение.Данные); + Для Каждого Вложение Из Письмо.Вложения Цикл + ИмяВложения = Вложение.Имя; + Если ТипЗнч(Вложение.Данные) = Тип("ДвоичныеДанные") Тогда + Вложения.Вставить(Вложение.Имя, Вложение.Данные); Иначе - ЗаполнитьВложенныеВложения(Вложения, ИмяВложения, ИнтернетПочтовоеВложение.Данные); + ЗаполнитьВложенияПоПисьму(Вложения, Вложение.Данные); КонецЕсли; КонецЦикла; - Индекс = 0; + ПредставлениеПисьма = ПредставлениеПисьма(Письмо.Тема, Письмо.ДатаОтправления); - Для Каждого ИнтернетТекстыПочтовогоСообщения Из ИнтернетПочтовоеСообщение.Тексты Цикл - - Если ИнтернетТекстыПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда + Индекс = 0; + Для Каждого Текст Из Письмо.Тексты Цикл + Если Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда Расширение = "html"; - ИначеЕсли ИнтернетТекстыПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда + ИначеЕсли Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда Расширение = "txt"; Иначе Расширение = "rtf"; @@ -787,9 +704,9 @@ ИмяТекстаВложения = ""; Пока ИмяТекстаВложения = "" Или Вложения.Получить(ИмяТекстаВложения) <> Неопределено Цикл Индекс = Индекс + 1; - ИмяТекстаВложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 - (%2).%3", ИмяВложения, Индекс, Расширение); + ИмяТекстаВложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 - (%2).%3", ПредставлениеПисьма, Индекс, Расширение); КонецЦикла; - Вложения.Вставить(ИмяТекстаВложения, ИнтернетТекстыПочтовогоСообщения.Данные); + Вложения.Вставить(ИмяТекстаВложения, Текст.Данные); КонецЦикла; КонецПроцедуры @@ -846,9 +763,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Первоначальное заполнение и обновление ИБ. - // Выполняет заполнение системной учетной записи значениями по умолчанию. // Процедура ЗаполнитьСистемнуюУчетнуюЗапись() Экспорт @@ -1006,4 +920,320 @@ КонецПроцедуры +Функция ПодготовитьВложения(Вложения, НастройкиСохранения) Экспорт + Перем ЗаписьZipФайла, ИмяАрхива; + + Результат = Новый Массив; + + // подготовка архива + ЕстьДобавленныеФайлыВАрхив = Ложь; + Если НастройкиСохранения.УпаковатьВАрхив Тогда + ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); + ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); + КонецЕсли; + + // подготовка временной папки + ИмяВременнойПапки = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяВременнойПапки); + ИспользованныеИменаФайлов = Новый Соответствие; + + ВыбранныеФорматыСохранения = НастройкиСохранения.ФорматыСохранения; + ТаблицаФорматов = СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента(); + + ИмяФайлаДляАрхива = Неопределено; + Для Индекс = -Вложения.ВГраница() По 0 Цикл + Вложение = Вложения[-Индекс]; + ТабличныйДокумент = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище); + Если ТипЗнч(ТабличныйДокумент) = Тип("ТабличныйДокумент") Тогда + АдресВоВременномХранилище = Вложение.АдресВоВременномХранилище; + Вложения.Удалить(-Индекс); + Иначе + Продолжить; + КонецЕсли; + + Если ВычислитьИспользованиеВывода(ТабличныйДокумент) = ИспользованиеВывода.Запретить Тогда + Продолжить; + КонецЕсли; + + Если ТабличныйДокумент.Защита Тогда + Продолжить; + КонецЕсли; + + Если ТабличныйДокумент.ВысотаТаблицы = 0 Тогда + Продолжить; + КонецЕсли; + + Для Каждого ТипФайла Из ВыбранныеФорматыСохранения Цикл + НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ТипФайла))[0]; + ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Вложение.Представление); + Если ИмяФайлаДляАрхива = Неопределено Тогда + ИмяФайлаДляАрхива = ИмяФайла + ".zip"; + Иначе + ИмяФайлаДляАрхива = НСтр("ru = 'Документы'") + ".zip"; + КонецЕсли; + ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение; + + ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременнойПапки) + ИмяФайла); + ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайла); + + Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда + ВставитьКартинкиВHTML(ПолноеИмяФайла); + КонецЕсли; + + Если ЗаписьZipФайла <> Неопределено Тогда + ЕстьДобавленныеФайлыВАрхив = Истина; + ЗаписьZipФайла.Добавить(ПолноеИмяФайла); + Иначе + ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); + ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресВоВременномХранилище); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", АдресВоВременномХранилище); + Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда + ОписаниеФайла.Вставить("Кодировка", "windows-1251"); + КонецЕсли; + Результат.Добавить(ОписаниеФайла); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Если архив подготовлен, записываем и помещаем его во временное хранилище. + Если ЕстьДобавленныеФайлыВАрхив Тогда + ЗаписьZipФайла.Записать(); + ФайлАрхива = Новый Файл(ИмяАрхива); + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); + + // Используем имеющийся адрес во временном хранилище, привязанный к форме. + ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресВоВременномХранилище); + + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайлаДляАрхива); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", АдресВоВременномХранилище); + Результат.Добавить(ОписаниеФайла); + КонецЕсли; + + Для Каждого ОписаниеФайла Из Результат Цикл + Вложения.Добавить(ОписаниеФайла); + КонецЦикла; + + УдалитьФайлы(ИмяВременнойПапки); + Если ЗначениеЗаполнено(ИмяАрхива) Тогда + УдалитьФайлы(ИмяАрхива); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ВычислитьИспользованиеВывода(ТабличныйДокумент) + Если ТабличныйДокумент.Вывод = ИспользованиеВывода.Авто Тогда + Возврат ?(ПравоДоступа("Вывод", Метаданные), ИспользованиеВывода.Разрешить, ИспользованиеВывода.Запретить); + Иначе + Возврат ТабличныйДокумент.Вывод; + КонецЕсли; +КонецФункции + +Функция УникальноеИмяФайла(ИмяФайла) + + Файл = Новый Файл(ИмяФайла); + ИмяБезРасширения = Файл.ИмяБезРасширения; + Расширение = Файл.Расширение; + Папка = Файл.Путь; + + Счетчик = 1; + Пока Файл.Существует() Цикл + Счетчик = Счетчик + 1; + Файл = Новый Файл(Папка + ИмяБезРасширения + " (" + Счетчик + ")" + Расширение); + КонецЦикла; + + Возврат Файл.ПолноеИмя; + +КонецФункции + +Процедура ВставитьКартинкиВHTML(ИмяФайлаHTML) + + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + ТекстовыйДокумент.Прочитать(ИмяФайлаHTML, КодировкаТекста.UTF8); + ТекстHTML = ТекстовыйДокумент.ПолучитьТекст(); + + ФайлHTML = Новый Файл(ИмяФайлаHTML); + + ИмяПапкиКартинок = ФайлHTML.ИмяБезРасширения + "_files"; + ПутьКПапкеКартинок = СтрЗаменить(ФайлHTML.ПолноеИмя, ФайлHTML.Имя, ИмяПапкиКартинок); + + // Ожидается, что в папке будут только картинки. + ФайлыКартинок = НайтиФайлы(ПутьКПапкеКартинок, "*"); + + Для Каждого ФайлКартинки Из ФайлыКартинок Цикл + КартинкаТекстом = Base64Строка(Новый ДвоичныеДанные(ФайлКартинки.ПолноеИмя)); + КартинкаТекстом = "data:image/" + Сред(ФайлКартинки.Расширение,2) + ";base64," + Символы.ПС + КартинкаТекстом; + + ТекстHTML = СтрЗаменить(ТекстHTML, ИмяПапкиКартинок + "\" + ФайлКартинки.Имя, КартинкаТекстом); + КонецЦикла; + + ТекстовыйДокумент.УстановитьТекст(ТекстHTML); + ТекстовыйДокумент.Записать(ИмяФайлаHTML, КодировкаТекста.UTF8); + +КонецПроцедуры + +Функция НастройкиПодсистемы() Экспорт + Настройки = Новый Структура; + Настройки.Вставить("ДоступноПолучениеПисем", Не СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации()); + РаботаСПочтовымиСообщениямиПереопределяемый.ПриОпределенииНастроек(Настройки); + Возврат Настройки; +КонецФункции + +Функция ОпределитьТипСодержимогоПоИмениФайла(ИмяФайла) + Расширение = ""; + Позиция = СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца); + Если Позиция > 0 Тогда + Расширение = НРег(Сред(ИмяФайла, Позиция + 1)); + КонецЕсли; + Возврат ТипыСодержимого()[Расширение]; +КонецФункции + +Функция ТипыСодержимого() + Результат = Новый Соответствие; + + Результат.Вставить("json", "application/json"); + Результат.Вставить("pdf", "application/pdf"); + Результат.Вставить("xhtml", "application/xhtml+xml"); + Результат.Вставить("zip", "application/zip"); + Результат.Вставить("gzip", "application/gzip"); + + Результат.Вставить("aac", "audio/aac"); + Результат.Вставить("ogg", "audio/ogg"); + Результат.Вставить("wma", "audio/x-ms-wma"); + Результат.Вставить("wav", "audio/vnd.wave"); + + Результат.Вставить("gif", "image/gif"); + Результат.Вставить("jpeg", "image/jpeg"); + Результат.Вставить("png", "image/png"); + Результат.Вставить("svg", "image/svg"); + Результат.Вставить("tiff", "image/tiff"); + Результат.Вставить("ico", "image/vnd.microsoft.icon"); + + Результат.Вставить("html", "text/html"); + Результат.Вставить("txt", "text/plain"); + Результат.Вставить("xml", "text/xml"); + + Результат.Вставить("mpeg", "video/mpeg"); + Результат.Вставить("mp4", "video/mp4"); + Результат.Вставить("mov", "video/quicktime"); + Результат.Вставить("wmv", "video/x-ms-wmv"); + Результат.Вставить("flv", "video/x-flv"); + Результат.Вставить("3gpp", "video/3gpp"); + Результат.Вставить("3gp", "video/3gpp"); + Результат.Вставить("3gpp2", "video/3gpp2"); + Результат.Вставить("3g2", "video/3gpp2"); + + Результат.Вставить("odt", "application/vnd.oasis.opendocument.text"); + Результат.Вставить("ods", "application/vnd.oasis.opendocument.spreadsheet"); + Результат.Вставить("odp", "application/vnd.oasis.opendocument.presentation"); + Результат.Вставить("odg", "application/vnd.oasis.opendocument.graphics"); + + Результат.Вставить("doc", "application/msword"); + Результат.Вставить("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + Результат.Вставить("xls", "application/vnd.ms-excel"); + Результат.Вставить("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + Результат.Вставить("ppt", "application/vnd.ms-powerpoint"); + Результат.Вставить("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); + + Результат.Вставить("rar", "application/x-rar-compressed"); + + Результат.Вставить("p7m", "application/x-pkcs7-mime"); + Результат.Вставить("p7s", "application/x-pkcs7-signature"); + + Возврат Результат; +КонецФункции + +Функция ПолучитьHTMLФорматированногоДокументаДляПисьма(ФорматированныйДокумент) + + // Выгрузка форматированного документа в HTML текст и картинки. + ТекстHTML = ""; + Картинки = Новый Структура; + ФорматированныйДокумент.ПолучитьHTML(ТекстHTML, Картинки); + + // Конвертация HTML текста в ДокументHTML. + Построитель = Новый ПостроительDOM; + ЧтениеHTML = Новый ЧтениеHTML; + ЧтениеHTML.УстановитьСтроку(ТекстHTML); + ДокументHTML = Построитель.Прочитать(ЧтениеHTML); + + // Замена имен картинок в документе HTML на идентификаторы. + Для Каждого Картинка Из ДокументHTML.Картинки Цикл + АтрибутИсточникКартинки = Картинка.Атрибуты.ПолучитьИменованныйЭлемент("src"); + АтрибутИсточникКартинки.ТекстовоеСодержимое = "cid:" + АтрибутИсточникКартинки.ТекстовоеСодержимое; + КонецЦикла; + + // Конвертация ДокументHTML обратно в текст HTML. + ЗаписьDOM = Новый ЗаписьDOM; + ЗаписьHTML = Новый ЗаписьHTML; + ЗаписьHTML.УстановитьСтроку(); + ЗаписьDOM.Записать(ДокументHTML, ЗаписьHTML); + ТекстHTML = ЗаписьHTML.Закрыть(); + + // Подготовка результата. + Результат = Новый Структура; + Результат.Вставить("ТекстHTML", ТекстHTML); + Результат.Вставить("Картинки", Картинки); + + Возврат Результат; + +КонецФункции + +Функция ПредставлениеПисьма(ТемаПисьма, ДатаПисьма) + + ШаблонПредставления = НСтр("ru = '%1 от %2'"); + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПредставления, + ?(ПустаяСтрока(ТемаПисьма), НСтр("ru = '<Без темы>'"), ТемаПисьма), + Формат(ДатаПисьма, "ДЛФ=D")); + +КонецФункции + +// Преобразует к единому виду коллекцию переданных вложений. +// Требуется для обхода случаев, когда исходная форма не заботится о времени жизни временного хранилища, в +// которое помещены вложения. Вложения перекладываются во временное хранилище "на время сеанса". +Функция ОписанияВложений(КоллекцияВложений) Экспорт + Если ТипЗнч(КоллекцияВложений) <> Тип("СписокЗначений") И ТипЗнч(КоллекцияВложений) <> Тип("Массив") Тогда + Возврат КоллекцияВложений; + КонецЕсли; + + Результат = Новый Массив; + Для Каждого Вложение Из КоллекцияВложений Цикл + ОписаниеВложения = ОписаниеВложения(); + Если ТипЗнч(КоллекцияВложений) = Тип("СписокЗначений") Тогда + ОписаниеВложения.Представление = Вложение.Представление; + ДвоичныеДанные = Неопределено; + Если ТипЗнч(Вложение.Значение) = Тип("ДвоичныеДанные") Тогда + ДвоичныеДанные = Вложение.Значение;; + Иначе + Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда + ДвоичныеДанные = ПолучитьИзВременногоХранилища(Вложение.Значение); + Иначе + ПутьКФайлу = Вложение.Значение; + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); + КонецЕсли; + КонецЕсли; + Иначе // ТипЗнч(Параметры.Вложения) = "массив структур" + ДвоичныеДанные = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище); + ЗаполнитьЗначенияСвойств(ОписаниеВложения, Вложение, , "АдресВоВременномХранилище"); + КонецЕсли; + ОписаниеВложения.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор); + Результат.Добавить(ОписаниеВложения); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ОписаниеВложения() + Результат = Новый Структура; + Результат.Вставить("Представление"); + Результат.Вставить("АдресВоВременномХранилище"); + Результат.Вставить("Кодировка"); + Результат.Вставить("Идентификатор"); + + Возврат Результат; +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl index 2cecd13f1..8dd451107 100644 --- a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -5,6 +5,380 @@ #Область ПрограммныйИнтерфейс +// Возвращает двоичные данные файла. +// Если двоичные данные файла не найдены в информационной базе или в томах, будет вызвано исключение. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// +// Возвращаемое значение: +// ДвоичныеДанные - двоичные данные присоединенного файла. +// +Функция ДвоичныеДанныеФайла(Знач ПрисоединенныйФайл) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДвоичныеДанныеФайла", "ПрисоединенныйФайл", + ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип); + + УстановитьПривилегированныйРежим(Истина); + + ФайлОбъект = РаботаСФайламиСлужебный.ФайлОбъект(ПрисоединенныйФайл); + + Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДвоичныеДанныеФайлов.Файл, + | ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла + |ИЗ + | РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов + |ГДЕ + | ДвоичныеДанныеФайлов.Файл = &ПрисоединенныйФайл"; + + Запрос.УстановитьПараметр("ПрисоединенныйФайл", ФайлОбъект.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Возврат Выборка.ДвоичныеДанныеФайла.Получить(); + КонецЕсли; + + // Запись в журнал регистрации. + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Двоичные данные файла отсутствуют в регистре ДвоичныеДанныеФайла + | + |Ссылка на файл: ""%1"".'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл)); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Открытие файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя], + ПрисоединенныйФайл, + СообщениеОбОшибке); + + ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Присоединен к %1 : %2'"), + Строка(ТипЗнч(ФайлОбъект.ВладелецФайла)), + ФайлОбъект.ВладелецФайла); + + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( + ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение, + Ложь, + ПредставлениеВладельцаФайла); + Иначе + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + + Попытка + Возврат Новый ДвоичныеДанные(ПолныйПуть); + Исключение + // Запись в журнал регистрации. + СообщениеОбОшибке = ТекстОшибкиПриПолученииФайла(ИнформацияОбОшибке(), ПрисоединенныйФайл); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Получение файла из тома'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя], + ПрисоединенныйФайл, + СообщениеОбОшибке); + + ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Присоединен к %1 : %2'"), + Строка(ТипЗнч(ФайлОбъект.ВладелецФайла)), + ФайлОбъект.ВладелецФайла); + + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( + ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение, + , + ПредставлениеВладельцаФайла); + + КонецПопытки; + КонецЕсли; + +КонецФункции + +// Возвращает структуру данных файла. Используется в различных командах работы с файлами, +// и как значение параметра ДанныеФайла других процедур и функций. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, который +// используется при получении двоичных данных файла. +// +// ПолучатьСсылкуНаДвоичныеДанные - Булево - если передать Ложь, то ссылка на двоичные данные +// не будет получена, что существенно ускорит выполнение для больших двоичных данных. +// +// ДляРедактирования - Булево - если указать Истина, то свободный файл будет захвачен для редактирования. +// +// Возвращаемое значение: +// Структура - со свойствами: +// * СсылкаНаДвоичныеДанныеФайла - Строка - адрес во временном хранилище. +// * ОтносительныйПуть - Строка - относительный путь файла. +// * ДатаМодификацииУниверсальная - Дата - дата изменения фала. +// * ИмяФайла - Строка - имя файла без точки. +// * Наименование - Строка - наименование файла в справочнике хранения файлов. +// * Расширение - Строка - расширение файла без точки. +// * Размер - Число - размер файла. +// * Редактирует - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, +// Неопределено - ссылка на пользователя, занявшего файл. +// * ПодписанЭП - Булево - Истина, если файл подписан. +// * Зашифрован - Булево - Истина, если файл зашифрован. +// * ФайлРедактируется - Булево - Истина, если файл занят для редактирования. +// * ФайлРедактируетТекущийПользователь - Булево - Истина, если файл занят для редактирования текущим пользователем. +// +Функция ДанныеФайла(Знач ПрисоединенныйФайл, + Знач ИдентификаторФормы = Неопределено, + Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, + Знач ДляРедактирования = Ложь) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДанныеФайла", "ПрисоединенныйФайл", + ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип); + + ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден присоединенный файл ""%1"" (%2)'"), + Строка(ПрисоединенныйФайл), ПрисоединенныйФайл.Метаданные())); + + Если ДляРедактирования И Не ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда + ФайлОбъект.Заблокировать(); + РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(ФайлОбъект); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + СсылкаНаДвоичныеДанныеФайла = Неопределено; + + Если ПолучатьСсылкуНаДвоичныеДанные Тогда + Если ПрисоединенныйФайл.ХранитьВерсии И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда + ДвоичныеДанные = ДвоичныеДанныеФайла(ПрисоединенныйФайл.ТекущаяВерсия); + Иначе + ДвоичныеДанные = ДвоичныеДанныеФайла(ПрисоединенныйФайл); + КонецЕсли; + Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда + СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + Иначе + СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные); + КонецЕсли; + + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Ссылка", ПрисоединенныйФайл); + Результат.Вставить("СсылкаНаДвоичныеДанныеФайла", СсылкаНаДвоичныеДанныеФайла); + Результат.Вставить("ОтносительныйПуть", ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\"); + Результат.Вставить("ДатаМодификацииУниверсальная", ФайлОбъект.ДатаМодификацииУниверсальная); + Результат.Вставить("ИмяФайла", ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение); + Результат.Вставить("Наименование", ФайлОбъект.Наименование); + Результат.Вставить("Расширение", ФайлОбъект.Расширение); + Результат.Вставить("Размер", ФайлОбъект.Размер); + Результат.Вставить("Редактирует", ФайлОбъект.Редактирует); + Результат.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП); + Результат.Вставить("Зашифрован", ФайлОбъект.Зашифрован); + Результат.Вставить("ХранитьВерсии", ФайлОбъект.ХранитьВерсии); + Результат.Вставить("ПометкаУдаления", ФайлОбъект.ПометкаУдаления); + Результат.Вставить("ДатаЗаема", ФайлОбъект.ДатаЗаема); + Результат.Вставить("Владелец", ФайлОбъект.ВладелецФайла); + Результат.Вставить("АвторТекущейВерсии", ФайлОбъект.Изменил); + Результат.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл)); + + МетаданныеОбъектаФайла = Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)); + ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла); + + Если ЕстьВозможностьХранитьВерсии И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда + РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДополнительныеДанныеФайла(Результат, ПрисоединенныйФайл, ПрисоединенныйФайл.ТекущаяВерсия); + Иначе + РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДополнительныеДанныеФайла(Результат, ПрисоединенныйФайл, Неопределено); + КонецЕсли; + + Результат.Вставить("ФайлРедактируется", ЗначениеЗаполнено(ФайлОбъект.Редактирует)); + Результат.Вставить("ФайлРедактируетТекущийПользователь", + ?(Результат.ФайлРедактируется, ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(), Ложь) ); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + Если ФайлОбъект.Зашифрован Тогда + Результат.Вставить("МассивСертификатовШифрования", МодульЭлектроннаяПодпись.СертификатыШифрования(ПрисоединенныйФайл)); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Заполняет массив ссылками на файлы объекта. +// +// Параметры: +// Объект - Ссылка - ссылка на объект, который может содержать присоединенные файлы. +// МассивФайлов - Массив - массив в который будут добавлены ссылки на файлы объекта: +// * СправочникСсылка - (возвращаемое значение) ссылка на присоединенный файл. +// +Процедура ЗаполнитьПрисоединенныеФайлыКОбъекту(Знач Объект, Знач МассивФайлов) Экспорт + + Если ТипЗнч(Объект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Возврат; + КонецЕсли; + + ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); + Если ТипыВладельцев.Найти(ТипЗнч(Объект)) <> Неопределено Тогда + + МассивФайловЛокальный = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(Объект); + Для Каждого СсылкаНаФайл Из МассивФайловЛокальный Цикл + МассивФайлов.Добавить(СсылкаНаФайл); + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +// Возвращает новую ссылку на файл для указанного владельца, +// которую можно использовать, а затем передать в функцию ДобавитьФайл. +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект, к которому добавляется файл. +// +// ИмяСправочника - Неопределено - вычислить справочник по владельцу (допустимо, +// когда справочник только один, иначе будет вызвано исключение). +// +// - Строка - имя справочника *ПрисоединенныеФайлы, отличное +// от стандартного <ИмяВладельца>ПрисоединенныеФайлы. +// +// Возвращаемое значение: +// СправочникСсылка - ссылка на новый еще несозданный присоединенный файл. +// +Функция НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при получении новой ссылки на присоединенный файл.'"); + + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + ВладелецФайлов, ИмяСправочника, ЗаголовокОшибки); + + Возврат Справочники[ИмяСправочника].ПолучитьСсылку(); + +КонецФункции + +// Обновляет свойства файла - двоичные данные, текст, дату изменения, +// а также другие необязательные свойства. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИнформацияОФайле - Структура - со свойствами: +// <обязательные> +// * АдресФайлаВоВременномХранилище - Строка - адрес новых двоичных данных файла. +// * АдресВременногоХранилищаТекста - Строка - адрес новых двоичных данных текста, +// извлеченного из файла. +// <необязательные> +// * ИмяБезРасширения - Строка - если свойство не указано или не заполнено, +// тогда не будет изменено. +// * ДатаМодификацииУниверсальная - Дата - дата последнего изменения файла, если +// свойство не указано или не заполнено, тогда будет +// установлена текущая дата сеанса. +// * Расширение - Строка - новое расширение файла. +// * Редактирует - Ссылка - новый пользователь, редактирующий файл. +// +Процедура ОбновитьФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДвоичныеДанныеФайла", "ПрисоединенныйФайл", + ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип); + + РеквизитыЗначения = Новый Структура; + + Если ИнформацияОФайле.Свойство("ИмяБезРасширения") И ЗначениеЗаполнено(ИнформацияОФайле.ИмяБезРасширения) Тогда + РеквизитыЗначения.Вставить("Наименование", ИнформацияОФайле.ИмяБезРасширения); + КонецЕсли; + + Если НЕ ИнформацияОФайле.Свойство("ДатаМодификацииУниверсальная") + ИЛИ НЕ ЗначениеЗаполнено(ИнформацияОФайле.ДатаМодификацииУниверсальная) + ИЛИ ИнформацияОФайле.ДатаМодификацииУниверсальная > ТекущаяУниверсальнаяДата() Тогда + + // Заполнение текущей даты в формате универсального времени. + РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ТекущаяУниверсальнаяДата()); + Иначе + РеквизитыЗначения.Вставить("ДатаМодификацииУниверсальная", ИнформацияОФайле.ДатаМодификацииУниверсальная); + КонецЕсли; + + Если ИнформацияОФайле.Свойство("Редактирует") Тогда + РеквизитыЗначения.Вставить("Редактирует", ИнформацияОФайле.Редактирует); + КонецЕсли; + + Если ИнформацияОФайле.Свойство("Расширение") Тогда + РеквизитыЗначения.Вставить("Расширение", ИнформацияОФайле.Расширение); + КонецЕсли; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИнформацияОФайле.АдресФайлаВоВременномХранилище); + + РеквизитыЗначения.Вставить("СтатусИзвлеченияТекста", Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен); + ИзвлеченныйТекст = ""; + + Если ЭтоАдресВременногоХранилища(ИнформацияОФайле.АдресВременногоХранилищаТекста) Тогда + + ИзвлеченныйТекст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища( + ИнформацияОФайле.АдресВременногоХранилищаТекста); + + РеквизитыЗначения.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + + ИначеЕсли НЕ РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + // Тексты извлекаются сразу, а не в фоновом задании. + РеквизитыЗначения.СтатусИзвлеченияТекста = РаботаСФайламиСлужебный.ИзвлечьТекст( + ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); + КонецЕсли; + + РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения(ИзвлеченныйТекст)); + + РаботаСФайламиСлужебный.ОбновитьДвоичныеДанныеФайлаНаСервере( + ПрисоединенныйФайл, ДвоичныеДанные, РеквизитыЗначения); + +КонецПроцедуры + +// Возвращает имя формы объекта присоединенных файлов по владельцу. +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект, по которому определяется имя формы. +// +// Возвращаемое значение: +// Строка - имя формы объекта присоединенных файлов по владельцу. +// +Функция ИмяФормыОбъектаФайловПоВладельцу(Знач ВладелецФайлов) Экспорт + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при получении имени формы присоединенного файла.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае получение формы невозможно.'"); + + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + ВладелецФайлов, "", ЗаголовокОшибки, ОкончаниеОшибки); + + ПолноеИмяОМ = "Справочник." + ИмяСправочника; + + МетаданныеПрисоединенныхФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОМ); + + Если МетаданныеПрисоединенныхФайлов.ОсновнаяФормаОбъекта = Неопределено Тогда + ИмяФормы = ПолноеИмяОМ + ".ФормаОбъекта"; + Иначе + ИмяФормы = МетаданныеПрисоединенныхФайлов.ОсновнаяФормаОбъекта.ПолноеИмя(); + КонецЕсли; + + Возврат ИмяФормы; + +КонецФункции + +// Определяет наличие хранилища присоединенных файлов у объекта +// право Добавление в хранилище (справочник присоединенных файлов). +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется проверка. +// ИмяСправочника - Строка - если требуется проверка добавления в указанное хранилище. +// +// Возвращаемое значение: +// Булево - если Истина, тогда к объекту может присоединять файлы. +// +Функция КОбъектуМожноПрисоединятьФайлы(ВладелецФайлов, ИмяСправочника = "") Экспорт + + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + ВладелецФайлов, ИмяСправочника); + + СправочникПрисоединенныеФайлы = Метаданные.Справочники.Найти(ИмяСправочника); + + ТипыХранимыхФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип; + + Возврат СправочникПрисоединенныеФайлы <> Неопределено + И ПравоДоступа("Добавление", СправочникПрисоединенныеФайлы) + И ТипыХранимыхФайлов.СодержитТип(Тип("СправочникСсылка." + ИмяСправочника)); + +КонецФункции + // Создает карточку Файла в БД вместе с версией. // // Параметры: @@ -25,13 +399,13 @@ АдресВременногоХранилищаТекста = ""; - Если ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + Если РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда // Текст извлечет регламентное задание. АдресВременногоХранилищаТекста = ""; Иначе // Попытка извлечения текста, если сервер под Windows. - Если ФайловыеФункцииСлужебный.ЭтоПлатформаWindows() Тогда - Текст = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекст(ПутьКФайлуНаДиске); + Если РаботаСФайламиСлужебный.ЭтоПлатформаWindows() Тогда + Текст = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекст(ПутьКФайлуНаДиске); АдресВременногоХранилищаТекста = Новый ХранилищеЗначения(Текст); КонецЕсли; КонецЕсли; @@ -43,6 +417,46 @@ КонецФункции +// Обработчик подписки на событие ОбработкаПолученияФормы для переопределения формы файла. +// +// Параметры: +// Источник - СправочникМенеджер - менеджер справочника с именем "*ПрисоединенныеФайлы". +// ВидФормы - Строка - имя стандартной формы. +// Параметры - Структура - параметры формы. +// ВыбраннаяФорма - Строка - имя или объект метаданных открываемой формы. +// ДополнительнаяИнформация - Структура - дополнительная информация открытия формы. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. +// +Процедура ОпределитьФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, + ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт + + ЭтоФормаВерсии = Ложь; + + Если Источник <> Неопределено Тогда + ЭтоФормаВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("РодительскаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(Источник))); + КонецЕсли; + + Если ВидФормы = "ФормаГруппы" Тогда + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ГруппаФайлов"; + СтандартнаяОбработка = Ложь; + ИначеЕсли ВидФормы = "ФормаОбъекта" Тогда + Если ЭтоФормаВерсии Тогда + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ВерсияПрисоединенногоФайла"; + Иначе + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл"; + КонецЕсли; + СтандартнаяОбработка = Ложь; + ИначеЕсли ВидФормы = "ФормаСписка" Тогда + Если ЭтоФормаВерсии Тогда + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ВерсииФайла"; + Иначе + ВыбраннаяФорма = "Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы"; + КонецЕсли; + СтандартнаяОбработка = Ложь; + КонецЕсли; + +КонецПроцедуры + // Обработчик события ПередЗаписью объектов-владельцев файлов. // Определен только для объектов Документ. // @@ -59,15 +473,11 @@ КонецЕсли; Если Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления") Тогда - ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); + ПометитьНаУдалениеПрисоединенныеФайлы(Источник); КонецЕсли; КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - // Обработчик события ПередЗаписью объектов-владельцев файлов. // Определен для объектов, кроме Документ. // @@ -87,44 +497,1015 @@ КонецЕсли; Если Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления") Тогда - ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); + ПометитьНаУдалениеПрисоединенныеФайлы(Источник); + КонецЕсли; + +КонецПроцедуры + +// Создает объект в справочнике для хранения файла и заполняет его реквизиты переданными свойствами. +// +// Параметры: +// ПараметрыФайла - Структура - Параметры с данными файла. +// * Автор - Ссылка - пользователь, создавший файл. +// * ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// * ИмяБезРасширения - Строка - имя файла без расширения. +// * РасширениеБезТочки - Строка - расширение файла (без точки вначале). +// * ВремяИзмененияУниверсальное - Дата - дата и время изменения файла (UTC+0:00), +// если не указана, тогда используется ТекущаяУниверсальнаяДата(). +// ГруппаФайлов - Ссылка - группа справочника с файлами, в которую будет добавлен новый файл. +// АдресФайлаВоВременномХранилище - Строка - адрес, указывающий на двоичные данные во временном хранилище. +// АдресВременногоХранилищаТекста - Строка - адрес, указывающий на извлеченный текст из файла во временном хранилище. +// Описание - Строка - текстовое описание файла. +// +// НоваяСсылкаНаФайл - Неопределено - создать новую ссылку на файл в стандартном справочнике +// или в нестандартном, но единственном справочнике. Когда у владельца файла несколько +// справочников, требуется обязательно передать ссылку, иначе будет вызвано +// исключение. +// - Ссылка - ссылка на элемент справочника хранения файлов, +// которую следует использовать для добавляемого файла. +// Должна соответствовать одному из типов справочников хранения файлов владельца +// файлов. +// Возвращаемое значение: +// СправочникСсылка - ссылка на созданный присоединенный файл. +// +Функция ДобавитьФайл(ПараметрыФайла, + Знач АдресФайлаВоВременномХранилище, + Знач АдресВременногоХранилищаТекста = "", + Знач Описание = "", + Знач НоваяСсылкаНаФайл = Неопределено) Экспорт + + Автор = ПараметрыФайла.Автор; + ВладелецФайлов = ПараметрыФайла.ВладелецФайлов; + ИмяБезРасширения = ПараметрыФайла.ИмяБезРасширения; + РасширениеБезТочки = ПараметрыФайла.РасширениеБезТочки; + ГруппаФайлов = Неопределено; + Если ПараметрыФайла.Свойство("ГруппаФайлов") + И ЗначениеЗаполнено(ПараметрыФайла.ГруппаФайлов) + И ТипЗнч(ВладелецФайлов) <> Тип("СправочникСсылка.ПапкиФайлов") Тогда + ГруппаФайлов = ПараметрыФайла.ГруппаФайлов; + КонецЕсли; + ВремяИзмененияУниверсальное = ПараметрыФайла.ВремяИзмененияУниверсальное; + + Если РасширениеБезТочки = Неопределено Тогда + ЧастиИмениФайла = СтрРазделить(ИмяБезРасширения, ".", Ложь); + Если ЧастиИмениФайла.Количество() > 1 Тогда + РасширениеБезТочки = ЧастиИмениФайла[ЧастиИмениФайла.Количество()-1]; + ИмяБезРасширения = Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - (СтрДлина(РасширениеБезТочки)+1)); + КонецЕсли; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ВремяИзмененияУниверсальное) + Или ВремяИзмененияУниверсальное > ТекущаяУниверсальнаяДата() Тогда + ВремяИзмененияУниверсальное = ТекущаяУниверсальнаяДата(); + КонецЕсли; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при добавлении присоединенного файла.'"); + + Если НоваяСсылкаНаФайл = Неопределено Тогда + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов(ВладелецФайлов, "", ЗаголовокОшибки, + НСтр("ru = 'В этом случае параметр ""НоваяСсылкаНаФайл"" должен быть указан.'")); + + НоваяСсылкаНаФайл = Справочники[ИмяСправочника].ПолучитьСсылку(); + Иначе + Если Не Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСсылкаНаФайл)) + Или Не ЗначениеЗаполнено(НоваяСсылкаНаФайл) Тогда + + ВызватьИсключение НСтр("ru = 'Ошибка при добавлении присоединенного файла. + |Ссылка на новый файл не заполнена.'"); + КонецЕсли; + + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + ВладелецФайлов, НоваяСсылкаНаФайл.Метаданные().Имя, ЗаголовокОшибки); + КонецЕсли; + + ПрисоединенныйФайл = Справочники[ИмяСправочника].СоздатьЭлемент(); + ПрисоединенныйФайл.УстановитьСсылкуНового(НоваяСсылкаНаФайл); + + ПрисоединенныйФайл.ВладелецФайла = ВладелецФайлов; + ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; + ПрисоединенныйФайл.ДатаСоздания = ТекущаяДатаСеанса(); + ПрисоединенныйФайл.Описание = Описание; + ПрисоединенныйФайл.Наименование = ИмяБезРасширения; + ПрисоединенныйФайл.Расширение = РасширениеБезТочки; + ПрисоединенныйФайл.ТипХраненияФайла = РаботаСФайламиСлужебный.ТипХраненияФайлов(); + ПрисоединенныйФайл.Размер = ДвоичныеДанные.Размер(); + Если ГруппаФайлов <> Неопределено Тогда + ПрисоединенныйФайл.Родитель = ГруппаФайлов; + КонецЕсли; + + + Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + НачатьТранзакцию(); + Попытка + СвояТранзакцияОткрыта = Истина; + РаботаСФайламиСлужебный.ЗаписатьФайлВИнформационнуюБазу(НоваяСсылкаНаФайл, ДвоичныеДанные); + ПрисоединенныйФайл.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ПрисоединенныйФайл.ПутьКФайлу = ""; + + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИзвлеченныйТекст = ""; + + Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда + ИзвлеченныйТекст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + + ИначеЕсли НЕ РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + // Тексты извлекаются сразу, а не в фоновом задании. + СтатусИзвлеченияТекста = РаботаСФайламиСлужебный.ИзвлечьТекст( + ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); + КонецЕсли; + + ПрисоединенныйФайл.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; + ПрисоединенныйФайл.ТекстХранилище = Новый ХранилищеЗначения(ИзвлеченныйТекст); + ПрисоединенныйФайл.Автор = Автор; + ПрисоединенныйФайл.Заполнить(Неопределено); + + ПрисоединенныйФайл.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + + ОтменитьТранзакцию(); + + ШаблонСообщения = НСтр("ru = 'Ошибка при добавлении присоединенного файла ""%1"": + |%2'"); + КомментарийЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + ИмяБезРасширения + "." + РасширениеБезТочки, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Добавление присоединенного файла'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + КомментарийЖурналаРегистрации); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + ИмяБезРасширения + "." + РасширениеБезТочки, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + Иначе + Попытка + // Добавление в один из томов (где есть свободное место). + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ВремяИзмененияУниверсальное, + ИмяБезРасширения, РасширениеБезТочки, , ПрисоединенныйФайл.Зашифрован); + ПрисоединенныйФайл.Том = СведенияОФайле.Том; + ПрисоединенныйФайл.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИзвлеченныйТекст = ""; + + Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда + ИзвлеченныйТекст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + + ИначеЕсли НЕ РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + // Тексты извлекаются сразу, а не в фоновом задании. + СтатусИзвлеченияТекста = РаботаСФайламиСлужебный.ИзвлечьТекст( + ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); + КонецЕсли; + + ПрисоединенныйФайл.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; + ПрисоединенныйФайл.ТекстХранилище = Новый ХранилищеЗначения(ИзвлеченныйТекст); + ПрисоединенныйФайл.Автор = Автор; + ПрисоединенныйФайл.Заполнить(Неопределено); + + ПрисоединенныйФайл.Записать(); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + + ШаблонСообщения = НСтр("ru = 'Ошибка при добавлении присоединенного файла ""%1"": + |%2'"); + КомментарийЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + ИмяБезРасширения + "." + РасширениеБезТочки, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Добавление присоединенного файла'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + КомментарийЖурналаРегистрации); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + ИмяБезРасширения + "." + РасширениеБезТочки, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + КонецЕсли; + + Возврат ПрисоединенныйФайл.Ссылка; + +КонецФункции + +// Возвращает структуру, содержащую персональные настройки работы с файлами. +// +// Возвращаемое значение: +// Структура - со свойствами: +// * ПоказыватьЗанятыеФайлыПриЗавершенииРаботы - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * СпрашиватьРежимРедактированияПриОткрытииФайла - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * ПоказыватьКолонкуРазмер - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * ДействиеПоДвойномуЩелчкуМыши - Строка - Существует, только если внедрена подсистема Работа с +// файлами. +// * СпособСравненияВерсийФайлов - Строка - Существует, только если внедрена подсистема Работа с +// файлами. +// * ГрафическиеСхемыРасширение - Строка - Список расширений для графических схем. +// * ГрафическиеСхемыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия графических схем. +// * ТекстовыеФайлыРасширение - Строка - Расширения файлов открытого формата документов. +// * ТекстовыеФайлыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия текстовых файлов. +// * МаксимальныйРазмерЛокальногоКэшаФайлов - Число - Определяет максимальный размер локального кэша файлов. +// * ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов - Булево - Задавать вопрос при удалении файлов из локального кэша. +// * ПоказыватьИнформациюЧтоФайлНеБылИзменен - Булево - Показывать файлы при завершении работы. +// * ПоказыватьПодсказкиПриРедактированииФайлов - Булево - В веб-клиенте показывать подсказки при +// редактировании файлов. +// * ПутьКЛокальномуКэшуФайлов - Строка - Путь к локальному кэшу файлов. +// * ЭтоПолноправныйПользователь - Булево - Истина, если это полноправный пользователь. +// * УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования - Булево - удаления файлов из локального кэша при +// завершении редактирования. +// +Функция НастройкиРаботыСФайлами() Экспорт + + Возврат РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + +КонецФункции + +// Возвращает максимальный размер файла. +// +// Возвращаемое значение: +// Число - целое число байт. +// +Функция МаксимальныйРазмерФайла() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + РазделениеВключеноИДоступноИспользование = (ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); + + ИмяКонстанты = ?(РазделениеВключеноИДоступноИспользование, "МаксимальныйРазмерФайлаОбластиДанных", "МаксимальныйРазмерФайла"); + + МаксимальныйРазмерФайла = Константы[ИмяКонстанты].Получить(); + + Если НЕ ЗначениеЗаполнено(МаксимальныйРазмерФайла) Тогда + МаксимальныйРазмерФайла = 52428800; // 50*1024*1024 = 50 Мб + Константы[ИмяКонстанты].Установить(МаксимальныйРазмерФайла); + КонецЕсли; + + Если РазделениеВключеноИДоступноИспользование Тогда + ГлобальныйМаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); + ГлобальныйМаксимальныйРазмерФайла = ?(ЗначениеЗаполнено(ГлобальныйМаксимальныйРазмерФайла), + ГлобальныйМаксимальныйРазмерФайла, 52428800); + МаксимальныйРазмерФайла = Мин(МаксимальныйРазмерФайла, ГлобальныйМаксимальныйРазмерФайла); + КонецЕсли; + + Возврат МаксимальныйРазмерФайла; + +КонецФункции + +// Возвращает максимальный размер файла провайдера. +// +// Возвращаемое значение: +// Число - целое число байт. +// +Функция МаксимальныйРазмерФайлаОбщий() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + МаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); + + Если МаксимальныйРазмерФайла = Неопределено + ИЛИ МаксимальныйРазмерФайла = 0 Тогда + + МаксимальныйРазмерФайла = 50*1024*1024; // 50 мб + Константы.МаксимальныйРазмерФайла.Установить(МаксимальныйРазмерФайла); + КонецЕсли; + + Возврат МаксимальныйРазмерФайла; + +КонецФункции + +// Сохраняет настройки работы с файлами. +// +// Параметры: +// НастройкиРаботыСФайлами - Структура - настройки работы с файлами с их значениями. +// * ПоказыватьИнформациюЧтоФайлНеБылИзменен - Булево - Необязательный. Показывать сообщение, если файл не +// был изменен. +// * ПоказыватьЗанятыеФайлыПриЗавершенииРаботы - Булево - Необязательный. Показывать файлы при завершении работы. +// * ПоказыватьКолонкуРазмер - Булево - Необязательный. Отображать колонку размер в формах +// списках файлов. +// * ТекстовыеФайлыРасширение - Строка - Расширения файлов открытого формата документов. +// * ТекстовыеФайлыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия текстовых файлов. +// * ГрафическиеСхемыРасширение - Строка - Список расширений графических файлов. +// * ПоказыватьПодсказкиПриРедактированииФайлов - Булево - Необязательный. В веб-клиенте показывать подсказки +// при редактировании файлов. +// * СпрашиватьРежимРедактированияПриОткрытииФайла - Булево - Необязательный. Выбирать режим редактирования при +// открытии файла. +// * СпособСравненияВерсийФайлов - ПеречислениеСсылка.СпособыСравненияВерсийФайлов - +// Необязательный. Способ сравнения версий и файлов. +// * ДействиеПоДвойномуЩелчкуМыши - ПеречислениеСсылка.ДействияСФайламиПоДвойномуЩелчку - Необязательный. +// * ГрафическиеСхемыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - +// Необязательный. Способ открытия файла на просмотр. +// +Процедура СохранитьНастройкиРаботыСФайлами(НастройкиРаботыСФайлами) Экспорт + + КлючиОбъектовНастроекРаботыСФайлами = КлючиОбъектовНастроекРаботыСФайлами(); + + Для Каждого Настройка Из НастройкиРаботыСФайлами Цикл + + КлючОбъектаНастройки = КлючиОбъектовНастроекРаботыСФайлами[Настройка.Ключ]; + Если КлючОбъектаНастройки <> Неопределено Тогда + Если СтрНачинаетсяС(КлючОбъектаНастройки, "НастройкиОткрытияФайлов\") Тогда + ТипФайловНастройки = СтрЗаменить(КлючОбъектаНастройки, "НастройкиОткрытияФайлов\", ""); + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъектаНастройки, + СтрЗаменить(Настройка.Ключ, ТипФайловНастройки, ""), Настройка.Значение); + Иначе + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъектаНастройки, Настройка.Ключ, Настройка.Значение); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Описание"); + РедактируемыеРеквизиты.Добавить("Редактирует"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +// Конвертирует файлы из подсистемы Работа с файлами в подсистему Присоединенные файлы. +// +// Для использования в процедурах обновления ИБ, если выполняется переход от использования +// одной подсистемы к другой в каком-либо объекте-владельце файлов. +// Выполняется последовательно для каждого элемента объекта-владельца файлов +// (элемента справочника, ПВХ, документа и т.п.). +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект для которого выполняется конвертация. +// ИмяСправочника - Строка - если требуется конвертация в указанное хранилище. +// +Процедура ИзменитьСправочникХраненияФайлов(Знач ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Возврат; + КонецЕсли; + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при конвертации присоединенных файлов подсистемы Работа с файлами + |в присоединенные файлы подсистемы Присоединенные файлы.'"); + + ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + ВладелецФайлов, ИмяСправочника, ЗаголовокОшибки); + + УстановитьПривилегированныйРежим(Истина); + + ФайлыИсточник = РаботаСФайламиСлужебныйВызовСервера.ПолучитьВсеПодчиненныеФайлы(ВладелецФайлов); + + МенеджерПрисоединенныхФайлов = Справочники[ИмяСправочника]; + + НачатьТранзакцию(); + + Попытка + + Для Каждого ФайлИсточник Из ФайлыИсточник Цикл + ФайлИсточникОбъект = ФайлИсточник.ПолучитьОбъект(); + // Установить исключительную блокировку на файл-источник, + // для того чтобы гарантировать, что в момент записи значения его реквизитов не изменится.. + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.Справочники.Файлы.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлИсточникОбъект.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + Если ЗначениеЗаполнено(ФайлИсточникОбъект.ТекущаяВерсия) Тогда + ТекущаяВерсияОбъект = ФайлИсточникОбъект.ТекущаяВерсия.ПолучитьОбъект(); + // Установить исключительную блокировку на текущую версию файла-источник, + // для того чтобы гарантировать, что в момент записи значения его реквизитов не изменится.. + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.Справочники.ВерсииФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ТекущаяВерсияОбъект.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + Иначе + ТекущаяВерсияОбъект = ФайлИсточникОбъект; + КонецЕсли; + + СсылкаНового = МенеджерПрисоединенныхФайлов.ПолучитьСсылку(); + ПрисоединенныйФайл = МенеджерПрисоединенныхФайлов.СоздатьЭлемент(); + ПрисоединенныйФайл.УстановитьСсылкуНового(СсылкаНового); + + ПрисоединенныйФайл.ВладелецФайла = ВладелецФайлов; + ПрисоединенныйФайл.Наименование = ФайлИсточникОбъект.Наименование; + ПрисоединенныйФайл.Автор = ФайлИсточникОбъект.Автор; + ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ТекущаяВерсияОбъект.ДатаМодификацииУниверсальная; + ПрисоединенныйФайл.ДатаСоздания = ФайлИсточникОбъект.ДатаСоздания; + + ПрисоединенныйФайл.Зашифрован = ФайлИсточникОбъект.Зашифрован; + ПрисоединенныйФайл.Изменил = ТекущаяВерсияОбъект.Автор; + ПрисоединенныйФайл.Описание = ФайлИсточникОбъект.Описание; + ПрисоединенныйФайл.ПодписанЭП = ФайлИсточникОбъект.ПодписанЭП; + ПрисоединенныйФайл.Размер = ТекущаяВерсияОбъект.Размер; + + ПрисоединенныйФайл.Расширение = ТекущаяВерсияОбъект.Расширение; + ПрисоединенныйФайл.Редактирует = ФайлИсточникОбъект.Редактирует; + ПрисоединенныйФайл.ТекстХранилище = ФайлИсточникОбъект.ТекстХранилище; + ПрисоединенныйФайл.ТипХраненияФайла = ТекущаяВерсияОбъект.ТипХраненияФайла; + ПрисоединенныйФайл.ПометкаУдаления = ФайлИсточникОбъект.ПометкаУдаления; + + // Если файл хранится на томе - делается ссылка на существующий файл. + ПрисоединенныйФайл.Том = ТекущаяВерсияОбъект.Том; + ПрисоединенныйФайл.ПутьКФайлу = ТекущаяВерсияОбъект.ПутьКФайлу; + + Для Каждого СертификатШифрованияСтрока Из ФайлИсточникОбъект.УдалитьСертификатыШифрования Цикл + НоваяСтрока = ПрисоединенныйФайл.УдалитьСертификатыШифрования.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СертификатШифрованияСтрока); + КонецЦикла; + + Если ЗначениеЗаполнено(ФайлИсточникОбъект.ТекущаяВерсия) Тогда + Для Каждого ЭПСтрока Из ТекущаяВерсияОбъект.УдалитьЭлектронныеПодписи Цикл + НоваяСтрока = ПрисоединенныйФайл.УдалитьЭлектронныеПодписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭПСтрока); + КонецЦикла; + КонецЕсли; + ПрисоединенныйФайл.Заполнить(Неопределено); + + ПрисоединенныйФайл.Записать(); + + Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ХранилищеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсияОбъект.Ссылка); + ДвоичныеДанные = ХранилищеФайла.Получить(); + + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = СсылкаНового; + МенеджерЗаписи.Прочитать(); + МенеджерЗаписи.Файл = СсылкаНового; + МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(); + КонецЕсли; + + ТекущаяВерсияОбъект.ПометкаУдаления = Истина; + ФайлИсточникОбъект.ПометкаУдаления = Истина; + + // Удаление ссылок на том в старом файле, что бы при удалении, файлы остались на месте. + Если ТекущаяВерсияОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + ТекущаяВерсияОбъект.ПутьКФайлу = ""; + ТекущаяВерсияОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ФайлИсточникОбъект.ПутьКФайлу = ""; + ФайлИсточникОбъект.Том = ""; + Если ЗначениеЗаполнено(ФайлИсточникОбъект.ТекущаяВерсия) Тогда + РаботаСФайламиСлужебный.ПометитьНаУдалениеВерсииФайла(ФайлИсточникОбъект.Ссылка, ТекущаяВерсияОбъект.Ссылка); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ФайлИсточникОбъект.ТекущаяВерсия) Тогда + ТекущаяВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); + ТекущаяВерсияОбъект.Записать(); + КонецЕсли; + + ФайлИсточникОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); + ФайлИсточникОбъект.Записать(); + + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +// Обработчик события ПриЗаписиНаСервере управляемой формы владельца файла. +// +// Параметры: +// Отказ - Булево - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// ТекущийОбъект - Объект - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// ПараметрыЗаписи - Структура - стандартный параметр события ПриЗаписиНаСервере управляемой формы. +// Параметры - ДанныеФормыСтруктура - свойство Параметры управляемой формы. +// +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры) Экспорт + + Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + + РаботаСФайламиСлужебный.СкопироватьПрисоединенныеФайлы( + Параметры.ЗначениеКопирования, ТекущийОбъект); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. +// Работа с томами файлов -// Помечает/снимает пометку удаления у приложенных файлов. -Процедура ПометитьНаУдалениеПриложенныеФайлы(ВладелецФайла, ПометкаУдаления) +// Есть ли хоть один том хранения файлов. +// +// Возвращаемое значение: +// Булево - если Истина, тогда существует хотя бы один работающий том. +// +Функция ЕстьТомаХраненияФайлов() Экспорт + + УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Редактирует КАК Редактирует + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина |ИЗ - | Справочник.Файлы КАК Файлы + | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов |ГДЕ - | Файлы.ВладелецФайла = &ВладелецФайла"; + | ТомаХраненияФайлов.ПометкаУдаления = ЛОЖЬ"; - Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + Возврат НЕ Запрос.Выполнить().Пустой(); - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - Если ПометкаУдаления И ЗначениеЗаполнено(Выборка.Редактирует) Тогда +КонецФункции + +// Возвращает ссылки на объекты с файлами. +// +// Используется совместно с функцией СконвертироватьФайлыВПрисоединенные. +// +// Параметры: +// ТаблицаВладельцевФайлов - Строка - полное имя объекта метаданных, +// который может владеть присоединенными файлами. +// +// Возвращаемое значение: +// Массив - со значениями: +// * Ссылка - ссылка на объект у которого есть хотя бы один присоединенный файл. +// +Функция СсылкиНаОбъектыСФайлами(Знач ТаблицаВладельцевФайлов) Экспорт + + Возврат РаботаСФайламиСлужебный.СсылкиНаОбъектыСФайлами(ТаблицаВладельцевФайлов); + +КонецФункции + +// Добавляет подпись к файлу. +// Параметры: +// ПрисоединенныйФайл - Ссылка - ссылка на присоединенный файл. +// +// СвойстваПодписи - Структура - содержит данные, которые возвращает процедура Подписать +// общего модуля ЭлектроннаяПодписьКлиент в качестве результата. +// - Массив - массив описанных выше структур. +// +// ИдентификаторФормы - УникальныйИдентификатор - если указан, то используется при блокировке объекта. +// +Процедура ДобавитьПодписьКФайлу(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы = Неопределено) Экспорт + + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ПрисоединенныйФайл)) Тогда + СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, "Редактирует, Зашифрован"); + ПрисоединенныйФайлСсылка = ПрисоединенныйФайл; + Иначе + СтруктураРеквизитов = Новый Структура("Редактирует, Зашифрован"); + СтруктураРеквизитов.Редактирует = ПрисоединенныйФайл.Редактирует; + СтруктураРеквизитов.Зашифрован = ПрисоединенныйФайл.Зашифрован; + ПрисоединенныйФайлСсылка = ПрисоединенныйФайл.Ссылка; + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ДобавитьПодписьКФайлу", "ПрисоединенныйФайл", + ПрисоединенныйФайлСсылка, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип); + + Если ЗначениеЗаполнено(СтруктураРеквизитов.Редактирует) Тогда + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(ПрисоединенныйФайлСсылка); + КонецЕсли; + + Если СтруктураРеквизитов.Зашифрован Тогда + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(ПрисоединенныйФайлСсылка); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + МодульЭлектроннаяПодпись.ДобавитьПодпись(ПрисоединенныйФайл, СвойстваПодписи, ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции. + +// Возвращает ключи объектов настроек работы с файлами. +// +Функция КлючиОбъектовНастроекРаботыСФайлами() + + КлючиОбъектовНастроекРаботыСФайлами = Новый Соответствие; + + КлючиОбъектовНастроекРаботыСФайлами.Вставить("СпрашиватьРежимРедактированияПриОткрытииФайла" ,"НастройкиОткрытияФайлов"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ДействиеПоДвойномуЩелчкуМыши", "НастройкиОткрытияФайлов"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьКолонкуРазмер" , "НастройкиПрограммы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", "НастройкиПрограммы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("СпособСравненияВерсийФайлов", "НастройкиСравненияФайлов"); + + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ТекстовыеФайлыРасширение" , "НастройкиОткрытияФайлов\ТекстовыеФайлы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ТекстовыеФайлыСпособОткрытия" , "НастройкиОткрытияФайлов\ТекстовыеФайлы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ГрафическиеСхемыРасширение" , "НастройкиОткрытияФайлов\ГрафическиеСхемы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ГрафическиеСхемыСпособОткрытия" ,"НастройкиОткрытияФайлов\ГрафическиеСхемы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьПодсказкиПриРедактированииФайлов" ,"НастройкиПрограммы"); + КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьИнформациюЧтоФайлНеБылИзменен" , "НастройкиПрограммы"); + + Возврат КлючиОбъектовНастроекРаботыСФайлами; + +КонецФункции + +// Помечает/снимает пометку удаления у приложенных файлов. +Процедура ПометитьНаУдалениеПрисоединенныеФайлы(Знач Источник, ИмяСправочника = Неопределено) + + Если Источник.ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ИсточникСсылкаПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); + + Если Источник.ПометкаУдаления = ИсточникСсылкаПометкаУдаления Тогда + Возврат; + КонецЕсли; + + Попытка + ИменаСправочников = РаботаСФайламиСлужебный.ИменаСправочниковХраненияФайлов( + ТипЗнч(Источник.Ссылка)); + Исключение + ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение НСтр("ru = 'Ошибка при пометке на удаление присоединенных файлов.'") + + Символы.ПС + + ПредставлениеОшибки; + КонецПопытки; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ВладелецФайла", Источник.Ссылка); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Редактирует КАК Редактирует + |ИЗ + | &ИмяСправочника КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + + Для каждого ОписаниеИмениСправочника Из ИменаСправочников Цикл + + ПолноеИмяСправочника = "Справочник." + ОписаниеИмениСправочника.Ключ; + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Если Источник.ПометкаУдаления И ЗначениеЗаполнено(Выборка.Редактирует) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" не может быть удален, + |т.к. содержит присоединенный файл ""%2"", + |занятый для редактирования.'"), + Строка(Источник.Ссылка), + Строка(Выборка.Ссылка)); + КонецЕсли; + ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.УстановитьПометкуУдаления(Источник.ПометкаУдаления); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Возвращает текст сообщения об ошибке, добавляя к нему ссылку на элемент +// справочника хранимого файла. +// +Функция ТекстОшибкиПриПолученииФайла(Знач ИнформацияОбОшибке, Знач Файл) + + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + + Если Файл <> Неопределено Тогда + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 + | + |Ссылка на файл: ""%2"".'"), + СообщениеОбОшибке, + ПолучитьНавигационнуюСсылку(Файл) ); + КонецЕсли; + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Возвращает идентификатор владельца присоединенного файла. +Функция ПолучитьИдентификаторОбъекта(Знач ВладелецФайлов) + + ТекстЗапроса = + "ВЫБРАТЬ + | НаличиеФайлов.ИдентификаторОбъекта + |ИЗ + | РегистрСведений.НаличиеФайлов КАК НаличиеФайлов + |ГДЕ + | НаличиеФайлов.ОбъектСФайлами = &ОбъектСФайлами"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ОбъектСФайлами", ВладелецФайлов); + РезультатВыполнения = Запрос.Выполнить(); + + Если РезультатВыполнения.Пустой() Тогда + Возврат ""; + КонецЕсли; + + Выборка = РезультатВыполнения.Выбрать(); + Выборка.Следующий(); + + Возврат Выборка.ИдентификаторОбъекта; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики подписок на события. + +// Обработчик подписки на событие ПередЗаписью для заполнения авто реквизитов присоединенного файла. +// +// Параметры: +// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +Процедура ВыполнитьДействияПередЗаписьюПрисоединенногоФайла(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда + Возврат; + КонецЕсли; + + Если Источник.ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда + Возврат; + КонецЕсли; + + Если Источник.ЭтоНовый() Тогда + // Проверка права "Добавление". + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ДобавлениеФайлов", Источник.ВладелецФайла) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '""%1"" не может быть удален, - |т.к. содержит файл ""%2"", - |занятый для редактирования.'"), - Строка(ВладелецФайла), - Строка(Выборка.Ссылка)); - КонецЕсли; - ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - ФайлОбъект.УстановитьПометкуУдаления(ПометкаУдаления); - КонецЦикла; + НСтр("ru = 'Недостаточно прав для добавления файлов в папку ""%1"".'"), + Строка(Источник.ВладелецФайла)); + КонецЕсли; + Иначе + + ИзмененаПометкаУдаления = + Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); + + Если ИзмененаПометкаУдаления Тогда + // Проверка права "Пометка на удаление". + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ПометкаУдаленияФайлов", Источник.ВладелецФайла) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недостаточно прав для пометки файлов на удаление в папке ""%1"".'"), + Строка(Источник.ВладелецФайла)); + КонецЕсли; + КонецЕсли; + + Если ИзмененаПометкаУдаления И ЗначениеЗаполнено(Источник.Редактирует) Тогда + + Если Источник.Редактирует = Пользователи.АвторизованныйПользователь() Тогда + + ТекстОшибки = НСтр("ru = 'Действие недоступно, так как файл ""%1"" занят для редактирования.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Источник.Наименование); + + Иначе + ТекстОшибки = НСтр("ru = 'Действие недоступно, так как файл ""%1"" занят для редактирования + |пользователем %2.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, + Источник.Наименование, + Строка(Источник.Редактирует)); + + КонецЕсли; + + КонецЕсли; + + ЗаписьПодписанногоОбъекта = Ложь; + Если Источник.ДополнительныеСвойства.Свойство("ЗаписьПодписанногоОбъекта") Тогда + ЗаписьПодписанногоОбъекта = Источник.ДополнительныеСвойства.ЗаписьПодписанногоОбъекта; + КонецЕсли; + + Если ЗаписьПодписанногоОбъекта <> Истина Тогда + + СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Источник.Ссылка, + "ПодписанЭП, Зашифрован, Редактирует"); + + СсылкаПодписан = СтруктураРеквизитов.ПодписанЭП; + СсылкаЗашифрован = СтруктураРеквизитов.Зашифрован; + СсылкаРедактирует = СтруктураРеквизитов.Редактирует; + СсылкаЗанят = ЗначениеЗаполнено(СтруктураРеквизитов.Редактирует); + Занят = ЗначениеЗаполнено(Источник.Редактирует); + + Если Не Источник.ЭтоГруппа И Источник.ПодписанЭП И СсылкаПодписан И Занят И Не СсылкаЗанят Тогда + ВызватьИсключение НСтр("ru = 'Подписанный файл нельзя редактировать.'"); + КонецЕсли; + + Если Не Источник.ЭтоГруппа И Источник.Зашифрован И СсылкаЗашифрован И Источник.ПодписанЭП И НЕ СсылкаПодписан Тогда + ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); + КонецЕсли; + + КонецЕсли; + + СправочникПоддерживаетВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(Источник))); + + Если Не Источник.ЭтоГруппа И СправочникПоддерживаетВозможностьХранитьВерсии И ЗначениеЗаполнено(Источник.ТекущаяВерсия) Тогда + + РеквизитыТекущейВерсии = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( + Источник.ТекущаяВерсия, "Наименование"); + + // Проверим равенство имени файла и его текущей версии. + // Если имена отличаются - имя у версии должно стать как у карточки с файлом. + Если РеквизитыТекущейВерсии.Наименование <> Источник.Наименование + И ЗначениеЗаполнено(Источник.ТекущаяВерсия) Тогда + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить( + Метаданные.НайтиПоТипу(ТипЗнч(Источник.ТекущаяВерсия)).ПолноеИмя()); + + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Источник.ТекущаяВерсия); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + Объект = Источник.ТекущаяВерсия.ПолучитьОбъект(); + + Если Объект <> Неопределено Тогда + УстановитьПривилегированныйРежим(Истина); + Объект.Наименование = Источник.Наименование; + // Чтобы не сработала подписка СкопироватьРеквизитыВерсииФайловВФайл. + Объект.ДополнительныеСвойства.Вставить("ПереименованиеФайла", Истина); + Объект.Записать(); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(Источник.ВладелецФайла) Тогда + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не заполнен владелец в файле + |""%1"".'"), + Источник.Наименование); + + Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Ошибка записи файла при обновлении ИБ'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + Источник.Ссылка, + ОписаниеОшибки); + Иначе + ВызватьИсключение ОписаниеОшибки; + КонецЕсли; + + КонецЕсли; + + Если Источник.ЭтоГруппа Тогда + Источник.ИндексКартинки = 2; + Иначе + Источник.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Источник.Расширение); + КонецЕсли; + + Если Источник.ЭтоНовый() И Не ЗначениеЗаполнено(Источник.Автор) Тогда + Источник.Автор = Пользователи.АвторизованныйПользователь(); + КонецЕсли; + +КонецПроцедуры + +// Обработчик подписки на событие ПередУдалением для удаления данных, связанных с присоединенным файлом. +// +// Параметры: +// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +Процедура ВыполнитьДействияПередУдалениемПрисоединенногоФайла(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебный.ПередУдалениемПрисоединенногоФайлаСервер( + Источник.Ссылка, + Источник.ВладелецФайла, + Источник.Том, + Источник.ТипХраненияФайла, + Источник.ПутьКФайлу); + +КонецПроцедуры + +// Обработчик подписки на событие ПриЗаписи для обновления данных, связанных с присоединенным файлом. +// +// Параметры: +// Источник - СправочникОбъект - объект справочника с именем "*ПрисоединенныеФайлы". +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +Процедура ВыполнитьДействияПриЗаписиПрисоединенногоФайла(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + ЗаписатьДанныеФайлаВРегистрПриОбмене(Источник); + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебный.ПриЗаписиПрисоединенногоФайлаСервер( + Источник.ВладелецФайла, Источник.Ссылка); + + РаботаСФайламиСлужебный.ОбновитьСостояниеОчередиИзвлеченияТекста( + Источник.Ссылка, Источник.СтатусИзвлеченияТекста); + +КонецПроцедуры + +Процедура ЗаписатьДанныеФайлаВРегистрПриОбмене(Знач Источник) + + Перем ДвоичныеДанныеФайла; + + Если Источник.ДополнительныеСвойства.Свойство("ДвоичныеДанныеФайла", ДвоичныеДанныеФайла) Тогда + НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Файл.Использование = Истина; + НаборЗаписей.Отбор.Файл.Значение = Источник.Ссылка; + + Запись = НаборЗаписей.Добавить(); + Запись.Файл = Источник.Ссылка; + Запись.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9)); + + НаборЗаписей.ОбменДанными.Загрузка = Истина; + НаборЗаписей.Записать(); + + Источник.ДополнительныеСвойства.Удалить("ДвоичныеДанныеФайла"); + КонецЕсли; + +КонецПроцедуры + +// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. +// Помечает на удаление связанные файлы. +// +// Параметры: +// Источник - Объект - владелец присоединенного файла, кроме ДокументОбъект. +// Отказ - Булево - признак отказа от записи. +// +Процедура УстановитьПометкуУдаленияПрисоединенныхФайлов(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда + Возврат; + КонецЕсли; + + ПометитьНаУдалениеПрисоединенныеФайлы(Источник); + +КонецПроцедуры + +// Обработчик подписки на событие ПередЗаписью владельца присоединенного файла. +// Помечает на удаление связанные файлы. +// +// Параметры: +// Источник - ДокументОбъект - владелец присоединенного файла. +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +Процедура УстановитьПометкуУдаленияПрисоединенныхФайловДокументов(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ПометитьНаУдалениеПрисоединенныеФайлы(Источник); КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl index 6312729ed..4bf0b2a25 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -5,17 +5,58 @@ #Область ПрограммныйИнтерфейс +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функция для работы со сканером. + +// Открывает форму настройки сканирования. +Процедура ОткрытьФормуНастройкиСканирования() Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + ТекстСообщения = НСтр("ru = 'Сканирование поддерживается только в клиенте под управлением ОС Windows.'"); + ПоказатьПредупреждение(, ТекстСообщения); + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда + ТекстСообщения = НСтр("ru = 'Сканирование не поддерживается в веб-клиенте.'"); + ПоказатьПредупреждение(, ТекстСообщения); + Возврат; + КонецЕсли; + + КомпонентаУстановлена = РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(); + + Если Не КомпонентаУстановлена Тогда + ТекстВопроса = НСтр("ru = 'Для продолжения работы необходимо установить компоненту сканирования. + |Установить компоненту?'"); + Обработчик = Новый ОписаниеОповещения("ПоказатьВопросУстановкиКомпонентыСканирования", ЭтотОбъект, КомпонентаУстановлена); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + + ОткрытьФормуНастройкиСканированияЗавершение(КомпонентаУстановлена, Неопределено); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Команды работы с файлами -// Открывает файл для просмотра. +// Открывает файл для просмотра или редактирования. +// Если файл открывается для просмотра, тогда получает файл в рабочий каталог пользователя, +// при этом ищет файл в рабочем каталоге и предлагает открыть существующий или получить файл с сервера. +// Если файл открывается для редактирования, тогда открывает файл в рабочем каталоге (если есть) или +// получает его с сервера. // // Параметры: -// ДанныеФайла - Структура - структура с данными файла. +// ДанныеФайла - Структура - данные файла. +// ДляРедактирования - Булево - Истина, если файл открывается для редактирования, иначе Ложь. // -Процедура Открыть(ДанныеФайла) Экспорт +Процедура ОткрытьФайл(Знач ДанныеФайла, Знач ДляРедактирования = Ложь) Экспорт - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); + Если ДляРедактирования Тогда + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Неопределено, ДанныеФайла); + Иначе + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); + КонецЕсли; КонецПроцедуры @@ -30,6 +71,35 @@ КонецПроцедуры +// Обработчик команды добавления файлов. +// Предлагает пользователю выбирать файлы в диалоге выбора файлов и +// пытается поместить выбранные файлы в хранилище файлов, когда: +// - размер файла не превышает максимально допустимый, +// - файл имеет допустимое расширение, +// - имеется свободное место в томе (при хранении файлов в томах), +// - прочие условия. +// +// Параметры: +// ВладелецФайла - Ссылка - владелец файла. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. +// Фильтр - Строка - необязательный параметр, +// позволяет задать фильтр выбираемого файла, +// например, картинки для номенклатуры. +// ГруппаФайлов - Ссылка - группа справочника с файлами, в которую будет добавлен новый файл. +// +Процедура ДобавитьФайлы(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач Фильтр = "", ГруппаФайлов = Неопределено) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ВладелецФайла", ВладелецФайла); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Параметры.Вставить("Фильтр", Фильтр); + Параметры.Вставить("ГруппаФайлов", ГруппаФайлов); + + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыРасширениеПредложено", РаботаСФайламиСлужебныйКлиент, Параметры); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + // Создает новый файл интерактивно. // // Параметры: @@ -40,7 +110,7 @@ // // ФормаВладелец - УправляемаяФорма - форма, из которой вызвано создание файла. // -// РежимСоздания - режим создания файла: +// РежимСоздания - Неопределено, Число - режим создания файла: // - Неопределено - значение по умолчанию. Показать диалог выбора режима создания файла. // - Число - Создать файл указанным способом: // * 1 - из шаблона (копированием другого файла), @@ -63,7 +133,6 @@ ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ВладелецФайла", ВладелецФайла); - ПараметрыВыполнения.Вставить("ЭтоФайл", Истина); ПараметрыВыполнения.Вставить("ФормаВладелец", ФормаВладелец); ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточку); РаботаСФайламиСлужебныйКлиент.ДобавитьПослеВыбораРежимаСоздания(РежимСоздания, ПараметрыВыполнения); @@ -71,9 +140,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Дополнительные процедуры и функции для работы с файлами. - // Открывает форму для настройки рабочего каталога. Процедура ОткрытьФормуНастройкиРабочегоКаталога() Экспорт @@ -82,13 +148,12 @@ КонецПроцедуры // Задает вопрос о продолжении закрытия формы если в форме остались захваченные файлы: -// "Один или несколько файлов заняты вами для редактирования. Продолжить?" +// "Один или несколько файлов заняты для редактирования. Продолжить?" // Вызывается из ПередЗакрытием форм с файлами. // // По ссылке объекта проверяет остались ли захваченные файлы. -// Если захваченные файлы остались: -// - В параметре Отказ устанавливается значение Истина, -// - Пользователю задается вопрос. +// Если захваченные файлы остались, в параметре Отказ устанавливается значение Истина, +// Пользователю задается вопрос. // Если пользователь ответил утвердительно, тогда форма снова закрывается. // // Параметры: @@ -130,7 +195,7 @@ Отказ = Истина; - ТекстВопроса = НСтр("ru = 'Один или несколько файлов заняты вами для редактирования. + ТекстВопроса = НСтр("ru = 'Один или несколько файлов заняты для редактирования. | |Продолжить?'"); ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(Форма, Отказ, ЗавершениеРаботы, ТекстВопроса, ИмяРеквизита); @@ -146,104 +211,282 @@ Процедура СкопироватьФайл(ВладелецФайла, ФайлОснование) Экспорт ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ФайлОснование", ФайлОснование); + ПараметрыФормы.Вставить("ЗначениеКопирования", ФайлОснование); ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайла); ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы); КонецПроцедуры +// Сохраняет файл вместе вместе с ЭП. +// Используется в обработчике команды сохранения файла. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. +// +Процедура СохранитьВместеСЭП(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы) Экспорт + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ПрисоединенныйФайл); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + ОписаниеДанных = Новый Структура; + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); + ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка); + Если ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия) Тогда + ОписаниеДанных.Вставить("Объект", ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия); + Иначе + ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); + КонецЕсли; + + ОписаниеДанных.Вставить("Данные", + Новый ОписаниеОповещения("ПриСохраненииДанныхФайла", РаботаСФайламиСлужебныйКлиент, ПараметрыВыполнения)); + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью(ОписаниеДанных); + +КонецПроцедуры + +// Сохраняет файл в каталог на диске. +// Так же используется, как вспомогательная функция при сохранении файла с ЭП. +// +// Параметры: +// ДанныеФайла - Структура - данные файла. +// +// Возвращаемое значение: +// Строка - имя сохраненного файла. +// +Процедура СохранитьФайлКак(Знач ДанныеФайла) Экспорт + + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); + +КонецПроцедуры + +// Открывает форму файла из формы элемента +// справочника файлов. Форма элемента закрывается. +// +// Параметры: +// Форма - УправляемаяФорма - форма справочника присоединенных файлов. +// +Процедура ПерейтиКФормеФайла(Знач Форма) Экспорт + + ПрисоединенныйФайл = Форма.Ключ; + + Форма.Закрыть(); + + Для Каждого ОкноКП Из ПолучитьОкна() Цикл + + Содержимое = ОкноКП.ПолучитьСодержимое(); + + Если Содержимое = Неопределено Тогда + Продолжить; + КонецЕсли; + + Если Содержимое.ИмяФормы = "Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл" Тогда + Если Содержимое.Параметры.Свойство("ПрисоединенныйФайл") + И Содержимое.Параметры.ПрисоединенныйФайл = ПрисоединенныйФайл Тогда + ОкноКП.Активизировать(); + Возврат; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ОткрытьФормуФайла(ПрисоединенныйФайл); + +КонецПроцедуры + +// Открывает форму выбора файлов. +// Используется в обработчике выбора для переопределения стандартного поведения. +// +// Параметры: +// ВладелецФайлов - Ссылка - ссылка на объект с файлами. +// ЭлементФормы - ТаблицаФормы, ПолеФормы - элемент формы, которому будет отправлено +// оповещение о выборе. +// СтандартнаяОбработка - Булево - (возвращаемое значение), всегда устанавливается в Ложь. +// +Процедура ОткрытьФормуВыбораФайлов(Знач ВладелецФайлов, Знач ЭлементФормы, СтандартнаяОбработка = Ложь) Экспорт + + СтандартнаяОбработка = Ложь; + + Если ВладелецФайлов.Пустая() Тогда + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОНеобходимостиЗаписиПослеЗавершения", ЭтотОбъект); + ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, + НСтр("ru = 'Данные еще не записаны. + |Переход к ""Присоединенные файлы"" возможен только после записи данных.'"), + РежимДиалогаВопрос.ОК); + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайлов); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", ПараметрыФормы, ЭлементФормы); + КонецЕсли; + +КонецПроцедуры + +// Открывает форму файла. +// Может использоваться как обработчик открытия файла. +// +// Параметры: +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// СтандартнаяОбработка - Булево - (возвращаемое значение), всегда устанавливается в Ложь. +// +Процедура ОткрытьФормуФайла(Знач ПрисоединенныйФайл, СтандартнаяОбработка = Ложь) Экспорт + + СтандартнаяОбработка = Ложь; + + Если ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + + КонецЕсли; + +КонецПроцедуры + // Выполняет печать файлов. // // Параметры: // ДанныеФайлов - Массив - массив структур с данными файлов. // ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. // -Процедура НапечататьФайлы(ДанныеФайлов, УникальныйИдентификатор = Неопределено) Экспорт +Процедура НапечататьФайлы(ДанныеФайлов, ИдентификаторФормы = Неопределено) Экспорт ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("НомерФайла", 0); + ПараметрыВыполнения.Вставить("НомерФайла", 0); ПараметрыВыполнения.Вставить("ДанныеФайлов", ДанныеФайлов); - ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайлов); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", ИдентификаторФормы); Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); ВыполнитьОбработкуОповещения(Обработчик); КонецПроцедуры -// Процедура печати Файла +// Подписывает файл. // // Параметры: -// ОбработчикРезультата - ОписаниеОповещения для дальнейшего вызова. -// ПараметрыВыполнения - Структура - со свойствами: -// * НомерФайла - Число - номер текущего файла, -// * ДанныеФайла - Структура - данные файла, -// * УникальныйИдентификатор - УникальныйИдентификатор. +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. +// ДополнительныеПараметры - Неопределено - стандартное поведение (см. ниже). +// - Структура - со свойствами: +// * ДанныеФайла - Структура - данные файла, если свойства нет, будет вставлено. +// * ОбработкаРезультата - ОписаниеОповещения - при вызове передается значение типа Булево, +// если Истина - файл успешно подписан, иначе не подписан, +// если свойства нет, оповещение не будет вызвано. // -Процедура НапечататьФайлыВыполнение(ОбработчикРезультата, ПараметрыВыполнения) Экспорт +Процедура ПодписатьФайл(ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - ОбработкаПрерыванияПользователя(); - - Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда + Если Не ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не выбран файл, который нужно подписать.'")); Возврат; КонецЕсли; - ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ПараметрыВыполнения.НомерФайла]; - Обработчик = Новый ОписаниеОповещения("НапечататьФайлПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); - РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - Обработчик, - ДанныеФайла, - "", - ПараметрыВыполнения.УникальныйИдентификатор); + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Добавление электронных подписей не поддерживается.'")); + Возврат; + КонецЕсли; + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + + Если Не МодульЭлектроннаяПодписьКлиент.ИспользоватьЭлектронныеПодписи() Тогда + ПоказатьПредупреждение(, + НСтр("ru = 'Чтобы добавить электронную подпись, включите + |в настройках программы использование электронных подписей.'")); + Возврат; + КонецЕсли; + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + + Если Не ДополнительныеПараметры.Свойство("ДанныеФайла") Тогда + ДополнительныеПараметры.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла( + ПрисоединенныйФайл, ИдентификаторФормы)); + КонецЕсли; + + ОбработкаРезультата = Неопределено; + ДополнительныеПараметры.Свойство("ОбработкаРезультата", ОбработкаРезультата); + + РаботаСФайламиСлужебныйКлиент.ПодписатьФайл(ПрисоединенныйФайл, + ДополнительныеПараметры.ДанныеФайла, ИдентификаторФормы, ОбработкаРезультата); КонецПроцедуры -// Процедура печати Файла после получения на диск +// См. РаботаСФайлами.ДанныеФайла. +Функция ДанныеФайла(Знач ФайлСсылка, + Знач ИдентификаторФормы = Неопределено, + Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, + Знач ДляРедактирования = Ложь) Экспорт + + Возврат РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( + ФайлСсылка, + ИдентификаторФормы, + ПолучатьСсылкуНаДвоичныеДанные, + ДляРедактирования); + +КонецФункции + +// Получает файл из хранилища файлов в рабочий каталог пользователя. +// Аналог интерактивного действия Просмотреть или Редактировать без открытия полученного файла. +// Свойство ТолькоПросмотр полученного файла будет установлено в зависимости от того захвачен +// файл для редактирования или нет. Если не захвачен - устанавливается только просмотр. +// Если в рабочем каталоге уже существует файл, тогда он будет удален и заменен файлом, +// полученным из хранилища файлов. // // Параметры: -// ПараметрыВыполнения - Структура - со свойствами: -// * НомерФайла - Число - номер текущего файла, -// * ДанныеФайла - Структура - данные файла, -// * УникальныйИдентификатор - УникальныйИдентификатор. +// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения файла в +// рабочий каталог пользователя. В качестве результата возвращается Структура со свойствами: +// * ПолноеИмяФайла - Строка - полное имя файла (с путем). +// * ОписаниеОшибки - Строка - текст ошибки, если получить файл не удалось. // -Процедура НапечататьФайлПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт - - Если Результат.ФайлПолучен Тогда - - Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда - Возврат; - КонецЕсли; - ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ПараметрыВыполнения.НомерФайла]; +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. +// +// ДополнительныеПараметры - Неопределено - использовать значения по умолчанию. +// - Структура - с необязательными свойствами: +// * ДляРедактирования - Булево - начальное значение Ложь. Если Истина, +// тогда файл будет захвачен для редактирования. +// * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения +// если они ранее были получены на клиент с сервера. +// +Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - НапечататьФайлПриложением(ДанныеФайла, Результат.ПолноеИмяФайла); - - КонецЕсли; - - // переходим к печати следующего файла. - ПараметрыВыполнения.НомерФайла = ПараметрыВыполнения.НомерФайла + 1; - Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); - ВыполнитьОбработкуОповещения(Обработчик); + РаботаСФайламиСлужебныйКлиент.ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры); КонецПроцедуры -// Выполняет печать файла внешним приложением. +// Помещает файл из рабочего каталога пользователя в хранилище файлов. +// Аналог интерактивного действия Закончить редактирование. // -// Параметры -// ИмяОткрываемогоФайла - Строка - полное имя файла. +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после помещения файла в +// хранилище файлов. В качестве результата возвращается Структура со свойствами: +// * ОписаниеОшибки - Строка - текст ошибки, если поместить файл не удалось. // -Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) Экспорт +// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы". +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы. +// +// ДополнительныеПараметры - Неопределено - использовать значения по умолчанию. +// - Структура - с необязательными свойствами: +// * ПолноеИмяФайла - Строка - если заполнено, то указанный файл будет помещен в рабочий каталог +// пользователя, а затем в хранилище файлов. +// * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения +// если они ранее были получены на клиент с сервера. +// +Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт - Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда - Возврат; - КонецЕсли; - - СистемнаяИнфо = Новый СистемнаяИнформация; - Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - - Shell = Новый COMОбъект("Shell.Application"); - Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); - - КонецЕсли; + РаботаСФайламиСлужебныйКлиент.ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры); КонецПроцедуры @@ -277,12 +520,6 @@ Схема.Прочитать(ИмяОткрываемогоФайла); Схема.Напечатать();; - ИначеЕсли Расширение = "mxl" Тогда - - ТабличныйДокумент = Новый ТабличныйДокумент; - ТабличныйДокумент.Прочитать(ИмяОткрываемогоФайла); - ТабличныйДокумент.Напечатать(); - Иначе Попытка @@ -308,4 +545,123 @@ КонецПроцедуры +// Процедура печати Файла +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения для дальнейшего вызова. +// ПараметрыВыполнения - Структура - со свойствами: +// * НомерФайла - Число - номер текущего файла, +// * ДанныеФайла - Структура - данные файла, +// * УникальныйИдентификатор - УникальныйИдентификатор. +// +Процедура НапечататьФайлыВыполнение(ОбработчикРезультата, ПараметрыВыполнения) Экспорт + + ОбработкаПрерыванияПользователя(); + + Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда + Возврат; + КонецЕсли; + ПараметрыВыполнения.ДанныеФайла = + РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляПечати(ПараметрыВыполнения.ДанныеФайлов[ПараметрыВыполнения.НомерФайла]); + + Если ПараметрыВыполнения.ДанныеФайла.Свойство("ТабличныйДокумент") Тогда + ПараметрыВыполнения.ДанныеФайла.ТабличныйДокумент.Напечатать(); + // переходим к печати следующего файла. + ПараметрыВыполнения.НомерФайла = ПараметрыВыполнения.НомерФайла + 1; + Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); + ВыполнитьОбработкуОповещения(Обработчик); + Возврат + КонецЕсли; + Обработчик = Новый ОписаниеОповещения("НапечататьФайлПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, + ПараметрыВыполнения.ДанныеФайла, + "", + ПараметрыВыполнения.УникальныйИдентификатор); + +КонецПроцедуры + +// Процедура печати Файла после получения на диск +// +// Параметры: +// ПараметрыВыполнения - Структура - со свойствами: +// * НомерФайла - Число - номер текущего файла, +// * ДанныеФайла - Структура - данные файла, +// * УникальныйИдентификатор - УникальныйИдентификатор. +// +Процедура НапечататьФайлПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ФайлПолучен Тогда + + Если ПараметрыВыполнения.НомерФайла >= ПараметрыВыполнения.ДанныеФайлов.Количество() Тогда + Возврат; + КонецЕсли; + + НапечататьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); + + КонецЕсли; + + // переходим к печати следующего файла. + ПараметрыВыполнения.НомерФайла = ПараметрыВыполнения.НомерФайла + 1; + Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения); + ВыполнитьОбработкуОповещения(Обработчик); + +КонецПроцедуры + +// Выполняет печать файла внешним приложением. +// +// Параметры +// ИмяОткрываемогоФайла - Строка - полное имя файла. +// +Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) + + Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда + Возврат; + КонецЕсли; + + СистемнаяИнфо = Новый СистемнаяИнформация; + Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 + Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + + Shell = Новый COMОбъект("Shell.Application"); + Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); + + КонецЕсли; + +КонецПроцедуры + +Функция ПоказатьВопросУстановкиКомпонентыСканирования(Результат, КомпонентаУстановлена) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьФормуНастройкиСканированияЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.УстановитьКомпоненту(Обработчик); + КонецЕсли; + +КонецФункции + +Процедура ОткрытьФормуНастройкиСканированияЗавершение(КомпонентаУстановлена, ПараметрыВыполнения) Экспорт + + Если Не КомпонентаУстановлена Тогда + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("КомпонентаУстановлена", КомпонентаУстановлена); + ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); + + ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканирования", ПараметрыФормы); + +КонецПроцедуры + +Процедура ВопросОНеобходимостиЗаписиПослеЗавершения(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl index de6118059..9cb1545d2 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl @@ -3,6 +3,40 @@ // //////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс +//////////////////////////////////////////////////////////////////////////////// +// Обработчики подписок на события. + +// См. РаботаСФайлами.ОпределитьФормуПрисоединенногоФайла. +// Обработчик подписки на событие ОбработкаПолученияФормы для переопределения формы файла. +// +// Параметры: +// Источник - СправочникМенеджер - менеджер справочника с именем "*ПрисоединенныеФайлы". +// ВидФормы - Строка - имя стандартной формы. +// Параметры - Структура - параметры формы. +// ВыбраннаяФорма - Строка - имя или объект метаданных открываемой формы. +// ДополнительнаяИнформация - Структура - дополнительная информация открытия формы. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. +// +Процедура ОпределитьФормуПрисоединенногоФайла(Источник, + ВидФормы, + Параметры, + ВыбраннаяФорма, + ДополнительнаяИнформация, + СтандартнаяОбработка) Экспорт + + РаботаСФайламиСлужебныйВызовСервера.ОпределитьФормуПрисоединенногоФайла( + Источник, + ВидФормы, + Параметры, + ВыбраннаяФорма, + ДополнительнаяИнформация, + СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс // Инициализирует структуру со сведениями о файле. @@ -39,7 +73,8 @@ Результат.Вставить("Комментарий", ""); Результат.Вставить("АдресВременногоХранилищаТекста"); Результат.Вставить("ХранитьВерсии", Истина); - Результат.Вставить("Автор"); + Результат.Вставить("Автор"); + Результат.Вставить("ИмяСправочникаХранилищаФайлов", "Файлы"); Если Режим = "ФайлСВерсией" Тогда Результат.Вставить("РасширениеБезТочки"); Результат.Вставить("ВремяИзменения", Дата('00010101')); @@ -93,7 +128,7 @@ Возврат Ложь; КонецЕсли; - Результат = Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Или ДанныеФайла.РедактируетТекущийПользователь; + Результат = Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Или ДанныеФайла.ФайлРедактируетТекущийПользователь; Если Не Результат Тогда СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" @@ -119,4 +154,4 @@ КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl index db7e8cf94..6cce1db35 100644 --- a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -5,7 +5,44 @@ #Область ПрограммныйИнтерфейс -// Можно ли занять данный файл. +// Переопределение настроек присоединенных файлов. +// +// Параметры: +// Настройки - Структура - со свойствам: +// * НеОчищатьФайлы - Массив - объекты, файлы которых не должны выводиться в настройках очистки файлов +// (например, служебные документы). +// * НеСинхронизироватьФайлы - Массив - объекты, файлы которых не должны выводиться в настройках синхронизации +// с облачными сервисами (например, служебные документы). +// * НеСоздаватьФайлыПоШаблону - Массив - объекты, для файлов которых отключена возможность создавать файлы +// по шаблонам. +// +// Пример: +// Настройки.НеОчищатьФайлы.Добавить(Метаданные.Справочники._ДемоПартнеры); +// Настройки.НеСинхронизироватьФайлы.Добавить(Метаданные.Справочники._ДемоПартнеры); +// Настройки.НеСоздаватьФайлыПоШаблону.Добавить(Метаданные.Справочники._ДемоПартнеры); +// +Процедура ПриОпределенииНастроек(Настройки) Экспорт + +КонецПроцедуры + +// Позволяет переопределить справочники хранения файлов по типам владельцев. +// +// Параметры: +// ТипВладелецФайла - Тип - тип ссылки объекта, к которому добавляется файл. +// +// ИменаСправочников - Соответствие - содержит в ключах имена справочников. +// При вызове содержит стандартное имя одного справочника, +// помеченного, как основной (если существует). +// Основной справочник используется для интерактивного +// взаимодействия с пользователем. Чтобы указать основной +// справочник, нужно установить Истина в значение соответствия. +// Если установить Истина более одного раза, тогда будет ошибка. +// +Процедура ПриОпределенииСправочниковХраненияФайлов(ТипВладелецФайла, ИменаСправочников) Экспорт + +КонецПроцедуры + +// Позволяет отменить захват файла на основе анализа структуры с данными файла. // // Параметры: // ДанныеФайла - Структура - с данными файла. @@ -14,11 +51,10 @@ // Процедура ПриПопыткеЗанятьФайл(ДанныеФайла, ОписаниеОшибки = "") Экспорт - - КонецПроцедуры -// Вызывается при создании файла. +// Вызывается при создании файла. Например, может использоваться для обработки логически связанных данных, +// которые должны изменяться при создании новых файлов. // // Параметры: // Файл - СправочникСсылка.Файлы - ссылка на созданный файл. @@ -38,48 +74,67 @@ КонецПроцедуры -// Вызывается при захвате файла. +// Вызывается при захвате файла. Позволяет изменить структуру с данными файла перед захватом. // // Параметры: // ДанныеФайла - Структура - содержащая сведения о файле // см. функцию РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(). // -// УникальныйИдентификатор - уникальный идентификатор формы. +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор) Экспорт КонецПроцедуры -// Вызывается при освобождении файла. +// Вызывается при освобождении файла. Позволяет изменить структуру с данными файла при освобождении. // // Параметры: // ДанныеФайла - Структура - содержащая сведения о файле // см. функцию РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(). // -// УникальныйИдентификатор - уникальный идентификатор формы. +// УникальныйИдентификатор - - УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор) Экспорт КонецПроцедуры +// Позволяет определить параметры штампов электронной подписи в подписанном +// табличном документе. +// +// Параметры: +// ПараметрыШтампа - Структура - возвращаемый параметр, со свойствами: +// * ТекстОтметки - Строка - описание расположения подлинника подписанного документа. +// * Логотип - Картинка - логотип, который будет выведен в штампе. +// Сертификат - СертификатКриптографии - сертификат, по которому формируется штамп электронной подписи. +// +Процедура ПриПечатиФайлаСоШтампом(ПараметрыШтампа, Сертификат) Экспорт + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(). +// // Формирует массив метаданных, которые не должны выводиться в настройках очистки файлов. // // Параметры: // МассивИсключений - Массив - метаданные, которые не должны выводиться в настройках очистки файлов. // -// Например: +// Пример: // МассивИсключений.Добавить(Метаданные.Справочники.Файлы); // Процедура ПриОпределенииОбъектовИсключенияОчисткиФайлов(МассивИсключений) Экспорт КонецПроцедуры +// Устарела. Следует использовать РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(). +// // Формирует массив метаданных, которые не должны выводиться в настройках синхронизации файлов. // // Параметры: // МассивИсключений - Массив - метаданные, которые не должны выводиться в настройках синхронизации файлов. // -// Например: +// Пример: // МассивИсключений.Добавить(Метаданные.Справочники.Файлы); // Процедура ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(МассивИсключений) Экспорт @@ -88,3 +143,5 @@ #КонецОбласти +#КонецОбласти + diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl index 0f0785a54..c28144653 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl @@ -11,16 +11,18 @@ Если ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ОбъектФайла.Том) + ОбъектФайла.ПутьКФайлу; + ПолныйПуть = ПолныйПутьТома(ОбъектФайла.Том) + ОбъектФайла.ПутьКФайлу; КопироватьФайл(ПолныйПуть, ИмяНовогоФайла); - Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза + Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе - АдресВоВременномХранилище = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуВоВременномХранилище(ОбъектФайла.Ссылка); - ПолучитьИзВременногоХранилища(АдресВоВременномХранилище).Записать(ИмяНовогоФайла); + ДвоичныеДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ОбъектФайла.Ссылка); + ДвоичныеДанныеФайла.Записать(ИмяНовогоФайла); КонецЕсли; + ЗаполнитьПутьКФайлуПриОтправке(ОбъектФайла); + КонецПроцедуры // Используется при загрузке файлов для переходе в сервис (БТС). @@ -29,12 +31,14 @@ ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + // Добавление файла в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, + СведенияОФайле = ДобавитьФайлВТом(ДвоичныеДанные, ОбъектФайла.ДатаМодификацииУниверсальная, ОбъектФайла.Наименование, ОбъектФайла.Расширение, - ОбъектФайла.НомерВерсии, ОбъектФайла.Зашифрован); + ОбъектФайла.НомерВерсии, ПутьКФайлуПриПолученииСодержитПризнакЗашифрован(ОбъектФайла)); + ОбъектФайла.Том = СведенияОФайле.Том; ОбъектФайла.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; @@ -52,111 +56,6 @@ КонецПроцедуры -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"].Добавить( - "РаботаСФайламиСлужебныйКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "РаботаСФайламиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриУдаленииРегистрацииИзменений"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"].Добавить( - "РаботаСФайламиСлужебныйВызовСервера"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриЗаписиИзвлеченногоТекста"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваФайловВТомах"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНаличияХранимыхФайлов"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриПолученииХранимыхФайлов"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииИмениФайлаСПутемКДвоичнымДанным"].Добавить( - "РаботаСФайламиСлужебный"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РаботаСФайламиСлужебныйВызовСервера"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "РаботаСФайламиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов"].Добавить( - "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "РаботаСФайламиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - - СерверныеОбработчики["ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса\ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса"].Добавить( - "РаботаСФайламиСлужебный"); - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "РаботаСФайламиСлужебный"); - КонецЕсли; - -КонецПроцедуры - -Процедура ПриСохраненииНастроекРаботыСФайлами(КлючиОбъектовНастроекРаботыСФайлами) Экспорт - - КлючиОбъектовНастроекРаботыСФайлами.Вставить("СпрашиватьРежимРедактированияПриОткрытииФайла" ,"НастройкиОткрытияФайлов"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ДействиеПоДвойномуЩелчкуМыши", "НастройкиОткрытияФайлов"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьКолонкуРазмер" , "НастройкиПрограммы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", "НастройкиПрограммы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("СпособСравненияВерсийФайлов", "НастройкиСравненияФайлов"); - -КонецПроцедуры - -// Возвращает Истина, если это элемент данных, относящийся к подсистеме РаботаСФайлами. -// -Функция ЭтоЭлементРаботаСФайлами(ЭлементДанных) - - Возврат ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("СправочникСсылка.ВерсииФайлов"); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Процедуры используемые при обмене данными. @@ -167,7 +66,37 @@ Функция СправочникиФайлов() Экспорт Результат = Новый Массив(); + + КоллекцииМетаданных = Новый Массив(); + КоллекцииМетаданных.Добавить(Метаданные.Справочники); + КоллекцииМетаданных.Добавить(Метаданные.Документы); + КоллекцииМетаданных.Добавить(Метаданные.БизнесПроцессы); + КоллекцииМетаданных.Добавить(Метаданные.Задачи); + КоллекцииМетаданных.Добавить(Метаданные.ПланыСчетов); + КоллекцииМетаданных.Добавить(Метаданные.ПланыОбмена); + КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); + КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета); + + Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл + + Для Каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл + + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + ПустаяСсылка = МенеджерОбъекта.ПустаяСсылка(); + ИменаСправочниковХраненияФайлов = ИменаСправочниковХраненияФайлов(ПустаяСсылка, Истина); + + Для Каждого ИмяСправочникаХраненияФайлов Из ИменаСправочниковХраненияФайлов Цикл + + Результат.Добавить(Метаданные.Справочники[ИмяСправочникаХраненияФайлов.Ключ]); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + Результат.Добавить(Метаданные.Справочники.ВерсииФайлов); + Возврат Результат; КонецФункции @@ -180,7 +109,7 @@ Функция ОбъектыХраненияФайловИнформационнойБазе() Экспорт Результат = Новый Массив(); - Результат.Добавить(Метаданные.РегистрыСведений.ХранимыеФайлыВерсий); + Результат.Добавить(Метаданные.РегистрыСведений.ДвоичныеДанныеФайлов); Возврат Результат; КонецФункции @@ -195,163 +124,6 @@ КонецФункции -// Только для внутреннего использования. -// -Процедура ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь, Получатель = Неопределено) - - // Для обменов не РИБ используется алгоритм обычного сеанса обмена, а не создания начального образа, - // т.к. параметра СозданиеНачальногоОбраза равный Истина означает начальную выгрузку данных. - Если СозданиеНачальногоОбраза И Получатель <> Неопределено - И Не ОбщегоНазначения.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель.Ссылка) Тогда - СозданиеНачальногоОбраза = Ложь; - КонецЕсли; - - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить - ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") Тогда - - Если СозданиеНачальногоОбраза Тогда - - Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - Если Получатель <> Неопределено - И Получатель.ДополнительныеСвойства.Свойство("РазмещатьФайлыВНачальномОбразе") Тогда - - // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ПоместитьФайлВРеквизитСправочника(ЭлементДанных); - - Иначе - - // Копируем файл из тома на диске в каталог создания начального образа. - ИмяКаталогаФайлов = Строка(ХранилищеОбщихНастроек.Загрузить("ОбменФайлами", "ВременныйКаталог")); - - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ЭлементДанных.Том) + ЭлементДанных.ПутьКФайлу; - УникальныйИдентификатор = ЭлементДанных.Ссылка.УникальныйИдентификатор(); - - НовыйПутьФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ИмяКаталогаФайлов, - УникальныйИдентификатор); - - ФайловыеФункцииСлужебный.СкопироватьФайлПриСозданииНачальногоОбраза(ПолныйПуть, НовыйПутьФайла); - - КонецЕсли; - - Иначе - - // Если файл хранится в ИБ, то при создании начального образа - // он будет выгружен в составе регистра сведений ХранимыеФайлыВерсий. - - КонецЕсли; - - Иначе - - Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ПоместитьФайлВРеквизитСправочника(ЭлементДанных); - - Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза - - Попытка - // Помещаем данные файла из информационной базы в служебный реквизит справочника. - АдресВоВременномХранилище = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуВоВременномХранилище(ЭлементДанных.Ссылка); - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище), Новый СжатиеДанных(9)); - Исключение - // Возможно, файл не был найден. Отправку данных не прерываем. - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииДляОбмена(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - КонецПопытки; - - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - ЭлементДанных.ПутьКФайлу = ""; - ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - - КонецЕсли; - - КонецЕсли; - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ХранимыеФайлыВерсий") - И Не СозданиеНачальногоОбраза Тогда - - // Выгрузку регистра выполняем только при создании начального образа. - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; - - КонецЕсли; - -КонецПроцедуры - -// Только для внутреннего использования. -// -Процедура ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента) - - Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда - - // Стандартную обработку не переопределяем. - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Файлы") - И ПолучениеФайлаЗапрещено(ЭлементДанных) Тогда - - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - - ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") Тогда - - Если ПолучениеВерсииФайлаЗапрещено(ЭлементДанных) Тогда - - ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; - Возврат; - КонецЕсли; - - // Для существующих файлов, размещенных в томах, выполняем их удаление из томов, - // т.к. при получении нового файла он будет заново размещен в томе или информационной базе. - Если НЕ ЭлементДанных.ЭтоНовый() Тогда - - ВерсияФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭлементДанных.Ссылка, "ТипХраненияФайла, Том, ПутьКФайлу"); - - Если ВерсияФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - ПрежнийПутьНаТоме = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияФайла.Том) + ВерсияФайла.ПутьКФайлу; - - ФайловыеФункцииСлужебный.УдалитьФайлыНаСервере(ПрежнийПутьНаТоме); - - КонецЕсли; - - КонецЕсли; - - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - // По обмену пришел элемент с хранением в базе - но в базе приемнике принято хранить в томах. - // Из служебного реквизита файл размещаем на томе и меняем ТипХраненияФайла на ВТомахНаДиске. - - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ЭлементДанных.ФайлХранилище.Получить(), - ЭлементДанных.ДатаМодификацииУниверсальная, ЭлементДанных.Наименование, ЭлементДанных.Расширение, - ЭлементДанных.НомерВерсии, ЭлементДанных.Зашифрован); - ЭлементДанных.Том = СведенияОФайле.Том; - ЭлементДанных.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - - Иначе - - ДвоичныеДанные = ЭлементДанных.ФайлХранилище.Получить(); - - Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда - ЭлементДанных.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); - КонецЕсли; - - ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); - ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ЭлементДанных.ПутьКФайлу = ""; - ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - // Возвращает объекты, имеющие в наличии присоединенные (средствами подсистемы "Работа с файлами") файлы. // // Используется совместно с функцией ПрисоединенныеФайлы.СконвертироватьФайлыВПрисоединенные(). @@ -383,8 +155,27 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. +// Проверяет право текущего пользователя +// при использовании ограничения для папки или файла. +// +// Параметры: +// Папка - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы - Папка файлов. +// - СправочникСсылка - Владелец файлов. +// +// Места использования: +// РассылкаОтчетов.ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию(). +// Справочник.РассылкиОтчетов.Формы.ФормаЭлемента.ПравоИзмененияПапкиИФайлов(). +// +Функция ПравоДобавленияФайловВПапку(Папка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + Возврат МодульУправлениеДоступом.ЕстьПраво("ДобавлениеФайлов", Папка); + КонецЕсли; + + Возврат Истина; + +КонецФункции // Записывает вложения в папку. // @@ -400,7 +191,7 @@ ТаблицаВложений.Колонки.Добавить("ПолныйПутьКФайлу", Новый ОписаниеТипов("Строка")); ТаблицаВложений.Колонки.Добавить("Файл", Новый ОписаниеТипов("Файл")); ТаблицаВложений.Колонки.Добавить("ФайлСсылка", Новый ОписаниеТипов("СправочникСсылка.Файлы")); - ТаблицаВложений.Колонки.Добавить("ИмяФайлаБезРасширения", Метаданные.Справочники.Файлы.Реквизиты.ПолноеНаименование.Тип); + ТаблицаВложений.Колонки.Добавить("ИмяФайлаБезРасширения", Метаданные.Справочники.Файлы.СтандартныеРеквизиты.Наименование.Тип); УстановитьПривилегированныйРежим(Ложь); @@ -417,19 +208,19 @@ Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Файлы.Ссылка, - | Файлы.ПолноеНаименование + | Файлы.Наименование |ИЗ | Справочник.Файлы КАК Файлы |ГДЕ | Файлы.ВладелецФайла = &ВладелецФайла - | И Файлы.ПолноеНаименование В(&МассивИменФайлов)"; + | И Файлы.Наименование В(&МассивИменФайлов)"; Запрос.УстановитьПараметр("ВладелецФайла", ПараметрыДоставки.Папка); Запрос.УстановитьПараметр("МассивИменФайлов", ТаблицаВложений.ВыгрузитьКолонку("ИмяФайлаБезРасширения")); СуществующиеФайлы = Запрос.Выполнить().Выгрузить(); Для Каждого Файл Из СуществующиеФайлы Цикл - СтрокаТаблицы = ТаблицаВложений.Найти(Файл.ПолноеНаименование, "ИмяФайлаБезРасширения"); + СтрокаТаблицы = ТаблицаВложений.Найти(Файл.Наименование, "ИмяФайлаБезРасширения"); СтрокаТаблицы.ФайлСсылка = Файл.Ссылка; КонецЦикла; @@ -470,11 +261,13 @@ // Устанавливает пометку удаления всем версиям указанного файла. Процедура ПометитьНаУдалениеВерсииФайла(Знач ФайлСсылка, Знач ВерсияИсключение) Экспорт + ПолноеИмяСправочникаВерсий = Метаданные.НайтиПоТипу(ТипЗнч(ВерсияИсключение)).ПолноеИмя(); + ТекстЗапроса = "ВЫБРАТЬ | ВерсииФайлов.Ссылка КАК Ссылка |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов + | Справочник." + Метаданные.НайтиПоТипу(ПолноеИмяСправочникаВерсий) + " КАК ВерсииФайлов |ГДЕ | ВерсииФайлов.Владелец = &Владелец | И НЕ ВерсииФайлов.ПометкаУдаления @@ -484,70 +277,318 @@ Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Владелец", ФайлСсылка); Запрос.УстановитьПараметр("Исключение", ВерсияИсключение); - Выборка = Запрос.Выполнить().Выбрать(); + ВыборкаВерсий = Запрос.Выполнить().Выгрузить(); - Пока Выборка.Следующий() Цикл + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого Версия Из ВыборкаВерсий Цикл + ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяСправочникаВерсий); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Версия.Ссылка); + КонецЦикла; + Блокировка.Заблокировать(); - ВерсияОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ВерсияОбъект.ПометкаУдаления = Истина; - ВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); - ВерсияОбъект.Записать(); + Для Каждого Версия Из ВыборкаВерсий Цикл + ВерсияОбъект = Версия.Ссылка.ПолучитьОбъект(); + ВерсияОбъект.ПометкаУдаления = Истина; + ВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); + ВерсияОбъект.Записать(); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Возвращает соответствие имен справочников и значения Булево +// для указанного владельца. +// +// Параметры: +// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// +Функция ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение = Ложь) Экспорт + + Если ТипЗнч(ВладелецФайлов) = Тип("Тип") Тогда + ТипВладельцаФайлов = ВладелецФайлов; + Иначе + ТипВладельцаФайлов = ТипЗнч(ВладелецФайлов); + КонецЕсли; + + МетаданныеВладельца = Метаданные.НайтиПоТипу(ТипВладельцаФайлов); + + ИменаСправочников = Новый Соответствие; + ИмяСтандартногоОсновногоСправочника = МетаданныеВладельца.Имя + "ПрисоединенныеФайлы"; + Если Метаданные.Справочники.Найти(ИмяСтандартногоОсновногоСправочника) <> Неопределено Тогда + ИменаСправочников.Вставить(ИмяСтандартногоОсновногоСправочника, Истина); + ИначеЕсли Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельцаФайлов) Тогда + ИменаСправочников.Вставить("Файлы", Истина); + КонецЕсли; + + // Переопределение стандартного справочника хранения присоединенных файлов. + РаботаСФайламиПереопределяемый.ПриОпределенииСправочниковХраненияФайлов( + ТипВладельцаФайлов, ИменаСправочников); + + ОсновнойСправочникУказан = Ложь; + + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Если Метаданные.Справочники.Найти(КлючИЗначение.Ключ) = Неопределено Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. + |У владельца файлов типа ""%1"" + |указан несуществующий справочник ""%2"".'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + + ИначеЕсли Не СтрЗаканчиваетсяНа(КлючИЗначение.Ключ, "ПрисоединенныеФайлы") И Не КлючИЗначение.Ключ ="Файлы" Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. + |У владельца файлов типа ""%1"" + |указано имя справочника ""%2"" + |без окончания ""ПрисоединенныеФайлы"".'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + + ИначеЕсли КлючИЗначение.Значение = Неопределено Тогда + ИменаСправочников.Вставить(КлючИЗначение.Ключ, Ложь); + + ИначеЕсли КлючИЗначение.Значение = Истина Тогда + Если ОсновнойСправочникУказан Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. + |У владельца файлов типа ""%1"" + |основной справочник указан более одного раза.'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + КонецЕсли; + ОсновнойСправочникУказан = Истина; + КонецЕсли; + КонецЦикла; + + Если ИменаСправочников.Количество() = 0 Тогда + + Если НеВызыватьИсключение Тогда + Возврат ИменаСправочников; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения файлов. + |У владельца файлов типа ""%1"" + |не имеется справочников для хранения файлов.'"), + Строка(ТипВладельцаФайлов)); + КонецЕсли; + + Возврат ИменаСправочников; + +КонецФункции + +// Создает у Получателя копии всех присоединенных файлов Источника. +// Источник и Получатель должны быть объектами одного типа. +// +// Параметры: +// Источник - Ссылка - объект, имеющий присоединенные файлы для копирования. +// Получатель - Ссылка - объект, к которому копируются присоединенные файлы. +// +Процедура СкопироватьПрисоединенныеФайлы(Знач Источник, Знач Получатель) Экспорт + + КопируемыеФайлы = ВсеПодчиненныеФайлы(Источник.Ссылка); + Для Каждого КопируемыйФайл Из КопируемыеФайлы Цикл + Если КопируемыйФайл.ПометкаУдаления Тогда + Продолжить; + КонецЕсли; + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(КопируемыйФайл); + КопияФайла = КопируемыйФайл.Скопировать(); + КопияФайлаСсылка = МенеджерОбъекта.ПолучитьСсылку(); + КопияФайла.УстановитьСсылкуНового(КопияФайлаСсылка); + КопияФайла.ВладелецФайла = Получатель.Ссылка; + КопияФайла.Редактирует = Справочники.Пользователи.ПустаяСсылка(); + + КопияФайла.ТекстХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ТекстХранилище.Получить()); + КопияФайла.ФайлХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ФайлХранилище.Получить()); + + ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(КопируемыйФайл); + КопияФайла.ТипХраненияФайла = ТипХраненияФайлов(); + + Если ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ЗаписатьФайлВИнформационнуюБазу(КопияФайлаСсылка, ДвоичныеДанные); + Иначе + // Добавить в один из томов (где есть свободное место). + СведенияОФайле = ДобавитьФайлВТом(ДвоичныеДанные, КопияФайла.ДатаМодификацииУниверсальная, + КопияФайла.Наименование, КопияФайла.Расширение); + КопияФайла.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + КопияФайла.Том = СведенияОФайле.Том; + КонецЕсли; + КопияФайла.Записать(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + УстановленныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(КопируемыйФайл); + МодульЭлектроннаяПодпись.ДобавитьПодпись(КопияФайла.Ссылка, УстановленныеПодписи); + + СертификатыИсточника = МодульЭлектроннаяПодпись.СертификатыШифрования(КопируемыйФайл); + МодульЭлектроннаяПодпись.ЗаписатьСертификатыШифрования(КопияФайла, СертификатыИсточника); + КонецЕсли; КонецЦикла; КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. +// Возвращает структуру объекта файла. // -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ПапкиФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.Файлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ВерсииФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры +Функция ФайлОбъект(Знач ПрисоединенныйФайл) Экспорт + + ФайлОбъект = Неопределено; + + МетаданныеОбъектаФайла = Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)); + + // Это справочник файлов. + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", МетаданныеОбъектаФайла) Тогда + // С возможностью хранить версии. + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла) И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда + ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл.ТекущаяВерсия, + "Ссылка, ТипХраненияФайла, Наименование,Расширение,Том,ПутьКФайлу"); + ФайлОбъект.Вставить("ВладелецФайла", ПрисоединенныйФайл.ВладелецФайла); + // Без возможности хранить версии. + Иначе + ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, + "Ссылка, ТипХраненияФайла,ВладелецФайла,Наименование,Расширение,Том,ПутьКФайлу"); + КонецЕсли; + // Это справочник версий файлов. + ИначеЕсли ОбщегоНазначения.ЕстьРеквизитОбъекта("РодительскаяВерсия", МетаданныеОбъектаФайла) Тогда + ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, + "Ссылка, ТипХраненияФайла,Наименование,Расширение,Том,ПутьКФайлу"); + ФайлОбъект.Вставить("ВладелецФайла", + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл.Владелец, "ВладелецФайла")); + КонецЕсли; + + Возврат ФайлОбъект; + +КонецФункции //////////////////////////////////////////////////////////////////////////////// // Очистка ненужных файлов Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение, ДанныеДляОтчета = Ложь) Экспорт - Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда + ПолноеИмяСправочникаФайлов = Настройка.ТипВладельцаФайла.ПолноеИмя; + МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); + ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов); + Если ЕстьВозможностьХранитьВерсии Тогда + СправочникВерсийФайлов = + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеОбъектаФайлов.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); + ПолноеИмяСправочникаВерсийФайлов = СправочникВерсийФайлов.ПолноеИмя; + Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда + Если ДанныеДляОтчета Тогда + ТекстЗапроса = + "ВЫБРАТЬ + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, + | ЕстьNull(ВерсииФайлов.Размер, Файлы.Размер) /1024 /1024 КАК ОбъемНенужныхФайлов"; + Иначе + ТекстЗапроса = + "ВЫБРАТЬ + | Файлы.Ссылка КАК ФайлСсылка, + | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + |ИЗ + | " + ПолноеИмяСправочникаФайлов + " КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ " + ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов + | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + |ГДЕ + | НЕ Файлы.ПометкаУдаления + | И НЕ ЕстьNull(ВерсииФайлов.ПометкаУдаления, Ложь) + | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца + | И ВЫБОР + | КОГДА ЕстьNull(ВерсииФайлов.ТипХраненияФайла, Файлы.ТипХраненияФайла) = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА ЕстьNull(ВерсииФайлов.Том, Файлы.Том) <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) + | ИЛИ (ВЫРАЗИТЬ(ЕстьNull(ВерсииФайлов.ПутьКФайлу, Файлы.ПутьКФайлу) КАК СТРОКА(100))) <> """" + | ИНАЧЕ ИСТИНА + | КОНЕЦ + | И ЕстьNull(ВерсииФайлов.ДатаСоздания, Файлы.ДатаСоздания) <= &ПериодОчистки"; + Иначе + МассивРеквизитовСТипомДата = Новый Массив; + + ТипОбъекта = ВладелецФайла; + ВсеСправочники = Справочники.ТипВсеСсылки(); + ВсеДокументы = Документы.ТипВсеСсылки(); + ЕстьТипДата = Ложь; + + ТекстЗапроса = + "ВЫБРАТЬ + | " + ТипОбъекта.Имя + ".Ссылка,"; + Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда + Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; + Для Каждого Реквизит Из Справочник.Реквизиты Цикл + ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; + КонецЦикла; + ИначеЕсли + ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда + Документ = Метаданные.Документы[ТипОбъекта.Имя]; + Для Каждого Реквизит Из Документ.Реквизиты Цикл + Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; + КонецЦикла; + КонецЕсли; + Если ДанныеДляОтчета Тогда + ТекстЗапроса = ТекстЗапроса + " + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, + | ЕстьNull(ВерсииФайлов.Размер, Файлы.Размер) /1024 /1024 КАК ОбъемНенужныхФайлов"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | Файлы.Ссылка КАК ФайлСсылка, + | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + |ИЗ + | " + ТипОбъекта.ПолноеИмя+ " КАК " + ТипОбъекта.Имя + " + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ "+ ПолноеИмяСправочникаФайлов + " КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ " + ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов + | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + | ПО " + ТипОбъекта.Имя + ".Ссылка = Файлы.ВладелецФайла + |ГДЕ + | НЕ Файлы.ПометкаУдаления + | И НЕ ЕстьNull(ВерсииФайлов.ПометкаУдаления, Ложь) + | И ВЫБОР + | КОГДА ЕстьNull(ВерсииФайлов.ТипХраненияФайла, Файлы.ТипХраненияФайла) = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА ЕстьNull(ВерсииФайлов.Том, Файлы.Том) <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) + | ИЛИ (ВЫРАЗИТЬ(ЕстьNull(ВерсииФайлов.ПутьКФайлу, Файлы.ПутьКФайлу) КАК СТРОКА(100))) <> """" + | ИНАЧЕ ИСТИНА + | КОНЕЦ + | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца"; + КонецЕсли; + Иначе + Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда Если ДанныеДляОтчета Тогда ТекстЗапроса = - "ВЫБРАТЬ + "ВЫБРАТЬ | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; + | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; Иначе ТекстЗапроса = - "ВЫБРАТЬ - | Файлы.Ссылка КАК ФайлСсылка, - | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; + "ВЫБРАТЬ + | Файлы.Ссылка КАК ФайлСсылка"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " |ИЗ - | Справочник.Файлы КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов - | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы + | ПО Файлы.ВладелецФайла = СправочникФайлы.Ссылка |ГДЕ | НЕ Файлы.ПометкаУдаления - | И НЕ ВерсииФайлов.ПометкаУдаления - | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца | И ВЫБОР - | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" + | КОГДА Файлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА (ВЫРАЗИТЬ(Файлы.ПутьКФайлу КАК СТРОКА(100))) <> """" + | ИЛИ НЕ Файлы.Том = ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) | ИНАЧЕ ИСТИНА | КОНЕЦ - | И ВерсииФайлов.ДатаСоздания <= &ПериодОчистки"; + | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца + | И Файлы.ДатаСоздания <= &ПериодОчистки"; Иначе МассивРеквизитовСТипомДата = Новый Массив; @@ -555,51 +596,41 @@ ВсеСправочники = Справочники.ТипВсеСсылки(); ВсеДокументы = Документы.ТипВсеСсылки(); ЕстьТипДата = Ложь; - ТекстЗапроса = "ВЫБРАТЬ - | " + ТипОбъекта.Имя + ".Ссылка,"; + | СправочникФайлы.Ссылка, + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, + | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов,"; Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; Для Каждого Реквизит Из Справочник.Реквизиты Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; КонецЦикла; - ИначеЕсли - ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда + ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда Документ = Метаданные.Документы[ТипОбъекта.Имя]; Для Каждого Реквизит Из Документ.Реквизиты Цикл - Если Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда + Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; КонецЦикла; КонецЕсли; - Если ДанныеДляОтчета Тогда - ТекстЗапроса = ТекстЗапроса + " - | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; - Иначе - ТекстЗапроса = ТекстЗапроса + " - | Файлы.Ссылка КАК ФайлСсылка, - | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; - КонецЕсли; ТекстЗапроса = ТекстЗапроса + " + | Файлы.Ссылка КАК ФайлСсылка |ИЗ - | " + ТипОбъекта.ПолноеИмя+ " КАК " + ТипОбъекта.Имя + " - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов - | ПО Файлы.Ссылка = ВерсииФайлов.Владелец - | ПО " + ТипОбъекта.Имя + ".Ссылка = Файлы.ВладелецФайла + | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы + | ПО Файлы.ВладелецФайла = СправочникФайлы.Ссылка |ГДЕ | НЕ Файлы.ПометкаУдаления - | И НЕ ВерсииФайлов.ПометкаУдаления | И ВЫБОР - | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" + | КОГДА Файлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА (ВЫРАЗИТЬ(Файлы.ПутьКФайлу КАК СТРОКА(100))) <> """" + | ИЛИ НЕ Файлы.Том = ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) | ИНАЧЕ ИСТИНА | КОНЕЦ | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца"; + КонецЕсли; КонецЕсли; Если МассивИсключений.Количество() > 0 Тогда @@ -610,7 +641,7 @@ ТекстЗапроса = ТекстЗапроса + " | И Файлы.ВладелецФайла В ИЕРАРХИИ (&ЭлементИсключение)"; КонецЕсли; - Если Настройка.Действие = Перечисления.ВариантыОчисткиФайлов.ОчиститьВерсии Тогда + Если ЕстьВозможностьХранитьВерсии И Настройка.Действие = Перечисления.ВариантыОчисткиФайлов.ОчиститьВерсии Тогда ТекстЗапроса = ТекстЗапроса + " | И ВерсииФайлов.Ссылка <> Файлы.ТекущаяВерсия | И ВерсииФайлов.РодительскаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)"; @@ -620,52 +651,133 @@ КонецФункции -Процедура СформироватьТекстЗапросаПолногоОбъемаФайлов(ТекстЗапроса) Экспорт +Функция ТекстЗапросаПолногоОбъемаФайлов() Экспорт + МетаданныеСправочники = Метаданные.Справочники; + ДобавитьПсевдонимПоля = Истина; + ТекстЗапроса = ""; + Для Каждого Справочник Из МетаданныеСправочники Цикл + Если Справочник.Реквизиты.Найти("ВладелецФайла") <> Неопределено Тогда + + ТипыВладельцевФайлов = Справочник.Реквизиты.ВладелецФайла.Тип.Типы(); + + ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", Справочник); + Если ЕстьВозможностьХранитьВерсии Тогда + СправочникВерсийФайлов = + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Справочник.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); + ПолноеИмяСправочникаВерсийФайлов = СправочникВерсийФайлов.ПолноеИмя; + + ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ") + " + | + |ВЫБРАТЬ + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, + | СУММА(ЕстьNull(ВерсииФайлов.Размер, Файлы.Размер) / 1024 / 1024) КАК ОбъемВсего + |ИЗ + | Справочник." + Справочник.Имя + " КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ "+ ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов + | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + |ГДЕ + | НЕ Файлы.ПометкаУдаления + | И НЕ ЕстьNull(ВерсииФайлов.ПометкаУдаления, Ложь) + | + |СГРУППИРОВАТЬ ПО + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла)"; + + Если ДобавитьПсевдонимПоля Тогда + ДобавитьПсевдонимПоля = Ложь; + КонецЕсли; + Иначе + ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ") + " + | + |ВЫБРАТЬ + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) " + ?(ДобавитьПсевдонимПоля, "КАК ВладелецФайла,",",") + " + | Файлы.Размер / 1024 / 1024 " + ?(ДобавитьПсевдонимПоля, "КАК ОбъемВсего","") + " + |ИЗ + | Справочник." + Справочник.Имя + " КАК Файлы + |ГДЕ + | НЕ Файлы.ПометкаУдаления"; + + Если ДобавитьПсевдонимПоля Тогда + ДобавитьПсевдонимПоля = Ложь; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецЦикла; - ТекстЗапроса = - "ВЫБРАТЬ - | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | СУММА(ВерсииФайлов.Размер / 1024 / 1024) КАК ОбъемВсего - |ИЗ - | Справочник.Файлы КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов - | ПО Файлы.Ссылка = ВерсииФайлов.Владелец - |ГДЕ - | НЕ Файлы.ПометкаУдаления - | И НЕ ВерсииФайлов.ПометкаУдаления - | - |СГРУППИРОВАТЬ ПО - | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла)"; + Возврат ТекстЗапроса; -КонецПроцедуры +КонецФункции Функция ПроверитьЦелостностьФайлов(ТаблицаФайловНаДиске, Том) Экспорт - + + МетаданныеСправочники = Метаданные.Справочники; Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВерсииФайлов.ПутьКФайлу, - | ВерсииФайлов.Расширение, - | ВерсииФайлов.Наименование, - | ВерсииФайлов.ПолноеНаименование КАК Наименование, - | ВерсииФайлов.Представление, - | ВерсииФайлов.Том, - | ВерсииФайлов.Ссылка, - | ВерсииФайлов.ДатаМодификацииФайла, - | ВерсииФайлов.Автор КАК Отредактировал - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | И ВерсииФайлов.Том = &Том"; - + ТипыФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); + + ДобавитьПсевдонимПоля = Истина; + + Для Каждого СправочникФайлов Из ТипыФайлов Цикл + МетаданныеСправочника = Метаданные.НайтиПоТипу(СправочникФайлов); + Если МетаданныеСправочника.Реквизиты.Найти("ВладелецФайла") <> Неопределено Тогда + ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеСправочника); + + Запрос.Текст = Запрос.Текст + ?(ПустаяСтрока(Запрос.Текст),"", " ОБЪЕДИНИТЬ ВСЕ") + " + | + |ВЫБРАТЬ + | СправочникПрисоединенныеФайлы.Ссылка " + ?(ДобавитьПсевдонимПоля, "КАК Ссылка,",",") + " + | СправочникПрисоединенныеФайлы.Расширение " + ?(ДобавитьПсевдонимПоля, "КАК Расширение,",",") + " + | СправочникПрисоединенныеФайлы.Наименование " + ?(ДобавитьПсевдонимПоля, "КАК Наименование,",",") + " + | СправочникПрисоединенныеФайлы.Том " + ?(ДобавитьПсевдонимПоля, "КАК Том,",",") + " + | СправочникПрисоединенныеФайлы.Изменил " + ?(ДобавитьПсевдонимПоля, "КАК Отредактировал,",",") + " + | СправочникПрисоединенныеФайлы.ДатаМодификацииУниверсальная " + ?(ДобавитьПсевдонимПоля, "КАК ДатаМодификацииФайла,",",") + " + | СправочникПрисоединенныеФайлы.ПутьКФайлу " + ?(ДобавитьПсевдонимПоля, "КАК ПутьКФайлу","") + " + |ИЗ + | Справочник." + МетаданныеСправочника.Имя + " КАК СправочникПрисоединенныеФайлы + |ГДЕ + | СправочникПрисоединенныеФайлы.Том = &Том + | И СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | И НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления"; + Если ЕстьВозможностьХранитьВерсии Тогда + СправочникВерсийФайлов = Метаданные.НайтиПоТипу(МетаданныеСправочника.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); + Запрос.Текст = Запрос.Текст + " + | И СправочникПрисоединенныеФайлы.ТекущаяВерсия = ЗНАЧЕНИЕ(Справочник." + СправочникВерсийФайлов.Имя + ".ПустаяСсылка)"; + КонецЕсли; + + Если ДобавитьПсевдонимПоля Тогда + ДобавитьПсевдонимПоля = Ложь; + КонецЕсли; + ИначеЕсли МетаданныеСправочника.Реквизиты.Найти("РодительскаяВерсия") <> Неопределено Тогда + Запрос.Текст = Запрос.Текст + ?(ПустаяСтрока(Запрос.Текст),"", " ОБЪЕДИНИТЬ ВСЕ") + " + | + |ВЫБРАТЬ + | СправочникПрисоединенныеФайлы.Ссылка " + ?(ДобавитьПсевдонимПоля, "КАК Ссылка,",",") + " + | СправочникПрисоединенныеФайлы.Расширение " + ?(ДобавитьПсевдонимПоля, "КАК Расширение,",",") + " + | СправочникПрисоединенныеФайлы.Наименование " + ?(ДобавитьПсевдонимПоля, "КАК Наименование,",",") + " + | СправочникПрисоединенныеФайлы.Том " + ?(ДобавитьПсевдонимПоля, "КАК Том,",",") + " + | СправочникПрисоединенныеФайлы.Автор " + ?(ДобавитьПсевдонимПоля, "КАК Отредактировал,",",") + " + | СправочникПрисоединенныеФайлы.ДатаМодификацииУниверсальная " + ?(ДобавитьПсевдонимПоля, "КАК ДатаМодификацииФайла,",",") + " + | СправочникПрисоединенныеФайлы.ПутьКФайлу " + ?(ДобавитьПсевдонимПоля, "КАК ПутьКФайлу","") + " + |ИЗ + | Справочник." + МетаданныеСправочника.Имя + " КАК СправочникПрисоединенныеФайлы + |ГДЕ + | СправочникПрисоединенныеФайлы.Том = &Том + | И СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | И НЕ СправочникПрисоединенныеФайлы.ПометкаУдаления"; + + Если ДобавитьПсевдонимПоля Тогда + ДобавитьПсевдонимПоля = Ложь; + КонецЕсли; + + КонецЕсли; + КонецЦикла; + Запрос.УстановитьПараметр("Том", Том); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); - ПолныйПутьТома = ФайловыеФункцииСлужебный.ПолныйПутьТома(Том); + ПолныйПутьТома = ПолныйПутьТома(Том); Пока Выборка.Следующий() Цикл @@ -708,381 +820,1364 @@ КонецФункции -Процедура ВыполнитьОчисткуДанныхОФайле(ФайлСсылка) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Поддержка обмена файлами + +// Служебная функции. Используется для удаления файла на сервере. +// +Процедура УдалитьФайлыНаСервере(ПрежнийПутьНаТоме) - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ИмяФайлаСПутем = ""; - ИмяФайлаСПутемДляУдаления = ""; - - НачатьТранзакцию(); + // Удаляем файл. + ФайлВременный = Новый Файл(ПрежнийПутьНаТоме); + Если ФайлВременный.Существует() Тогда + + Попытка + ФайлВременный.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПрежнийПутьНаТоме); + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Удаление файлов в томе при обмене'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ИнформацияОбОшибке()); + КонецПопытки; + + КонецЕсли; + // Удаляем каталог файла, если после удаления файла каталог стал пустым. Попытка - - ТекстКомментария = НСтр("ru = 'Файл удален при очистке ненужных файлов.'") - + " " + Формат(ТекущаяДатаСеанса(),"ДЛФ=D") + Символы.ПС; - - Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ИмяФайлаСПутем = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; - ИмяФайлаСПутемДляУдаления = ИмяФайлаСПутем + ".del"; - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); - Если ФайлНаДиске.Существует() Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - // Переместим файл во временный. - ПереместитьФайл(ИмяФайлаСПутем, ИмяФайлаСПутемДляУдаления); - ФайлОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ФайлОбъект.ПутьКФайлу = ""; - ФайлОбъект.Комментарий = ТекстКомментария + ФайлОбъект.Комментарий; - ФайлОбъект.Записать(); - ФайлОбъект.УстановитьПометкуУдаления(Истина); - // Удалим временный файл, т.к. успешно обновили данные о файле. - УдалитьФайлы(ИмяФайлаСПутемДляУдаления); - КонецЕсли; - Иначе - РаботаСФайламиСлужебныйВызовСервера.УдалитьЗаписьИзРегистраХранимыеФайлыВерсий(ФайлСсылка); - ФайлОбъект.Комментарий = ТекстКомментария + ФайлОбъект.Комментарий; - ФайлОбъект.Записать(); - ФайлОбъект.УстановитьПометкуУдаления(Истина); - + МассивФайловВКаталоге = НайтиФайлы(ФайлВременный.Путь, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ФайлВременный.Путь); КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - - ОтменитьТранзакцию(); - - Если Не ПустаяСтрока(ИмяФайлаСПутем) Тогда - - // Записать ошибку в журнал регистрации. - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очистка ненужных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,, ФайлСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - // Вернем файл на прежнее место в случае ошибки. - ПереместитьФайл(ИмяФайлаСПутемДляУдаления, ИмяФайлаСПутем); - - КонецЕсли; - + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Удаление файлов в томе при обмене'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ИнформацияОбОшибке() ); КонецПопытки; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов с облачным сервисом. +// Работа с томами файлов -Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение) Экспорт +// Возвращает тип хранения файлов. +// +// Возвращаемое значение: +// Булево. Истина, если указано хранить файлы в томах на диске. +// +Функция ХранениеФайловВТомахНаДиске() Экспорт - ТипОбъекта = ВладелецФайла; - ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)); - ЕстьТипДата = Ложь; + УстановитьПривилегированныйРежим(Истина); - ТекстЗапроса = ""; + ХранитьФайлыВТомахНаДиске = Константы.ХранитьФайлыВТомахНаДиске.Получить(); - СправочникФайлов = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ТипВладельцаФайла); + Возврат ХранитьФайлыВТомахНаДиске; - Если ТипЗнч(ВладелецФайла) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ИдентификаторВладельца); - Иначе - СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецФайла); - КонецЕсли; - - Если Не ПустаяСтрока(ТекстЗапроса) Тогда - ТекстЗапроса= ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - |"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ - | СправочникПапок.Ссылка,"; - - ФайловыеФункцииСлужебный.ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); - - ТекстЗапроса = ТекстЗапроса + " - | СправочникФайлов.Ссылка КАК ФайлСсылка, - | СправочникФайлов.Наименование + ""."" + СправочникФайлов.ТекущаяВерсияРасширение КАК Наименование, - | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, - | СправочникФайлов.ВладелецФайла КАК Родитель, - | ЛОЖЬ КАК ЭтоПапка, - | ИСТИНА КАК ЕстьВБазе, - | ЛОЖЬ КАК ЕстьНаСервере, - | НЕОПРЕДЕЛЕНО КАК Изменения, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """") КАК Href, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, """") КАК Etag, - | ЛОЖЬ КАК Обработан, - | ВЫРАЗИТЬ("""" КАК СТРОКА(36)) КАК UID1C, - | """" КАК ToHref, - | """" КАК ToEtag, - | """" КАК РодительСервер, - | """" КАК НаименованиеСервер, - | ЛОЖЬ КАК ИзмененНаСервере, - | НЕОПРЕДЕЛЕНО КАК Уровень, - | """" КАК РодительСортировка, - | ИСТИНА КАК ЭтоФайл - |ИЗ - | Справочник." + СправочникФайлов.Имя + " КАК СправочникФайлов - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникФайлов.Ссылка) - | ЛЕВОЕ СОЕДИНЕНИЕ " + ПредставлениеТипаВладельца+ "." + СправочникПапок.Имя + " КАК СправочникПапок - | ПО (СправочникФайлов.ВладелецФайла = СправочникПапок.Ссылка) - |ГДЕ - | ТИПЗНАЧЕНИЯ(СправочникФайлов.ВладелецФайла) = &ТипВладельца"; - - Если МассивИсключений.Количество() > 0 Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; - КонецЕсли; - Если ЭлементИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | СправочникПапок.Ссылка,"; - - ФайловыеФункцииСлужебный.ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); - - ТекстЗапроса = ТекстЗапроса + " - | СправочникПапок.Ссылка, - | " + ?(ПредставлениеТипаВладельца = "Документ", - "СправочникПапок.Представление", "СправочникПапок.Наименование") + ", - | СправочникПапок.ПометкаУдаления,"; - Если ОбщегоНазначения.ЭтоСправочник(СправочникПапок) И СправочникПапок.Иерархический Тогда - ТекстЗапроса = ТекстЗапроса + " - | ВЫБОР - | КОГДА СправочникПапок.Родитель = ЗНАЧЕНИЕ(Справочник." + СправочникПапок.Имя + ".ПустаяСсылка) - | ТОГДА НЕОПРЕДЕЛЕНО - | ИНАЧЕ СправочникПапок.Родитель - | КОНЕЦ,"; - Иначе - ТекстЗапроса = ТекстЗапроса + "Неопределено,"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - | ИСТИНА, - | ИСТИНА, - | ЛОЖЬ, - | НЕОПРЕДЕЛЕНО, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """"), - | """", - | ЛОЖЬ, - | """", - | """", - | """", - | """", - | """", - | ЛОЖЬ, - | НЕОПРЕДЕЛЕНО, - | """", - | ИСТИНА - |ИЗ - | " + ПредставлениеТипаВладельца + "." + СправочникПапок.Имя + " КАК СправочникПапок - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникПапок.Ссылка - | И СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись = &УчетнаяЗапись) - | ГДЕ - | ИСТИНА"; - - Если МассивИсключений.Количество() > 0 Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; - КонецЕсли; - Если ЭлементИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; +КонецФункции - КонецЕсли; +// Возвращает тип хранения файлов с учетом наличия томов. +// Если томов хранения файлов нет, тогда хранение в ИБ. +// +// Возвращаемое значение: +// ПеречисленияСсылка.ТипыХраненияФайлов. +// +Функция ТипХраненияФайлов() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ХранитьФайлыВТомахНаДиске = Константы.ХранитьФайлыВТомахНаДиске.Получить(); + + Если ХранитьФайлыВТомахНаДиске Тогда - Возврат ТекстЗапроса; + Если РаботаСФайлами.ЕстьТомаХраненияФайлов() Тогда + Возврат Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; + Иначе + Возврат Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + КонецЕсли; + + Иначе + Возврат Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + КонецЕсли; + +КонецФункции + +// Проверяет, что хотя бы в одном томе есть хотя бы один файл. +// +// Возвращаемое значение: +// Булево. +// +Функция ЕстьФайлыВТомах() Экспорт + + Если КоличествоФайловВТомах() <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; КонецФункции -Функция ВозможностьСозданияПапки(ОбъектВладелец) Экспорт +// Возвращает полный путь тома - в зависимости от ОС. +Функция ПолныйПутьТома(СсылкаНаТом) Экспорт - Если ОбъектВладелец = Неопределено Тогда - Возврат Ложь; - Иначе - Возврат ТипЗнч(ОбъектВладелец) = Тип("СправочникСсылка.ПапкиФайлов"); + СистемнаяИнфо = Новый СистемнаяИнформация; + ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; + + УстановитьПривилегированныйРежим(Истина); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 + Или ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + + Возврат СсылкаНаТом.ПолныйПутьWindows; + Иначе + Возврат СсылкаНаТом.ПолныйПутьLinux; КонецЕсли; КонецФункции -Функция ОбъектЯвляетсяФайлом(ОбъектВладелец) Экспорт +// Добавляет файл в один из томов (где есть свободное место). +// +// Параметры: +// ДвоичныеДанныеИлиПуть - ДвоичныеДанные, Строка - двоичные данные файла или полный путь к файлу на диске. +// ВремяИзмененияУниверсальное - Дата - универсальное время, которое будет установлено файлу как время последнего +// изменения. +// ИмяБезРасширения - Строка - имя файла без расширения. +// Расширение - Строка - расширение файла без точки. +// НомерВерсии - Строка - номер версии файла. Если указан, то имя файла для хранения на диске формируется +// как: +// ИмяБезРасширения + "." + НомерВерсии + "." + Расширение +// в противном случае, ИмяБезРасширения + "." + Расширение. +// Зашифрован - Булево - если Истина, то к полному имени файла будет добавлено расширение ".p7m". +// ДатаДляРазмещенияВТоме - Дата - если не указано, то используется текущее время сеанса. +// +// Возвращаемое значение: +// Структура - со свойствами: +// * Том - СправочникСсылка.ТомаХраненияФайлов - том, в котором был размещен файл. +// * ПутьКФайлу - Строка - путь, по которому был размещен файл в томе. +// +Функция ДобавитьФайлВТом(ДвоичныеДанныеИлиПуть, ВремяИзмененияУниверсальное, ИмяБезРасширения, Расширение, + НомерВерсии = "", Зашифрован = Ложь, ДатаДляРазмещенияВТоме = Неопределено) Экспорт - МассивТиповФайлов = Метаданные.Справочники.Файлы.Реквизиты.ВладелецФайла.Тип.Типы(); - Возврат МассивТиповФайлов.Найти(ТипЗнч(ОбъектВладелец)) <> Неопределено; + ОжидаемыеТипы = Новый Массив; + ОжидаемыеТипы.Добавить(Тип("ДвоичныеДанные")); + ОжидаемыеТипы.Добавить(Тип("Строка")); + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайламиСлужебный.ДобавитьНаДиск", "ДвоичныеДанныеИлиПуть", ДвоичныеДанныеИлиПуть, + Новый ОписаниеТипов(ОжидаемыеТипы)); + + УстановитьПривилегированныйРежим(Истина); + СсылкаНаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + + КраткоеОписаниеВсехОшибок = ""; // Ошибки со всех томов. + ПодробноеОписаниеВсехОшибок = ""; // Для журнала регистрации. + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТомаХраненияФайлов.Ссылка + |ИЗ + | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов + |ГДЕ + | ТомаХраненияФайлов.ПометкаУдаления = ЛОЖЬ + | + |УПОРЯДОЧИТЬ ПО + | ТомаХраненияФайлов.ПорядокЗаполнения"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Нет ни одного тома для размещения файла.'"); + КонецЕсли; + + Пока Выборка.Следующий() Цикл + + СсылкаНаТом = Выборка.Ссылка; + + ПутьКТому = ПолныйПутьТома(СсылкаНаТом); + // Добавляем слэш в конце, если его нет. + ПутьКТому = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКТому); + + // Имя файла для хранения на диске формировать следующим образом + // - имя файла.номер версии.расширение файла. + Если ПустаяСтрока(НомерВерсии) Тогда + ИмяФайла = ИмяБезРасширения + "." + Расширение; + Иначе + ИмяФайла = ИмяБезРасширения + "." + НомерВерсии + "." + Расширение; + КонецЕсли; + + Если Зашифрован Тогда + ИмяФайла = ИмяФайла + "." + "p7m"; + КонецЕсли; + + Попытка + + Если ТипЗнч(ДвоичныеДанныеИлиПуть) = Тип("ДвоичныеДанные") Тогда + РазмерФайла = ДвоичныеДанныеИлиПуть.Размер(); + Иначе // Считаем, что иначе это путь к файлу на диске. + ФайлИсточник = Новый Файл(ДвоичныеДанныеИлиПуть); + Если ФайлИсточник.Существует() Тогда + РазмерФайла = ФайлИсточник.Размер(); + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось добавить файл ""%1"" ни в один из томов, т.к. он отсутствует. + |Возможно, файл удален антивирусной программой. + |Обратитесь к администратору.'"), + ИмяФайла); + + ВызватьИсключение ТекстОшибки; + + КонецЕсли; + КонецЕсли; + + // Если МаксимальныйРазмер = 0 - нет ограничения на размер файлов на томе. + Если СсылкаНаТом.МаксимальныйРазмер <> 0 Тогда + + ТекущийРазмерВБайтах = + РаботаСФайламиСлужебныйВызовСервера.ПодсчитатьРазмерФайловНаТоме(СсылкаНаТом.Ссылка); + + НовыйРазмерВБайтах = ТекущийРазмерВБайтах + РазмерФайла; + НовыйРазмер = НовыйРазмерВБайтах / (1024 * 1024); + + Если НовыйРазмер > СсылкаНаТом.МаксимальныйРазмер Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Превышен максимальный размер тома (%1 Мб).'"), + СсылкаНаТом.МаксимальныйРазмер); + КонецЕсли; + КонецЕсли; + + Дата = ТекущаяДатаСеанса(); + Если ДатаДляРазмещенияВТоме <> Неопределено Тогда + Дата = ДатаДляРазмещенияВТоме; + КонецЕсли; + + // Использование абсолютного формата даты "ДФ" в следующей строке + // является правильным, так как дата используется не для просмотра пользователем. + ПутьДня = Формат(Дата, "ДФ=ггггММдд") + ПолучитьРазделительПути(); + + ПутьКТому = ПутьКТому + ПутьДня; + + ИмяФайлаСПутем = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ПутьКТому, ИмяФайла); + ПолноеИмяФайлаСПутем = ПутьКТому + ИмяФайлаСПутем; + + Если ТипЗнч(ДвоичныеДанныеИлиПуть) = Тип("ДвоичныеДанные") Тогда + ДвоичныеДанныеИлиПуть.Записать(ПолноеИмяФайлаСПутем); + Иначе // Считаем, что иначе это путь к файлу на диске. + КопироватьФайл(ДвоичныеДанныеИлиПуть, ПолноеИмяФайлаСПутем); + КонецЕсли; + + // Установка времени изменения файла таким, как оно стоит в текущей версии. + ФайлНаДиске = Новый Файл(ПолноеИмяФайлаСПутем); + ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ВремяИзмененияУниверсальное); + ФайлНаДиске.УстановитьТолькоЧтение(Истина); + + Возврат Новый Структура("Том,ПутьКФайлу", СсылкаНаТом, ПутьДня + ИмяФайлаСПутем); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + + Если ПодробноеОписаниеВсехОшибок <> "" Тогда + ПодробноеОписаниеВсехОшибок = ПодробноеОписаниеВсехОшибок + Символы.ПС + Символы.ПС; + КраткоеОписаниеВсехОшибок = КраткоеОписаниеВсехОшибок + Символы.ПС + Символы.ПС; + КонецЕсли; + + ШаблонОписанияОшибки = + НСтр("ru = 'Ошибка при добавлении файла ""%1"" + |в том ""%2"" (%3): + |""%4"".'"); + + ПодробноеОписаниеВсехОшибок = ПодробноеОписаниеВсехОшибок + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонОписанияОшибки, + ИмяФайла, + Строка(СсылкаНаТом), + ПутьКТому, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + + КраткоеОписаниеВсехОшибок = КраткоеОписаниеВсехОшибок + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонОписанияОшибки, + ИмяФайла, + Строка(СсылкаНаТом), + ПутьКТому, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + // Надо переходить к следующему тому. + Продолжить; + КонецПопытки; + + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + + // Запись в журнал регистрации для администратора + // здесь выдадим ошибки со всех томов. + ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось добавить файл ни в один из томов. + |Список ошибок: + | + |%1'"); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Добавление файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, ПодробноеОписаниеВсехОшибок)); + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + СтрокаИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, КраткоеОписаниеВсехОшибок); + Иначе + // Сообщение обычному пользователю. + СтрокаИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось добавить файл: + |""%1.%2"". + | + |Обратитесь к администратору.'"), + ИмяБезРасширения, Расширение); + КонецЕсли; + + ВызватьИсключение СтрокаИсключения; + КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - //////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. +// Электронная подпись и шифрование для файлов. -// Добавляет параметры работы клиентской логики при запуске системы для подсистемы обмена данными в модели сервиса. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт +Функция ДоступнаЭлектроннаяПодпись(ТипФайла) Экспорт - КоличествоЗанятыхФайлов = 0; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Пользователь = ПользователиКлиентСервер.АвторизованныйПользователь(); - Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда - КоличествоЗанятыхФайлов = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКоличествоЗанятыхФайлов(, Пользователь); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + Возврат МодульЭлектроннаяПодписьСлужебный.ДоступнаЭлектроннаяПодпись(ТипФайла); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Управляет видимостью элементов и команд в зависимости от наличия и +// использования электронной подписи и шифрования. +// +Процедура КриптографияПриСозданииФормыНаСервере(Форма, ЭтоФормаСписка = Истина, ТолькоКартинкаСтрок = Ложь) Экспорт + + Элементы = Форма.Элементы; + + ЭлектронноеПодписание = Ложь; + Шифрование = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") + И Пользователи.РолиДоступны("ДобавлениеИзменениеЭлектронныхПодписейИШифрование") + И Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиентПодMacOS() Тогда + + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + ЭлектронноеПодписание = МодульЭлектроннаяПодпись.ИспользоватьЭлектронныеПодписи(); + Шифрование = МодульЭлектроннаяПодпись.ИспользоватьШифрование(); + КонецЕсли; + + Используется = ЭлектронноеПодписание Или Шифрование; + + Если ЭтоФормаСписка Тогда + Элементы.СписокНомерКартинкиПодписанЗашифрован.Видимость = Используется; + КонецЕсли; + + Если Не ТолькоКартинкаСтрок Тогда + Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Видимость = Используется; + + Если ЭтоФормаСписка Тогда + Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Видимость = Используется; + Иначе + Элементы.ГруппаЭлектронныеПодписи.Видимость = ЭлектронноеПодписание; + Элементы.ГруппаСертификатыШифрования.Видимость = Шифрование; + Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц = + ?(Используется, ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет); КонецЕсли; КонецЕсли; - Параметры.Вставить("КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов); + Если Не Используется Тогда + Возврат; + КонецЕсли; + + Если Не ТолькоКартинкаСтрок Тогда + Элементы.ФормаГруппаКомандЭлектроннаяПодпись.Видимость = ЭлектронноеПодписание; + Элементы.ФормаГруппаКомандШифрование.Видимость = Шифрование; + + Если ЭтоФормаСписка Тогда + Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодпись.Видимость = ЭлектронноеПодписание; + Элементы.СписокКонтекстноеМенюГруппаКомандШифрование.Видимость = Шифрование; + КонецЕсли; + КонецЕсли; + + Если ЭлектронноеПодписание И Шифрование Тогда + Заголовок = НСтр("ru = 'Электронная подпись и шифрование'"); + Подсказка = НСтр("ru = 'Наличие электронной подписи или шифрования'"); + Картинка = БиблиотекаКартинок["ПодписанЗашифрованЗаголовок"]; + ИначеЕсли ЭлектронноеПодписание Тогда + Заголовок = НСтр("ru = 'Электронная подпись'"); + Подсказка = НСтр("ru = 'Наличие электронной подписи'"); + Картинка = БиблиотекаКартинок["ПодписанЭП"]; + Иначе // Шифрование + Заголовок = НСтр("ru = 'Шифрование'"); + Подсказка = НСтр("ru = 'Наличие шифрования'"); + Картинка = БиблиотекаКартинок["Зашифрован"]; + КонецЕсли; + + Если ЭтоФормаСписка Тогда + Элементы.СписокНомерКартинкиПодписанЗашифрован.КартинкаШапки = Картинка; + Элементы.СписокНомерКартинкиПодписанЗашифрован.Подсказка = Подсказка; + КонецЕсли; + + Если Не ТолькоКартинкаСтрок Тогда + Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Заголовок = Заголовок; + Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Подсказка = Заголовок; + Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Картинка = Картинка; + + Если ЭтоФормаСписка Тогда + Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Заголовок = Заголовок; + Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Подсказка = Заголовок; + Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Картинка = Картинка; + КонецЕсли; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ОформитьСписокПодписей(Форма, "ЭлектронныеПодписи"); + КонецЕсли; КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. +// Только для внутреннего использования. +Процедура ПеренестиРезультатыПроверкиПодписей(ПодписиВФорме, ПодписанныйФайл) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + ПодписиВОбъекте = МодульЭлектроннаяПодпись.УстановленныеПодписи(ПодписанныйФайл); + + Если ПодписиВФорме.Количество() <> ПодписиВОбъекте.Количество() Тогда + Возврат; // Если объект был изменен, результаты проверки не переносятся. + КонецЕсли; + + Если ПодписиВФорме.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Свойства = Новый Структура("ДатаПроверкиПодписи, ПодписьВерна", Null, Null); + ЗаполнитьЗначенияСвойств(Свойства, ПодписиВОбъекте[0]); + Если Свойства.ДатаПроверкиПодписи = Null + Или Свойства.ПодписьВерна = Null Тогда + Возврат; // Если в объекте нет реквизитов проверки, результаты проверки не переносятся. + КонецЕсли; + + Для Каждого Строка Из ПодписиВФорме Цикл + СтрокаВОбъекте = ПодписиВОбъекте.Получить(ПодписиВФорме.Индекс(Строка)); + Если Строка.ДатаПодписи <> СтрокаВОбъекте.ДатаПодписи + Или Строка.Комментарий <> СтрокаВОбъекте.Комментарий + Или Строка.КомуВыданСертификат <> СтрокаВОбъекте.КомуВыданСертификат + Или Строка.Отпечаток <> СтрокаВОбъекте.Отпечаток + Или Строка.УстановившийПодпись <> СтрокаВОбъекте.УстановившийПодпись Тогда + Возврат; // Если объект был изменен, результаты проверки не переносятся. + КонецЕсли; + КонецЦикла; + + Для Каждого Строка Из ПодписиВФорме Цикл + СтрокаВОбъекте = ПодписиВОбъекте.Получить(ПодписиВФорме.Индекс(Строка)); + ЗаполнитьЗначенияСвойств(Свойства, СтрокаВОбъекте); + Если Строка.ДатаПроверкиПодписи = Свойства.ДатаПроверкиПодписи + И Строка.ПодписьВерна = Свойства.ПодписьВерна Тогда + Продолжить; // Не нужно устанавливать модифицированность, если результаты проверки совпадают. + КонецЕсли; + ЗаполнитьЗначенияСвойств(Свойства, Строка); + ЗаполнитьЗначенияСвойств(СтрокаВОбъекте, Свойства); + МодульЭлектроннаяПодпись.ОбновитьПодпись(ПодписанныйФайл, СтрокаВОбъекте); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Прочие функции + +// Возвращает Истина, если текст из файлов извлекается на сервере, а не на клиенте. +// +// Возвращаемое значение: +// Булево. Ложь - если текст не извлекается на сервере, +// т.е. может и должен быть извлечен на клиенте. +// +Функция ИзвлекатьТекстыФайловНаСервере() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.ИзвлекатьТекстыФайловНаСервере.Получить(); + +КонецФункции + +// Возвращает Истина, если сервер работает под Windows. +Функция ЭтоПлатформаWindows() Экспорт + + СистемнаяИнфо = Новый СистемнаяИнформация; + ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; + + Возврат (ТипПлатформыСервера = ТипПлатформы.Windows_x86) + Или (ТипПлатформыСервера = ТипПлатформы.Windows_x86_64); + +КонецФункции + +// Получает строку из временного хранилища (передача с клиента на сервер, +// делается через временное хранилище). +// +Функция ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста) Экспорт + + Если ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + Возврат ""; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ПолучитьИзВременногоХранилища(АдресВременногоХранилищаТекста).Записать(ИмяВременногоФайла); + + ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + Текст = ТекстовыйФайл.Прочитать(); + ТекстовыйФайл.Закрыть(); + УдалитьФайлы(ИмяВременногоФайла); + + Возврат Текст; + +КонецФункции + +// Записывает на сервер результат извлечения текста - извлеченный текст и СтатусИзвлеченияТекста. +Процедура ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияСсылка, + РезультатИзвлечения, + АдресВременногоХранилищаТекста) Экспорт + + ФайлИлиВерсияОбъект = ФайлИлиВерсияСсылка.ПолучитьОбъект(); + ФайлИлиВерсияОбъект.Заблокировать(); + + Если ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + Текст = ""; + Иначе + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ФайлИлиВерсияОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); + КонецЕсли; + + Если РезультатИзвлечения = "НеИзвлечен" Тогда + ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИначеЕсли РезультатИзвлечения = "Извлечен" Тогда + ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + ИначеЕсли РезультатИзвлечения = "ИзвлечьНеУдалось" Тогда + ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + КонецЕсли; + + ПриЗаписиИзвлеченногоТекста(ФайлИлиВерсияОбъект); + +КонецПроцедуры + +// Получает кодировку текстового файла, указанную пользователем (если есть). // // Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// +// ВерсияФайла - ссылка на версию файла. +// +// Возвращаемое значение: +// Строка - идентификатор кодировки текста или пустая строка. +// +Функция ПолучитьКодировкуВерсииФайла(ВерсияФайла) Экспорт + + Возврат РаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла(ВерсияФайла); + +КонецФункции + +Функция СписокРасширенийДляПредпросмотра() Экспорт + + // См. также перечисление ФорматКартинки. + РасширенияДляПредпросмотра = Новый СписокЗначений; + РасширенияДляПредпросмотра.Добавить("bmp"); + РасширенияДляПредпросмотра.Добавить("emf"); + РасширенияДляПредпросмотра.Добавить("gif"); + РасширенияДляПредпросмотра.Добавить("ico"); + РасширенияДляПредпросмотра.Добавить("icon"); + РасширенияДляПредпросмотра.Добавить("jpg"); + РасширенияДляПредпросмотра.Добавить("jpeg"); + РасширенияДляПредпросмотра.Добавить("png"); + РасширенияДляПредпросмотра.Добавить("tiff"); + РасширенияДляПредпросмотра.Добавить("tif"); + РасширенияДляПредпросмотра.Добавить("wmf"); + + Возврат РасширенияДляПредпросмотра; + +КонецФункции + +Функция СписокЗапрещенныхРасширений() Экспорт + + СписокЗапрещенныхРасширений = Новый СписокЗначений; + СписокЗапрещенныхРасширений.Добавить("ade"); + СписокЗапрещенныхРасширений.Добавить("adp"); + СписокЗапрещенныхРасширений.Добавить("app"); + СписокЗапрещенныхРасширений.Добавить("bas"); + СписокЗапрещенныхРасширений.Добавить("bat"); + СписокЗапрещенныхРасширений.Добавить("chm"); + СписокЗапрещенныхРасширений.Добавить("class"); + СписокЗапрещенныхРасширений.Добавить("cmd"); + СписокЗапрещенныхРасширений.Добавить("com"); + СписокЗапрещенныхРасширений.Добавить("cpl"); + СписокЗапрещенныхРасширений.Добавить("crt"); + СписокЗапрещенныхРасширений.Добавить("dll"); + СписокЗапрещенныхРасширений.Добавить("exe"); + СписокЗапрещенныхРасширений.Добавить("fxp"); + СписокЗапрещенныхРасширений.Добавить("hlp"); + СписокЗапрещенныхРасширений.Добавить("hta"); + СписокЗапрещенныхРасширений.Добавить("ins"); + СписокЗапрещенныхРасширений.Добавить("isp"); + СписокЗапрещенныхРасширений.Добавить("jse"); + СписокЗапрещенныхРасширений.Добавить("js"); + СписокЗапрещенныхРасширений.Добавить("lnk"); + СписокЗапрещенныхРасширений.Добавить("mda"); + СписокЗапрещенныхРасширений.Добавить("mdb"); + СписокЗапрещенныхРасширений.Добавить("mde"); + СписокЗапрещенныхРасширений.Добавить("mdt"); + СписокЗапрещенныхРасширений.Добавить("mdw"); + СписокЗапрещенныхРасширений.Добавить("mdz"); + СписокЗапрещенныхРасширений.Добавить("msc"); + СписокЗапрещенныхРасширений.Добавить("msi"); + СписокЗапрещенныхРасширений.Добавить("msp"); + СписокЗапрещенныхРасширений.Добавить("mst"); + СписокЗапрещенныхРасширений.Добавить("ops"); + СписокЗапрещенныхРасширений.Добавить("pcd"); + СписокЗапрещенныхРасширений.Добавить("pif"); + СписокЗапрещенныхРасширений.Добавить("prf"); + СписокЗапрещенныхРасширений.Добавить("prg"); + СписокЗапрещенныхРасширений.Добавить("reg"); + СписокЗапрещенныхРасширений.Добавить("scf"); + СписокЗапрещенныхРасширений.Добавить("scr"); + СписокЗапрещенныхРасширений.Добавить("sct"); + СписокЗапрещенныхРасширений.Добавить("shb"); + СписокЗапрещенныхРасширений.Добавить("shs"); + СписокЗапрещенныхРасширений.Добавить("url"); + СписокЗапрещенныхРасширений.Добавить("vb"); + СписокЗапрещенныхРасширений.Добавить("vbe"); + СписокЗапрещенныхРасширений.Добавить("vbs"); + СписокЗапрещенныхРасширений.Добавить("wsc"); + СписокЗапрещенныхРасширений.Добавить("wsf"); + СписокЗапрещенныхРасширений.Добавить("wsh"); + + Возврат СписокЗапрещенныхРасширений; + +КонецФункции + +Функция ПодготовитьСтруктуруПараметровОтправки() Экспорт + + Возврат Новый Структура("Получатель,Тема,Текст", Неопределено, "", ""); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обмен файлами + +// Подготовка параметров и предварительные проверки перед созданием файлового начального образа. +// +Функция ПодготовитьДанныеДляСозданияФайловогоНачальногоОбраза(СтруктураПараметров) Экспорт + + Результат = Новый Структура("ДанныеПодготовлены, ТребуетсяПодтверждение, ТекстВопроса", Истина, Ложь, ""); + + Узел = СтруктураПараметров.Узел; + УникальныйИдентификаторФормы = СтруктураПараметров.УникальныйИдентификаторФормы; + Язык = СтруктураПараметров.Язык; + ПолноеИмяФайловойБазыWindows = СтруктураПараметров.ПолноеИмяФайловойБазыWindows; + ПолноеИмяФайловойБазыLinux = СтруктураПараметров.ПолноеИмяФайловойБазыLinux; + ПутьКАрхивуСФайламиТомовWindows = СтруктураПараметров.ПутьКАрхивуСФайламиТомовWindows; + ПутьКАрхивуСФайламиТомовLinux = СтруктураПараметров.ПутьКАрхивуСФайламиТомов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 = 'Укажите полное имя архива с файлами томов (файл *.zip)'"),, + "ПутьКАрхивуСФайламиТомовWindows"); + Результат.ДанныеПодготовлены = Ложь; + Иначе + Файл = Новый Файл(ПутьКАрхивуСФайламиТомов); + + Если Файл.Существует() И ФайлБазы.Существует() Тогда + Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файлы ""%1"" и ""%2"" уже существуют. + |Заменить существующие файлы?'"), ПутьКАрхивуСФайламиТомов, ПолноеИмяФайловойБазы); + Результат.ТребуетсяПодтверждение = Истина; + ИначеЕсли Файл.Существует() Тогда + Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" уже существует. + |Заменить существующий файл?'"), ПутьКАрхивуСФайламиТомов); + Результат.ТребуетсяПодтверждение = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Результат.ДанныеПодготовлены Тогда + Если ФайлБазы.Существует() И НЕ Результат.ТребуетсяПодтверждение Тогда + Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" уже существует. + |Заменить существующий файл?'"), ПолноеИмяФайловойБазы); + Результат.ТребуетсяПодтверждение = Истина; + КонецЕсли; + + // Создать временный каталог. + ИмяКаталога = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталога); + + // Создать временный каталог для файлов. + ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталогаФайлов); + + // Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. + СохранитьНастройку("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); + + // Добавляем в параметры переменные, которые потребуются для создания начального образа. + СтруктураПараметров.Вставить("ИмяКаталога", ИмяКаталога); + СтруктураПараметров.Вставить("ИмяКаталогаФайлов", ИмяКаталогаФайлов); + СтруктураПараметров.Вставить("ЕстьФайлыВТомах", ЕстьФайлыВТомах); + СтруктураПараметров.Вставить("ПутьКАрхивуСФайламиТомов", ПутьКАрхивуСФайламиТомов); + СтруктураПараметров.Вставить("ПолноеИмяФайловойБазы", ПолноеИмяФайловойБазы); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Создать файловый начальный образ на сервере. +// +Процедура СоздатьФайловыйНачальныйОбразНаСервере(Параметры, АдресХранилища) Экспорт + + Попытка + + СтрокаСоединения = "File=""" + Параметры.ИмяКаталога + """;" + + "Locale=""" + Параметры.Язык + """;"; + ПланыОбмена.СоздатьНачальныйОбраз(Параметры.Узел, СтрокаСоединения); // Собственно создание начального образа. + + Если Параметры.ЕстьФайлыВТомах Тогда + ZIP = Новый ЗаписьZipФайла; + ZIP.Открыть(Параметры.ПутьКАрхивуСФайламиТомов); + + ВременныеФайлы = Новый Массив; + ВременныеФайлы = НайтиФайлы(Параметры.ИмяКаталогаФайлов, "*.*"); + + Для Каждого ВременныйФайл Из ВременныеФайлы Цикл + Если ВременныйФайл.ЭтоФайл() Тогда + ПутьВременногоФайла = ВременныйФайл.ПолноеИмя; + ZIP.Добавить(ПутьВременногоФайла); + КонецЕсли; + КонецЦикла; + + ZIP.Записать(); + + УдалитьФайлы(Параметры.ИмяКаталогаФайлов); // Удаляем вместе с файлами внутри. + КонецЕсли; + + Исключение + + УдалитьФайлы(Параметры.ИмяКаталога); + ВызватьИсключение; + + КонецПопытки; + + ПутьВременногоФайлаБазы = Параметры.ИмяКаталога + "\1Cv8.1CD"; + ПереместитьФайл(ПутьВременногоФайлаБазы, Параметры.ПолноеИмяФайловойБазы); + + // очистка + УдалитьФайлы(Параметры.ИмяКаталога); + +КонецПроцедуры + +// Подготовка параметров и предварительные проверки перед созданием серверного начального образа. +// +Функция ПодготовитьДанныеДляСозданияСерверногоНачальногоОбраза(СтруктураПараметров) Экспорт + + Результат = Новый Структура("ДанныеПодготовлены, ТребуетсяПодтверждение, ТекстВопроса", Истина, Ложь, ""); + + Узел = СтруктураПараметров.Узел; + СтрокаСоединения = СтруктураПараметров.СтрокаСоединения; + ПутьКАрхивуСФайламиТомовWindows = СтруктураПараметров.ПутьКАрхивуСФайламиТомовWindows; + ПутьКАрхивуСФайламиТомовLinux = СтруктураПараметров.ПутьКАрхивуСФайламиТомов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.Записать(); + УдалитьФайлы(Параметры.ИмяКаталогаФайлов); // Удаляем вместе с файлами внутри. + КонецЕсли; + + Исключение + + УдалитьФайлы(Параметры.ИмяКаталога); + ВызватьИсключение; + + КонецПопытки; + + // очистка + УдалитьФайлы(Параметры.ИмяКаталога); + +КонецПроцедуры + +// Размещает файлы в томах, устанавливая ссылки в ВерсииФайла. +// +Функция ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux) Экспорт + + ПолноеИмяФайлаZip = ""; + СистемнаяИнфо = Новый СистемнаяИнформация; + ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + ПолноеИмяФайлаZip = ПутьКАрхивуWindows; + Иначе + ПолноеИмяФайлаZip = ПутьКАрхивуLinux; + КонецЕсли; + + ИмяКаталога = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталога); + + ZIP = Новый ЧтениеZipФайла(ПолноеИмяФайлаZip); + ZIP.ИзвлечьВсе(ИмяКаталога, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + + СоответствиеПутейФайлов = Новый Соответствие; + + Для Каждого ZIPЭлемент Из ZIP.Элементы Цикл + ПолныйПутьФайла = ИмяКаталога + "\" + ZIPЭлемент.Имя; + УникальныйИдентификатор = ZIPЭлемент.ИмяБезРасширения; + + СоответствиеПутейФайлов.Вставить(УникальныйИдентификатор, ПолныйПутьФайла); + КонецЦикла; + + ТипХраненияФайлов = ТипХраненияФайлов(); + ПрисоединяемыеФайлы = Новый Массив; + НачатьТранзакцию(); + Попытка + РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайлыВТомаПриРазмещении( + СоответствиеПутейФайлов, ТипХраненияФайлов); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + // Очистим регистрацию изменений, которые мы только что сделали. + Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл + ИмяПланаОбмена = ПланОбмена.Имя; + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + Выборка = МенеджерПланаОбмена.Выбрать(); + + Пока Выборка.Следующий() Цикл + + ПланОбменаОбъект = Выборка.ПолучитьОбъект(); + Если ПланОбменаОбъект.Ссылка <> ЭтотУзел Тогда + РаботаСФайламиСлужебныйВызовСервера.УдалитьРегистрациюИзменений(ПланОбменаОбъект.Ссылка); + КонецЕсли; + КонецЦикла; + + КонецЦикла; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики регламентных заданий. + +// Обработчик регламентного задания ИзвлечениеТекста. +// Извлекает текст из файлов на диске. +// +Процедура ИзвлечьТекстИзФайловНаСервере() Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ИзвлечениеТекста); + + ИзвлечьТекстИзФайлов(); + +КонецПроцедуры + +Процедура ИзвлечьТекстИзФайлов() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ ЭтоПлатформаWindows() Тогда + Возврат; // Извлечение текста работает только под Windows. + КонецЕсли; + + ИмяСРасширениемФайла = ""; + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Извлечение текста'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + , + , + НСтр("ru = 'Начато регламентное извлечения текста'")); + + Запрос = Новый Запрос; + Запрос.Текст = РаботаСФайламиСлужебныйВызовСервера.ТекстЗапросаДляИзвлеченияТекста(); + Результат = Запрос.Выполнить(); + + ТаблицаВыгрузки = Результат.Выгрузить(); + + Для Каждого Строка Из ТаблицаВыгрузки Цикл + + ФайлОбъект = Строка.Ссылка.ПолучитьОбъект(); + Попытка + ФайлОбъект.Заблокировать(); + Исключение + // Заблокированные файлы будут обработаны в следующий раз. + Продолжить; + КонецПопытки; + + ИмяСРасширениемФайла = ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение; + + Если ЭтоЭлементРаботаСФайлами(ФайлОбъект.Ссылка) Тогда + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(ФайлОбъект.Ссылка)); + ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъекта); + Если ВозможностьХранитьВерсии И ЗначениеЗаполнено(ФайлОбъект.ТекущаяВерсия.Ссылка) Тогда + ИмяФайлаСПутем = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемКДвоичнымДанным(ФайлОбъект.ТекущаяВерсия.Ссылка, Истина); + Иначе + ИмяФайлаСПутем = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемКДвоичнымДанным(ФайлОбъект.Ссылка, Истина); + КонецЕсли; + КонецЕсли; + + Кодировка = ПолучитьКодировкуВерсииФайла(Строка.Ссылка); + + Отказ = Ложь; + Если ПустаяСтрока(ИмяФайлаСПутем) Тогда + Отказ = Истина; + Текст = ""; + Иначе + Текст = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекст(ИмяФайлаСПутем, Отказ, Кодировка); + КонецЕсли; + + Если Отказ = Ложь Тогда + ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + Иначе + // Если текст некому извлечь это не ошибка, а нормальный случай. + ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + КонецЕсли; + + Если Строка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе + И Не ПустаяСтрока(ИмяФайлаСПутем) Тогда + + УдалитьФайлы(ИмяФайлаСПутем); + КонецЕсли; + + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст, Новый СжатиеДанных); + + Попытка + ПриЗаписиИзвлеченногоТекста(ФайлОбъект); + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Извлечение текста'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного извлечения текста из файла + |""%1"" + |произошла ошибка: + |""%2"".'"), + ИмяСРасширениемФайла, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) )); + КонецПопытки; + + КонецЦикла; + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Извлечение текста'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + , + , + НСтр("ru = 'Закончено регламентное извлечение текста'")); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + +// Перенести константы СписокЗапрещенныхРасширений и СписокРасширенийФайловOpenDocument. +Процедура ПеренестиКонстантыРасширений() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + + СписокЗапрещенныхРасширений = Константы.СписокЗапрещенныхРасширений.Получить(); + Константы.СписокЗапрещенныхРасширенийОбластиДанных.Установить(СписокЗапрещенныхРасширений); + + СписокРасширенийФайловOpenDocument = Константы.СписокРасширенийФайловOpenDocument.Получить(); + Константы.СписокРасширенийФайловOpenDocumentОбластиДанных.Установить(СписокРасширенийФайловOpenDocument); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Сканирование + +Функция ПараметрыСканераВПеречисления(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло) Экспорт + + Если РазрешениеЧисло = 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; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Разрешение", Разрешение); + Результат.Вставить("Цветность", Цветность); + Результат.Вставить("Поворот", Поворот); + Результат.Вставить("РазмерБумаги", РазмерБумаги); + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Очистка ненужных файлов + +Процедура ОчиститьНенужныеФайлы(Параметры = Неопределено, АдресРезультата = Неопределено) Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОчисткаНенужныхФайлов); + + УстановитьПривилегированныйРежим(Истина); + + НастройкиОчистки = РегистрыСведений.НастройкиОчисткиФайлов.ТекущиеНастройкиОчистки(); + + НастройкиОчисткиФайлов = НастройкиОчистки.НайтиСтроки(Новый Структура("ЭтоНастройкаДляЭлементаСправочника", Ложь)); + + Для Каждого Настройка Из НастройкиОчисткиФайлов Цикл + + МассивИсключений = Новый Массив; + ДетализированныеНастройки = НастройкиОчистки.НайтиСтроки(Новый Структура( + "ИдентификаторВладельца, ЭтоНастройкаДляЭлементаСправочника", + Настройка.ВладелецФайла, + Истина)); + Если ДетализированныеНастройки.Количество() > 0 Тогда + Для Каждого ЭлементИсключение Из ДетализированныеНастройки Цикл + МассивИсключений.Добавить(ЭлементИсключение.ВладелецФайла); + ОчиститьДанныеНенужныхФайлов(ЭлементИсключение); + КонецЦикла; + КонецЕсли; + + ОчиститьДанныеНенужныхФайлов(Настройка, МассивИсключений); + КонецЦикла; + + +КонецПроцедуры + +Функция ОбъектыИсключенияПриОчисткеФайлов() Экспорт + + НастройкиФайлов = НастройкиФайлов(); + РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(НастройкиФайлов); + + Возврат НастройкиФайлов.НеОчищатьФайлы; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); КонецПроцедуры -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт Массив.Добавить(Метаданные.РегистрыСведений.ФайлыВРабочемКаталоге.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.СведенияОФайлах.ПолноеИмя()); КонецПроцедуры -// Добавляет файл на том при "Разместить файлы начального образа". -// -Процедура ПриДобавленииФайловВТомаПриРазмещении(СоответствиеПутейФайлов, ХранитьФайлыВТомахНаДиске, ПрисоединяемыеФайлы) Экспорт +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайлыВТомаПриРазмещении(СоответствиеПутейФайлов, ХранитьФайлыВТомахНаДиске); + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не ПравоДоступа("Чтение", Метаданные.Справочники.Файлы) + Или МодульТекущиеДелаСервер.ДелоОтключено("РедактируемыеФайлы") Тогда + Возврат; + КонецЕсли; + + КоличествоЗанятыхФайлов = КоличествоЗанятыхФайлов(ПользователиКлиентСервер.АвторизованныйПользователь()); + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Файлы.ПолноеИмя()); + + Для Каждого Раздел Из Разделы Цикл + + ИдентификаторРедактируемыеФайлы = "РедактируемыеФайлы" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторРедактируемыеФайлы; + Дело.ЕстьДела = КоличествоЗанятыхФайлов > 0; + Дело.Представление = НСтр("ru = 'Редактируемые файлы'"); + Дело.Количество = КоличествоЗанятыхФайлов; + Дело.Важное = Ложь; + Дело.Форма = "Обработка.РаботаСФайлами.Форма.РедактируемыеФайлы"; + Дело.Владелец = Раздел; + + КонецЦикла; КонецПроцедуры -// Удаляет регистрацию изменений после "Разместить файлы начального образа". -// -Процедура ПриУдаленииРегистрацииИзменений(ПланОбменаСсылка, ПрисоединяемыеФайлы) Экспорт - - РаботаСФайламиСлужебныйВызовСервера.УдалитьРегистрациюИзменений(ПланОбменаСсылка); - +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ПапкиФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.Файлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ВерсииФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Возвращает число файлов с неизвлеченным текстом. -// -Процедура ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом(ЧислоВерсий) Экспорт +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - ЧислоВерсий = 0; - ЧислоВерсий = ЧислоВерсий + РаботаСФайламиСлужебныйВызовСервера.ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(); + // Синхронизация файлов с облачным сервисом. -КонецПроцедуры - -// Записывает извлеченный текст. -// -Процедура ПриЗаписиИзвлеченногоТекста(ФайлОбъект) Экспорт - - Если ЭтоЭлементРаботаСФайлами(ФайлОбъект) Тогда - РаботаСФайламиСлужебныйВызовСервера.ПриЗаписиИзвлеченногоТекста(ФайлОбъект); + // Загрузка в справочник ТомаХраненияФайлов запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); КонецЕсли; КонецПроцедуры -// Возвращает в параметре КоличествоФайловВТомах количество файлов в томах. -// -Процедура ПриОпределенииКоличестваФайловВТомах(КоличествоФайловВТомах) Экспорт - - РаботаСФайламиСлужебныйВызовСервера.ОпределитьКоличествоФайловВТомах(КоличествоФайловВТомах); - -КонецПроцедуры - -// Возвращает Истина в параметре ЕстьХранимыеФайлы, если есть хранимые файлы к объекту ВнешнийОбъект. -// -Процедура ПриОпределенииНаличияХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы) Экспорт - - РаботаСФайламиСлужебныйВызовСервера.ОпределитьНаличиеХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы); - -КонецПроцедуры - -// Возвращает в параметре ХранимыеФайлы массив хранимых файлов к объекту ВнешнийОбъект. -// -Процедура ПриПолученииХранимыхФайлов(ВнешнийОбъект, ХранимыеФайлы) Экспорт - - РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранимыеФайлы(ВнешнийОбъект, ХранимыеФайлы); - -КонецПроцедуры - -// Возвращает навигационную ссылку на файл (на реквизит или во временное хранилище). -// -Процедура ПриОпределенииНавигационнойСсылкиФайла(ФайлСсылка, УникальныйИдентификатор, НавигационнаяСсылка) Экспорт - - Если ЭтоЭлементРаботаСФайлами(ФайлСсылка) Тогда - НавигационнаяСсылка = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия(ФайлСсылка, УникальныйИдентификатор); +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ИзвлечениеТекста; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); + Зависимость.ФункциональнаяОпция = МодульПолнотекстовыйПоискСервер.ИспользоватьПолнотекстовыйПоиск(); КонецЕсли; + Зависимость.ДоступноВМоделиСервиса = Ложь; + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОчисткаНенужныхФайлов; + Зависимость.РаботаетСВнешнимиРесурсами = Истина; + + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияФайлов; + Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюФайлов; + Зависимость.РаботаетСВнешнимиРесурсами = Истина; КонецПроцедуры -// Получает полный путь к файлу на диске. -// -Процедура ПриОпределенииИмениФайлаСПутемКДвоичнымДанным(ФайлСсылка, ПутьКФайлу, ПустойПутьДляПустыхДанных = Ложь) Экспорт - - Если ЭтоЭлементРаботаСФайлами(ФайлСсылка) Тогда - ПутьКФайлу = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемКДвоичнымДанным(ФайлСсылка, ПустойПутьДляПустыхДанных); - КонецЕсли; - -КонецПроцедуры - -// Заполняет описания возможных прав, назначаемых для объектов, указанных типов. -// -// Параметры: -// ВозможныеПрава - ТаблицаЗначений, содержащая поля, -// описание которых см. в комментарии к функции. -// РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов. Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт //////////////////////////////////////////////////////////// @@ -1154,40 +2249,7 @@ КонецПроцедуры -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в -// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому -// ограничивается текущий объект таблицы. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, -// которые используются для этого вида доступа. Т.е. перечислить типы, -// которые соответствуют полю, использованному в шаблоне ограничения доступа -// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" -// нужно перечислить только те типы поля, которые есть у поля. -// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Описание = Описание + " @@ -1197,7 +2259,6 @@ |Справочник.ВерсииФайлов.Изменение.Объект.Справочник.ПапкиФайлов |Справочник.Файлы.Чтение.Объект.Справочник.ПапкиФайлов |Справочник.Файлы.Изменение.Объект.Справочник.ПапкиФайлов - |РегистрСведений.ХранимыеФайлыВерсий.Чтение.Объект.Справочник.ПапкиФайлов |"; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда @@ -1206,67 +2267,1278 @@ |Справочник.ВерсииФайлов.Изменение.Объект.БизнесПроцесс.Задание |Справочник.Файлы.Чтение.Объект.БизнесПроцесс.Задание |Справочник.Файлы.Изменение.Объект.БизнесПроцесс.Задание - |РегистрСведений.ХранимыеФайлыВерсий.Чтение.Объект.БизнесПроцесс.Задание |"; КонецЕсли; КонецПроцедуры -// Заполняет перечень обработчиков интеграции подсистемы. -// "ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса". -// -// Параметры: -// Обработчики - Массив(Строка), имя общего модуля обработчика. -// -Процедура ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса(Обработчики) Экспорт +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчики.Добавить("РаботаСФайламиСлужебный"); + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "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.1.2.2"; + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДатуМодификацииФайла"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.2.1.2"; + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПереместитьФайлыИзИнформационнойБазыВРегистрСведений"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.2.1.2"; + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДатуЗаема"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.1.6"; + Обработчик.Процедура = "РаботаСФайламиСлужебный.ПеренестиКонстантыРасширений"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаменитьПраваВНастройкахПравПапокФайлов"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "РаботаСФайламиСлужебный.ОбновитьСписокЗапрещенныхРасширений"; + Обработчик.РежимВыполнения = "Оперативно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "РаботаСФайламиСлужебный.ОбновитьСписокЗапрещенныхРасширенийВОбластиДанных"; + Обработчик.РежимВыполнения = "Оперативно"; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.49"; + Обработчик.Комментарий = + НСтр("ru = 'Перенос электронных подписей и сертификатов шифрования + |из табличных частей в регистры сведений.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("d70f378a-41f5-4b0a-a1a7-f4ba27c7f91b"); + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РаботаСФайламиСлужебныйВызовСервера.ЗарегистрироватьОбъектыДляПереносаЭлектронныхПодписейИСертификатовШифрования"; + Обработчик.ЧитаемыеОбъекты = СтрСоединить(РаботаСФайламиСлужебныйВызовСервера.ПолныеИменаСправочниковПрисоединенныхФайлов(), ", "); + Обработчик.ИзменяемыеОбъекты = РаботаСФайламиСлужебныйВызовСервера.ИзменяемыеОбъектыПриПереносеЭлектронныхПодписейИСертификатовШифрования(); + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.ДвоичныеДанныеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.НаличиеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы"; + Приоритет.Порядок = "Любой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.62"; + Обработчик.Комментарий = + НСтр("ru = 'Перенос электронных подписей с версий файлов на файлы.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("d0a26f83-8dd3-4965-93a6-8469c9c91998"); + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОчередьОтложеннойОбработки = 2; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РаботаСФайламиСлужебныйВызовСервера.ЗарегистрироватьОбъектыДляПереносаЭлектронныхПодписейСВерсийФайловНаФайлы"; + Обработчик.ЧитаемыеОбъекты = РаботаСФайламиСлужебныйВызовСервера.ОбъектыПриПереносеЭлектронныхПодписейСВерсийФайловНаФайлы(Истина); + Обработчик.ИзменяемыеОбъекты = РаботаСФайламиСлужебныйВызовСервера.ОбъектыПриПереносеЭлектронныхПодписейСВерсийФайловНаФайлы(Ложь); + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.ДвоичныеДанныеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Приоритет.Порядок = "Любой"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.50"; + Обработчик.Комментарий = + НСтр("ru = 'Перенос двоичных данных файлов в регистр сведений Двоичные данные файлов.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("bb2c6a93-98b0-4a01-8793-6b82f316490e"); + Обработчик.Процедура = "РегистрыСведений.ДвоичныеДанныеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОчередьОтложеннойОбработки = 2; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.ДвоичныеДанныеФайлов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.ВерсииФайлов"; + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.ДвоичныеДанныеФайлов"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы"; + Приоритет.Порядок = "Любой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Комментарий = + НСтр("ru = 'Перенос информации о наличии файлов в регистр сведений Наличие файлов.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("a84931bb-dfd5-4525-ab4a-1a0646e17334"); + Обработчик.Процедура = "РегистрыСведений.НаличиеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.НаличиеФайлов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.Файлы"; + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.НаличиеФайлов"; + Обработчик.ОчередьОтложеннойОбработки = 3; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Комментарий = + НСтр("ru = 'Перенос информации о файлах в регистр сведений Сведения о файлах.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("5137a43e-75aa-4a68-ba2f-525a3a646af8"); + Обработчик.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ЧитаемыеОбъекты = РегистрыСведений.СведенияОФайлах.ЧитаемыеОбъектыПриОбновленииИБ(); + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.СведенияОФайлах"; + Обработчик.ОчередьОтложеннойОбработки = 4; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.СведенияОФайлах.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.НаличиеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.ДвоичныеДанныеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы"; + Приоритет.Порядок = "Любой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Комментарий = + НСтр("ru = 'Обновление универсальной даты обновления элементов справочника Файлы.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("8b417c47-dd46-45ce-b59b-c675059c9020"); + Обработчик.Процедура = "Справочники.Файлы.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ЧитаемыеОбъекты = "Справочник.Файлы"; + Обработчик.ИзменяемыеОбъекты = "Справочник.Файлы"; + Обработчик.ОчередьОтложеннойОбработки = 5; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.Файлы.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.НаличиеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.ДвоичныеДанныеФайлов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "РегистрыСведений.СведенияОФайлах.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "Любой"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РаботаСФайламиСлужебный.ОбновитьПутьТомаLinux"; + Обработчик.РежимВыполнения = "Оперативно"; КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Чтение", Метаданные.Справочники.Файлы) - Или МодульТекущиеДелаСервер.ДелоОтключено("РедактируемыеФайлы") Тогда + Библиотека = "СтандартныеПодсистемы"; + + СтароеИмя = "Роль.РаботаСПапкамиФайлов"; + НовоеИмя = "Роль.ДобавлениеИзменениеПапокИФайлов"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.4.1.1", СтароеИмя, НовоеИмя, Библиотека); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; - КоличествоЗанятыхФайлов = КоличествоЗанятыхФайлов(ПользователиКлиентСервер.АвторизованныйПользователь()); + НастройкиРаботыСФайлами = РаботаСФайламиСлужебныйПовтИсп.НастройкиРаботыСФайлами(); - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Файлы.ПолноеИмя()); + Параметры.Вставить("ПерсональныеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( + НастройкиРаботыСФайлами.ПерсональныеНастройки)); - Для Каждого Раздел Из Разделы Цикл + Параметры.Вставить("ОбщиеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( + НастройкиРаботыСФайлами.ОбщиеНастройки)); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + НастройкиРаботыСФайлами = РаботаСФайламиСлужебныйПовтИсп.НастройкиРаботыСФайлами(); + + Параметры.Вставить("ПерсональныеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( + НастройкиРаботыСФайлами.ПерсональныеНастройки)); - ИдентификаторРедактируемыеФайлы = "РедактируемыеФайлы" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИдентификаторРедактируемыеФайлы; - Дело.ЕстьДела = КоличествоЗанятыхФайлов > 0; - Дело.Представление = НСтр("ru = 'Редактируемые файлы'"); - Дело.Количество = КоличествоЗанятыхФайлов; - Дело.Важное = Ложь; - Дело.Форма = "Справочник.Файлы.Форма.РедактируемыеФайлы"; - Дело.Владелец = Раздел; + КоличествоЗанятыхФайлов = 0; + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Пользователь = ПользователиКлиентСервер.АвторизованныйПользователь(); + Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + КоличествоЗанятыхФайлов = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКоличествоЗанятыхФайлов(, Пользователь); + КонецЕсли; + КонецЕсли; + + Параметры.Вставить("КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов); + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + Если ПолучитьФункциональнуюОпцию("ХранитьФайлыВТомахНаДиске") Тогда + Справочники.ТомаХраненияФайлов.ДобавитьЗапросыНаИспользованиеВнешнихРесурсовВсехТомов(ЗапросыРазрешений); + КонецЕсли; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + // В процессе выгрузки данных ссылки на справочник ТомаХраненияФайлов очищаются, + // а при загрузке загрузка производится относительно настройки томов в ИБ, в которую + // производится загрузка, а не относительно настройки томов в ИБ, из которой были + // выгружены данные. + Типы.Добавить(Метаданные.Справочники.ТомаХраненияФайлов); + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ОбъемНенужныхФайлов); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПроверкаЦелостностиТома); +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.СобратьСтатистикуКонфигурации. +Процедура СобратьСтатистикуКонфигурации() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + Возврат; + КонецЕсли; + + МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); + + ТекстЗапроса = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(1) КАК Количество + |ИЗ + | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов"; + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.УчетныеЗаписиСинхронизацииФайлов", Выборка.Количество()); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает навигационную ссылку на файл (на реквизит или во временное хранилище). +Функция НавигационнойСсылкиФайла(ФайлСсылка, УникальныйИдентификатор) Экспорт + + Если ЭтоЭлементРаботаСФайлами(ФайлСсылка) Тогда + Возврат РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия(ФайлСсылка, УникальныйИдентификатор); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Обработчик подписки "при записи" присоединенного файла. +// +Процедура ПриЗаписиПрисоединенногоФайлаСервер(ВладелецФайлов, Источник) Экспорт + + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + + ЗаписьИзменилась = Ложь; + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.РегистрыСведений.НаличиеФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("ОбъектСФайлами", ВладелецФайлов); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.НаличиеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; + МенеджерЗаписи.Прочитать(); + + Если НЕ ЗначениеЗаполнено(МенеджерЗаписи.ОбъектСФайлами) Тогда + МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; + ЗаписьИзменилась = Истина; + КонецЕсли; + + Если НЕ МенеджерЗаписи.ЕстьФайлы Тогда + МенеджерЗаписи.ЕстьФайлы = Истина; + ЗаписьИзменилась = Истина; + КонецЕсли; + + Если ПустаяСтрока(МенеджерЗаписи.ИдентификаторОбъекта) Тогда + МенеджерЗаписи.ИдентификаторОбъекта = ПолучитьОчереднойИдентификаторОбъекта(); + ЗаписьИзменилась = Истина; + КонецЕсли; + + Если ЗаписьИзменилась Тогда + МенеджерЗаписи.Записать(); + КонецЕсли; + + Если Не Источник.ЭтоГруппа Тогда + МенеджерЗаписи = РегистрыСведений.СведенияОФайлах.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Источник); + МенеджерЗаписи.Файл = Источник; + Если Источник.ПодписанЭП И Источник.Зашифрован Тогда + МенеджерЗаписи.НомерКартинкиПодписанЗашифрован = 2; + ИначеЕсли Источник.Зашифрован Тогда + МенеджерЗаписи.НомерКартинкиПодписанЗашифрован = 1; + ИначеЕсли Источник.ПодписанЭП Тогда + МенеджерЗаписи.НомерКартинкиПодписанЗашифрован = 0; + Иначе + МенеджерЗаписи.НомерКартинкиПодписанЗашифрован = -1; + КонецЕсли; + + МенеджерЗаписи.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +// Служебная функция используется при создании начального образа. +// Выполняется всегда на сервере. +// +Процедура СкопироватьФайлПриСозданииНачальногоОбраза(ПолныйПуть, НовыйПутьФайла) + + Попытка + // Если файл в томе - скопируем его во временный каталог (при создании начального образа). + КопироватьФайл(ПолныйПуть, НовыйПутьФайла); + ФайлВременный = Новый Файл(НовыйПутьФайла); + ФайлВременный.УстановитьТолькоЧтение(Ложь); + Исключение + // Не регистрируется, возможно файл не найден. + КонецПопытки; + +КонецПроцедуры + +// Служебная функция используется для помещения двоичных данных файла в томе +// в хранилище значения. +// +Функция ПоместитьДвоичныеДанныеВХранилище(Том, ПутьКФайлу, УникальныйИдентификатор) + + ПолныйПуть = ПолныйПутьТома(Том) + ПутьКФайлу; + УникальныйИдентификатор = УникальныйИдентификатор; + + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + Возврат Новый ХранилищеЗначения(ДвоичныеДанные); + +КонецФункции + +Процедура ВыполнитьОчисткуДанныхОВерсии(ФайлСсылка) + + ИмяФайлаСПутем = ""; + ИмяФайлаСПутемДляУдаления = ""; + + НачатьТранзакцию(); + + Попытка + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + + ТекстКомментария = НСтр("ru = 'Файл удален при очистке ненужных файлов.'") + + " " + Формат(ТекущаяДатаСеанса(),"ДЛФ=D") + Символы.ПС; + + Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + ИмяФайлаСПутем = ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + ИмяФайлаСПутемДляУдаления = ИмяФайлаСПутем + ".del"; + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ФайлНаДиске.Существует() Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + // Переместим файл во временный. + ПереместитьФайл(ИмяФайлаСПутем, ИмяФайлаСПутемДляУдаления); + ФайлОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ФайлОбъект.ПутьКФайлу = ""; + ФайлОбъект.Комментарий = ТекстКомментария + ФайлОбъект.Комментарий; + ФайлОбъект.Записать(); + ФайлОбъект.УстановитьПометкуУдаления(Истина); + // Удалим временный файл, т.к. успешно обновили данные о файле. + УдалитьФайлы(ИмяФайлаСПутемДляУдаления); + КонецЕсли; + Иначе + РаботаСФайламиСлужебныйВызовСервера.УдалитьЗаписьИзРегистраДвоичныеДанныеФайлов(ФайлСсылка); + ФайлОбъект.Комментарий = ТекстКомментария + ФайлОбъект.Комментарий; + ФайлОбъект.Записать(); + ФайлОбъект.УстановитьПометкуУдаления(Истина); + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + Если Не ПустаяСтрока(ИмяФайлаСПутем) Тогда + + // Записать ошибку в журнал регистрации. + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очистка ненужных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,, ФайлСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + // Вернем файл на прежнее место в случае ошибки. + ПереместитьФайл(ИмяФайлаСПутемДляУдаления, ИмяФайлаСПутем); + + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Процедура ВыполнитьОчисткуДанныхОФайле(ФайлСсылка) + + ИмяФайлаСПутем = ""; + ИмяФайлаСПутемДляУдаления = ""; + + НачатьТранзакцию(); + + Попытка + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + + ТекстОписания = НСтр("ru = 'Файл удален при очистке ненужных файлов.'") + + " " + Формат(ТекущаяДатаСеанса(),"ДЛФ=D") + Символы.ПС; + + Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + ИмяФайлаСПутем = ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + ИмяФайлаСПутемДляУдаления = ИмяФайлаСПутем + ".del"; + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ФайлНаДиске.Существует() Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + // Переместим файл во временный. + ПереместитьФайл(ИмяФайлаСПутем, ИмяФайлаСПутемДляУдаления); + ФайлОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ФайлОбъект.ПутьКФайлу = ""; + ФайлОбъект.Описание = ТекстОписания + ФайлОбъект.Описание; + ФайлОбъект.Записать(); + ФайлОбъект.УстановитьПометкуУдаления(Истина); + // Удалим временный файл, т.к. успешно обновили данные о файле. + УдалитьФайлы(ИмяФайлаСПутемДляУдаления); + КонецЕсли; + Иначе + РаботаСФайламиСлужебныйВызовСервера.УдалитьЗаписьИзРегистраДвоичныеДанныеФайлов(ФайлСсылка); + ФайлОбъект.Описание = ТекстОписания + ФайлОбъект.Описание; + ФайлОбъект.Записать(); + ФайлОбъект.УстановитьПометкуУдаления(Истина); + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + Если Не ПустаяСтрока(ИмяФайлаСПутем) Тогда + + // Записать ошибку в журнал регистрации. + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очистка ненужных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,, ФайлСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + // Вернем файл на прежнее место в случае ошибки. + ПереместитьФайл(ИмяФайлаСПутемДляУдаления, ИмяФайлаСПутем); + + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +// Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. +// +Процедура СохранитьНастройку(КлючОбъекта, КлючНастроек, Настройки) + + УстановитьПривилегированныйРежим(Истина); + ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки); + +КонецПроцедуры + +// Возвращает количество файлов, хранящихся в томах. +Функция КоличествоФайловВТомах() + + КоличествоФайловВТомах = 0; + + РаботаСФайламиСлужебныйВызовСервера.ОпределитьКоличествоФайловВТомах(КоличествоФайловВТомах); + + Возврат КоличествоФайловВТомах; + +КонецФункции + +// Только для внутреннего использования. +// +Процедура ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь, Получатель = Неопределено) + + // Для обменов не РИБ используется алгоритм обычного сеанса обмена, а не создания начального образа, + // т.к. параметра СозданиеНачальногоОбраза равный Истина означает начальную выгрузку данных. + Если СозданиеНачальногоОбраза И Получатель <> Неопределено + И Не ОбщегоНазначения.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель.Ссылка) Тогда + СозданиеНачальногоОбраза = Ложь; + КонецЕсли; + + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить + ИЛИ ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + + // Стандартную обработку не переопределяем. + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") Тогда + + ЗаполнитьПутьКФайлуПриОтправке(ЭлементДанных); + + Если СозданиеНачальногоОбраза Тогда + + Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + Если Получатель <> Неопределено + И Получатель.ДополнительныеСвойства.Свойство("РазмещатьФайлыВНачальномОбразе") Тогда + + // Помещаем данные файла из тома на диске в служебный реквизит справочника. + ПоместитьФайлВРеквизитСправочника(ЭлементДанных); + + Иначе + + // Копируем файл из тома на диске в каталог создания начального образа. + ИмяКаталогаФайлов = Строка(ХранилищеОбщихНастроек.Загрузить("ОбменФайлами", "ВременныйКаталог")); + + ПолныйПуть = ПолныйПутьТома(ЭлементДанных.Том) + ЭлементДанных.ПутьКФайлу; + УникальныйИдентификатор = ЭлементДанных.Ссылка.УникальныйИдентификатор(); + + НовыйПутьФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ИмяКаталогаФайлов, + УникальныйИдентификатор); + + СкопироватьФайлПриСозданииНачальногоОбраза(ПолныйПуть, НовыйПутьФайла); + + КонецЕсли; + + Иначе + + // Если файл хранится в ИБ, то при создании начального образа + // он будет выгружен в составе регистра сведений ХранимыеФайлыВерсий. + + КонецЕсли; + + Иначе + ОбработатьОтправкуФайлаПоТипуХранения(ЭлементДанных); + + КонецЕсли; + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ДвоичныеДанныеФайлов") + И Не СозданиеНачальногоОбраза Тогда + + // Выгрузку регистра выполняем только при создании начального образа. + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + + ИначеЕсли НЕ СозданиеНачальногоОбраза + И ЭтоЭлементРаботаСФайлами(ЭлементДанных) + И ТипЗнч(ЭлементДанных) <> Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных") Тогда + // Справочник ИдентификаторыОбъектовМетаданных может пройти по результатам ЭтоЭлементРаботаСФайлами, + // но не должен обрабатываться здесь. + ОбработатьОтправкуФайлаПоТипуХранения(ЭлементДанных); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +// +Процедура ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента) + + ОбработатьПолученныеФайлы = Ложь; + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + + // Стандартную обработку не переопределяем. + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Файлы") Тогда + + Если ПолучениеФайлаЗапрещено(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + ОбработатьПолученныеФайлы = Истина; + + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") + Или (ЭтоЭлементРаботаСФайлами(ЭлементДанных) + И ТипЗнч(ЭлементДанных) <> Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных")) Тогда + + // Справочник ИдентификаторыОбъектовМетаданных может пройти по результатам ЭтоЭлементРаботаСФайлами, + // но не должен обрабатываться здесь. + Если ПолучениеВерсииФайлаЗапрещено(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + ОбработатьПолученныеФайлы = Истина; + + КонецЕсли; + + Если ОбработатьПолученныеФайлы Тогда + // Для существующих файлов, размещенных в томах, выполняем их удаление из томов, + // т.к. при получении нового файла он будет заново размещен в томе или информационной базе. + Если НЕ ЭлементДанных.ЭтоНовый() Тогда + + ВерсияФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭлементДанных.Ссылка, "ТипХраненияФайла, Том, ПутьКФайлу"); + + Если ВерсияФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + ПрежнийПутьНаТоме = ПолныйПутьТома(ВерсияФайла.Том) + ВерсияФайла.ПутьКФайлу; + + УдалитьФайлыНаСервере(ПрежнийПутьНаТоме); + + КонецЕсли; + + КонецЕсли; + + Если ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + // По обмену пришел элемент с хранением в базе - но в базе приемнике принято хранить в томах. + // Из служебного реквизита файл размещаем на томе и меняем ТипХраненияФайла на ВТомахНаДиске. + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", Метаданные.НайтиПоТипу(ТипЗнч(ЭлементДанных))) Тогда + // Это справочник файлов. + НомерВерсии = ""; + Иначе + // Это справочник версий файлов. + НомерВерсии = ЭлементДанных.НомерВерсии; + КонецЕсли; + + СведенияОФайле = ДобавитьФайлВТом(ЭлементДанных.ФайлХранилище.Получить(), + ЭлементДанных.ДатаМодификацииУниверсальная, ЭлементДанных.Наименование, ЭлементДанных.Расширение, + НомерВерсии, ПутьКФайлуПриПолученииСодержитПризнакЗашифрован(ЭлементДанных)); + ЭлементДанных.Том = СведенияОФайле.Том; + ЭлементДанных.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + + Иначе + + ДвоичныеДанные = ЭлементДанных.ФайлХранилище.Получить(); + + Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда + ЭлементДанных.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); + КонецЕсли; + + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ЭлементДанных.ПутьКФайлу = ""; + ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьПутьКФайлуПриОтправке(ЭлементДанных) + + Если ТипЗнч(ЭлементДанных) <> Тип("СправочникОбъект.ВерсииФайлов") Тогда + ЭлементДанных.ПутьКФайлу = ""; + Возврат; + КонецЕсли; + + ДанныеЗашифрованы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭлементДанных.Владелец, "Зашифрован"); + ЭлементДанных.ПутьКФайлу = ?(ДанныеЗашифрованы, ".p7m", ""); + +КонецПроцедуры + +Функция ПутьКФайлуПриПолученииСодержитПризнакЗашифрован(ЭлементДанных) + + Если ТипЗнч(ЭлементДанных) <> Тип("СправочникОбъект.ВерсииФайлов") Тогда + Возврат ЭлементДанных.Зашифрован; + КонецЕсли; + + Возврат СтрЗаканчиваетсяНа(ЭлементДанных.ПутьКФайлу, ".p7m"); + +КонецФункции + + +// Возвращает Истина, если это элемент данных, относящийся к подсистеме РаботаСФайлами. +// +Функция ЭтоЭлементРаботаСФайлами(ЭлементДанных) + + ТипЭлементаДанных = ТипЗнч(ЭлементДанных); + Если ТипЭлементаДанных = Тип("УдалениеОбъекта") Тогда + Возврат Ложь; + КонецЕсли; + + МетаданныеЭлемента = ЭлементДанных.Метаданные(); + + Возврат ОбщегоНазначения.ЭтоСправочник(МетаданныеЭлемента) + И (Метаданные.ОпределяемыеТипы.ПрисоединенныйФайлОбъект.Тип.СодержитТип(ТипЭлементаДанных) + ИЛИ (Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.СодержитТип(ТипЭлементаДанных))); + +КонецФункции + +// Записывает двоичные данные файла в информационную базу. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка на присоединенный файл. +// ДвоичныеДанные - ДвоичныеДанные, которые требуется записать. +// +Процедура ЗаписатьФайлВИнформационнуюБазу(Знач ПрисоединенныйФайл, Знач ДвоичныеДанные) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ПрисоединенныйФайл; + МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +// Возвращает новый идентификатор объекта. +// Для получения нового идентификатора выбирает последний идентификатор объекта +// из регистра НаличиеПрисоединенныхФайлов увеличивает его значение +// на одну единицу и возвращает полученный результат. +// +// Возвращаемое значение: +// Строка (10) - новый идентификатор объекта. +// +Функция ПолучитьОчереднойИдентификаторОбъекта() Экспорт + + // Вычисление нового идентификатора объекта. + Результат = "0000000000"; // По длине ресурса ИдентификаторОбъекта. + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | НаличиеФайлов.ИдентификаторОбъекта КАК ИдентификаторОбъекта + |ИЗ + | РегистрСведений.НаличиеФайлов КАК НаличиеФайлов + | + |УПОРЯДОЧИТЬ ПО + | ИдентификаторОбъекта УБЫВ"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Идентификатор = Выборка.ИдентификаторОбъекта; + + Если ПустаяСтрока(Идентификатор) Тогда + Возврат Результат; + КонецЕсли; + + // Правила вычисления, как в обычном сложении: при + // заполнении текущего разряда следующий разряд увеличивается + // на единицу, при этом, в текущем разряде значение становится + // равным нулю. Значениями разрядов выступают символы + // [0..9] и [a..z]. Таким образом один разряд может содержать + // 36 значений. + + Позиция = 10; // 9- индекс 10-го символа + Пока Позиция > 0 Цикл + + Символ = Сред(Идентификатор, Позиция, 1); + + Если Символ = "z" Тогда + Идентификатор = Лев(Идентификатор, Позиция-1) + "0" + Прав(Идентификатор, 10 - Позиция); + Позиция = Позиция - 1; + Продолжить; + + ИначеЕсли Символ = "9" Тогда + НовыйСимвол = "a"; + Иначе + НовыйСимвол = Символ(КодСимвола(Символ)+1); + КонецЕсли; + + Идентификатор = Лев(Идентификатор, Позиция-1) + НовыйСимвол + Прав(Идентификатор, 10 - Позиция); + Прервать; + КонецЦикла; + + Результат = Идентификатор; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// См. ФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста. +Процедура ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Другие процедуры и функции. + +Процедура ОбновитьСписокЗапрещенныхРасширений() Экспорт + + СписокЗапрещенныхРасширенийДляЗагрузки = СписокЗапрещенныхРасширений(); + + СписокЗапрещенныхРасширенийВБазе = Константы.СписокЗапрещенныхРасширений.Получить(); + МассивЗапрещенныхРасширений = СтрРазделить(СписокЗапрещенныхРасширенийВБазе, " "); + ОбновитьСписокЗапрещенныхРасширений = Ложь; + Для Каждого Расширение Из СписокЗапрещенныхРасширенийДляЗагрузки Цикл + Если МассивЗапрещенныхРасширений.Найти(ВРег(Расширение)) = Неопределено Тогда + ОбновитьСписокЗапрещенныхРасширений = Истина; + МассивЗапрещенныхРасширений.Добавить(ВРег(Расширение)); + КонецЕсли; КонецЦикла; + СписокЗапрещенныхРасширенийВБазе = СтрСоединить(МассивЗапрещенныхРасширений, " "); + Если ОбновитьСписокЗапрещенныхРасширений Тогда + Константы.СписокЗапрещенныхРасширений.Установить(СписокЗапрещенныхРасширенийВБазе); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьСписокЗапрещенныхРасширенийВОбластиДанных() Экспорт + + СписокЗапрещенныхРасширенийДляЗагрузки = СписокЗапрещенныхРасширений(); + + ОбновитьСписокЗапрещенныхРасширенийОбластиДанных = Ложь; + СписокЗапрещенныхРасширенийОбластиДанных = Константы.СписокЗапрещенныхРасширенийОбластиДанных.Получить(); + МассивЗапрещенныхРасширенийОбластиДанных = СтрРазделить(СписокЗапрещенныхРасширенийОбластиДанных, " "); + Для Каждого Расширение Из СписокЗапрещенныхРасширенийДляЗагрузки Цикл + Если МассивЗапрещенныхРасширенийОбластиДанных.Найти(ВРег(Расширение)) = Неопределено Тогда + МассивЗапрещенныхРасширенийОбластиДанных.Добавить(ВРег(Расширение)); + ОбновитьСписокЗапрещенныхРасширенийОбластиДанных = Истина; + КонецЕсли; + КонецЦикла; + СписокЗапрещенныхРасширенийОбластиДанных = СтрСоединить(МассивЗапрещенныхРасширенийОбластиДанных, " "); + Если ОбновитьСписокЗапрещенныхРасширенийОбластиДанных Тогда + Константы.СписокЗапрещенныхРасширенийОбластиДанных.Установить(СписокЗапрещенныхРасширенийОбластиДанных); + КонецЕсли; + +КонецПроцедуры + +// Возвращает имя справочника для указанного владельца или вызывает исключение, +// если их более одного. +// +// Параметры: +// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ИмяСправочника - Строка, если заполнено, то выполняется проверка +// наличия справочника среди справочников владельца для хранения файлов. +// Если не заполнено, возвращает имя основного справочника. +// ЗаголовокОшибки - Строка - заголовок ошибки. +// - Неопределено - не вызывать исключение, а вернуть пустую строку. +// ИмяПараметра - Строка - имя требуемого параметра для определения имени справочника. +// ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено). +// +Функция ИмяСправочникаХраненияФайлов(ВладелецФайлов, ИмяСправочника = "", + ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт + + НеВызыватьИсключение = (ЗаголовокОшибки = Неопределено); + ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение); + + Если ИменаСправочников.Количество() = 0 Тогда + Если НеВызыватьИсключение Тогда + Возврат ""; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" + |нет справочников для хранения файлов.'"), + Строка(ВладелецФайлов), + Строка(ТипЗнч(ВладелецФайлов))); + КонецЕсли; + + Если ЗначениеЗаполнено(ИмяСправочника) Тогда + Если ИменаСправочников[ИмяСправочника] <> Неопределено Тогда + Возврат ИмяСправочника; + КонецЕсли; + + Если НеВызыватьИсключение Тогда + Возврат ""; + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" + |нет справочника ""%3"" для хранения файлов.'"), + Строка(ВладелецФайлов), + Строка(ТипЗнч(ВладелецФайлов)), + Строка(ИмяСправочника)); + КонецЕсли; + + ОсновнойСправочник = ""; + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Если КлючИЗначение.Значение = Истина Тогда + ОсновнойСправочник = КлючИЗначение.Ключ; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(ОсновнойСправочник) Тогда + Возврат ОсновнойСправочник; + КонецЕсли; + + Если НеВызыватьИсключение Тогда + Возврат ""; + КонецЕсли; + + ШаблонПричиныОшибки = + НСтр("ru = 'У владельца файлов ""%1"" типа ""%2"" + |не указан основной справочник для хранения файлов.'") + Символы.ПС; + + ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПричиныОшибки, Строка(ВладелецФайлов), Строка(ТипЗнч(ВладелецФайлов))); + + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + ПричинаОшибки + Символы.ПС + + ОкончаниеОшибки; + + ВызватьИсключение СокрЛП(ТекстОшибки); + +КонецФункции + +// Возвращает соответствие имен справочников и значения Булево +// для указанного владельца. +// +// Параметры: +// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// +Функция ИменаСправочниковХраненияВерсийФайлов(ВладелецФайлов, НеВызыватьИсключение = Ложь) + + Если ТипЗнч(ВладелецФайлов) = Тип("Тип") Тогда + ТипВладельцаФайлов = ВладелецФайлов; + Иначе + ТипВладельцаФайлов = ТипЗнч(ВладелецФайлов); + КонецЕсли; + + МетаданныеВладельца = Метаданные.НайтиПоТипу(ТипВладельцаФайлов); + + ИменаСправочников = Новый Соответствие; + ИмяСтандартногоОсновногоСправочника = МетаданныеВладельца.Имя + "ВерсииПрисоединенныхФайлов"; + Если Метаданные.Справочники.Найти(ИмяСтандартногоОсновногоСправочника) <> Неопределено Тогда + ИменаСправочников.Вставить(ИмяСтандартногоОсновногоСправочника, Истина); + КонецЕсли; + + Если Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельцаФайлов) Тогда + ИменаСправочников.Вставить("ВерсииФайлов", Истина); + КонецЕсли; + + ОсновнойСправочникУказан = Ложь; + + Для каждого КлючИЗначение Из ИменаСправочников Цикл + + Если Метаданные.Справочники.Найти(КлючИЗначение.Ключ) = Неопределено Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения версий файлов. + |У владельца файлов типа ""%1"" + |указан несуществующий справочник ""%2"".'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + + ИначеЕсли Не СтрЗаканчиваетсяНа(КлючИЗначение.Ключ, "ВерсииПрисоединенныхФайлов") И Не КлючИЗначение.Ключ ="ВерсииФайлов" Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения версий файлов. + |У владельца файлов типа ""%1"" + |указано имя справочника ""%2"" + |без окончания ""ВерсииПрисоединенныхФайлов"".'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + + ИначеЕсли КлючИЗначение.Значение = Неопределено Тогда + ИменаСправочников.Вставить(КлючИЗначение.Ключ, Ложь); + + ИначеЕсли КлючИЗначение.Значение = Истина Тогда + Если ОсновнойСправочникУказан Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при определении имен справочников для хранения версий файлов. + |У владельца файлов типа ""%1"" + |основной справочник версий указан более одного раза.'"), + Строка(ТипВладельцаФайлов), + Строка(КлючИЗначение.Ключ)); + КонецЕсли; + ОсновнойСправочникУказан = Истина; + КонецЕсли; + КонецЦикла; + + Возврат ИменаСправочников; + +КонецФункции + +// Возвращает имя справочника для указанного владельца или вызывает исключение, +// если их более одного. +// +// Параметры: +// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ИмяСправочника - Строка, если заполнено, то выполняется проверка +// наличия справочника среди справочников владельца для хранения файлов. +// Если не заполнено, возвращает имя основного справочника. +// ЗаголовокОшибки - Строка - заголовок ошибки. +// - Неопределено - не вызывать исключение, а вернуть пустую строку. +// ИмяПараметра - Строка - имя требуемого параметра для определения имени справочника. +// ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено). +// +Функция ИмяСправочникаХраненияВерсийФайлов(ВладелецФайлов, ИмяСправочника = "", + ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт + + НеВызыватьИсключение = (ЗаголовокОшибки = Неопределено); + ИменаСправочников = ИменаСправочниковХраненияВерсийФайлов(ВладелецФайлов, НеВызыватьИсключение); + + Если ИменаСправочников.Количество() = 0 Тогда + Возврат ""; + КонецЕсли; + + ОсновнойСправочник = ""; + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Если КлючИЗначение.Значение = Истина Тогда + ОсновнойСправочник = КлючИЗначение.Ключ; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(ОсновнойСправочник) Тогда + Возврат ОсновнойСправочник; + КонецЕсли; + + Если НеВызыватьИсключение Тогда + Возврат ""; + КонецЕсли; + + ШаблонПричиныОшибки = + НСтр("ru = 'У владельца версий файлов ""%1"" + |не указан основной справочник для хранения версий файлов.'") + Символы.ПС; + + ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПричиныОшибки, Строка(ВладелецФайлов)); + + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + ПричинаОшибки + Символы.ПС + + ОкончаниеОшибки; + + ВызватьИсключение СокрЛП(ТекстОшибки); + +КонецФункции + +// Отменяет редактирование файла. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка или Объект присоединенного файла, который требуется освободить. +// +Процедура ОсвободитьФайл(Знач ПрисоединенныйФайл) Экспорт + + НачатьТранзакцию(); + Попытка + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ПрисоединенныйФайл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + Иначе + ФайлОбъект = ПрисоединенныйФайл; + КонецЕсли; + + Если ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда + ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); + ФайлОбъект.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +// Помещает зашифрованные данные файла в хранилище и устанавливает файлу признак Зашифрован. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка на присоединенный файл. +// ЗашифрованныеДанные - Структура со свойством: +// АдресВременногоХранилища - Строка - адрес зашифрованных двоичных данных. +// МассивОтпечатков - Массив Структур отпечатков по сертификатам. +// +Процедура Зашифровать(Знач ПрисоединенныйФайл, Знач ЗашифрованныеДанные, Знач МассивОтпечатков) Экспорт + + НачатьТранзакцию(); + Попытка + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ПрисоединенныйФайл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + Иначе + ПрисоединенныйФайлОбъект = ПрисоединенныйФайл; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ДобавитьСертификатыШифрования(ПрисоединенныйФайл, МассивОтпечатков); + КонецЕсли; + + РеквизитыЗначения = Новый Структура; + РеквизитыЗначения.Вставить("Зашифрован", Истина);// Зашифрован перенести в РС + РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения("")); + ОбновитьДвоичныеДанныеФайлаНаСервере(ПрисоединенныйФайлОбъект, ЗашифрованныеДанные.АдресВременногоХранилища, РеквизитыЗначения); + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + ПрисоединенныйФайлОбъект.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +// Помещает расшифрованные данные файла в хранилище и снимает файлу признак Зашифрован. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка на присоединенный файл. +// ЗашифрованныеДанные - Структура со свойством: +// АдресВременногоХранилища - Строка - адрес расшифрованных двоичных данных. +// +Процедура Расшифровать(Знач ПрисоединенныйФайл, Знач РасшифрованныеДанные) Экспорт + + НачатьТранзакцию(); + Попытка + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ПрисоединенныйФайл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + Иначе + ПрисоединенныйФайлОбъект = ПрисоединенныйФайл; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ОчиститьСертификатыШифрования(ПрисоединенныйФайл); + КонецЕсли; + + РеквизитыЗначения = Новый Структура; + РеквизитыЗначения.Вставить("Зашифрован", Ложь); + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилища); + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИзвлеченныйТекст = ""; + + Если ЭтоАдресВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилищаТекста) Тогда + ИзвлеченныйТекст = ПолучитьСтрокуИзВременногоХранилища(РасшифрованныеДанные.АдресВременногоХранилищаТекста); + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + + ИначеЕсли НЕ ИзвлекатьТекстыФайловНаСервере() Тогда + // Тексты извлекаются сразу, а не в фоновом задании. + СтатусИзвлеченияТекста = ИзвлечьТекст(ДвоичныеДанные, ПрисоединенныйФайл.Расширение, ИзвлеченныйТекст); + КонецЕсли; + + ПрисоединенныйФайлОбъект.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; + + РеквизитыЗначения.Вставить("ТекстХранилище", Новый ХранилищеЗначения(ИзвлеченныйТекст, Новый СжатиеДанных(9))); + + ОбновитьДвоичныеДанныеФайлаНаСервере(ПрисоединенныйФайлОбъект, ДвоичныеДанные, РеквизитыЗначения); + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + ПрисоединенныйФайлОбъект.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры @@ -1335,76 +3607,148 @@ ФайлСсылка = Источник.Владелец; РеквизитыФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, - "ИндексКартинки, ТекущаяВерсияРазмер, ТекущаяВерсияДатаСоздания, ТекущаяВерсияАвтор, ТекущаяВерсияРасширение, ТекущаяВерсияНомерВерсии, ТекущаяВерсияТом, ТекущаяВерсияПутьКФайлу, ТекущаяВерсияКод, ТекущаяВерсияДатаМодификацииФайла"); + "ИндексКартинки, Размер, ДатаСоздания, Изменил, Расширение, Том, ПутьКФайлу, ДатаМодификацииУниверсальная"); - Если РеквизитыФайла.ТекущаяВерсияРазмер <> ТекущаяВерсия.Размер - ИЛИ РеквизитыФайла.ТекущаяВерсияДатаСоздания <> ТекущаяВерсия.ДатаСоздания - ИЛИ РеквизитыФайла.ТекущаяВерсияРасширение <> ТекущаяВерсия.Расширение - ИЛИ РеквизитыФайла.ТекущаяВерсияНомерВерсии <> ТекущаяВерсия.НомерВерсии - ИЛИ РеквизитыФайла.ТекущаяВерсияТом <> ТекущаяВерсия.Том - ИЛИ РеквизитыФайла.ТекущаяВерсияПутьКФайлу <> ТекущаяВерсия.ПутьКФайлу - ИЛИ РеквизитыФайла.ТекущаяВерсияКод <> ТекущаяВерсия.Код + Если РеквизитыФайла.Размер <> ТекущаяВерсия.Размер + ИЛИ РеквизитыФайла.ДатаСоздания <> ТекущаяВерсия.ДатаСоздания + ИЛИ РеквизитыФайла.Расширение <> ТекущаяВерсия.Расширение + ИЛИ РеквизитыФайла.Том <> ТекущаяВерсия.Том + ИЛИ РеквизитыФайла.ПутьКФайлу <> ТекущаяВерсия.ПутьКФайлу ИЛИ РеквизитыФайла.ИндексКартинки <> ТекущаяВерсия.ИндексКартинки - ИЛИ РеквизитыФайла.ТекущаяВерсияДатаМодификацииФайла <> ТекущаяВерсия.ДатаМодификацииФайла Тогда - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - - // Сменим индекс картинки, возможно, появилась версия или сменился индекс картинки у версии. - ФайлОбъект.ИндексКартинки = ТекущаяВерсия.ИндексКартинки; - - // Копируем реквизиты для ускорения работы RLS. - ФайлОбъект.ТекущаяВерсияРазмер = ТекущаяВерсия.Размер; - ФайлОбъект.ТекущаяВерсияДатаСоздания = ТекущаяВерсия.ДатаСоздания; - ФайлОбъект.ТекущаяВерсияАвтор = ТекущаяВерсия.Автор; - ФайлОбъект.ТекущаяВерсияРасширение = ТекущаяВерсия.Расширение; - ФайлОбъект.ТекущаяВерсияНомерВерсии = ТекущаяВерсия.НомерВерсии; - ФайлОбъект.ТекущаяВерсияТом = ТекущаяВерсия.Том; - ФайлОбъект.ТекущаяВерсияПутьКФайлу = ТекущаяВерсия.ПутьКФайлу; - ФайлОбъект.ТекущаяВерсияКод = ТекущаяВерсия.Код; - ФайлОбъект.ТекущаяВерсияДатаМодификацииФайла = ТекущаяВерсия.ДатаМодификацииФайла; - - Если Источник.ДополнительныеСвойства.Свойство("ЗаписьПодписанногоОбъекта") Тогда - ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", - Источник.ДополнительныеСвойства.ЗаписьПодписанногоОбъекта); - КонецЕсли; - - ФайлОбъект.Записать(); + ИЛИ РеквизитыФайла.ДатаМодификацииУниверсальная <> ТекущаяВерсия.ДатаМодификацииФайла Тогда + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + // Сменим индекс картинки, возможно, появилась версия или сменился индекс картинки у версии. + ФайлОбъект.ИндексКартинки = ТекущаяВерсия.ИндексКартинки; + + // Копируем реквизиты для ускорения работы RLS. + ФайлОбъект.Размер = ТекущаяВерсия.Размер; + ФайлОбъект.ДатаСоздания = ТекущаяВерсия.ДатаСоздания; + ФайлОбъект.Изменил = ТекущаяВерсия.Автор; + ФайлОбъект.Расширение = ТекущаяВерсия.Расширение; + ФайлОбъект.Том = ТекущаяВерсия.Том; + ФайлОбъект.ПутьКФайлу = ТекущаяВерсия.ПутьКФайлу; + ФайлОбъект.ТипХраненияФайла = ТекущаяВерсия.ТипХраненияФайла; + ФайлОбъект.ДатаМодификацииУниверсальная = ТекущаяВерсия.ДатаМодификацииУниверсальная; + + Если Источник.ДополнительныеСвойства.Свойство("ЗаписьПодписанногоОбъекта") Тогда + ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", + Источник.ДополнительныеСвойства.ЗаписьПодписанногоОбъекта); + КонецЕсли; + + ФайлОбъект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецЕсли; КонецЕсли; - - ПриОбновленииСостоянияОчередиИзвлеченияТекста( - Источник.Ссылка, Источник.СтатусИзвлеченияТекста); + + ОбновитьСостояниеОчередиИзвлеченияТекста(Источник.Ссылка, Источник.СтатусИзвлеченияТекста); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - -// Проверяет право текущего пользователя -// при использовании ограничения для папки или файла. -// -// Параметры: -// Папка - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы - Папка файлов. -// - СправочникСсылка - Владелец файлов. -// -// Места использования: -// РассылкаОтчетов.ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию(). -// Справочник.РассылкиОтчетов.Формы.ФормаЭлемента.ПравоИзмененияПапкиИФайлов(). -// -Функция ПравоДобавленияФайловВПапку(Папка) Экспорт +// Обработчик подписки на событие "Перед удалением" присоединенного файла. +Процедура ПередУдалениемПрисоединенногоФайлаСервер(Знач Ссылка, + Знач ВладелецФайлов, + Знач Том, + Знач ТипХраненияФайла, + Знач ПутьКФайлу) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); - Возврат МодульУправлениеДоступом.ЕстьПраво("ДобавлениеФайлов", Папка); + УстановитьПривилегированныйРежим(Истина); + + Если НЕ ОбъектИмеетФайлы(ВладелецФайлов, Ссылка) Тогда + + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.РегистрыСведений.НаличиеФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("ОбъектСФайлами", ВладелецФайлов); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.НаличиеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ОбъектСФайлами = ВладелецФайлов; + МенеджерЗаписи.Прочитать(); + Если МенеджерЗаписи.Выбран() Тогда + МенеджерЗаписи.ЕстьФайлы = Ложь; + МенеджерЗаписи.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + КонецЕсли; - Возврат Истина; + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ Том.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(Том) + ПутьКФайлу; + Попытка + Файл = Новый Файл(ПолныйПуть); + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + ПутьСПодкаталогом = Файл.Путь; + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + Исключение + // Если файл не удален - ошибки не было. + КонецПопытки; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Функция ОбъектИмеетФайлы(Знач ВладелецФайлов, Знач ФайлИсключение = Неопределено) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("ВладелецФайлов", ВладелецФайлов); + + ТекстЗапроса = + "ВЫБРАТЬ + | ПрисоединенныеФайлы.Ссылка + |ИЗ + | &ИмяСправочника КАК ПрисоединенныеФайлы + |ГДЕ + | ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов"; + + Если ФайлИсключение <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ПрисоединенныеФайлы.Ссылка <> &Ссылка"; + + Запрос.Параметры.Вставить("Ссылка", ФайлИсключение); + КонецЕсли; + + ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); + + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Запрос.Текст = СтрЗаменить( + ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Проверяет право текущего пользователя // при использовании ограничения для папки или файла. // @@ -1431,42 +3775,57 @@ КонецФункции -// Добавляет и удаляет записи в регистр сведений ОчередьИзвлеченияТекста при изменении -// состояние извлечения текста версий файлов. -// -// Параметры: -// ИсточникТекста - СправочникСсылка.ВерсииФайлов, СправочникСсылка.*ПрисоединенныеФайлы, -// файл, у которого изменилось состояние извлечения текста. -// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов, новый -// статус извлечения текста у файла. -// -Процедура ПриОбновленииСостоянияОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); - МодульФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. +// Отмечает файл, как редактируемый. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка или Объект присоединенного файла, который требуется отметить. +// +Процедура ЗанятьФайлДляРедактированияСервер(Знач ПрисоединенныйФайл, Пользователь = Неопределено) Экспорт + + НачатьТранзакцию(); + Попытка + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ПрисоединенныйФайл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + Иначе + ФайлОбъект = ПрисоединенныйФайл; + КонецЕсли; + + Если Пользователь = Неопределено Тогда + ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(); + Иначе + ФайлОбъект.Редактирует = Пользователь; + КонецЕсли; + ФайлОбъект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + +КонецПроцедуры + Процедура ЗаписатьДанныеФайлаВРегистрПриОбмене(Источник) Перем ДвоичныеДанныеФайла; Если Источник.ДополнительныеСвойства.Свойство("ДвоичныеДанныеФайла", ДвоичныеДанныеФайла) Тогда - НаборЗаписей = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ВерсияФайла.Установить(Источник.Ссылка); + НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Файл.Установить(Источник.Ссылка); Запись = НаборЗаписей.Добавить(); - Запись.ВерсияФайла = Источник.Ссылка; - Запись.ХранимыйФайл = Новый ХранилищеЗначения(ДвоичныеДанныеФайла); + Запись.Файл = Источник.Ссылка; + Запись.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанныеФайла); НаборЗаписей.ОбменДанными.Загрузка = Истина; НаборЗаписей.Записать(); @@ -1479,24 +3838,58 @@ Функция ПолучениеФайлаЗапрещено(ЭлементДанных) Возврат ЭлементДанных.ЭтоНовый() - И Не ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( - ЭлементДанных.ТекущаяВерсияРасширение, Ложь); + И Не РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( + ЭлементДанных.Расширение, Ложь); КонецФункции Функция ПолучениеВерсииФайлаЗапрещено(ЭлементДанных) Возврат ЭлементДанных.ЭтоНовый() - И Не ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( + И Не РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( ЭлементДанных.Расширение, Ложь); КонецФункции +Процедура ОбработатьОтправкуФайлаПоТипуХранения(ЭлементДанных) + + Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + // Помещаем данные файла из тома на диске в служебный реквизит справочника. + ПоместитьФайлВРеквизитСправочника(ЭлементДанных); + + Иначе + // Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе + // Если есть возможность хранения версий файлов - двоичные данные берутся из текущей версии. + Если ЭлементДанных.Метаданные().Реквизиты.Найти("ТекущаяВерсия") <> Неопределено + И ЗначениеЗаполнено(ЭлементДанных.ТекущаяВерсия) Тогда + ИсточникДвоичныхДанных = ЭлементДанных.ТекущаяВерсия; + Иначе + ИсточникДвоичныхДанных = ЭлементДанных.Ссылка; + КонецЕсли; + Попытка + // Помещаем данные файла из информационной базы в служебный реквизит справочника. + АдресВоВременномХранилище = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуВоВременномХранилище(ИсточникДвоичныхДанных); + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище), Новый СжатиеДанных(9)); + Исключение + // Возможно, файл не был найден. Отправку данных не прерываем. + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииДляОбмена(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + КонецПопытки; + + ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + ЭлементДанных.ПутьКФайлу = ""; + ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + + КонецЕсли; + +КонецПроцедуры + Процедура ПоместитьФайлВРеквизитСправочника(ЭлементДанных) Попытка // Помещаем данные файла из тома на диске в служебный реквизит справочника. - ЭлементДанных.ФайлХранилище = ФайловыеФункцииСлужебный.ПоместитьДвоичныеДанныеВХранилище(ЭлементДанных.Том, ЭлементДанных.ПутьКФайлу, ЭлементДанных.Ссылка.УникальныйИдентификатор()); + ЭлементДанных.ФайлХранилище = ПоместитьДвоичныеДанныеВХранилище(ЭлементДанных.Том, ЭлементДанных.ПутьКФайлу, ЭлементДанных.Ссылка.УникальныйИдентификатор()); Исключение // Возможно, файл не был найден. Отправку данных не прерываем. ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииДляОбмена(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -1509,6 +3902,47 @@ КонецПроцедуры +// Возвращает массив присоединенных файлов для указанного владельца. +// +// Параметры: +// ВладелецФайлов - Ссылка на владельца присоединенных файлов. +// +// Возвращаемое значение: +// Массив ссылок на присоединенные файлы. +// +Функция ВсеПодчиненныеФайлы(Знач ВладелецФайлов) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); + ТекстЗапросов = ""; + + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Если ЗначениеЗаполнено(ТекстЗапросов) Тогда + ТекстЗапросов = ТекстЗапросов + " + |ОБЪЕДИНИТЬ ВСЕ + | + |"; + КонецЕсли; + ТекстЗапроса = + "ВЫБРАТЬ + | ПрисоединенныеФайлы.Ссылка + |ИЗ + | &ИмяСправочника КАК ПрисоединенныеФайлы + |ГДЕ + | ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); + ТекстЗапросов = ТекстЗапросов + ТекстЗапроса; + КонецЦикла; + + Запрос = Новый Запрос(ТекстЗапросов); + Запрос.УстановитьПараметр("ВладелецФайлов", ВладелецФайлов); + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + +КонецФункции + + // Возвращает количество занятых файлов у переданного пользователя. // // Параметры: @@ -1519,16 +3953,17 @@ // Функция КоличествоЗанятыхФайлов(Пользователь) + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Представление КАК Представление - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) - | И Файлы.Редактирует = &Пользователь"; + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СведенияОФайлах.Файл + |ИЗ + | РегистрСведений.СведенияОФайлах КАК СведенияОФайлах + |ГДЕ + | СведенияОФайлах.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И СведенияОФайлах.Редактирует = &Пользователь"; Запрос.УстановитьПараметр("Пользователь", Пользователь); @@ -1549,4 +3984,2745 @@ КонецФункции +// Извлекает текст из двоичных данных, возвращает статус извлечения. +Функция ИзвлечьТекст(Знач ДвоичныеДанные, Знач Расширение, ИзвлеченныйТекст) Экспорт + + Если ЭтоПлатформаWindows() + И ИзвлекатьТекстыФайловНаСервере() Тогда + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + Отказ = Ложь; + ИзвлеченныйТекст = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище(ИмяВременногоФайла, , Отказ); + + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Извлечение текста'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если Отказ Тогда + Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + Иначе + Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + КонецЕсли; + Иначе + ИзвлеченныйТекст = ""; + Возврат Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + +КонецФункции + +// Заменяет двоичные данные файла в ИБ на данные во временном хранилище. +Процедура ОбновитьДвоичныеДанныеФайлаНаСервере(Знач ПрисоединенныйФайл, + Знач АдресФайлаВоВременномХранилищеДвоичныеДанные, + Знач РеквизитыЗначения = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + ЭтоСсылка = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)); + НачатьТранзакцию(); + Попытка + Если ЭтоСсылка Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ПрисоединенныйФайл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлСсылка = ПрисоединенныйФайл; + Иначе + ФайлОбъект = ПрисоединенныйФайл; + ФайлСсылка = ФайлОбъект.Ссылка; + КонецЕсли; + + Если ТипЗнч(АдресФайлаВоВременномХранилищеДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда + ДвоичныеДанные = АдресФайлаВоВременномХранилищеДвоичныеДанные; + Иначе + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилищеДвоичныеДанные); + КонецЕсли; + + ФайлОбъект.Изменил = Пользователи.АвторизованныйПользователь(); + + Если ТипЗнч(РеквизитыЗначения) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(ФайлОбъект, РеквизитыЗначения); + КонецЕсли; + + ЭтоФайлВБазе = (ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе); + Если ЭтоФайлВБазе Тогда + ОбновитьДвоичныеДанныеФайлаВИнформационнойБазе(ФайлОбъект, ФайлСсылка, ДвоичныеДанные); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + Если ЭтоСсылка Тогда + ФайлОбъект.Разблокировать(); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + Если Не ЭтоФайлВБазе Тогда + ОбновитьДвоичныеДанныеФайлаВТоме(ФайлОбъект, ФайлСсылка, ДвоичныеДанные); + КонецЕсли; + + Если ЭтоСсылка Тогда + ФайлОбъект.Разблокировать(); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьДвоичныеДанныеФайлаВИнформационнойБазе(ФайлОбъект, ФайлСсылка, ДвоичныеДанные) + + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.РегистрыСведений.ДвоичныеДанныеФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Файл", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ФайлСсылка; + МенеджерЗаписи.Прочитать(); + МенеджерЗаписи.Файл = ФайлСсылка; + МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(); + + ФайлОбъект.Размер = ДвоичныеДанные.Размер(); + ФайлОбъект.Записать(); + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Обновление данных присоединенного файла в хранилище файлов'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Процедура ОбновитьДвоичныеДанныеФайлаВТоме(ФайлОбъект, ФайлСсылка, ДвоичныеДанные) + + Попытка + ПолныйПуть = ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + + ФайлНаДиске = Новый Файл(ПолныйПуть); + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + + СведенияОФайле = ДобавитьФайлВТом(ДвоичныеДанные, ФайлОбъект.ДатаМодификацииУниверсальная, + ФайлОбъект.Наименование, ФайлОбъект.Расширение,, ФайлОбъект.Зашифрован); + ФайлОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + ФайлОбъект.Том = СведенияОФайле.Том; + ФайлОбъект.Размер = ДвоичныеДанные.Размер(); + ФайлОбъект.Записать(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Запись файла на диск'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники[ФайлСсылка.Метаданные().Имя], + ФайлСсылка, + ТекстОшибкиПриСохраненииФайлаВТоме(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка)); + + ВызватьИсключение ТекстОшибкиПриСохраненииФайлаВТоме(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка); + КонецПопытки; + +КонецПроцедуры + +// Возвращает текст сообщения об ошибке, добавляя к нему ссылку на элемент +// справочника хранимого файла. +// +Функция ТекстОшибкиПриСохраненииФайлаВТоме(Знач СообщениеОбОшибке, Знач Файл) + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка, при сохранении файла в томе: + |""%1"". + | + |Ссылка на файл: ""%2"".'"), + СообщениеОбОшибке, + ПолучитьНавигационнуюСсылку(Файл) ); + +КонецФункции + +///////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы элемента файла. + +Процедура ФормаЭлементаПриСозданииНаСервере(Контекст, Отказ, СтандартнаяОбработка, Параметры, ТолькоПросмотр, НастраиватьОбъектФормы = Ложь) Экспорт + + Элементы = Контекст.Элементы; + + ФайлБылСоздан = Параметры.ЭтоНовый; + + КолонкиМассив = Новый Массив; + Для Каждого ОписаниеКолонки Из Контекст.РеквизитФормыВЗначение("ЭлектронныеПодписи").Колонки Цикл + КолонкиМассив.Добавить(ОписаниеКолонки.Имя); + КонецЦикла; + ОписаниеКолонокТаблицыПодписей = Новый ФиксированныйМассив(КолонкиМассив); + + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); + + Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + Если Параметры.РежимСоздания = "ИзШаблона" Тогда + ОбъектЗначение = ЗаполнитьДанныеФайлаПоШаблону(Контекст, ОбъектЗначение, Параметры, НастраиватьОбъектФормы) + Иначе + ОбъектЗначение = ЗаполнитьДанныеФайлаИзКопии(Контекст, ОбъектЗначение, Параметры, НастраиватьОбъектФормы); + КонецЕсли; + Иначе + Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда + ОбъектЗначение = Параметры.ПрисоединенныйФайл.ПолучитьОбъект(); + Иначе + ОбъектЗначение = Параметры.Ключ.ПолучитьОбъект(); + КонецЕсли; + КонецЕсли; + ОбъектЗначение.Заполнить(Неопределено); + + Контекст.ИмяСправочника = ОбъектЗначение.Метаданные().Имя; + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке формы элемента присоединенных файлов.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка формы элемента невозможна.'"); + + ИмяСправочникаХранилищаВерсийФайлов = ИмяСправочникаХраненияВерсийФайлов( + ТипЗнч(ОбъектЗначение.ВладелецФайла), "", ЗаголовокОшибки, ОкончаниеОшибки); + + ВозможностьСоздаватьВерсииФайлов = ТипЗнч(ОбъектЗначение.Ссылка) = Тип("СправочникСсылка.Файлы"); + Контекст.ВозможностьСоздаватьВерсииФайлов = ВозможностьСоздаватьВерсииФайлов; + + Если НастраиватьОбъектФормы Тогда + Элементы.ХранитьВерсии0.Видимость = ВозможностьСоздаватьВерсииФайлов; + НастроитьОбъектФормы(ОбъектЗначение, Контекст); + Иначе + ЗначениеВДанныеФормы(ОбъектЗначение, Контекст.Объект); + Элементы.ХранитьВерсии.Видимость = ВозможностьСоздаватьВерсииФайлов; + КонецЕсли; + + КриптографияПриСозданииФормыНаСервере(Контекст, Ложь); + ЗаполнитьСписокПодписей(Контекст, Параметры.ЗначениеКопирования); + ЗаполнитьСписокШифрования(Контекст, Параметры.ЗначениеКопирования); + + ОбщиеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + + РасширениеФайлаВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ОбщиеНастройки.СписокРасширенийТекстовыхФайлов, Контекст.Объект.Расширение); + + Если РасширениеФайлаВСписке Тогда + Если ВозможностьСоздаватьВерсииФайлов И Контекст.Объект.Свойство("ТекущаяВерсия") И ЗначениеЗаполнено(Контекст.Объект.ТекущаяВерсия) Тогда + ТекущаяВерсияФайла = Контекст.Объект.ТекущаяВерсия; + Иначе + ТекущаяВерсияФайла = Контекст.Объект.Ссылка; + КонецЕсли; + Если ЗначениеЗаполнено(ТекущаяВерсияФайла) Тогда + + КодировкаЗначение = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла( + ТекущаяВерсияФайла); + + СписокКодировок = Кодировки(); + ЭлементСписка = СписокКодировок.НайтиПоЗначению(КодировкаЗначение); + Если ЭлементСписка = Неопределено Тогда + Контекст.Кодировка = КодировкаЗначение; + Иначе + Контекст.Кодировка = ЭлементСписка.Представление; + КонецЕсли; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(Контекст.Кодировка) Тогда + Контекст.Кодировка = НСтр("ru = 'По умолчанию'"); + КонецЕсли; + + Иначе + Контекст.Элементы.Кодировка.Видимость = Ложь; + КонецЕсли; + + Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда + Контекст.ФайлРедактируетсяВОблаке = ФайлРедактируетсяВОблаке(Контекст.Объект.Ссылка); + КонецЕсли; + + Если ТолькоПросмотр + ИЛИ НЕ ПравоДоступа("Изменение", Контекст.Объект.ВладелецФайла.Метаданные()) Тогда + УстановитьКнопкиИзмененияНевидимыми(Контекст.Элементы); + КонецЕсли; + + Если НЕ ТолькоПросмотр + И НЕ Контекст.Объект.Ссылка.Пустая() И НастраиватьОбъектФормы Тогда + ЗаблокироватьДанныеДляРедактирования(Контекст.Объект.Ссылка, , Контекст.УникальныйИдентификатор); + КонецЕсли; + + ТипВладельца = ТипЗнч(ОбъектЗначение.ВладелецФайла); + Контекст.Элементы.ВладелецФайла.Заголовок = ТипВладельца; + +КонецПроцедуры + +Функция ЗаполнитьДанныеФайлаПоШаблону(Контекст, ОбъектЗначение, Параметры, НастраиватьОбъектФормы) + + КопируемыйОбъект = Параметры.ЗначениеКопирования.ПолучитьОбъект(); + Контекст.ЗначениеКопирования = Параметры.ЗначениеКопирования; + + ОбъектЗначение = Справочники[Параметры.ИмяСправочникаХранилищаФайлов].СоздатьЭлемент(); + + ЗаполнитьЗначенияСвойств( + ОбъектЗначение, + КопируемыйОбъект, + "Наименование, + |ХранитьВерсии, + |Зашифрован, + |Описание, + |ПодписанЭП, + |Размер, + |Расширение, + |ВладелецФайла, + |ТекстХранилище, + |ПометкаУдаления"); + ОбъектЗначение.ВладелецФайла = Параметры.ВладелецФайла; + ДатаСоздания = ТекущаяДатаСеанса(); + ОбъектЗначение.ДатаСоздания = ДатаСоздания; + ОбъектЗначение.ДатаМодификацииУниверсальная = ДатаСоздания; + + ОбъектЗначение.Автор = Пользователи.АвторизованныйПользователь(); + + Возврат ОбъектЗначение; +КонецФункции + +Функция ЗаполнитьДанныеФайлаИзКопии(Контекст, ОбъектЗначение, Параметры, НастраиватьОбъектФормы) + + КопируемыйОбъект = Параметры.ЗначениеКопирования.ПолучитьОбъект(); + Контекст.ЗначениеКопирования = Параметры.ЗначениеКопирования; + + ОбъектМетаданных = КопируемыйОбъект.Метаданные(); + ОбъектЗначение = Справочники[ОбъектМетаданных.Имя].СоздатьЭлемент(); + + ИсключаемыеРеквизиты = "Родитель,Владелец,ДатаЗаема,Изменил,Код,ПометкаУдаления,Редактирует,Том,ИмяПредопределенныхДанных,Предопределенный,ПутьКФайлу,СтатусИзвлеченияТекста"; + Если ОбъектМетаданных.Реквизиты.Найти("ТекущаяВерсия") <> Неопределено Тогда + ИсключаемыеРеквизиты = ИсключаемыеРеквизиты + ",ТекущаяВерсия"; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ОбъектЗначение,КопируемыйОбъект, , ИсключаемыеРеквизиты); + ОбъектЗначение.Автор = Пользователи.АвторизованныйПользователь(); + + Возврат ОбъектЗначение; + +КонецФункции + +Процедура НастроитьОбъектФормы(Знач НовыйОбъект, Контекст) + + ТипНовогоОбъекта = Новый Массив; + ТипНовогоОбъекта.Добавить(ТипЗнч(НовыйОбъект)); + НовыйРеквизит = Новый РеквизитФормы("Объект", Новый ОписаниеТипов(ТипНовогоОбъекта)); + НовыйРеквизит.СохраняемыеДанные = Истина; + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); + + Контекст.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + Контекст.ЗначениеВРеквизитФормы(НовыйОбъект, "Объект"); + Для каждого Элемент Из Контекст.Элементы Цикл + Если ТипЗнч(Элемент) = Тип("ПолеФормы") + И СтрНачинаетсяС(Элемент.ПутьКДанным, "ОбъектПрототип[0].") + И СтрЗаканчиваетсяНа(Элемент.Имя, "0") Тогда + + ИмяЭлемента = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) -1); + + Если Контекст.Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + НовыйЭлемент = Контекст.Элементы.Вставить(ИмяЭлемента, ТипЗнч(Элемент), Элемент.Родитель, Элемент); + НовыйЭлемент.ПутьКДанным = "Объект." + Сред(Элемент.ПутьКДанным, СтрДлина("ОбъектПрототип[0].") + 1); + + Если Элемент.Вид = ВидПоляФормы.ПолеФлажка Или Элемент.Вид = ВидПоляФормы.ПолеКартинки Тогда + ИсключаемыеСвойства = "Имя, ПутьКДанным"; + Иначе + ИсключаемыеСвойства = "Имя, ПутьКДанным, ВыделенныйТекст, СвязьПоТипу"; + КонецЕсли; + ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, , ИсключаемыеСвойства); + Элемент.Видимость = Ложь; + КонецЕсли; + КонецЦикла; + + Размещение = НовыйОбъект.ВладелецФайла; + + Если Не НовыйОбъект.ЭтоНовый() Тогда + Контекст.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(НовыйОбъект); + КонецЕсли; + МассивИсключений = Новый Массив; + МассивИсключений.Добавить("РегистрСведений.ПрисоединенныеФайлы"); + +КонецПроцедуры + +Процедура ЗаполнитьСписокШифрования(Контекст, Знач Источник = Неопределено) Экспорт + Если Не ЗначениеЗаполнено(Источник) Тогда + Источник = Контекст.Объект; + КонецЕсли; + + Контекст.СертификатыШифрования.Очистить(); + + Если Источник.Зашифрован Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + СертификатыШифрования = МодульЭлектроннаяПодпись.СертификатыШифрования(Источник.Ссылка); + + Для Каждого СертификатШифрования Из СертификатыШифрования Цикл + + НоваяСтрока = Контекст.СертификатыШифрования.Добавить(); + НоваяСтрока.Представление = СертификатШифрования.Представление; + НоваяСтрока.Отпечаток = СертификатШифрования.Отпечаток; + НоваяСтрока.ПорядковыйНомер = СертификатШифрования.ПорядковыйНомер; + + ДвоичныеДанныеСертификата = СертификатШифрования.Сертификат; + Если ДвоичныеДанныеСертификата <> Неопределено Тогда + + НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( + ДвоичныеДанныеСертификата, Контекст.УникальныйИдентификатор); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + ТекстЗаголовка = НСтр("ru = 'Разрешено расшифровывать'"); + + Если Контекст.СертификатыШифрования.Количество() <> 0 Тогда + ТекстЗаголовка =ТекстЗаголовка + " (" + Формат(Контекст.СертификатыШифрования.Количество(), "ЧГ=") + ")"; + КонецЕсли; + + Контекст.Элементы.ГруппаСертификатыШифрования.Заголовок = ТекстЗаголовка; + +КонецПроцедуры + +Процедура ЗаполнитьСписокПодписей(Контекст, Знач Источник = Неопределено) Экспорт + Если Не ЗначениеЗаполнено(Источник) Тогда + Источник = Контекст.Объект; + КонецЕсли; + + Контекст.ЭлектронныеПодписи.Очистить(); + + Если Источник.ПодписанЭП Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ЭлектронныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(Источник.Ссылка); + + Для Каждого ЭлектроннаяПодписьФайла Из ЭлектронныеПодписи Цикл + + НоваяСтрока = Контекст.ЭлектронныеПодписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлектроннаяПодписьФайла); + НоваяСтрока.Объект = Источник.Ссылка; + НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище( + ЭлектроннаяПодписьФайла.Подпись, Контекст.УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(НоваяСтрока); + + ДвоичныеДанныеСертификата = ЭлектроннаяПодписьФайла.Сертификат.Получить(); + Если ДвоичныеДанныеСертификата <> Неопределено Тогда + НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( + ДвоичныеДанныеСертификата, Контекст.УникальныйИдентификатор); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + ТекстЗаголовка = НСтр("ru = 'Электронные подписи'"); + + Если Контекст.ЭлектронныеПодписи.Количество() <> 0 Тогда + ТекстЗаголовка = ТекстЗаголовка + " (" + Строка(Контекст.ЭлектронныеПодписи.Количество()) + ")"; + КонецЕсли; + + Контекст.Элементы.ГруппаЭлектронныеПодписи.Заголовок = ТекстЗаголовка; + +КонецПроцедуры + +Процедура УстановитьКнопкиИзмененияНевидимыми(Элементы) + + ИменаКоманд = ПолучитьИменаКомандИзмененияОбъекта(); + + Для каждого ЭлементФормы Из Элементы Цикл + + Если ТипЗнч(ЭлементФормы) <> Тип("КнопкаФормы") Тогда + Продолжить; + КонецЕсли; + + Если ИменаКоманд.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено Тогда + ЭлементФормы.Видимость = Ложь; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьИменаКомандИзмененияОбъекта() + + ИменаКоманд = Новый Массив; + + ИменаКоманд.Добавить("ПодписатьФайлЭП"); + ИменаКоманд.Добавить("ДобавитьЭПИзФайла"); + + ИменаКоманд.Добавить("УдалитьЭП"); + + ИменаКоманд.Добавить("Редактировать"); + ИменаКоманд.Добавить("ЗакончитьРедактирование"); + ИменаКоманд.Добавить("Освободить"); + + ИменаКоманд.Добавить("Зашифровать"); + ИменаКоманд.Добавить("Расшифровать"); + + ИменаКоманд.Добавить("СтандартныеСкопировать"); + ИменаКоманд.Добавить("ОбновитьИзФайлаНаДиске"); + + ИменаКоманд.Добавить("СтандартнаяЗаписать"); + ИменаКоманд.Добавить("СтандартнаяЗаписатьИЗакрыть"); + ИменаКоманд.Добавить("СтандартныеУстановитьПометкуУдаления"); + + Возврат ИменаКоманд; + +КонецФункции + +Функция НастройкиФайлов() Экспорт + + НастройкиФайлов = Новый Структура; + НастройкиФайлов.Вставить("НеОчищатьФайлы", Новый Массив); + НастройкиФайлов.Вставить("НеСинхронизироватьФайлы", Новый Массив); + НастройкиФайлов.Вставить("НеВыводитьВИнтерфейс", Новый Массив); + НастройкиФайлов.Вставить("НеСоздаватьФайлыПоШаблону", Новый Массив); + НастройкиФайлов.Вставить("ФайлыБезПапок", Новый Массив); + + Возврат НастройкиФайлов; + +КонецФункции + +///////////////////////////////////////////////////////////////////////////////////// +// Очистка ненужных файлов. + +Процедура ОчиститьДанныеНенужныхФайлов(НастройкаОчистки, МассивИсключений = Неопределено) + + Если НастройкаОчистки.Действие = Перечисления.ВариантыОчисткиФайлов.НеОчищать Тогда + Возврат; + КонецЕсли; + + Если МассивИсключений = Неопределено Тогда + МассивИсключений = Новый Массив; + КонецЕсли; + + ДеревоВладельцев = ВыбратьДанныеПоПравилу(НастройкаОчистки, МассивИсключений); + + Если ДеревоВладельцев.Строки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Файл Из ДеревоВладельцев.Строки Цикл + + Если НастройкаОчистки.ЭтоФайл Тогда + + Если НастройкаОчистки.Действие = Перечисления.ВариантыОчисткиФайлов.ОчиститьФайлыИВерсии Тогда + ФайлДляПометки = Файл.ФайлСсылка.ПолучитьОбъект(); + // Пропускаем удаление, если файл занят для редактирования. + Если ЗначениеЗаполнено(ФайлДляПометки.Редактирует) Тогда + Продолжить; + КонецЕсли; + ФайлДляПометки.УстановитьПометкуУдаления(Истина); + КонецЕсли; + + Для Каждого Версия Из Файл.Строки Цикл + ВыполнитьОчисткуДанныхОВерсии(Версия.ВерсияСсылка); + КонецЦикла; + + Иначе + ВыполнитьОчисткуДанныхОФайле(Файл.ФайлСсылка); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ВыбратьДанныеПоПравилу(НастройкаОчистки, МассивИсключений) + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + + ОчищатьПоПравилу = НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.ПоПравилу; + Если ОчищатьПоПравилу Тогда + НастройкиКомпоновщика = НастройкаОчистки.ПравилоОтбора.Получить(); + Если НастройкиКомпоновщика <> Неопределено Тогда + КомпоновщикНастроек.ЗагрузитьНастройки(НастройкаОчистки.ПравилоОтбора.Получить()); + КонецЕсли; + КонецЕсли; + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "Local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.Имя = "НаборДанных1"; + НаборДанных.ИсточникДанных = ИсточникДанных.Имя; + + СхемаКомпоновкиДанных.ПоляИтога.Очистить(); + + Если НастройкаОчистки.ЭтоНастройкаДляЭлементаСправочника Тогда + ВладелецФайла = НастройкаОчистки.ИдентификаторВладельца; + ЭлементИсключение = НастройкаОчистки.ВладелецФайла; + Иначе + ВладелецФайла = НастройкаОчистки.ВладелецФайла; + ЭлементИсключение = Неопределено; + КонецЕсли; + + СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляОчисткиФайлов( + ВладелецФайла, + НастройкаОчистки, + МассивИсключений, + ЭлементИсключение); + + Структура = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ФайлСсылка"); + + Если НастройкаОчистки.ЭтоФайл Тогда + + СтруктураВерсий = Структура.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + + ВыбранноеПоле = СтруктураВерсий.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ВерсияСсылка"); + + КонецЕсли; + + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); + + Настройки = КомпоновщикНастроек.ПолучитьНастройки(); + + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипВладельца"); + Параметр.Значение = ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки); + Параметр.Использование = Истина; + + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодОчистки"); + Если Параметр <> Неопределено Тогда + Если НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеМесяца Тогда + ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -1); + ИначеЕсли НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеГода Тогда + ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -12); + ИначеЕсли НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеШестиМесяцев Тогда + ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -6); + КонецЕсли; + Параметр.Значение = ЗначениеПериодаОчистки; + Параметр.Использование = Истина; + КонецЕсли; + + ПараметрТекущаяДата = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТекущаяДата"); + Если ПараметрТекущаяДата <> Неопределено Тогда + ПараметрТекущаяДата.Значение = ТекущаяДатаСеанса(); + ПараметрТекущаяДата.Использование = Истина; + КонецЕсли; + + Если МассивИсключений.Количество() > 0 Тогда + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивИсключений"); + Параметр.Значение = МассивИсключений; + Параметр.Использование = Истина; + КонецЕсли; + + Если НастройкаОчистки.ЭтоНастройкаДляЭлементаСправочника Тогда + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ЭлементИсключение"); + Параметр.Значение = ЭлементИсключение; + Параметр.Использование = Истина; + КонецЕсли; + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ДеревоЗначений = Новый ДеревоЗначений; + + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + ПроцессорВывода.УстановитьОбъект(ДеревоЗначений); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + + Возврат ДеревоЗначений; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Синхронизация файлов + +Функция ВозможностьСозданияПапки(ОбъектВладелец) + + Если ОбъектВладелец = Неопределено Тогда + Возврат Ложь; + Иначе + Возврат ТипЗнч(ОбъектВладелец) = Тип("СправочникСсылка.ПапкиФайлов"); + КонецЕсли; + +КонецФункции + +Функция ФайлРедактируетсяВОблаке(Файл) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл + |ИЗ + | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + |ГДЕ + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &Файл"; + + Запрос.УстановитьПараметр("Файл", Файл); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + Возврат Истина; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ПриОпределенииОбъектовИсключенияСинхронизацииФайлов() Экспорт + + НастройкиФайлов = НастройкиФайлов(); + + РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(НастройкиФайлов()); + + Возврат НастройкиФайлов.НеСинхронизироватьФайлы; + +КонецФункции + +Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение) + + ТипОбъекта = ВладелецФайла; + ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)); + ПолноеИмяСправочникаФайлов = НастройкаСинхронизации.ТипВладельцаФайла.ПолноеИмя; + МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); + ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов); + ЕстьТипДата = Ложь; + + ТекстЗапроса = ""; + + СправочникФайлов = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ТипВладельцаФайла); + ВозможностьСоздаватьГруппы = СправочникФайлов.Иерархический; + Если ТипЗнч(ВладелецФайла) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(НастройкаСинхронизации.ИдентификаторВладельца); + Иначе + СправочникПапок = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецФайла); + КонецЕсли; + + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса= ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + |"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ + | СправочникПапок.Ссылка,"; + + ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); + + ТекстЗапроса = ТекстЗапроса + " + | СправочникФайлов.Ссылка КАК ФайлСсылка,"; + Если ВозможностьСоздаватьГруппы Тогда + ТекстЗапроса = ТекстЗапроса + " + | ВЫБОР Когда СправочникФайлов.ЭтоГруппа Тогда + | СправочникФайлов.Наименование + | ИНАЧЕ + | СправочникФайлов.Наименование + ""."" + СправочникФайлов.Расширение + | КОНЕЦ КАК Наименование, + | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, + | СправочникФайлов.ВладелецФайла КАК Родитель, + | ЛОЖЬ КАК ЭтоПапка,"; + + Иначе + ТекстЗапроса = ТекстЗапроса + " + | СправочникФайлов.Наименование + ""."" + СправочникФайлов.Расширение КАК Наименование, + | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, + | СправочникФайлов.ВладелецФайла КАК Родитель, + | ЛОЖЬ КАК ЭтоПапка,"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + | ИСТИНА КАК ЕстьВБазе, + | ЛОЖЬ КАК ЕстьНаСервере, + | НЕОПРЕДЕЛЕНО КАК Изменения, + | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """") КАК Href, + | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, """") КАК Etag, + | ЛОЖЬ КАК Обработан, + | ВЫРАЗИТЬ("""" КАК СТРОКА(36)) КАК UID1C, + | """" КАК ToHref, + | """" КАК ToEtag, + | """" КАК РодительСервер, + | """" КАК НаименованиеСервер, + | ЛОЖЬ КАК ИзмененНаСервере, + | НЕОПРЕДЕЛЕНО КАК Уровень, + | """" КАК РодительСортировка, + | " + ?(ЕстьВозможностьХранитьВерсии,"ИСТИНА", "ЛОЖЬ") + " КАК ЭтоФайл + |ИЗ + | Справочник." + СправочникФайлов.Имя + " КАК СправочникФайлов + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникФайлов.Ссылка) + | ЛЕВОЕ СОЕДИНЕНИЕ " + ПредставлениеТипаВладельца+ "." + СправочникПапок.Имя + " КАК СправочникПапок + | ПО (СправочникФайлов.ВладелецФайла = СправочникПапок.Ссылка) + |ГДЕ + | ТИПЗНАЧЕНИЯ(СправочникФайлов.ВладелецФайла) = &ТипВладельца"; + + Если МассивИсключений.Количество() > 0 Тогда + ТекстЗапроса = ТекстЗапроса + " + | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; + КонецЕсли; + Если ЭлементИсключение <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + " + | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | СправочникПапок.Ссылка,"; + + ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); + + ТекстЗапроса = ТекстЗапроса + " + | СправочникПапок.Ссылка, + | " + ?(ПредставлениеТипаВладельца = "Документ", + "СправочникПапок.Представление", "СправочникПапок.Наименование") + ", + | СправочникПапок.ПометкаУдаления,"; + Если ОбщегоНазначения.ЭтоСправочник(СправочникПапок) И СправочникПапок.Иерархический Тогда + ТекстЗапроса = ТекстЗапроса + " + | ВЫБОР + | КОГДА СправочникПапок.Родитель = ЗНАЧЕНИЕ(Справочник." + СправочникПапок.Имя + ".ПустаяСсылка) + | ТОГДА НЕОПРЕДЕЛЕНО + | ИНАЧЕ СправочникПапок.Родитель + | КОНЕЦ,"; + Иначе + ТекстЗапроса = ТекстЗапроса + "Неопределено,"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + | ИСТИНА, + | ИСТИНА, + | ЛОЖЬ, + | НЕОПРЕДЕЛЕНО, + | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """"), + | """", + | ЛОЖЬ, + | """", + | """", + | """", + | """", + | """", + | ЛОЖЬ, + | НЕОПРЕДЕЛЕНО, + | """", + | " + ?(ЕстьВозможностьХранитьВерсии,"ИСТИНА", "ЛОЖЬ") + " + |ИЗ + | " + ПредставлениеТипаВладельца + "." + СправочникПапок.Имя + " КАК СправочникПапок + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + | ПО (СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = СправочникПапок.Ссылка + | И СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись = &УчетнаяЗапись) + | ГДЕ + | ИСТИНА"; + + Если МассивИсключений.Количество() > 0 Тогда + ТекстЗапроса = ТекстЗапроса + " + | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; + КонецЕсли; + Если ЭлементИсключение <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + " + | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; + + КонецЕсли; + + Возврат ТекстЗапроса; + +КонецФункции + +Функция ОбъектЯвляетсяФайлом(ОбъектВладелец) + + МассивТиповФайлов = Метаданные.ОпределяемыеТипы.ВладелецПрисоединенныхФайлов.Тип.Типы(); + Возврат МассивТиповФайлов.Найти(ТипЗнч(ОбъектВладелец)) <> Неопределено; + +КонецФункции + +Процедура ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта) + + ВсеСправочники = Справочники.ТипВсеСсылки(); + ВсеДокументы = Документы.ТипВсеСсылки(); + + Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда + Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; + Для Каждого Реквизит Из Справочник.Реквизиты Цикл + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + " КАК " + Реквизит.Имя +","; + КонецЦикла; + ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда + Документ = Метаданные.Документы[ТипОбъекта.Имя]; + Для Каждого Реквизит Из Документ.Реквизиты Цикл + Если Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + ","; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Проверяет, была ли ошибка при выполнении HTTP запроса, и вызывает соответствующее исключение. +Процедура ПроверитьИсключениеHTTP1С(Ответ, АдресСервера) + Если (Ответ.КодСостояния >= 400) И (Ответ.КодСостояния <= 599) Тогда + ШаблонОшибки = НСтр("ru = 'Ошибка HTTP 1С : %1 в %2'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, Ответ.КодСостояния, РаскодироватьСтроку(АдресСервера, СпособКодированияСтроки.URLВКодировкеURL)); + КонецЕсли; +КонецПроцедуры + +// Выполняет метод протокола webdav. +Процедура ВыполнитьМетодWebdav(ИмяМетода, Href, СоответствиеЗаголовков, СтруктураОбмена, XMLЗапрос="", ТекстПротокола = Неопределено) + + СтруктураHref = СтруктураURIРаскодированная(Href); + + HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref, СтруктураОбмена); + + HTTPЗапросWebdav = Новый HTTPЗапрос(СтруктураHref.ПутьНаСервере, СоответствиеЗаголовков); + + Если ЗначениеЗаполнено(XMLЗапрос) Тогда + HTTPЗапросWebdav.УстановитьТелоИзСтроки(XMLЗапрос); + КонецЕсли; + + Если ТекстПротокола<>Неопределено Тогда + ТекстПротокола = ТекстПротокола + ?(ПустаяСтрока(ТекстПротокола), "", Символы.ПС) + + ИмяМетода + " " + Href + Символы.ПС + Символы.ПС + XMLЗапрос + Символы.ПС; + КонецЕсли; + + СтруктураОбмена.Ответ = HTTP.ВызватьHTTPМетод(ИмяМетода,HTTPЗапросWebdav); + + Если ТекстПротокола<>Неопределено Тогда + ТекстПротокола = ТекстПротокола + ?(ПустаяСтрока(ТекстПротокола), "", Символы.ПС) + "HTTP RESPONSE " + + СтруктураОбмена.Ответ.КодСостояния + Символы.ПС + Символы.ПС; + Для каждого ЗаголовокОтвета Из СтруктураОбмена.Ответ.Заголовки Цикл + ТекстПротокола = ТекстПротокола+ЗаголовокОтвета.Ключ+": " + ЗаголовокОтвета.Значение + Символы.ПС; + КонецЦикла; + ТекстПротокола = ТекстПротокола+Символы.ПС+СтруктураОбмена.Ответ.ПолучитьТелоКакСтроку() + Символы.ПС; + КонецЕсли; + + ПроверитьИсключениеHTTP1С(СтруктураОбмена.Ответ,Href); + +КонецПроцедуры + +// Обновляет уникальный служебный реквизит файла на сервере webdav. +Процедура ОбновитьUID1CФайла(Href, UID1C, ПараметрыСинхронизации) + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-type"] = "text/xml"; + ЗаголовкиHTTP["Accept"] = "text/xml"; + + ВыполнитьМетодWebdav("PROPPATCH",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, + " + | + | + | "+UID1C+" + | + |"); + +КонецПроцедуры + +// Считывает уникальный служебный реквизит файла на сервере webdav. +Функция ПолучитьUID1C(Href,ПараметрыСинхронизации) + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-type"] = "text/xml"; + ЗаголовкиHTTP["Accept"] = "text/xml"; + ЗаголовкиHTTP["Depth"] = "0"; + + ВыполнитьМетодWebdav("PROPFIND",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, + " + | + | + |"); + + КонтекстXml = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); + + НайденныеEtag = ВычислитьXPath("//*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']/*[local-name()='UID1C']",КонтекстXml).ПолучитьСледующий(); + Если НайденныеEtag<>Неопределено Тогда + Возврат НайденныеEtag.ТекстовоеСодержимое; + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Проверяет, поддерживает ли сервер webdav пользовательские свойства для файла. +Функция ПроверитьВозможностьUID1C(Href, UID1C, ПараметрыСинхронизации) + + Попытка + + ОбновитьUID1CФайла(Href, UID1C, ПараметрыСинхронизации); + Возврат ЗначениеЗаполнено(ПолучитьUID1C(Href, ПараметрыСинхронизации)); + + Исключение + + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(), ПараметрыСинхронизации); + + КонецПопытки; + + Возврат Ложь; + +КонецФункции + +// Выполняет MCKOL на сервере webdav. +Процедура ВызватьМетодMKCOL(Href, ПараметрыСинхронизации) + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ВыполнитьМетодWebdav("MKCOL",Href,ЗаголовкиHTTP,ПараметрыСинхронизации); + +КонецПроцедуры // ВызватьМетодMKCOL() + +// Выполняет DELETE на сервере webdav. +Процедура ВызватьМетодDELETE(Href, ПараметрыСинхронизации) + + HrefБезСлеша = ЗакончитьБезСлеша(Href); + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ВыполнитьМетодWebdav("DELETE", HrefБезСлеша, ЗаголовкиHTTP, ПараметрыСинхронизации); + +КонецПроцедуры + +// Получает Etag файла на сервере. +Функция ПолучитьEtag(Href,ПараметрыСинхронизации) + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-type"] = "text/xml"; + ЗаголовкиHTTP["Accept"] = "text/xml"; + ЗаголовкиHTTP["Depth"] = "0"; + + ВыполнитьМетодWebdav("PROPFIND",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, + " + | + | + |"); + + КонтекстXml = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); + + НайденныеEtag = ВычислитьXPath("//*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']/*[local-name()='getetag']",КонтекстXml).ПолучитьСледующий(); + Если НайденныеEtag<>Неопределено Тогда + Возврат НайденныеEtag.ТекстовоеСодержимое; + КонецЕсли; + + Возврат ""; +КонецФункции + +// Инициализирует объект HTTPСоединение. +Функция СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации) + + Если НЕ ЗначениеЗаполнено(СтруктураHref.Порт) Тогда + HTTP = Новый HTTPСоединение( + СтруктураHref.Хост, + , + ПараметрыСинхронизации.Логин, + ПараметрыСинхронизации.Пароль, + , + 20, + ?(СтруктураHref.Схема="https",Новый(Тип("ЗащищенноеСоединениеOpenSSL")),Неопределено)); + Иначе + HTTP = Новый HTTPСоединение( + СтруктураHref.Хост, + СтруктураHref.Порт, + ПараметрыСинхронизации.Логин, + ПараметрыСинхронизации.Пароль, + , + 20, + ?(СтруктураHref.Схема="https",Новый(Тип("ЗащищенноеСоединениеOpenSSL")),Неопределено)); + КонецЕсли; + + Возврат HTTP; + +КонецФункции // + +// Вызывает метод GET на сервере webdav и возвращает адрес загруженного файла во временном хранилище. +Функция ВызватьМетодGET(Href, Etag, ПараметрыСинхронизации, ДатаМодификацииФайла = Неопределено, ДлинаФайла = Неопределено) + + СтруктураHref = СтруктураURIРаскодированная(Href); + + HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации); + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"]="1C Enterprise 8.3"; + ЗаголовкиHTTP["Accept"]="application/octet-stream"; + + HTTPЗапросWebdav = Новый HTTPЗапрос(СтруктураHref.ПутьНаСервере, ЗаголовкиHTTP); + + ПараметрыСинхронизации.Ответ = HTTP.Получить(HTTPЗапросWebdav); + + ПроверитьИсключениеHTTP1С(ПараметрыСинхронизации.Ответ, Href); + + ФайлСДвоичнымиДанными = ПараметрыСинхронизации.Ответ.ПолучитьТелоКакДвоичныеДанные(); + + Etag = ?(ПараметрыСинхронизации.Ответ.Заголовки["ETag"] = Неопределено, "", ПараметрыСинхронизации.Ответ.Заголовки["ETag"]); + ДатаМодификацииФайла = ?(ПараметрыСинхронизации.Ответ.Заголовки["Last-Modified"] = Неопределено,ТекущаяУниверсальнаяДата(),ДатаRFC1123(ПараметрыСинхронизации.Ответ.Заголовки["Last-Modified"])); + ДлинаФайла = ФайлСДвоичнымиДанными.Размер(); + + АдресВременныхДанных = ПоместитьВоВременноеХранилище(ФайлСДвоичнымиДанными); + + Возврат АдресВременныхДанных; + +КонецФункции + +// Помещает файл на сервер webdav с помощью метода PUT и возвращает присвоенный etag в переменную. +Функция ВызватьМетодPUT(Href, ФайлСсылка, ПараметрыСинхронизации, ЭтоФайл) + + ФайлСДвоичнымиДанными = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка); + + СтруктураHref = СтруктураURIРаскодированная(Href); + + HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации); + + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"]="1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-Type"]="application/octet-stream"; + + HTTPЗапросWebdav = Новый HTTPЗапрос(СтруктураHref.ПутьНаСервере, ЗаголовкиHTTP); + + HTTPЗапросWebdav.УстановитьТелоИзДвоичныхДанных(ФайлСДвоичнымиДанными); + + ПараметрыСинхронизации.Ответ = HTTP.Записать(HTTPЗапросWebdav); + + ПроверитьИсключениеHTTP1С(ПараметрыСинхронизации.Ответ,Href); + + Возврат ПолучитьEtag(Href,ПараметрыСинхронизации); + +КонецФункции + +// Загружает файл с сервера с созданием новой версии. +Процедура ЗагрузитьФайлССервера(ПараметрыФайла, ЭтоФайл = Неопределено) + + Перем АдресЗагруженногоФайла, НовыйФайл, СтруктураИмениФайла, ФайлUID1C; + + ИмяФайла = ПараметрыФайла.ИмяФайла; + Href = ПараметрыФайла.Href; + Etag = ПараметрыФайла.Etag; + ДатаМодификацииФайла = ПараметрыФайла.ДатаМодификацииФайла; + ДлинаФайла = ПараметрыФайла.ДлинаФайла; + ДляПользователя = ПараметрыФайла.ДляПользователя; + ОбъектВладелец = ПараметрыФайла.ОбъектВладелец; + СсылкаСуществующегоФайла = ПараметрыФайла.СсылкаСуществующегоФайла; + ПараметрыСинхронизации = ПараметрыФайла.ПараметрыСинхронизации; + ТекстСобытия = НСтр("ru = 'Загрузка файла с сервера: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, ИмяФайла), ПараметрыСинхронизации); + АдресЗагруженногоФайла = ВызватьМетодGET(Href, Etag, ПараметрыСинхронизации, ДатаМодификацииФайла, ДлинаФайла); + + Если ЭтоФайл = Неопределено Тогда + ЭтоФайл = ОбъектЯвляетсяФайлом(ПараметрыФайла.ОбъектВладелец); + КонецЕсли; + + Если АдресЗагруженногоФайла <> Неопределено Тогда + + СтруктураИмениФайла = Новый Файл(ИмяФайла); + + Если СсылкаСуществующегоФайла = Неопределено Тогда + + Если ЭтоФайл Тогда + + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ВладелецФайлов", ОбъектВладелец); + ПараметрыФайла.Вставить("Автор", ПараметрыСинхронизации.АвторФайлов); + ПараметрыФайла.Вставить("ИмяБезРасширения", СтруктураИмениФайла.ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение)); + ПараметрыФайла.Вставить("ВремяИзменения", МестноеВремя(ДатаМодификацииФайла,ЧасовойПоясСеанса())); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ДатаМодификацииФайла); + + НовыйФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресЗагруженногоФайла); + + ЗанятьФайлДляРедактированияСервер(НовыйФайл, ПараметрыСинхронизации.АвторФайлов); + КонецЕсли; + + Иначе + + Если ЭтоФайл Тогда + + ИнформацияОФайле = Новый Структура; + ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", АдресЗагруженногоФайла); + ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", Неопределено); + ИнформацияОФайле.Вставить("ИмяБезРасширения", СтруктураИмениФайла.ИмяБезРасширения); + ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", ДатаМодификацииФайла); + ИнформацияОФайле.Вставить("Расширение", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение)); + ИнформацияОФайле.Вставить("Редактирует", ПараметрыСинхронизации.АвторФайлов); + + РаботаСФайлами.ОбновитьФайл(СсылкаСуществующегоФайла, ИнформацияОФайле); + НовыйФайл = СсылкаСуществующегоФайла; + + КонецЕсли; + + КонецЕсли; + + ФайлUID1C = Строка(НовыйФайл.Ссылка.УникальныйИдентификатор()); + ОбновитьUID1CФайла(Href, ФайлUID1C, ПараметрыСинхронизации); + + ЗапомнитьСерверныеДанныеСсылки( + НовыйФайл.Ссылка, + Href, + Etag, + ЭтоФайл, + ОбъектВладелец, + Ложь, + ПараметрыСинхронизации.УчетнаяЗапись); + + ТекстСообщения = НСтр("ru = 'Загружен файл с сервера: %1'"); + Иначе + ТекстСообщения = НСтр("ru = 'Не удалось загрузить файл с сервера: %1'"); + КонецЕсли; + + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайла), ПараметрыСинхронизации); + +КонецПроцедуры + +// Записывает событие в журнал регистрации. +Процедура ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСообщения, ПараметрыСинхронизации) + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Синхронизация файлов с облачным сервисом:'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + , + ПараметрыСинхронизации.УчетнаяЗапись, + ТекстСообщения); + +КонецПроцедуры + +// Возвращает дату, преобразованную из формата RFC 1123 в тип Дата. +Функция ДатаRFC1123(ДатаСтрокойHTTP) + + ИменаМесяцев = "janfebmaraprmayjunjulaugsepoctnovdec"; + // rfc1123-date = wkday "," SP date1 SP time SP "GMT". + ПозицияПервогоПробела = СтрНайти(ДатаСтрокойHTTP, " ");//с первого пробела до второго пробела идет дата. + ПодстрокаДата = Сред(ДатаСтрокойHTTP,ПозицияПервогоПробела+1); + ПодстрокаВремя = Сред(ПодстрокаДата,13); + ПодстрокаДата = Лев(ПодстрокаДата,11); + ПозицияПервогоПробела = СтрНайти(ПодстрокаВремя, " "); + ПодстрокаВремя = Лев(ПодстрокаВремя,ПозицияПервогоПробела-1); + // date1 = 2DIGIT SP month SP 4DIGIT. + ПодстрокаДень = Лев(ПодстрокаДата,2); + ПодстрокаМесяц = Формат(Цел(СтрНайти(ИменаМесяцев,НРег(Сред(ПодстрокаДата,4,3))) / 3)+1,"ЧЦ=2; ЧН=00; ЧВН="); + ПодстрокаГод = Сред(ПодстрокаДата,8); + // time = 2DIGIT ":" 2DIGIT ":" 2DIGIT. + ПодстрокаЧас = Лев(ПодстрокаВремя,2); + ПодстрокаМинута = Сред(ПодстрокаВремя,4,2); + ПодстрокаСекунда = Прав(ПодстрокаВремя,2); + + Возврат Дата(ПодстрокаГод+ПодстрокаМесяц+ПодстрокаДень+ПодстрокаЧас+ПодстрокаМинута+ПодстрокаСекунда); + +КонецФункции + +// Считывает основные данные о состоянии каталога на сервере. Используется для проверки подключения. +Процедура ПрочитатьПараметрыКаталога(РезультатПроверки, HttpАдрес, СтруктураОбмена) + + СтруктураАдресаHTTP = СтруктураURIРаскодированная(HttpАдрес); + АдресСервера = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP); + + Попытка + // получаем каталог + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-type"] = "text/xml"; + ЗаголовкиHTTP["Accept"] = "text/xml"; + ЗаголовкиHTTP["Depth"] = "0"; + + ВыполнитьМетодWebdav("PROPFIND", АдресСервера, ЗаголовкиHTTP, СтруктураОбмена, + " + | + | + |" + ,РезультатПроверки.РезультатПротокол); + + КонтекстДокументаXML = ОпределитьКонтекстXML(СтруктураОбмена.Ответ.ПолучитьТелоКакСтроку()); + + РезультатXPath = ВычислитьXPath("//*[local-name()='response']",КонтекстДокументаXML); + + НайденныйResponse = РезультатXPath.ПолучитьСледующий(); + + Пока НайденныйResponse <> Неопределено Цикл + + НайденныйPropstat = ВычислитьXPath("./*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); + + Если НайденныйPropstat<>Неопределено Тогда + Для каждого ДочернийУзелPropstat Из НайденныйPropstat.ДочерниеУзлы Цикл + Если ДочернийУзелPropstat.ЛокальноеИмя = "quota-available-bytes" Тогда + Попытка + РазмерВМегабайтах = Окр(Число(ДочернийУзелPropstat.ТекстовоеСодержимое)/1024/1024, 1); + Исключение + РазмерВМегабайтах = 0; + КонецПопытки; + + ИнформацияОСвободномМесте = НСтр("ru = 'Свободное место : %1 Мб'"); + + РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИнформацияОСвободномМесте, РазмерВМегабайтах); + ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "quota-used-bytes" Тогда + Попытка + РазмерВМегабайтах = Окр(Число(ДочернийУзелPropstat.ТекстовоеСодержимое)/1024/1024, 1); + Исключение + РазмерВМегабайтах = 0; + КонецПопытки; + + ИнформацияОЗанятомМесте = НСтр("ru = 'Занято : %1 Мб'"); + + РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИнформацияОЗанятомМесте, РазмерВМегабайтах); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + НайденныйResponse = РезультатXPath.ПолучитьСледующий(); + + КонецЦикла; + + Исключение + ОписаниеОшибки = ОписаниеОшибки(); + РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) + ОписаниеОшибки; + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки,СтруктураОбмена); + Отказ = Истина; + РезультатПроверки.Отказ = Истина; + КонецПопытки; + +КонецПроцедуры + +// Возвращает структуру URI +Функция СтруктураURIРаскодированная(Знач СтрокаURI) + + СтрокаURI = СокрЛП(СтрокаURI); + + // Схема + Схема = ""; + Позиция = СтрНайти(СтрокаURI, "://"); + Если Позиция > 0 Тогда + Схема = НРег(Лев(СтрокаURI, Позиция - 1)); + СтрокаURI = Сред(СтрокаURI, Позиция + 3); + КонецЕсли; + + // Строка соединения и путь на сервере. + СтрокаСоединения = СтрокаURI; + ПутьНаСервере = ""; + Позиция = СтрНайти(СтрокаСоединения, "/"); + Если Позиция > 0 Тогда + // Включая первый слэш + ПутьНаСервере = Сред(СтрокаСоединения, Позиция); + СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1); + КонецЕсли; + + // Информация пользователя и имя сервера. + СтрокаАвторизации = ""; + ИмяСервера = СтрокаСоединения; + Позиция = СтрНайти(СтрокаСоединения, "@"); + Если Позиция > 0 Тогда + СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1); + ИмяСервера = Сред(СтрокаСоединения, Позиция + 1); + КонецЕсли; + + // Логин и пароль + Логин = СтрокаАвторизации; + Пароль = ""; + Позиция = СтрНайти(СтрокаАвторизации, ":"); + Если Позиция > 0 Тогда + Логин = Лев(СтрокаАвторизации, Позиция - 1); + Пароль = Сред(СтрокаАвторизации, Позиция + 1); + КонецЕсли; + + // Хост и порт + Хост = ИмяСервера; + Порт = ""; + Позиция = СтрНайти(ИмяСервера, ":"); + Если Позиция > 0 Тогда + Хост = Лев(ИмяСервера, Позиция - 1); + Порт = Сред(ИмяСервера, Позиция + 1); + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Схема", НРег(Схема)); + Результат.Вставить("Логин", Логин); + Результат.Вставить("Пароль", Пароль); + Результат.Вставить("ИмяСервера", НРег(ИмяСервера)); + Результат.Вставить("Хост", НРег(Хост)); + Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт))); + Результат.Вставить("ПутьНаСервере", РаскодироватьСтроку(ЗакончитьБезСлеша(ПутьНаСервере),СпособКодированияСтроки.URLВКодировкеURL)); + + // Путь на сервере всегда будет с начальным, но без конечного слэша, универсально для файлов и папок. + Возврат Результат; + +КонецФункции + +// Возвращает URI, составленный из структуры. +Функция КодироватьURIПоСтруктуре(Знач СтруктураURI, ВключаяПутьНаСервере = Истина) + Результат = ""; + + // Протокол + Если Не ПустаяСтрока(СтруктураURI.Схема) Тогда + Результат = Результат + СтруктураURI.Схема + "://"; + КонецЕсли; + + // Авторизация + Если Не ПустаяСтрока(СтруктураURI.Логин) Тогда + Результат = Результат + СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@"; + КонецЕсли; + + // Все остальное + Результат = Результат + СтруктураURI.Хост; + Если ЗначениеЗаполнено(СтруктураURI.Порт) Тогда + Результат = Результат + ":" + ?(ТипЗнч(СтруктураURI.Порт) = Тип("Число"), Формат(СтруктураURI.Порт, "ЧГ=0"), СтруктураURI.Порт); + КонецЕсли; + + Результат = Результат + ?(ВключаяПутьНаСервере, ЗакончитьБезСлеша(СтруктураURI.ПутьНаСервере),""); + + // Всегда без конечного слеша + Возврат Результат; + +КонецФункции + +// Возвращает строку, гарантированно начинающуюся прямым слешем. +Функция НачатьСлешем(Знач ИсходнаяСтрока) + Возврат ?(Лев(ИсходнаяСтрока,1)="/",ИсходнаяСтрока,"/"+ИсходнаяСтрока); +КонецФункции + +// Возвращает строку, гарантированно заканчивающуюся без прямого слэша. +Функция ЗакончитьБезСлеша(Знач ИсходнаяСтрока) + Возврат ?(Прав(ИсходнаяСтрока,1)="/",Лев(ИсходнаяСтрока,СтрДлина(ИсходнаяСтрока)-1),ИсходнаяСтрока); +КонецФункции + +// Возвращает результат сравнения путей двух URI, вне зависимости от наличия начального и конечного прямого слеша, +// кодирования спецсимволов, а так же адреса сервера. +Функция ЭтоОдинаковыеПутиURI(URI1,URI2,ЧувствительноКРегистру = Истина) + + // Гарантирует идентичность вне зависимости от слэшей и кодирования. + СтруктураURI1 = СтруктураURIРаскодированная(URI1); + СтруктураURI2 = СтруктураURIРаскодированная(URI2); + Если НЕ ЧувствительноКРегистру Тогда + СтруктураURI1.ПутьНаСервере = НРег(СтруктураURI1.ПутьНаСервере); + СтруктураURI2.ПутьНаСервере = НРег(СтруктураURI2.ПутьНаСервере); + КонецЕсли; + + Возврат КодироватьURIПоСтруктуре(СтруктураURI1,Истина) = КодироватьURIПоСтруктуре(СтруктураURI2,Истина); + +КонецФункции + +// Возвращает имя файла по Href. +Функция ИмяФайлаПоHref(Href) + + URI = ЗакончитьБезСлеша(Href); + ДлинаURI = СтрДлина(URI); + + // Находим последний слэш, после него будет имя файла. + + Для Сч = 1 По ДлинаURI Цикл + СимволURI = Сред(URI,ДлинаURI - Сч + 1, 1); + Если СимволURI = "/" Тогда + Возврат РаскодироватьСтроку(Сред(URI,ДлинаURI - Сч + 2), СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + КонецЦикла; + + Возврат РаскодироватьСтроку(URI,СпособКодированияСтроки.КодировкаURL); + +КонецФункции + +// Сохраняет данные о Href и Etag файла или папки в базе данных. +Процедура ЗапомнитьСерверныеДанныеСсылки( + Ссылка, + Href, + Etag, + ЭтоФайл, + ВладелецФайла, + ЭтоПапка, + УчетнаяЗапись = Неопределено) + + ЗаписьРегистра = РегистрыСведений.СтатусыСинхронизацииФайловСОблачнымСервисом.СоздатьМенеджерЗаписи(); + ЗаписьРегистра.Файл = Ссылка; + ЗаписьРегистра.Href = Href; + ЗаписьРегистра.Etag = Etag; + ЗаписьРегистра.УникальныйИдентификатор1С = Ссылка.УникальныйИдентификатор(); + ЗаписьРегистра.ЭтоФайл = ЭтоФайл; + ЗаписьРегистра.ЭтоВладелецФайла = ЭтоПапка; + ЗаписьРегистра.ВладелецФайла = ВладелецФайла; + ЗаписьРегистра.УчетнаяЗапись = УчетнаяЗапись; + ЗаписьРегистра.Записать(Истина); + +КонецПроцедуры + +// Удаляет данные о Href и Etag файла или папки в базе данных. +Процедура УдалитьСерверныеДанныеСсылки(Ссылка, УчетнаяЗапись) + + НаборРегистра = РегистрыСведений.СтатусыСинхронизацииФайловСОблачнымСервисом.СоздатьНаборЗаписей(); + НаборРегистра.Отбор.Файл.Установить(Ссылка); + НаборРегистра.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); + НаборРегистра.Записать(Истина); + +КонецПроцедуры + +// Определяет контекст xml +Функция ОпределитьКонтекстXML(ТекстXML) + + ЧтениеXMLТекста = Новый ЧтениеXML; + ЧтениеXMLТекста.УстановитьСтроку(ТекстXML); + ПостроительDOMДляXML = Новый ПостроительDOM; + ДокументDOMДляXML = ПостроительDOMДляXML.Прочитать(ЧтениеXMLТекста); + РазыменовательИменДляXML = Новый РазыменовательПространствИменDOM(ДокументDOMДляXML); + Возврат Новый Структура("ДокументDOM,РазыменовательDOM", ДокументDOMДляXML, РазыменовательИменДляXML); + +КонецФункции + +// Вычисляет выражение xpath для контекста xml. +Функция ВычислитьXPath(Выражение, Контекст, УзелКонтекста = Неопределено) + + Возврат Контекст.ДокументDOM.ВычислитьВыражениеXPath(Выражение,?(УзелКонтекста=Неопределено,Контекст.ДокументDOM,УзелКонтекста),Контекст.РазыменовательDOM); + +КонецФункции + +// Возвращает Href, рассчитанный для строки из таблицы файлов, методом поиска всех родителей. +Функция РассчитатьHref(СтрокаФайлов,ТаблицаФайлов) + // Рекурсивно собираем наименования. + НайденыСтрокиФайлов = ТаблицаФайлов.Найти(СтрокаФайлов.Родитель,"ФайлСсылка"); + Если НайденыСтрокиФайлов = Неопределено Тогда + Возврат ?(ЗначениеЗаполнено(СтрокаФайлов.Наименование), СтрокаФайлов.Наименование +"/",""); + Иначе + Возврат РассчитатьHref(НайденыСтрокиФайлов,ТаблицаФайлов) + СтрокаФайлов.Наименование +"/"; + КонецЕсли; +КонецФункции + +// Возвращает строку таблицы файлов по URI, при этом, учитывается возможное различное написание URI +// (например, закодированное, относительное или абсолютное и т.п.). +Функция НайтиСтрокуПоURI(ИскомоеURI, ТаблицаСURI, КолонкаURI) + + Для каждого СтрокаТаблицы Из ТаблицаСURI Цикл + Если ЭтоОдинаковыеПутиURI(ИскомоеURI,СтрокаТаблицы[КолонкаURI]) Тогда + Возврат СтрокаТаблицы; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +// Вычисляется уровень строки файлов, рекурсивным алгоритмом. +Функция РекурсивноУровень(СтрокаФайлов,ТаблицаФайлов) + + // Равен уровню в базе или на сервере, в зависимости от того, где он меньше. + НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.Родитель)); + КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество()=0,0,1); + Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл + КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровень(НайденнаяСтрокаФайлов,ТаблицаФайлов); + КонецЦикла; + + Возврат КоличествоПрибавления; + +КонецФункции + +// Вычисляется уровень файла на сервере webdav, рекурсивным алгоритмом. +Функция РекурсивноУровеньНаСервере(СтрокаФайлов,ТаблицаФайлов) + + НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.РодительСервер)); + КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество() =0, 0, 1); + Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл + КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровеньНаСервере(НайденнаяСтрокаФайлов, ТаблицаФайлов); + КонецЦикла; + + Возврат КоличествоПрибавления; + +КонецФункции + +// Вычисляет уровни всех строк таблицы файлов. +Процедура ВычислитьУровеньРекурсивно(ТаблицаФайлов) + ТаблицаФайлов.Индексы.Добавить("ФайлСсылка"); + Для каждого СтрокаФайлов Из ТаблицаФайлов Цикл + // Равен уровню в базе или на сервере, в зависимости от того, где он меньше. + УровеньВБазе = РекурсивноУровень(СтрокаФайлов, ТаблицаФайлов); + УровеньНаСервере = РекурсивноУровеньНаСервере(СтрокаФайлов, ТаблицаФайлов); + Если УровеньНаСервере = 0 Тогда + СтрокаФайлов.Уровень = УровеньВБазе; + СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель; + Иначе + Если УровеньВБазе <= УровеньНаСервере Тогда + СтрокаФайлов.Уровень = УровеньВБазе; + СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель; + Иначе + СтрокаФайлов.Уровень = УровеньНаСервере; + СтрокаФайлов.РодительСортировка = СтрокаФайлов.РодительСервер; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// При изменении серверного пути к папке необходимо заменить пути к подчиненным файлам, что и делает эта процедура. +Процедура РекурсивноОбновитьСсылкиПодчиненных(СтрокаФайлов,знач ToHref,знач ToHref2,ТаблицаФайлов) + + // Меняем корневую ссылку, всегда должна быть закодирована. + СтрокаФайлов.ToHref = СтрЗаменить( + РаскодироватьСтроку(ЗакончитьБезСлеша(СтрокаФайлов.ToHref), СпособКодированияСтроки.URLВКодировкеURL), + РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref), СпособКодированияСтроки.URLВКодировкеURL), + РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref2), СпособКодированияСтроки.URLВКодировкеURL)); + + НайденныеПодчиненныеСтроки = ТаблицаФайлов.НайтиСтроки(Новый Структура("РодительСервер", СтрокаФайлов.Ссылка)); + Для каждого ПодчиненнаяСтрока Из НайденныеПодчиненныеСтроки Цикл + РекурсивноОбновитьСсылкиПодчиненных(ПодчиненнаяСтрока,ToHref,ToHref2,ТаблицаФайлов); + КонецЦикла; + +КонецПроцедуры + +// Рекурсивно загружает перечень файлов с сервера в таблицу файлов. +Процедура СкачатьДеревоФайловРекурсивно(ТекущиеСтрокиДереваФайлов, HttpАдрес, ПараметрыСинхронизации, Отказ=Ложь) + + СтруктураАдресаHTTP = СтруктураURIРаскодированная(HttpАдрес); + АдресОблачногоСервиса = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP, Ложь); + АдресСервера = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP); + + Попытка + // Получаем каталог + ЗаголовкиHTTP = Новый Соответствие; + ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; + ЗаголовкиHTTP["Content-type"] = "text/xml"; + ЗаголовкиHTTP["Accept"] = "text/xml"; + ЗаголовкиHTTP["Depth"] = "1"; + + ВыполнитьМетодWebdav("PROPFIND",АдресСервера,ЗаголовкиHTTP,ПараметрыСинхронизации, + " + | + | + | + |"); + + КонтекстДокументаXML = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); + + РезультатXPath = ВычислитьXPath("//*[local-name()='response']", КонтекстДокументаXML); + + НайденныйResponse = РезультатXPath.ПолучитьСледующий(); + + Пока НайденныйResponse <> Неопределено Цикл + + // Href есть всегда, иначе это критическая ошибка. + НайденныйHref = ВычислитьXPath("./*[local-name()='href']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); + Если НайденныйHref = Неопределено Тогда + ТекстОшибки = НСтр("ru = 'Ошибка ответа от сервера: не найден HREF в %1'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, АдресСервера); + КонецЕсли; + + ТекстHref = ЗакончитьБезСлеша(НачатьСлешем(НайденныйHref.ТекстовоеСодержимое)); + + Если ЭтоОдинаковыеПутиURI(АдресОблачногоСервиса + ТекстHref, АдресСервера) Тогда + НайденныйResponse = РезультатXPath.ПолучитьСледующий(); + Продолжить; + КонецЕсли; + + НоваяСтрокаДереваФайлов = ТекущиеСтрокиДереваФайлов.Добавить(); + // Всегда закодирована + НоваяСтрокаДереваФайлов.Href = АдресОблачногоСервиса + ТекстHref; + НоваяСтрокаДереваФайлов.ИмяФайла = ИмяФайлаПоHref(НоваяСтрокаДереваФайлов.Href); + НоваяСтрокаДереваФайлов.Etag = ""; + НоваяСтрокаДереваФайлов.UID1C = ""; + НоваяСтрокаДереваФайлов.ЭтоПапка = Неопределено; + + НайденныйPropstat = ВычислитьXPath("./*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); + + Если НайденныйPropstat <> Неопределено Тогда + Для каждого ДочернийУзелPropstat Из НайденныйPropstat.ДочерниеУзлы Цикл + Если ДочернийУзелPropstat.ЛокальноеИмя = "resourcetype" Тогда + НоваяСтрокаДереваФайлов.ЭтоПапка = ВычислитьXPath("./*[local-name()='collection']", КонтекстДокументаXML, ДочернийУзелPropstat).ПолучитьСледующий() <> Неопределено; + ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "UID1C" Тогда + НоваяСтрокаДереваФайлов.UID1C = ДочернийУзелPropstat.ТекстовоеСодержимое; + ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getetag" Тогда + НоваяСтрокаДереваФайлов.Etag = ДочернийУзелPropstat.ТекстовоеСодержимое; + ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getlastmodified" Тогда + НоваяСтрокаДереваФайлов.ДатаМодификации = ДатаRFC1123(ДочернийУзелPropstat.ТекстовоеСодержимое);//UTC + ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getcontentlength" Тогда + НоваяСтрокаДереваФайлов.Длина = Число(СтрЗаменить(ДочернийУзелPropstat.ТекстовоеСодержимое," ","")); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Если не было UID, пробуем получить его отдельно, это нужно, например, для owncloud. + Если НЕ ЗначениеЗаполнено(НоваяСтрокаДереваФайлов.UID1C) Тогда + НоваяСтрокаДереваФайлов.UID1C = ПолучитьUID1C(НоваяСтрокаДереваФайлов.Href, ПараметрыСинхронизации); + КонецЕсли; + + НайденныйResponse = РезультатXPath.ПолучитьСледующий(); + + КонецЦикла; + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + Отказ = Истина; + КонецПопытки; + + Для каждого СтрокаДереваФайлов Из ТекущиеСтрокиДереваФайлов Цикл + Если СтрокаДереваФайлов.ЭтоПапка = Истина Тогда + СкачатьДеревоФайловРекурсивно(СтрокаДереваФайлов.Строки, СтрокаДереваФайлов.Href, ПараметрыСинхронизации, Отказ); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Загружает с сервера webdav новые папки и файлы, которых еще нет в базе, и отражает их в таблице файлов. +Процедура ЗагрузитьНовыеПрисоединенныеФайлы(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) + + ПодсистемаРаботаСФайламиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами"); + + Для каждого СтрокаДереваФайлов Из СтрокиДереваФайлов Цикл + + Если СтрокаДереваФайлов.ЭтоПапка Тогда + // Папка определяется сначала по UID1C, если не найдена, то по старому Href, т.к. UID может теряться при + // редактировании, а новый Href еще не может быть найден в базе, + // если UID потерялся при редактировали и папку переместили в другую папку (Href поменялся), то она будет загружена в + // новую карточку папки поиск по Href оправдан, т.к. он уникален на файловом сервере для каждой папки. + ТекущаяПапкаФайлов = Неопределено; + // Теоретически еще можно искать файлы по Etag, но встанет вопрос дублей, поэтому дальше не ищем. + + Если Не ПустаяСтрока(СтрокаДереваФайлов.UID1C) Тогда + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл КАК Ссылка + |ИЗ + | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + |ГДЕ + | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С = &УникальныйИдентификатор1С"; + + Запрос.УстановитьПараметр("УникальныйИдентификатор1С", Новый УникальныйИдентификатор(СтрокаДереваФайлов.UID1C)); + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ТекущаяПапкаФайлов = ВыборкаДетальныеЗаписи; + КонецЦикла; + + КонецЕсли; + + Если (ТекущаяПапкаФайлов = Неопределено) И (ТаблицаФайлов.Найти(СтрокаДереваФайлов.Href, "Href") = Неопределено) Тогда + // Это новая папка на сервере - грузим ее, + // но сначала проверим возможность хранения UID1C, и если нельзя - то папка не грузится. + + Если ПодсистемаРаботаСФайламиСуществует Тогда + + ВозможностьСозданияПапки = ВозможностьСозданияПапки(ОбъектВладелец); + + Если Не ВозможностьСозданияПапки Тогда + Продолжить; + КонецЕсли; + + Если НЕ ПроверитьВозможностьUID1C(СтрокаДереваФайлов.Href,Строка(Новый УникальныйИдентификатор), ПараметрыСинхронизации) Тогда + ТекстСобытия = НСтр("ru = 'Невозможно сохранение дополнительных свойств файла, он не будет загружен: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаДереваФайлов.ИмяФайла), ПараметрыСинхронизации); + Продолжить; + КонецЕсли; + + Попытка + + ТекущаяПапкаФайлов = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(СтрокаДереваФайлов.ИмяФайла, ОбъектВладелец, ПараметрыСинхронизации.АвторФайлов); + + СтрокаДереваФайлов.UID1C = Строка(ТекущаяПапкаФайлов.УникальныйИдентификатор()); + ОбновитьUID1CФайла(СтрокаДереваФайлов.Href,СтрокаДереваФайлов.UID1C,ПараметрыСинхронизации); + + НоваяСтрокаТаблицыФайлов = ТаблицаФайлов.Добавить(); + НоваяСтрокаТаблицыФайлов.ФайлСсылка = ТекущаяПапкаФайлов; + НоваяСтрокаТаблицыФайлов.ПометкаУдаления = Ложь; + НоваяСтрокаТаблицыФайлов.Родитель = ОбъектВладелец; + НоваяСтрокаТаблицыФайлов.ЭтоПапка = Истина; + НоваяСтрокаТаблицыФайлов.UID1C = СтрокаДереваФайлов.UID1C; + НоваяСтрокаТаблицыФайлов.ЕстьВБазе = Истина; + НоваяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + НоваяСтрокаТаблицыФайлов.ИзмененНаСервере = Ложь; + НоваяСтрокаТаблицыФайлов.Изменения = ТекущаяПапкаФайлов; + НоваяСтрокаТаблицыФайлов.Href = ""; + НоваяСтрокаТаблицыФайлов.Etag = ""; + НоваяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + НоваяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + НоваяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + НоваяСтрокаТаблицыФайлов.Наименование = СтрокаДереваФайлов.ИмяФайла; + НоваяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; + НоваяСтрокаТаблицыФайлов.Обработан = Истина; + НоваяСтрокаТаблицыФайлов.ЭтоФайл = Истина; + + ЗапомнитьСерверныеДанныеСсылки( + НоваяСтрокаТаблицыФайлов.ФайлСсылка, + НоваяСтрокаТаблицыФайлов.ToHref, + НоваяСтрокаТаблицыФайлов.ToEtag, + НоваяСтрокаТаблицыФайлов.ЭтоФайл, + НоваяСтрокаТаблицыФайлов.Родитель, + НоваяСтрокаТаблицыФайлов.ЭтоПапка, + ПараметрыСинхронизации.УчетнаяЗапись); + + ТекстСобытия = НСтр("ru = 'Загружена папка с сервера: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, НоваяСтрокаТаблицыФайлов.НаименованиеСервер), ПараметрыСинхронизации); + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + КонецПопытки; + КонецЕсли; + + Иначе + // Обновим ToHref + СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка, "ФайлСсылка"); + СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; + СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); + КонецЕсли; + // Для подчиненных строк это теперь родитель. + ЗагрузитьНовыеПрисоединенныеФайлы(СтрокаДереваФайлов.Строки, ТаблицаФайлов, ПараметрыСинхронизации, ТекущаяПапкаФайлов.Ссылка); + + Иначе + // Это файл + // Файл определяется сначала по UID1C, если не найден, то по старому Href, т.к. UID может теряться при + // редактировании, а новый Href еще не может быть найден в базе, + // если UID потерялся при редактировали и файл переместили в другую папку (Href поменялся), то он будет загружен в + // новую карточку файла поиск по Href оправдан, т.к. он уникален на файловом сервере для каждого файла. + + ТекущийФайл = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href, ТаблицаФайлов, "Href"); + + Если (ТекущийФайл = Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка ,"ФайлСсылка") = Неопределено) Тогда + // Это новый файл на сервере - грузим его. + Если НЕ ПроверитьВозможностьUID1C(СтрокаДереваФайлов.Href, Строка(Новый УникальныйИдентификатор), ПараметрыСинхронизации) Тогда + ТекстСобытия = НСтр("ru = 'Невозможно сохранение дополнительных свойств файла, он не будет загружен: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаДереваФайлов.ИмяФайла), ПараметрыСинхронизации); + Продолжить; + КонецЕсли; + + Попытка + + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ИмяФайла", СтрокаДереваФайлов.ИмяФайла); + ПараметрыФайла.Вставить("Href", СтрокаДереваФайлов.Href); + ПараметрыФайла.Вставить("Etag", СтрокаДереваФайлов.Etag); + ПараметрыФайла.Вставить("ДатаМодификацииФайла", СтрокаДереваФайлов.ДатаМодификации); + ПараметрыФайла.Вставить("ДлинаФайла", СтрокаДереваФайлов.Длина); + ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); + ПараметрыФайла.Вставить("ОбъектВладелец", ОбъектВладелец); + ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", Неопределено); + ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); + ЗагрузитьФайлССервера(ПараметрыФайла); + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + КонецПопытки; + + Иначе + // Обновим ToHref + СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка"); + СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; + СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьДанныеИзОблачногоСервиса(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) + + ПодсистемаРаботаСФайламиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами"); + + Для каждого СтрокаДереваФайлов Из СтрокиДереваФайлов Цикл + + Если СтрокаДереваФайлов.ЭтоПапка = Истина Тогда //папки + // Папка определяется сначала по UID1C, если не найдена, то по старому Href, т.к. UID может теряться при + // редактировании, а новый Href еще не может быть найден в базе, + // если UID потерялся при редактировали и папку переместили в другую папку (Href поменялся), то она будет загружена в + // новую карточку папки поиск по Href оправдан, т.к. он уникален на файловом сервере для каждой папки. + ТекущаяПапкаФайлов = Неопределено; + // Теоретически еще можно искать файлы по Etag, но встанет вопрос дублей, поэтому дальше не ищем. + + Если Не ПустаяСтрока(СтрокаДереваФайлов.UID1C) Тогда + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл + |ИЗ + | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + |ГДЕ + | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С = &УникальныйИдентификатор1С"; + + Запрос.УстановитьПараметр("УникальныйИдентификатор1С", Новый УникальныйИдентификатор(СтрокаДереваФайлов.UID1C)); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ТекущаяПапкаФайлов = ВыборкаДетальныеЗаписи.Файл; + КонецЦикла; + + КонецЕсли; + + Если ТекущаяПапкаФайлов = Неопределено Тогда + ТекущаяПапкаФайлов = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href, ТаблицаФайлов,"Href");// может быть помечена на удаление, тогда у нее нет Href, и тут она не будет найдена. + КонецЕсли; + + Если (ТекущаяПапкаФайлов <> Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка,"ФайлСсылка") <> Неопределено) Тогда + СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка, "ФайлСсылка"); + СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; + СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); + КонецЕсли; + // Для подчиненных строк это теперь родитель. + ЗаполнитьДанныеИзОблачногоСервиса(СтрокаДереваФайлов.Строки, ТаблицаФайлов, ПараметрыСинхронизации, ТекущаяПапкаФайлов.Ссылка); + + Иначе + // Это файл + // Файл определяется сначала по UID1C, если не найден, то по старому Href, т.к. UID может теряться при + // редактировании, а новый Href еще не может быть найден в базе, + // если UID потерялся при редактировали и файл переместили в другую папку (Href поменялся), то он будет загружен в + // новую карточку файла поиск по Href оправдан, т.к. он уникален на файловом сервере для каждого файла. + + ТекущийФайл = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href,ТаблицаФайлов,"Href"); + + Если (ТекущийФайл <> Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка") <> Неопределено) Тогда + // Обновим ToHref + СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка"); + СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; + СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Подготавливает структуру обмена, содержащую значения на время сеанса обмена. +Функция ОсновныеОбъектыСинхронизации(УчетнаяЗапись) + + СтруктураВозврата = Новый Структура("СтруктураАдресаСервера, Ответ, Логин, Пароль"); + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | УчетныеЗаписиСинхронизацииФайлов.Ссылка КАК УчетнаяЗапись, + | УчетныеЗаписиСинхронизацииФайлов.Сервис КАК АдресСервера, + | УчетныеЗаписиСинхронизацииФайлов.КорневаяПапка, + | УчетныеЗаписиСинхронизацииФайлов.АвторФайлов + |ИЗ + | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов + |ГДЕ + | УчетныеЗаписиСинхронизацииФайлов.Ссылка = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", УчетнаяЗапись); + + Результат = Запрос.Выполнить().Выгрузить(); + + Если Результат.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Для каждого КолонкаРезультата Из Результат.Колонки Цикл + СтруктураВозврата.Вставить(КолонкаРезультата.Имя,Результат[0][КолонкаРезультата.Имя]); + КонецЦикла; + + Если Не ПустаяСтрока(СтруктураВозврата.КорневаяПапка) Тогда + СтруктураВозврата.АдресСервера = СтруктураВозврата.АдресСервера + "/" + СтруктураВозврата.КорневаяПапка; + КонецЕсли; + + Если ПустаяСтрока(СтруктураВозврата.АвторФайлов) Тогда + СтруктураВозврата.АвторФайлов = УчетнаяЗапись; + КонецЕсли; + + СтруктураВозврата.СтруктураАдресаСервера = СтруктураURIРаскодированная(СтруктураВозврата.АдресСервера); + + УстановитьПривилегированныйРежим(Истина); + СтруктураВозврата.Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись, "Логин"); + СтруктураВозврата.Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись); + УстановитьПривилегированныйРежим(Ложь); + + Возврат СтруктураВозврата; + +КонецФункции + +Процедура СинхронизироватьФайлыСОблачнымСервисом(УчетнаяЗапись) + + ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); + + Если ПараметрыСинхронизации = Неопределено Тогда + Возврат; + КонецЕсли; + + АдресОблачногоСервиса = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера, Ложь); + АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); + + ТекстСобытия = НСтр("ru = 'Начало синхронизации файлов с облачным сервисом.'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + + Попытка + + ДеревоФайловСервера = Новый ДеревоЗначений; + ДеревоФайловСервера.Колонки.Добавить("Href"); + ДеревоФайловСервера.Колонки.Добавить("UID1C"); + ДеревоФайловСервера.Колонки.Добавить("Etag"); + ДеревоФайловСервера.Колонки.Добавить("ИмяФайла"); + ДеревоФайловСервера.Колонки.Добавить("ЭтоПапка"); + ДеревоФайловСервера.Колонки.Добавить("ДатаМодификации"); + ДеревоФайловСервера.Колонки.Добавить("Длина"); + + Отказ = Ложь; + СкачатьДеревоФайловРекурсивно(ДеревоФайловСервера.Строки, АдресСервера, ПараметрыСинхронизации, Отказ); + Если Отказ = Истина Тогда + ТекстОшибки = НСтр("ru = 'При загрузке структуры файлов с сервера произошла ошибка, синхронизация не выполнена.'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + // Сравниваем с деревом файлов в системе, синхронизация идет по уникальному идентификатору. + МассивИсключений = Новый Массив; + ТаблицаФайлов = ВыбратьДанныеПоПравилам(УчетнаяЗапись, МассивИсключений); + + Для каждого СтрокаТаблицы Из ТаблицаФайлов Цикл + СтрокаТаблицы.UID1C = Строка(СтрокаТаблицы.ФайлСсылка.УникальныйИдентификатор()); + КонецЦикла; + + // Перебираем дерево, загружаем и добавляем те, которых нет в базе, в таблицу, а по старым заполняем реквизиты с сервера. + ЗагрузитьНовыеПрисоединенныеФайлы(ДеревоФайловСервера.Строки, ТаблицаФайлов, ПараметрыСинхронизации); + + ВычислитьУровеньРекурсивно(ТаблицаФайлов); + ТаблицаФайлов.Индексы.Добавить("ФайлСсылка"); + ОбъектСравнения = Новый СравнениеЗначений; + ТаблицаФайлов.Сортировать("ЭтоПапка УБЫВ, Уровень, РодительСортировка", ОбъектСравнения); + // Перебираем таблицу и решаем что делать с файлами и папками. + Для Каждого СтрокаТаблицы Из ТаблицаФайлов Цикл + + Если СтрокаТаблицы.Обработан Тогда + Продолжить; + КонецЕсли; + + ОбновитьСтатусСинхронизацииФайла = Ложь; + + СозданНовыйВБазе = (НЕ ЗначениеЗаполнено(СтрокаТаблицы.Href)) И (НЕ ЗначениеЗаполнено(СтрокаТаблицы.ToHref)); + + ИзмененВБазе = ЗначениеЗаполнено(СтрокаТаблицы.Изменения);// что-то поменялось + ИзмененоСодержимоеНаСервере = ЗначениеЗаполнено(СтрокаТаблицы.Etag) И ЗначениеЗаполнено(СтрокаТаблицы.ToEtag) И (СтрокаТаблицы.Etag <> СтрокаТаблицы.ToEtag);// поменялось содержимое + ИзмененНаСервере = ИзмененоСодержимоеНаСервере ИЛИ СтрокаТаблицы.ИзмененНаСервере;// поменялось имя/подчиненность или содержание + + УдаленВБазе = СтрокаТаблицы.ПометкаУдаления; + УдаленНаСервере = ЗначениеЗаполнено(СтрокаТаблицы.Href) И НЕ ЗначениеЗаполнено(СтрокаТаблицы.ToHref); + + НачатьТранзакцию(); + + Попытка + + Если СозданНовыйВБазе И НЕ УдаленВБазе Тогда + + // отправим новый на сервер + СтрокаТаблицы.Наименование = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(СтрокаТаблицы.Наименование, "-"); + СтрокаТаблицы.ToHref = ЗакончитьБезСлеша(АдресСервера) + НачатьСлешем(ЗакончитьБезСлеша(РассчитатьHref(СтрокаТаблицы,ТаблицаФайлов))); + Если ОбщегоНазначения.ОбъектЯвляетсяГруппой(СтрокаТаблицы.ФайлСсылка) Тогда + ВызватьМетодMKCOL(СтрокаТаблицы.ToHref, ПараметрыСинхронизации); + ИначеЕсли СтрокаТаблицы.ЭтоПапка Тогда + ВызватьМетодMKCOL(СтрокаТаблицы.ToHref, ПараметрыСинхронизации); + Иначе + СтрокаТаблицы.ToEtag = ВызватьМетодPUT(СтрокаТаблицы.ToHref, СтрокаТаблицы.ФайлСсылка, ПараметрыСинхронизации, СтрокаТаблицы.ЭтоФайл); + КонецЕсли; + ОбновитьUID1CФайла(СтрокаТаблицы.ToHref, СтрокаТаблицы.UID1C, ПараметрыСинхронизации); + СтрокаТаблицы.РодительСервер = СтрокаТаблицы.Родитель; + СтрокаТаблицы.НаименованиеСервер = СтрокаТаблицы.Наименование; + СтрокаТаблицы.ЕстьНаСервере = Истина; + СтрокаТаблицы.Обработан = Истина; + + ОбъектЯвляетсяГруппой = ОбщегоНазначения.ОбъектЯвляетсяГруппой(СтрокаТаблицы.ФайлСсылка); + Если Не СтрокаТаблицы.ЭтоФайл + И Не СтрокаТаблицы.ЭтоПапка + И Не ОбъектЯвляетсяГруппой Тогда + Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТаблицы.ФайлСсылка, "Редактирует") <> ПараметрыСинхронизации.АвторФайлов Тогда + ЗанятьФайлДляРедактированияСервер(СтрокаТаблицы.ФайлСсылка, ПараметрыСинхронизации.АвторФайлов); + КонецЕсли; + ИначеЕсли Не СтрокаТаблицы.ЭтоПапка И Не ОбъектЯвляетсяГруппой Тогда + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(СтрокаТаблицы.ФайлСсылка); + РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , , ПараметрыСинхронизации.АвторФайлов); + КонецЕсли; + + ТекстСобытия = НСтр("ru = 'Создан объект в облачном сервисе %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); + + ОбновитьСтатусСинхронизацииФайла = Истина; + + ИначеЕсли УдаленНаСервере И НЕ УдаленВБазе Тогда + + Если Не ЗначениеЗаполнено(СтрокаТаблицы.ФайлСсылка) Тогда + Продолжить; + КонецЕсли; + + // Если это элемент справочника ИдентификаторыОбъектовМетаданных, то не удаляем. + Если ТипЗнч(СтрокаТаблицы.ФайлСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + СтрокаТаблицы.Обработан = Истина; + Продолжить; + КонецЕсли; + // удаляем в базе + СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина,Ложь); + СтрокаТаблицы.ПометкаУдаления = Истина; + СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; + СтрокаТаблицы.Обработан = Истина; + + ТекстСобытия = НСтр("ru = 'Удалено в базе: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); + + ОбновитьСтатусСинхронизацииФайла = Истина; + + ИначеЕсли (ИзмененВБазе ИЛИ ИзмененНаСервере) И НЕ (УдаленВБазе ИЛИ УдаленНаСервере) Тогда + + Если ИзмененНаСервере И НЕ ИзмененВБазе Тогда + // загрузим с сервера + Если СтрокаТаблицы.ЭтоПапка Тогда + // Возможно можно отследить переименование. + ОбъектСтрокиТаблицы = СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект(); + ОбъектСтрокиТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; + ОбъектСтрокиТаблицы.Родитель = Неопределено; + ОбъектСтрокиТаблицы.ПометкаУдаления = Ложь; + ОбъектСтрокиТаблицы.Записать(); + + СтрокаТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; + СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; + СтрокаТаблицы.Родитель = СтрокаТаблицы.РодительСервер; + СтрокаТаблицы.ПометкаУдаления = Ложь; + + ОбновитьСтатусСинхронизацииФайла = Истина; + Иначе + + СтруктураИмениФайла = Новый Файл(СтрокаТаблицы.НаименованиеСервер); + НовоеРасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение); + // Загружаем только если поменялось содержимое, т.е. Etag, иначе обновляем реквизиты. + Если ИзмененоСодержимоеНаСервере ИЛИ (НовоеРасширениеФайла <> СтрокаТаблицы.ФайлСсылка.Расширение) Тогда + + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ИмяФайла", СтрокаТаблицы.НаименованиеСервер); + ПараметрыФайла.Вставить("Href", СтрокаТаблицы.ToHref); + ПараметрыФайла.Вставить("Etag", СтрокаТаблицы.ToEtag); + ПараметрыФайла.Вставить("ДатаМодификацииФайла", Неопределено); + ПараметрыФайла.Вставить("ДлинаФайла", Неопределено); + ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); + ПараметрыФайла.Вставить("ОбъектВладелец", СтрокаТаблицы.Родитель); + ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", СтрокаТаблицы.ФайлСсылка); + ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); + + ЗагрузитьФайлССервера(ПараметрыФайла, СтрокаТаблицы.ЭтоФайл); + + КонецЕсли; + + ОбъектСтрокиТаблицы = СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект(); + ОбъектСтрокиТаблицы.Наименование = СтруктураИмениФайла.ИмяБезРасширения; + ОбъектСтрокиТаблицы.ПометкаУдаления = Ложь; + ОбъектСтрокиТаблицы.Записать(); + + СтрокаТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; + СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; + СтрокаТаблицы.Родитель = СтрокаТаблицы.РодительСервер; + СтрокаТаблицы.ПометкаУдаления = Ложь; + + КонецЕсли; + + СтрокаТаблицы.Обработан = Истина; + ТекстСобытия = НСтр("ru = 'Обновлен объект в базе: %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); + + ОбновитьСтатусСинхронизацииФайла = Истина; + + КонецЕсли; + + КонецЕсли; + + Если ОбновитьСтатусСинхронизацииФайла Тогда + // Записываем обновления в регистр сведений статусов. + Если СтрокаТаблицы.ПометкаУдаления Тогда + // Удаляем последний Href, чтобы повторно не идентифицировать. + УдалитьСерверныеДанныеСсылки(СтрокаТаблицы.ФайлСсылка, УчетнаяЗапись); + Иначе + ЗапомнитьСерверныеДанныеСсылки( + СтрокаТаблицы.ФайлСсылка, + СтрокаТаблицы.ToHref, + СтрокаТаблицы.ToEtag, + СтрокаТаблицы.ЭтоФайл, + СтрокаТаблицы.Родитель, + СтрокаТаблицы.ЭтоПапка, + УчетнаяЗапись); + КонецЕсли; + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + ОтменитьТранзакцию(); + КонецПопытки; + + КонецЦикла; + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + КонецПопытки; + + ТекстСобытия = НСтр("ru = 'Завершена синхронизация файлов с облачным сервисом'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + +КонецПроцедуры + +Функция ВыбратьДанныеПоПравилам(УчетнаяЗапись, МассивИсключений) + + ЗапросНастройкиСинхронизации = Новый Запрос; + ЗапросНастройкиСинхронизации.Текст = "ВЫБРАТЬ + | НастройкиСинхронизацииФайлов.ВладелецФайла, + | НастройкиСинхронизацииФайлов.ТипВладельцаФайла, + | ИдентификаторыОбъектовМетаданных.Ссылка КАК ИдентификаторВладельца, + | ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.Ссылка) <> ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ЭтоНастройкаДляЭлементаСправочника, + | НастройкиСинхронизацииФайлов.ПравилоОтбора, + | НастройкиСинхронизацииФайлов.ЭтоФайл, + | НастройкиСинхронизацииФайлов.УчетнаяЗапись + |ИЗ + | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных + | ПО (ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки)) + |ГДЕ + | НастройкиСинхронизацииФайлов.Синхронизировать + | И НастройкиСинхронизацииФайлов.УчетнаяЗапись = &УчетнаяЗапись"; + ЗапросНастройкиСинхронизации.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + НастройкиСинхронизации = ЗапросНастройкиСинхронизации.Выполнить().Выгрузить(); + + ТаблицаФайлов = Неопределено; + + Для Каждого Настройка Из НастройкиСинхронизации Цикл + СправочникФайлов = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Настройка.ТипВладельцаФайла); + ВозможностьСоздаватьГруппы = СправочникФайлов.Иерархический; + + ДеревоФайлов = ВыбратьДанныеПоПравилуСинхронизации(Настройка, МассивИсключений); + Если ТаблицаФайлов = Неопределено Тогда + ТаблицаФайлов = Новый ТаблицаЗначений; + Для Каждого Колонка Из ДеревоФайлов.Колонки Цикл + ТаблицаФайлов.Колонки.Добавить(Колонка.Имя); + КонецЦикла; + КонецЕсли; + + Если Настройка.ЭтоНастройкаДляЭлементаСправочника Тогда + КорневаяПапка = Настройка.ИдентификаторВладельца; + Иначе + КорневаяПапка = Настройка.ВладелецФайла; + КонецЕсли; + + Для Каждого СтрокаФайлов Из ДеревоФайлов.Строки Цикл + НоваяСтрока = ТаблицаФайлов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаФайлов); + Если НоваяСтрока.ФайлСсылка = Неопределено Тогда + НоваяСтрока.ФайлСсылка = КорневаяПапка; + КонецЕсли; + Если НоваяСтрока.Родитель = Неопределено Тогда + НоваяСтрока.Родитель = КорневаяПапка; + КонецЕсли; + Если ВозможностьСоздаватьГруппы Тогда + Если ЗначениеЗаполнено(СтрокаФайлов.ФайлСсылка.Родитель) Тогда + НоваяСтрока.Родитель = СтрокаФайлов.ФайлСсылка.Родитель; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) + | ТОГДА НастройкиСинхронизацииФайлов.ВладелецФайла + | ИНАЧЕ ИдентификаторыОбъектовМетаданных.Ссылка + | КОНЕЦ КАК ФайлСсылка, + | НастройкиСинхронизацииФайлов.ЭтоФайл КАК ЭтоФайл, + | НастройкиСинхронизацииФайлов.УчетнаяЗапись КАК УчетнаяЗапись, + | НастройкиСинхронизацииФайлов.ВладелецФайла КАК ВладелецФайла, + | НастройкиСинхронизацииФайлов.ТипВладельцаФайла КАК ТипВладельцаФайла + |ПОМЕСТИТЬ ВТВиртуальныеКорневыеПапки + |ИЗ + | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных + | ПО (ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки)) + |ГДЕ + | НастройкиСинхронизацииФайлов.Синхронизировать + | И НастройкиСинхронизацииФайлов.УчетнаяЗапись = &УчетнаяЗапись + | + |ИНДЕКСИРОВАТЬ ПО + | УчетнаяЗапись + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТВиртуальныеКорневыеПапки.ФайлСсылка КАК ФайлСсылка, + | ВТВиртуальныеКорневыеПапки.ЭтоФайл КАК ЭтоФайл, + | ЛОЖЬ КАК ПометкаУдаления, + | ИСТИНА КАК ЭтоПапка, + | ИСТИНА КАК ЕстьВБазе, + | ЛОЖЬ КАК ЕстьНаСервере, + | ЛОЖЬ КАК Обработан, + | ЛОЖЬ КАК ИзмененНаСервере, + | СтатусыСинхронизацииФайловСОблачнымСервисом.Href КАК Href, + | СтатусыСинхронизацииФайловСОблачнымСервисом.Etag КАК Etag, + | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С КАК УникальныйИдентификатор1С, + | ВТВиртуальныеКорневыеПапки.ВладелецФайла, + | ВТВиртуальныеКорневыеПапки.ТипВладельцаФайла + |ИЗ + | ВТВиртуальныеКорневыеПапки КАК ВТВиртуальныеКорневыеПапки + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + | ПО ВТВиртуальныеКорневыеПапки.УчетнаяЗапись = СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись + | И ВТВиртуальныеКорневыеПапки.ФайлСсылка = СтатусыСинхронизацииФайловСОблачнымСервисом.Файл + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ ВТВиртуальныеКорневыеПапки"; + + Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + МассивВиртуальныхПапок = Новый Массив; + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + Если МассивВиртуальныхПапок.Найти(ВыборкаДетальныеЗаписи.ФайлСсылка) <> Неопределено Тогда + Продолжить; + КонецЕсли; + МассивВиртуальныхПапок.Добавить(ВыборкаДетальныеЗаписи.ФайлСсылка); + СтрокаВиртуальнойКорневойПапки = ТаблицаФайлов.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаВиртуальнойКорневойПапки, ВыборкаДетальныеЗаписи); + СтрокаВиртуальнойКорневойПапки.Наименование = СтрЗаменить(ВыборкаДетальныеЗаписи.ФайлСсылка.Синоним, ":", ""); + КонецЦикла; + + Возврат ТаблицаФайлов; + +КонецФункции + +Функция ВыбратьДанныеПоПравилуСинхронизации(НастройкаСинхронизации, МассивИсключений) + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + + НастройкиКомпоновщика = НастройкаСинхронизации.ПравилоОтбора.Получить(); + Если НастройкиКомпоновщика <> Неопределено Тогда + КомпоновщикНастроек.ЗагрузитьНастройки(НастройкаСинхронизации.ПравилоОтбора.Получить()); + КонецЕсли; + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "Local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.Имя = "НаборДанных1"; + НаборДанных.ИсточникДанных = ИсточникДанных.Имя; + + СхемаКомпоновкиДанных.ПоляИтога.Очистить(); + + Если НастройкаСинхронизации.ЭтоНастройкаДляЭлементаСправочника Тогда + ВладелецФайла = НастройкаСинхронизации.ИдентификаторВладельца; + ЭлементИсключение = НастройкаСинхронизации.ВладелецФайла; + Иначе + ВладелецФайла = НастройкаСинхронизации.ВладелецФайла; + ЭлементИсключение = Неопределено; + КонецЕсли; + + СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляСинхронизацииФайлов( + ВладелецФайла, + НастройкаСинхронизации, + МассивИсключений, + ЭлементИсключение); + + Структура = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ФайлСсылка"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Наименование"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ПометкаУдаления"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Родитель"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЭтоПапка"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЕстьВБазе"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЕстьНаСервере"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Изменения"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Href"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Etag"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Обработан"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("UID1C"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ToHref"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ToEtag"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("РодительСервер"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("НаименованиеСервер"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ИзмененНаСервере"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Уровень"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("РодительСортировка"); + + ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЭтоФайл"); + + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); + + Настройки = КомпоновщикНастроек.ПолучитьНастройки(); + + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("УчетнаяЗапись"); + Параметр.Значение = НастройкаСинхронизации.УчетнаяЗапись; + Параметр.Использование = Истина; + + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипВладельца"); + Параметр.Значение = ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки); + Параметр.Использование = Истина; + + Если МассивИсключений.Количество() > 0 Тогда + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивИсключений"); + Параметр.Значение = МассивИсключений; + Параметр.Использование = Истина; + КонецЕсли; + + Если НастройкаСинхронизации.ЭтоНастройкаДляЭлементаСправочника Тогда + Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ЭлементИсключение"); + Параметр.Значение = ЭлементИсключение; + Параметр.Использование = Истина; + КонецЕсли; + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ДеревоЗначений = Новый ДеревоЗначений; + + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + ПроцессорВывода.УстановитьОбъект(ДеревоЗначений); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + + Возврат ДеревоЗначений; + +КонецФункции + +Процедура РегламентнаяСинхронизацияФайловWebdav(Параметры = Неопределено, АдресРезультата = Неопределено) Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияФайлов); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | УчетныеЗаписиСинхронизацииФайлов.Ссылка, + | УчетныеЗаписиСинхронизацииФайлов.Сервис + |ИЗ + | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов + | ПО НастройкиСинхронизацииФайлов.УчетнаяЗапись = УчетныеЗаписиСинхронизацииФайлов.Ссылка + |ГДЕ + | НЕ УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления + | И НастройкиСинхронизацииФайлов.Синхронизировать"; + + Результат = Запрос.Выполнить().Выгрузить(); + Для каждого Выборка Из Результат Цикл + Если ПустаяСтрока(Выборка.Сервис) Тогда + Продолжить; + КонецЕсли; + СинхронизироватьФайлыСОблачнымСервисом(Выборка.Ссылка); + КонецЦикла; + + ОсвободитьЗахваченныеФайлы(); + +КонецПроцедуры + +Процедура ВыполнитьПроверкуПодключения(УчетнаяЗапись, РезультатПроверки) Экспорт + + РезультатПроверки = Новый Структура("РезультатТекст,РезультатПротокол,Отказ","","",Ложь); + + ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); + + АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); + + ТекстСобытия = НСтр("ru = 'Начата проверка синхронизации файлов'") + " " + УчетнаяЗапись.Наименование; + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + + ПрочитатьПараметрыКаталога(РезультатПроверки,АдресСервера, ПараметрыСинхронизации); + + ТекстСобытия = НСтр("ru = 'Завершена проверка синхронизации файлов'") + " " + УчетнаяЗапись.Наименование; + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + +КонецПроцедуры + +Процедура ОсвободитьЗахваченныеФайлы() + + Запрос = Новый Запрос; + + Запрос.Текст = + "ВЫБРАТЬ + | УчетныеЗаписиСинхронизацииФайлов.Ссылка КАК УчетнаяЗапись + |ПОМЕСТИТЬ НеактивныеУчетныеЗаписи + |ИЗ + | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов + |ГДЕ + | УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | УчетныеЗаписиСинхронизацииФайлов.Ссылка + |ИЗ + | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов + |ГДЕ + | НЕ УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления + | И НЕ УчетныеЗаписиСинхронизацииФайлов.Ссылка В + | (ВЫБРАТЬ + | НастройкиСинхронизацииФайлов.УчетнаяЗапись + | ИЗ + | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов + | ГДЕ + | НастройкиСинхронизацииФайлов.Синхронизировать) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НеактивныеУчетныеЗаписи.УчетнаяЗапись + |ИЗ + | НеактивныеУчетныеЗаписи КАК НеактивныеУчетныеЗаписи + |ГДЕ + | НеактивныеУчетныеЗаписи.УчетнаяЗапись В + | (ВЫБРАТЬ + | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись + | ИЗ + | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом)"; + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаУчетнаяЗапись = РезультатЗапроса.Выбрать(); + + Пока ВыборкаУчетнаяЗапись.Следующий() Цикл + ОсвободитьЗахваченныеФайлыУчетнойЗаписи(ВыборкаУчетнаяЗапись.УчетнаяЗапись); + КонецЦикла; + +КонецПроцедуры + +// Освобождение файлов, захваченных учетными записями с пометкой на удаление или с отключенными настройками синхронизации. +// +Процедура ОсвободитьЗахваченныеФайлыУчетнойЗаписи(УчетнаяЗапись = Неопределено) + + ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); + + Если ПараметрыСинхронизации = Неопределено Тогда + Возврат; + КонецЕсли; + + АдресОблачногоСервиса = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера, Ложь); + АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); + + ТекстСобытия = НСтр("ru = 'Начало освобождения файлов, захваченных облачным сервисом.'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + + Попытка + + ДеревоФайловСервера = Новый ДеревоЗначений; + ДеревоФайловСервера.Колонки.Добавить("Href"); + ДеревоФайловСервера.Колонки.Добавить("UID1C"); + ДеревоФайловСервера.Колонки.Добавить("Etag"); + ДеревоФайловСервера.Колонки.Добавить("ИмяФайла"); + ДеревоФайловСервера.Колонки.Добавить("ЭтоПапка"); + ДеревоФайловСервера.Колонки.Добавить("ДатаМодификации"); + ДеревоФайловСервера.Колонки.Добавить("Длина"); + + Отказ = Ложь; + СкачатьДеревоФайловРекурсивно(ДеревоФайловСервера.Строки, АдресСервера, ПараметрыСинхронизации, Отказ); + Если Отказ = Истина Тогда + ТекстОшибки = НСтр("ru = 'При загрузке структуры файлов с сервера произошла ошибка, синхронизация не выполнена.'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + // Сравниваем с деревом файлов в системе, синхронизация идет по уникальному идентификатору. + ТаблицаФайлов = ЗахваченныеФайлы(УчетнаяЗапись); + + // Перебираем дерево, загружаем и добавляем те, которых нет в базе, в таблицу, а по старым заполняем реквизиты с сервера. + ЗаполнитьДанныеИзОблачногоСервиса(ДеревоФайловСервера.Строки, ТаблицаФайлов, ПараметрыСинхронизации); + + ВычислитьУровеньРекурсивно(ТаблицаФайлов); + ТаблицаФайлов.Сортировать("ЭтоПапка ВОЗР, Уровень УБЫВ, РодительСортировка УБЫВ"); + // Перебираем таблицу и решаем что делать с файлами и папками. + Для Каждого СтрокаТаблицы Из ТаблицаФайлов Цикл + + Если СтрокаТаблицы.Обработан Тогда + Продолжить; + КонецЕсли; + + НачатьТранзакцию(); + + Попытка + + // удаляем на сервере + ВызватьМетодDELETE(СтрокаТаблицы.Href, ПараметрыСинхронизации); + + ТекстСобытия = НСтр("ru = 'Удален объект в облачном сервисе %1'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.НаименованиеСервер), ПараметрыСинхронизации); + + СтрокаТаблицы.РодительСервер = Неопределено; + СтрокаТаблицы.НаименованиеСервер = ""; + СтрокаТаблицы.ЕстьНаСервере = Ложь; + СтрокаТаблицы.Обработан = Истина; + + Если Не СтрокаТаблицы.ЭтоПапка Тогда + + ОсвободитьФайл(СтрокаТаблицы.ФайлСсылка); + + КонецЕсли; + + // Удаляем последний Href, чтобы повторно не идентифицировать. + УдалитьСерверныеДанныеСсылки(СтрокаТаблицы.ФайлСсылка, УчетнаяЗапись); + + ЗафиксироватьТранзакцию(); + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + ОтменитьТранзакцию(); + КонецПопытки; + + КонецЦикла; + + Исключение + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); + КонецПопытки; + + ТекстСобытия = НСтр("ru = 'Завершено освобождения файлов, захваченных облачным сервисом'"); + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); + +КонецПроцедуры + +Функция ЗахваченныеФайлы(УчетнаяЗапись) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл КАК ФайлСсылка, + | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл.Наименование КАК Наименование, + | СтатусыСинхронизацииФайловСОблачнымСервисом.Href, + | СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, + | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С КАК UID1C, + | СтатусыСинхронизацииФайловСОблачнымСервисом.ЭтоФайл, + | СтатусыСинхронизацииФайловСОблачнымСервисом.ЭтоВладелецФайла КАК ЭтоПапка, + | СтатусыСинхронизацииФайловСОблачнымСервисом.ВладелецФайла КАК Родитель, + | ИСТИНА КАК ЕстьВБазе, + | ЛОЖЬ КАК ЕстьНаСервере, + | НЕОПРЕДЕЛЕНО КАК Изменения, + | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """") КАК Href, + | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, """") КАК Etag, + | ЛОЖЬ КАК Обработан, + | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК ToHref, + | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК ToEtag, + | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК РодительСервер, + | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК НаименованиеСервер, + | ЛОЖЬ КАК ИзмененНаСервере, + | НЕОПРЕДЕЛЕНО КАК Уровень, + | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК РодительСортировка + |ИЗ + | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом + |ГДЕ + | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись = &УчетнаяЗапись"; + + Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + + РезультатЗапроса = Запрос.Выполнить(); + + ЗахваченныеФайлы = РезультатЗапроса.Выгрузить(); + + Возврат ЗахваченныеФайлы; + +КонецФункции + +Процедура ПриЗаписиИзвлеченногоТекста(ФайлОбъект) + + Если ЭтоЭлементРаботаСФайлами(ФайлОбъект) Тогда + РаботаСФайламиСлужебныйВызовСервера.ПриЗаписиИзвлеченногоТекста(ФайлОбъект); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьПутьТомаLinux() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТомаХраненияФайлов.Ссылка + |ИЗ + | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов + |ГДЕ + | ТомаХраненияФайлов.ПолныйПутьLinux ПОДОБНО ""%/\"""; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Выборка.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + Том = Выборка.Ссылка.ПолучитьОбъект(); + Том.ПолныйПутьLinux = СтрЗаменить(Том.ПолныйПутьLinux , "/\", "/"); + Том.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать том хранения файлов: %1 по причине: + |%2'"), + Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl index 28d2113cb..40e02fe58 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl @@ -6,84 +6,40 @@ #Область СлужебныйПрограммныйИнтерфейс -// Создает новый файл по аналогии с указанным и возвращает ссылку на него. -// Параметры: -// ИсходныйФайл - СправочникСсылка.Файлы - существующий файл. -// ВладелецНовогоФайла - ЛюбаяСсылка - владелец файла. -// -// Возвращаемое значение: -// СправочникСсылка.Файлы - новый файл. -// -Функция СкопироватьФайл(ИсходныйФайл, ВладелецНовогоФайла) +Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт - Если ИсходныйФайл = Неопределено Или ИсходныйФайл.Пустая() Или ИсходныйФайл.ТекущаяВерсия.Пустая()Тогда - Возврат Неопределено; - КонецЕсли; + РаботаСФайлами.ОбновитьФайл(ПрисоединенныйФайл, ИнформацияОФайле); - СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); - СведенияОФайле.Комментарий = ИсходныйФайл.Описание; - СведенияОФайле.ИмяБезРасширения = ИсходныйФайл.ПолноеНаименование; - СведенияОФайле.ХранитьВерсии = ИсходныйФайл.ХранитьВерсии; +КонецПроцедуры - НовыйФайл = СоздатьФайл(ВладелецНовогоФайла, СведенияОФайле); - - ХранилищеФайла = Неопределено; - Если ИсходныйФайл.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - ХранилищеФайла = ПолучитьХранилищеФайлаИзИнформационнойБазы(ИсходныйФайл.ТекущаяВерсия); - КонецЕсли; - - СведенияОФайле.Размер = ИсходныйФайл.ТекущаяВерсия.Размер; - СведенияОФайле.РасширениеБезТочки = ИсходныйФайл.ТекущаяВерсия.Расширение; - СведенияОФайле.АдресВременногоХранилищаФайла = ХранилищеФайла; - СведенияОФайле.АдресВременногоХранилищаТекста = ИсходныйФайл.ТекущаяВерсия.ТекстХранилище; - СведенияОФайле.СсылкаНаВерсиюИсточник = ИсходныйФайл.ТекущаяВерсия; +// См. эту процедуру в модуле ПрисоединенныеФайлы. +Процедура ОпределитьФормуПрисоединенногоФайла(Источник, + ВидФормы, + Параметры, + ВыбраннаяФорма, + ДополнительнаяИнформация, + СтандартнаяОбработка) Экспорт - Версия = СоздатьВерсию(НовыйФайл, СведенияОФайле); - ОбновитьВерсиюВФайле(НовыйФайл, Версия, ИсходныйФайл.ТекущаяВерсия.ТекстХранилище); - - ВерсияОбъект = НовыйФайл.ТекущаяВерсия.ПолучитьОбъект(); - - ЧислоПодписей = 0; - Для Каждого Строка Из ИсходныйФайл.ТекущаяВерсия.ЭлектронныеПодписи Цикл - НоваяСтрока = ВерсияОбъект.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); - ЧислоПодписей = ЧислоПодписей + 1; - КонецЦикла; - - Если ЧислоПодписей <> 0 Тогда - ФайлОбъект = НовыйФайл.ПолучитьОбъект(); - ФайлОбъект.ПодписанЭП = Истина; - ФайлОбъект.Записать(); + РаботаСФайлами.ОпределитьФормуПрисоединенногоФайла(Источник, + ВидФормы, + Параметры, + ВыбраннаяФорма, + ДополнительнаяИнформация, + СтандартнаяОбработка); - ВерсияОбъект.ПодписанЭП = Истина; - ВерсияОбъект.Записать(); - КонецЕсли; +КонецПроцедуры + +// См. функцию ДобавитьПрисоединенныйФайл в модуле РаботаСФайлами. +Функция ДобавитьФайл(ПараметрыФайла, + Знач АдресФайлаВоВременномХранилище, + Знач АдресВременногоХранилищаТекста = "", + Знач Описание = "") Экспорт - Если ИсходныйФайл.Зашифрован Тогда - - ФайлОбъект = НовыйФайл.ПолучитьОбъект(); - ФайлОбъект.Зашифрован = Истина; - - Для Каждого Строка Из ИсходныйФайл.СертификатыШифрования Цикл - НоваяСтрока = ФайлОбъект.СертификатыШифрования.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); - КонецЦикла; - - // Чтобы прошла запись ранее подписанного объекта. - ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - ФайлОбъект.Записать(); - - ВерсияОбъект = НовыйФайл.ТекущаяВерсия.ПолучитьОбъект(); - ВерсияОбъект.Зашифрован = Истина; - // Чтобы прошла запись ранее подписанного объекта. - ВерсияОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - ВерсияОбъект.Записать(); - - КонецЕсли; - - РаботаСФайламиПереопределяемый.ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл); - - Возврат НовыйФайл; + Возврат РаботаСФайлами.ДобавитьФайл( + ПараметрыФайла, + АдресФайлаВоВременномХранилище, + АдресВременногоХранилищаТекста, + Описание); КонецФункции @@ -142,10 +98,48 @@ Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда - Возврат Число(Выборка.РазмерФайлов); + РазмерФайловВТоме = Число(Выборка.РазмерФайлов); КонецЕсли; - Возврат 0; + ТипыВладельцев = Метаданные.РегистрыСведений.НаличиеФайлов.Измерения.ОбъектСФайлами.Тип.Типы(); + ВсеИменаСправочников = Новый Соответствие; + + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("Том", СсылкаТома); + + Для Каждого Тип Из ТипыВладельцев Цикл + + Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Продолжить; + КонецЕсли; + + ИменаСправочников = РаботаСФайламиСлужебный.ИменаСправочниковХраненияФайлов(Тип); + + Для каждого КлючИЗначение Из ИменаСправочников Цикл + Если ВсеИменаСправочников[КлючИЗначение.Ключ] <> Неопределено Тогда + Продолжить; + КонецЕсли; + ИмяСправочникаПрисоединенныхФайлов = КлючИЗначение.Ключ; + ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); + + Запрос.Текст = + "ВЫБРАТЬ + | ЕСТЬNULL(СУММА(ПрисоединенныеФайлы.Размер), 0) КАК РазмерФайлов + |ИЗ + | &ИмяСправочника КАК ПрисоединенныеФайлы + |ГДЕ + | ПрисоединенныеФайлы.Том = &Том"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяСправочника", + "Справочник." + ИмяСправочникаПрисоединенныхФайлов); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + РазмерФайловВТоме = РазмерФайловВТоме + Выборка.РазмерФайлов; + КонецЕсли + КонецЦикла; + КонецЦикла; + + Возврат РазмерФайловВТоме; КонецФункции @@ -160,8 +154,8 @@ УстановитьПривилегированныйРежим(Истина); - МенеджерЗаписи = РегистрыСведений.КодировкиВерсийФайлов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ВерсияФайла = ВерсияСсылка; + МенеджерЗаписи = РегистрыСведений.КодировкиФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ВерсияСсылка; МенеджерЗаписи.Прочитать(); Возврат МенеджерЗаписи.Кодировка; @@ -180,11 +174,18 @@ // Функция ДанныеФайлаИДвоичныеДанные(ФайлИлиВерсияСсылка, АдресПодписи = Неопределено, ИдентификаторФормы = Неопределено) Экспорт - ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка); - Если ТипЗнч(ФайлИлиВерсияСсылка) = Тип("СправочникСсылка.Файлы") Тогда + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(ФайлИлиВерсияСсылка)); + ЭтоСправочникФайлов = ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", МетаданныеОбъекта); + ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъекта); + Если ВозможностьХранитьВерсии И ЗначениеЗаполнено(ФайлИлиВерсияСсылка.ТекущаяВерсия) Тогда ВерсияСсылка = ФайлИлиВерсияСсылка.ТекущаяВерсия; + ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка, ВерсияСсылка); + ИначеЕсли ЭтоСправочникФайлов Тогда + ВерсияСсылка = ФайлИлиВерсияСсылка; + ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка); Иначе ВерсияСсылка = ФайлИлиВерсияСсылка; + ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка.Владелец, ВерсияСсылка); КонецЕсли; ДвоичныеДанные = Неопределено; @@ -192,7 +193,7 @@ ТипХраненияФайла = ВерсияСсылка.ТипХраненияФайла; Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда Если НЕ ВерсияСсылка.Том.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; Попытка ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); Исключение @@ -208,7 +209,7 @@ ВерсияСсылка.Владелец, СообщениеОбОшибке); - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( ВерсияСсылка.ПолноеНаименование + "." + ВерсияСсылка.Расширение); КонецПопытки; КонецЕсли; @@ -264,7 +265,7 @@ // ХранилищеЗначения, с двоичными данными файла. Функция ПолучитьХранилищеФайлаИзИнформационнойБазы(ВерсияСсылка) Экспорт - ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВерсияСсылка, "Ссылка"); + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВерсияСсылка, "Ссылка", Истина); Если ЕстьПраваНаОбъект = Неопределено Тогда Возврат Неопределено; @@ -272,11 +273,11 @@ УстановитьПривилегированныйРежим(Истина); - МенеджерЗаписи = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ВерсияФайла = ВерсияСсылка; + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ВерсияСсылка; МенеджерЗаписи.Прочитать(); - Возврат МенеджерЗаписи.ХранимыйФайл; + Возврат МенеджерЗаписи.ДвоичныеДанныеФайла; КонецФункции @@ -289,18 +290,28 @@ // Возвращаемое значение: // СправочникСсылка.ПапкиФайлов. // -Функция СправочникиПапкиСоздатьЭлемент(Имя, Родитель, Пользователь = Неопределено) Экспорт +Функция СправочникиПапкиСоздатьЭлемент(Имя, Родитель, Пользователь = Неопределено, ИмяСправочникаХранилищаФайлов = "", ПапкаРодитель = Неопределено) Экспорт - Папка = Справочники.ПапкиФайлов.СоздатьЭлемент(); - Папка.Наименование = Имя; - Папка.Родитель = Родитель; - Папка.ДатаСоздания = ТекущаяДатаСеанса(); - - Если Пользователь = Неопределено Тогда - Папка.Ответственный = Пользователи.ТекущийПользователь(); - Иначе - Папка.Ответственный = Пользователь; + Если ТипЗнч(Родитель) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + Папка = Справочники.ПапкиФайлов.СоздатьЭлемент(); + Если Пользователь = Неопределено Тогда + Папка.Ответственный = Пользователи.ТекущийПользователь(); + Иначе + Папка.Ответственный = Пользователь; + КонецЕсли; + Папка.Родитель = Родитель; + Иначе + Папка = Справочники[ИмяСправочникаХранилищаФайлов].СоздатьГруппу(); + Папка.ВладелецФайла = Родитель; + Если Пользователь = Неопределено Тогда + Папка.Автор = Пользователи.ТекущийПользователь(); + Иначе + Папка.Автор = Пользователь; + КонецЕсли; + Папка.Родитель = ПапкаРодитель; КонецЕсли; + Папка.Наименование = Имя; + Папка.ДатаСоздания = ТекущаяДатаСеанса(); Папка.Заполнить(Неопределено); Папка.Записать(); @@ -319,12 +330,13 @@ // Функция СоздатьВерсию(ФайлСсылка, СведенияОФайле) Экспорт - ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка"); + + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка", Истина); Если ЕстьПраваНаОбъект = Неопределено Тогда Возврат Неопределено; КонецЕсли; - + ХранилищеФайла = Неопределено; УстановитьПривилегированныйРежим(Истина); @@ -341,7 +353,7 @@ СведенияОФайле.ВремяИзменения = ТекущаяДатаСеанса(); КонецЕсли; - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(СведенияОФайле.РасширениеБезТочки); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(СведенияОФайле.РасширениеБезТочки); Версия = Справочники.ВерсииФайлов.СоздатьЭлемент(); @@ -373,7 +385,7 @@ Версия.Размер = СведенияОФайле.Размер; Версия.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СведенияОФайле.РасширениеБезТочки); - ТипХраненияФайлов = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); + ТипХраненияФайлов = РаботаСФайламиСлужебный.ТипХраненияФайлов(); Версия.ТипХраненияФайла = ТипХраненияФайлов; Если СведенияОФайле.СсылкаНаВерсиюИсточник <> Неопределено Тогда // создание Файла из шаблона @@ -389,11 +401,11 @@ // И шаблон, и новый Файл - на диске - просто копируем файл. Если Не СведенияОФайле.СсылкаНаВерсиюИсточник.Том.Пустая() Тогда - ПолныйПутьФайлаШаблона = ФайловыеФункцииСлужебный.ПолныйПутьТома(СведенияОФайле.СсылкаНаВерсиюИсточник.Том) + ПолныйПутьФайлаШаблона = РаботаСФайламиСлужебный.ПолныйПутьТома(СведенияОФайле.СсылкаНаВерсиюИсточник.Том) + СведенияОФайле.СсылкаНаВерсиюИсточник.ПутьКФайлу; - Сведения = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ПолныйПутьФайлаШаблона, СведенияОФайле.ВремяИзмененияУниверсальное, - СведенияОФайле.ИмяБезРасширения, СведенияОФайле.РасширениеБезТочки, Версия.НомерВерсии, СведенияОФайле.СсылкаНаВерсиюИсточник.Зашифрован); + Сведения = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ПолныйПутьФайлаШаблона, СведенияОФайле.ВремяИзмененияУниверсальное, + СведенияОФайле.ИмяБезРасширения, СведенияОФайле.РасширениеБезТочки, Версия.НомерВерсии, СведенияОФайле.Зашифрован); Версия.Том = Сведения.Том; Версия.ПутьКФайлу = Сведения.ПутьКФайлу; КонецЕсли; @@ -401,16 +413,16 @@ ИначеЕсли ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда // Шаблон в базе, новый Файл - на диске. // В этом случае в АдресВременногоХранилищаФайла находится ХранилищеЗначения с файлом. - Сведения = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(СведенияОФайле.АдресВременногоХранилищаФайла.Получить(), + Сведения = РаботаСФайламиСлужебный.ДобавитьФайлВТом(СведенияОФайле.АдресВременногоХранилищаФайла.Получить(), СведенияОФайле.ВремяИзмененияУниверсальное, СведенияОФайле.ИмяБезРасширения, СведенияОФайле.РасширениеБезТочки, - Версия.НомерВерсии, СведенияОФайле.СсылкаНаВерсиюИсточник.Зашифрован); + Версия.НомерВерсии, СведенияОФайле.Зашифрован); Версия.Том = Сведения.Том; Версия.ПутьКФайлу = Сведения.ПутьКФайлу; ИначеЕсли ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда // Шаблон на диске, новый Файл - в базе. Если Не СведенияОФайле.СсылкаНаВерсиюИсточник.Том.Пустая() Тогда - ПолныйПутьФайлаШаблона = ФайловыеФункцииСлужебный.ПолныйПутьТома(СведенияОФайле.СсылкаНаВерсиюИсточник.Том) + СведенияОФайле.СсылкаНаВерсиюИсточник.ПутьКФайлу; + ПолныйПутьФайлаШаблона = РаботаСФайламиСлужебный.ПолныйПутьТома(СведенияОФайле.СсылкаНаВерсиюИсточник.Том) + СведенияОФайле.СсылкаНаВерсиюИсточник.ПутьКФайлу; ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПутьФайлаШаблона); ХранилищеФайла = Новый ХранилищеЗначения(ДвоичныеДанные); КонецЕсли; @@ -427,7 +439,7 @@ ДвоичныеДанныеФайла = ХранилищеФайла.Получить(); Версия.Размер = ДвоичныеДанныеФайла.Размер(); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); КонецЕсли; Иначе // хранение на диске @@ -436,10 +448,10 @@ Если Версия.Размер = 0 Тогда Версия.Размер = ДвоичныеДанные.Размер(); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); КонецЕсли; - Сведения = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, + Сведения = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, СведенияОФайле.ВремяИзмененияУниверсальное, СведенияОФайле.ИмяБезРасширения, СведенияОФайле.РасширениеБезТочки, Версия.НомерВерсии); Версия.Том = Сведения.Том; @@ -456,7 +468,7 @@ Версия.ТекстХранилище = СведенияОФайле.АдресВременногоХранилищаТекста; Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; ИначеЕсли Не ПустаяСтрока(СведенияОФайле.АдресВременногоХранилищаТекста) Тогда - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); Версия.ТекстХранилище = Новый ХранилищеЗначения(Текст); Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; КонецЕсли; @@ -496,13 +508,17 @@ // Создадим карточку Файла в БД. ФайлСсылка = СоздатьФайл(ВладелецФайла, СведенияОФайле); - // Создадим версию сохраняемого файла для сохранения в карточке Файла. - Версия = СоздатьВерсию(ФайлСсылка, СведенияОФайле); - // Подставим ссылку на версию в карточку Файла. + Версия = Справочники.ВерсииФайлов.ПустаяСсылка(); + Если СведенияОФайле.ХранитьВерсии Тогда + // Создадим версию сохраняемого файла для сохранения в карточке Файла. + Версия = СоздатьВерсию(ФайлСсылка, СведенияОФайле); + // Подставим ссылку на версию в карточку Файла. + КонецЕсли; ОбновитьВерсиюВФайле(ФайлСсылка, Версия, СведенияОФайле.АдресВременногоХранилищаТекста); Если СведенияОФайле.Кодировка <> Неопределено Тогда - ЗаписатьКодировкуВерсииФайла(Версия, СведенияОФайле.Кодировка); + ЗаписатьКодировкуВерсииФайла( + ?(Версия = Справочники.ВерсииФайлов.ПустаяСсылка(),ФайлСсылка, Версия), СведенияОФайле.Кодировка); КонецЕсли; ЕстьПравоСохранения = ПравоДоступа("СохранениеДанныхПользователя", Метаданные); @@ -531,15 +547,29 @@ // Процедура ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); - - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); - ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); - ФайлОбъект.ДатаЗаема = Дата("00010101000000"); - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); - - РаботаСФайламиПереопределяемый.ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор); + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ДанныеФайла.Ссылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ДанныеФайла.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); + ФайлОбъект.ДатаЗаема = Дата("00010101000000"); + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + + РаботаСФайламиПереопределяемый.ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры @@ -562,26 +592,42 @@ Возврат Ложь; КонецЕсли; - ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); - - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); - Если Пользователь = Неопределено Тогда - ФайлОбъект.Редактирует = Пользователи.ТекущийПользователь(); - Иначе - ФайлОбъект.Редактирует = Пользователь; - КонецЕсли; - ФайлОбъект.ДатаЗаема = ТекущаяДатаСеанса(); - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); - - НавигационнаяСсылкаТекущейВерсии = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - РабочийКаталогВладельца = ДанныеФайла.РабочийКаталогВладельца; - - ДанныеФайла = ДанныеФайла(ДанныеФайла.Версия); - ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = НавигационнаяСсылкаТекущейВерсии; - ДанныеФайла.РабочийКаталогВладельца = РабочийКаталогВладельца; - - РаботаСФайламиПереопределяемый.ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор); + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ДанныеФайла.Ссылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ДанныеФайла.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + Если Пользователь = Неопределено Тогда + ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(); + Иначе + ФайлОбъект.Редактирует = Пользователь; + КонецЕсли; + ФайлОбъект.ДатаЗаема = ТекущаяДатаСеанса(); + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + + НавигационнаяСсылкаТекущейВерсии = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + РабочийКаталогВладельца = ДанныеФайла.РабочийКаталогВладельца; + + ДанныеФайла = ДанныеФайла(ДанныеФайла.Ссылка, ?(ДанныеФайла.Версия = ДанныеФайла.Ссылка, Неопределено, ДанныеФайла.Версия)); + ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = НавигационнаяСсылкаТекущейВерсии; + ДанныеФайла.РабочийКаталогВладельца = РабочийКаталогВладельца; + + РаботаСФайламиПереопределяемый.ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор); + + ЗафиксироватьТранзакцию(); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; Возврат Истина; @@ -595,180 +641,155 @@ // Возвращаемое значение: // Структура - структура с данными файла. // -Функция ДанныеФайла(ФайлИлиВерсияСсылка) Экспорт +Функция ДанныеФайла(ФайлСсылка, ВерсияСсылка = Неопределено, ИдентификаторФормы = Неопределено) Экспорт - Если ТипЗнч(ФайлИлиВерсияСсылка) = Тип("СправочникСсылка.Файлы") Тогда - ФайлСсылка = ФайлИлиВерсияСсылка; - ВерсияСсылка = Неопределено; + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка", Истина); + + Если ЕстьПраваНаОбъект = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + + ДанныеФайла = Новый Структура; + ДанныеФайла.Вставить("Ссылка", ФайлОбъект.Ссылка); + ДанныеФайла.Вставить("Редактирует", ФайлОбъект.Редактирует); + ДанныеФайла.Вставить("Владелец", ФайлОбъект.ВладелецФайла); + + МетаданныеОбъектаФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)); + + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла) И ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия) Тогда + ТекущаяВерсияФайла = ФайлОбъект.ТекущаяВерсия; + // Без возможности хранить версии. Иначе - ФайлСсылка = Неопределено; - ВерсияСсылка = ФайлИлиВерсияСсылка; + ТекущаяВерсияФайла = ФайлСсылка; КонецЕсли; - Запрос = Новый Запрос; - Если ФайлСсылка <> Неопределено Тогда - - Запрос.Текст = - "ВЫБРАТЬ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Код КАК Код, - | Файлы.Редактирует КАК Редактирует, - | Файлы.ТекущаяВерсия КАК ТекущаяВерсия, - | Файлы.ВладелецФайла КАК ВладелецФайла, - | Файлы.ХранитьВерсии КАК ХранитьВерсии, - | Файлы.ПометкаУдаления КАК ПометкаУдаления, - | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, - | ВерсииФайлов.Расширение КАК Расширение, - | ВерсииФайлов.Размер КАК Размер, - | ВерсииФайлов.НомерВерсии КАК НомерВерсии, - | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, - | ВерсииФайлов.Том КАК Том, - | ВерсииФайлов.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, - | ВерсииФайлов.Автор КАК Автор, - | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, - | Файлы.Зашифрован КАК Зашифрован, - | Файлы.ДатаЗаема КАК ДатаЗаема - |ИЗ - | Справочник.Файлы КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов - | ПО Файлы.ТекущаяВерсия = ВерсииФайлов.Ссылка"; - - Если ТипЗнч(ФайлСсылка) = Тип("Массив") Тогда - Запрос.Текст = Запрос.Текст + " ГДЕ Файлы.Ссылка В (&Файл) "; - Иначе - Запрос.Текст = Запрос.Текст + " ГДЕ Файлы.Ссылка = &Файл "; - КонецЕсли; - - Запрос.Параметры.Вставить("Файл", ФайлСсылка); - + Если ВерсияСсылка <> Неопределено Тогда + ДанныеФайла.Вставить("Версия", ВерсияСсылка); Иначе - - Запрос.Текст = - "ВЫБРАТЬ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Код КАК Код, - | Файлы.Редактирует КАК Редактирует, - | Файлы.ТекущаяВерсия КАК ТекущаяВерсия, - | Файлы.ВладелецФайла КАК ВладелецФайла, - | Файлы.ХранитьВерсии КАК ХранитьВерсии, - | Файлы.ПометкаУдаления КАК ПометкаУдаления, - | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, - | ВерсииФайлов.Расширение КАК Расширение, - | ВерсииФайлов.Размер КАК Размер, - | ВерсииФайлов.НомерВерсии КАК НомерВерсии, - | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, - | ВерсииФайлов.Том КАК Том, - | ВерсииФайлов.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, - | ВерсииФайлов.Автор КАК Автор, - | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, - | Файлы.Зашифрован КАК Зашифрован, - | Файлы.ДатаЗаема КАК ДатаЗаема - |ИЗ - | Справочник.Файлы КАК Файлы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов - | ПО (ИСТИНА) - |ГДЕ - | ВерсииФайлов.Ссылка = &Версия - | И Файлы.Ссылка = ВерсииФайлов.Владелец"; - - Запрос.Параметры.Вставить("Версия", ВерсияСсылка); - + ДанныеФайла.Вставить("Версия", ТекущаяВерсияФайла); КонецЕсли; - МассивДанныеФайла = Новый Массив; + ДанныеФайла.Вставить("ТекущаяВерсия", ТекущаяВерсияФайла); + ДанныеФайла.Вставить("ХранитьВерсии", ФайлОбъект.ХранитьВерсии); + ДанныеФайла.Вставить("ПометкаУдаления", ФайлОбъект.ПометкаУдаления); + ДанныеФайла.Вставить("Зашифрован", ФайлОбъект.Зашифрован); + ДанныеФайла.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП); + ДанныеФайла.Вставить("ДатаЗаема", ФайлОбъект.ДатаЗаема); - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - - ДанныеФайла = Новый Структура; - ДанныеФайла.Вставить("Ссылка", Выборка.Ссылка); - ДанныеФайла.Вставить("КодФайла", Выборка.Код); - ДанныеФайла.Вставить("Редактирует", Выборка.Редактирует); - ДанныеФайла.Вставить("Владелец", Выборка.ВладелецФайла); - ДанныеФайла.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(Выборка.Ссылка)); - - Если ВерсияСсылка <> Неопределено Тогда - ДанныеФайла.Вставить("Версия", ВерсияСсылка); - Иначе - ДанныеФайла.Вставить("Версия", Выборка.ТекущаяВерсия); - КонецЕсли; - - ДанныеФайла.Вставить("ТекущаяВерсия", Выборка.ТекущаяВерсия); - - СтруктураКлюча = Новый Структура("ВерсияФайла", ДанныеФайла.ТекущаяВерсия); - КлючЗаписи = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьКлючЗаписи(СтруктураКлюча); - НавигационнаяСсылкаТекущейВерсии = ПолучитьНавигационнуюСсылку(КлючЗаписи, "ХранимыйФайл"); - ДанныеФайла.Вставить("НавигационнаяСсылкаТекущейВерсии", НавигационнаяСсылкаТекущейВерсии); - - КодировкаТекущейВерсии = ПолучитьКодировкуВерсииФайла(ДанныеФайла.ТекущаяВерсия); - ДанныеФайла.Вставить("КодировкаТекущейВерсии", КодировкаТекущейВерсии); - - ДанныеФайла.Вставить("Размер", Выборка.Размер); - ДанныеФайла.Вставить("НомерВерсии", Выборка.НомерВерсии); - ДанныеФайла.Вставить("ДатаМодификацииУниверсальная", Выборка.ДатаМодификацииУниверсальная); - ДанныеФайла.Вставить("Расширение", Выборка.Расширение); - ДанныеФайла.Вставить("ПолноеНаименованиеВерсии", СокрЛП(Выборка.ПолноеНаименование)); - ДанныеФайла.Вставить("ХранитьВерсии", Выборка.ХранитьВерсии); - ДанныеФайла.Вставить("ПометкаУдаления", Выборка.ПометкаУдаления); - ДанныеФайла.Вставить("АвторТекущейВерсии", Выборка.Автор); - ДанныеФайла.Вставить("Зашифрован", Выборка.Зашифрован); - ДанныеФайла.Вставить("ДатаЗаема", Выборка.ДатаЗаема); - - Если ДанныеФайла.Зашифрован Тогда - МассивСертификатовШифрования = СертификатыШифрования(ДанныеФайла.Ссылка); - ДанныеФайла.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования); - КонецЕсли; - - НаЧтение = ДанныеФайла.Редактирует <> Пользователи.ТекущийПользователь(); - ДанныеФайла.Вставить("НаЧтение", НаЧтение); - - ВРабочемКаталогеНаЧтение = Истина; - ВРабочемКаталогеВладельца = Ложь; - ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); - Если ИмяКаталога = Неопределено Тогда - ИмяКаталога = ""; - КонецЕсли; - - Если ВерсияСсылка <> Неопределено Тогда - ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - Иначе - ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(Выборка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); - ДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", ВРабочемКаталогеНаЧтение); - ДанныеФайла.Вставить("РабочийКаталогВладельца", ""); - - РедактируетТекущийПользователь = (ДанныеФайла.Редактирует = Пользователи.ТекущийПользователь()); - ДанныеФайла.Вставить("РедактируетТекущийПользователь", РедактируетТекущийПользователь); - - СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; - Если Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен Тогда - СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; - ИначеЕсли Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен Тогда - СтатусИзвлеченияТекстаСтрока = "Извлечен"; - ИначеЕсли Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось Тогда - СтатусИзвлеченияТекстаСтрока = "ИзвлечьНеУдалось"; - КонецЕсли; - ДанныеФайла.Вставить("СтатусИзвлеченияТекста", СтатусИзвлеченияТекстаСтрока); - - МассивДанныеФайла.Добавить(ДанныеФайла); - - КонецЦикла; - - // Если был передан массив - возвращаем массив. - Если ТипЗнч(ФайлСсылка) = Тип("Массив") Тогда - Возврат МассивДанныеФайла; - КонецЕсли; - - Если МассивДанныеФайла.Количество() > 0 Тогда - Возврат МассивДанныеФайла[0]; + Если ВерсияСсылка = Неопределено Тогда + ДанныеФайла.Вставить("СсылкаНаДвоичныеДанныеФайла", + ПоместитьВоВременноеХранилище(РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка), ИдентификаторФормы)); + ДанныеФайла.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(ФайлСсылка)); + ДанныеФайла.Вставить("АвторТекущейВерсии", ФайлСсылка.Изменил); Иначе - Возврат Новый Структура; + ДанныеФайла.Вставить("СсылкаНаДвоичныеДанныеФайла", + ПоместитьВоВременноеХранилище(РаботаСФайлами.ДвоичныеДанныеФайла(ВерсияСсылка), ИдентификаторФормы)); + ДанныеФайла.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(ФайлОбъект.Ссылка)); + ДанныеФайла.Вставить("АвторТекущейВерсии", ВерсияСсылка.Автор); КонецЕсли; + Если ДанныеФайла.Зашифрован Тогда + МассивСертификатовШифрования = СертификатыШифрования(ДанныеФайла.Ссылка); + ДанныеФайла.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования); + КонецЕсли; + + ЗаполнитьДополнительныеДанныеФайла(ДанныеФайла, ФайлОбъект, ВерсияСсылка); + + Возврат ДанныеФайла; + КонецФункции +Процедура ЗаполнитьДополнительныеДанныеФайла(Результат, ПрисоединенныйФайл, ВерсияФайла = Неопределено) Экспорт + + СправочникПоддерживаетВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл))); + + Если СправочникПоддерживаетВозможностьХранитьВерсии И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда + ТекущаяВерсияФайла = ПрисоединенныйФайл.ТекущаяВерсия; + Иначе + ТекущаяВерсияФайла = ПрисоединенныйФайл.Ссылка; + КонецЕсли; + + Результат.Вставить("ТекущаяВерсия", ТекущаяВерсияФайла); + + Если ВерсияФайла <> Неопределено Тогда + Результат.Вставить("Версия", ВерсияФайла); + ИначеЕсли СправочникПоддерживаетВозможностьХранитьВерсии И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда + Результат.Вставить("Версия", ПрисоединенныйФайл.ТекущаяВерсия); + Иначе + Результат.Вставить("Версия", ПрисоединенныйФайл.Ссылка); + КонецЕсли; + + Если ЗначениеЗаполнено(ВерсияФайла) Тогда + ВерсияОбъект = ВерсияФайла.ПолучитьОбъект(); + Результат.Вставить("Наименование", ВерсияОбъект.Наименование); + Результат.Вставить("Расширение", ВерсияОбъект.Расширение); + Результат.Вставить("Размер", ВерсияОбъект.Размер); + Результат.Вставить("НомерВерсии", ВерсияОбъект.Размер); + Результат.Вставить("ДатаМодификацииУниверсальная", ВерсияОбъект.ДатаМодификацииУниверсальная); + Результат.Вставить("Том", ВерсияОбъект.Том); + Результат.Вставить("Автор", ВерсияОбъект.Автор); + Результат.Вставить("СтатусИзвлеченияТекста", ВерсияОбъект.СтатусИзвлеченияТекста); + Результат.Вставить("ПолноеНаименованиеВерсии", СокрЛП(ВерсияОбъект.ПолноеНаименование)); + ТекущаяВерсияФайла = ВерсияФайла; + Иначе + Результат.Вставить("Наименование", ПрисоединенныйФайл.Наименование); + Результат.Вставить("Расширение", ПрисоединенныйФайл.Расширение); + Результат.Вставить("Размер", ПрисоединенныйФайл.Размер); + Результат.Вставить("НомерВерсии", 0); + Результат.Вставить("ДатаМодификацииУниверсальная", ПрисоединенныйФайл.ДатаМодификацииУниверсальная); + Результат.Вставить("Том", ПрисоединенныйФайл.Том); + Результат.Вставить("Автор", ПрисоединенныйФайл.Автор); + Результат.Вставить("СтатусИзвлеченияТекста", ПрисоединенныйФайл.СтатусИзвлеченияТекста); + Результат.Вставить("ПолноеНаименованиеВерсии", СокрЛП(ПрисоединенныйФайл.Наименование)); + ТекущаяВерсияФайла = Результат.Версия; + КонецЕсли; + + СтруктураКлюча = Новый Структура("Файл", ТекущаяВерсияФайла); + КлючЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьКлючЗаписи(СтруктураКлюча); + НавигационнаяСсылкаТекущейВерсии = ПолучитьНавигационнуюСсылку(КлючЗаписи, "ДвоичныеДанныеФайла"); + Результат.Вставить("НавигационнаяСсылкаТекущейВерсии", НавигационнаяСсылкаТекущейВерсии); + + КодировкаТекущейВерсии = ПолучитьКодировкуВерсииФайла(ТекущаяВерсияФайла); + Результат.Вставить("КодировкаТекущейВерсии", КодировкаТекущейВерсии); + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); + НаЧтение = Результат.Редактирует <> ТекущийПользователь; + Результат.Вставить("НаЧтение", НаЧтение); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + Если ИмяКаталога = Неопределено Тогда + ИмяКаталога = ""; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекущаяВерсияФайла) Тогда + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ТекущаяВерсияФайла, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + + Результат.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); + КонецЕсли; + Результат.Вставить("ВРабочемКаталогеНаЧтение", ВРабочемКаталогеНаЧтение); + Результат.Вставить("РабочийКаталогВладельца", ""); + + РедактируетТекущийПользователь = (Результат.Редактирует = ТекущийПользователь); + Результат.Вставить("ФайлРедактируетТекущийПользователь", РедактируетТекущийПользователь); + + СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; + Если Результат.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен Тогда + СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; + ИначеЕсли Результат.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен Тогда + СтатусИзвлеченияТекстаСтрока = "Извлечен"; + ИначеЕсли Результат.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось Тогда + СтатусИзвлеченияТекстаСтрока = "ИзвлечьНеУдалось"; + КонецЕсли; + Результат.Вставить("СтатусИзвлеченияТекста", СтатусИзвлеченияТекстаСтрока); + + ПапкаДляСохранитьКак = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляСохранитьКак"); + Результат.Вставить("ПапкаДляСохранитьКак", ПапкаДляСохранитьКак); + +КонецПроцедуры + // Обновляет или создает версию Файла и возвращает ссылку на обновленную версию (или Ложь, если файл бинарно не // изменен). // @@ -787,11 +808,11 @@ СведенияОФайле, ВерсияСсылка = Неопределено, УникальныйИдентификаторФормы = Неопределено, - Пользователь = Неопределено) Экспорт + Пользователь = Неопределено) ЕстьПравоСохранения = ПравоДоступа("СохранениеДанныхПользователя", Метаданные); - ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка"); + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка", Истина); Если ЕстьПраваНаОбъект = Неопределено Тогда Возврат Неопределено; @@ -811,19 +832,23 @@ ВремяИзменения = ТекущаяДатаСеанса(); КонецЕсли; - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(СведенияОФайле.РасширениеБезТочки); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(СведенияОФайле.РасширениеБезТочки); ТекущаяВерсияРазмер = 0; ДвоичныеДанные = Неопределено; ТекущаяВерсияТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; ТекущаяВерсияТом = Неопределено; ТекущаяВерсияПутьКФайлу = Неопределено; + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)); + ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъекта); ВерсияСсылкаДляСравненияРазмера = ВерсияСсылка; Если ВерсияСсылка <> Неопределено Тогда ВерсияСсылкаДляСравненияРазмера = ВерсияСсылка; - Иначе + ИначеЕсли ВозможностьХранитьВерсии И ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия)Тогда ВерсияСсылкаДляСравненияРазмера = ФайлСсылка.ТекущаяВерсия; + Иначе + ВерсияСсылкаДляСравненияРазмера = ФайлСсылка; КонецЕсли; КодировкаПредВерсии = ПолучитьКодировкуВерсииФайла(ВерсияСсылкаДляСравненияРазмера); @@ -841,7 +866,7 @@ Если ТекущаяВерсияТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда Если НЕ ТекущаяВерсияТом.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ТекущаяВерсияТом) + ТекущаяВерсияПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ТекущаяВерсияТом) + ТекущаяВерсияПутьКФайлу; ДвоичныеДанныеПредыдущейВерсии = Новый ДвоичныеДанные(ПолныйПуть); КонецЕсли; Иначе @@ -861,7 +886,13 @@ Версия = Неопределено; Если СведенияОФайле.ХранитьВерсии Тогда - Версия = Справочники.ВерсииФайлов.СоздатьЭлемент(); + ЗаголовокОшибки = НСтр("ru = 'Ошибка при записи новой версии присоединенных файлов.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае запись версии файла невозможна.'"); + + ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов( + ТипЗнч(ФайлСсылка.ВладелецФайла), "", ЗаголовокОшибки, ОкончаниеОшибки); + + Версия = Справочники[ИмяСправочникаХранилищаВерсийФайлов].СоздатьЭлемент(); Версия.РодительскаяВерсия = ФайлСсылка.ТекущаяВерсия; Версия.НомерВерсии = НайтиМаксимальныйНомерВерсии(ФайлСсылка) + 1; Иначе @@ -878,7 +909,7 @@ // Удалим файл с диска - мы заместим его новым. Если Версия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда Если НЕ Версия.Том.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; ФайлНаДиске = Новый Файл(ПолныйПуть); Если ФайлНаДиске.Существует() Тогда ФайлНаДиске.УстановитьТолькоЧтение(Ложь); @@ -905,10 +936,11 @@ Версия.ДатаСоздания = ТекущаяДатаСеанса(); Версия.Размер = СведенияОФайле.Размер; Версия.ПолноеНаименование = СведенияОФайле.ИмяБезРасширения; + Версия.Наименование = СведенияОФайле.ИмяБезРасширения; Версия.Комментарий = СведенияОФайле.Комментарий; Версия.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СведенияОФайле.РасширениеБезТочки); - ТипХраненияФайлов = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); + ТипХраненияФайлов = РаботаСФайламиСлужебный.ТипХраненияФайлов(); Версия.ТипХраненияФайла = ТипХраненияФайлов; Если ДвоичныеДанные = Неопределено Тогда @@ -923,7 +955,7 @@ ДвоичныеДанныеФайла = ХранилищеФайла.Получить(); Версия.Размер = ДвоичныеДанныеФайла.Размер(); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); КонецЕсли; // очистим поля @@ -933,15 +965,15 @@ Если Версия.Размер = 0 Тогда Версия.Размер = ДвоичныеДанные.Размер(); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); КонецЕсли; ФайлЗашифрован = Ложь; Если СведенияОФайле.Зашифрован <> Неопределено Тогда ФайлЗашифрован = СведенияОФайле.Зашифрован; - КонецЕсли; + КонецЕсли; - Сведения = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, + Сведения = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ВремяИзмененияУниверсальное, СведенияОФайле.ИмяБезРасширения, Версия.Расширение, Версия.НомерВерсии, ФайлЗашифрован); Версия.Том = Сведения.Том; @@ -951,10 +983,10 @@ КонецЕсли; Если СведенияОФайле.АдресВременногоХранилищаТекста <> Неопределено Тогда - Если ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + Если РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; Иначе - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); Версия.ТекстХранилище = Новый ХранилищеЗначения(Текст); Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; КонецЕсли; @@ -973,10 +1005,6 @@ КонецЕсли; КонецЕсли; - Если СведенияОФайле.Зашифрован <> Неопределено Тогда - Версия.Зашифрован = СведенияОФайле.Зашифрован; - КонецЕсли; - Версия.Заполнить(Неопределено); Версия.Записать(); @@ -1010,32 +1038,559 @@ // УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ОбновитьВерсиюВФайле(ФайлСсылка, - Версия, - Знач АдресВременногоХранилищаТекста, - УникальныйИдентификатор = Неопределено) Экспорт + Версия, + Знач АдресВременногоХранилищаТекста, + УникальныйИдентификатор = Неопределено) Экспорт - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); - - ФайлОбъект.ТекущаяВерсия = Версия.Ссылка; - - Если ТипЗнч(АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда - // При создании Файла из шаблона хранилище значения копируется напрямую. - ФайлОбъект.ТекстХранилище = АдресВременногоХранилищаТекста; - Иначе - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); - КонецЕсли; - - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + + ФайлОбъект.ТекущаяВерсия = Версия.Ссылка; + + Если ТипЗнч(АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда + // При создании Файла из шаблона хранилище значения копируется напрямую. + ФайлОбъект.ТекстХранилище = АдресВременногоХранилищаТекста; + Иначе + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + КонецЕсли; + + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры +Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл, + Знач ИдентификаторФормы = Неопределено, + Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, + Знач ДляРедактирования = Ложь) Экспорт + + Возврат РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл, + ИдентификаторФормы, + ПолучатьСсылкуНаДвоичныеДанные, + ДляРедактирования); +КонецФункции + +Функция ДанныеФайлаДляПечати(Знач ПрисоединенныйФайл) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ПрисоединенныйФайл); + Расширение = НРег(ДанныеФайла.Расширение); + Если Расширение = "mxl" Тогда + ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла); + ТабличныйДокумент = Новый ТабличныйДокумент; + ТабличныйДокумент.Прочитать(ИмяВременногоФайла); + УстановленБезопасныйРежим = БезопасныйРежим() <> Ложь; + + Если ТипЗнч(УстановленБезопасныйРежим) = Тип("Строка") Тогда + УстановленБезопасныйРежим = Истина; + КонецЕсли; + + Если Не УстановленБезопасныйРежим Тогда + УдалитьФайлы(ИмяВременногоФайла); + КонецЕсли; + ДанныеФайла.Вставить("ТабличныйДокумент", ТабличныйДокумент); + КонецЕсли; + + Возврат ДанныеФайла; + +КонецФункции + +// Функция возвращает структуру, содержащую различные сведения о Файле и версии. +Функция ДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы = Неопределено, + РабочийКаталогВладельца = Неопределено, ПредыдущийАдресФайла = Неопределено) Экспорт + + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка", Истина); + + Если ЕстьПраваНаОбъект = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если ПредыдущийАдресФайла <> Неопределено Тогда + Если НЕ ПустаяСтрока(ПредыдущийАдресФайла) И ЭтоАдресВременногоХранилища(ПредыдущийАдресФайла) Тогда + УдалитьИзВременногоХранилища(ПредыдущийАдресФайла); + КонецЕсли; + КонецЕсли; + + ФайлСсылка = ФайлСсылка; + ВерсияСсылка = ВерсияСсылка; + Если Не ЗначениеЗаполнено(ВерсияСсылка) + И ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка))) + И ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия) Тогда + + ВерсияСсылка = ФайлСсылка.ТекущаяВерсия; + + КонецЕсли; + ДанныеФайла = ДанныеФайла(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы); + + Если РабочийКаталогВладельца = Неопределено Тогда + РабочийКаталогВладельца = РабочийКаталогПапки(ДанныеФайла.Владелец); + КонецЕсли; + ДанныеФайла.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); + + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ПолноеИмяФайлаВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; + ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); + КонецЕсли; + + ТипХраненияФайла = ДанныеФайла.Версия.ТипХраненияФайла; + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ДанныеФайла.Версия <> Неопределено Тогда + + УстановитьПривилегированныйРежим(Истина); + + ДанныеФайлаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ДанныеФайлаПутьКФайлу = ""; + ДанныеФайлаТом = ДанныеФайла.Версия.Том; + ДанныеФайлаПутьКФайлу = ДанныеФайла.Версия.ПутьКФайлу; + + Если НЕ ДанныеФайлаТом.Пустая() Тогда + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ДанныеФайлаТом) + ДанныеФайлаПутьКФайлу; + Попытка + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + // Работаем только с текущей версией - для не-текущей ссылку получаем в ПолучитьНавигационнуюСсылкуДляОткрытия. + ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + Исключение + // Запись в журнал регистрации. + СсылкаНаФайл = ?(ФайлСсылка <> Неопределено, ФайлСсылка, ВерсияСсылка); + СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора( + ИнформацияОбОшибке(), СсылкаНаФайл); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Открытие файла'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.Файлы, + ФайлСсылка, + СообщениеОбОшибке); + + ТипВладельцаФайла = ТипЗнч(ДанныеФайла.Владелец); + Если ТипВладельцаФайла = Тип("СправочникСсылка.ПапкиФайлов") Тогда + ПредставлениеВладельца = ПолныйПутьПапки(ДанныеФайла.Владелец); + Иначе + ПредставлениеВладельца = ДанныеФайла.Владелец; + КонецЕсли; + ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Присоединен к %1 : %2'"), + Строка(ТипВладельцаФайла), + ПредставлениеВладельца); + + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение, + , + ПредставлениеВладельцаФайла); + КонецПопытки; + КонецЕсли; + КонецЕсли; + + ПредыдущийАдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + Возврат ДанныеФайла; + +КонецФункции + +// Возвращает текст запроса для получения файлов у которых не извлечен текст. +// +// Параметры: +// ПолучитьВсеФайлы - Булево - начальное значение Ложь. Позволяет отключить выборку +// файлов по частям, если передать Истина. +// +// Возвращаемое значение: +// Строка - текст запроса. +// +Функция ТекстЗапросаДляИзвлеченияТекста(ПолучитьВсеФайлы = Ложь) Экспорт + + // Текст запроса формируется по всем справочникам присоединенных файлов. + ТекстЗапроса = ""; + + ТипыФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); + + ВсеИменаСправочников = Новый Массив; + + Для Каждого Тип Из ТипыФайлов Цикл + МетаданныеСправочникаФайлов = Метаданные.НайтиПоТипу(Тип); + ВсеИменаСправочников.Добавить(МетаданныеСправочникаФайлов.Имя); + КонецЦикла; + + ЧислоФайловВВыборке = Цел(100 / ВсеИменаСправочников.Количество()); + ЧислоФайловВВыборке = ?(ЧислоФайловВВыборке < 10, 10, ЧислоФайловВВыборке); + + Для каждого ИмяСправочника Из ВсеИменаСправочников Цикл + + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + ТекстЗапросаДляФайловСНеизвлеченнымТекстом( + ИмяСправочника, + ЧислоФайловВВыборке, + ПолучитьВсеФайлы); + КонецЦикла; + + Возврат ТекстЗапроса; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции +Функция ТекстЗапросаДляФайловСНеизвлеченнымТекстом(Знач ИмяСправочника, Знач ЧислоФайловВВыборке, Знач ПолучитьВсеФайлы = Ложь) + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Файлы.Ссылка КАК Ссылка, + | Файлы.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, + | Файлы.ТипХраненияФайла КАК ТипХраненияФайла, + | Файлы.Расширение КАК Расширение, + | Файлы.Наименование КАК Наименование + |ИЗ + | &ИмяСправочника КАК Файлы + |ГДЕ + | Файлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Если ИмяСправочника = "ВерсииФайлов" Тогда + ТекстЗапроса = ТекстЗапроса + " + | И НЕ Файлы.Владелец.Зашифрован"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | И НЕ Файлы.Зашифрован"; + КонецЕсли; + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 1", ?( + ПолучитьВсеФайлы, + "", + "ПЕРВЫЕ " + Формат(ЧислоФайловВВыборке, "ЧГ=; ЧН=")) ); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяСправочника); + + Возврат ТекстЗапроса; + +КонецФункции + +// Обновляет или создает версию Файла и возвращает ссылку на обновленную версию (или Ложь, если файл бинарно не +// изменен). +// +// Параметры: +// ФайлСсылка - СправочникСсылка.Файлы - файл, для которого создается новая версия. +// СведенияОФайле - Структура - см. РаботаСФайламиКлиентСервер.СведенияОФайле, в режиме +// "ФайлСВерсией". +// ВерсияСсылка - СправочникСсылка.ВерсииФайлов - версия файла, которую надо обновить. +// УникальныйИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, +// в контексте которой выполняется операция. +// +// Возвращаемое значение: +// СправочникСсылка.ВерсииФайлов - созданная или измененная версия; Неопределено, если файл бинарно не был изменен. +// +Функция ОбновитьОбъектФайла(ФайлСсылка, + СведенияОФайле, + ВерсияСсылка = Неопределено, + УникальныйИдентификаторФормы = Неопределено, + Пользователь = Неопределено) + + ЕстьПравоСохранения = ПравоДоступа("СохранениеДанныхПользователя", Метаданные); + + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Ссылка", Истина); + + Если ЕстьПраваНаОбъект = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ВремяИзмененияУниверсальное = СведенияОФайле.ВремяИзмененияУниверсальное; + Если НЕ ЗначениеЗаполнено(ВремяИзмененияУниверсальное) + ИЛИ ВремяИзмененияУниверсальное > ТекущаяУниверсальнаяДата() Тогда + ВремяИзмененияУниверсальное = ТекущаяУниверсальнаяДата(); + КонецЕсли; + + ВремяИзменения = СведенияОФайле.ВремяИзменения; + Если НЕ ЗначениеЗаполнено(ВремяИзменения) + ИЛИ УниверсальноеВремя(ВремяИзменения) > ВремяИзмененияУниверсальное Тогда + ВремяИзменения = ТекущаяДатаСеанса(); + КонецЕсли; + + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(СведенияОФайле.РасширениеБезТочки); + + ТекущаяВерсияРазмер = 0; + ДвоичныеДанные = Неопределено; + ТекущаяВерсияТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + ТекущаяВерсияТом = Неопределено; + ТекущаяВерсияПутьКФайлу = Неопределено; + + СправочникПоддерживаетВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка))); + + ВерсияСсылкаДляСравненияРазмера = ВерсияСсылка; + Если ВерсияСсылка <> Неопределено Тогда + ВерсияСсылкаДляСравненияРазмера = ВерсияСсылка; + ИначеЕсли СправочникПоддерживаетВозможностьХранитьВерсии И ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия) Тогда + ВерсияСсылкаДляСравненияРазмера = ФайлСсылка.ТекущаяВерсия; + Иначе + ВерсияСсылкаДляСравненияРазмера = ФайлСсылка; + КонецЕсли; + + КодировкаПредВерсии = ПолучитьКодировкуВерсииФайла(ВерсияСсылкаДляСравненияРазмера); + + СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВерсияСсылкаДляСравненияРазмера, + "Размер, ТипХраненияФайла, Том, ПутьКФайлу"); + ТекущаяВерсияРазмер = СтруктураРеквизитов.Размер; + ТекущаяВерсияТипХраненияФайла = СтруктураРеквизитов.ТипХраненияФайла; + ТекущаяВерсияТом = СтруктураРеквизитов.Том; + ТекущаяВерсияПутьКФайлу = СтруктураРеквизитов.ПутьКФайлу; + + ХранилищеФайла = Неопределено; + Если СведенияОФайле.Размер = ТекущаяВерсияРазмер Тогда + ДвоичныеДанныеПредыдущейВерсии = Неопределено; + + Если ТекущаяВерсияТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ ТекущаяВерсияТом.Пустая() Тогда + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ТекущаяВерсияТом) + ТекущаяВерсияПутьКФайлу; + ДвоичныеДанныеПредыдущейВерсии = Новый ДвоичныеДанные(ПолныйПуть); + КонецЕсли; + Иначе + ХранилищеФайла = ПолучитьХранилищеФайлаИзИнформационнойБазы(ВерсияСсылкаДляСравненияРазмера); + ДвоичныеДанныеПредыдущейВерсии = ХранилищеФайла.Получить(); + КонецЕсли; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаФайла); + + Если ДвоичныеДанныеПредыдущейВерсии = ДвоичныеДанные Тогда + Возврат Неопределено; // Файл бинарно не изменен - вернем Ложь. + КонецЕсли; + КонецЕсли; + + СтарыйТипХранения = Неопределено; + ВерсияЗаблокирована = Ложь; + Версия = Неопределено; + + Если ВерсияСсылка = Неопределено Тогда + Версия = ФайлСсылка.ПолучитьОбъект(); + КонецЕсли; + + ЗаблокироватьДанныеДляРедактирования(Версия.Ссылка, , УникальныйИдентификаторФормы); + ВерсияЗаблокирована = Истина; + + // Удалим файл с диска - мы заместим его новым. + Если Версия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ Версия.Том.Пустая() Тогда + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; + ФайлНаДиске = Новый Файл(ПолныйПуть); + Если ФайлНаДиске.Существует() Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + КонецЕсли; + ПутьСПодкаталогом = ФайлНаДиске.Путь; + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Пользователь = Неопределено Тогда + Версия.Изменил = Пользователи.ТекущийПользователь(); + Иначе + Версия.Изменил = Пользователь; + КонецЕсли; + Версия.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; + Версия.Размер = СведенияОФайле.Размер; + Версия.Наименование = СведенияОФайле.ИмяБезРасширения; + Версия.Описание = СведенияОФайле.Комментарий; + Версия.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СведенияОФайле.РасширениеБезТочки); + + ТипХраненияФайлов = РаботаСФайламиСлужебный.ТипХраненияФайлов(); + Версия.ТипХраненияФайла = ТипХраненияФайлов; + + Если ДвоичныеДанные = Неопределено Тогда + ДвоичныеДанные = ПолучитьИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаФайла); + КонецЕсли; + + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + + ХранилищеФайла = Новый ХранилищеЗначения(ДвоичныеДанные); + + Если Версия.Размер = 0 Тогда + ДвоичныеДанныеФайла = ХранилищеФайла.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + КонецЕсли; + + // очистим поля + Версия.ПутьКФайлу = ""; + Версия.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + Иначе // хранение на диске + + Если Версия.Размер = 0 Тогда + Версия.Размер = ДвоичныеДанные.Размер(); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРазмерФайлаДляЗагрузки(Версия); + КонецЕсли; + + ФайлЗашифрован = Ложь; + Если СведенияОФайле.Зашифрован <> Неопределено Тогда + ФайлЗашифрован = СведенияОФайле.Зашифрован; + КонецЕсли; + + Сведения = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, + ВремяИзмененияУниверсальное, СведенияОФайле.ИмяБезРасширения, Версия.Расширение, + "", ФайлЗашифрован); + Версия.Том = Сведения.Том; + Версия.ПутьКФайлу = Сведения.ПутьКФайлу; + ХранилищеФайла = Новый ХранилищеЗначения(Неопределено); // очистим ХранилищеЗначения + + КонецЕсли; + + Если СведенияОФайле.АдресВременногоХранилищаТекста <> Неопределено Тогда + Если РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере() Тогда + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + Иначе + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); + Версия.ТекстХранилище = Новый ХранилищеЗначения(Текст); + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + КонецЕсли; + Иначе + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + + Если СведенияОФайле.НовыйСтатусИзвлеченияТекста <> Неопределено Тогда + Версия.СтатусИзвлеченияТекста = СведенияОФайле.НовыйСтатусИзвлеченияТекста; + КонецЕсли; + + Если Версия.Размер = 0 Тогда + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ДвоичныеДанныеФайла = ХранилищеФайла.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + КонецЕсли; + КонецЕсли; + + Версия.Заполнить(Неопределено); + Версия.Записать(); + + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ЗаписатьФайлВИнформационнуюБазу(Версия.Ссылка, ХранилищеФайла); + КонецЕсли; + + Если ВерсияЗаблокирована Тогда + РазблокироватьДанныеДляРедактирования(Версия.Ссылка, УникальныйИдентификаторФормы); + КонецЕсли; + + ЗаписатьКодировкуВерсииФайла(Версия.Ссылка, КодировкаПредВерсии); + + Если ЕстьПравоСохранения Тогда + НавигационнаяСсылкаФайла = ПолучитьНавигационнуюСсылку(ФайлСсылка); + ИсторияРаботыПользователя.Добавить(НавигационнаяСсылкаФайла); + КонецЕсли; + + Возврат Версия.Ссылка; + +КонецФункции + +// Создает новый файл по аналогии с указанным и возвращает ссылку на него. +// Параметры: +// ИсходныйФайл - СправочникСсылка.Файлы - существующий файл. +// ВладелецНовогоФайла - ЛюбаяСсылка - владелец файла. +// +// Возвращаемое значение: +// СправочникСсылка.Файлы - новый файл. +// +Функция СкопироватьФайл(ИсходныйФайл, ВладелецНовогоФайла) + + Если ИсходныйФайл = Неопределено Или ИсходныйФайл.Пустая() Тогда + Возврат Неопределено; + КонецЕсли; + + СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); + СведенияОФайле.Комментарий = ИсходныйФайл.Описание; + СведенияОФайле.ИмяБезРасширения = ИсходныйФайл.Наименование; + СведенияОФайле.ХранитьВерсии = ИсходныйФайл.ХранитьВерсии; + СведенияОФайле.ИмяСправочникаХранилищаФайлов = "Файлы"; + + НовыйФайл = СоздатьФайл(ВладелецНовогоФайла, СведенияОФайле); + + Если СведенияОФайле.ХранитьВерсии И Не ИсходныйФайл.ТекущаяВерсия().Пустая() Тогда + ТекущаяВерсия = ИсходныйФайл.ТекущаяВерсия(); + Иначе + ТекущаяВерсия = ИсходныйФайл; + КонецЕсли; + ХранилищеФайла = Неопределено; + Если ИсходныйФайл.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ХранилищеФайла = ПолучитьХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсия); + КонецЕсли; + + СведенияОФайле.Размер = ТекущаяВерсия.Размер; + СведенияОФайле.РасширениеБезТочки = ТекущаяВерсия.Расширение; + СведенияОФайле.АдресВременногоХранилищаФайла = ХранилищеФайла; + СведенияОФайле.АдресВременногоХранилищаТекста = ТекущаяВерсия.ТекстХранилище; + СведенияОФайле.СсылкаНаВерсиюИсточник = ТекущаяВерсия; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + Если ИсходныйФайл.ПодписанЭП Тогда + + ФайлОбъект = НовыйФайл.ПолучитьОбъект(); + ФайлОбъект.ПодписанЭП = Истина; + ФайлОбъект.Записать(); + + ЭлектронныеПодписиИсходногоФайла = МодульЭлектроннаяПодпись.УстановленныеПодписи(ИсходныйФайл); + Для Каждого ЭП Из ЭлектронныеПодписиИсходногоФайла Цикл + МенеджерЗаписи = РегистрыСведений["ЭлектронныеПодписи"].СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ПодписанныйОбъект = НовыйФайл; + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ЭП); + МенеджерЗаписи.Записать(Истина); + КонецЦикла; + + КонецЕсли; + + Если ИсходныйФайл.Зашифрован Тогда + + ФайлОбъект = НовыйФайл.ПолучитьОбъект(); + ФайлОбъект.Зашифрован = Истина; + + ЭлектронныеПодписиИсходногоФайла = МодульЭлектроннаяПодпись.СертификатыШифрования(ИсходныйФайл); + Для Каждого Сертификат Из ЭлектронныеПодписиИсходногоФайла Цикл + МенеджерЗаписи = РегистрыСведений["СертификатыШифрования"].СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ЗашифрованныйОбъект = НовыйФайл; + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Сертификат); + МенеджерЗаписи.Записать(Истина); + КонецЦикла; + // Чтобы прошла запись ранее подписанного объекта. + ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); + ФайлОбъект.Записать(); + + КонецЕсли; + + КонецЕсли; + + РаботаСФайламиПереопределяемый.ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл); + + Возврат НовыйФайл; + +КонецФункции + // Переносит Файл в другую папку. // // Параметры: @@ -1044,10 +1599,23 @@ // Процедура ПеренестиФайл(ДанныеФайла, Папка) - ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); - ФайлОбъект.Заблокировать(); - ФайлОбъект.ВладелецФайла = Папка; - ФайлОбъект.Записать(); + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ДанныеФайла.Ссылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ДанныеФайла.Ссылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.ВладелецФайла = Папка; + ФайлОбъект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры @@ -1083,21 +1651,20 @@ // Функция СоздатьФайл(Знач Владелец, Знач СведенияОФайле) - Файл = Справочники.Файлы.СоздатьЭлемент(); + Файл = Справочники[СведенияОФайле.ИмяСправочникаХранилищаФайлов].СоздатьЭлемент(); Файл.ВладелецФайла = Владелец; Файл.Наименование = СведенияОФайле.ИмяБезРасширения; - Файл.ПолноеНаименование = СведенияОФайле.ИмяБезРасширения; Файл.Автор = ?(СведенияОФайле.Автор <> Неопределено, СведенияОФайле.Автор, Пользователи.ТекущийПользователь()); Файл.ДатаСоздания = ТекущаяДатаСеанса(); Файл.Описание = СведенияОФайле.Комментарий; - Файл.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); + Файл.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); Файл.ХранитьВерсии = СведенияОФайле.ХранитьВерсии; Если ТипЗнч(СведенияОФайле.АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда // При создании Файла из шаблона хранилище значения копируется напрямую. Файл.ТекстХранилище = СведенияОФайле.АдресВременногоХранилищаТекста; ИначеЕсли Не ПустаяСтрока(СведенияОФайле.АдресВременногоХранилищаТекста) Тогда - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаТекста); Файл.ТекстХранилище = Новый ХранилищеЗначения(Текст); КонецЕсли; @@ -1153,15 +1720,30 @@ Знач АдресВременногоХранилищаТекста, УникальныйИдентификатор = Неопределено) - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); - - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); - - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); - + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + КонецПроцедуры // Обновляет или создает версию файла и снимает блокировку. @@ -1182,7 +1764,7 @@ УникальныйИдентификаторФормы = Неопределено) Экспорт ДанныеФайлаТекущие = ДанныеФайла(ДанныеФайла.Ссылка); - Если Не ДанныеФайлаТекущие.РедактируетТекущийПользователь Тогда + Если Не ДанныеФайлаТекущие.ФайлРедактируетТекущийПользователь Тогда ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); КонецЕсли; @@ -1192,7 +1774,13 @@ Попытка ПредыдущаяВерсия = ДанныеФайла.ТекущаяВерсия; СведенияОФайле.Зашифрован = ДанныеФайла.Зашифрован; - НоваяВерсия = ОбновитьВерсиюФайла(ДанныеФайла.Ссылка, СведенияОФайле,, УникальныйИдентификаторФормы); + + Если ТипЗнч(ДанныеФайла.Ссылка) = Тип("СправочникСсылка.Файлы") Тогда + НоваяВерсия = ОбновитьВерсиюФайла(ДанныеФайла.Ссылка, СведенияОФайле,, УникальныйИдентификаторФормы); + Иначе + НоваяВерсия = ОбновитьОбъектФайла(ДанныеФайла.Ссылка, СведенияОФайле,, УникальныйИдентификаторФормы); + КонецЕсли; + Если НоваяВерсия <> Неопределено Тогда Если СведенияОФайле.ХранитьВерсии Тогда ОбновитьВерсиюВФайле(ДанныеФайла.Ссылка, НоваяВерсия, СведенияОФайле.АдресВременногоХранилищаТекста, УникальныйИдентификаторФормы); @@ -1201,7 +1789,7 @@ КонецЕсли; ДанныеФайла.ТекущаяВерсия = НоваяВерсия; КонецЕсли; - + ОсвободитьФайл(ДанныеФайла, УникальныйИдентификаторФормы); Если СведенияОФайле.Кодировка <> Неопределено Тогда @@ -1272,7 +1860,7 @@ УникальныйИдентификаторФормы = Неопределено) Экспорт ДанныеФайлаТекущие = ДанныеФайла(ФайлСсылка); - Если Не ДанныеФайлаТекущие.РедактируетТекущийПользователь Тогда + Если Не ДанныеФайлаТекущие.ФайлРедактируетТекущийПользователь Тогда ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); КонецЕсли; @@ -1411,9 +1999,13 @@ // Булево - успешно ли выполнена операция. // Функция ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ФайлСсылка, - ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + ДанныеФайла, + СтрокаОшибки, + УникальныйИдентификатор = Неопределено, + РабочийКаталогВладельца = Неопределено, + ВерсияСсылка = Неопределено) Экспорт - ДанныеФайла = ДанныеФайлаДляОткрытия(ФайлСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); + ДанныеФайла = ДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); СтрокаОшибки = ""; Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда @@ -1441,40 +2033,13 @@ // Функция ПолучитьНавигационнуюСсылкуДляОткрытия(ВерсияСсылка, ИдентификаторФормы = Неопределено) Экспорт - Адрес = ""; + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВерсияСсылка, "Ссылка", Истина); - ТипХраненияФайла = ВерсияСсылка.ТипХраненияФайла; - - Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - Если НЕ ВерсияСсылка.Том.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; - Попытка - ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); - Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); - Исключение - // Запись в журнал регистрации. - СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора( - ИнформацияОбОшибке(), ВерсияСсылка.Владелец); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Открытие файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.Файлы, - ВерсияСсылка.Владелец, - СообщениеОбОшибке); - - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( - ВерсияСсылка.ПолноеНаименование + "." + ВерсияСсылка.Расширение); - КонецПопытки; - КонецЕсли; - Иначе - СтруктураКлюча = Новый Структура("ВерсияФайла", ВерсияСсылка); - КлючЗаписи = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьКлючЗаписи(СтруктураКлюча); - Адрес = ПолучитьНавигационнуюСсылку(КлючЗаписи, "ХранимыйФайл"); + Если ЕстьПраваНаОбъект = Неопределено Тогда + Возврат Неопределено; КонецЕсли; - Возврат Адрес; + Возврат ПоместитьВоВременноеХранилище(РаботаСФайлами.ДвоичныеДанныеФайла(ВерсияСсылка)); КонецФункции @@ -1490,9 +2055,12 @@ Функция ДанныеФайлаИРабочийКаталог(ФайлИлиВерсияСсылка, РабочийКаталогВладельца = Неопределено) Экспорт ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка); - Если ТипЗнч(ФайлИлиВерсияСсылка) = Тип("СправочникСсылка.Файлы") Тогда + МетаданныеФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлИлиВерсияСсылка)); + ВозможностьХранитьВерсии = Ложь; + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", МетаданныеФайла) Тогда ФайлСсылка = ФайлИлиВерсияСсылка; ВерсияСсылка = Неопределено; + ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеФайла); Иначе ФайлСсылка = Неопределено; ВерсияСсылка = ФайлИлиВерсияСсылка; @@ -1512,9 +2080,11 @@ Если ВерсияСсылка <> Неопределено Тогда ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - Иначе + ИначеЕсли ВозможностьХранитьВерсии И ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия) Тогда ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ФайлСсылка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; + Иначе + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ФайлСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; @@ -1557,120 +2127,6 @@ КонецФункции -// Функция возвращает структуру, содержащую различные сведения о Файле и версии. -// -// Параметры: -// ФайлВерсияСсылка - СправочникСсылка.Файлы, СправочникСсылка.ВерсииФайлов - файл или версия файла. -// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы. -// РабочийКаталогВладельца - Строка - в ней возвращается рабочий каталог владельца файла. -// ПредыдущийАдресФайла - Строка - в ней возвращается рабочий каталог владельца файла. -// -// Возвращаемое значение: -// Структура - структура с данными файла. См. ПолучитьДанныеФайла. -// -Функция ДанныеФайлаДляОткрытия(ФайлИлиВерсияСсылка, ИдентификаторФормы = Неопределено, - РабочийКаталогВладельца = Неопределено, ПредыдущийАдресФайла = Неопределено) Экспорт - - Если ПредыдущийАдресФайла <> Неопределено Тогда - Если НЕ ПустаяСтрока(ПредыдущийАдресФайла) И ЭтоАдресВременногоХранилища(ПредыдущийАдресФайла) Тогда - УдалитьИзВременногоХранилища(ПредыдущийАдресФайла); - КонецЕсли; - КонецЕсли; - - Если ТипЗнч(ФайлИлиВерсияСсылка) = Тип("СправочникСсылка.Файлы") Тогда - ФайлСсылка = ФайлИлиВерсияСсылка; - ВерсияСсылка = Неопределено; - Иначе - ФайлСсылка = Неопределено; - ВерсияСсылка = ФайлИлиВерсияСсылка; - КонецЕсли; - ДанныеФайла = ДанныеФайла(ФайлИлиВерсияСсылка); - - Если РабочийКаталогВладельца = Неопределено Тогда - РабочийКаталогВладельца = РабочийКаталогПапки(ДанныеФайла.Владелец); - КонецЕсли; - ДанныеФайла.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); - - Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - ПолноеИмяФайлаВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; - ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); - КонецЕсли; - - ТипХраненияФайла = ДанныеФайла.Версия.ТипХраненияФайла; - - Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ДанныеФайла.Версия <> Неопределено Тогда - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - - Запрос.Текст = - "ВЫБРАТЬ - | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, - | ВерсииФайлов.Том КАК Том - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.Ссылка = &Версия"; - - Запрос.Параметры.Вставить("Версия", ДанныеФайла.Версия); - - ДанныеФайлаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - ДанныеФайлаПутьКФайлу = ""; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - ДанныеФайлаТом = Выборка.Том; - ДанныеФайлаПутьКФайлу = Выборка.ПутьКФайлу; - КонецЕсли; - - Если НЕ ДанныеФайлаТом.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ДанныеФайлаТом) + ДанныеФайлаПутьКФайлу; - Попытка - ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); - // Работаем только с текущей версией - для не-текущей ссылку получаем в ПолучитьНавигационнуюСсылкуДляОткрытия. - ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); - Исключение - // Запись в журнал регистрации. - СсылкаНаФайл = ?(ФайлСсылка <> Неопределено, ФайлСсылка, ВерсияСсылка); - СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора( - ИнформацияОбОшибке(), СсылкаНаФайл); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Открытие файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.Файлы, - ФайлСсылка, - СообщениеОбОшибке); - - ТипВладельцаФайла = ТипЗнч(ДанныеФайла.Владелец); - Если ТипВладельцаФайла = Тип("СправочникСсылка.ПапкиФайлов") Тогда - ПредставлениеВладельца = ПолныйПутьПапки(ДанныеФайла.Владелец); - Иначе - ПредставлениеВладельца = ДанныеФайла.Владелец; - КонецЕсли; - ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Присоединен к %1 : %2'"), - Строка(ТипВладельцаФайла), - ПредставлениеВладельца); - - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( - ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение, - , - ПредставлениеВладельцаФайла); - КонецПопытки; - КонецЕсли; - КонецЕсли; - - ПредыдущийАдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - - Возврат ДанныеФайла; - -КонецФункции - Функция ПолныйПутьПапки(Папка) ПолныйПуть = ""; @@ -1702,28 +2158,6 @@ КонецФункции -// Функция возвращает структуру, содержащую различные сведения о Файлах и версиях. -// -// Параметры: -// МассивФайлов - массив файлов или версий файлов. -// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы. -// -// Возвращаемое значение: -// ДанныеФайлов - массив с данными файлов. См. ПолучитьДанныеФайла. -// -Функция ДанныеФайловДляОткрытия(МассивФайлов, ИдентификаторФормы = Неопределено, - РабочийКаталогВладельца = Неопределено, ПредыдущийАдресФайла = Неопределено) Экспорт - - ДанныеФайлов = Новый Массив; - Для Каждого Файл Из МассивФайлов Цикл - ДанныеФайла = ДанныеФайлаДляОткрытия(Файл, ИдентификаторФормы); - ДанныеФайлов.Добавить(ДанныеФайла); - КонецЦикла; - - Возврат ДанныеФайлов; - -КонецФункции - // Освобождение Файла с получением данных. // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. @@ -1760,7 +2194,7 @@ УникальныйИдентификаторФормы = Неопределено) Экспорт ДанныеФайла = ДанныеФайла(ФайлСсылка); - Если Не ДанныеФайла.РедактируетТекущийПользователь Тогда + Если Не ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); КонецЕсли; @@ -1858,7 +2292,7 @@ ЗапросВРегистр.УстановитьПараметр("Путь", ИмяКаталогаПрежнееЗначение + "%"); ЗапросВРегистр.Текст = "ВЫБРАТЬ - | ФайлыВРабочемКаталоге.Версия КАК Версия, + | ФайлыВРабочемКаталоге.Файл КАК Файл, | ФайлыВРабочемКаталоге.Путь КАК Путь, | ФайлыВРабочемКаталоге.Размер КАК Размер, | ФайлыВРабочемКаталоге.ДатаПомещенияВРабочийКаталог КАК ДатаПомещенияВРабочийКаталог, @@ -1879,7 +2313,7 @@ НовыйПуть = СтрЗаменить(НовыйПуть, ИмяКаталогаПрежнееЗначение, РабочийКаталогПапки); СтруктураЗаписи = Новый Структура; - СтруктураЗаписи.Вставить("Версия", Выборка.Версия); + СтруктураЗаписи.Вставить("Файл", Выборка.Файл); СтруктураЗаписи.Вставить("Путь", НовыйПуть); СтруктураЗаписи.Вставить("Размер", Выборка.Размер); СтруктураЗаписи.Вставить("ДатаПомещенияВРабочийКаталог", Выборка.ДатаПомещенияВРабочийКаталог); @@ -1893,7 +2327,7 @@ ВРабочемКаталогеВладельца = Истина; ЗаписатьСтруктуруЗаписиВРегистр( - СтруктураЗаписи.Версия, + СтруктураЗаписи.Файл, СтруктураЗаписи.Путь, СтруктураЗаписи.Размер, СтруктураЗаписи.ДатаПомещенияВРабочийКаталог, @@ -1913,7 +2347,7 @@ // НаЧтение - Булево - файл помещен на чтение. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // -Процедура ЗаписатьСтруктуруЗаписиВРегистр(Версия, +Процедура ЗаписатьСтруктуруЗаписиВРегистр(Файл, Путь, Размер, ДатаПомещенияВРабочийКаталог, @@ -1925,11 +2359,11 @@ // Создать набор записей НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Версия.Установить(Версия); + НаборЗаписей.Отбор.Файл.Установить(Файл); НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.ТекущийПользователь()); НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Версия = Версия; + НоваяЗапись.Файл = Файл; НоваяЗапись.Путь = Путь; НоваяЗапись.Размер = Размер; НоваяЗапись.ДатаПомещенияВРабочийКаталог = ДатаПомещенияВРабочийКаталог; @@ -1998,7 +2432,7 @@ НайденныеСвойства = Новый Структура; НайденныеСвойства.Вставить("ФайлЕстьВРегистре", Ложь); - НайденныеСвойства.Вставить("Версия", Справочники.ВерсииФайлов.ПолучитьСсылку()); + НайденныеСвойства.Вставить("Файл", Справочники.ВерсииФайлов.ПолучитьСсылку()); НайденныеСвойства.Вставить("ДатаПомещения"); НайденныеСвойства.Вставить("Владелец"); НайденныеСвойства.Вставить("НомерВерсии"); @@ -2013,13 +2447,24 @@ ЗапросВРегистр.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь()); ЗапросВРегистр.Текст = "ВЫБРАТЬ - | ФайлыВРабочемКаталоге.Версия КАК Версия, + | ФайлыВРабочемКаталоге.Файл КАК Файл, | ФайлыВРабочемКаталоге.ДатаПомещенияВРабочийКаталог КАК ДатаПомещения, | ФайлыВРабочемКаталоге.НаЧтение КАК ВРегистреНаЧтение, - | ФайлыВРабочемКаталоге.Версия.Владелец КАК Владелец, - | ФайлыВРабочемКаталоге.Версия.НомерВерсии КАК НомерВерсии, - | ФайлыВРабочемКаталоге.Версия.Владелец.Код КАК ВРегистреКодФайла, - | ФайлыВРабочемКаталоге.Версия.Владелец.ВладелецФайла КАК ВРегистреПапка + | ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ФайлыВРабочемКаталоге.Файл) = ТИП(Справочник.ВерсииФайлов) + | ТОГДА ФайлыВРабочемКаталоге.Файл.Владелец + | ИНАЧЕ ФайлыВРабочемКаталоге.Файл + | КОНЕЦ КАК Владелец, + | ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ФайлыВРабочемКаталоге.Файл) = ТИП(Справочник.ВерсииФайлов) + | ТОГДА ФайлыВРабочемКаталоге.Файл.НомерВерсии + | ИНАЧЕ 0 + | КОНЕЦ КАК НомерВерсии, + | ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ФайлыВРабочемКаталоге.Файл) = ТИП(Справочник.ВерсииФайлов) + | ТОГДА ФайлыВРабочемКаталоге.Файл.Владелец.ВладелецФайла + | ИНАЧЕ ФайлыВРабочемКаталоге.Файл.ВладелецФайла + | КОНЕЦ КАК ВРегистреПапка |ИЗ | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге |ГДЕ @@ -2054,7 +2499,7 @@ ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) Экспорт - ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Версия, "Ссылка"); + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Версия, "Ссылка", Истина); Если ЕстьПраваНаОбъект = Неопределено Тогда Возврат Неопределено; @@ -2066,12 +2511,13 @@ // Подготовить структуру отбора по измерениям. СтруктураОтбора = Новый Структура; - СтруктураОтбора.Вставить("Версия", Версия.Ссылка); - СтруктураОтбора.Вставить("Пользователь", Пользователи.ТекущийПользователь()); - + СтруктураОтбора.Вставить("Файл", Версия.Ссылка); + + СтруктураОтбора.Вставить("Пользователь", Пользователи.АвторизованныйПользователь()); + // Получить структуру с данными ресурсов записи. СтруктураРесурсов = РегистрыСведений.ФайлыВРабочемКаталоге.Получить(СтруктураОтбора); - + // Получить путь из регистра ПолноеИмяФайла = СтруктураРесурсов.Путь; ВРабочемКаталогеНаЧтение = СтруктураРесурсов.НаЧтение; @@ -2101,11 +2547,11 @@ // Создать набор записей НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Версия.Установить(ТекущаяВерсия.Ссылка); + НаборЗаписей.Отбор.Файл.Установить(ТекущаяВерсия.Ссылка); НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.ТекущийПользователь()); НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Версия = ТекущаяВерсия.Ссылка; + НоваяЗапись.Файл = ТекущаяВерсия.Ссылка; НоваяЗапись.Путь = ПолноеИмяФайла; НоваяЗапись.Размер = ТекущаяВерсия.Размер; НоваяЗапись.ДатаПомещенияВРабочийКаталог = ТекущаяДатаСеанса(); @@ -2122,14 +2568,14 @@ // Параметры: // Версия - СправочникСсылка.ВерсииФайлов - версия. // -Процедура УдалитьИзРегистра(Версия) Экспорт +Процедура УдалитьИзРегистра(Файл) Экспорт УстановитьПривилегированныйРежим(Истина); НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Версия.Установить(Версия); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.ТекущийПользователь()); + НаборЗаписей.Отбор.Файл.Установить(Файл); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.АвторизованныйПользователь()); НаборЗаписей.Записать(); @@ -2153,10 +2599,12 @@ ЗапросВРегистр.УстановитьПараметр("Пользователь", ТекущийПользователь); ЗапросВРегистр.Текст = "ВЫБРАТЬ - | ФайлыВРабочемКаталоге.Версия КАК Версия, - | ФайлыВРабочемКаталоге.Версия.Владелец.Редактирует КАК Редактирует + | ФайлыВРабочемКаталоге.Файл КАК Файл, + | СведенияОФайлах.Редактирует КАК Редактирует |ИЗ | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОФайлах КАК СведенияОФайлах + | ПО ФайлыВРабочемКаталоге.Файл = СведенияОФайлах.Файл |ГДЕ | ФайлыВРабочемКаталоге.Пользователь = &Пользователь | И ФайлыВРабочемКаталоге.ВРабочемКаталогеВладельца = ЛОЖЬ"; @@ -2169,18 +2617,18 @@ Пока Выборка.Следующий() Цикл Если Выборка.Редактирует <> ТекущийПользователь Тогда - СписокУдалить.Добавить(Выборка.Версия); + СписокУдалить.Добавить(Выборка.Файл); КонецЕсли; КонецЦикла; КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Для Каждого Версия Из СписокУдалить Цикл + Для Каждого Файл Из СписокУдалить Цикл // Создать набор записей НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Версия.Установить(Версия); + НаборЗаписей.Отбор.Файл.Установить(Файл); НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь); НаборЗаписей.Записать(); @@ -2235,11 +2683,11 @@ // Создать набор записей НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Версия.Установить(Версия.Ссылка); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.ТекущийПользователь()); + НаборЗаписей.Отбор.Файл.Установить(Версия.Ссылка); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.АвторизованныйПользователь()); НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Версия = Версия.Ссылка; + НоваяЗапись.Файл = Версия.Ссылка; НоваяЗапись.Путь = ПолноеИмяФайла; Если РазмерФайла <> 0 Тогда @@ -2249,7 +2697,7 @@ КонецЕсли; НоваяЗапись.ДатаПомещенияВРабочийКаталог = ТекущаяДатаСеанса(); - НоваяЗапись.Пользователь = Пользователи.ТекущийПользователь(); + НоваяЗапись.Пользователь = Пользователи.АвторизованныйПользователь(); НоваяЗапись.НаЧтение = НаЧтение; НоваяЗапись.ВРабочемКаталогеВладельца = ВРабочемКаталогеВладельца; @@ -2439,6 +2887,12 @@ НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлПринятый)).ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка",ФайлПринятый); + КонецЦикла; + Блокировка.Заблокировать(); Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл ФайлОбъект = ФайлПринятый.ПолучитьОбъект(); @@ -2514,6 +2968,12 @@ НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл + ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлПринятый)).ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка",ФайлПринятый); + КонецЦикла; + Блокировка.Заблокировать(); Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл ФайлОбъект = ФайлПринятый.ПолучитьОбъект(); @@ -2541,7 +3001,7 @@ // Возвращаемое значение: // Булево - есть дочерний элемент с таким именем. // -Функция ЕстьПапкаСТакимИменем(ИмяФайла, Родитель, ПерваяПапкаСТакимЖеИменем) Экспорт +Функция ЕстьПапкаСТакимИменем(ИмяФайла, Родитель, ПерваяПапкаСТакимЖеИменем, ИмяСправочникаХранилищаФайлов = "") Экспорт ПерваяПапкаСТакимЖеИменем = Справочники.ПапкиФайлов.ПустаяСсылка(); @@ -2557,6 +3017,10 @@ | ПапкиФайлов.Наименование = &Наименование | И ПапкиФайлов.Родитель = &Родитель"; + Если Не ПустаяСтрока(ИмяСправочникаХранилищаФайлов) Тогда + ЗапросВПапки.Текст = СтрЗаменить(ЗапросВПапки.Текст, ".ПапкиФайлов", "." + ИмяСправочникаХранилищаФайлов); + КонецЕсли; + РезультатЗапроса = ЗапросВПапки.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда @@ -2581,25 +3045,40 @@ УникальныйИдентификатор = Неопределено) Экспорт Если НЕ Версия.Том.Пустая() Тогда - ВерсияОбъект = Версия.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(Версия, , УникальныйИдентификатор); + НачатьТранзакцию(); + Попытка + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Версия)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Версия); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ВерсияОбъект = Версия.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Версия, , УникальныйИдентификатор); + + СтарыйПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; + + ФайлНаДиске = Новый Файл(СтарыйПолныйПуть); + ПолныйПуть = ФайлНаДиске.Путь; + ИмяБезРасширения = ФайлНаДиске.ИмяБезРасширения; + Расширение = ФайлНаДиске.Расширение; + НовоеИмяБезРасширения = СтрЗаменить(ИмяБезРасширения, СтароеНаименование, НовоеНаименование); + + НовыйПолныйПуть = ПолныйПуть + НовоеИмяБезРасширения + Расширение; + ПолныйПутьКТому = РаботаСФайламиСлужебный.ПолныйПутьТома(Версия.Том); + НовыйЧастичныйПуть = Прав(НовыйПолныйПуть, СтрДлина(НовыйПолныйПуть) - СтрДлина(ПолныйПутьКТому)); - СтарыйПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; - - ФайлНаДиске = Новый Файл(СтарыйПолныйПуть); - ПолныйПуть = ФайлНаДиске.Путь; - ИмяБезРасширения = ФайлНаДиске.ИмяБезРасширения; - Расширение = ФайлНаДиске.Расширение; - НовоеИмяБезРасширения = СтрЗаменить(ИмяБезРасширения, СтароеНаименование, НовоеНаименование); - - НовыйПолныйПуть = ПолныйПуть + НовоеИмяБезРасширения + Расширение; - ПолныйПутьКТому = ФайловыеФункцииСлужебный.ПолныйПутьТома(Версия.Том); - НовыйЧастичныйПуть = Прав(НовыйПолныйПуть, СтрДлина(НовыйПолныйПуть) - СтрДлина(ПолныйПутьКТому)); - - ПереместитьФайл(СтарыйПолныйПуть, НовыйПолныйПуть); - ВерсияОбъект.ПутьКФайлу = НовыйЧастичныйПуть; - ВерсияОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(Версия, УникальныйИдентификатор); + ПереместитьФайл(СтарыйПолныйПуть, НовыйПолныйПуть); + ВерсияОбъект.ПутьКФайлу = НовыйЧастичныйПуть; + ВерсияОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(Версия, УникальныйИдентификатор); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецЕсли; КонецПроцедуры @@ -2616,27 +3095,24 @@ Количество = 0; - Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.Файлы) Тогда - Возврат 0; - КонецЕсли; + УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Файлы.Ссылка КАК Ссылка, - | Файлы.Представление КАК Представление - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СведенияОФайлах.Файл + |ИЗ + | РегистрСведений.СведенияОФайлах КАК СведенияОФайлах + |ГДЕ + | СведенияОФайлах.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; Если Редактирует <> Неопределено Тогда - Запрос.Текст = Запрос.Текст + " И Файлы.Редактирует = &Редактирует "; + Запрос.Текст = Запрос.Текст + " И СведенияОФайлах.Редактирует = &Редактирует "; Запрос.УстановитьПараметр("Редактирует", Редактирует); КонецЕсли; Если ВладелецФайла <> Неопределено Тогда - Запрос.Текст = Запрос.Текст + " И Файлы.ВладелецФайла = &ВладелецФайла "; + Запрос.Текст = Запрос.Текст + " И СведенияОФайлах.ВладелецФайла = &ВладелецФайла "; Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); КонецЕсли; @@ -2684,7 +3160,7 @@ Если ТаблРезультат.Найти(ФайлСсылка, "Ссылка") <> Неопределено Тогда Результат.Вставить(ФайлСсылка, "Пропустить"); - ИначеЕсли ТаблРезультат.Найти(ФайлСсылка.ПолноеНаименование, "ПолноеНаименование") <> Неопределено Тогда + ИначеЕсли ТаблРезультат.Найти(ФайлСсылка.Наименование, "ПолноеНаименование") <> Неопределено Тогда Результат.Вставить(ФайлСсылка, "Обновить"); Иначе Результат.Вставить(ФайлСсылка, "Скопировать"); @@ -2771,7 +3247,7 @@ Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Файлы.Ссылка КАК Ссылка, - | Файлы.ПолноеНаименование КАК ПолноеНаименование + | Файлы.Наименование КАК ПолноеНаименование |ИЗ | Справочник.Файлы КАК Файлы |ГДЕ @@ -2960,9 +3436,9 @@ // Возвращаемое значение: // Структура - структура с данными файла. // -Функция ДанныеФайлаДляСохранения(ФайлИлиВерсияСсылка, ИдентификаторФормы = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт +Функция ДанныеФайлаДляСохранения(ФайлСсылка, ВерсияСсылка = Неопределено, ИдентификаторФормы = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт - ДанныеФайла = ДанныеФайлаДляОткрытия(ФайлИлиВерсияСсылка, ИдентификаторФормы, РабочийКаталогВладельца); + ДанныеФайла = ДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы, РабочийКаталогВладельца); ПапкаДляСохранитьКак = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляСохранитьКак"); ДанныеФайла.Вставить("ПапкаДляСохранитьКак", ПапкаДляСохранитьКак); @@ -3023,7 +3499,7 @@ Пока Выборка.Следующий() Цикл ВерсияСсылка = Выборка.Ссылка; - ДанныеФайла = ДанныеФайла(ВерсияСсылка); + ДанныеФайла = ДанныеФайла(ФайлСсылка, ВерсияСсылка); НавигационнаяСсылкаВерсии = ПолучитьНавигационнуюСсылкуВоВременномХранилище(ВерсияСсылка, ИдентификаторФормы); СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии, ВерсияСсылка", @@ -3031,6 +3507,16 @@ МассивВозврата.Добавить(СтруктураВозврата); КонецЦикла; + // Если не хранятся версии, то зашифровываем файл. + Если Не ФайлСсылка.ХранитьВерсии Или Не ЗначениеЗаполнено(ФайлСсылка.ТекущаяВерсия) Тогда + ДанныеФайла = ДанныеФайла(ФайлСсылка); + НавигационнаяСсылкаВерсии = ПолучитьНавигационнуюСсылкуВоВременномХранилище(ФайлСсылка, ИдентификаторФормы); + + СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии, ВерсияСсылка", + ДанныеФайла, НавигационнаяСсылкаВерсии, ФайлСсылка); + МассивВозврата.Добавить(СтруктураВозврата); + КонецЕсли; + Возврат МассивВозврата; КонецФункции @@ -3048,11 +3534,15 @@ НачатьТранзакцию(); Попытка - АдресВременногоХранилищаТекстаТекущейВерсии = ""; - + АдресВременногоХранилищаОсновногоФайла = ""; Для Каждого ДанныеДляЗаписиНаСервере Из МассивДанныхДляЗанесенияВБазу Цикл + Если ТипЗнч(ДанныеДляЗаписиНаСервере.ВерсияСсылка) <> Тип("СправочникСсылка.ВерсииФайлов") Тогда + АдресВременногоХранилищаОсновногоФайла = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища; + Продолжить; + КонецЕсли; + АдресВременногоХранилища = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища; ВерсияСсылка = ДанныеДляЗаписиНаСервере.ВерсияСсылка; АдресВременногоХранилищаТекста = ДанныеДляЗаписиНаСервере.АдресВременногоХранилищаТекста; @@ -3097,6 +3587,12 @@ КонецЦикла; + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); @@ -3106,22 +3602,30 @@ ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); Если Зашифровать Тогда - Для Каждого ОтпечатокСтруктура Из МассивОтпечатков Цикл - НоваяСтрока = ФайлОбъект.СертификатыШифрования.Добавить(); - НоваяСтрока.Отпечаток = ОтпечатокСтруктура.Отпечаток; - НоваяСтрока.Представление = ОтпечатокСтруктура.Представление; - НоваяСтрока.Сертификат = Новый ХранилищеЗначения(ОтпечатокСтруктура.Сертификат); - КонецЦикла; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ДобавитьСертификатыШифрования(ФайлСсылка, МассивОтпечатков); + КонецЕсли; Иначе - ФайлОбъект.СертификатыШифрования.Очистить(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.ОчиститьСертификатыШифрования(ФайлСсылка); + КонецЕсли; КонецЕсли; Если АдресВременногоХранилищаТекстаТекущейВерсии <> "" Тогда - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекстаТекущейВерсии); + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекстаТекущейВерсии); ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); КонецЕсли; + МетаданныеФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)); + ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеФайла); + Если Не ФайлОбъект.ХранитьВерсии Или (ВозможностьХранитьВерсии И Не ЗначениеЗаполнено(ФайлОбъект.ТекущаяВерсия)) Тогда + ОбновитьДвоичныеДанныеФайлаНаСервере(ФайлОбъект, АдресВременногоХранилищаОсновногоФайла); + КонецЕсли; + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); ЗафиксироватьТранзакцию(); @@ -3132,6 +3636,112 @@ КонецПроцедуры +// Заменяет двоичные данные файла в ИБ на данные во временном хранилище. +Процедура ОбновитьДвоичныеДанныеФайлаНаСервере(Знач ПрисоединенныйФайл, + Знач АдресФайлаВоВременномХранилищеДвоичныеДанные, + Знач РеквизитыЗначения = Неопределено) + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, "Ссылка", Истина); + Иначе + ЕстьПраваНаОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл.Ссылка, "Ссылка", Истина); + КонецЕсли; + + Если ЕстьПраваНаОбъект = Неопределено Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПрисоединенныйФайл)) Тогда + ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлСсылка = ПрисоединенныйФайл; + Иначе + ФайлОбъект = ПрисоединенныйФайл; + ФайлСсылка = ФайлОбъект.Ссылка; + КонецЕсли; + + Если ТипЗнч(АдресФайлаВоВременномХранилищеДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда + ДвоичныеДанные = АдресФайлаВоВременномХранилищеДвоичныеДанные; + Иначе + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилищеДвоичныеДанные); + КонецЕсли; + + Если ТипЗнч(РеквизитыЗначения) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(ФайлОбъект, РеквизитыЗначения); + КонецЕсли; + + Попытка + Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.РегистрыСведений.ДвоичныеДанныеФайлов.ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Файл", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ФайлСсылка; + МенеджерЗаписи.Прочитать(); + МенеджерЗаписи.Файл = ФайлСсылка; + МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + МенеджерЗаписи.Записать(); + Иначе + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу; + + Попытка + ФайлНаДиске = Новый Файл(ПолныйПуть); + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ФайлОбъект.ДатаМодификацииУниверсальная, + ФайлОбъект.Наименование, ФайлОбъект.Расширение,, ФайлОбъект.Зашифрован); + ФайлОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + ФайлОбъект.Том = СведенияОФайле.Том; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Запись файла на диск'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники[ФайлСсылка.Метаданные().Имя], + ФайлСсылка, + ТекстОшибкиПриСохраненииФайлаВТоме(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка)); + + ВызватьИсключение ТекстОшибкиПриСохраненииФайлаВТоме(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ФайлСсылка); + КонецПопытки; + + КонецЕсли; + + ФайлОбъект.Размер = ДвоичныеДанные.Размер(); + + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Файлы.Обновление данных присоединенного файла в хранилище файлов'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Возвращает текст сообщения об ошибке, добавляя к нему ссылку на элемент +// справочника хранимого файла. +// +Функция ТекстОшибкиПриСохраненииФайлаВТоме(Знач СообщениеОбОшибке, Знач Файл) + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка, при сохранении файла в томе: + |""%1"". + | + |Ссылка на файл: ""%2"".'"), + СообщениеОбОшибке, + ПолучитьНавигационнуюСсылку(Файл) ); + +КонецФункции + // Делает ПоместитьВоВременноеХранилище (если файл хранится на диске) и возвращает нужную ссылку. // Параметры: // ВерсияСсылка - СправочникСсылка.ВерсииФайлов - версия файла. @@ -3146,7 +3756,7 @@ Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда Если НЕ ВерсияСсылка.Том.Пустая() Тогда - ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + ПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; Попытка ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); @@ -3163,7 +3773,7 @@ ВерсияСсылка.Владелец, СообщениеОбОшибке); - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов( ВерсияСсылка.ПолноеНаименование + "." + ВерсияСсылка.Расширение); КонецПопытки; КонецЕсли; @@ -3186,29 +3796,12 @@ // Массив - массив структур Функция СертификатыШифрования(Ссылка) Экспорт - УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | СертификатыШифрования.Представление КАК Представление, - | СертификатыШифрования.Отпечаток КАК Отпечаток, - | СертификатыШифрования.Сертификат КАК Сертификат - |ИЗ - | Справочник.Файлы.СертификатыШифрования КАК СертификатыШифрования - |ГДЕ - | СертификатыШифрования.Ссылка = &ОбъектСсылка"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + Возврат МодульЭлектроннаяПодпись.СертификатыШифрования(Ссылка); + КонецЕсли; - Запрос.Параметры.Вставить("ОбъектСсылка", Ссылка); - ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); - - МассивСертификатовШифрования = Новый Массив; - Пока ВыборкаЗапроса.Следующий() Цикл - ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", - ВыборкаЗапроса.Отпечаток, ВыборкаЗапроса.Представление, ВыборкаЗапроса.Сертификат.Получить()); - МассивСертификатовШифрования.Добавить(ОтпечатокСтруктура); - КонецЦикла; - - Возврат МассивСертификатовШифрования; + Возврат Неопределено; КонецФункции @@ -3219,12 +3812,12 @@ Редактирует = СтруктураРеквизитов.Редактирует; Если ЗначениеЗаполнено(Редактирует) Тогда - ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(ФайлСсылка); + ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(ФайлСсылка); КонецЕсли; Зашифрован = СтруктураРеквизитов.Зашифрован; Если Зашифрован Тогда - СтрокаИсключения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(ФайлСсылка); + СтрокаИсключения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(ФайлСсылка); ВызватьИсключение СтрокаИсключения; КонецЕсли; @@ -3233,74 +3826,10 @@ КонецЕсли; МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - ВерсияСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ТекущаяВерсия"); - - НачатьТранзакцию(); - Попытка - МодульЭлектроннаяПодпись.ДобавитьПодпись(ВерсияСсылка, СвойстваПодписи, ИдентификаторФормы); - - ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭП"); - Если ФайлСсылкаПодписан = Ложь Тогда - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , ИдентификаторФормы); - ФайлОбъект.ПодписанЭП = Истина; - - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлСсылка, ИдентификаторФормы); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; + МодульЭлектроннаяПодпись.ДобавитьПодпись(ФайлСсылка, СвойстваПодписи, ИдентификаторФормы); КонецПроцедуры -// Удаляет записи из табличной части ЭП. -// -// Параметры: -// ВерсияСсылка - СправочникСсылка.ВерсииФайлов - ссылка на версию файла. -// ИндексыСтрок - Массив - индекс строки табличной части. -// РеквизитПодписанИзменен - Булево - возвращаемое значение - если удалена последняя подпись, -// РеквизитПодписанИзменен примет значение Истина. -// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. -Процедура УдалитьПодписиВерсииФайла(ВерсияСсылка, ИндексыСтрок, РеквизитПодписанИзменен, - УникальныйИдентификатор = Неопределено) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - - НачатьТранзакцию(); - Попытка - - ЗаписанныйОбъект = Неопределено; - МодульЭлектроннаяПодпись.УдалитьПодпись(ВерсияСсылка, - ИндексыСтрок, УникальныйИдентификатор, , ЗаписанныйОбъект); - - ФайлСсылка = ЗаписанныйОбъект.Владелец; - ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭП"); - - Если ФайлСсылкаПодписан = Истина И ЗаписанныйОбъект.ЭлектронныеПодписи.Количество() = 0 Тогда - РеквизитПодписанИзменен = Истина; - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); - ФайлОбъект.ПодписанЭП = Ложь; - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - - // Добавляет файл в тома при выполнении команды "разместить файлы начального образа". // Параметры: // СоответствиеПутейФайлов - Соответствие - соответствие УникальногоИдентификатора файла и пути на диске к файлу. @@ -3346,8 +3875,8 @@ ПереместитьФайл(ПолныйПутьФайлаНаДиске, ПолныйПутьНовый); // Добавить в один из томов (где есть свободное место). - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ПолныйПутьНовый, Объект.ДатаМодификацииУниверсальная, - Объект.Наименование, Объект.Расширение, Объект.НомерВерсии, Объект.Зашифрован); + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ПолныйПутьНовый, Объект.ДатаМодификацииУниверсальная, + Объект.Наименование, Объект.Расширение, Объект.НомерВерсии, Объект.Владелец.Зашифрован); Объект.Том = СведенияОФайле.Том; Объект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; @@ -3375,71 +3904,35 @@ ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаСсылка, Метаданные.Справочники.ВерсииФайлов); ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаСсылка, Метаданные.Справочники.Файлы); - ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаСсылка, Метаданные.РегистрыСведений.ХранимыеФайлыВерсий); - -КонецПроцедуры - -// Заполняет текст запроса для получения файлов у которых не извлечен текст. -// В качестве параметра может прийти другой запрос, с которым следует сделать объединение. -// -// Параметры: -// ТекстЗапроса - Строка (возвращаемое значение), варианты передаваемых значений: -// Пустая строка - будет возвращен требуемый текст запроса. -// Непустая строка - будет возвращен требуемый текст запроса, добавленный -// к переданному тексту посредством "ОБЪЕДИНИТЬ ВСЕ". -// -// ПолучитьВсеФайлы - Булево - начальное значение Ложь. Позволяет отключить выборку -// файлов по частям, если передать Истина. -// -Процедура ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(ТекстЗапроса, ПолучитьВсеФайлы = Ложь) Экспорт - - ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 100 - | ВерсииФайлов.Ссылка КАК Ссылка, - | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, - | ВерсииФайлов.ТипХраненияФайла КАК ТипХраненияФайла, - | ВерсииФайлов.Расширение КАК Расширение, - | ВерсииФайлов.Владелец.Наименование КАК Наименование - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - ТекстЗапроса = ТекстЗапроса + " - | И НЕ ВерсииФайлов.Зашифрован"; - КонецЕсли; - - Если ПолучитьВсеФайлы Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 100", ""); - КонецЕсли; + ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаСсылка, Метаданные.РегистрыСведений.ДвоичныеДанныеФайлов); КонецПроцедуры // Получает полный путь к файлу на диске. // Параметры: -// ВерсияСсылка - СправочникСсылка.ВерсииФайлов - версия файла. +// ОбъектСсылка - СправочникСсылка.ВерсииФайлов, +// СправочникСсылка.*ПрисоединенныеФайлы. // // Возвращаемое значение: // Строка - полный путь к файлу на диске. -Функция ПолучитьИмяФайлаСПутемКДвоичнымДанным(ВерсияСсылка, ПустойПутьДляПустыхДанных = Ложь) Экспорт +Функция ПолучитьИмяФайлаСПутемКДвоичнымДанным(ОбъектСсылка, ПустойПутьДляПустыхДанных = Ложь) Экспорт ПолноеИмяФайла = ""; - Если ВерсияСсылка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + Если ОбъектСсылка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - ХранилищеФайла = ПолучитьХранилищеФайлаИзИнформационнойБазы(ВерсияСсылка); + ХранилищеФайла = ПолучитьХранилищеФайлаИзИнформационнойБазы(ОбъектСсылка); ДвоичныеДанныеФайла = ХранилищеФайла.Получить(); Если ПустойПутьДляПустыхДанных И ТипЗнч(ДвоичныеДанныеФайла) <> Тип("ДвоичныеДанные") Тогда Возврат ""; КонецЕсли; - ПолноеИмяФайла = ПолучитьИмяВременногоФайла(ВерсияСсылка.Расширение); + ПолноеИмяФайла = ПолучитьИмяВременногоФайла(ОбъектСсылка.Расширение); ДвоичныеДанныеФайла.Записать(ПолноеИмяФайла); Иначе - Если НЕ ВерсияСсылка.Том.Пустая() Тогда - ПолноеИмяФайла = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + Если НЕ ОбъектСсылка.Том.Пустая() Тогда + ПолноеИмяФайла = РаботаСФайламиСлужебный.ПолныйПутьТома(ОбъектСсылка.Том) + ОбъектСсылка.ПутьКФайлу; КонецЕсли; КонецЕсли; @@ -3456,6 +3949,13 @@ ФайлЗаблокирован = Ложь; + // Если это не версия, то записываем. + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", Метаданные.НайтиПоТипу(ТипЗнч(ТекущаяВерсия))) Тогда + ТекущаяВерсия.ОбменДанными.Загрузка = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущаяВерсия); + Возврат; + КонецЕсли; + Файл = ТекущаяВерсия.Владелец; Если Файл.ТекущаяВерсия = ТекущаяВерсия.Ссылка Тогда Попытка @@ -3473,6 +3973,11 @@ ТекущаяВерсия.Записать(); Если Файл.ТекущаяВерсия = ТекущаяВерсия.Ссылка Тогда + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Файл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Файл); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); ФайлОбъект = Файл.ПолучитьОбъект(); ФайлОбъект.ТекстХранилище = ТекущаяВерсия.ТекстХранилище; ФайлОбъект.ОбменДанными.Загрузка = Истина; @@ -3529,99 +4034,9 @@ КонецПроцедуры -// Возвращает Истина в параметре ЕстьХранимыеФайлы, если есть хранимые файлы к объекту ВнешнийОбъект. -// -Процедура ОпределитьНаличиеХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы) Экспорт - - Если ЕстьХранимыеФайлы = Истина Тогда - Возврат; - КонецЕсли; - ТипыВладельцев = Метаданные.ОбщиеКоманды.ПрисоединенныеФайлы.ТипПараметраКоманды.Типы(); - Если ТипыВладельцев.Найти(ТипЗнч(ВнешнийОбъект)) <> Неопределено Тогда - МассивФайлов = ПолучитьВсеПодчиненныеФайлы(ВнешнийОбъект); - ЕстьХранимыеФайлы = МассивФайлов.Количество() <> 0; - КонецЕсли; - -КонецПроцедуры - -// Возвращает в параметре ХранимыеФайлы массив хранимых файлов к объекту ВнешнийОбъект. -// -Процедура ПолучитьХранимыеФайлы(ВнешнийОбъект, ХранимыеФайлы) Экспорт - - ТипыВладельцев = Метаданные.ОбщиеКоманды.ПрисоединенныеФайлы.ТипПараметраКоманды.Типы(); - Если ТипыВладельцев.Найти(ТипЗнч(ВнешнийОбъект)) = Неопределено Тогда - Возврат; - КонецЕсли; - - МассивФайлов = ПолучитьВсеПодчиненныеФайлы(ВнешнийОбъект); - Для Каждого Файл Из МассивФайлов Цикл - ДанныеФайла = Новый Структура("ДатаМодификацииУниверсальная, Размер, Наименование, Расширение, ДвоичныеДанныеФайла, Текст"); - - ДанныеФайла.ДатаМодификацииУниверсальная = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Файл.ТекущаяВерсия, "ДатаМодификацииУниверсальная"); - ДанныеФайла.Размер = Файл.ТекущаяВерсияРазмер; - ДанныеФайла.Наименование = Файл.Наименование; - ДанныеФайла.Расширение = Файл.ТекущаяВерсияРасширение; - - ДанныеДляОткрытия = ПолучитьНавигационнуюСсылкуВоВременномХранилище(Файл.ТекущаяВерсия); - ДанныеФайла.ДвоичныеДанныеФайла = ДанныеДляОткрытия; - - ДанныеФайла.Текст = Файл.ТекстХранилище.Получить(); - - ХранимыеФайлы.Добавить(ДанныеФайла); - КонецЦикла; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "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.1.2.2"; - Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДатуМодификацииФайла"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.2.1.2"; - Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ПереместитьФайлыИзИнформационнойБазыВРегистрСведений"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.2.1.2"; - Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДатуЗаема"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.15"; - Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаменитьПраваВНастройкахПравПапокФайлов"; - -КонецПроцедуры - // В справочнике ВерсииФайлов из данных в Код(Строка) заполняет НомерВерсии(Число). Процедура ЗаполнитьНомерВерсииИзКодаСправочника() Экспорт @@ -3706,7 +4121,7 @@ Пока Выборка.Следующий() Цикл Объект = Выборка.Ссылка.ПолучитьОбъект(); Объект.ОбменДанными.Загрузка = Истина; - Объект.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Объект.Расширение); + Объект.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Объект.Расширение); ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); КонецЦикла; @@ -3819,9 +4234,9 @@ УстановитьПривилегированныйРежим(Истина); - МенеджерЗаписи = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ВерсияФайла = ВерсияСсылка; - МенеджерЗаписи.ХранимыйФайл = ХранилищеФайла; + МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ВерсияСсылка; + МенеджерЗаписи.ДвоичныеДанныеФайла = ХранилищеФайла; МенеджерЗаписи.Записать(Истина); КонецПроцедуры @@ -3829,14 +4244,14 @@ // Удаляет запись в регистре ХранимыеФайлыВерсий. // // Параметры: -// ВерсияСсылка - ссылка на версию файла. +// Файл - ссылка на файл. // -Процедура УдалитьЗаписьИзРегистраХранимыеФайлыВерсий(ВерсияСсылка) Экспорт +Процедура УдалитьЗаписьИзРегистраДвоичныеДанныеФайлов(Файл) Экспорт УстановитьПривилегированныйРежим(Истина); - НаборЗаписей = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ВерсияФайла.Установить(ВерсияСсылка); + НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Файл.Установить(Файл); НаборЗаписей.Записать(); КонецПроцедуры @@ -3943,14 +4358,28 @@ // Ставит файлу признак Зашифрован. Процедура УстановитьПризнакЗашифрован(ФайлСсылка, Зашифрован, УникальныйИдентификатор = Неопределено) Экспорт - ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); - - ФайлОбъект.Зашифрован = Зашифрован; - // Чтобы прошла запись ранее подписанного объекта. - ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаДанных.Заблокировать(); + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); + + ФайлОбъект.Зашифрован = Зашифрован; + // Чтобы прошла запись ранее подписанного объекта. + ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; КонецПроцедуры @@ -3984,31 +4413,44 @@ КонецПроцедуры // Получает количество версий с неизвлеченным текстом. -Функция ПолучитьКоличествоВерсийСНеизвлеченнымТекстом() Экспорт +Процедура ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(ДополнительныеПараметры, АдресВоВременномХранилище) Экспорт - Запрос = Новый Запрос; + КоличествоФайлов = 0; - Запрос.Текст = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(*) КАК ЧислоВерсий - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; + ТипыФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Запрос.Текст = Запрос.Текст + " - | И НЕ ВерсииФайлов.Зашифрован"; - КонецЕсли; + Для Каждого Тип Из ТипыФайлов Цикл + + МетаданныеСправочникаФайлов = Метаданные.НайтиПоТипу(Тип); + + Запрос = Новый Запрос; + + ТекстЗапроса = + "ВЫБРАТЬ + | ЕСТЬNULL(КОЛИЧЕСТВО(Файлы.Ссылка), 0) КАК КоличествоФайлов + |ИЗ + | &ИмяСправочника КАК Файлы + |ГДЕ + | Файлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; - Выборка = Запрос.Выполнить().Выбрать(); - Выборка.Следующий(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + ТекстЗапроса = ТекстЗапроса + " + | И НЕ Файлы.Зашифрован"; + КонецЕсли; - Результат = Выборка.ЧислоВерсий; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + МетаданныеСправочникаФайлов.Имя); + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + КоличествоФайлов = КоличествоФайлов + Выборка.КоличествоФайлов; + КонецЕсли + + КонецЦикла; - Возврат Результат; + ПоместитьВоВременноеХранилище(КоличествоФайлов, АдресВоВременномХранилище); -КонецФункции +КонецПроцедуры // Записывает кодировку версии файла. // @@ -4016,12 +4458,12 @@ // ВерсияСсылка - СправочникСсылка.ВерсииФайлов - ссылка на версию файла. // Кодировка - Строка - новая кодировка версии файла. // -Процедура ЗаписатьКодировкуВерсииФайла(ВерсияСсылка, Кодировка) +Процедура ЗаписатьКодировкуВерсииФайла(ВерсияСсылка, Кодировка) Экспорт УстановитьПривилегированныйРежим(Истина); - МенеджерЗаписи = РегистрыСведений.КодировкиВерсийФайлов.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ВерсияФайла = ВерсияСсылка; + МенеджерЗаписи = РегистрыСведений.КодировкиФайлов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Файл = ВерсияСсылка; МенеджерЗаписи.Кодировка = Кодировка; МенеджерЗаписи.Записать(Истина); @@ -4037,62 +4479,79 @@ Процедура ЗаписатьКодировкуВерсииФайлаИИзвлеченныйТекст(ВерсияСсылка, Кодировка, ИзвлеченныйТекст) Экспорт ЗаписатьКодировкуВерсииФайла(ВерсияСсылка, Кодировка); - ЗаписатьРезультатИзвлеченияТекста(ВерсияСсылка, Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен, + ЗаписатьРезультатИзвлеченияТекстаПриРедактировании(ВерсияСсылка, Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен, ИзвлеченныйТекст); КонецПроцедуры // Записывает на сервер результат извлечения текста - извлеченный текст и СтатусИзвлеченияТекста. -Процедура ЗаписатьРезультатИзвлеченияТекста(ВерсияСсылка, РезультатИзвлечения, АдресВременногоХранилищаТекста) +Процедура ЗаписатьРезультатИзвлеченияТекстаПриРедактировании(ВерсияСсылка, РезультатИзвлечения, АдресВременногоХранилищаТекста) ФайлЗаблокирован = Ложь; - Файл = ВерсияСсылка.Владелец; - Если Файл.ТекущаяВерсия = ВерсияСсылка Тогда - - Попытка - ЗаблокироватьДанныеДляРедактирования(Файл); - ФайлЗаблокирован = Истина; - Исключение - // Исключение, если объект уже заблокирован, в том числе и методом Заблокировать. - Возврат; - КонецПопытки; + МетаданныеВерсии = Метаданные.НайтиПоТипу(ТипЗнч(ВерсияСсылка)); + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("РодительскаяВерсия", МетаданныеВерсии) Тогда + Файл = ВерсияСсылка.Владелец; + Если Файл.ТекущаяВерсия = ВерсияСсылка Тогда + + Попытка + ЗаблокироватьДанныеДляРедактирования(Файл); + ФайлЗаблокирован = Истина; + Исключение + // Исключение, если объект уже заблокирован, в том числе и методом Заблокировать. + Возврат; + КонецПопытки; + + КонецЕсли; + Иначе + Файл = ВерсияСсылка; КонецЕсли; Текст = ""; - - ВерсияОбъект = ВерсияСсылка.ПолучитьОбъект(); - - Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда - - Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда - Текст = ФайловыеФункцииСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - Иначе - Текст = АдресВременногоХранилищаТекста; - КонецЕсли; - - ВерсияОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); - ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - - КонецЕсли; - - Если РезультатИзвлечения = "НеИзвлечен" Тогда - ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - ИначеЕсли РезультатИзвлечения = "Извлечен" Тогда - ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - ИначеЕсли РезультатИзвлечения = "ИзвлечьНеУдалось" Тогда - ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; - КонецЕсли; - НачатьТранзакцию(); Попытка + БлокировкаВерсии = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаВерсии.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ВерсияСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ВерсияСсылка); + ЭлементБлокировкиДанных.Режим = БлокировкаВерсии.Исключительный; + БлокировкаВерсии.Заблокировать(); + + ВерсияОбъект = ВерсияСсылка.ПолучитьОбъект(); + + Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + + Если ЭтоАдресВременногоХранилища(АдресВременногоХранилищаТекста) Тогда + Текст = РаботаСФайламиСлужебный.ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + Иначе + Текст = АдресВременногоХранилищаТекста; + КонецЕсли; + + ВерсияОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + + КонецЕсли; + + Если РезультатИзвлечения = "НеИзвлечен" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИначеЕсли РезультатИзвлечения = "Извлечен" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + ИначеЕсли РезультатИзвлечения = "ИзвлечьНеУдалось" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + КонецЕсли; + // Чтобы прошла запись ранее подписанного объекта. ВерсияОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); ВерсияОбъект.Записать(); Если Файл.ТекущаяВерсия = ВерсияСсылка Тогда + БлокировкаФайла = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаФайла.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Файл)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Файл); + ЭлементБлокировкиДанных.Режим = БлокировкаФайла.Исключительный; + БлокировкаФайла.Заблокировать(); + ФайлОбъект = Файл.ПолучитьОбъект(); ФайлОбъект.ТекстХранилище = ВерсияОбъект.ТекстХранилище; // Чтобы прошла запись ранее подписанного объекта. @@ -4117,4 +4576,672 @@ КонецПроцедуры +Процедура ЗарегистрироватьОбъектыДляПереносаЭлектронныхПодписейСВерсийФайловНаФайлы(Параметры) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЭлектронныеПодписи.ПодписанныйОбъект КАК Ссылка + |ИЗ + | РегистрСведенийЭлектронныеПодписи КАК ЭлектронныеПодписи + |ГДЕ + | ТИПЗНАЧЕНИЯ(ЭлектронныеПодписи.ПодписанныйОбъект) = ТИП(Справочник.ВерсииФайлов)"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "РегистрСведенийЭлектронныеПодписи", "РегистрСведений." + "ЭлектронныеПодписи"); + + МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); + +КонецПроцедуры + +Процедура ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы(Параметры) Экспорт + + ОбработкаЗавершена = Истина; + + ВыборкаСсылок = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.ВерсииФайлов"); + + ОбъектовОбработано = 0; + ПроблемныхОбъектов = 0; + + МассивСсылок = Новый Массив; + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировкиПоВерсии = Блокировка.Добавить("РегистрСведений." + "ЭлектронныеПодписи"); + ЭлементБлокировкиПоФайлу = Блокировка.Добавить("РегистрСведений." + "ЭлектронныеПодписи"); + + Пока ВыборкаСсылок.Следующий() Цикл + ВерсияСсылка = ВыборкаСсылок.Ссылка; + ЭлементБлокировкиПоВерсии.УстановитьЗначение("ПодписанныйОбъект", ВерсияСсылка); + ФайлСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВерсияСсылка, "Владелец"); + Если ЗначениеЗаполнено(ФайлСсылка) Тогда + ЭлементБлокировкиПоВерсии.УстановитьЗначение("ПодписанныйОбъект", ФайлСсылка); + КонецЕсли; + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + НаборЗаписейПоВерсии = РегистрыСведений["ЭлектронныеПодписи"].СоздатьНаборЗаписей(); + НаборЗаписейПоВерсии.Отбор.ПодписанныйОбъект.Установить(ВерсияСсылка); + НаборЗаписейПоВерсии.Прочитать(); + + Если НаборЗаписейПоВерсии.Количество() > 0 Тогда + Если ЗначениеЗаполнено(ФайлСсылка) Тогда + НаборЗаписейПоФайлу = РегистрыСведений["ЭлектронныеПодписи"].СоздатьНаборЗаписей(); + НаборЗаписейПоФайлу.Отбор.ПодписанныйОбъект.Установить(ФайлСсылка); + НаборЗаписейПоФайлу.Прочитать(); + Если НаборЗаписейПоФайлу.Количество() = 0 Тогда + Для Каждого Запись Из НаборЗаписейПоВерсии Цикл + НоваяЗапись = НаборЗаписейПоФайлу.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + НоваяЗапись.ПодписанныйОбъект = ФайлСсылка; + КонецЦикла; + НаборЗаписейПоФайлу.Записать(); + КонецЕсли; + КонецЕсли; + НаборЗаписейПоВерсии.Очистить(); + НаборЗаписейПоВерсии.Записать(); + КонецЕсли; + + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ВерсияСсылка); + ОбъектовОбработано = ОбъектовОбработано + 1; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + // Если не удалось обработать какой-либо объект, требуется повторить попытку. + ОбъектовОбработано = ОбъектовОбработано - 1; + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать версию файла ""%1"" по причине: + |%2'"), + ВерсияСсылка, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.ВерсииФайлов, ВерсияСсылка, ТекстСообщения); + КонецПопытки; + КонецЦикла; + + Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.ВерсииФайлов") Тогда + ОбработкаЗавершена = Ложь; + КонецЕсли; + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы не удалось обработать некоторые версии файлов (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.ВерсииФайлов, + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедура ПеренестиЭлектронныеПодписиСВерсийФайловНаФайлы обработала очередную порцию версий файлов: %1'"), + ОбъектовОбработано)); + КонецЕсли; + + Параметры.ОбработкаЗавершена = ОбработкаЗавершена; + +КонецПроцедуры + +Функция ОбъектыПриПереносеЭлектронныхПодписейСВерсийФайловНаФайлы(Читаемые) Экспорт + + Если Читаемые Тогда + Возврат "Справочник.ВерсииФайлов, " + + Метаданные.РегистрыСведений["ЭлектронныеПодписи"].ПолноеИмя(); + Иначе + Возврат Метаданные.РегистрыСведений["ЭлектронныеПодписи"].ПолноеИмя(); + КонецЕсли; + +КонецФункции + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// для которых необходимо обновить записи в реестре. +// +Процедура ЗарегистрироватьОбъектыДляПереносаЭлектронныхПодписейИСертификатовШифрования(Параметры) Экспорт + + ТекстЗапросаДвеТабличныеЧасти = + "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | ТаблицаОбъектов КАК Файлы + |ГДЕ + | (ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТабличнаяЧастьУдалитьСертификатыШифрования КАК УдалитьСертификатыШифрования + | ГДЕ + | УдалитьСертификатыШифрования.Ссылка = Файлы.Ссылка) + | ИЛИ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТабличнаяЧастьУдалитьЭлектронныеПодписи КАК УдалитьЭлектронныеПодписи + | ГДЕ + | УдалитьЭлектронныеПодписи.Ссылка = Файлы.Ссылка))"; + + ТекстЗапросаТЧУдалитьСертификатыШифрования = + "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | ТаблицаОбъектов КАК Файлы + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТабличнаяЧастьУдалитьСертификатыШифрования КАК УдалитьСертификатыШифрования + | ГДЕ + | УдалитьСертификатыШифрования.Ссылка = Файлы.Ссылка)"; + + ТекстЗапросаТЧУдалитьЭлектронныеПодписи = + "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | ТаблицаОбъектов КАК Файлы + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТабличнаяЧастьУдалитьЭлектронныеПодписи КАК УдалитьЭлектронныеПодписи + | ГДЕ + | УдалитьЭлектронныеПодписи.Ссылка = Файлы.Ссылка)"; + + Запрос = Новый Запрос; + ПолныеИменаСправочников = ПолныеИменаСправочниковПрисоединенныхФайлов(); + + Для Каждого ПолноеИмя Из ПолныеИменаСправочников Цикл + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + + ЕстьТЧУдалитьСертификатыШифрования = + ОбъектМетаданных.ТабличныеЧасти.Найти("УдалитьСертификатыШифрования") <> Неопределено; + + ЕстьТЧУдалитьЭлектронныеПодписи = + ОбъектМетаданных.ТабличныеЧасти.Найти("УдалитьЭлектронныеПодписи") <> Неопределено; + + Если ЕстьТЧУдалитьСертификатыШифрования И ЕстьТЧУдалитьЭлектронныеПодписи Тогда + ТекущийТекстЗапроса = ТекстЗапросаДвеТабличныеЧасти; + + ИначеЕсли ЕстьТЧУдалитьСертификатыШифрования Тогда + ТекущийТекстЗапроса = ТекстЗапросаТЧУдалитьСертификатыШифрования; + + ИначеЕсли ЕстьТЧУдалитьЭлектронныеПодписи Тогда + ТекущийТекстЗапроса = ТекстЗапросаТЧУдалитьЭлектронныеПодписи; + Иначе + Продолжить; + КонецЕсли; + + Если ЗначениеЗаполнено(Запрос.Текст) Тогда + Запрос.Текст = Запрос.Текст + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |"; + КонецЕсли; + + ТекущийТекстЗапроса = СтрЗаменить(ТекущийТекстЗапроса, "ТаблицаОбъектов", ПолноеИмя); + + ТекущийТекстЗапроса = СтрЗаменить(ТекущийТекстЗапроса, + "ТабличнаяЧастьУдалитьСертификатыШифрования", ПолноеИмя + ".УдалитьСертификатыШифрования"); + + ТекущийТекстЗапроса = СтрЗаменить(ТекущийТекстЗапроса, + "ТабличнаяЧастьУдалитьЭлектронныеПодписи", ПолноеИмя + ".УдалитьЭлектронныеПодписи"); + + Запрос.Текст = Запрос.Текст + ТекущийТекстЗапроса; + КонецЦикла; + + МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); + +КонецПроцедуры + +Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений(Параметры) Экспорт + + ОбработкаЗавершена = Истина; + + ПолныеИменаСправочников = ПолныеИменаСправочниковПрисоединенныхФайлов(); + + Для Каждого ПолноеИмяСправочника Из ПолныеИменаСправочников Цикл + ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы(Параметры, + ПолноеИмяСправочника, ОбработкаЗавершена); + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбработкаЗавершена; + +КонецПроцедуры + +Функция ПолныеИменаСправочниковПрисоединенныхФайлов() Экспорт + + Массив = Новый Массив; + + Для Каждого ТипПрисоединенногоФайла Из Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы() Цикл + ПолноеИмя = Метаданные.НайтиПоТипу(ТипПрисоединенногоФайла).ПолноеИмя(); + Если СтрЗаканчиваетсяНа(ВРег(ПолноеИмя), ВРег("ВерсииПрисоединенныхФайлов")) Тогда + Продолжить; + КонецЕсли; + Массив.Добавить(Метаданные.НайтиПоТипу(ТипПрисоединенногоФайла).ПолноеИмя()); + КонецЦикла; + + Если Массив.Найти("Справочник.Файлы") = Неопределено Тогда + Массив.Добавить("Справочник.Файлы"); + КонецЕсли; + + Если Массив.Найти("Справочник.ВерсииФайлов") = Неопределено Тогда + Массив.Добавить("Справочник.ВерсииФайлов"); + КонецЕсли; + + Возврат Массив; + +КонецФункции + +Функция ИзменяемыеОбъектыПриПереносеЭлектронныхПодписейИСертификатовШифрования() Экспорт + + Возврат Метаданные.РегистрыСведений["ЭлектронныеПодписи"].ПолноеИмя() + ", " + + Метаданные.РегистрыСведений["СертификатыШифрования"].ПолноеИмя(); + +КонецФункции + +// Позволяет перенести элементы табличных частей УдалитьЭлектронныеПодписи и УдалитьСертификатыШифрования +// в регистры сведений ЭлектронныеПодписи и СертификатыШифрования. +// +// Параметры: +// ПараметрыОбновления - Структура - структура параметров отложенного обработчика обновления. +// +// ПолноеИмяОбъектаМетаданных - Строка - полное имя объекта метаданных, из которого переносятся данные табличных частей +// УдалитьЭлектронныеПодписи и УдалитьСертификатыШифрования. +// ОбработкаЗавершена - Булево - Истина, если обработаны все данные при обновлении ИБ. +// +Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы(ПараметрыОбновления, ПолноеИмяОбъектаМетаданных, ОбработкаЗавершена) + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + + Если ОбъектМетаданных = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не указан объект для обработки электронных подписей и сертификатов шифрования."); + КонецЕсли; + + ЕстьТабличнаяЧастьЭП = ОбъектМетаданных.ТабличныеЧасти.Найти("УдалитьЭлектронныеПодписи") <> Неопределено; + ЕстьТабличнаяЧастьСШ = ОбъектМетаданных.ТабличныеЧасти.Найти("УдалитьСертификатыШифрования") <> Неопределено; + + ВыборкаСсылок = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(ПараметрыОбновления.Очередь, ПолноеИмяОбъектаМетаданных); + + ОбъектовОбработано = 0; + ПроблемныхОбъектов = 0; + + МассивСсылок = Новый Массив; + + НачатьТранзакцию(); + Попытка + Пока ВыборкаСсылок.Следующий() Цикл + МассивСсылок.Добавить(ВыборкаСсылок.Ссылка); + КонецЦикла; + + Если ЕстьТабличнаяЧастьЭП Тогда + ПеренестиДанныеЭлектроннойПодписиВРегистрСведений(МассивСсылок, + ПолноеИмяОбъектаМетаданных, ОбъектМетаданных); + КонецЕсли; + + Если ЕстьТабличнаяЧастьСШ Тогда + ПеренестиДанныеСертификатовВРегистрСведений(МассивСсылок, ПолноеИмяОбъектаМетаданных); + КонецЕсли; + + Для Каждого ОбъектСЭП Из МассивСсылок Цикл + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ОбъектСЭП); + КонецЦикла; + ОбъектовОбработано = МассивСсылок.Количество(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + // Если не удалось обработать какой-либо объект, требуется повторить попытку. + ПроблемныхОбъектов = ПроблемныхОбъектов + МассивСсылок.Количество(); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать объект: %1 по причине: + |%2'"), + ОбъектМетаданных, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, ОбъектМетаданных, , ТекстСообщения); + КонецПопытки; + + Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(ПараметрыОбновления.Очередь, ПолноеИмяОбъектаМетаданных) Тогда + ОбработкаЗавершена = Ложь; + КонецЕсли; + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений не удалось обработать некоторые объекты (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, + ОбъектМетаданных, + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений обработала очередную порцию объектов: %1'"), + ОбъектовОбработано)); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы. +Процедура ПеренестиДанныеЭлектроннойПодписиВРегистрСведений(МассивОбъектов, ПолноеИмяОбъектаМетаданных, ОбъектМетаданных) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТЧЭлектронныеПодписи.Ссылка КАК ПодписанныйОбъект, + | ТЧЭлектронныеПодписи.ДатаПодписи, + | ТЧЭлектронныеПодписи.ИмяФайлаПодписи, + | ТЧЭлектронныеПодписи.Комментарий, + | ТЧЭлектронныеПодписи.КомуВыданСертификат, + | ТЧЭлектронныеПодписи.Отпечаток, + | ТЧЭлектронныеПодписи.Подпись, + | ТЧЭлектронныеПодписи.УстановившийПодпись, + | ТЧЭлектронныеПодписи.НомерСтроки КАК ПорядковыйНомер, + | ТЧЭлектронныеПодписи.Сертификат, + | ТЧЭлектронныеПодписи.ПодписьВерна КАК ПодписьВерна, + | ТЧЭлектронныеПодписи.ДатаПроверкиПодписи КАК ДатаПроверкиПодписи + |ИЗ + | " + ПолноеИмяОбъектаМетаданных + ".УдалитьЭлектронныеПодписи КАК ТЧЭлектронныеПодписи + |ГДЕ + | ТЧЭлектронныеПодписи.Ссылка В(&МассивОбъектов) + |ИТОГИ + | ПО ПодписанныйОбъект"; + + Если ОбъектМетаданных = Метаданные.Справочники.ВерсииФайлов Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ТЧЭлектронныеПодписи.Ссылка КАК ПодписанныйОбъект", + "ТЧЭлектронныеПодписи.Ссылка.Владелец КАК ПодписанныйОбъект"); + КонецЕсли; + + РеквизитыТЧ = ОбъектМетаданных.ТабличныеЧасти.УдалитьЭлектронныеПодписи.Реквизиты; + + Если РеквизитыТЧ.Найти("ПодписьВерна") = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТЧЭлектронныеПодписи.ПодписьВерна", "ЛОЖЬ"); + КонецЕсли; + + Если РеквизитыТЧ.Найти("ДатаПроверкиПодписи") = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТЧЭлектронныеПодписи.ДатаПроверкиПодписи", "Неопределено"); + КонецЕсли; + + Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов); + Выгрузка = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Для Каждого Строка Из Выгрузка.Строки Цикл + Если Не ЗначениеЗаполнено(Строка.ПодписанныйОбъект) Тогда + Продолжить; + КонецЕсли; + НаборЗаписей = РегистрыСведений["ЭлектронныеПодписи"].СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ПодписанныйОбъект.Установить(Строка.ПодписанныйОбъект); + Для Каждого Подстрока Из Строка.Строки Цикл + ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Подстрока); + КонецЦикла; + НаборЗаписей.ОбменДанными.Загрузка = Истина; + НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + НаборЗаписей.Записать(); + КонецЦикла; + +КонецПроцедуры + +// Для процедуры ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы. +Процедура ПеренестиДанныеСертификатовВРегистрСведений(МассивОбъектов, ПолноеИмяОбъектаМетаданных) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТЧСертификатыШифрования.Ссылка КАК ЗашифрованныйОбъект, + | ТЧСертификатыШифрования.Отпечаток, + | ТЧСертификатыШифрования.Сертификат, + | ТЧСертификатыШифрования.НомерСтроки КАК ПорядковыйНомер, + | ТЧСертификатыШифрования.Представление + |ИЗ + | " + ПолноеИмяОбъектаМетаданных + ".УдалитьСертификатыШифрования КАК ТЧСертификатыШифрования + |ГДЕ + | ТЧСертификатыШифрования.Ссылка В(&МассивОбъектов) + |ИТОГИ + | ПО ЗашифрованныйОбъект"; + + Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов); + + Выгрузка = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Для Каждого Строка Из Выгрузка.Строки Цикл + НаборЗаписей = РегистрыСведений["СертификатыШифрования"].СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ЗашифрованныйОбъект.Установить(Строка.ЗашифрованныйОбъект); + Для Каждого Подстрока Из Строка.Строки Цикл + ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Подстрока); + КонецЦикла; + НаборЗаписей.ОбменДанными.Загрузка = Истина; + НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + НаборЗаписей.Записать(); + КонецЦикла; + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////////////////////////// +///// Общие файловые функции +// См. эту процедуру в модуле РаботаСФайламиСлужебный. +Процедура ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияСсылка, + РезультатИзвлечения, + АдресВременногоХранилищаТекста) Экспорт + + РаботаСФайламиСлужебный.ЗаписатьРезультатИзвлеченияТекста( + ФайлИлиВерсияСсылка, + РезультатИзвлечения, + АдресВременногоХранилищаТекста); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ПроверитьПодписи(ИсходныеДанные, ДанныеСтрок) Экспорт + + ДатаПроверкиПодписи = ТекущаяДатаСеанса(); + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + МенеджерКриптографии = МодульЭлектроннаяПодпись.МенеджерКриптографии("ПроверкаПодписи"); + + Для каждого СтрокаПодписи Из ДанныеСтрок Цикл + ОписаниеОшибки = ""; + ПодписьВерна = МодульЭлектроннаяПодпись.ПроверитьПодпись(МенеджерКриптографии, + ИсходныеДанные, СтрокаПодписи.АдресПодписи, ОписаниеОшибки, СтрокаПодписи.ДатаПодписи); + + СтрокаПодписи.ДатаПроверкиПодписи = ТекущаяДатаСеанса(); + СтрокаПодписи.ПодписьВерна = ПодписьВерна; + РаботаСФайламиСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(СтрокаПодписи, ОписаниеОшибки); + КонецЦикла; + +КонецПроцедуры + +// Возвращает номер по нарастанию. Предыдущее значение берется из регистра сведений НомераОтсканированныхФайлов. +// Параметры: +// Владелец - ЛюбаяСсылка - владелец файла. +// +// Возвращаемое значение: +// Число - новый номер для сканирования. +// +Функция ПолучитьНовыйНомерДляСканирования(Владелец) Экспорт + + // Подготовить структуру отбора по измерениям. + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Владелец", Владелец); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераОтсканированныхФайлов"); + ЭлементБлокировки.УстановитьЗначение("Владелец", Владелец); + Блокировка.Заблокировать(); + + // Получить структуру с данными ресурсов записи. + СтруктураРесурсов = РегистрыСведений.НомераОтсканированныхФайлов.Получить(СтруктураОтбора); + + // Получить максимальный номер из регистра. + Номер = СтруктураРесурсов.Номер; + Номер = Номер + 1; // увеличим на 1 + + // Запишем новый номер в регистр. + НаборЗаписей = РегистрыСведений.НомераОтсканированныхФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Владелец.Установить(Владелец); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Владелец = Владелец; + НоваяЗапись.Номер = Номер; + + НаборЗаписей.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат Номер; + +КонецФункции + +// Заносит номер в регистр сведений НомераОтсканированныхФайлов. +// +// Параметры: +// Владелец - ЛюбаяСсылка - владелец файла. +// НовыйНомер - Число - максимальный номер для сканирования. +// +Процедура ЗанестиМаксимальныйНомерДляСканирования(Владелец, НовыйНомер) Экспорт + + // Подготовить структуру отбора по измерениям. + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Владелец", Владелец); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераОтсканированныхФайлов"); + ЭлементБлокировки.УстановитьЗначение("Владелец", Владелец); + Блокировка.Заблокировать(); + + // Получить структуру с данными ресурсов записи. + СтруктураРесурсов = РегистрыСведений.НомераОтсканированныхФайлов.Получить(СтруктураОтбора); + + // Получить максимальный номер из регистра. + Номер = СтруктураРесурсов.Номер; + Если НовыйНомер <= Номер Тогда // Кто-то другой уже записал бОльший номер. + ОтменитьТранзакцию(); + Возврат; + КонецЕсли; + + Номер = НовыйНомер; + + // Запишем новый номер в регистр. + НаборЗаписей = РегистрыСведений.НомераОтсканированныхФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Владелец.Установить(Владелец); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Владелец = Владелец; + НоваяЗапись.Номер = Номер; + + НаборЗаписей.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция ПоместитьФайлыВоВременноеХранилище(Параметры) Экспорт + + Перем ЗаписьZipФайла, ИмяАрхива; + + Результат = Новый Массив; + + ИмяВременнойПапки = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяВременнойПапки); + ИспользованныеИменаФайлов = Новый Соответствие; + + Для Каждого ФайлВложение Из Параметры.МассивФайлов Цикл + ОписаниеФайла = ДанныеФайлаДляОтправкиПоПочте(ФайлВложение, Параметры.ИдентификаторФормы); + Результат.Добавить(ОписаниеФайла); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ДанныеФайлаДляОтправкиПоПочте(ФайлВложение, ИдентификаторФормы) + + ДанныеФайлаИДвоичныеДанные = ПолучитьДанныеФайла(ФайлВложение, ИдентификаторФормы); + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ДанныеФайлаИДвоичныеДанные.Наименование, ДанныеФайлаИДвоичныеДанные.Расширение); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ДанныеФайлаИДвоичныеДанные.СсылкаНаДвоичныеДанныеФайла); + + Возврат ОписаниеФайла; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////// +// Печать табличного документа со штампом электронной подписи. + +Функция ТабличныйДокументСоШтампом(СсылкаНаФайл, Ссылка) Экспорт + + ДанныеФайла = РаботаСФайлами.ДанныеФайла(СсылкаНаФайл); + ВременныйФайл = ПолучитьИмяВременногоФайла(".mxl"); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + ДвоичныеДанные.Записать(ВременныйФайл); + + ТабличныйДокумент = Новый ТабличныйДокумент; + ТабличныйДокумент.Прочитать(ВременныйФайл); + + УдалитьФайлы(ВременныйФайл); + + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + ПараметрыШтампа = Новый Структура; + ПараметрыШтампа.Вставить("ТекстОтметки", ""); + ПараметрыШтампа.Вставить("Логотип"); + + ЭлектронныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(Ссылка); + + ВладелецФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ВладелецФайла"); + + СведенияОФайле = Новый Структура; + СведенияОФайле.Вставить("ВладелецФайла", ВладелецФайла); + + Штампы = Новый Массив; + Для Каждого Подпись Из ЭлектронныеПодписи Цикл + Сертификат = Подпись.Сертификат; + СертификатКриптографии = Новый СертификатКриптографии(Сертификат.Получить()); + РаботаСФайламиПереопределяемый.ПриПечатиФайлаСоШтампом(ПараметрыШтампа, СертификатКриптографии); + + Штамп = МодульЭлектроннаяПодпись.ШтампВизуализацииЭлектроннойПодписи(СертификатКриптографии, + Подпись.ДатаПодписи, ПараметрыШтампа.ТекстОтметки, ПараметрыШтампа.Логотип); + Штампы.Добавить(Штамп); + КонецЦикла; + + МодульЭлектроннаяПодпись.ДобавитьШтампыВТабличныйДокумент(ТабличныйДокумент, Штампы); + + Возврат ТабличныйДокумент; +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl index 4c2d7c922..d456dd89e 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl @@ -26,7 +26,7 @@ ОткрытьФорму("Обработка.ПереносФайловВТома.Форма"); -КонецПроцедуры +КонецПроцедуры // На основе переданного пути к файлу на диске создает Файл его и открывает карточку. // @@ -107,12 +107,12 @@ ФайлКлиента = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлКлиента); + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлКлиента); - ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + ОбщиеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); ИзвлекатьТекстыФайловНаКлиенте = НЕ ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере; Если ИзвлекатьТекстыФайловНаКлиенте Тогда - АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + АдресВременногоХранилищаТекста = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( ФайлКлиента.ПолноеИмя, ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); Иначе @@ -125,16 +125,6 @@ ИмяСоздания = ФайлКлиента.ИмяБезРасширения; КонецЕсли; - ИмяФайла = ИмяСоздания + ФайлКлиента.Расширение; - РазмерВМб = ФайлКлиента.Размер() / (1024 * 1024); - - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идет сохранение файла ""%1"" (%2 Мб). - |Пожалуйста, подождите...'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - Состояние(ТекстСостояния); - // Помещение файла во временное хранилище. АдресВременногоХранилищаФайла = ""; @@ -162,19 +152,19 @@ Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла, СведенияОФайле); Результат.ФайлДобавлен = Истина; Исключение - Результат.ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); + Результат.ТекстОшибки = РаботаСФайламиСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); КонецПопытки; - Состояние(); Если Результат.ТекстОшибки <> "" Тогда Возврат Результат; КонецЕсли; ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("Владелец", ПараметрыВыполнения.ВладелецФайла); - ПараметрыОповещения.Вставить("Файл", Результат.ФайлСсылка); - ПараметрыОповещения.Вставить("Событие", "СозданФайл"); - Оповестить("Запись_Файл", ПараметрыОповещения); + ПараметрыОповещения.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); + ПараметрыОповещения.Вставить("Файл" , Результат.ФайлСсылка); + ПараметрыОповещения.Вставить("Событие" , "СозданФайл"); + ПараметрыОповещения.Вставить("ЭтоНовый" , Истина); + Оповестить("Запись_Файл", ПараметрыОповещения, Результат.ФайлСсылка); ПоказатьОповещениеПользователя( НСтр("ru = 'Создание:'"), @@ -186,10 +176,1204 @@ КонецФункции +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. +Процедура ДобавитьФайлыРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + + Если Не ДополнительныеПараметры.Свойство("Фильтр") Тогда + ДополнительныеПараметры.Вставить("Фильтр",""); + КонецЕсли; + + Если РасширениеРаботыСФайламиПодключено Тогда + + Фильтр = ДополнительныеПараметры.Фильтр; + ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; + Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда + ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; + КонецЕсли; + + ВыбранныеФайлы = Новый Массив; + + Если Не ДополнительныеПараметры.Свойство("ПолноеИмяФайла") Тогда + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ВыборФайла.МножественныйВыбор = Истина; + ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); + ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*"); + Если ВыборФайла.Выбрать() Тогда + ВыбранныеФайлы = ВыборФайла.ВыбранныеФайлы; + КонецЕсли; + Иначе + ВыбранныеФайлы.Добавить(ДополнительныеПараметры.ПолноеИмяФайла); + КонецЕсли; + + ИмяСоздаваемогоФайла = ""; + Если ДополнительныеПараметры.Свойство("ИмяСоздаваемогоФайла") Тогда + ИмяСоздаваемогоФайла = ДополнительныеПараметры.ИмяСоздаваемогоФайла; + КонецЕсли; + + Если ВыбранныеФайлы.Количество() > 0 Тогда + ПрисоединенныеФайлыМассив = Новый Массив; + ПоместитьВыбранныеФайлыВХранилище( + ВыбранныеФайлы, + ВладелецФайла, + ПрисоединенныеФайлыМассив, + ИдентификаторФормы, + ИмяСоздаваемогоФайла, + ДополнительныеПараметры.ГруппаФайлов); + + Если ПрисоединенныеФайлыМассив.Количество() = 1 И ОткрыватьКарточкуПослеСозданияИзФайла Тогда + ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), + ПрисоединенныйФайл, + БиблиотекаКартинок.Информация32); + + ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + КонецЕсли; + + Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда + ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); + ОповеститьОбИзменении(ВладелецФайла); + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыОповещения.Вставить("Файл" , ПрисоединенныеФайлыМассив[0]); + ПараметрыОповещения.Вставить("Событие" , "СозданФайл"); + ПараметрыОповещения.Вставить("ЭтоНовый" , Истина); + Оповестить("Запись_Файл", ПараметрыОповещения, ПрисоединенныеФайлыМассив); + КонецЕсли; + + КонецЕсли; + + Иначе // Если веб-клиент без подключенного расширения. + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоместитьВыбранныеФайлыВХранилищеВеб(ОписаниеОповещения, ВладелецФайла, ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +// Показывает стандартное предупреждение. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПредставлениеКоманды - Строка - Необязательный. Имя команды, для выполнения которой необходимо расширение. +// +Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт + Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда + ТекстПредупреждения = НСтр("ru = 'Выполнение команды ""%1"" в браузерах + |Google Chrome и Mozilla Firefox не поддерживается.'"); + Иначе + ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо + |установить расширение для веб-клиента 1С:Предприятие.'"); + КонецЕсли; + Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды); + Иначе + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, " ""%1""", ""); + КонецЕсли; + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Неопределено); +КонецПроцедуры + +// Возвращает путь к рабочему каталогу пользователя. +Функция РабочийКаталогПользователя() Экспорт + + Возврат РаботаСФайламиСлужебныйКлиентПовтИсп.РабочийКаталогПользователя(); + +КонецФункции + +// Сохраняет путь к рабочему каталогу пользователя в настройках. +// +// Параметры: +// ИмяКаталога - Строка - имя каталога. +// +Процедура УстановитьРабочийКаталогПользователя(ИмяКаталога) Экспорт + + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов", ИмяКаталога,,, Истина); + +КонецПроцедуры + +// Возвращает каталог "Мои Документы" + имя текущего пользователя или +// ранее использованную папку для выгрузки. +// +Функция КаталогВыгрузки() Экспорт + + Путь = ""; + +#Если Не ВебКлиент Тогда + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); + + Путь = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки"); + + Если Путь = Неопределено Тогда + Если НЕ ПараметрыКлиента.ЭтоБазоваяВерсияКонфигурации Тогда + Путь = КаталогМоиДокументы(); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", Путь); + КонецЕсли; + КонецЕсли; + +#КонецЕсли + + Возврат Путь; + +КонецФункции + +// Показывает пользователю диалог выбора файлов и возвращает +// массив - выбранные файлы для импорта. +// +Функция ИмпортируемыеФайлы() Экспорт + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + + МассивИменФайлов = Новый Массив; + + Если ДиалогОткрытияФайла.Выбрать() Тогда + МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; + + Для Каждого ИмяФайла Из МассивФайлов Цикл + МассивИменФайлов.Добавить(ИмяФайла); + КонецЦикла; + + КонецЕсли; + + Возврат МассивИменФайлов; + +КонецФункции + +// Проверяет имя файла на наличие некорректных символов. +// +// Параметры: +// ИмяФайла - Строка- проверяемое имя файла. +// +// УдалятьНекорректныеСимволы - Булево - Истина указывает удалять некорректные +// символы из переданной строки. +// +Процедура КорректноеИмяФайла(ИмяФайла, УдалятьНекорректныеСимволы = Ложь) Экспорт + + // Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru + // при этом были объединены запрещенные символы для файловых систем FAT и NTFS. + + СтрИсключения = ОбщегоНазначенияКлиентСервер.ПолучитьНедопустимыеСимволыВИмениФайла(); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В имени файла не должно быть следующих символов: %1'"), СтрИсключения); + + Результат = Истина; + + МассивНайденныхНедопустимыхСимволов = + ОбщегоНазначенияКлиентСервер.НайтиНедопустимыеСимволыВИмениФайла(ИмяФайла); + + Если МассивНайденныхНедопустимыхСимволов.Количество() <> 0 Тогда + + Результат = Ложь; + + Если УдалятьНекорректныеСимволы Тогда + ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла, ""); + КонецЕсли; + + КонецЕсли; + + Если Не Результат Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры + +// Рекурсивно обходит каталоги и подсчитывает количество файлов и их суммарный размер. +Процедура ОбходФайловРазмер(Путь, МассивФайлов, РазмерСуммарный, КоличествоСуммарное) Экспорт + + Для Каждого ВыбранныйФайл Из МассивФайлов Цикл + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + НовыйПуть = Строка(Путь); + + НовыйПуть = НовыйПуть + ПолучитьРазделительПути(); + + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, "*.*"); + + Если МассивФайловВКаталоге.Количество() <> 0 Тогда + ОбходФайловРазмер( + НовыйПуть, МассивФайловВКаталоге, РазмерСуммарный, КоличествоСуммарное); + КонецЕсли; + + Продолжить; + КонецЕсли; + + РазмерСуммарный = РазмерСуммарный + ВыбранныйФайл.Размер(); + КоличествоСуммарное = КоличествоСуммарное + 1; + + КонецЦикла; + +КонецПроцедуры + +// Возвращает путь к каталогу вида +// "C:\Documents and Settings\ИМЯ ПОЛЬЗОВАТЕЛЯ\Application Data\1C\ФайлыА8\". +// +Функция ВыбратьПутьККаталогуДанныхПользователя() Экспорт + + ИмяКаталога = ""; + Если РасширениеРаботыСФайламиПодключено() Тогда + ИмяКаталога = РабочийКаталогДанныхПользователя(); + КонецЕсли; + + Возврат ИмяКаталога; + +КонецФункции + +// Открывает Проводник Windows и выделяет указанный файл. +Функция ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) Экспорт + + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + + Если НЕ ФайлНаДиске.Существует() Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + ЗапуститьПриложение("explorer.exe /select, """ + ФайлНаДиске.ПолноеИмя + """"); + Иначе + ЗапуститьПриложение(ФайлНаДиске.Путь); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Возвращает результат подключения расширения работы с файлами. +// +// Возвращаемое значение: +// Булево - в тонком клиенте всегда Истина, в браузере Google Chrome +// всегда ложь. +// +Функция РасширениеРаботыСФайламиПодключено() Экспорт + Если КлиентПоддерживаетСинхронныеВызовы() Тогда + Возврат ПодключитьРасширениеРаботыСФайлами(); + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +// Описание процедуры см. ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами. +// +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) Экспорт + Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда + ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь); + Иначе + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +Процедура ОтправитьФайлыПоПочте(МассивФайлов, ИдентификаторФормы, ПараметрыОтправки, ЭтоФайл = Ложь) Экспорт + + Если МассивФайлов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Параметры = Новый Структура; + Параметры.Вставить("МассивФайлов", МассивФайлов); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Параметры.Вставить("ЭтоФайл", ЭтоФайл); + Параметры.Вставить("ПараметрыОтправки", ПараметрыОтправки); + + ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект, Параметры); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); + КонецЕсли; + +КонецПроцедуры + +Процедура ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт + + Если УчетнаяЗаписьНастроена <> Истина Тогда + Возврат; + КонецЕсли; + + СписокВложений = РаботаСФайламиСлужебныйВызовСервера.ПоместитьФайлыВоВременноеХранилище(ДополнительныеПараметры); + ПараметрыОтправки = ДополнительныеПараметры.ПараметрыОтправки; + + ПараметрыНовогоПисьма = Новый Структура; + ПараметрыНовогоПисьма.Вставить("Получатель", ПараметрыОтправки.Получатель); + ПараметрыНовогоПисьма.Вставить("Тема", ПараметрыОтправки.Тема); + ПараметрыНовогоПисьма.Вставить("Текст", ПараметрыОтправки.Текст); + ПараметрыНовогоПисьма.Вставить("Вложения", СписокВложений); + ПараметрыНовогоПисьма.Вставить("УдалятьФайлыПослеОтправки", Истина); + + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыНовогоПисьма); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции работы с криптографией. + +// Проверить подписи данных объекта в таблице. +// +// Параметры: +// Форма - УправляемаяФорма - с реквизитами: +// * Объект - ДанныеФормыСтруктура - как у объекта со свойствами Ссылка, Зашифрован. +// Например, СправочникОбъект.Файл, СправочникОбъект.ДокументПрисоединенныеФайлы. +// +// * ЭлектронныеПодписи - ДанныеФормыКоллекция - с полями: +// * ДатаПроверкиПодписи - Дата - (возвращаемое значение) - дата проверки. +// * Статус - Строка - (возвращаемое значение) - результат проверки. +// * АдресПодписи - Строка - адрес данных подписи во временном хранилище. +// +// СсылкаНаДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. +// - Строка - адрес во временном хранилище или навигационная ссылка. +// +// ВыделенныеСтроки - Массив - свойство таблицы формы параметра ЭлектронныеПодписи. +// - Неопределено - проверить все подписи. +// +Процедура ПроверитьПодписи(Форма, СсылкаНаДвоичныеДанные, ВыделенныеСтроки = Неопределено) Экспорт + + // 1. Получаем адрес двоичных данных, адреса двоичных данных подписей. + // 2. Если файл зашифрован, то расшифровываем, далее выполняем проверку. + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Форма", Форма); + ДополнительныеПараметры.Вставить("ВыделенныеСтроки", ВыделенныеСтроки); + + Если Не Форма.Объект.Зашифрован Тогда + ПроверитьПодписиПослеПодготовкиДанных(СсылкаНаДвоичныеДанные, ДополнительныеПараметры); + Возврат; + КонецЕсли; + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + + ОписаниеДанных = Новый Структура; + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + ОписаниеДанных.Вставить("Данные", СсылкаНаДвоичныеДанные); + ОписаниеДанных.Вставить("Представление", Форма.Объект.Ссылка); + ОписаниеДанных.Вставить("СертификатыШифрования", Форма.Объект.Ссылка); + ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); + + ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеРасшифровкиФайлаПриПроверкеПодписи", ЭтотОбъект, ДополнительныеПараметры); + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодписи. +Процедура ПроверитьПодписиПослеПроверкиСтроки(Результат, ДополнительныеПараметры) Экспорт + + СтрокаПодписи = ДополнительныеПараметры.СтрокаПодписи; + СтрокаПодписи.ДатаПроверкиПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); + СтрокаПодписи.ПодписьВерна = (Результат = Истина); + РаботаСФайламиСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(СтрокаПодписи, Результат); + + ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); + +КонецПроцедуры + +// Для формы файла. +Процедура УстановитьДоступностьКомандСпискаЭлектронныхПодписей(Форма) Экспорт + + Элементы = Форма.Элементы; + ЕстьПодписи = (Форма.ЭлектронныеПодписи.Количество() <> 0); + + Элементы.ЭлектронныеПодписиОткрыть.Доступность = ЕстьПодписи; + Элементы.ЭлектронныеПодписиПроверить.Доступность = ЕстьПодписи; + Элементы.ЭлектронныеПодписиПроверитьВсе.Доступность = ЕстьПодписи; + Элементы.ЭлектронныеПодписиСохранить.Доступность = ЕстьПодписи; + Элементы.ЭлектронныеПодписиУдалить.Доступность = ЕстьПодписи; + +КонецПроцедуры + +// Для формы файла. +Процедура УстановитьДоступностьКомандСпискаСертификатовШифрования(Форма) Экспорт + + Объект = Форма.Объект; + Элементы = Форма.Элементы; + + Элементы.СертификатыШифрованияОткрыть.Доступность = Объект.Зашифрован; + +КонецПроцедуры + +// Проверяет установлена ли компонента сканирования и есть ли хоть один сканер. +Функция ДоступнаКомандаСканировать() Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ПроинициализироватьКомпоненту() Тогда + Возврат Ложь; + КонецЕсли; + + Если ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ЕстьУстройства() Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Открывает диалог сканирования и просмотра картинки. +Процедура ДобавитьСоСканера(ПараметрыВыполнения) Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); + ПараметрыФормы.Вставить("ЭтоФайл", ПараметрыВыполнения.ЭтоФайл); + ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); + ПараметрыФормы.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла); + + ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ОткрытьФорму("Обработка.Сканирование.Форма.РезультатСканирования", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции работы с файлами операционной системы. + +// Открыть версию файла. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// +Процедура ОткрытьВерсиюФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +#Если НЕ ВебКлиент Тогда +// Извлекает текст из файла на диске на клиенте и помещает результат на сервер. +Процедура ИзвлечьТекстВерсии(ФайлИлиВерсияФайла, + АдресФайла, + Расширение, + УникальныйИдентификатор, + Кодировка = Неопределено) Экспорт + + ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Расширение); + + Если Не ПолучитьФайл(АдресФайла, ИмяФайлаСПутем, Ложь) Тогда + Возврат; + КонецЕсли; + + // Для варианта с хранением файлов на диске (на сервере) + // удаление Файла из временного хранилища после получения. + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + РезультатИзвлечения = "НеИзвлечен"; + АдресВременногоХранилищаТекста = ""; + + Текст = ""; + Если ИмяФайлаСПутем <> "" Тогда + + // Извлечение текста из файла. + Отказ = Ложь; + Текст = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекст(ИмяФайлаСПутем, Отказ, Кодировка); + + Если Отказ = Ложь Тогда + РезультатИзвлечения = "Извлечен"; + + Если Не ПустаяСтрока(Текст) Тогда + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + ТекстовыйФайл.Записать(Текст); + ТекстовыйФайл.Закрыть(); + + РезультатЗагрузки = ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); + Если РезультатЗагрузки <> Неопределено Тогда + АдресВременногоХранилищаТекста = РезультатЗагрузки; + КонецЕсли; + + УдалитьФайлы(ИмяВременногоФайла); + КонецЕсли; + Иначе + // Когда Текст извлечь "некому" - это нормальный случай, + // сообщение об ошибке не формируется. + РезультатИзвлечения = "ИзвлечьНеУдалось"; + КонецЕсли; + + КонецЕсли; + + УдалитьФайлы(ИмяФайлаСПутем); + + РаботаСФайламиСлужебныйВызовСервера.ЗаписатьРезультатИзвлеченияТекста( + ФайлИлиВерсияФайла, РезультатИзвлечения, АдресВременногоХранилищаТекста); + +КонецПроцедуры +#КонецЕсли + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. +Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт + + Ответ = ПроверитьЗанятыеФайлыПриЗавершенииРаботы(); + Если Ответ = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Ответ) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + ПредупреждениеПользователю = СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы(); + ПредупреждениеПользователю.ТекстГиперссылки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Открыть список редактируемых файлов (%1)'"), + Ответ.КоличествоЗанятыхФайлов); + ПредупреждениеПользователю.ТекстПредупреждения = НСтр("ru = 'Имеются занятые для редактирования файлы'"); + + ДействиеПриНажатииГиперссылки = ПредупреждениеПользователю.ДействиеПриНажатииГиперссылки; + + ПрикладнаяФормаПредупреждения = Неопределено; + Ответ.Свойство("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); + ПараметрыПрикладнойФормыПредупреждения = Неопределено; + Ответ.Свойство("ПараметрыПрикладнойФормыПредупреждения", ПараметрыПрикладнойФормыПредупреждения); + + Форма = Неопределено; + Ответ.Свойство("Форма", Форма); + ПараметрыФормы = Неопределено; + Ответ.Свойство("ПараметрыФормы", ПараметрыФормы); + + Если ПрикладнаяФормаПредупреждения <> Неопределено Тогда + ДействиеПриНажатииГиперссылки.ПрикладнаяФормаПредупреждения = ПрикладнаяФормаПредупреждения; + ДействиеПриНажатииГиперссылки.ПараметрыПрикладнойФормыПредупреждения = ПараметрыПрикладнойФормыПредупреждения; + КонецЕсли; + Если Форма <> Неопределено Тогда + ДействиеПриНажатииГиперссылки.Форма = Форма; + ДействиеПриНажатииГиперссылки.ПараметрыФормы = ПараметрыФормы; + КонецЕсли; + + Предупреждения.Добавить(ПредупреждениеПользователю); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Возвращает путь к рабочему каталогу данных пользователя. Этот каталог используется +// в качестве начального значения для рабочего каталога пользователя. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего +// каталога пользователя. В качестве результата возвращается Структура со свойствами: +// * Каталог - Строка - полное имя рабочего каталога данных пользователя. +// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. +// +Процедура ПолучитьРабочийКаталогДанныхПользователя(Оповещение) + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + + НачатьПолучениеРабочегоКаталогаДанныхПользователя(Новый ОписаниеОповещения( + "ПолучитьРабочийКаталогДанныхПользователяПослеПолучения", ЭтотОбъект, Контекст, + "ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения", ЭтотОбъект)); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. +Процедура ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + Результат = Новый Структура; + Результат.Вставить("Каталог", ""); + Результат.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить рабочий каталог данных пользователя по причине: + |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. +Процедура ПолучитьРабочийКаталогДанныхПользователяПослеПолучения(КаталогДанныхПользователя, Контекст) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Каталог", КаталогДанныхПользователя); + Результат.Вставить("ОписаниеОшибки", ""); + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + + +// Продолжение процедуры ПроверитьПодписи. +Процедура ПроверитьПодписиЦиклНачало(ДополнительныеПараметры) + + Если ДополнительныеПараметры.Коллекция.Количество() <= ДополнительныеПараметры.Индекс + 1 Тогда + ДополнительныеПараметры.Форма.ОбновитьОтображениеДанных(); + Возврат; + КонецЕсли; + + ДополнительныеПараметры.Индекс = ДополнительныеПараметры.Индекс + 1; + Элемент = ДополнительныеПараметры.Коллекция[ДополнительныеПараметры.Индекс]; + + ДополнительныеПараметры.Вставить("СтрокаПодписи", ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, + ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент))); + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.ПроверитьПодпись( + Новый ОписаниеОповещения("ПроверитьПодписиПослеПроверкиСтроки", ЭтотОбъект, ДополнительныеПараметры), + ДополнительныеПараметры.Данные, + ДополнительныеПараметры.СтрокаПодписи.АдресПодписи, + ДополнительныеПараметры.МенеджерКриптографии, + ДополнительныеПараметры.СтрокаПодписи.ДатаПодписи); + +КонецПроцедуры + +// Проверяет свойства файла в рабочем каталоге и в хранилище файлов, +// если требуется уточняет у пользователя и возвращает действие. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ИмяФайлаСПутем - Строка - полное имя файла с путем в рабочем каталоге. +// +// ДанныеФайла - Структура со свойствами: +// Размер - Число. +// ДатаМодификацииУниверсальная - Дата. +// ВРабочемКаталогеНаЧтение - Булево. +// +// Возвращаемое значение: +// Строка - возможные строки: +// "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". +// +Процедура ДействиеПриОткрытииФайлаВРабочемКаталоге(ОбработчикРезультата, ИмяФайлаСПутем, ДанныеФайла) + + Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда + ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); + Возврат; + КонецЕсли; + + Параметры = Новый Структура; + Параметры.Вставить("ДействиеНадФайлом", "ОткрытиеВРабочемКаталоге"); + Параметры.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ИмяФайлаСПутем); + + Файл = Новый Файл(Параметры.ПолноеИмяФайлаВРабочемКаталоге); + + Параметры.Вставить("ДатаИзмененияУниверсальнаяВХранилищеФайлов", + ДанныеФайла.ДатаМодификацииУниверсальная); + + Параметры.Вставить("ДатаИзмененияУниверсальнаяВРабочемКаталоге", + Файл.ПолучитьУниверсальноеВремяИзменения()); + + Параметры.Вставить("ДатаИзмененияВРабочемКаталоге", + МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге)); + + Параметры.Вставить("ДатаИзмененияВХранилищеФайлов", + МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов)); + + Параметры.Вставить("РазмерВРабочемКаталоге", Файл.Размер()); + Параметры.Вставить("РазмерВХранилищеФайлов", ДанныеФайла.Размер); + + РазницаДат = Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге + - Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов; + + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // С секунда - допустимая разница (на Win95 может быть такое). + + Если Параметры.РазмерВХранилищеФайлов <> 0 + И Параметры.РазмерВХранилищеФайлов <> Параметры.РазмерВРабочемКаталоге Тогда + // Дата одинаковая, но размер отличается - редкий, но возможный случай. + + Параметры.Вставить("Заголовок", + НСтр("ru = 'Размер файла отличается'")); + + Параметры.Вставить("Сообщение", + НСтр("ru = 'Размер файла в рабочем каталоге и в хранилище файлов отличается. + | + |Взять файл из хранилища файлов и заменить им существующий или + |открыть существующий без обновления?'")); + Иначе + // Все совпадает - и дата, и размер. + ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); + Возврат; + КонецЕсли; + + ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге + < Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда + // В хранилище файлов более новый файл. + + Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь Тогда + // Файл в рабочем каталоге для редактирования. + + Параметры.Вставить("Заголовок", НСтр("ru = 'В хранилище файлов новый файл'")); + + Параметры.Вставить("Сообщение", + НСтр("ru = 'Файл в хранилище файлов, отмеченный как занятый для редактирования, + |имеет более позднюю дату изменения (новее), чем в рабочем каталоге. + | + |Взять файл из хранилища файлов и заменить им существующий или + |открыть существующий без обновления?'")); + Иначе + // Файл в рабочем каталоге для чтения. + + // Обновление из хранилища файлов без вопросов. + ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); + Возврат; + КонецЕсли; + + ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге + > Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда + // В рабочем каталоге более новый файл. + + Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь + И ДанныеФайла.Редактирует = ПользователиКлиентСервер.ТекущийПользователь() Тогда + + // Файл в рабочем каталоге для редактирования и занят текущим пользователем. + ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); + Возврат; + Иначе + // Файл в рабочем каталоге для чтения. + + Параметры.Вставить("Заголовок", НСтр("ru = 'В рабочем каталоге новый файл'")); + + Параметры.Вставить( + "Сообщение", + НСтр("ru = 'Файл в рабочем каталоге имеет более позднюю дату изменения (новее), + |чем в хранилище файлов. Возможно, он был изменен. + | + |Открыть существующий файл или заменить его на файл + |из хранилища файлов c потерей изменений и открыть?'")); + КонецЕсли; + КонецЕсли; + + // ВыборДействияПриОбнаруженииОтличийФайла + ОткрытьФорму("ОбщаяФорма.ВыборДействияПриОбнаруженииОтличийФайла", Параметры, , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +// Возвращает каталог "Мои Документы". +// +Функция КаталогМоиДокументы() + Возврат КаталогДокументов(); +КонецФункции + +// Возвращает путь к рабочему каталогу пользователя. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего +// каталога пользователя. В качестве результата возвращается Структура со свойствами: +// * Каталог - Строка - полное имя рабочего каталога пользователя. +// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. +// +Процедура ПолучитьРабочийКаталогПользователя(Оповещение) + + ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); + КонецЕсли; + + ИмяКаталога = + СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов; + + // Уже установлен. + Если ИмяКаталога <> Неопределено + И НЕ ПустаяСтрока(ИмяКаталога) + И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда + + Результат = Новый Структура; + Результат.Вставить("Каталог", ИмяКаталога); + Результат.Вставить("ОписаниеОшибки", ""); + + ВыполнитьОбработкуОповещения(Оповещение, Результат); + Возврат; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("Каталог", ИмяКаталога); + + ПолучитьРабочийКаталогДанныхПользователя(Новый ОписаниеОповещения( + "ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьРабочийКаталогПользователя. +Процедура ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных(Результат, Контекст) Экспорт + + Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + +#Если НЕ ВебКлиент Тогда + + Если Результат.Каталог <> Контекст.Каталог Тогда + // Создать каталог для файлов. + Попытка + СоздатьКаталог(Контекст.Каталог); + ИмяКаталогаТестовое = Контекст.Каталог + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // Нет прав на создание каталога, или такой путь отсутствует, + // тогда установка настроек по умолчанию. + Контекст.Каталог = Неопределено; + КонецПопытки; + КонецЕсли; + +#КонецЕсли + + ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; + + Если Контекст.Каталог = Неопределено Тогда + УстановитьРабочийКаталогПользователя(Результат.Каталог); + Иначе + Результат.Каталог = Контекст.Каталог; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// Показывает напоминание о порядке работы с файлом в веб-клиенте, +// если включена настройка "Показывать подсказки при редактировании файлов". +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +Процедура ВывестиНапоминаниеПриРедактировании(ОбработчикРезультата) + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда + Если НЕ РасширениеРаботыСФайламиПодключено() Тогда + ТекстНапоминания = + НСтр("ru = 'Сейчас будет предложено открыть или сохранить файл. + | + |1. Нажмите кнопку ""Сохранить"" (""Save""). + | + |2. Выберите каталог для сохранения файла и запомните его + |(каталог понадобится для редактирования и помещения файла обратно в хранилище). + | + |3. Для редактирования файла перейдите в выбранный ранее каталог, + |найдите там сохраненный файл и откройте его.'"); + + СистемнаяИнформация = Новый СистемнаяИнформация; + Если СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Firefox") <> 0 Тогда + ТекстНапоминания = ТекстНапоминания + + " + | + |" + + НСтр("ru = '(По умолчанию браузер Mozilla Firefox автоматически сохраняет файлы в каталоге ""Мои документы"")'"); + КонецЕсли; + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + ПараметрыНапоминания = Новый Структура; + ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); + ПараметрыНапоминания.Вставить("ТекстФлажка", + НСтр("ru = 'Больше не показывать это сообщение'")); + ПараметрыНапоминания.Вставить("Заголовок", + НСтр("ru = 'Получение файла для просмотра или редактирования'")); + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( + ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); + + Возврат; + КонецЕсли; + КонецЕсли; + ВернутьРезультат(ОбработчикРезультата, Истина); +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодписи. +Процедура ПроверитьПодписиПослеСозданияМенеджераКриптографии(МенеджерКриптографии, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда + Возврат; + КонецЕсли; + + ДополнительныеПараметры.Вставить("Индекс", -1); + ДополнительныеПараметры.Вставить("МенеджерКриптографии", МенеджерКриптографии); + + ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодписи. +Процедура ПроверитьПодписиПослеПодготовкиДанных(Данные, ДополнительныеПараметры) + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + МодульЭлектроннаяПодписьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиентСервер"); + + ПроверятьЭлектронныеПодписиНаСервере = + МодульЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере; + + Если ДополнительныеПараметры.ВыделенныеСтроки = Неопределено Тогда + Коллекция = ДополнительныеПараметры.Форма.ЭлектронныеПодписи; + Иначе + Коллекция = ДополнительныеПараметры.ВыделенныеСтроки; + КонецЕсли; + + Если Не ПроверятьЭлектронныеПодписиНаСервере Тогда + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + ДополнительныеПараметры.Вставить("Данные", Данные); + ДополнительныеПараметры.Вставить("Коллекция", Коллекция); + ДополнительныеПараметры.Вставить("МодульЭлектроннаяПодписьКлиент", МодульЭлектроннаяПодписьКлиент); + МодульЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии( + Новый ОписаниеОповещения("ПроверитьПодписиПослеСозданияМенеджераКриптографии", + ЭтотОбъект, ДополнительныеПараметры), + "ПроверкаПодписи"); + Возврат; + КонецЕсли; + + Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда + АдресДанных = ПоместитьВоВременноеХранилище(Данные, ДополнительныеПараметры.ИдентификаторФормы); + Иначе + АдресДанных = Данные; + КонецЕсли; + + ДанныеСтрок = Новый Массив; + + Для каждого Элемент Из Коллекция Цикл + СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, + ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); + + ДанныеСтроки = Новый Структура; + ДанныеСтроки.Вставить("АдресПодписи", СтрокаПодписи.АдресПодписи); + ДанныеСтроки.Вставить("Статус", СтрокаПодписи.Статус); + ДанныеСтроки.Вставить("ПодписьВерна", СтрокаПодписи.ПодписьВерна); + ДанныеСтроки.Вставить("ДатаПодписи", СтрокаПодписи.ДатаПодписи); + ДанныеСтроки.Вставить("ОписаниеОшибки", СтрокаПодписи.ОписаниеОшибки); + ДанныеСтроки.Вставить("ДатаПроверкиПодписи", СтрокаПодписи.ДатаПроверкиПодписи); + ДанныеСтрок.Добавить(ДанныеСтроки); + КонецЦикла; + + РаботаСФайламиСлужебныйВызовСервера.ПроверитьПодписи(АдресДанных, ДанныеСтрок); + + Индекс = 0; + Для каждого Элемент Из Коллекция Цикл + СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, + ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); + + СтрокаПодписи.ПодписьВерна = ДанныеСтрок[Индекс].ПодписьВерна; + СтрокаПодписи.ДатаПроверкиПодписи = ДанныеСтрок[Индекс].ДатаПроверкиПодписи; + РаботаСФайламиСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(СтрокаПодписи, ДанныеСтрок[Индекс].ОписаниеОшибки); + Индекс = Индекс + 1; + КонецЦикла; + +КонецПроцедуры + +// Помещает файлы с диска в хранилище присоединенных файлов. +// +// Параметры: +// ВыбранныеФайлы - Массив - пути к файлам на диске. +// ВладелецФайла - Ссылка на владельца файла. +// НастройкиРаботыСФайлами - Структура. +// ПрисоединенныеФайлыМассив - Массив (возвращаемое значение) - заполняется ссылками +// на добавленные файлы. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// +Процедура ПоместитьВыбранныеФайлыВХранилище(Знач ВыбранныеФайлы, + Знач ВладелецФайла, + ПрисоединенныеФайлыМассив, + Знач ИдентификаторФормы, + Знач ИмяСоздаваемогоФайла = "", + Знач ГруппаФайлов = Неопределено) + + ОбщиеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + + ТекущаяПозиция = 0; + + ПоследнийСохраненныйФайл = Неопределено; + + Для Каждого ПолноеИмяФайла Из ВыбранныеФайлы Цикл + + ТекущаяПозиция = ТекущаяПозиция + 1; + + Файл = Новый Файл(ПолноеИмяФайла); + + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл); + + Если ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере Тогда + АдресВременногоХранилищаТекста = ""; + Иначе + АдресВременногоХранилищаТекста = + РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ПолноеИмяФайла, ИдентификаторФормы); + КонецЕсли; + + ВремяИзмененияУниверсальное = Файл.ПолучитьУниверсальноеВремяИзменения(); + + ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, Файл, ТекущаяПозиция, ИмяСоздаваемогоФайла); + ПоследнийСохраненныйФайл = Файл; + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при помещении файла + |""%1"" + |во временное хранилище.'"), + Файл.ПолноеИмя) ); + Продолжить; + КонецЕсли; + + АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; + + ИмяБезРасширения = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), Файл.ИмяБезРасширения, ИмяСоздаваемогоФайла); + // Создание карточки Файла в базе данных. + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ВладелецФайлов", ВладелецФайла); + ПараметрыФайла.Вставить("Автор", Неопределено); + ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Файл.Расширение)); + ПараметрыФайла.Вставить("ГруппаФайлов", ГруппаФайлов); + ПараметрыФайла.Вставить("ВремяИзменения"); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ВремяИзмененияУниверсальное); + + ПрисоединенныйФайл = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл( + ПараметрыФайла, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста); + + Если ПрисоединенныйФайл = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПрисоединенныеФайлыМассив.Добавить(ПрисоединенныйФайл); + + КонецЦикла; + + ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, ПоследнийСохраненныйФайл, , ИмяБезРасширения); + +КонецПроцедуры + +Процедура ОбновитьСостояниеОСохраненииФайлов(Знач ВыбранныеФайлы, + Знач Файл, + Знач ТекущаяПозиция = Неопределено, + ИмяСоздаваемогоФайла = ""); + + Если Файл = Неопределено Тогда + Возврат; + КонецЕсли; + + СохраняемоеИмяФайла = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), Файл.Имя, ИмяСоздаваемогоФайла); + + РазмерВМб = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(Файл.Размер() / (1024 * 1024)); + + Если ВыбранныеФайлы.Количество() > 1 Тогда + Если ТекущаяПозиция = Неопределено Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение файлов'"),, НСтр("ru = 'Сохранение файлов успешно завершено'")); + КонецЕсли; + Иначе + Если ТекущаяПозиция = Неопределено Тогда + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" (%2 Мб) сохранен.'"), + СохраняемоеИмяФайла, + РазмерВМб); + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение файла'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Помещает файл с диска в хранилище присоединенных файлов (веб-клиент). +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ПрисоединенныйФайл - Ссылка, Неопределено - ссылка на добавленный файл, либо +// Неопределено, если файл не был помещен; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании +// объекта оповещения. +// ВладелецФайла - Ссылка на владельца файла. +// НастройкиРаботыСФайлами - Структура. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// +Процедура ПоместитьВыбранныеФайлыВХранилищеВеб(ОбработчикРезультата, Знач ВладелецФайла, Знач ИдентификаторФормы) + + Параметры = Новый Структура; + Параметры.Вставить("ВладелецФайла", ВладелецФайла); + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьВыбранныеФайлыВХранилищеВебЗавершение", ЭтотОбъект, Параметры); + НачатьПомещениеФайла(ОписаниеОповещения, , ,Истина, ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьВыбранныеФайлыВХранилищеВеб. +Процедура ПоместитьВыбранныеФайлыВХранилищеВебЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + Если Не Результат Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + АдресВременногоХранилищаФайла = Адрес; + ИмяФайла = ВыбранноеИмяФайла; + ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; + + СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла); + + Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда + Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); + ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при помещении файла + |""%1"" + |во временное хранилище.'"), + ИмяФайла); + КонецЕсли; + + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(Расширение); + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ВладелецФайлов", ВладелецФайла); + ПараметрыФайла.Вставить("Автор", Неопределено); + ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", Расширение); + ПараметрыФайла.Вставить("ГруппаФайлов", ""); + ПараметрыФайла.Вставить("ВремяИзменения"); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное"); + + // Создание карточки Файла в базе данных. + ПрисоединенныйФайл = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл( + ПараметрыФайла, + АдресВременногоХранилищаФайла); + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПрисоединенныйФайл); + +КонецПроцедуры + // Проверяет можно ли освободить Файл. // // Параметры: @@ -209,7 +1393,7 @@ Функция ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, - СтрокаОшибки = "") + СтрокаОшибки = "") Экспорт Если РедактируетТекущийПользователь Тогда Возврат Истина; @@ -220,7 +1404,7 @@ Строка(ОбъектСсылка)); Возврат Ложь; Иначе - Если ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ЭтоПолноправныйПользователь Тогда + Если РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ЭтоПолноправныйПользователь Тогда Возврат Истина; КонецЕсли; @@ -243,7 +1427,7 @@ Процедура ОсвободитьФайлБезВопроса(ДанныеФайла, УникальныйИдентификатор = Неопределено) РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); + РасширениеПодключено = РасширениеРаботыСФайламиПодключено(); Если РасширениеПодключено Тогда ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, Истина, ДанныеФайла.РабочийКаталогВладельца <> ""); КонецЕсли; @@ -292,7 +1476,7 @@ Процедура ЗакончитьРедактирование(Параметры) Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПослеУстановкиРасширения", ЭтотОбъект, Параметры); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -300,7 +1484,7 @@ Процедура ЗакончитьРедактированиеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения); Иначе ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения); @@ -319,7 +1503,7 @@ ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ДанныеФайла.Ссылка, - ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь, + ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда @@ -403,8 +1587,11 @@ СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); + Если СоздатьНовуюВерсиюДоступность Тогда + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); + Иначе + ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); + КонецЕсли; Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. @@ -492,21 +1679,13 @@ Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования; Иначе - РазмерВМб = СведенияОФайле.Размер / (1024 * 1024); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - СведенияОФайле.ИмяБезРасширения, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - Состояние(ТекстПояснения); - ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; Попытка - ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, ПараметрыВыполнения.ИдентификаторФормы); + ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, ПараметрыВыполнения.ИдентификаторФормы); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); @@ -521,8 +1700,7 @@ ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); Возврат; КонецПопытки; - - Состояние(); + Если Не ФайлыПомещены Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; @@ -533,10 +1711,10 @@ КонецЕсли; КонецЕсли; - ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + ОбщиеНастройкиРаботыСФайлами = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда Попытка - СведенияОФайле.АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + СведенияОФайле.АдресВременногоХранилищаТекста = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ИдентификаторФормы,, ПараметрыВыполнения.Кодировка); Исключение ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); @@ -553,7 +1731,7 @@ Попытка ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайл(ПараметрыВыполнения.ДанныеФайла, СведенияОФайле, - НеМенятьЗаписьВРабочемКаталоге, ПараметрыВыполнения.ПолныйПутьКФайлу, ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(), + НеМенятьЗаписьВРабочемКаталоге, ПараметрыВыполнения.ПолныйПутьКФайлу, РабочийКаталогПользователя(), ПараметрыВыполнения.ИдентификаторФормы); Исключение ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); @@ -566,7 +1744,7 @@ Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу = "" Тогда УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = - ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; + РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Неопределено Тогда УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; @@ -631,6 +1809,12 @@ // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) = Тип("Структура") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы", "ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры @@ -670,18 +1854,18 @@ Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка); - ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; - ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; - ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; - ПараметрыВыполнения.Кодировка = ПараметрыВыполнения.ДанныеФайла.КодировкаТекущейВерсии; + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; + ПараметрыВыполнения.Кодировка = ПараметрыВыполнения.ДанныеФайла.КодировкаТекущейВерсии; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, - ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда @@ -719,7 +1903,7 @@ Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. @@ -776,6 +1960,11 @@ Возврат; КонецЕсли; + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); + КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы); @@ -862,7 +2051,7 @@ Попытка Результат = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайлПоСсылке(ПараметрыВыполнения.ОбъектСсылка, - СведенияОФайле, ПараметрыВыполнения.ПолныйПутьКФайлу, ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(), + СведенияОФайле, ПараметрыВыполнения.ПолныйПутьКФайлу, РабочийКаталогПользователя(), ПараметрыВыполнения.ИдентификаторФормы); ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла; Исключение @@ -901,6 +2090,11 @@ // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы","ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры @@ -946,7 +2140,7 @@ // Процедура ОбновитьИзФайлаНаДиске(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) - Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если Не РасширениеРаботыСФайламиПодключено() Тогда ВернутьРезультат(ОбработчикРезультата, Ложь); Возврат; КонецЕсли; @@ -961,14 +2155,14 @@ Если ПутьВыбора = Неопределено Или ПутьВыбора = "" Тогда #Если Не ВебКлиент Тогда - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); ВернутьРезультат(ОбработчикРезультата, Ложь); Возврат; КонецЕсли; #КонецЕсли - ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); + ПутьВыбора = КаталогМоиДокументы(); КонецЕсли; Диалог.Заголовок = НСтр("ru = 'Выбор файла'"); @@ -1058,7 +2252,7 @@ ПараметрыВыполнения.РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( ВременныйФайлНешифрованный.Расширение); - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( + РаботаСФайламиСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( ПараметрыВыполнения.РасширениеФайлаНаДиске); // Тут расшифровать и поставить ту же дату изменения, что и ДиалогПолноеИмяФайлаПрежнее. @@ -1175,7 +2369,7 @@ ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда // Файл уже был занят. + Если ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда // Файл уже был занят. Если ФайлВРабочемКаталоге = Истина Тогда ФайлВКэше = Новый Файл(ПолноеИмяФайла); @@ -1239,9 +2433,9 @@ КонецЕсли; КонецЕсли; - ПараметрыВыполнения.Вставить("РедактируетТекущийПользователь", ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь); + ПараметрыВыполнения.Вставить("ФайлРедактируетТекущийПользователь", ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь); - Если Не ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда + Если Не ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ТекстОшибки = ""; МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); @@ -1286,7 +2480,7 @@ ПереданныйПолныйПутьКФайлу = ""; Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования", ЭтотОбъект, ПараметрыВыполнения); - Если ПараметрыВыполнения.РедактируетТекущийПользователь Тогда // Файл уже был занят. + Если ПараметрыВыполнения.ФайлРедактируетТекущийПользователь Тогда // Файл уже был занят. ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы); ПараметрыОбработчика.ПереданныйПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.СоздатьНовуюВерсию; @@ -1295,7 +2489,7 @@ Иначе ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы); ПараметрыОбработчика.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; - ПараметрыОбработчика.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; + ПараметрыОбработчика.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыОбработчика.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; ПараметрыОбработчика.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; ПараметрыОбработчика.ПереданныйПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; @@ -1338,7 +2532,7 @@ Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1355,7 +2549,7 @@ Возврат; КонецЕсли; - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); @@ -1390,7 +2584,7 @@ Обработчик = Новый ОписаниеОповещения("ЗанятьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1422,7 +2616,7 @@ Продолжить; КонецЕсли; - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); @@ -1471,7 +2665,7 @@ Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1479,7 +2673,7 @@ Процедура РедактироватьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); - ПараметрыВыполнения.Вставить("РасширениеПодключено", ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено()); + ПараметрыВыполнения.Вставить("РасширениеПодключено", РасширениеРаботыСФайламиПодключено()); ТекстОшибки = ""; ДанныеПолучены = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ПараметрыВыполнения.ОбъектСсылка, @@ -1574,7 +2768,7 @@ Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1593,7 +2787,7 @@ // Если Файл не занят, тогда занять файл. Если Не ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.Редактирует) Тогда Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеЗанятияФайла", ЭтотОбъект, ПараметрыВыполнения); - ЗанятьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла); + ЗанятьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); Возврат; КонецЕсли; @@ -1619,7 +2813,7 @@ Возврат; КонецЕсли; - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения("РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, @@ -1658,30 +2852,10 @@ //////////////////////////////////////////////////////////////////////////////// // Открытие версии файла. -// Открыть версию файла. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. -// ДанныеФайла - Структура с данными файла. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -Процедура ОткрытьВерсиюФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); - - Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); - -КонецПроцедуры - // Продолжение процедуры (см. выше). Процедура ОткрытьВерсиюФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, @@ -1730,7 +2904,7 @@ Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1749,7 +2923,7 @@ ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.ФайлРедактируетТекущийПользователь, ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда @@ -1758,7 +2932,7 @@ КонецЦикла; - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); + РасширениеПодключено = РасширениеРаботыСФайламиПодключено(); Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование", ЭтотОбъект, ПараметрыВыполнения); @@ -1787,7 +2961,7 @@ Параметры = ПараметрыОсвобожденияФайла(Неопределено, ДанныеФайла.Ссылка); Параметры.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - Параметры.РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; + Параметры.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; Параметры.Редактирует = ДанныеФайла.Редактирует; Параметры.НеЗадаватьВопрос = Истина; ОсвободитьФайл(Параметры); @@ -1829,7 +3003,7 @@ ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("Версия"); ПараметрыОбработчика.Вставить("ХранитьВерсии"); - ПараметрыОбработчика.Вставить("РедактируетТекущийПользователь"); + ПараметрыОбработчика.Вставить("ФайлРедактируетТекущийПользователь"); ПараметрыОбработчика.Вставить("Редактирует"); ПараметрыОбработчика.Вставить("УникальныйИдентификатор"); ПараметрыОбработчика.Вставить("НеЗадаватьВопрос", Ложь); @@ -1845,7 +3019,7 @@ Процедура ОсвободитьФайл(ПараметрыОсвобожденияФайла) Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОсвобожденияФайла); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1862,16 +3036,16 @@ Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.ОбъектСсылка) Тогда ПараметрыВыполнения.ОбъектСсылка = ПараметрыВыполнения.ДанныеФайла.Ссылка; КонецЕсли; - ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; - ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, - ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); @@ -1914,7 +3088,7 @@ РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОсвободитьФайл(ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Истина; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); @@ -1944,7 +3118,7 @@ ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыОбработчика.Вставить("ХранитьВерсии"); - ПараметрыОбработчика.Вставить("РедактируетТекущийПользователь"); + ПараметрыОбработчика.Вставить("ФайлРедактируетТекущийПользователь"); ПараметрыОбработчика.Вставить("Редактирует"); ПараметрыОбработчика.Вставить("АвторТекущейВерсии"); ПараметрыОбработчика.Вставить("ПереданныйПолныйПутьКФайлу", ""); @@ -1966,7 +3140,7 @@ Процедура СохранитьИзмененияФайла(ПараметрыОбновленияФайла) Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбновленияФайла); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -1977,7 +3151,7 @@ ПараметрыВыполнения.Вставить("АдресВременногоХранилища", Неопределено); ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", Неопределено); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда СохранитьИзмененияФайлаСРасширением(ПараметрыВыполнения); Иначе СохранитьИзмененияФайлаБезРасширения(ПараметрыВыполнения); @@ -1997,7 +3171,7 @@ ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ДанныеФайла.Ссылка, - ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь, + ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда @@ -2065,7 +3239,7 @@ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. @@ -2146,14 +3320,6 @@ Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования; Иначе - РазмерВМб = СведенияОФайле.Размер / (1024 * 1024); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - СведенияОФайле.ИмяБезРасширения, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - Состояние(ТекстПояснения); - ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); ПомещаемыеФайлы.Добавить(Описание); @@ -2161,7 +3327,6 @@ ПомещенныеФайлы = Новый Массив; ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы); - Состояние(); Если Не ФайлыПомещены Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); Возврат; @@ -2172,8 +3337,8 @@ КонецЕсли; КонецЕсли; - ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ОбщиеНастройкиРаботыСФайлами = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + ИмяКаталога = РабочийКаталогПользователя(); ОтносительныйПутьКФайлу = ""; Если ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "" Тогда // Есть рабочий каталог. @@ -2186,7 +3351,7 @@ КонецЕсли; Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда - АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + АдресВременногоХранилищаТекста = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ИдентификаторФормы); Иначе @@ -2226,6 +3391,11 @@ // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы","ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры @@ -2235,17 +3405,17 @@ Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка); - ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; - ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; - ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; - ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, - ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда @@ -2283,7 +3453,7 @@ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. @@ -2336,8 +3506,16 @@ // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт - Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); - НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы); + Если Результат.Значение = КодВозвратаДиалога.ОК Тогда + + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); + КонецЕсли; + Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); + НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы); + + КонецЕсли; КонецПроцедуры @@ -2520,15 +3698,16 @@ // * Неопределено - Если файл не занят. // * Структура с данными файла - Если файл занят. // -Процедура ЗанятьФайл(ОбработчикРезультата, ДанныеФайла) +Процедура ЗанятьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); - ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -2545,13 +3724,15 @@ КонецЕсли; ТекстОшибки = ""; - ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); + ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, + ТекстОшибки, ПараметрыВыполнения.УникальныйИдентификатор); + Если Не ФайлЗанят Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецЕсли; - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); @@ -2570,6 +3751,46 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Добавление файлов. + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. +Процедура ДобавитьФайлыЗавершение(ПрисоединенныйФайл, ДополнительныеПараметры) Экспорт + + Если ПрисоединенныйФайл = Неопределено Тогда + Возврат; + КонецЕсли; + + ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; + ОповеститьОбИзменении(ПрисоединенныйФайл); + ОповеститьОбИзменении(ВладелецФайла); + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыОповещения.Вставить("Файл" , ПрисоединенныйФайл); + ПараметрыОповещения.Вставить("Событие" , "СозданФайл"); + ПараметрыОповещения.Вставить("ЭтоНовый" , Истина); + Оповестить("Запись_Файл", ПараметрыОповещения, ПрисоединенныйФайл); + + ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; + Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда + ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; + КонецЕсли; + Если ОткрыватьКарточкуПослеСозданияИзФайла Тогда + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), + ПрисоединенныйФайл, + БиблиотекаКартинок.Информация32); + + ПараметрыФормы = Новый Структура("ПрисоединенныйФайл", ПрисоединенныйФайл); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Освобождение файлов без обновления. @@ -2603,7 +3824,7 @@ Процедура УдалитьФайл(ОбработчикРезультата, ПолноеИмяФайла, ЗадаватьВопрос = Неопределено, ШапкаВопроса = Неопределено) Если ЗадаватьВопрос = Неопределено Тогда - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); ЗадаватьВопрос = ПерсональныеНастройки.ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов; КонецЕсли; @@ -2725,7 +3946,7 @@ // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВЛокальныйКэшФайловПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); - ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + ДействиеПриОткрытииФайлаВРабочемКаталоге( Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла); @@ -2800,14 +4021,15 @@ ИдентификаторФормы = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); Если ИмяКаталога = Неопределено Или ПустаяСтрока(ИмяКаталога) Тогда ВернутьРезультат(ОбработчикРезультата, Новый Структура("ФайлПолучен, ПолноеИмяФайла", Ложь, ПолноеИмяФайла)); Возврат; КонецЕсли; - Если ДанныеФайла.РабочийКаталогВладельца = "" Или ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда + Если ДанныеФайла.РабочийКаталогВладельца = "" + Или ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия И ЗначениеЗаполнено(ДанныеФайла.ТекущаяВерсия) Тогда ПолучитьФайлВерсииВЛокальныйКэшФайлов( ОбработчикРезультата, ДанныеФайла, @@ -2826,7 +4048,335 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// + +// См. одноименную процедуру в общем модуле РаботаСФайламиКлиент. +Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Контекст.Вставить("ДляРедактирования", Ложь); + Контекст.Вставить("ДанныеФайла", Неопределено); + ДополнительныеПараметры.Свойство("ДляРедактирования", Контекст.ДляРедактирования); + ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла); + + Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") + Или Не ЗначениеЗаполнено(Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда + + Контекст.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( + Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Истина, Контекст.ДляРедактирования)); + КонецЕсли; + + Контекст.Вставить("ЗаголовокОшибки", + НСтр("ru = 'Не удалось получить файл на компьютер из хранилища файлов по причине:'") + Символы.ПС); + + Если Контекст.ДляРедактирования + И Контекст.ДанныеФайла.Редактирует <> ПользователиКлиентСервер.АвторизованныйПользователь() Тогда + + Результат = Новый Структура; + Результат.Вставить("ПолноеИмяФайла", ""); + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл уже редактирует пользователь %1.'"), Строка(Контекст.ДанныеФайла.Редактирует))); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Контекст.Вставить("ДляРедактирования", ЗначениеЗаполнено(Контекст.ДанныеФайла.Редактирует)); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения( + "ПолучитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПрисоединенныйФайл. +Процедура ПолучитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт + + Если Не РасширениеПодключено Тогда + Результат = Новый Структура; + Результат.Вставить("ПолноеИмяФайла", ""); + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'В браузере не установлено расширение для работы с файлами.'")); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( + "ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПрисоединенныйФайл. +Процедура ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт + + Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда + Результат = Новый Структура; + Результат.Вставить("ПолноеИмяФайла", ""); + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); + Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); + Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); + + ДействияСФайлом = Новый Массив; + + Действие = Новый Структура; + Действие.Вставить("Действие", "СоздатьКаталог"); + Действие.Вставить("Файл", Контекст.КаталогФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Создание каталога не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Действие = Новый Структура; + Действие.Вставить("Действие", "УстановитьСвойства"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Действие = Новый Структура; + Действие.Вставить("Действие", "Получить"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Адрес", Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); + ДействияСФайлом.Добавить(Действие); + + СвойстваФайла = Новый Структура; + СвойстваФайла.Вставить("ТолькоЧтение", Не Контекст.ДляРедактирования); + СвойстваФайла.Вставить("УниверсальноеВремяИзменения", Контекст.ДанныеФайла.ДатаМодификацииУниверсальная); + + Действие = Новый Структура; + Действие.Вставить("Действие", "УстановитьСвойства"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Свойства", СвойстваФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Установка свойств файла не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + ОбработатьФайл(Новый ОписаниеОповещения( + "ПолучитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), + ДействияСФайлом, Контекст.ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПрисоединенныйФайл. +Процедура ПолучитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт + + Результат = Новый Структура; + + Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда + Результат.Вставить("ПолноеИмяФайла", ""); + Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); + Иначе + Результат.Вставить("ПолноеИмяФайла", Контекст.ПолноеИмяФайла); + Результат.Вставить("ОписаниеОшибки", ""); + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +// См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент. +Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Контекст.Вставить("ДанныеФайла", Неопределено); + Контекст.Вставить("ПолноеИмяПомещаемогоФайла", Неопределено); + ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла); + ДополнительныеПараметры.Свойство("ПолноеИмяФайла", Контекст.ПолноеИмяПомещаемогоФайла); + + Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") Тогда + Контекст.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( + Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Ложь)); + КонецЕсли; + + Контекст.Вставить("ЗаголовокОшибки", + НСтр("ru = 'Не удалось поместить файл с компьютера в хранилище файлов по причине:'") + Символы.ПС); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения( + "ПоместитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьПрисоединенныйФайл. +Процедура ПоместитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт + + Если Не РасширениеПодключено Тогда + Результат = Новый Структура; + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'В браузере не установлено расширение для работы с файлами.'")); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( + "ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьПрисоединенныйФайл. +Процедура ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт + + Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда + Результат = Новый Структура; + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); + Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); + Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); + + Если Не ЗначениеЗаполнено(Контекст.ПолноеИмяПомещаемогоФайла) Тогда + Контекст.ПолноеИмяПомещаемогоФайла = Контекст.ПолноеИмяФайла; + КонецЕсли; + + ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(Контекст.ПолноеИмяФайла); + ПомещаемыеФайлы = Новый Массив; + ПомещаемыеФайлы.Добавить(ОписаниеФайла); + + ДействияСФайлом = Новый Массив; + + Вызовы = Новый Массив; + + Если Контекст.ПолноеИмяФайла <> Контекст.ПолноеИмяПомещаемогоФайла Тогда + Действие = Новый Структура; + Действие.Вставить("Действие", "СоздатьКаталог"); + Действие.Вставить("Файл", Контекст.КаталогФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Создание каталога не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Действие = Новый Структура; + Действие.Вставить("Действие", "УстановитьСвойства"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Действие = Новый Структура; + Действие.Вставить("Действие", "СкопироватьИзИсточника"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Источник", Контекст.ПолноеИмяПомещаемогоФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Копирование файла не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + ДобавитьВызов(Вызовы, "НачатьКопированиеФайла", Контекст.ПолноеИмяПомещаемогоФайла, Контекст.ПолноеИмяФайла,,); + КонецЕсли; + + Действие = Новый Структура; + Действие.Вставить("Действие", "УстановитьСвойства"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Истина)); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Контекст.Вставить("СвойстваФайла", Новый Структура); + Контекст.СвойстваФайла.Вставить("УниверсальноеВремяИзменения"); + Контекст.СвойстваФайла.Вставить("ИмяБезРасширения"); + Контекст.СвойстваФайла.Вставить("Расширение"); + + Действие = Новый Структура; + Действие.Вставить("Действие", "ПолучитьСвойства"); + Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); + Действие.Вставить("Свойства", Контекст.СвойстваФайла); + Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + + НСтр("ru = 'Получение свойств файла не выполнено по причине:'")); + ДействияСФайлом.Добавить(Действие); + + Контекст.Вставить("ДействиеПомещения", Новый Структура); + Контекст.ДействиеПомещения.Вставить("Действие", "Поместить"); + Контекст.ДействиеПомещения.Вставить("Файл", Контекст.ПолноеИмяФайла); + Контекст.ДействиеПомещения.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); + ДействияСФайлом.Добавить(Контекст.ДействиеПомещения); + ДобавитьВызов(Вызовы, "НачатьПомещениеФайлов", ПомещаемыеФайлы, , Ложь, Контекст.ИдентификаторФормы); + + Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); + + НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения( + "ПоместитьПрисоединенныйФайлПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы); + +КонецПроцедуры + +Процедура ДобавитьВызов(Вызовы, Метод, П1, П2, П3, П4) + + Вызов = Новый Массив; + Вызов.Добавить(Метод); + Вызов.Добавить(П1); + Вызов.Добавить(П2); + Вызов.Добавить(П3); + Вызов.Добавить(П4); + + Вызовы.Добавить(Вызов); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьПрисоединенныйФайл. +Процедура ПоместитьПрисоединенныйФайлПослеПолученияРазрешений(РазрешенияПолучены, Контекст) Экспорт + + Если РазрешенияПолучены Тогда + ОбработатьФайл(Новый ОписаниеОповещения( + "ПоместитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), + Контекст.ДействияСФайлом, Контекст.ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПоместитьПрисоединенныйФайл. +Процедура ПоместитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт + + Результат = Новый Структура; + + Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда + Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Результат.Вставить("ОписаниеОшибки", ""); + + Расширение = Контекст.СвойстваФайла.Расширение; + + ИнформацияОФайле = Новый Структура; + ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Контекст.СвойстваФайла.УниверсальноеВремяИзменения); + ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", Контекст.ДействиеПомещения.Адрес); + ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", ""); + ИнформацияОФайле.Вставить("ИмяБезРасширения", Контекст.СвойстваФайла.ИмяБезРасширения); + ИнформацияОФайле.Вставить("Расширение", Прав(Расширение, СтрДлина(Расширение)-1)); + ИнформацияОФайле.Вставить("Редактирует", Неопределено); + + Попытка + РаботаСФайламиСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл( + Контекст.ПрисоединенныйФайл, ИнформацияОФайле); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// // Открытие проводника с позиционированием на файле. // Процедура открывает проводник Windows, позиционируясь на Файл. @@ -2843,14 +4393,14 @@ КонецЕсли; #Если ВебКлиент Тогда - Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); + Если НЕ РасширениеРаботыСФайламиПодключено() Тогда + ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); Возврат; КонецЕсли; #КонецЕсли ПолноеИмяФайла = ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла); - Если ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайла) Тогда + Если ОткрытьПроводникСФайлом(ПолноеИмяФайла) Тогда Возврат; КонецЕсли; @@ -2892,7 +4442,7 @@ Если Результат <> -1 Тогда ПараметрыВыполнения.ПолноеИмяФайла = Результат.ПолноеИмяФайла; - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПараметрыВыполнения.ПолноеИмяФайла); + ОткрытьПроводникСФайлом(ПараметрыВыполнения.ПолноеИмяФайла); КонецЕсли; // Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения. @@ -2922,7 +4472,7 @@ ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("Ссылка", Ссылка); ПараметрыВыполнения.Вставить("Успех", Ложь); - ПараметрыВыполнения.Вставить("ИмяКаталога", ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + ПараметрыВыполнения.Вставить("ИмяКаталога", РабочийКаталогПользователя()); ПараметрыВыполнения.Вставить("ПолноеИмяФайлаИзРегистра", Неопределено); @@ -3018,7 +4568,7 @@ #КонецЕсли МаксРазмер = - ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерЛокальногоКэшаФайлов; + РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерЛокальногоКэшаФайлов; // Если размер РабочийКаталог установлен равным 0, // то считается, что никакого ограничения нет и умолчание в 10 Мб не используется. @@ -3026,14 +4576,14 @@ Возврат; КонецЕсли; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); РазмерФайловВРабочемКаталоге = 0; КоличествоСуммарное = 0; // Вычисление полного размера файлов в рабочем каталоге. - ФайловыеФункцииСлужебныйКлиент.ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); + ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); Размер = РеквизитыВерсии.Размер; Если РазмерФайловВРабочемКаталоге + Размер > МаксРазмер Тогда @@ -3071,7 +4621,7 @@ // Продолжение процедуры (см. выше). Процедура ОчиститьРабочийКаталогЗапуск(ПараметрыВыполнения) - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); ТаблицаФайлов = Новый Массив; МассивФайлов = НайтиФайлы(ИмяКаталога, "*"); @@ -3081,7 +4631,7 @@ // сортировка по дате - в начале будут самые давно помещенные в рабочий каталог. РаботаСФайламиСлужебныйВызовСервера.СортироватьМассивСтруктур(ТаблицаФайлов); - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); МаксРазмер = ПерсональныеНастройки.МаксимальныйРазмерЛокальногоКэшаФайлов; СреднийРазмерФайла = 1000; @@ -3322,7 +4872,7 @@ ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда - ПараметрыВыполнения.ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ПараметрыВыполнения.ИмяКаталога = РабочийКаталогПользователя(); ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение = ПараметрыВыполнения.ИмяКаталога; // Формирование имени файла с расширением. @@ -3333,7 +4883,7 @@ ПараметрыВыполнения.ПолноеИмяФайла = ""; Если Не ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда - ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.ИмяФайла); КонецЕсли; @@ -3415,7 +4965,7 @@ Возврат; КонецЕсли; - ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.ИмяФайла); @@ -3433,7 +4983,7 @@ Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт Если СодержимоеПеренесено Тогда - ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ПараметрыВыполнения.ИмяКаталога); + УстановитьРабочийКаталогПользователя(ПараметрыВыполнения.ИмяКаталога); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); @@ -3457,8 +5007,6 @@ ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); - РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024); - ФайлНаДискеПоИмени = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); ИмяИРасширениеВПути = ФайлНаДискеПоИмени.Имя; Позиция = СтрНайти(ПараметрыВыполнения.ПолноеИмяФайла, ИмяИРасширениеВПути); @@ -3472,19 +5020,9 @@ ПараметрыВыполнения.ПолноеИмяФайла = ПутьКФайлу + ПараметрыВыполнения.ИмяФайла; // могло смениться расширение - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ПараметрыВыполнения.ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - Если ПараметрыВыполнения.ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда КопироватьФайл(ПараметрыВыполнения.ДанныеФайла.ПутьОбновленияИзФайлаНаДиске, ПараметрыВыполнения.ПолноеИмяФайла); - - Состояние(); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения); Возврат; @@ -3551,12 +5089,12 @@ АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ИдентификаторФормы); Иначе - АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + АдресФайла = ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; КонецЕсли; КонецЕсли; ПередаваемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ИмяФайла, АдресФайла); + Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолноеИмяФайла, АдресФайла); ПередаваемыеФайлы.Добавить(Описание); #Если ВебКлиент Тогда @@ -3587,7 +5125,8 @@ КонецЕсли; #КонецЕсли - Если Не ПолучитьФайлы(ПередаваемыеФайлы,, ПараметрыВыполнения.ПараметрПутьКФайлу, Ложь) Тогда + ПолученныеФайлы = Новый Массив; + Если Не ПолучитьФайлы(ПередаваемыеФайлы, ПолученныеФайлы , , Ложь) Тогда ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; @@ -3599,8 +5138,6 @@ УдалитьИзВременногоХранилища(АдресФайла); КонецЕсли; - Состояние(); - // Установим время изменения файла таким, как оно стоит в текущей версии. ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ВремяИзмененияУниверсальное); @@ -3619,10 +5156,10 @@ ФайлНаДиске.УстановитьТолькоЧтение(ПараметрыВыполнения.НаЧтение); - ПараметрыВыполнения.ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ПараметрыВыполнения.ИмяКаталога = РабочийКаталогПользователя(); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ПараметрыВыполнения.ДанныеФайла.Версия, - ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.НаЧтение, РазмерФайла, + ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.НаЧтение, РазмерФайла, ПараметрыВыполнения.ВРабочемКаталогеВладельца); Если ПараметрыВыполнения.ДанныеФайла.Размер <> РазмерФайла Тогда @@ -3635,9 +5172,12 @@ ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Версия); - Оповестить("Запись_Файл", - Новый Структура("Событие", "ДанныеФайлаИзменены"), - ПараметрыВыполнения.ДанныеФайла.Ссылка); + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Файл" , ПараметрыВыполнения.ДанныеФайла.Ссылка); + ПараметрыОповещения.Вставить("Событие" , "ДанныеФайлаИзменены"); + ПараметрыОповещения.Вставить("ЭтоНовый" , Ложь); + + Оповестить("Запись_Файл", ПараметрыОповещения, ПараметрыВыполнения.ДанныеФайла.Ссылка); КонецЕсли; КонецЕсли; @@ -3728,7 +5268,7 @@ // Поиск регистрации файла в рабочем каталоге (полное имя с путем). НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ПараметрыВыполнения.ПолноеИмяФайла); ПараметрыВыполнения.Вставить("ФайлЕстьВРегистре", НайденныеСвойства.ФайлЕстьВРегистре); - Версия = НайденныеСвойства.Версия; + Версия = НайденныеСвойства.Файл; ДатаПомещения = ?(ПараметрыВыполнения.ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, ДатаПомещения); Владелец = НайденныеСвойства.Владелец; НомерВерсии = НайденныеСвойства.НомерВерсии; @@ -3815,7 +5355,7 @@ // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВРабочийКаталогПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); - ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + ДействиеПриОткрытииФайлаВРабочемКаталоге( Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла); @@ -3943,7 +5483,7 @@ // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); - ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + ДействиеПриОткрытииФайлаВРабочемКаталоге( Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла); @@ -4459,8 +5999,6 @@ // Продолжение процедуры (см. выше). Процедура ИмпортФайловПослеПроверкиРазмеров(Результат, ПараметрыВыполнения) Экспорт - Состояние(); - Если Результат.Успех = Ложь Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; @@ -4508,13 +6046,17 @@ Если ВыбранКаталог Тогда ПараметрыВыполнения.Путь = ИмяФайла.Значение; - ПараметрыВыполнения.МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, ПараметрыВыполнения.Путь); + ПараметрыВыполнения.МассивФайловЭтогоКаталога = РаботаСФайламиСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, ПараметрыВыполнения.Путь); ПараметрыВыполнения.ИмяПапки = ВыбранныйФайл.Имя; ПараметрыВыполнения.ПапкаУжеНайдена = Ложь; - Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец, ПараметрыВыполнения.ПерваяПапкаСТакимЖеИменем) Тогда + Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем( + ПараметрыВыполнения.ИмяПапки, + ПараметрыВыполнения.Владелец, + ПараметрыВыполнения.ПерваяПапкаСТакимЖеИменем, + ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов) Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Папка ""%1"" уже существует. | @@ -4562,8 +6104,14 @@ Процедура ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения) Если Не ПараметрыВыполнения.ПапкаУжеНайдена Тогда - ПараметрыВыполнения.ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент( - ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец); + Если ПустаяСтрока(ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов) Тогда + ПараметрыВыполнения.ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент( + ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец); + Иначе + ПараметрыВыполнения.ПапкаДляДобавленияТекущая = ПараметрыВыполнения.Владелец; + ПараметрыВыполнения.ГруппаФайлов = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент( + ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец, , ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов, ПараметрыВыполнения.ГруппаФайлов); + КонецЕсли; КонецЕсли; // Собственно импорт @@ -4596,17 +6144,13 @@ Процедура ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения) Если ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество() > 1 Тогда - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Импорт файлов завершен. Импортировано файлов: %1'"), Строка(ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество()) ); - - Состояние(ТекстСостояния); - Иначе - Состояние(); + ПоказатьОповещениеПользователя(ТекстСостояния); КонецЕсли; Если ПараметрыВыполнения.УдалятьФайлыПослеДобавления = Истина Тогда - ФайловыеФункцииСлужебныйКлиентСервер.УдалитьФайлыПослеДобавления( + РаботаСФайламиСлужебныйКлиентСервер.УдалитьФайлыПослеДобавления( ПараметрыВыполнения.МассивСтруктурВсехФайлов, ПараметрыВыполнения.МассивВсехПапок); КонецЕсли; @@ -4625,7 +6169,7 @@ Параметры = Новый Структура; Параметры.Вставить("МассивИменФайловСОшибками", ПараметрыВыполнения.МассивИменФайловСОшибками); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаОтчета", Параметры); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаОтчета", Параметры); КонецЕсли; Если ПараметрыВыполнения.ВыбранныеФайлы.Количество() <> 1 Тогда @@ -4656,7 +6200,7 @@ ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда СохранитьКакСРасширением(ПараметрыВыполнения); Иначе СохранитьКакБезРасширения(ПараметрыВыполнения); @@ -4669,7 +6213,7 @@ // Проверим - если файл уже есть в кэше, и он новее чем в базе - дадим диалог с выбором. ПараметрыВыполнения.Вставить("ПутьКФайлуВКэше", ""); - Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда + Если ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); @@ -4695,7 +6239,7 @@ ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеОтветаНаВопросДатаНовее", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Возврат; КонецЕсли; КонецЕсли; @@ -4727,7 +6271,7 @@ ПараметрыВыполнения.Вставить("ПутьВыбора", ПараметрыВыполнения.ДанныеФайла.ПапкаДляСохранитьКак); Если ПараметрыВыполнения.ПутьВыбора = Неопределено Или ПараметрыВыполнения.ПутьВыбора = "" Тогда #Если Не ВебКлиент Тогда - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); @@ -4735,7 +6279,7 @@ КонецЕсли; #КонецЕсли - ПараметрыВыполнения.ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); + ПараметрыВыполнения.ПутьВыбора = КаталогМоиДокументы(); КонецЕсли; ПараметрыВыполнения.Вставить("СохранятьСРасшифровкой", Ложь); @@ -4745,7 +6289,7 @@ Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеВыбораРежимаСохранения", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", , , , , , + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСохраненияШифрованногоФайла", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Иначе СохранитьКакСРасширениемПослеВыбораРежимаСохранения(-1, ПараметрыВыполнения); @@ -4813,11 +6357,15 @@ АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; Иначе - АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - - Если ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия <> ПараметрыВыполнения.ДанныеФайла.Версия Тогда - АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( - ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); + Если ПараметрыВыполнения.ДанныеФайла.Свойство("СсылкаНаДвоичныеДанныеФайла") Тогда + АдресФайла = ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; + ПараметрыВыполнения.ДанныеФайла.Вставить("ПолноеНаименованиеВерсии", ПараметрыВыполнения.ДанныеФайла.Наименование); + Иначе + АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + Если ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия <> ПараметрыВыполнения.ДанныеФайла.Версия Тогда + АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( + ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -4859,15 +6407,6 @@ РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024); - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - Если Файл.Существует() Тогда Если ПараметрыВыполнения.ПутьКФайлуВКэше <> ПолноеИмяФайла Тогда Файл.УстановитьТолькоЧтение(Ложь); @@ -4903,7 +6442,7 @@ КонецЕсли; КонецЕсли; - Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ПолноеИмяФайла); + ПоказатьОповещениеПользователя(НСтр("ru = 'Файл успешно сохранен'"), , ПолноеИмяФайла); ПутьВыбораПрежний = ПараметрыВыполнения.ПутьВыбора; ПараметрыВыполнения.ПутьВыбора = Файл.Путь; @@ -4925,7 +6464,7 @@ Обработчик = Новый ОписаниеОповещения("СохранитьКакБезРасширенияПослеВыбораРежимаСохранения", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", , , , , , + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСохраненияШифрованногоФайла", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Иначе СохранитьКакБезРасширенияПослеВыбораРежимаСохранения(-1, ПараметрыВыполнения); @@ -4993,10 +6532,27 @@ // Процедура ПоказатьНапоминаниеПередПоместитьФайл(ОбработчикРезультата) - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда - Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - ОткрытьФорму("Справочник.Файлы.Форма.ФормаНапоминанияПередПоместитьФайл", , , , , , ОбработчикРезультата); + Если Не РасширениеРаботыСФайламиПодключено() Тогда + ТекстНапоминания = + НСтр("ru = 'Сейчас будет предложено выбрать файл для того, + |чтобы поместить его в программу и закончить редактирование. + | + |Найдите нужный файл в том каталоге, который был + |указан ранее при начале редактирования.'"); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + ПараметрыНапоминания = Новый Структура; + ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); + ПараметрыНапоминания.Вставить("ТекстФлажка", + НСтр("ru = 'Больше не показывать это сообщение'")); + ПараметрыНапоминания.Вставить("Заголовок", + НСтр("ru = 'Помещение файла'")); + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( + ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); Возврат; КонецЕсли; КонецЕсли; @@ -5049,13 +6605,7 @@ КонецЕсли; Если ВыбранКаталог Тогда - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идет сбор информации о каталоге - |""%1"". - |Пожалуйста, подождите.'"), - Путь)); - - МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыПроверки.ПсевдоФайловаяСистема, Путь); + МассивФайловЭтогоКаталога = РаботаСФайламиСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыПроверки.ПсевдоФайловаяСистема, Путь); НайтиСлишкомБольшиеФайлы(МассивФайловЭтогоКаталога, МассивСлишкомБольшихФайлов, ПараметрыПроверки.Рекурсивно, ПараметрыВыполнения.КоличествоСуммарное, ПараметрыПроверки.ПсевдоФайловаяСистема); Иначе @@ -5084,7 +6634,7 @@ Параметры.Вставить("Заголовок", НСтр("ru = 'Предупреждение при загрузке файлов'")); Обработчик = Новый ОписаниеОповещения("ПроверитьПредельныйРазмерФайловПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ВопросПриИмпортеФайлов", Параметры, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВопросПриИмпортеФайлов", Параметры, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Возврат; КонецЕсли; @@ -5111,9 +6661,19 @@ // Процедура ПоказатьИнформациюФайлНеБылИзменен(ОбработчикРезультата) - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - Если ПерсональныеНастройки.ПоказыватьИнформациюЧтоФайлНеБылИзменен = Истина Тогда - ОткрытьФорму("Справочник.Файлы.Форма.ИнформацияФайлНеБылИзменен", , , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + Если ПерсональныеНастройки.ПоказыватьИнформациюЧтоФайлНеБылИзменен Тогда + ТекстНапоминания = НСтр("ru = 'Версия не была создана, т.к. файл не изменен. Комментарий не сохранен.'"); + Кнопки = РежимДиалогаВопрос.ОК; + ПараметрыНапоминания = Новый Структура; + ПараметрыНапоминания.Вставить("БлокироватьВесьИнтерфейс", Истина); + ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); + ПараметрыНапоминания.Вставить("ТекстФлажка", + НСтр("ru = 'Больше не показывать это сообщение'")); + ПараметрыНапоминания.Вставить("Заголовок", + НСтр("ru = 'Информация'")); + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( + ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); Иначе ВернутьРезультат(ОбработчикРезультата, Неопределено); КонецЕсли; @@ -5142,10 +6702,11 @@ ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, Параметры.ОбъектСсылка, Параметры.ИдентификаторФормы); ПараметрыОбработчика.ХранитьВерсии = Параметры.ХранитьВерсии; - ПараметрыОбработчика.РедактируетТекущийПользователь = Параметры.РедактируетТекущийПользователь; + ПараметрыОбработчика.ФайлРедактируетТекущийПользователь = Параметры.ФайлРедактируетТекущийПользователь; ПараметрыОбработчика.Редактирует = Параметры.Редактирует; ПараметрыОбработчика.АвторТекущейВерсии = Параметры.АвторТекущейВерсии; ПараметрыОбработчика.Кодировка = Параметры.Кодировка; + ПараметрыОбработчика.СоздатьНовуюВерсию = Параметры.СоздатьНовуюВерсию; ЗакончитьРедактирование(ПараметрыОбработчика); КонецПроцедуры @@ -5166,6 +6727,125 @@ КонецПроцедуры +// Сохраняет отредактированные файлы в ИБ и снимает блокировку. +// +// Параметры: +// Параметры - Структура - см. ПараметрыОбновленияФайла. +// +Процедура ЗакончитьРедактированиеПоСсылкамСОповещением(Параметры) Экспорт + + Если ТипЗнч(Параметры.МассивФайлов) <> Тип("Массив") Тогда + ВернутьРезультат(Параметры.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + + ОбработчикРезультата = Новый ОписаниеОповещения("ЗакончитьРедактированиеМассиваФайловСОповещениемЗавершение", ЭтотОбъект, Параметры); + Параметры.ОбработчикРезультата = ОбработчикРезультата; + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, Параметры); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив); + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов); + // Завершение редактирования файлов. + Для Каждого ДанныеФайла Из ПараметрыВыполнения.ДанныеФайлов Цикл + + ПараметрыОбработчика = ПараметрыОбновленияФайла( + Неопределено, + ДанныеФайла.Ссылка, + ПараметрыВыполнения.ИдентификаторФормы); + ЗаполнитьЗначенияСвойств(ПараметрыОбработчика, ПараметрыВыполнения); + ПараметрыОбработчика.Вставить("ДанныеФайла", Неопределено); + ПараметрыОбработчика.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + ПараметрыОбработчика.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыОбработчика.Редактирует = ДанныеФайла.Редактирует; + ПараметрыОбработчика.АвторТекущейВерсии = ДанныеФайла.Редактирует; + ПараметрыОбработчика.Кодировка = ДанныеФайла.КодировкаТекущейВерсии; + Если ПараметрыВыполнения.ВозможностьСоздаватьВерсииФайлов Тогда + ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.ХранитьВерсии; + Иначе + ПараметрыОбработчика.СоздатьНовуюВерсию = Ложь; + КонецЕсли; + ПараметрыОбработчика.ПрименитьКоВсем = Истина; + + Если РасширениеУстановлено Тогда + ЗакончитьРедактированиеСРасширением(ПараметрыОбработчика); + Иначе + ЗакончитьРедактированиеБезРасширения(ПараметрыОбработчика); + КонецЕсли; + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Завершить редактирование файлов'"),, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Завершено редактирование файлов (%1 из %2).'"), + ПараметрыВыполнения.ДанныеФайлов.Количество(), + ПараметрыВыполнения.МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +Процедура ЗакончитьРедактированиеМассиваФайловСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + Для Каждого ФайлСсылка Из ПараметрыВыполнения.МассивФайлов Цикл + Оповестить("Запись_Файл", Новый Структура("Событие", "ЗаконченоРедактирование"), ФайлСсылка); + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка); + КоличествоЗанятыхФайлов = СтандартныеПодсистемыКлиент.ПараметрКлиента("КоличествоЗанятыхФайлов"); + СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов - 1); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Добавляет файлы перетаскиванием в список файлов. +// +// Параметры: +// ВладелецФайла - Ссылка - владелец файла. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// МассивИменФайлов - Массив Строк - путей к файлам. +// +Процедура ДобавитьФайлыПеретаскиванием(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач МассивИменФайлов) Экспорт + + ПрисоединенныеФайлыМассив = Новый Массив; + ПоместитьВыбранныеФайлыВХранилище( + МассивИменФайлов, + ВладелецФайла, + ПрисоединенныеФайлыМассив, + ИдентификаторФормы); + + Если ПрисоединенныеФайлыМассив.Количество() = 1 Тогда + ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), + ПрисоединенныйФайл, + БиблиотекаКартинок.Информация32); + + ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + КонецЕсли; + + Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда + ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); + ОповеститьОбИзменении(ВладелецФайла); + Оповестить("Запись_Файл", + Новый Структура("ЭтоНовый, ВладелецФайла", Истина, ВладелецФайла), ПрисоединенныеФайлыМассив); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Захватывает файл, открывает диалог редактирования и рассылает оповещение. @@ -5240,6 +6920,7 @@ ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + ОповеститьОбИзменении(ФайлСсылка); КонецЦикла; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); @@ -5282,7 +6963,7 @@ Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); Параметры = ПараметрыОсвобожденияФайла(Обработчик, Параметры.ОбъектСсылка); Параметры.ХранитьВерсии = Параметры.ХранитьВерсии; - Параметры.РедактируетТекущийПользователь = Параметры.РедактируетТекущийПользователь; + Параметры.ФайлРедактируетТекущийПользователь = Параметры.ФайлРедактируетТекущийПользователь; Параметры.Редактирует = Параметры.Редактирует; Параметры.УникальныйИдентификатор = Параметры.УникальныйИдентификатор; ОсвободитьФайл(Параметры); @@ -5325,29 +7006,30 @@ // ДанныеФайла - Структура с данными файла. // УникальныйИдентификатор - УникальныйИдентификатор - Формы. // -Процедура ОткрытьФайлСОповещением(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт +Процедура ОткрытьФайлСОповещением(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено, ДляРедактирования = Истина) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ДляРедактирования", ДляРедактирования); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); // Если Файл без файла, тогда открыть карточку. - Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда + Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() И ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ПоказатьЗначение(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка); Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемПослеУстановкиРасширения", ЭтотОбъект, ПараметрыВыполнения); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлСОповещениемПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, @@ -5368,6 +7050,8 @@ Процедура ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ФайлПолучен = Истина Тогда + ФайлНаДиске = Новый Файл(Результат.ПолноеИмяФайла); + ФайлНаДиске.УстановитьТолькоЧтение(Не ПараметрыВыполнения.ДляРедактирования); ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); КонецЕсли; @@ -5403,7 +7087,7 @@ Контекст.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); Если Контекст.СохранятьСРасшифровкой - И ДанныеФайла.Зашифрован Тогда + И ДанныеФайла.Зашифрован Тогда Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь); @@ -5426,11 +7110,11 @@ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); - Возврат; + КонецЕсли; - Контекст.Вставить("АдресФайла", ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + Контекст.Вставить("АдресФайла", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); ОткрытьФайлБезРасширенияНапоминание(Контекст); @@ -5461,10 +7145,10 @@ Процедура ОткрытьФайлБезРасширенияНапоминание(Контекст) Если Контекст.СПредупреждением - И Контекст.ДанныеФайла.РедактируетТекущийПользователь Тогда + И Контекст.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда - ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Новый ОписаниеОповещения( - "ОткрытьФайлБезРасширенияПередачаФайла", ЭтотОбъект, Контекст)); + ВывестиНапоминаниеПриРедактировании(Новый ОписаниеОповещения( + "ОткрытьФайлБезРасширенияПередачаФайла", ЭтотОбъект, Контекст)); Иначе ОткрытьФайлБезРасширенияПередачаФайла(Истина, Контекст); КонецЕсли; @@ -5474,13 +7158,18 @@ // Продолжение процедуры (см. выше). Процедура ОткрытьФайлБезРасширенияПередачаФайла(Результат, Контекст) Экспорт - Если Результат = КодВозвратаДиалога.Отмена Или Результат = Неопределено Тогда + Если (ТипЗнч(Результат) = Тип("Структура") И Результат.Значение = "Отмена") Или Результат = Неопределено Тогда Возврат; КонецЕсли; + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); + КонецЕсли; + Если Не Контекст.СохранятьСРасшифровкой - И Контекст.ДанныеФайла.Зашифрован - И ЗначениеЗаполнено(Контекст.РасширениеДляЗашифрованныхФайлов) Тогда + И Контекст.ДанныеФайла.Зашифрован + И ЗначениеЗаполнено(Контекст.РасширениеДляЗашифрованныхФайлов) Тогда Расширение = Контекст.РасширениеДляЗашифрованныхФайлов; Иначе @@ -5506,7 +7195,7 @@ Возврат; КонецЕсли; - ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Справочник.Файлы.Форма.ФормаВопроса")); + ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Обработка.РаботаСФайлами.Форма.ФормаВопроса")); ИдентификаторФормы = ПараметрыВыполнения.ВременнаяФорма.УникальныйИдентификатор; СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Истина); @@ -5560,8 +7249,8 @@ // Выбирает на диске файл и создает из него новую версию. Процедура ОбновитьИзФайлаНаДискеСОповещением(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) Экспорт - Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); + Если Не РасширениеРаботыСФайламиПодключено() Тогда + ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); Возврат; КонецЕсли; @@ -5764,7 +7453,7 @@ ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу = Новый Массив; ПараметрыВыполнения.Вставить("ИзвлекатьТекстыФайловНаСервере", - ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере); + РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере); ПредставлениеФайла = Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка); Если ПараметрыВыполнения.ДанныеФайла.КоличествоВерсий > 1 Тогда @@ -5836,7 +7525,7 @@ ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла(ПараметрыВыполнения.ДанныеФайла.Расширение); ДвоичныеДанныеРасшифрованные.Записать(ПолныйПутьКФайлу); - АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + АдресВременногоХранилищаТекста = РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( ПолныйПутьКФайлу, ПараметрыВыполнения.УникальныйИдентификатор); УдалитьФайлы(ПолныйПутьКФайлу); @@ -5870,6 +7559,20 @@ КонецПроцедуры +// Продолжение процедуры ПроверитьПодписи. Вызывается из подсистемы ЭлектроннаяПодпись. +Процедура ПослеРасшифровкиФайлаПриПроверкеПодписи(ОписаниеДанных, ДополнительныеПараметры) Экспорт + + Если Не ОписаниеДанных.Успех Тогда + Возврат; + КонецЕсли; + + ПроверитьПодписиПослеПодготовкиДанных(ОписаниеДанных.РасшифрованныеДанные, ДополнительныеПараметры); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Продолжения асинхронных процедур. + //////////////////////////////////////////////////////////////////////////////// // Создает новый файл. @@ -5920,13 +7623,13 @@ Если РежимСоздания = 1 Тогда // Скопировать другой файла. ДобавитьНаОсновеШаблона(ПараметрыВыполнения); ИначеЕсли РежимСоздания = 2 Тогда // Загрузить из файловой системы. - Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда + Если РасширениеРаботыСФайламиПодключено() Тогда ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения); Иначе ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); КонецЕсли; ИначеЕсли РежимСоздания = 3 Тогда // Считать со сканера. - ФайловыеФункцииСлужебныйКлиент.ДобавитьСоСканера(ПараметрыВыполнения); + ДобавитьСоСканера(ПараметрыВыполнения); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецЕсли; @@ -5955,16 +7658,22 @@ КонецЕсли; ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ФайлОснование", Результат); - ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); - ПараметрыФормы.Вставить("РежимСоздания", "ИзШаблона"); + ПараметрыФормы.Вставить("ЗначениеКопирования", Результат); + ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); + ПараметрыФормы.Вставить("РежимСоздания", "ИзШаблона"); ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + Если ПараметрыВыполнения.Свойство("ИмяСправочникаХранилищаФайлов") Тогда + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + Иначе + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", "Файлы"); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения) Экспорт +Процедура ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения) // Загрузить из файловой системы без расширения работы с файлами (веб-клиент). Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); @@ -6005,7 +7714,7 @@ Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла, СведенияОФайле); Результат.ФайлДобавлен = Истина; Исключение - Результат.ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); + Результат.ТекстОшибки = РаботаСФайламиСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); КонецПопытки; Если Результат.ТекстОшибки <> "" Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстОшибки, Неопределено); @@ -6038,7 +7747,7 @@ КонецПроцедуры // Продолжение процедуры (см. выше). -Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт +Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Если Ответ = КодВозвратаДиалога.Повторить Тогда ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); @@ -6101,9 +7810,42 @@ //////////////////////////////////////////////////////////////////////////////// // Работа с электронными подписями. +Процедура ПодписатьФайл(ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы, + ОбработчикЗавершения = Неопределено, ОбработчикПриПолученииПодписи = Неопределено) Экспорт + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + ПараметрыВыполнения.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + ОписаниеДанных = Новый Структура; + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); + ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); + + ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + + Если ОбработчикПриПолученииПодписи = Неопределено Тогда + ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); + Иначе + ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); + КонецЕсли; + + ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеДобавленияПодписей", ЭтотОбъект, ПараметрыВыполнения); + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, , ОбработчикПродолжения); + +КонецПроцедуры -// Подписывает текущую версию файла с помощью подсистемы ЭлектроннаяПодпись. -Процедура ПодписатьФайл(МассивФайлов, ИдентификаторФормы, ОбработчикЗавершения) Экспорт +// Подписывает текущую версию файлов с помощью подсистемы ЭлектроннаяПодпись. +Процедура ПодписатьФайлы(МассивФайлов, ИдентификаторФормы, ОбработчикЗавершения, ОбработчикПриПолученииПодписи = Неопределено) Экспорт Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; @@ -6121,13 +7863,13 @@ ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(Файл); Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(Файл); + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(Файл); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; Если ДанныеФайла.Зашифрован Тогда - ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(Файл); + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(Файл); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; @@ -6202,6 +7944,19 @@ КонецПроцедуры +// Завершение процедур ПодписатьФайл, ДобавитьПодписьИзФайла. +Процедура ПослеДобавленияПодписей(ОписаниеДанных, ПараметрыВыполнения) Экспорт + + Если ОписаниеДанных.Успех Тогда + ОповеститьОбИзменении(ПараметрыВыполнения.ПрисоединенныйФайл); + Оповестить("Запись_Файл", Новый Структура, ПараметрыВыполнения.ПрисоединенныйФайл); + КонецЕсли; + + Если ПараметрыВыполнения.ОбработчикЗавершения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикЗавершения, ОписаниеДанных.Успех); + КонецЕсли; + +КонецПроцедуры // Добавляет электронные подписи к файлу-объекту из файлов-подписей на диске. Процедура ДобавитьПодписьИзФайла(Файл, ИдентификаторФормы, ОбработчикЗавершения) Экспорт @@ -6214,13 +7969,13 @@ ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); Если ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.Редактирует) Тогда - ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда - ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; @@ -6342,8 +8097,8 @@ Функция ПараметрыИмпортаФайлов() Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата"); - ПараметрыВыполнения.Вставить("Владелец"); - ПараметрыВыполнения.Вставить("ВыбранныеФайлы"); + ПараметрыВыполнения.Вставить("Владелец"); + ПараметрыВыполнения.Вставить("ВыбранныеФайлы"); ПараметрыВыполнения.Вставить("Комментарий"); ПараметрыВыполнения.Вставить("ХранитьВерсии"); ПараметрыВыполнения.Вставить("УдалятьФайлыПослеДобавления"); @@ -6352,6 +8107,8 @@ ПараметрыВыполнения.Вставить("ПсевдоФайловаяСистема", Новый Соответствие); ПараметрыВыполнения.Вставить("Кодировка"); ПараметрыВыполнения.Вставить("ДобавленныеФайлы", Новый Массив); + ПараметрыВыполнения.Вставить("ГруппаФайлов"); + ПараметрыВыполнения.Вставить("ИмяСправочникаХранилищаФайлов", Неопределено); Возврат ПараметрыВыполнения; КонецФункции @@ -6486,7 +8243,7 @@ НовыйПуть = Строка(ВыбранныйФайл.Путь); НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); - МассивФайлов = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, НовыйПуть); + МассивФайлов = РаботаСФайламиСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, НовыйПуть); // Создаем группу в справочнике - эквивалент папки на диске. Если МассивФайлов.Количество() <> 0 Тогда @@ -6516,7 +8273,7 @@ Продолжить; КонецЕсли; - Если Не ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла( + Если Не РаботаСФайламиСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла( ВыбранныйФайл, Ложь, ПараметрыВыполнения.МассивИменФайловСОшибками) Тогда Продолжить; КонецЕсли; @@ -6524,12 +8281,12 @@ // Обновим индикатор прогресса. ПараметрыВыполнения.Счетчик = ПараметрыВыполнения.Счетчик + 1; // Считаем проценты - ПараметрыВыполнения.Индикатор = ПараметрыВыполнения.Счетчик * 100 / ПараметрыВыполнения.КоличествоСуммарное; + ПараметрыВыполнения.Индикатор = Цел(ПараметрыВыполнения.Счетчик * 100 / ПараметрыВыполнения.КоличествоСуммарное); РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); НадписьПодробнее = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Обрабатывается файл ""%1"" (%2 Мб)...'"), ВыбранныйФайл.Имя, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); ТекстСостояния = НСтр("ru = 'Импорт файлов с диска...'"); @@ -6562,9 +8319,9 @@ АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; КонецЕсли; - Если НЕ ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда + Если НЕ РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( ВыбранныйФайл.ПолноеИмя, ПараметрыВыполнения.ИдентификаторФормы, , ПараметрыВыполнения.Кодировка); Иначе АдресВременногоХранилищаТекста = ""; @@ -6593,20 +8350,40 @@ Процедура ИмпортироватьФайл(Знач ВыбранныйФайл, Знач Владелец, Знач ПараметрыВыполнения, Знач АдресВременногоХранилищаФайла, Знач АдресВременногоХранилищаТекста) - СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ВыбранныйФайл); - СведенияОФайле.АдресВременногоХранилищаФайла = АдресВременногоХранилищаФайла; - СведенияОФайле.АдресВременногоХранилищаТекста = АдресВременногоХранилищаТекста; - СведенияОФайле.Комментарий = ПараметрыВыполнения.Комментарий; - СведенияОФайле.Кодировка = ПараметрыВыполнения.Кодировка; + Если ТипЗнч(Владелец) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ВыбранныйФайл); + СведенияОФайле.АдресВременногоХранилищаФайла = АдресВременногоХранилищаФайла; + СведенияОФайле.АдресВременногоХранилищаТекста = АдресВременногоХранилищаТекста; + СведенияОФайле.Комментарий = ПараметрыВыполнения.Комментарий; + СведенияОФайле.Кодировка = ПараметрыВыполнения.Кодировка; - ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(Владелец, СведенияОФайле); + ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(Владелец, СведенияОФайле); + Иначе + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ВладелецФайлов", ПараметрыВыполнения.Владелец); + ПараметрыФайла.Вставить("Автор", Неопределено); + ПараметрыФайла.Вставить("ИмяБезРасширения", ВыбранныйФайл.ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение)); + ПараметрыФайла.Вставить("ГруппаФайлов", ПараметрыВыполнения.ГруппаФайлов); + ПараметрыФайла.Вставить("ВремяИзменения"); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное"); + + ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ПараметрыВыполнения.Комментарий); + КонецЕсли; + + Если ПараметрыВыполнения.Кодировка <> Неопределено Тогда + РаботаСФайламиСлужебныйВызовСервера.ЗаписатьКодировкуВерсииФайла(ФайлСсылка, ПараметрыВыполнения.Кодировка); + КонецЕсли; УдалитьИзВременногоХранилища(АдресВременногоХранилищаФайла); Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); КонецЕсли; - ДобавленныйФайлИПуть = Новый Структура("ФайлСсылка, Путь", ФайлСсылка, ВыбранныйФайл.Путь); + ДобавленныйФайлИПуть = Новый Структура("ФайлСсылка, Путь", ФайлСсылка, ВыбранныйФайл.Путь); ПараметрыВыполнения.ДобавленныеФайлы.Добавить(ДобавленныйФайлИПуть); Запись = Новый Структура; @@ -6628,7 +8405,7 @@ // Процедура ОбновитьИнформациюВРабочемКаталоге(ТекущаяВерсия, НовоеИмя) Экспорт - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); ПолноеИмяФайла = ""; ВРабочемКаталогеНаЧтение = Истина; @@ -6670,7 +8447,7 @@ Возврат; КонецЕсли; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); ПолноеИмяФайла = ""; ВРабочемКаталогеНаЧтение = Истина; @@ -6692,23 +8469,22 @@ // ИмяОткрываемогоФайла - Строка - полное имя файла. Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла, ОбработчикРезультата = Неопределено) - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); + РасширениеПодключено = РасширениеРаботыСФайламиПодключено(); Если РасширениеПодключено Тогда ПерсональныеНастройкиРаботыСФайлами = - ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); ТекстовыеФайлыСпособОткрытия = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыСпособОткрытия; Если ТекстовыеФайлыСпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда ТекстовыеФайлыРасширение = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыРасширение; - Если ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке(ТекстовыеФайлыРасширение, ДанныеФайла.Расширение) Тогда + Если РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке(ТекстовыеФайлыРасширение, ДанныеФайла.Расширение) Тогда ПараметрыФормы = Новый Структура("Файл, ДанныеФайла, ИмяОткрываемогоФайла", ДанныеФайла.Ссылка, ДанныеФайла, ИмяОткрываемогоФайла); - - ОткрытьФорму("Справочник.Файлы.Форма.РедактированиеТекстовогоФайла", - ПараметрыФормы, , ДанныеФайла.КодФайла); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.РедактированиеТекстовогоФайла", + ПараметрыФормы, , ДанныеФайла.Ссылка); Возврат; КонецЕсли; @@ -6762,7 +8538,7 @@ // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. // ВладелецФайла - ЛюбаяСсылка - владелец файла. -Процедура ПеренестиФайлВПриложенныеФайлы(ФайлСсылка, ВладелецФайла) Экспорт +Процедура ПеренестиФайлВПриложенныеФайлы(ФайлСсылка, ВладелецФайла) Результат = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляПереносаВПриложенныеФайлы(ФайлСсылка, ВладелецФайла).Получить(ФайлСсылка); @@ -6871,12 +8647,12 @@ ПараметрыПрикладнойФормыПредупреждения = Новый Структура; ПараметрыПрикладнойФормыПредупреждения.Вставить("СообщениеВопрос", НСтр("ru = 'Завершить работу с программой?'")); - ПараметрыПрикладнойФормыПредупреждения.Вставить("СообщениеЗаголовок", НСтр("ru = 'Следующие файлы заняты вами для редактирования:'")); + ПараметрыПрикладнойФормыПредупреждения.Вставить("СообщениеЗаголовок", НСтр("ru = 'Следующие файлы заняты для редактирования:'")); ПараметрыПрикладнойФормыПредупреждения.Вставить("Заголовок", НСтр("ru = 'Завершение работы'")); ПараметрыПрикладнойФормыПредупреждения.Вставить("Редактирует", ТекущийПользователь); - ПрикладнаяФормаПредупреждения = "Справочник.Файлы.Форма.СписокЗанятыхСВопросом"; - Форма = "Справочник.Файлы.Форма.РедактируемыеФайлы"; + ПрикладнаяФормаПредупреждения = "Обработка.РаботаСФайлами.Форма.СписокЗанятыхСВопросом"; + Форма = "Обработка.РаботаСФайлами.Форма.РедактируемыеФайлы"; ВозвращаемыеПараметры = Новый Структура; ВозвращаемыеПараметры.Вставить("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); @@ -6900,7 +8676,7 @@ Перем Версия; Перем ДатаПомещения; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); Для Каждого ВыбранныйФайл Из МассивФайлов Цикл @@ -6930,9 +8706,9 @@ НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ОтносительныйПуть); ФайлЕстьВРегистре = НайденныеСвойства.ФайлЕстьВРегистре; - Версия = НайденныеСвойства.Версия; + Версия = НайденныеСвойства.Файл; ДатаПомещения = ?(ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, ДатаПомещения); - Владелец = НайденныеСвойства.Владелец; + Владелец = НайденныеСвойства.Файл; НомерВерсии = НайденныеСвойства.НомерВерсии; ВРегистреНаЧтение = НайденныеСвойства.ВРегистреНаЧтение; ВРегистреКодФайла = НайденныеСвойства.ВРегистреКодФайла; @@ -6976,7 +8752,7 @@ ПутьДляВозврата = ""; ПолноеИмяФайла = ""; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); // Сперва пытаемся найти такую запись в регистре сведений. ПолноеИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; @@ -7002,7 +8778,7 @@ Если Не ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; Иначе - ПолноеИмяФайла = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла); + ПолноеИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла); КонецЕсли; КонецЕсли; @@ -7025,59 +8801,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Доопределяет список предупреждений пользователю перед завершением работы системы. -// -// Параметры: -// Отказ - Булево - Признак отказа от выхода из программы. Если в теле процедуры-обработчика установить -// данному параметру значение Истина, то работа с программой не будет завершена. -// Предупреждения - Массив - в массив можно добавить элементы типа Структура, -// свойства которой см. в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. -// -Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт - - Ответ = ПроверитьЗанятыеФайлыПриЗавершенииРаботы(); - Если Ответ = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(Ответ) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - ПредупреждениеПользователю = СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы(); - ПредупреждениеПользователю.ТекстГиперссылки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Открыть список редактируемых файлов (%1)'"), - Ответ.КоличествоЗанятыхФайлов); - ПредупреждениеПользователю.ТекстПредупреждения = НСтр("ru = 'Имеются занятые для редактирования файлы'"); - - ДействиеПриНажатииГиперссылки = ПредупреждениеПользователю.ДействиеПриНажатииГиперссылки; - - ПрикладнаяФормаПредупреждения = Неопределено; - Ответ.Свойство("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); - ПараметрыПрикладнойФормыПредупреждения = Неопределено; - Ответ.Свойство("ПараметрыПрикладнойФормыПредупреждения", ПараметрыПрикладнойФормыПредупреждения); - - Форма = Неопределено; - Ответ.Свойство("Форма", Форма); - ПараметрыФормы = Неопределено; - Ответ.Свойство("ПараметрыФормы", ПараметрыФормы); - - Если ПрикладнаяФормаПредупреждения <> Неопределено Тогда - ДействиеПриНажатииГиперссылки.ПрикладнаяФормаПредупреждения = ПрикладнаяФормаПредупреждения; - ДействиеПриНажатииГиперссылки.ПараметрыПрикладнойФормыПредупреждения = ПараметрыПрикладнойФормыПредупреждения; - КонецЕсли; - Если Форма <> Неопределено Тогда - ДействиеПриНажатииГиперссылки.Форма = Форма; - ДействиеПриНажатииГиперссылки.ПараметрыФормы = ПараметрыФормы; - КонецЕсли; - - Предупреждения.Добавить(ПредупреждениеПользователю); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -7100,7 +8823,7 @@ ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; Иначе ВРабочемКаталогеНаЧтение = Истина; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); // Пытаемся найти такую запись в регистре сведений. ПолноеИмяФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПолноеИмяФайлаИзРегистра(ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; @@ -7192,7 +8915,7 @@ // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). Процедура ПеререгистрироватьВРабочемКаталоге(ТекущаяВерсия, ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца) - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ИмяКаталога = РабочийКаталогПользователя(); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); Файл = Новый Файл(ПолноеИмяФайла); @@ -7216,7 +8939,7 @@ КоличествоСуммарное, Знач ПсевдоФайловаяСистема) - МаксРазмерФайла = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; + МаксРазмерФайла = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; Для Каждого ВыбранныйФайл Из МассивФайлов Цикл @@ -7232,7 +8955,7 @@ НовыйПуть = Строка(ВыбранныйФайл.Путь); НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); - МассивФайловВКаталоге = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); + МассивФайловВКаталоге = РаботаСФайламиСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); // Рекурсия Если МассивФайловВКаталоге.Количество() <> 0 Тогда @@ -7282,7 +9005,7 @@ // ИмяОткрываемогоФайла - Строка - полное имя файла. Процедура ВыполнитьЗапускПриложения(ИмяОткрываемогоФайла) Экспорт - РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено(); + РасширениеПодключено = РасширениеРаботыСФайламиПодключено(); Если РасширениеПодключено Тогда // Открыть Файл СистемнаяИнфо = Новый СистемнаяИнформация; @@ -7295,14 +9018,187 @@ КонецПроцедуры -// Сравнивает 2 файла (txt doc doc odt) с помощью MS Office или OpenOffice. -Процедура СравнитьФайлы(ПутьКФайлу1, ПутьКФайлу2, СпособСравненияВерсийФайлов) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Сравнение версий и файлов. +// Сравнивает 2 файла (txt doc doc odt mxl) с помощью MS Office, OpenOffice, программно для табличных документов. +Процедура СравнитьФайлы(ИдентификаторФормы, ПервыйФайл, ВторойФайл, Расширение, ВладелецВерсии = Неопределено) Экспорт + + СпособСравненияВерсийФайлов = Неопределено; + + РасширениеПоддерживается = ( + Расширение = "txt" + ИЛИ Расширение = "doc" + ИЛИ Расширение = "docx" + ИЛИ Расширение = "rtf" + ИЛИ Расширение = "htm" + ИЛИ Расширение = "html" + ИЛИ Расширение = "mxl" + ИЛИ Расширение = "odt"); + + Если Не РасширениеПоддерживается Тогда + ТекстПредупреждения = + НСтр("ru = 'Сравнение файлов поддерживается только для файлов следующих типов: + | Текстовый документ (.txt) + | Документ формата RTF (.rtf) + | Документ Microsoft Word (.doc, .docx) + | Документ HTML (.html .htm) + | Табличный документ (.mxl) + | Текстовый документ OpenDocument (.odt)'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Данная операция не поддерживается в базовой версии.'")); + Возврат; + КонецЕсли; + + Если Расширение = "odt" Тогда + СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter"; + ИначеЕсли Расширение = "htm" ИЛИ Расширение = "html" Тогда + СпособСравненияВерсийФайлов = "MicrosoftOfficeWord"; + ИначеЕсли Расширение = "mxl" Тогда + СпособСравненияВерсийФайлов = "СравнениеТабличныхДокументов"; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("СпособСравненияВерсийФайлов", СпособСравненияВерсийФайлов); + ПараметрыВыполнения.Вставить("ТекущийШаг", 1); + ПараметрыВыполнения.Вставить("ДанныеФайла1", Неопределено); + ПараметрыВыполнения.Вставить("ДанныеФайла2", Неопределено); + ПараметрыВыполнения.Вставить("Результат1", Неопределено); + ПараметрыВыполнения.Вставить("Результат2", Неопределено); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла1", Неопределено); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла2", Неопределено); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("Ссылка1", ПервыйФайл); + ПараметрыВыполнения.Вставить("Ссылка2", ВторойФайл); + ПараметрыВыполнения.Вставить("ВладелецВерсии", ВладелецВерсии); + + СравнениеВерсийАвтомат(-1, ПараметрыВыполнения); + +КонецПроцедуры + +Процедура СравнениеВерсийАвтомат(Результат, ПараметрыВыполнения) Экспорт + + Если Результат <> -1 Тогда + Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; + + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыВыполнения.ТекущийШаг = 2; + + ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 3 Тогда + ПараметрыВыполнения.Результат1 = Результат.ФайлПолучен; + ПараметрыВыполнения.ПолноеИмяФайла1 = Результат.ПолноеИмяФайла; + ПараметрыВыполнения.ТекущийШаг = 4; + + ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 4 Тогда + ПараметрыВыполнения.Результат2 = Результат.ФайлПолучен; + ПараметрыВыполнения.ПолноеИмяФайла2 = Результат.ПолноеИмяФайла; + ПараметрыВыполнения.ТекущийШаг = 5; + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; + + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + // Первый вызов - еще не инициализирована настройка. + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСпособаСравненияВерсий", , + ЭтотОбъект, , , , Обработчик); + Возврат; + КонецЕсли; + КонецЕсли; + ПараметрыВыполнения.ТекущийШаг = 2; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 2 Тогда + + Если ПараметрыВыполнения.Свойство("ВладелецВерсии") И ЗначениеЗаполнено(ПараметрыВыполнения.ВладелецВерсии) Тогда + ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( + ПараметрыВыполнения.ВладелецВерсии, ПараметрыВыполнения.Ссылка1, ПараметрыВыполнения.УникальныйИдентификатор); + ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( + ПараметрыВыполнения.ВладелецВерсии ,ПараметрыВыполнения.Ссылка2, ПараметрыВыполнения.УникальныйИдентификатор); + Иначе + ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( + ПараметрыВыполнения.Ссылка1, Неопределено, ПараметрыВыполнения.УникальныйИдентификатор); + ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( + ПараметрыВыполнения.Ссылка2, Неопределено, ПараметрыВыполнения.УникальныйИдентификатор); + КонецЕсли; + + ПараметрыВыполнения.ТекущийШаг = 3; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 3 Тогда + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, ПараметрыВыполнения.ДанныеФайла1, ПараметрыВыполнения.ПолноеИмяФайла1); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 4 Тогда + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, ПараметрыВыполнения.ДанныеФайла2, ПараметрыВыполнения.ПолноеИмяФайла2); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 5 Тогда + Если ПараметрыВыполнения.Результат1 И ПараметрыВыполнения.Результат2 Тогда + Если ПараметрыВыполнения.ДанныеФайла1.НомерВерсии < ПараметрыВыполнения.ДанныеФайла2.НомерВерсии Тогда + ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла1; + ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла2; + Иначе + ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла2; + ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла1; + КонецЕсли; + ШаблонЗаголовкаФайла = НСтр("ru='Файл №%1 (%2)'"); + ИмяФайла1 = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла1.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла1.Расширение); + ЗаголовокФайла1 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонЗаголовкаФайла, + ИмяФайла1, + ПараметрыВыполнения.ДанныеФайла1.НомерВерсии); + + ИмяФайла2 = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла2.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла2.Расширение); + ЗаголовокФайла2 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонЗаголовкаФайла, + ИмяФайла2, + ПараметрыВыполнения.ДанныеФайла2.НомерВерсии); + + ВыполнитьСравнениеФайлов( + ПолноеИмяФайлаСлева, + ПолноеИмяФайлаСправа, + ПараметрыВыполнения.СпособСравненияВерсийФайлов, + ЗаголовокФайла1, + ЗаголовокФайла2); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьСравнениеФайлов(ПутьКФайлу1, ПутьКФайлу2, СпособСравненияВерсийФайлов, ЗаголовокЛевый = "", ЗаголовокПравый = "") Экспорт Попытка Если СпособСравненияВерсийФайлов = "MicrosoftOfficeWord" Тогда ОбъектWord = Новый COMОбъект("Word.Application"); ОбъектWord.Visible = 0; - ОбъектWord.WordBasic.DisableAutoMacros(1); Документ = ОбъектWord.Documents.Open(ПутьКФайлу1); @@ -7327,15 +9223,9 @@ Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); Dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper"); - // Параметры открытия: отключение исполнения макросов. - ПараметрыДокумента = Новый COMSafeArray("VT_VARIANT", 1); - РежимЗапуска = ПрисвоитьЗначениеСвойству(ServiceManager, - "MacroExecutionMode", - 0); // const short NEVER_EXECUTE = 0 - ПараметрыДокумента.SetValue(0, РежимЗапуска); - // Открыть документ OpenOffice. - OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ПутьКФайлу2), "_blank", 0, ПараметрыДокумента); + Args = Новый COMSafeArray("VT_DISPATCH", 1); + OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ПутьКФайлу2), "_blank", 0, Args); frame = Desktop.getCurrentFrame(); @@ -7350,6 +9240,24 @@ dispatcher.executeDispatch(frame, ".uno:CompareDocuments", "", 0, ПараметрыВызова); OOДокумент = Неопределено; + ИначеЕсли СпособСравненияВерсийФайлов = "СравнениеТабличныхДокументов" Тогда + + ПомещаемыеФайлы = Новый Массив; + ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу1)); + ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу2)); + ПомещенныеФайлы = Новый Массив; + Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда + Возврат; + КонецЕсли; + ТабличныйДокументЛевый = ПомещенныеФайлы[0].Хранение; + ТабличныйДокументПравый = ПомещенныеФайлы[1].Хранение; + + ТабличныеДокументыСтруктура = Новый Структура("Левый, Правый", ТабличныйДокументЛевый, ТабличныйДокументПравый); + АдресТабличныхДокументов = ПоместитьВоВременноеХранилище(ТабличныеДокументыСтруктура, Неопределено); + + ПараметрыОткрытияФормы = Новый Структура("АдресТабличныхДокументов, ЗаголовокЛевый, ЗаголовокПравый", + АдресТабличныхДокументов, ЗаголовокЛевый, ЗаголовокПравый); + ФормаСравнения = ОткрытьФорму("ОбщаяФорма.СравнениеТабличныхДокументов", ПараметрыОткрытияФормы, ЭтотОбъект); КонецЕсли; Исключение @@ -7532,4 +9440,658 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Выполняет пакет неинтерактивных действий с файлом. +// Если файл не существует, то действия не будут пропущены. +// +// Можно получить следующие свойства: Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение, Существует, +// ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость, Размер, ЭтоКаталог, ЭтоФайл. +// +// Можно установить следующие свойства: ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость. +// Можно выполнить действия с файлом: Удалить. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после выполнения +// действий с файлом. В качестве результата возвращается Структура со свойствами: +// * ОписаниеОшибки - Строка - текст ошибки, если одно из действий выполнить не удалось. +// * Результаты - Массив - содержит результат по каждому действию в виде структуры: +// * Файл - Файл - инициализированный объект файл. +// - Неопределено - ошибка инициализации файла. +// * Существует - Булево - Ложь, если файл не существует. +// +// ДействияСФайлом - Массив - содержащий структуры с именем действия и параметрами действия; +// * Действие - Строка - ПолучитьСвойства, УстановитьСвойства, Удалить, СкопироватьИзИсточника, +// СоздатьКаталог, Получить, Поместить. +// * Файл - Строка - полное имя файла на компьютере. +// - Файл - инициализированный объект Файл. +// * Свойства - Структура - см. свойства которые можно получить или установить. +// * Источник - Строка - полное имя файла на компьютере из которого нужно создать копию. +// * Адрес - Строка - адрес двоичных данных файла, например, адрес временного хранилища. +// * ЗаголовокОшибки - Строка - текст к которому нужно добавить перевод строки и представление ошибки. +// +Процедура ОбработатьФайл(Оповещение, ДействияСФайлом, ИдентификаторФормы = Неопределено) + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); + Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + Контекст.Вставить("РезультатДействий", Новый Структура); + Контекст.РезультатДействий.Вставить("ОписаниеОшибки", ""); + Контекст.РезультатДействий.Вставить("Результаты", Новый Массив); + + Контекст.Вставить("Индекс", -1); + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлЦиклНачало(Контекст) + + Если Контекст.Индекс + 1 >= Контекст.ДействияСФайлом.Количество() Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); + Возврат; + КонецЕсли; + + Контекст.Индекс = Контекст.Индекс + 1; + Контекст.Вставить("ОписаниеДействия", Контекст.ДействияСФайлом[Контекст.Индекс]); + + Контекст.Вставить("Результат", Новый Структура); + Контекст.Результат.Вставить("Файл", Неопределено); + Контекст.Результат.Вставить("Существует", Ложь); + + Контекст.РезультатДействий.Результаты.Добавить(Контекст.Результат); + + Контекст.Вставить("СвойстваДляПолучения", Новый Структура); + Контекст.Вставить("СвойстваДляУстановки", Новый Структура); + + Действие = Контекст.ОписаниеДействия.Действие; + Файл = Контекст.ОписаниеДействия.Файл; + ПолноеИмяФайла = ?(ТипЗнч(Файл) = Тип("Файл"), Файл.ПолноеИмя, Файл); + + Если Действие = "Удалить" Тогда + НачатьУдалениеФайлов(Новый ОписаниеОповещения( + "ОбработатьФайлПослеУдаленияФайлов", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); + Возврат; + + ИначеЕсли Действие = "СкопироватьИзИсточника" Тогда + НачатьКопированиеФайла(Новый ОписаниеОповещения( + "ОбработатьФайлПослеКопированияФайла", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.ОписаниеДействия.Источник, ПолноеИмяФайла); + Возврат; + + ИначеЕсли Действие = "СоздатьКаталог" Тогда + НачатьСозданиеКаталога(Новый ОписаниеОповещения( + "ОбработатьФайлПослеСозданияКаталога", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); + Возврат; + + ИначеЕсли Действие = "Получить" Тогда + ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Контекст.ОписаниеДействия.Адрес); + ПолучаемыеФайлы = Новый Массив; + ПолучаемыеФайлы.Добавить(ОписаниеФайла); + НачатьПолучениеФайлов(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияФайлов", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), + ПолучаемыеФайлы, , Ложь); + Возврат; + + ИначеЕсли Действие = "Поместить" Тогда + ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла); + ПомещаемыеФайлы = Новый Массив; + ПомещаемыеФайлы.Добавить(ОписаниеФайла); + НачатьПомещениеФайлов(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПомещенияФайлов", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), + ПомещаемыеФайлы, , Ложь, Контекст.ИдентификаторФормы); + Возврат; + + ИначеЕсли Действие = "ПолучитьСвойства" Тогда + Контекст.Вставить("СвойстваДляПолучения", Контекст.ОписаниеДействия.Свойства); + + ИначеЕсли Действие = "УстановитьСвойства" Тогда + Контекст.Вставить("СвойстваДляУстановки", Контекст.ОписаниеДействия.Свойства); + КонецЕсли; + + Если ТипЗнч(Файл) = Тип("Файл") Тогда + Контекст.Вставить("Файл", Файл); + ОбработатьФайлПослеИнициализацииФайла(Файл, Контекст); + Иначе + Контекст.Вставить("Файл", Новый Файл); + Контекст.Файл.НачатьИнициализацию(Новый ОписаниеОповещения( + "ОбработатьФайлПослеИнициализацииФайла", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Файл); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда + Контекст.РезультатДействий.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Иначе + Контекст.РезультатДействий.ОписаниеОшибки = ИнформацияОбОшибке; + КонецЕсли; + + Если Контекст.ОписаниеДействия.Свойство("ЗаголовокОшибки") Тогда + Контекст.РезультатДействий.ОписаниеОшибки = Контекст.ОписаниеДействия.ЗаголовокОшибки + + Символы.ПС + Контекст.РезультатДействий.ОписаниеОшибки; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеУдаленияФайлов(Контекст) Экспорт + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеКопированияФайла(СкопированныйФайл, Контекст) Экспорт + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеСозданияКаталога(ИмяКаталога, Контекст) Экспорт + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт + + Если ТипЗнч(ПолученныеФайлы) <> Тип("Массив") Или ПолученныеФайлы.Количество() = 0 Тогда + ОбработатьФайлПослеОшибки(НСтр("ru = 'Получение файла было отменено.'"), , Контекст); + Возврат; + КонецЕсли; + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт + + Если ТипЗнч(ПомещенныеФайлы) <> Тип("Массив") Или ПомещенныеФайлы.Количество() = 0 Тогда + ОбработатьФайлПослеОшибки(НСтр("ru = 'Помещение файла было отменено.'"), , Контекст); + Возврат; + КонецЕсли; + + Контекст.ОписаниеДействия.Вставить("Адрес", ПомещенныеФайлы[0].Хранение); + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеИнициализацииФайла(Файл, Контекст) Экспорт + + Контекст.Вставить("Файл", Файл); + Контекст.Результат.Вставить("Файл", Файл); + ЗаполнитьЗначенияСвойств(Контекст.СвойстваДляПолучения, Файл); + + Контекст.Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПроверкиСуществования", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПроверкиСуществования(Существует, Контекст) Экспорт + + Контекст.Результат.Вставить("Существует", Существует); + + Если Не Контекст.Результат.Существует Тогда + ОбработатьФайлЦиклНачало(Контекст); + Возврат; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Количество() = 0 Тогда + ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); + + ИначеЕсли Контекст.СвойстваДляПолучения.Свойство("ВремяИзменения") Тогда + Контекст.Файл.НачатьПолучениеВремениИзменения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияВремениИзменения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПолученияВремениИзменения(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияВремениИзменения(ВремяИзменения, Контекст) Экспорт + + Если ВремяИзменения <> Null Тогда + Контекст.СвойстваДляПолучения.ВремяИзменения = ВремяИзменения; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("УниверсальноеВремяИзменения") Тогда + Контекст.Файл.НачатьПолучениеУниверсальногоВремениИзменения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(УниверсальноеВремяИзменения, Контекст) Экспорт + + Если УниверсальноеВремяИзменения <> Null Тогда + Контекст.СвойстваДляПолучения.УниверсальноеВремяИзменения = УниверсальноеВремяИзменения; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("ТолькоЧтение") Тогда + Контекст.Файл.НачатьПолучениеТолькоЧтения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияТолькоЧтения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПолученияТолькоЧтения(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияТолькоЧтения(ТолькоЧтение, Контекст) Экспорт + + Если ТолькоЧтение <> Null Тогда + Контекст.СвойстваДляПолучения.ТолькоЧтение = ТолькоЧтение; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("Невидимость") Тогда + Контекст.Файл.НачатьПолучениеНевидимости(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияНевидимости", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПолученияНевидимости(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияНевидимости(Невидимость, Контекст) Экспорт + + Если Невидимость <> Null Тогда + Контекст.СвойстваДляПолучения.Невидимость = Невидимость; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("Размер") Тогда + Контекст.Файл.НачатьПолучениеРазмера(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПолученияРазмера", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПолученияРазмера(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПолученияРазмера(Размер, Контекст) Экспорт + + Если Размер <> Null Тогда + Контекст.СвойстваДляПолучения.Размер = Размер; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("ЭтоКаталог") Тогда + Контекст.Файл.НачатьПроверкуЭтоКаталог(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПроверкиЭтоКаталог", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПроверкиЭтоКаталог(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПроверкиЭтоКаталог(ЭтоКаталог, Контекст) Экспорт + + Если ЭтоКаталог <> Null Тогда + Контекст.СвойстваДляПолучения.ЭтоКаталог = ЭтоКаталог; + КонецЕсли; + + Если Контекст.СвойстваДляПолучения.Свойство("ЭтоФайл") Тогда + Контекст.Файл.НачатьПроверкуЭтоФайл(Новый ОписаниеОповещения( + "ОбработатьФайлПослеПроверкиЭтоФайл", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект)); + Иначе + ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеПроверкиЭтоФайл(ЭтоФайл, Контекст) Экспорт + + Если ЭтоФайл <> Null Тогда + Контекст.СвойстваДляПолучения.ЭтоФайл = ЭтоФайл; + КонецЕсли; + + Если Контекст.СвойстваДляУстановки.Количество() = 0 Тогда + ОбработатьФайлПослеУстановкиНевидимости(Контекст); + + ИначеЕсли Контекст.СвойстваДляУстановки.Свойство("ВремяИзменения") Тогда + Контекст.Файл.НачатьУстановкуВремениИзменения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеУстановкиВремениИзменения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ВремяИзменения); + Иначе + ОбработатьФайлПослеУстановкиВремениИзменения(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеУстановкиВремениИзменения(Контекст) Экспорт + + Если Контекст.СвойстваДляУстановки.Свойство("УниверсальноеВремяИзменения") Тогда + Контекст.Файл.НачатьУстановкуУниверсальногоВремениИзменения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.УниверсальноеВремяИзменения); + Иначе + ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст) Экспорт + + Если Контекст.СвойстваДляУстановки.Свойство("ТолькоЧтение") Тогда + Контекст.Файл.НачатьУстановкуТолькоЧтения(Новый ОписаниеОповещения( + "ОбработатьФайлПослеУстановкиТолькоЧтения", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ТолькоЧтение); + Иначе + ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст) Экспорт + + Если Контекст.СвойстваДляУстановки.Свойство("Невидимость") Тогда + Контекст.Файл.НачатьУстановкуНевидимости(Новый ОписаниеОповещения( + "ОбработатьФайлПослеУстановкиНевидимости", ЭтотОбъект, Контекст, + "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.Невидимость); + Иначе + ОбработатьФайлПослеУстановкиНевидимости(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьФайл. +Процедура ОбработатьФайлПослеУстановкиНевидимости(Контекст) Экспорт + + ОбработатьФайлЦиклНачало(Контекст); + +КонецПроцедуры + +// Загружает файл с клиента во временное хранилище на сервере. Не работает без расширения работы с файлами. +Функция ПоместитьФайлСДискаВоВременноеХранилище(ПолноеИмяФайла, АдресФайла = "", УникальныйИдентификатор = Неопределено) Экспорт + Если Не РасширениеРаботыСФайламиПодключено() Тогда + Возврат Неопределено; + КонецЕсли; + ЧтоЗагрузить = Новый Массив; + ЧтоЗагрузить.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, АдресФайла)); + РезультатЗагрузки = Новый Массив; + ФайлЗагружен = ПоместитьФайлы(ЧтоЗагрузить, РезультатЗагрузки, , Ложь, УникальныйИдентификатор); + Если Не ФайлЗагружен Или РезультатЗагрузки.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + Возврат РезультатЗагрузки[0].Хранение; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функция для работы со сканером. + +// Инициализация компоненты сканирования. +Функция ПроинициализироватьКомпоненту() Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + Возврат Ложь; + КонецЕсли; + + ИмяПараметра = "СтандартныеПодсистемы.КомпонентаTwain"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); + Если Не КодВозврата Тогда + Возврат Ложь; + КонецЕсли; + + ПараметрыПриложения.Вставить(ИмяПараметра, Новый("AddIn.twain.AddInNativeExtension")); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Установка компоненты сканирования. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +// Возвращаемое значение: +// Булево - Успешно ли выполнена операция. +// +// См. также: +// Переменную глобального контекста КомпонентаTwain. +// +Процедура УстановитьКомпоненту(ОбработчикРезультата) Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + ВернутьРезультат(ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если ПроинициализироватьКомпоненту() Тогда + ВернутьРезультат(ОбработчикРезультата, Истина); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект, ПараметрыВыполнения); + НачатьУстановкуВнешнейКомпоненты(Обработчик, "ОбщийМакет.КомпонентаTWAIN"); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УстановитьКомпонентуЗавершение(ПараметрыВыполнения) Экспорт + + КомпонентаПодключена = ПроинициализироватьКомпоненту(); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, КомпонентаПодключена); + +КонецПроцедуры + +// Возвращает устройства TWAIN (массив строк). +Функция ПолучитьУстройства() Экспорт + + Массив = Новый Массив; + + Если Не ПроинициализироватьКомпоненту() Тогда + Возврат Массив; + КонецЕсли; + + СтрокаУстройств = ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ПолучитьУстройства(); + + Для Индекс = 1 По СтрЧислоСтрок(СтрокаУстройств) Цикл + Строка = СтрПолучитьСтроку(СтрокаУстройств, Индекс); + Массив.Добавить(Строка); + КонецЦикла; + + Возврат Массив; + +КонецФункции + +// Возвращает настройку сканера по имени. +// +// Параметры: +// ИмяУстройства - Строка - Имя сканера. +// ИмяНастройки - Строка - Имя настройки, +// например "XRESOLUTION", или "PIXELTYPE", или "ROTATION", или "SUPPORTEDSIZES". +// +// Возвращаемое значение: +// Число - Значение настройки сканера. +// +Функция ПолучитьНастройку(ИмяУстройства, ИмяНастройки) Экспорт + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда + Возврат -1; + КонецЕсли; + + Попытка + Возврат ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ПолучитьНастройку(ИмяУстройства, ИмяНастройки); + Исключение + Возврат -1; + КонецПопытки; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры для поддержки асинхронной модели. +// +Функция КлиентПоддерживаетСинхронныеВызовы() + +#Если ВебКлиент Тогда + // В Chrome и Firefox синхронные методы не поддерживаются. + СистемнаяИнформация = Новый СистемнаяИнформация; + ИнформацияПрограммыМассив = СтрРазделить(СистемнаяИнформация.ИнформацияПрограммыПросмотра, " ", Ложь); + + Для Каждого ИнформацияПрограммы Из ИнформацияПрограммыМассив Цикл + Если СтрНайти(ИнформацияПрограммы, "Chrome") > 0 ИЛИ СтрНайти(ИнформацияПрограммы, "Firefox") > 0 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; +#КонецЕсли + + Возврат Истина; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработка событий общих форм работы с файлами. + +Процедура ВыбратьРежимИРедактироватьФайл(ОбработчикРезультата, ДанныеФайла, ДоступностьКомандыРедактировать) Экспорт + // Выбрать режим открытия файла и начать редактирование. + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; + РезультатОтмена = "Отмена"; + + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + + СпособОткрытия = ПерсональныеНастройки.ТекстовыеФайлыСпособОткрытия; + Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда + + РасширениеВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ПерсональныеНастройки.ТекстовыеФайлыРасширение, + ДанныеФайла.Расширение); + + Если РасширениеВСписке Тогда + ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + Возврат; + КонецЕсли; + + КонецЕсли; + + СпособОткрытия = ПерсональныеНастройки.ГрафическиеСхемыСпособОткрытия; + Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда + + РасширениеВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ПерсональныеНастройки.ГрафическиеСхемыРасширение, + ДанныеФайла.Расширение); + + Если РасширениеВСписке Тогда + ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + Возврат; + КонецЕсли; + + КонецЕсли; + + // Если уже занят для редактирования, то не спрашивать - сразу открывать. + Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) + И ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла = Истина + И ДоступностьКомандыРедактировать Тогда + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("ВыбратьРежимИРедактироватьФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВыбораРежимаОткрытия", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + +КонецПроцедуры + +Процедура ВыбратьРежимИРедактироватьФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; + РезультатОтмена = "Отмена"; + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОтмена); + Возврат; + КонецЕсли; + + Если Результат.КакОткрывать = 1 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатРедактировать); + Возврат; + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОткрыть); + +КонецПроцедуры + +Функция ФайловыеКомандыДоступны(Элементы) Экспорт + // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка. + + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + + Если ФайлСсылка = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////// +// Печать табличного документа со штампом электронной подписи. + +Процедура ПечатьФайлаСоШтампом(ТабличныйДокумент) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); + ИдентификаторПечатнойФормы = "ПрисоединенныйФайл"; + ТабличныйДокумент.Защита = Ложь; + + КоллекцияПечатныхФорм = МодульУправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(ИдентификаторПечатнойФормы); + ПечатнаяФорма = МодульУправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, ИдентификаторПечатнойФормы); + ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Файл со штампом'"); + ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент; + + МодульУправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм); + Иначе + ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Использовать); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl index 1a50b15c8..f28ad165f 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl @@ -8,7 +8,84 @@ // Проверяет установлена ли компонента сканирования и есть ли хоть один сканер. Функция ДоступнаКомандаСканировать() Экспорт - Возврат ФайловыеФункцииСлужебныйКлиент.ДоступнаКомандаСканировать(); + Возврат РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); + +КонецФункции + +// Возвращает структуру, содержащую различные персональные настройки. +Функция ПерсональныеНастройкиРаботыСФайлами() Экспорт + + ПерсональныеНастройки = + СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами; + + // Проверка и обновление настроек сохраненных на сервере, + // которые вычисляются на клиенте. + + Возврат ПерсональныеНастройки; + +КонецФункции + +// Возвращает структуру, содержащую различные персональные настройки. +Функция ОбщиеНастройкиРаботыСФайлами() Экспорт + + ОбщиеНастройки = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ОбщиеНастройкиРаботыСФайлами; + + // Проверка и обновление настроек сохраненных на сервере, + // которые вычисляются на клиенте. + + Возврат ОбщиеНастройки; + +КонецФункции + +// Возвращает параметр сеанса ПутьКРабочемуКаталогуПользователя. +Функция РабочийКаталогПользователя() Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); + КонецЕсли; + + ИмяКаталога = + СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов; + + // Уже установлен. + Если ИмяКаталога <> Неопределено + И НЕ ПустаяСтрока(ИмяКаталога) + И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда + + Возврат ИмяКаталога; + КонецЕсли; + + Если ИмяКаталога = Неопределено Тогда + ИмяКаталога = РаботаСФайламиСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя(); + Если НЕ ПустаяСтрока(ИмяКаталога) Тогда + РаботаСФайламиСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); + Иначе + ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; + Возврат ""; // Веб клиент без расширения работы с файлами. + КонецЕсли; + КонецЕсли; + +#Если НЕ ВебКлиент Тогда + + // Создать каталог для файлов. + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // Нет прав на создание каталога, или такой путь отсутствует, + // тогда установка настроек по умолчанию. + ИмяКаталога = РаботаСФайламиСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя(); + РаботаСФайламиСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); + КонецПопытки; + +#КонецЕсли + + ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; + + Возврат ИмяКаталога; КонецФункции diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl similarity index 94% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl rename to SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl index ff3524dba..030083b3e 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl @@ -1,34 +1,25 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Персональные настройки состоят из настроек подсистемы ФайловыеФункции. -// (см. ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами), -// а также настроек подсистем РаботаСФайлами и ПрисоединенныеФайлы. +// Возвращает персональные настройки. // Функция ПерсональныеНастройкиРаботыСФайлами() Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Возврат ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами().ПерсональныеНастройки; + Возврат РаботаСФайламиСлужебныйПовтИсп.НастройкиРаботыСФайлами().ПерсональныеНастройки; #Иначе - Возврат ФайловыеФункцииСлужебныйКлиентПовтИсп.ПерсональныеНастройкиРаботыСФайлами(); + Возврат РаботаСФайламиСлужебныйКлиентПовтИсп.ПерсональныеНастройкиРаботыСФайлами(); #КонецЕсли КонецФункции -// Персональные настройки состоят из настроек подсистемы ФайловыеФункции. -// (см. ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами), -// а также настроек подсистем РаботаСФайлами и ПрисоединенныеФайлы. +// Возвращает персональные общие настройки. // Функция ОбщиеНастройкиРаботыСФайлами() Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Возврат ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами().ОбщиеНастройки; + Возврат РаботаСФайламиСлужебныйПовтИсп.НастройкиРаботыСФайлами().ОбщиеНастройки; #Иначе - Возврат ФайловыеФункцииСлужебныйКлиентПовтИсп.ОбщиеНастройкиРаботыСФайлами(); + Возврат РаботаСФайламиСлужебныйКлиентПовтИсп.ОбщиеНастройкиРаботыСФайлами(); #КонецЕсли КонецФункции @@ -117,7 +108,7 @@ ТекстовыйФайл.Закрыть(); #Если Клиент Тогда - РезультатЗагрузки = ФайловыеФункцииСлужебныйКлиент.ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); + РезультатЗагрузки = РаботаСФайламиСлужебныйКлиент.ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); Если РезультатЗагрузки <> Неопределено Тогда АдресВременногоХранилища = РезультатЗагрузки; КонецЕсли; @@ -443,8 +434,7 @@ Функция ПолучитьИндексПиктограммыФайла(Знач РасширениеФайла) Экспорт Если ТипЗнч(РасширениеФайла) <> Тип("Строка") - ИЛИ ПустаяСтрока(РасширениеФайла) Тогда - + ИЛИ ПустаяСтрока(РасширениеФайла) Тогда Возврат 0; КонецЕсли; @@ -491,7 +481,7 @@ ИначеЕсли СтрНайти(".xml;",Расширение) <> 0 Тогда Возврат 30; // xml. - ИначеЕсли СтрНайти(".msg;",Расширение) <> 0 Тогда + ИначеЕсли СтрНайти(".msg;.eml;",Расширение) <> 0 Тогда Возврат 32; // Письмо электронной почты. ИначеЕсли СтрНайти(".zip;.rar;.arj;.cab;.lzh;.ace;",Расширение) <> 0 Тогда @@ -624,6 +614,53 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Синхронизация файлов + +Функция АдресВОблачномСервисе(Сервис, Href) Экспорт + + АдресОбъекта = Href; + + Если Не ПустаяСтрока(Сервис) Тогда + Если Сервис = "https://webdav.yandex.ru" Тогда + АдресОбъекта = СтрЗаменить(Href, "https://webdav.yandex.ru", "https://disk.yandex.ru/client/disk"); + ИначеЕсли Сервис = "https://webdav.4shared.com" Тогда + АдресОбъекта = "http://www.4shared.com/folder"; + ИначеЕсли Сервис = "https://dav.box.com/dav" Тогда + АдресОбъекта = "https://app.box.com/files/0/"; + ИначеЕсли Сервис = "https://dav.dropdav.com" Тогда + АдресОбъекта = "https://www.dropbox.com/home/"; + КонецЕсли; + КонецЕсли; + + Возврат АдресОбъекта; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции +// Получить имя сканированного файла, вида ДМ-00000012, где ДМ - префикс базы. +// +// Параметры: +// НомерФайла - Число - целое число, например, 12. +// ПрефиксБазы - Строка - префикс базы, например, "ДМ". +// +// Возвращаемое значение: +// Строка - имя сканированного файла, например, "ДМ-00000012". +// +Функция ИмяСканированногоФайла(НомерФайла, ПрефиксБазы) Экспорт + + ИмяФайла = ""; + Если НЕ ПустаяСтрока(ПрефиксБазы) Тогда + ИмяФайла = ПрефиксБазы + "-"; + КонецЕсли; + + ИмяФайла = ИмяФайла + Формат(НомерФайла, "ЧЦ=9; ЧВН=; ЧГ=0"); + Возврат ИмяФайла; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -680,15 +717,15 @@ ЧтениеXML.ОткрытьФайл(ВременнаяПапкаДляРазархивирования + "/content.xml"); ИзвлеченныйТекст = ИзвлечьТекстИзContentXML(ЧтениеXML); ЧтениеXML.Закрыть(); - - УдалитьФайлы(ВременнаяПапкаДляРазархивирования); - УдалитьФайлы(ВременныйZIPФайл); Исключение // Не считаем ошибкой, т.к. например расширение OTF может быть как OpenDocument, так и шрифт OpenType. Отказ = Истина; ИзвлеченныйТекст = ""; КонецПопытки; + УдалитьФайлы(ВременнаяПапкаДляРазархивирования); + УдалитьФайлы(ВременныйZIPФайл); + #КонецЕсли Возврат ИзвлеченныйТекст; @@ -764,53 +801,6 @@ Возврат ИзвлеченныйТекст; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов - -Функция АдресВОблачномСервисе(Сервис, Href) Экспорт - - АдресОбъекта = Href; - - Если Не ПустаяСтрока(Сервис) Тогда - Если Сервис = "https://webdav.yandex.ru" Тогда - АдресОбъекта = СтрЗаменить(Href, "https://webdav.yandex.ru", "https://disk.yandex.ru/client/disk"); - ИначеЕсли Сервис = "https://webdav.4shared.com" Тогда - АдресОбъекта = "http://www.4shared.com/folder"; - ИначеЕсли Сервис = "https://dav.box.com/dav" Тогда - АдресОбъекта = "https://app.box.com/files/0/"; - ИначеЕсли Сервис = "https://dav.dropdav.com" Тогда - АдресОбъекта = "https://www.dropbox.com/home/"; - КонецЕсли; - КонецЕсли; - - Возврат АдресОбъекта; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции -// Получить имя сканированного файла, вида ДМ-00000012, где ДМ - префикс базы. -// -// Параметры: -// НомерФайла - Число - целое число, например, 12. -// ПрефиксБазы - Строка - префикс базы, например, "ДМ". -// -// Возвращаемое значение: -// Строка - имя сканированного файла, например, "ДМ-00000012". -// -Функция ИмяСканированногоФайла(НомерФайла, ПрефиксБазы) Экспорт - - ИмяФайла = ""; - Если НЕ ПустаяСтрока(ПрефиксБазы) Тогда - ИмяФайла = ПрефиксБазы + "-"; - КонецЕсли; - - ИмяФайла = ИмяФайла + Формат(НомерФайла, "ЧЦ=9; ЧВН=; ЧГ=0"); - Возврат ИмяФайла; - КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/РаботаСФайламиСлужебныйКлиентСервер.mdo b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/РаботаСФайламиСлужебныйКлиентСервер.mdo new file mode 100644 index 000000000..d4f102f03 --- /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 similarity index 92% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйПовтИсп/Module.bsl rename to SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl index 1d8f23513..9e403337e 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl @@ -14,8 +14,7 @@ ОбщиеНастройки = Новый Структура; ПерсональныеНастройки = Новый Структура; - ФайловыеФункцииСлужебный.ПриДобавленииНастроекРаботыСФайлами( - ОбщиеНастройки, ПерсональныеНастройки); + РаботаСФайламиСлужебныйВызовСервера.ДобавитьНастройкиРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки); ДобавитьНастройкиРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки); @@ -36,10 +35,10 @@ // ИзвлекатьТекстыФайловНаСервере. ОбщиеНастройки.Вставить( - "ИзвлекатьТекстыФайловНаСервере", ФайловыеФункцииСлужебный.ИзвлекатьТекстыФайловНаСервере()); + "ИзвлекатьТекстыФайловНаСервере", РаботаСФайламиСлужебный.ИзвлекатьТекстыФайловНаСервере()); // МаксимальныйРазмерФайла. - ОбщиеНастройки.Вставить("МаксимальныйРазмерФайла", ФайловыеФункции.МаксимальныйРазмерФайла()); + ОбщиеНастройки.Вставить("МаксимальныйРазмерФайла", РаботаСФайлами.МаксимальныйРазмерФайла()); // ЗапрещатьЗагрузкуФайловПоРасширению. ЗапрещатьЗагрузкуФайловПоРасширению = Константы.ЗапрещатьЗагрузкуФайловПоРасширению.Получить(); @@ -82,7 +81,7 @@ "ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); // Не следует получать эту переменную непосредственно. // Нужно использовать функцию РабочийКаталогПользователя - // модуля ФайловыеФункцииСлужебныйКлиент. + // модуля РаботаСФайламиСлужебныйКлиент. ПерсональныеНастройки.Вставить("ПутьКЛокальномуКэшуФайлов", ПутьКЛокальномуКэшуФайлов); // УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования. @@ -186,8 +185,8 @@ ИтоговыйСписокРасширений = ""; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СписокЗапрещенныхРасширений = Константы.СписокЗапрещенныхРасширений.Получить(); @@ -220,8 +219,8 @@ ИтоговыйСписокРасширений = ""; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СписокЗапрещенныхРасширений = Константы.СписокРасширенийФайловOpenDocument.Получить(); @@ -243,7 +242,12 @@ Если ПустаяСтрока(СписокРасширенийТекстовыхФайлов) Тогда СписокРасширенийТекстовыхФайлов = "TXT"; - Константы.СписокРасширенийТекстовыхФайлов.Установить(СписокРасширенийТекстовыхФайлов); + + Если НЕ ОбщегоНазначения.РазделениеВключено() + ИЛИ НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Константы.СписокРасширенийТекстовыхФайлов.Установить(СписокРасширенийТекстовыхФайлов); + КонецЕсли; + КонецЕсли; Возврат СписокРасширенийТекстовыхФайлов; diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйПовтИсп/ФайловыеФункцииСлужебныйПовтИсп.mdo b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/РаботаСФайламиСлужебныйПовтИсп.mdo similarity index 71% rename from SSL/src/CommonModules/ФайловыеФункцииСлужебныйПовтИсп/ФайловыеФункцииСлужебныйПовтИсп.mdo rename to SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/РаботаСФайламиСлужебныйПовтИсп.mdo index c1c5ea5e9..9ba9614ea 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйПовтИсп/ФайловыеФункцииСлужебныйПовтИсп.mdo +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/РаботаСФайламиСлужебныйПовтИсп.mdo @@ -1,9 +1,9 @@ - ФайловыеФункцииСлужебныйПовтИсп + РаботаСФайламиСлужебныйПовтИсп ru - Файловые функции служебный повт исп + Работа с файлами служебный повт исп true true diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl index 9209ee665..5af245d49 100644 --- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (сервер). -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Подготавливает параметры для функции ВыполнитьРассылку и выполняет ее. @@ -137,6 +132,7 @@ ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Рассылка.ИспользоватьСетевойКаталог); ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Рассылка.ИспользоватьFTPРесурс); ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Рассылка.ИспользоватьЭлектроннуюПочту); + ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Рассылка.ТранслитерироватьИменаФайлов); // Проверки отмеченных способов доставки. Если Не ПараметрыДоставки.ИспользоватьПапку @@ -310,7 +306,7 @@ // И соответствующая им возможность уведомления: // { ТолькоУведомить = Ложь } // * ТолькоУведомить - Булево, Ложь - Отправлять только уведомления (не присоединять сформированные отчеты). -// * СкрытыеКопии - Булево, Ложь - Если "Истина", то при отправке вместо "Кому" заполняется "СлепыеКопии". +// * СкрытыеКопии - Булево, Ложь - Если "Истина", то при отправке вместо "Кому" заполняется "СкрытыеКопии". // * ШаблонТемы - Строка - Тема письма. // * ШаблонТекста - Строка - Тело письма. // * ПараметрыПисьма - Структура - Параметры сообщения, @@ -505,7 +501,7 @@ // Добавляет формат (в случае его отсутствия) и устанавливает его параметры (если переданы). // // Параметры: -// СписокФорматов - Передается из параметров процедуры "как есть". +// СписокФорматов - СписокЗначений - Список форматов. // ФорматСсылка - Строка, ПеречислениеСсылка.ФорматыСохраненияОтчетов - Ссылка или имя формата. // Картинка - Картинка - Необязательный. Картинка формата. // ИспользоватьПоУмолчанию - Булево - Необязательный. Признак того, что формат используется по умолчанию. @@ -729,157 +725,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныйМодуль = "РассылкаОтчетов"; - - Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - Событие = "СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - Обработчики обновления. -// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.Версия = "2.3.3.30"; - Обработчик.Комментарий = НСтр("ru = 'Отключает неиспользуемые регламентные задания рассылок отчетов.'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("b1467977-94b3-4282-9ece-09f127e54775"); - Обработчик.Процедура = "РассылкаОтчетов.АктуализироватьСписокРегламентныхЗаданий"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "РассылкаОтчетов.ЗарегистрироватьДанныеДляАктуализацииСпискаРегламентныхЗаданий"; - Обработчик.ЧитаемыеОбъекты = "Справочник.РассылкиОтчетов"; - Обработчик.ИзменяемыеОбъекты = "РегламентноеЗадание.РассылкаОтчетов"; - -КонецПроцедуры - -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - ТекстЗапроса = // ОБЪЕДИНИТЬ ВСЕ используется вместо ИЛИ (требование стандартов). - "ВЫБРАТЬ - | РассылкиОтчетов.Ссылка, - | РассылкиОтчетов.ИспользоватьFTPРесурс, - | РассылкиОтчетов.FTPСервер, - | РассылкиОтчетов.FTPКаталог, - | РассылкиОтчетов.FTPПорт, - | РассылкиОтчетов.ИспользоватьСетевойКаталог, - | РассылкиОтчетов.СетевойКаталогWindows, - | РассылкиОтчетов.СетевойКаталогLinux - |ИЗ - | Справочник.РассылкиОтчетов КАК РассылкиОтчетов - |ГДЕ - | РассылкиОтчетов.ПометкаУдаления = ЛОЖЬ - | И РассылкиОтчетов.ИспользоватьСетевойКаталог = ИСТИНА - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | РассылкиОтчетов.Ссылка, - | РассылкиОтчетов.ИспользоватьFTPРесурс, - | РассылкиОтчетов.FTPСервер, - | РассылкиОтчетов.FTPКаталог, - | РассылкиОтчетов.FTPПорт, - | РассылкиОтчетов.ИспользоватьСетевойКаталог, - | РассылкиОтчетов.СетевойКаталогWindows, - | РассылкиОтчетов.СетевойКаталогLinux - |ИЗ - | Справочник.РассылкиОтчетов КАК РассылкиОтчетов - |ГДЕ - | РассылкиОтчетов.ПометкаУдаления = ЛОЖЬ - | И РассылкиОтчетов.ИспользоватьFTPРесурс = ИСТИНА"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - - Рассылка = Запрос.Выполнить().Выбрать(); - Пока Рассылка.Следующий() Цикл - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( - РазрешенияНаРесурсыСервера(Рассылка), Рассылка.Ссылка)); - - КонецЦикла; - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - Если Не ПравоДобавления() Тогда - Возврат; - КонецЕсли; - - ИмяДела = "ПроблемыСРассылкамиОтчетов"; - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если МодульТекущиеДелаСервер.ДелоОтключено(ИмяДела) Тогда - Возврат; - КонецЕсли; - - КоличествоПроблем = КоличествоПроблемСРассылкамиОтчетов(); - - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя()); - Для Каждого Раздел Из Разделы Цикл - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИмяДела + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело.ЕстьДела = КоличествоПроблем > 0; - Дело.Представление = НСтр("ru = 'Проблемы с рассылками отчетов'"); - Дело.Количество = КоличествоПроблем; - Дело.Форма = "Справочник.РассылкиОтчетов.ФормаСписка"; - Дело.Важное = Истина; - Дело.Владелец = Раздел; - КонецЦикла; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Добавляет команды создания рассылок в форму отчета. // // Места использования: @@ -896,60 +741,24 @@ КонецЕсли; // Добавление команд и кнопок - ПодменюИмя = "ОтправитьРассылку"; - КомандаСоздать = Форма.Команды.Добавить("РассылкаОтчетовСоздатьНовую"); - КомандаСоздать.Действие = "Подключаемый_Команда"; + КомандаСоздать.Действие = "РассылкаОтчетовКлиент.СоздатьНовуюРассылкуИзОтчета"; КомандаСоздать.Картинка = БиблиотекаКартинок.РассылкаОтчетов; КомандаСоздать.Заголовок = НСтр("ru = 'Создать рассылку отчетов...'"); КомандаСоздать.Подсказка = НСтр("ru = 'Создать новую рассылку отчетов и добавить в нее отчет с текущими настройками.'"); КомандаПрисоединить = Форма.Команды.Добавить("РассылкаОтчетовПрисоединитьКСуществующей"); - КомандаПрисоединить.Действие = "Подключаемый_Команда"; + КомандаПрисоединить.Действие = "РассылкаОтчетовКлиент.ПрисоединитьОтчетКСуществующейРассылке"; КомандаПрисоединить.Картинка = БиблиотекаКартинок.РассылкаОтчетов; КомандаПрисоединить.Заголовок = НСтр("ru = 'Включить в существующую рассылку отчетов...'"); КомандаПрисоединить.Подсказка = НСтр("ru = 'Присоединить отчет с текущими настройками к существующей рассылке отчетов.'"); - Форма.ПостоянныеКоманды.Добавить(КомандаСоздать.Имя, "РассылкаОтчетовКлиент"); - Форма.ПостоянныеКоманды.Добавить(КомандаПрисоединить.Имя, "РассылкаОтчетовКлиент"); + Команды = Новый Массив; + Команды.Добавить(КомандаСоздать); + Команды.Добавить(КомандаПрисоединить); - Подменю = Форма.Элементы.Добавить(ПодменюИмя, Тип("ГруппаФормы"), Форма.Элементы.ГруппаОтправить); - Подменю.Вид = ВидГруппыФормы.ГруппаКнопок; - Подменю.Заголовок = НСтр("ru = 'Отправить рассылку'"); + ОтчетыСервер.ВывестиКоманду(Форма, Команды, "ПодменюОтправить", Ложь, Ложь, "РассылкаОтчетов"); - ЭлементСоздать = Форма.Элементы.Добавить(КомандаСоздать.Имя, Тип("КнопкаФормы"), Подменю); - ЭлементСоздать.ИмяКоманды = КомандаСоздать.Имя; - ЭлементСоздать.ТолькоВоВсехДействиях = Ложь; - - ЭлементПрисоединить = Форма.Элементы.Добавить(КомандаПрисоединить.Имя, Тип("КнопкаФормы"), Подменю); - ЭлементПрисоединить.ИмяКоманды = КомандаПрисоединить.Имя; - ЭлементПрисоединить.ТолькоВоВсехДействиях = Ложь; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов; - Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость.Параметризуется = Истина; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -997,6 +806,151 @@ Возврат РассылкаОтчетовПовтИсп.ТекстОшибкиПроверкиПраваДобавления() = ""; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.Версия = "2.3.3.30"; + Обработчик.Комментарий = НСтр("ru = 'Отключает неиспользуемые регламентные задания рассылок отчетов.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("b1467977-94b3-4282-9ece-09f127e54775"); + Обработчик.Процедура = "РассылкаОтчетов.АктуализироватьСписокРегламентныхЗаданий"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РассылкаОтчетов.ЗарегистрироватьДанныеДляАктуализацииСпискаРегламентныхЗаданий"; + Обработчик.ЧитаемыеОбъекты = "Справочник.РассылкиОтчетов"; + Обработчик.ИзменяемыеОбъекты = "РегламентноеЗадание.РассылкаОтчетов"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + ТекстЗапроса = // ОБЪЕДИНИТЬ ВСЕ используется вместо ИЛИ (требование стандартов). + "ВЫБРАТЬ + | РассылкиОтчетов.Ссылка, + | РассылкиОтчетов.ИспользоватьFTPРесурс, + | РассылкиОтчетов.FTPСервер, + | РассылкиОтчетов.FTPКаталог, + | РассылкиОтчетов.FTPПорт, + | РассылкиОтчетов.ИспользоватьСетевойКаталог, + | РассылкиОтчетов.СетевойКаталогWindows, + | РассылкиОтчетов.СетевойКаталогLinux + |ИЗ + | Справочник.РассылкиОтчетов КАК РассылкиОтчетов + |ГДЕ + | РассылкиОтчетов.ПометкаУдаления = ЛОЖЬ + | И РассылкиОтчетов.ИспользоватьСетевойКаталог = ИСТИНА + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | РассылкиОтчетов.Ссылка, + | РассылкиОтчетов.ИспользоватьFTPРесурс, + | РассылкиОтчетов.FTPСервер, + | РассылкиОтчетов.FTPКаталог, + | РассылкиОтчетов.FTPПорт, + | РассылкиОтчетов.ИспользоватьСетевойКаталог, + | РассылкиОтчетов.СетевойКаталогWindows, + | РассылкиОтчетов.СетевойКаталогLinux + |ИЗ + | Справочник.РассылкиОтчетов КАК РассылкиОтчетов + |ГДЕ + | РассылкиОтчетов.ПометкаУдаления = ЛОЖЬ + | И РассылкиОтчетов.ИспользоватьFTPРесурс = ИСТИНА"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Рассылка = Запрос.Выполнить().Выбрать(); + Пока Рассылка.Следующий() Цикл + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( + РазрешенияНаРесурсыСервера(Рассылка), Рассылка.Ссылка)); + + КонецЦикла; + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + Если Не ПравоДобавления() Тогда + Возврат; + КонецЕсли; + + ИмяДела = "ПроблемыСРассылкамиОтчетов"; + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если МодульТекущиеДелаСервер.ДелоОтключено(ИмяДела) Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КОЛИЧЕСТВО(РассылкиОтчетов.Ссылка) КАК Количество + |ИЗ + | РегистрСведений.СостоянияРассылокОтчетов КАК СостоянияРассылокОтчетов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.РассылкиОтчетов КАК РассылкиОтчетов + | ПО СостоянияРассылокОтчетов.Рассылка = РассылкиОтчетов.Ссылка + |ГДЕ + | РассылкиОтчетов.Подготовлена = ИСТИНА + | И СостоянияРассылокОтчетов.СОшибками = ИСТИНА + | И РассылкиОтчетов.Автор = &Автор"; + Отборы = Новый Структура; + Отборы.Вставить("ПометкаУдаления", Ложь); + Отборы.Вставить("Подготовлена", Истина); + Отборы.Вставить("СОшибками", Истина); + Отборы.Вставить("ЭтоГруппа", Ложь); + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И РассылкиОтчетов.Автор = &Автор", ""); + Иначе + Отборы.Вставить("Автор", Пользователи.ТекущийПользователь()); + Запрос.УстановитьПараметр("Автор", Отборы.Автор); + КонецЕсли; + КоличествоПроблем = Запрос.Выполнить().Выгрузить()[0].Количество; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Отбор", Отборы); + ПараметрыФормы.Вставить("Отображение", "Список"); + + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя()); + Для Каждого Раздел Из Разделы Цикл + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИмяДела + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело.ЕстьДела = КоличествоПроблем > 0; + Дело.Представление = НСтр("ru = 'Проблемы с рассылками отчетов'"); + Дело.Количество = КоличествоПроблем; + Дело.Форма = "Справочник.РассылкиОтчетов.ФормаСписка"; + Дело.ПараметрыФормы = ПараметрыФормы; + Дело.Важное = Истина; + Дело.Владелец = Раздел; + КонецЦикла; +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов; + Зависимость.РаботаетСВнешнимиРесурсами = Истина; + Зависимость.Параметризуется = Истина; +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1009,13 +963,13 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | РассылкиОтчетов.Ссылка + | РассылкиОтчетов.Ссылка КАК Ссылка |ИЗ | Справочник.РассылкиОтчетов КАК РассылкиОтчетов |ГДЕ | НЕ(РассылкиОтчетов.Подготовлена - | И РассылкиОтчетов.ВыполнятьПоРасписанию) - |И РассылкиОтчетов.ЭтоГруппа = ЛОЖЬ"; + | И РассылкиОтчетов.ВыполнятьПоРасписанию) + | И РассылкиОтчетов.ЭтоГруппа = ЛОЖЬ"; МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); @@ -1030,10 +984,12 @@ Пока РассылкиОтчетов.Следующий() Цикл Попытка - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РассылкиОтчетов.Ссылка.РегламентноеЗадание); - Если Задание <> Неопределено И Задание.Использование Тогда - Задание.Использование = Ложь; - Задание.Записать(); + Если РассылкиОтчетов.Ссылка <> NULL И РассылкиОтчетов.Ссылка.РегламентноеЗадание <> NULL Тогда + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РассылкиОтчетов.Ссылка.РегламентноеЗадание); + Если Задание <> Неопределено И Задание.Использование Тогда + Задание.Использование = Ложь; + Задание.Записать(); + КонецЕсли; КонецЕсли; ОбъектовОбработано = ОбъектовОбработано + 1; ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(РассылкиОтчетов.Ссылка); @@ -1041,9 +997,10 @@ // Если не удалось обработать какую-либо рассылку отчетов, повторяем попытку снова. ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + ТипОбъекта = Строка(ТипЗнч(РассылкиОтчетов.Ссылка.РегламентноеЗадание)); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось обработать регламентное задание рассылки отчетов: %1 по причине: %2'"), - РассылкиОтчетов.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + НСтр("ru = 'Не удалось обработать регламентное задание рассылки отчетов: %1 с типом %2 по причине: %3'"), + Строка(РассылкиОтчетов.Ссылка), ТипОбъекта, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.РассылкиОтчетов, РассылкиОтчетов.Ссылка, ТекстСообщения); КонецПопытки; @@ -1306,7 +1263,8 @@ | - Выбраны пустые группы получателей; | - Получатели помечены на удаление; | - Исключены все получатели (исключение имеет наивысший приоритет; участники исключенных групп также исключаются из списка); - | - Недостаточно прав доступа к справочнику.'"); + | - Недостаточно прав доступа к справочнику; + | - Рекомендуется проверить корректность настройки учетной записи электронной почты, от имени которой выполняется рассылка.'"); ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, ТекстОшибок, "", @@ -1834,9 +1792,12 @@ // Формирует массив разрешений по данным рассылки отчетов. Функция РазрешенияНаРесурсыСервера(Рассылка) Экспорт Разрешения = Новый Массив; + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Если Рассылка.ИспользоватьСетевойКаталог Тогда Если ЗначениеЗаполнено(Рассылка.СетевойКаталогWindows) Тогда - Элемент = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + Элемент = МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( Рассылка.СетевойКаталогWindows, Истина, Истина, @@ -1844,7 +1805,7 @@ Разрешения.Добавить(Элемент); КонецЕсли; Если ЗначениеЗаполнено(Рассылка.СетевойКаталогLinux) Тогда - Элемент = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + Элемент = МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( Рассылка.СетевойКаталогLinux, Истина, Истина, @@ -1854,7 +1815,7 @@ КонецЕсли; Если Рассылка.ИспользоватьFTPРесурс Тогда Если ЗначениеЗаполнено(Рассылка.FTPСервер) Тогда - Элемент = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( + Элемент = МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса( "FTP", Рассылка.FTPСервер + Рассылка.FTPКаталог, Рассылка.FTPПорт, @@ -1926,11 +1887,8 @@ КонецЕсли; ПолноеИмяФайла = КаталогПолучателя + ПривестиИмяФайла( - СтрокаОтчет.Ключ - + " (" - + ПараметрыФормата.Имя - + ")" - + ?(ПараметрыФормата.Расширение = Неопределено, "", ПараметрыФормата.Расширение)); + СтрокаОтчет.Ключ + " (" + ПараметрыФормата.Имя + ")" + + ?(ПараметрыФормата.Расширение = Неопределено, "", ПараметрыФормата.Расширение), ПараметрыДоставки.ТранслитерироватьИменаФайлов); НайтиСвободноеИмяФайла(ПолноеИмяФайла); @@ -1938,9 +1896,9 @@ // Механизм расширения РассылкаОтчетовПереопределяемый.ПередСохранениемТабличногоДокументаВФормат( - СтандартнаяОбработка, - СтрокаОтчет.Значение, - Формат, + СтандартнаяОбработка, + СтрокаОтчет.Значение, + Формат, ПолноеИмяФайла); // Сохранение отчета встроенными средствами подсистемы. @@ -2301,7 +2259,7 @@ КонецЕсли; Структура = Новый Структура("НаименованиеРассылки, ДатаВыполнения", ПараметрыДоставки.Рассылка, ТекущаяДатаСеанса()); ИмяАрхива = РассылкаОтчетовКлиентСервер.ЗаполнитьШаблон(ПараметрыДоставки.ИмяАрхива, Структура); - ПараметрыДоставки.ИмяАрхива = ПривестиИмяФайла(ИмяАрхива); + ПараметрыДоставки.ИмяАрхива = ПривестиИмяФайла(ИмяАрхива, ПараметрыДоставки.ТранслитерироватьИменаФайлов); Если НРег(Прав(ПараметрыДоставки.ИмяАрхива, 4)) <> ".zip" Тогда ПараметрыДоставки.ИмяАрхива = ПараметрыДоставки.ИмяАрхива +".zip"; КонецЕсли; @@ -2379,7 +2337,7 @@ ПараметрыПисьма.Вставить("Тело", ШаблонТекста); // Тема и тело сообщения - КлючАдресаДоставки = ?(ПараметрыДоставки.СкрытыеКопии, "СлепыеКопии", "Кому"); + КлючАдресаДоставки = ?(ПараметрыДоставки.СкрытыеКопии, "СкрытыеКопии", "Кому"); Если Получатель = Неопределено Тогда Если ПараметрыДоставки.Получатели.Количество() = 0 Тогда @@ -2402,7 +2360,7 @@ ПараметрыПисьма.Вставить(КлючАдресаДоставки, КлючИЗначение.Значение); // Отправляем письмо - РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(ПараметрыДоставки.УчетнаяЗапись, ПараметрыПисьма, ПараметрыДоставки.Соединение); + ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма); КонецЦикла; Иначе // Шаблоны не персонализированы - склеивание E-Mail адресов получателей и совместная доставка. @@ -2414,7 +2372,7 @@ ПараметрыПисьма.Вставить(КлючАдресаДоставки, Кому); // Отправляем письмо - РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(ПараметрыДоставки.УчетнаяЗапись, ПараметрыПисьма, ПараметрыДоставки.Соединение); + ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма); КонецЕсли; Иначе // Доставка конкретному получателю. @@ -2431,11 +2389,24 @@ ПараметрыПисьма.Вставить(КлючАдресаДоставки, ПараметрыДоставки.Получатели[Получатель]); // Отправляем письмо - РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(ПараметрыДоставки.УчетнаяЗапись, ПараметрыПисьма, ПараметрыДоставки.Соединение); + ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма); КонецЕсли; КонецПроцедуры +Процедура ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма) + Если ПараметрыПисьма.Свойство("Картинки") + И ПараметрыПисьма.Картинки <> Неопределено + И ПараметрыПисьма.Картинки.Количество() > 0 Тогда + ФорматированныйДокумент = Новый ФорматированныйДокумент; + ФорматированныйДокумент.УстановитьHTML(ПараметрыПисьма.Тело, ПараметрыПисьма.Картинки); + ПараметрыПисьма.Тело = ФорматированныйДокумент; + КонецЕсли; + + РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение( + ПараметрыДоставки.УчетнаяЗапись, ПараметрыПисьма, ПараметрыДоставки.Соединение); +КонецПроцедуры + // Преобразует коллекцию в соответствие. Функция ПреобразоватьВСоответствие(Коллекция, ИмяКлюча, ИмяЗначения) Если ТипЗнч(Коллекция) = Тип("Соответствие") Тогда @@ -2597,7 +2568,7 @@ // Возвращаемое значение: // Результат - Строка - Результат преобразования. // -Функция ПривестиИмяФайла(ИсходноеИмяФайла) +Функция ПривестиИмяФайла(ИсходноеИмяФайла, ТранслитерироватьИменаФайлов) Результат = Лев(СокрЛП(ИсходноеИмяФайла), 255); @@ -2627,6 +2598,10 @@ Результат = СтрЗаменить(Результат, КлючИЗначение.Ключ, КлючИЗначение.Значение); КонецЦикла; + Если ТранслитерироватьИменаФайлов Тогда + Результат = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Результат); + КонецЕсли; + Возврат Результат; КонецФункции @@ -2726,10 +2701,8 @@ КаталогПолучателя = ПараметрыДоставки.КаталогВременныхФайлов; Если ПолучательСсылка <> Неопределено Тогда КаталогПолучателя = КаталогПолучателя - + ПривестиИмяФайла(Строка(ПолучательСсылка)) - + " (" - + Строка(ПолучательСсылка.УникальныйИдентификатор()) - + ")\"; + + ПривестиИмяФайла(Строка(ПолучательСсылка), ПараметрыДоставки.ТранслитерироватьИменаФайлов) + + " (" + Строка(ПолучательСсылка.УникальныйИдентификатор()) + ")\"; СоздатьКаталог(КаталогПолучателя); КонецЕсли; @@ -2816,29 +2789,4 @@ КонецФункции -// По регистру СостоянияРассылокОтчетов определяет количество рассылок, выполнявшихся с ошибками. -// -Функция КоличествоПроблемСРассылкамиОтчетов() - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | КОЛИЧЕСТВО(РассылкиОтчетов.Ссылка) КАК Количество - |ИЗ - | РегистрСведений.СостоянияРассылокОтчетов КАК СостоянияРассылокОтчетов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.РассылкиОтчетов КАК РассылкиОтчетов - | ПО СостоянияРассылокОтчетов.Рассылка = РассылкиОтчетов.Ссылка - |ГДЕ - | РассылкиОтчетов.Подготовлена = ИСТИНА - | И СостоянияРассылокОтчетов.СОшибками = ИСТИНА - | И РассылкиОтчетов.Автор = &Автор"; - - Если Пользователи.ЭтоПолноправныйПользователь() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "И РассылкиОтчетов.Автор = &Автор", ""); - Иначе - Запрос.УстановитьПараметр("Автор", Пользователи.ТекущийПользователь()); - КонецЕсли; - - Возврат Запрос.Выполнить().Выгрузить()[0].Количество; -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl index 5b52b6268..2f2d8bcc4 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (вызов сервера). -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Для внутреннего использования. diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl index 1ea296835..f87cbe7b7 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl @@ -1,50 +1,34 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (клиент, переопределяемый). -// -// Выполняется на клиенте, изменяется под специфику прикладной конфигурации, -// но предназначен для использования только данной подсистемой. -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Обработчик команды формы отчета. // // Параметры: // Форма - УправляемаяФорма - Форма отчета. // Команда - КомандаФормы - Команда, которая была вызвана. -// Результат - Булево - Истина, если вызов команды обработан. // // Места использования: // ОбщаяФорма.ФормаОтчета.Подключаемый_Команда(). // -Процедура ФормаОтчетаОбработчикКоманды(Форма, Команда, Результат) Экспорт - - Если Результат = Истина Тогда - - // Действие не требуется - - ИначеЕсли Команда.Имя = "РассылкаОтчетовСоздатьНовую" Тогда - - ОткрытьРассылкуИзФормыОтчета(Форма); - - Результат = Истина; - - ИначеЕсли Команда.Имя = "РассылкаОтчетовПрисоединитьКСуществующей" Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы); - ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); - - ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаВыбора", ПараметрыФормы, Форма); - - Результат = Истина; - - КонецЕсли; +Процедура СоздатьНовуюРассылкуИзОтчета(Форма, Команда) Экспорт + ОткрытьРассылкуИзФормыОтчета(Форма); +КонецПроцедуры + +// Обработчик команды формы отчета. +// +// Параметры: +// Форма - УправляемаяФорма - Форма отчета. +// Команда - КомандаФормы - Команда, которая была вызвана. +// +// Места использования: +// ОбщаяФорма.ФормаОтчета.Подключаемый_Команда(). +// +Процедура ПрисоединитьОтчетКСуществующейРассылке(Форма, Команда) Экспорт + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы); + ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); + ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаВыбора", ПараметрыФормы, Форма); КонецПроцедуры // Обработчик выбора формы отчета. @@ -152,7 +136,7 @@ // Выполняет рассылки в фоне. Процедура ВыполнитьСейчас(Параметры) Экспорт - Обработчик = Новый ОписаниеОповещения("ЗапускФоновогоЗадания", ЭтотОбъект, Параметры); + Обработчик = Новый ОписаниеОповещения("ВыполнитьСейчасВФоне", ЭтотОбъект, Параметры); Если Параметры.ЭтоФормаЭлемента Тогда Объект = Параметры.Форма.Объект; Если Не Объект.Подготовлена Тогда @@ -168,7 +152,7 @@ КонецПроцедуры // Запускает фоновое задание, вызывается когда все параметры уже готовы. -Процедура ЗапускФоновогоЗадания(Получатели, Параметры) Экспорт +Процедура ВыполнитьСейчасВФоне(Получатели, Параметры) Экспорт ПредварительныеНастройки = Неопределено; Если Параметры.ЭтоФормаЭлемента Тогда Если Параметры.Форма.Объект.ИспользоватьЭлектроннуюПочту Тогда @@ -177,13 +161,11 @@ КонецЕсли; ПредварительныеНастройки = Новый Структура("Получатели", Получатели); КонецЕсли; - ТекстСостояния = НСтр("ru = 'Выполняется рассылка отчетов'"); + ТекстСостояния = НСтр("ru = 'Выполняется рассылка отчетов.'"); Иначе - ТекстСостояния = НСтр("ru = 'Выполняются рассылки отчетов'"); + ТекстСостояния = НСтр("ru = 'Выполняются рассылки отчетов.'"); КонецЕсли; - Состояние(ТекстСостояния); - ПараметрыМетода = Новый Структура; ПараметрыМетода.Вставить("МассивРассылок", Параметры.МассивРассылок); ПараметрыМетода.Вставить("ПредварительныеНастройки", ПредварительныеНастройки); @@ -193,35 +175,42 @@ НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Параметры.Форма); НастройкиОжидания.ВыводитьОкноОжидания = Истина; НастройкиОжидания.ТекстСообщения = ТекстСостояния; - НастройкиОжидания.ПолучатьРезультат = Истина; - - Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияФоновогоЗадания", ЭтотОбъект, Параметры); + Обработчик = Новый ОписаниеОповещения("ВыполнитьСейчасВФонеЗавершение", ЭтотОбъект, Параметры); ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); + КонецПроцедуры // Принимает результат выполнения фонового задания. -Процедура ПослеЗавершенияФоновогоЗадания(Задание, Параметры) Экспорт +Процедура ВыполнитьСейчасВФонеЗавершение(Задание, Параметры) Экспорт + Если Задание = Неопределено Тогда Возврат; // Отменено. КонецЕсли; + Если Задание.Статус = "Выполнено" Тогда Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата); КоличествоРассылок = Результат.Рассылки.Количество(); Если КоличествоРассылок > 0 Тогда ОповеститьОбИзменении(?(КоличествоРассылок > 1, Тип("СправочникСсылка.РассылкиОтчетов"), Результат.Рассылки[0])); КонецЕсли; - СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, Результат); + СтатусОповещения = СтатусОповещенияПользователя.Информация; Иначе - Предупреждение = Новый Структура("Текст, Подробно"); - Предупреждение.Текст = НСтр("ru = 'Не удалось выполнить рассылки отчетов.'") - + Символы.ПС - + Задание.КраткоеПредставлениеОшибки; - Предупреждение.Подробно = Задание.ПодробноеПредставлениеОшибки - + Символы.ПС - + НСтр("ru = 'Подробности см. в журнале регистрации.'"); - СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, Предупреждение); + Результат = Новый Структура("Текст, Подробно"); + Результат.Текст = НСтр("ru = 'Не удалось выполнить рассылки отчетов.'") + + Символы.ПС + Задание.КраткоеПредставлениеОшибки; + Результат.Подробно = Задание.ПодробноеПредставлениеОшибки + + Символы.ПС + НСтр("ru = 'Подробности см. в журнале регистрации.'"); + СтатусОповещения = СтатусОповещенияПользователя.Важное; КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("УведомитьОЗавершениеРассылки", РассылкаОтчетовКлиент, Результат); + ПоказатьОповещениеПользователя(, Оповещение, Результат.Текст, БиблиотекаКартинок.РассылкаОтчетов, СтатусОповещения); + +КонецПроцедуры + +Процедура УведомитьОЗавершениеРассылки(Результат) Экспорт + СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, Результат); КонецПроцедуры // Открывает рассылку отчетов из формы отчета. @@ -232,12 +221,13 @@ // Процедура ОткрытьРассылкуИзФормыОтчета(Форма, Ссылка = Неопределено) НастройкиОтчета = Форма.НастройкиОтчета; + РежимВариантаОтчета = (ТипЗнч(Форма.КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(Форма.КлючТекущегоВарианта)); СтрокаОтчетыПараметры = Новый Структура("ОтчетПолноеИмя, КлючВарианта, ВариантСсылка, Настройки"); СтрокаОтчетыПараметры.ОтчетПолноеИмя = НастройкиОтчета.ПолноеИмя; СтрокаОтчетыПараметры.КлючВарианта = Форма.КлючТекущегоВарианта; СтрокаОтчетыПараметры.ВариантСсылка = НастройкиОтчета.ВариантСсылка; - Если Форма.РежимВариантаОтчета Тогда + Если РежимВариантаОтчета Тогда СтрокаОтчетыПараметры.Настройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; КонецЕсли; diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиентПереопределяемый/Module.bsl index 270e56061..bb7ceca34 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Клиентские события рассылок отчетов. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик активизации строки пользовательской настройки СКД отчета. @@ -50,8 +45,8 @@ // ПользовательскаяНастройкаКД = КомпоновщикНастроекКД.НайтиПоИдентификатору(ИдентификаторКД); // СтандартнаяОбработка - Булево - Если Истина, то будет использован стандартный диалог выбора. // Если используется собственная обработка события, то следует установить в Ложь. -// ОбработчикРезультата - Обработчик результата выбора прикладной формы. -// В качестве результата в ОбработчикРезультата могут быть переданы значения типов: +// Обработчик - ОписаниеОповещения - Обработчик результата выбора прикладной формы. +// В качестве 1го параметра (Результат) в процедуру-обработчик могут быть переданы значения типов: // Неопределено - Пользователь отказался от выбора. // ПользовательскиеНастройкиКомпоновкиДанных - Новые настройки отчета. // diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl index 226a2aa48..63f26c008 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (клиент, сервер). -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Разбирает строку FTP адреса на Логин, Пароль, Сервер, Порт и Каталог. diff --git a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl index d278d25ef..ee06e0830 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl @@ -1,13 +1,8 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (сервер, переопределяемый). -// -// Выполняется на сервере, изменяется под специфику прикладной конфигурации, -// но предназначен для использования только данной подсистемой. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Позволяет изменить форматы по умолчанию и установить картинки. +// Для изменения параметров формата смотрите вспомогательный метод РассылкаОтчетов.УстановитьПараметрыФормата. +// Другие примеры использования см. функцию РассылкаОтчетовПовтИсп.СписокФорматов. // // Параметры: // СписокФорматов - СписокЗначений - Список форматов. @@ -16,16 +11,10 @@ // * Пометка - Булево - Признак того, что формат используется по умолчанию. // * Картинка - Картинка - Картинка формата. // -// Вспомогательные методы: -// РассылкаОтчетов.УстановитьПараметрыФормата() - для изменения параметров формата. -// -// Например: +// Пример: // РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "HTML4", , Ложь); // РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "XLS" , , Истина); // -// См. также: -// Другие примеры использования в РассылкаОтчетовПовтИсп.СписокФорматов(). -// Процедура ПереопределитьПараметрыФорматов(СписокФорматов) Экспорт @@ -33,7 +22,8 @@ КонецПроцедуры // Позволяет добавить описание кросс объектной связи типов для получателей рассылки. -// +// Для регистрации параметров типа см. РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей. +// Другие примеры использования см. функцию РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей. // Важно: // Использовать данный механизм требуется только в том случае, если: // 1. Требуется описать и представить несколько типов как один (как в справочнике Пользователи и Группы @@ -43,26 +33,23 @@ // 4. Требуется определить группу контактной информации. // // Параметры: -// ТаблицаТипов - ТаблицаЗначений - Таблица описания типов. +// ТаблицаТипов - ТаблицаЗначений - Таблица описания типов. // ДоступныеТипы - Массив - Доступные типы. // -// Вспомогательные методы: -// РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей() - для регистрации параметров типа. -// -// Например: +// Пример: // Настройки = Новый Структура; // Настройки.Вставить("ОсновнойТип", Тип("СправочникСсылка.Контрагенты")); // Настройки.Вставить("ВидКИ", Справочники.ВидыКонтактнойИнформации.EmailКонтрагента); // РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, Настройки); // -// См. также: -// Другие примеры использования в РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей(). -// Процедура ПереопределитьТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы) Экспорт КонецПроцедуры // Позволяет определить свой обработчик для сохранения табличного документа в формат. +// Важно: +// Если используется нестандартная обработка (СтандартнаяОбработка меняется на Ложь), +// тогда ПолноеИмяФайла должно содержать полное имя файла с расширением. // // Параметры: // СтандартнаяОбработка - Булево - Признак использования стандартных механизмов подсистемы для сохранения в формат. @@ -72,11 +59,7 @@ // ПолноеИмяФайла - Строка - Полное имя файла. // Передается без расширения, если формат был добавлен в прикладной конфигурации. // -// Важно: -// Если используется нестандартная обработка (СтандартнаяОбработка меняется на Ложь), -// тогда ПолноеИмяФайла должно содержать полное имя файла с расширением. -// -// Например: +// Пример: // Если Формат = Перечисления.ФорматыСохраненияОтчетов.HTML4 Тогда // СтандартнаяОбработка = Ложь; // ПолноеИмяФайла = ПолноеИмяФайла +".html"; diff --git a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl index 4af45bb3b..347444dfb 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Рассылка отчетов" (сервер, результат кэшируется). -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает список значений перечисления "ФорматыСохраненияОтчетов". diff --git a/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl b/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl index 61589bbc8..fb5e1ac74 100644 --- a/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl @@ -1,21 +1,14 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с контрагентами". -// Процедуры и функции проверки корректности заполнения регламентированных данных. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Проверяет соответствие ИНН требованиям. // // Параметры: -// ИНН - Строка - Проверяемый индивидуальный номер налогоплательщика. +// ИНН - Строка - проверяемый индивидуальный номер налогоплательщика. // ЭтоЮридическоеЛицо - Булево - признак, является ли владелец ИНН юридическим лицом. -// ТекстСообщения - Строка - Текст сообщения о найденных ошибках. +// ТекстСообщения - Строка - текст сообщения о найденных ошибках. // // Возвращаемое значение: -// Истина - ИНН соответствует требованиям; -// Ложь - ИНН не соответствует требованиям. +// Булево - Истина, если соответствует. // Функция ИННСоответствуетТребованиям(Знач ИНН, ЭтоЮридическоеЛицо, ТекстСообщения) Экспорт @@ -195,16 +188,16 @@ Возврат Ошибки.Количество() = 0; КонецФункции + // Проверяет соответствие ОГРН требованиям. // // Параметры: -// ОГРН - Строка - Проверяемый основной государственный регистрационный номер. +// ОГРН - Строка - проверяемый основной государственный регистрационный номер. // ЭтоЮридическоеЛицо - Булево - признак, является ли владелец ОГРН юридическим лицом. -// ТекстСообщения - Строка - Текст сообщения о найденных ошибках. +// ТекстСообщения - Строка - текст сообщения о найденных ошибках. // // Возвращаемое значение: -// Истина - ОГРН соответствует требованиям; -// Ложь - ОГРН не соответствует требованиям. +// Булево - Истина, если соответствует. // Функция ОГРНСоответствуетТребованиям(Знач ОГРН, ЭтоЮридическоеЛицо, ТекстСообщения) Экспорт @@ -269,10 +262,10 @@ // Параметры: // ПроверяемыйКод - Строка - проверяемый код ОКПО; // ЭтоЮридическоеЛицо - Булево - признак, является ли владелец кода ОКПО юридическим лицом; -// ТекстСообщения - Строка - текст сообщения о найденных ошибках в проверяемом коде ОКПО; +// ТекстСообщения - Строка - текст сообщения о найденных ошибках в проверяемом коде ОКПО. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если соответствует. // Функция КодПоОКПОСоответствуетТребованиям(Знач ПроверяемыйКод, ЭтоЮридическоеЛицо, ТекстСообщения = "") Экспорт @@ -312,8 +305,11 @@ // Проверяет номер страхового свидетельства на соответствие требованиям ПФР. // // Параметры: -// СтраховойНомер - страховой номер ПФР. Строка должна быть ведена по шаблону "999-999-999 99". -// ТекстСообщения - текст сообщения об ошибке ввода страхового номера. +// СтраховойНомер - Строка - страховой номер ПФР. Строка должна быть ведена по шаблону "999-999-999 99". +// ТекстСообщения - Строка - текст сообщения об ошибке ввода страхового номера. +// +// Возвращаемое значение: +// Булево - Истина, если соответствует. // Функция СтраховойНомерПФРСоответствуетТребованиям(Знач СтраховойНомер, ТекстСообщения) Экспорт @@ -362,14 +358,13 @@ // (утв. ЦБ РФ 08.09.1997 N 515). // // Параметры: -// НомерСчета - строка - номер банковского счета. -// БИК - строка, БИК банка в котором открыт счет. -// ЭтоБанк - Булево, Истина - Банк, Ложь - РКЦ (у РКЦ корреспондентский счет не заполняется). +// НомерСчета - Строка - номер банковского счета. +// БИК - Строка - БИК банка в котором открыт счет. +// ЭтоБанк - Булево - если Истина, то проверяется банковский счет, иначе проверяется как счет РКЦ +// (у РКЦ корреспондентский счет не заполняется). // // Возвращаемое значение: -// Булево -// Истина - контрольный ключ верен. -// Ложь - контрольный ключ не верен. +// Булево - Истина, если соответствует. // Функция КонтрольныйКлючЛицевогоСчетаСоответствуетТребованиям(НомерСчета, БИК, ЭтоБанк = Истина)Экспорт @@ -424,6 +419,10 @@ КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Проверяет правильность кода по контрольному числу (последняя цифра в коде). // // ПР 50.1.024-2005 «Основные положения и порядок проведения работ по разработке, ведению и применению общероссийских @@ -444,7 +443,7 @@ // ПроверяемыйКод - Строка - код для проверки. // // Возвращаемое значение: -// Булево. +// Булево - Истина, если верный. // Функция КодКлассификатораВерный(ПроверяемыйКод) @@ -471,5 +470,7 @@ Возврат Строка(КонтрольнаяЦифра) = Прав(ПроверяемыйКод, 1); КонецФункции - + #КонецОбласти + + diff --git a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl index 9e7c7421e..711b3e73d 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl @@ -1,17 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс - -// Вызывается при интерактивном начале работы пользователя с областью данных. -// Соответствует событию ПриНачалеРаботыСистемы модулей приложения. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиентаПриЗапуске.ПоказатьФормуБлокировкиРаботыСВнешнимиРесурсами Тогда Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ПоказатьФормуБлокировкиРаботыСВнешнимиРесурсами", ЭтотОбъект); КонецЕсли; diff --git a/SSL/src/CommonModules/РегламентныеЗаданияПереопределяемый/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияПереопределяемый/Module.bsl index a09d00df3..7f2dbd6e1 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет следующие свойств регламентных заданий: @@ -41,7 +36,7 @@ // * Параметризуется - Булево - Истина, если регламентное задание параметризованное. // По умолчанию - Ложь. // -// Например: +// Пример: // Настройка = Настройки.Добавить(); // Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеСтатусовДоставкиSMS; // Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПочтовыйКлиент; @@ -53,7 +48,6 @@ КонецПроцедуры // Позволяет переопределить настройки подсистемы, заданные по умолчанию. -// Значения настроек по умолчанию см. в РегламентныеЗаданияСлужебный.НастройкиПланаОбменаПоУмолчанию. // // Параметры: // Настройки - Структура - Структура с ключами: diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl index 68c594e2b..01b1318cd 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -1,111 +1,148 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Программный интерфейс для управления регламентными заданиями. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Получает задания очереди по заданному отбору. -// Возможно получение неконсистентных данных. -// Параметры: -// Отбор - Структура, Массив - значения по которым, требуется отбирать задания. -// Возможные ключи структуры для ИБ в обычном режиме: -// УникальныйИдентификатор -// Ключ -// Метаданные -// Предопределенное -// Использование -// Наименование -// Возможные ключи структуры для ИБ в режиме сервиса: -// ОбластьДанных -// ИмяМетода -// Идентификатор -// СостояниеЗадания -// Ключ -// Шаблон -// Использование -// Так же может быть передан массив структур - описаний отбора со следующими ключами: -// ВидСравнения - ВидСравнения - допустимыми значениями являются только. -// ВидСравнения.Равно -// ВидСравнения.НеРавно -// ВидСравнения.ВСписке -// ВидСравнения.НеВСписке -// Значение - Значение отбора, для видов сравнения ВСписке и НеВСписке - массив значений. -// Для видов сравнения Равно / НеРавно - сами значения. -// Все условия отбора объединяются по И. -// Возвращаемое значение: -// ТаблицаЗначений - таблица найденных заданий. Колонки соответствуют параметрам заданий. +// В локальном режиме работы возвращает регламентные задания, соответствующие отбору. +// В модели сервиса - таблицу значений, в которой содержится описание найденных заданий +// в справочниках ОчередьЗаданий (если не установлены разделители) или ОчередьЗаданийОбластейДанных. // -Функция НайтиЗадания(Знач Отбор) Экспорт +// Параметры: +// Отбор - Структура - со свойствами: +// 1) Общие для любого режима работы: +// * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор регламентного задания +// в локальном режиме работы. +// - СправочникСсылка.ОчередьЗаданий, +// СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания +// очереди в модели сервиса. +// * Метаданные - ОбъектМетаданных: РегламентноеЗадание - метаданные регламентного задания. +// - Строка - имя регламентного задания. +// * Использование - Булево - если Истина, задание включено. +// * Ключ - Строка - прикладной идентификатор задания. +// 2) Возможные ключи только локального режима: +// * Наименование - Строка - наименование регламентного задания. +// * Предопределенное - Булево - если Истина, регламентное задание определено в метаданных. +// 3) Возможные ключи только для модели сервиса: +// * ИмяМетода - Строка - имя метода (или псевдоним) обработчика очереди задании. +// * ОбластьДанных - Число - значение разделителя области данных задания. +// * СостояниеЗадания - ПеречислениеСсылка.СостоянияЗаданий - состояние задания очереди. +// * Шаблон - СправочникСсылка.ШаблоныЗаданийОчереди - шаблон задания, используется только +// для разделенных заданий очереди. +// +// Возвращаемое значение: +// Массив - в локальном режиме работы массив регламентных заданий. +// см. описание метода РегламентноеЗадание в синтакс-помощнике. +// ТаблицаЗначений - в модели сервиса таблица значений со свойствами: +// * ИнтервалПовтораПриАварийномЗавершении - Число - Интервал в секундах, через который нужно перезапускать +// задание в случае его аварийного завершения. +// * Использование - Булево - если Истина, задание включено. +// * Ключ - Строка - прикладной идентификатор задания. +// * КоличествоПовторовПриАварийномЗавершении - Число - количество повторов при аварийном завершении задания. +// * Параметры - Массив - параметры, передаваемые в обработчик задания. +// * Расписание - Расписание - расписание задания. +// * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор регламентного задания +// в локальном режиме работы. +// - СправочникСсылка.ОчередьЗаданий, +// СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания +// очереди в модели сервиса. +// * ЗапланированныйМоментЗапуска - Дата - дата и время запланированного запуска задания +// (в часовом поясе области данных). +// * ИмяМетода - Строка - имя метода (или псевдоним) обработчика очереди задании. +// * ОбластьДанных - Число - значение разделителя области данных задания. +// * СостояниеЗадания - ПеречислениеСсылка.СостоянияЗаданий - состояние задания очереди. +// * Шаблон - СправочникСсылка.ШаблоныЗаданийОчереди - шаблон задания, +// используется только для разделенных заданий очереди. +// * ЭксклюзивноеВыполнение - Булево - при установленном флаге задание будет выполнено +// даже при установленной блокировке начала сеансов в области +// данных. Так же если в области есть задания с таким флагом +// сначала будут выполнены они. +// +Функция НайтиЗадания(Отбор) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + КопияОтбора = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Отбор); + + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - Если Отбор.Свойство("УникальныйИдентификатор") И НЕ Отбор.Свойство("Идентификатор") Тогда - Отбор.Вставить("Идентификатор", Отбор.УникальныйИдентификатор); + Если КопияОтбора.Свойство("УникальныйИдентификатор") И НЕ КопияОтбора.Свойство("Идентификатор") Тогда + КопияОтбора.Вставить("Идентификатор", КопияОтбора.УникальныйИдентификатор); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - Отбор.Вставить("ОбластьДанных", ОбластьДанных); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + КопияОтбора.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - Если Отбор.Свойство("Метаданные") Тогда - Если ТипЗнч(Отбор.Метаданные) = Тип("ОбъектМетаданных") Тогда + Если КопияОтбора.Свойство("Метаданные") Тогда + Если ТипЗнч(КопияОтбора.Метаданные) = Тип("ОбъектМетаданных") Тогда Попытка - Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(Отбор.Метаданные.Имя); - Отбор.Вставить("Шаблон", Шаблон); + УстановитьПривилегированныйРежим(Истина); + Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(КопияОтбора.Метаданные.Имя); + УстановитьПривилегированныйРежим(Ложь); + КопияОтбора.Вставить("Шаблон", Шаблон); Исключение - Отбор.Вставить("ИмяМетода", Отбор.Метаданные.ИмяМетода); + КопияОтбора.Вставить("ИмяМетода", КопияОтбора.Метаданные.ИмяМетода); КонецПопытки; Иначе - МетаданныеРегламентноеЗадание = Метаданные.РегламентныеЗадания.Найти(Отбор.Метаданные); + МетаданныеРегламентноеЗадание = Метаданные.РегламентныеЗадания.Найти(КопияОтбора.Метаданные); Если МетаданныеРегламентноеЗадание <> Неопределено Тогда Попытка + УстановитьПривилегированныйРежим(Истина); Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(МетаданныеРегламентноеЗадание.Имя); - Отбор.Вставить("Шаблон", Шаблон); + УстановитьПривилегированныйРежим(Ложь); + КопияОтбора.Вставить("Шаблон", Шаблон); Исключение - Отбор.Вставить("ИмяМетода", МетаданныеРегламентноеЗадание.ИмяМетода); + КопияОтбора.Вставить("ИмяМетода", МетаданныеРегламентноеЗадание.ИмяМетода); КонецПопытки; КонецЕсли; КонецЕсли; - ИначеЕсли Отбор.Свойство("Идентификатор") - И (ТипЗнч(Отбор.Идентификатор) = Тип("УникальныйИдентификатор") - ИЛИ ТипЗнч(Отбор.Идентификатор) = Тип("Строка")) Тогда + ИначеЕсли КопияОтбора.Свойство("Идентификатор") + И (ТипЗнч(КопияОтбора.Идентификатор) = Тип("УникальныйИдентификатор") + ИЛИ ТипЗнч(КопияОтбора.Идентификатор) = Тип("Строка")) Тогда - Если ТипЗнч(Отбор.Идентификатор) = Тип("Строка") Тогда - Отбор.Идентификатор = Новый УникальныйИдентификатор(Отбор.Идентификатор); + Если ТипЗнч(КопияОтбора.Идентификатор) = Тип("Строка") Тогда + КопияОтбора.Идентификатор = Новый УникальныйИдентификатор(КопияОтбора.Идентификатор); КонецЕсли; МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); СправочникДляЗадания = МодульОчередьЗаданийСлужебный.СправочникОчередьЗаданий(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + + Если ЭтоРазделеннаяКонфигурация Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); - ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(Отбор); + ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(КопияОтбора); Если ПереопределенныйСправочник <> Неопределено Тогда СправочникДляЗадания = ПереопределенныйСправочник; КонецЕсли; КонецЕсли; - Отбор.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(Отбор.Идентификатор)); + КопияОтбора.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(КопияОтбора.Идентификатор)); КонецЕсли; - Отбор.Удалить("Метаданные"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(Отбор); + КопияОтбора.Удалить("Метаданные"); + СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(КопияОтбора); + // Для обратной совместимости поле Идентификатор не удаляется. + КопияСписка = СписокЗаданий.Скопировать(); + КопияСписка.Колонки.Добавить("УникальныйИдентификатор"); + Для Каждого Строка Из КопияСписка Цикл + Строка.УникальныйИдентификатор = Строка.Идентификатор; + КонецЦикла; - Возврат СписокЗаданий; + Возврат КопияСписка; КонецЕсли; Иначе - СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор); + СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(КопияОтбора); Возврат СписокЗаданий; @@ -130,7 +167,6 @@ Функция Задание(Знач Идентификатор) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда Идентификатор = Идентификатор.УникальныйИдентификатор; @@ -140,13 +176,14 @@ Идентификатор = Новый УникальныйИдентификатор(Идентификатор); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ПараметрыЗадания = Новый Структура; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; @@ -154,7 +191,9 @@ Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда Если Идентификатор.Предопределенное Тогда + УстановитьПривилегированныйРежим(Истина); ПараметрыЗадания.Вставить("Шаблон", МодульОчередьЗаданий.ШаблонПоИмени(Идентификатор.Имя)); + УстановитьПривилегированныйРежим(Ложь); Иначе ПараметрыЗадания.Вставить("ИмяМетода", Идентификатор.ИмяМетода); КонецЕсли; @@ -162,7 +201,14 @@ МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); СправочникДляЗадания = МодульОчередьЗаданийСлужебный.СправочникОчередьЗаданий(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + + Если ЭтоРазделеннаяКонфигурация Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); Если ПереопределенныйСправочник <> Неопределено Тогда @@ -206,7 +252,7 @@ // Добавляет новое задание в очередь или как регламентное. // // Параметры: -// ПараметрыЗадания - Структура - Параметры добавляемого задания, возможные ключи: +// Параметры - Структура - Параметры добавляемого задания, возможные ключи: // Использование // Метаданные - обязательно для указания. // Параметры @@ -216,18 +262,22 @@ // КоличествоПовторовПриАварийномЗавершении. // // Возвращаемое значение: -// РегламентноеЗадание, СправочникСсылка.ОчередьЗаданий, СправочникСсылка.ОчередьЗаданийОбластейДанных - Идентификатор добавленного задания. +// РегламентноеЗадание, СправочникСсылка.ОчередьЗаданий, СправочникСсылка.ОчередьЗаданийОбластейДанных - Идентификатор +// добавленного задания. // -Функция ДобавитьЗадание(ПараметрыЗадания) Экспорт +Функция ДобавитьЗадание(Параметры) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + ПараметрыЗадания = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Параметры); + + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; @@ -315,7 +365,6 @@ Процедура УдалитьЗадание(Знач Идентификатор) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда Идентификатор = Идентификатор.УникальныйИдентификатор; @@ -325,13 +374,14 @@ Идентификатор = Новый УникальныйИдентификатор(Идентификатор); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ПараметрыЗадания = Новый Структура; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; @@ -342,7 +392,14 @@ МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); СправочникДляЗадания = МодульОчередьЗаданийСлужебный.СправочникОчередьЗаданий(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + + Если ЭтоРазделеннаяКонфигурация Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); Если ПереопределенныйСправочник <> Неопределено Тогда @@ -391,7 +448,7 @@ // // Параметры: // Идентификатор - СправочникСсылка.ОчередьЗаданий, СправочникСсылка.ОчередьЗаданийОбластейДанных - Идентификатор задания -// ПараметрыЗадания - Структура - Параметры, которые следует установить заданию, +// Параметры - Структура - Параметры, которые следует установить заданию, // возможные ключи: // Использование // Параметры @@ -403,10 +460,11 @@ // В случае если задание создано на основе шаблона или предопределенное, могут быть указаны // только следующие ключи: Использование. // -Процедура ИзменитьЗадание(Знач Идентификатор, Знач ПараметрыЗадания) Экспорт +Процедура ИзменитьЗадание(Знач Идентификатор, Знач Параметры) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); + + ПараметрыЗадания = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Параметры); Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда Идентификатор = Идентификатор.УникальныйИдентификатор; @@ -416,19 +474,20 @@ Идентификатор = Новый УникальныйИдентификатор(Идентификатор); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ПараметрыПоиска = Новый Структура; ПараметрыЗадания.Удалить("Наименование"); Если ПараметрыЗадания.Количество() = 0 Тогда Возврат; - КонецЕсли; + КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ПараметрыПоиска.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; @@ -439,9 +498,8 @@ // Если рег.задание предопределенное и есть шаблон очереди - можно изменять только "Использование". Если Идентификатор.Предопределенное Тогда - Шаблоны = Новый Массив; - МодульОчередьЗаданийПереопределяемый = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийПереопределяемый"); - МодульОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов(Шаблоны); + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + Шаблоны = МодульОчередьЗаданий.ШаблоныЗаданийОчереди(); Если Шаблоны.Найти(Идентификатор.Имя) <> Неопределено И (ПараметрыЗадания.Количество() > 1 @@ -462,7 +520,14 @@ МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); СправочникДляЗадания = МодульОчередьЗаданийСлужебный.СправочникОчередьЗаданий(); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + + Если ЭтоРазделеннаяКонфигурация Тогда МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыПоиска); Если ПереопределенныйСправочник <> Неопределено Тогда @@ -583,7 +648,7 @@ Возврат Новый УникальныйИдентификатор(Идентификатор); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ПараметрыЗадания = Новый Структура; @@ -600,10 +665,9 @@ Возврат Неопределено; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); - КонецЕсли; + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); @@ -646,7 +710,6 @@ Функция РегламентноеЗаданиеИспользуется(Знач Идентификатор) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Задание = ПолучитьРегламентноеЗадание(Идентификатор); @@ -673,7 +736,6 @@ Функция РасписаниеРегламентногоЗадания(Знач Идентификатор, Знач ВСтруктуре = Ложь) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Задание = ПолучитьРегламентноеЗадание(Идентификатор); @@ -689,18 +751,16 @@ // Перед вызовом требуется иметь право Администрирования или УстановитьПривилегированныйРежим. // // Параметры: -// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска -// предопределенного регламентного задания. +// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска +// предопределенного регламентного задания. // - УникальныйИдентификатор - идентификатор регламентного задания. -// - Строка - строка уникального идентификатора регламентного задания. -// - РегламентноеЗадание - регламентное задание. +// - Строка - строка уникального идентификатора регламентного задания. +// - РегламентноеЗадание - регламентное задание. +// Использование - Булево - значение использования которое нужно установить. // -// Использование - Булево - значение использования которое нужно установить. -// Процедура УстановитьИспользованиеРегламентногоЗадания(Знач Идентификатор, Знач Использование) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Задание = ПолучитьРегламентноеЗадание(Идентификатор); @@ -729,7 +789,6 @@ Процедура УстановитьРасписаниеРегламентногоЗадания(Знач Идентификатор, Знач Расписание) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Задание = ПолучитьРегламентноеЗадание(Идентификатор); @@ -759,7 +818,6 @@ Функция ПолучитьРегламентноеЗадание(Знач Идентификатор) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда Идентификатор = Идентификатор.УникальныйИдентификатор; @@ -821,22 +879,79 @@ #КонецОбласти -#Область СлужебныеПроцедурыИФункции +#Область СлужебныйПрограммныйИнтерфейс -// Вызывает исключение, если у пользователя нет права администрирования. -Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() +// Устанавливает требуемые значения параметров регламентного задания. +// В модели сервиса для задания, созданного на основе шаблона очереди заданий, +// может быть изменено только значение свойства Использование. +// +// Параметры: +// РегламентноеЗадание - ОбъектМетаданных: РегламентноеЗадание - задание, свойства которого +// требуется изменить. +// ИзменяемыеПараметры - Структура - свойства регламентного задания, которые требуется изменить. +// Ключ структуры - имя параметра, а значение - значение параметра формы. +// Отбор - Структура - см. описание параметра Отбор функции НайтиЗадания. +// +Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗадание, ИзменяемыеПараметры, Отбор = Неопределено) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Нарушение прав доступа.'"); + Если Отбор = Неопределено Тогда + Отбор = Новый Структура; + КонецЕсли; + Отбор.Вставить("Метаданные", РегламентноеЗадание); + + СписокЗаданий = НайтиЗадания(Отбор); + Если СписокЗаданий.Количество() = 0 Тогда + ИзменяемыеПараметры.Вставить("Метаданные", РегламентноеЗадание); + ДобавитьЗадание(ИзменяемыеПараметры); + Иначе + Для Каждого Задание Из СписокЗаданий Цикл + ИзменитьЗадание(Задание, ИзменяемыеПараметры); + КонецЦикла; + КонецЕсли; +КонецПроцедуры + +// Устанавливает использование предопределенного регламентного задания. +// +// Параметры: +// ЗаданиеМетаданные - ОбъектМетаданных - метаданные предопределенного регламентного задания. +// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. +// +Процедура УстановитьИспользованиеПредопределенногоРегламентногоЗадания(ЗаданиеМетаданные, Использование) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.УстановитьИспользованиеПредопределенногоРегламентногоЗадания(ЗаданиеМетаданные, Использование); КонецЕсли; Иначе - Если НЕ ПривилегированныйРежим() Тогда - ВыполнитьПроверкуПравДоступа("Администрирование", Метаданные); + Задание = РегламентныеЗадания.НайтиПредопределенное(ЗаданиеМетаданные); + + Если Задание.Использование <> Использование Тогда + Задание.Использование = Использование; + Задание.Записать(); КонецЕсли; КонецЕсли; КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Вызывает исключение, если у пользователя нет права администрирования. +Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() + + ПроверятьПраваАдминистрированияСистемы = Истина; + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ПроверятьПраваАдминистрированияСистемы = Ложь; + КонецЕсли; + + Если НЕ Пользователи.ЭтоПолноправныйПользователь(, ПроверятьПраваАдминистрированияСистемы) Тогда + ВызватьИсключение НСтр("ru = 'Нарушение прав доступа.'"); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index f6851b888..727061355 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -1,42 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "РегламентныеЗаданияКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РегламентныеЗаданияСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( - "РегламентныеЗаданияСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( - "РегламентныеЗаданияСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриНастройкеПодчиненногоУзлаРИБ"].Добавить( - "РегламентныеЗаданияСлужебный"); - КонецЕсли; - -КонецПроцедуры - // Проверяет, включено ли регламентное задание по функциональным опциям. // // Параметры: @@ -58,8 +21,8 @@ ОтключитьВАвтономномРабочемМесте = Ложь; Использование = Неопределено; ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ(); - ЭтоРазделенныйРежим = ОбщегоНазначенияПовтИсп.РазделениеВключено(); - ЭтоАвтономноеРабочееМесто = ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто(); + ЭтоРазделенныйРежим = ОбщегоНазначения.РазделениеВключено(); + ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); НайденныеСтроки = ЗависимостиЗаданий.НайтиСтроки(Новый Структура("РегламентноеЗадание", Задание)); @@ -110,7 +73,7 @@ // Процедура ПроверитьВозможностьРаботыСВнешнимиРесурсами(РегламентноеЗадание, ЗависимостиЗаданий = Неопределено) Экспорт - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -133,10 +96,11 @@ ПараметрыБлокировки = Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами.Получить().Получить(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ИмяМетода = РегламентноеЗадание.ИмяМетода; ПараметрыЗадания = Новый Структура; @@ -243,13 +207,15 @@ Отбор = Новый Структура("УникальныйИдентификатор"); Для Каждого ИдентификаторЗадания Из ПараметрыБлокировки.ОтключенныеЗадания Цикл - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда Если ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор") Тогда Продолжить; КонецЕсли; + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + ПараметрыЗадания.Вставить("ОбластьДанных", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ПараметрыЗадания.Вставить("Идентификатор", ИдентификаторЗадания); ПараметрыЗадания.Вставить("Использование", Ложь); МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); @@ -280,7 +246,7 @@ ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Ложь; ПараметрыБлокировки.ОтключенныеЗадания.Очистить(); ПараметрыБлокировки.ИдентификаторБазы = ИдентификаторФайловойБазы(ЭтоФайловаяБаза); - ПараметрыБлокировки.РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + ПараметрыБлокировки.РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ПараметрыБлокировки.ИмяКомпьютера = ИмяКомпьютера(); ХранилищеЗначения = Новый ХранилищеЗначения(ПараметрыБлокировки); @@ -290,15 +256,6 @@ КонецПроцедуры -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// -Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт - - Обработчики.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована", - "РегламентныеЗаданияСлужебный.УстановкаПараметровСеанса"); - -КонецПроцедуры - // Запрещает работу с внешними ресурсами. // Процедура ЗапретитьРаботуСВнешнимиРесурсами() Экспорт @@ -338,7 +295,7 @@ Процедура УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(ВключатьЗадания = Ложь) Экспорт ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ(); - ЭтоАвтономноеРабочееМесто = ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто(); + ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); Задания = ЗависимыеРегламентныеЗадания.Скопировать(,"РегламентноеЗадание"); @@ -419,10 +376,107 @@ ИзменитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(Источник, Источник.Значение); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт + + Обработчики.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована", + "РегламентныеЗаданияСлужебный.УстановкаПараметровСеанса"); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + // При переходе коробка-сервис константу не выгружаем. + Типы.Добавить(Метаданные.Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. +Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания"); + МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальноеКоличествоИсполняющихФоновыхЗаданий"); + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.1.24"; + Обработчик.Процедура = "РегламентныеЗаданияСлужебный.УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.3.12"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "РегламентныеЗаданияСлужебный.ОбновитьПараметрыБлокировкиРаботыСВнешнимиРесурсами"; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. +Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт + + ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("ДоступноВМоделиСервиса", Ложь); + ЗаданияОтключаемыеМоделиСервиса = ЗависимыеРегламентныеЗадания.Скопировать(ПараметрыОтбора ,"РегламентноеЗадание"); + Для Каждого ОтключаемоеЗадание Из ЗаданияОтключаемыеМоделиСервиса Цикл + Если ТаблицаИспользования.Найти(ОтключаемоеЗадание.РегламентноеЗадание.Имя, "РегламентноеЗадание") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + НоваяСтрока = ТаблицаИспользования.Добавить(); + НоваяСтрока.РегламентноеЗадание = ОтключаемоеЗадание.РегламентноеЗадание.Имя; + НоваяСтрока.Использование = Ложь; + КонецЦикла; + + ПараметрыОтбора.Вставить("ДоступноВМоделиСервиса", Истина); + ЗаданияВключаемыеВМоделиСервиса = ЗависимыеРегламентныеЗадания.Скопировать(ПараметрыОтбора ,"РегламентноеЗадание"); + Для Каждого ВключаемоеЗадание Из ЗаданияВключаемыеВМоделиСервиса Цикл + Если ТаблицаИспользования.Найти(ВключаемоеЗадание.РегламентноеЗадание.Имя, "РегламентноеЗадание") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + НоваяСтрока = ТаблицаИспользования.Добавить(); + НоваяСтрока.РегламентноеЗадание = ВключаемоеЗадание.РегламентноеЗадание.Имя; + НоваяСтрока.Использование = Истина; + КонецЦикла; + +КонецПроцедуры + +// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. +Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт + + УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра = "РаботаСВнешнимиРесурсамиЗаблокирована" Тогда + ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована = УстановленаБлокировкаРаботыСВнешнимиРесурсами(); + УстановленныеПараметры.Добавить("РаботаСВнешнимиРесурсамиЗаблокирована"); + КонецЕсли; + +КонецПроцедуры + Функция ЗначениеНастройки(ИмяНастройки) Экспорт Настройки = НастройкиПоУмолчанию(); @@ -449,24 +503,11 @@ КонецФункции -// Устанавливает параметры сеанса. -// -// Параметры: -// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить. -// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса. -// -Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт - Если ИмяПараметра = "РаботаСВнешнимиРесурсамиЗаблокирована" Тогда - ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована = УстановленаБлокировкаРаботыСВнешнимиРесурсами(); - УстановленныеПараметры.Добавить("РаботаСВнешнимиРесурсамиЗаблокирована"); - КонецЕсли; -КонецПроцедуры - // Вызывает исключение, если у пользователя нет права администрирования. Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru = 'Нарушение прав доступа.'"); КонецЕсли; @@ -504,7 +545,7 @@ ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя); Продолжить; КонецЕсли; - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() И ПодсистемаРаботаВМоделиСервиса <> Неопределено Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() И ПодсистемаРаботаВМоделиСервиса <> Неопределено Тогда Если ПодсистемаРаботаВМоделиСервиса.Состав.Содержит(ОбъектМетаданных) Тогда ЗаданияВМоделиСервиса.Вставить(ОбъектМетаданных.Имя, Истина); Продолжить; @@ -522,7 +563,7 @@ Индекс = 0; Для каждого Задание Из ТекущиеЗадания Цикл - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если НЕ ОбщегоНазначения.РазделениеВключено() И ЗаданияВМоделиСервиса[Задание.Метаданные.Имя] <> Неопределено Тогда Продолжить; @@ -608,103 +649,13 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Формирует список параметров ИБ. -// -// Параметры: -// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. -// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). -// -Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания"); - МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальноеКоличествоИсполняющихФоновыхЗаданий"); - КонецЕсли; - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.1.24"; - Обработчик.Процедура = "РегламентныеЗаданияСлужебный.УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям"; - Обработчик.РежимВыполнения = "Монопольно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.3.12"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.РежимВыполнения = "Монопольно"; - Обработчик.Процедура = "РегламентныеЗаданияСлужебный.ОбновитьПараметрыБлокировкиРаботыСВнешнимиРесурсами"; - -КонецПроцедуры - -// Формирует таблицу регламентных заданий -// с признаком использования в модели сервиса. -// -// Параметры: -// ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо -// заполнить регламентными заданиями и признаком использования, колонки: -// РегламентноеЗадание - Строка - имя предопределенного регламентного задания. -// Использование - Булево - Истина, если регламентное задание должно -// выполняться в модели сервиса. Ложь - если не должно. -// -Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт - - ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); - - ПараметрыОтбора = Новый Структура; - ПараметрыОтбора.Вставить("ДоступноВМоделиСервиса", Ложь); - ЗаданияОтключаемыеМоделиСервиса = ЗависимыеРегламентныеЗадания.Скопировать(ПараметрыОтбора ,"РегламентноеЗадание"); - Для Каждого ОтключаемоеЗадание Из ЗаданияОтключаемыеМоделиСервиса Цикл - Если ТаблицаИспользования.Найти(ОтключаемоеЗадание.РегламентноеЗадание.Имя, "РегламентноеЗадание") <> Неопределено Тогда - Продолжить; - КонецЕсли; - - НоваяСтрока = ТаблицаИспользования.Добавить(); - НоваяСтрока.РегламентноеЗадание = ОтключаемоеЗадание.РегламентноеЗадание.Имя; - НоваяСтрока.Использование = Ложь; - КонецЦикла; - - ПараметрыОтбора.Вставить("ДоступноВМоделиСервиса", Истина); - ЗаданияВключаемыеВМоделиСервиса = ЗависимыеРегламентныеЗадания.Скопировать(ПараметрыОтбора ,"РегламентноеЗадание"); - Для Каждого ВключаемоеЗадание Из ЗаданияВключаемыеВМоделиСервиса Цикл - Если ТаблицаИспользования.Найти(ВключаемоеЗадание.РегламентноеЗадание.Имя, "РегламентноеЗадание") <> Неопределено Тогда - Продолжить; - КонецЕсли; - - НоваяСтрока = ТаблицаИспользования.Добавить(); - НоваяСтрока.РегламентноеЗадание = ВключаемоеЗадание.РегламентноеЗадание.Имя; - НоваяСтрока.Использование = Истина; - КонецЦикла; - -КонецПроцедуры - -// Обработчик начальной настройки ИБ после создания узла РИБ. -// Вызывается в момент первого запуска подчиненного узла РИБ (в том числе АРМ). -// -Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт - - УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с регламентными заданиями. // Предназначена для "ручного" немедленного выполнения процедуры регламентного задания // либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ). // Применяется в любом режиме соединения. -// СРучной" режим запуска не влияет на выполнение регламентного задания по аварийному +// Ручной режим запуска не влияет на выполнение регламентного задания по аварийному // и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания. // Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется // тоже правило. @@ -1149,7 +1100,7 @@ Процедура ИзменитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(Источник, Знач Использование) - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -1157,7 +1108,7 @@ ХранениеФО = Метаданные.НайтиПоТипу(ТипИсточника); ФункциональнаяОпция = Неопределено; ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ(); - ЭтоАвтономноеРабочееМесто = ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто(); + ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); @@ -1177,7 +1128,8 @@ КонецЦикла; - Если ФункциональнаяОпция = Неопределено Тогда + Если ФункциональнаяОпция = Неопределено + Или ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Использование Тогда Возврат; КонецЕсли; @@ -1380,7 +1332,7 @@ УстановитьПривилегированныйРежим(Истина); - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Ложь; КонецЕсли; @@ -1402,7 +1354,7 @@ Возврат Не ПоказатьФорму; // Блокировка работы с внешними ресурсами подтверждена администратором. КонецЕсли; - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); // При работе в модели сервиса факт переноса базы определяется менеджером сервиса. Если РазделениеВключено Тогда Возврат Ложь; @@ -1431,7 +1383,7 @@ КонецЕсли; Если ЭтоФайловаяБаза Тогда - // Для файловой базы через строка соединения может быть разной при подключении с различных + // Для файловой базы строка соединения может быть разной при подключении с различных // компьютеров, поэтому проверку перемещения базы осуществляем через файл. ИмяФайлаПроверки = "DoNotCopy.txt"; НайденныеФайлы = НайтиФайлы(ОбщегоНазначенияКлиентСервер.КаталогФайловойИнформационнойБазы(), "DoNotCopy.txt"); @@ -1443,7 +1395,7 @@ Возврат Истина; КонецЕсли; ЧтениеТекста = Новый ЧтениеТекста(НайденныеФайлы[0].ПолноеИмя); - ИдентификаторБазы =ЧтениеТекста.ПрочитатьСтроку(); + ИдентификаторБазы = ЧтениеТекста.ПрочитатьСтроку(); // Файл присутствует, но идентификатор внутри не соответствует ожидаемому. Если ИдентификаторБазы <> ПараметрыБлокировки.ИдентификаторБазы Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1452,12 +1404,12 @@ Возврат Истина; КонецЕсли; Иначе // Клиент-серверная база - ИмяБазы = НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединения).Ref); + ИмяБазы = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения).Ref); ИмяКомпьютера = НРег(ИмяКомпьютера()); - ИмяСервера = НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединения).Srvr); - СохраненноеИмяБазы = НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Ref); + ИмяСервера = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения).Srvr); + СохраненноеИмяБазы = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Ref); СохраненноеИмяКомпьютера = НРег(ПараметрыБлокировки.ИмяКомпьютера); - СохраненноеИмяСервера = НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Srvr); + СохраненноеИмяСервера = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Srvr); Если ИмяБазы <> СохраненноеИмяБазы Или (ПараметрыБлокировки.ПроверятьИмяСервера @@ -1494,7 +1446,7 @@ Если ПараметрыБлокировки = Неопределено Тогда ИнициализироватьПараметрыБлокировкиРаботыСВнешнимиРесурсами(); Иначе - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ПараметрыБлокировки.Вставить("РазделениеВключено", РазделениеВключено); Если РазделениеВключено Тогда ПараметрыБлокировки.Вставить("СтрокаСоединения", ""); @@ -1511,7 +1463,7 @@ СтрокаСоединения = СтрокаСоединенияИнформационнойБазы(); ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединения); - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ИдентификаторБазы = ?(ИнициализироватьПараметрыБлокировки, ИдентификаторФайловойБазы(ЭтоФайловаяБаза), ""); ПараметрыБлокировки = Новый Структура; @@ -1528,4 +1480,4 @@ КонецФункции -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl index f70f6f4c7..6d451b85c 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Устанавливает настройку в параметры резервного копирования. diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБГлобальный/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБГлобальный/Module.bsl index 758b09ad3..e90418416 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБГлобальный/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняет обработчик ожидания старта автоматического резервного копирования diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl index edacaaeb0..edf246cd0 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl @@ -1,10 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +// Открывает форму создания резервной копии. +// +// Параметры: +// Параметры - Структура - Параметры формы создания резервной копии. +// Процедура ОткрытьФормуРезервногоКопирования(Параметры = Неопределено) Экспорт ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных", Параметры); @@ -15,16 +15,17 @@ #Область СлужебныйПрограммныйИнтерфейс -// Процедура проверяет необходимость проведения резервного копирования -// или показа пользователю необходимого информационного сообщения. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Или ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда Возврат; КонецЕсли; - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботы.РазделениеВключено Тогда Возврат; КонецЕсли; @@ -69,59 +70,7 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Заполнение глобальных переменных. -Процедура ЗаполнитьЗначенияГлобальныхПеременных(ФиксированныеПараметрыРезервногоКопированияИБ) Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"; - ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); - ПараметрыПриложения[ИмяПараметра].Вставить("ПроцессВыполняется"); - ПараметрыПриложения[ИмяПараметра].Вставить("МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования"); - ПараметрыПриложения[ИмяПараметра].Вставить("ДатаПоследнегоРезервногоКопирования"); - ПараметрыПриложения[ИмяПараметра].Вставить("ПараметрОповещения"); - - ЗаполнитьЗначенияСвойств(ПараметрыПриложения[ИмяПараметра], ФиксированныеПараметрыРезервногоКопированияИБ); - ПараметрыПриложения[ИмяПараметра].Вставить("РасписаниеЗначение", ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(ФиксированныеПараметрыРезервногоКопированияИБ.РасписаниеКопирования)); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Проверяет возможность выполнения резервного копирования в пользовательском режиме. -// -// Параметры: -// Результат - Булево (возвращаемое значение). -// -Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда - - Результат = Истина; - - КонецЕсли; - -КонецПроцедуры - -// Вызывается при предложении создать резервную копию. -// -Процедура ПриПредложенииПользователюСоздатьРезервнуюКопию() Экспорт - - ОткрытьФормуРезервногоКопирования(); - -КонецПроцедуры - -// Доопределяет список предупреждений пользователю перед завершением работы системы. -// -// Параметры: -// Отказ - Булево - Признак отказа от выхода из программы. Если в теле процедуры-обработчика установить -// данному параметру значение Истина, то работа с программой не будет завершена. -// Предупреждения - Массив - в массив можно добавить элементы типа Структура, -// свойства которой см. в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. -// +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт #Если ВебКлиент Тогда @@ -157,6 +106,41 @@ КонецПроцедуры +// См. ИнтеграцияСтандартныхПодсистемКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме. +Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт + + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда + Результат = Истина; + КонецЕсли; + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистемКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию. +Процедура ПриПредложенииПользователюСоздатьРезервнуюКопию() Экспорт + + ОткрытьФормуРезервногоКопирования(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Заполнение глобальных переменных. +Процедура ЗаполнитьЗначенияГлобальныхПеременных(ФиксированныеПараметрыРезервногоКопированияИБ) Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"; + ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); + ПараметрыПриложения[ИмяПараметра].Вставить("ПроцессВыполняется"); + ПараметрыПриложения[ИмяПараметра].Вставить("МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования"); + ПараметрыПриложения[ИмяПараметра].Вставить("ДатаПоследнегоРезервногоКопирования"); + ПараметрыПриложения[ИмяПараметра].Вставить("ПараметрОповещения"); + + ЗаполнитьЗначенияСвойств(ПараметрыПриложения[ИмяПараметра], ФиксированныеПараметрыРезервногоКопированияИБ); + ПараметрыПриложения[ИмяПараметра].Вставить("РасписаниеЗначение", ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(ФиксированныеПараметрыРезервногоКопированияИБ.РасписаниеКопирования)); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции. @@ -169,8 +153,9 @@ Возврат; КонецЕсли; - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая - И НеобходимостьАвтоматическогоРезервногоКопирования() Тогда + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() + И НеобходимостьАвтоматическогоРезервногоКопирования() Тогда + ПровестиРезервноеКопирование(); КонецЕсли; @@ -260,7 +245,7 @@ Процедура УдалитьРезервныеКопииПоНастройке() Экспорт // Очистка архива с копиями. - ФиксированныеПараметрыРезервногоКопированияИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РезервноеКопированиеИБ; + ФиксированныеПараметрыРезервногоКопированияИБ = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РезервноеКопированиеИБ; КаталогХранения = ФиксированныеПараметрыРезервногоКопированияИБ.КаталогХраненияРезервныхКопий; ПараметрыУдаления = ФиксированныеПараметрыРезервногоКопированияИБ.ПараметрыУдаления; @@ -388,7 +373,7 @@ Функция СобытиеЖурналаРегистрации() Экспорт Возврат НСтр("ru = 'Резервное копирование информационной базы'", - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().КодОсновногоЯзыка); + СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().КодОсновногоЯзыка); КонецФункции @@ -429,7 +414,7 @@ Возврат Результат; КонецЕсли; - Результат.ИмяПользователя = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ИмяТекущегоПользователя; + Результат.ИмяПользователя = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ИмяТекущегоПользователя; Результат.ПарольПользователя = СтрокаUnicode(ПарольАдминистратора); Результат.СтрокаПодключения = "Usr=""{0}"";Pwd=""{1}"""; Возврат Результат; @@ -459,7 +444,7 @@ // В базовых версиях проверку подключения не осуществляем; // при некорректном вводе имени и пароля обновление завершится неуспешно. РезультатПодключения = Новый Структура("ОшибкаПодключенияКомпоненты, КраткоеОписаниеОшибки", Ложь, ""); - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиентаПриЗапуске.ЭтоБазоваяВерсияКонфигурации Тогда Возврат РезультатПодключения; КонецЕсли; diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиентПереопределяемый/Module.bsl index a7943a153..092c999f9 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиентПереопределяемый/Module.bsl @@ -1,15 +1,11 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Включает/отключает показ предупреждений о необходимости настройки/выполнении резервного копирования. // По умолчанию отключено. // // Параметры: -// ПоказыватьПредупреждение - Булево. +// ПоказыватьПредупреждение - Булево - Переопределяемый признак необходимости показа предупреждения. +// Процедура ПриОпределенииНеобходимостиПоказаПредупрежденийОРезервномКопировании(ПоказыватьПредупреждение) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl index 0011c54d3..af5af9b67 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl @@ -1,54 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование ИБ". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"].Добавить( - "РезервноеКопированиеИБКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "РезервноеКопированиеИБКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме"].Добавить( - "РезервноеКопированиеИБКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПредложенииПользователюСоздатьРезервнуюКопию"].Добавить( - "РезервноеКопированиеИБКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "РезервноеКопированиеИБСервер"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "РезервноеКопированиеИБСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РезервноеКопированиеИБСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииИспользованияПрофилейБезопасности"].Добавить( - "РезервноеКопированиеИБСервер"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "РезервноеКопированиеИБСервер"); - КонецЕсли; - -КонецПроцедуры - // Возвращает начальное заполнение настроек автоматического резервного копирования. // // Параметры: @@ -133,6 +84,127 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() + Или ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + ОтключеноУведомлениеОНастройкеРезервногоКопирования = МодульТекущиеДелаСервер.ДелоОтключено("НастроитьРезервноеКопирование"); + ОтключеноУведомлениеОВыполненииРезервногоКопирования = МодульТекущиеДелаСервер.ДелоОтключено("ВыполнитьРезервноеКопирование"); + + Если Не ПравоДоступа("Просмотр", Метаданные.Обработки.НастройкаРезервногоКопированияИБ) + Или (ОтключеноУведомлениеОНастройкеРезервногоКопирования + И ОтключеноУведомлениеОВыполненииРезервногоКопирования) Тогда + Возврат; + КонецЕсли; + + НастройкиРезервногоКопирования = НастройкиРезервногоКопирования(); + Если НастройкиРезервногоКопирования = Неопределено Тогда + Возврат; + КонецЕсли; + + ВариантОповещения = НастройкиРезервногоКопирования.ПараметрОповещения; + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.НастройкаРезервногоКопированияИБ.ПолноеИмя()); + + Для Каждого Раздел Из Разделы Цикл + + Если Не ОтключеноУведомлениеОНастройкеРезервногоКопирования Тогда + + ИмяФормыНастройкиРезервногоКопирования = ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(), + "Обработка.НастройкаРезервногоКопированияИБ.Форма.НастройкаРезервногоКопирования", + "Обработка.НастройкаРезервногоКопированияИБ.Форма.НастройкаРезервногоКопированияКлиентСервер"); + + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = "НастроитьРезервноеКопирование" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело.ЕстьДела = ВариантОповещения = "ЕщеНеНастроено"; + Дело.Представление = НСтр("ru = 'Настроить резервное копирование'"); + Дело.Важное = Истина; + Дело.Форма = ИмяФормыНастройкиРезервногоКопирования; + Дело.Владелец = Раздел; + КонецЕсли; + + Если Не ОтключеноУведомлениеОВыполненииРезервногоКопирования Тогда + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = "ВыполнитьРезервноеКопирование" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело.ЕстьДела = ВариантОповещения = "Просрочено"; + Дело.Представление = НСтр("ru = 'Резервное копирование не выполнено'"); + Дело.Важное = Истина; + Дело.Форма = "Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных"; + Дело.Владелец = Раздел; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + + Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования(Истина)); + Параметры.Вставить("РезервноеКопированиеИБПриЗавершенииРаботы", ПараметрыПриЗавершенииРаботы()); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования()); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_15"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.33"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_33"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.2.33"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_2_33"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.4.36"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_4_36"; + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности. +Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт + + ПараметрыРезервногоКопирования = НастройкиРезервногоКопирования(); + + Если ПараметрыРезервногоКопирования = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ПараметрыРезервногоКопирования.Свойство("ПарольАдминистратораИБ") Тогда + + ПараметрыРезервногоКопирования.ПарольАдминистратораИБ = ""; + УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -352,7 +424,7 @@ // Функция НастройкиРезервногоКопирования(НачалоРаботы = Ложь) Экспорт - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Неопределено; // Не выполнен вход в область данных. КонецЕсли; @@ -655,7 +727,7 @@ // Процедура ОбновитьПараметрыРезервногоКопирования_2_2_4_36() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -691,155 +763,4 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования(Истина)); - Параметры.Вставить("РезервноеКопированиеИБПриЗавершенииРаботы", ПараметрыПриЗавершенииРаботы()); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования()); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.15"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_15"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.33"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_33"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.2.33"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_2_33"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.4.36"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_4_36"; - -КонецПроцедуры - -// Вызывается при включении использования для информационной базы профилей безопасности. -// -Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт - - ПараметрыРезервногоКопирования = НастройкиРезервногоКопирования(); - - Если ПараметрыРезервногоКопирования = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ПараметрыРезервногоКопирования.Свойство("ПарольАдминистратораИБ") Тогда - - ПараметрыРезервногоКопирования.ПарольАдминистратораИБ = ""; - УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); - - КонецЕсли; - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() - Или ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - ОтключеноУведомлениеОНастройкеРезервногоКопирования = МодульТекущиеДелаСервер.ДелоОтключено("НастроитьРезервноеКопирование"); - ОтключеноУведомлениеОВыполненииРезервногоКопирования = МодульТекущиеДелаСервер.ДелоОтключено("ВыполнитьРезервноеКопирование"); - - Если Не ПравоДоступа("Просмотр", Метаданные.Обработки.НастройкаРезервногоКопированияИБ) - Или (ОтключеноУведомлениеОНастройкеРезервногоКопирования - И ОтключеноУведомлениеОВыполненииРезервногоКопирования) Тогда - Возврат; - КонецЕсли; - - НастройкиРезервногоКопирования = НастройкиРезервногоКопирования(); - Если НастройкиРезервногоКопирования = Неопределено Тогда - Возврат; - КонецЕсли; - ВариантОповещения = НастройкиРезервногоКопирования.ПараметрОповещения; - - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.НастройкаРезервногоКопированияИБ.ПолноеИмя()); - - Для Каждого Раздел Из Разделы Цикл - - Если Не ОтключеноУведомлениеОНастройкеРезервногоКопирования Тогда - - ИмяФормыНастройкиРезервногоКопирования = ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(), - "Обработка.НастройкаРезервногоКопированияИБ.Форма.НастройкаРезервногоКопирования", - "Обработка.НастройкаРезервногоКопированияИБ.Форма.НастройкаРезервногоКопированияКлиентСервер"); - - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = "НастроитьРезервноеКопирование" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело.ЕстьДела = ВариантОповещения = "ЕщеНеНастроено"; - Дело.Представление = НСтр("ru = 'Настроить резервное копирование'"); - Дело.Важное = Истина; - Дело.Форма = ИмяФормыНастройкиРезервногоКопирования; - Дело.Владелец = Раздел; - КонецЕсли; - - Если Не ОтключеноУведомлениеОВыполненииРезервногоКопирования Тогда - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = "ВыполнитьРезервноеКопирование" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело.ЕстьДела = ВариантОповещения = "Просрочено"; - Дело.Представление = НСтр("ru = 'Резервное копирование не выполнено'"); - Дело.Важное = Истина; - Дело.Форма = "Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных"; - Дело.Владелец = Раздел; - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl index 132bb1276..14769113b 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// РезервноеКопированиеОбластейДанных. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -10,7 +5,8 @@ // Возвращает состояние использования резервного копирования областей данных. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево - Истина, если резервное копирование используется. // Функция РезервноеКопированиеИспользуется() Экспорт @@ -19,220 +15,7 @@ КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме"].Добавить( - "РезервноеКопированиеОбластейДанныхКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПредложенииПользователюСоздатьРезервнуюКопию"].Добавить( - "РезервноеКопированиеОбластейДанныхКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "РезервноеКопированиеОбластейДанных"); - КонецЕсли; - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "РезервноеКопированиеОбластейДанных"); - КонецЕсли; - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовПринимаемыхСообщений"].Добавить( - "РезервноеКопированиеОбластейДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовОтправляемыхСообщений"].Добавить( - "РезервноеКопированиеОбластейДанных"); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Параметры.Вставить("РезервноеКопированиеОбластейДанных", ПолучитьФункциональнуюОпцию("ПоддержкаРезервногоКопирования")); - -КонецПроцедуры - -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("РезервноеКопированиеОбластейДанных.ВыгрузитьОбластьВХранилищеМС"); - СоответствиеИменПсевдонимам.Вставить("РезервноеКопированиеОбластейДанных.СозданиеКопий"); - -КонецПроцедуры - -// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию подсистем, -// используя в качестве ключей названия подсистем. -// Обеспечивает функциональность Web-сервиса InterfaceVersion. -// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). -// -// Параметры: -// СтруктураПоддерживаемыхВерсий - Структура: -// - Ключи = Названия подсистем. -// - Значения = Массивы названий поддерживаемых версий. -// -// Пример реализации: -// -// // СервисПередачиФайлов -// МассивВерсий = Новый Массив; -// МассивВерсий.Добавить("1.0.1.1"); -// МассивВерсий.Добавить("1.0.2.1"); -// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); -// // Конец СервисПередачиФайлов -// -Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт - - МассивВерсий = Новый Массив; - МассивВерсий.Добавить("1.0.1.1"); - МассивВерсий.Добавить("1.0.1.2"); - СтруктураПоддерживаемыхВерсий.Вставить("РезервноеКопированиеОбластейДанных", МассивВерсий); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.9"; - Обработчик.Процедура = "РезервноеКопированиеОбластейДанных.ПеренестиСостояниеПланированияРезервногоКопированияВоВспомогательныеДанные"; - Обработчик.ОбщиеДанные = Истина; - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.Константы.ВыполнитьРезервноеКопированиеОбластиДанных); - Типы.Добавить(Метаданные.Константы.ДатаПоследнегоСтартаКлиентскогоСеанса); - -КонецПроцедуры - -// Формирует список параметров ИБ. -// -// Параметры: -// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. -// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). -// -Процедура ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - СтрокаПараметра = МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ПоддержкаРезервногоКопирования"); - КонецЕсли; - -КонецПроцедуры - -// Заполняет соответствие методов обработчиков ошибок псевдонимам методов, при возникновении -// ошибок в которых они вызываются. -// -// Параметры: -// ОбработчикиОшибок - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода - обработчика ошибок, для вызова при возникновении ошибки. -// Обработчик ошибок вызывается в случае завершения выполнения исходного задания -// с ошибкой. Обработчик ошибок вызывается в той же области данных, что и исходное -// задание. -// Метод обработчика ошибок считается разрешенным к вызову механизмами очереди. -// Параметры обработчика ошибок: -// ПараметрыЗадания - Структура - параметры задания очереди. -// Параметры -// НомерПопытки -// КоличествоПовторовПриАварийномЗавершении -// ДатаНачалаПоследнегоЗапуска. -// ИнформацияОбОшибке - ИнформацияОбОшибке - описание ошибки, произошедшей при -// выполнении задания. -// -Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт - - ОбработчикиОшибок.Вставить( - "РезервноеКопированиеОбластейДанных.СозданиеКопий", - "РезервноеКопированиеОбластейДанных.ОшибкаСозданияКопии"); - -КонецПроцедуры - -// Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов -// принимаемых сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияУправлениеРезервнымКопированиемИнтерфейс); - -КонецПроцедуры - -// Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов -// отправляемых сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -// -Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияКонтрольРезервногоКопированияИнтерфейс); - -КонецПроцедуры - // Активность пользователей в области данных. // Устанавливает признак активности пользователя в текущей области. @@ -240,11 +23,11 @@ // Процедура УстановитьФлагАктивностиПользователяВОбласти() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если НЕ РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() + ИЛИ НЕ РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() ИЛИ ТекущийРежимЗапуска() = Неопределено ИЛИ НЕ ПолучитьФункциональнуюОпцию("ПоддержкаРезервногоКопирования") - ИЛИ РаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(ОбщегоНазначения.ЗначениеРазделителяСеанса()) Тогда + ИЛИ РаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()) Тогда Возврат; @@ -262,6 +45,169 @@ КонецПроцедуры +// Возвращает соответствие русских названий полей программных системных настроек +// английским из XDTO-пакета ZoneBackupControl Менеджера сервиса. +// (тип: {http://www.1c.ru/SaaS/1.0/XMLSchema/ZoneBackupControl}Settings). +// +// Возвращаемое значение: +// ФиксированноеСоответствие - соответствие русских имен полей настроек английским. +// +Функция СоответствиеРусскихИменПолейНастроекАнглийским() Экспорт + + Возврат РезервноеКопированиеОбластейДанныхПовтИсп.СоответствиеРусскихИменПолейНастроекАнглийским(); + +КонецФункции + +// Определяет, поддерживает ли приложение функциональность резервного копирования. +// +// Возвращаемое значение: +// Булево - Истина, если приложение поддерживает функциональность резервного копирования. +// +Функция МенеджерСервисаПоддерживаетРезервноеКопирование() Экспорт + + Возврат РезервноеКопированиеОбластейДанныхПовтИсп.МенеджерСервисаПоддерживаетРезервноеКопирование(); + +КонецФункции + +// Возвращает прокси web-сервиса контроля резервного копирования. +// +// Возвращаемое значение: +// WSПрокси - прокси менеджера сервиса. +// +Функция ПроксиКонтроляРезервногоКопирования() Экспорт + + Возврат РезервноеКопированиеОбластейДанныхПовтИсп.ПроксиКонтроляРезервногоКопирования(); + +КонецФункции + +// Возвращает имя подсистемы, которое должно использоваться в именах +// событий журнала регистрации. +// +// Возвращаемое значение: +// Строка - имя подсистемы. +// +Функция ИмяПодсистемыДляСобытийЖурналаРегистрации() Экспорт + + Возврат РезервноеКопированиеОбластейДанныхПовтИсп.ИмяПодсистемыДляСобытийЖурналаРегистрации(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Фоновые задания + +// Возвращает наименование фонового задания выгрузки области в файл. +// +// Возвращаемое значение: +// Строка - наименование фонового задания. +// +Функция НаименованиеФоновогоРезервногоКопирования() Экспорт + + Возврат РезервноеКопированиеОбластейДанныхПовтИсп.НаименованиеФоновогоРезервногоКопирования(); + +КонецФункции + + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Параметры.Вставить("РезервноеКопированиеОбластейДанных", ПолучитьФункциональнуюОпцию("ПоддержкаРезервногоКопирования")); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("РезервноеКопированиеОбластейДанных.ВыгрузитьОбластьВХранилищеМС"); + СоответствиеИменПсевдонимам.Вставить("РезервноеКопированиеОбластейДанных.СозданиеКопий"); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт + + МассивВерсий = Новый Массив; + МассивВерсий.Добавить("1.0.1.1"); + МассивВерсий.Добавить("1.0.1.2"); + СтруктураПоддерживаемыхВерсий.Вставить("РезервноеКопированиеОбластейДанных", МассивВерсий); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.9"; + Обработчик.Процедура = "РезервноеКопированиеОбластейДанных.ПеренестиСостояниеПланированияРезервногоКопированияВоВспомогательныеДанные"; + Обработчик.ОбщиеДанные = Истина; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.Константы.ВыполнитьРезервноеКопированиеОбластиДанных); + Типы.Добавить(Метаданные.Константы.ДатаПоследнегоСтартаКлиентскогоСеанса); + +КонецПроцедуры + +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. +Процедура ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СтрокаПараметра = МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ПоддержкаРезервногоКопирования"); + КонецЕсли; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииОбработчиковОшибок. +Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт + + ОбработчикиОшибок.Вставить( + "РезервноеКопированиеОбластейДанных.СозданиеКопий", + "РезервноеКопированиеОбластейДанных.ОшибкаСозданияКопии"); + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений. +Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт + + МассивОбработчиков.Добавить(СообщенияУправлениеРезервнымКопированиемИнтерфейс); + +КонецПроцедуры + +// См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений. +Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт + + МассивОбработчиков.Добавить(СообщенияКонтрольРезервногоКопированияИнтерфейс); + +КонецПроцедуры + +// Возвращает имя метода фонового задания выгрузки области в файл. +// +// Возвращаемое значение: +// Строка - имя метода. +// +Функция ИмяМетодаФоновогоРезервногоКопирования() Экспорт + + Возврат "РезервноеКопированиеОбластейДанных.ВыгрузитьОбластьВХранилищеМС"; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Активность пользователей в области данных. + // Устанавливает либо снимает признак активности пользователя в текущей области. // Признаком является значение совместно разделенной константы ВыполнитьРезервноеКопированиеОбластиДанных. // Устарело. @@ -274,14 +220,14 @@ Процедура УстановитьФлагАктивностиВОбласти(Знач ОбластьДанных = Неопределено, Знач Состояние = Истина) Если ОбластьДанных = Неопределено Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбластьДанных = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Иначе - ВызватьИсключение НСтр("ru = 'При вызове процедуры УстановитьФлагАктивностиВОбласти из неразделенного сеанса параметр ОбластьДанных является обязательным!'"); + ВызватьИсключение НСтр("ru = 'При вызове процедуры УстановитьФлагАктивностиВОбласти из неразделенного сеанса параметр ОбластьДанных является обязательным.'"); КонецЕсли; Иначе - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - И ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() + И ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда ВызватьИсключение(НСтр("ru = 'Запрещено работать с данными области кроме текущей'")); @@ -302,7 +248,7 @@ ФлагАктивности = Константы.ВыполнитьРезервноеКопированиеОбластиДанных.СоздатьМенеджерЗначения(); ФлагАктивности.ОбластьДанныхВспомогательныеДанные = ОбластьДанных; ФлагАктивности.Значение = Состояние; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ФлагАктивности); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ФлагАктивности); КонецПроцедуры @@ -458,7 +404,7 @@ ИдКопии = Новый УникальныйИдентификатор; ПараметрыСообщения = Новый Структура; - ПараметрыСообщения.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + ПараметрыСообщения.Вставить("ОбластьДанных", РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ПараметрыСообщения.Вставить("ИДКопии", ИдКопии); ПараметрыСообщения.Вставить("ИДФайла", ИДФайла); ПараметрыСообщения.Вставить("ДатаСоздания", ДатаСозданияКопии); @@ -532,8 +478,8 @@ // регистрации сообщение о том, что копия не была создана. // // Параметры: -// ПараметрыЗадания - Структура - описание см. описание события. -// СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок. +// ПараметрыЗадания - Структура - свойства структуры +// см. ОчередьЗаданийПереопределяемый.ПриОпределенииОбработчиковОшибок. // Процедура ОшибкаСозданияКопии(Знач ПараметрыЗадания, Знач ИнформацияОбОшибке) Экспорт @@ -555,7 +501,7 @@ ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонКомментария, - Формат(ОбщегоНазначения.ЗначениеРазделителяСеанса(), "ЧН=0; ЧГ="), + Формат(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), "ЧН=0; ЧГ="), ПараметрыЗадания.НомерПопытки, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); @@ -586,7 +532,7 @@ ПараметрыМетода.Добавить(Неопределено); ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода", РезервноеКопированиеОбластейДанныхПовтИсп.ИмяМетодаФоновогоРезервногоКопирования()); + ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетодаФоновогоРезервногоКопирования()); ПараметрыЗадания.Вставить("Ключ", "" + ПараметрыВыгрузки.ИДКопии); ПараметрыЗадания.Вставить("ОбластьДанных", ПараметрыВыгрузки.ОбластьДанных); @@ -729,8 +675,8 @@ Функция ТребуетсяВыгрузка(Знач ПараметрыВыгрузки) - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - И ПараметрыВыгрузки.ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() + И ПараметрыВыгрузки.ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда ВызватьИсключение(НСтр("ru = 'Запрещено работать с данными области кроме текущей'")); КонецЕсли; @@ -790,7 +736,7 @@ УстановитьПривилегированныйРежим(Истина); - ИмяМетода = РезервноеКопированиеОбластейДанныхПовтИсп.ИмяМетодаФоновогоРезервногоКопирования(); + ИмяМетода = ИмяМетодаФоновогоРезервногоКопирования(); Отбор = Новый Структура("ИмяМетода, Ключ, ОбластьДанных", ИмяМетода, "" + ПараметрыОтмены.ИДКопии, ПараметрыОтмены.ОбластьДанных); @@ -932,8 +878,8 @@ // Функция ПолучитьНастройкиРезервногоКопированияОбласти(Знач ОбластьДанных = Неопределено) Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - И ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() + И ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() И ОбластьДанных <> Неопределено Тогда ВызватьИсключение(НСтр("ru = 'Запрещено работать с данными области кроме текущей'")); @@ -973,8 +919,8 @@ // Процедура УстановитьНастройкиРезервногоКопированияОбласти(Знач ОбластьДанных, Знач НастройкиРезервногоКопирования) Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - И ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.СеансЗапущенБезРазделителей() + И ОбластьДанных <> РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() Тогда ВызватьИсключение(НСтр("ru = 'Запрещено работать с данными области кроме текущей'")); КонецЕсли; @@ -1029,7 +975,7 @@ // Процедура ПеренестиСостояниеПланированияРезервногоКопированияВоВспомогательныеДанные() Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl index 1f9aa05ec..770adb6c2 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование областей данных". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция ПолучитьПараметрыФормыНастроек(Знач ОбластьДанных) Экспорт diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl index 09547d52b..a054d5074 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Резервное копирование областей данных". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция ПолучитьПараметрыФормыНастроек(Знач ОбластьДанных) Экспорт diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl index 1d40ff05b..7b0f1a4e5 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl @@ -1,15 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// РезервноеКопированиеОбластейДанных. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Предлагает пользователю создать резервную копию. // Процедура ПредложитьПользователюСоздатьРезервнуюКопию() Экспорт - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РезервноеКопированиеОбластейДанных Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РезервноеКопированиеОбластейДанных Тогда ИмяФормы = "ОбщаяФорма.СозданиеРезервнойКопии"; @@ -25,19 +20,15 @@ #КонецОбласти -#Область СлужебныеПроцедурыИФункции +#Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. +// Обработчики событий подсистем конфигурации. -// Проверяет возможность выполнения резервного копирования в пользовательском режиме. -// -// Параметры: -// Результат - Булево (возвращаемое значение). -// +// См. ИнтеграцияСтандартныхПодсистемКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме. Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено Тогда Результат = Истина; @@ -45,11 +36,10 @@ КонецПроцедуры -// Вызывается при предложении создать резервную копию. -// +// См. ИнтеграцияСтандартныхПодсистемКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию. Процедура ПриПредложенииПользователюСоздатьРезервнуюКопию() Экспорт - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено Тогда ПредложитьПользователюСоздатьРезервнуюКопию(); diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl index ad361c037..b3bf4091f 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl @@ -1,17 +1,11 @@ - -//////////////////////////////////////////////////////////////////////////////// -// РезервноеКопированиеОбластейДанныхПовтИсп. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Возвращает соответствие русских названий полей программных системных настроек // английским из XDTO-пакета ZoneBackupControl Менеджера сервиса. // (тип: {http://www.1c.ru/SaaS/1.0/XMLSchema/ZoneBackupControl}Settings). // // Возвращаемое значение: -// ФиксированноеСоответствие. +// ФиксированноеСоответствие - соответствие русских имен полей настроек английским. // Функция СоответствиеРусскихИменПолейНастроекАнглийским() Экспорт @@ -55,12 +49,11 @@ // Возвращает прокси web-сервиса контроля резервного копирования. // // Возвращаемое значение: -// WSПрокси. -// Прокси менеджера сервиса. +// WSПрокси - прокси менеджера сервиса. // Функция ПроксиКонтроляРезервногоКопирования() Экспорт - АдресМенеджераСервиса = Константы.ВнутреннийАдресМенеджераСервиса.Получить(); + АдресМенеджераСервиса = РаботаВМоделиСервиса.ВнутреннийАдресМенеджераСервиса(); Если Не ЗначениеЗаполнено(АдресМенеджераСервиса) Тогда ВызватьИсключение(НСтр("ru = 'Не установлены параметры связи с менеджером сервиса.'")); КонецЕсли; @@ -86,7 +79,8 @@ // Возвращает имя подсистемы, которое должно использоваться в именах // событий журнала регистрации. // -// Возвращаемое значение: Строка. +// Возвращаемое значение: +// Строка - имя подсистемы. // Функция ИмяПодсистемыДляСобытийЖурналаРегистрации() Экспорт @@ -97,21 +91,10 @@ //////////////////////////////////////////////////////////////////////////////// // Фоновые задания -// Возвращает имя метода фонового задания выгрузки области в файл. -// -// Возвращаемое значение: -// Строка. -// -Функция ИмяМетодаФоновогоРезервногоКопирования() Экспорт - - Возврат "РезервноеКопированиеОбластейДанных.ВыгрузитьОбластьВХранилищеМС"; - -КонецФункции - // Возвращает наименование фонового задания выгрузки области в файл. // // Возвращаемое значение: -// Строка. +// Строка - наименование фонового задания. // Функция НаименованиеФоновогоРезервногоКопирования() Экспорт diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl index 822b52f09..0240bf822 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl @@ -1,30 +1,24 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "СклоненияПредставленийОбъектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Склоняет ФИО // Только для работы на ОС Windows. // // Параметры: -// ФИО - Строка - Строка, в которой содержится ФИО для склонения. -// Падеж - Число - падеж, в который необходимо просклонять представление объекта. -// 1 - Именительный. -// 2 - Родительный. -// 3 - Дательный. -// 4 - Винительный. -// 5 - Творительный. -// 6 - Предложный. -// Объект - ОбъектСклонения - Ссылка на объект, реквизит которого склоняется. -// Пол - Число - Число - пол физического лица, -// 1 - мужской, -// 2 - женский. +// ФИО - Строка - Строка, в которой содержится ФИО для склонения. +// Падеж - Число - падеж, в который необходимо просклонять представление объекта. +// 1 - Именительный. +// 2 - Родительный. +// 3 - Дательный. +// 4 - Винительный. +// 5 - Творительный. +// 6 - Предложный. +// Объект - ОбъектСклонения - Ссылка на объект, реквизит которого склоняется. +// Пол - Число - Число - пол физического лица, +// 1 - мужской, +// 2 - женский. // // Возвращаемое значение: -// Строка - Результат склонения ФИО в падеже. +// Строка - Результат склонения ФИО в падеже. // Функция ПросклонятьФИО(ФИО, Падеж, Объект = Неопределено, Пол = Неопределено) Экспорт @@ -36,15 +30,15 @@ // Только для работы на ОС Windows. // // Параметры: -// Представление - Строка - Строка, в которой содержится ФИО для склонения. -// Падеж - Число - падеж, в который необходимо просклонять представление объекта. +// Представление - Строка - Строка, в которой содержится ФИО для склонения. +// Падеж - Число - падеж, в который необходимо просклонять представление объекта. // 1 - Именительный. // 2 - Родительный. // 3 - Дательный. // 4 - Винительный. // 5 - Творительный. // 6 - Предложный. -// Объект - ОбъектСклонения - Ссылка на объект, реквизит которого склоняется. +// Объект - ОбъектСклонения - Ссылка на объект, реквизит которого склоняется. // // Возвращаемое значение: // Строка - Результат склонения представления объекта в падеже. @@ -84,7 +78,7 @@ // Обработчик события ПриЗаписиНаСервере управляемой формы объекта для склонения. // // Параметры: -// Форма - Управляемая форма - форма объекта склонения. +// Форма - УправляемаяФорма - форма объекта склонения. // Представление - Строка - Строка для склонения. // Объект - ОбъектСклонения - Объект для склонения. // ЭтоФИО - Булево - Признак склонения ФИО. @@ -118,7 +112,7 @@ ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); ТекущиеПараметры.Вставить("ДоступенСервисСклонения", Доступность); - + ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ТекущиеПараметры); УстановитьПривилегированныйРежим(Ложь); @@ -147,9 +141,16 @@ // Функция ПросклонятьФИОСПомощьюКомпоненты(Знач ФИО, Падеж, Результат, Пол = Неопределено) Экспорт - ПроверитьПараметрПолМетодаПросклонятьФИО(Пол); + Если Не ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСклоненияФИО", "Decl") Тогда + + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение компоненты склонения'", КодОсновногоЯзыка), УровеньЖурналаРегистрации.Ошибка, , ,НСтр("ru = 'Компонента склонения ФИО не обнаружена'", КодОсновногоЯзыка)); + + Результат = ФИО; + Возврат Ложь; + + КонецЕсли; - ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСклоненияФИО", "Decl"); Компонента = Новый("AddIn.Decl.CNameDecl"); Результат = ""; @@ -163,6 +164,7 @@ НомерНесклоняемогоСимвола = Номер; Прервать; КонецЕсли; + Результат = Результат + ?(Номер > 1, " ", "") + МассивСтрок[Номер-1]; КонецЦикла; @@ -174,14 +176,16 @@ Попытка Если Пол = Неопределено Тогда Результат = Компонента.Просклонять(Результат, Падеж) + " "; + Иначе Результат = Компонента.Просклонять(Результат, Падеж, Пол) + " "; + КонецЕсли; + Исключение - Событие = НСтр("ru = 'Склонение ФИО при помощи компоненты'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - ЗаписьЖурналаРегистрации(Событие, УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()); Результат = ФИО; Возврат Ложь; + КонецПопытки; // Остальные символы добавим без склонения. @@ -270,6 +274,10 @@ // Функция ДанныеСклонения(Представление, ЭтоФИО = Ложь, Пол = Неопределено, ПоказыватьСообщения = Ложь) Экспорт + Если Не ЗначениеЗаполнено(Представление) Тогда + Возврат СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения(); + КонецЕсли; + ИспользоватьСервисСклонения = Константы.ИспользоватьСервисСклоненияMorpher.Получить(); Если Не ЭтоФИО И ИспользоватьСервисСклонения Тогда @@ -312,16 +320,6 @@ КонецФункции -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "СклонениеПредставленийОбъектов"); - -КонецПроцедуры - Процедура ПросклонятьПредставлениеПоВсемПадежамДлительнаяОперация(Параметры, АдресРезультата) Экспорт Если Параметры.ИзмененоПредставление Или Параметры.Склонения = Неопределено Тогда @@ -333,7 +331,25 @@ КонецЕсли; КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + Разрешения = Новый Массив(); + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("ОбщийМакет.КомпонентаСклоненияФИО", + НСтр("ru = 'Для использования функций по склонению ФИО.'"))); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения)); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -428,8 +444,8 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - - ХешПредставления = ХешПредставления(Представление); + + ХешПредставления = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Представление); НаборЗаписейСклонения = РегистрыСведений.СклоненияПредставленийОбъектов.СоздатьНаборЗаписей(); @@ -441,117 +457,103 @@ НоваяСтрока.ХешПредставления = ХешПредставления; ЗаполнитьЗначенияСвойств(НоваяСтрока, Склонения); - НаборЗаписейСклонения.Записать(); + НаборЗаписейСклонения.Записать(); УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры -Функция ХешПредставления(Представление) +Функция СтруктураСклоненияЧерезЗапросКСервису(Представление, ПоказыватьСообщения) - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Представление); - ХешПредставления = СтрЗаменить(Строка(ХешированиеДанных.ХешСумма), " ", ""); - - Возврат ХешПредставления; - -КонецФункции - -Функция СтруктураСклоненияЧерезЗапросКСервису(СклоняемыйТекст, ПоказыватьСообщения) + СообщениеОбОшибке = ""; СтруктураСклонения = Неопределено; - Запрос = HTTPЗапросКСервисуСклонения(СклоняемыйТекст); - Соединение = HTTPСоединениеСервисаСклонений(); + Результат = Неопределено; - Попытка - Ответ = Соединение.Получить(Запрос); - Исключение - ЗарегистрироватьОшибкуСервисаСклонений(ОписаниеОшибки(), ПоказыватьСообщения); - Возврат СтруктураСклонения; - КонецПопытки; + УстановитьПривилегированныйРежим(Истина); + Логин = Константы.ЛогинДоступаКСервисуMorpher.Получить(); + УстановитьПривилегированныйРежим(Ложь); - ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); - Если Ответ.КодСостояния <> 200 Тогда - ЗарегистрироватьОшибкуСервисаСклонений(ТелоОтвета, ПоказыватьСообщения); - Возврат СтруктураСклонения; + Результат = РезультатОбращенияКСервису("http://morpher.ru/WebService.asmx?WSDL", Представление, Логин, СообщениеОбОшибке); + + Если Результат = Неопределено Тогда + + Результат = РезультатОбращенияКСервису("http://morphapi.ru/WebService.asmx?WSDL", Представление, Логин, СообщениеОбОшибке); + КонецЕсли; - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(ТелоОтвета); - СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON); - ЧтениеJSON.Закрыть(); - - СтруктураСклонения = СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения(); - СтруктураСклонения.ИменительныйПадеж = СклоняемыйТекст; - СтруктураСклонения.РодительныйПадеж = СтруктураОтвета.Р; - СтруктураСклонения.ДательныйПадеж = СтруктураОтвета.Д; - СтруктураСклонения.ВинительныйПадеж = СтруктураОтвета.В; - СтруктураСклонения.ТворительныйПадеж = СтруктураОтвета.Т; - СтруктураСклонения.ПредложныйПадеж = СтруктураОтвета.П; + + Если Результат <> Неопределено Тогда + + СтруктураСклонения = СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения(); + + СтруктураСклонения.ИменительныйПадеж = Представление; + СтруктураСклонения.РодительныйПадеж = Результат.Р; + СтруктураСклонения.ДательныйПадеж = Результат.Д; + СтруктураСклонения.ВинительныйПадеж = Результат.В; + СтруктураСклонения.ТворительныйПадеж = Результат.Т; + СтруктураСклонения.ПредложныйПадеж = Результат.П; + + Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Вызов веб-сервиса склонения'", КодОсновногоЯзыка), УровеньЖурналаРегистрации.Предупреждение, , ,СообщениеОбОшибке); + КонецЕсли; + + Иначе + + КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Вызов веб-сервиса склонения'", КодОсновногоЯзыка), УровеньЖурналаРегистрации.Ошибка, , ,СообщениеОбОшибке); + + Если ПоказыватьСообщения Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка при вызове сервиса склонения. Обратитесь к администратору.'") + Символы.ПС + НСтр("ru = 'Техническая информация:'") + Символы.ПС + СообщениеОбОшибке); + КонецЕсли; + + КонецЕсли; Возврат СтруктураСклонения; КонецФункции -Функция HTTPЗапросКСервисуСклонения(СклоняемыйТекст) +Функция РезультатОбращенияКСервису(URL, Представление, Логин, СообщениеОбОшибке) - ТекстЗапроса = "/russian/declension?s=" + СклоняемыйТекст; + Результат = Неопределено; - УстановитьПривилегированныйРежим(Истина); - ВладелецТокена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"); - Токен = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ВладелецТокена, "ТокенДоступаКСервисуMorpher", Истина); - УстановитьПривилегированныйРежим(Ложь); - - Если ЗначениеЗаполнено(Токен) Тогда - ТекстЗапроса = ТекстЗапроса + "&token=" + Токен; - КонецЕсли; + ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси(); + ПараметрыПодключения.АдресWSDL = URL; + ПараметрыПодключения.URIПространстваИмен = "http://morpher.ru/"; + ПараметрыПодключения.ИмяСервиса = "WebService"; + ПараметрыПодключения.Таймаут = 10; - Заголовки = Новый Соответствие; - Заголовки.Вставить("User-Agent", "1C Enterprise 8.3"); - Заголовки.Вставить("Accept", "application/json"); - Заголовки.Вставить("charset", "UTF-8"); + Попытка + + Если ЗначениеЗаполнено(Логин) Тогда + Пароль = ""; + + УстановитьПривилегированныйРежим(Истина); + Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов"), "ПарольДоступаКСервисуMorpher"); + УстановитьПривилегированныйРежим(Ложь); + + ПараметрыПодключения.ИмяПользователя = Логин; + ПараметрыПодключения.Пароль = Пароль; + КонецЕсли; + + Морфер = ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения); + Результат = Морфер.GetXml(Представление); + + Исключение + + Если НЕ ПустаяСтрока(СообщениеОбОшибке) Тогда + СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС; + КонецЕсли; + + СообщениеОбОшибке = СообщениеОбОшибке + URL + Символы.ПС + ОписаниеОшибки(); + + КонецПопытки; - Возврат Новый HTTPЗапрос(ТекстЗапроса, Заголовки); + Возврат Результат; КонецФункции -Функция HTTPСоединениеСервисаСклонений() - - АдресСервера = "ws3.morpher.ru"; - - ИнтернетПрокси = Неопределено; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); - ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("https"); - КонецЕсли; - - Таймаут = 10; - - ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС); - Возврат Новый HTTPСоединение(АдресСервера, , , , ИнтернетПрокси, Таймаут, ЗащищенноеСоединение); - -КонецФункции - -Процедура ЗарегистрироватьОшибкуСервисаСклонений(ОписаниеОшибки, ПоказыватьСообщения) - - ИмяСобытия = НСтр("ru = 'Вызов веб-сервиса склонения'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки); - - Если Не ПоказыватьСообщения Тогда - Возврат; - КонецЕсли; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при вызове сервиса склонения. Обратитесь к администратору. - |Техническая информация - |%1'"), - ОписаниеОшибки); - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); - -КонецПроцедуры - Функция СклоненияИзРегистра(Представление, Объект = Неопределено) УстановитьПривилегированныйРежим(Истина); @@ -610,7 +612,7 @@ |УПОРЯДОЧИТЬ ПО | Приоритет"; - Запрос.УстановитьПараметр("ХешПредставления", ХешПредставления(Представление)); + Запрос.УстановитьПараметр("ХешПредставления", ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Представление)); Запрос.УстановитьПараметр("Объект", Объект); Запрос.УстановитьПараметр("ИспользуетсяОтборПоОбъекту", ЗначениеЗаполнено(Объект)); @@ -666,25 +668,6 @@ КонецФункции -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Разрешения = Новый Массив(); - - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("ОбщийМакет.КомпонентаСклоненияФИО", - НСтр("ru = 'Для использования функций по склонению ФИО.'"))); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения)); - -КонецПроцедуры - Процедура ЗаполнитьСтруктуруСклоненияПоПредставлению(СтруктураСклонения, Представление) Для Каждого КлючИЗначение Из СтруктураСклонения Цикл @@ -693,21 +676,10 @@ КонецПроцедуры -Процедура ПроверитьПараметрПолМетодаПросклонятьФИО(Пол) +Функция ЕстьПравоДоступаКОбъекту(Ссылка) Экспорт - Если Пол = Неопределено Тогда - Возврат; - КонецЕсли; + Возврат ПравоДоступа("Редактирование", Ссылка.Метаданные()); - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( - "СклонениеПредставленийОбъектов.ПросклонятьФИО", "Пол", Пол, Тип("Число")); - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен числом 1 (мужской) или 2 (женский); передано значение: %3 (тип %4).'"), - "Пол", "СклонениеПредставленийОбъектов.ПросклонятьФИО", Пол, ТипЗнч(Пол)); - ОбщегоНазначенияКлиентСервер.Проверить(Пол = 1 Или Пол = 2, ТекстСообщения); - -КонецПроцедуры +КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl index 3b0a4fcf5..a3ec2cea7 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "СклоненияПредставленийОбъектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Склоняет переданную фразу по всем падежам. @@ -24,4 +18,10 @@ КонецПроцедуры +Функция ЕстьПравоДоступаКОбъекту(Ссылка) Экспорт + + Возврат СклонениеПредставленийОбъектов.ЕстьПравоДоступаКОбъекту(Ссылка); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl index 761edfcf6..c06134b57 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl @@ -1,15 +1,9 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "СклоненияПредставленийОбъектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик события ПриИзменении элемента формы, подлежащего склонению. // // Параметры: -// Форма - Управляемая форма - форма, содержащая элемент, подлежащий склонению. +// Форма - УправляемаяФорма - форма, содержащая элемент, подлежащий склонению. // Процедура ПриИзмененииПредставления(Форма) Экспорт @@ -21,7 +15,7 @@ // Склоняет переданную фразу по всем падежам. // // Параметры: -// Форма - Управляемая форма - форма объекта склонения. +// Форма - УправляемаяФорма - форма объекта склонения. // Представление - Строка - Строка для склонения. // ЭтоФИО - Булево - Признак склонения ФИО. // Пол - Число - Пол физического лица (в случае склонения ФИО) @@ -32,7 +26,9 @@ Процедура ПросклонятьПредставлениеПоВсемПадежам(Форма, Представление, ЭтоФИО = Ложь, Пол = Неопределено, ПоказыватьСообщения = Ложь) Экспорт Если Форма.ИзмененоПредставление Или Форма.Склонения = Неопределено Тогда - СклонениеПредставленийОбъектовВызовСервера.ПросклонятьПредставлениеПоВсемПадежам(Представление, Форма.Склонения, ЭтоФИО, Пол, ПоказыватьСообщения); + Склонения = Форма.Склонения; + СклонениеПредставленийОбъектовВызовСервера.ПросклонятьПредставлениеПоВсемПадежам(Представление, Склонения, ЭтоФИО, Пол, ПоказыватьСообщения); + Форма.Склонения = Склонения; Форма.ИзмененоПредставление = Ложь; КонецЕсли; @@ -41,7 +37,7 @@ // Обработчик команды "Склонения" формы объекта склонения. // // Параметры: -// Форма - Управляемая форма - форма объекта склонения. +// Форма - УправляемаяФорма - форма объекта склонения. // Представление - Строка - Строка для склонения. // ЭтоФИО - Булево - Признак склонения ФИО. // Пол - Число - Пол физического лица (в случае склонения ФИО) @@ -55,13 +51,16 @@ Оповещение = Новый ОписаниеОповещения("ОткрытьФормуСклоненияЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ЕстьПравоДоступаКОбъекту = СклонениеПредставленийОбъектовВызовСервера.ЕстьПравоДоступаКОбъекту(Форма.Параметры.Ключ); + СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("Склонения", Форма.Склонения); СтруктураПараметров.Вставить("ЭтоФИО", ЭтоФИО); СтруктураПараметров.Вставить("Пол", Пол); СтруктураПараметров.Вставить("Представление", Представление); СтруктураПараметров.Вставить("ИзмененоПредставление", Форма.ИзмененоПредставление); - + СтруктураПараметров.Вставить("ТолькоПросмотр", Не ЕстьПравоДоступаКОбъекту); + ОткрытьФорму("ОбщаяФорма.Склонения", СтруктураПараметров, Форма, , , , Оповещение); Форма.ОтключитьОбработчикОжидания("Подключаемый_ПросклонятьПредставлениеПоВсемПадежам"); diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl index 0aaaf0a87..f01083f57 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "СклоненияПредставленийОбъектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Возвращает пустую структуру склонения. diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl index c9587a76c..afdf135ca 100644 --- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -30,7 +25,7 @@ Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", Знач КодРазрешения = "КодРазрешения") Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда Возврат Ложь; @@ -62,30 +57,21 @@ // Определить, установлена ли блокировка соединений при пакетном // обновлении конфигурации информационной базы. // -// Параметры: -// ПараметрыБлокировки - Структура - параметры блокировки сеансов. См. описание в -// СтруктураПараметровБлокировкиСеансов(). -// // Возвращаемое значение: -// Булево - Истина, если установлена, ложь - Иначе. +// Булево - Истина, если установлена, ложь - Иначе. // -Функция УстановленаБлокировкаСоединений(ПараметрыБлокировки = Неопределено) Экспорт - - Если ПараметрыБлокировки = Неопределено Тогда - ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов(); - КонецЕсли; +Функция УстановленаБлокировкаСоединений() Экспорт + ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов(); Возврат ПараметрыБлокировки.УстановленаБлокировкаСоединений; - + КонецФункции // Получить параметры блокировки соединений ИБ для использования на стороне клиента. // // Параметры: -// ПолучитьКоличествоСеансов - Булево - если Истина, то в возвращаемой структуре -// заполняется поле КоличествоСеансов. -// ПараметрыБлокировки - Структура - параметры блокировки сеансов. См. описание в -// СтруктураПараметровБлокировкиСеансов(). +// ПолучитьКоличествоСеансов - Булево - если Истина, то в возвращаемой структуре +// заполняется поле КоличествоСеансов. // // Возвращаемое значение: // Структура - со свойствами: @@ -97,37 +83,10 @@ // * КоличествоСеансов - Число - 0, если параметр ПолучитьКоличествоСеансов = Ложь. // * ТекущаяДатаСеанса - Дата - текущая дата сеанса. // -Функция ПараметрыБлокировкиСеансов(Знач ПолучитьКоличествоСеансов = Ложь, ПараметрыБлокировки = Неопределено) Экспорт +Функция ПараметрыБлокировкиСеансов(Знач ПолучитьКоличествоСеансов = Ложь) Экспорт - Если ПараметрыБлокировки = Неопределено Тогда - ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов(); - КонецЕсли; - - Если ПараметрыБлокировки.УстановленаБлокировкаСоединенийИБНаДату Тогда - ТекущийРежим = ПараметрыБлокировки.ТекущийРежимИБ; - ИначеЕсли ПараметрыБлокировки.УстановленаБлокировкаСоединенийОбластиДанныхНаДату Тогда - ТекущийРежим = ПараметрыБлокировки.ТекущийРежимОбластиДанных; - ИначеЕсли ПараметрыБлокировки.ТекущийРежимИБ.Установлена Тогда - ТекущийРежим = ПараметрыБлокировки.ТекущийРежимИБ; - Иначе - ТекущийРежим = ПараметрыБлокировки.ТекущийРежимОбластиДанных; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Результат = Новый Структура; - Результат.Вставить("Установлена", ТекущийРежим.Установлена); - Результат.Вставить("Начало", ТекущийРежим.Начало); - Результат.Вставить("Конец", ТекущийРежим.Конец); - Результат.Вставить("Сообщение", ТекущийРежим.Сообщение); - Результат.Вставить("ИнтервалОжиданияЗавершенияРаботыПользователей", 15 * 60); - Результат.Вставить("КоличествоСеансов", ?(ПолучитьКоличествоСеансов, КоличествоСеансовИнформационнойБазы(), 0)); - Результат.Вставить("ТекущаяДатаСеанса", ПараметрыБлокировки.ТекущаяДата); - Результат.Вставить("ПерезапуститьПриЗавершении", Истина); - - СоединенияИБПереопределяемый.ПриОпределенииПараметровБлокировкиСеансов(Результат); - - Возврат Результат; + ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов(); + Возврат ПараметрыБлокировкиСеансовРасширенные(ПолучитьКоличествоСеансов, ПараметрыБлокировки); КонецФункции @@ -139,7 +98,7 @@ // Функция РазрешитьРаботуПользователей() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда Возврат Ложь; @@ -172,6 +131,21 @@ // Возвращает информацию о текущих соединениях с информационной базой. // При необходимости записывает сообщение в журнал регистрации. // +// Параметры: +// ПолучатьСтрокуСоединения - Булево - Признак необходимости добавления в возвращаемое значение строки соединения. +// СообщенияДляЖурналаРегистрации - СписокЗначение - Если параметр не пустой, то будет выполнена запись событий +// из списка в журнал регистрации. +// ПортКластера - Число - Нестандартный порт кластера серверов. +// +// Возвращаемое значение: +// Структура - Структура со свойствами: +// * НаличиеАктивныхСоединений - Булево - Признак наличия активных соединений. +// * НаличиеCOMСоединений - Булево - Признак наличия com соединений. +// * НаличиеСоединенияКонфигуратором - Булево - Признак наличия соединения конфигуратора. +// * ЕстьАктивныеПользователи - Булево - Признак наличия активных пользователей. +// * СтрокаСоединенияИнформационнойБазы - Строка - Строка соединения информационной базы. Свойство будет только если +// параметр ПолучатьСтрокуСоединения был установлен в значение Истина. +// Функция ИнформацияОСоединениях(ПолучатьСтрокуСоединения = Ложь, СообщенияДляЖурналаРегистрации = Неопределено, ПортКластера = 0) Экспорт @@ -189,7 +163,7 @@ Если ПолучатьСтрокуСоединения Тогда Результат.Вставить("СтрокаСоединенияИнформационнойБазы", - СоединенияИБКлиентСервер.ПолучитьСтрокуСоединенияИнформационнойБазы()); + СоединенияИБКлиентСервер.ПолучитьСтрокуСоединенияИнформационнойБазы(ПортКластера)); КонецЕсли; ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); @@ -245,7 +219,7 @@ // Параметры - Структура - см. НовыеПараметрыБлокировкиСоединений. // ПоМестномуВремени - Булево - время начала и окончания блокировки указаны в местном времени сеанса. // Если Ложь, то в универсальном времени. -// ОбластьДанных - Число(7,0) - номер области данных, для которой устанавливается блокировка. +// ОбластьДанных - Число - номер области данных, для которой устанавливается блокировка. // При вызове из сеанса, в котором заданы значения разделителей, может быть передано только значение, // совпадающее со значением разделителя в сеансе (или опущено). // При вызове из сеанса, в котором не заданы значения разделителей, значение параметра не может быть опущено. @@ -264,18 +238,25 @@ ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЗначениеРазделителяСеанса = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); + Иначе + ЗначениеРазделителяСеанса = 0; + КонецЕсли; Если ОбластьДанных = -1 Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - ИначеЕсли ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда - ВызватьИсключение НСтр("ru = 'Из сеанса с используемыми значениями разделителей нельзя установить блокировку сеансов области данных, отличной от используемой в сеансе!'"); + ОбластьДанных = ЗначениеРазделителяСеанса; + ИначеЕсли ОбластьДанных <> ЗначениеРазделителяСеанса Тогда + ВызватьИсключение НСтр("ru = 'Из сеанса с используемыми значениями разделителей нельзя установить блокировку сеансов области данных, отличной от используемой в сеансе.'"); КонецЕсли; Иначе Если ОбластьДанных = -1 Тогда - ВызватьИсключение НСтр("ru = 'Невозможно установить блокировку сеансов области данных - не указана область данных!'"); + ВызватьИсключение НСтр("ru = 'Невозможно установить блокировку сеансов области данных - не указана область данных.'"); КонецЕсли; КонецЕсли; @@ -318,7 +299,7 @@ Функция ПолучитьБлокировкуСеансовОбластиДанных(Знач ПоМестномуВремени = Истина) Экспорт Результат = НовыеПараметрыБлокировкиСоединений(); - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Результат; КонецЕсли; @@ -326,9 +307,12 @@ ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); КонецЕсли; + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + УстановитьПривилегированныйРежим(Истина); НаборБлокировок = РегистрыСведений.БлокировкиСеансовОбластейДанных.СоздатьНаборЗаписей(); - НаборБлокировок.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(ОбщегоНазначения.ЗначениеРазделителяСеанса()); + НаборБлокировок.Отбор.ОбластьДанныхВспомогательныеДанные.Установить( + МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); НаборБлокировок.Прочитать(); Если НаборБлокировок.Количество() = 0 Тогда Возврат Результат; @@ -455,104 +439,9 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Объявление служебных событий, к которым можно добавлять обработчики. +// Обработчики событий подсистем конфигурации. -// Объявляет события подсистемы ЗавершениеРаботыПользователей: -// -// Клиентские события: -// ПриЗавершенииСеанса. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // КЛИЕНТСКИЕ СОБЫТИЯ. - - // Вызывается при завершении сеансов средствами подсистемы ЗавершениеРаботыПользователей. - // - // Параметры: - // ФормаВладелец - УправляемаяФорма, из которой выполняется завершение сеанса, - // МассивСеансов - Массив(Число (8,0,+)) - массив номеров сеанса, который будет завершен, - // СтандартнаяОбработка - Булево, флаг выполнения стандартной обработки завершения сеанса - // (подключение к агенту сервера через COM-соединение или сервер администрирования с - // запросом параметров подключения к кластеру у текущего пользователя). Может быть - // установлен в значение Ложь внутри обработчика события, в этом случае стандартная - // обработка завершения сеанса выполняться не будет, - // ОповещениеПослеЗавершенияСеанса - ОписаниеОповещения - описание оповещения, которое должно - // быть вызвано после завершения сеанса (для автоматического обновления списка активных - // пользователей). При установке значения параметра СтандартнаяОбработка равным Ложь, - // после успешного завершения сеанса, для переданного описания оповещения должна быть - // выполнена обработка с помощью метода ВыполнитьОбработкуОповещения (в качестве значения - // параметра Результат следует передавать КодВозвратаДиалога.ОК при успешном завершении - // сеанса). Параметр может быть опущен - в этом случае выполнять обработку оповещения не - // следует. - // - // Синтаксис: - // Процедура ПриЗавершенииСеансов(ФормаВладелец, Знач МассивСеансов, СтандартнаяОбработка, Знач ОповещениеПослеЗавершенияСеансов = Неопределено) Экспорт - // - КлиентскиеСобытия.Добавить("СтандартныеПодсистемы.ЗавершениеРаботыПользователей\ПриЗавершенииСеансов"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков событий. - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "СоединенияИБКлиент"); - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбработкеПараметровЗапуска"].Добавить( - "СоединенияИБКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "СоединенияИБ"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "СоединенияИБ"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( - "СоединенияИБ"); - КонецЕсли; - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "СоединенияИБ"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "СоединенияИБ"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "СоединенияИБ"); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Формирует список параметров ИБ. -// -// Параметры: -// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров. -// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). -// +// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда @@ -562,22 +451,15 @@ КонецПроцедуры -// Заполнить структуру параметров, необходимых для работы клиентского кода -// данной подсистемы при запуске конфигурации, т.е. в обработчиках событий. -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы. -// -// Параметры: -// Параметры - Структура - структура параметров запуска. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов(); - Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансов(, ПараметрыБлокировки))); + Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансовРасширенные(Ложь, ПараметрыБлокировки))); Если Не ПараметрыБлокировки.УстановленаБлокировкаСоединений - Или Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Или Не ОбщегоНазначения.РазделениеВключено() + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -625,24 +507,14 @@ КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансов())); КонецПроцедуры -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -652,33 +524,14 @@ КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.РегистрыСведений.БлокировкиСеансовОбластейДанных); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -744,6 +597,10 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ @@ -751,7 +608,7 @@ // сведений БлокировкиСеансовОбластейДанных. Процедура ПеренестиБлокировкиСеансовОбластейДанныхВоВспомогательныеДанные() Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -761,7 +618,6 @@ Блокировка = Новый БлокировкаДанных(); БлокировкаРегистра = Блокировка.Добавить("РегистрСведений.БлокировкиСеансовОбластейДанных"); - БлокировкаРегистра.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ТекстЗапроса = @@ -815,7 +671,7 @@ ТекстСообщения = Сообщение + Символы.ПС + Символы.ПС; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ТекстСообщения = ТекстСообщения + НСтр("ru = '%1 |Для разрешения работы пользователей можно открыть приложение с параметром РазрешитьРаботуПользователей. Например: |http://<веб-адрес сервера>/?C=РазрешитьРаботуПользователей'"); @@ -848,6 +704,38 @@ КонецФункции +// См. описание в функции ПараметрыБлокировкиСеансов. +// +Функция ПараметрыБлокировкиСеансовРасширенные(Знач ПолучитьКоличествоСеансов, ПараметрыБлокировки) + + Если ПараметрыБлокировки.УстановленаБлокировкаСоединенийИБНаДату Тогда + ТекущийРежим = ПараметрыБлокировки.ТекущийРежимИБ; + ИначеЕсли ПараметрыБлокировки.УстановленаБлокировкаСоединенийОбластиДанныхНаДату Тогда + ТекущийРежим = ПараметрыБлокировки.ТекущийРежимОбластиДанных; + ИначеЕсли ПараметрыБлокировки.ТекущийРежимИБ.Установлена Тогда + ТекущийРежим = ПараметрыБлокировки.ТекущийРежимИБ; + Иначе + ТекущийРежим = ПараметрыБлокировки.ТекущийРежимОбластиДанных; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Результат = Новый Структура; + Результат.Вставить("Установлена", ТекущийРежим.Установлена); + Результат.Вставить("Начало", ТекущийРежим.Начало); + Результат.Вставить("Конец", ТекущийРежим.Конец); + Результат.Вставить("Сообщение", ТекущийРежим.Сообщение); + Результат.Вставить("ИнтервалОжиданияЗавершенияРаботыПользователей", 15 * 60); + Результат.Вставить("КоличествоСеансов", ?(ПолучитьКоличествоСеансов, КоличествоСеансовИнформационнойБазы(), 0)); + Результат.Вставить("ТекущаяДатаСеанса", ПараметрыБлокировки.ТекущаяДата); + Результат.Вставить("ПерезапуститьПриЗавершении", Истина); + + СоединенияИБПереопределяемый.ПриОпределенииПараметровБлокировкиСеансов(Результат); + + Возврат Результат; + +КонецФункции + Функция СтруктураПараметровБлокировкиСеансов() УстановитьПривилегированныйРежим(Истина); diff --git a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl index beba1f3a8..73291256b 100644 --- a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl @@ -1,12 +1,6 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание процедуры в модуле СоединенияИБ. -// +// См. СоединенияИБ.ИнформацияОСоединениях. Функция ИнформацияОСоединениях(ПолучатьСтрокуСоединения = Ложь, СообщенияДляЖурналаРегистрации = Неопределено, ПортКластера = 0) Экспорт Возврат СоединенияИБ.ИнформацияОСоединениях(ПолучатьСтрокуСоединения, СообщенияДляЖурналаРегистрации, ПортКластера); diff --git a/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl index 5ddadb2ea..2bfcb17d3 100644 --- a/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Выполнить завершение текущего сеанса, если установлена блокировка соединений @@ -42,7 +37,7 @@ |%3'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ДатаВремениНачалаБлокировки, ВремяВремениНачалаБлокировки, ТекстСообщения); - РазделениеВключено = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено; + РазделениеВключено = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено; Если Не РазделениеВключено И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратить) Тогда @@ -104,6 +99,11 @@ Возврат; КонецЕсли; + // Если информационная база файловая, то часть соединений не может быть завершена принудительно. + Если СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая") Тогда + Возврат; + КонецЕсли; + // После начала блокировки сеансы всех пользователей должны быть отключены // если этого не произошло пробуем принудительно прервать соединения. ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl index 4046af3c7..235f6eb75 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Открывает форму ввода параметров администрирования информационной базы и/или кластера. @@ -37,107 +32,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Выполняет действия перед началом работы системы. -Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - - Если Не ПараметрыКлиента.Свойство("СеансыОбластиДанныхЗаблокированы") Тогда - Возврат; - КонецЕсли; - - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ИнтерактивнаяОбработкаПередНачаломРаботыСистемы", ЭтотОбъект); - -КонецПроцедуры - -// Выполняет действия при начале работы системы. -Процедура ПослеНачалаРаботыСистемы() Экспорт - - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат; - КонецЕсли; - - Если ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда - Возврат; - КонецЕсли; - - РежимБлокировки = ПараметрыРаботы.ПараметрыБлокировкиСеансов; - ТекущееВремя = РежимБлокировки.ТекущаяДатаСеанса; - Если РежимБлокировки.Установлена - И (НЕ ЗначениеЗаполнено(РежимБлокировки.Начало) ИЛИ ТекущееВремя >= РежимБлокировки.Начало) - И (НЕ ЗначениеЗаполнено(РежимБлокировки.Конец) ИЛИ ТекущееВремя <= РежимБлокировки.Конец) Тогда - // Если пользователь зашел в базу, в которой установлена режим блокировки, значит использовался ключ /UC. - // Завершать работу такого пользователя не следует. - Возврат; - КонецЕсли; - - Если СтрНайти(ВРег(ПараметрЗапуска), ВРег("ЗавершитьРаботуПользователей")) > 0 Тогда - Возврат; - КонецЕсли; - - ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); - -КонецПроцедуры - -// Обработать параметры запуска, связанные с завершение и разрешение соединений ИБ. -// -// Параметры: -// ЗначениеПараметраЗапуска - Строка - главный параметр запуска. -// ПараметрыЗапуска - Массив - дополнительные параметры запуска, разделенные -// символом ";". -// -// Возвращаемое значение: -// Булево - Истина, если требуется прекратить выполнение запуска системы. -// -Функция ОбработатьПараметрыЗапуска(Знач ЗначениеПараметраЗапуска, Знач ПараметрыЗапуска) - - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат Ложь; - КонецЕсли; - - // Обработка параметров запуска программы - - // ЗапретитьРаботуПользователей и РазрешитьРаботуПользователей. - Если ЗначениеПараметраЗапуска = ВРег("РазрешитьРаботуПользователей") Тогда - - Если НЕ СоединенияИБВызовСервера.РазрешитьРаботуПользователей() Тогда - ТекстСообщения = НСтр("ru = 'Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); - ПоказатьПредупреждение(,ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиентСервер.СобытиеЖурналаРегистрации(),, - НСтр("ru = 'Выполнен запуск с параметром ""РазрешитьРаботуПользователей"". Работа программы будет завершена.'"), ,Истина); - ЗавершитьРаботуСистемы(Ложь); - Возврат Истина; - - // Параметр может содержать две дополнительные части, разделенные символом ";" - - // имя и пароль администратора ИБ, от имени которого происходит подключение к кластеру серверов - // в клиент-серверном варианте развертывания системы. Их необходимо передавать в случае, - // если текущий пользователь не является администратором ИБ. - // См. использование в процедуре ЗавершитьРаботуПользователей(). - ИначеЕсли ЗначениеПараметраЗапуска = ВРег("ЗавершитьРаботуПользователей") Тогда - - Если НЕ СоединенияИБВызовСервера.УстановитьБлокировкуСоединений() Тогда - ТекстСообщения = НСтр("ru = 'Параметр запуска ЗавершитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); - ПоказатьПредупреждение(,ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - // Если выполнен запуск с ключом, то нужно зачитать параметры администрирования кластера. - ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапуска); - - ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); - ЗавершитьРаботуПользователей(); - Возврат Ложь; // Продолжить запуск программы. - - КонецЕсли; - Возврат Ложь; - -КонецФункции - // Подключить обработчик ожидания КонтрольРежимаЗавершенияРаботыПользователей или. // ЗавершитьРаботуПользователей в зависимости от параметра УстановитьБлокировкуСоединений. // @@ -217,7 +111,65 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. +// Обработчики событий подсистем конфигурации. + +// Вызывается при интерактивном начале работы пользователя с областью данных. +// +// Параметры: +// ПараметрыЗапуска - Массив - массив строк разделенных символом ";" в параметре запуска, +// переданным в конфигурацию с помощью ключа командной строки /C. +// Отказ - Булево (возвращаемое значение), если установить Истина, +// обработка события ПриНачалеРаботыСистемы будет прервана. +// +Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт + + Отказ = Отказ Или ОбработатьПараметрыЗапуска(ПараметрыЗапуска); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + + Если Не ПараметрыКлиента.Свойство("СеансыОбластиДанныхЗаблокированы") Тогда + Возврат; + КонецЕсли; + + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПередНачаломРаботыСистемы", ЭтотОбъект); + +КонецПроцедуры + +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда + Возврат; + КонецЕсли; + + Если ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда + Возврат; + КонецЕсли; + + РежимБлокировки = ПараметрыРаботы.ПараметрыБлокировкиСеансов; + ТекущееВремя = РежимБлокировки.ТекущаяДатаСеанса; + Если РежимБлокировки.Установлена + И (НЕ ЗначениеЗаполнено(РежимБлокировки.Начало) ИЛИ ТекущееВремя >= РежимБлокировки.Начало) + И (НЕ ЗначениеЗаполнено(РежимБлокировки.Конец) ИЛИ ТекущееВремя <= РежимБлокировки.Конец) Тогда + // Если пользователь зашел в базу, в которой установлена режим блокировки, значит использовался ключ /UC. + // Завершать работу такого пользователя не следует. + Возврат; + КонецЕсли; + + Если СтрНайти(ВРег(ПараметрЗапуска), ВРег("ЗавершитьРаботуПользователей")) > 0 Тогда + Возврат; + КонецЕсли; + + ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); + +КонецПроцедуры // Вызывается при неудачной попытке установить монопольный режим в файловой базе. // @@ -230,7 +182,7 @@ , , , , Оповещение); КонецПроцедуры - + // Открывает форму блокировки работы пользователей. // Процедура ПриОткрытииФормыБлокировкиРаботыПользователей(Оповещение = Неопределено, ПараметрыФормы = Неопределено) Экспорт @@ -255,25 +207,6 @@ #Область СлужебныеПроцедурыИФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Вызывается при интерактивном начале работы пользователя с областью данных. -// -// Параметры: -// ПервыйПараметр - Строка - первое значение параметра запуска, -// до первого символа ";" в верхнем регистре. -// ПараметрыЗапуска - Массив - массив строк разделенных символом ";" в параметре запуска, -// переданным в конфигурацию с помощью ключа командной строки /C. -// Отказ - Булево (возвращаемое значение), если установить Истина, -// обработка события ПриНачалеРаботыСистемы будет прервана. -// -Процедура ПриОбработкеПараметровЗапуска(ПервыйПараметр, ПараметрыЗапуска, Отказ) Экспорт - - Отказ = Отказ Или ОбработатьПараметрыЗапуска(ПервыйПараметр, ПараметрыЗапуска); - -КонецПроцедуры - /////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистемы БазоваяФункциональность. @@ -343,9 +276,9 @@ // Обработчики оповещений. // Предлагает снять блокировку и войти или прекратить работу системы. -Процедура ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры, Контекст) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); ТекстВопроса = ПараметрыКлиента.ПредложениеВойти; ТекстСообщения = ПараметрыКлиента.СеансыОбластиДанныхЗаблокированы; @@ -417,4 +350,61 @@ КонецПроцедуры +// Обработать параметры запуска, связанные с завершением и разрешением соединений ИБ. +// +// Параметры: +// ЗначениеПараметраЗапуска - Строка - главный параметр запуска. +// ПараметрыЗапуска - Массив - дополнительные параметры запуска, разделенные +// символом ";". +// +// Возвращаемое значение: +// Булево - Истина, если требуется прекратить выполнение запуска системы. +// +Функция ОбработатьПараметрыЗапуска(Знач ПараметрыЗапуска) + + ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда + Возврат Ложь; + КонецЕсли; + + // Обработка параметров запуска программы - + // ЗапретитьРаботуПользователей и РазрешитьРаботуПользователей. + Если ПараметрыЗапуска.Найти("РазрешитьРаботуПользователей") <> Неопределено Тогда + + Если НЕ СоединенияИБВызовСервера.РазрешитьРаботуПользователей() Тогда + ТекстСообщения = НСтр("ru = 'Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); + ПоказатьПредупреждение(,ТекстСообщения); + Возврат Ложь; + КонецЕсли; + + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиентСервер.СобытиеЖурналаРегистрации(),, + НСтр("ru = 'Выполнен запуск с параметром ""РазрешитьРаботуПользователей"". Работа программы будет завершена.'"), ,Истина); + ЗавершитьРаботуСистемы(Ложь); + Возврат Истина; + + // Параметр может содержать две дополнительные части, разделенные символом ";" - + // имя и пароль администратора ИБ, от имени которого происходит подключение к кластеру серверов + // в клиент-серверном варианте развертывания системы. Их необходимо передавать в случае, + // если текущий пользователь не является администратором ИБ. + // См. использование в процедуре ЗавершитьРаботуПользователей(). + ИначеЕсли ПараметрыЗапуска.Найти("ЗавершитьРаботуПользователей") <> Неопределено Тогда + + Если НЕ СоединенияИБВызовСервера.УстановитьБлокировкуСоединений() Тогда + ТекстСообщения = НСтр("ru = 'Параметр запуска ЗавершитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); + ПоказатьПредупреждение(,ТекстСообщения); + Возврат Ложь; + КонецЕсли; + + // Если выполнен запуск с ключом, то нужно зачитать параметры администрирования кластера. + ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапуска); + + ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); + ЗавершитьРаботуПользователей(); + Возврат Ложь; // Продолжить запуск программы. + + КонецЕсли; + Возврат Ложь; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl index 06fb8c3b6..f2773e155 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает полный путь к информационной базе (строку соединения). @@ -173,7 +168,7 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Результат = ОбщегоНазначения.ИнформационнаяБазаФайловая(); #Иначе - Результат = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + Результат = ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая(); #КонецЕсли Возврат Результат; КонецФункции diff --git a/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl b/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl index 2da52d10f..4fc3b08c4 100644 --- a/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Завершение работы пользователей". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Позволяет модифицировать параметры блокировки сеансов. diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl index c2aa392fe..d45c00c84 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl @@ -1,4 +1,3 @@ - #Область ПрограммныйИнтерфейс // Возвращает новое сообщение. @@ -63,9 +62,11 @@ // Получает список обработчиков сообщений по пространству имен. // // Параметры: -// Обработчики - ТаблицаЗначений - состав полей см. в ОбменСообщениями.НоваяТаблицаОбработчиковСообщений. +// Обработчики - ТаблицаЗначений - с колонками: +// * Канал - Строка - Канал сообщения. +// * Обработчик - ОбщийМодуль - Обработчик сообщения. // ПространствоИмен - Строка - uri пространства имен в котором определены типы тел сообщений. -// ОбщийМодуль - общий модуль в котором содержаться обработчики сообщений. +// ОбщийМодуль - ОбщийМодуль - Общий модуль в котором содержатся обработчики сообщений. // Процедура ПолучитьОбработчикиКаналовСообщений(Знач Обработчики, Знач ПространствоИмен, Знач ОбщийМодуль) Экспорт @@ -143,7 +144,7 @@ // Записывает сообщение в нетипизированное тело сообщения. // // Параметры: -// Сообщение - {http://www.1c.ru/SaaS/Messages}Message - сообщение. +// Сообщение - Сообщение - Сообщение с типом {http://www.1c.ru/SaaS/Messages}Message. // // Возвращаемое значение: // Строка - нетипизированное тело сообщения. @@ -161,7 +162,7 @@ // Записывает в журнал регистрации событие начала обработки сообщения. // // Параметры: -// Сообщение - {http://www.1c.ru/SaaS/Messages}Message - сообщение. +// Сообщение - Сообщение - Сообщение с типом {http://www.1c.ru/SaaS/Messages}Message. // Процедура ЗаписатьСобытиеНачалоОбработки(Знач Сообщение) Экспорт @@ -177,7 +178,7 @@ // Записывает в журнал регистрации событие окончания обработки сообщения. // // Параметры: -// Сообщение - {http://www.1c.ru/SaaS/Messages}Message - сообщение. +// Сообщение - Сообщение - Сообщение с типом {http://www.1c.ru/SaaS/Messages}Message. // Процедура ЗаписатьСобытиеОкончаниеОбработки(Знач Сообщение) Экспорт @@ -188,7 +189,7 @@ , ПредставлениеСообщенияДляЖурнала(Сообщение)); - КонецПроцедуры +КонецПроцедуры // Выполняет доставку быстрых сообщений. // @@ -231,12 +232,113 @@ // Дополнительная обработка исключения не требуется // ожидаемое исключение - дублирование задания с таким же ключом. ЗаписьЖурналаРегистрации(НСтр("ru = 'Доставка быстрых сообщений'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение, , , + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры +// Возвращает XDTO тип - сообщение. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - тип сообщения. +// +Функция ТипСообщение() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипСообщение(); + +КонецФункции + +// Возвращает тип, являющийся базовым для всех типов тел сообщений +// в модели сервиса. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тел сообщений в модели сервиса. +// +Функция ТипТело() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); + +КонецФункции + +// Возвращает тип, являющийся базовым для всех типов тел сообщений, +// относящихся к областям данных в модели сервиса. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тел сообщений областей данных в модели сервиса. +// +Функция ТипТелоОбласти() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти(); + +КонецФункции + +// Возвращает тип, являющийся базовым для всех типов тел сообщений, +// отправляемых из областей данных с аутентификацией области в модели сервиса. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тел сообщений областей данных с аутентификацией +// в модели сервиса. +// +Функция ТипАутентифицированноеТелоОбласти() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипАутентифицированноеТелоОбласти(); + +КонецФункции + +// Возвращает тип - заголовок сообщения. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - тип заголовок сообщения в модели сервиса. +// +Функция ТипЗаголовокСообщения() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипЗаголовокСообщения(); + +КонецФункции + +// Возвращает тип - узел обмена сообщениями в модели сервиса. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - тип узел обмена сообщениями в модели сервиса. +// +Функция ТипУзелОбменаСообщениями() Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ТипУзелОбменаСообщениями(); + +КонецФункции + +// Возвращает типы объектов XDTO содержащихся в заданном +// пакете, являющиеся типа сообщений удаленного администрирования. +// +// Параметры: +// URIПакета - Строка - URI пакета XDTO, типы сообщений из которого +// требуется получить. +// +// Возвращаемое значение: +// ФиксированныйМассив(ТипОбъектаXDTO) - типы сообщений найденные в пакете. +// +Функция ПолучитьТипыСообщенийПакета(Знач URIПакета) Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ПолучитьТипыСообщенийПакета(URIПакета); + +КонецФункции + +// Возвращает имена каналов сообщений из заданного пакета. +// +// Параметры: +// URIПакета - Строка - URI пакета XDTO, типы сообщений из которого +// требуется получить. +// +// Возвращаемое значение: +// ФиксированныйМассив(Строка) - имена каналов найденные в пакете. +// +Функция ПолучитьКаналыПакета(Знач URIПакета) Экспорт + + Возврат СообщенияВМоделиСервисаПовтИсп.ПолучитьКаналыПакета(URIПакета); + +КонецФункции + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -251,14 +353,14 @@ // Процедура ПередОтправкойСообщения(Знач КаналСообщений, Знач ТелоСообщения) Экспорт - Если НЕ ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если Не РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда Возврат; КонецЕсли; Сообщение = Неопределено; Если ТелоСодержитТипизированноеСообщение(ТелоСообщения, Сообщение) Тогда Если СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - Если ОбщегоНазначения.ЗначениеРазделителяСеанса() <> Сообщение.Body.Zone Тогда + Если РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() <> Сообщение.Body.Zone Тогда ЗаписьЖурналаРегистрации(НСтр("ru = 'Сообщения в модели сервиса.Отправка сообщения'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, @@ -267,7 +369,8 @@ ПредставлениеСообщенияДляЖурнала(Сообщение)); ШаблонОшибки = НСтр("ru = 'Ошибка при отправке сообщения. Область данных %1 не совпадает с текущей (%2).'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, Сообщение.Body.Zone, ОбщегоНазначения.ЗначениеРазделителяСеанса()); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, + Сообщение.Body.Zone, РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ВызватьИсключение(ТекстОшибки); КонецЕсли; @@ -306,7 +409,7 @@ КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); @@ -344,7 +447,7 @@ КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); @@ -433,7 +536,7 @@ ИнтерфейсСообщения = ТрансляцияXDTOСлужебный.ПолучитьИнтерфейсСообщения(Сообщение); Если ИнтерфейсСообщения = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Не удалось определить интерфейс отправляемого сообщения: ни для одного из типов, используемых в сообщении, не зарегистрирован обработчик интерфейса!'"); + ВызватьИсключение НСтр("ru = 'Не удалось определить интерфейс отправляемого сообщения: ни для одного из типов, используемых в сообщении, не зарегистрирован обработчик интерфейса.'"); КонецЕсли; Если Не ИнформацияПодключения.Свойство("URL") @@ -446,7 +549,7 @@ Если ВерсияКорреспондента = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Корреспондент %1 не поддерживает получение версий сообщений интерфейса %2, поддерживаемых текущей информационной базой!'"), + НСтр("ru = 'Корреспондент %1 не поддерживает получение версий сообщений интерфейса %2, поддерживаемых текущей информационной базой.'"), ПредставлениеПолучателя, ИнтерфейсСообщения.ПрограммныйИнтерфейс); КонецЕсли; diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl index ac09d97ff..be0fd27c4 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Обработчик каналов сообщений для сообщений модели сервиса. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Выполняет обработку тела сообщения из канала в соответствии с алгоритмом текущего канала сообщений. @@ -16,7 +11,7 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда РазделенныйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); КонецЕсли; @@ -28,7 +23,7 @@ Попытка - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда РазделенныйМодуль.ПриНачалеОбработкиСообщения(Сообщение, Отправитель); КонецЕсли; @@ -48,7 +43,7 @@ КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда РазделенныйМодуль.ПослеОбработкиСообщения(Сообщение, Отправитель, СообщениеОбработано); КонецЕсли; @@ -56,7 +51,7 @@ Исключение - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда РазделенныйМодуль.ПриОшибкеОбработкиСообщения(Сообщение, Отправитель); КонецЕсли; diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервисаПереопределяемый/Module.bsl index 44432173e..6728978ca 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервисаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервисаПереопределяемый/Module.bsl @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Обработчик каналов сообщений для сообщений модели сервиса, переопределяемые -// процедуры и функции. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик события при получении сообщения. @@ -13,7 +7,8 @@ // Параметры: // КаналСообщений - Строка - идентификатор канала сообщений, из которого получено сообщение. // ТелоСообщения - Произвольный - Тело полученного сообщения. В обработчике события тело сообщения может -// быть изменено, например, дополнено информацией. +// быть изменено, например, дополнено информацией. +// ОбъектСообщения - Произвольные - Объект получаемого сообщения. // Процедура ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт @@ -27,6 +22,7 @@ // КаналСообщений - Строка - идентификатор канала сообщений, в который отправляется сообщение. // ТелоСообщения - Произвольный - тело отправляемого сообщения. В обработчике события тело сообщения // может быть изменено, например, дополнено информацией. +// ОбъектСообщения - Произвольные - Объект отправляемого сообщения. // Процедура ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт @@ -49,7 +45,7 @@ // Сообщение - ОбъектXDTO - входящее сообщение, // Отправитель - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, соответствующей // информационной базе, отправившей сообщение, -// СообщениеОбработано - булево, флаг того, что сообщение было успешно обработано. Если значение +// СообщениеОбработано - Булево - Флаг того, что сообщение было успешно обработано. Если значение // установлено равным Ложь - после выполнения этой процедуры будет вызвано исключение. В данной // процедуре значение данного параметра может быть изменено. // diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервисаПовтИсп/Module.bsl index ca48c9f44..c1941fe92 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервисаПовтИсп/Module.bsl @@ -1,5 +1,4 @@ - -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Возвращает XDTO тип - сообщение. // @@ -8,7 +7,7 @@ // Функция ТипСообщение() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "Message"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "Message"); КонецФункции @@ -20,7 +19,7 @@ // Функция ТипТело() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "Body"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "Body"); КонецФункции @@ -32,7 +31,7 @@ // Функция ТипТелоОбласти() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "ZoneBody"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "ZoneBody"); КонецФункции @@ -45,7 +44,7 @@ // Функция ТипАутентифицированноеТелоОбласти() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "AuthenticatedZoneBody"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "AuthenticatedZoneBody"); КонецФункции @@ -56,7 +55,7 @@ // Функция ТипЗаголовокСообщения() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "Header"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "Header"); КонецФункции @@ -67,7 +66,7 @@ // Функция ТипУзелОбменаСообщениями() Экспорт - Возврат ФабрикаXDTO.Тип(СообщенияВМоделиСервисаПовтИсп.ПакетСообщения(), "Node"); + Возврат ФабрикаXDTO.Тип(ПакетСообщения(), "Node"); КонецФункции @@ -113,12 +112,16 @@ КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Возвращает uri пакета сообщений с базовыми типами. // // Возвращаемое значение: -// Строка. +// Строка - пакет сообщений. // -Функция ПакетСообщения() Экспорт +Функция ПакетСообщения() Возврат "http://www.1c.ru/SaaS/Messages"; diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервисаРазделениеДанных/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервисаРазделениеДанных/Module.bsl index 5ed1894ba..65e46a29e 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервисаРазделениеДанных/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервисаРазделениеДанных/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОбменСообщениями: поддержка работы с сообщениями областей данных. -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Вызывается при заполнении массива справочников, которые могут использоваться для @@ -36,7 +31,7 @@ Иначе - Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Если РаботаВМоделиСервиса.ИспользованиеРазделителяСеанса() Тогда Возврат Справочники.СообщенияОбластейДанных; КонецЕсли; @@ -64,7 +59,7 @@ КонецЕсли; СтандартнаяОбработка = Ложь; - ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ОбъектСообщения); + РаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектСообщения); КонецПроцедуры @@ -82,26 +77,26 @@ Сообщение = Неопределено; Если СообщенияВМоделиСервиса.ТелоСодержитТипизированноеСообщение(ТелоСообщения, Сообщение) Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() И СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - Если ОбщегоНазначения.ЗначениеРазделителяСеанса() <> Сообщение.Body.Zone Тогда + Если РаботаВМоделиСервиса.ЗначениеРазделителяСеанса() <> Сообщение.Body.Zone Тогда ШаблонСообщения = НСтр("ru = 'Попытка отправить сообщение от имени области %1 из области %2'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Сообщение.Body.Zone, - ОбщегоНазначения.ЗначениеРазделителяСеанса()); + РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ВызватьИсключение(ТекстСообщения); КонецЕсли; КонецЕсли; Если СообщенияВМоделиСервисаПовтИсп.ТипАутентифицированноеТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если РаботаВМоделиСервисаПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Сообщение.Body.ZoneKey = Константы.КлючОбластиДанных.Получить(); Иначе УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, Сообщение.Body.Zone); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, Сообщение.Body.Zone); Сообщение.Body.ZoneKey = Константы.КлючОбластиДанных.Получить(); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; КонецЕсли; @@ -141,7 +136,7 @@ Сообщение = Неопределено; Если СообщенияВМоделиСервиса.ТелоСодержитТипизированноеСообщение(ТелоСообщения, Сообщение) Тогда - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда ПереопределенныйСправочник = ПриВыбореСправочникаДляСообщения(ТелоСообщения); @@ -189,7 +184,7 @@ Если СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, Сообщение.Body.Zone); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, Сообщение.Body.Zone); ОбработатьКлючОбластиВСообщении(Сообщение); КонецЕсли; @@ -210,7 +205,7 @@ Если СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; @@ -227,7 +222,7 @@ Если СообщенияВМоделиСервисаПовтИсп.ТипТелоОбласти().ЭтоПотомок(Сообщение.Body.Тип()) Тогда - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); КонецЕсли; @@ -248,10 +243,11 @@ Если Не СообщениеСодержитКлючОбласти Тогда МассивОбработчиков = Новый Массив(); - СообщенияУдаленногоАдминистрированияИнтерфейс.ОбработчикиКаналовСообщений(МассивОбработчиков); + ВызываемыйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияУдаленногоАдминистрированияИнтерфейс"); + ВызываемыйМодуль.ОбработчикиКаналовСообщений(МассивОбработчиков); Для Каждого Обработчик Из МассивОбработчиков Цикл - ТипСообщенияОбработчика = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьПараметрыОбластиДанных( + ТипСообщенияОбработчика = ВызываемыйМодуль.СообщениеУстановитьПараметрыОбластиДанных( Обработчик.Пакет()); Если Сообщение.Body.Тип() = ТипСообщенияОбработчика Тогда @@ -277,7 +273,7 @@ Если ТекущийКлючОбласти <> Сообщение.Body.ZoneKey Тогда - ВызватьИсключение НСтр("ru = 'Неверный ключ области данных в сообщении!'"); + ВызватьИсключение НСтр("ru = 'Неверный ключ области данных в сообщении'"); КонецЕсли; diff --git a/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияИнтерфейс/Module.bsl index b97fe24a7..d5367f0d7 100644 --- a/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияИнтерфейс/Module.bsl @@ -1,11 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА СООБЩЕНИЙ КОНТРОЛЯ РЕЗЕРВНОГО КОПИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - пространство имен. +// Функция Пакет() Экспорт Возврат "http://www.1c.ru/SaaS/ControlZonesBackup/" + Версия(); @@ -13,6 +12,10 @@ КонецФункции // Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - версия интерфейса. +// Функция Версия() Экспорт Возврат "1.0.3.1"; @@ -20,6 +23,10 @@ КонецФункции // Возвращает название программного интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - название интерфейса. +// Функция ПрограммныйИнтерфейс() Экспорт Возврат "ControlZonesBackup"; @@ -29,7 +36,7 @@ // Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - массив обработчиков. // Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт @@ -38,7 +45,7 @@ // Выполняет регистрацию обработчиков трансляции сообщений. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - массив обработчиков. // Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт @@ -49,11 +56,10 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ControlZonesBackup/a.b.c.d}ZoneBackupSuccessfull. // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция СообщениеРезервнаяКопияОбластиСоздана(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -64,11 +70,10 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ControlZonesBackup/a.b.c.d}ZoneBackupFailed. // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция СообщениеОшибкаАрхивацииОбласти(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -79,11 +84,10 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ControlZonesBackup/a.b.c.d}ZoneBackupSkipped. // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - тип сообщения. // Функция СообщениеАрхивацияОбластиПропущена(Знач ИспользуемыйПакет = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияОбработчикТрансляции_1_0_2_1/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияОбработчикТрансляции_1_0_2_1/Module.bsl index 2b171194b..b234eb6a8 100644 --- a/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияОбработчикТрансляции_1_0_2_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияКонтрольРезервногоКопированияОбработчикТрансляции_1_0_2_1/Module.bsl @@ -1,12 +1,10 @@ -/////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ТРАНСЛЯЦИИ СООБЩЕНИЙ КОНТРОЛЯ РЕЗЕРВНОГО КОПИРОВАНИЯ ОБЛАСТЕЙ ДАННЫХ -// ИЗ ВЕРСИИ 1.0.3.1 В ВЕРСИЮ 1.0.2.1 -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает номер версии, для трансляции с которой предназначен обработчик. +// +// Возвращаемое значение: +// Строка - исходная версия. +// Функция ИсходнаяВерсия() Экспорт Возврат "1.0.3.1"; @@ -14,6 +12,10 @@ КонецФункции // Возвращает пространство имен версии, для трансляции с которой предназначен обработчик. +// +// Возвращаемое значение: +// Строка - пакет исходной версии. +// Функция ПакетИсходнойВерсии() Экспорт Возврат "http://www.1c.ru/SaaS/ControlZonesBackup/1.0.3.1"; @@ -21,6 +23,10 @@ КонецФункции // Возвращает номер версии, для трансляции в которую предназначен обработчик. +// +// Возвращаемое значение: +// Строка - результирующая версия. +// Функция РезультирующаяВерсия() Экспорт Возврат "1.0.2.1"; @@ -28,6 +34,10 @@ КонецФункции // Возвращает пространство имен версии, для трансляции в которую предназначен обработчик. +// +// Возвращаемое значение: +// Строка - пакет результирующей версии. +// Функция ПакетРезультирующейВерсии() Экспорт Возврат "http://www.1c.ru/SaaS/ControlZonesBackup/1.0.2.1"; @@ -37,8 +47,8 @@ // Обработчик проверки выполнения стандартной обработки трансляции. // // Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение, -// СтандартнаяОбработка - Булево, для отмены выполнения стандартной обработки трансляции +// ИсходноеСообщение - ОбъектXDTO - транслируемое сообщение, +// СтандартнаяОбработка - Булево - для отмены выполнения стандартной обработки трансляции // этому параметру внутри данной процедуры необходимо установить значение Ложь. // При этом вместо выполнения стандартной обработки трансляции будет вызвана функция. // ТрансляцияСообщения() обработчика трансляции. @@ -60,10 +70,10 @@ // было установлено значение Ложь. // // Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение. +// ИсходноеСообщение - ОбъектXDTO - транслируемое сообщение. // // Возвращаемое значение: -// ОбъектXDTO, результат произвольной трансляции сообщения. +// ОбъектXDTO - результат произвольной трансляции сообщения. // Функция ТрансляцияСообщения(Знач ИсходноеСообщение) Экспорт @@ -79,8 +89,9 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции Функция Интерфейс() diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/Module.bsl deleted file mode 100644 index 7e068e3de..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/Module.bsl +++ /dev/null @@ -1,154 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА СООБЩЕНИЙ КОНТРОЛЯ УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/Control/" + Версия(); - -КонецФункции - -// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. -Функция Версия() Экспорт - - Возврат "1.0.2.5"; - -КонецФункции - -// Возвращает название программного интерфейса сообщений. -Функция ПрограммныйИнтерфейс() Экспорт - - Возврат "RemoteAdministrationControl"; - -КонецФункции - -// Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт - -КонецПроцедуры - -// Выполняет регистрацию обработчиков трансляции сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3); - МассивОбработчиков.Добавить(СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4); - -КонецПроцедуры - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationPrepared. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОбластьДанныхПодготовлена(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationPrepared"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationDeleted. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОбластьДанныхУдалена(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationDeleted"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationPrepareFailed. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОшибкаПодготовкиОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationPrepareFailed"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationPrepareFailedConversionRequired -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОшибкаПодготовкиОбластиДанныхТребуетсяКонвертация(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationPrepareFailedConversionRequired"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationDeleteFailed. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОшибкаУдаленияОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationDeleteFailed"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/SaaS/RemoteAdministration/Control/a.b.c.d}ApplicationReady. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОбластьДанныхГотоваКИспользованию(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationReady"); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция СоздатьТипСообщения(Знач ИспользуемыйПакет, Знач Тип) - - Если ИспользуемыйПакет = Неопределено Тогда - ИспользуемыйПакет = Пакет(); - КонецЕсли; - - Возврат ФабрикаXDTO.Тип(ИспользуемыйПакет, Тип); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.mdo b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.mdo deleted file mode 100644 index dd9b5db6c..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс/СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс - - ru - Сообщения контроль удаленного администрирования интерфейс - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/Module.bsl deleted file mode 100644 index 68c2c79cb..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/Module.bsl +++ /dev/null @@ -1,64 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ТРАНСЛЯЦИИ СООБЩЕНИЙ КОНТРОЛЯ УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// ИЗ ВЕРСИИ 1.0.2.4 В ВЕРСИЮ 1.0.2.3 -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает номер версии, для трансляции с которой предназначен обработчик. -Функция ИсходнаяВерсия() Экспорт - - Возврат "1.0.2.4"; - -КонецФункции - -// Возвращает пространство имен версии, для трансляции с которой предназначен обработчик. -Функция ПакетИсходнойВерсии() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/Control/1.0.2.4"; - -КонецФункции - -// Возвращает номер версии, для трансляции в которую предназначен обработчик. -Функция РезультирующаяВерсия() Экспорт - - Возврат "1.0.2.3"; - -КонецФункции - -// Возвращает пространство имен версии, для трансляции в которую предназначен обработчик. -Функция ПакетРезультирующейВерсии() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/Control/1.0.2.3"; - -КонецФункции - -// Обработчик проверки выполнения стандартной обработки трансляции. -// -// Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение, -// СтандартнаяОбработка - Булево, для отмены выполнения стандартной обработки трансляции -// этому параметру внутри данной процедуры необходимо установить значение Ложь. -// При этом вместо выполнения стандартной обработки трансляции будет вызвана функция. -// ТрансляцияСообщения() обработчика трансляции. -// -Процедура ПередТрансляцией(Знач ИсходноеСообщение, СтандартнаяОбработка) Экспорт - -КонецПроцедуры - -// Обработчик выполнения произвольной трансляции сообщения. Вызывается только в том случае, -// если при выполнении процедуры ПередТрансляцией значению параметра СтандартнаяОбработка -// было установлено значение Ложь. -// -// Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение. -// -// Возвращаемое значение: -// ОбъектXDTO, результат произвольной трансляции сообщения. -// -Функция ТрансляцияСообщения(Знач ИсходноеСообщение) Экспорт - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3.mdo b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3.mdo deleted file mode 100644 index 9f622bd91..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3 - - ru - Сообщения контроль удаленного администрирования обработчик трансляции 1.0.2.3 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/Module.bsl deleted file mode 100644 index 3fd218102..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/Module.bsl +++ /dev/null @@ -1,64 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ТРАНСЛЯЦИИ СООБЩЕНИЙ КОНТРОЛЯ УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// ИЗ ВЕРСИИ 1.0.2.5 В ВЕРСИЮ 1.0.2.4 -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает номер версии, для трансляции с которой предназначен обработчик. -Функция ИсходнаяВерсия() Экспорт - - Возврат "1.0.2.5"; - -КонецФункции - -// Возвращает пространство имен версии, для трансляции с которой предназначен обработчик. -Функция ПакетИсходнойВерсии() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/Control/" + ИсходнаяВерсия(); - -КонецФункции - -// Возвращает номер версии, для трансляции в которую предназначен обработчик. -Функция РезультирующаяВерсия() Экспорт - - Возврат "1.0.2.4"; - -КонецФункции - -// Возвращает пространство имен версии, для трансляции в которую предназначен обработчик. -Функция ПакетРезультирующейВерсии() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/Control/" + РезультирующаяВерсия(); - -КонецФункции - -// Обработчик проверки выполнения стандартной обработки трансляции. -// -// Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение, -// СтандартнаяОбработка - Булево, для отмены выполнения стандартной обработки трансляции -// этому параметру внутри данной процедуры необходимо установить значение Ложь. -// При этом вместо выполнения стандартной обработки трансляции будет вызвана функция. -// ТрансляцияСообщения() обработчика трансляции. -// -Процедура ПередТрансляцией(Знач ИсходноеСообщение, СтандартнаяОбработка) Экспорт - -КонецПроцедуры - -// Обработчик выполнения произвольной трансляции сообщения. Вызывается только в том случае, -// если при выполнении процедуры ПередТрансляцией значению параметра СтандартнаяОбработка -// было установлено значение Ложь. -// -// Параметры: -// ИсходноеСообщение - ОбъектXDTO, транслируемое сообщение. -// -// Возвращаемое значение: -// ОбъектXDTO, результат произвольной трансляции сообщения. -// -Функция ТрансляцияСообщения(Знач ИсходноеСообщение) Экспорт - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4.mdo b/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4.mdo deleted file mode 100644 index 152d0fae2..000000000 --- a/SSL/src/CommonModules/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4/СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4 - - ru - Сообщения контроль удаленного администрирования обработчик трансляции 1.0.2.4 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl b/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl index 282a6e09b..d27c76e72 100644 --- a/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl +++ b/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl @@ -1,14 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подписка на уведомления о поступлении новых поставляемых данных. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Запланировать загрузку данных, соответствующих дескриптору. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. +// Дескриптор - ОбъектXDTO - Descriptor. // Процедура ЗапланироватьЗагрузкуДанных(Знач Дескриптор) Экспорт Перем ДескрипторXML, ПараметрыМетода; @@ -355,13 +350,7 @@ Обработчики.Колонки.Добавить("Обработчик"); Обработчики.Колонки.Добавить("КодОбработчика"); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных(Обработчики); Возврат Обработчики.Скопировать(Новый Структура("ВидДанных", ВидДанных), "Обработчик, КодОбработчика"); diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/Module.bsl deleted file mode 100644 index c51afcad0..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/Module.bsl +++ /dev/null @@ -1,277 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА СООБЩЕНИЙ УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. -Функция Версия() Экспорт - - Возврат "1.0.3.4"; - -КонецФункции - -// Возвращает название программного интерфейса сообщений. -Функция ПрограммныйИнтерфейс() Экспорт - - Возврат "RemoteAdministrationApp"; - -КонецФункции - -// Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1); - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2); - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3); - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4); - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5); - -КонецПроцедуры - -// Выполняет регистрацию обработчиков трансляции сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт - -КонецПроцедуры - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}UpdateUser. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеОбновитьПользователя(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "UpdateUser"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetFullControl. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьПолныеПраваОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetFullControl"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetApplicationAccess. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьДоступКОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetApplicationAccess"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetDefaultUserRights. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьПраваПользователяПоУмолчанию(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetDefaultUserRights"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}PrepareApplication. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеПодготовитьОбластьДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "PrepareApplication"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}BindApplication. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеПрикрепитьОбластьДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "BindApplication"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}UsersList. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеСписокПользователей(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "UsersList"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}PrepareCustomApplication. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеПодготовитьОбластьДанныхИзВыгрузки(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "PrepareCustomApplication"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}DeleteApplication. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУдалитьОбластьДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "DeleteApplication"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetApplicationParams. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьПараметрыОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetApplicationParams"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetIBParams. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьПараметрыИБ(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetIBParams"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetServiceManagerEndPoint. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetServiceManagerEndPoint"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}ApplicationsRating. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция ТипРейтингОбластиДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "ApplicationRating"); - -КонецФункции - -// Возвращает тип сообщения {http://www.1c.ru/1cfresh/RemoteAdministration/App/a.b.c.d}SetApplicationsRating. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеУстановитьРейтингОбластейДанных(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "SetApplicationsRating"); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция СоздатьТипСообщения(Знач ИспользуемыйПакет, Знач Тип) - - Если ИспользуемыйПакет = Неопределено Тогда - ИспользуемыйПакет = Пакет(); - КонецЕсли; - - Возврат ФабрикаXDTO.Тип(ИспользуемыйПакет, Тип); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/СообщенияУдаленногоАдминистрированияИнтерфейс.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/СообщенияУдаленногоАдминистрированияИнтерфейс.mdo deleted file mode 100644 index 34b7a0cf0..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияИнтерфейс/СообщенияУдаленногоАдминистрированияИнтерфейс.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияИнтерфейс - - ru - Сообщения удаленного администрирования интерфейс - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/Module.bsl deleted file mode 100644 index bdaa23a2a..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/Module.bsl +++ /dev/null @@ -1,159 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.4 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/SaaS/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. -Функция Версия() Экспорт - - Возврат "1.0.3.1"; - -КонецФункции - -// Возвращает базовый тип для сообщений версии. -Функция БазовыйТип() Экспорт - - Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); - -КонецФункции - -// Выполняет обработку входящих сообщений модели сервиса. -// -// Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо -// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. -// -Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт - - СообщениеОбработано = Истина; - - Словарь = СообщенияУдаленногоАдминистрированияИнтерфейс; - ТипСообщения = Сообщение.Body.Тип(); - - Если ТипСообщения = Словарь.СообщениеОбновитьПользователя(Пакет()) Тогда - ОбновитьПользователя(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанных(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Ложь); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанныхИзВыгрузки(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Истина); - ИначеЕсли ТипСообщения = Словарь.СообщениеУдалитьОбластьДанных(Пакет()) Тогда - УдалитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьДоступКОбластиДанных(Пакет()) Тогда - УстановитьДоступКОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Пакет()) Тогда - УстановитьКонечнуюТочкуМенеджераСервиса(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыИБ(Пакет()) Тогда - УстановитьПараметрыИБ(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыОбластиДанных(Пакет()) Тогда - УстановитьПараметрыОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПолныеПраваОбластиДанных(Пакет()) Тогда - УстановитьПолныеПраваОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПраваПользователяПоУмолчанию(Пакет()) Тогда - УстановитьПраваПользователяПоУмолчанию(Сообщение, Отправитель); - Иначе - СообщениеОбработано = Ложь; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОбновитьПользователя(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ОбновитьПользователя( - ТелоСообщения.Name, - ТелоСообщения.FullName, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserApplicationID, - ТелоСообщения.UserServiceID, - ТелоСообщения.Phone, - ТелоСообщения.EMail, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура ПодготовитьОбластьДанных(Знач Сообщение, Знач Отправитель, Знач ИзВыгрузки) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПодготовитьОбластьДанных( - ТелоСообщения.Zone, - ИзВыгрузки, - ?(ИзВыгрузки, Неопределено, ТелоСообщения.Kind), - ТелоСообщения.DataFileId); - -КонецПроцедуры - -Процедура УдалитьОбластьДанных(Сообщение, Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УдалитьОбластьДанных(Сообщение.Body.Zone); - -КонецПроцедуры - -Процедура УстановитьДоступКОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьДоступКОбластиДанных( - ТелоСообщения.Name, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserServiceID, - ТелоСообщения.Value, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьКонечнуюТочкуМенеджераСервиса(Отправитель); - -КонецПроцедуры - -Процедура УстановитьПараметрыИБ(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - Параметры = СериализаторXDTO.ПрочитатьXDTO(ТелоСообщения.Params); - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыИБ(Параметры); - -КонецПроцедуры - -Процедура УстановитьПараметрыОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыОбластиДанных( - ТелоСообщения.Zone, - ТелоСообщения.Presentation, - ТелоСообщения.TimeZone); - -КонецПроцедуры - -Процедура УстановитьПолныеПраваОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПолныеПраваОбластиДанных( - ТелоСообщения.UserServiceID, - ТелоСообщения.Value); - -КонецПроцедуры - -Процедура УстановитьПраваПользователяПоУмолчанию(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПраваПользователяПоУмолчанию( - Сообщение.Body.UserServiceID); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1.mdo deleted file mode 100644 index bdbe52a53..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1 - - ru - Сообщения удаленного администрирования обработчик сообщения 1.0.3.1 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/Module.bsl deleted file mode 100644 index fde76d622..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/Module.bsl +++ /dev/null @@ -1,177 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.4 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/SaaS/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. -Функция Версия() Экспорт - - Возврат "1.0.3.2"; - -КонецФункции - -// Возвращает базовый тип для сообщений версии. -Функция БазовыйТип() Экспорт - - Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); - -КонецФункции - -// Выполняет обработку входящих сообщений модели сервиса. -// -// Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо -// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. -// -Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт - - СообщениеОбработано = Истина; - - Словарь = СообщенияУдаленногоАдминистрированияИнтерфейс; - ТипСообщения = Сообщение.Body.Тип(); - - Если ТипСообщения = Словарь.СообщениеОбновитьПользователя(Пакет()) Тогда - ОбновитьПользователя(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанных(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Ложь); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанныхИзВыгрузки(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Истина); - ИначеЕсли ТипСообщения = Словарь.СообщениеУдалитьОбластьДанных(Пакет()) Тогда - УдалитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьДоступКОбластиДанных(Пакет()) Тогда - УстановитьДоступКОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Пакет()) Тогда - УстановитьКонечнуюТочкуМенеджераСервиса(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыИБ(Пакет()) Тогда - УстановитьПараметрыИБ(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыОбластиДанных(Пакет()) Тогда - УстановитьПараметрыОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПолныеПраваОбластиДанных(Пакет()) Тогда - УстановитьПолныеПраваОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПраваПользователяПоУмолчанию(Пакет()) Тогда - УстановитьПраваПользователяПоУмолчанию(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьРейтингОбластейДанных(Пакет()) Тогда - УстановитьРейтингОбластейДанных(Сообщение, Отправитель); - Иначе - СообщениеОбработано = Ложь; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОбновитьПользователя(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ОбновитьПользователя( - ТелоСообщения.Name, - ТелоСообщения.FullName, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserApplicationID, - ТелоСообщения.UserServiceID, - ТелоСообщения.Phone, - ТелоСообщения.EMail, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура ПодготовитьОбластьДанных(Знач Сообщение, Знач Отправитель, Знач ИзВыгрузки) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПодготовитьОбластьДанных( - ТелоСообщения.Zone, - ИзВыгрузки, - ?(ИзВыгрузки, Неопределено, ТелоСообщения.Kind), - ТелоСообщения.DataFileId); - -КонецПроцедуры - -Процедура УдалитьОбластьДанных(Сообщение, Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УдалитьОбластьДанных(Сообщение.Body.Zone); - -КонецПроцедуры - -Процедура УстановитьДоступКОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьДоступКОбластиДанных( - ТелоСообщения.Name, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserServiceID, - ТелоСообщения.Value, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьКонечнуюТочкуМенеджераСервиса(Отправитель); - -КонецПроцедуры - -Процедура УстановитьПараметрыИБ(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - Параметры = СериализаторXDTO.ПрочитатьXDTO(ТелоСообщения.Params); - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыИБ(Параметры); - -КонецПроцедуры - -Процедура УстановитьПараметрыОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыОбластиДанных( - ТелоСообщения.Zone, - ТелоСообщения.Presentation, - ТелоСообщения.TimeZone); - -КонецПроцедуры - -Процедура УстановитьПолныеПраваОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПолныеПраваОбластиДанных( - ТелоСообщения.UserServiceID, - ТелоСообщения.Value); - -КонецПроцедуры - -Процедура УстановитьПраваПользователяПоУмолчанию(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПраваПользователяПоУмолчанию( - Сообщение.Body.UserServiceID); - -КонецПроцедуры - -Процедура УстановитьРейтингОбластейДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - ТаблицаРейтинга = Новый ТаблицаЗначений(); - ТаблицаРейтинга.Колонки.Добавить("ОбластьДанныхВспомогательныеДанные", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - ТаблицаРейтинга.Колонки.Добавить("Рейтинг", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - Для Каждого СтрокаСообщения Из ТелоСообщения.Item Цикл - СтрокаРейтинга = ТаблицаРейтинга.Добавить(); - СтрокаРейтинга.ОбластьДанныхВспомогательныеДанные = СтрокаСообщения.Zone; - СтрокаРейтинга.Рейтинг = СтрокаСообщения.Rating; - КонецЦикла; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьРейтингОбластейДанных( - ТаблицаРейтинга, ТелоСообщения.SetAllZones); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2.mdo deleted file mode 100644 index eec1b9084..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2 - - ru - Сообщения удаленного администрирования обработчик сообщения 1.0.3.2 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/Module.bsl deleted file mode 100644 index b7874432c..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/Module.bsl +++ /dev/null @@ -1,186 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.4 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. -Функция Версия() Экспорт - - Возврат "1.0.3.3"; - -КонецФункции - -// Возвращает базовый тип для сообщений версии. -Функция БазовыйТип() Экспорт - - Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); - -КонецФункции - -// Выполняет обработку входящих сообщений модели сервиса. -// -// Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо -// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. -// -Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт - - СообщениеОбработано = Истина; - - Словарь = СообщенияУдаленногоАдминистрированияИнтерфейс; - ТипСообщения = Сообщение.Body.Тип(); - - Если ТипСообщения = Словарь.СообщениеОбновитьПользователя(Пакет()) Тогда - ОбновитьПользователя(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанных(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Ложь); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанныхИзВыгрузки(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Истина); - ИначеЕсли ТипСообщения = Словарь.СообщениеУдалитьОбластьДанных(Пакет()) Тогда - УдалитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьДоступКОбластиДанных(Пакет()) Тогда - УстановитьДоступКОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Пакет()) Тогда - УстановитьКонечнуюТочкуМенеджераСервиса(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыИБ(Пакет()) Тогда - УстановитьПараметрыИБ(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыОбластиДанных(Пакет()) Тогда - УстановитьПараметрыОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПолныеПраваОбластиДанных(Пакет()) Тогда - УстановитьПолныеПраваОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПраваПользователяПоУмолчанию(Пакет()) Тогда - УстановитьПраваПользователяПоУмолчанию(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьРейтингОбластейДанных(Пакет()) Тогда - УстановитьРейтингОбластейДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПрикрепитьОбластьДанных(Пакет()) Тогда - ПрикрепитьОбластьДанных(Сообщение, Отправитель); - Иначе - СообщениеОбработано = Ложь; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОбновитьПользователя(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ОбновитьПользователя( - ТелоСообщения.Name, - ТелоСообщения.FullName, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserApplicationID, - ТелоСообщения.UserServiceID, - ТелоСообщения.Phone, - ТелоСообщения.EMail, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура ПодготовитьОбластьДанных(Знач Сообщение, Знач Отправитель, Знач ИзВыгрузки) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПодготовитьОбластьДанных( - ТелоСообщения.Zone, - ИзВыгрузки, - ?(ИзВыгрузки, Неопределено, ТелоСообщения.Kind), - ТелоСообщения.DataFileId); - -КонецПроцедуры - -Процедура УдалитьОбластьДанных(Сообщение, Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УдалитьОбластьДанных(Сообщение.Body.Zone); - -КонецПроцедуры - -Процедура УстановитьДоступКОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьДоступКОбластиДанных( - ТелоСообщения.Name, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserServiceID, - ТелоСообщения.Value, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьКонечнуюТочкуМенеджераСервиса(Отправитель); - -КонецПроцедуры - -Процедура УстановитьПараметрыИБ(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - Параметры = СериализаторXDTO.ПрочитатьXDTO(ТелоСообщения.Params); - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыИБ(Параметры); - -КонецПроцедуры - -Процедура УстановитьПараметрыОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыОбластиДанных( - ТелоСообщения.Zone, - ТелоСообщения.Presentation, - ТелоСообщения.TimeZone); - -КонецПроцедуры - -Процедура УстановитьПолныеПраваОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПолныеПраваОбластиДанных( - ТелоСообщения.UserServiceID, - ТелоСообщения.Value); - -КонецПроцедуры - -Процедура УстановитьПраваПользователяПоУмолчанию(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПраваПользователяПоУмолчанию( - Сообщение.Body.UserServiceID); - -КонецПроцедуры - -Процедура УстановитьРейтингОбластейДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - ТаблицаРейтинга = Новый ТаблицаЗначений(); - ТаблицаРейтинга.Колонки.Добавить("ОбластьДанныхВспомогательныеДанные", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - ТаблицаРейтинга.Колонки.Добавить("Рейтинг", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - Для Каждого СтрокаСообщения Из ТелоСообщения.Item Цикл - СтрокаРейтинга = ТаблицаРейтинга.Добавить(); - СтрокаРейтинга.ОбластьДанныхВспомогательныеДанные = СтрокаСообщения.Zone; - СтрокаРейтинга.Рейтинг = СтрокаСообщения.Rating; - КонецЦикла; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьРейтингОбластейДанных( - ТаблицаРейтинга, ТелоСообщения.SetAllZones); - -КонецПроцедуры - -Процедура ПрикрепитьОбластьДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПрикрепитьОбластьДанных(ТелоСообщения); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3.mdo deleted file mode 100644 index 42d999283..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3 - - ru - Сообщения удаленного администрирования обработчик сообщения 1.0.3.3 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl deleted file mode 100644 index 421059f8c..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl +++ /dev/null @@ -1,260 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.4 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. -Функция Версия() Экспорт - - Возврат "1.0.3.4"; - -КонецФункции - -// Возвращает базовый тип для сообщений версии. -Функция БазовыйТип() Экспорт - - Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); - -КонецФункции - -// Выполняет обработку входящих сообщений модели сервиса. -// -// Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо -// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. -// -Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт - - СообщениеОбработано = Истина; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс"); - Иначе - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс = Неопределено; - КонецЕсли; - ТипСообщения = Сообщение.Body.Тип(); - - Если ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеОбновитьПользователя(Пакет()) Тогда - ОбновитьПользователя(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеПодготовитьОбластьДанных(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Ложь); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеПодготовитьОбластьДанныхИзВыгрузки(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Истина); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУдалитьОбластьДанных(Пакет()) Тогда - УдалитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьДоступКОбластиДанных(Пакет()) Тогда - УстановитьДоступКОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Пакет()) Тогда - УстановитьКонечнуюТочкуМенеджераСервиса(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьПараметрыИБ(Пакет()) Тогда - УстановитьПараметрыИБ(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьПараметрыОбластиДанных(Пакет()) Тогда - УстановитьПараметрыОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьПолныеПраваОбластиДанных(Пакет()) Тогда - УстановитьПолныеПраваОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьПраваПользователяПоУмолчанию(Пакет()) Тогда - УстановитьПраваПользователяПоУмолчанию(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеУстановитьРейтингОбластейДанных(Пакет()) Тогда - УстановитьРейтингОбластейДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = СообщенияУдаленногоАдминистрированияИнтерфейс.СообщениеПрикрепитьОбластьДанных(Пакет()) Тогда - ПрикрепитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс <> Неопределено И ТипСообщения = МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс.СообщениеУстановитьДополнительныйОтчетИлиОбработку(Пакет()) Тогда - УстановитьДополнительныйОтчетИлиОбработку(Сообщение, Отправитель); - ИначеЕсли МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс <> Неопределено И ТипСообщения = МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс.СообщениеУдалитьДополнительныйОтчетИлиОбработку(Пакет()) Тогда - УдалитьДополнительныйОтчетИлиОбработку(Сообщение, Отправитель); - ИначеЕсли МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс <> Неопределено И ТипСообщения = МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс.СообщениеОтключитьДополнительныйОтчетИлиОбработку(Пакет()) Тогда - ОтключитьДополнительныйОтчетИлиОбработку(Сообщение, Отправитель); - ИначеЕсли МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс <> Неопределено И ТипСообщения = МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс.СообщениеВключитьДополнительныйОтчетИлиОбработку(Пакет()) Тогда - ВключитьДополнительныйОтчетИлиОбработку(Сообщение, Отправитель); - ИначеЕсли МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс <> Неопределено И ТипСообщения = МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс.СообщениеОтозватьДополнительныйОтчетИлиОбработку(Пакет()) Тогда - ОтозватьДополнительныйОтчетИлиОбработку(Сообщение, Отправитель); - Иначе - СообщениеОбработано = Ложь; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОбновитьПользователя(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ОбновитьПользователя( - ТелоСообщения.Name, - ТелоСообщения.FullName, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserApplicationID, - ТелоСообщения.UserServiceID, - ТелоСообщения.Phone, - ТелоСообщения.EMail, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура ПодготовитьОбластьДанных(Знач Сообщение, Знач Отправитель, Знач ИзВыгрузки) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПодготовитьОбластьДанных( - ТелоСообщения.Zone, - ИзВыгрузки, - ?(ИзВыгрузки, Неопределено, ТелоСообщения.Kind), - ТелоСообщения.DataFileId); - -КонецПроцедуры - -Процедура УдалитьОбластьДанных(Сообщение, Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УдалитьОбластьДанных(Сообщение.Body.Zone); - -КонецПроцедуры - -Процедура УстановитьДоступКОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьДоступКОбластиДанных( - ТелоСообщения.Name, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserServiceID, - ТелоСообщения.Value, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьКонечнуюТочкуМенеджераСервиса(Отправитель); - -КонецПроцедуры - -Процедура УстановитьПараметрыИБ(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - Параметры = СериализаторXDTO.ПрочитатьXDTO(ТелоСообщения.Params); - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыИБ(Параметры); - -КонецПроцедуры - -Процедура УстановитьПараметрыОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыОбластиДанных( - ТелоСообщения.Zone, - ТелоСообщения.Presentation, - ТелоСообщения.TimeZone); - -КонецПроцедуры - -Процедура УстановитьПолныеПраваОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПолныеПраваОбластиДанных( - ТелоСообщения.UserServiceID, - ТелоСообщения.Value); - -КонецПроцедуры - -Процедура УстановитьПраваПользователяПоУмолчанию(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПраваПользователяПоУмолчанию( - Сообщение.Body.UserServiceID); - -КонецПроцедуры - -Процедура УстановитьРейтингОбластейДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - ТаблицаРейтинга = Новый ТаблицаЗначений(); - ТаблицаРейтинга.Колонки.Добавить("ОбластьДанныхВспомогательныеДанные", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - ТаблицаРейтинга.Колонки.Добавить("Рейтинг", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - Для Каждого СтрокаСообщения Из ТелоСообщения.Item Цикл - СтрокаРейтинга = ТаблицаРейтинга.Добавить(); - СтрокаРейтинга.ОбластьДанныхВспомогательныеДанные = СтрокаСообщения.Zone; - СтрокаРейтинга.Рейтинг = СтрокаСообщения.Rating; - КонецЦикла; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьРейтингОбластейДанных( - ТаблицаРейтинга, ТелоСообщения.SetAllZones); - -КонецПроцедуры - -Процедура ПрикрепитьОбластьДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПрикрепитьОбластьДанных(ТелоСообщения); - -КонецПроцедуры - -Процедура УстановитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - - - -КонецПроцедуры - -Процедура УдалитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - ТелоСообщения = Сообщение.Body; - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.УдалитьДополнительныйОтчетИлиОбработку( - ТелоСообщения.Extension, ТелоСообщения.Installation); - - КонецЕсли; - -КонецПроцедуры - -Процедура ОтключитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ОтключитьДополнительныйОтчетИлиОбработку( - Сообщение.Body.Extension); - - КонецЕсли; - -КонецПроцедуры - -Процедура ВключитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ВключитьДополнительныйОтчетИлиОбработку( - Сообщение.Body.Extension); - - КонецЕсли; - -КонецПроцедуры - -Процедура ОтозватьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); - - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ОтозватьДополнительныйОтчетИлиОбработку( - Сообщение.Body.Extension); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4.mdo deleted file mode 100644 index 95e040527..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4 - - ru - Сообщения удаленного администрирования обработчик сообщения 1.0.3.4 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/Module.bsl deleted file mode 100644 index 347b2c19e..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/Module.bsl +++ /dev/null @@ -1,186 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.5 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/RemoteAdministration/App/" + Версия(); - -КонецФункции - -// Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. -Функция Версия() Экспорт - - Возврат "1.0.3.5"; - -КонецФункции - -// Возвращает базовый тип для сообщений версии. -Функция БазовыйТип() Экспорт - - Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); - -КонецФункции - -// Выполняет обработку входящих сообщений модели сервиса. -// -// Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо -// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. -// -Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт - - СообщениеОбработано = Истина; - - Словарь = СообщенияУдаленногоАдминистрированияИнтерфейс; - ТипСообщения = Сообщение.Body.Тип(); - - Если ТипСообщения = Словарь.СообщениеОбновитьПользователя(Пакет()) Тогда - ОбновитьПользователя(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанных(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Ложь); - ИначеЕсли ТипСообщения = Словарь.СообщениеПодготовитьОбластьДанныхИзВыгрузки(Пакет()) Тогда - ПодготовитьОбластьДанных(Сообщение, Отправитель, Истина); - ИначеЕсли ТипСообщения = Словарь.СообщениеУдалитьОбластьДанных(Пакет()) Тогда - УдалитьОбластьДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьДоступКОбластиДанных(Пакет()) Тогда - УстановитьДоступКОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьКонечнуюТочкуМенеджераСервиса(Пакет()) Тогда - УстановитьКонечнуюТочкуМенеджераСервиса(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыИБ(Пакет()) Тогда - УстановитьПараметрыИБ(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПараметрыОбластиДанных(Пакет()) Тогда - УстановитьПараметрыОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПолныеПраваОбластиДанных(Пакет()) Тогда - УстановитьПолныеПраваОбластиДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьПраваПользователяПоУмолчанию(Пакет()) Тогда - УстановитьПраваПользователяПоУмолчанию(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьРейтингОбластейДанных(Пакет()) Тогда - УстановитьРейтингОбластейДанных(Сообщение, Отправитель); - ИначеЕсли ТипСообщения = Словарь.СообщениеПрикрепитьОбластьДанных(Пакет()) Тогда - ПрикрепитьОбластьДанных(Сообщение, Отправитель); - Иначе - СообщениеОбработано = Ложь; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОбновитьПользователя(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ОбновитьПользователя( - ТелоСообщения.Name, - ТелоСообщения.FullName, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserApplicationID, - ТелоСообщения.UserServiceID, - ТелоСообщения.Phone, - ТелоСообщения.EMail, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура ПодготовитьОбластьДанных(Знач Сообщение, Знач Отправитель, Знач ИзВыгрузки) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПодготовитьОбластьДанных( - ТелоСообщения.Zone, - ИзВыгрузки, - ?(ИзВыгрузки, Неопределено, ТелоСообщения.Kind), - ТелоСообщения.DataFileId); - -КонецПроцедуры - -Процедура УдалитьОбластьДанных(Сообщение, Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УдалитьОбластьДанных(Сообщение.Body.Zone); - -КонецПроцедуры - -Процедура УстановитьДоступКОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьДоступКОбластиДанных( - ТелоСообщения.Name, - ТелоСообщения.StoredPasswordValue, - ТелоСообщения.UserServiceID, - ТелоСообщения.Value, - ТелоСообщения.Language); - -КонецПроцедуры - -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьКонечнуюТочкуМенеджераСервиса(Отправитель); - -КонецПроцедуры - -Процедура УстановитьПараметрыИБ(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - Параметры = СериализаторXDTO.ПрочитатьXDTO(ТелоСообщения.Params); - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыИБ(Параметры); - -КонецПроцедуры - -Процедура УстановитьПараметрыОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПараметрыОбластиДанных( - ТелоСообщения.Zone, - ТелоСообщения.Presentation, - ТелоСообщения.TimeZone); - -КонецПроцедуры - -Процедура УстановитьПолныеПраваОбластиДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПолныеПраваОбластиДанных( - ТелоСообщения.UserServiceID, - ТелоСообщения.Value); - -КонецПроцедуры - -Процедура УстановитьПраваПользователяПоУмолчанию(Знач Сообщение, Знач Отправитель) - - СообщенияУдаленногоАдминистрированияРеализация.УстановитьПраваПользователяПоУмолчанию( - Сообщение.Body.UserServiceID); - -КонецПроцедуры - -Процедура УстановитьРейтингОбластейДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - ТаблицаРейтинга = Новый ТаблицаЗначений(); - ТаблицаРейтинга.Колонки.Добавить("ОбластьДанныхВспомогательныеДанные", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - ТаблицаРейтинга.Колонки.Добавить("Рейтинг", Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(7,0))); - Для Каждого СтрокаСообщения Из ТелоСообщения.Item Цикл - СтрокаРейтинга = ТаблицаРейтинга.Добавить(); - СтрокаРейтинга.ОбластьДанныхВспомогательныеДанные = СтрокаСообщения.Zone; - СтрокаРейтинга.Рейтинг = СтрокаСообщения.Rating; - КонецЦикла; - СообщенияУдаленногоАдминистрированияРеализация.УстановитьРейтингОбластейДанных( - ТаблицаРейтинга, ТелоСообщения.SetAllZones); - -КонецПроцедуры - -Процедура ПрикрепитьОбластьДанных(Знач Сообщение, Знач Отправитель) - - ТелоСообщения = Сообщение.Body; - СообщенияУдаленногоАдминистрированияРеализация.ПрикрепитьОбластьДанных(ТелоСообщения); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5.mdo deleted file mode 100644 index edcbe7877..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5 - - ru - Сообщения удаленного администрирования обработчик сообщения 1.0.3.5 - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl deleted file mode 100644 index e88e62092..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl +++ /dev/null @@ -1,914 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБЩАЯ РЕАЛИЗАЦИЯ ОБРАБОТКИ СООБЩЕНИЙ УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}UpdateUser. -// -// Параметры: -// Имя - строка, имя пользователя, -// ПолноеИмя - строка, полное имя пользователя, -// ХэшПароля - строка, сохраняемое значение пароля, -// ИдентификаторПользователяПриложения - УникальныйИдентификатор, -// ИдентификаторПользователяСервиса - УникальныйИдентификатор, -// НомерТелефона - строка, номер телефона пользователя, -// АдресЭлектроннойПочты - строка, адрес электронной почты пользователя, -// КодЯзыка - строка, код языка пользователя. -// -Процедура ОбновитьПользователя(Знач Имя, Знач ПолноеИмя, Знач ХэшПароля, - Знач ИдентификаторПользователяПриложения, - Знач ИдентификаторПользователяСервиса, - Знач НомерТелефона = "", Знач АдресЭлектроннойПочты = "", - Знач КодЯзыка = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ЯзыкПользователя = ЯзыкПоКоду(КодЯзыка); - - Почта = АдресЭлектроннойПочты; - - Телефон = НомерТелефона; - - СтруктураАдресаЭП = СоставПочтовогоАдреса(Почта); - - НачатьТранзакцию(); - Попытка - Если ЗначениеЗаполнено(ИдентификаторПользователяПриложения) Тогда - - ПользовательОбластиДанных = Справочники.Пользователи.ПолучитьСсылку(ИдентификаторПользователяПриложения); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); - ЭлементБлокировки.УстановитьЗначение("Ссылка", ПользовательОбластиДанных); - Блокировка.Заблокировать(); - Иначе - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяСервиса = &ИдентификаторПользователяСервиса"; - Запрос.УстановитьПараметр("ИдентификаторПользователяСервиса", ИдентификаторПользователяСервиса); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); - Блокировка.Заблокировать(); - - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - ПользовательОбластиДанных = Неопределено; - Иначе - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - ПользовательОбластиДанных = Выборка.Ссылка; - КонецЕсли; - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(ПользовательОбластиДанных) Тогда - ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент(); - ПользовательОбъект.ИдентификаторПользователяСервиса = ИдентификаторПользователяСервиса; - Иначе - ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект(); - КонецЕсли; - - ПользовательОбъект.Наименование = ПолноеИмя; - - ОбновитьАдресЭлектроннойПочты(ПользовательОбъект, Почта, СтруктураАдресаЭП); - - ОбновитьТелефон(ПользовательОбъект, Телефон); - - ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); - - ОписаниеПользователяИБ.Имя = Имя; - - ОписаниеПользователяИБ.АутентификацияСтандартная = Истина; - ОписаниеПользователяИБ.АутентификацияOpenID = Истина; - ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь; - - ОписаниеПользователяИБ.СохраняемоеЗначениеПароля = ХэшПароля; - - ОписаниеПользователяИБ.Язык = ЯзыкПользователя; - - ОписаниеПользователяИБ.Вставить("Действие", "Записать"); - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ); - - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования"); - ПользовательОбъект.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}PrepareApplication. -// -// Параметры: -// КодОбластиДанных - число(7,0), -// ИзВыгрузки - булево, признак создания области данных из файла с выгрузкой данных из локального режима -// (data_dump.zip), -// Вариант - строка, вариант файла начальных данных для области данных, -// ИдентификаторВыгрузки - УникальныйИдентификатор, идентификатор файла выгрузки в хранилище менеджера сервиса. -// -Процедура ПодготовитьОбластьДанных(Знач КодОбластиДанных, Знач ИзВыгрузки, Знач Вариант, Знач ИдентификаторВыгрузки) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - Если НЕ ЗначениеЗаполнено(Константы.РежимИспользованияИнформационнойБазы.Получить()) Тогда - ТекстСообщения = НСтр("ru = 'Не установлен режим работы информационной базы'"); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - Блокировка = Новый БлокировкаДанных; - Элемент = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); - Блокировка.Заблокировать(); - - МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Прочитать(); - Если МенеджерЗаписи.Выбран() Тогда - Если МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Удалена Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 удалена'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КодОбластиДанных); - ВызватьИсключение(ТекстСообщения); - ИначеЕсли МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.КУдалению Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 в процессе удаления'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КодОбластиДанных); - ВызватьИсключение(ТекстСообщения); - ИначеЕсли МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Новая Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 в процессе подготовки к использованию'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КодОбластиДанных); - ВызватьИсключение(ТекстСообщения); - ИначеЕсли МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 используется.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КодОбластиДанных); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - КонецЕсли; - - МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Новая; - МенеджерЗаписи.ИдентификаторВыгрузки = ИдентификаторВыгрузки; - МенеджерЗаписи.Повтор = 0; - МенеджерЗаписи.Вариант = ?(ИзВыгрузки, "", Вариант); - - КопияМенеджера = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - ЗаполнитьЗначенияСвойств(КопияМенеджера, МенеджерЗаписи); - МенеджерЗаписи = КопияМенеджера; - - МенеджерЗаписи.Записать(); - - ПараметрыМетода = Новый Массив; - ПараметрыМетода.Добавить(КодОбластиДанных); - - ПараметрыМетода.Добавить(МенеджерЗаписи.ИдентификаторВыгрузки); - Если Не ИзВыгрузки Тогда - ПараметрыМетода.Добавить(Вариант); - КонецЕсли; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода" , "РаботаВМоделиСервиса.ПодготовитьОбластьДанныхКИспользованию"); - ПараметрыЗадания.Вставить("Параметры" , ПараметрыМетода); - ПараметрыЗадания.Вставить("Ключ" , "1"); - ПараметрыЗадания.Вставить("ОбластьДанных", КодОбластиДанных); - ПараметрыЗадания.Вставить("ЭксклюзивноеВыполнение", Истина); - - ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}DeleteApplication. -// -// Параметры: -// КодОбластиДанных - число(7,0). -// -Процедура УдалитьОбластьДанных(Знач КодОбластиДанных) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - Элемент = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); - Блокировка.Заблокировать(); - - МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Прочитать(); - Если НЕ МенеджерЗаписи.Выбран() Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 не существует.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КодОбластиДанных); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.КУдалению; - МенеджерЗаписи.Повтор = 0; - - КопияМенеджера = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - ЗаполнитьЗначенияСвойств(КопияМенеджера, МенеджерЗаписи); - МенеджерЗаписи = КопияМенеджера; - - МенеджерЗаписи.Записать(); - - ПараметрыМетода = Новый Массив; - ПараметрыМетода.Добавить(КодОбластиДанных); - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяМетода" , "РаботаВМоделиСервиса.ОчиститьОбластьДанных"); - ПараметрыЗадания.Вставить("Параметры" , ПараметрыМетода); - ПараметрыЗадания.Вставить("Ключ" , "1"); - ПараметрыЗадания.Вставить("ОбластьДанных", КодОбластиДанных); - - ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetApplicationAccess. -// -// Параметры: -// Имя - строка, имя пользователя, -// ХэшПароля - строка, сохраняемое значение пароля, -// ИдентификаторПользователяСервиса - УникальныйИдентификатор, -// ДоступРазрешен - булево, флаг предоставления доступа пользователю к области данных, -// КодЯзыка - строка, код языка пользователя. -// -Процедура УстановитьДоступКОбластиДанных(Знач Имя, Знач ХэшПароля, - Знач ИдентификаторПользователяСервиса, - Знач ДоступРазрешен, Знач КодЯзыка = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - - Попытка - - ПользовательОбластиДанных = ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(ИдентификаторПользователяСервиса); - - ЯзыкПользователяИБ = ЯзыкПоКоду(КодЯзыка); - - ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); - ОписаниеПользователяИБ.Вставить("Действие", "Записать"); - ОписаниеПользователяИБ.Вставить("ВходВПрограммуРазрешен", ДоступРазрешен); - ОписаниеПользователяИБ.Имя = Имя; - ОписаниеПользователяИБ.Язык = ЯзыкПользователяИБ; - ОписаниеПользователяИБ.СохраняемоеЗначениеПароля = ХэшПароля; - ОписаниеПользователяИБ.АутентификацияСтандартная = Истина; - ОписаниеПользователяИБ.АутентификацияOpenID = Истина; - ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь; - - ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект(); - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ); - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования"); - ПользовательОбъект.Записать(); - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом -// http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetServiceManagerEndPoint. -// -// Параметры: -// УзелОбменаСообщениями - ПланОбменаСсылка.ОбменСообщениями. -// -Процедура УстановитьКонечнуюТочкуМенеджераСервиса(УзелОбменаСообщениями) Экспорт - - Константы.КонечнаяТочкаМенеджераСервиса.Установить(УзелОбменаСообщениями); - ОбщегоНазначения.УстановитьПараметрыРазделенияИнформационнойБазы(Истина); - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetIBParams. -// -// Параметры: -// Параметры - Структура, содержащая значения параметров, которые необходимо установить для информационной базы. -// -Процедура УстановитьПараметрыИБ(Параметры) Экспорт - - НачатьТранзакцию(); - Попытка - ТаблицаПараметров = РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(); - - ИзменяемыеПараметры = Новый Структура; - - // Проверка корректности списка параметров. - Для каждого КлючИЗначение Из Параметры Цикл - - СтрокаПараметра = ТаблицаПараметров.Найти(КлючИЗначение.Ключ, "Имя"); - Если СтрокаПараметра = Неопределено Тогда - ШаблонСообщения = НСтр("ru = 'Не известное имя параметра %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КлючИЗначение.Ключ); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(), - УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения); - Продолжить; - ИначеЕсли СтрокаПараметра.ЗапретЗаписи Тогда - ШаблонСообщения = НСтр("ru = 'Параметр %1 может использоваться только для чтения'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КлючИЗначение.Ключ); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - ИзменяемыеПараметры.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - - КонецЦикла; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеЗначенийПараметровИБ"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриУстановкеЗначенийПараметровИБ(ИзменяемыеПараметры); - КонецЦикла; - - РаботаВМоделиСервисаПереопределяемый.ПриУстановкеЗначенийПараметровИБ(ИзменяемыеПараметры); - - Для каждого КлючИЗначение Из ИзменяемыеПараметры Цикл - - Константы[КлючИЗначение.Ключ].Установить(КлючИЗначение.Значение); - - КонецЦикла; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetApplicationParams. -// -// Параметры: -// КодОбластиДанных - число(7,0), -// ПредставлениеОбластиДанных - строка, -// ЧасовойПоясОбластиДанных - строка. -// -Процедура УстановитьПараметрыОбластиДанных(Знач КодОбластиДанных, - Знач ПредставлениеОбластиДанных, - Знач ЧасовойПоясОбластиДанных = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - - Попытка - - Если Не ПустаяСтрока(ПредставлениеОбластиДанных) Тогда - - ОбновитьСвойстваПредопределенныхУзлов(ПредставлениеОбластиДанных); - - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - - ОбновитьПараметрыТекущейОбластиДанных(ПредставлениеОбластиДанных, ЧасовойПоясОбластиДанных); - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetFullControl. -// -// Параметры: -// ИдентификаторПользователяСервиса - УникальныйИдентификатор, -// ДоступРазрешен - булево, флаг предоставления доступа пользователю к области данных. -// -Процедура УстановитьПолныеПраваОбластиДанных(Знач ИдентификаторПользователяСервиса, Знач ДоступРазрешен) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - ПользовательОбластиДанных = ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(ИдентификаторПользователяСервиса); - - Если ПользователиСлужебный.ЗапретРедактированияРолей() - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); - МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьПринадлежностьПользователяКГруппеАдминистраторы(ПользовательОбластиДанных, ДоступРазрешен); - - Иначе - - ПользовательИБ = ПолучитьПользователяИБПоПользователюОбластиДанных(ПользовательОбластиДанных); - - РольПолныеПрава = Метаданные.Роли.ПолныеПрава; - Если ДоступРазрешен Тогда - Если НЕ ПользовательИБ.Роли.Содержит(РольПолныеПрава) Тогда - ПользовательИБ.Роли.Добавить(РольПолныеПрава); - КонецЕсли; - Иначе - Если ПользовательИБ.Роли.Содержит(РольПолныеПрава) Тогда - ПользовательИБ.Роли.Удалить(РольПолныеПрава); - КонецЕсли; - КонецЕсли; - - ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ПользовательОбластиДанных); - - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetDefaultUserRights. -// -// Параметры: -// ИдентификаторПользователяСервиса - УникальныйИдентификатор. -// -Процедура УстановитьПраваПользователяПоУмолчанию(Знач ИдентификаторПользователяСервиса) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - ПользовательОбластиДанных = ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(ИдентификаторПользователяСервиса); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеПравПоУмолчанию"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриУстановкеПравПоУмолчанию(ПользовательОбластиДанных); - КонецЦикла; - - РаботаВМоделиСервисаПереопределяемый.УстановитьПраваПоУмолчанию(ПользовательОбластиДанных); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetApplicationsRating. -// -// Параметры: -// ТаблицаРейтинга - ТаблицаЗначений, содержащая рейтинг активности областей данных, колонки: -// ОбластьДанных - число(7,0), -// Рейтинг - число(7,0), -// Замещать - булево, флаг замещения существующих записей в рейтинге активности областей данных. -// -Процедура УстановитьРейтингОбластейДанных(Знач ТаблицаРейтинга, Знач Замещать) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Набор = РегистрыСведений.РейтингАктивностиОбластейДанных.СоздатьНаборЗаписей(); - - Если Замещать Тогда - Набор.Загрузить(ТаблицаРейтинга); - Набор.Записать(); - Иначе - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РейтингАктивностиОбластейДанных"); - ЭлементБлокировки.ИсточникДанных = ТаблицаРейтинга; - ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ОбластьДанныхВспомогательныеДанные", "ОбластьДанныхВспомогательныеДанные"); - НачатьТранзакцию(); - - Попытка - Блокировка.Заблокировать(); - - Для каждого СтрокаРейтинга Из ТаблицаРейтинга Цикл - Набор.Очистить(); - Набор.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(СтрокаРейтинга.ОбластьДанныхВспомогательныеДанные); - Запись = Набор.Добавить(); - ЗаполнитьЗначенияСвойств(Запись, СтрокаРейтинга); - Набор.Записать(); - КонецЦикла; - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - КонецЕсли; - -КонецПроцедуры - -// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}BindApplication. -// -// Параметры: -// Параметры - Структура, содержащая значения параметров, которые необходимо установить для области данных. -// -Процедура ПрикрепитьОбластьДанных(Параметры) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - - // Установка параметров области данных. - Блокировка = Новый БлокировкаДанных; - Элемент = Блокировка.Добавить("РегистрСведений.ОбластиДанных"); - Блокировка.Заблокировать(); - - МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Прочитать(); - Если НЕ МенеджерЗаписи.Выбран() Тогда - ШаблонСообщения = НСтр("ru = 'Область данных %1 не существует.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Параметры.Zone); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется; - КопияМенеджера = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - ЗаполнитьЗначенияСвойств(КопияМенеджера, МенеджерЗаписи); - МенеджерЗаписи = КопияМенеджера; - МенеджерЗаписи.Записать(); - - // Создание администраторов в области. - Для каждого ОписаниеПользователя Из Параметры.UsersList.Item Цикл - ЯзыкПользователя = ЯзыкПоКоду(ОписаниеПользователя.Language); - - Почта = ""; - Телефон = ""; - Если ЗначениеЗаполнено(ОписаниеПользователя.EMail) Тогда - Почта = ОписаниеПользователя.EMail; - КонецЕсли; - - Если ЗначениеЗаполнено(ОписаниеПользователя.Phone) Тогда - Телефон = ОписаниеПользователя.Phone; - КонецЕсли; - - СтруктураАдресаЭП = СоставПочтовогоАдреса(Почта); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяСервиса = &ИдентификаторПользователяСервиса"; - Запрос.УстановитьПараметр("ИдентификаторПользователяСервиса", ОписаниеПользователя.UserServiceID); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); - Блокировка.Заблокировать(); - - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - ПользовательОбластиДанных = Неопределено; - Иначе - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - ПользовательОбластиДанных = Выборка.Ссылка; - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(ПользовательОбластиДанных) Тогда - ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент(); - ПользовательОбъект.ИдентификаторПользователяСервиса = ОписаниеПользователя.UserServiceID; - Иначе - ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект(); - КонецЕсли; - - ПользовательОбъект.Наименование = ОписаниеПользователя.FullName; - - ОбновитьАдресЭлектроннойПочты(ПользовательОбъект, Почта, СтруктураАдресаЭП); - - ОбновитьТелефон(ПользовательОбъект, Телефон); - - ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); - - ОписаниеПользователяИБ.Имя = ОписаниеПользователя.Name; - - ОписаниеПользователяИБ.АутентификацияСтандартная = Истина; - ОписаниеПользователяИБ.АутентификацияOpenID = Истина; - ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь; - - ОписаниеПользователяИБ.СохраняемоеЗначениеПароля = ОписаниеПользователя.StoredPasswordValue; - - ОписаниеПользователяИБ.Язык = ЯзыкПользователя; - - Роли = Новый Массив; - Роли.Добавить("ПолныеПрава"); - ОписаниеПользователяИБ.Роли = Роли; - - ОписаниеПользователяИБ.Вставить("Действие", "Записать"); - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ); - ПользовательОбъект.ДополнительныеСвойства.Вставить("СозданиеАдминистратора", - НСтр("ru = 'Создание администратора области данных из менеджера сервиса.'")); - - ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования"); - ПользовательОбъект.Записать(); - - ПользовательОбластиДанных = ПользовательОбъект.Ссылка; - - Если ПользователиСлужебный.ЗапретРедактированияРолей() - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); - МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьПринадлежностьПользователяКГруппеАдминистраторы(ПользовательОбластиДанных, Истина); - КонецЕсли; - КонецЦикла; - - Если Не ПустаяСтрока(Параметры.Presentation) Тогда - ОбновитьСвойстваПредопределенныхУзлов(Параметры.Presentation); - КонецЕсли; - - Сообщение = СообщенияВМоделиСервиса.НовоеСообщение(СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОбластьДанныхГотоваКИспользованию()); - Сообщение.Body.Zone = Параметры.Zone; - - СообщенияВМоделиСервиса.ОтправитьСообщение(Сообщение, РаботаВМоделиСервисаПовтИсп.КонечнаяТочкаМенеджераСервиса(), Истина); - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - - ОбновитьПараметрыТекущейОбластиДанных(Параметры.Presentation, Параметры.TimeZone); - - СообщенияВМоделиСервиса.ДоставитьБыстрыеСообщения(); - -КонецПроцедуры - -// Генерирует код узла плана обмена для заданной области данных. -// -// Параметры: -// НомерОбласти - Число - Значение разделителя. -// -// Возвращаемое значение: -// Строка - Код узла плана обмена для заданной области. -// -Функция КодУзлаПланаОбменаВСервисе(Знач НомерОбласти) Экспорт - - Если ТипЗнч(НомерОбласти) <> Тип("Число") Тогда - ВызватьИсключение НСтр("ru = 'Неправильный тип параметра номер [1].'"); - КонецЕсли; - - Результат = "S0[НомерОбласти]"; - - Возврат СтрЗаменить(Результат, "[НомерОбласти]", Формат(НомерОбласти, "ЧЦ=7; ЧВН=; ЧГ=0")); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЯзыкПоКоду(Знач КодЯзыка) - - Если ЗначениеЗаполнено(КодЯзыка) Тогда - - Для каждого Язык Из Метаданные.Языки Цикл - Если Язык.КодЯзыка = КодЯзыка Тогда - Возврат Язык.Имя; - КонецЕсли; - КонецЦикла; - - ШаблонСообщения = НСтр("ru = 'Неподдерживаемый код языка: %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Язык); - ВызватьИсключение(ТекстСообщения); - - Иначе - - Возврат Неопределено; - - КонецЕсли; - -КонецФункции - -Функция СоставПочтовогоАдреса(Знач АдресЭП) - - Если ЗначениеЗаполнено(АдресЭП) Тогда - - Попытка - СтруктураАдресаЭП = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресЭП); - Исключение - ШаблонСообщения = НСтр("ru = 'Указан некорректный адрес электронной почты: %1 - |Ошибка: %2'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, АдресЭП, ИнформацияОбОшибке().Описание); - ВызватьИсключение(ТекстСообщения); - КонецПопытки; - - Возврат СтруктураАдресаЭП; - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Процедура ОбновитьАдресЭлектроннойПочты(Знач ПользовательОбъект, Знач Адрес, Знач СтруктураАдресаЭП) - - ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailПользователя; - - СтрокаТабличнойЧасти = ПользовательОбъект.КонтактнаяИнформация.Найти(ВидКИ, "Вид"); - Если СтруктураАдресаЭП = Неопределено Тогда - Если СтрокаТабличнойЧасти <> Неопределено Тогда - ПользовательОбъект.КонтактнаяИнформация.Удалить(СтрокаТабличнойЧасти); - КонецЕсли; - Иначе - Если СтрокаТабличнойЧасти = Неопределено Тогда - СтрокаТабличнойЧасти = ПользовательОбъект.КонтактнаяИнформация.Добавить(); - СтрокаТабличнойЧасти.Вид = ВидКИ; - КонецЕсли; - СтрокаТабличнойЧасти.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; - СтрокаТабличнойЧасти.Представление = Адрес; - - Если СтруктураАдресаЭП.Количество() > 0 Тогда - СтрокаТабличнойЧасти.АдресЭП = СтруктураАдресаЭП[0].Адрес; - - Поз = СтрНайти(СтрокаТабличнойЧасти.АдресЭП, "@"); - Если Поз <> 0 Тогда - СтрокаТабличнойЧасти.ДоменноеИмяСервера = Сред(СтрокаТабличнойЧасти.АдресЭП, Поз + 1); - КонецЕсли; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ОбновитьТелефон(Знач ПользовательОбъект, Знач Телефон) - - ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя; - - СтрокаТабличнойЧасти = ПользовательОбъект.КонтактнаяИнформация.Найти(ВидКИ, "Вид"); - Если СтрокаТабличнойЧасти = Неопределено Тогда - СтрокаТабличнойЧасти = ПользовательОбъект.КонтактнаяИнформация.Добавить(); - СтрокаТабличнойЧасти.Вид = ВидКИ; - КонецЕсли; - СтрокаТабличнойЧасти.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон; - СтрокаТабличнойЧасти.Представление = Телефон; - -КонецПроцедуры - -Функция ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(Знач ИдентификаторПользователяСервиса) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяСервиса = &ИдентификаторПользователяСервиса"; - Запрос.УстановитьПараметр("ИдентификаторПользователяСервиса", ИдентификаторПользователяСервиса); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - Результат = Запрос.Выполнить(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Результат.Пустой() Тогда - ШаблонСообщения = НСтр("ru = 'Не найден пользователь с идентификатором пользователя сервиса %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ИдентификаторПользователяСервиса); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - Возврат Результат.Выгрузить()[0].Ссылка; - -КонецФункции - -Функция ПолучитьПользователяИБПоПользователюОбластиДанных(Знач ПользовательОбластиДанных) - - ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательОбластиДанных, "ИдентификаторПользователяИБ"); - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ); - Если ПользовательИБ = Неопределено Тогда - ШаблонСообщения = НСтр("ru = 'Для пользователя области данных с идентификатором %1 не существует пользователя информационной базы'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ПользовательОбластиДанных.УникальныйИдентификатор()); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - Возврат ПользовательИБ; - -КонецФункции - -Процедура ОбновитьПараметрыТекущейОбластиДанных(Знач Представление, Знач ЧасовойПояс) - - Константы.ПредставлениеОбластиДанных.Установить(Представление); - Константы.ЧасовойПоясОбластиДанных.Установить(ЧасовойПояс); - - Если ПолучитьЧасовойПоясИнформационнойБазы() <> ЧасовойПояс Тогда - - ВнешнийМонопольныйРежим = МонопольныйРежим(); - - Если ВнешнийМонопольныйРежим Тогда - - ОбластьЗаблокирована = Истина; - - Иначе - - Попытка - - РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(); - ОбластьЗаблокирована = Истина; - - Исключение - - ОбластьЗаблокирована = Ложь; - - ШаблонСообщения = НСтр("ru = 'Не удалось заблокировать область данных для установки часового пояса ""%1""'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ЧасовойПояс); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(), - УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); - - КонецПопытки; - - КонецЕсли; - - Если ОбластьЗаблокирована Тогда - - Если ЗначениеЗаполнено(ЧасовойПояс) Тогда - - УстановитьЧасовойПоясИнформационнойБазы(ЧасовойПояс); - - Иначе - - УстановитьЧасовойПоясИнформационнойБазы(); - - КонецЕсли; - - Если НЕ ВнешнийМонопольныйРежим Тогда - - РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных(); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -Процедура ОбновитьСвойстваПредопределенныхУзлов(Знач Наименование) - - Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - - Если ОбменДаннымиПовтИсп.ПланОбменаИспользуетсяВМоделиСервиса(ПланОбмена.Имя) Тогда - - ЭтотУзел = ПланыОбмена[ПланОбмена.Имя].ЭтотУзел(); - - СвойстваУзла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭтотУзел, "Код, Наименование"); - - Если ПустаяСтрока(СвойстваУзла.Код) Тогда - - ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект(); - ЭтотУзелОбъект.Код = КодУзлаПланаОбменаВСервисе(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); - ЭтотУзелОбъект.Наименование = Наименование; - ЭтотУзелОбъект.Записать(); - - ИначеЕсли СвойстваУзла.Наименование <> Наименование Тогда - - ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект(); - ЭтотУзелОбъект.Наименование = Наименование; - ЭтотУзелОбъект.Записать(); - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Функция СобытиеЖурналаРегистрацииУдаленноеАдминистрирование() - - Возврат НСтр("ru = 'Удаленное администрирование в модели сервиса.Установить параметры'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/СообщенияУдаленногоАдминистрированияРеализация.mdo b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/СообщенияУдаленногоАдминистрированияРеализация.mdo deleted file mode 100644 index 9d8297d7e..000000000 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/СообщенияУдаленногоАдминистрированияРеализация.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУдаленногоАдминистрированияРеализация - - ru - Сообщения удаленного администрирования реализация - - true - true - true - diff --git a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемИнтерфейс/Module.bsl index 52c3c58ad..96bc76d2a 100644 --- a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемИнтерфейс/Module.bsl @@ -1,11 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА СООБЩЕНИЙ УПРАВЛЕНИЯ РЕЗЕРВНЫМ КОПИРОВАНИЕМ -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - наименование пакета. +// Функция Пакет() Экспорт Возврат "http://www.1c.ru/SaaS/ManageZonesBackup/" + Версия(); @@ -13,6 +12,10 @@ КонецФункции // Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - версия пакета. +// Функция Версия() Экспорт Возврат "1.0.3.1"; @@ -20,6 +23,10 @@ КонецФункции // Возвращает название программного интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - идентификатор программного интерфейса. +// Функция ПрограммныйИнтерфейс() Экспорт Возврат "ManageZonesBackup"; @@ -29,7 +36,7 @@ // Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - массив обработчиков. // Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт @@ -41,7 +48,7 @@ // Выполняет регистрацию обработчиков трансляции сообщений. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - массив обработчиков. // Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт @@ -50,11 +57,11 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}PlanZoneBackup. // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - сообщение. // Функция СообщениеПланироватьАрхивациюОбласти(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -65,11 +72,11 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}CancelZoneBackup. // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - сообщение. // Функция СообщениеОтменитьАрхивациюОбласти(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -84,11 +91,11 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}UpdateScheduledZoneBackupSettings // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - сообщение. // Функция СообщениеОбновитьНастройкиПериодическогоРезервногоКопирования(Знач ИспользуемыйПакет = Неопределено) Экспорт @@ -99,11 +106,11 @@ // Возвращает тип сообщения {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}CancelScheduledZoneBackup // // Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: -// ТипXDTO +// ТипXDTO - сообщение. // Функция СообщениеОтменитьПериодическоеРезервноеКопирование(Знач ИспользуемыйПакет = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_2_1/Module.bsl b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_2_1/Module.bsl index 3366b0187..6abe47232 100644 --- a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_2_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_2_1/Module.bsl @@ -1,12 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.4 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УДАЛЕННОГО АДМИНИСТРИРОВАНИЯ -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает пространство имен версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - наименование пакета. +// Функция Пакет() Экспорт Возврат "http://www.1c.ru/SaaS/ManageZonesBackup/" + Версия(); @@ -14,6 +12,10 @@ КонецФункции // Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. +// +// Возвращаемое значение: +// Строка -версия пакета. +// Функция Версия() Экспорт Возврат "1.0.2.1"; @@ -21,6 +23,10 @@ КонецФункции // Возвращает базовый тип для сообщений версии. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тел сообщений в модели сервиса. +// Функция БазовыйТип() Экспорт Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); @@ -30,9 +36,9 @@ // Выполняет обработку входящих сообщений модели сервиса. // // Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо +// Сообщение - ОбъектXDTO - входящее сообщение, +// Отправитель - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, соответствующий отправителю сообщения. +// СообщениеОбработано - Булево - флаг успешной обработки сообщения. Значение данного параметра необходимо // установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. // Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт diff --git a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_3_1/Module.bsl b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_3_1/Module.bsl index 1654662d0..10d81983d 100644 --- a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_3_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_3_1/Module.bsl @@ -1,12 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК КАНАЛОВ СООБЩЕНИЙ ДЛЯ ВЕРСИИ 1.0.3.1 ИНТЕРФЕЙСА СООБЩЕНИЙ -// УПРАВЛЕНИЯ РЕЗЕРВНЫМ КОПИРОВАНИЕМ ОБЛАСТЕЙ ДАННЫХ -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает пространство имен версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - наименование пакета. +// Функция Пакет() Экспорт Возврат "http://www.1c.ru/SaaS/ManageZonesBackup/" + Версия(); @@ -14,6 +12,10 @@ КонецФункции // Возвращает версию интерфейса сообщений, обслуживаемую обработчиком. +// +// Возвращаемое значение: +// Строка - версия пакета. +// Функция Версия() Экспорт Возврат "1.0.3.1"; @@ -21,6 +23,10 @@ КонецФункции // Возвращает базовый тип для сообщений версии. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тел сообщений в модели сервиса. +// Функция БазовыйТип() Экспорт Возврат СообщенияВМоделиСервисаПовтИсп.ТипТело(); @@ -30,9 +36,9 @@ // Выполняет обработку входящих сообщений модели сервиса. // // Параметры: -// Сообщение - ОбъектXDTO, входящее сообщение, -// Отправитель - ПланОбменаСсылка.ОбменСообщениями, узел плана обмена, соответствующий отправителю сообщения. -// СообщениеОбработано - булево, флаг успешной обработки сообщения. Значение данного параметра необходимо +// Сообщение - ОбъектXDTO - входящее сообщение, +// Отправитель - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, соответствующий отправителю сообщения. +// СообщениеОбработано - Булево - флаг успешной обработки сообщения. Значение данного параметра необходимо // установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. // Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт diff --git a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемРеализация/Module.bsl index 364870bc4..8e50adefa 100644 --- a/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемРеализация/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправлениеРезервнымКопированиемРеализация/Module.bsl @@ -1,17 +1,12 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБЩАЯ РЕАЛИЗАЦИЯ ОБРАБОТКИ СООБЩЕНИЙ УПРАВЛЕНИЯ РЕЗЕРВНЫМ КОПИРОВАНИЕМ -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработка входящих сообщений с типом {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}PlanZoneBackup. // // Параметры: -// КодОбластиДанных - число(7,0), -// ИдентификаторРезервнойКопии - УникальныйИдентификатор, -// МоментВремениРезервнойКопии - дата (дата и время), -// Принудительно - булево, флаг принудительного создания резервной копии. +// КодОбластиДанных - Число - код области данных, +// ИдентификаторРезервнойКопии - УникальныйИдентификатор - идентификатор резервной копии, +// МоментРезервнойКопии - Дата - дата и время резервной копии, +// Принудительно - Булево - флаг принудительного создания резервной копии. // Процедура ПланироватьСозданиеРезервнойКопииОбласти(Знач КодОбластиДанных, Знач ИдентификаторРезервнойКопии, Знач МоментРезервнойКопии, @@ -33,8 +28,8 @@ // Обработка входящих сообщений с типом {http://www.1c.ru/SaaS/ManageZonesBackup/a.b.c.d}CancelZoneBackup. // // Параметры: -// КодОбластиДанных - число(7,0), -// ИдентификаторРезервнойКопии - УникальныйИдентификатор. +// КодОбластиДанных - Число - код области данных, +// ИдентификаторРезервнойКопии - УникальныйИдентификатор - идентификатор резервной копии. // Процедура ОтменитьСозданиеРезервнойКопииОбласти(Знач КодОбластиДанных, Знач ИдентификаторРезервнойКопии) Экспорт diff --git a/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/Module.bsl deleted file mode 100644 index 9c9c215ef..000000000 --- a/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/Module.bsl +++ /dev/null @@ -1,76 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИК ИНТЕРФЕЙСА СООБЩЕНИЙ УПРАВЛЕНИЯ ПРИЛОЖЕНИЯМИ -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. -Функция Пакет() Экспорт - - Возврат "http://www.1c.ru/1cFresh/ManageApplication/Messages/1.0"; - -КонецФункции - -// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. -Функция Версия() Экспорт - - Возврат "1.0.0.1"; - -КонецФункции - -// Возвращает название программного интерфейса сообщений. -Функция ПрограммныйИнтерфейс() Экспорт - - Возврат "ManageApplicationMessages"; - -КонецФункции - -// Выполняет регистрацию обработчиков сообщений в качестве обработчиков каналов обмена сообщениями. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт - -КонецПроцедуры - -// Выполняет регистрацию обработчиков трансляции сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт - -КонецПроцедуры - -// Возвращает тип сообщения {http://www.1c.ru/1cFresh/ManageApplication/Messages/a.b.c.d}RevokeUserAccess. -// -// Параметры: -// ИспользуемыйПакет - строка, пространство имен версии интерфейса сообщений, для которой -// получается тип сообщения. -// -// Возвращаемое значение: -// ТипXDTO -// -Функция СообщениеАннулироватьДоступПользователя(Знач ИспользуемыйПакет = Неопределено) Экспорт - - Возврат СоздатьТипСообщения(ИспользуемыйПакет, "RevokeUserAccess"); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция СоздатьТипСообщения(Знач ИспользуемыйПакет, Знач Тип) - - Если ИспользуемыйПакет = Неопределено Тогда - ИспользуемыйПакет = Пакет(); - КонецЕсли; - - Возврат ФабрикаXDTO.Тип(ИспользуемыйПакет, Тип); - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/СообщенияУправленияПриложениямиИнтерфейс.mdo b/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/СообщенияУправленияПриложениямиИнтерфейс.mdo deleted file mode 100644 index 2cf9c4c4d..000000000 --- a/SSL/src/CommonModules/СообщенияУправленияПриложениямиИнтерфейс/СообщенияУправленияПриложениямиИнтерфейс.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - СообщенияУправленияПриложениямиИнтерфейс - - ru - Сообщения управления приложениями интерфейс - - true - true - true - diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl index 8ef22fba4..d32132f4a 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl @@ -1,81 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Возвращает структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации, т.е. в обработчиках событий. -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы. -// -Функция ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт - - ЗапомнитьВременныеПараметры(Параметры); - ОбработатьПараметрыКлиентаНаСервере(Параметры); - - Если Параметры.ПолученныеПараметрыКлиента <> Неопределено Тогда - Если НЕ Параметры.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда - // Обновить состояние скрытия рабочего стола, если при предыдущем - // запуске произошел сбой до момента штатного восстановления. - СкрытьРабочийСтолПриНачалеРаботыСистемы(Неопределено); - КонецЕсли; - КонецЕсли; - - Если НЕ СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Тогда - // Фиксируем текущую дату непосредственно перед самым возвратом на клиент. - Параметры.Вставить("ТекущаяУниверсальнаяДатаВМиллисекундахНаСервере", ТекущаяУниверсальнаяДатаВМиллисекундах()); - Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); - КонецЕсли; - - ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Неопределено, Ложь); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); - КонецЦикла; - - ПрикладныеПараметры = Новый Структура; - ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске(ПрикладныеПараметры); - - Для Каждого Параметр Из ПрикладныеПараметры Цикл - Параметры.Вставить(Параметр.Ключ, Параметр.Значение); - КонецЦикла; - - // Фиксируем текущую дату непосредственно перед самым возвратом на клиент. - Параметры.Вставить("ТекущаяУниверсальнаяДатаВМиллисекундахНаСервере", ТекущаяУниверсальнаяДатаВМиллисекундах()); - Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); - -КонецФункции - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -Функция ПараметрыРаботыКлиента() Экспорт - - Параметры = Новый Структура; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиента(Параметры); - КонецЦикла; - - ПрикладныеПараметры = Новый Структура; - ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента(ПрикладныеПараметры); - - Для Каждого Параметр Из ПрикладныеПараметры Цикл - Параметры.Вставить(Параметр.Ключ, Параметр.Значение); - КонецЦикла; - - Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); - -КонецФункции - // Устанавливает состояние отмены при создании форм рабочего стола. // Требуется, если при запуске программы возникает необходимость // взаимодействия с пользователем (интерактивная обработка). @@ -161,36 +85,110 @@ #Область СлужебныеПроцедурыИФункции -// Только для внутреннего использования. -Процедура ПриОшибкеПолученияОбработчиковСобытия() Экспорт +// Возвращает структуру параметров, необходимых для работы клиентского кода конфигурации +// при запуске, т.е. в обработчиках событий ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы. +// +// Только для вызова из СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске. +// +Функция ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт - Если НЕ МонопольныйРежим() И ТранзакцияАктивна() Тогда - Возврат; - КонецЕсли; + НовыеПараметры = Новый Структура; + ДобавитьПоправкиКВремени(НовыеПараметры, Параметры); - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - // Автообновление кэша. Обновление повторно используемых значений требуется. - - Если НЕ МонопольныйРежим() Тогда - Попытка - УстановитьМонопольныйРежим(Истина); - Исключение - Возврат; - КонецПопытки; + ЗапомнитьВременныеПараметры(Параметры); + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Параметры, НовыеПараметры); + + ОбработатьПараметрыКлиентаНаСервере(Параметры); + + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено Тогда + Если НЕ Параметры.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда + // Обновить состояние скрытия рабочего стола, если при предыдущем + // запуске произошел сбой до момента штатного восстановления. + СкрытьРабочийСтолПриНачалеРаботыСистемы(Неопределено); КонецЕсли; - - Попытка - Константы.ПараметрыСлужебныхСобытий.СоздатьМенеджерЗначения().Обновить(); - Исключение - УстановитьМонопольныйРежим(Ложь); - ОбновитьПовторноИспользуемыеЗначения(); - ВызватьИсключение; - КонецПопытки; - - ОбновитьПовторноИспользуемыеЗначения(); КонецЕсли; + Если НЕ СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Тогда + Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); + КонецЕсли; + + ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Неопределено, Ложь); + + ИнтеграцияСтандартныхПодсистем.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + + ПрикладныеПараметры = Новый Структура; + ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске(ПрикладныеПараметры); + Для Каждого Параметр Из ПрикладныеПараметры Цикл + Параметры.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЦикла; + + ПрикладныеПараметры = Новый Структура; + ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(ПрикладныеПараметры); + Для Каждого Параметр Из ПрикладныеПараметры Цикл + Параметры.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЦикла; + + Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); + +КонецФункции + +// Возвращает структуру параметров, необходимых для работы клиентского кода конфигурации. +// Только для вызова из СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента. +// +Функция ПараметрыРаботыКлиента(СвойстваКлиента) Экспорт + + Параметры = Новый Структура; + ДобавитьПоправкиКВремени(Параметры, СвойстваКлиента); + + ИнтеграцияСтандартныхПодсистем.ПриДобавленииПараметровРаботыКлиента(Параметры); + + ПрикладныеПараметры = Новый Структура; + ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента(ПрикладныеПараметры); + Для Каждого Параметр Из ПрикладныеПараметры Цикл + Параметры.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЦикла; + + ПрикладныеПараметры = Новый Структура; + ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента(ПрикладныеПараметры); + Для Каждого Параметр Из ПрикладныеПараметры Цикл + Параметры.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЦикла; + + Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); + +КонецФункции + +// См. РаботаВМоделиСервиса.УстановитьРазделениеСеанса. +Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Использование, ОбластьДанных); + КонецЕсли; + +КонецПроцедуры + +// Проверяет право на отключение логики работы системы и +// скрывает рабочий стол на сервере, если право есть, +// в противном случае вызывает исключение. +// +Процедура ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы() Экспорт + + СкрытьРабочийСтолПриНачалеРаботыСистемы(Истина); + + ВходВОбластьДанных = ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); + + Если Не ВходВОбластьДанных + И Не ПравоДоступа("Администрирование", Метаданные) + Или ВходВОбластьДанных + И Не ПравоДоступа("АдминистрированиеДанных", Метаданные) Тогда + + ВызватьИсключение НСтр("ru = 'Недостаточно прав для работы с отключенной логикой работы системы.'"); + КонецЕсли; + + ПользователиСлужебный.ПроверитьПраваТекущегоПользователяПриВходе(); + КонецПроцедуры // Только для внутреннего использования. @@ -224,21 +222,18 @@ // Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт - // СтандартныеПодсистемы.БазоваяФункциональность - КонтрольДинамическогоОбновленияКонфигурацииСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры); - // Конец СтандартныеПодсистемы.БазоваяФункциональность + Параметры.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически() + Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически()); - // СтандартныеПодсистемы.Пользователи ПользователиСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры); - // Конец СтандартныеПодсистемы.Пользователи - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); МодульЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры.ЦентрМониторинга); КонецЕсли; - + КонецПроцедуры // Возвращает полное имя объекта метаданных по его типу. @@ -250,6 +245,21 @@ Возврат ОбъектМетаданных.ПолноеИмя(); КонецФункции +// Возвращает имя объекта метаданных по типу. +// +// Параметры: +// Источник - Тип - объект. +// +// Возвращаемое значение: +// Строка. +Функция ИмяОбъектаМетаданных(Тип) Экспорт + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ОбъектМетаданных.Имя; +КонецФункции + // См. СтандартныеПодсистемыСервер.ВерсияБиблиотеки. Функция ВерсияБиблиотеки() Экспорт @@ -265,13 +275,26 @@ // Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного) Экспорт - Возврат СтандартныеПодсистемыПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); + Возврат СтандартныеПодсистемыСервер.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); КонецФункции //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +Процедура ДобавитьПоправкиКВремени(Параметры, СвойстваКлиента) + + ДатаСеанса = ТекущаяДатаСеанса(); + ДатаСеансаУниверсальная = УниверсальноеВремя(ДатаСеанса, ЧасовойПоясСеанса()); + + Параметры.Вставить("ПоправкаКВремениСеанса", ДатаСеанса - СвойстваКлиента.ТекущаяДатаНаКлиенте); + Параметры.Вставить("ПоправкаКУниверсальномуВремени", ДатаСеансаУниверсальная - ДатаСеанса); + Параметры.Вставить("СмещениеСтандартногоВремени", СмещениеСтандартногоВремени(ЧасовойПоясСеанса())); + Параметры.Вставить("СмещениеДатыКлиента", ТекущаяУниверсальнаяДатаВМиллисекундах() + - СвойстваКлиента.ТекущаяУниверсальнаяДатаВМиллисекундахНаКлиенте); + +КонецПроцедуры + Процедура ЗапомнитьВременныеПараметры(Параметры) Параметры.Вставить("ИменаВременныхПараметров", Новый Массив); @@ -308,7 +331,7 @@ ОбновлениеИнформационнойБазыСлужебный.УстановитьЗапускОбновленияИнформационнойБазы(Истина); КонецЕсли; - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Если ПланыОбмена.ГлавныйУзел() <> Неопределено Или ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда // Предотвращение случайного обновления предопределенных данных в подчиненном узле РИБ: diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl index 0306909b3..7f45c27e6 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Вызывается каждые 20 минут, например, для контроля динамического обновления и @@ -38,8 +33,7 @@ // Вызывается после запуска конфигурации, открывает окно предупреждения безопасности. Процедура ПоказатьПредупреждениеБезопасностиПослеЗапуска() Экспорт - МодульПользователиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПользователиСлужебныйКлиент"); - МодульПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(); + ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(); КонецПроцедуры // Показывает сообщение пользователю о недостаточном объеме оперативной памяти. @@ -52,12 +46,12 @@ // Процедура ПоказатьПредупрежденияПриЗавершенииРаботы() Экспорт Предупреждения = СтандартныеПодсистемыКлиент.ПараметрКлиента("ПредупрежденияПриЗавершенииРаботы"); - Пояснение = НСтр("ru = 'Выполнить дополнительные действия и завершить работу'"); + Пояснение = НСтр("ru = 'и выполнить дополнительные действия'"); Если Предупреждения.Количество() = 1 И Не ПустаяСтрока(Предупреждения[0].ТекстГиперссылки) Тогда Пояснение = Предупреждения[0].ТекстГиперссылки; КонецЕсли; - ПоказатьОповещениеПользователя(, "e1cib/command/ОбщаяКоманда.ПредупрежденияПриЗавершенииРаботы", - Пояснение, БиблиотекаКартинок.Информация32); + ПоказатьОповещениеПользователя(НСтр("ru = 'Нажмите, чтобы завершить работу'"), "e1cib/command/ОбщаяКоманда.ПредупрежденияПриЗавершенииРаботы", + Пояснение, БиблиотекаКартинок.ЗавершитьРаботу); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl index 241cfb35d..40edd2daa 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl @@ -1,13 +1,5 @@ - -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции интерактивной работы. - // Устанавливает заголовок главного окна приложения, используя значение константы // ЗаголовокПриложения и заголовок приложения по умолчанию. // @@ -16,8 +8,8 @@ // Процедура УстановитьРасширенныйЗаголовокПриложения(ПриЗапуске = Ложь) Экспорт - ПараметрыКлиента = ?(ПриЗапуске, СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(), - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента()); + ПараметрыКлиента = ?(ПриЗапуске, ПараметрыРаботыКлиентаПриЗапуске(), + ПараметрыРаботыКлиента()); Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда ПредставлениеЗаголовка = ПараметрыКлиента.ЗаголовокПриложения; @@ -44,7 +36,7 @@ ОбщегоНазначенияКлиентПереопределяемый.ПриУстановкеЗаголовкаКлиентскогоПриложения(ЗаголовокПриложения, ПриЗапуске); - УстановитьЗаголовокКлиентскогоПриложения(ЗаголовокПриложения); + КлиентскоеПриложение.УстановитьЗаголовок(ЗаголовокПриложения); КонецПроцедуры @@ -147,7 +139,7 @@ Параметры.Вставить("КнопкаПоУмолчанию", Неопределено); Параметры.Вставить("Таймаут", 0); Параметры.Вставить("КнопкаТаймаута", Неопределено); - Параметры.Вставить("Заголовок", ПолучитьЗаголовокКлиентскогоПриложения()); + Параметры.Вставить("Заголовок", КлиентскоеПриложение.ПолучитьЗаголовок()); Параметры.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Истина); Параметры.Вставить("БольшеНеЗадаватьЭтотВопрос", Ложь); Параметры.Вставить("БлокироватьВесьИнтерфейс", Ложь); @@ -159,6 +151,10 @@ // Вызывается при необходимости открыть форму списка активных пользователей, // которые в данный момент времени работают с системой. // +// Параметры: +// ПараметрыФормы - Структура - См. описание параметра Параметры метода ОткрытьФорму в синтакс-помощнике. +// ВладелецФормы - УправляемаяФорма - См. описание параметра Владелец метода ОткрытьФорму в синтакс-помощнике. +// Процедура ОткрытьСписокАктивныхПользователей(ПараметрыФормы = Неопределено, ВладелецФормы = Неопределено) Экспорт Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда @@ -178,9 +174,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Запуск и завершение работы. - // Отключает выдачу предупреждения пользователю при завершении работы программы. // Процедура ПропуститьПредупреждениеПередЗавершениемРаботыСистемы() Экспорт @@ -211,6 +204,8 @@ ПараметрыПриложения = Новый Соответствие; КонецЕсли; + ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ОценкаПроизводительности.ВремяНачалаЗапуска", ВремяНачала); + Если ОповещениеЗавершения <> Неопределено Тогда ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы", "ОповещениеЗавершения", ОповещениеЗавершения, Тип("ОписаниеОповещения")); @@ -238,44 +233,27 @@ ОбновитьПараметрыРаботыКлиента(Параметры, Истина, ОповещениеЗавершения <> Неопределено); + // Подготовка перехода к следующей процедуре. Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПроверкиВерсииПлатформы", ЭтотОбъект, Параметры)); + "ДействияПередНачаломРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект, Параметры)); Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда - СкрытьРабочийСтолПриНачалеРаботыСистемы(); - Возврат; - КонецЕсли; - - Попытка - ПользователиСлужебныйКлиент.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Попытка - ОбновлениеИнформационнойБазыКлиент.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ПроверитьВерсиюПлатформыПриЗапуске(Параметры); - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Попытка + СтандартныеПодсистемыВызовСервера.ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( + Параметры, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + СкрытьРабочийСтолПриНачалеРаботыСистемы(Истина, Истина); Возврат; КонецЕсли; ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); - МодульОценкаПроизводительностиКлиент.НачатьЗамерВремениСоСмещением(ВремяНачала, Истина, "ОбщееВремяЗапускаПриложения"); - КонецЕсли; - КонецПроцедуры // Выполнить стандартные действия при начале работы пользователя @@ -298,6 +276,10 @@ // Процедура ПриНачалеРаботыСистемы(Знач ОповещениеЗавершения = Неопределено, НепрерывноеВыполнение = Истина) Экспорт + Если ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() Тогда + Возврат; + КонецЕсли; + Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда Возврат; КонецЕсли; @@ -309,10 +291,6 @@ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", "НепрерывноеВыполнение", НепрерывноеВыполнение, Тип("Булево")); - Если ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() Тогда - Возврат; - КонецЕсли; - Параметры = Новый Структура; // Внешние параметры описания результата. @@ -331,9 +309,8 @@ "ДействияПриНачалеРаботыСистемыОбработкаЗавершения", ЭтотОбъект, Параметры)); // Подготовка перехода к следующей процедуре. - Параметры.Вставить("НомерСледующегоОбработчика", 1); Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПриНачалеРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); + "ДействияПриНачалеРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект, Параметры)); Попытка УстановитьРасширенныйЗаголовокПриложения(Истина); // Для главного окна. @@ -344,7 +321,7 @@ Возврат; КонецЕсли; Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); КонецПопытки; Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда Возврат; @@ -364,6 +341,7 @@ // для обработчика события ПередЗавершениемРаботыСистемы, либо программного отказа, // либо потребовалась интерактивная обработка. В случае успешного взаимодействия // с пользователем, завершение работы будет продолжено. +// ТекстПредупреждения - Строка - см. ПередЗавершениемРаботыСистемы() в синтакс-помощнике. // Процедура ПередЗавершениемРаботыСистемы(Отказ = Ложь, ТекстПредупреждения = "") Экспорт @@ -403,14 +381,7 @@ КонецЕсли; Предупреждения = Новый Массив; - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистемКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); Если Предупреждения.Количество() = 0 Тогда @@ -436,30 +407,41 @@ КонецПроцедуры // Возвращает новую структуру параметров для вывода предупреждения перед завершением работы программы. +// Для использования в ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. // // Возвращаемое значение: // Структура - со свойствами: -// ТекстФлажка - Строка - текст флажка. -// ПоясняющийТекст - Строка - текст, выводимый в форме сверху управляющего элемента (флажок или гиперссылка). -// ТекстПредупреждения - Строка - текст, выводимый в платформенном окне при завершении работы. -// ТекстГиперссылки - Строка - текст гиперссылки. +// ТекстПредупреждения - Строка - текст, выводимый в окне веб-браузера (или тонкого клиента) при завершении работы. +// Например, "Имеются редактируемые файлы, которые не помещены в программу". +// Остальные параметры определяют внешний вид формы предупреждений, +// открываемой после подтверждения в окне веб-браузера (или тонкого клиента). +// ТекстФлажка - Строка - если задан, то в форме предупреждений выводится флажок с указанным текстом. +// Например, "Завершить редактирование файлов (5)". +// ПоясняющийТекст - Строка - текст, выводимый в форме сверху управляющего элемента (флажок или гиперссылка). +// Например, "Редактируемые файлы, не помещенные в программу". +// ТекстГиперссылки - Строка - если задан, то выводится гиперссылка с указанным текстом. +// Например, "Редактируемые файлы (5)". // РасширеннаяПодсказка - Строка - текст подсказки, выводимый по кнопке справа от управляющего элемента (флажок или -// гиперссылка). -// Приоритет - Число - определяет относительный порядок вывода предупреждений в форме (чем больше, тем выше). +// гиперссылка). Например, "Нажмите для перехода к списку файлов, +// открытых для редактирования". +// Приоритет - Число - относительный порядок в списке предупреждений на форме (чем больше, тем выше). // ВывестиОдноПредупреждение - Булево - если Истина, то в списке предупреждений выводится только одно это -// предупреждение. -// ДействиеПриУстановленномФлажке - Структура с полями: -// * Форма - Строка - путь к открываемой форме. -// * ПараметрыФормы - Структура - произвольная структура параметров формы Форма. -// ДействиеПриНажатииГиперссылки - Структура с полями: +// предупреждение. Т.е. такое предупреждение не совместимо с любыми другими. +// ДействиеПриУстановленномФлажке - Структура со свойствами: +// * Форма - Строка - если пользователь установил флажок, то следует открыть указанную форму. +// Например, "Обработка.Файлы.РедактируемыеФайлы". +// * ПараметрыФормы - Структура - произвольная структура параметров для открытия формы. +// ДействиеПриНажатииГиперссылки - Структура со свойствами: // * Форма - Строка - путь к форме, которая должна открываться по нажатию на гиперссылку. -// * ПараметрыФормы - Структура - произвольная структура параметров для вышеописанной формы. +// Например, "Обработка.Файлы.РедактируемыеФайлы". +// * ПараметрыФормы - Структура - произвольная структура параметров для открываемой формы. // * ПрикладнаяФормаПредупреждения - Строка - путь к форме, которая должна открываться сразу // вместо универсальной формы в случае, когда в списке // предупреждений оказывается только одно данное предупреждение. +// Например, "Обработка.Файлы.РедактируемыеФайлы". // * ПараметрыПрикладнойФормыПредупреждения - Структура - произвольная структура // параметров для вышеописанной формы. -// * РежимОткрытияОкна - РежимОткрытияОкнаФормы - Содержит варианты открытия управляемой формы. +// * РежимОткрытияОкна - РежимОткрытияОкнаФормы - режим открытия форм Форма или ПрикладнаяФормаПредупреждения. // Функция ПредупреждениеПриЗавершенииРаботы() Экспорт @@ -489,17 +471,72 @@ КонецФункции +// Возвращает значения параметров, необходимых для работы клиентского кода +// при запуске конфигурации за один серверный вызовов (для минимизации клиент-серверного взаимодействия +// и снижения времени запуска). +// С помощью этой функции можно обращаться к параметрам в клиентском коде, вызываемом из обработчиков событий: +// - ПередНачаломРаботыСистемы, +// - ПриНачалеРаботыСистемы. +// +// В этих обработчиках, при запуске недопустимо использовать команды сброса кэша +// повторно используемых модулей, иначе запуск может привести +// к непредсказуемым ошибкам и лишним серверным вызовам. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - параметры работы клиента при запуске. +// Состав свойств см. в ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. +// +// +Функция ПараметрыРаботыКлиентаПриЗапуске() Экспорт + + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + +КонецФункции + +// Возвращает значения параметров, необходимых для работы клиентского кода конфигурации +// без дополнительных серверных вызовов. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - параметры работы клиента. +// Состав свойств см. в ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +// +Функция ПараметрыРаботыКлиента() Экспорт + + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + +КонецФункции + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -Функция ПараметрКлиента(ИмяПараметра = Неопределено) Экспорт - ИмяГлобальногоПараметра = "СтандартныеПодсистемы.ПараметрыКлиента"; - Если ИмяПараметра = Неопределено Тогда - Возврат ПараметрыПриложения[ИмяГлобальногоПараметра]; - Иначе - Возврат ПараметрыПриложения[ИмяГлобальногоПараметра][ИмяПараметра]; +Функция ЗапускПрограммыЗавершен() Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ЗапускПрограммыЗавершен"; + Если ПараметрыПриложения[ИмяПараметра] = Истина Тогда + Возврат Истина; КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ПараметрКлиента(ИмяПараметра = Неопределено) Экспорт + + ИмяГлобальногоПараметра = "СтандартныеПодсистемы.ПараметрыКлиента"; + ПараметрыКлиента = ПараметрыПриложения[ИмяГлобальногоПараметра]; + + Если ПараметрыКлиента = Неопределено Тогда + // Заполнение постоянных параметров клиента. + СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + КонецЕсли; + + Если ИмяПараметра = Неопределено Тогда + Возврат ПараметрыКлиента; + Иначе + Возврат ПараметрыКлиента[ИмяПараметра]; + КонецЕсли; + КонецФункции Процедура УстановитьПараметрКлиента(ИмяПараметра, Значение) Экспорт @@ -509,14 +546,11 @@ Процедура ЗаполнитьПараметрыКлиента(ПараметрыКлиента) Экспорт - ТекущаяУниверсальнаяДатаВМиллисекундахНаКлиенте = ТекущаяУниверсальнаяДатаВМиллисекундах(); - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыКлиента"; Если ТипЗнч(ПараметрыПриложения[ИмяПараметра]) <> Тип("Структура") Тогда ПараметрыПриложения[ИмяПараметра] = Новый Структура; ПараметрыПриложения[ИмяПараметра].Вставить("РазделениеВключено"); ПараметрыПриложения[ИмяПараметра].Вставить("ИнформационнаяБазаФайловая"); - ПараметрыПриложения[ИмяПараметра].Вставить("ОбработчикиКлиентскихСобытий"); ПараметрыПриложения[ИмяПараметра].Вставить("ЭтоСеансВнешнегоПользователя"); ПараметрыПриложения[ИмяПараметра].Вставить("АвторизованныйПользователь"); ПараметрыПриложения[ИмяПараметра].Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы"); @@ -533,7 +567,6 @@ КонецЕсли; ЗаполнитьЗначенияСвойств(ПараметрыПриложения[ИмяПараметра], ПараметрыКлиента); - ПараметрыПриложения[ИмяПараметра]["СмещениеДатыКлиента"] = ПараметрыКлиента.ТекущаяУниверсальнаяДатаВМиллисекундахНаСервере - ТекущаяУниверсальнаяДатаВМиллисекундахНаКлиенте; КонецПроцедуры @@ -633,7 +666,7 @@ ШаблонИмениФайла = "1cv8[ТонкийКлиент][УчебнаяПлатформа].exe"; - ЭтоУчебнаяПлатформа = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ЭтоУчебнаяПлатформа; + ЭтоУчебнаяПлатформа = ПараметрыРаботыКлиентаПриЗапуске().ЭтоУчебнаяПлатформа; #Если ТонкийКлиент Тогда ЭтоТонкийКлиент = Не ПолучитьФайлаКонфигуратора; @@ -654,7 +687,6 @@ // Процедура УстановитьХранениеФормы(Форма, Хранение) Экспорт -#Если ВебКлиент Тогда Хранилище = ПараметрыПриложения["СтандартныеПодсистемы.ВременноеХранилищеСсылокНаУправляемыеФормы"]; Если Хранилище = Неопределено Тогда Хранилище = Новый Соответствие; @@ -666,8 +698,7 @@ ИначеЕсли Хранилище.Получить(Форма) <> Неопределено Тогда Хранилище.Удалить(Форма); КонецЕсли; -#КонецЕсли - + КонецПроцедуры // Проверяет, что текущие данные определены и не являются группировкой. @@ -709,19 +740,16 @@ //////////////////////////////////////////////////////////////////////////////// // Табличный документ -// На сервере рассчитывает сумму, среднее и прочие показатели по числовым ячейкам табличного документа -// и показывает результаты расчетов. +// Рассчитывает сумму, среднее и прочие показатели по числовым ячейкам табличного документа +// и показывает результаты расчетов. +// См. также СтандартныеПодсистемыКлиентСервер.РасчетЯчеек. // // Параметры: // Форма - УправляемаяФорма, Неопределено - Форма-владелец, из которой осуществляется открытие формы. // ТабличныйДокумент - ТабличныйДокумент - Таблица, для которой выполняются расчеты. // ВыделенныеОбласти - Неопределено, Массив - Необязательный. Области документа, которые требуется рассчитать. -// - Неопределено - Значение по умолчанию. Расчет будет произведен по областям, выделенным интерактивно. -// - Массив - Массив областей, для которых требуется расчет. -// Состав аналогичен возвращаемому значению функции СтандартныеПодсистемыКлиент.ВыделенныеОбласти(). -// -// См. также: -// СтандартныеПодсистемыКлиентСервер.РасчетЯчеек(). +// Если Неопределено, то расчет будет произведен по областям, выделенным интерактивно. +// См. возвращаемое значение функции СтандартныеПодсистемыКлиент.ВыделенныеОбласти. // Процедура ПоказатьРасчетЯчеек(Форма, ТабличныйДокумент, ВыделенныеОбласти = Неопределено) Экспорт Если ВыделенныеОбласти = Неопределено Тогда @@ -734,60 +762,6 @@ ОткрытьФорму("ОбщаяФорма.ПоказателиВыделенныхЯчеек", ПараметрыФормы, Форма, Истина, , , , РежимОкна); КонецПроцедуры -// Формирует описание выделенных областей табличного документа, которое можно передавать на сервер. -// Служит заменой типа ВыделенныеОбластиТабличногоДокумента -// когда нужно вычислить сумму ячеек на сервере без контекста. -// -// Параметры: -// ТабличныйДокумент - ТабличныйДокумент - Таблица, для которой нужно сформировать описание выделенных ячеек. -// -// Возвращаемое значение: -// Массив из Структура - описание. -// * Верх - Число - Номер строки верхней границы области. -// * Низ - Число - Номер строки нижней границы области. -// * Лево - Число - Номер колонки верхней границы области. -// * Право - Число - Номер колонки нижней границы области. -// * ТипОбласти - ТипОбластиЯчеекТабличногоДокумента - Колонки, Прямоугольник, Строки, Таблица. -// -// См. также: -// СтандартныеПодсистемыВызовСервера.РасчетЯчеек(). -// -Функция ВыделенныеОбласти(ТабличныйДокумент) - Результат = Новый Массив; - Для Каждого ВыделеннаяОбласть Из ТабличныйДокумент.ВыделенныеОбласти Цикл - Если ТипЗнч(ВыделеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда - Продолжить; - КонецЕсли; - Структура = Новый Структура("Верх, Низ, Лево, Право, ТипОбласти"); - ЗаполнитьЗначенияСвойств(Структура, ВыделеннаяОбласть); - Результат.Добавить(Структура); - КонецЦикла; - Возврат Результат; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Открывает форму ввода пароля пользователя сервиса. -// -// Параметры: -// ОбработкаПродолжения - ОписаниеОповещения, которое нужно обработать после получения пароля. -// ФормаВладелец - Неопределено, УправляемаяФорма - форма, которая запрашивает пароль. -// ПарольПользователяСервиса - Строка - текущий пароль пользователя сервиса. -// -Процедура ПриЗапросеПароляДляАутентификацииВСервисе(ОбработкаПродолжения, ФормаВладелец = Неопределено, ПарольПользователяСервиса = Неопределено) Экспорт - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - - МодульПользователиСлужебныйВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( - "ПользователиСлужебныйВМоделиСервисаКлиент"); - - МодульПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе( - ОбработкаПродолжения, ФормаВладелец, ПарольПользователяСервиса); - КонецЕсли; - -КонецПроцедуры - // Переадресует оповещение без результата на оповещение с результатом. Функция ОповещениеБезРезультата(ОповещениеСРезультатом) Экспорт @@ -845,8 +819,8 @@ // // Параметры: // Форма - УправляемаяФорма - форма, на которой размещен элемент управления с деревом значений. -// ИмяЭлементаФормы - Строка - имя элемента с таблицей формы (деревом значений) и связанного с ней реквизита формы -// (должны совпадать). +// ИмяЭлементаФормы - Строка - имя элемента с таблицей формы (деревом значений) и связанного с ней +// реквизита формы (должны совпадать). // ИдентификаторСтрокиДерева - Произвольный - идентификатор строки дерева, которую требуется развернуть. // Если указано "*", то будут развернуты все узлы верхнего уровня. // Если указано Неопределено, то строки дерева развернуты не будут. @@ -950,23 +924,29 @@ // Используется только для Windows. Функция ПапкаСистемныхПриложений() Экспорт - Shell = Новый COMОбъект("Shell.Application"); - - СистемнаяИнформация = Новый СистемнаяИнформация; - Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда - // Для 32-битной системы "C:\Windows\System32". - // Для 64-битной системы "C:\Windows\SysWOW64". - Folder = Shell.Namespace(41); - Возврат Folder.Self.Path + "\"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - // Для любой системы "C:\Windows\System32". - Folder = Shell.Namespace(37); - Возврат Folder.Self.Path + "\"; - КонецЕсли; + Попытка + + Shell = Новый COMОбъект("Shell.Application"); + + СистемнаяИнформация = Новый СистемнаяИнформация; + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда + // Для 32-битной системы "C:\Windows\SysWOW64". + // Для 64-битной системы "C:\Windows\System32". + Folder = Shell.Namespace(41); + Возврат Folder.Self.Path + "\"; + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + // Для любой системы "C:\Windows\System32". + Folder = Shell.Namespace(37); + Возврат Folder.Self.Path + "\"; + КонецЕсли; + + Исключение + Возврат ""; + КонецПопытки; КонецФункции -// Шапка файла для технической поддержки +// Шапка файла для технической поддержки. Функция ИнформацияДляПоддержки() Экспорт Текст = НСтр("ru = 'Название программы: [НазваниеПрограммы] @@ -982,7 +962,7 @@ |Конфигурация изменена: [КонфигурацияИзменена] |'"); - Параметры = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + Параметры = ПараметрыРаботыКлиента(); СистемнаяИнформация = Новый СистемнаяИнформация; @@ -1014,113 +994,24 @@ // ПередНачаломРаботыСистемы // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеПроверкиВерсииПлатформы(Неопределен, Параметры) Экспорт +Процедура ДействияПередНачаломРаботыСистемыВИнтеграционнойПроцедуре(Неопределен, Параметры) Экспорт - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеВосстановленияСвязиСГлавнымУзлом", ЭтотОбъект, Параметры)); + "ДействияПередНачаломРаботыСистемыВМодуляхИнтеграционнойПроцедуры", ЭтотОбъект, Параметры)); + Параметры.Вставить("ИндексТекущегоМодуля", 0); + Параметры.Вставить("ДобавленныеМодули", Новый Массив); Попытка - ПроверитьНеобходимостьВосстановленияСвязиСГлавнымУзлом(Параметры); + Параметры.Вставить("Модули", Новый Массив); + ИнтеграцияСтандартныхПодсистемКлиент.ПередНачаломРаботыСистемы(Параметры); + Параметры.Вставить("ДобавленныеМодули", Параметры.Модули); + Параметры.Удалить("Модули"); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеВосстановленияСвязиСГлавнымУзлом(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - - Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); - Попытка - МодульРаботаВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВМоделиСервисаКлиент"); - МодульРаботаВМоделиСервисаКлиент.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПроверкиЛегальности", ЭтотОбъект, Параметры)); - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует( - "СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда - - Попытка - МодульПроверкаЛегальностиПолученияОбновленияКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); - - МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновленияПриЗапуске(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеПроверкиЛегальности(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПовторенияЗагрузкиСообщенияОбменаДанными", ЭтотОбъект, Параметры)); - - Попытка - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - // Запрос у пользователя с или без повтора загрузки сообщения обмена данными. - МодульОбменДаннымиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиКлиент"); - МодульОбменДаннымиКлиент.ПередНачаломРаботыСистемы(Параметры); - КонецЕсли; - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеПовторенияЗагрузкиСообщенияОбменаДанными(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПроверкиСтатусаОтложенногоОбновления", ЭтотОбъект, Параметры)); - - Попытка - ОбновлениеИнформационнойБазыКлиент.ПроверитьСтатусОбработчиковОтложенногоОбновления(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); КонецПопытки; Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда Возврат; @@ -1131,101 +1022,38 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеПроверкиСтатусаОтложенногоОбновления(Неопределен, Параметры) Экспорт +Процедура ДействияПередНачаломРаботыСистемыВМодуляхИнтеграционнойПроцедуры(Неопределен, Параметры) Экспорт - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеОбновленияПараметровРаботыПрограммы", ЭтотОбъект, Параметры)); - Иначе - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПереопределяемойПроцедуры", ЭтотОбъект, Параметры)); + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПередНачаломРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Параметры); + Возврат; КонецЕсли; + ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + Попытка - ПодготовитьПараметрыРаботыПрограммы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеОбновленияПараметровРаботыПрограммы(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует( - "ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - - МодульАвтономнаяРаботаСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АвтономнаяРаботаСлужебныйКлиент"); - Попытка - МодульАвтономнаяРаботаСлужебныйКлиент.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; + Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда + ТекущийМодуль = ОписаниеМодуля; + ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); + Иначе + ТекущийМодуль = ОписаниеМодуля.Модуль; + Если ОписаниеМодуля.Номер = 2 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы2(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы3(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы4(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 5 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы5(Параметры); + КонецЕсли; КонецЕсли; - КонецЕсли; - - Попытка - ПользователиСлужебныйКлиент.ПередНачаломРаботыСистемыДоАвторизации(Параметры); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеОбработкиВходаСРазблокирующимКодом", ЭтотОбъект, Параметры)); - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - - Попытка - МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); - МодульСоединенияИБКлиент.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеОбработкиВходаСРазблокирующимКодом(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеОбновленияИнформационнойБазы", ЭтотОбъект, Параметры)); - - Попытка - ОбновлениеИнформационнойБазыКлиент.ОбновитьИнформационнуюБазу(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); КонецПопытки; Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда Возврат; @@ -1236,66 +1064,58 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеОбновленияИнформационнойБазы(Неопределен, Параметры) Экспорт +Процедура ДействияПередНачаломРаботыСистемыВПереопределяемойПроцедуре(Неопределен, Параметры) Экспорт - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; - Параметры.Вставить("НомерСледующегоОбработчика", 1); - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); - - Попытка - ПользователиСлужебныйКлиент.ПередНачаломРаботыСистемыПослеОбновленияИнформационнойБазы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); - -КонецПроцедуры - -// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт - - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПередНачаломРаботыСистемы"); - - КоличествоОбработчиков = ОбработчикиСобытия.Количество(); - НачальныйНомер = Параметры.НомерСледующегоОбработчика; - - Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл - Параметры.ИнтерактивнаяОбработка = Неопределено; - Параметры.НомерСледующегоОбработчика = Номер + 1; - Обработчик = ОбработчикиСобытия.Получить(Номер - 1); - - Попытка - Обработчик.Модуль.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЦикла; - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыПослеПереопределяемойПроцедуры", ЭтотОбъект, Параметры)); + "ДействияПередНачаломРаботыСистемыВМодуляхПереопределяемойПроцедуры", ЭтотОбъект, Параметры)); Параметры.ИнтерактивнаяОбработка = Неопределено; - + + Параметры.Вставить("ИндексТекущегоМодуля", 0); + Параметры.Вставить("ДобавленныеМодули", Новый Массив); + + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Попытка + Параметры.Вставить("Модули", Новый Массив); + ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Параметры); + Параметры.Вставить("ДобавленныеМодули", Параметры.Модули); + Параметры.Удалить("Модули"); + Исключение + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыВМодуляхПереопределяемойПроцедуры(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПередНачаломРаботыСистемыПослеВсехПроцедур(Неопределено, Параметры); + Возврат; + КонецЕсли; + + ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + Попытка - ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Параметры); + ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке()); КонецПопытки; Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда Возврат; @@ -1306,9 +1126,9 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. -Процедура ДействияПередНачаломРаботыСистемыПослеПереопределяемойПроцедуры(Неопределен, Параметры) Экспорт +Процедура ДействияПередНачаломРаботыСистемыПослеВсехПроцедур(Неопределен, Параметры) Экспорт - Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; @@ -1317,7 +1137,7 @@ Попытка УстановитьПараметрыФункциональныхОпцийИнтерфейсаПриЗапуске(); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); КонецПопытки; Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда Возврат; @@ -1332,6 +1152,7 @@ ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; ПараметрыПриЗапускеПрограммы.Удалить("ПолученныеПараметрыКлиента"); + ПараметрыПриложения["СтандартныеПодсистемы.ЗапускПрограммыЗавершен"] = Истина; Если Параметры.ОповещениеЗавершения <> Неопределено Тогда Результат = Новый Структура; @@ -1351,7 +1172,7 @@ ПрекратитьРаботуСистемы(Параметры.Перезапустить); КонецЕсли; - ИначеЕсли НЕ Параметры.НепрерывноеВыполнение Тогда + ИначеЕсли Не Параметры.НепрерывноеВыполнение Тогда Если ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда ПараметрыПриЗапускеПрограммы.Удалить("ПараметрыОбработки"); КонецЕсли; @@ -1364,42 +1185,24 @@ // ПриНачалеРаботыСистемы // Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. -Процедура ДействияПриНачалеРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт - - Если Параметры.Отказ Тогда - ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); +Процедура ДействияПриНачалеРаботыСистемыВИнтеграционнойПроцедуре(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"); - - КоличествоОбработчиков = ОбработчикиСобытия.Количество(); - НачальныйНомер = Параметры.НомерСледующегоОбработчика; - - Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл - Параметры.НомерСледующегоОбработчика = Номер + 1; - Обработчик = ОбработчикиСобытия.Получить(Номер - 1); - - Попытка - Обработчик.Модуль.ПриНачалеРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЦикла; - - // Подготовка перехода к следующей процедуре. - Параметры.Вставить("НомерСледующегоОбработчика", 1); Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПослеНачалаРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); + "ДействияПриНачалеРаботыСистемыВМодуляхИнтеграционнойПроцедуры", ЭтотОбъект, Параметры)); + Параметры.Вставить("ИндексТекущегоМодуля", 0); + Параметры.Вставить("ДобавленныеМодули", Новый Массив); Попытка - ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы(Параметры); + Параметры.Вставить("Модули", Новый Массив); + ИнтеграцияСтандартныхПодсистемКлиент.ПриНачалеРаботыСистемы(Параметры); + Параметры.Вставить("ДобавленныеМодули", Параметры.Модули); + Параметры.Удалить("Модули"); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); КонецПопытки; Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда Возврат; @@ -1410,47 +1213,115 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. -Процедура ДействияПослеНачалаРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт - - Если Параметры.Отказ Тогда - ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); +Процедура ДействияПриНачалеРаботыСистемыВМодуляхИнтеграционнойПроцедуры(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"); + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПриНачалеРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Параметры); + Возврат; + КонецЕсли; - КоличествоОбработчиков = ОбработчикиСобытия.Количество(); - НачальныйНомер = Параметры.НомерСледующегоОбработчика; - - Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл - Параметры.НомерСледующегоОбработчика = Номер + 1; - Обработчик = ОбработчикиСобытия.Получить(Номер - 1); - - Попытка - Обработчик.Модуль.ПослеНачалаРаботыСистемы(); - Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЦикла; + ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; Попытка - ПользователиСлужебныйКлиент.ПослеНачалаРаботыСистемы(); + Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда + ТекущийМодуль = ОписаниеМодуля; + ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); + Иначе + ТекущийМодуль = ОписаниеМодуля.Модуль; + Если ОписаниеМодуля.Номер = 2 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы2(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы3(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы4(Параметры); + КонецЕсли; + КонецЕсли; Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); КонецПопытки; Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда Возврат; КонецЕсли; - Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемыВПереопределяемойПроцедуре(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПриНачалеРаботыСистемыВМодуляхПереопределяемойПроцедуры", ЭтотОбъект, Параметры)); + + Параметры.Вставить("ИндексТекущегоМодуля", 0); + Параметры.Вставить("ДобавленныеМодули", Новый Массив); Попытка + Параметры.Вставить("Модули", Новый Массив); + ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы(Параметры); + Параметры.Вставить("ДобавленныеМодули", Параметры.Модули); + Параметры.Удалить("Модули"); + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемыВМодуляхПереопределяемойПроцедуры(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПриНачалеРаботыСистемыПослеВсехПроцедур(Неопределено, Параметры); + Возврат; + КонецЕсли; + + ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + + Попытка + ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемыПослеВсехПроцедур(Неопределен, Параметры) Экспорт + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + + Попытка + ИнтеграцияСтандартныхПодсистемКлиент.ПослеНачалаРаботыСистемы(); ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы(); Исключение - ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); КонецПопытки; Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда Возврат; @@ -1507,20 +1378,11 @@ КонецЕсли; // Параметр может состоять из частей, разделенных символом ";". - // Первая часть - главное значение параметра запуска. - // Наличие дополнительных частей определяется логикой обработки главного параметра. ПараметрыЗапуска = СтрРазделить(ПараметрЗапуска, ";", Ложь); - ПервыйПараметр = ВРег(ПараметрыЗапуска[0]); Отказ = Ложь; - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбработкеПараметровЗапуска"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОбработкеПараметровЗапуска(ПервыйПараметр, ПараметрыЗапуска, Отказ); - КонецЦикла; - - ОбщегоНазначенияКлиентПереопределяемый.ПриОбработкеПараметровЗапуска(ПервыйПараметр, ПараметрыЗапуска, Отказ); + ИнтеграцияСтандартныхПодсистемКлиент.ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ); + ОбщегоНазначенияКлиентПереопределяемый.ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ); Возврат Не Отказ; @@ -1533,7 +1395,9 @@ Процедура ДействияПередЗавершениемРаботыСистемы(Параметры) Экспорт Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда + + ПараметрыКлиента = ПараметрыРаботыКлиента(); + Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда Попытка ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Параметры); Исключение @@ -1551,7 +1415,8 @@ // Только для внутреннего использования. Завершение процедуры ПередЗавершениемРаботыСистемы. Процедура ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения(Неопределен, Параметры) Экспорт - Если Не Параметры.Отказ И Не Параметры.НепрерывноеВыполнение Тогда + Если Не Параметры.Отказ + И Не Параметры.НепрерывноеВыполнение Тогда ИмяПараметра = "СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы"; ПараметрыПриложения.Вставить(ИмяПараметра, Истина); @@ -1578,16 +1443,15 @@ //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции для запуска и завершения работы программы. -// Проверяет минимально допустимую версию платформы для запуска. -// Если версия платформы более поздняя, чем РекомендуемаяВерсияПлатформы, то пользователю будет -// показано оповещение. Работа программы будет прекращена, если ЗавершитьРаботу = Истина. -// -// Возвращаемое значение -// Булево - если версия актуальна, тогда Истина, иначе - Ложь. -// -Процедура ПроверитьВерсиюПлатформыПриЗапуске(Параметры) +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы2(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Проверяет минимально допустимую версию платформы для запуска. + // Если версия платформы более поздняя, чем РекомендуемаяВерсияПлатформы, + // то пользователю будет показано оповещение. Работа программы будет прекращена, + // если ПараметрыКлиента.РаботаВПрограммеЗапрещена = Истина. + + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыКлиента.Свойство("ПоказатьНерекомендуемуюВерсиюПлатформы") Тогда Возврат; КонецЕсли; @@ -1598,7 +1462,7 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПроверитьВерсиюПлатформыПриЗапуске. -Процедура ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске(Параметры, Контекст) Экспорт ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы", ЭтотОбъект, Параметры); Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда @@ -1610,32 +1474,38 @@ КонецЕсли; КонецЕсли; - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.РаботаВПрограммеЗапрещена Тогда + СистемнаяИнформация = Новый СистемнаяИнформация; + Текущая = СистемнаяИнформация.ВерсияПриложения; + Минимальная = ПараметрыКлиента.МинимальнаяВерсияПлатформы; + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Минимальная) < 0 Тогда Если ПараметрыКлиента.ЕстьДоступДляОбновленияВерсииПлатформы Тогда - ТекстСообщения = НСтр("ru = 'Вход в программу невозможен. - |Необходимо предварительно обновить версию платформы 1С:Предприятие.'"); + ТекстСообщения = + НСтр("ru = 'Вход в программу невозможен. + |Необходимо предварительно обновить версию платформы 1С:Предприятие.'"); Иначе - ТекстСообщения = НСтр("ru = 'Вход в программу невозможен. - |Необходимо обратиться к администратору для обновления версии платформы 1С:Предприятие.'"); + ТекстСообщения = + НСтр("ru = 'Вход в программу невозможен. + |Необходимо обратиться к администратору для обновления версии платформы 1С:Предприятие.'"); КонецЕсли; Иначе Если ПараметрыКлиента.ЕстьДоступДляОбновленияВерсииПлатформы Тогда - ТекстСообщения = + ТекстСообщения = НСтр("ru='Рекомендуется завершить работу программы и обновить версию платформы 1С:Предприятия. - |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); + |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); Иначе ТекстСообщения = НСтр("ru='Рекомендуется завершить работу программы и обратиться к администратору для обновления версии платформы 1С:Предприятия. - |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); + |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); КонецЕсли; КонецЕсли; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекстСообщения", ТекстСообщения); - ПараметрыФормы.Вставить("ЗавершитьРаботу", ПараметрыКлиента.РаботаВПрограммеЗапрещена); - ПараметрыФормы.Вставить("РекомендуемаяВерсияПлатформы", ПараметрыКлиента.МинимальноНеобходимаяВерсияПлатформы); + ПараметрыФормы.Вставить("РекомендуемаяВерсияПлатформы", ПараметрыКлиента.РекомендуемаяВерсияПлатформы); + ПараметрыФормы.Вставить("МинимальнаяВерсияПлатформы", ПараметрыКлиента.МинимальнаяВерсияПлатформы); ПараметрыФормы.Вставить("ОткрытаПоСценарию", Истина); ПараметрыФормы.Вставить("ПропуститьЗавершениеРаботы", Истина); @@ -1661,10 +1531,13 @@ КонецПроцедуры -// Проверяет необходимость восстановления связи с главным узлом и начинает восстановление, если требуется. -Процедура ПроверитьНеобходимостьВосстановленияСвязиСГлавнымУзлом(Параметры) +// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +Процедура ПередНачаломРаботыСистемы3(Параметры) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + // Проверяет необходимость восстановления связи с главным узлом и + // начинает восстановление, если требуется. + + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыКлиента.Свойство("ВосстановитьСвязьСГлавнымУзлом") Тогда Возврат; @@ -1676,9 +1549,9 @@ КонецПроцедуры // Только для внутреннего использования. Продолжение процедуры ПроверитьНеобходимостьВосстановленияСвязиСГлавнымУзлом. -Процедура ИнтерактивнаяОбработкаВосстановленияСвязиСГлавнымУзлом(Параметры, Неопределен) Экспорт +Процедура ИнтерактивнаяОбработкаВосстановленияСвязиСГлавнымУзлом(Параметры, Контекст) Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.ВосстановитьСвязьСГлавнымУзлом = Ложь Тогда Параметры.Отказ = Истина; @@ -1715,17 +1588,6 @@ КонецПроцедуры -// Только для внутреннего использования. -Процедура ПодготовитьПараметрыРаботыПрограммы(Параметры) - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы") Тогда - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ЗагрузитьОбновитьПараметрыРаботыПрограммы", ОбновлениеИнформационнойБазыКлиент, Параметры); - КонецЕсли; - -КонецПроцедуры - // Устанавливает флаг скрытия рабочего стола при начале работы системы, // который блокирует создание форм на рабочем столе. // Снимает флаг скрытия и обновляет рабочий стол, когда это станет возможным, @@ -1819,7 +1681,7 @@ КонецПроцедуры -// Только для внутреннего использования. +// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт Если ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти() Тогда @@ -1852,23 +1714,47 @@ Контекст = Новый Структура("Параметры", Параметры); - // СтандартныеПодсистемы.БазоваяФункциональность ОбработкаПродолжения = Новый ОписаниеОповещения( "ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователи", ЭтотОбъект, Контекст); - КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент.ПриВыполненииСтандартныхПериодическихПроверок( - Контекст.Параметры, ОбработкаПродолжения); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); + + Если Не Параметры.КонфигурацияБазыДанныхИзмененаДинамически Тогда + ВыполнитьОбработкуОповещения(ОбработкаПродолжения); + Возврат; + КонецЕсли; + + ТекстСообщения = + НСтр("ru = 'Версия программы обновлена (внесены изменения в конфигурацию информационной базы). + |Для дальнейшей работы рекомендуется перезапустить программу. + |Перезапустить?'"); + + ОписаниеОповещения = Новый ОписаниеОповещения( + "ПриВыполненииСтандартныхПериодическихПроверокЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + ПоказатьВопрос(ОписаниеОповещения, ТекстСообщения, РежимДиалогаВопрос.ДаНет,,, КлиентскоеПриложение.ПолучитьЗаголовок()); + +КонецПроцедуры + +// Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок. +Процедура ПриВыполненииСтандартныхПериодическихПроверокЗавершение(Ответ, Контекст) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(Истина, Истина); + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.ОбработкаПродолжения); КонецПроцедуры // Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок. Процедура ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователи(Результат, Контекст) Экспорт - - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - // СтандартныеПодсистемы.Пользователи + ОбработкаПродолжения = Новый ОписаниеОповещения( - "ПриВыполненииСтандартныхПериодическихПроверокЗавершение", ЭтотОбъект, Контекст); + "ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователиЗавершение", ЭтотОбъект, Контекст); ПользователиСлужебныйКлиент.ПриВыполненииСтандартныхПериодическихПроверок( Контекст.Параметры, ОбработкаПродолжения); @@ -1876,9 +1762,7 @@ КонецПроцедуры // Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок. -Процедура ПриВыполненииСтандартныхПериодическихПроверокЗавершение(Результат, Контекст) Экспорт - - // Конец СтандартныеПодсистемы.Пользователи +Процедура ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователиЗавершение(Результат, Контекст) Экспорт ПодключитьОбработчикОжиданияСтандартныхПериодическихПроверок(); @@ -1957,9 +1841,9 @@ КонецФункции -// Установить разделения сеанса при запуске программы. +// Установить разделения сеанса перед началом каких-либо действий в программе. Процедура УстановитьРазделениеСеанса() - + Если ПустаяСтрока(ПараметрЗапуска) Тогда Возврат; КонецЕсли; @@ -1984,27 +1868,10 @@ НСтр("ru = 'Значением разделителя в параметре ВойтиВОбластьДанных должно быть число.'"); КонецПопытки; - ОбщегоНазначенияВызовСервера.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); + СтандартныеПодсистемыВызовСервера.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); КонецПроцедуры -// В случае отказа вызывает обработку завершения, -// если добавлен новый полученный параметр клиента, -// обновляет параметры работы клиента. -// -Функция ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) - - Если Параметры.Отказ Тогда - ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); - Возврат Ложь; - КонецЕсли; - - ОбновитьПараметрыРаботыКлиента(Параметры); - - Возврат Истина; - -КонецФункции - // Обновляет параметры работы клиента после очередной интерактивной обработки при запуске. Процедура ОбновитьПараметрыРаботыКлиента(Параметры, ПервыйВызов = Ложь, ОбновитьПовторноИспользуемыеЗначения = Истина) @@ -2013,6 +1880,10 @@ Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); КонецЕсли; + ИмяПараметра = "СтандартныеПодсистемы.ЗапускПрограммыЗавершен"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); + КонецЕсли; ИначеЕсли Параметры.КоличествоПолученныхПараметровКлиента = Параметры.ПолученныеПараметрыКлиента.Количество() Тогда Возврат; КонецЕсли; @@ -2028,29 +1899,53 @@ КонецПроцедуры -Функция ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() + +// Проверяет результат интерактивной обработки, если Отказ, тогда вызывает обработку завершения. +// Если добавлен новый полученный параметр клиента, обновляет параметры работы клиента. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +// +// Возвращаемое значение: +// Булево - Истина, если можно продолжить выполнения, и соответственно, не выполнялся +// обработчик оповещения, указанный в свойствах ОбработкаЗавершения. +// +Функция ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) - ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; - - Если НЕ ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); Возврат Ложь; КонецЕсли; - Параметры = ПараметрыПриЗапускеПрограммы.ПараметрыОбработки; + ОбновитьПараметрыРаботыКлиента(Параметры); - Если Параметры.ИнтерактивнаяОбработка <> Неопределено Тогда - Параметры.НепрерывноеВыполнение = Ложь; - ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; - Параметры.ИнтерактивнаяОбработка = Неопределено; - ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); - ПараметрыПриЗапускеПрограммы.Удалить("ПараметрыОбработки"); - Возврат Истина; - КонецЕсли; - - Возврат Ложь; + Возврат Истина; КонецФункции +// Обрабатывает ошибку, найденную при вызове обработчика события ПриНачалеРаботыСистемы. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. +// ПрекратитьРаботу - Булево - если указано Истина, то при ошибке запуска не будет возможности продолжить работу. +// +Процедура ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке, ПрекратитьРаботу = Ложь) + + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке, "Запуск", ПрекратитьРаботу); + +КонецПроцедуры + +// Проверяет результат обработчика события ПередНачаломРаботыСистемы и выполняет обработчик оповещения. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +// +// Возвращаемое значение: +// Булево - Истина, если был выполнен обработчик оповещения, указанный +// ОбработкаЗавершения ОбработкаЗавершения или запланирован переход к выполнению +// интерактивной обработке, указанной в свойстве ИнтерактивнаяОбработка. +// Функция ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; @@ -2082,7 +1977,9 @@ Если Параметры.ОповещениеЗавершения = Неопределено Тогда // Вызов процедуры ПередНачаломРаботыСистемы выполнен платформой, // как обработчика события, до открытия главного окна 1С:Предприятия 8. - УстановитьПараметрыФункциональныхОпцийИнтерфейсаПриЗапуске(); + Если Не ОтключенаЛогикаНачалаРаботыСистемы() Тогда + УстановитьПараметрыФункциональныхОпцийИнтерфейсаПриЗапуске(); + КонецЕсли; Иначе // Вызов процедуры ПередНачаломРаботыСистемы выполнен программно, как вход в область данных, // поэтому продолжение после обновления интерфейса возможно только через обработчик ожидания. @@ -2094,6 +1991,49 @@ КонецФункции + +// Проверяет результат интерактивной обработки, если Отказ, тогда вызывает обработку завершения. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// +// Возвращаемое значение: +// Булево - Истина, если можно продолжить выполнения, и соответственно, не выполнялся +// обработчик оповещения, указанный в свойствах ОбработкаЗавершения. +// +Функция ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) + + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Обрабатывает ошибку, найденную при вызове обработчика события ПриНачалеРаботыСистемы. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. +// ПрекратитьРаботу - Булево - если указано Истина, то при ошибке запуска не будет возможности продолжить работу. +// +Процедура ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке, ПрекратитьРаботу = Ложь) + + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке, "Запуск", ПрекратитьРаботу); + +КонецПроцедуры + +// Проверяет результат обработчика события ПриНачалеРаботыСистемы и выполняет обработчик оповещения. +// +// Параметры: +// Параметры - Структура - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// +// Возвращаемое значение: +// Булево - Истина, если был выполнен обработчик оповещения, указанный в +// свойствах ОбработкаЗавершения или ИнтерактивнаяОбработка. +// Функция ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда @@ -2115,6 +2055,30 @@ КонецФункции + +Функция ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() + + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; + + Если НЕ ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда + Возврат Ложь; + КонецЕсли; + + Параметры = ПараметрыПриЗапускеПрограммы.ПараметрыОбработки; + + Если Параметры.ИнтерактивнаяОбработка <> Неопределено Тогда + Параметры.НепрерывноеВыполнение = Ложь; + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + ПараметрыПриЗапускеПрограммы.Удалить("ПараметрыОбработки"); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + Функция ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда @@ -2326,7 +2290,21 @@ КонецПроцедуры Процедура УстановитьПараметрыФункциональныхОпцийИнтерфейсаПриЗапуске() - ОпцииИнтерфейса = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ОпцииИнтерфейса; + + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; + + Если ТипЗнч(ПараметрыПриЗапускеПрограммы) <> Тип("Структура") + Или Не ПараметрыПриЗапускеПрограммы.Свойство("ОпцииИнтерфейса") Тогда + // Обработка ошибки запуска. + Возврат; + КонецЕсли; + + Если ПараметрыПриЗапускеПрограммы.Свойство("ОпцииИнтерфейсаУстановлены") Тогда + Возврат; + КонецЕсли; + + ОпцииИнтерфейса = ПараметрыПриЗапускеПрограммы.ОпцииИнтерфейса; + Если ТипЗнч(ОпцииИнтерфейса) = Тип("ФиксированнаяСтруктура") Тогда #Если ВебКлиент Тогда Структура = Новый Структура; @@ -2336,11 +2314,14 @@ ОпцииИнтерфейса = Новый Структура(ОпцииИнтерфейса); #КонецЕсли КонецЕсли; + // Установка параметров функциональных опций производится только тогда, когда они заданы. Если ОпцииИнтерфейса.Количество() > 0 Тогда УстановитьПараметрыФункциональныхОпцийИнтерфейса(ОпцииИнтерфейса); КонецЕсли; + ПараметрыПриЗапускеПрограммы.Вставить("ОпцииИнтерфейсаУстановлены"); + КонецПроцедуры Процедура ПоказатьПомещениеФайлаПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, ДополнительныеПараметры) Экспорт @@ -2406,12 +2387,12 @@ КонецПроцедуры Функция ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти() - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); Возврат ПараметрыКлиента.ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти; КонецФункции Процедура ОповеститьОНехваткеПамяти() Экспорт - РекомендуемыйОбъем = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().РекомендуемыйОбъемОперативнойПамяти; + РекомендуемыйОбъем = ПараметрыРаботыКлиентаПриЗапуске().РекомендуемыйОбъемОперативнойПамяти; Заголовок = НСтр("ru = 'Скорость работы снижена'"); Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Рекомендуется увеличить @@ -2452,4 +2433,33 @@ КонецЕсли; КонецПроцедуры +// Формирует описание выделенных областей табличного документа, которое можно передавать на сервер. +// Служит заменой типа ВыделенныеОбластиТабличногоДокумента +// когда нужно вычислить сумму ячеек на сервере без контекста. +// См. также СтандартныеПодсистемыВызовСервера.РасчетЯчеек. +// +// Параметры: +// ТабличныйДокумент - ТабличныйДокумент - таблица, для которой нужно сформировать описание выделенных ячеек. +// +// Возвращаемое значение: +// Массив - содержит структуры со свойствами: +// * Верх - Число - Номер строки верхней границы области. +// * Низ - Число - Номер строки нижней границы области. +// * Лево - Число - Номер колонки верхней границы области. +// * Право - Число - Номер колонки нижней границы области. +// * ТипОбласти - ТипОбластиЯчеекТабличногоДокумента - Колонки, Прямоугольник, Строки, Таблица. +// +Функция ВыделенныеОбласти(ТабличныйДокумент) + Результат = Новый Массив; + Для Каждого ВыделеннаяОбласть Из ТабличныйДокумент.ВыделенныеОбласти Цикл + Если ТипЗнч(ВыделеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда + Продолжить; + КонецЕсли; + Структура = Новый Структура("Верх, Низ, Лево, Право, ТипОбласти"); + ЗаполнитьЗначенияСвойств(Структура, ВыделеннаяОбласть); + Результат.Добавить(Структура); + КонецЦикла; + Возврат Результат; +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl index faa3ab286..67ebe855f 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl @@ -1,149 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Возвращает структуру параметров, необходимых для работы -// конфигурации на клиенте при запуске, т.е. в обработчиках событий. -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы. -// -// Важно: при запуске недопустимо использовать команды сброса кэша -// повторно используемых модулей, иначе запуск может привести -// к непредсказуемым ошибкам и лишним серверным вызовам. -// -// Возвращаемое значение: -// ФиксированнаяСтруктура - структура параметров работы клиента при запуске. -// -Функция ПараметрыРаботыКлиентаПриЗапуске() Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); - КонецЕсли; - ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; - - Параметры = Новый Структура; - Параметры.Вставить("ПолученныеПараметрыКлиента", Неопределено); - - Если ПараметрыПриЗапускеПрограммы.Свойство("ПолученныеПараметрыКлиента") - И ТипЗнч(ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента) = Тип("Структура") Тогда - - Параметры.Вставить("ПолученныеПараметрыКлиента", - ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента); - КонецЕсли; - - Если ПараметрыПриЗапускеПрограммы.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда - Параметры.Вставить("ПропуститьОчисткуСкрытияРабочегоСтола"); - КонецЕсли; - - #Если ВебКлиент Тогда - ЭтоВебКлиент = Истина; - КаталогПрограммы = ""; - #Иначе - ЭтоВебКлиент = Ложь; - КаталогПрограммы = КаталогПрограммы(); - #КонецЕсли - - ИспользуемыйКлиент = ""; - #Если ТонкийКлиент Тогда - ИспользуемыйКлиент = "ТонкийКлиент"; - #ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда - ИспользуемыйКлиент = "ТолстыйКлиентУправляемоеПриложение"; - #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда - ИспользуемыйКлиент = "ТолстыйКлиентОбычноеПриложение"; - #ИначеЕсли ВебКлиент Тогда - ОписаниеБраузера = ТекущийБраузер(); - Если ПустаяСтрока(ОписаниеБраузера.Версия) Тогда - ИспользуемыйКлиент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВебКлиент.%1", ОписаниеБраузера.Название); - Иначе - ИспользуемыйКлиент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВебКлиент.%1.%2", ОписаниеБраузера.Название, СтрРазделить(ОписаниеБраузера.Версия, ".")[0]); - КонецЕсли; - #КонецЕсли - - СистемнаяИнформация = Новый СистемнаяИнформация; - ЭтоLinuxКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64; - ЭтоOSXКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64; - ЭтоWindowsКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64; - - Параметры.Вставить("ПараметрЗапуска", ПараметрЗапуска); - Параметры.Вставить("СтрокаСоединенияИнформационнойБазы", СтрокаСоединенияИнформационнойБазы()); - Параметры.Вставить("ЭтоВебКлиент", ЭтоВебКлиент); - Параметры.Вставить("ЭтоВебКлиентПодMacOS", ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()); - Параметры.Вставить("ЭтоLinuxКлиент", ЭтоLinuxКлиент); - Параметры.Вставить("ЭтоOSXКлиент", ЭтоOSXКлиент); - Параметры.Вставить("ЭтоWindowsКлиент", ЭтоWindowsКлиент); - Параметры.Вставить("ИспользуемыйКлиент", ИспользуемыйКлиент); - Параметры.Вставить("КаталогПрограммы", КаталогПрограммы); - Параметры.Вставить("ИдентификаторКлиента", СистемнаяИнформация.ИдентификаторКлиента); - Параметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Ложь); - - СистемнаяИнформация = Новый СистемнаяИнформация; - ОперативнаяПамять = Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1); - Параметры.Вставить("ОперативнаяПамять", ОперативнаяПамять); - - ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры); - - СтандартныеПодсистемыКлиент.ЗаполнитьПараметрыКлиента(ПараметрыКлиента); - Если ПараметрыКлиента.Свойство("ЦентрМониторинга") Тогда - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"].Вставить("ЦентрМониторинга", ПараметрыКлиента.ЦентрМониторинга); - КонецЕсли; - - // Обновление состояния скрытия рабочего стола на клиенте по состоянию на сервере. - СтандартныеПодсистемыКлиент.СкрытьРабочийСтолПриНачалеРаботыСистемы( - Параметры.СкрытьРабочийСтолПриНачалеРаботыСистемы, Истина); - - Возврат ПараметрыКлиента; - -КонецФункции - -// Возвращает структуру параметров, необходимых для работы -// конфигурации на клиенте. -// -// Возвращаемое значение: -// ФиксированнаяСтруктура - структура параметров работы клиента при запуске. -// -Функция ПараметрыРаботыКлиента() Экспорт - - ТекущаяДата = ТекущаяДата(); // Текущая дата клиентского компьютера. - - ПараметрыРаботыКлиента = Новый Структура; - ПараметрыРаботы = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента(); - Для Каждого Параметр Из ПараметрыРаботы Цикл - ПараметрыРаботыКлиента.Вставить(Параметр.Ключ, Параметр.Значение); - КонецЦикла; - ПараметрыРаботыКлиента.ПоправкаКВремениСеанса = ПараметрыРаботыКлиента.ПоправкаКВремениСеанса - ТекущаяДата; - - Возврат Новый ФиксированнаяСтруктура(ПараметрыРаботыКлиента); - -КонецФункции - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции -// Возвращает массив описаний обработчиков клиентского события. -Функция ОбработчикиКлиентскогоСобытия(Событие, Служебное = Ложь) Экспорт - - ПодготовленныеОбработчики = ПодготовленныеОбработчикиКлиентскогоСобытия(Событие, Служебное); - - Если ПодготовленныеОбработчики = Неопределено Тогда - // Автообновление кэша. Обновление повторно используемых значений требуется. - СтандартныеПодсистемыВызовСервера.ПриОшибкеПолученияОбработчиковСобытия(); - ОбновитьПовторноИспользуемыеЗначения(); - // Повторная попытка получить обработчики события. - ПодготовленныеОбработчики = ПодготовленныеОбработчикиКлиентскогоСобытия(Событие, Служебное, Ложь); - КонецЕсли; - - Возврат ПодготовленныеОбработчики; - -КонецФункции - Функция ТекущийБраузер() Результат = Новый Структура("Название,Версия", "Другой", ""); @@ -252,9 +108,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Работа с предопределенными данными. - // Получает ссылку предопределенного элемента по его полному имени. // Подробнее - см. ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(); // @@ -264,53 +117,137 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -Функция ПодготовленныеОбработчикиКлиентскогоСобытия(Событие, Служебное = Ложь, ПерваяПопытка = Истина) +// См. СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(). +Функция ПараметрыРаботыКлиентаПриЗапуске() Экспорт - Параметры = СтандартныеПодсистемыКлиент.ПараметрКлиента("ОбработчикиКлиентскихСобытий"); + ПроверитьПорядокЗапускаПрограммыПередНачаломРаботыСистемы(); - Если Служебное Тогда - Обработчики = Параметры.ОбработчикиСлужебныхСобытий.Получить(Событие); - Иначе - Обработчики = Параметры.ОбработчикиСобытий.Получить(Событие); + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; + + Параметры = Новый Структура; + Параметры.Вставить("ПолученныеПараметрыКлиента", Неопределено); + + Если ПараметрыПриЗапускеПрограммы.Свойство("ПолученныеПараметрыКлиента") + И ТипЗнч(ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента) = Тип("Структура") Тогда + + Параметры.Вставить("ПолученныеПараметрыКлиента", + ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента); КонецЕсли; - Если ПерваяПопытка И Обработчики = Неопределено Тогда - Возврат Неопределено; + Если ПараметрыПриЗапускеПрограммы.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда + Параметры.Вставить("ПропуститьОчисткуСкрытияРабочегоСтола"); КонецЕсли; - Если Обработчики = Неопределено Тогда - Если Служебное Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найдено клиентское служебное событие ""%1"".'"), Событие); + #Если ВебКлиент Тогда + ЭтоВебКлиент = Истина; + КаталогПрограммы = ""; + #Иначе + ЭтоВебКлиент = Ложь; + КаталогПрограммы = КаталогПрограммы(); + #КонецЕсли + + ИспользуемыйКлиент = ""; + #Если ТонкийКлиент Тогда + ИспользуемыйКлиент = "ТонкийКлиент"; + #ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда + ИспользуемыйКлиент = "ТолстыйКлиентУправляемоеПриложение"; + #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда + ИспользуемыйКлиент = "ТолстыйКлиентОбычноеПриложение"; + #ИначеЕсли ВебКлиент Тогда + ОписаниеБраузера = ТекущийБраузер(); + Если ПустаяСтрока(ОписаниеБраузера.Версия) Тогда + ИспользуемыйКлиент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВебКлиент.%1", ОписаниеБраузера.Название); Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найдено клиентское событие ""%1"".'"), Событие); + ИспользуемыйКлиент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВебКлиент.%1.%2", ОписаниеБраузера.Название, СтрРазделить(ОписаниеБраузера.Версия, ".")[0]); КонецЕсли; + #КонецЕсли + + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоLinuxКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64; + ЭтоOSXКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64; + ЭтоWindowsКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64; + + Параметры.Вставить("ПараметрЗапуска", ПараметрЗапуска); + Параметры.Вставить("СтрокаСоединенияИнформационнойБазы", СтрокаСоединенияИнформационнойБазы()); + Параметры.Вставить("ЭтоВебКлиент", ЭтоВебКлиент); + Параметры.Вставить("ЭтоВебКлиентПодMacOS", ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()); + Параметры.Вставить("ЭтоLinuxКлиент", ЭтоLinuxКлиент); + Параметры.Вставить("ЭтоOSXКлиент", ЭтоOSXКлиент); + Параметры.Вставить("ЭтоWindowsКлиент", ЭтоWindowsКлиент); + Параметры.Вставить("ИспользуемыйКлиент", ИспользуемыйКлиент); + Параметры.Вставить("КаталогПрограммы", КаталогПрограммы); + Параметры.Вставить("ИдентификаторКлиента", СистемнаяИнформация.ИдентификаторКлиента); + Параметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Ложь); + + СистемнаяИнформация = Новый СистемнаяИнформация; + ОперативнаяПамять = Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1); + Параметры.Вставить("ОперативнаяПамять", ОперативнаяПамять); + + // Установка даты клиента непосредственно перед вызовом, чтобы уменьшить погрешность. + Параметры.Вставить("ТекущаяДатаНаКлиенте", ТекущаяДата()); // Для расчета ПоправкаКВремениСеанса. + Параметры.Вставить("ТекущаяУниверсальнаяДатаВМиллисекундахНаКлиенте", + ТекущаяУниверсальнаяДатаВМиллисекундах()); + + ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры); + + Если ПараметрыПриЗапускеПрограммы.Свойство("ПолученныеПараметрыКлиента") + И ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента <> Неопределено + И Не ПараметрыПриЗапускеПрограммы.Свойство("ОпцииИнтерфейса") Тогда + + ПараметрыПриЗапускеПрограммы.Вставить("ОпцииИнтерфейса", ПараметрыКлиента.ОпцииИнтерфейса); + ПараметрыПриЗапускеПрограммы.ПолученныеПараметрыКлиента.Вставить("ОпцииИнтерфейса"); КонецЕсли; - Массив = Новый Массив; + СтандартныеПодсистемыКлиент.ЗаполнитьПараметрыКлиента(ПараметрыКлиента); - Для каждого Обработчик Из Обработчики Цикл - Элемент = Новый Структура; - Модуль = Неопределено; - Если ПерваяПопытка Тогда - Попытка - Модуль = ОбщегоНазначенияКлиент.ОбщийМодуль(Обработчик.Модуль); - Исключение - Возврат Неопределено; - КонецПопытки; - Иначе - Модуль = ОбщегоНазначенияКлиент.ОбщийМодуль(Обработчик.Модуль); - КонецЕсли; - Элемент.Вставить("Модуль", Модуль); - Элемент.Вставить("Версия", Обработчик.Версия); - Элемент.Вставить("Подсистема", Обработчик.Подсистема); - Массив.Добавить(Новый ФиксированнаяСтруктура(Элемент)); - КонецЦикла; + // Обновление состояния скрытия рабочего стола на клиенте по состоянию на сервере. + СтандартныеПодсистемыКлиент.СкрытьРабочийСтолПриНачалеРаботыСистемы( + Параметры.СкрытьРабочийСтолПриНачалеРаботыСистемы, Истина); - Возврат Новый ФиксированныйМассив(Массив); + Возврат ПараметрыКлиента; КонецФункции +// См. СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(). +Функция ПараметрыРаботыКлиента() Экспорт + + ПроверитьПорядокЗапускаПрограммыПередНачаломРаботыСистемы(); + ПроверитьПорядокЗапускаПрограммыПриНачалеРаботыСистемы(); + + СвойстваКлиента = Новый Структура; + + // Установка даты клиента непосредственно перед вызовом, чтобы уменьшить погрешность. + СвойстваКлиента.Вставить("ТекущаяДатаНаКлиенте", ТекущаяДата()); // Для расчета ПоправкаКВремениСеанса. + СвойстваКлиента.Вставить("ТекущаяУниверсальнаяДатаВМиллисекундахНаКлиенте", + ТекущаяУниверсальнаяДатаВМиллисекундах()); + + Возврат СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента(СвойстваКлиента); + +КонецФункции + +Процедура ПроверитьПорядокЗапускаПрограммыПередНачаломРаботыСистемы() + + ИмяПараметра = "СтандартныеПодсистемы.ЗапускПрограммыЗавершен"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ВызватьИсключение + НСтр("ru = 'Ошибка порядка запуска программы. + |Первой процедурой, которая вызывается из обработчика события ПередНачаломРаботыСистемы + |должна быть процедура БСП СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы.'"); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьПорядокЗапускаПрограммыПриНачалеРаботыСистемы() + + Если Не СтандартныеПодсистемыКлиент.ЗапускПрограммыЗавершен() Тогда + ВызватьИсключение + НСтр("ru = 'Ошибка порядка запуска программы. + |Перед получением параметров работы клиента запуск программы должен быть завершен.'"); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl index f840ad721..0d6f85c95 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl @@ -1,25 +1,21 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// // Табличный документ // Рассчитывает показатели числовых ячеек в табличном документе. +// См. также ОтчетыКлиент.ВыделенныеОбласти. // // Параметры: -// ТабличныйДокумент - ТабличныйДокумент - Таблица, для которой требуется расчет. +// ТабличныйДокумент - ТабличныйДокумент - таблица, для которой требуется расчет. // ВыделенныеОбласти -// - Неопределено - При вызове с клиента этот параметр будет определен автоматически. +// - Неопределено - при вызове с клиента этот параметр будет определен автоматически. // - Массив - При вызове с сервера в этот параметр следует передавать области, // предварительно вычисленные на клиенте // при помощи функции ОтчетыКлиент.ВыделенныеОбласти(ТабличныйДокумент). // // Возвращаемое значение: -// Структура - Результаты расчета выделенных ячеек. +// Структура - результаты расчета выделенных ячеек. // * Количество - Число - Количество выделенных ячеек. // * КоличествоЧисловых - Число - Количество числовых ячеек. // * Сумма - Число - Сумма выделенных ячеек с числами. @@ -28,9 +24,6 @@ // * Максимум - Число - Максимум выделенных ячеек с числами. // * НуженВызовСервера - Булево - Истина когда вычисление на клиенте нецелесообразно и нужен вызов сервера. // -// См. также: -// ОтчетыКлиент.ВыделенныеОбласти(). -// Функция РасчетЯчеек(ТабличныйДокумент, ВыделенныеОбласти) Экспорт Результат = Новый Структура; Результат.Вставить("Количество", 0); @@ -109,7 +102,8 @@ И Ячейка.СодержитЗначение И ТипЗнч(Ячейка.Значение) = Тип("Число") Тогда Число = Ячейка.Значение; ИначеЕсли ЗначениеЗаполнено(Ячейка.Текст) Тогда - Число = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Ячейка.Текст); + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + Число = ОписаниеТипаЧисло.ПривестиЗначение(Ячейка.Текст); Иначе Продолжить; КонецЕсли; @@ -138,31 +132,22 @@ КонецФункции -#КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// Работа с расписанием регламентного задания. -#Область СлужебныеПроцедурыИФункции - -// Определяет примерное число строк с учетом переносов. -Функция ЧислоСтрок(Текст, ОтсечкаПоШирине, ПриводитьКРазмерамЭлементовФормы = Истина) Экспорт - ЧислоСтрок = СтрЧислоСтрок(Текст); - ЧислоПереносов = 0; - Для НомерСтроки = 1 По ЧислоСтрок Цикл - Строка = СтрПолучитьСтроку(Текст, НомерСтроки); - ЧислоПереносов = ЧислоПереносов + Цел(СтрДлина(Строка)/ОтсечкаПоШирине); - КонецЦикла; - ПримерноеЧислоСтрок = ЧислоСтрок + ЧислоПереносов; - Если ПриводитьКРазмерамЭлементовФормы Тогда - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда - Коэффициент = 4/5; // В 8.2 в высоту 4 вмещается примерно 5 строк текста. - Иначе - Коэффициент = 2/3; // В такси в высоту 2 вмещается примерно 3 строки текста. - КонецЕсли; - ПримерноеЧислоСтрок = Цел((ПримерноеЧислоСтрок+1)*Коэффициент); - КонецЕсли; - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() <> ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 И ПримерноеЧислоСтрок = 2 Тогда - ПримерноеЧислоСтрок = 3; - КонецЕсли; - Возврат ПримерноеЧислоСтрок; +// Формирует представление расписания регламентного задания. +// +// Параметры: +// Расписание - РасписаниеРегламентногоЗадания - Расписание. +// +// Возвращаемое значение: +// Строка - Представление расписания. +// +Функция ПредставлениеРасписания(Расписание) Экспорт + ПредставлениеРасписания = Строка(Расписание); + ПредставлениеРасписания = ВРег(Лев(ПредставлениеРасписания, 1)) + Сред(ПредставлениеРасписания, 2); + ПредставлениеРасписания = СтрЗаменить(СтрЗаменить(ПредставлениеРасписания, " ", " "), " ]", "]") + "."; + Возврат ПредставлениеРасписания; КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl index ccada92e1..43fbfb4d2 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает описания всех библиотек конфигурации, включая @@ -22,24 +17,20 @@ ВсеТребуемыеПодсистемы = Новый Соответствие; - Для каждого ИмяМодуля Из МодулиПодсистем Цикл + Для Каждого ИмяМодуля Из МодулиПодсистем Цикл Описание = НовоеОписаниеПодсистемы(); Модуль = ОбщегоНазначения.ОбщийМодуль(ИмяМодуля); Модуль.ПриДобавленииПодсистемы(Описание); - Если Описание.Имя = "СтандартныеПодсистемы" Тогда - // <СВОЙСТВА ТОЛЬКО ДЛЯ БИБЛИОТЕКИ СТАНДАРТНЫХ ПОДСИСТЕМ> - Описание.ДобавлятьСлужебныеСобытия = Истина; - Описание.ДобавлятьОбработчикиСлужебныхСобытий = Истина; - КонецЕсли; - - ОбщегоНазначенияКлиентСервер.Проверить(ОписанияПодсистем.ПоИменам.Получить(Описание.Имя) = Неопределено, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Если ОписанияПодсистем.ПоИменам.Получить(Описание.Имя) <> Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при подготовке описаний подсистем: |в описании подсистемы (см. процедуру %1.ПриДобавленииПодсистемы) |указано имя подсистемы ""%2"", которое уже зарегистрировано ранее.'"), - ИмяМодуля, Описание.Имя)); + ИмяМодуля, Описание.Имя); + ВызватьИсключение ТекстОшибки; + КонецЕсли; Если Описание.Имя = Метаданные.Имя Тогда ОписаниеКонфигурацииНайдено = Истина; @@ -66,41 +57,44 @@ Если ОписаниеКонфигурацииНайдено Тогда Описание = ОписанияПодсистем.ПоИменам[Метаданные.Имя]; - ОбщегоНазначенияКлиентСервер.Проверить(Описание.Версия = Метаданные.Версия, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Если Описание.Версия <> Метаданные.Версия Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при подготовке описаний подсистем: |версия ""%2"" конфигурации ""%1"" (см. процедуру %3.ПриДобавленииПодсистемы) |не совпадает с версией конфигурации в метаданных ""%4"".'"), Описание.Имя, Описание.Версия, Описание.ОсновнойСерверныйМодуль, - Метаданные.Версия)); + Метаданные.Версия); + ВызватьИсключение ТекстОшибки; + КонецЕсли; Иначе - Описание = НовоеОписаниеПодсистемы(); - Описание.Вставить("Имя", Метаданные.Имя); - Описание.Вставить("Версия", Метаданные.Версия); - Описание.Вставить("ЭтоКонфигурация", Истина); - ОписанияПодсистем.ПоИменам.Вставить(Описание.Имя, Описание); - ОписанияПодсистем.Порядок.Добавить(Описание.Имя); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при подготовке описаний подсистем: + |в общих модулях, указанных в процедуре ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистемы + |не найдено описание подсистемы, совпадающей с именем конфигурации ""%1"".'"), + Метаданные.Имя); + ВызватьИсключение ТекстОшибки; КонецЕсли; // Проверка наличия всех требуемых подсистем. Для каждого КлючИЗначение Из ВсеТребуемыеПодсистемы Цикл Если ОписанияПодсистем.ПоИменам.Получить(КлючИЗначение.Ключ) = Неопределено Тогда ЗависимыеПодсистемы = ""; - Для каждого ЗависимаяПодсистема Из КлючИЗначение.Значение Цикл + Для Каждого ЗависимаяПодсистема Из КлючИЗначение.Значение Цикл ЗависимыеПодсистемы = Символы.ПС + ЗависимаяПодсистема; КонецЦикла; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при подготовке описаний подсистем: |не найдена подсистема ""%1"" требуемая для подсистем: %2.'"), КлючИЗначение.Ключ, ЗависимыеПодсистемы); + ВызватьИсключение ТекстОшибки; КонецЕсли; КонецЦикла; // Настройка порядка подсистем с учетом зависимостей. - Для каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл + Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл Имя = КлючИЗначение.Ключ; Порядок = ОписанияПодсистем.Порядок.Найти(Имя); Для каждого ТребуемаяПодсистема Из КлючИЗначение.Значение.ТребуемыеПодсистемы Цикл @@ -128,8 +122,7 @@ ОписанияПодсистем.Порядок.Добавить(Метаданные.Имя); КонецЕсли; - Для каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл - + Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл КлючИЗначение.Значение.ТребуемыеПодсистемы = Новый ФиксированныйМассив(КлючИЗначение.Значение.ТребуемыеПодсистемы); @@ -329,7 +322,7 @@ Результат = Новый Массив; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл @@ -337,9 +330,16 @@ Продолжить; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + ПланОбмена.ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); + Иначе + ЭтоРазделенныеДанные = Ложь; + КонецЕсли; + Если ПланОбмена.РаспределеннаяИнформационнаяБаза - И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ПланОбмена.ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) Тогда + И ЭтоРазделенныеДанные Тогда Результат.Добавить(ПланОбмена.Имя); @@ -416,64 +416,6 @@ #Область СлужебныеПроцедурыИФункции -// Содержит сохраненные параметры, используемые подсистемой. -Функция ПараметрыПрограммныхСобытий() Экспорт - - УстановитьПривилегированныйРежим(Истина); - СохраненныеПараметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыСлужебныхСобытий"); - УстановитьПривилегированныйРежим(Ложь); - - СтандартныеПодсистемыСервер.ПроверитьОбновлениеПараметровРаботыПрограммы( - "ПараметрыСлужебныхСобытий", - "ОбработчикиСобытий"); - - Если НЕ СохраненныеПараметры.Свойство("ОбработчикиСобытий") Тогда - СтандартныеПодсистемыВызовСервера.ПриОшибкеПолученияОбработчиковСобытия(); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - СохраненныеПараметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыСлужебныхСобытий"); - УстановитьПривилегированныйРежим(Ложь); - - ПредставлениеПараметра = ""; - - Если НЕ СохраненныеПараметры.Свойство("ОбработчикиСобытий") Тогда - ПредставлениеПараметра = НСтр("ru = 'Обработчики событий'"); - КонецЕсли; - - Если ЗначениеЗаполнено(ПредставлениеПараметра) Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка обновления информационной базы. - |Не заполнен параметр служебных событий: - |""%1"".'") - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(), - ПредставлениеПараметра); - КонецЕсли; - - Возврат СохраненныеПараметры; - -КонецФункции - -// Возвращает массив описаний обработчиков серверного события. -Функция ОбработчикиСерверногоСобытия(Событие, Служебное = Ложь) Экспорт - - ПодготовленныеОбработчики = ПодготовленныеОбработчикиСерверногоСобытия(Событие, Служебное); - - Если ПодготовленныеОбработчики = Неопределено Тогда - // Автообновление кэша. Обновление повторно используемых значений требуется. - СтандартныеПодсистемыВызовСервера.ПриОшибкеПолученияОбработчиковСобытия(); - ОбновитьПовторноИспользуемыеЗначения(); - // Повторная попытка получить обработчики события. - ПодготовленныеОбработчики = ПодготовленныеОбработчикиСерверногоСобытия(Событие, Служебное, Ложь); - КонецЕсли; - - Возврат ПодготовленныеОбработчики; - -КонецФункции - // Возвращает соответствие имен "функциональных" подсистем и значения Истина. // У "функциональной" подсистемы снят флажок "Включать в командный интерфейс". // @@ -489,19 +431,6 @@ КонецФункции -// Только для внутреннего использования. -Функция ПараметрыРаботыПрограммы(ИмяКонстанты) Экспорт - - Параметры = Константы[ИмяКонстанты].Получить().Получить(); - - Если ТипЗнч(Параметры) <> Тип("Структура") Тогда - Параметры = Новый Структура; - КонецЕсли; - - Возврат Новый ФиксированнаяСтруктура(Параметры); - -КонецФункции - // Проверяет наличие механизма платформы, предупреждающего об опасных действиях. // // Возвращаемое значение: @@ -509,11 +438,11 @@ // Функция ЕстьЗащитаОтОпасныхДействий() Экспорт - Свойства = Новый Структура("ЗащитаОтОпасныхДействий, UnsafeActionProtection"); + Свойства = Новый Структура("ЗащитаОтОпасныхДействий, UnsafeOperationProtection"); ЗаполнитьЗначенияСвойств(Свойства, ПользователиИнформационнойБазы.ТекущийПользователь()); Возврат Свойства.ЗащитаОтОпасныхДействий <> Неопределено - Или Свойства.UnsafeActionProtection <> Неопределено; + Или Свойства.UnsafeOperationProtection <> Неопределено; КонецФункции @@ -542,39 +471,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Работа с предопределенными данными. - -// Получает ссылку предопределенного элемента по его полному имени. -// Подробнее - см. ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(); -// -Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного) Экспорт - - ИмяПредопределенного = ВРег(ПолноеИмяПредопределенного); - - Точка = СтрНайти(ИмяПредопределенного, "."); - ИмяКоллекции = Лев(ИмяПредопределенного, Точка - 1); - ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); - - Точка = СтрНайти(ИмяПредопределенного, "."); - ИмяТаблицы = Лев(ИмяПредопределенного, Точка - 1); - ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); - - ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ &ПолноеИмяТаблицы ГДЕ ИмяПредопределенныхДанных = &ИмяПредопределенного"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяТаблицы", ИмяКоллекции + "." + ИмяТаблицы); - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ИмяПредопределенного", ИмяПредопределенного); - - Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда - Возврат Результат.Выгрузить()[0].Ссылка; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -597,22 +493,6 @@ Описание.Вставить("РежимВыполненияОтложенныхОбработчиков", "Последовательно"); Описание.Вставить("ПараллельноеОтложенноеОбновлениеСВерсии", ""); - // <СВОЙСТВА ТОЛЬКО ДЛЯ БИБЛИОТЕКИ СТАНДАРТНЫХ ПОДСИСТЕМ> - - Описание.Вставить("ДобавлятьСобытия", Ложь); - Описание.Вставить("ДобавлятьОбработчикиСобытий", Ложь); - - // ДобавлятьСлужебныеСобытия - Булево - если Истина, будет вызвана - // стандартная процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) - // из основного модуля библиотеки. - // - // ДобавлятьОбработчикиСлужебныхСобытий - Булево - если Истина, будет вызвана - // стандартная процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) - // из основного модуля библиотеки. - - Описание.Вставить("ДобавлятьСлужебныеСобытия", Ложь); - Описание.Вставить("ДобавлятьОбработчикиСлужебныхСобытий", Ложь); - Возврат Описание; КонецФункции @@ -641,50 +521,4 @@ КонецПроцедуры -Функция ПодготовленныеОбработчикиСерверногоСобытия(Событие, Служебное = Ложь, ПерваяПопытка = Истина) - - Параметры = СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий().ОбработчикиСобытий.НаСервере; - - Если Служебное Тогда - Обработчики = Параметры.ОбработчикиСлужебныхСобытий.Получить(Событие); - Иначе - Обработчики = Параметры.ОбработчикиСобытий.Получить(Событие); - КонецЕсли; - - Если ПерваяПопытка И Обработчики = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Если Обработчики = Неопределено Тогда - Если Служебное Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найдено серверное служебное событие ""%1"".'"), Событие); - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найдено серверное событие ""%1"".'"), Событие); - КонецЕсли; - КонецЕсли; - - Массив = Новый Массив; - - Для каждого Обработчик Из Обработчики Цикл - Элемент = Новый Структура; - Модуль = Неопределено; - Если ПерваяПопытка Тогда - Попытка - Модуль = ОбщегоНазначения.ОбщийМодуль(Обработчик.Модуль); - Исключение - Возврат Неопределено; - КонецПопытки; - Иначе - Модуль = ОбщегоНазначения.ОбщийМодуль(Обработчик.Модуль); - КонецЕсли; - Элемент.Вставить("Модуль", Модуль); - Элемент.Вставить("Версия", Обработчик.Версия); - Элемент.Вставить("Подсистема", Обработчик.Подсистема); - Массив.Добавить(Новый ФиксированнаяСтруктура(Элемент)); - КонецЦикла; - - Возврат Новый ФиксированныйМассив(Массив); - -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index a5d070d4f..859041308 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -1,19 +1,20 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс /////////////////////////////////////////////////////////////////////////////// // Инициализации параметров сеанса. -// Для вызова из обработчика УстановкаПараметровСеанса модуля сеанса. +// Вызов этой процедуры необходимо разместить в модуле сеанса в процедуре УстановкаПараметровСеанса +// согласно документации. // // Параметры: -// ИменаПараметровСеанса - Массив, Неопределено - в массиве имена параметров сеанса для инициализации. +// ИменаПараметровСеанса - Массив, Неопределено - имена параметров сеанса для инициализации. +// Массив устанавливаемых идентификаторов параметров сеанса, +// которые нужно инициализировать, если обработчик вызывается +// перед использованием неинициализированных параметров сеанса. +// Неопределено, если обработчик события вызывается системой при начале сеанса. // -// Возвращает массив имен установленных параметров сеанса. +// Возвращаемое значение: +// Массив - имена параметров сеанса, значения которых были успешно установлены. // Функция УстановкаПараметровСеанса(ИменаПараметровСеанса) Экспорт @@ -44,42 +45,7 @@ КонецЕсли; Обработчики = Новый Соответствие; - ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); - МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда - МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); - МодульПользователиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); - МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - КонецЕсли; + ИнтеграцияСтандартныхПодсистем.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); ОбработчикиСобственные = Новый Соответствие; ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса(ОбработчикиСобственные); @@ -96,9 +62,13 @@ // Дополнительные процедуры и функции. // Возвращает признак, является ли конфигурация базовой. +// Базовые версии конфигураций могут иметь программные ограничения, действие которых +// можно предусмотреть с помощью этой функции. +// Конфигурация считается базовой, если в ее имени есть термин "Базовая", +// например, "УправлениеТорговлейБазовая". // // Возвращаемое значение: -// Булево - Истина, если конфигурация - базовая. +// Булево - Истина, если конфигурация - базовая. // Функция ЭтоБазоваяВерсияКонфигурации() Экспорт @@ -114,11 +84,15 @@ // Процедура ОбновитьВсеПараметрыРаботыПрограммы() Экспорт - ОбновитьПараметрыРаботыПрограммы(); + РегистрыСведений.ПараметрыРаботыПрограммы.ОбновитьВсеПараметрыРаботыПрограммы(); КонецПроцедуры -// Возвращает номер версии Библиотеки стандартных подсистем. +// Возвращает номер версии Библиотеки стандартных подсистем (БСП), +// встроенной в конфигурацию. +// +// Возвращаемое значение: +// Строка - версия БСП, например "1.0.0.0". // Функция ВерсияБиблиотеки() Экспорт @@ -126,10 +100,17 @@ КонецФункции -// Получает идентификатор информационной базы. -// Если идентификатор не заполнен, то устанавливает его значение. -// Константа ИдентификаторИнформационнойБазы не должна входить в составы планов обмена и иметь -// различные значения в каждой информационной базе. +// Получает уникальный идентификатор информационной базы, +// с помощью которого можно различать различные экземпляры информационных баз, +// например, при сборе статистики или в механизмах внешнего управления базами. +// Если идентификатор не заполнен, то его значение автоматически устанавливается и возвращается. +// +// Идентификатор хранится в константе ИдентификаторИнформационнойБазы. +// Константа ИдентификаторИнформационнойБазы не должна входить в составы планов обмена, чтобы иметь +// различные значения в каждой информационной базе (узле РИБ). +// +// Возвращаемое значение: +// Строка - идентификатор информационной базы. // Функция ИдентификаторИнформационнойБазы() Экспорт @@ -149,43 +130,42 @@ //////////////////////////////////////////////////////////////////////////////// // Параметры администрирования информационной базы и кластера серверов. -// Получает параметры администрирования информационной базы и кластера серверов. -// Пароли при этом не получаются. +// Возвращает сохраненные в информационной базы параметры администрирования. +// Предназначена для использования в механизмах, требующих для свой работы +// ввода параметров администрирования информационной базы и/или кластера серверов. +// Например, блокировка установки соединений с информационной базой. +// См. так же УстановитьПараметрыАдминистрирования. +// // Возвращаемое значение: -// Структура - Содержит свойства двух структур -// АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(). и АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера() +// Структура - содержит свойства двух структур +// АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера +// и АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера. +// При этом поля, содержащие пароли, возвращаются пустыми. Если параметры администрирования +// не были ранее сохранены при помощи функции УстановитьПараметрыАдминистрирования +// то буду возвращены автоматически вычисленные параметры администрирования по-умолчанию. // Функция ПараметрыАдминистрирования() Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); КонецЕсли; - Иначе - Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); КонецЕсли; - КонецЕсли; УстановитьПривилегированныйРежим(Истина); ПараметрыАдминистрированияИБ = Константы.ПараметрыАдминистрированияИБ.Получить().Получить(); ПараметрыАдминистрированияПоУмолчанию = ПараметрыАдминистрированияПоУмолчанию(); - Если ПараметрыАдминистрированияИБ = Неопределено Тогда - ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияПоУмолчанию; - Иначе - Если ПараметрыАдминистрированияИБ.Свойство("РазрешеноОткрытиеВнешнихОтчетовИОбработок") Тогда - ПараметрыАдминистрированияПоУмолчанию.Вставить("РазрешеноОткрытиеВнешнихОтчетовИОбработок"); - КонецЕсли; - Если ПараметрыАдминистрированияИБ.Свойство("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок") Тогда - ПараметрыАдминистрированияПоУмолчанию.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок"); - КонецЕсли; + Если ТипЗнч(ПараметрыАдминистрированияИБ) = Тип("Структура") Тогда ЗаполнитьЗначенияСвойств(ПараметрыАдминистрированияПоУмолчанию, ПараметрыАдминистрированияИБ); КонецЕсли; + ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияПоУмолчанию; Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ПрочитатьПараметрыИзСтрокиСоединения(ПараметрыАдминистрированияИБ); @@ -195,10 +175,18 @@ КонецФункции -// Устанавливает параметры администрирования информационной базы и кластера серверов. +// Сохраняет параметры администрирования информационной базы и кластера серверов. +// При сохранении поля, содержащие пароли, будут очищены в целях безопасности. +// // Параметры: -// ПараметрыАдминистрированияИБ - Структура - см. возвращаемое значение процедуры ПараметрыАдминистрирования(). -// +// ПараметрыАдминистрированияИБ - Структура - см. функция ПараметрыАдминистрирования. +// +// Пример: +// ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); +// // Вывод параметров администрирования администратору для подтверждения корректности и ввода паролей. +// // Далее выполнение действий, связанных с подключением к кластеру серверов. +// СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(ПараметрыАдминистрирования); +// Процедура УстановитьПараметрыАдминистрирования(ПараметрыАдминистрированияИБ) Экспорт ПараметрыАдминистрированияИБ.ПарольАдминистратораКластера = ""; @@ -210,15 +198,23 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с формами. -// Устанавливает размер шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2. +// Устанавливает жирное оформление шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2. +// В интерфейсе Такси заголовки групп с обычным выделением и без выделения выводится большим шрифтом. +// В интерфейсе 8.2 такие заголовки выводятся как обычные надписи и не ассоциируются с заголовками. +// Эта функция предназначена для визуального выделения (жирным шрифтом) заголовков групп в режиме интерфейса 8.2. // // Параметры: -// Форма - УправляемаяФорма - Форма для изменения шрифта заголовков групп; -// ИменаГрупп - Строка - Список имен групп формы, разделенных запятыми. +// Форма - УправляемаяФорма - форма для изменения шрифта заголовков групп; +// ИменаГрупп - Строка - список имен групп формы, разделенных запятыми. Если имена групп не указаны, +// то оформление будет применено ко всем группам на форме. +// +// Пример: +// Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) +// СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); // Процедура УстановитьОтображениеЗаголовковГрупп(Форма, ИменаГрупп = "") Экспорт - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда ЖирныйШрифт = Новый Шрифт(,, Истина); Если НЕ ЗначениеЗаполнено(ИменаГрупп) Тогда Для Каждого Элемент Из Форма.Элементы Цикл @@ -243,16 +239,42 @@ КонецПроцедуры -// Добавляет в форму со списком условное оформление для поля Дата с составом "Дата и время". +// Устанавливает представление поля Дата в списках, содержащих реквизит с составом даты Дата и время. +// Подробнее см. стандарт "Поле "Дата" в списках". // // Параметры: // Форма - УправляемаяФорма - Форма со списком. // ПолноеИмяРеквизита - Строка - Полный путь к реквизиту типа "Дата" в формате "<ИмяСписка>.<ИмяПоля>". // ИмяЭлемента - Строка - Имя элемента формы, связанного с реквизитом списка типа "Дата". // +// Пример: +// Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) +// СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект); +// Процедура УстановитьУсловноеОформлениеПоляДата(Форма, ПолноеИмяРеквизита = "Список.Дата", ИмяЭлемента = "Дата") Экспорт УсловноеОформлениеКД = Форма.УсловноеОформление; - УсловноеОформлениеКД.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; + ПутьКРеквизиту = ПолноеИмяРеквизита; + Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда + МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПутьКРеквизиту, "."); + Если МассивСтрок.Количество() > 1 Тогда + ДинамическийСписок = Форма[МассивСтрок[0]]; + Если ТипЗнч(ДинамическийСписок) = Тип("ДинамическийСписок") Тогда + МассивСтрок.Удалить(0); + УсловноеОформлениеКД = ДинамическийСписок.УсловноеОформление; + ПутьКРеквизиту = СтрСоединить(МассивСтрок, "."); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипЗнч(Форма) <> Тип("ДинамическийСписок") Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + "СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата", + "Форма", + Форма, + Тип("УправляемаяФорма")); + КонецЕсли; + + Если Не ЗначениеЗаполнено(УсловноеОформлениеКД.ИдентификаторПользовательскойНастройки) Тогда + УсловноеОформлениеКД.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; + КонецЕсли; // По умолчанию используется представление "10.06.2012". ЭлементОформления = УсловноеОформлениеКД.Элементы.Добавить(); @@ -273,12 +295,12 @@ ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяЭлемента); ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПолноеИмяРеквизита); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня); ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПолноеИмяРеквизита); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоСледующегоДня); КонецПроцедуры @@ -286,11 +308,13 @@ //////////////////////////////////////////////////////////////////////////////// // Подтверждение завершения работы программы. -// Прочитать настройку подтверждения завершения работы программы -// для текущего пользователя. +// Получает настройку необходимости выводить подтверждение при завершении работы программы +// для текущего пользователя. Предназначена для использования в форме персональных настроек +// пользователя. Пример использования см. в общей форме _ДемоМоиНастройки. // // Возвращаемое значение: -// Булево - значение настройки. +// Булево - Если Истина, то пользователю при закрытии программы будет показано +// окно с подтверждением завершения сеанса. // Функция ЗапрашиватьПодтверждениеПриЗавершенииПрограммы() Экспорт Результат = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ОбщиеНастройкиПользователя", "ЗапрашиватьПодтверждениеПриЗавершенииПрограммы"); @@ -311,8 +335,8 @@ // Параметры: // Объект - ОбъектМетаданных - проверяемый объект. // -// Возвращаемое значение: -// Булево - Истина, если объект используется в РИБ только в момент создания начального образа подчиненного узла. +// Возвращаемое значение: +// Булево - Истина, если объект используется в РИБ только в момент создания начального образа подчиненного узла. // Функция ЭтоОбъектНачальногоОбразаУзлаРИБ(Знач Объект) Экспорт @@ -335,8 +359,8 @@ // и объектов-исключений из состава плана обмена. // // Параметры: -// ИмяПланаОбмена - Строка, ПланОбменаСсылка. Имя плана обмена или ссылка на узел плана обмена, -// для которого необходимо выполнить проверку. +// ИмяПланаОбмена - Строка, ПланОбменаСсылка - имя плана обмена или ссылка на узел плана обмена, +// для которого необходимо выполнить проверку. // Процедура ПроверитьСоставПланаОбмена(Знач ИмяПланаОбмена) Экспорт @@ -356,36 +380,17 @@ ОбъектыИсключения = Новый Массив; ОбъектыНачальногоОбраза = Новый Массив; - // Получаем обязательные объекты. - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - ПризнакРаспределеннаяИнформационнаяБаза = РаспределеннаяИнформационнаяБаза; - - Обработчик.Модуль.ПриПолученииОбязательныхОбъектовПланаОбмена(ОбязательныеОбъекты, ПризнакРаспределеннаяИнформационнаяБаза); - КонецЦикла; - // Получаем объекты-исключения. - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - ПризнакРаспределеннаяИнформационнаяБаза = РаспределеннаяИнформационнаяБаза; - - Обработчик.Модуль.ПриПолученииОбъектовИсключенийПланаОбмена(ОбъектыИсключения, ПризнакРаспределеннаяИнформационнаяБаза); - КонецЦикла; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриПолученииОбъектовИсключенийПланаОбмена(ОбъектыИсключения, + РаспределеннаяИнформационнаяБаза); + КонецЕсли; Если РаспределеннаяИнформационнаяБаза Тогда // Получаем объекты начального образа. - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриПолученииОбъектовНачальногоОбразаПланаОбмена(ОбъектыНачальногоОбраза); - - КонецЦикла; + ОбновлениеИнформационнойБазыСлужебный.ПриПолученииОбъектовНачальногоОбразаПланаОбмена(ОбъектыНачальногоОбраза); Для Каждого Объект Из ОбъектыНачальногоОбраза Цикл @@ -486,526 +491,6 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Работа с событиями служебного программного интерфейса. -// Использование только в пределах библиотеки и отдельно от других библиотек. - -// Определяет список служебных событий. -// Каждая подсистема может предоставлять произвольный набор своих событий для того, -// чтобы на них мог подписаться внешний код (с помощью процедуры ПриДобавленииОбработчиковСлужебныхСобытий). -// В зависимости от контекста работы, события могут вызываться с клиента или из серверного кода. -// Полный список этих событий задается в параметрах КлиентскиеСобытия и СерверныеСобытия. -// Имена событий должны быть заданы по образцу: "имя_подсистемы\имя_события", -// например: "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей". -// -// Параметры: -// КлиентскиеСобытия - Массив - массив полных имен клиентских событий (Строка). -// СерверныеСобытия - Массив - массив полных имен серверных событий (Строка). -// -// Пример использования: -// -// // Определяет событие, которое возникает при открытии формы активных пользователей, -// // которая принадлежит подсистеме СтандартныеПодсистемы.БазоваяФункциональность. -// // В обработчиках этого события можно переопределить стандартное поведение. -// // -// // Параметры: -// // ИмяФормы - Строка - возвращаемое значение. -// // -// // Синтаксис: -// // Процедура ПриОткрытииФормыАктивныхПользователей(ИмяФормы) Экспорт -// // -// СерверныеСобытия.Добавить( -// "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей"); -// -// Комментарий можно копировать при создании нового обработчика. -// Раздел "Синтаксис:" используется для создания новой процедуры обработчика. -// -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - ПриДобавленииСлужебныхСобытийБазовойФункциональности(КлиентскиеСобытия, СерверныеСобытия); - РаботаВБезопасномРежимеСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); - МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); - МодульСоединенияИБ.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); - МодульКалендарныеГрафики.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); - МодульНапоминанияПользователяСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - - ПользователиСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); - МодульОбменСообщениями.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); - МодульИнтерфейсыСообщенийВМоделиСервиса.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); - МодульОчередьЗаданийСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); - МодульПоставляемыеДанные.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); - МодульТекущиеДелаСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); - МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); - МодульФайловыеФункцииСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - -КонецПроцедуры - -// Определяет список обработчиков служебных событий (объявленных в ПриДобавленииСлужебныхСобытий - см. выше). -// -// Параметры: -// КлиентскиеОбработчики - Соответствие - список обработчиков: -// * Ключ - Строка - полное имя события, -// * Значение - Массив - массив имен клиентских общих модулей с процедурой-обработчиком события. -// -// СерверныеОбработчики - Соответствие - список обработчиков: -// * Ключ - Строка - полное имя события, -// * Значение - Массив - массив имен серверных общих модулей с процедурой-обработчиком события. -// -// Имя процедуры-обработчика события совпадает с именем события. -// -// Пример подписки на событие ПриОпределенииФормыАктивныхПользователей подсистемы БазоваяФункциональность: -// -// СерверныеОбработчики[ -// "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей" -// ].Добавить("СоединенияИБ"); -// При этом в общем модуле СоединенияИБ должна быть определена процедура-обработчик -// ПриОпределенииФормыАктивныхПользователей с параметрами, которые соответствуют параметрам события. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - ПриДобавленииОбработчиковСлужебныхСобытийБазовойФункциональности(КлиентскиеОбработчики, СерверныеОбработчики); - РаботаВБезопасномРежимеСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - ПодключаемыеКоманды.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - МодульАдресныйКлассификаторСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда - МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); - МодульАнализЖурналаРегистрацииСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда - МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); - МодульАнкетирование.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда - МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); - МодульРаботаСБанками.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); - МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); - МодульРаботаСКурсамиВалют.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда - МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); - МодульВзаимодействия.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульУправлениеЭлектроннойПочтой = ОбщегоНазначения.ОбщийМодуль("УправлениеЭлектроннойПочтой"); - МодульУправлениеЭлектроннойПочтой.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда - МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); - МодульГрафикиРаботы.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); - МодульСоединенияИБ.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда - МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); - МодульЗаметкиПользователяСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда - МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - МодульЗащитаПерсональныхДанных.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Интеграция1СБухфон") Тогда - МодульИнтеграция1СБухфон = ОбщегоНазначения.ОбщийМодуль("Интеграция1СБухфон"); - МодульИнтеграция1СБухфон.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда - МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); - МодульИнформацияПриЗапуске.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); - МодульКалендарныеГрафики.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); - МодульУправлениеКонтактнойИнформациейСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); - МодульНапоминанияПользователяСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеВерсииИБ") Тогда - МодульОбновлениеИнформационнойБазы = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебный"); - МодульОбновлениеИнформационнойБазы.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда - МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); - МодульОбновлениеКонфигурации.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда - МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); - МодульОтправкаSMS.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); - МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда - МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); - МодульПоискИУдалениеДублей.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); - МодульПолнотекстовыйПоискСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); - МодульПолучениеФайловИзИнтернетаСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда - МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); - МодульПользователиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса") Тогда - МодульАдресныйКлассификаторВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторВМоделиСервисаСлужебный"); - МодульАдресныйКлассификаторВМоделиСервисаСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса") Тогда - МодульБанкиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("БанкиСлужебныйВМоделиСервиса"); - МодульБанкиСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда - МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); - МодульКурсыВалютСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда - МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); - МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); - МодульОбменСообщениями.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); - МодульИнтерфейсыСообщенийВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - - МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); - МодульОчередьЗаданийСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - - Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); - МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); - МодульПоставляемыеДанные.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда - МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); - МодульРезервноеКопированиеОбластейДанных.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УдаленноеАдминистрирование") Тогда - МодульУдаленноеАдминистрированиеСлужебный = ОбщегоНазначения.ОбщийМодуль("УдаленноеАдминистрированиеСлужебный"); - МодульУдаленноеАдминистрированиеСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); - МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); - МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); - МодульРаботаСПочтовымиСообщениями.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); - МодульРассылкаОтчетов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); - МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); - МодульРезервноеКопированиеИБСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); - МодульУправлениеСвойствамиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда - МодульСтруктураПодчиненностиСлужебный = ОбщегоНазначения.ОбщийМодуль("СтруктураПодчиненностиСлужебный"); - МодульСтруктураПодчиненностиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); - МодульТекущиеДелаСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); - МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); - МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); - МодульФайловыеФункцииСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда - МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); - МодульПроверкаКонтрагентов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда - МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); - МодульСклонениеПредставленийОбъектов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - КонецЕсли; - -КонецПроцедуры - -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник ИдентификаторыОбъектовМетаданных запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - - // Загрузка в справочник ИдентификаторыОбъектовРасширений запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - - Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Дополнительная базовая функциональность для анализа параметров клиента на сервере. @@ -1034,88 +519,114 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры для установки/обновления/получения параметров работы программы (кэшей). -// Возвращает параметры работы программы для использования (фиксированные данные), -// которые являются, например, кэшем. +// Проверяет, что в текущем сеансе доступна последняя версия программы, +// в противном случае, вызывает исключение с требованием перезапустить сеанс. // -// Параметры: -// ИмяКонстанты - Строка - имя константы (имя группы параметров работы программы). +// В старых сеансах нельзя обновлять параметры работы программы, а также +// нельзя выполнять изменение некоторых данных, чтобы не перезаписать +// новую версию данных (полученную с помощью новой версии программы) +// старой версией данных (полученной с помощью старой версии программы). // -Функция ПараметрыРаботыПрограммы(ИмяКонстанты) Экспорт +Процедура ПроверитьДинамическоеОбновлениеВерсииПрограммы() Экспорт - Возврат СтандартныеПодсистемыПовтИсп.ПараметрыРаботыПрограммы(ИмяКонстанты); + Если ВерсияПрограммыОбновленаДинамически() Тогда + ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); + КонецЕсли; + +КонецПроцедуры + +// Проверяет, что в текущем сеансе есть динамическое изменение конфигурации базы и +// при этом нет режима обновления информационной базы. +// +// Возвращаемое значение: +// Булево - Истина, если версия программы обновлена. +// +Функция ВерсияПрограммыОбновленаДинамически() Экспорт + + Если Не КонфигурацияБазыДанныхИзмененаДинамически() Тогда + Возврат Ложь; + КонецЕсли; + + // Если конфигурация базы данных изменена динамически после запуска + // обновления информационной базы, но до его завершения, тогда нужно + // продолжать обновление несмотря на изменение. + + Если ОбщегоНазначения.РазделениеВключено() Тогда + // Параметры работы программы только неразделенные, поэтому для них обновление завершено, + // если завершено обновление неразделенных данных. + Возврат Не ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы(); + КонецЕсли; + + Возврат Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); КонецФункции -// Проверяет параметры работы программы для использования (фиксированные данные), -// которые являются, например, кэшем. +// Вызывает исключение с требованием перезапустить сеанс из-за обновления версии программы. +Процедура ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы() Экспорт + + ТекстОшибки = НСтр("ru = 'Версия программы обновлена, требуется перезапустить сеанс.'"); + ВызватьИсключение ТекстОшибки; + +КонецПроцедуры + + +// Возвращает значение параметра работы программы. +// +// В старом сеансе (когда версия программы обновлена динамически), +// если параметр не найден, вызывается исключение с требованием перезапуска, +// если параметр найден, значение возвращается без учета версии. +// +// В разделенном режиме модели сервиса, если параметр не найден или +// версия параметра не равна версии конфигурации вызывается исключение, +// так как обновление неразделенных данных невозможно. // // Параметры: -// ИмяКонстанты - Строка - имя константы (имя группы параметров работы программы). -// ИменаПараметров - Строка - список имен параметров, которые должны быть в константе. -// Требуется при получении обновленных данных через модуль повторного использования -// для блокировки получения, если не все параметры группы (константы) обновлены. -// Не требуется при получении данных с целью обновления. -// Отказ - Неопределено - вызвать исключение, если параметры не обновлены. -// - Булево - возвращаемое значение - не вызывать исключение, -// если параметры не обновлены, а установить Истина. +// ИмяПараметра - Строка - не более 128 символов. Например, +// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // -Процедура ПроверитьОбновлениеПараметровРаботыПрограммы(ИмяКонстанты, ИменаПараметров = "", Отказ = Неопределено) Экспорт +// Возвращаемое значение: +// Произвольный - возвращается Неопределено, когда параметр не найден или +// когда в новом сеансе версия параметра не равна версии конфигурации. +// +Функция ПараметрРаботыПрограммы(ИмяПараметра) Экспорт - Если ИменаПараметров <> "" Тогда - ТребуетсяОбновление = Ложь; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ТребуетсяОбновление = - ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы(); - Иначе - ТребуетсяОбновление = - ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); - КонецЕсли; - - Если ТребуетсяОбновление Тогда - - УстановитьПривилегированныйРежим(Истина); - ВсеОбновленныеПараметры = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить( - "ВсеОбновленныеПараметрыРаботыПрограммы"); - УстановитьПривилегированныйРежим(Ложь); - - Если ВсеОбновленныеПараметры <> Неопределено Тогда - Если ВсеОбновленныеПараметры.Получить("*") <> Неопределено Тогда - ТребуетсяОбновление = Ложь; - Иначе - ОбновленныеПараметры = ВсеОбновленныеПараметры.Получить(ИмяКонстанты); - Если ОбновленныеПараметры <> Неопределено Тогда - ТребуетсяОбновление = Ложь; - ТребуемыеПараметры = Новый Структура(ИменаПараметров); - Для каждого КлючИЗначение Из ТребуемыеПараметры Цикл - Если ОбновленныеПараметры.Получить(КлючИЗначение.Ключ) = Неопределено Тогда - ТребуетсяОбновление = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если ТребуетсяОбновление Тогда - Если Отказ <> Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - Если ТекущийРежимЗапуска() = Неопределено Тогда - ВызватьИсключение - НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию.'"); - Иначе - ВызватьИсключение - НСтр("ru = 'Недопустимое обращение к необновленным параметрам работы программы - |(например, к некоторым параметрам сеанса). - | - |Необходимо перенести вызов прикладного кода - |после обновления параметров работы программы.'"); - КонецЕсли; - КонецЕсли; - КонецЕсли; + Возврат РегистрыСведений.ПараметрыРаботыПрограммы.ПараметрРаботыПрограммы(ИмяПараметра); + +КонецФункции + +// Устанавливает значение параметра работы программы. +// Перед вызовом требуется установить привилегированный режим. +// +// Параметры: +// ИмяПараметра - Строка - не более 128 символов. Например, +// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". +// +// Значение - Произвольный - значение, которое можно поместить в хранилище значения. +// +Процедура УстановитьПараметрРаботыПрограммы(ИмяПараметра, Значение) Экспорт + + РегистрыСведений.ПараметрыРаботыПрограммы.УстановитьПараметрРаботыПрограммы(ИмяПараметра, Значение); + +КонецПроцедуры + +// Обновляет значение параметра работы программы, если изменилось. +// Перед вызовом требуется установить привилегированный режим. +// +// Параметры: +// ИмяПараметра - Строка - не более 128 символов. Например, +// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". +// +// Значение - Произвольный - значение, которое можно поместить в хранилище значения. +// +// ЕстьИзменения - Булево - (возвращаемое значение). Устанавливается Истина, +// если старое и новое значения параметра не совпадают. +// +// СтароеЗначение - Произвольный - (возвращаемое значение) до обновления. +// +Процедура ОбновитьПараметрРаботыПрограммы(ИмяПараметра, Значение, ЕстьИзменения = Ложь, СтароеЗначение = Неопределено) Экспорт + + РегистрыСведений.ПараметрыРаботыПрограммы.ОбновитьПараметрРаботыПрограммы(ИмяПараметра, + Значение, ЕстьИзменения, СтароеЗначение); КонецПроцедуры @@ -1123,574 +634,43 @@ // конфигурации и текущей версии ИБ. // // Параметры: -// Параметры - значение извлеченное из константы, имя которой передавалось -// в процедуру ДобавитьИзмененияПараметраРаботыПрограммы. -// -// ИмяПараметра - Строка, которая передавалась, как параметр ИмяПараметра -// в процедуру ДобавитьИзмененияПараметраРаботыПрограммы. +// ИмяПараметра - Строка - не более 128 символов. Например, +// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // // Возвращаемое значение: // Неопределено - означает, что изменилось все. Возвращается // при начальном заполнении ИБ или области данных. -// Массив - содержит значения изменений. Может быть несколько, например, -// когда область данных давно не обновлялась. +// Массив - содержит значения изменений, если массив пустой, значит изменений нет. +// Может быть несколько изменений, например, когда область данных давно не обновлялась. // -Функция ИзмененияПараметраРаботыПрограммы(Параметры, ИмяПараметра) Экспорт +Функция ИзмененияПараметраРаботыПрограммы(ИмяПараметра) Экспорт - ПоследниеИзменения = Параметры["ИзмененияПараметра" + ИмяПараметра].Получить(); - - Версия = Метаданные.Версия; - СледующаяВерсия = СледующаяВерсия(Версия); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - // План обновления областей строится только для областей, - // которые имеют версию не ниже версии неразделенных данных. - // Для остальных областей запускаются все обработчики обновления. - - // Версия неразделенных (общих) данных. - ВерсияИБ = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя, Истина); - Иначе - ВерсияИБ = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя); - КонецЕсли; - - // При начальном заполнении изменение параметров работы программы не определено. - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, "0.0.0.0") = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - ОбновлениеВнеОбновленияИБ = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, Версия) = 0; - - // Изменения к более старшим версиям не нужны, - // кроме случая когда обновление выполняется вне обновления ИБ, - // т.е. версия ИБ равна версии конфигурации. - // В этом случае дополнительно выбираются изменения к следующей версии. - - Индекс = ПоследниеИзменения.Количество()-1; - Пока Индекс >=0 Цикл - ВерсияИзменения = ПоследниеИзменения[Индекс].ВерсияКонфигурации; - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, ВерсияИзменения) >= 0 - И НЕ ( ОбновлениеВнеОбновленияИБ - И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СледующаяВерсия, ВерсияИзменения) = 0) Тогда - - ПоследниеИзменения.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - - Возврат ПоследниеИзменения.ВыгрузитьКолонку("Изменения"); + Возврат РегистрыСведений.ПараметрыРаботыПрограммы.ИзмененияПараметраРаботыПрограммы(ИмяПараметра); КонецФункции -// Обновляет вспомогательные данные для работы программы, хранимые в неразделенных константах. +// Добавить изменения параметра работы программы при переходе на текущую версию метаданных конфигурации. +// В дальнейшем изменения используются для условного добавления обязательных обработчиков обновления. +// При начальном заполнении ИБ или неразделенных данных добавление изменений пропускается. // -// Параметры: -// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра. -// ИмяПараметра - Строка - имя параметра, который нужно установить (без приставки ИзмененияПараметра). -// ЗначениеПараметра - фиксированные данные, которые устанавливаются в качестве значения параметра, -// если отличаются от ранее установленных. -// ЕстьИзменения - Булево - (возвращаемое значение). Устанавливается Истина, если старое и новое -// значения параметра не совпадают. -// ТолькоПроверка - Булево - если указать Истина, тогда обновление не будет выполнено, а будет -// выполнено только сравнение старого и нового значения параметра, а также -// будет установлен параметр ЕстьИзменения, если значения не совпадают. -// Параметры - ФиксированнаяСтруктура - можно получить с помощью функции ПараметрыРаботыПрограммы. -// - Неопределено - (возвращаемое значение) функции ПараметрыРаботыПрограммы. +// ИмяПараметра - Строка - не более 128 символов. Например, +// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // -Процедура ОбновитьПараметрРаботыПрограммы(ИмяКонстанты, ИмяПараметра, ЗначениеПараметра, - ЕстьИзменения = Ложь, ТолькоПроверка = Ложь, Параметры = Неопределено) Экспорт +// Изменения - Произвольный - фиксированные данные, которые регистрируются в качестве изменений. +// Изменения не добавляются, если значение ИзменениеПараметра не заполнено. +// +Процедура ДобавитьИзмененияПараметраРаботыПрограммы(ИмяПараметра, Изменения) Экспорт - Если Параметры = Неопределено Тогда - Параметры = ПараметрыРаботыПрограммы(ИмяКонстанты); - КонецЕсли; - - СохраненноеЗначение = Неопределено; - - Если Параметры.Свойство(ИмяПараметра) Тогда - СохраненноеЗначение = Параметры[ИмяПараметра]; - - Если Не ОбщегоНазначения.ДанныеСовпадают(ЗначениеПараметра, СохраненноеЗначение) Тогда - СохраненноеЗначение = Неопределено; - КонецЕсли; - КонецЕсли; - - Если СохраненноеЗначение <> Неопределено Тогда - Возврат; - КонецЕсли; - - ЕстьИзменения = Истина; - - Если ТолькоПроверка Тогда - Возврат; - КонецЕсли; - - УстановитьПараметрРаботыПрограммы(ИмяКонстанты, ИмяПараметра, ЗначениеПараметра); + РегистрыСведений.ПараметрыРаботыПрограммы.ДобавитьИзмененияПараметраРаботыПрограммы(ИмяПараметра, Изменения); КонецПроцедуры -// Устанавливает вспомогательные данные для работы программы, хранимые в неразделенных константах. -// -// Параметры: -// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра. -// ИмяПараметра - Строка - имя параметра, который нужно установить (без приставки ИзмененияПараметра). -// ЗначениеПараметра - фиксированные данные, которые устанавливаются в качестве значения параметра. -// -Процедура УстановитьПараметрРаботыПрограммы(ИмяКонстанты, ИмяПараметра, ЗначениеПараметра) Экспорт - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа." + ИмяКонстанты); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Параметры = Константы[ИмяКонстанты].Получить().Получить(); - Если ТипЗнч(Параметры) <> Тип("Структура") Тогда - Параметры = Новый Структура; - КонецЕсли; - - Параметры.Вставить(ИмяПараметра, ЗначениеПараметра); - - МенеджерЗначения = Константы[ИмяКонстанты].СоздатьМенеджерЗначения(); - МенеджерЗначения.ОбменДанными.Загрузка = Истина; - МенеджерЗначения.ОбменДанными.Получатели.Автозаполнение = Ложь; - МенеджерЗначения.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); - МенеджерЗначения.Значение = Новый ХранилищеЗначения(Параметры); - МенеджерЗначения.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - ОбновитьПовторноИспользуемыеЗначения(); - -КонецПроцедуры - -// Добавить изменения вспомогательных данных для работы программы, хранимые в неразделенных константах. -// -// Параметры: -// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра. -// ИмяПараметра - Строка - имя параметра, который нужно установить. -// ИзмененияПараметра - фиксированные данные, которые регистрируются в качестве изменений параметра. -// Изменения не добавляются, если значение ИзменениеПараметра не заполнено. -// -// Прим.: при начальном заполнении ИБ или неразделенных данных -// добавление изменений параметров пропускается. -// -Процедура ДобавитьИзмененияПараметраРаботыПрограммы(ИмяКонстанты, ИмяПараметра, Знач ИзмененияПараметра) Экспорт - - // Получение версии ИБ или неразделенных данных. - ВерсияИБ = ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ(Метаданные.Имя); - - // При переходе на другую программу используется текущая версия конфигурации. - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбновлениеИнформационнойБазыСлужебный.РежимОбновленияДанных() = "ПереходСДругойПрограммы" Тогда - - ВерсияИБ = Метаданные.Версия; - КонецЕсли; - - // При начальном заполнении добавление изменений параметров пропускается. - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, "0.0.0.0") = 0 Тогда - ИзмененияПараметра = Неопределено; - КонецЕсли; - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа." + ИмяКонстанты); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - ОбновитьСоставИзменений = Ложь; - Параметры = СтандартныеПодсистемыПовтИсп.ПараметрыРаботыПрограммы(ИмяКонстанты); - - ИмяПараметраХраненияИзменений = "ИзмененияПараметра" + ИмяПараметра; - - Если Параметры.Свойство(ИмяПараметраХраненияИзменений) Тогда - ПоследниеИзменения = Параметры[ИмяПараметраХраненияИзменений].Получить(); - - Если ТипЗнч(ПоследниеИзменения) <> Тип("ТаблицаЗначений") - ИЛИ ПоследниеИзменения.Колонки.Количество() <> 2 - ИЛИ ПоследниеИзменения.Колонки[0].Имя <> "ВерсияКонфигурации" - ИЛИ ПоследниеИзменения.Колонки[1].Имя <> "Изменения" Тогда - - ПоследниеИзменения = Неопределено; - КонецЕсли; - Иначе - ПоследниеИзменения = Неопределено; - КонецЕсли; - - Если ПоследниеИзменения = Неопределено Тогда - ОбновитьСоставИзменений = Истина; - ПоследниеИзменения = Новый ТаблицаЗначений; - ПоследниеИзменения.Колонки.Добавить("ВерсияКонфигурации"); - ПоследниеИзменения.Колонки.Добавить("Изменения"); - КонецЕсли; - - Если ЗначениеЗаполнено(ИзмененияПараметра) Тогда - - // Если производится обновление вне обновления ИБ, - // тогда требуется добавить изменения к следующей версии, - // чтобы при переходе на очередную версию изменения - // выполненные вне обновления ИБ были учтены. - Версия = Метаданные.Версия; - - ОбновлениеВнеОбновленияИБ = - ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ , Версия) = 0; - - Если ОбновлениеВнеОбновленияИБ Тогда - Версия = СледующаяВерсия(Версия); - КонецЕсли; - - ОбновитьСоставИзменений = Истина; - Строка = ПоследниеИзменения.Добавить(); - Строка.Изменения = ИзмененияПараметра; - Строка.ВерсияКонфигурации = Версия; - КонецЕсли; - - МинимальнаяВерсияИБ = ОбновлениеИнформационнойБазыСлужебныйПовтИсп.МинимальнаяВерсияИБ(); - - // Удаление изменений для версий ИБ, которые меньше минимальной - // вместо версий меньше или равных минимальной, чтобы обеспечить - // возможность обновления вне обновления ИБ. - Индекс = ПоследниеИзменения.Количество()-1; - Пока Индекс >=0 Цикл - ВерсияИзменения = ПоследниеИзменения[Индекс].ВерсияКонфигурации; - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(МинимальнаяВерсияИБ, ВерсияИзменения) > 0 Тогда - ПоследниеИзменения.Удалить(Индекс); - ОбновитьСоставИзменений = Истина; - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - - Если ОбновитьСоставИзменений Тогда - УстановитьПараметрРаботыПрограммы( - ИмяКонстанты, - ИмяПараметраХраненияИзменений, - Новый ХранилищеЗначения(ПоследниеИзменения)); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Регистрирует завершение обновления параметров работы программы -// для возможности использования в сеансе их обновления. -// -Процедура ПодтвердитьОбновлениеПараметраРаботыПрограммы(ИмяКонстанты, ИмяПараметра) Экспорт - - УстановитьПривилегированныйРежим(Истина); - ПараметрыКлиентаНаСервере = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); - - ВсеОбновленныеПараметры = ПараметрыКлиентаНаСервере.Получить("ВсеОбновленныеПараметрыРаботыПрограммы"); - Если ВсеОбновленныеПараметры = Неопределено Тогда - ВсеОбновленныеПараметры = Новый Соответствие; - ОбновленныеПараметры = Новый Соответствие; - Иначе - ОбновленныеПараметры = ВсеОбновленныеПараметры.Получить(ИмяКонстанты); - ВсеОбновленныеПараметры = Новый Соответствие(ВсеОбновленныеПараметры); - Если ОбновленныеПараметры = Неопределено Тогда - ОбновленныеПараметры = Новый Соответствие; - Иначе - ОбновленныеПараметры = Новый Соответствие(ОбновленныеПараметры); - КонецЕсли; - КонецЕсли; - ОбновленныеПараметры.Вставить(ИмяПараметра, Истина); - ВсеОбновленныеПараметры.Вставить(ИмяКонстанты, Новый ФиксированноеСоответствие(ОбновленныеПараметры)); - - ПараметрыКлиентаНаСервере.Вставить("ВсеОбновленныеПараметрыРаботыПрограммы", - Новый ФиксированноеСоответствие(ВсеОбновленныеПараметры)); - - ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ПараметрыКлиентаНаСервере); - -КонецПроцедуры - -// Удаляет вспомогательные данные для работы программы, хранимые в неразделенных константах. -// -// Параметры: -// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра. -// ИмяПараметра - Строка - имя параметра, который нужно установить (без приставки ИзмененияПараметра). -// -Процедура УдалитьПараметрРаботыПрограммы(ИмяКонстанты, ИмяПараметра) Экспорт - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа." + ИмяКонстанты); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - Записать = Ложь; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Параметры = Константы[ИмяКонстанты].Получить().Получить(); - Если ТипЗнч(Параметры) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - Если Параметры.Свойство(ИмяПараметра) Тогда - Параметры.Удалить(ИмяПараметра); - Записать = Истина; - КонецЕсли; - - ИмяПараметраХраненияИзменений = "ИзмененияПараметра" + ИмяПараметра; - - Если Параметры.Свойство(ИмяПараметраХраненияИзменений) Тогда - Параметры.Удалить(ИмяПараметраХраненияИзменений); - Записать = Истина; - КонецЕсли; - - Если Записать Тогда - МенеджерЗначения = Константы[ИмяКонстанты].СоздатьМенеджерЗначения(); - МенеджерЗначения.ОбменДанными.Загрузка = Истина; - МенеджерЗначения.ОбменДанными.Получатели.Автозаполнение = Ложь; - МенеджерЗначения.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); - МенеджерЗначения.Значение = Новый ХранилищеЗначения(Параметры); - МенеджерЗначения.Записать(); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Записать Тогда - ОбновитьПовторноИспользуемыеЗначения(); - КонецЕсли; - -КонецПроцедуры - -// Только для внутреннего использования. -Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима = Неопределено, ВФоне = Ложь) Экспорт - - МодульОценкаПроизводительности = Неопределено; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - МодульОценкаПроизводительности = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительности"); - ВремяНачала = МодульОценкаПроизводительности.НачатьЗамерВремени(); - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - УстановитьПривилегированныйРежим(Истина); - ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); - УстановитьПривилегированныйРежим(Ложь); - Если СтрНайти(НРег(ПараметрЗапускаКлиента), НРег("ЗапуститьОбновлениеИнформационнойБазы")) > 0 Тогда - РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений(); - КонецЕсли; - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений(); - Возврат; - КонецЕсли; - - ВыполнитьЗагрузку = Истина; - Если НЕ НеобходимоОбновлениеПараметровРаботыПрограммы(ВыполнитьЗагрузку) Тогда - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - СнятьМонопольныйРежим = Ложь; - Попытка - Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - // Есть РИБ-обмен данными и обновление в подчиненном узле ИБ. - - // Предварительное обновление кэша служебных событий. - Константы.ПараметрыСлужебныхСобытий.СоздатьМенеджерЗначения().Обновить(); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - КонецЕсли; - - Если ВыполнитьЗагрузку Тогда - - СтандартнаяОбработка = Истина; - ОбщегоНазначенияПереопределяемый.ПередЗагрузкойПриоритетныхДанныхВПодчиненномРИБУзле( - СтандартнаяОбработка); - - Если СтандартнаяОбработка = Истина - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - - Если НЕ МонопольныйРежим() Тогда - Попытка - УстановитьМонопольныйРежим(Истина); - СнятьМонопольныйРежим = Истина; - Исключение - Если ОшибкаУстановкиМонопольногоРежима <> Неопределено Тогда - ОшибкаУстановкиМонопольногоРежима = - НСтр("ru = 'Невозможно выполнить обновление информационной базы: - |- Невозможно установить монопольный режим - |- Версия конфигурации не предусматривает обновление без установки монопольного режима.'"); - КонецЕсли; - ВызватьИсключение ОшибкаУстановкиМонопольногоРежима; - КонецПопытки; - КонецЕсли; - - // Загрузка предопределенных элементов и идентификаторов объектов метаданных из главного узла. - МодульОбменДаннымиСервер.ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБ(); - КонецЕсли; - - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(5); - КонецЕсли; - КонецЕсли; - - // Проверка загрузки идентификаторов объектов метаданных из главного узла. - СписокКритичныхИзменений = ""; - Попытка - Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Ложь, Ложь, Истина, , СписокКритичныхИзменений); - Исключение - // Переход в режим открытия формы повторной синхронизации данных перед запуском - // с одним вариантом "Синхронизировать и продолжить". - Если ВыполнитьЗагрузку И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер.ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если ЗначениеЗаполнено(СписокКритичныхИзменений) Тогда - - ИмяСобытия = НСтр("ru = 'Идентификаторы объектов метаданных.Требуется загрузить критичные изменения'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , СписокКритичныхИзменений); - - // Переход в режим открытия формы повторной синхронизации данных перед запуском - // с одним вариантом "Синхронизировать и продолжить". - Если ВыполнитьЗагрузку И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер.ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); - КонецЕсли; - - ТекстОшибки = - НСтр("ru = 'Информационная база не может быть обновлена из-за проблемы в главном узле: - |- главный узел был некорректно обновлен (возможно не был увеличен номер версии конфигурации, - | из-за чего не заполнился справочник Идентификаторы объектов метаданных); - |- либо были отменены к выгрузке приоритетные данные (элементы - | справочника Идентификаторы объектов метаданных). - | - |Необходимо заново выполнить обновление главного узла, зарегистрировать к выгрузке - |приоритетные данные и повторить синхронизацию данных: - |- в главном узле запустите программу с параметром /C ЗапуститьОбновлениеИнформационнойБазы; - |%1'"); - - Если ВыполнитьЗагрузку Тогда - // Обновление подчиненного узла РИБ. - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, - НСтр("ru = '- затем повторите синхронизацию данных с этой информационной базой - | (сначала в главном узле, затем в этой информационной базе после перезапуска).'")); - Иначе - // Настройка подчиненного узла РИБ при первом запуске. - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, - НСтр("ru = '- затем повторите создание подчиненного узла.'")); - КонецЕсли; - - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(10); - КонецЕсли; - КонецЕсли; - - // Нет РИБ-обмена данными - // или обновление в главном узле ИБ - // или обновление при первом запуске подчиненного узла - // или обновление после загрузки справочника "Идентификаторы объектов метаданных" из главного узла. - ОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима, ВФоне); - - // Заполнение параметров работы расширений. - Если Не ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) Тогда - РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений(); - КонецЕсли; - Исключение - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если МодульОценкаПроизводительности <> Неопределено Тогда - МодульОценкаПроизводительности.ЗакончитьЗамерВремени("ВремяОбновленияКэшейМетаданных", ВремяНачала); - КонецЕсли; - -КонецПроцедуры - -// Только для внутреннего использования. -Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммыВФоне(ПараметрыВыполнения, АдресХранилища) Экспорт - - Если ПараметрыВыполнения.Свойство("ПараметрыКлиентаНаСервере") Тогда - ПараметрыСеанса.ПараметрыКлиентаНаСервере = ПараметрыВыполнения.ПараметрыКлиентаНаСервере; - Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений(); - ВФоне = Истина; - Иначе - ВФоне = Ложь; - КонецЕсли; - - РезультатВыполнения = Новый Структура; - РезультатВыполнения.Вставить("КраткоеСообщениеОбОшибке", Неопределено); - РезультатВыполнения.Вставить("ПодробноеСообщениеОбОшибке", Неопределено); - - ОшибкаУстановкиМонопольногоРежима = ""; - Попытка - ЗагрузитьОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима, ВФоне); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - РезультатВыполнения.КраткоеСообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатВыполнения.ПодробноеСообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - // Переход в режим открытия формы повторной синхронизации данных перед запуском - // с двумя вариантами "Синхронизировать и продолжить" и "Продолжить". - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") - И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); - КонецЕсли; - КонецПопытки; - - Если ИнформацияОбОшибке = Неопределено - И ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) - И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - - ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); - Если СтрНайти(ПараметрЗапускаКлиента, "РегламентныеЗаданияОтключены") = 0 Тогда - ОшибкаУстановкиМонопольногоРежима = "ЗаблокироватьВыполнениеРегламентныхЗаданий"; - КонецЕсли; - КонецЕсли; - - РезультатВыполнения.Вставить("ОшибкаУстановкиМонопольногоРежима", ОшибкаУстановкиМонопольногоРежима); - - Если Не ЗначениеЗаполнено(РезультатВыполнения.КраткоеСообщениеОбОшибке) - И ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) - И ОшибкаУстановкиМонопольногоРежима <> "ЗаблокироватьВыполнениеРегламентныхЗаданий" Тогда - - РезультатВыполнения.КраткоеСообщениеОбОшибке = ОшибкаУстановкиМонопольногоРежима; - РезультатВыполнения.ПодробноеСообщениеОбОшибке = ОшибкаУстановкиМонопольногоРежима; - КонецЕсли; - - Если ПараметрыВыполнения.Свойство("ПараметрыКлиентаНаСервере") Тогда - РезультатВыполнения.Вставить("ПараметрыКлиентаНаСервере", ПараметрыСеанса.ПараметрыКлиентаНаСервере); - КонецЕсли; - - ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища); - -КонецПроцедуры // Только для внутреннего использования. Процедура ЗарегистрироватьИзменениеПриоритетныхДанныхДляПодчиненныхУзловРИБ() Экспорт Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -1726,7 +706,7 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры для установки/получения параметров работы расширений (кэшей). -// Возвращает хранилище значения параметра для текущей версии расширений. +// Возвращает значения параметра для текущей версии расширений. // Если не заполнен, возвращает Неопределено. // // Параметры: @@ -1734,12 +714,12 @@ // "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // // Возвращаемое значение: -// ХранилищеЗначения - если параметр заполнен для текущей версии расширений. -// Неопределено - если параметр не заполнен для текущей версии расширений. +// Произвольный - возвращается Неопределено, если параметр не заполнен +// для текущей версии расширений. // -Функция ПараметрРаботыРасширения(ИмяПараметра) Экспорт +Функция ПараметрРаботыРасширения(ИмяПараметра, БезУчетаВерсииРасширений = Ложь) Экспорт - Возврат РегистрыСведений.ПараметрыРаботыВерсийРасширений.ПараметрРаботыРасширения(ИмяПараметра); + Возврат РегистрыСведений.ПараметрыРаботыВерсийРасширений.ПараметрРаботыРасширения(ИмяПараметра, БезУчетаВерсииРасширений); КонецФункции @@ -1751,11 +731,11 @@ // ИмяПараметра - Строка - не более 128 символов. Например, // "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // -// Хранилище - ХранилищеЗначения - хранилище, содержащее значение параметра. +// Значение - Произвольный - значение параметра. // -Процедура УстановитьПараметрРаботыРасширения(ИмяПараметра, Хранилище) Экспорт +Процедура УстановитьПараметрРаботыРасширения(ИмяПараметра, Значение, БезУчетаВерсииРасширений = Ложь) Экспорт - РегистрыСведений.ПараметрыРаботыВерсийРасширений.УстановитьПараметрРаботыРасширения(ИмяПараметра, Хранилище); + РегистрыСведений.ПараметрыРаботыВерсийРасширений.УстановитьПараметрРаботыРасширения(ИмяПараметра, Значение, БезУчетаВерсииРасширений); КонецПроцедуры @@ -1770,14 +750,11 @@ // Возвращаемое значение: // Булево - если Истина, значит объект метаданных неразделенного расширения. // -Функция ОбъектМетаданныхНеразделенногоРасширения(ОбъектМетаданных) - - Если Справочники.ВерсииРасширений.УстановленныеРасширенияДоступны() Тогда - Возврат Ложь; +Функция ЭтоОбъектРасширенияНеразделенногоПользователя(ОбъектМетаданных, УстановленныеРасширенияДоступны = Неопределено) Экспорт + Если УстановленныеРасширенияДоступны = Неопределено Тогда + УстановленныеРасширенияДоступны = Справочники.ВерсииРасширений.УстановленныеРасширенияДоступны(); КонецЕсли; - - Возврат ОбъектМетаданных.РасширениеКонфигурации() <> Неопределено; - + Возврат Не УстановленныеРасширенияДоступны И ОбъектМетаданных.РасширениеКонфигурации() <> Неопределено; КонецФункции // Обработчик регламентного задания УдалениеУстаревшихПараметровРаботыВерсийРасширений. @@ -1822,7 +799,7 @@ ОбъектМетаданных = ОписаниеОбъектаМетаданных; КонецЕсли; Если ТипЗнч(ОбъектМетаданных) = Тип("ОбъектМетаданных") - И ОбъектМетаданныхНеразделенногоРасширения(ОбъектМетаданных) Тогда + И ЭтоОбъектРасширенияНеразделенногоПользователя(ОбъектМетаданных) Тогда Возврат ОбъектМетаданных.ПолноеИмя(); КонецЕсли; @@ -1835,35 +812,53 @@ // Выполняет регистрацию изменений объекта на всех узлах плана обмена. // Для разделенных конфигураций должны выполняться условия: -// план обмена должен быть разделенным, -// регистрируемый объект должен быть неразделенным. +// - план обмена должен быть разделенным, +// - регистрируемый объект должен быть неразделенным. // // Параметры: -// Объект - Объект данных (СправочникОбъект, ДокументОбъект и пр.). Объект, который требуется зарегистрировать. -// Объект должен быть неразделенным, иначе будет выдано исключение. +// Объект - Объект - СправочникОбъект, ДокументОбъект и др., который требуется зарегистрировать. +// Объект должен быть неразделенным, иначе будет выдано исключение. // -// ИмяПланаОбмена - Строка. Имя плана обмена, на всех узлах которого требуется выполнить регистрацию объекта. -// План обмена должен быть разделенным, иначе будет выдано исключение. +// ИмяПланаОбмена - Строка - имя плана обмена, на всех узлах которого требуется выполнить регистрацию объекта. +// План обмена должен быть разделенным, иначе будет выдано исключение. // -Процедура ЗарегистрироватьОбъектНаВсехУзлах(Знач Объект, Знач ИмяПланаОбмена) Экспорт +// ВключаяГлавныйУзел - Булево - если Ложь, тогда в подчиненном узле +// не будет выполнена регистрация для главного узла. +// +// +Процедура ЗарегистрироватьОбъектНаВсехУзлах(Знач Объект, Знач ИмяПланаОбмена, Знач ВключаяГлавныйУзел = Истина) Экспорт Если Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(Объект.Метаданные()) = Неопределено Тогда Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ВызватьИсключение НСтр("ru = 'Регистрация изменений неразделенных данных в разделенном режиме.'"); КонецЕсли; - Если Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена, - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) Тогда - ВызватьИсключение НСтр("ru = 'Регистрация изменений для неразделенных планов обмена не поддерживается.'"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйПланОбмена = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + "ПланОбмена." + ИмяПланаОбмена, МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); + Иначе + ЭтоРазделенныйПланОбмена = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), - ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) Тогда + Если Не ЭтоРазделенныйПланОбмена Тогда + ВызватьИсключение НСтр("ru = 'Регистрация изменений для неразделенных планов обмена не поддерживается.'"); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( + Объект.Метаданные().ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Если ЭтоРазделенныйОбъектМетаданных Тогда ВызватьИсключение НСтр("ru = 'Регистрация изменений для разделенных объектов не поддерживается.'"); КонецЕсли; @@ -1908,10 +903,13 @@ Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель"); + ГлавныйУзел = ПланыОбмена.ГлавныйУзел(); + Для Каждого Получатель Из Получатели Цикл - + Если Не ВключаяГлавныйУзел И Получатель = ГлавныйУзел Тогда + Продолжить; + КонецЕсли; Объект.ОбменДанными.Получатели.Добавить(Получатель); - КонецЦикла; КонецЕсли; @@ -1961,8 +959,6 @@ Возврат; КонецЕсли; - ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными"); - // Отправка идентификаторов объектов метаданных выполняется в другой секции сообщения обмена. ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза); @@ -1972,6 +968,8 @@ Возврат; КонецЕсли; + ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными"); + // Вставка кода от подсистемы обмена данными должна быть первой. Если ПодсистемаОбменДаннымиСуществует Тогда МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); @@ -1982,16 +980,10 @@ КонецЕсли; КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОтправкеДанныхПодчиненному( - ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; // Вставка кода от подсистемы обмена данными в модели сервиса должна быть последней, влияющей на логику отправки. Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда @@ -2010,46 +1002,6 @@ КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Знач Получатель) - - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - - // Отправка идентификаторов объектов метаданных выполняется в другой секции сообщения обмена. - ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента); - - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - - // Вставка кода от подсистемы обмена данными должна быть первой. - // При отправке данных главному обработчик не вызываем, - // т.к. ограничение миграции "снизу-вверх" в РИБ по умолчанию не предусмотрено. - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); - Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - КонецЦикла; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.РассчитатьПроцентВыгрузкиРИБ(Получатель, Ложь); - КонецЕсли; - -КонецПроцедуры - // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной // информационной базе. // @@ -2058,20 +1010,20 @@ // Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Знач Отправитель) Экспорт + // Идентификаторы объектов метаданных могут изменяться только в главном узле. + ИгнорироватьПолучениеИдентификаторовОбъектовМетаданных(ЭлементДанных, ПолучениеЭлемента); + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда Возврат; КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"); + ИнтеграцияСтандартныхПодсистем.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПолученииДанныхОтПодчиненного( - ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); - Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - КонецЦикла; + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными"); @@ -2114,16 +1066,13 @@ КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"); + ИнтеграцияСтандартныхПодсистем.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПолученииДанныхОтГлавного( - ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); - Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда - Возврат; - КонецЕсли; - КонецЦикла; + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтГлавного(Отправитель, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад); // Вставка кода от подсистемы обмена данными должна быть последней, влияющей на логику получения. Если ПодсистемаОбменДаннымиСуществует @@ -2141,177 +1090,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий базовой функциональности. - -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). -// -Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда - МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); - МодульОбработкиПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); - КонецЕсли; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - ДобавитьПараметрыРаботыКлиента(Параметры); - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок -// при загрузке данных в другую информационную базу. -// -// Параметры: -// Типы - Массив(ОбъектМетаданных). -// -Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - - Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных); - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВИнтернете); - Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВЛокальнойСети); - - Типы.Добавить(Метаданные.Справочники.ВерсииРасширений); - Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовРасширений); - Типы.Добавить(Метаданные.РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений); - Типы.Добавить(Метаданные.РегистрыСведений.ПараметрыРаботыВерсийРасширений); - Типы.Добавить(Метаданные.РегистрыСведений.СеансыВерсийРасширений); - -КонецПроцедуры - -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Разрешения = Новый Массив(); - - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, - НСтр("ru = 'Для возможности работы программы.'"))); - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима()); - - ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения)); - - ДобавитьЗапросРазрешенийНаИспользованиеРасширений(ЗапросыРазрешений); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если МодульТекущиеДелаСервер.ДелоОтключено("РекомендацияПоПовышениюСкоростиРаботы") Тогда - Возврат; - КонецЕсли; - - Идентификатор = "РекомендацияПоПовышениюСкоростиРаботы"; - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = Идентификатор; - Дело.ЕстьДела = ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти(); - Дело.Важное = Истина; - Дело.Представление = НСтр("ru = 'Скорость работы снижена'"); - Дело.Форма = "Обработка.РекомендацияПоПовышениюСкоростиРаботы.Форма.Форма"; - Дело.Владелец = НСтр("ru = 'Скорость работы программы'"); - -КонецПроцедуры - -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - - // ТолькоДляАдминистраторовСистемы. - НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( - Метаданные.Роли.АдминистраторСистемы.Имя); - - НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( - Метаданные.Роли.Администрирование.Имя); - - НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( - Метаданные.Роли.ОбновлениеКонфигурацииБазыДанных.Имя); - - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ЭтоБазоваяВерсияКонфигурации() Тогда - - НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( - Метаданные.Роли.ПолныеПрава.Имя); - КонецЕсли; - - // ТолькоДляПользователейСистемы. - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.ЗапускТолстогоКлиента.Имя); - - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.ЗапускВнешнегоСоединения.Имя); - - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.ЗапускAutomation.Имя); - - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.РежимВсеФункции.Имя); - - НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( - Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.Имя); - - // ТолькоДляВнешнихПользователей. - НазначениеРолей.ТолькоДляВнешнихПользователей.Добавить( - Метаданные.Роли.БазовыеПраваВнешнегоПользователя.Имя); - - // СовместноДляПользователейИВнешнихПользователей. - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ЗапускТонкогоКлиента.Имя); - - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ЗапускВебКлиента.Имя); - - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.ВыводНаПринтерФайлБуферОбмена.Имя); - - НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( - Метаданные.Роли.СохранениеДанныхПользователя.Имя); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Дополнительные функции для работы с типами. @@ -2456,30 +1234,6 @@ //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции. -// Устанавливает использование предопределенного регламентного задания. -// -// Параметры: -// ЗаданиеМетаданные - ОбъектМетаданных - метаданные предопределенного регламентного задания. -// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. -// -Процедура УстановитьИспользованиеПредопределенногоРегламентногоЗадания(ЗаданиеМетаданные, Использование) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.УстановитьИспользованиеПредопределенногоРегламентногоЗадания(ЗаданиеМетаданные, Использование); - КонецЕсли; - Иначе - Задание = РегламентныеЗадания.НайтиПредопределенное(ЗаданиеМетаданные); - - Если Задание.Использование <> Использование Тогда - Задание.Использование = Использование; - Задание.Записать(); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - // Возвращает уточнения при возникновении проблем с параметрами работы программы. Функция УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика() Экспорт @@ -2639,116 +1393,300 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Условное оформление управляемой формы. +// Возвращает таблицу возможных форматов для сохранения табличного документа. +// +// Возвращаемое значение +// ТаблицаЗначений: +// ТипФайлаТабличногоДокумента - ТипФайлаТабличногоДокумента - значение в платформе, +// соответствующее +// формату; +// Ссылка - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на метаданные, +// где хранится +// представление; +// Представление - Строка - - представление типа +// файла (заполняется из перечисления); +// Расширение - Строка - - тип файла для +// операционной системы; +// Картинка - Картинка - значок формата. +// +// Примечание: таблица форматов может быть переопределена в процедуре +// УправлениеПечатьюПереопределяемый.ПриЗаполненииНастроекФорматовСохранения(). +// +Функция НастройкиФорматовСохраненияТабличногоДокумента() Экспорт + + ТаблицаФорматов = Новый ТаблицаЗначений; + + ТаблицаФорматов.Колонки.Добавить("ТипФайлаТабличногоДокумента", Новый ОписаниеТипов("ТипФайлаТабличногоДокумента")); + ТаблицаФорматов.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ПеречислениеСсылка.ФорматыСохраненияОтчетов")); + ТаблицаФорматов.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + ТаблицаФорматов.Колонки.Добавить("Расширение", Новый ОписаниеТипов("Строка")); + ТаблицаФорматов.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка")); -// Формирует структуру, описывающую элемент условного оформления. -// Используется перед вызовом ДобавитьЭлементУсловногоОформления(). -// -// Возвращаемое значение: -// Структура - Шаблон, описывающий элемент условного оформления. -// Подробнее см. значение 2го параметра функции ДобавитьЭлементУсловногоОформления(). -// -Функция ИнструкцияУсловногоОформления() Экспорт - Возврат Новый Структура("Отборы, Оформление, Поля", Новый Соответствие, Новый Соответствие, ""); + // Документ PDF (.pdf) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.PDF; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.PDF; + НовыйФормат.Расширение = "pdf"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматPDF; + + // Лист Microsoft Excel 2007 (.xlsx) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLSX; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLSX; + НовыйФормат.Расширение = "xlsx"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel2007; + + // Лист Microsoft Excel 97-2003 (.xls) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLS; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLS; + НовыйФормат.Расширение = "xls"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel; + + // Электронная таблица OpenDocument (.ods). + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ODS; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ODS; + НовыйФормат.Расширение = "ods"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматOpenOfficeCalc; + + // Табличный документ (.mxl) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.MXL; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.MXL; + НовыйФормат.Расширение = "mxl"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматMXL; + + // Документ Word 2007 (.docx) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.DOCX; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.DOCX; + НовыйФормат.Расширение = "docx"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматWord2007; + + // Веб-страница (.html) + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.HTML5; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.HTML; + НовыйФормат.Расширение = "html"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматHTML; + + // Текстовый документ UTF-8 (.txt). + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.TXT; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.TXT; + НовыйФормат.Расширение = "txt"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT; + + // Текстовый документ ANSI (.txt). + НовыйФормат = ТаблицаФорматов.Добавить(); + НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ANSITXT; + НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ANSITXT; + НовыйФормат.Расширение = "txt"; + НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT; + + Для Каждого ФорматСохранения Из ТаблицаФорматов Цикл + ФорматСохранения.Представление = Строка(ФорматСохранения.Ссылка); + КонецЦикла; + + Возврат ТаблицаФорматов; + КонецФункции -// Добавляет элемент условного оформления в форму согласно его описанию в параметре Инструкция. -// -// Параметры: -// Форма - УправляемаяФорма - Форма, в которую необходимо добавить условное оформление. -// Инструкция - Структура - Описание элемента условного оформления. -// * Поля - Строка - Имена элементов формы, разделенные запятыми, для которых применяется оформление. -// Например: "Поле1, Поле2". -// * Отборы - Соответствие - Фильтр для применения этого оформления. -// ** Ключ - Строка - Полное имя реквизита формы, по которому выполняется отбор условного оформления. -// ** Значение - Произвольный - Значение условного оформления. -// - Произвольный, кроме указанных ниже - -// Используется для условия "Равно". -// В ПравоеЗначение записывается значение Значение, -// а в ВидСравнения устанавливается ВидСравненияКомпоновкиДанных.Равно. -// - Массив - -// Используется для условия "В списке". -// В ПравоеЗначение записывается Значение (массив), -// а в ВидСравнения записывается ВидСравненияКомпоновкиДанных.ВСписке. -// - ВидСравненияКомпоновкиДанных - -// Используется для установки условия без значения (например, ВидСравненияКомпоновкиДанных.Заполнено). -// В ПравоеЗначение ничего не записывается, -// а в ВидСравнения записывается Значение. -// - Структура - Используется во всех остальных случаях. -// *** Вид - Имя ключа системного перечисления "ВидСравненияКомпоновкиДанных". -// *** Значение - Значение, которое будет записано в правое значение. -// В ПравоеЗначение записывается Структура.Значение, -// а в ВидСравнения записывается ВидСравненияКомпоновкиДанных[Структура.Вид]. -// * Оформление - Соответствие - Как оформлять указанные поля. -// ** Ключ - Строка - Имя параметра оформления компоновки данных. -// ** Значение - Произвольный - Значение параметра. -// Имена параметров и их значения см. в синтакс-помощнике: "ОформлениеКомпоновкиДанных", блок "Описание". -// -// Например: -// -// Пример № 1 - подсветка строк серым цветом (таблица называется "ВариантыОтчета"). -// Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); -// Инструкция.Поля = "ВариантыОтчета, ВариантыОтчетаНаименование"; -// Инструкция.Отборы.Вставить("ВариантыОтчета.Пользовательский", Ложь); -// Инструкция.Оформление.Вставить("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); -// СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); -// -// Пример № 2 - скрытие строк дерева (таблица называется "ДеревоВариантовОтчета"). -// Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); -// Инструкция.Поля = "ДеревоВариантовОтчета, ДеревоВариантовОтчетаПредставление, ДеревоВариантовОтчетаАвтор"; -// Инструкция.Отборы.Вставить("ДеревоВариантовОтчета.СкрытОтбором", Истина); -// Инструкция.Оформление.Вставить("Видимость", Ложь); -// Инструкция.Оформление.Вставить("Отображать", Ложь); -// СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); -// -// Пример № 3 - недоступность полей. -// Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); -// Инструкция.Отборы.Вставить("Отборы.ЭтоРаздел", Истина); -// Инструкция.Поля = "ОтборыУсловие, ОтборыЗначение, ОтборыПредставлениеЗначения, ОтборыИндексКартинкиДоступа, ОтборыЗаголовок"; -// Инструкция.Оформление.Вставить("ТолькоПросмотр", Истина); -// СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); -// -// Возвращаемое значение: -// ЭлементУсловногоОформленияКомпоновкиДанных - Добавленный элемент. -// -Функция ДобавитьЭлементУсловногоОформления(Форма, Инструкция) Экспорт - ЭлементУсловногоОформленияКД = Форма.УсловноеОформление.Элементы.Добавить(); - ЭлементУсловногоОформленияКД.Использование = Истина; +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - ДополнитьОтборыИзСтруктуры(ЭлементУсловногоОформленияКД.Отбор, Инструкция.Отборы); - - Для Каждого КлючИЗначение Из Инструкция.Оформление Цикл - ЭлементУсловногоОформленияКД.Оформление.УстановитьЗначениеПараметра( - Новый ПараметрКомпоновкиДанных(КлючИЗначение.Ключ), - КлючИЗначение.Значение); - КонецЦикла; - - РежимОтладки = ОбщегоНазначенияКлиентСервер.РежимОтладки(); - - Поля = Инструкция.Поля; - Если ТипЗнч(Поля) = Тип("Строка") Тогда - Поля = СтрРазделить(Поля, ",", Ложь); + // Загрузка в справочник ИдентификаторыОбъектовМетаданных запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); КонецЕсли; - Для Каждого Поле Из Поля Цикл - ИмяЭлемента = СокрЛП(Поле); - ПолеКД = ЭлементУсловногоОформленияКД.Поля.Элементы.Добавить(); - ПолеКД.Использование = Истина; - ПолеКД.Поле = Новый ПолеКомпоновкиДанных(ИмяЭлемента); - Если РежимОтладки И Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда - Шаблон = НСтр("ru = 'Ошибка добавления условного оформления: Не найден элемент ""%1"".'"); - Сообщение = Новый СообщениеПользователю; - Сообщение.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ИмяЭлемента); - Сообщение.ИдентификаторНазначения = Форма.УникальныйИдентификатор; - Сообщение.Сообщить(); - КонецЕсли; - КонецЦикла; - Возврат ЭлементУсловногоОформленияКД; -КонецФункции + // Загрузка в справочник ИдентификаторыОбъектовРасширений запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции работы со статистикой использования конфигурации. +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + + Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт + + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанных.Измерения.Владелец); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.Измерения.Владелец); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + ДобавитьПараметрыРаботыКлиента(Параметры); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВИнтернете); + Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВЛокальнойСети); + + Типы.Добавить(Метаданные.Справочники.ВерсииРасширений); + Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовРасширений); + Типы.Добавить(Метаданные.РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений); + Типы.Добавить(Метаданные.РегистрыСведений.ПараметрыРаботыВерсийРасширений); + Типы.Добавить(Метаданные.РегистрыСведений.СеансыВерсийРасширений); + +КонецПроцедуры + +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. +Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Разрешения = Новый Массив(); + + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, + НСтр("ru = 'Для возможности работы программы.'"))); + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима()); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения)); + + ДобавитьЗапросРазрешенийНаИспользованиеРасширений(ЗапросыРазрешений); + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если МодульТекущиеДелаСервер.ДелоОтключено("РекомендацияПоПовышениюСкоростиРаботы") Тогда + Возврат; + КонецЕсли; + + Идентификатор = "РекомендацияПоПовышениюСкоростиРаботы"; + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = Идентификатор; + Дело.ЕстьДела = ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти(); + Дело.Важное = Истина; + Дело.Представление = НСтр("ru = 'Скорость работы снижена'"); + Дело.Форма = "Обработка.РекомендацияПоПовышениюСкоростиРаботы.Форма.Форма"; + Дело.Владелец = НСтр("ru = 'Скорость работы программы'"); + +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт + + // ТолькоДляАдминистраторовСистемы. + НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( + Метаданные.Роли.АдминистраторСистемы.Имя); + + НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( + Метаданные.Роли.Администрирование.Имя); + + НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить( + Метаданные.Роли.ОбновлениеКонфигурацииБазыДанных.Имя); + + // ТолькоДляПользователейСистемы. + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.ЗапускТолстогоКлиента.Имя); + + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.ЗапускВнешнегоСоединения.Имя); + + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.ЗапускAutomation.Имя); + + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.РежимВсеФункции.Имя); + + НазначениеРолей.ТолькоДляПользователейСистемы.Добавить( + Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.Имя); + + // ТолькоДляВнешнихПользователей. + НазначениеРолей.ТолькоДляВнешнихПользователей.Добавить( + Метаданные.Роли.БазовыеПраваВнешнегоПользователя.Имя); + + // СовместноДляПользователейИВнешнихПользователей. + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ЗапускТонкогоКлиента.Имя); + + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ЗапускВебКлиента.Имя); + + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.ВыводНаПринтерФайлБуферОбмена.Имя); + + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.СохранениеДанныхПользователя.Имя); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений.Имя); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.УстановитьКонстантуНеИспользоватьРазделениеПоОбластямДанных"; + Обработчик.Приоритет = 99; + Обработчик.ОбщиеДанные = Истина; + Обработчик.МонопольныйРежим = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПометитьЗаписиКэшаВерсийНеактуальными"; + Обработчик.Приоритет = 99; + Обработчик.ОбщиеДанные = Истина; + Обработчик.МонопольныйРежим = Ложь; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.2.10"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.ОбновитьПараметрыАдминистрированияИнформационнойБазы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.4.17"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.УстановитьЗначениеКонстантыГлавныйУзел"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.1.18"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПеренестиПаролиВБезопасноеХранилищеОбщиеДанные"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.1.18"; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПеренестиПаролиВБезопасноеХранилище"; + +КонецПроцедуры // Собирает статистику использования конфигурации. // @@ -2776,56 +1714,47 @@ МодульПроверкаКонтрагентов.СобратьСтатистикуКонфигурации(); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункции = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункции"); - МодульФайловыеФункции.СобратьСтатистикуКонфигурации(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный.СобратьСтатистикуКонфигурации(); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Отборы. - -// Устанавливает отборы по расширенной информации из структуры. -Процедура ДополнитьОтборыИзСтруктуры(Отбор, Структура, РежимОтображения = Неопределено) Экспорт - Если РежимОтображения = Неопределено Тогда - РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - КонецЕсли; - Для Каждого КлючИЗначение Из Структура Цикл - ИмяПоля = КлючИЗначение.Ключ; - ОтборПоля = КлючИЗначение.Значение; - Тип = ТипЗнч(ОтборПоля); - Если Тип = Тип("Структура") Тогда - Условие = ВидСравненияКомпоновкиДанных[ОтборПоля.Вид]; - Значение = ОтборПоля.Значение; - ИначеЕсли Тип = Тип("Массив") Тогда - Условие = ВидСравненияКомпоновкиДанных.ВСписке; - Значение = ОтборПоля; - ИначеЕсли Тип = Тип("СписокЗначений") Тогда - Условие = ВидСравненияКомпоновкиДанных.ВСписке; - Значение = ОтборПоля.ВыгрузитьЗначения(); - ИначеЕсли Тип = Тип("ВидСравненияКомпоновкиДанных") Тогда - Условие = ОтборПоля; - Значение = Неопределено; - Иначе - Условие = ВидСравненияКомпоновкиДанных.Равно; - Значение = ОтборПоля; - КонецЕсли; - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( - Отбор, - ИмяПоля, - Значение, - Условие, - , - Истина, - РежимОтображения); - КонецЦикла; -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной +// информационной базе. +// +// Параметры: +// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. +// +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Знач Получатель) + + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; + + // Отправка идентификаторов объектов метаданных выполняется в другой секции сообщения обмена. + ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента); + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда + Возврат; + КонецЕсли; + + ИнтеграцияСтандартныхПодсистем.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер.РассчитатьПроцентВыгрузкиРИБ(Получатель, Ложь); + КонецЕсли; + +КонецПроцедуры + // Заполняет структуру параметров, необходимых для работы клиентского кода // данной подсистемы при запуске конфигурации, т.е. в обработчиках событий. // - ПередНачаломРаботыСистемы, @@ -2845,13 +1774,20 @@ ЭтоВызовПередНачаломРаботыСистемы = Параметры.ПолученныеПараметрыКлиента <> Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация(); + Иначе + ЭтоРазделеннаяКонфигурация = Ложь; + КонецЕсли; + // Обязательные параметры для продолжения работы. - Параметры.Вставить("РазделениеВключено", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + Параметры.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено()); Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных", - ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()); + ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); - Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация()); + Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ЭтоРазделеннаяКонфигурация); Параметры.Вставить("ЕстьДоступДляОбновленияВерсииПлатформы", Пользователи.ЭтоПолноправныйПользователь(,Истина)); Параметры.Вставить("ИменаПодсистем", СтандартныеПодсистемыПовтИсп.ИменаПодсистем()); @@ -2864,6 +1800,10 @@ Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", ЗапрашиватьПодтверждениеПриЗавершенииПрограммы()); ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности(); + + Параметры.Вставить("МинимальнаяВерсияПлатформы", ОбщиеПараметры.МинимальнаяВерсияПлатформы); + Параметры.Вставить("РекомендуемаяВерсияПлатформы", ОбщиеПараметры.РекомендуемаяВерсияПлатформы); + // Устарели. Для обратной совместимости. Параметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы); Параметры.Вставить("РаботаВПрограммеЗапрещена", ОбщиеПараметры.РаботаВПрограммеЗапрещена); @@ -2871,9 +1811,12 @@ Параметры.Вставить("ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти", ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти() И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела")); - Параметры.Вставить("ЭтоСеансВнешнегоПользователя", ПользователиСлужебныйПовтИсп.ЭтоСеансВнешнегоПользователя()); + Параметры.Вставить("ЭтоСеансВнешнегоПользователя", ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя()); + Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); - Если ЭтоВызовПередНачаломРаботыСистемы Тогда + Если ЭтоВызовПередНачаломРаботыСистемы + И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОпцииИнтерфейса") Тогда + Параметры.Вставить("ОпцииИнтерфейса", ОбщегоНазначенияПовтИсп.ОпцииИнтерфейса()); КонецЕсли; @@ -2912,7 +1855,7 @@ УстановитьПривилегированныйРежим(Истина); Если ЭтоВызовПередНачаломРаботыСистемы И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ВосстановитьСвязьСГлавнымУзлом") - И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() + И Не ОбщегоНазначения.РазделениеВключено() И ПланыОбмена.ГлавныйУзел() = Неопределено И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда @@ -2943,7 +1886,10 @@ Параметры.Вставить("НеобходимоВыполнитьОбработчикиОтложенногоОбновления"); КонецЕсли; - РаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Истина); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + МодульРаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Истина); + КонецЕсли; Если ЭтоВызовПередНачаломРаботыСистемы И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") @@ -2953,18 +1899,6 @@ МодульОбменДаннымиВызовСервера = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВызовСервера"); Если МодульОбменДаннымиВызовСервера.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Тогда Параметры.Вставить("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском"); - Попытка - ПараметрыПрограммныхСобытий = СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий(); - Исключение - ПараметрыПрограммныхСобытий = Неопределено; - // При первом вызове будет исключение. - // При втором вызове параметры служебных событий обновляются в форме. - // ПовторнаяСинхронизацияДанныхПередЗапуском для поддержки настройки параметров - // подключения синхронизации данных (в том числе для работы профилей безопасности). - КонецПопытки; - Если ПараметрыПрограммныхСобытий <> Неопределено Тогда - Параметры.Вставить("ОбработчикиКлиентскихСобытий", ПараметрыПрограммныхСобытий.ОбработчикиСобытий.НаКлиенте); - КонецЕсли; Возврат Ложь; КонецЕсли; КонецЕсли; @@ -2973,28 +1907,24 @@ Если ЭтоВызовПередНачаломРаботыСистемы И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы") Тогда - Если НеобходимоОбновлениеПараметровРаботыПрограммы() Тогда + Если РегистрыСведений.ПараметрыРаботыПрограммы.НеобходимоОбновление() Тогда // Будет выполнено предварительное обновление. Параметры.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы"); - Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); Возврат Ложь; - Иначе - ПодтвердитьОбновлениеПараметраРаботыПрограммы("*", ""); КонецЕсли; КонецЕсли; // Обязательные параметры для всех режимов работы. - Параметры.Вставить("ОбработчикиКлиентскихСобытий", СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий().ОбработчикиСобытий.НаКлиенте); - Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация); Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Тогда Параметры.Вставить("НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы"); КонецЕсли; - Параметры.Вставить("ОпцииИнтерфейса", ОбщегоНазначенияПовтИсп.ОпцииИнтерфейса()); - - РаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + МодульРаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; Если Параметры.РазделениеВключено И Не Параметры.ДоступноИспользованиеРазделенныхДанных Тогда Возврат Ложь; @@ -3041,11 +1971,6 @@ Возврат Ложь; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); - КонецЕсли; - Возврат Истина; КонецФункции @@ -3060,10 +1985,9 @@ Параметры.Вставить("ИменаПодсистем", СтандартныеПодсистемыПовтИсп.ИменаПодсистем()); Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных", - ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()); - Параметры.Вставить("РазделениеВключено", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); + Параметры.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено()); - Параметры.Вставить("ОпцииИнтерфейса", ОбщегоНазначенияПовтИсп.ОпцииИнтерфейса()); Параметры.Вставить("ЭтоБазоваяВерсияКонфигурации", ЭтоБазоваяВерсияКонфигурации()); Параметры.Вставить("ЭтоУчебнаяПлатформа", ЭтоУчебнаяПлатформа()); Параметры.Вставить("ИмяCOMСоединителя", ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя()); @@ -3074,16 +1998,12 @@ Параметры.Вставить("СинонимКонфигурации", Метаданные.Синоним); Параметры.Вставить("ВерсияКонфигурации", Метаданные.Версия); Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация); - Параметры.Вставить("КодОсновногоЯзыка", Метаданные.ОсновнойЯзык.КодЯзыка); + Параметры.Вставить("КодОсновногоЯзыка", Метаданные.ОсновнойЯзык.КодЯзыка); Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", ЗапрашиватьПодтверждениеПриЗавершенииПрограммы()); - ДатаСеанса = ТекущаяДатаСеанса(); - ДатаСеансаУниверсальная = УниверсальноеВремя(ДатаСеанса, ЧасовойПоясСеанса()); - // Записываем серверное время для последующей замены его на разницу с клиентом. - Параметры.Вставить("ПоправкаКВремениСеанса", ДатаСеанса); - Параметры.Вставить("ПоправкаКУниверсальномуВремени", ДатаСеансаУниверсальная - ДатаСеанса); + Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); КонецПроцедуры @@ -3105,34 +2025,28 @@ КонецЕсли; Параметры.Вставить("ЭтоГлавныйУзел", НЕ ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ()); - Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); Параметры.Вставить("ТребуетсяОбновлениеКонфигурацииУзлаРИБ", ОбщегоНазначения.ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ()); КонецПроцедуры -// Возвращает массив поддерживаемых подсистемой ИмяПодсистемы названий номеров версий. +// Возвращает номера версий, поддерживаемых программным интерфейсом ИмяИнтерфейса. +// См. ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение. // // Параметры: -// ИмяПодсистемы - Строка - Имя подсистемы. +// ИмяИнтерфейса - Строка - имя программного интерфейса. // // Возвращаемое значение: -// Массив - список значений типа Строка. +// Массив - список версий типа Строка. // -Функция ПоддерживаемыеВерсии(ИмяПодсистемы) Экспорт +Функция ПоддерживаемыеВерсии(ИмяИнтерфейса) Экспорт МассивВерсий = Неопределено; СтруктураПоддерживаемыхВерсий = Новый Структура; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); - КонецЦикла; - - СтруктураПоддерживаемыхВерсий.Свойство(ИмяПодсистемы, МассивВерсий); + ИнтеграцияСтандартныхПодсистем.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + СтруктураПоддерживаемыхВерсий.Свойство(ИмяИнтерфейса, МассивВерсий); Если МассивВерсий = Неопределено Тогда Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(Новый Массив); @@ -3142,258 +2056,9 @@ КонецФункции -// Возвращает соответствие имен событий массивам их обработчиков. -// -// Возвращаемое значение: -// Структура - информация об обработчиках событий: -// * НаКлиенте - Соответствие - -// ** Ключ - Строка - полное имя события, -// ** Значение - Массив - список структур со свойствами: -// *** Версия - Строка - версия обработчика (пустая, если не была указана), -// *** Модуль - Строка - имя модуля, в котором размещен обработчик. -// * НаСервере - Соответствие - -// ** Ключ - Строка - полное имя события, -// ** Значение - Массив - список структур со свойствами: -// *** Версия - Строка - версия обработчика (пустая, если не была указана), -// *** Модуль - Строка - имя модуля, в котором размещен обработчик. -// -Функция ОбработчикиСобытий() Экспорт - - ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); - - // Определение всех доступных событий программы. - КлиентскиеСобытия = Новый Массив; - СерверныеСобытия = Новый Массив; - КлиентскиеСлужебныеСобытия = Новый Массив; - СерверныеСлужебныеСобытия = Новый Массив; - - Для каждого Подсистема Из ОписанияПодсистем.Порядок Цикл - Описание = ОписанияПодсистем.ПоИменам[Подсистема]; - - Если НЕ Описание.ДобавлятьСобытия - И НЕ Описание.ДобавлятьСлужебныеСобытия Тогда - - Продолжить; - КонецЕсли; - - Модуль = ОбщегоНазначения.ОбщийМодуль( - Описание.ОсновнойСерверныйМодуль); - - Если Описание.Имя = "СтандартныеПодсистемы" Тогда - Модуль = СтандартныеПодсистемыСервер; - КонецЕсли; - - Если Описание.ДобавлятьСобытия Тогда - Модуль.ПриДобавленииСобытий(КлиентскиеСобытия, СерверныеСобытия); - КонецЕсли; - - Если Описание.ДобавлятьСлужебныеСобытия Тогда - Модуль.ПриДобавленииСлужебныхСобытий(КлиентскиеСлужебныеСобытия, СерверныеСлужебныеСобытия); - КонецЕсли; - КонецЦикла; - - ПроверкаУникальностиИменСобытий(КлиентскиеСобытия); - ПроверкаУникальностиИменСобытий(СерверныеСобытия); - ПроверкаУникальностиИменСобытий(КлиентскиеСлужебныеСобытия); - ПроверкаУникальностиИменСобытий(СерверныеСлужебныеСобытия); - - // Подготовка новых массивов для добавления обработчиков. - ОбработчикиКлиентскихСобытийПоПодсистемам = Новый Соответствие; - ОбработчикиСерверныхСобытийПоПодсистемам = Новый Соответствие; - ОбработчикиКлиентскихСлужебныхСобытийПоПодсистемам = Новый Соответствие; - ОбработчикиСерверныхСлужебныхСобытийПоПодсистемам = Новый Соответствие; - - ОбязательныеКлиентскиеСобытия = Новый Соответствие; - ОбязательныеСерверныеСобытия = Новый Соответствие; - ОбязательныеКлиентскиеСлужебныеСобытия = Новый Соответствие; - ОбязательныеСерверныеСлужебныеСобытия = Новый Соответствие; - - Для каждого Подсистема Из ОписанияПодсистем.Порядок Цикл - - ОбработчикиКлиентскихСобытийПоПодсистемам.Вставить(Подсистема, - ШаблонОбработчиковСобытий(КлиентскиеСобытия, ОбязательныеКлиентскиеСобытия)); - - ОбработчикиСерверныхСобытийПоПодсистемам.Вставить(Подсистема, - ШаблонОбработчиковСобытий(СерверныеСобытия, ОбязательныеСерверныеСобытия)); - - ОбработчикиКлиентскихСлужебныхСобытийПоПодсистемам.Вставить(Подсистема, - ШаблонОбработчиковСобытий(КлиентскиеСлужебныеСобытия, ОбязательныеКлиентскиеСлужебныеСобытия)); - - ОбработчикиСерверныхСлужебныхСобытийПоПодсистемам.Вставить(Подсистема, - ШаблонОбработчиковСобытий(СерверныеСлужебныеСобытия, ОбязательныеСерверныеСлужебныеСобытия)); - - КонецЦикла; - - // Добавление всех обработчиков для требуемых событий программы. - Для каждого Подсистема Из ОписанияПодсистем.Порядок Цикл - Описание = ОписанияПодсистем.ПоИменам[Подсистема]; - - Если НЕ Описание.ДобавлятьОбработчикиСобытий - И НЕ Описание.ДобавлятьОбработчикиСлужебныхСобытий Тогда - - Продолжить; - КонецЕсли; - - Модуль = ОбщегоНазначения.ОбщийМодуль( - Описание.ОсновнойСерверныйМодуль); - - Если Описание.Имя = "СтандартныеПодсистемы" Тогда - Модуль = СтандартныеПодсистемыСервер; - КонецЕсли; - - Если Описание.ДобавлятьОбработчикиСобытий Тогда - Модуль.ПриДобавленииОбработчиковСобытий( - ОбработчикиКлиентскихСобытийПоПодсистемам[Подсистема], - ОбработчикиСерверныхСобытийПоПодсистемам[Подсистема]); - КонецЕсли; - - Если Описание.ДобавлятьОбработчикиСлужебныхСобытий Тогда - Модуль.ПриДобавленииОбработчиковСлужебныхСобытий( - ОбработчикиКлиентскихСлужебныхСобытийПоПодсистемам[Подсистема], - ОбработчикиСерверныхСлужебныхСобытийПоПодсистемам[Подсистема]); - КонецЕсли; - КонецЦикла; - - // Проверка обязательных событий. - ОбязательныеСобытияБезОбработчиков = Новый Массив; - - ДобавитьОбязательныеСобытияБезОбработчиков(ОбязательныеСобытияБезОбработчиков, - ОбязательныеКлиентскиеСобытия, ОбработчикиКлиентскихСобытийПоПодсистемам); - - ДобавитьОбязательныеСобытияБезОбработчиков(ОбязательныеСобытияБезОбработчиков, - ОбязательныеСерверныеСобытия, ОбработчикиСерверныхСобытийПоПодсистемам); - - ДобавитьОбязательныеСобытияБезОбработчиков(ОбязательныеСобытияБезОбработчиков, - ОбязательныеКлиентскиеСлужебныеСобытия, ОбработчикиКлиентскихСлужебныхСобытийПоПодсистемам); - - ДобавитьОбязательныеСобытияБезОбработчиков(ОбязательныеСобытияБезОбработчиков, - ОбязательныеСерверныеСлужебныеСобытия, ОбработчикиСерверныхСлужебныхСобытийПоПодсистемам); - - Если ОбязательныеСобытияБезОбработчиков.Количество() > 0 Тогда - ИмяСобытия = НСтр("ru = 'Обработчики событий'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - - Комментарий = НСтр("ru = 'Для следующих обязательных событий не определены обработчики:'") - + Символы.ПС + СтрСоединить(ОбязательныеСобытияБезОбработчиков, Символы.ПС); - - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, Комментарий); - ВызватьИсключение НСтр("ru = 'Для обязательных событий не определены обработчики. - |Подробности см. в журнале регистрации.'"); - КонецЕсли; - - // Форматирование описаний обработчиков событий программы. - ВсеОбработчикиСобытий = Новый Структура; - ВсеОбработчикиСобытий.Вставить("НаКлиенте", Новый Структура); - ВсеОбработчикиСобытий.Вставить("НаСервере", Новый Структура); - - ВсеОбработчикиСобытий.НаКлиенте.Вставить("ОбработчикиСобытий", СтандартноеОписаниеОбработчиковСобытий( - ОписанияПодсистем, ОбработчикиКлиентскихСобытийПоПодсистемам)); - - ВсеОбработчикиСобытий.НаСервере.Вставить("ОбработчикиСобытий", СтандартноеОписаниеОбработчиковСобытий( - ОписанияПодсистем, ОбработчикиСерверныхСобытийПоПодсистемам)); - - ВсеОбработчикиСобытий.НаКлиенте.Вставить("ОбработчикиСлужебныхСобытий", СтандартноеОписаниеОбработчиковСобытий( - ОписанияПодсистем, ОбработчикиКлиентскихСлужебныхСобытийПоПодсистемам)); - - ВсеОбработчикиСобытий.НаСервере.Вставить("ОбработчикиСлужебныхСобытий", СтандартноеОписаниеОбработчиковСобытий( - ОписанияПодсистем, ОбработчикиСерверныхСлужебныхСобытийПоПодсистемам)); - - Возврат Новый ФиксированнаяСтруктура(ВсеОбработчикиСобытий); - -КонецФункции - -// Только для внутреннего использования. -Функция НеобходимоОбновлениеПараметровРаботыПрограммы(ВыполнитьЗагрузку = Истина) Экспорт - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - // Обновление в модели сервиса. - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Если ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда - // Заполнение разделенных параметров работы расширений. - Возврат Истина; - КонецЕсли; - - ИначеЕсли ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Тогда - // Обновление неразделенных параметров работы программы. - Возврат Истина; - КонецЕсли; - Иначе - // Обновление в локальном режиме. - Если ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - - // При запуске созданного начального образа подчиненного узла РИБ - // загрузка не требуется, а обновление нужно выполнить. - Если МодульОбменДаннымиСервер.НастройкаПодчиненногоУзлаРИБ() Тогда - ВыполнитьЗагрузку = Ложь; - Возврат Истина; - КонецЕсли; - КонецЕсли; - - // При переходе с предыдущей версии в которой не было БСП - // или с версии БСП 2.1.1 (и ранее) в которой не было параметров работы программы. - Попытка - ПользователиСлужебныйПовтИсп.Параметры(); - Исключение - ВыполнитьЗагрузку = Ложь; - Возврат Истина; - КонецПопытки; - - Возврат Ложь; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.УстановитьКонстантуНеИспользоватьРазделениеПоОбластямДанных"; - Обработчик.Приоритет = 99; - Обработчик.ОбщиеДанные = Истина; - Обработчик.МонопольныйРежим = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПометитьЗаписиКэшаВерсийНеактуальными"; - Обработчик.Приоритет = 99; - Обработчик.ОбщиеДанные = Истина; - Обработчик.МонопольныйРежим = Ложь; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.2.10"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.ОбновитьПараметрыАдминистрированияИнформационнойБазы"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.4.17"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.УстановитьЗначениеКонстантыГлавныйУзел"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.1.18"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПеренестиПаролиВБезопасноеХранилищеОбщиеДанные"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.1.18"; - Обработчик.ОбщиеДанные = Ложь; - Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПеренестиПаролиВБезопасноеХранилище"; - -КонецПроцедуры - // Устанавливает корректное значение константе НеИспользоватьРазделениеПоОбластямДанных. // Процедура УстановитьКонстантуНеИспользоватьРазделениеПоОбластямДанных(Параметры) Экспорт @@ -3440,20 +2105,24 @@ Процедура ПометитьЗаписиКэшаВерсийНеактуальными() Экспорт НачатьТранзакцию(); - - НаборЗаписей = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей(); - - Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); - Блокировка.Заблокировать(); - - НаборЗаписей.Прочитать(); - Для каждого Запись Из НаборЗаписей Цикл - Запись.ДатаОбновления = Неопределено; - КонецЦикла; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); - - ЗафиксироватьТранзакцию(); + Попытка + НаборЗаписей = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей(); + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); + Блокировка.Заблокировать(); + + НаборЗаписей.Прочитать(); + Для каждого Запись Из НаборЗаписей Цикл + Запись.ДатаОбновления = Неопределено; + КонецЦикла; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -3502,7 +2171,7 @@ // Процедура УстановитьЗначениеКонстантыГлавныйУзел() Экспорт - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда СохранитьГлавныйУзел(); КонецЕсли; @@ -3621,6 +2290,11 @@ ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Источник); + Если ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать Тогда + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхПодчиненному(Источник, ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза); + КонецЕсли; + КонецПроцедуры // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной @@ -3633,6 +2307,11 @@ ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Источник); + Если ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать Тогда + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхГлавному(Источник, ЭлементДанных, ОтправкаЭлемента); + КонецЕсли; + КонецПроцедуры // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной @@ -3645,6 +2324,11 @@ ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Источник); + Если ПолучениеЭлемента <> ПолучениеЭлементаДанных.Игнорировать Тогда + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтПодчиненного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад); + КонецЕсли; + КонецПроцедуры // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной @@ -3657,6 +2341,11 @@ ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Источник); + Если ПолучениеЭлемента <> ПолучениеЭлементаДанных.Игнорировать Тогда + // Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ. + ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтГлавного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад); + КонецЕсли; + КонецПроцедуры // Процедура-обработчик подписки на событие ПередЗаписью для ПланОбменаОбъект. @@ -3668,33 +2357,18 @@ Возврат; КонецЕсли; - Если Источник.Метаданные().РаспределеннаяИнформационнаяБаза Тогда - - Если Источник.НомерПринятого <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "НомерПринятого") Тогда - - Если ПланыОбмена.ГлавныйУзел() = Источник.Ссылка Тогда - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтГлавного"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеПолученияДанныхОтГлавного(Источник, Отказ); - КонецЦикла; - - Иначе - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтПодчиненного"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеПолученияДанныхОтПодчиненного(Источник, Отказ); - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - + Если Не Источник.Метаданные().РаспределеннаяИнформационнаяБаза Тогда + Возврат; КонецЕсли; + Если Источник.НомерПринятого = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "НомерПринятого") Тогда + Возврат; + КонецЕсли; + + ПолучениеИзГлавногоУзла = (ПланыОбмена.ГлавныйУзел() = Источник.Ссылка); + + ИнтеграцияСтандартныхПодсистем.ПослеПолученияДанных(Источник, Отказ, ПолучениеИзГлавногоУзла); + КонецПроцедуры // Процедура-обработчик подписки на событие ПередЗаписью для ПланОбменаОбъект. @@ -3706,36 +2380,51 @@ Возврат; КонецЕсли; - Если Источник.Метаданные().РаспределеннаяИнформационнаяБаза Тогда - - Если Источник.НомерОтправленного <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "НомерОтправленного") Тогда - - Если ПланыОбмена.ГлавныйУзел() = Источник.Ссылка Тогда - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеОтправкиДанныхГлавному"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеОтправкиДанныхГлавному(Источник, Отказ); - КонецЦикла; - - Иначе - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеОтправкиДанныхПодчиненному"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеОтправкиДанныхПодчиненному(Источник, Отказ); - КонецЦикла; - - КонецЕсли; - - КонецЕсли; + Если Не Источник.Метаданные().РаспределеннаяИнформационнаяБаза Тогда + Возврат; + КонецЕсли; + Если Источник.НомерОтправленного = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "НомерОтправленного") Тогда + Возврат; КонецЕсли; + ОтправкаВГлавныйУзел = (ПланыОбмена.ГлавныйУзел() = Источник.Ссылка); + + // Тут нужно вставить вызов обработчика ПослеОтправкиДанных(Получатель, Отказ, ОтправкаВГлавныйУзел). + КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Работа с предопределенными данными. + +// См. ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент. +Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного) Экспорт + + ИмяПредопределенного = ВРег(ПолноеИмяПредопределенного); + + Точка = СтрНайти(ИмяПредопределенного, "."); + ИмяКоллекции = Лев(ИмяПредопределенного, Точка - 1); + ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); + + Точка = СтрНайти(ИмяПредопределенного, "."); + ИмяТаблицы = Лев(ИмяПредопределенного, Точка - 1); + ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); + + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ &ПолноеИмяТаблицы ГДЕ ИмяПредопределенныхДанных = &ИмяПредопределенного"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяТаблицы", ИмяКоллекции + "." + ИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ИмяПредопределенного", ИмяПредопределенного); + + Результат = Запрос.Выполнить(); + Если Не Результат.Пустой() Тогда + Возврат Результат.Выгрузить()[0].Ссылка; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -3754,7 +2443,7 @@ // Проверка настройки совместимости конфигурации с версией платформы. СистемнаяИнформация = Новый СистемнаяИнформация; - МинимальнаяВерсияПлатформы = "8.3.8.1652"; + МинимальнаяВерсияПлатформы = "8.3.10.2168"; Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) < 0 Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие %1 или выше.'"), МинимальнаяВерсияПлатформы); @@ -3785,6 +2474,10 @@ НедоступныйРежим = "8.3.6"; ИначеЕсли ТекущийРежим = Режимы.Версия8_3_7 Тогда НедоступныйРежим = "8.3.7"; + ИначеЕсли ТекущийРежим = Режимы.Версия8_3_8 Тогда + НедоступныйРежим = "8.3.8"; + ИначеЕсли ТекущийРежим = Режимы.Версия8_3_9 Тогда + НедоступныйРежим = "8.3.9"; Иначе НедоступныйРежим = ""; КонецЕсли; @@ -3793,7 +2486,7 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Режим совместимости конфигурации с 1С:Предприятием версии %1 не поддерживается. |Для запуска установите в конфигурации режим совместимости с 1С:Предприятием - |версии не ниже 8.3.8 или ""Не использовать"".'"), + |версии не ниже 8.3.10 или ""Не использовать"".'"), НедоступныйРежим); КонецЕсли; @@ -3826,13 +2519,13 @@ КонецЕсли; // Проверка возможности выполнения обработчиков установки параметров сеанса для запуска программы. - РаботаВБезопасномРежиме.ПроверитьВозможностьВыполненияОбработчиковУстановкиПараметровСеанса(); + ПроверитьВозможностьВыполненияОбработчиковУстановкиПараметровСеанса(); Если Не ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) - И (Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()) + И (Не ОбщегоНазначения.РазделениеВключено() + Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()) И ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ("СтандартныеПодсистемы", - ОбщегоНазначенияПовтИсп.РазделениеВключено()) = "0.0.0.0" Тогда + ОбщегоНазначения.РазделениеВключено()) = "0.0.0.0" Тогда ПользователиСлужебный.УстановитьНачальныеНастройки(""); КонецЕсли; @@ -3855,9 +2548,16 @@ // Для процедуры ПередЗапускомПрограммы. Процедура ОчиститьНачальнуюСтраницуНеразделенногоПользователяПриПервомВходе() + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + Если ТекущийРежимЗапуска() = Неопределено - Или Не ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Или Не ОбщегоНазначения.РазделениеВключено() + Или Не СеансЗапущенБезРазделителей Тогда Возврат; КонецЕсли; @@ -3904,7 +2604,7 @@ ПараметрыОбработчика = Новый Массив(); ПараметрыОбработчика.Добавить(ИмяПараметра); ПараметрыОбработчика.Добавить(УстановленныеПараметры); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика); Продолжить; КонецЕсли; @@ -3914,7 +2614,7 @@ ПараметрыОбработчика = Новый Массив(); ПараметрыОбработчика.Добавить(ИмяПараметра); ПараметрыОбработчика.Добавить(УстановленныеПараметры); - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика); КонецЕсли; КонецЦикла; КонецЦикла; @@ -3945,6 +2645,14 @@ КонецПроцедуры +Процедура ИгнорироватьПолучениеИдентификаторовОбъектовМетаданных(ЭлементДанных, ПолучениеЭлемента) + + Если ОбъектМетаданных(ЭлементДанных) = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; + КонецЕсли; + +КонецПроцедуры + Функция ОбъектМетаданных(Знач ЭлементДанных) Возврат ?(ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта"), ЭлементДанных.Ссылка.Метаданные(), ЭлементДанных.Метаданные()); @@ -3983,8 +2691,12 @@ КонецЕсли; СистемнаяИнформация = Новый СистемнаяИнформация; - Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, - Параметры.МинимальноНеобходимаяВерсияПлатформы) < 0; + Текущая = СистемнаяИнформация.ВерсияПриложения; + Минимальная = Параметры.МинимальнаяВерсияПлатформы; + Рекомендуемая = Параметры.РекомендуемаяВерсияПлатформы; + + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Минимальная) < 0 + Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Рекомендуемая) < 0; КонецФункции @@ -3999,6 +2711,8 @@ СтруктураПараметровАдминистрирования.Вставить(Элемент.Ключ, Элемент.Значение); КонецЦикла; + СтруктураПараметровАдминистрирования.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок", Ложь); + Возврат СтруктураПараметровАдминистрирования; КонецФункции @@ -4041,6 +2755,140 @@ КонецПроцедуры +// Проверяет возможность выполнения обработчиков установки параметров сеанса. +// +// В случае, если при текущих настройках профилей безопасности (в кластере серверов и в информационной +// базе) выполнение обработчиков установки параметров сеанса невозможно - генерируется исключение, +// содержащее описание причины невозможности выполнения обработчиков установки параметров сеанса +// и перечень действий, которые можно предпринять для устранения этой причины. +// +Процедура ПроверитьВозможностьВыполненияОбработчиковУстановкиПараметровСеанса() + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы()) Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы(Истина); + Иначе + ПрофильИнформационнойБазы = ""; + КонецЕсли; + + Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда + + // Информационная база настроена на использование с профилем безопасности, в котором запрещен + // полный доступ к внешним модулям. + + УстановитьБезопасныйРежим(ПрофильИнформационнойБазы); + Если БезопасныйРежим() <> ПрофильИнформационнойБазы Тогда + + // Профиль ИБ не доступен для выполнения обработчиков. + + УстановитьБезопасныйРежим(Ложь); + + Если ВозможноВыполнениеОбработчиковУстановкиПараметровСеансаБезУстановкиБезопасногоРежима() Тогда + + Возврат; + + Иначе + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: профиль безопасности %1 отсутствует в кластере серверов 1С:Предприятия, или для него запрещено использование в качестве профиля безопасности безопасного режима. + | + |Для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"), + ПрофильИнформационнойБазы); + + КонецЕсли; + + КонецЕсли; + + ДоступенПривилегированныйРежим = ДоступенПереходВПривилегированныйРежим(); + + УстановитьБезопасныйРежим(Ложь); + + Если Не ДоступенПривилегированныйРежим Тогда + + // Профиль ИБ доступен для выполнения обработчиков, но в нем невозможна установка привилегированного режима. + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: профиль безопасности %1 не содержит разрешения на установку привилегированного режима. Возможно, он был отредактирован через консоль кластера. + | + |Для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"), + ПрофильИнформационнойБазы); + + КонецЕсли; + + Иначе + + // Информационная база не настроена на использование с профилем безопасности, в котором запрещен + // полный доступ к внешним модулям. + + Попытка + + ДоступенПривилегированныйРежим = Вычислить("ДоступенПереходВПривилегированныйРежим()"); + + Исключение + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно выполнение обработчиков установки параметров сеанса по причине: %1. + | + |Возможно, для информационной базы через консоль кластера был установлен профиль безопасности, не допускающий выполнения внешних модулей без установки безопасного режима. В этом случае для восстановления работоспособности программы требуется отключить использование профиля безопасности через консоль кластера и заново настроить профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).При этом программа будет автоматически корректно настроена на использование совместно с включенными профилями безопасности.'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +// Проверяет возможность выполнения обработчиков установки параметров сеанса без установки безопасного режима. +// +// Возвращаемое значение: Булево. +// +Функция ВозможноВыполнениеОбработчиковУстановкиПараметровСеансаБезУстановкиБезопасногоРежима() + + Попытка + + Результат = Вычислить("ДоступенПереходВПривилегированныйРежим()"); + Возврат Результат; + + Исключение + + ШаблонЗаписиЖР = НСтр("ru = 'При установке параметров сеанса произошла ошибка: + | + |-------------------------------------------------------------------------------------------- + |%1 + |-------------------------------------------------------------------------------------------- + | + |Запуск программы будет невозможен.'"); + + ТекстЗаписиЖР = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаписиЖР, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Установка параметров сеанса'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ТекстЗаписиЖР); + + Возврат Ложь; + + КонецПопытки; + +КонецФункции + +// Проверяет возможность перехода в привилегированный режим из текущего безопасного режима. +// +// Возвращаемое значение: Булево. +// +Функция ДоступенПереходВПривилегированныйРежим() + + УстановитьПривилегированныйРежим(Истина); + Возврат ПривилегированныйРежим(); + +КонецФункции + // Для процедуры ЗарегистрироватьИзменениеПриоритетныхДанныхДляПодчиненныхУзловРИБ. Процедура ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, КоллекцияМетаданных) @@ -4192,805 +3040,14 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Объявление событий, к которым можно добавлять обработчики. - -// Объявляет служебные события подсистемы БазоваяФункциональность: -// -// Клиентские события: -// ПередНачаломРаботыСистемы, -// ПриНачалеРаботыСистемы, -// ПриОбработкеПараметровЗапуска, -// ПередЗавершениемРаботыСистемы. -// -// Серверные события: -// ПриДобавленииИсключенийПоискаСсылок, -// ПриДобавленииПереименованийОбъектовМетаданных, -// ПриДобавленииПараметровРаботыКлиентаПриЗапуске, -// ПриДобавленииПараметровРаботыКлиента, -// ПриВключенииРазделенияПоОбластямДанных, -// ПриОтправкеДанныхПодчиненному, -// ПриОтправкеДанныхГлавному, -// ПриПолученииДанныхОтПодчиненного, -// ПриПолученииДанныхОтГлавного, -// ПослеПолученияДанныхОтПодчиненного, -// ПослеПолученияДанныхОтГлавного, -// ПослеОтправкиДанныхГлавному, -// ПослеОтправкиДанныхПодчиненному, -// ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. -// -Процедура ПриДобавленииСлужебныхСобытийБазовойФункциональности(КлиентскиеСобытия, СерверныеСобытия) - - // КЛИЕНТСКИЕ СОБЫТИЯ. - - // Выполняется перед интерактивным началом работы пользователя с областью данных или в локальном режиме. - // Соответствует событию ПередНачаломРаботыСистемы модулей приложения. - // - // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. - // - // Синтаксис: - // Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - // - // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы). - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПередНачаломРаботыСистемы"); - - // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. - // Соответствует событию ПриНачалеРаботыСистемы модулей приложения. - // - // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. - // - // Синтаксис: - // Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - // - // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы). - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"); - - // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. - // Вызывается после завершения действий ПриНачалеРаботыСистемы. - // Используется для подключения обработчиков ожидания, которые не должны вызываться - // в случае интерактивных действий перед и при начале работы системы. - // - // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. - // - // Синтаксис: - // Процедура ПослеНачалаРаботыСистемы() Экспорт - // - // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы). - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"); - - // Вызывается при интерактивном начале работы пользователя с областью данных или в локальном режиме. - // - // Параметры: - // ПервыйПараметр - Строка - первое значение параметра запуска, - // до первого символа ";" в верхнем регистре. - // ПараметрыЗапуска - Массив - массив строк разделенных символом ";" в параметре запуска, - // переданным в конфигурацию с помощью ключа командной строки /C. - // Отказ - Булево (возвращаемое значение), если установить Истина, - // обработка события ПриНачалеРаботыСистемы будет прервана. - // - // Синтаксис: - // Процедура ПриОбработкеПараметровЗапуска(ПервыйПараметр, ПараметрыЗапуска, Отказ) Экспорт - // - // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПриОбработкеПараметровЗапуска). - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбработкеПараметровЗапуска"); - - // Доопределяет список предупреждений пользователю перед завершением работы системы. - // - // Параметры: - // Отказ - Булево - Признак отказа от выхода из программы. Если в теле процедуры-обработчика установить - // данному параметру значение Истина, то работа с программой не будет завершена. - // Предупреждения - Массив - в массив можно добавить элементы типа Структура, - // свойства которой см. в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. - // - // Синтаксис: - // Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт - // - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"); - - // Проверяет возможность выполнения резервного копирования в пользовательском режиме. - // - // Параметры: - // Результат - Булево (возвращаемое значение). - // - // Синтаксис: - // Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт - // - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме"); - - // Вызывается при предложении создать резервную копию. - // - // Синтаксис: - // Процедура ПриПредложенииПользователюСоздатьРезервнуюКопию() Экспорт - // - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПредложенииПользователюСоздатьРезервнуюКопию"); - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Доопределяет список объектов метаданных, содержимое которых не должно учитывается в бизнес-логике приложения. - // - // Описание: - // Для документа "Реализация товаров и услуг" настроены подсистемы "Версионирование объектов" и "Свойства". - // При этом документ может быть указан в других объектах метаданных - документах или регистрах. - // Часть ссылок имеют значение для бизнес-логики (например движения по регистрам) и должны выводиться пользователю. - // Другая часть ссылок - "техногенные" ссылки на документ из данных подсистем "Версионирование объектов" и - // "Свойства", должны скрываться от пользователя при поиске ссылок на объект. - // Например, в обработке удаления помеченных или в подсистеме запрета редактирования ключевых реквизитов. - // Список таких "техногенных" объектов нужно перечислить в этой функции. - // - // Важно: - // Для избежания появления пустых "битых" ссылок рекомендуется предусмотреть процедуру очистки указанных объектов - // метаданных. - // Для измерений регистров сведений - с помощью установки флажка "Ведущее", - // тогда запись регистра сведений будет удалена вместе с удалением ссылки, указанной в измерении. - // Для других реквизитов указанных объектов - с помощью подписки на событие ПередУдалением всех типов объектов - // метаданных, которые могут быть записаны в реквизиты указанных объектов метаданных. - // В обработчике необходимо найти "техногенные" объекты, в реквизитах которых указана ссылка удаляемого объекта, - // и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. - // - // Параметры: - // Массив - Объекты метаданных или их реквизиты, содержимое которых не должно учитывается в бизнес-логике приложения. - // * ОбъектМетаданных - Объект метаданных или его реквизит. - // * Строка - Полное имя объекта метаданных или его реквизита. - // - // Например: - // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); - // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); - // Массив.Добавить("РегистрСведений.ВерсииОбъектов"); - // - // Синтаксис: - // Процедура ПриДобавленииИсключенийПоискаСсылок(Исключения) Экспорт - // - // (То же, что ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"); - - // Доопределяет переименования тех объектов метаданных, которые невозможно - // автоматически найти по типу, но ссылки на которые требуется сохранять - // в базе данных (например: подсистемы, роли). - // - // Подробнее см. комментарий к процедуре ОбщегоНазначения.ДобавитьПереименование(). - // - // Синтаксис: - // Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"); - - // Доопределяет структуру параметров, необходимых для работы клиентского кода - // при запуске конфигурации, т.е. в обработчиках событий. - // - ПередНачаломРаботыСистемы, - // - ПриНачалеРаботыСистемы. - // - // Важно: при запуске недопустимо использовать команды сброса кэша - // повторно используемых модулей, иначе запуск может привести - // к непредсказуемым ошибкам или лишним серверным вызовам. - // - // Параметры: - // Параметры - Структура, в которую можно вставить параметры работы клиента при запуске. - // Ключ - имя параметра, - // Значение - значение параметра. - // - // Пример использования: - // Параметры.Вставить(<ИмяПараметра>, <Код получения значения параметра>); - // - // Синтаксис: - // Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - // - // (То же, что ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"); - - // Доопределяет структуру параметров, необходимых для работы клиентского кода - // конфигурации. - // - // Параметры: - // Параметры - Структура, в которую можно вставить параметры работы клиента при запуске. - // Ключ - имя параметра, - // Значение - значение параметра. - // - // Пример использования: - // Параметры.Вставить(<ИмяПараметра>, <Код получения значения параметра>); - // - // Синтаксис: - // Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - // - // (То же, что ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента). - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"); - - // Вызывается при включении разделения данных по областям данных. - // - // Синтаксис: - // Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"); - - // Вызывается при загрузке ссылок предопределенных элементов в процессе загрузки важных данных. - // Позволяет выполнить действия по исправлению или регистрации сведений о не уникальности - // предопределенных элементов, а также позволяет отказаться от продолжения, если это недопустимо. - // - // Параметры: - // Объект - СправочникОбъект, ПланВидовХарактеристикОбъект, ПланСчетовОбъект, ПланВидовРасчетаОбъект - - // объект предопределенного элемента после записи которого обнаружено наличие не уникальности. - // ЗаписатьВЖурнал - Булево - возвращаемое значение. Если указать Ложь, тогда сведения о не уникальности не будут - // добавлены в журнал регистрации в общем сообщении. - // Нужно установить Ложь, если не уникальность была устранена автоматически. - // Отказ - Булево - возвращаемое значение. Если указать Истина, будет вызвано общее исключение, - // содержащее все причины отказа. - // ОписаниеОтказа - Строка - возвращаемое значение. Если Отказ установлен в Истина, то описание будет добавлено - // в список причин невозможности продолжения. - // - // Синтаксис: - // Процедура ПриОбнаруженииНеУникальностиПредопределенного(Объект, ЗаписатьВЖурнал, Отказ, ОписаниеОтказа) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриОбнаруженииНеУникальностиПредопределенного"); - - // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной - // информационной базе. - // - // Параметры: - // см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. - // - // Синтаксис: - // Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"); - - // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной - // информационной базе. - // - // Параметры: - // см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. - // - // Синтаксис: - // Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"); - - // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной - // информационной базе. - // - // Параметры: - // см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. - // - // Синтаксис: - // Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"); - - // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной - // информационной базе. - // - // Параметры: - // см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. - // - // Синтаксис: - // Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"); - - // Процедура-обработчик события после получения данных в главном узле от подчиненного узла распределенной ИБ. - // Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и - // записаны в ИБ. - // - // Параметры: - // Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. - // Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, - // то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, - // если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, - // если данные были загружены порциями. - // - // Синтаксис: - // Процедура ПослеПолученияДанныхОтПодчиненного(Отправитель, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтПодчиненного"); - - // Процедура-обработчик события после получения данных в подчиненном узле от главного узла распределенной ИБ. - // Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и - // записаны в ИБ. - // - // Параметры: - // Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. - // Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, - // то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, - // если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, - // если данные были загружены порциями. - // - // Синтаксис: - // Процедура ПослеПолученияДанныхОтГлавного(Отправитель, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтГлавного"); - - // Процедура-обработчик события после отправки данных из подчиненного узла в главный узел распределенной ИБ. - // Вызывается в момент завершения записи сообщения обмена, когда все зарегистрированные изменения данных успешно - // выгружены в сообщение обмена. - // - // Параметры: - // Получатель - ПланОбменаОбъект. Объект узла плана обмена, для которого формируется сообщение обмена. - // Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, - // то сообщение не будет считаться сформированным и отправленным. - // - // Синтаксис: - // Процедура ПослеОтправкиДанныхГлавному(Получатель, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПослеОтправкиДанныхГлавному"); - - // Процедура-обработчик события после отправки данных из главного узла в подчиненный узел распределенной ИБ. - // Вызывается в момент завершения записи сообщения обмена, когда все зарегистрированные изменения данных успешно - // выгружены в сообщение обмена. - // - // Параметры: - // Получатель - ПланОбменаОбъект. Объект узла плана обмена, для которого формируется сообщение обмена. - // Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, - // то сообщение не будет считаться сформированным и отправленным. - // - // Синтаксис: - // Процедура ПослеОтправкиДанныхПодчиненному(Получатель, Отказ) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПослеОтправкиДанныхПодчиненному"); - - // Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию подсистем, - // используя в качестве ключей названия подсистем. - // Обеспечивает функциональность Web-сервиса InterfaceVersion. - // При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). - // - // Параметры: - // СтруктураПоддерживаемыхВерсий - Структура: - // - Ключи = Названия подсистем. - // - Значения = Массивы названий поддерживаемых версий. - // - // Пример реализации: - // - // // СервисПередачиФайлов - // МассивВерсий = Новый Массив; - // МассивВерсий.Добавить("1.0.1.1"); - // МассивВерсий.Добавить("1.0.2.1"); - // СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); - // // Конец СервисПередачиФайлов - // - // Синтаксис: - // Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"); - - // Используется для получения объектов метаданных обязательных для плана обмена. - // Если подсистема имеет объекты метаданных обязательные для включения в состав плана обмена, - // то в параметр <Объект> необходимо добавить эти объекты метаданных. - // - // Параметры: - // Объекты - Массив. Массив объектов метаданных конфигурации, которые необходимо включить в состав плана обмена. - // РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. - // Истина - требуется получить список объектов плана обмена РИБ; - // Ложь - требуется получить список для плана обмена НЕ РИБ. - // - // Синтаксис: - // Процедура ПриПолученииОбязательныхОбъектовПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"); - - // Используется для получения объектов метаданных, которые не следует включать в состав плана обмена. - // Если подсистема имеет объекты метаданных, которые не следует включать в состав плана обмена, - // то в параметр <Объект> необходимо добавить эти объекты метаданных. - // - // Параметры: - // Объекты - Массив. Массив объектов метаданных конфигурации, которые не следует включать в состав плана обмена. - // РаспределеннаяИнформационнаяБаза (только чтение) - Булево. Признак получения объектов для плана обмена РИБ. - // Истина - требуется получить список объектов-исключений плана обмена РИБ; - // Ложь - требуется получить список для плана обмена НЕ РИБ. - // - // Синтаксис: - // Процедура ПриПолученииОбъектовИсключенийПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"); - - // Используется для получения объектов метаданных, которые должны входить в состав плана обмена - // и НЕ должны входить в состав подписок на события регистрации изменений для этого плана обмена. - // Эти объекты метаданных используются только в момент создания начального образа подчиненного узла - // и не мигрируют в процессе обмена. - // Если подсистема имеет объекты метаданных, которые участвуют только в создании начального образа подчиненного узла, - // то в параметр <Объект> необходимо добавить эти объекты метаданных. - // - // Параметры: - // Объекты - Массив. Массив объектов метаданных конфигурации. - // - // Синтаксис: - // Процедура ПриПолученииОбъектовНачальногоОбразаПланаОбмена(Объекты) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков событий. - -// Доопределяет обработчики подсистемы БазоваяФункциональность. -Процедура ПриДобавленииОбработчиковСлужебныхСобытийБазовойФункциональности(КлиентскиеОбработчики, СерверныеОбработчики) - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( - "СтандартныеПодсистемыКлиент"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "СтандартныеПодсистемыСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "СтандартныеПодсистемыСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( - "СтандартныеПодсистемыСервер"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "СтандартныеПодсистемыСервер"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "СтандартныеПодсистемыСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"].Добавить( - "СтандартныеПодсистемыСервер"); - - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки" - ].Добавить("СтандартныеПодсистемыСервер"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "СтандартныеПодсистемыСервер"); - КонецЕсли; - - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Для функции ОбработчикиСобытий. - -Процедура ПроверкаУникальностиИменСобытий(События) - - ВсеСобытия = Новый Соответствие; - - Для каждого Событие Из События Цикл - - Если ВсеСобытия.Получить(Событие) = Неопределено Тогда - ВсеСобытия.Вставить(Событие, Истина); - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при подготовке списка событий. - | - |Событие ""%1"" - |уже добавлено.'"), - Событие); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Функция ШаблонОбработчиковСобытий(События, ОбязательныеСобытия) - - ОбработчикиСобытий = Новый Соответствие; - - Для каждого Событие Из События Цикл - - Если ТипЗнч(Событие) = Тип("Строка") Тогда // Имя события в виде строки. - ОбработчикиСобытий.Вставить(Событие, Новый Массив); - - Иначе // Описание события в виде структуры. - ОбработчикиСобытий.Вставить(Событие.Имя, Новый Массив); - Если Событие.Обязательное Тогда - Если ОбязательныеСобытия.Получить(Событие.Имя) = Неопределено Тогда - ОбязательныеСобытия.Вставить(Событие.Имя, Истина); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - КонецЦикла; - - Возврат ОбработчикиСобытий; - -КонецФункции - -Процедура ДобавитьОбязательныеСобытияБезОбработчиков(ОбязательныеСобытияБезОбработчиков, - ОбязательныеСобытия, - ОбработчикиСобытийПоПодсистемам) - - Для каждого ОбязательноеСобытие Из ОбязательныеСобытия Цикл - - ОбработчикНайден = Ложь; - Для каждого ОбработчикиСобытийПодсистемы Из ОбработчикиСобытийПоПодсистемам Цикл - - Если ОбработчикиСобытийПодсистемы.Значение.Получить(ОбязательноеСобытие.Ключ).Количество() <> 0 Тогда - ОбработчикНайден = Истина; - Прервать; - КонецЕсли; - - КонецЦикла; - - Если Не ОбработчикНайден Тогда - ОбязательныеСобытияБезОбработчиков.Добавить(ОбязательноеСобытие.Ключ); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Функция СтандартноеОписаниеОбработчиковСобытий(ОписанияПодсистем, ОбработчикиСобытийПоПодсистемам) - - ОбработчикиСобытий = Новый Соответствие; - МодулиОбработчиков = Новый Соответствие; - СобытияОбработчиков = Новый Соответствие; - - Для каждого Подсистема Из ОписанияПодсистем.Порядок Цикл - ОбработчикиСобытийПодсистемы = ОбработчикиСобытийПоПодсистемам[Подсистема]; - - Для каждого КлючИЗначение Из ОбработчикиСобытийПодсистемы Цикл - Событие = КлючИЗначение.Ключ; - ОписанияОбработчиков = КлючИЗначение.Значение; - - Обработчики = ОбработчикиСобытий[Событие]; - Если Обработчики = Неопределено Тогда - Обработчики = Новый Массив; - ОбработчикиСобытий.Вставить(Событие, Обработчики); - МодулиОбработчиков.Вставить(Событие, Новый Соответствие); - КонецЕсли; - - Для каждого ОписаниеОбработчика Из ОписанияОбработчиков Цикл - Если ТипЗнч(ОписаниеОбработчика) = Тип("Структура") Тогда - Обработчик = ОписаниеОбработчика; - Иначе - Обработчик = Новый Структура; - Обработчик.Вставить("Модуль", ОписаниеОбработчика); - КонецЕсли; - Если НЕ Обработчик.Свойство("Версия") Тогда - Обработчик.Вставить("Версия", ""); - КонецЕсли; - Обработчик.Вставить("Подсистема", Подсистема); - - // Проверка полного имени модуля процедуры обработчика события. - Если ТипЗнч(Обработчик.Модуль) <> Тип("Строка") - ИЛИ НЕ ЗначениеЗаполнено(Обработчик.Модуль) Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при подготовке обработчиков события - |""%1"". - | - |Ошибка в имени модуля ""%2"".'"), - Событие, - Обработчик.Модуль); - КонецЕсли; - - // Проверка, что один и тот же модуль указан для события только раз. - Если МодулиОбработчиков[Событие].Получить(Обработчик.Модуль) = Неопределено Тогда - МодулиОбработчиков[Событие].Вставить(Обработчик.Модуль, Истина); - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при подготовке обработчиков события - |""%1"". - | - |Модуль ""%2"" уже добавлен.'"), - Событие, - Обработчик.Модуль); - КонецЕсли; - Обработчики.Добавить(Новый ФиксированнаяСтруктура(Обработчик)); - - // Проверка, что один и тот же обработчик указан для событий только один раз. - ИмяПроцедуры = Сред(Событие, СтрНайти(Событие, "\") + 1); - ИмяОбработчика = Обработчик.Модуль + "." + ИмяПроцедуры; - - Если СобытияОбработчиков[ИмяОбработчика] = Неопределено Тогда - СобытияОбработчиков.Вставить(ИмяОбработчика, Событие); - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при подготовке обработчиков события - |""%1"". - | - |Обработчик ""%2"" уже добавлен для события - |""%3"".'"), - Событие, - ИмяОбработчика, - СобытияОбработчиков[ИмяОбработчика]); - КонецЕсли; - КонецЦикла; - КонецЦикла; - КонецЦикла; - - // Фиксация массивов обработчиков. - Для каждого КлючИЗначение Из ОбработчикиСобытий Цикл - ОбработчикиСобытий[КлючИЗначение.Ключ] = Новый ФиксированныйМассив(КлючИЗначение.Значение); - КонецЦикла; - - Возврат Новый ФиксированноеСоответствие(ОбработчикиСобытий); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Дополнительная базовая функциональность обновления информационной базы. - -// Для процедур ЗагрузитьОбновитьПараметрыРаботыПрограммы, ОбновитьВсеПараметрыРаботыПрограммы. -Процедура ОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима = Неопределено, ВФоне = Ложь) - - ЕстьКритичныеИзменения = Ложь; - РежимОбновления = "Полный"; - СнятьМонопольныйРежим = Ложь; - - Если Не МонопольныйРежим() Тогда - Попытка - УстановитьМонопольныйРежим(Истина); - СнятьМонопольныйРежим = Истина; - Исключение - СнятьМонопольныйРежим = Ложь; - РежимОбновления = "Частичный"; - КонецПопытки; - КонецЕсли; - - БезИзменений = Новый Структура; - Попытка - ПроверитьОбновитьПараметрыРаботыПрограммы(ЕстьКритичныеИзменения, РежимОбновления, БезИзменений, ВФоне); - Исключение - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - - Если РежимОбновления = "Полный" Или Не ЕстьКритичныеИзменения Тогда - Возврат; - КонецЕсли; - - РежимОбновления = "Полный"; - - Попытка - УстановитьМонопольныйРежим(Истина); // Повторная попытка установки монопольного режима. - Исключение - ТекстОшибки = - НСтр("ru = 'Невозможно выполнить обновление информационной базы: - |- Невозможно установить монопольный режим - |- Версия конфигурации не предусматривает обновление без установки монопольного режима.'"); - - Если ОшибкаУстановкиМонопольногоРежима = Неопределено Тогда - ВызватьИсключение ТекстОшибки; - Иначе - ОшибкаУстановкиМонопольногоРежима = ТекстОшибки; - Возврат; - КонецЕсли; - КонецПопытки; - - Попытка - ПроверитьОбновитьПараметрыРаботыПрограммы(ЕстьКритичныеИзменения, РежимОбновления, БезИзменений, ВФоне); - Исключение - УстановитьМонопольныйРежим(Ложь); - ВызватьИсключение; - КонецПопытки; - - УстановитьМонопольныйРежим(Ложь); - -КонецПроцедуры - -// Для процедуры ОбновитьПараметрыРаботыПрограммы. -Процедура ПроверитьОбновитьПараметрыРаботыПрограммы(ЕстьКритичныеИзменения, РежимОбновления, БезИзменений, ВФоне) - - Если ТипЗнч(БезИзменений) <> Тип("Структура") Тогда - БезИзменений = Новый Структура; - КонецЕсли; - - ТолькоПроверка = РежимОбновления <> "Полный"; - - Если Не БезИзменений.Свойство("БазоваяФункциональностьСлужебныеСобытия") Тогда - ЕстьТекущиеИзменения = Ложь; - Константы.ПараметрыСлужебныхСобытий.СоздатьМенеджерЗначения().Обновить(ЕстьТекущиеИзменения, ТолькоПроверка); - Если ЕстьТекущиеИзменения Тогда - ЕстьКритичныеИзменения = Истина; - Если ТолькоПроверка Тогда - Возврат; - КонецЕсли; - Иначе - БезИзменений.Вставить("БазоваяФункциональностьСлужебныеСобытия"); - КонецЕсли; - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(20); - КонецЕсли; - КонецЕсли; - - Если Не БезИзменений.Свойство("БазоваяФункциональностьИдентификаторыОбъектовМетаданных") Тогда - - Если СтандартныеПодсистемыПовтИсп.ОтключитьИдентификаторыОбъектовМетаданных() Тогда - БезИзменений.Вставить("БазоваяФункциональностьИдентификаторыОбъектовМетаданных"); - Иначе - // Критичные изменения: добавление, удаление или переименование объектов метаданных. - ЕстьТекущиеИзменения = Ложь; - Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Ложь, ЕстьТекущиеИзменения, РежимОбновления, ЕстьТекущиеИзменения); - Если ЕстьТекущиеИзменения Тогда - ЕстьКритичныеИзменения = Истина; - Если РежимОбновления <> "Полный" Тогда - Возврат; - КонецЕсли; - Иначе - БезИзменений.Вставить("БазоваяФункциональностьИдентификаторыОбъектовМетаданных"); - КонецЕсли; - КонецЕсли; - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(50); - КонецЕсли; - КонецЕсли; - - Если НЕ БезИзменений.Свойство("ПользователиПараметрыРаботы") Тогда - - ЕстьТекущиеИзменения = Ложь; - ПользователиСлужебный.ОбновитьПараметрыРаботыПользователей(ЕстьТекущиеИзменения, ТолькоПроверка); - Если ЕстьТекущиеИзменения Тогда - ЕстьКритичныеИзменения = Истина; - Если ТолькоПроверка Тогда - Возврат; - КонецЕсли; - Иначе - БезИзменений.Вставить("ПользователиПараметрыРаботы"); - КонецЕсли; - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(80); - КонецЕсли; - КонецЕсли; - - Если НЕ БезИзменений.Свойство("УправлениеДоступомПараметрыОграниченияДоступа") Тогда - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - БезИзменений.Вставить("УправлениеДоступомПараметрыОграниченияДоступа"); - Иначе - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - - ЕстьТекущиеИзменения = Ложь; - МодульУправлениеДоступомСлужебный.ОбновитьПараметрыОграниченияДоступа(ЕстьТекущиеИзменения, ТолькоПроверка); - Если ЕстьТекущиеИзменения Тогда - ЕстьКритичныеИзменения = Истина; - Если ТолькоПроверка Тогда - Возврат; - КонецЕсли; - Иначе - БезИзменений.Вставить("УправлениеДоступомПараметрыОграниченияДоступа"); - КонецЕсли; - КонецЕсли; - Если ВФоне Тогда - ДлительныеОперации.СообщитьПрогресс(100); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Для функции ИзмененияПараметраРаботыПрограммы. -Функция СледующаяВерсия(Версия) - - Массив = СтрРазделить(Версия, "."); - - Возврат ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки( - Версия) + "." + Формат(Число(Массив[3]) + 1, "ЧГ="); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Другие процедуры и функции. // Для процедуры ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ДобавитьЗапросРазрешенийНаИспользованиеРасширений(ЗапросыРазрешений) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; @@ -4998,12 +3055,13 @@ Разрешения = Новый Массив; ВсеРасширения = РасширенияКонфигурации.Получить(); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Для Каждого Расширение Из ВсеРасширения Цикл - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( Расширение.Имя, Base64Строка(Расширение.ХешСумма))); КонецЦикла; - ЗапросыРазрешений.Добавить(РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, + ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений"))); КонецПроцедуры @@ -5046,11 +3104,4 @@ КонецПроцедуры -// См. одноименную процедуру в общем модуле ОчередьЗаданийПереопределяемый. -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить(Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений.Имя); - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index 0ffd80f06..133e5409d 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -1,14 +1,11 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. +// Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину. +// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, +// рекомендуется использовать функцию платформы СтрРазделить. // // Параметры: -// Строка - Строка - текст с разделителями; +// Значение - Строка - текст с разделителями; // Разделитель - Строка - разделитель строк текста, минимум 1 символ; // ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. // Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: @@ -22,26 +19,29 @@ // Возвращаемое значение: // Массив - массив строк. // -// Примеры: -// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые -// строки; -// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; -// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; -// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; -// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); -// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); +// Пример: +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") +// - возвратит массив из 5 элементов, три из которых - пустые: "", "один", "", "два", ""; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) +// - возвратит массив из двух элементов: "один", "два"; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один два ", " ") +// - возвратит массив из двух элементов: "один", "два"; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("") +// - возвратит пустой массив; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь) +// - возвратит массив с одним элементом: ""(пустая строка); +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ") +// - возвратит массив с одним элементом: "" (пустая строка). // -// Примечание: -// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, -// рекомендуется использовать функцию платформы СтрРазделить. -Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт +Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, + СокращатьНепечатаемыеСимволы = Ложь) Экспорт Результат = Новый Массив; // Для обеспечения обратной совместимости. Если ПропускатьПустыеСтроки = Неопределено Тогда ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); - Если ПустаяСтрока(Строка) Тогда + Если ПустаяСтрока(Значение) Тогда Если Разделитель = " " Тогда Результат.Добавить(""); КонецЕсли; @@ -50,9 +50,9 @@ КонецЕсли; // - Позиция = СтрНайти(Строка, Разделитель); + Позиция = СтрНайти(Значение, Разделитель); Пока Позиция > 0 Цикл - Подстрока = Лев(Строка, Позиция - 1); + Подстрока = Лев(Значение, Позиция - 1); Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда Если СокращатьНепечатаемыеСимволы Тогда Результат.Добавить(СокрЛП(Подстрока)); @@ -60,15 +60,15 @@ Результат.Добавить(Подстрока); КонецЕсли; КонецЕсли; - Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); - Позиция = СтрНайти(Строка, Разделитель); + Значение = Сред(Значение, Позиция + СтрДлина(Разделитель)); + Позиция = СтрНайти(Значение, Разделитель); КонецЦикла; - Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда Если СокращатьНепечатаемыеСимволы Тогда - Результат.Добавить(СокрЛП(Строка)); + Результат.Добавить(СокрЛП(Значение)); Иначе - Результат.Добавить(Строка); + Результат.Добавить(Значение); КонецЕсли; КонецЕсли; @@ -80,10 +80,12 @@ // // Параметры: // КодСимвола - Число - код проверяемого символа; -// РазделителиСлов - Строка - символы разделителей. +// РазделителиСлов - Строка - символы разделителей. Если параметр не указан, то +// разделителем считаются все символы, не являющиеся цифрами, +// латинскими и кириллическими буквами, а также знаком подчеркивания. // // Возвращаемое значение: -// Булево - истина, если символ является разделителем. +// Булево - Истина, если символ с кодом КодСимвола является разделителем. // Функция ЭтоРазделительСлов(КодСимвола, РазделителиСлов = Неопределено) Экспорт @@ -115,34 +117,35 @@ // не относящихся к символам латиницы, кириллицы, цифры, подчеркивания. // // Параметры: -// Строка - Строка - строка, которую необходимо разложить на слова. -// РазделителиСлов - Строка - строка, содержащая символы-разделители. +// Значение - Строка - исходная строка, которую необходимо разложить на слова. +// РазделителиСлов - Строка - перечень символов-разделителей. Например, ".,;". // -// Возвращаемое значение: -// массив значений, элементы которого - отдельные слова. +// Возвращаемое значение: +// Массив - список слов. // // Пример: -// РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один", "два2_", "три"; -// РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив значений: "один-", "два2", "три". +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один", +// "два2_", "три"; СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив +// значений: "один-", "два2", "три". // -Функция РазложитьСтрокуВМассивСлов(Знач Строка, РазделителиСлов = Неопределено) Экспорт +Функция РазложитьСтрокуВМассивСлов(Знач Значение, РазделителиСлов = Неопределено) Экспорт Слова = Новый Массив; - РазмерТекста = СтрДлина(Строка); + РазмерТекста = СтрДлина(Значение); НачалоСлова = 1; Для Позиция = 1 По РазмерТекста Цикл - КодСимвола = КодСимвола(Строка, Позиция); + КодСимвола = КодСимвола(Значение, Позиция); Если ЭтоРазделительСлов(КодСимвола, РазделителиСлов) Тогда Если Позиция <> НачалоСлова Тогда - Слова.Добавить(Сред(Строка, НачалоСлова, Позиция - НачалоСлова)); + Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова)); КонецЕсли; НачалоСлова = Позиция + 1; КонецЕсли; КонецЦикла; Если Позиция <> НачалоСлова Тогда - Слова.Добавить(Сред(Строка, НачалоСлова, Позиция - НачалоСлова)); + Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова)); КонецЕсли; Возврат Слова; @@ -153,25 +156,23 @@ // Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. // // Параметры: -// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); -// Параметр - Строка - подставляемый параметр. +// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", +// например, "%1 пошел в %2"); +// Параметр - Строка - значение подставляемого параметра. // // Возвращаемое значение: // Строка - текстовая строка с подставленными параметрами. // // Пример: -// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". +// СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел +// в Зоопарк". // -// Примечание: -// В случаях, когда число используемых параметров в строке совпадает с числом переданных для подстановки параметров, -// рекомендуется использовать функцию платформы СтрШаблон. -Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, +Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт - ИспользоватьАльтернативныйАлгоритм = - СтрНайти(Параметр1, "%") + ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%") Или СтрНайти(Параметр2, "%") Или СтрНайти(Параметр3, "%") Или СтрНайти(Параметр4, "%") @@ -181,22 +182,22 @@ Или СтрНайти(Параметр8, "%") Или СтрНайти(Параметр9, "%"); - Если ИспользоватьАльтернативныйАлгоритм Тогда - СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1, + Если ЕстьПараметрыСПроцентом Тогда + Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); - Иначе - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); КонецЕсли; - Возврат СтрокаПодстановки; + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9); + Возврат ШаблонСтроки; + КонецФункции // Подставляет параметры в строку. Число параметров в строке не ограничено. @@ -204,26 +205,27 @@ // начинается с единицы. // // Параметры: -// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%1"); -// МассивПараметров - Массив - массив строк, которые соответствуют параметрам в строке подстановки. +// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", +// например, "%1 пошел в %2"); +// Параметры - Массив - значения параметров в строке ШаблонСтроки. // // Возвращаемое значение: -// Строка - строка с подставленными параметрами. +// Строка - строка с подставленными значениями параметрами. // // Пример: -// МассивПараметров = Новый Массив; -// МассивПараметров = МассивПараметров.Добавить("Вася"); -// МассивПараметров = МассивПараметров.Добавить("Зоопарк"); +// ЗначенияПараметров = Новый Массив; +// ЗначенияПараметров.Добавить("Вася"); +// ЗначенияПараметров.Добавить("Зоопарк"); +// Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), ЗначенияПараметров); +// - вернет строку "Вася пошел в Зоопарк". // -// Строка = ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), МассивПараметров); -// -Функция ПодставитьПараметрыВСтрокуИзМассива(Знач СтрокаПодстановки, Знач МассивПараметров) Экспорт +Функция ПодставитьПараметрыВСтрокуИзМассива(Знач ШаблонСтроки, Знач Параметры) Экспорт - СтрокаРезультата = СтрокаПодстановки; + СтрокаРезультата = ШаблонСтроки; - Индекс = МассивПараметров.Количество(); + Индекс = Параметры.Количество(); Пока Индекс > 0 Цикл - Значение = МассивПараметров[Индекс-1]; + Значение = Параметры[Индекс-1]; Если Не ПустаяСтрока(Значение) Тогда СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение); КонецЕсли; @@ -238,20 +240,21 @@ // скобками. // // Параметры: -// -// ШаблонСтроки - Строка - строка, в которую необходимо вставить значения. -// ВставляемыеЗначения - Структура - структура значений, где ключ - имя параметра без спецсимволов, -// значение - вставляемое значение. +// ШаблонСтроки - Строка - строка, в которую необходимо вставить значения. +// Параметры - Структура - подставляемые значения параметров, где ключ - имя параметра без спецсимволов, +// значение - вставляемое значение. // // Возвращаемое значение: // Строка - строка со вставленными значениями. // -// Пример использования: -// ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Новый Структура("Фамилия,Имя", "Пупкин", "Вася")); -// Возвращает: "Здравствуй, Вася Пупкин". -Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, ВставляемыеЗначения) Экспорт +// Пример: +// Значения = Новый Структура("Фамилия,Имя", "Пупкин", "Вася"); +// Результат = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Значения); +// - возвращает: "Здравствуй, Вася Пупкин". +// +Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметры) Экспорт Результат = ШаблонСтроки; - Для Каждого Параметр Из ВставляемыеЗначения Цикл + Для Каждого Параметр Из Параметры Цикл Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Параметр.Значение); КонецЦикла; Возврат Результат; @@ -272,9 +275,15 @@ // Разделитель - Строка - символ, которым фрагменты отделяются друг от друга. // // Возвращаемое значение: -// Структура - структура параметров, где ключ - имя параметра, значение - значение параметра. +// Структура - значения параметров, где ключ - имя параметра, значение - значение параметра. // -Функция ПолучитьПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт +// Пример: +// Результат = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки("File=""c:\InfoBases\Trade""; Usr=""Director"";""", ";"); +// - вернет структуру: +// ключ "File" и значение "c:\InfoBases\Trade" +// ключ "Usr" и значение "Director". +// +Функция ПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт Результат = Новый Структура; ОписаниеПараметра = ""; @@ -306,34 +315,34 @@ // Проверяет, содержит ли строка только цифры. // // Параметры: -// СтрокаПроверки - Строка - Строка для проверки. -// УчитыватьЛидирующиеНули - Булево - Флаг учета лидирующих нулей, если Истина, то ведущие нули пропускаются. -// УчитыватьПробелы - Булево - Флаг учета пробелов, если Истина, то пробелы при проверке игнорируются. +// Значение - Строка - проверяемая строка. +// УчитыватьЛидирующиеНули - Булево - флаг учета лидирующих нулей, если Истина, то ведущие нули пропускаются. +// УчитыватьПробелы - Булево - флаг учета пробелов, если Истина, то пробелы при проверке игнорируются. // // Возвращаемое значение: // Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы. // -Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт +Функция ТолькоЦифрыВСтроке(Знач Значение, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт - Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда + Если ТипЗнч(Значение) <> Тип("Строка") Тогда Возврат Ложь; КонецЕсли; Если Не УчитыватьПробелы Тогда - СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); + Значение = СтрЗаменить(Значение, " ", ""); КонецЕсли; - Если ПустаяСтрока(СтрокаПроверки) Тогда + Если СтрДлина(Значение) = 0 Тогда Возврат Истина; КонецЕсли; Если Не УчитыватьЛидирующиеНули Тогда Позиция = 1; // Взятие символа за границей строки возвращает пустую строку. - Пока Сред(СтрокаПроверки, Позиция, 1) = "0" Цикл + Пока Сред(Значение, Позиция, 1) = "0" Цикл Позиция = Позиция + 1; КонецЦикла; - СтрокаПроверки = Сред(СтрокаПроверки, Позиция); + Значение = Сред(Значение, Позиция); КонецЕсли; // Если содержит только цифры, то в результате замен должна быть получена пустая строка. @@ -341,15 +350,16 @@ Возврат СтрДлина( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( - СтрокаПроверки, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0; + Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0; КонецФункции // Проверяет, содержит ли строка только символы кириллического алфавита. // // Параметры: +// СтрокаПроверки - Строка - проверяемая строка. // УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением. -// ДопустимыеСимволы - строка для проверки. +// ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме кириллицы. // // Возвращаемое значение: // Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая; @@ -389,8 +399,9 @@ // Проверяет, содержит ли строка только символы латинского алфавита. // // Параметры: +// СтрокаПроверки - Строка - проверяемая строка. // УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением. -// ДопустимыеСимволы - строка для проверки. +// ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме латиницы. // // Возвращаемое значение: // Булево - Истина, если строка содержит только латинские (или допустимые) символы; @@ -428,22 +439,22 @@ // Удаляет двойные кавычки с начала и конца строки, если они есть. // // Параметры: -// Строка - входная строка; +// Значение - Строка - входная строка. // // Возвращаемое значение: // Строка - строка без двойных кавычек. // -Функция СократитьДвойныеКавычки(Знач Строка) Экспорт +Функция СократитьДвойныеКавычки(Знач Значение) Экспорт - Пока СтрНачинаетсяС(Строка, """") Цикл - Строка = Сред(Строка, 2); + Пока СтрНачинаетсяС(Значение, """") Цикл + Значение = Сред(Значение, 2); КонецЦикла; - Пока СтрЗаканчиваетсяНа(Строка, """") Цикл - Строка = Лев(Строка, СтрДлина(Строка) - 1); + Пока СтрЗаканчиваетсяНа(Значение, """") Цикл + Значение = Лев(Значение, СтрДлина(Значение) - 1); КонецЦикла; - Возврат Строка; + Возврат Значение; КонецФункции @@ -464,23 +475,24 @@ // "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f]. // // Параметры: -// ИдентификаторСтрока - Строка - проверяемая строка. +// Значение - Строка - проверяемая строка. // // Возвращаемое значение: // Булево - Истина, если переданная строка является уникальным идентификатором. -Функция ЭтоУникальныйИдентификатор(Знач Строка) Экспорт +// +Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; - Если СтрДлина(Шаблон) <> СтрДлина(Строка) Тогда + Если СтрДлина(Шаблон) <> СтрДлина(Значение) Тогда Возврат Ложь; КонецЕсли; - Для Позиция = 1 По СтрДлина(Строка) Цикл + Для Позиция = 1 По СтрДлина(Значение) Цикл Если КодСимвола(Шаблон, Позиция) = 88 // X - И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9 - И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f - И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F - Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // - + И ((КодСимвола(Значение, Позиция) < 48 Или КодСимвола(Значение, Позиция) > 57) // 0..9 + И (КодСимвола(Значение, Позиция) < 97 Или КодСимвола(Значение, Позиция) > 102) // a..f + И (КодСимвола(Значение, Позиция) < 65 Или КодСимвола(Значение, Позиция) > 70)) // A..F + Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Значение, Позиция) <> 45 Тогда // - Возврат Ложь; КонецЕсли; КонецЦикла; @@ -510,105 +522,92 @@ КонецФункции // Дополняет строку символами слева или справа до заданной длины и возвращает ее. -// Незначащие символы слева и справа удаляются. По умолчанию функция дополняет строку символами "0" (ноль) слева. +// При этом удаляются незначащие символы слева и справа (подробнее про незначащие символы +// см. синтаксис-помощник к методу платформы СокрЛП). +// По умолчанию функция дополняет строку символами "0" (ноль) слева. // // Параметры: -// Строка - Строка - исходная строка, которую необходимо дополнить символами; +// Значение - Строка - исходная строка, которую необходимо дополнить символами; // ДлинаСтроки - Число - требуемая результирующая длина строки; // Символ - Строка - символ, которым необходимо дополнить строку; -// Режим - Строка - "Слева" или "Справа" - режим добавления символов к исходной строке. +// Режим - Строка - "Слева" или "Справа" - вариант добавления символов к исходной строке. // // Возвращаемое значение: // Строка - строка, дополненная символами. // -// Пример 1: -// Строка = "1234"; ДлинаСтроки = 10; Символ = "0"; Режим = "Слева" -// Возврат: "0000001234". +// Пример: +// 1. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку("1234", 10, "0", "Слева"); +// Возвращает: "0000001234". // -// Пример 2: -// Строка = " 1234 "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа" -// Возврат: "1234######". +// 2. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(" 1234 ", 10, "#", "Справа"); +// Строка = " 1234 "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа" +// Возвращает: "1234######". // -Функция ДополнитьСтроку(Знач Строка, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт +Функция ДополнитьСтроку(Знач Значение, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт // Длина символа не должна превышать единицы. Символ = Лев(Символ, 1); // Удаляем крайние пробелы слева и справа строки. - Строка = СокрЛП(Строка); - - КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Строка); + Значение = СокрЛП(Значение); + КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Значение); Если КоличествоСимволовНадоДобавить > 0 Тогда СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить); - Если ВРег(Режим) = "СЛЕВА" Тогда - - Строка = СтрокаДляДобавления + Строка; - + Значение = СтрокаДляДобавления + Значение; ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда - - Строка = Строка + СтрокаДляДобавления; - + Значение = Значение + СтрокаДляДобавления; КонецЕсли; КонецЕсли; - Возврат Строка; + Возврат Значение; КонецФункции // Удаляет крайние повторяющиеся символы слева или справа в строке. // // Параметры: -// Строка - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы; -// Символ - Строка - искомый символ для удаления; -// Режим - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке. +// Значение - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы; +// УдаляемыйСимвол - Строка - искомый символ для удаления; +// Режим - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке. // // Возвращаемое значение: // Строка - обрезанная строка. // -Функция УдалитьПовторяющиесяСимволы(Знач Строка, Знач Символ, Знач Режим = "Слева") Экспорт +Функция УдалитьПовторяющиесяСимволы(Знач Значение, Знач УдаляемыйСимвол, Знач Режим = "Слева") Экспорт Если ВРег(Режим) = "СЛЕВА" Тогда - - Пока Лев(Строка, 1)= Символ Цикл - - Строка = Сред(Строка, 2); - + Пока Лев(Значение, 1) = УдаляемыйСимвол Цикл + Значение = Сред(Значение, 2); КонецЦикла; - ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда - - Пока Прав(Строка, 1)= Символ Цикл - - Строка = Лев(Строка, СтрДлина(Строка) - 1); - + Пока Прав(Значение, 1) = УдаляемыйСимвол Цикл + Значение = Лев(Значение, СтрДлина(Значение) - 1); КонецЦикла; - КонецЕсли; - Возврат Строка; + Возврат Значение; + КонецФункции // Выполняет замену символов в строке. +// Предназначена для простых случаев, например, для замены латиницы на похожие кириллические символы. // // Параметры: // ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены; -// Строка - Строка - исходная строка, в которой требуется замена символов; +// Значение - Строка - исходная строка, в которой требуется замена символов; // СимволыЗамены - Строка - строка символов, на каждый из которых нужно заменить символы параметра // ЗаменяемыеСимволы. // -// Возвращаемое значение: -// Строка - строка после замены символов. +// Возвращаемое значение: +// Строка - строка после замены символов. // -// Примечание: функция предназначена для простых случаев, например, для замены латиницы на похожие кириллические -// символы. -// -Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Строка, СимволыЗамены) Экспорт +Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Значение, СимволыЗамены) Экспорт - Результат = Строка; + Результат = Значение; Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола, 1)); @@ -621,14 +620,14 @@ // Выполняет преобразование арабского числа в римское. // // Параметры: -// АрабскоеЧисло - число, целое, от 0 до 999; -// ИспользоватьКириллицу - булево, использовать в качестве арабских цифр кириллицу или латиницу. +// АрабскоеЧисло - Число - число, целое, от 0 до 999; +// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу. // // Возвращаемое значение: -// Строка - число в римской нотации. +// Строка - число в римской нотации. // // Пример: -// ПреобразоватьЧислоВРимскуюНотацию(17) = "ХVII". +// СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВРимскуюНотацию(17) = "ХVII". // Функция ПреобразоватьЧислоВРимскуюНотацию(АрабскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт @@ -658,37 +657,35 @@ // Выполняет преобразование римского числа в арабское. // // Параметры: -// РимскоеЧисло - Строка - число, записанное римскими цифрами; -// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу. +// РимскоеЧисло - Строка - число, записанное римскими цифрами; +// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу. // // Возвращаемое значение: -// Число. +// Число - преобразованное число. // // Пример: -// ПреобразоватьЧислоВАрабскуюНотацию("ХVII") = 17. +// СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВАрабскуюНотацию("ХVII") = 17. // Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт - АрабскоеЧисло=0; + АрабскоеЧисло = 0; Если ИспользоватьКириллицу Тогда c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М"; - Иначе c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M"; - КонецЕсли; РимскоеЧисло = СокрЛП(РимскоеЧисло); ЧислоСимволов = СтрДлина(РимскоеЧисло); - Для Сч=1 По ЧислоСимволов Цикл + Для Сч = 1 По ЧислоСимволов Цикл Если Сред(РимскоеЧисло,Сч,1) = c1000 Тогда АрабскоеЧисло = АрабскоеЧисло+1000; ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c500 Тогда АрабскоеЧисло = АрабскоеЧисло+500; ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c100 Тогда - Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c500) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c1000)) Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c500) Или (Сред(РимскоеЧисло,Сч+1,1) = c1000)) Тогда АрабскоеЧисло = АрабскоеЧисло-100; Иначе АрабскоеЧисло = АрабскоеЧисло+100; @@ -696,7 +693,7 @@ ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c50 Тогда АрабскоеЧисло = АрабскоеЧисло+50; ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c10 Тогда - Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c50) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c100)) Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c50) Или (Сред(РимскоеЧисло,Сч+1,1) = c100)) Тогда АрабскоеЧисло = АрабскоеЧисло-10; Иначе АрабскоеЧисло = АрабскоеЧисло+10; @@ -704,7 +701,7 @@ ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c5 Тогда АрабскоеЧисло = АрабскоеЧисло+5; ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c1 Тогда - Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c5) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c10)) Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c5) Или (Сред(РимскоеЧисло,Сч+1,1) = c10)) Тогда АрабскоеЧисло = АрабскоеЧисло-1; Иначе АрабскоеЧисло = АрабскоеЧисло+1; @@ -719,20 +716,22 @@ // Возвращает текстовое представление числа с единицей измерения в правильном склонении и числе. // // Параметры: -// Число - Число - любое целое число. +// Значение - Число - любое целое число. // ПараметрыПредметаИсчисления - Строка - варианты написания единицы измерения в родительном падеже для одной, // для двух и для пяти единиц, разделитель - запятая. +// ДобавлятьЧислоКРезультату - Булево - при передаче значения Ложь число не будет добавлено к строке. // // Возвращаемое значение: // Строка - текстовое представление количества единиц, число записывается цифрами. // -// Примеры: +// Пример: // ЧислоЦифрамиПредметИсчисленияПрописью(23, "минуту,минуты,минут") = "23 минуты"; // ЧислоЦифрамиПредметИсчисленияПрописью(15, "минуту,минуты,минут") = "15 минут". -Функция ЧислоЦифрамиПредметИсчисленияПрописью(Знач Число, Знач ПараметрыПредметаИсчисления, +// +Функция ЧислоЦифрамиПредметИсчисленияПрописью(Знач Значение, Знач ПараметрыПредметаИсчисления, Знач ДобавлятьЧислоКРезультату = Истина) Экспорт - Результат = ?(ДобавлятьЧислоКРезультату, Формат(Число, "ЧН=0") + " ", ""); + Результат = ?(ДобавлятьЧислоКРезультату, Формат(Значение, "ЧН=0") + " ", ""); ПредставленияПредмета = Новый Массив; ПараметрыПредметаИсчисления = СтрРазделить(ПараметрыПредметаИсчисления, ","); @@ -740,18 +739,36 @@ ПредставленияПредмета.Добавить(СокрЛП(Параметр)); КонецЦикла; - Число = Число % 100; - Если Число > 20 Тогда - Число = Число % 10; + Значение = Значение % 100; + Если Значение > 20 Тогда + Значение = Значение % 10; КонецЕсли; - Индекс = ?(Число = 1, 0, ?(Число > 1 И Число < 5, 1, 2)); + Индекс = ?(Значение = 1, 0, ?(Значение > 1 И Значение < 5, 1, 2)); Результат = Результат + ПредставленияПредмета[Индекс]; Возврат Результат; КонецФункции +// Возвращает единицу измерения в нужном склонении в зависимости от количества единиц. +// +// Параметры: +// ФормаДля1 - Строка - форма слова для одной единицы; +// ФормаДля2 - Строка - форма слова для двух единиц; +// ФормаДля5 - Строка - форма слова для пяти единиц; +// Значение - Число - любое целое число. +// +// Возвращаемое значение: +// Строка - единица изменения в нужном склонении. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ФормаМножественногоЧисла("шкаф", "шкафа", "шкафов", 3); возвращает "шкафа". +// +Функция ФормаМножественногоЧисла(ФормаДля1, ФормаДля2, ФормаДля5, Знач Значение) Экспорт + Возврат ЧислоЦифрамиПредметИсчисленияПрописью(Значение, ФормаДля1 + "," + ФормаДля2 + "," + ФормаДля5, Ложь); +КонецФункции + // Очищает текст в формате HTML от тегов и возвращает неформатированный текст. // // Параметры: @@ -828,14 +845,24 @@ КонецФункции // Преобразует исходную строку в транслит. -Функция СтрокаЛатиницей(Знач Строка) Экспорт +// Может использоваться для отправки SMS сообщений латиницей или для сохранения +// файлов и папок, чтобы обеспечить возможность их переноса между разными операционными системами. +// Обратное преобразование из латинских символов не предусмотрено. +// +// Параметры: +// Значение - Строка - произвольная строка. +// +// Возвращаемое значение: +// Строка - строка, в которой кириллица заменена на транслит. +// +Функция СтрокаЛатиницей(Знач Значение) Экспорт Результат = ""; - Соответствие = СоответствиеКириллицыИЛатиницы(); + Соответствие = СоответствиеНациональногоАлфавитаИЛатиницы(); ПредыдущийСимвол = ""; - Для Позиция = 1 По СтрДлина(Строка) Цикл - Символ = Сред(Строка, Позиция, 1); + Для Позиция = 1 По СтрДлина(Значение) Цикл + Символ = Сред(Значение, Позиция, 1); СимволЛатиницей = Соответствие[НРег(Символ)]; // Поиск соответствия без учета регистра. Если СимволЛатиницей = Неопределено Тогда // Другие символы остаются "как есть". @@ -853,47 +880,49 @@ КонецФункции // Форматирует строку в соответствии с заданным шаблоном. -// Возможные значения тегов выделения: -// Строка - выделяет строку жирным шрифтом. -// Строка +// Возможные значения тегов в шаблоне: +// - Строка - выделяет строку жирным шрифтом. +// - Строка - добавляет гиперссылку. +// Например, "Минимальная версия программы 1.1. Обновите программу.". // -// Пример: -// Минимальная версия программы 1.1. Обновите программу. +// Параметры: +// СтрокаСТегами - Строка - строка, содержащая теги форматирования. // // Возвращаемое значение: -// ФорматированнаяСтрока -Функция ФорматированнаяСтрока(Знач Строка) Экспорт +// ФорматированнаяСтрока - преобразованная строка. +// +Функция ФорматированнаяСтрока(Знач СтрокаСТегами) Экспорт СтрокиСВыделением = Новый СписокЗначений; - Пока СтрНайти(Строка, "") <> 0 Цикл - НачалоВыделения = СтрНайти(Строка, ""); - СтрокаДоОткрывающегоТега = Лев(Строка, НачалоВыделения - 1); + Пока СтрНайти(СтрокаСТегами, "") <> 0 Цикл + НачалоВыделения = СтрНайти(СтрокаСТегами, ""); + СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1); СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега); - СтрокаПослеОткрывающегоТега = Сред(Строка, НачалоВыделения + 3); + СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 3); КонецВыделения = СтрНайти(СтрокаПослеОткрывающегоТега, ""); ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1); СтрокиСВыделением.Добавить(ВыделенныйФрагмент,, Истина); СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4); - Строка = СтрокаПослеВыделения; + СтрокаСТегами = СтрокаПослеВыделения; КонецЦикла; - СтрокиСВыделением.Добавить(Строка); + СтрокиСВыделением.Добавить(СтрокаСТегами); СтрокиСоСсылками = Новый СписокЗначений; Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл - Строка = ЧастьСтроки.Значение; + СтрокаСТегами = ЧастьСтроки.Значение; Если ЧастьСтроки.Пометка Тогда - СтрокиСоСсылками.Добавить(Строка,, Истина); + СтрокиСоСсылками.Добавить(СтрокаСТегами,, Истина); Продолжить; КонецЕсли; - НачалоВыделения = СтрНайти(Строка, ""); Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2)); @@ -910,11 +939,11 @@ СтрокиСоСсылками.Добавить(ТекстСсылки, Ссылка); СтрокаПослеВыделения = Сред(СтрокаПослеСсылки, КонецВыделения + 4); - Строка = СтрокаПослеВыделения; + СтрокаСТегами = СтрокаПослеВыделения; - НачалоВыделения = СтрНайти(Строка, " 0 Тогда - Возврат Неопределено; - КонецЕсли; - ЗнакОтрицательный = Истина; - ИначеЕсли КодСимвола = 41 Тогда // Закрывающая скобка. - Если Не ЗнакОтрицательный Или Результат = 0 Тогда // Не было открывающей скобки или нет числа. - Возврат Неопределено; - КонецЕсли; - // Пропуск (действие не требуется). - ИначеЕсли КодСимвола = 44 Или КодСимвола = 46 Тогда // Запятая или точка. - Если ЗнаковПослеЗапятой <> -1 Тогда - Возврат Неопределено; // Разделитель уже был, следовательно это не число. - КонецЕсли; - ЗнаковПослеЗапятой = 0; // Запуск отсчета знаков после запятой. - ИначеЕсли КодСимвола > 47 И КодСимвола < 58 Тогда // Число. - Если ЗнаковПослеЗапятой <> -1 Тогда - ЗнаковПослеЗапятой = ЗнаковПослеЗапятой + 1; - КонецЕсли; - Число = КодСимвола - 48; - Результат = Результат * 10 + Число; - Иначе - Возврат Неопределено; - КонецЕсли; - КонецЦикла; +Функция СтрокаВЧисло(Знач Значение) Экспорт - Если ЗнаковПослеЗапятой > 0 Тогда - Результат = Результат / Pow(10, ЗнаковПослеЗапятой); - КонецЕсли; - Если ЗнакОтрицательный Тогда - Результат = -Результат; + Значение = СтрЗаменить(Значение, " ", ""); + Если СтрНачинаетсяС(Значение, "(") Тогда + Значение = СтрЗаменить(Значение, "(", "-"); + Значение = СтрЗаменить(Значение, ")", ""); КонецЕсли; - Возврат Результат; + СтрокаБезНулей = СтрЗаменить(Значение, "0", ""); + Если ПустаяСтрока(СтрокаБезНулей) Или СтрокаБезНулей = "-" Тогда + Возврат 0; + КонецЕсли; + + ТипЧисло = Новый ОписаниеТипов("Число"); + Результат = ТипЧисло.ПривестиЗначение(Значение); + + Возврат ?(Результат <> 0 И Не ПустаяСтрока(СтрокаБезНулей), Результат, Неопределено); + КонецФункции // Преобразует исходную строку в дату. // // Параметры: -// ДатаСтрока - Строка - Строка, которую необходимо привести к дате. +// Значение - Строка - Строка, которую необходимо привести к дате. +// Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ", +// Например, "23.02.1980" или "23/02/80". // // Возвращаемое значение: -// Дата - Полученная дата. +// Дата - полученная дата. // -Функция СтрокаВДату(Знач ДатаСтрока) Экспорт +Функция СтрокаВДату(Знач Значение) Экспорт - ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала); + ПозицияПробела = СтрНайти(Значение, " ", НаправлениеПоиска.СНачала); Если ПозицияПробела > 0 Тогда - ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1); + Значение = Лев(Значение, ПозицияПробела - 1); КонецЕсли; - ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", "")); - ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2); - Если СтрДлина(ДатаСтрока) = 6 Тогда - ДатаСтрока = "20" + ДатаСтрока; + Значение = СтрЗаменить(Значение, " ", ""); + Значение = СокрЛП(СтрЗаменить(Значение, ".", "")); + Значение = СокрЛП(СтрЗаменить(Значение, "/", "")); + Значение = СокрЛП(СтрЗаменить(Значение, "-", "")); + Значение = Сред(Значение, 5) + Сред(Значение, 3, 2) + Лев(Значение, 2); + Если СтрДлина(Значение) = 6 Тогда + Год = СтрокаВЧисло(Лев(Значение, 2)); + Значение = ?(Год > 29, "19", "20") + Значение; КонецЕсли; ОписаниеТипа = Новый ОписаниеТипов("Дата"); - Результат = ОписаниеТипа.ПривестиЗначение(ДатаСтрока); + Результат = ОписаниеТипа.ПривестиЗначение(Значение); Возврат Результат; КонецФункции + #Область УстаревшиеПроцедурыИФункции + // Устарела. Следует использовать СтрСоединить. // // Объединяет строки из массива в строку с разделителями. @@ -1026,6 +1041,8 @@ // Параметры: // Массив - Массив - массив строк которые необходимо объединить в одну строку; // Разделитель - Строка - любой набор символов, который будет использован в качестве разделителя. +// СокращатьНепечатаемыеСимволы - Булево - обрезать непечатаемые символы по краям подстрок перед объединением +// в строку с разделителями. // // Возвращаемое значение: // Строка - строка с разделителями. @@ -1080,6 +1097,54 @@ КонецФункции +// Устарела. Следует использовать СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(). +// +// Получает значения параметров из строки. +// +// Параметры: +// СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой +// фрагмент вида <Имя параметра>=<Значение>, где: +// Имя параметра - имя параметра; +// Значение - его значение. +// Фрагменты отделяются друг от друга символами ';'. +// Если значение содержит пробельные символы, то оно должно быть заключено в двойные +// кавычки ("). +// Например: +// "File=""c:\InfoBases\Trade""; Usr=""Director"";" +// Разделитель - Строка - символ, которым фрагменты отделяются друг от друга. +// +// Возвращаемое значение: +// Структура - значения параметров, где ключ - имя параметра, значение - значение параметра. +// +Функция ПолучитьПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт + Результат = Новый Структура; + + ОписаниеПараметра = ""; + НайденоНачалоСтроки = Ложь; + НомерПоследнегоСимвола = СтрДлина(СтрокаПараметров); + Для НомерСимвола = 1 По НомерПоследнегоСимвола Цикл + Символ =Сред(СтрокаПараметров, НомерСимвола, 1); + Если Символ = """" Тогда + НайденоНачалоСтроки = Не НайденоНачалоСтроки; + КонецЕсли; + Если Символ <> Разделитель Или НайденоНачалоСтроки Тогда + ОписаниеПараметра = ОписаниеПараметра + Символ; + КонецЕсли; + Если Символ = Разделитель И Не НайденоНачалоСтроки Или НомерСимвола = НомерПоследнегоСимвола Тогда + Позиция = СтрНайти(ОписаниеПараметра, "="); + Если Позиция > 0 Тогда + ИмяПараметра = СокрЛП(Лев(ОписаниеПараметра, Позиция - 1)); + ЗначениеПараметра = СокрЛП(Сред(ОписаниеПараметра, Позиция + 1)); + ЗначениеПараметра = СократитьДвойныеКавычки(ЗначениеПараметра); + Результат.Вставить(ИмяПараметра, ЗначениеПараметра); + КонецЕсли; + ОписаниеПараметра = ""; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + #КонецОбласти #КонецОбласти @@ -1096,7 +1161,7 @@ // Строка - цифра в римской нотации. // // Пример: -// ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII". +// СтроковыеФункцииКлиентСервер.ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII". // Функция ПреобразоватьЦифруВРимскуюНотацию(Цифра, РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка) @@ -1125,7 +1190,7 @@ КонецФункции // Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. -Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки, +Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) @@ -1137,23 +1202,23 @@ СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); ПодставляемыйПараметр = Неопределено; Если СимволПослеПроцента = "1" Тогда - ПодставляемыйПараметр = Параметр1; + ПодставляемыйПараметр = Параметр1; ИначеЕсли СимволПослеПроцента = "2" Тогда - ПодставляемыйПараметр = Параметр2; + ПодставляемыйПараметр = Параметр2; ИначеЕсли СимволПослеПроцента = "3" Тогда - ПодставляемыйПараметр = Параметр3; + ПодставляемыйПараметр = Параметр3; ИначеЕсли СимволПослеПроцента = "4" Тогда - ПодставляемыйПараметр = Параметр4; + ПодставляемыйПараметр = Параметр4; ИначеЕсли СимволПослеПроцента = "5" Тогда - ПодставляемыйПараметр = Параметр5; + ПодставляемыйПараметр = Параметр5; ИначеЕсли СимволПослеПроцента = "6" Тогда - ПодставляемыйПараметр = Параметр6; + ПодставляемыйПараметр = Параметр6; ИначеЕсли СимволПослеПроцента = "7" Тогда - ПодставляемыйПараметр = Параметр7 + ПодставляемыйПараметр = Параметр7 ИначеЕсли СимволПослеПроцента = "8" Тогда - ПодставляемыйПараметр = Параметр8; + ПодставляемыйПараметр = Параметр8; ИначеЕсли СимволПослеПроцента = "9" Тогда - ПодставляемыйПараметр = Параметр9; + ПодставляемыйПараметр = Параметр9; КонецЕсли; Если ПодставляемыйПараметр = Неопределено Тогда Результат = Результат + "%"; @@ -1169,7 +1234,7 @@ Возврат Результат; КонецФункции -Функция СоответствиеКириллицыИЛатиницы() +Функция СоответствиеНациональногоАлфавитаИЛатиницы() // Транслитерация, используемая в загранпаспортах 1997-2010. Соответствие = Новый Соответствие; Соответствие.Вставить("а","a"); @@ -1199,7 +1264,7 @@ Соответствие.Вставить("ч","ch"); Соответствие.Вставить("ш","sh"); Соответствие.Вставить("щ","shch"); - Соответствие.Вставить("ъ",""""); + Соответствие.Вставить("ъ",""); // пропускается Соответствие.Вставить("ы","y"); Соответствие.Вставить("ь",""); // пропускается Соответствие.Вставить("э","e"); diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl index 7c018d580..78c1bbd57 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl @@ -1,19 +1,13 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Структура подчиненности". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Формирует массив реквизитов документа. // // Параметры: -// ИмяДокумента - Строка - имя документа. -// -// Возвращаемое значение: -// Массив - массив наименований реквизитов документа. -// +// ИмяДокумента - Строка - имя документа. +// +// Возвращаемое значение: +// Массив - массив наименований реквизитов документа. +// Функция МассивРеквизитовОбъектаДляФормированияПредставления(ИмяДокумента) Экспорт МассивДопРеквизитов = Новый Массив; diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl index ff0711284..0095fbe4c 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl @@ -1,34 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Связанные документы". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). +// Обработчики событий подсистем конфигурации. -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - ИмяСобытия = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[ИмяСобытия].Добавить("СтруктураПодчиненностиСлужебный"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - - -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -39,5 +14,4 @@ КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl index 97627f76f..63c006cdf 100644 --- a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl @@ -1,17 +1,38 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Текущие дела". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Вызывается для получения списка обработчиков для формирования (или обновления) -// списка всех текущих дел, предусмотренных в конфигурации. Обработчики - это модули -// менеджеров объектов или общие модули, в которых определена процедура ПриЗаполненииСпискаТекущихДел. +// Определяет список обработчиков для формирования (или обновления) +// списка всех текущих дел, предусмотренных в конфигурации. +// +// В указанных модулях должна быть размещена процедура обработчика, в которую передаются параметры +// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: +// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". +// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. +// * Важное - Булево - если Истина, дело будет выделено красным цветом. +// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. +// Можно применять для дел, которые не предполагают их многократного +// использования, т.е. после выполнения они для данной информационной базы +// больше отображаться не будут. +// * Представление - Строка - представление дела, выводимое пользователю. +// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. +// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку +// дела на панели "Текущие дела". +// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. +// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего +// или объект метаданных подсистема. +// * Подсказка - Строка - текст подсказки. +// +// Далее пример процедуры обработчика для копирования в указанные модули. +// +//// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +//Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт +// +//КонецПроцедуры // // Параметры: // Обработчики - Массив - массив ссылок на модули менеджеров или общие модули, // например, Документы.ЗаказПокупателя, ТекущиеДелаПоПродажам. +// Пример: +// Обработчики.Добавить(Документы.ЗаказПокупателя); // Процедура ПриОпределенииОбработчиковТекущихДел(Обработчики) Экспорт @@ -43,6 +64,23 @@ // Процедура ПриОтключенииТекущихДел(ОтключаемыеДела) Экспорт +КонецПроцедуры + +// Позволяет менять некоторые настройки подсистемы. +// +// Параметры: +// Параметры - Структура - со свойствами: +// * ЗаголовокПрочихДел - Строка - заголовок раздела, в который выводятся +// дела, не отнесенные к разделам командного интерфейса. +// Применимо для тех дел, размещение которых в панели +// определяется функцией ТекущиеДелаСервер.РазделыДляОбъекта. +// Если не указано - дела выводятся в группу с заголовком +// "Прочие дела". +// +Процедура ПриОпределенииНастроек(Параметры) Экспорт + + + КонецПроцедуры // Позволяет установить параметры запросов, общие для нескольких текущих дел. @@ -53,7 +91,7 @@ // ТекущиеДела.УстановитьОбщиеПараметрыЗапросов(), которая установить данный параметр. // // Параметры: -// Запрос - выполняемый запрос. +// Запрос - Запрос - выполняемый запрос. // ОбщиеПараметрыЗапросов - Структура - общие значения для расчета текущих дел. // Процедура УстановитьОбщиеПараметрыЗапросов(Запрос, ОбщиеПараметрыЗапросов) Экспорт @@ -64,8 +102,8 @@ // для переопределения параметров открытия формы и установки необходимых отборов списках формы. // // Параметры: -// Форма - УправляемаяФорма -// Список - ДинамическийСписок +// Форма - УправляемаяФорма - форма, из которой был осуществлен вызов метода. +// Список - ДинамическийСписок - список, чьи параметры можно переопределить. // Процедура ПриСозданииНаСервере(Форма, Список) Экспорт @@ -75,8 +113,8 @@ // расшифровки текущих дел для замены сохраненных значений реквизитов формы. // // Параметры: -// Форма - УправляемаяФорма -// Настройки - Соответствие +// Форма - УправляемаяФорма - форма, из которой был осуществлен вызов метода. +// Настройки - Соответствие - настройки формы, в которых находятся значения реквизитов. // Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Форма, Настройки) Экспорт diff --git a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl index 83a29966c..ae354227a 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Текущие дела". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает массив подсистем командного интерфейса, в которые включен переданный @@ -30,6 +25,9 @@ // Параметры: // ИдентификаторДела - Строка - идентификатор дела, которое надо искать в списке отключенных. // +// Возвращаемое значение: +// Булево - Истина, если дело было программно отключено и его не требуется выводить пользователю. +// Функция ДелоОтключено(ИдентификаторДела) Экспорт ОтключаемыеДела = Новый Массив; ТекущиеДелаПереопределяемый.ПриОтключенииТекущихДел(ОтключаемыеДела); @@ -41,7 +39,7 @@ // Возвращает структуру общих значений, используемых для расчета текущих дел. // // Возвращаемое значение: -// Структура с ключами: +// Структура - со свойствами: // * Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи - текущий пользователь. // * ЭтоПолноправныйПользователь - Булево - Истина, если пользователь полноправный. // * ТекущаяДата - Дата - текущая дата сеанса. @@ -54,7 +52,8 @@ // Устанавливает общие параметры запросов для расчета текущих дел. // // Параметры: -// Запрос - выполняемый запрос. +// Запрос - Запрос - выполняемый запрос, которому +// необходимо заполнить общие параметры. // ОбщиеПараметрыЗапросов - Структура - общие значения для расчета показателей. // Процедура УстановитьПараметрыЗапросов(Запрос, ОбщиеПараметрыЗапросов) Экспорт @@ -66,18 +65,18 @@ // Запрос с данными должен содержать только одну строку с произвольным количеством полей. // Значения этих полей должны являться значениями соответствующих показателей. // -// Пример простейшего запроса: +// Например, такой запрос может иметь следующий вид - // ВЫБРАТЬ // Количество(*) КАК <Имя предопределенного элемента - показателя количества документов>. // ИЗ // Документ.<Имя документа>. // // Параметры: -// Запрос - выполняемый запрос. +// Запрос - Запрос - выполняемый запрос. // ОбщиеПараметрыЗапросов - Структура - общие значения для расчета текущих дел. // // Возвращаемое значение: -// Структура со свойствами: +// Структура - со свойствами: // * Ключ - Строка - имя показателя текущих дел. // * Значение - Число - числовое значение показателя. // diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl index 2c51ed53e..e8261358a 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl @@ -1,55 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Текущие дела". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Объявляет служебные события подсистемы ТекущиеДела. -// -// Серверные события: -// ПриЗаполненииСпискаТекущихДел. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Заполняет список текущих дел пользователя. - // - // Параметры: - // ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: - // * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". - // * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. - // * Важное - Булево - если Истина, дело будет выделено красным цветом. - // * Представление - Строка - представление дела, выводимое пользователю. - // * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. - // * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку - // дела на панели "Текущие дела". - // * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. - // * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего - // или объект метаданных подсистема. - // * Подсказка - Строка - текст подсказки. - // - // Синтаксис: - // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - ИмяМодуля = "ТекущиеДелаСлужебный"; - - ИмяСобытия = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[ИмяСобытия].Добавить(ИмяМодуля); - -КонецПроцедуры - // Заполняет список текущих дел пользователя. // // Параметры: @@ -72,14 +22,8 @@ ТекущиеДела = НоваяТаблицаТекущихДел(); - // Заполнение текущих дел БСП. - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"); - - КоличествоДел = 0; - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - ДобавитьДело(ТекущиеДела, Обработчик.Модуль, КоличествоДел); - КонецЦикла; + КоличествоДел = 0; + ДобавитьДело(ТекущиеДела, ИнтеграцияСтандартныхПодсистем, КоличествоДел); // Добавление дел от прикладных конфигураций. ОбработчикиЗаполненияДел = Новый Массив; @@ -121,9 +65,9 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. +// Обработчики событий подсистем конфигурации. -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -132,17 +76,7 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -154,6 +88,10 @@ КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Получает числовые значения дел из переданного запроса. // // Запрос с данными должен содержать только одну строку с произвольным количеством полей. @@ -321,21 +259,7 @@ // Создает пустую таблицу дел пользователя. // // Возвращаемое значение: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - -// ОбъектМетаданных: Подсистема - подсистема командного интерфейса, в которой -// будет размещено данное дело. -// Строка - идентификатор дела верхнего уровня, требуется -// для указания владельца дочернего дела (расшифровки дела верхнего уровня). -// * Подсказка - Строка - текст подсказки. +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. // Функция НоваяТаблицаТекущихДел() @@ -344,6 +268,7 @@ ДелаПользователя.Колонки.Добавить("ЕстьДела", Новый ОписаниеТипов("Булево")); ДелаПользователя.Колонки.Добавить("Важное", Новый ОписаниеТипов("Булево")); ДелаПользователя.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); + ДелаПользователя.Колонки.Добавить("СкрыватьВНастройках", Новый ОписаниеТипов("Булево")); ДелаПользователя.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); ДелаПользователя.Колонки.Добавить("Форма", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); ДелаПользователя.Колонки.Добавить("ПараметрыФормы", Новый ОписаниеТипов("Структура")); diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl index 8de52a67a..660e4e8ce 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Текущие дела". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает соответствие объектов метаданных и подсистем командного интерфейса. diff --git a/SSL/src/CommonModules/ТрансляцияXDTO/Module.bsl b/SSL/src/CommonModules/ТрансляцияXDTO/Module.bsl index a4311f8eb..c299b510c 100644 --- a/SSL/src/CommonModules/ТрансляцияXDTO/Module.bsl +++ b/SSL/src/CommonModules/ТрансляцияXDTO/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Трансляция XDTO". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Функция выполняет трансляцию произвольного XDTO-объекта @@ -10,8 +5,9 @@ // определяя результирующую версию по пространству имен результирующего сообщения. // // Параметры: -// ИсходныйОбъект - ОбъектXDTO, транслируемый объект, -// РезультирующаяВерсия - строка, номер результирующей версии интерфейса, в формате РР.{П|ПП}.ЗЗ.СС. +// ИсходныйОбъект - ОбъектXDTO - Транслируемый объект. +// РезультирующаяВерсия - строка - Номер результирующей версии интерфейса, в формате РР.{П|ПП}.ЗЗ.СС. +// ПакетИсходнойВерсии - Строка - пространство имен версии сообщения. // // Возвращаемое значение: // ОбъектXDTO - результат трансляции объекта. @@ -40,8 +36,9 @@ // определяя результирующую версию по пространству имен результирующего сообщения. // // Параметры: -// ИсходныйОбъект - ОбъектXDTO, транслируемый объект, -// РезультирующаяВерсия - строка, пространство имен результирующей версии. +// ИсходныйОбъект - ОбъектXDTO - Транслируемый объект. +// ПакетРезультирующейВерсии - Строка - Пространство имен результирующей версии. +// ПакетИсходнойВерсии - Строка - пространство имен версии сообщения. // // Возвращаемое значение: // ОбъектXDTO - результат трансляции объекта. diff --git a/SSL/src/CommonModules/ТрансляцияXDTOПереопределяемый/Module.bsl b/SSL/src/CommonModules/ТрансляцияXDTOПереопределяемый/Module.bsl index b40cec4ef..4c7a0e4f6 100644 --- a/SSL/src/CommonModules/ТрансляцияXDTOПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ТрансляцияXDTOПереопределяемый/Module.bsl @@ -1,14 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Трансляция версий сообщений", переопределяемые процедуры и функции. -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Заполняет переданный массив обработчиками трансляции сообщений между версиями. // // Параметры: -// МассивОбработчиков - массив. +// МассивОбработчиков - Массив - Элементами массива являются общие модули. // Процедура ЗаполнитьОбработчикиТрансляцииСообщений(МассивОбработчиков) Экспорт diff --git a/SSL/src/CommonModules/ТрансляцияXDTOСлужебный/Module.bsl b/SSL/src/CommonModules/ТрансляцияXDTOСлужебный/Module.bsl index 948d4c26f..c029def84 100644 --- a/SSL/src/CommonModules/ТрансляцияXDTOСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ТрансляцияXDTOСлужебный/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Трансляция XDTO". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает описание версии сообщения. Возвращаемое значение используется для передачи @@ -49,7 +44,7 @@ ОписаниеРезультирующейВерсии); Если ЦепочкаТрансляцииИнтерфейса = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В конфигурации не зарегистрирован обработчик трансляции из версии %1 в версию %2!'"), + НСтр("ru = 'В конфигурации не зарегистрирован обработчик трансляции из версии %1 в версию %2.'"), СформироватьПредставлениеВерсии(ОписаниеИсходнойВерсии), СформироватьПредставлениеВерсии(ОписаниеРезультирующейВерсии)); Иначе @@ -291,7 +286,7 @@ ТипРезультирующегоОбъекта = ФабрикаXDTO.Тип(ПакетРезультирующегоОбъекта, ТипИсходногоОбъекта.Имя); Если ТипРезультирующегоОбъекта = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить стандартную обработку трансляции типа %1 в пакет %2: тип %1 не существует в пакете %2!'"), + НСтр("ru = 'Не удалось выполнить стандартную обработку трансляции типа %1 в пакет %2: тип %1 не существует в пакете %2.'"), "{" + ТипИсходногоОбъекта.URIПространстваИмен + "}" + ТипИсходногоОбъекта.Имя, "{" + ПакетРезультирующегоОбъекта + "}"); КонецЕсли; @@ -306,7 +301,7 @@ Если СвойствоОригинала = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить стандартную обработку конвертации типа %1 в тип %2: свойство %3 не определено для типа %1!'"), + НСтр("ru = 'Не удалось выполнить стандартную обработку конвертации типа %1 в тип %2: свойство %3 не определено для типа %1.'"), "{" + ТипИсходногоОбъекта.URIПространстваИмен + "}" + ТипИсходногоОбъекта.Имя, "{" + ТипРезультирующегоОбъекта.URIПространстваИмен + "}" + ТипРезультирующегоОбъекта.Имя, Свойство.ЛокальноеИмя); @@ -320,7 +315,7 @@ ТранслируемоеСвойство = ТипРезультирующегоОбъекта.Свойства.Получить(Свойство.ЛокальноеИмя); Если ТранслируемоеСвойство = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить стандартную обработку конвертации типа %1 в тип %2: свойство %3 не определено для типа %2!'"), + НСтр("ru = 'Не удалось выполнить стандартную обработку конвертации типа %1 в тип %2: свойство %3 не определено для типа %2.'"), "{" + ТипИсходногоОбъекта.URIПространстваИмен + "}" + ТипИсходногоОбъекта.Имя, "{" + ТипРезультирующегоОбъекта.URIПространстваИмен + "}" + ТипРезультирующегоОбъекта.Имя, Свойство.ЛокальноеИмя); diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl index 43ed6edc2..4ffa7a1cb 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl @@ -1,18 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Удаление помеченных объектов" (сервер, переопределяемый). -// -// Выполняется на сервере, изменяется под специфику прикладной конфигурации, -// но предназначен для использования только данной подсистемой. -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается перед поиском объектов помеченных на удаление. +// В этом обработчике можно организовать удаление устаревших ключей аналитик и любых других объектов информационной +// базы, ставших более не нужными. // // Параметры: -// Параметры - Структура - Параметры удаления. -// * Интерактивное - Булево - Истина когда удаление помеченных объектов было запущено пользователем. -// Ложь когда удаление запущено по расписанию регламентного задания. +// Параметры - Структура - со свойствами: +// * Интерактивное - Булево - Истина, если удаление помеченных объектов запущено пользователем. +// Ложь, если удаление запущено по расписанию регламентного задания. // Процедура ПередПоискомПомеченныхНаУдаление(Параметры) Экспорт diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl index 779f88f34..8918c0b6c 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl @@ -1,56 +1,40 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Удаление помеченных объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Вызывается после удаления помеченных объектов. - // - // Параметры: - // ПараметрыВыполнения - Структура - Контекст удаления помеченных объектов. - // * Удаленные - Массив - Ссылки удаленных объектов. - // * НеУдаленные - Массив - Ссылки объектов, которые не получилось удалить. - // - // Синтаксис: - // Процедура ПослеУдаленияПомеченных(Знач ПараметрыВыполнения) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\ПослеУдаленияПомеченных"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныйМодуль = "УдалениеПомеченныхОбъектовСлужебный"; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - Событие = "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"; - СерверныеОбработчики[Событие].Добавить(СерверныйМодуль); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. +// Обработчики событий подсистем конфигурации. -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Шаблоны.Добавить("УдалениеПомеченных"); + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "УдалениеПомеченныхОбъектовСлужебный.ВключитьУдалениеПомеченныхОбъектов"; + Обработчик.РежимВыполнения = "Оперативно"; + +КонецПроцедуры + +// Обработчик обновления на версию 2.4.1.1. +// +Процедура ВключитьУдалениеПомеченныхОбъектов() Экспорт + + Константы.ИспользоватьУдалениеПомеченныхОбъектов.Установить(Истина); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить("УдалениеПомеченных"); + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.УдалениеПомеченных; + Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьУдалениеПомеченныхОбъектов; КонецПроцедуры diff --git a/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/Module.bsl b/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/Module.bsl deleted file mode 100644 index 4ae16f745..000000000 --- a/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/Module.bsl +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Удаленное администрирование". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеЗначенийПараметровИБ"].Добавить( - "УдаленноеАдминистрированиеСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовПринимаемыхСообщений"].Добавить( - "УдаленноеАдминистрированиеСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\РегистрацияИнтерфейсовОтправляемыхСообщений"].Добавить( - "УдаленноеАдминистрированиеСлужебный"); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Вызывается перед попыткой записи значений параметров ИБ в одноименные -// константы. -// -// Параметры: -// ЗначенияПараметров - Структура - значения параметров которые требуется установить. -// В случае если значение параметра устанавливается в данной процедуре из структуры -// необходимо удалить соответствующую пару КлючИЗначение. -// -Процедура ПриУстановкеЗначенийПараметровИБ(Знач ЗначенияПараметров) Экспорт - - Если ЗначенияПараметров.Свойство("URLСервиса") Тогда - - Константы.ВнутреннийАдресМенеджераСервиса.Установить(ЗначенияПараметров.URLСервиса); - ЗначенияПараметров.Удалить("URLСервиса"); - - КонецЕсли; - - Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ВнутреннийАдресМенеджераСервиса"); - - Если ЗначенияПараметров.Свойство("ИмяСлужебногоПользователяСервиса") Тогда - - УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ЗначенияПараметров.ИмяСлужебногоПользователяСервиса, "ИмяСлужебногоПользователяМенеджераСервиса"); - УстановитьПривилегированныйРежим(Ложь); - - ЗначенияПараметров.Удалить("ИмяСлужебногоПользователяСервиса"); - - КонецЕсли; - - Если ЗначенияПараметров.Свойство("ПарольСлужебногоПользователяСервиса") Тогда - - УстановитьПривилегированныйРежим(Истина); - ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ЗначенияПараметров.ПарольСлужебногоПользователяСервиса, "ПарольСлужебногоПользователяМенеджераСервиса"); - УстановитьПривилегированныйРежим(Ложь); - - ЗначенияПараметров.Удалить("ПарольСлужебногоПользователяСервиса"); - - КонецЕсли; - -КонецПроцедуры - -// Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов -// принимаемых сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияУдаленногоАдминистрированияИнтерфейс); - -КонецПроцедуры - -// Заполняет переданный массив общими модулями, которые являются обработчиками интерфейсов -// отправляемых сообщений. -// -// Параметры: -// МассивОбработчиков - массив. -// -// -Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт - - МассивОбработчиков.Добавить(СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс); - МассивОбработчиков.Добавить(СообщенияУправленияПриложениямиИнтерфейс); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/УдаленноеАдминистрированиеСлужебный.mdo b/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/УдаленноеАдминистрированиеСлужебный.mdo deleted file mode 100644 index bc00a2c3a..000000000 --- a/SSL/src/CommonModules/УдаленноеАдминистрированиеСлужебный/УдаленноеАдминистрированиеСлужебный.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - УдаленноеАдминистрированиеСлужебный - - ru - Удаленное администрирование служебный - - true - true - true - diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl index 2094aca0a..6d33aa064 100644 --- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -39,6 +34,7 @@ Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда Возврат Истина; КонецЕсли; + Роль = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль." + Роль); УстановитьПривилегированныйРежим(Истина); @@ -59,7 +55,7 @@ | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка - | И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль) + | И (ПрофилиГруппДоступаРоли.Роль = &Роль) | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления)"; Возврат НЕ Запрос.Выполнить().Пустой(); КонецЕсли; @@ -86,7 +82,7 @@ КонецЕсли; // Уточнение наборов значений доступа. - ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; + ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа().ПоИменам; Для каждого Строка Из НаборыЗначенийДоступа Цикл @@ -174,7 +170,7 @@ | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка - | И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль) + | И (ПрофилиГруппДоступаРоли.Роль = &Роль) | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления) |; | @@ -367,7 +363,7 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.Параметры().ВозможныеПраваДляНастройкиПравОбъектов; + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); ОписаниеПрав = ВозможныеПрава.ПоТипам.Получить(ТипЗнч(СсылкаНаОбъект)); Если ОписаниеПрав = Неопределено Тогда @@ -432,6 +428,42 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Процедуры для включения и исключения пользователя в профиле групп доступа. + +// Назначение пользователю профиля групп доступа путем включения +// в персональную группу доступа (только для упрощенной настройки прав). +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи - требуемый пользователь. +// Профиль - СправочникСсылка.ПрофилиГруппДоступа - профиль для которого нужно найти или создать персональную +// группу доступа и включить в нее пользователя. +// - УникальныйИдентификатор - уникальный идентификатор поставляемого профиля, +// с помощью которого нужно найти профиль групп доступа. +// - Строка - имя поставляемого профиля, +// с помощью которого нужно найти профиль групп доступа. +// +Процедура ВключитьПрофильПользователю(Пользователь, Профиль) Экспорт + ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Истина); +КонецПроцедуры + +// Отмена назначения пользователю профиля групп доступа путем исключения +// из персональной группы доступа (только для упрощенной настройки прав). +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи - требуемый пользователь. +// Профиль - СправочникСсылка.ПрофилиГруппДоступа - профиль для которого нужно найти или создать персональную +// группу доступа и включить в нее пользователя. +// - УникальныйИдентификатор - уникальный идентификатор поставляемого профиля, +// с помощью которого нужно найти профиль групп доступа. +// - Строка - имя поставляемого профиля, +// с помощью которого нужно найти профиль групп доступа. +// - Неопределено - выключить пользователю все профили. +// +Процедура ВыключитьПрофильПользователю(Пользователь, Профиль =  Неопределено) Экспорт + ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Ложь); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для получения общих настроек подсистемы. @@ -776,6 +808,9 @@ // Это позволяет в отдельных случаях ускорить открытие динамического списка. // Если количество разрешенных значений в общей сложности получилось более 100, отбор не устанавливается. // +// Для работы процедуры у динамического списка должна установлена основная таблица и установлен +// произвольный запрос с синонимами для стандартных реквизитов, например, Дата и Номер у документов. +// // Параметры: // Список - ДинамическийСписок - динамический список, в который нужно установить отборы. // ОписаниеОтборов - Соответствие - со свойствами: @@ -947,7 +982,7 @@ Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("НомерНабора", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4, 0, ДопустимыйЗнак.Неотрицательный))); - Таблица.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20))); + Таблица.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20))); Таблица.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); Таблица.Колонки.Добавить("Чтение", Новый ОписаниеТипов("Булево")); Таблица.Колонки.Добавить("Изменение", Новый ОписаниеТипов("Булево")); @@ -958,26 +993,55 @@ КонецФункции -// Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) создается прикладным разработчиком -// в модулях объектов, тип которых задан в одной из подписок на событие. -// ЗаписатьНаборыЗначенийДоступа или ЗаписатьЗависимыеНаборыЗначенийДоступа. -// В процедуре выполняется заполнение наборов значений доступа по свойствам объекта. +// Заполняет наборы значений доступа для переданного значения Объект, вызывая +// процедуру ЗаполнитьНаборыЗначенийДоступа, определенную в модуле этого объекта, +// и возвращает их в параметре Таблица. // -// Параметр: +// Объекты должны быть включены в подписку на событие ЗаписатьНаборыЗначенийДоступа +// или ЗаписатьЗависимыеНаборыЗначенийДоступа. +// +// В модулях объектов должна быть размещена процедура обработчика, в которую передаются параметры // Таблица - ТаблицаЗначений - возвращаемая функцией ТаблицаНаборыЗначенийДоступа. // -// Текущая одноименная процедура заполняет наборы значений доступа объекта, используя процедуру. -// ЗаполнитьНаборыЗначенийДоступа(Таблица), созданную прикладным разработчиком (см. описание выше). -// +// Далее пример процедуры обработчика для копирования в модули объектов. +// +//// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа. +//Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт +// +// // Логика ограничения: +// // Чтения: Организация. +// // Изменения: Организация И Ответственный. +// +// // Чтение: набор №1. +// Строка = Таблица.Добавить(); +// Строка.НомерНабора = 1; +// Строка.Чтение = Истина; +// Строка.ЗначениеДоступа = Организация; +// +// // Изменение: набор №2. +// Строка = Таблица.Добавить(); +// Строка.НомерНабора = 2; +// Строка.Изменение = Истина; +// Строка.ЗначениеДоступа = Организация; +// +// Строка = Таблица.Добавить(); +// Строка.НомерНабора = 2; +// Строка.ЗначениеДоступа = Ответственный; +// +//КонецПроцедуры +// // Параметры: -// Объект - Объект, Ссылка - СправочникаОбъект, ДокументОбъект, ... СправочникСсылка, ДокументСсылка, ... -// Если передана ссылка, то по ней будет получен объект. +// Объект - СправочникаОбъект, ДокументОбъект, СправочникСсылка, ДокументСсылка - ссылка +// или ссылочный объект (элемент справочника, документ, бизнес-процесс, задача, план +// видов характеристик и т.п.), для которого требуется заполнить наборы значений доступа. // -// Таблица - ТаблицаЗначений - возвращаемая функцией ТаблицаНаборыЗначенийДоступа модуля УправлениеДоступом. -// - Неопределено - будет создана новая таблица значений. +// Таблица - ТаблицаЗначений, Неопределено - возвращает в этом параметре подготовленные наборы значений +// доступа. Описание колонок см. в функции УправлениеДоступом.ТаблицаНаборыЗначенийДоступа. +// Если передано Неопределено,то будет создана и заполнена новая таблица наборов значений доступа. // -// СсылкаНаПодчиненныйОбъект - ЛюбаяСсылка - используется, когда нужно заполнить наборы значений доступа -// объекта-владельца для подчиненного объекта. +// СсылкаНаПодчиненныйОбъект - ЛюбаяСсылка - используется, когда нужно заполнить наборы значений +// доступа объекта-владельца для указанного подчиненного объекта. +// Подробнее см. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа. // Процедура ЗаполнитьНаборыЗначенийДоступа(Знач Объект, Таблица, Знач СсылкаНаПодчиненныйОбъект = Неопределено) Экспорт @@ -1167,7 +1231,7 @@ // Определение копий наборов и копий строк в наборах в пределах прав // в процессе добавления или умножения. // - // СКопии" возникают из-за правил раскрытия скобок в логических выражениях: + // Копии возникают из-за правил раскрытия скобок в логических выражениях: // Для наборов в пределах права и наборов разных прав: // X И X = X, // X ИЛИ X = X, где X - набор строк-аргументов. @@ -1196,11 +1260,10 @@ // в регистре сведений НаборыЗначенийДоступа. // // Параметры: -// СсылкаИлиОбъект - СправочникСсылка, ДокументСсылка и другие типы ссылок - ссылка или объект, -// для которого заполняются наборы значений доступа. +// СсылкаИлиОбъект - Произвольный - ссылка или объект, для которого заполняются наборы значений доступа. // ОбновлениеИБ - Булево - если Истина, то необходимо выполнять запись данных, -// не выполняя лишних, избыточных действий с данными. -// См. ОбновлениеИнформационнойБазы.ЗаписатьДанные. +// не выполняя лишних, избыточных действий с данными. +// См. ОбновлениеИнформационнойБазы.ЗаписатьДанные. // Процедура ОбновитьНаборыЗначенийДоступа(СсылкаИлиОбъект, ОбновлениеИБ = Ложь) Экспорт @@ -1381,6 +1444,94 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые при обновлении информационной базы. +// Заменяет роли в профилях, кроме поставляемых профилей, которые обновляются автоматически. +// Предназначена для вызова из оперативного обработчика обновления. +// +// Параметры: +// ЗаменяемыеРоли - Соответствие - со значениями: +// * Ключ - Строка - имя заменяемой роли, например, "ЧтениеБазовойНСИ". Если роль была удалена, +// то к имени нужно добавить приставку "? ", например, "? ЧтениеБазовойНСИ". +// +// * Значение - Массив - имена ролей для замены указанной (пустой массив, чтобы удалить указанную роль). +// +Процедура ЗаменитьРолиВПрофилях(ЗаменяемыеРоли) Экспорт + + ЗаменяемыеСсылкиРолей = Новый Соответствие; + МассивЗаменяемыхРолей = Новый Массив; + + Для Каждого КлючИЗначение Из ЗаменяемыеРоли Цикл + Если СтрНачинаетсяС(КлючИЗначение.Ключ, "? ") Тогда + СсылкиРоли = Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторУдаленногоОбъектаМетаданных( + "Роль." + СокрЛП(Сред(КлючИЗначение.Ключ, 3))); + Иначе + СсылкиРоли = Новый Массив; + СсылкиРоли.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль." + КлючИЗначение.Ключ)); + КонецЕсли; + Для Каждого СсылкаРоли Из СсылкиРоли Цикл + МассивЗаменяемыхРолей.Добавить(СсылкаРоли); + НовыеРоли = Новый Массив; + ЗаменяемыеСсылкиРолей.Вставить(СсылкаРоли, НовыеРоли); + Для Каждого НоваяРоль Из КлючИЗначение.Значение Цикл + НовыеРоли.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль." + НоваяРоль)); + КонецЦикла; + КонецЦикла; + КонецЦикла; + + // Найти профили, использующие заменяемые роли. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("МассивЗаменяемыхРолей", МассивЗаменяемыхРолей); + Запрос.УстановитьПараметр("ПустойИдентификатор", + Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + + Запрос.Текст = + "ВЫБРАТЬ + | РолиПрофилей.Ссылка КАК Профиль, + | РолиПрофилей.Роль КАК Роль + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК Профили + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + | ПО (РолиПрофилей.Ссылка = Профили.Ссылка) + | И (РолиПрофилей.Роль В (&МассивЗаменяемыхРолей)) + | И (Профили.ИдентификаторПоставляемыхДанных = &ПустойИдентификатор + | ИЛИ Профили.ПоставляемыйПрофильИзменен) + |ИТОГИ ПО + | Профиль"; + + ДеревоПрофилей = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Для Каждого СтрокаПрофиля Из ДеревоПрофилей.Строки Цикл + + ПрофильОбъект = СтрокаПрофиля.Профиль.ПолучитьОбъект(); + РолиПрофиля = ПрофильОбъект.Роли; + + Для Каждого СтрокаРоли Из СтрокаПрофиля.Строки Цикл + + // Удаление заменяемой роли из профиля. + Отбор = Новый Структура("Роль", СтрокаРоли.Роль); + НайденныеСтроки = РолиПрофиля.НайтиСтроки(Отбор); + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + РолиПрофиля.Удалить(НайденнаяСтрока); + КонецЦикла; + + // Добавление новых ролей в профиль вместо заменяемой роли. + ДобавляемыеРоли = ЗаменяемыеСсылкиРолей.Получить(СтрокаРоли.Роль); + + Для Каждого ДобавляемаяРоль Из ДобавляемыеРоли Цикл + Отбор = Новый Структура; + Отбор.Вставить("Роль", ДобавляемаяРоль); + Если РолиПрофиля.НайтиСтроки(Отбор).Количество() = 0 Тогда + НоваяСтрока = РолиПрофиля.Добавить(); + НоваяСтрока.Роль = ДобавляемаяРоль; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрофильОбъект, , Истина); + + КонецЦикла; + +КонецПроцедуры + // Возвращает ссылку на поставляемый профиль по идентификатору. // // Параметры: @@ -1527,7 +1678,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиПравОбъектов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -1622,19 +1772,19 @@ // Выполняет последовательное заполнение и частичное обновление данных, необходимых для работы // подсистемы УправленияДоступом в режиме ограничения доступа на уровне записей. // -// При включенном режиме ограничения доступа на уровне записей заполняет наборы +// При включенном режиме ограничения доступа на уровне записей заполняет наборы // значений доступа. Заполнение выполняется частями при каждом запуске, пока все // наборы значений доступа не будут заполнены. -// При отключении режима ограничения доступа на уровне записей наборы значений доступа +// +// При отключении режима ограничения доступа на уровне записей наборы значений доступа // (заполненные ранее) удаляются при перезаписи объектов, а не все сразу. -// Независимо от режима ограничения доступа на уровне записей обновляет вторичные -// данные: группы значений доступа и дополнительные поля в существующих наборах значений доступа. -// После завершения всех обновлений и заполнений отключает использование регламентного -// задания. // -// Сведения о состоянии работы записываются в журнал регистрации. +// Независимо от режима ограничения доступа на уровне записей обновляет вторичные данные - +// группы значений доступа и дополнительные поля в существующих наборах значений доступа. +// После завершения всех обновлений и заполнений отключает использование регламентного задания. // -// Возможно вызывать программно, например, при обновлении информационной базы. +// Сведения о состоянии работы записываются в журнал регистрации. +// Возможно вызывать программно, например, при обновлении информационной базы. // // Параметры: // КоличествоДанных - Число - (возвращаемое значение) содержит количество @@ -1646,12 +1796,40 @@ КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// Назначение: для универсального журнала документов на регистре (ERP). +// Используется для скрытия дублирующей записи в журнале для документов перемещения, +// в тех случаях, когда точно известно, что записей будет сразу две. +// +// Проверяет есть ли ограничение таблицы по указанному виду доступа. +// +// Если для всех видов доступа таблицы хотя бы в одной группе доступа, предоставляющей права к +// указанной таблице, не настроено ограничение (все значения разрешены для всех видов доступа), +// тогда нет ограничения по указанному виду доступа, в противном случае, нет ограничения +// по указанному виду доступа, если только его нет во всех группах доступа для указанной таблицы. +// +// Параметры: +// Таблица - Строка - полное имя объекта метаданных, например, "Документ.РасходнаяНакладная". +// ВидДоступа - Строка - имя вида доступа, например, "Организации". +// ВсеВидыДоступа - Строка - имена всех видов доступа, которые используются в ограничении таблицы, +// например, "Организации,ГруппыПартнеров,Склады". +// +// Возвращаемое значение: +// Булево - если Истина, то есть ограничение таблицы по указанному виду доступа. +// +Функция ЕстьОграничениеТаблицыПоВидуДоступа(Таблица, ВидДоступа, ВсеВидыДоступа) Экспорт + + Возврат УправлениеДоступомСлужебный.ЕстьОграничениеТаблицыПоВидуДоступа(Таблица, + ВидДоступа, ВсеВидыДоступа); + +КонецФункции + #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс +#КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. +#Область СлужебныеПроцедурыИФункции // Дополнение к процедуре ЗаполнитьНаборыЗначенийДоступа. @@ -1665,9 +1843,9 @@ // Процедура УточнитьНаборыЗначенийДоступа(СсылкаНаОбъект, Таблица) - ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; + ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа().ПоИменам; - ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.Параметры().ВозможныеПраваДляНастройкиПравОбъектов; + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); ТипыВладельцевНастроекПрав = ВозможныеПрава.ПоТипамСсылок; Для каждого Строка Из Таблица Цикл @@ -1977,8 +2155,8 @@ + 6; // Место для разделителей ТаблицаСтрокНабора = Новый ТаблицаЗначений; - ТаблицаСтрокНабора.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(ДлинаИдентификатораСтроки))); - ТаблицаСтрокНабора.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20))); + ТаблицаСтрокНабора.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(ДлинаИдентификатораСтроки))); + ТаблицаСтрокНабора.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20))); ТаблицаСтрокНабора.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); ТаблицаСтрокНабора.Колонки.Добавить("Уточнение", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); @@ -2079,7 +2257,7 @@ СвойстваГрупп = Новый Структура; - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); СвойстваВидаДоступа = СвойстваВидовДоступа.ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗначенияДоступа); Если СвойстваВидаДоступа = Неопределено Тогда @@ -2123,4 +2301,189 @@ КонецПроцедуры +// Для процедур ВключитьПрофильПользователю и ВыключитьПрофильПользователю. +Процедура ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Включить) + + Если Не УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда + ВызватьИсключение + НСтр("ru = 'Данная операция возможна только для упрощенного + |интерфейса настройки прав доступа.'"); + КонецЕсли; + + Если Включить Тогда + ИмяПроцедурыИлиФункции = "ВключитьПрофильПользователю"; + Иначе + ИмяПроцедурыИлиФункции = "ВыключитьПрофильПользователю"; + КонецЕсли; + + // Проверка типов значения параметра Пользователь. + Если ТипЗнч(Пользователь) <> Тип("СправочникСсылка.Пользователи") + И ТипЗнч(Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда + + ИмяПараметра = "Пользователь"; + ЗначениеПараметра = Пользователь; + Типы = Новый Массив; + Типы.Добавить(Тип("СправочникСсылка.Пользователи")); + Типы.Добавить(Тип("СправочникСсылка.ВнешниеПользователи")); + ОжидаемыеТипы = Новый ОписаниеТипов(Типы); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |Ожидалось: %3; передано значение: %4 (тип %5).'"), + ИмяПараметра, + ИмяПроцедурыИлиФункции, + ОжидаемыеТипы, + ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), + ТипЗнч(ЗначениеПараметра)); + КонецЕсли; + + // Проверка типов значения параметра Профиль. + Если ТипЗнч(Профиль) <> Тип("СправочникСсылка.ПрофилиГруппДоступа") + И ТипЗнч(Профиль) <> Тип("Строка") + И ТипЗнч(Профиль) <> Тип("УникальныйИдентификатор") + И Не (Не Включить И ТипЗнч(Профиль) = Тип("Неопределено")) Тогда + + ИмяПараметра = "Профиль"; + ЗначениеПараметра = Профиль; + Типы = Новый Массив; + Типы.Добавить(Тип("СправочникСсылка.ПрофилиГруппДоступа")); + Типы.Добавить(Тип("Строка")); + Типы.Добавить(Тип("УникальныйИдентификатор")); + Если Не Включить Тогда + Типы.Добавить(Тип("Неопределено")); + КонецЕсли; + ОжидаемыеТипы = Новый ОписаниеТипов(Типы); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |Ожидалось: %3; передано значение: %4 (тип %5).'"), + ИмяПараметра, + ИмяПроцедурыИлиФункции, + ОжидаемыеТипы, + ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), + ТипЗнч(ЗначениеПараметра)); + КонецЕсли; + + Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") + Или ТипЗнч(Профиль) = Тип("Неопределено") Тогда + + ТекущийПрофиль = Профиль; + Иначе + ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору( + Профиль, Истина); + КонецЕсли; + + Если ТекущийПрофиль <> Неопределено Тогда + СвойстваПрофиля = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущийПрофиль, + "Наименование, ВидыДоступа"); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | &УсловиеОтбора"; + Запрос.УстановитьПараметр("Пользователь", Пользователь); + Если ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда + УсловиеОтбора = "ГруппыДоступа.Ссылка = Значение(Справочник.ГруппыДоступа.Администраторы)"; + Иначе + УсловиеОтбора = "ГруппыДоступа.Пользователь = &Пользователь"; + Если Включить Или ТекущийПрофиль <> Неопределено Тогда + УсловиеОтбора = УсловиеОтбора + Символы.ПС + " И ГруппыДоступа.Профиль = &Профиль"; + Запрос.УстановитьПараметр("Профиль", ТекущийПрофиль); + КонецЕсли; + КонецЕсли; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбора", УсловиеОтбора); + + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.ИсточникДанных = РезультатЗапроса; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Выборка.Следующий(); + Пока Истина Цикл + ПерсональнаяГруппаДоступа = Выборка.Ссылка; + Если ЗначениеЗаполнено(ПерсональнаяГруппаДоступа) Тогда + ГруппаДоступаОбъект = ПерсональнаяГруппаДоступа.ПолучитьОбъект(); + ГруппаДоступаОбъект.ПометкаУдаления = Ложь; + + ИначеЕсли ТекущийПрофиль <> Неопределено Тогда + // Создание персональной группы доступа. + ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент(); + ГруппаДоступаОбъект.Родитель = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа(); + ГруппаДоступаОбъект.Наименование = СвойстваПрофиля.Наименование; + ГруппаДоступаОбъект.Пользователь = Пользователь; + ГруппаДоступаОбъект.Профиль = ТекущийПрофиль; + ГруппаДоступаОбъект.ВидыДоступа.Загрузить(ВидыДоступаДляНовойГруппыДоступа(СвойстваПрофиля)); + Иначе + ГруппаДоступаОбъект = Неопределено; + КонецЕсли; + + Если ПерсональнаяГруппаДоступа = Справочники.ГруппыДоступа.Администраторы Тогда + ОписаниеПользователя = ГруппаДоступаОбъект.Пользователи.Найти( + Пользователь, "Пользователь"); + + Если Включить И ОписаниеПользователя = Неопределено Тогда + ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; + ИначеЕсли Не Включить И ОписаниеПользователя <> Неопределено Тогда + ГруппаДоступаОбъект.Пользователи.Удалить(ОписаниеПользователя); + КонецЕсли; + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + // Проверка пустого списка пользователей ИБ в группе доступа Администраторы. + ОписаниеОшибки = ""; + УправлениеДоступомСлужебный.ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы( + ГруппаДоступаОбъект.Пользователи, ОписаниеОшибки); + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение + НСтр("ru = 'Профиль Администратор должен быть хотя бы у одного пользователя, + |которому разрешен вход в программу.'"); + КонецЕсли; + КонецЕсли; + ИначеЕсли ГруппаДоступаОбъект <> Неопределено Тогда + ГруппаДоступаОбъект.Пользователи.Очистить(); + Если Включить Тогда + ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; + КонецЕсли; + КонецЕсли; + + Если ГруппаДоступаОбъект <> Неопределено Тогда + ГруппаДоступаОбъект.Записать(); + КонецЕсли; + + Если Не Выборка.Следующий() Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция ВидыДоступаДляНовойГруппыДоступа(СвойстваПрофиля) + + ВидыДоступа = СвойстваПрофиля.ВидыДоступа.Выгрузить(); + + Отбор = Новый Структура; + Отбор.Вставить("Предустановленный", Истина); + Предустановленные = ВидыДоступа.НайтиСтроки(Отбор); + + Для Каждого Предустановленный Из Предустановленные Цикл + ВидыДоступа.Удалить(Предустановленный); + КонецЦикла; + + Возврат ВидыДоступа; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl index 468cff6e9..5174dc648 100644 --- a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl @@ -1,13 +1,8 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. +// Примечание: виды доступа Пользователи и ВнешниеПользователи предопределены, +// но их можно удалить из списка ВидыДоступа, если они не требуются для ограничения прав доступа. // // Параметры: // ВидыДоступа - ТаблицаЗначений - с колонками: @@ -21,6 +16,20 @@ // * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно // выбрать несколько групп значений (Групп доступа номенклатуры). // +// Пример: +// 1. Для настройки прав доступа в разрезе организаций: +// ВидДоступа = ВидыДоступа.Добавить(); +// ВидДоступа.Имя = "Организации"; +// ВидДоступа.Представление = НСтр("ru = 'Организации'"); +// ВидДоступа.ТипЗначений = Тип("СправочникСсылка.Организации"); +// +// 2. Для настройки прав доступа в разрезе групп партнеров: +// ВидДоступа = ВидыДоступа.Добавить(); +// ВидДоступа.Имя = "ГруппыПартнеров"; +// ВидДоступа.Представление = НСтр("ru = 'Группы партнеров'"); +// ВидДоступа.ТипЗначений = Тип("СправочникСсылка.Партнеры"); +// ВидДоступа.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыДоступаПартнеров"); +// Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт @@ -34,11 +43,10 @@ // разработчика для подсистемы Управление доступом. // // Параметры: -// ОписанияПрофилей - Массив - массив структур, в который нужно добавить описания. -// Пустая структура должна быть получена при помощи функции. -// УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа. +// ОписанияПрофилей - Массив - добавить описания профилей групп доступа (Структура). +// Состав свойств структуры см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа. // -// ПараметрыОбновления - Структура - структура со свойствами: +// ПараметрыОбновления - Структура - содержит свойства: // * ОбновлятьИзмененныеПрофили - Булево - начальное значение Истина. // * ЗапретитьИзменениеПрофилей - Булево - начальное значение Истина. // Если установить Ложь, тогда поставляемые профили можно не только просматривать, но и редактировать. @@ -47,6 +55,19 @@ // Если установить Истина, то настройки значений, выполненные администратором для // вида доступа который был удален из профиля, будут также удалены из групп доступа. // +// Пример: +// ОписаниеПрофиля = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); +// ОписаниеПрофиля.Имя = "Менеджер"; +// ОписаниеПрофиля.Идентификатор = "75fa0ecb-98aa-11df-b54f-e0cb4ed5f655"; +// ОписаниеПрофиля.Наименование = НСтр("ru = 'Менеджер по продажам'", Метаданные.ОсновнойЯзык.КодЯзыка); +// ОписаниеПрофиля.Роли.Добавить("ЗапускВебКлиента"); +// ОписаниеПрофиля.Роли.Добавить("ЗапускТонкогоКлиента"); +// ОписаниеПрофиля.Роли.Добавить("БазовыеПрава"); +// ОписаниеПрофиля.Роли.Добавить("Подсистема_Продажи"); +// ОписаниеПрофиля.Роли.Добавить("ДобавлениеИзменениеДокументовПокупателей"); +// ОписаниеПрофиля.Роли.Добавить("ПросмотрОтчетаКнигаПокупок"); +// ОписанияПрофилей.Добавить(ОписаниеПрофиля); +// Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт @@ -56,15 +77,15 @@ // Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, // от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. // -// Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект": -// 1) стандартно при чтении "подчиненного" объекта -// проверяется наличие права чтения "ведущего" объекта -// и проверяется отсутствие ограничения чтения "ведущего" объекта; -// 2) стандартно при добавлении, изменении, удалении "подчиненного" объекта -// проверяется наличие права изменения "ведущего" объекта -// и проверяется отсутствие ограничения изменения "ведущего" объекта. +// Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект". +// 1. Стандартно при чтении "подчиненного" объекта +// проверяется наличие права чтения "ведущего" объекта и +// проверяется отсутствие ограничения чтения "ведущего" объекта. +// 2. Стандартно при добавлении, изменении, удалении "подчиненного" объекта +// проверяется наличие права изменения "ведущего" объекта и +// проверяется отсутствие ограничения изменения "ведущего" объекта. // -// Допускается только одно переназначение по сравнению со стандартным: +// Допускается только одно переназначение по сравнению со стандартным - // в пункте "2)" вместо проверки права изменения "ведущего" объекта установить // проверку права чтения "ведущего" объекта. // @@ -82,8 +103,35 @@ // Заполняет описания возможных прав, назначаемых для объектов, указанных типов. // // Параметры: -// ВозможныеПрава - ТаблицаЗначений - с колонками, описание которых см. в комментарии -// к функции РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). +// ВозможныеПрава - ТаблицаЗначений - с колонками: +// ВладелецПрав - Строка - полное имя таблицы значения доступа. +// +// Имя - Строка - идентификатор права, например, ИзменениеПапок. Право с именем УправлениеПравами +// должно быть обязательно определено для общей формы настройки прав "Права доступа". +// УправлениеПравами - это право на изменение прав по владельцу прав, которое проверяется +// при открытии РегистрСведений.НастройкиПравОбъектов.Форма.НастройкиПравОбъектов. +// +// Заголовок - Строка - заголовок права, например в форме НастройкиПравОбъектов: +// "Изменение. +// |папок". +// +// Подсказка - Строка - подсказка к заголовку права, +// например, "Добавление, изменение и пометка удаления папок". +// +// НачальноеЗначение - Булево - начальное значение флажка права при добавлении новой строки +// в форме "Права доступа". +// +// ТребуемыеПрава - Массив строк - имена прав, требуемых для от этого права, +// например, право "ДобавлениеФайлов" требует право "ИзменениеФайлов". +// +// ЧтениеВТаблицах - Массив строк - полные имена таблиц, для которых это право обозначает право Чтение. +// Возможно использование символа "*", который обозначает "для всех остальных таблиц" +// т.к. право Чтение может зависеть только от права Чтение, то имеет смысл только символ "*" +// (требуется для работы шаблонов ограничения доступа). +// +// ИзменениеВТаблицах - Массив строк - полные имена таблиц, для которых это право обозначает право Изменение. +// Возможно использование символа "*", который обозначает "для всех остальных таблиц" +// (требуется для работы шаблонов ограничения доступа). // Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт @@ -151,12 +199,12 @@ // Позволяет реализовать перезапись зависимых наборов значений доступа других объектов. // -// Вызывается из процедур: -// УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа(), -// УправлениеДоступомСлужебный.ЗаписатьЗависимыеНаборыЗначенийДоступа(). +// Вызывается из процедур +// УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа, +// УправлениеДоступомСлужебный.ЗаписатьЗависимыеНаборыЗначенийДоступа. // // Параметры: -// Ссылка - СправочникСсылка, ДокументСсылка, ... - ссылка на объект для которого +// Ссылка - СправочникСсылка, ДокументСсылка, ... - ссылка на объект, для которого // записаны наборы значений доступа. // // СсылкиНаЗависимыеОбъекты - Массив - массив элементов типа СправочникСсылка, ДокументСсылка, ... diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl index ea70ea1ed..f04b3f311 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl @@ -1,290 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Объявление служебных событий, к которым можно добавлять обработчики. - -// Объявляет события подсистемы УправлениеДоступом: -// -// Серверные события: -// ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов, -// ПриЗаполненииЗависимостейПравДоступа, -// ПриЗаполненииВидовОграниченийПравОбъектовМетаданных, -// ПриЗаполненииВидовДоступа, -// ПриЗаполненииПоставляемыхПрофилейГруппДоступа, -// ПриЗаполненииИспользованияВидаДоступа, -// ПриИзмененииНаборовЗначенийДоступа. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Заполняет описания возможных прав, назначаемых для объектов, указанных типов. - // - // Параметры: - // ВозможныеПрава - ТаблицаЗначений, содержащая поля, - // описание которых см. в комментарии к функции - // РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). - // - // Синтаксис: - // Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(Знач ВозможныеПрава) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов"); - - // Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, - // от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. - // - // Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект": - // 1) стандартно при чтении "подчиненного" объекта - // проверяется наличие права чтения "ведущего" объекта - // и проверяется отсутствие ограничения чтения "ведущего" объекта; - // 2) стандартно при добавлении, изменении, удалении "подчиненного" объекта - // проверяется наличие права изменения "ведущего" объекта - // и проверяется отсутствие ограничения изменения "ведущего" объекта. - // - // Допускается только одно переназначение по сравнению со стандартным: - // в пункте "2)" вместо проверки права изменения "ведущего" объекта установить - // проверку права чтения "ведущего" объекта. - // - // Параметры: - // ЗависимостиПрав - ТаблицаЗначений с колонками: - // - ВедущаяТаблица - Строка, например, "БизнесПроцесс.Задание". - // - ПодчиненнаяТаблица - Строка, например, "Задача.ЗадачаИсполнителя". - // - // Синтаксис: - // Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииЗависимостейПравДоступа"); - - // Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. - // Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. - // - // Обязательно требуется заполнить только виды доступа, используемые - // в шаблонах ограничения доступа явно, а виды доступа, используемые - // в наборах значений доступа могут быть получены из текущего состояния - // регистра сведений НаборыЗначенийДоступа. - // - // Для автоматической подготовки содержимого процедуры следует - // воспользоваться инструментами разработчика для подсистемы Управление доступом. - // - // Параметры: - // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта], - // например, "Документ.ПриходнаяНакладная.Чтение.Организации", - // "Документ.ПриходнаяНакладная.Чтение.Контрагенты", - // "Документ.ПриходнаяНакладная.Изменение.Организации", - // "Документ.ПриходнаяНакладная.Изменение.Контрагенты", - // "Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма", - // "Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма", - // "Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов", - // "Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо", - // "Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов", - // "Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо". - // Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в - // шаблонах ограничений доступа, как "ссылка" на другой объект, по которому - // ограничивается текущий объект таблицы. - // Когда вид доступа "Объект" задан, также требуется задать типы таблиц, - // которые используются для этого вида доступа. Т.е. перечислить типы, - // которые соответствуют полю, использованному в шаблоне ограничения доступа - // в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" - // нужно перечислить только те типы поля, которые есть - // у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. - // - // Синтаксис: - // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"); - - // Заполняет виды доступа, используемые в ограничениях прав доступа. - // Виды доступа Пользователи и ВнешниеПользователи уже заполнены. - // Их можно удалить, если они не требуются для ограничения прав доступа. - // - // Параметры: - // ВидыДоступа - ТаблицаЗначений - с колонками: - // * Имя - Строка - имя используемое в описании поставляемых - // профилей групп доступа и текстах ОДД. - // * Представление - Строка - представляет вид доступа в профилях и группах доступа. - // * ТипЗначений - Тип - тип ссылки значений доступа. - // Например, Тип("СправочникСсылка.Номенклатура"). - // * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. - // Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). - // * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно - // выбрать несколько групп значений (Групп доступа номенклатуры). - // - // Синтаксис: - // Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"); - - // Заполняет описания поставляемых профилей групп доступа и - // переопределяет параметры обновления профилей и групп доступа. - // - // Для автоматической подготовки содержимого процедуры следует - // воспользоваться инструментами разработчика для подсистемы Управление доступом. - // - // Параметры: - // ОписанияПрофилей - Массив в который нужно добавить описания. - // Пустая структура должна быть получена при помощи функции - // УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(). - // - // ПараметрыОбновления - Структура со свойствами: - // - // ОбновлятьИзмененныеПрофили - Булево (начальное значение Истина). - // - // ЗапретитьИзменениеПрофилей - Булево (начальное значение Истина), - // если установить Ложь, тогда поставляемые профили будут открываться - // в режиме ТолькоПросмотр. - // - // ОбновлятьГруппыДоступа - Булево (начальное значение Истина). - // - // ОбновлятьГруппыДоступаСУстаревшимиНастройками - Булево (начальное - // значение Ложь), если установить Истина, то настройки значений, - // сделанные администратором по виду доступа, который удален из - // профиля, будут удалены из группы доступа. - // - // Синтаксис: - // Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьПоставляемыеПрофилиГруппДоступа). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииПоставляемыхПрофилейГруппДоступа"); - - // Заполняет использование видов доступа в зависимости от функциональных опций конфигурации, - // например, ИспользоватьГруппыДоступаНоменклатуры. - // - // Параметры: - // ВидДоступа - Строка - имя вида доступа заданное в процедуре ПриЗаполненииВидовДоступа. - // Использование - Булево - начальное значение Истина. - // - // Синтаксис: - // Процедура ПриЗаполненииИспользованияВидаДоступа(ИмяВидаДоступа, Использование) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"); - - // Позволяет реализовать перезапись зависимых наборов значений доступа других объектов. - // - // Вызывается из процедур: - // УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа(), - // УправлениеДоступомСлужебный.ЗаписатьЗависимыеНаборыЗначенийДоступа(). - // - // Параметры: - // Ссылка - СправочникСсылка, ДокументСсылка, ... - ссылка на объект для которого - // записаны наборы значений доступа. - // - // СсылкиНаЗависимыеОбъекты - Массив элементов типа СправочникСсылка, ДокументСсылка, ... - // Содержит ссылки на объекты с зависимыми наборами значений доступа. - // Начальное значение - пустой массив. - // - // Синтаксис: - // Процедура ПриИзмененииНаборовЗначенийДоступа(Знач Ссылка, СсылкиНаЗависимыеОбъекты) Экспорт - // - // (То же, что УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриИзмененииНаборовЗначенийДоступа"); - - // Вызывается при обновлении ролей пользователя информационной базы. - // - // Параметры: - // ИдентификаторПользователяИБ - УникальныйИдентификатор, - // Отказ - Булево. При установке значения параметра в значение Ложь внутри обработчика события - // обновление ролей для этого пользователя информационной базы будет пропущено. - // - // Синтаксис: - // Процедура ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ) Экспорт - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриОбновленииРолейПользователяИБ"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков событий. - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОбнаруженииНеУникальностиПредопределенного"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхГлавному"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОтправкеДанныхПодчиненному"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтПодчиненного"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтПодчиненного"].Добавить( - "УправлениеДоступомСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеПолученияДанныхОтГлавного"].Добавить( - "УправлениеДоступомСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "УправлениеДоступомСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( - "УправлениеДоступомСлужебный"); - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "УправлениеДоступомСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "Справочники.ПрофилиГруппДоступа"); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ГруппыДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Основные процедуры и функции. @@ -312,157 +27,6 @@ КонецПроцедуры -// Устанавливает параметры сеанса по текущим настройкам констант и -// настройкам групп доступа пользователей. -// Вызывается ПриНачалеРаботыСистемы. -// -Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если Не Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() Тогда - // Для корректной работы препроцессора в ограничениях доступа, требуется инициализации всех - // параметров сеанса, которые могут быть востребованы в работе препроцессора. - ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Ложь; - ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ""; - ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = ""; - ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = ""; - ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = ""; - - ПараметрыСеанса.ТипыЗначенийДоступаСГруппами - = Новый ФиксированныйМассив(Новый Массив); - - ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ""; - - ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав - = Новый ФиксированныйМассив(Новый Массив); - - ПараметрыСеанса.ТипыВладельцевНастроекПрав - = Новый ФиксированныйМассив(Новый Массив); - - УстановленныеПараметры.Добавить("ОграничениеДоступаНаУровнеЗаписейВключено"); - УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); - УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); - УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); - УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); - УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); - УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); - УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); - УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); - Возврат; - КонецЕсли; - - ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Истина; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗначенияПоУмолчанию.ТипЗначенийДоступа КАК ТипЗначений, - | ЗначенияПоУмолчанию.ВсеРазрешеныБезИсключений КАК ВсеРазрешеныБезИсключений - |ПОМЕСТИТЬ ЗначенияПоУмолчаниюДляПользователя - |ИЗ - | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию - |ГДЕ - | ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | ГруппыДоступаПользователи.Ссылка = ЗначенияПоУмолчанию.ГруппаДоступа - | И ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей - | И СоставыГруппПользователей.Пользователь = &ТекущийПользователь) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗначенияПоУмолчанию.ТипЗначений - |ИЗ - | ЗначенияПоУмолчаниюДляПользователя КАК ЗначенияПоУмолчанию - | - |СГРУППИРОВАТЬ ПО - | ЗначенияПоУмолчанию.ТипЗначений - | - |ИМЕЮЩИЕ - | МИНИМУМ(ЗначенияПоУмолчанию.ВсеРазрешеныБезИсключений) = ИСТИНА"; - - ТипыЗначенийВсеРазрешеныБезИсключений = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТипЗначений"); - - // Установка параметров ВсеВидыДоступаКромеСпециальных, ВидыДоступаСОтключеннымИспользованием. - ВсеВидыДоступаКромеСпециальных = Новый Массив; - ВидыДоступаСОтключеннымИспользованием = Новый Массив; - - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - - Для каждого СвойстваВидаДоступа Из Параметры.СвойстваВидовДоступа.Массив Цикл - ВсеВидыДоступаКромеСпециальных.Добавить(СвойстваВидаДоступа.Имя); - - Если НЕ ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) - ИЛИ ТипыЗначенийВсеРазрешеныБезИсключений.Найти(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда - - ВидыДоступаСОтключеннымИспользованием.Добавить(СвойстваВидаДоступа.Имя); - КонецЕсли; - КонецЦикла; - - ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ВсеКомбинацииВидовДоступа(ВсеВидыДоступаКромеСпециальных); - - УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); - - ВсеВидыДоступаКромеСпециальныхОтключены = (ВсеВидыДоступаКромеСпециальных.Количество() - = ВидыДоступаСОтключеннымИспользованием.Количество()); - - Если ВсеВидыДоступаКромеСпециальныхОтключены Тогда - ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = "Все"; - Иначе - ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием - = ВсеКомбинацииВидовДоступа(ВидыДоступаСОтключеннымИспользованием); - КонецЕсли; - - УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); - - // Установка параметров ВидыДоступаБезГруппДляЗначенияДоступа, - // ВидыДоступаСОднойГруппойДляЗначенияДоступа, ТипыЗначенийДоступаСГруппами. - ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = - ВсеКомбинацииВидовДоступа(Параметры.СвойстваВидовДоступа.БезГруппДляЗначенияДоступа); - ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = - ВсеКомбинацииВидовДоступа(Параметры.СвойстваВидовДоступа.СОднойГруппойДляЗначенияДоступа); - - ТипыЗначенийДоступаСГруппами = Новый Массив; - Для каждого КлючИЗначение Из Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами Цикл - ТипыЗначенийДоступаСГруппами.Добавить(КлючИЗначение.Значение); - КонецЦикла; - ПараметрыСеанса.ТипыЗначенийДоступаСГруппами = Новый ФиксированныйМассив(ТипыЗначенийДоступаСГруппами); - - УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); - УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); - УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); - - // Установка параметров ТаблицыСОтдельнымиНастройкамиПрав, - // ИдентификаторыТаблицСОтдельнымиНастройкамиПрав, ТипыВладельцевНастроекПрав. - ОтдельныеТаблицы = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ОтдельныеТаблицы; - ТаблицыСОтдельнымиНастройкамиПрав = ""; - ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = Новый Массив; - Для каждого КлючИЗначение Из ОтдельныеТаблицы Цикл - ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав - + "|" + КлючИЗначение.Значение + ";" + Символы.ПС; - ИдентификаторыТаблицСОтдельнымиНастройкамиПрав.Добавить(КлючИЗначение.Ключ); - КонецЦикла; - - ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав; - - ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = - Новый ФиксированныйМассив(ИдентификаторыТаблицСОтдельнымиНастройкамиПрав); - - ПараметрыСеанса.ТипыВладельцевНастроекПрав = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ТипыВладельцев; - - УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); - УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); - УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); - -КонецПроцедуры - // Обновляет состав пользователей указанных групп исполнителей. // // Требуется вызывать при изменении состава пользователей у групп исполнителей, @@ -536,32 +100,6 @@ УстановитьПривилегированныйРежим(Истина); - ТекстЗапросаГруппДоступа = - "ВЫБРАТЬ - | ГруппыДоступа.Ссылка КАК Ссылка - |ПОМЕСТИТЬ ГруппыДоступаПользователя - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа - | ПО (СвойстваТекущейТаблицы.ПолноеИмя = &ИмяОсновнойТаблицыСписка) - | И (ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа - | ГДЕ - | ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка - | И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка)) - | И (ГруппыДоступа.Ссылка В - | (ВЫБРАТЬ - | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа - | ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь - | И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь))"; - ТекстЗапросаЗначенийБезГрупп = "ВЫБРАТЬ ПЕРВЫЕ 101 | ЗначенияБезГрупп.Ссылка КАК Ссылка @@ -690,7 +228,7 @@ ТекстЗапросаВсеЗначения = СтрЗаменить(ТекстЗапросаВсеЗначения, "ВсеЗначения.Ссылка В(&Значения)", "Истина"); КонецЕсли; - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); ТекстЗапроса = ""; АвторизованныйПользователь = Пользователи.АвторизованныйПользователь(); ДобавитьТекущегоПользователя = Ложь; @@ -733,7 +271,7 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("ИмяОсновнойТаблицыСписка", Таблица); Запрос.УстановитьПараметр("АвторизованныйПользователь", АвторизованныйПользователь); - Запрос.Текст = ТекстЗапросаГруппДоступа; + Запрос.Текст = ТекстЗапросаГруппДоступа(); Если ТипЗнч(Значения) = Тип("Массив") Тогда Запрос.УстановитьПараметр("Значения", Значения); КонецЕсли; @@ -758,19 +296,107 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. +// Добавляет администраторов системы в группу доступа, +// связанную с предопределенным профилем ОткрытиеВнешнихОтчетовИОбработок. // -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа; - Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ОграничиватьДоступНаУровнеЗаписей; +Процедура УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено) Экспорт + + СвойстваПрофиля = ОписаниеПрофиляОткрытиеВнешнихОтчетовИОбработок(); + СвойстваПрофиля.Вставить("Ссылка", Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору( + СвойстваПрофиля.Имя, Истина)); + + ИдентификаторРоли = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( + Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок); + + // В упрощенном интерфейсе группу доступа создавать не требуется (только профиль). + УпрощенныйИнтерфейс = УпрощенныйИнтерфейсНастройкиПравДоступа(); + Если Не УпрощенныйИнтерфейс Тогда + ГруппаПрофиля = ГруппаДоступаОткрытиеВнешнихОтчетовИОбработок(СвойстваПрофиля); + КонецЕсли; + + Если ОткрытиеРазрешено Тогда + // Включение администраторов в группы доступа с этим профилем. + Если Не УпрощенныйИнтерфейс Тогда + ГруппаДоступаОбъект = ГруппаПрофиля.ПолучитьОбъект(); + КонецЕсли; + РольАдминистратора = Метаданные.Роли.АдминистраторСистемы; + АдминистраторыСРолью = Новый Массив; + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + Если ПользовательИБ.Роли.Содержит(РольАдминистратора) Тогда + Пользователь = Справочники.Пользователи.НайтиПоРеквизиту( + "ИдентификаторПользователяИБ", + ПользовательИБ.УникальныйИдентификатор); + Если Пользователь = Неопределено Тогда + Продолжить; + КонецЕсли; + Если УпрощенныйИнтерфейс Тогда + // В упрощенном интерфейсе каждый администратор включаются в отдельную группу. + УправлениеДоступом.ВключитьПрофильПользователю(Пользователь, СвойстваПрофиля.Ссылка); + Иначе + // В расширенном интерфейсе администраторы включаются в одну группу, связанную с предопределенным профилем. + Если ГруппаДоступаОбъект.Пользователи.Найти(Пользователь, "Пользователь") = Неопределено Тогда + ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если Не УпрощенныйИнтерфейс И ГруппаДоступаОбъект.Модифицированность() Тогда + ГруппаДоступаОбъект.Записать(); + КонецЕсли; + Иначе + // Удаление роли из всех профилей, за исключением предопределенного. + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПрофилиГруппДоступаРоли.Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + |ГДЕ + | ПрофилиГруппДоступаРоли.Роль = &Роль + | И ПрофилиГруппДоступаРоли.Ссылка <> &ИсключаемыйПрофиль"; + Запрос.УстановитьПараметр("Роль", ИдентификаторРоли); + Запрос.УстановитьПараметр("ИсключаемыйПрофиль", СвойстваПрофиля.Ссылка); + МассивПрофилей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Для Каждого Профиль Из МассивПрофилей Цикл + ПрофильОбъект = Профиль.ПолучитьОбъект(); + Найденные = ПрофильОбъект.Роли.НайтиСтроки(Новый Структура("Роль", ИдентификаторРоли)); + Для Каждого СтрокаТаблицы Из Найденные Цикл + ПрофильОбъект.Роли.Удалить(СтрокаТаблицы); + КонецЦикла; + ПрофильОбъект.Записать(); + КонецЦикла; + + // Очистка состава групп доступа, связанных с предопределенным профилем. + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Профиль = &Профиль"; + Запрос.УстановитьПараметр("Профиль", СвойстваПрофиля.Ссылка); + МассивГрупп = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Для Каждого ГруппаДоступа Из МассивГрупп Цикл + ГруппаДоступаОбъект = ГруппаДоступа.ПолучитьОбъект(); + ГруппаДоступаОбъект.Пользователи.Очистить(); + ГруппаДоступаОбъект.Записать(); + КонецЦикла; + КонецЕсли; + КонецПроцедуры -// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ГруппыДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("ОграничениеДоступаНаУровнеЗаписейВключено", @@ -796,128 +422,63 @@ КонецПроцедуры -// Вызовы из подсистемы Пользователи. +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа; + Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ОграничиватьДоступНаУровнеЗаписей; +КонецПроцедуры -// См. одноименную процедуру в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииНастроек(Настройки) Экспорт +// Обновляет вспомогательные данные, которые зависят только от конфигурации. +// Записывает изменения этих данных по версиям конфигурации(если изменения есть), +// чтобы использовать эти изменения при обновлении остальных вспомогательных данных, +// например, в обработчике ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации. +// +Процедура ОбновитьПараметрыОграниченияДоступа(ЕстьИзменения = Неопределено) Экспорт - // Роли устанавливаются автоматически по данным групп доступа - // через связь: ПользователиГруппыДоступа -> Профиль -> РолиПрофиля. - Настройки.РедактированиеРолей = Ложь; + РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра(ЕстьИзменения); + + РегистрыСведений.ЗависимостиПравДоступа.ОбновитьДанныеРегистра(ЕстьИзменения); + + ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения); + + Справочники.ПрофилиГруппДоступа.ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения); + + Справочники.ПрофилиГруппДоступа.ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения); + + РегистрыСведений.НастройкиПравОбъектов.ОбновитьВозможныеПраваДляНастройкиПравОбъектов(ЕстьИзменения); КонецПроцедуры -// См. процедуру ИзменитьДействияВФорме в общем модуле ПользователиПереопределяемый. -Процедура ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме) Экспорт - - ДействияВФорме.Роли = ""; - -КонецПроцедуры - -// Переопределяет текст комментария при авторизации пользователя ИБ, -// созданного в конфигураторе с административными правами. -// Вызывается из Пользователи.АвторизоватьТекущегоПользователя(). -// Комментарий записывается в журнал регистрации. +// Обновляет описание свойств видов доступа в параметрах работы программы. // // Параметры: -// Комментарий - Строка - начальное значение задано. +// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// устанавливается Истина, иначе не изменяется. // -Процедура ПослеЗаписиАдминистратораПриАвторизации(Комментарий) Экспорт +Процедура ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения = Ложь) Экспорт - Комментарий = - НСтр("ru = 'Выполнен запуск от имени пользователя с ролью ""Полные права"", - |который не зарегистрирован в списке пользователей. - |Выполнена автоматическая регистрация в списке пользователей. - |Пользователь добавлен в группу доступа Администраторы. - | - |Для ведения списка и настройки прав пользователей предназначен список Пользователи, - |режим конфигурирования 1С:Предприятия для этого использовать не следует.'"); + УстановитьПривилегированныйРежим(Истина); -КонецПроцедуры - -// Доопределяет действия, необходимые после установки пользователя -// информационной базы у пользователя или внешнего пользователя, -// т.е. при изменении реквизита ИдентификаторПользователяИБ на не пустой. -// -// Например, можно обновить роли. -// -// Параметры: -// Ссылка - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи - пользователь. -// -Процедура ПослеУстановкиПользователяИБ(Ссылка, ПарольПользователяСервиса) Экспорт - - УправлениеДоступом.ОбновитьРолиПользователей(Ссылка, ПарольПользователяСервиса); - -КонецПроцедуры - -// Позволяет переопределить текст вопроса перед записью первого администратора. -// Вызывается из обработчика ПередЗаписью формы пользователя. -// Вызов выполняется если установлен ЗапретРедактированияРолей() и -// количество пользователей информационной базы равно нулю. -// -// Параметры: -// ТекстВопроса - Строка - текст вопроса, который можно переопределить. -// -Процедура ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса) Экспорт - - ТекстВопроса = - НСтр("ru = 'В список пользователей программы добавляется первый пользователь, - |поэтому он будет автоматически включен в группу доступа Администраторы. - |Продолжить?'") - -КонецПроцедуры - -// Доопределяет действия при создании администратора в подсистеме Пользователи. -// -// Параметры: -// Администратор - СправочникСсылка.Пользователи (изменение объекта запрещено). -// Уточнение - Строка - поясняет при каких условиях был создан администратор. -// -Процедура ПриСозданииАдминистратора(Администратор, Уточнение) Экспорт - - Если ТипЗнч(Администратор) <> Тип("СправочникСсылка.Пользователи") Тогда - Возврат; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Пользователь", Администратор); - Запрос.Текст = - "ВЫБРАТЬ - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - |ГДЕ - | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) - | И ГруппыДоступаПользователи.Пользователь = &Пользователь"; - - Если Не Запрос.Выполнить().Пустой() Тогда - Возврат; - КонецЕсли; - - КомментарийДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользователь ""%1"" добавлен в группу доступа Администраторы по причине: - |%2'"), - Администратор, - Уточнение); - - Объект = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); + СвойстваВидовДоступа = СвойстваВидовДоступа(); НачатьТранзакцию(); Попытка - ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, Объект.ВерсияДанных); - Если Объект.Пользователи.Найти(Администратор, "Пользователь") = Неопределено Тогда - Объект.Пользователи.Добавить().Пользователь = Администратор; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Управление доступом.Автоматическое изменение группы доступа Администраторы'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - Метаданные.Справочники.Пользователи, - Администратор, - КомментарийДляЖурнала, - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - КонецЕсли; - РазблокироватьДанныеДляРедактирования(Объект.Ссылка); + ЕстьТекущиеИзменения = Ложь; + СтароеЗначение = Неопределено; + + СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.СвойстваВидовДоступа", + СвойстваВидовДоступа, ЕстьТекущиеИзменения, СтароеЗначение); + + ЕстьИзмененияТиповГруппИЗначенийДоступа = ЕстьТекущиеИзменения + И ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, СтароеЗначение); + + СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.ТипыГруппИЗначенийДоступа", + ?(ЕстьИзмененияТиповГруппИЗначенийДоступа, + Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), + Новый ФиксированнаяСтруктура()) ); ЗафиксироватьТранзакцию(); Исключение @@ -925,461 +486,13 @@ ВызватьИсключение; КонецПопытки; -КонецПроцедуры - -// Обновляет связь для новой группы пользователей (группы внешних пользователей). -// -// Параметры: -// Ссылка - СправочникСсылка.Пользователи, -// СправочникСсылка.ГруппыПользователей, -// СправочникСсылка.ВнешниеПользователи, -// СправочникСсылка.ГруппыВнешнихПользователей - измененный объект. -// -// ЭтоНовый - Булево, если Истина, объект был добавлен, иначе изменен. -// -Процедура ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый) Экспорт - - Если ЭтоНовый Тогда - Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.ГруппыПользователей") - ИЛИ ТипЗнч(Ссылка) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда - - Параметры = Новый Структура; - Параметры.Вставить("ГруппыПользователей", Ссылка); - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); - КонецЕсли; + Если ЕстьТекущиеИзменения Тогда + ЕстьИзменения = Истина; КонецЕсли; КонецПроцедуры -// Обновляет группировки пользователей после обновления составов групп пользователей -// используемых для выполнения проверок разрешенных пользователей. -// -// Параметры: -// УчастникиИзменений - Массив значений типов: -// - СправочникСсылка.Пользователи. -// - СправочникСсылка.ВнешниеПользователи. -// Пользователи которые участвовали в изменении состава групп. -// -// ИзмененныеГруппы - Массив значений типов: -// - СправочникСсылка.ГруппыПользователей. -// - СправочникСсылка.ГруппыВнешнихПользователей. -// Группы, состав которых был изменен. -// -Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт - - Параметры = Новый Структура; - Параметры.Вставить("Пользователи", УчастникиИзменений); - Параметры.Вставить("ГруппыПользователей", ИзмененныеГруппы); - - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); - - УправлениеДоступом.ОбновитьРолиПользователей(УчастникиИзменений); - -КонецПроцедуры - -// Обновляет группировки внешних пользователей по объекту авторизации. -// -// Параметры: -// ВнешнийПользователь - СправочникСсылка.ВнешниеПользователи - внешний пользователь. -// СтарыйОбъектАвторизации - NULL - при добавлении внешнего пользователя. -// - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. -// НовыйОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. -// -Процедура ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя(ВнешнийПользователь, - СтарыйОбъектАвторизации, - НовыйОбъектАвторизации) Экспорт - - ОбъектыАвторизации = Новый Массив; - Если СтарыйОбъектАвторизации <> NULL Тогда - ОбъектыАвторизации.Добавить(СтарыйОбъектАвторизации); - КонецЕсли; - ОбъектыАвторизации.Добавить(НовыйОбъектАвторизации); - - Параметры = Новый Структура; - Параметры.Вставить("ОбъектыАвторизации", ОбъектыАвторизации); - - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); - -КонецПроцедуры - -// Добавляет администраторов системы в группу, связанную с предопределенным профилем ОткрытиеВнешнихОтчетовИОбработок. -Процедура УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено) Экспорт - // В модели сервиса право открытия внешних отчетов и обработок не используется для пользователей областей данных. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - // Поиск предопределенного профиля с ролью "ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок". - СвойстваПрофиля = СвойстваПрофиляОткрытиеВнешнихОтчетовИОбработок(); - - // Удаление роли "ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок" из профиля "Администратор". - ПрофильАдминистратора = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ПрофилиГруппДоступа.Администратор"); - Если ПрофильАдминистратора <> Неопределено Тогда - ПрофильОбъект = ПрофильАдминистратора.ПолучитьОбъект(); - Найденные = ПрофильОбъект.Роли.НайтиСтроки(Новый Структура("Роль", СвойстваПрофиля.Роль)); - Если Найденные.Количество() > 0 Тогда - Для Каждого СтрокаТаблицы Из Найденные Цикл - ПрофильОбъект.Роли.Удалить(СтрокаТаблицы); - КонецЦикла; - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ПрофильОбъект.Записать(); - КонецЕсли; - КонецЕсли; - - // В расширенном интерфейсе группа профиля создается безусловно (вне зависимости от принятого решения). - УпрощенныйИнтерфейс = УпрощенныйИнтерфейсНастройкиПравДоступа(); - ГруппаДоступаМодифицирована = Ложь; - Если Не УпрощенныйИнтерфейс Тогда - ГруппаПрофиля = ГруппаДоступаОткрытиеВнешнихОтчетовИОбработок(СвойстваПрофиля); - КонецЕсли; - - Если ОткрытиеРазрешено Тогда - - // Включение администраторов в группы с этим профилем. - ГруппаДоступаМодифицирована = Ложь; - Если Не УпрощенныйИнтерфейс Тогда - ГруппаДоступаОбъект = ГруппаПрофиля.ПолучитьОбъект() - КонецЕсли; - РольАдминистратора = Метаданные.Роли.АдминистраторСистемы; - АдминистраторыСРолью = Новый Массив; - ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); - Для Каждого ПользовательИБ Из ПользователиИБ Цикл - Если ПользовательИБ.Роли.Содержит(РольАдминистратора) Тогда - Пользователь = Справочники.Пользователи.НайтиПоРеквизиту( - "ИдентификаторПользователяИБ", - ПользовательИБ.УникальныйИдентификатор); - Если Пользователь = Неопределено Тогда - Продолжить; - КонецЕсли; - Если УпрощенныйИнтерфейс Тогда - // В упрощенном интерфейсе каждый администратор включаются в отдельную группу. - ВключитьОтключитьПрофильПользователя(Пользователь, СвойстваПрофиля.Ссылка, Истина); - Иначе - // В расширенном интерфейсе администраторы включаются в одну группу, связанную с предопределенным профилем. - Если ГруппаДоступаОбъект.Пользователи.Найти(Пользователь, "Пользователь") = Неопределено Тогда - ГруппаДоступаМодифицирована = Истина; - ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - Если Не УпрощенныйИнтерфейс И ГруппаДоступаМодифицирована Тогда - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ГруппаДоступаОбъект.Записать(); - КонецЕсли; - - Иначе - - // Удаление роли из всех профилей, за исключением предопределенного. - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПрофилиГруппДоступаРоли.Ссылка - |ИЗ - | Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли - |ГДЕ - | ПрофилиГруппДоступаРоли.Роль = &Роль - | И ПрофилиГруппДоступаРоли.Ссылка <> &ИсключаемыйПрофиль"; - Запрос.УстановитьПараметр("Роль", СвойстваПрофиля.Роль); - Запрос.УстановитьПараметр("ИсключаемыйПрофиль", СвойстваПрофиля.Ссылка); - МассивПрофилей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - Для Каждого Профиль Из МассивПрофилей Цикл - ПрофильОбъект = Профиль.ПолучитьОбъект(); - Найденные = ПрофильОбъект.Роли.НайтиСтроки(Новый Структура("Роль", СвойстваПрофиля.Роль)); - Для Каждого СтрокаТаблицы Из Найденные Цикл - ПрофильОбъект.Роли.Удалить(СтрокаТаблицы); - КонецЦикла; - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ПрофильОбъект.Записать(); - КонецЦикла; - - // Очистка состава групп доступа, связанных с предопределенным профилем. - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыДоступа.Ссылка - |ИЗ - | Справочник.ГруппыДоступа КАК ГруппыДоступа - |ГДЕ - | ГруппыДоступа.Профиль = &Профиль"; - Запрос.УстановитьПараметр("Профиль", СвойстваПрофиля.Ссылка); - МассивГрупп = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - Для Каждого ГруппаДоступа Из МассивГрупп Цикл - ГруппаДоступаОбъект = ГруппаДоступа.ПолучитьОбъект(); - ГруппаДоступаОбъект.Пользователи.Очистить(); - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ГруппаДоступаОбъект.Записать(); - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Обновляет список ролей пользователей информационной базы -// по их текущим принадлежностям к группам доступа. -// Пользователи с ролью "ПолныеПрава" игнорируется. -// -// Параметры: -// Пользователи - СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи. -// Массив значений указанных выше типов. -// - Неопределено - обновить роли всех пользователей. -// - Тип по которому будет найден объект метаданных: -// если будет найден Справочник.ВнешниеПользователи, -// то будут обновлены роли всех внешних пользователей, -// иначе будут обновлены роли всех пользователей. -// -// ПарольПользователяСервиса - Строка - Пароль для авторизации в менеджере -// сервиса. -// ЕстьИзменения - Булево (возвращаемое значение) - в этот параметр возвращается -// значение Истина, если производилась запись, иначе не изменяется. -// -Процедура ОбновитьРолиПользователей(Знач Пользователи1 = Неопределено, - Знач ПарольПользователяСервиса = Неопределено, - ЕстьИзменения = Ложь) Экспорт - - Если НЕ ПользователиСлужебный.ЗапретРедактированияРолей() Тогда - // Роли устанавливаются механизмами подсистем Пользователи и ВнешниеПользователи. - Возврат; - КонецЕсли; - - Если Пользователи1 = Неопределено Тогда - МассивПользователей = Неопределено; - Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); - - ИначеЕсли ТипЗнч(Пользователи1) = Тип("Массив") Тогда - МассивПользователей = Пользователи1; - Если МассивПользователей.Количество() = 0 Тогда - Возврат; - КонецЕсли; - Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); - - ИначеЕсли ТипЗнч(Пользователи1) = Тип("Тип") Тогда - МассивПользователей = Пользователи1; - Иначе - МассивПользователей = Новый Массив; - МассивПользователей.Добавить(Пользователи1); - Пользователи.НайтиНеоднозначныхПользователейИБ(Пользователи1); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - ТекущиеСвойстваПользователей = ТекущиеСвойстваПользователей(МассивПользователей); - - // Параметры проверки в цикле. - ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие; - ИдентификаторыПользователейИБ = ТекущиеСвойстваПользователей.ИдентификаторыПользователейИБ; - НовыеРолиПользователей = ТекущиеСвойстваПользователей.РолиПользователей; - Администраторы = ТекущиеСвойстваПользователей.Администраторы; - - ИмяРолиАдминистратораСистемы = Пользователи.РольАдминистратораСистемы().Имя; - РолиАдминистратора = Новый Соответствие; - РолиАдминистратора.Вставить("ПолныеПрава", Истина); - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Если ИмяРолиАдминистратораСистемы <> "ПолныеПрава" Тогда - РолиАдминистратора.Вставить(ИмяРолиАдминистратораСистемы, Истина); - КонецЕсли; - КонецЕсли; - - // Будущий итог после цикла. - НовыеАдминистраторыИБ = Новый Соответствие; - ОбновляемыеПользователиИБ = Новый Соответствие; - - Для каждого ОписаниеПользователя Из ИдентификаторыПользователейИБ Цикл - - ТекущийПользователь = ОписаниеПользователя.Пользователь; - ИдентификаторПользователяИБ = ОписаниеПользователя.ИдентификаторПользователяИБ; - НовыйАдминистраторИБ = Ложь; - - Отказ = Ложь; - Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.УправлениеДоступом\ПриОбновленииРолейПользователяИБ"); - Для Каждого Обработчик Из Обработчики Цикл - Обработчик.Модуль.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ); - КонецЦикла; - Если Отказ Тогда - Продолжить; - КонецЕсли; - - // Поиск пользователя ИБ. - Если ТипЗнч(ИдентификаторПользователяИБ) = Тип("УникальныйИдентификатор") Тогда - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ИдентификаторПользователяИБ); - Иначе - ПользовательИБ = Неопределено; - КонецЕсли; - - СтарыеРоли = Неопределено; - - Если ПользовательИБ <> Неопределено И ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда - - НовыеРоли = НовыеРолиПользователей.Скопировать(НовыеРолиПользователей.НайтиСтроки( - Новый Структура("Пользователь", ТекущийПользователь)), "Роль"); - - НовыеРоли.Индексы.Добавить("Роль"); - - Если НовыеРоли.Найти("ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок", "Роль") = Неопределено Тогда - РолиТекущегоАдминистратора = РолиАдминистратора; - Иначе - РолиТекущегоАдминистратора = Новый ФиксированноеСоответствие(РолиАдминистратора); - РолиТекущегоАдминистратора = Новый Соответствие(РолиТекущегоАдминистратора); - РолиТекущегоАдминистратора.Вставить("ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок", Истина); - КонецЕсли; - - // Проверка старых ролей. - СтарыеРоли = Новый Соответствие; - РолиДляДобавления = Новый Соответствие; - РолиДляУдаления = Новый Соответствие; - - Если Администраторы[ТекущийПользователь] = Неопределено Тогда - Для каждого Роль Из ПользовательИБ.Роли Цикл - ИмяРоли = Роль.Имя; - СтарыеРоли.Вставить(ИмяРоли, Истина); - Если НовыеРоли.Найти(ИмяРоли, "Роль") = Неопределено Тогда - РолиДляУдаления.Вставить(ИмяРоли, Истина); - КонецЕсли; - КонецЦикла; - Иначе // Администратор. - Для каждого Роль Из ПользовательИБ.Роли Цикл - ИмяРоли = Роль.Имя; - СтарыеРоли.Вставить(ИмяРоли, Истина); - Если РолиТекущегоАдминистратора[ИмяРоли] = Неопределено Тогда - РолиДляУдаления.Вставить(ИмяРоли, Истина); - КонецЕсли; - КонецЦикла; - - Для каждого КлючИЗначение Из РолиТекущегоАдминистратора Цикл - - Если СтарыеРоли[КлючИЗначение.Ключ] = Неопределено Тогда - РолиДляДобавления.Вставить(КлючИЗначение.Ключ, Истина); - - Если КлючИЗначение.Ключ = ИмяРолиАдминистратораСистемы Тогда - НовыйАдминистраторИБ = Истина; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Проверка новых ролей. - Для каждого Строка Из НовыеРоли Цикл - - Если СтарыеРоли = Неопределено - ИЛИ Администраторы[ТекущийПользователь] <> Неопределено Тогда - Продолжить; - КонецЕсли; - - Если СтарыеРоли[Строка.Роль] = Неопределено Тогда - Если ВсеРоли.Получить(Строка.Роль) <> Неопределено Тогда - - РолиДляДобавления.Вставить(Строка.Роль, Истина); - - Если Строка.Роль = ИмяРолиАдминистратораСистемы Тогда - НовыйАдминистраторИБ = Истина; - КонецЕсли; - Иначе - // Новые роли не найденные в метаданных. - Профили = ПрофилиПользователяСРолью(ТекущийПользователь, Строка.Роль); - Для каждого Профиль Из Профили Цикл - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru= 'При обновлении ролей пользователя ""%1"" - |роль ""%2"" - |профиля групп доступа ""%3"" - |не найдена в метаданных.'"), - Строка(ТекущийПользователь), - Строка.Роль, - Строка(Профиль)), - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - КонецЦикла; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - - // Завершение обработки текущего пользователя. - Если СтарыеРоли <> Неопределено - И ( РолиДляДобавления.Количество() <> 0 - ИЛИ РолиДляУдаления.Количество() <> 0) Тогда - - ИзмененияРолей = Новый Структура; - ИзмененияРолей.Вставить("ПользовательСсылка", ТекущийПользователь); - ИзмененияРолей.Вставить("ПользовательИБ", ПользовательИБ); - ИзмененияРолей.Вставить("РолиДляДобавления", РолиДляДобавления); - ИзмененияРолей.Вставить("РолиДляУдаления", РолиДляУдаления); - - Если НовыйАдминистраторИБ Тогда - НовыеАдминистраторыИБ.Вставить(ТекущийПользователь, ИзмененияРолей); - Иначе - ОбновляемыеПользователиИБ.Вставить(ТекущийПользователь, ИзмененияРолей); - КонецЕсли; - - ЕстьИзменения = Истина; - КонецЕсли; - КонецЦикла; - - // Добавление новых администраторов. - ОбновитьРолиПользователейИБ(НовыеАдминистраторыИБ, ПарольПользователяСервиса); - - // Удаление старых администраторов и обновление остальных пользователей. - ОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса); - -КонецПроцедуры - -// Проверка группы доступа Администраторы перед записью. -Процедура ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы(ПользователиГруппы, ОписаниеОшибки) Экспорт - - Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); - - // Проверка пустого списка пользователей ИБ в группе доступа Администраторы. - УстановитьПривилегированныйРежим(Истина); - НайденДействующийАдминистратор = Ложь; - - Для Каждого ОписаниеПользователя Из ПользователиГруппы Цикл - - Если Не ЗначениеЗаполнено(ОписаниеПользователя.Пользователь) - Или ТипЗнч(ОписаниеПользователя.Пользователь) <> Тип("СправочникСсылка.Пользователи") - И ТипЗнч(ОписаниеПользователя.Пользователь) <> Тип("СправочникСсылка.Пользователи") Тогда - Продолжить; - КонецЕсли; - - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ОписаниеПользователя.Пользователь.ИдентификаторПользователяИБ); - - Если ПользовательИБ <> Неопределено - И Пользователи.ВходВПрограммуРазрешен(ПользовательИБ) Тогда - - НайденДействующийАдминистратор = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если НЕ НайденДействующийАдминистратор Тогда - ОписаниеОшибки = - НСтр("ru = 'В группе доступа Администраторы - |должен быть хотя бы один пользователь, - |которому разрешен вход в программу.'"); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт // Обработчики обновления неразделенных данных. @@ -1388,13 +501,13 @@ Обработчик.УправлениеОбработчиками = Истина; Обработчик.Приоритет = 1; Обработчик.Версия = "*"; - Обработчик.МонопольныйРежим = Истина; + Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "УправлениеДоступомСлужебный.ЗаполнитьОбработчикиРазделенныхДанных"; // Обработчики обновления разделенных данных. Обработчик = Обработчики.Добавить(); Обработчик.Версия = "*"; - Обработчик.МонопольныйРежим = Истина; + Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации"; Обработчик = Обработчики.Добавить(); @@ -1510,8 +623,11 @@ Обработчик.РежимВыполнения = "Оперативно"; Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "УправлениеДоступомСлужебный.СоздатьПрофильОткрытияВнешнихОтчетовИОбработок"; + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьДанныеПрофиляОткрытиеВнешнихОтчетовИОбработок"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 1; КонецПроцедуры @@ -1528,12 +644,7 @@ КонецПроцедуры -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты -// метаданных, но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт Массив.Добавить(Метаданные.РегистрыСведений.ГруппыЗначенийДоступа.ПолноеИмя()); @@ -1638,42 +749,63 @@ КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтаксис-помощнике. -// -Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт +// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. +Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт - Если ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда - ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + // Роли расширений назначаются независимо во всех РИБ-узлах. + Справочники.ПрофилиГруппДоступа.УдалитьРолиРасширенийВоВсехПрофиляхГруппДоступа(); + + // Администраторы назначаются независимо во всех РИБ-узлах. + Справочники.ГруппыДоступа.УдалитьУчастниковГруппыДоступаАдминистраторыБезПользователяИБ(); + + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда + Справочники.ПрофилиГруппДоступа.ОбновитьПоставляемыеПрофилиПоИзменениямКонфигурации(); КонецЕсли; КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной информационной базе. -// -// Параметры: -// см. описание обработчика события ПриОтправкеДанныхПодчиненному() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. +Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт + + Если ОбъектПодсистемыУправлениеДоступомТолькоДляСозданияНачальногоОбраза(ЭлементДанных) + Или ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + Возврат; + КонецЕсли; + + // Роли расширений назначаются независимо во всех РИБ-узлах. + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда + Справочники.ПрофилиГруппДоступа.УдалитьРолиРасширений(ЭлементДанных); + КонецЕсли; + +КонецПроцедуры + +// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт + // Роли расширений назначаются независимо во всех РИБ-узлах. + // Частичное изменение объектов при создании начального образа не поддерживается, + // удаление ролей расширений см. в процедуре ПриНастройкеПодчиненногоУзлаРИБ. + + // Администраторы назначаются независимо во всех РИБ-узлах. + // Частичное изменение объектов при создании начального образа не поддерживается, + // очистку состава администраторов см. в процедуре ПриНастройкеПодчиненногоУзлаРИБ. + Если СозданиеНачальногоОбраза Тогда Возврат; КонецЕсли; - Если ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + Если ОбъектПодсистемыУправлениеДоступомТолькоДляСозданияНачальногоОбраза(ЭлементДанных) + Или ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; + Возврат; КонецЕсли; КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт // Стандартная обработка не переопределяется. @@ -1681,24 +813,26 @@ Возврат; КонецЕсли; - Если ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + Если ОбъектПодсистемыУправлениеДоступомТолькоДляСозданияНачальногоОбраза(ЭлементДанных) + Или ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; Возврат; КонецЕсли; - // Администраторы назначаются во всех подчиненных РИБ-узлах независимо. + // Роли расширений назначаются независимо во всех РИБ-узлах. + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда + Справочники.ПрофилиГруппДоступа.ВосстановитьСоставРолейРасширений(ЭлементДанных); + КонецЕсли; + + // Администраторы назначаются независимо во всех РИБ-узлах. Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ГруппыДоступа") Тогда - Справочники.ГруппыДоступа.ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных, ОтправкаНазад); + Справочники.ГруппыДоступа.ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных); КонецЕсли; КонецПроцедуры -// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной -// информационной базе. -// -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт // Стандартная обработка не переопределяется. @@ -1706,35 +840,34 @@ Возврат; КонецЕсли; - Если ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + Если ОбъектПодсистемыУправлениеДоступомТолькоДляСозданияНачальногоОбраза(ЭлементДанных) + Или ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Тогда + ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; Возврат; КонецЕсли; - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда - // Администраторы назначаются во всех подчиненных РИБ-узлах независимо. + // Роли расширений назначаются независимо во всех РИБ-узлах. + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда + Справочники.ПрофилиГруппДоступа.ВосстановитьСоставРолейРасширений(ЭлементДанных); + КонецЕсли; + + // Администраторы назначаются независимо во всех РИБ-узлах. Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ГруппыДоступа") Тогда - Справочники.ГруппыДоступа.ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных, ОтправкаНазад); + Справочники.ГруппыДоступа.ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных); КонецЕсли; ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("КонстантаМенеджерЗначения.ОграничиватьДоступНаУровнеЗаписей") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("КонстантаМенеджерЗначения.ПараметрыОграниченияДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ГруппыДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("ПланВидовХарактеристикОбъект.УдалитьВидыДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ГруппыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗначенияГруппДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗначенияГруппДоступаПоУмолчанию") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаследованиеНастроекПравОбъектов") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НастройкиПравОбъектов") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ПраваРолей") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ТаблицыГруппДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьГруппыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьНаборыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьПраваПоЗначениямДоступа") Тогда + Или ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ГруппыДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ГруппыЗначенийДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗначенияГруппДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗначенияГруппДоступаПоУмолчанию") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаследованиеНастроекПравОбъектов") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НастройкиПравОбъектов") Тогда // Получение данных из автономного рабочего места пропускается, а для соответствия // данных в узлах, текущие данные отправляются обратно в автономное рабочее место. @@ -1744,65 +877,232 @@ КонецПроцедуры -// Процедура-обработчик события после получения данных в главном узле от подчиненного узла распределенной ИБ. -// Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и -// записаны в ИБ. -// -// Параметры: -// Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. -// Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, -// то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, -// если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, -// если данные были загружены порциями. -// -Процедура ПослеПолученияДанныхОтПодчиненного(Отправитель, Отказ) Экспорт +// См. СтандартныеПодсистемыСервер.ПослеПолученияДанных. +Процедура ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла) Экспорт - ПослеПолученияДанных(Отправитель, Отказ, Истина); + Справочники.ПрофилиГруппДоступа.ОбновитьТаблицыГруппДоступаПрофилейСИзмененнымСоставомРолейПриЗагрузке(); + + УправлениеДоступом.ОбновитьРолиПользователей(); КонецПроцедуры -// Процедура-обработчик события после получения данных в подчиненном узле от главного узла распределенной ИБ. -// Вызывается в момент завершения чтения сообщения обмена, когда все данные из сообщения обмена успешно прочитаны и -// записаны в ИБ. -// -// Параметры: -// Отправитель - ПланОбменаОбъект. Объект узла плана обмена, от которого получены данные. -// Отказ - Булево. Флаг отказа. Если установить данному параметру значение Истина, -// то сообщение будет считаться не принятым. Также произойдет отмена транзакции загрузки данных, -// если все данные были загружены в одной транзакции или отмена последней транзакции загрузки данных, -// если данные были загружены порциями. +// См. описание в процедуре ЗаполнитьВсеПараметрыРаботыРасширений +// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. // -Процедура ПослеПолученияДанныхОтГлавного(Отправитель, Отказ) Экспорт +Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт - ПослеПолученияДанных(Отправитель, Отказ, Ложь); + ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(); + +КонецПроцедуры + +// Обработчики событий подсистемы Пользователи. + +// См. ПользователиПереопределяемый.ПриОпределенииНастроек. +Процедура ПриОпределенииНастроек(Настройки) Экспорт + + // Роли устанавливаются автоматически по данным групп доступа + // через связь: ПользователиГруппыДоступа -> Профиль -> РолиПрофиля. + Настройки.РедактированиеРолей = Ложь; + +КонецПроцедуры + +// См. ПользователиПереопределяемый.ПриОпределенииДействийВФорме. +Процедура ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме) Экспорт + + ДействияВФорме.Роли = ""; + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПослеЗаписиАдминистратораПриАвторизации. +Процедура ПослеЗаписиАдминистратораПриАвторизации(Комментарий) Экспорт + + Комментарий = + НСтр("ru = 'Выполнен запуск от имени пользователя с ролью ""Полные права"", + |который не зарегистрирован в списке пользователей. + |Выполнена автоматическая регистрация в списке пользователей. + |Пользователь добавлен в группу доступа Администраторы. + | + |Для ведения списка и настройки прав пользователей предназначен список Пользователи, + |режим конфигурирования 1С:Предприятия для этого использовать не следует.'"); + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПослеУстановкиПользователяИБ. +Процедура ПослеУстановкиПользователяИБ(Ссылка, ПарольПользователяСервиса) Экспорт + + УправлениеДоступом.ОбновитьРолиПользователей(Ссылка, ПарольПользователяСервиса); + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора. +Процедура ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса) Экспорт + + ТекстВопроса = + НСтр("ru = 'В список пользователей программы добавляется первый пользователь, + |поэтому он будет автоматически включен в группу доступа Администраторы. + |Продолжить?'") + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПриСозданииАдминистратора. +Процедура ПриСозданииАдминистратора(Администратор, Уточнение) Экспорт + + Если ТипЗнч(Администратор) <> Тип("СправочникСсылка.Пользователи") Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователь", Администратор); + Запрос.Текст = + "ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + |ГДЕ + | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | И ГруппыДоступаПользователи.Пользователь = &Пользователь"; + + Если Не Запрос.Выполнить().Пустой() Тогда + Возврат; + КонецЕсли; + + КомментарийДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователь ""%1"" добавлен в группу доступа Администраторы по причине: + |%2'"), + Администратор, + Уточнение); + + Объект = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); + + НачатьТранзакцию(); + Попытка + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, Объект.ВерсияДанных); + Если Объект.Пользователи.Найти(Администратор, "Пользователь") = Неопределено Тогда + Объект.Пользователи.Добавить().Пользователь = Администратор; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Управление доступом.Автоматическое изменение группы доступа Администраторы'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.Пользователи, + Администратор, + КомментарийДляЖурнала, + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + КонецЕсли; + РазблокироватьДанныеДляРедактирования(Объект.Ссылка); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПослеДобавленияИзмененияПользователяИлиГруппы. +Процедура ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый) Экспорт + + Если ЭтоНовый Тогда + Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.ГруппыПользователей") + ИЛИ ТипЗнч(Ссылка) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + Параметры = Новый Структура; + Параметры.Вставить("ГруппыПользователей", Ссылка); + РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПослеОбновленияСоставовГруппПользователей. +Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Пользователи", УчастникиИзменений); + Параметры.Вставить("ГруппыПользователей", ИзмененныеГруппы); + + РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); + + УправлениеДоступом.ОбновитьРолиПользователей(УчастникиИзменений); + +КонецПроцедуры + +// См. ИнтеграцияСтандартныхПодсистем.ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя. +Процедура ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя(ВнешнийПользователь, + СтарыйОбъектАвторизации, + НовыйОбъектАвторизации) Экспорт + + ОбъектыАвторизации = Новый Массив; + Если СтарыйОбъектАвторизации <> NULL Тогда + ОбъектыАвторизации.Добавить(СтарыйОбъектАвторизации); + КонецЕсли; + ОбъектыАвторизации.Добавить(НовыйОбъектАвторизации); + + Параметры = Новый Структура; + Параметры.Вставить("ОбъектыАвторизации", ОбъектыАвторизации); + + РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(Параметры); + +КонецПроцедуры + +// Выполняет копировании прав от одного пользователя другому. +Процедура ПриКопированииПравНовомуПользователю(Источник, Приемник) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа, + | ГруппыДоступаПользователи.Ссылка.Профиль КАК Профиль + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + |ГДЕ + | НЕ(ГруппыДоступаПользователи.Пользователь <> &Пользователь + | И НЕ ГруппыДоступаПользователи.Пользователь В + | (ВЫБРАТЬ + | СоставыГруппПользователей.ГруппаПользователей + | ИЗ + | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ГДЕ + | СоставыГруппПользователей.Пользователь = &Пользователь))"; + Запрос.УстановитьПараметр("Пользователь", Источник); + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + УпрощенныйИнтерфейс = УпрощенныйИнтерфейсНастройкиПравДоступа(); + Если Не УпрощенныйИнтерфейс Тогда + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.ИсточникДанных = РезультатЗапроса; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + Если УпрощенныйИнтерфейс Тогда + Пока Выборка.Следующий() Цикл + УправлениеДоступом.ВключитьПрофильПользователю(Приемник, Выборка.Профиль); + КонецЦикла; + Иначе + Блокировка.Заблокировать(); + Пока Выборка.Следующий() Цикл + ГруппаДоступаОбъект = Выборка.ГруппаДоступа.ПолучитьОбъект(); + Если ГруппаДоступаОбъект.Пользователи.Найти(Приемник, "Пользователь") = Неопределено Тогда + Строка = ГруппаДоступаОбъект.Пользователи.Добавить(); + Строка.Пользователь = Приемник; + ГруппаДоступаОбъект.Записать(); + КонецЕсли; + КонецЦикла; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры // Обработчики событий подсистемы ВариантыОтчетов. -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПраваДоступа); @@ -1810,13 +1110,7 @@ // Обработчики событий библиотеки ТехнологияСервиса. -// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок -// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок -// гарантируется с помощью других механизмов. -// -// Параметры: -// Типы - Массив(ОбъектМетаданных). -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке. Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт // В разделенных данных используются ссылки только на предопределенные элементы @@ -1825,17 +1119,571 @@ КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.ПланыВидовХарактеристик.УдалитьВидыДоступа); КонецПроцедуры +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт + МодульВыгрузкаЗагрузкаДанныхСлужебныйСобытия = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаДанныхСлужебныйСобытия"); + + Обработчик = ТаблицаОбработчиков.Добавить(); + Обработчик.ОбъектМетаданных = Метаданные.Справочники.ПрофилиГруппДоступа; + Обработчик.Обработчик = Справочники.ПрофилиГруппДоступа; + Обработчик.ПередВыгрузкойОбъекта = Истина; + Обработчик.Версия = МодульВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1(); + + Обработчик = ТаблицаОбработчиков.Добавить(); + Обработчик.ОбъектМетаданных = Метаданные.Справочники.ГруппыДоступа; + Обработчик.Обработчик = Справочники.ГруппыДоступа; + Обработчик.ПередВыгрузкойОбъекта = Истина; + Обработчик.Версия = МодульВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт + + // В модели сервиса право открытия внешних отчетов и обработок не используется для пользователей областей данных, + // поэтому проверка применяется только при переходе Коробка -> Сервис. + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Объект) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда + Профиль = Объект; + + ИначеЕсли ТипЗнч(Объект) = Тип("СправочникОбъект.ГруппыДоступа") И Не Объект.ЭтоГруппа Тогда + Профиль = Объект.Профиль; + Иначе + Возврат; + КонецЕсли; + + Если ЭтоПрофильОткрытиеВнешнихОтчетовИОбработок(Профиль) Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИнформационнаяБазаЗаблокированаДляОбновления = ЗначениеЗаполнено( + ОбновлениеИнформационнойБазыСлужебный.ИнформационнаяБазаЗаблокированаДляОбновления(Ложь)); + + Если Не Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() + Или ИнформационнаяБазаЗаблокированаДляОбновления Тогда + + // Для корректной работы препроцессора в ограничениях доступа, требуется инициализации всех + // параметров сеанса, которые могут быть востребованы в работе препроцессора. + ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = + ?(ИнформационнаяБазаЗаблокированаДляОбновления, "", Ложь); + + ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ""; + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = ""; + ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = ""; + ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = ""; + + ПараметрыСеанса.ТипыЗначенийДоступаСГруппами + = Новый ФиксированныйМассив(Новый Массив); + + ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ""; + + ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав + = Новый ФиксированныйМассив(Новый Массив); + + ПараметрыСеанса.ТипыВладельцевНастроекПрав + = Новый ФиксированныйМассив(Новый Массив); + + УстановленныеПараметры.Добавить("ОграничениеДоступаНаУровнеЗаписейВключено"); + УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); + УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); + УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); + УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); + Возврат; + КонецЕсли; + + ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Истина; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗначенияПоУмолчанию.ТипЗначенийДоступа КАК ТипЗначений, + | ЗначенияПоУмолчанию.ВсеРазрешеныБезИсключений КАК ВсеРазрешеныБезИсключений + |ПОМЕСТИТЬ ЗначенияПоУмолчаниюДляПользователя + |ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | ГруппыДоступаПользователи.Ссылка = ЗначенияПоУмолчанию.ГруппаДоступа + | И ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей + | И СоставыГруппПользователей.Пользователь = &ТекущийПользователь) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗначенияПоУмолчанию.ТипЗначений + |ИЗ + | ЗначенияПоУмолчаниюДляПользователя КАК ЗначенияПоУмолчанию + | + |СГРУППИРОВАТЬ ПО + | ЗначенияПоУмолчанию.ТипЗначений + | + |ИМЕЮЩИЕ + | МИНИМУМ(ЗначенияПоУмолчанию.ВсеРазрешеныБезИсключений) = ИСТИНА"; + + ТипыЗначенийВсеРазрешеныБезИсключений = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТипЗначений"); + + // Установка параметров ВсеВидыДоступаКромеСпециальных, ВидыДоступаСОтключеннымИспользованием. + ВсеВидыДоступаКромеСпециальных = Новый Массив; + ВидыДоступаСОтключеннымИспользованием = Новый Массив; + + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + + Для каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл + ВсеВидыДоступаКромеСпециальных.Добавить(СвойстваВидаДоступа.Имя); + + Если НЕ ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) + ИЛИ ТипыЗначенийВсеРазрешеныБезИсключений.Найти(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда + + ВидыДоступаСОтключеннымИспользованием.Добавить(СвойстваВидаДоступа.Имя); + КонецЕсли; + КонецЦикла; + + ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ВсеКомбинацииВидовДоступа(ВсеВидыДоступаКромеСпециальных); + + УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); + + ВсеВидыДоступаКромеСпециальныхОтключены = (ВсеВидыДоступаКромеСпециальных.Количество() + = ВидыДоступаСОтключеннымИспользованием.Количество()); + + Если ВсеВидыДоступаКромеСпециальныхОтключены Тогда + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = "Все"; + Иначе + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием + = ВсеКомбинацииВидовДоступа(ВидыДоступаСОтключеннымИспользованием); + КонецЕсли; + + УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); + + // Установка параметров ВидыДоступаБезГруппДляЗначенияДоступа, + // ВидыДоступаСОднойГруппойДляЗначенияДоступа, ТипыЗначенийДоступаСГруппами. + ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = + ВсеКомбинацииВидовДоступа(СвойстваВидовДоступа.БезГруппДляЗначенияДоступа); + ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = + ВсеКомбинацииВидовДоступа(СвойстваВидовДоступа.СОднойГруппойДляЗначенияДоступа); + + ТипыЗначенийДоступаСГруппами = Новый Массив; + Для каждого КлючИЗначение Из СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами Цикл + ТипыЗначенийДоступаСГруппами.Добавить(КлючИЗначение.Значение); + КонецЦикла; + ПараметрыСеанса.ТипыЗначенийДоступаСГруппами = Новый ФиксированныйМассив(ТипыЗначенийДоступаСГруппами); + + УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); + + // Установка параметров ТаблицыСОтдельнымиНастройкамиПрав, + // ИдентификаторыТаблицСОтдельнымиНастройкамиПрав, ТипыВладельцевНастроекПрав. + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); + ОтдельныеТаблицы = ВозможныеПрава.ОтдельныеТаблицы; + ТаблицыСОтдельнымиНастройкамиПрав = ""; + ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = Новый Массив; + Для каждого КлючИЗначение Из ОтдельныеТаблицы Цикл + ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав + + "|" + КлючИЗначение.Значение + ";" + Символы.ПС; + ИдентификаторыТаблицСОтдельнымиНастройкамиПрав.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + + ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав; + + ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = + Новый ФиксированныйМассив(ИдентификаторыТаблицСОтдельнымиНастройкамиПрав); + + ПараметрыСеанса.ТипыВладельцевНастроекПрав = ВозможныеПрава.ТипыВладельцев; + + УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); + +КонецПроцедуры + +// Обновляет список ролей пользователей информационной базы +// по их текущим принадлежностям к группам доступа. +// Пользователи с ролью "ПолныеПрава" игнорируется. +// +// Параметры: +// Пользователи - СправочникСсылка.Пользователи, +// СправочникСсылка.ВнешниеПользователи. +// Массив значений указанных выше типов. +// - Неопределено - обновить роли всех пользователей. +// - Тип по которому будет найден объект метаданных: +// если будет найден Справочник.ВнешниеПользователи, +// то будут обновлены роли всех внешних пользователей, +// иначе будут обновлены роли всех пользователей. +// +// ПарольПользователяСервиса - Строка - Пароль для авторизации в менеджере +// сервиса. +// ЕстьИзменения - Булево (возвращаемое значение) - в этот параметр возвращается +// значение Истина, если производилась запись, иначе не изменяется. +// +Процедура ОбновитьРолиПользователей(Знач Пользователи1 = Неопределено, + Знач ПарольПользователяСервиса = Неопределено, + ЕстьИзменения = Ложь) Экспорт + + Если НЕ ПользователиСлужебный.ЗапретРедактированияРолей() Тогда + // Роли устанавливаются механизмами подсистем Пользователи и ВнешниеПользователи. + Возврат; + КонецЕсли; + + Если Пользователи1 = Неопределено Тогда + МассивПользователей = Неопределено; + Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); + + ИначеЕсли ТипЗнч(Пользователи1) = Тип("Массив") Тогда + МассивПользователей = Пользователи1; + Если МассивПользователей.Количество() = 0 Тогда + Возврат; + КонецЕсли; + Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); + + ИначеЕсли ТипЗнч(Пользователи1) = Тип("Тип") Тогда + МассивПользователей = Пользователи1; + Иначе + МассивПользователей = Новый Массив; + МассивПользователей.Добавить(Пользователи1); + Пользователи.НайтиНеоднозначныхПользователейИБ(Пользователи1); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ТекущиеСвойстваПользователей = ТекущиеСвойстваПользователей(МассивПользователей); + + // Параметры проверки в цикле. + ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие; + ИдентификаторыПользователейИБ = ТекущиеСвойстваПользователей.ИдентификаторыПользователейИБ; + НовыеРолиПользователей = ТекущиеСвойстваПользователей.РолиПользователей; + Администраторы = ТекущиеСвойстваПользователей.Администраторы; + + ОбязательныеРолиАдминистратора = Новый Соответствие; + ОбязательныеРолиАдминистратора.Вставить("ПолныеПрава", Истина); + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + ОбязательныеРолиАдминистратора.Вставить("АдминистраторСистемы", Истина); + КонецЕсли; + ДополнительныеРолиАдминистратора = Новый Соответствие; + ДополнительныеРолиАдминистратора.Вставить("ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок", Истина); + + // Будущий итог после цикла. + НовыеАдминистраторыИБ = Новый Соответствие; + ОбновляемыеПользователиИБ = Новый Соответствие; + + Для Каждого ОписаниеПользователя Из ИдентификаторыПользователейИБ Цикл + + ТекущийПользователь = ОписаниеПользователя.Пользователь; + ИдентификаторПользователяИБ = ОписаниеПользователя.ИдентификаторПользователяИБ; + НовыйАдминистраторИБ = Ложь; + + Отказ = Ложь; + ИнтеграцияСТехнологиейСервиса.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ); + Если Отказ Тогда + Продолжить; + КонецЕсли; + + // Поиск пользователя ИБ. + Если ТипЗнч(ИдентификаторПользователяИБ) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ИдентификаторПользователяИБ); + Иначе + ПользовательИБ = Неопределено; + КонецЕсли; + + Если ПользовательИБ = Неопределено + Или Не ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда + Продолжить; + КонецЕсли; + + Отбор = Новый Структура("Пользователь", ТекущийПользователь); + НовыеРоли = НовыеРолиПользователей.Скопировать( + НовыеРолиПользователей.НайтиСтроки(Отбор), "Роль, РольСсылка"); + + НовыеРоли.Индексы.Добавить("Роль"); + + Если Администраторы[ТекущийПользователь] <> Неопределено Тогда + ТекущиеНовыеРоли = НовыеРоли; + НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); + Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл + НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ; + КонецЦикла; + Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл + Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда + Продолжить; + КонецЕсли; + НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ; + КонецЦикла; + КонецЕсли; + + // Проверка старых ролей. + СтарыеРоли = Новый Соответствие; + РолиДляДобавления = Новый Соответствие; + РолиДляУдаления = Новый Соответствие; + + Для Каждого Роль Из ПользовательИБ.Роли Цикл + ИмяРоли = Роль.Имя; + СтарыеРоли.Вставить(ИмяРоли, Истина); + Если НовыеРоли.Найти(ИмяРоли, "Роль") = Неопределено Тогда + РолиДляУдаления.Вставить(ИмяРоли, Истина); + КонецЕсли; + КонецЦикла; + + НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРолиПоТипуПользователя( + ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); + + // Проверка новых ролей. + Для Каждого Строка Из НовыеРоли Цикл + Если СтарыеРоли[Строка.Роль] <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Если ВсеРоли.Получить(Строка.Роль) = Неопределено Тогда + ЗарегистрироватьНенайденнуюРоль(Строка, ТекущийПользователь); + Продолжить; + КонецЕсли; + + Если НедоступныеРоли.Получить(Строка.Роль) <> Неопределено Тогда + ЗарегистрироватьНедоступнуюРоль(Строка, ТекущийПользователь); + Продолжить; + КонецЕсли; + + РолиДляДобавления.Вставить(Строка.Роль, Истина); + + Если Строка.Роль = "АдминистраторСистемы" Тогда + НовыйАдминистраторИБ = Истина; + КонецЕсли; + КонецЦикла; + + // Завершение обработки текущего пользователя. + Если РолиДляДобавления.Количество() = 0 + И РолиДляУдаления.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ИзмененияРолей = Новый Структура; + ИзмененияРолей.Вставить("ПользовательСсылка", ТекущийПользователь); + ИзмененияРолей.Вставить("ПользовательИБ", ПользовательИБ); + ИзмененияРолей.Вставить("РолиДляДобавления", РолиДляДобавления); + ИзмененияРолей.Вставить("РолиДляУдаления", РолиДляУдаления); + + Если НовыйАдминистраторИБ Тогда + НовыеАдминистраторыИБ.Вставить(ТекущийПользователь, ИзмененияРолей); + Иначе + ОбновляемыеПользователиИБ.Вставить(ТекущийПользователь, ИзмененияРолей); + КонецЕсли; + + ЕстьИзменения = Истина; + КонецЦикла; + + // Добавление новых администраторов. + Если НовыеАдминистраторыИБ.Количество() > 0 Тогда + ОбновитьРолиПользователейИБ(НовыеАдминистраторыИБ, ПарольПользователяСервиса); + КонецЕсли; + + // Удаление старых администраторов и обновление остальных пользователей. + Если ОбновляемыеПользователиИБ.Количество() > 0 Тогда + ОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса); + КонецЕсли; + +КонецПроцедуры + +// Проверка группы доступа Администраторы перед записью. +Процедура ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы(ПользователиГруппы, ОписаниеОшибки) Экспорт + + Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); + + // Проверка пустого списка пользователей ИБ в группе доступа Администраторы. + УстановитьПривилегированныйРежим(Истина); + НайденДействующийАдминистратор = Ложь; + + Для Каждого ОписаниеПользователя Из ПользователиГруппы Цикл + + Если Не ЗначениеЗаполнено(ОписаниеПользователя.Пользователь) + Или ТипЗнч(ОписаниеПользователя.Пользователь) <> Тип("СправочникСсылка.Пользователи") + И ТипЗнч(ОписаниеПользователя.Пользователь) <> Тип("СправочникСсылка.Пользователи") Тогда + Продолжить; + КонецЕсли; + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ОписаниеПользователя.Пользователь.ИдентификаторПользователяИБ); + + Если ПользовательИБ <> Неопределено + И Пользователи.ВходВПрограммуРазрешен(ПользовательИБ) Тогда + + НайденДействующийАдминистратор = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НЕ НайденДействующийАдминистратор Тогда + ОписаниеОшибки = + НСтр("ru = 'В группе доступа Администраторы + |должен быть хотя бы один пользователь, + |которому разрешен вход в программу.'"); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступом.ЕстьОграничениеТаблицыПоВидуДоступа. +Функция ЕстьОграничениеТаблицыПоВидуДоступа(Таблица, ВидДоступа, ВсеВидыДоступа) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ВидыДоступаСОтключеннымИспользованием = ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием; + Если ВидыДоступаСОтключеннымИспользованием = "Все" + Или СтрНайти(ВидыДоступаСОтключеннымИспользованием, "," + ВидДоступа + ",") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + МассивВидовДоступа = СтрРазделить(ВсеВидыДоступа, ",", Ложь); + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в функции ЕстьОграничениеТаблицыПоВидуДоступа общего модуля УправлениеДоступом.'") + + Символы.ПС; + + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден вид доступа ""%1"", указанный в параметре ВидДоступа.'"), ВидДоступа); + КонецЕсли; + ВидДоступаСсылка = СвойстваВидаДоступа.Ссылка; + + ВсеВидыДоступаТаблицыСОтключеннымИспользованием = Истина; + ИспользованиеВидовДоступа = Новый Соответствие; + ВидДоступаУказанВоВсехВидахДоступа = Ложь; + + Для Каждого ТекущийВидДоступа Из МассивВидовДоступа Цикл + ТекущийВидДоступа = СокрЛП(ТекущийВидДоступа); + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ТекущийВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден вид доступа ""%1"", указанный в параметре + |ВсеВидыДоступа: ""%2"".'"), ТекущийВидДоступа, ВсеВидыДоступа); + КонецЕсли; + Если СвойстваВидаДоступа.Имя = ВидДоступа Тогда + ВидДоступаУказанВоВсехВидахДоступа = Истина; + КонецЕсли; + Используется = СтрНайти(ВидыДоступаСОтключеннымИспользованием, "," + СвойстваВидаДоступа.Имя + ",") = 0; + ИспользованиеВидовДоступа.Вставить(СвойстваВидаДоступа.Ссылка, Используется); + Если Используется Тогда + ВсеВидыДоступаТаблицыСОтключеннымИспользованием = Ложь; + КонецЕсли; + КонецЦикла; + + Если Не ВидДоступаУказанВоВсехВидахДоступа Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вид доступа ""%1"", указанный в параметре ВидДоступа не найден в параметре + |ВсеВидыДоступа: ""%2"".'"), ВидДоступа, ВсеВидыДоступа); + КонецЕсли; + + Если ВсеВидыДоступаТаблицыСОтключеннымИспользованием Тогда + Возврат Ложь; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИмяОсновнойТаблицыСписка", Таблица); + Запрос.УстановитьПараметр("АвторизованныйПользователь", Пользователи.АвторизованныйПользователь()); + + Запрос.Текст = ТекстЗапросаГруппДоступа(); + + ТекстЗапроса = + "ВЫБРАТЬ + | ЗначенияПоУмолчанию.ГруппаДоступа КАК ГруппаДоступа, + | ЗначенияПоУмолчанию.ТипЗначенийДоступа КАК ВидДоступа + |ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыДоступаПользователя КАК ГруппыДоступаПользователя + | ПО ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступаПользователя.Ссылка + |ГДЕ + | НЕ ЗначенияПоУмолчанию.ВсеРазрешеныБезИсключений + | И ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | ГруппыДоступаПользователи.Ссылка = ЗначенияПоУмолчанию.ГруппаДоступа + | И ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей + | И СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь)"; + + ДобавитьЗапросВПакет(Запрос.Текст, ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + + НастроенныеВидыДоступаГруппДоступа = Новый Соответствие; + ЕстьГруппаДоступаСОграничениемПоВидуДоступа = Ложь; + + Пока Выборка.Следующий() Цикл + НастроенныеВидыДоступа = НастроенныеВидыДоступаГруппДоступа.Получить(Выборка.ГруппаДоступа); + Если НастроенныеВидыДоступа = Неопределено Тогда + НастроенныеВидыДоступа = Новый Соответствие; + НастроенныеВидыДоступаГруппДоступа.Вставить(Выборка.ГруппаДоступа, НастроенныеВидыДоступа); + КонецЕсли; + Если ИспользованиеВидовДоступа.Получить(Выборка.ВидДоступа) = Неопределено Тогда + Продолжить; + КонецЕсли; + НастроенныеВидыДоступа.Вставить(Выборка.ВидДоступа, Истина); + Если Выборка.ВидДоступа = ВидДоступаСсылка Тогда + ЕстьГруппаДоступаСОграничениемПоВидуДоступа = Истина; + КонецЕсли; + КонецЦикла; + + ЕстьГруппаДоступаБезОграниченийПоВсемВидамДоступа = Ложь; + + Для Каждого ОписаниеГруппыДоступа Из НастроенныеВидыДоступаГруппДоступа Цикл + НастроенныеВидыДоступа = ОписаниеГруппыДоступа.Значение; + ВсеВидыДоступаТаблицыБезОграниченийВГруппеДоступа = Истина; + Для Каждого ОписаниеИспользованияВидаДоступа Из ИспользованиеВидовДоступа Цикл + Если Не ОписаниеИспользованияВидаДоступа.Значение Тогда + Продолжить; // Не используется. + КонецЕсли; + Если НастроенныеВидыДоступа.Получить(ОписаниеИспользованияВидаДоступа.Ключ) = Неопределено Тогда + Продолжить; // ВсеРазрешеныБезИсключений или ограничения по виду доступа нет. + КонецЕсли; + ВсеВидыДоступаТаблицыБезОграниченийВГруппеДоступа = Ложь; + Прервать; + КонецЦикла; + Если ВсеВидыДоступаТаблицыБезОграниченийВГруппеДоступа Тогда + ЕстьГруппаДоступаБезОграниченийПоВсемВидамДоступа = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЕстьГруппаДоступаБезОграниченийПоВсемВидамДоступа Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ЕстьГруппаДоступаСОграничениемПоВидуДоступа; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. @@ -1853,8 +1701,8 @@ Возврат; КонецЕсли; - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + ЗначенияДоступаСГруппами = СвойстваВидовДоступа.ЗначенияДоступаСГруппами; Если ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗнч(Объект)) <> Неопределено Тогда РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(Объект); @@ -1876,8 +1724,8 @@ Возврат; КонецЕсли; - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ВозможныеПраваПоТипам = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипам; + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); + ВозможныеПраваПоТипам = ВозможныеПрава.ПоТипам; Если ВозможныеПраваПоТипам.Получить(ТипЗнч(Объект)) <> Неопределено Тогда РегистрыСведений.НаследованиеНастроекПравОбъектов.ОбновитьДанныеРегистра(Объект); @@ -1965,8 +1813,8 @@ УстановитьПривилегированныйРежим(Истина); - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + ЗначенияДоступаСГруппами = СвойстваВидовДоступа.ЗначенияДоступаСГруппами; Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() И НЕ ТолькоКэшРеквизиты Тогда @@ -2041,8 +1889,8 @@ // Обновление кэш-реквизитов в наборах значений доступа. Если КоличествоДанных < 10000 Тогда - ТипыЗначенийДоступа = Параметры.СвойстваВидовДоступа.ПоТипамЗначений; - ТипыЗначенийДоступаСГруппами = Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; + ТипыЗначенийДоступа = СвойстваВидовДоступа.ПоТипамЗначений; + ТипыЗначенийДоступаСГруппами = СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; ТаблицаТиповЗначений = Новый ТаблицаЗначений; ТаблицаТиповЗначений.Колонки.Добавить("ТипЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); @@ -2163,7 +2011,7 @@ // Процедура УстановитьЗаполнениеДанныхДляОграниченияДоступа(Знач Использование) Экспорт - СтандартныеПодсистемыСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( + РегламентныеЗаданияСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания( Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа, Использование); КонецПроцедуры @@ -2197,13 +2045,7 @@ Используется = Истина; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); Возврат Используется; @@ -2226,7 +2068,7 @@ // Функция СвойстваВидаДоступа(Знач ВидДоступа = Неопределено) Экспорт - Свойства = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + Свойства = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); Если ВидДоступа = Неопределено Тогда Возврат Свойства.Массив; @@ -2356,12 +2198,13 @@ Таблица.Колонки.Добавить("СтандартноеЗначение", Новый ОписаниеТипов("Булево")); Таблица.Колонки.Добавить("ЗначениеБезГрупп", Новый ОписаниеТипов("Булево")); - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); - ТипыЗначенийДоступаСГруппами = Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; - ТипыЗначенийДоступа = Параметры.СвойстваВидовДоступа.ПоТипамЗначений; - ОтдельныеТаблицы = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ОтдельныеТаблицы; - ТипыВладельцевНастроекПрав = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; + ТипыЗначенийДоступаСГруппами = СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; + ТипыЗначенийДоступа = СвойстваВидовДоступа.ПоТипамЗначений; + ОтдельныеТаблицы = ВозможныеПрава.ОтдельныеТаблицы; + ТипыВладельцевНастроекПрав = ВозможныеПрава.ПоТипамСсылок; КонецЕсли; // Нормализация ресурсов Чтение, Изменение. @@ -3409,82 +3252,12 @@ Обработчики = Параметры.РазделенныеОбработчики; Обработчик = Обработчики.Добавить(); Обработчик.Версия = "*"; + Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации"; КонецЕсли; КонецПроцедуры -// Обновляет вспомогательные данные, которые зависят только -// от конфигурации. -// Записывает изменения этих данных по версиям конфигурации -// (если изменения есть), чтобы использовать эти изменения -// при обновлении остальных вспомогательных данных, например, -// в обработчике ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации. -// -Процедура ОбновитьПараметрыОграниченияДоступа(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваРолей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗависимостиПравДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра( - ЕстьИзменения, ТолькоПроверка); - - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - РегистрыСведений.ЗависимостиПравДоступа.ОбновитьДанныеРегистра( - ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - Менеджер = Константы["ПараметрыОграниченияДоступа"].СоздатьМенеджерЗначения(); - Менеджер.ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - Справочники.ПрофилиГруппДоступа.ОбновитьОписаниеПоставляемыхПрофилей( - ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - Справочники.ПрофилиГруппДоступа.ОбновитьСоставПредопределенныхПрофилей( - ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - РегистрыСведений.НастройкиПравОбъектов.ОбновитьВозможныеПраваДляНастройкиПравОбъектов( - ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - // Обновляет вспомогательные данные, которые зависят от конфигурации частично. // // Обновляется при наличии изменений конфигурации, записанных в параметры @@ -3502,13 +3275,9 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиПравОбъектов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка @@ -3577,7 +3346,7 @@ Использование = Константы.ОграничиватьДоступНаУровнеЗаписей.Получить(); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда УстановитьЗаполнениеДанныхДляОграниченияДоступа(Использование); Иначе Расписание = Новый РасписаниеРегламентногоЗадания; @@ -3587,7 +3356,7 @@ Расписание.ПаузаПовтора = 90; ЗаданиеМетаданные = Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа; - Задание = РегламентныеЗадания.НайтиПредопределенное(ЗаданиеМетаданные); + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(ЗаданиеМетаданные); Задание.Использование = Использование; Задание.Расписание = Расписание; @@ -3641,159 +3410,127 @@ Процедура ЗаменитьУдаленныеРолиВПрофиляхГруппДоступа() Экспорт // Заполнение списка удаленных ролей и соответствующих новых ролей. - МассивУдаленныхРолей = Новый Массив; СоответствиеРолей = Новый Соответствие; // ДобавлениеИзменениеБазовойНСИ ИмяРоли = "? ДобавлениеИзменениеБазовойНСИ"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеДополнительныхРеквизитовИСведений")); + МассивРолей.Добавить("ДобавлениеИзменениеДополнительныхРеквизитовИСведений"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеКурсовВалют")); + МассивРолей.Добавить("ДобавлениеИзменениеКурсовВалют"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеГрафиковРаботы")); + МассивРолей.Добавить("ДобавлениеИзменениеГрафиковРаботы"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеВидовКонтактнойИнформации")); + МассивРолей.Добавить("ДобавлениеИзменениеВидовКонтактнойИнформации"); КонецЕсли; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ДобавлениеИзменениеОбщейБазовойНСИ ИмяРоли = "? ДобавлениеИзменениеОбщейБазовойНСИ"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеАдресныхСведений")); + МассивРолей.Добавить("ДобавлениеИзменениеАдресныхСведений"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеБанков")); + МассивРолей.Добавить("ДобавлениеИзменениеБанков"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеКалендарныхГрафиков")); + МассивРолей.Добавить("ДобавлениеИзменениеКалендарныхГрафиков"); КонецЕсли; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ИзменениеТекущегоПользователя ИмяРоли = "? ИзменениеТекущегоПользователя"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ИзменениеТекущегоВнешнегоПользователя ИмяРоли = "? ИзменениеТекущегоВнешнегоПользователя"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ЧтениеБазовойНСИ ИмяРоли = "? ЧтениеБазовойНСИ"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ЧтениеГрафиковРаботы")); + МассивРолей.Добавить("ЧтениеГрафиковРаботы"); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ЧтениеКурсовВалют")); + МассивРолей.Добавить("ЧтениеКурсовВалют"); КонецЕсли; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ЧтениеОбщейБазовойНСИ ИмяРоли = "? ЧтениеОбщейБазовойНСИ"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); // ДобавлениеИзменениеСтранМира ИмяРоли = "? ДобавлениеИзменениеСтранМира"; - МассивУдаленныхРолей.Добавить(ИмяРоли); МассивРолей = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МассивРолей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеВидовКонтактнойИнформации")); + МассивРолей.Добавить("ДобавлениеИзменениеВидовКонтактнойИнформации"); КонецЕсли; СоответствиеРолей.Вставить(ИмяРоли, МассивРолей); - // Найти профили, использующие удаленные роли. - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | РолиПрофилей.Ссылка КАК Профиль, - | ИдентификаторыУдаленныхРолей.Ссылка КАК ИдентификаторРоли, - | ИдентификаторыУдаленныхРолей.Имя - |ИЗ - | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыУдаленныхРолей - | ПО РолиПрофилей.Роль = ИдентификаторыУдаленныхРолей.Ссылка - | И ИдентификаторыУдаленныхРолей.Имя В (&МассивУдаленныхРолей) - |ИТОГИ ПО - | Профиль"; - - Запрос.УстановитьПараметр("МассивУдаленныхРолей", МассивУдаленныхРолей); - ДеревоПрофилей = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - - Для Каждого СтрокаПрофиля Из ДеревоПрофилей.Строки Цикл - - ПрофильОбъект = СтрокаПрофиля.Профиль.ПолучитьОбъект(); - РолиПрофиля = ПрофильОбъект.Роли; - - Для Каждого СтрокаРоли Из СтрокаПрофиля.Строки Цикл - - // Удаляем роль из профиля - Отбор = Новый Структура("Роль", СтрокаРоли.ИдентификаторРоли); - СтрокаТабличнойЧасти = РолиПрофиля.НайтиСтроки(Отбор)[0]; - РолиПрофиля.Удалить(СтрокаТабличнойЧасти); - - // Добавляем новые роли - ДобавляемыеРоли = СоответствиеРолей.Получить(СтрокаРоли.Имя); - Для Каждого ДобавляемаяРоль Из ДобавляемыеРоли Цикл - - Отбор = Новый Структура; - Отбор.Вставить("Роль", ДобавляемаяРоль); - Если РолиПрофиля.НайтиСтроки(Отбор).Количество() = 0 Тогда - НоваяСтрока = РолиПрофиля.Добавить(); - НоваяСтрока.Роль = ДобавляемаяРоль; - КонецЕсли; - - КонецЦикла; - - КонецЦикла; - - Отбор = Новый Структура; - Отбор.Вставить("Роль", ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеВидовКонтактнойИнформации")); - НайденныеРоли = РолиПрофиля.НайтиСтроки(Отбор); - Если НайденныеРоли.Количество() > 1 Тогда - РолиПрофиля.Удалить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Роль.ДобавлениеИзменениеВидовКонтактнойИнформации")); - КонецЕсли; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрофильОбъект,, Истина); - - КонецЦикла; + УправлениеДоступом.ЗаменитьРолиВПрофилях(СоответствиеРолей); КонецПроцедуры -// Создает профиль с ролью "ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок" в случае его отсутствия. -Процедура СоздатьПрофильОткрытияВнешнихОтчетовИОбработок() Экспорт - // В модели сервиса право открытия внешних отчетов и обработок не используется для пользователей областей данных. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда +// Обновляет данные профиля "ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок". +Процедура ОбновитьДанныеПрофиляОткрытиеВнешнихОтчетовИОбработок() Экспорт + + УникальныйИдентификаторПрофиля = Новый УникальныйИдентификатор( + ИдентификаторПрофиляОткрытиеВнешнихОтчетовИОбработок()); + + Ссылка = Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(УникальныйИдентификаторПрофиля); + Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Ссылка") = Неопределено Тогда Возврат; КонецЕсли; + СсылкаПометитьНаУдаление = Ложь; - // Создание профиля. - СвойстваПрофиля = СвойстваПрофиляОткрытиеВнешнихОтчетовИОбработок(); + Если ОбщегоНазначения.РазделениеВключено() Тогда + СсылкаПометитьНаУдаление = Истина; + Иначе + ОписаниеПрофиля = ОписаниеПрофиляОткрытиеВнешнихОтчетовИОбработок(); + ПоставляемыйПрофильСсылка = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору( + ОписаниеПрофиля.Имя); + + Если Ссылка <> ПоставляемыйПрофильСсылка Тогда + Если ПоставляемыйПрофильСсылка <> Неопределено Тогда + СсылкаПометитьНаУдаление = Истина; + Иначе + // Установка идентификатора поставляемых данных. + ПрофильОбъект = Ссылка.ПолучитьОбъект(); + ПрофильОбъект.ИдентификаторПоставляемыхДанных = УникальныйИдентификаторПрофиля; + ПрофильОбъект.Комментарий = ""; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + КонецЕсли; + КонецЕсли; + КонецЕсли; - // Создание группы доступа. - УпрощенныйИнтерфейс = УпрощенныйИнтерфейсНастройкиПравДоступа(); - Если Не УпрощенныйИнтерфейс Тогда - ГруппаДоступаОткрытиеВнешнихОтчетовИОбработок(СвойстваПрофиля); + Если СсылкаПометитьНаУдаление Тогда + ПрофильОбъект = Ссылка.ПолучитьОбъект(); + ПрофильОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + + ГруппыПрофиля = ГруппыПрофиля(Ссылка, Ложь); + Для Каждого СсылкаГруппы Из ГруппыПрофиля Цикл + ГруппаОбъект = СсылкаГруппы.ПолучитьОбъект(); + ГруппаОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаОбъект, Ложь); + КонецЦикла; КонецЕсли; КонецПроцедуры @@ -3801,16 +3538,114 @@ //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. +Функция ПраваРолейРасширений() Экспорт + + ПраваРолейРасширений = Неопределено; + + ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений); + + Возврат ПраваРолейРасширений; + +КонецФункции + +Процедура ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений = Неопределено) + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + Если МодульОбменДаннымиСервер.НастройкаПодчиненногоУзлаРИБ() Тогда + ПраваРолейРасширений = РегистрыСведений.ПраваРолей.ТаблицаПравРолей(Истина, Истина); + Возврат; + КонецЕсли; + КонецЕсли; + + ТекущаяВерсияРасширений = ПараметрыСеанса.ПодключенныеРасширения; + + // Заполнение прав ролей расширений, которые состоят + // из изменений прав на объекты конфигурации и прав на объекты расширений. + УстановитьНовыеПраваРолейРасширений = Ложь; + Если ЗначениеЗаполнено(ТекущаяВерсияРасширений) Тогда + ПраваРолейРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения( + "УправлениеДоступом.ПраваРолей"); + + Если ПраваРолейРасширений = Неопределено Тогда + Запрос = РегистрыСведений.ПраваРолей.ЗапросИзменений(Истина); + ПраваРолейРасширений = Запрос.Выполнить().Выгрузить(); + УстановитьНовыеПраваРолейРасширений = Истина; + Иначе + ПраваРолейРасширений = ПраваРолейРасширений.Получить(); + КонецЕсли; + Иначе + ПраваРолейРасширений = РегистрыСведений.ПраваРолей.ТаблицаПравРолей(Истина, Истина); + КонецЕсли; + + // Проверка необходимости обновления регистра ТаблицыГруппДоступа. + ПараметрыОбновления = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения( + "УправлениеДоступом.ПараметрыОбновленияТаблицГруппДоступа", Истина); + + Если ТипЗнч(ПараметрыОбновления) <> Тип("Структура") + Или Не ПараметрыОбновления.Свойство("ПоследняяВерсияРасширений") + Или Не ПараметрыОбновления.Свойство("ПоследниеОбъектыСИзменениемПрав") + Или ТипЗнч(ПараметрыОбновления.ПоследниеОбъектыСИзменениемПрав) <> Тип("ФиксированныйМассив") Тогда + + ТребуетсяОбновление = Истина; + ПоследниеОбъектыСИзменениемПрав = Неопределено; + Иначе + ПоследниеОбъектыСИзменениемПрав = ПараметрыОбновления.ПоследниеОбъектыСИзменениемПрав; + ТребуетсяОбновление = ПараметрыОбновления.ПоследняяВерсияРасширений <> ТекущаяВерсияРасширений; + КонецЕсли; + + Если Не ТребуетсяОбновление Тогда + Если УстановитьНовыеПраваРолейРасширений Тогда; + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( + "УправлениеДоступом.ПраваРолей", Новый ХранилищеЗначения(ПраваРолейРасширений)); + КонецЕсли; + Возврат; + КонецЕсли; + + ТекущиеОбъектыСИзменениемПрав = РегистрыСведений.ПраваРолей.ИзмененныеОбъектыМетаданных( + ПраваРолейРасширений.Скопировать()); + + Если ПоследниеОбъектыСИзменениемПрав = Неопределено Тогда + // Так как последние изменения недоступны, требуется обновить весь регистр. + ОбъектыСИзменениемПравДляОбновления = Неопределено; + Иначе + ОбъектыСИзменениемПравДляОбновления = Новый Массив(ТекущиеОбъектыСИзменениемПрав); + Для Каждого Идентификатор Из ПоследниеОбъектыСИзменениемПрав Цикл + ОбъектыСИзменениемПравДляОбновления.Добавить(Идентификатор); + КонецЦикла; + КонецЕсли; + + ПараметрыОбновления = Новый Структура; + ПараметрыОбновления.Вставить("ПоследняяВерсияРасширений", ТекущаяВерсияРасширений); + ПараметрыОбновления.Вставить("ПоследниеОбъектыСИзменениемПрав", ТекущиеОбъектыСИзменениемПрав); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Если УстановитьНовыеПраваРолейРасширений Тогда; + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( + "УправлениеДоступом.ПраваРолей", Новый ХранилищеЗначения(ПраваРолейРасширений)); + КонецЕсли; + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( + "УправлениеДоступом.ПараметрыОбновленияТаблицГруппДоступа", ПараметрыОбновления, Истина); + РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(, ОбъектыСИзменениемПравДляОбновления); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + Процедура ПриИзмененииНаборовЗначенийДоступа(Знач СсылкаНаОбъект, ОбновлениеИБ = Ложь) СсылкиНаЗависимыеОбъекты = Новый Массив; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриИзмененииНаборовЗначенийДоступа"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриИзмененииНаборовЗначенийДоступа(СсылкаНаОбъект, СсылкиНаЗависимыеОбъекты); - КонецЦикла; - УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа( СсылкаНаОбъект, СсылкиНаЗависимыеОбъекты); @@ -3856,32 +3691,45 @@ КонецПроцедуры -Функция СвойстваПрофиляОткрытиеВнешнихОтчетовИОбработок() - Результат = Новый Структура("Ссылка, УникальныйИдентификатор, Наименование, Комментарий, Роль"); - Результат.Наименование = НСтр("ru = 'Открытие внешних отчетов и обработок'", Метаданные.ОсновнойЯзык.КодЯзыка); - Результат.Комментарий = НСтр( - "ru = 'Предоставляет право открытия внешних отчетов и обработок из меню ""Файл - Открыть"". - |Состав ролей профиля не рекомендуется изменять.'", - Метаданные.ОсновнойЯзык.КодЯзыка); - Результат.УникальныйИдентификатор = Новый УникальныйИдентификатор("1b3472f6-4d87-11e6-8264-5404a6a6895d"); - Результат.Ссылка = Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(Результат.УникальныйИдентификатор); - Результат.Роль = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок); - ПрофильСуществует = (ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Результат.Ссылка, "Ссылка") <> Неопределено); - Если Не ПрофильСуществует Тогда - // Профиль создается в случае отсутствия. - ПрофильОбъект = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент(); - ПрофильОбъект.УстановитьСсылкуНового(Результат.Ссылка); - ПрофильОбъект.Наименование = Результат.Наименование; - ПрофильОбъект.Комментарий = Результат.Комментарий; - ПрофильОбъект.Назначение.Добавить().ТипПользователей = Справочники.Пользователи.ПустаяСсылка(); - ПрофильОбъект.Роли.Добавить().Роль = Результат.Роль; - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ПрофильОбъект.Записать(); +Функция ИдентификаторПрофиляОткрытиеВнешнихОтчетовИОбработок() + + Возврат "1b3472f6-4d87-11e6-8264-5404a6a6895d"; + +КонецФункции + +Функция ЭтоПрофильОткрытиеВнешнихОтчетовИОбработок(Профиль) Экспорт + + Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") Тогда + ИдентификаторПрофиля = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Профиль, "ИдентификаторПоставляемыхДанных"); + Иначе + ИдентификаторПрофиля = Профиль.ИдентификаторПоставляемыхДанных; КонецЕсли; - Возврат Результат; + + Возврат ВРег(Строка(ИдентификаторПрофиля)) = ВРег(ИдентификаторПрофиляОткрытиеВнешнихОтчетовИОбработок()); + +КонецФункции + +Функция ОписаниеПрофиляОткрытиеВнешнихОтчетовИОбработок() Экспорт + + ОписаниеПрофиля = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); + ОписаниеПрофиля.Имя = "ОткрытиеВнешнихОтчетовИОбработок"; + ОписаниеПрофиля.Идентификатор = ИдентификаторПрофиляОткрытиеВнешнихОтчетовИОбработок(); + + ОписаниеПрофиля.Наименование = + НСтр("ru = 'Открытие внешних отчетов и обработок'", Метаданные.ОсновнойЯзык.КодЯзыка); + + ОписаниеПрофиля.Описание = + НСтр("ru = 'Предоставляет право открытия внешних отчетов и обработок из меню ""Файл - Открыть"". + |Состав ролей профиля не рекомендуется изменять.'", Метаданные.ОсновнойЯзык.КодЯзыка); + + ОписаниеПрофиля.Роли.Добавить("ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок"); + + Возврат ОписаниеПрофиля; + КонецФункции Функция ГруппаДоступаОткрытиеВнешнихОтчетовИОбработок(СвойстваПрофиля) + // Поиск по идентификатору. УникальныйИдентификатор = Новый УникальныйИдентификатор("f6929bcb-532f-11e6-a20f-5404a6a6895d"); Ссылка = Справочники.ГруппыДоступа.ПолучитьСсылку(УникальныйИдентификатор); @@ -3891,215 +3739,81 @@ КонецЕсли; // Поиск по профилю. + ГруппыПрофиля = ГруппыПрофиля(СвойстваПрофиля.Ссылка, Неопределено); + Если ГруппыПрофиля.Количество() > 0 Тогда + Возврат ГруппыПрофиля[0]; + КонецЕсли; + + // Создание группы. + ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент(); + ГруппаДоступаОбъект.УстановитьСсылкуНового(Ссылка); + ГруппаДоступаОбъект.Наименование = СвойстваПрофиля.Наименование; + ГруппаДоступаОбъект.Профиль = СвойстваПрофиля.Ссылка; + ГруппаДоступаОбъект.Комментарий = + НСтр("ru = 'Предоставляет право открытия внешних отчетов и обработок из меню ""Файл - Открыть"".'", + Метаданные.ОсновнойЯзык.КодЯзыка); + + ГруппаДоступаОбъект.Записать(); // Важно, чтобы созданная группа "уехала" в подчиненный узел. + + Возврат ГруппаДоступаОбъект.Ссылка; + +КонецФункции + +Функция ГруппыПрофиля(СсылкаПрофиля, ПометкаУдаления) + Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 + "ВЫБРАТЬ | ГруппыДоступа.Ссылка |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ | ГруппыДоступа.Профиль = &Профиль + | И ГруппыДоступа.ПометкаУдаления = &ПометкаУдаления | |УПОРЯДОЧИТЬ ПО | ГруппыДоступа.ПометкаУдаления"; - Запрос.УстановитьПараметр("Профиль", СвойстваПрофиля.Ссылка); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Возврат Выборка.Ссылка; + + Запрос.УстановитьПараметр("Профиль", СсылкаПрофиля); + + Если ПометкаУдаления = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ГруппыДоступа.ПометкаУдаления = &ПометкаУдаления", ""); + Иначе + Запрос.УстановитьПараметр("ПометкаУдаления", ПометкаУдаления); КонецЕсли; - // Создание новой группы. - ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент(); - ГруппаДоступаОбъект.УстановитьСсылкуНового(Ссылка); - ГруппаДоступаОбъект.Наименование = СвойстваПрофиля.Наименование; - ГруппаДоступаОбъект.Описание = СвойстваПрофиля.Комментарий; - ГруппаДоступаОбъект.Профиль = СвойстваПрофиля.Ссылка; - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ГруппаДоступаОбъект.Записать(); - Возврат ГруппаДоступаОбъект.Ссылка; + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + КонецФункции -// Для процедур ВключитьПрофильПользователю и ВыключитьПрофильПользователю. -Процедура ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Включить) +// Для функция РазрешенныеЗначенияДляДинамическогоСписка, ЕстьОграничениеПоВидуДоступа. +Функция ТекстЗапросаГруппДоступа() - Если Не УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда - ВызватьИсключение - НСтр("ru = 'Данная операция возможна только для упрощенного - |интерфейса настройки прав доступа.'"); - КонецЕсли; - - Если Включить Тогда - ИмяПроцедурыИлиФункции = "ВключитьПрофильПользователю"; - Иначе - ИмяПроцедурыИлиФункции = "ВыключитьПрофильПользователю"; - КонецЕсли; - - // Проверка типов значения параметра Пользователь. - Если ТипЗнч(Пользователь) <> Тип("СправочникСсылка.Пользователи") - И ТипЗнч(Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда - - ИмяПараметра = "Пользователь"; - ЗначениеПараметра = Пользователь; - Типы = Новый Массив; - Типы.Добавить(Тип("СправочникСсылка.Пользователи")); - Типы.Добавить(Тип("СправочникСсылка.ВнешниеПользователи")); - ОжидаемыеТипы = Новый ОписаниеТипов(Типы); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |Ожидалось: %3; передано значение: %4 (тип %5).'"), - ИмяПараметра, - ИмяПроцедурыИлиФункции, - ОжидаемыеТипы, - ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), - ТипЗнч(ЗначениеПараметра)); - КонецЕсли; - - // Проверка типов значения параметра Профиль. - Если ТипЗнч(Профиль) <> Тип("СправочникСсылка.ПрофилиГруппДоступа") - И ТипЗнч(Профиль) <> Тип("Строка") - И ТипЗнч(Профиль) <> Тип("УникальныйИдентификатор") - И Не (Не Включить И ТипЗнч(Профиль) = Тип("Неопределено")) Тогда - - ИмяПараметра = "Профиль"; - ЗначениеПараметра = Профиль; - Типы = Новый Массив; - Типы.Добавить(Тип("СправочникСсылка.ПрофилиГруппДоступа")); - Типы.Добавить(Тип("Строка")); - Типы.Добавить(Тип("УникальныйИдентификатор")); - Если Не Включить Тогда - Типы.Добавить(Тип("Неопределено")); - КонецЕсли; - ОжидаемыеТипы = Новый ОписаниеТипов(Типы); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |Ожидалось: %3; передано значение: %4 (тип %5).'"), - ИмяПараметра, - ИмяПроцедурыИлиФункции, - ОжидаемыеТипы, - ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), - ТипЗнч(ЗначениеПараметра)); - КонецЕсли; - - Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") - Или ТипЗнч(Профиль) = Тип("Неопределено") Тогда - ТекущийПрофиль = Профиль; - Иначе - ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору(Профиль); - КонецЕсли; - - Если ТекущийПрофиль <> Неопределено Тогда - СвойстваПрофиля = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущийПрофиль, - "Наименование, ВидыДоступа"); - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = + Возврат "ВЫБРАТЬ | ГруппыДоступа.Ссылка КАК Ссылка + |ПОМЕСТИТЬ ГруппыДоступаПользователя |ИЗ - | Справочник.ГруппыДоступа КАК ГруппыДоступа - |ГДЕ - | &УсловиеОтбора"; - Запрос.УстановитьПараметр("Пользователь", Пользователь); - Если ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда - УсловиеОтбора = "ГруппыДоступа.Ссылка = Значение(Справочник.ГруппыДоступа.Администраторы)"; - Иначе - УсловиеОтбора = "ГруппыДоступа.Пользователь = &Пользователь"; - Если Включить Или ТекущийПрофиль <> Неопределено Тогда - УсловиеОтбора = УсловиеОтбора + Символы.ПС + " И ГруппыДоступа.Профиль = &Профиль"; - Запрос.УстановитьПараметр("Профиль", ТекущийПрофиль); - КонецЕсли; - КонецЕсли; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбора", УсловиеОтбора); - - РезультатЗапроса = Запрос.Выполнить(); - Выборка = РезультатЗапроса.Выбрать(); - - Блокировка = Новый БлокировкаДанных(); - ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); - ЭлементБлокировки.ИсточникДанных = РезультатЗапроса; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - Выборка.Следующий(); - Пока Истина Цикл - ПерсональнаяГруппаДоступа = Выборка.Ссылка; - Если ЗначениеЗаполнено(ПерсональнаяГруппаДоступа) Тогда - ГруппаДоступаОбъект = ПерсональнаяГруппаДоступа.ПолучитьОбъект(); - ГруппаДоступаОбъект.ПометкаУдаления = Ложь; - - ИначеЕсли ТекущийПрофиль <> Неопределено Тогда - // Создание персональной группы доступа. - ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент(); - ГруппаДоступаОбъект.Родитель = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа(); - ГруппаДоступаОбъект.Наименование = СвойстваПрофиля.Наименование; - ГруппаДоступаОбъект.Пользователь = Пользователь; - ГруппаДоступаОбъект.Профиль = ТекущийПрофиль; - ГруппаДоступаОбъект.ВидыДоступа.Загрузить(ВидыДоступаДляНовойГруппыДоступа(СвойстваПрофиля)); - Иначе - ГруппаДоступаОбъект = Неопределено; - КонецЕсли; - - Если ПерсональнаяГруппаДоступа = Справочники.ГруппыДоступа.Администраторы Тогда - ОписаниеПользователя = ГруппаДоступаОбъект.Пользователи.Найти( - Пользователь, "Пользователь"); - - Если Включить И ОписаниеПользователя = Неопределено Тогда - ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; - ИначеЕсли Не Включить И ОписаниеПользователя <> Неопределено Тогда - ГруппаДоступаОбъект.Пользователи.Удалить(ОписаниеПользователя); - КонецЕсли; - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - // Проверка пустого списка пользователей ИБ в группе доступа Администраторы. - ОписаниеОшибки = ""; - ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы( - ГруппаДоступаОбъект.Пользователи, ОписаниеОшибки); - - Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда - ВызватьИсключение - НСтр("ru = 'Профиль Администратор должен быть хотя бы у одного пользователя, - |которому разрешен вход в программу.'"); - КонецЕсли; - КонецЕсли; - ИначеЕсли ГруппаДоступаОбъект <> Неопределено Тогда - ГруппаДоступаОбъект.Пользователи.Очистить(); - Если Включить Тогда - ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Пользователь; - КонецЕсли; - КонецЕсли; - - Если ГруппаДоступаОбъект <> Неопределено Тогда - // При обновлении ИБ важно, чтобы изменения уехали в подчиненный узел. - ГруппаДоступаОбъект.Записать(); - КонецЕсли; - - Если Не Выборка.Следующий() Тогда - Прервать; - КонецЕсли; - КонецЦикла; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -Функция ВидыДоступаДляНовойГруппыДоступа(СвойстваПрофиля) - - ВидыДоступа = СвойстваПрофиля.ВидыДоступа.Выгрузить(); - - Отбор = Новый Структура; - Отбор.Вставить("Предустановленный", Истина); - Предустановленные = ВидыДоступа.НайтиСтроки(Отбор); - - Для Каждого Предустановленный Из Предустановленные Цикл - ВидыДоступа.Удалить(Предустановленный); - КонецЦикла; - - Возврат ВидыДоступа; + | Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа + | ПО (СвойстваТекущейТаблицы.ПолноеИмя = &ИмяОсновнойТаблицыСписка) + | И (ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + | ГДЕ + | ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка + | И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка)) + | И (ГруппыДоступа.Ссылка В + | (ВЫБРАТЬ + | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа + | ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь + | И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь))"; КонецФункции @@ -4142,18 +3856,20 @@ КонецПроцедуры -Процедура ПослеПолученияДанных(Отправитель, Отказ, ОтПодчиненного) - - УправлениеДоступом.ОбновитьРолиПользователей(); - -КонецПроцедуры - Функция ИмяОбъектаПодсистемыУправлениеДоступомНачинаетсяСУдалить(ЭлементДанных) Возврат ТипЗнч(ЭлементДанных) = Тип("ПланВидовХарактеристикОбъект.УдалитьВидыДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьГруппыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьНаборыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьПраваПоЗначениямДоступа"); + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьГруппыЗначенийДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьНаборыЗначенийДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьПраваПоЗначениямДоступа"); + +КонецФункции + +Функция ОбъектПодсистемыУправлениеДоступомТолькоДляСозданияНачальногоОбраза(ЭлементДанных) + + Возврат ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ПраваРолей") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ТаблицыГруппДоступа"); КонецФункции @@ -4197,7 +3913,7 @@ Возврат Ложь; КонецЕсли; - ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры().ПоставляемыеПрофилиГруппДоступа; + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(ИдентификаторПоставляемогоПрофиля); Если СвойстваПрофиля = Неопределено @@ -4514,19 +4230,16 @@ УстановитьПривилегированныйРежим(Истина); - ПроверяемыеПараметры = Новый Массив; - ПроверяемыеПараметры.Добавить("ОбъектыМетаданныхПравРолей"); - ПроверяемыеПараметры.Добавить("ВозможныеПраваДляНастройкиПравОбъектов"); - ПроверяемыеПараметры.Добавить("ПоставляемыеПрофилиГруппДоступа"); - ПроверяемыеПараметры.Добавить("ПредопределенныеПрофилиГруппДоступа"); - ПроверяемыеПараметры.Добавить("ТипыГруппИЗначенийДоступа"); + Параметры = Новый Массив; + Параметры.Добавить("СтандартныеПодсистемы.УправлениеДоступом.ОбъектыМетаданныхПравРолей"); + Параметры.Добавить("СтандартныеПодсистемы.УправлениеДоступом.ВозможныеПраваДляНастройкиПравОбъектов"); + Параметры.Добавить("СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей"); + Параметры.Добавить("СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа"); + Параметры.Добавить("СтандартныеПодсистемы.УправлениеДоступом.ТипыГруппИЗначенийДоступа"); - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - - Для каждого ПроверяемыйПараметр Из ПроверяемыеПараметры Цикл + Для Каждого Параметр Из Параметры Цикл - ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы( - Параметры, ПроверяемыйПараметр); + ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы(Параметр); Если ПоследниеИзменения = Неопределено ИЛИ ПоследниеИзменения.Количество() > 0 Тогда @@ -4675,11 +4388,14 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПрофилиПользователей.Пользователь, + | Роли.Роль КАК РольСсылка, | Роли.Роль.Имя КАК Роль |ИЗ | ПрофилиПользователей КАК ПрофилиПользователей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК Роли - | ПО (Роли.Ссылка = ПрофилиПользователей.Профиль)"; + | ПО (Роли.Ссылка = ПрофилиПользователей.Профиль) + |ГДЕ + | Роли.Роль <> НЕОПРЕДЕЛЕНО"; Запрос.Текст = Запрос.Текст + " |; @@ -4710,40 +4426,75 @@ Итог.Вставить("РолиПользователей", РезультатыЗапросов[ПоследнийРезультат].Выгрузить()); Итог.РолиПользователей.Индексы.Добавить("Пользователь"); + ИдентификаторыРолей = Итог.РолиПользователей.ВыгрузитьКолонку("РольСсылка"); + МетаданныеРолей = Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам( + ИдентификаторыРолей, Истина); + + Для Каждого Строка Из Итог.РолиПользователей Цикл + МетаданныеРоли = МетаданныеРолей.Получить(Строка.РольСсылка); + Если ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных") Тогда + Строка.Роль = МетаданныеРоли.Имя; + КонецЕсли; + КонецЦикла; + Возврат Итог; КонецФункции -Функция ПрофилиПользователяСРолью(ТекущийПользователь, Роль) +Процедура ЗарегистрироватьНедоступнуюРоль(ОписаниеРоли, Пользователь) - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь); - Запрос.УстановитьПараметр("Роль", Роль); + // Недоступные роли в профилях. + Профили = ПрофилиПользователяСРолью(Пользователь, ОписаниеРоли.РольСсылка); - Запрос.УстановитьПараметр("ПустойИдентификатор", - Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + Для Каждого Профиль Из Профили Цикл + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Управление доступом.Роль не доступна пользователю'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ПрофилиГруппДоступа, + Профиль, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При обновлении ролей пользователя ""%1"" + |роль ""%2"" + |профиля групп доступа ""%3"" + |недоступна пользователю.'"), + Строка(Пользователь), + ОписаниеРоли.Роль, + Строка(Профиль)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + КонецЦикла; - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Роли.Ссылка КАК Профиль - |ИЗ - | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ПО (СоставыГруппПользователей.Пользователь = &ТекущийПользователь) - | И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь - | И (СоставыГруппПользователей.Используется) - | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК Роли - | ПО (Роли.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль) - | И (НЕ Роли.Ссылка.ПометкаУдаления) - | И (Роли.Роль.Имя = &Роль)"; +КонецПроцедуры + +Процедура ЗарегистрироватьНенайденнуюРоль(ОписаниеРоли, Пользователь) - Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Профиль"); + // Новые роли не найденные в метаданных. + Профили = ПрофилиПользователяСРолью(Пользователь, ОписаниеРоли.РольСсылка); -КонецФункции + Для Каждого Профиль Из Профили Цикл + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ПрофилиГруппДоступа, + Профиль, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При обновлении ролей пользователя ""%1"" + |роль ""%2"" + |профиля групп доступа ""%3"" + |не найдена в метаданных.'"), + Строка(Пользователь), + ОписаниеРоли.Роль, + Строка(Профиль)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + КонецЦикла; + +КонецПроцедуры Процедура ОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса) + СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + Для Каждого КлючИЗначение Из ОбновляемыеПользователиИБ Цикл РолиДляДобавления = КлючИЗначение.Значение.РолиДляДобавления; РолиДляУдаления = КлючИЗначение.Значение.РолиДляУдаления; @@ -4774,11 +4525,42 @@ КонецПроцедуры +// Для процедур ЗарегистрироватьНедоступнуюРоль, ЗарегистрироватьНенайденнуюРоль. +Функция ПрофилиПользователяСРолью(Пользователь, Роль) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТекущийПользователь", Пользователь); + Запрос.УстановитьПараметр("Роль", Роль); + + Запрос.УстановитьПараметр("ПустойИдентификатор", + Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Роли.Ссылка КАК Профиль + |ИЗ + | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ПО (СоставыГруппПользователей.Пользователь = &ТекущийПользователь) + | И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь + | И (СоставыГруппПользователей.Используется) + | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК Роли + | ПО (Роли.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль) + | И (НЕ Роли.Ссылка.ПометкаУдаления) + | И (Роли.Роль = &Роль)"; + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Профиль"); + +КонецФункции + +// Для процедуры ОбновитьРолиПользователейИБ. Процедура ЗаписатьПользователяПриОбновленииРолей(ПользовательСсылка, ПользовательИБ, БылиПолныеПрава, ПарольПользователяСервиса) - ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ПользовательСсылка); + ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, + ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи")); - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -4788,7 +4570,13 @@ КонецЕсли; Если ПарольПользователяСервиса = Неопределено Тогда - Если ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + Если СеансЗапущенБезРазделителей Тогда Возврат; КонецЕсли; @@ -5087,7 +4875,6 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяРегистра); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; Для каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл Если ЭлементОтбора.Использование Тогда ЭлементБлокировки.УстановитьЗначение(ЭлементОтбора.ПутьКДанным, ЭлементОтбора.Значение); @@ -5418,7 +5205,7 @@ Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект); - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); ПоТипамГруппИЗначений = СвойстваВидовДоступа.ПоТипамГруппИЗначений; Отбор = УправлениеДоступомСлужебныйКлиентСервер.ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( @@ -5657,4 +5444,403 @@ КонецПроцедуры +// Обновление свойств видов доступа. + +// Для процедуры ОбновитьОписаниеСвойствВидовДоступа. +// Возвращает свойства видов доступа, заполняемых при внедрении +// в процедуре ПриЗаполненииВидовДоступа +// общего модуля УправлениеДоступомПереопределяемый +// и одноименных обработчиках этого события. +// +Функция СвойстваВидовДоступа() + + // 1. Заполнение данных, указанных при внедрении. + + ВидыДоступа = Новый ТаблицаЗначений; + ВидыДоступа.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); + ВидыДоступа.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + ВидыДоступа.Колонки.Добавить("ТипЗначений", Новый ОписаниеТипов("Тип")); + ВидыДоступа.Колонки.Добавить("ТипГруппЗначений", Новый ОписаниеТипов("Тип")); + ВидыДоступа.Колонки.Добавить("НесколькоГруппЗначений", Новый ОписаниеТипов("Булево")); + ВидыДоступа.Колонки.Добавить("ДополнительныеТипы", Новый ОписаниеТипов("ТаблицаЗначений")); + + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииВидовДоступа(ВидыДоступа); + УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа); + + // Проверки: + // - тип значений доступа не указан для 2-х видов доступа + // - тип значений доступа Пользователи, ГруппыПользователей используется только для вида доступа Пользователи. + // Т тип значений доступа ВнешниеПользователи, ГруппыВнешнихПользователей используется только для вида доступа + // ВнешниеПользователи. + // И имена видов доступа Объект, Условие, НастройкиПрав, ПравоЧтения, ПравоИзменения не указаны. + // Т тип групп значений не совпадает с типом значений. + + // 2. Подготовка различных коллекций свойств видов доступа, используемых при работе программы. + МассивСвойств = Новый Массив; + ПоСсылкам = Новый Соответствие; + ПоИменам = Новый Соответствие; + ПоТипамЗначений = Новый Соответствие; + ПоТипамГруппИЗначений = Новый Соответствие; + + ЗначенияДоступаСГруппами = Новый Структура; + ЗначенияДоступаСГруппами.Вставить("ПоТипам", Новый Соответствие); + ЗначенияДоступаСГруппами.Вставить("ПоТипамСсылок", Новый Соответствие); + ЗначенияДоступаСГруппами.Вставить("ИменаТаблиц", Новый Массив); + ЗначенияДоступаСГруппами.Вставить("ТипыГруппЗначений", Новый Соответствие); + + Параметры = Новый Структура; + Параметры.Вставить("ОпределяемыеТипыЗначенийДоступа", + УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы("ОпределяемыйТип.ЗначениеДоступа")); + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ЗаполнитьСвойстваВидаДоступа + |общего модуля УправлениеДоступомПереопределяемый.'") + + Символы.ПС + + Символы.ПС; + + Параметры.Вставить("ЗаголовокОшибки", ЗаголовокОшибки); + + Параметры.Вставить("ТипыПодпискиОбновитьГруппыЗначенийДоступа", + УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы( + "ОпределяемыйТип.ЗначениеДоступаСГруппамиЗначенийДоступаОбъект")); + + ВсеИменаВидовДоступа = Новый Соответствие; + ВсеИменаВидовДоступа.Вставить(ВРег("Объект"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("Условие"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("НастройкиПрав"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("ПравоЧтения"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("ПравоИзменения"), Истина); + + ВсеТипыЗначений = Новый Соответствие; + ВсеТипыГруппЗначений = Новый Соответствие; + + Для каждого ВидДоступа Из ВидыДоступа Цикл + + Если ВсеИменаВидовДоступа[ВРег(ВидДоступа.Имя)] <> Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя вида доступа ""%1"" уже определено.'"), + ВидДоступа.Имя); + КонецЕсли; + + // Проверка повторения типов значений и групп. + ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыЗначений, Параметры); + ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); + // Проверка пересечения типов значений и групп. + ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); + ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); + + Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл + // Проверка повторения типов значений и групп. + ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыЗначений, Параметры); + ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); + // Проверка пересечения типов значений и групп. + ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); + ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); + КонецЦикла; + + ПустаяСсылкаТипаЗначений = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + Метаданные.НайтиПоТипу(ВидДоступа.ТипЗначений).ПолноеИмя()).ПустаяСсылка(); + + Свойства = Новый Структура; + Свойства.Вставить("Имя", ВидДоступа.Имя); + Свойства.Вставить("Ссылка", ПустаяСсылкаТипаЗначений); + Свойства.Вставить("Представление", ВидДоступа.Представление); + Свойства.Вставить("ТипЗначений", ВидДоступа.ТипЗначений); + Свойства.Вставить("ТипГруппЗначений", ВидДоступа.ТипГруппЗначений); + Свойства.Вставить("НесколькоГруппЗначений", ВидДоступа.НесколькоГруппЗначений); + Свойства.Вставить("ДополнительныеТипы", Новый Массив); + Свойства.Вставить("ТипыВыбираемыхЗначений", Новый Массив); + + МассивСвойств.Добавить(Свойства); + ПоИменам.Вставить(Свойства.Имя, Свойства); + ПоСсылкам.Вставить(ПустаяСсылкаТипаЗначений, Свойства); + ПоТипамЗначений.Вставить(Свойства.ТипЗначений, Свойства); + ПоТипамГруппИЗначений.Вставить(Свойства.ТипЗначений, Свойства); + Если Свойства.ТипГруппЗначений <> Тип("Неопределено") Тогда + ПоТипамГруппИЗначений.Вставить(Свойства.ТипГруппЗначений, Свойства); + КонецЕсли; + ЗаполнитьЗначенияДоступаСГруппами(Свойства, ЗначенияДоступаСГруппами, Свойства, Параметры); + + Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл + Элемент = Новый Структура; + Элемент.Вставить("ТипЗначений", Строка.ТипЗначений); + Элемент.Вставить("ТипГруппЗначений", Строка.ТипГруппЗначений); + Элемент.Вставить("НесколькоГруппЗначений", Строка.НесколькоГруппЗначений); + Свойства.ДополнительныеТипы.Добавить(Элемент); + ПоТипамЗначений.Вставить(Строка.ТипЗначений, Свойства); + ПоТипамГруппИЗначений.Вставить(Строка.ТипЗначений, Свойства); + Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда + ПоТипамГруппИЗначений.Вставить(Строка.ТипГруппЗначений, Свойства); + КонецЕсли; + ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры); + КонецЦикла; + + КонецЦикла; + + БезГруппДляЗначенияДоступа = Новый Массив; + СОднойГруппойДляЗначенияДоступа = Новый Массив; + ТипыЗначенийДоступаСГруппами = Новый Соответствие; + + ВидыДоступаСГруппами = Новый Соответствие; + + Для каждого КлючИЗначение Из ЗначенияДоступаСГруппами.ПоТипамСсылок Цикл + ИмяВидаДоступа = КлючИЗначение.Значение.Имя; + ВидыДоступаСГруппами.Вставить(ИмяВидаДоступа, Истина); + + ПустаяСсылка = ПустаяСсылкаОбъектаМетаданных(КлючИЗначение.Ключ); + ТипыЗначенийДоступаСГруппами.Вставить(ТипЗнч(ПустаяСсылка), ПустаяСсылка); + + Если НЕ КлючИЗначение.Значение.НесколькоГруппЗначений + И СОднойГруппойДляЗначенияДоступа.Найти(ИмяВидаДоступа) = Неопределено Тогда + + СОднойГруппойДляЗначенияДоступа.Добавить(ИмяВидаДоступа); + КонецЕсли; + КонецЦикла; + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.Пользователи"), + Справочники.Пользователи.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыПользователей"), + Справочники.ГруппыПользователей.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ВнешниеПользователи"), + Справочники.ВнешниеПользователи.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыВнешнихПользователей"), + Справочники.ГруппыВнешнихПользователей.ПустаяСсылка()); + + Для каждого СвойстваВидаДоступа Из МассивСвойств Цикл + Если ВидыДоступаСГруппами.Получить(СвойстваВидаДоступа.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Если СвойстваВидаДоступа.Имя = "Пользователи" + ИЛИ СвойстваВидаДоступа.Имя = "ВнешниеПользователи" Тогда + Продолжить; + КонецЕсли; + БезГруппДляЗначенияДоступа.Добавить(СвойстваВидаДоступа.Имя); + КонецЦикла; + + СвойстваВидовДоступа = Новый Структура; + СвойстваВидовДоступа.Вставить("Массив", МассивСвойств); + СвойстваВидовДоступа.Вставить("ПоИменам", ПоИменам); + СвойстваВидовДоступа.Вставить("ПоСсылкам", ПоСсылкам); + СвойстваВидовДоступа.Вставить("ПоТипамЗначений", ПоТипамЗначений); + СвойстваВидовДоступа.Вставить("ПоТипамГруппИЗначений", ПоТипамГруппИЗначений); + СвойстваВидовДоступа.Вставить("ЗначенияДоступаСГруппами", ЗначенияДоступаСГруппами); + СвойстваВидовДоступа.Вставить("БезГруппДляЗначенияДоступа", БезГруппДляЗначенияДоступа); + СвойстваВидовДоступа.Вставить("СОднойГруппойДляЗначенияДоступа", СОднойГруппойДляЗначенияДоступа); + СвойстваВидовДоступа.Вставить("ТипыЗначенийДоступаСГруппами", ТипыЗначенийДоступаСГруппами); + + // Проверка совместимости перехода на новые версии программы. + Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить( + ТипЗнч(ПланыВидовХарактеристик.УдалитьВидыДоступа.ПустаяСсылка())) = Неопределено Тогда + + ОписаниеОшибки = + НСтр("ru = 'Тип ПланВидовХарактеристикСсылка.УдалитьВидыДоступа, + |необходимый для перехода на новые версии программы + |не указан в определяемом типе ""Значение доступа"".'"); + + ВызватьИсключение Параметры.ЗаголовокОшибки + ОписаниеОшибки; + КонецЕсли; + + Возврат ОбщегоНазначения.ФиксированныеДанные(СвойстваВидовДоступа); + +КонецФункции + +// Для функции СвойстваВидовДоступа. +Процедура ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры) + + Если Свойства.Имя = "Пользователи" Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.Пользователи")); + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыПользователей")); + Возврат; + КонецЕсли; + + Если Свойства.Имя = "ВнешниеПользователи" Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ВнешниеПользователи")); + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыВнешнихПользователей")); + Возврат; + КонецЕсли; + + Если Строка.ТипГруппЗначений = Тип("Неопределено") Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипЗначений); + Возврат; + КонецЕсли; + + ТипСсылки = Строка.ТипЗначений; + + МетаданныеТипаЗначений = Метаданные.НайтиПоТипу(Строка.ТипЗначений); + Если ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда + ТипОбъекта = ТипСсылки; + Иначе + ТипОбъекта = СтандартныеПодсистемыСервер.ТипОбъектаИлиНабораЗаписейОбъектаМетаданных( + МетаданныеТипаЗначений); + КонецЕсли; + + Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипГруппЗначений); + КонецЕсли; + + ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипСсылки, Свойства); + ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипОбъекта, Свойства); + ЗначенияДоступаСГруппами.ПоТипамСсылок.Вставить(ТипСсылки, Свойства); + ЗначенияДоступаСГруппами.ИменаТаблиц.Добавить(МетаданныеТипаЗначений.ПолноеИмя()); + + МетаданныеТипаГруппЗначений = Метаданные.НайтиПоТипу(Строка.ТипГруппЗначений); + ПустаяСсылкаТипаГруппЗначений = ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаГруппЗначений); + + ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить(ТипСсылки, ПустаяСсылкаТипаГруппЗначений); + ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить( + ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаЗначений), ПустаяСсылкаТипаГруппЗначений); + + // Проверка наличия типа ссылки в соответствующих объектах метаданных. + Если Параметры.ТипыПодпискиОбновитьГруппыЗначенийДоступа.Получить(ТипОбъекта) = Неопределено + И НЕ ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда + + ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип значения доступа ""%1"", использующий группы значений, не указан + |в определяемом типе ""Значение доступа с группами значений доступа объект"".'"), + Строка(ТипОбъекта)); + КонецЕсли; + +КонецПроцедуры + +// Для функции СвойстваВидовДоступа. +Процедура ПроверитьТип(ВидДоступа, Тип, ВсеТипы, Параметры, ПроверкаТиповГрупп = Ложь, ПроверкаПересечения = Ложь) + + Если Тип = Тип("Неопределено") Тогда + Если ПроверкаТиповГрупп Тогда + Возврат; + КонецЕсли; + ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для вида доступа ""%1"" не указан тип значений доступа.'"), + ВидДоступа.Имя); + КонецЕсли; + + // Проверка, что указан тип ссылки. + Если НЕ ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + Если ПроверкаТиповГрупп Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". + |Однако это не тип ссылки.'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". + |Однако это не тип ссылки.'"); + КонецЕсли; + ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ОписаниеОшибки, Тип, ВидДоступа.Имя); + КонецЕсли; + + // Проверка повторения и пересечения типов значений и групп значений. + ДляТогоЖеВидаДоступаОшибкиНет = Ложь; + + Если ПроверкаТиповГрупп Тогда + Если ПроверкаПересечения Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать, как тип групп значений.'"); + Иначе + ДляТогоЖеВидаДоступаОшибкиНет = Истина; + ОписаниеОшибки = + НСтр("ru = 'Тип групп значений ""%1"" уже указан для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать.'"); + КонецЕсли; + Иначе + Если ПроверкаПересечения Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать, как тип значений.'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип значений ""%1"" уже указан для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать.'"); + КонецЕсли; + КонецЕсли; + + Если ВсеТипы.Получить(Тип) <> Неопределено Тогда + Если НЕ (ДляТогоЖеВидаДоступаОшибкиНет И ВидДоступа.Имя = ВсеТипы.Получить(Тип)) Тогда + ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ОписаниеОшибки, Тип, ВсеТипы.Получить(Тип), ВидДоступа.Имя); + КонецЕсли; + ИначеЕсли НЕ ПроверкаПересечения Тогда + ВсеТипы.Вставить(Тип, ВидДоступа.Имя); + КонецЕсли; + + // Проверка состава определяемых типов. + ОписаниеОшибки = ""; + Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить(Тип) = Неопределено Тогда + Если ПроверкаТиповГрупп Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип групп значений доступа ""%1"" вида доступа ""%2"" + |не указан в определяемом типе ""Значение доступа"".'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип значений доступа ""%1"" вида доступа ""%2"" + |не указан в определяемом типе ""Значение доступа"".'"); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ОписаниеОшибки, Тип, ВидДоступа.Имя); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ЗаполнитьЗначенияДоступаСГруппами. +Процедура ДобавитьВМассив(Массив, Значение) + + Если Массив.Найти(Значение) = Неопределено Тогда + Массив.Добавить(Значение); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ОбновитьОписаниеСвойствВидовДоступа. +Функция ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, Сохраненные) + + Если НЕ ТипЗнч(Сохраненные) = Тип("ФиксированнаяСтруктура") + ИЛИ НЕ Сохраненные.Свойство("ПоТипамЗначений") + ИЛИ НЕ Сохраненные.Свойство("ТипыЗначенийДоступаСГруппами") + ИЛИ НЕ ТипЗнч(Сохраненные.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ ТипЗнч(Сохраненные.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ СвойстваВидовДоступа.Свойство("ПоТипамЗначений") + ИЛИ НЕ СвойстваВидовДоступа.Свойство("ТипыЗначенийДоступаСГруппами") + ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") Тогда + + Возврат Истина; + КонецЕсли; + + Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ПоТипамЗначений, Сохраненные.ПоТипамЗначений) Тогда + Возврат Истина; + КонецЕсли; + + Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами, + Сохраненные.ТипыЗначенийДоступаСГруппами) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Для функции ЕстьИзмененияТиповГруппИЗначенийДоступа. +Функция КлючиСоответствийОтличаются(Новое, Старое) + + Если Новое.Количество() <> Старое.Количество() Тогда + Возврат Истина; + КонецЕсли; + + Для каждого КлючИЗначение Из Новое Цикл + Если Старое.Получить(КлючИЗначение.Ключ) = Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl index b6a61ddaa..f4133008f 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl @@ -1,67 +1,5 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом в модели сервиса". -// -/////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "УправлениеДоступомСлужебныйВМоделиСервиса"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "УправлениеДоступомСлужебныйВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "УправлениеДоступомСлужебныйВМоделиСервиса"); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа.Имя); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.0.4"; - Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьГруппыДоступаАдминистраторовВМоделиСервиса"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.2.1.15"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьРасписаниеШаблонаЗаполнениеДанныхДляОграниченияДоступа"; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. @@ -136,7 +74,7 @@ // Обновляет настройки регламентного задания. Процедура ОбновитьРасписаниеШаблонаЗаполнениеДанныхДляОграниченияДоступа() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -154,19 +92,6 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Вызывается после окончания загрузки данных из локальной версии -// в область данных сервиса или наоборот. -// -Процедура ПослеЗагрузкиДанныхИзДругойМодели() Экспорт - - Справочники.ПрофилиГруппДоступа.ОбновитьПоставляемыеПрофили(); - -КонецПроцедуры - // Вызывается при обработке сообщения http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetFullControl. // // Параметры: @@ -204,4 +129,35 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа.Имя); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.0.4"; + Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьГруппыДоступаАдминистраторовВМоделиСервиса"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьРасписаниеШаблонаЗаполнениеДанныхДляОграниченияДоступа"; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. +Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт + + Справочники.ПрофилиГруппДоступа.ОбновитьПоставляемыеПрофили(); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl index 8616b2fc9..fbb5310cc 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl index 8870b228b..549ad0466 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl index c566608f9..321ab6057 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Определяет назначение профиля. diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl index 0d85fd175..25f0c14ab 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl @@ -1,50 +1,33 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление доступом". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// Содержит сохраненные параметры, используемые подсистемой. -Функция Параметры() Экспорт +// См. УправлениеДоступомСлужебный.СвойстваВидовДоступа. +Функция СвойстваВидовДоступа() Экспорт - УстановитьПривилегированныйРежим(Истина); - СохраненныеПараметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыОграниченияДоступа"); - УстановитьПривилегированныйРежим(Ложь); + СвойстваВидовДоступа = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.СвойстваВидовДоступа"); - СтандартныеПодсистемыСервер.ПроверитьОбновлениеПараметровРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "ВозможныеПраваДляНастройкиПравОбъектов, - |ПоставляемыеПрофилиГруппДоступа, - |ПредопределенныеПрофилиГруппДоступа, - |СвойстваВидовДоступа"); - - ПредставлениеПараметра = ""; - - Если НЕ СохраненныеПараметры.Свойство("ВозможныеПраваДляНастройкиПравОбъектов") Тогда - ПредставлениеПараметра = НСтр("ru = 'Возможные права для настройки прав объектов'"); - - ИначеЕсли НЕ СохраненныеПараметры.Свойство("ПоставляемыеПрофилиГруппДоступа") Тогда - ПредставлениеПараметра = НСтр("ru = 'Поставляемые профили групп доступа'"); - - ИначеЕсли НЕ СохраненныеПараметры.Свойство("ПредопределенныеПрофилиГруппДоступа") Тогда - ПредставлениеПараметра = НСтр("ru = 'Предопределенные профили групп доступа'"); - - ИначеЕсли НЕ СохраненныеПараметры.Свойство("СвойстваВидовДоступа") Тогда - ПредставлениеПараметра = НСтр("ru = 'Свойства видов доступа'"); + Если СвойстваВидовДоступа = Неопределено Тогда + УправлениеДоступомСлужебный.ОбновитьОписаниеСвойствВидовДоступа(); КонецЕсли; - Если ЗначениеЗаполнено(ПредставлениеПараметра) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка обновления информационной базы. - |Не заполнен параметр ограничения доступа: - |""%1"".'"), - ПредставлениеПараметра) - + СтандартныеПодсистемыСервер.УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика(); - КонецЕсли; + СвойстваВидовДоступа = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы( + "СтандартныеПодсистемы.УправлениеДоступом.СвойстваВидовДоступа"); - Возврат СохраненныеПараметры; + Возврат СвойстваВидовДоступа; + +КонецФункции + +// См. РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава. +Функция ВозможныеПраваДляНастройкиПравОбъектов() Экспорт + + Возврат РегистрыСведений.НастройкиПравОбъектов.ВозможныеПраваДляНастройкиПравОбъектов(); + +КонецФункции + +// См. Справочники.ПрофилиГруппДоступа.ПоставляемыеПрофили. +Функция ОписаниеПоставляемыхПрофилей() Экспорт + + Возврат Справочники.ПрофилиГруппДоступа.ОписаниеПоставляемыхПрофилей(); КонецФункции @@ -86,20 +69,14 @@ ОграниченияПрав = ""; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(ОграниченияПрав); - КонецЦикла; - + ИнтеграцияСтандартныхПодсистем.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(ОграниченияПрав); УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(ОграниченияПрав); Если ДляПроверки Тогда Возврат ОграниченияПрав; КонецЕсли; - ВидыДоступаПоИменам = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; + ВидыДоступаПоИменам = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа().ПоИменам; Для НомерСтроки = 1 По СтрЧислоСтрок(ОграниченияПрав) Цикл ТекущаяСтрока = СокрЛП(СтрПолучитьСтроку(ОграниченияПрав, НомерСтроки)); @@ -164,9 +141,9 @@ Если ЗначениеЗаполнено(ПояснениеОшибки) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в строке описания вида ограничений права объекта метаданных: - |""%1"". - | - |'"), + |""%1"".'") + + Символы.ПС + + Символы.ПС, ТекущаяСтрока) + ПояснениеОшибки; Иначе @@ -425,7 +402,7 @@ // Только для внутреннего использования. Функция ТипыЗначенийВидовДоступа() Экспорт - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); ТипыЗначенийВидовДоступа = Новый ТаблицаЗначений; ТипыЗначенийВидовДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); @@ -449,7 +426,7 @@ // Только для внутреннего использования. Функция ТипыГруппИЗначенийВидовДоступа() Экспорт - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); ТипыГруппИЗначенийВидовДоступа = Новый ТаблицаЗначений; ТипыГруппИЗначенийВидовДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); @@ -474,11 +451,14 @@ Функция ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав() Экспорт Типы = Новый Массив; - Для каждого Тип Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл + Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл Типы.Добавить(Тип); КонецЦикла; - Для каждого Тип Из Метаданные.ОпределяемыеТипы.ВладелецНастроекПрав.Тип.Типы() Цикл + Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ВладелецНастроекПрав.Тип.Типы() Цикл + Если Тип = Тип("Строка") Тогда + Продолжить; + КонецЕсли; Типы.Добавить(Тип); КонецЦикла; @@ -503,8 +483,8 @@ ЗаполнитьЗначенияСвойств(ТипыЗначенийВидовДоступаИВладельцевНастроекПрав.Добавить(), Строка); КонецЦикла; - ТекущиеПараметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ВладельцыПрав = ТекущиеПараметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); + ВладельцыПрав = ВозможныеПрава.ПоТипамСсылок; Для каждого КлючИЗначение Из ВладельцыПрав Цикл diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl index b270405c4..5adc94043 100644 --- a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl @@ -1,152 +1,5 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Управление итогами и агрегатами". -// -/////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "УправлениеИтогамиИАгрегатамиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить( - "УправлениеИтогамиИАгрегатамиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "УправлениеИтогамиИАгрегатамиСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "УправлениеИтогамиИАгрегатамиСлужебный"); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.7"; - Обработчик.Процедура = "УправлениеИтогамиИАгрегатамиСлужебный.УстановитьИспользованиеРегламентныхЗаданий"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Приоритет = 75; - -КонецПроцедуры - -// Вызывается после завершения монопольного обновления данных ИБ. -// -// Параметры: -// ПредыдущаяВерсия - Строка - версия подсистемы до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсия - Строка - версия подсистемы после обновления. -// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков обновления -// подсистемы, сгруппированных по номеру версии. -// Процедура обхода выполненных обработчиков: -// -// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл -// -// Если Версия.Версия = "*" Тогда -// // Обработчик, который может выполнятся при каждой смене версии. -// Иначе -// // Обработчик, который выполняется для определенной версии. -// КонецЕсли; -// -// Для Каждого Обработчик Из Версия.Строки Цикл -// ... -// КонецЦикла; -// -// КонецЦикла; -// -// ВыводитьОписаниеОбновлений - Булево (возвращаемое значение)- если установить Истина, -// тогда выводить форму с описанием обновлений. -// МонопольныйРежим - Булево - признак выполнения обновления в монопольном режиме. -// Истина - обновление выполнялось в монопольном режиме. -// -Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, - Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - - Если НЕ РежимРаботыЛокальныйФайловый() Тогда - Возврат; - КонецЕсли; - - СформироватьПараметрыИтоговИАгрегатов(); - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("ОбновлениеАгрегатов"); - Шаблоны.Добавить("ПерестроениеАгрегатов"); - Шаблоны.Добавить("УстановкаПериодаРассчитанныхИтогов"); - -КонецПроцедуры - -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - см. возвращаемое значение ТекущиеДелаСлужебный.СписокТекущихДелПользователя(). -// -Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - Если Не РежимРаботыЛокальныйФайловый() Тогда - Возврат; - КонецЕсли; - - ОбработкаМетаданные = Метаданные.Обработки.СдвигГраницыИтогов; - Если Не ПравоДоступа("Использование", ОбработкаМетаданные) Тогда - Возврат; - КонецЕсли; - - ОбработкаПолноеИмя = ОбработкаМетаданные.ПолноеИмя(); - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(ОбработкаПолноеИмя); - - Прототип = Новый Структура("ЕстьДела, Важное, Форма, Представление, Подсказка"); - Прототип.ЕстьДела = НадоСдвинутьГраницуИтогов(); - Прототип.Важное = Истина; - Прототип.Форма = ОбработкаПолноеИмя + ".Форма"; - Прототип.Представление = НСтр("ru = 'Оптимизировать программу'"); - Прототип.Подсказка = НСтр("ru = 'Ускорить проведение документов и формирование отчетов. - |Обязательная ежемесячная процедура, может занять некоторое время.'"); - - Для Каждого Раздел Из Разделы Цикл - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = СтрЗаменить(Прототип.Форма, ".", "") + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело.Владелец = Раздел; - ЗаполнитьЗначенияСвойств(Дело, Прототип); - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Рассчитывает итоги всех регистров бухгалтерии и накопления, у которых они включены. Процедура РассчитатьИтоги() Экспорт @@ -202,6 +55,81 @@ КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "УправлениеИтогамиИАгрегатамиСлужебный.ОбновитьИспользованиеРегламентныхЗаданий"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("16ec32f9-d68f-4283-9e6f-924a8655d2e4"); + Обработчик.Комментарий = + НСтр("ru = 'Включает или отключает обновление и перестроение агрегатов по расписанию, + |в зависимости от того, есть ли в программе регистры с агрегатами.'"); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. +Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, + Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт + + Если НЕ РежимРаботыЛокальныйФайловый() Тогда + Возврат; + КонецЕсли; + + // Данные действия необходимо выполнять после всех обработчиков обновления, + // т.к. в них могут изменить состояние (использование) итогов и агрегатов. + + СформироватьПараметрыИтоговИАгрегатов(); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить("ОбновлениеАгрегатов"); + ШаблоныЗаданий.Добавить("ПерестроениеАгрегатов"); + ШаблоныЗаданий.Добавить("УстановкаПериодаРассчитанныхИтогов"); + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт + Если Не РежимРаботыЛокальныйФайловый() Тогда + Возврат; + КонецЕсли; + + ОбработкаМетаданные = Метаданные.Обработки.СдвигГраницыИтогов; + Если Не ПравоДоступа("Использование", ОбработкаМетаданные) Тогда + Возврат; + КонецЕсли; + + ОбработкаПолноеИмя = ОбработкаМетаданные.ПолноеИмя(); + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(ОбработкаПолноеИмя); + + Прототип = Новый Структура("ЕстьДела, Важное, Форма, Представление, Подсказка"); + Прототип.ЕстьДела = НадоСдвинутьГраницуИтогов(); + Прототип.Важное = Истина; + Прототип.Форма = ОбработкаПолноеИмя + ".Форма"; + Прототип.Представление = НСтр("ru = 'Оптимизировать программу'"); + Прототип.Подсказка = НСтр("ru = 'Ускорить проведение документов и формирование отчетов. + |Обязательная ежемесячная процедура, может занять некоторое время.'"); + + Для Каждого Раздел Из Разделы Цикл + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = СтрЗаменить(Прототип.Форма, ".", "") + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело.Владелец = Раздел; + ЗаполнитьЗначенияСвойств(Дело, Прототип); + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -289,7 +217,7 @@ // Возвращает Истина если ИБ работает в файловом режиме и разделение отключено. Функция РежимРаботыЛокальныйФайловый() - Возврат ОбщегоНазначения.ИнформационнаяБазаФайловая() И НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Возврат ОбщегоНазначения.ИнформационнаяБазаФайловая() И НЕ ОбщегоНазначения.РазделениеВключено(); КонецФункции // Определяет актуальность итогов и агрегатов. Если нет регистров, то возвращает Истина. @@ -340,70 +268,70 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Устанавливает расписания и использование регламентных заданий подсистемы -// в значения по умолчанию. Используется только при перехода на версию -// 2.1.3 библиотеки. -// -Процедура УстановитьИспользованиеРегламентныхЗаданий() Экспорт - - ПустоеРасписание = РасписаниеЗаданияПоУмолчанию(""); - - ПроверятьИспользование = НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено(); - - ИменаЗаданий = Новый Массив; - ИменаЗаданий.Добавить("ОбновлениеАгрегатов"); - ИменаЗаданий.Добавить("ПерестроениеАгрегатов"); - ИменаЗаданий.Добавить("УстановкаПериодаРассчитанныхИтогов"); - - Для каждого ИмяЗадания Из ИменаЗаданий Цикл - Задание = РегламентныеЗадания.НайтиПредопределенное(ИмяЗадания); - - Если ПроверятьИспользование И Задание.Использование Тогда - Продолжить; - КонецЕсли; - - Если НЕ ОбщегоНазначенияКлиентСервер.РасписанияОдинаковые(ПустоеРасписание, Задание.Расписание) Тогда - Продолжить; - КонецЕсли; - - Задание.Расписание = РасписаниеЗаданияПоУмолчанию(ИмяЗадания); - Если ПроверятьИспользование Тогда - Задание.Использование = Истина; - КонецЕсли; - - Задание.Записать(); - КонецЦикла; +// [2.3.4.7] Актуализирует использование регламентных заданий ОбновлениеАгрегатов и ПерестроениеАгрегатов. +Процедура ОбновитьИспользованиеРегламентныхЗаданий() Экспорт + // Регламентные задания "ОбновлениеАгрегатов" и "ПерестроениеАгрегатов". + ЕстьРегистрыСАгрегатами = ЕстьРегистрыСАгрегатами(); + ОбновитьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ОбновлениеАгрегатов, ЕстьРегистрыСАгрегатами); + ОбновитьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ПерестроениеАгрегатов, ЕстьРегистрыСАгрегатами); + // Регламентное задание "УстановкаПериодаРассчитанныхИтогов". + ОбновитьРегламентноеЗадание(Метаданные.РегламентныеЗадания.УстановкаПериодаРассчитанныхИтогов, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Другие -Функция РасписаниеЗаданияПоУмолчанию(Знач Имя) +// Вспомогательная для процедуры ОбновитьИспользованиеРегламентныхЗаданий. +Процедура ОбновитьРегламентноеЗадание(МетаданныеРегламентногоЗадания, Использование) + Найденные = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", МетаданныеРегламентногоЗадания)); + Для Каждого Задание Из Найденные Цикл + Изменения = Новый Структура("Использование", Использование); + // Изменять расписание надо только если оно не было установлено и только в коробке. + Если Не РасписаниеЗаполнено(Задание.Расписание) + И Не ОбщегоНазначения.РазделениеВключено() Тогда + Изменения.Вставить("Расписание", РасписаниеПоУмолчанию(МетаданныеРегламентногоЗадания)); + КонецЕсли; + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); + КонецЦикла; +КонецПроцедуры + +// Определяет, задано ли расписание регламентного задания. +// +// Параметры: +// Расписание - РасписаниеРегламентногоЗадания - расписание регламентного задания. +// +// Возвращаемое значение: +// Булево - Истина, если расписание регламентного задания задано. +// +Функция РасписаниеЗаполнено(Расписание) + Возврат Расписание <> Неопределено + И Строка(Расписание) <> Строка(Новый РасписаниеРегламентногоЗадания); +КонецФункции + +// Возвращает расписание регламентного задания по умолчанию. +// Используется вместо свойства "ОбъектМетаданных: РегламентноеЗадание.Расписание", +// т.к. оно всегда имеет значение Неопределено. +Функция РасписаниеПоУмолчанию(МетаданныеРегламентногоЗадания) Расписание = Новый РасписаниеРегламентногоЗадания; - Если Имя = "" Тогда - Возврат Расписание; - КонецЕсли; Расписание.ПериодПовтораДней = 1; - - Если Имя = "ОбновлениеАгрегатов" Тогда + Если МетаданныеРегламентногоЗадания = Метаданные.РегламентныеЗадания.ОбновлениеАгрегатов Тогда Расписание.ВремяНачала = Дата(1, 1, 1, 01, 00, 00); ДобавитьДетальноеРасписание(Расписание, "ВремяНачала", Дата(1, 1, 1, 01, 00, 00)); ДобавитьДетальноеРасписание(Расписание, "ВремяНачала", Дата(1, 1, 1, 14, 00, 00)); - ИначеЕсли Имя = "ПерестроениеАгрегатов" Тогда + ИначеЕсли МетаданныеРегламентногоЗадания = Метаданные.РегламентныеЗадания.ПерестроениеАгрегатов Тогда Расписание.ВремяНачала = Дата(1, 1, 1, 03, 00, 00); УстановитьДниНедели(Расписание, "6"); - ИначеЕсли Имя = "УстановкаПериодаРассчитанныхИтогов" Тогда + ИначеЕсли МетаданныеРегламентногоЗадания = Метаданные.РегламентныеЗадания.УстановкаПериодаРассчитанныхИтогов Тогда Расписание.ВремяНачала = Дата(1, 1, 1, 01, 00, 00); Расписание.ДеньВМесяце = 5; Иначе - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неизвестное имя задания %1'"), Имя); - ВызватьИсключение(ТекстСообщения); + Возврат Неопределено; КонецЕсли; - Возврат Расписание; КонецФункции +// Вспомогательная для функции РасписаниеПоУмолчанию. Процедура ДобавитьДетальноеРасписание(Расписание, Ключ, Значение) ДетальноеРасписание = Новый РасписаниеРегламентногоЗадания; ЗаполнитьЗначенияСвойств(ДетальноеРасписание, Новый Структура(Ключ, Значение)); @@ -412,6 +340,7 @@ Расписание.ДетальныеРасписанияДня = Массив; КонецПроцедуры +// Вспомогательная для функции РасписаниеПоУмолчанию. Процедура УстановитьДниНедели(Расписание, ДниНеделиВСтроке) ДниНедели = Новый Массив; МассивСтрок = СтрРазделить(ДниНеделиВСтроке, ",", Ложь); @@ -423,11 +352,20 @@ Функция КэшПроверкиРазделения() Кэш = Новый Структура; - Кэш.Вставить("МодельСервиса", ОбщегоНазначенияПовтИсп.РазделениеВключено()); + Кэш.Вставить("МодельСервиса", ОбщегоНазначения.РазделениеВключено()); Если Кэш.МодельСервиса Тогда - Кэш.Вставить("ВОбластиДанных", ОбщегоНазначения.ИспользованиеРазделителяСеанса()); - Кэш.Вставить("РазделительОсновныхДанных", ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()); - Кэш.Вставить("РазделительВспомогательныхДанных", ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + РазделительОсновныхДанных = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных(); + РазделительВспомогательныхДанных = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных(); + Иначе + РазделительОсновныхДанных = Неопределено; + РазделительВспомогательныхДанных = Неопределено; + КонецЕсли; + + Кэш.Вставить("ВОбластиДанных", ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); + Кэш.Вставить("РазделительОсновныхДанных", РазделительОсновныхДанных); + Кэш.Вставить("РазделительВспомогательныхДанных", РазделительВспомогательныхДанных); КонецЕсли; Возврат Кэш; КонецФункции @@ -436,10 +374,36 @@ Если Не Кэш.МодельСервиса Тогда Возврат Истина; КонецЕсли; - ОбъектМетаданныхРазделен = - ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных, Кэш.РазделительОсновныхДанных) - Или ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных, Кэш.РазделительВспомогательныхДанных); - Возврат Кэш.ВОбластиДанных = ОбъектМетаданныхРазделен; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; + + Возврат Кэш.ВОбластиДанных = ЭтоРазделенныйОбъектМетаданных; +КонецФункции + +Функция ЕстьРегистрыСАгрегатами() + Кэш = КэшПроверкиРазделения(); + ВидОбороты = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты; + Для Каждого РегистрМетаданные Из Метаданные.РегистрыНакопления Цикл + Если РегистрМетаданные.ВидРегистра <> ВидОбороты Тогда + Продолжить; + КонецЕсли; + Если Не ОбъектМетаданныхДоступенПоРазделению(Кэш, РегистрМетаданные) Тогда + Продолжить; + КонецЕсли; + РегистрНакопленияМенеджер = РегистрыНакопления[РегистрМетаданные.Имя]; + Если Не РегистрНакопленияМенеджер.ПолучитьРежимАгрегатов() + Или Не РегистрНакопленияМенеджер.ПолучитьИспользованиеАгрегатов() Тогда + Продолжить; + КонецЕсли; + Возврат Истина; + КонецЦикла; + + Возврат Ложь; КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl index f0cb60f7c..e28888888 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -1,28 +1,1120 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Обработчики событий формы и модуля объекта. +// Добавление, изменение и получение контактной информации. + +// Возвращает таблицу, содержащую контактную информацию нескольких объектов. +// +// Параметры: +// СсылкиИлиОбъекты - Массив - владельцы контактной информации. +// ТипыКонтактнойИнформации - Массив, ПеречислениеСсылка.ТипыКонтактнойИнформации - Если указаны, то будет получена +// контактную информацию только этих типов. +// ВидыКонтактнойИнформации - Массив, СправочникСсылка.ВидыКонтактнойИнформации - Если указаны, то будет получена +// контактную информацию только этих видов. +// Дата - Дата - необязательный, дата с которой действует запись контактной информации, +// используется при хранении истории изменения контактной информации. +// Если владелец хранит историю изменений, то при несоответствии параметра +// дате будет вызвано исключение. +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с контактной информацией объектов содержащая колонки: +// * СсылкиИлиОбъекты - Ссылка - Владелец контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес. +// * Представление - Строка - Представление контактной информации. +// * Дата - Дата - Дата с которой действует запись контактной информации. +// +Функция КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, Знач ТипыКонтактнойИнформации = Неопределено, Знач ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + Если ТипЗнч(ТипыКонтактнойИнформации) = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + ТипыКонтактнойИнформации = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТипыКонтактнойИнформации); + КонецЕсли; + + Если ТипЗнч(ВидыКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ВидыКонтактнойИнформации = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ВидыКонтактнойИнформации); + КонецЕсли; + + СоздатьВТКонтактнаяИнформация(Запрос.МенеджерВременныхТаблиц, СсылкиИлиОбъекты, ТипыКонтактнойИнформации, ВидыКонтактнойИнформации, Дата); + + Если ТипЗнч(Дата) = Тип("Дата") Тогда + ДействуетС = " КонтактнаяИнформация.ДействуетС"; + Иначе + ДействуетС = " ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)"; + КонецЕсли; + + Запрос.Текст = + "ВЫБРАТЬ + | КонтактнаяИнформация.Объект КАК Объект, + | КонтактнаяИнформация.Вид КАК Вид, + | КонтактнаяИнформация.Тип КАК Тип, + | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей, + | &ДействуетС КАК Дата, + | КонтактнаяИнформация.Представление КАК Представление + |ИЗ + | ВТКонтактнаяИнформация КАК КонтактнаяИнформация"; + Запрос.УстановитьПараметр("ДействуетС", ДействуетС); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// Возвращает таблицу, содержащую контактную информацию объекта. +// +// Параметры: +// СсылкаИлиОбъект - ЛюбаяСсылка, Объект - Ссылка или объект-владелец контактной информации (организация, +// контрагент, партнер и т.д.). +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Необязательный, отбор по виду контактной информации. +// Дата - Дата - необязательный, дата с которой действует запись контактной информации. +// ТолькоПредставление - Булево - Если Истина, то возвращает только представление, иначе таблицу значений. +// Для получения представление рекомендуется использовать см. функцию ПредставлениеКонтактнойИнформацииОбъекта. +// +// Возвращаемое значение: +// Строка - строковое представление значения, если параметр ТолькоПредставление установлен в Истина, иначе +// ТаблицаЗначений - таблица с контактной информацией объекта содержащая колонки: +// * СсылкиИлиОбъекты - Ссылка - Владелец контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес. +// * Представление - Строка - Представление контактной информации. +// * Дата - Дата - Дата с которой действует запись контактной информации. +// +Функция КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации = Неопределено, Дата = Неопределено, ТолькоПредставление = Истина) Экспорт + + Если ТолькоПредставление Тогда + // Оставлено для обратной совместимости. + МассивОбъектов = Новый Массив; + МассивОбъектов.Добавить(СсылкаИлиОбъект); + + КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов,, ВидКонтактнойИнформации, Дата); + + Если КонтактнаяИнформацияОбъекта.Количество() > 0 Тогда + Возврат КонтактнаяИнформацияОбъекта[0].Представление; + КонецЕсли; + + Возврат ""; + Иначе + СсылкиИлиОбъекты = Новый Массив; + СсылкиИлиОбъекты.Добавить(СсылкаИлиОбъект); + + Если ТипЗнч(ВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ВидыКонтактнойИнформации = Новый Массив; + ВидыКонтактнойИнформации.Добавить(ВидКонтактнойИнформации); + ТипыКонтактнойИнформации = Новый Массив; + ТипыКонтактнойИнформации.Добавить(ВидКонтактнойИнформации.Тип); + Иначе + ВидыКонтактнойИнформации = Неопределено; + ТипКонтактнойИнформации = Неопределено; + КонецЕсли; + + Возврат КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, ТипыКонтактнойИнформации, ВидыКонтактнойИнформации, Дата); + КонецЕсли; + +КонецФункции + +// Возвращает представление контактной информации объекта. +// +// Параметры: +// СсылкаИлиОбъект - Произвольный - Владелец контактной информации. +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации. +// Разделитель - Строка - Разделитель, который добавляется в представление между записями контактной информации. +// По умолчанию это запятая с последующем пробелом, для исключения +// пробела необходимо использовать признак БезПробелов у параметра ДополнительныеПараметры. +// Дата - Дата - Дата с которой действует запись контактной информации. Если контактная информация +// хранит историю изменения, то передача даты обязательна. +// ДополнительныеПараметры - Структура - Необязательные параметры для формирования представления контактной информации. +// * ТолькоПервая - Булево - Если Истина, то будет возвращено представление только основной(первой) записи +// контактной информации. По умолчанию - Ложь; +// * БезПробелов - Булево - Если Истина, то после разделителя не будет автоматически добавляется пробел. +// По умолчанию - Ложь; +// +// Возвращаемое значение: +// Строка - Сформированное представление контактной информации. +// +Функция ПредставлениеКонтактнойИнформацииОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации, Разделитель = ",", Дата = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + ТолькоПервая = Ложь; + БезПробелов = Ложь; + Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + Если ДополнительныеПараметры.Свойство("ТолькоПервая") Тогда + ТолькоПервая = ДополнительныеПараметры.ТолькоПервая; + КонецЕсли; + Если ДополнительныеПараметры.Свойство("БезПробелов") Тогда + БезПробелов = ДополнительныеПараметры.БезПробелов; + КонецЕсли; + КонецЕсли; + РазделительВПредставлении = ?(БезПробелов, Разделитель, Разделитель + " "); + + ПервыйПроход = Истина; + КонтактнаяИнформация = КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации, Дата, Ложь); + Для каждого ЗаписьКонтактнойИнформации Из КонтактнаяИнформация Цикл + Если ПервыйПроход Тогда + Представление = ЗаписьКонтактнойИнформации.Представление; + Если ТолькоПервая Тогда + Возврат Представление; + КонецЕсли; + ПервыйПроход = Ложь; + Иначе + Представление = Представление + РазделительВПредставлении + ЗаписьКонтактнойИнформации.Представление; + КонецЕсли; + КонецЦикла; + + Возврат Представление; + +КонецФункции + +// Формирует новую таблицу контактной информации. +// +// Параметры: +// КолонкаОбъект - Булево - Если Истина, то таблица будет содержать колонку "Объект". +// Это нужно, если в таблице необходимо хранить контактной информацию для нескольких объектов. +// +// Возвращаемое значение: +// ТаблицаЗначений - результат. Колонки: +// * Объект - ЛюбаяСсылка - Ссылка на владельца контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес. +// * Представление - Строка - Представление контактной информации. +// * Дата - Дата - Дата с которой действует запись контактной информации. +// +Функция НоваяКонтактнаяИнформация(КолонкаОбъект = Истина) Экспорт + + КонтактнаяИнформация = Новый ТаблицаЗначений; + + Если КолонкаОбъект Тогда + КонтактнаяИнформация.Колонки.Добавить("Объект"); + КонецЕсли; + ОписаниеТиповСтрока500 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(500)); + + КонтактнаяИнформация.Колонки.Добавить("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации")); + КонтактнаяИнформация.Колонки.Добавить("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации")); + КонтактнаяИнформация.Колонки.Добавить("ЗначенияПолей", Новый ОписаниеТипов("Строка")); + КонтактнаяИнформация.Колонки.Добавить("Представление", ОписаниеТиповСтрока500); + КонтактнаяИнформация.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); + + Возврат КонтактнаяИнформация; + +КонецФункции + +// Добавляет контактную информацию к объекту по представлению или XML. +// +// Параметры: +// СсылкаИлиОбъект - Произвольный - Ссылка или объект владельца содержащего контактную информацию. +// Для ссылки после добавления контактной информации владелец будет записан. +// Если передан объект, то контактная информация будет добавлена без записи. +// Для сохранения изменений объект необходимо будет записать отдельно. +// ЗначениеИлиПредставление - Строка - Представление или XML соответствующего XDTO пакету КонтактнаяИнформация или Адрес. +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид добавляемой контактной информации. +// Дата - Дата - Дата, с которой будет действовать запись контактной информации. +// Требуется для контактной информации, у которой хранится история изменений. +// Если значение не указано, то принимается текущая дата сеанса. +// Замещать - Булево - Если Истина(по умолчанию), то будет заменена вся контактная информация по +// переданном виду контактной информации. +// Если Ложь, то запись будет добавлена. Если вид контактной информации не разрешает +// ввод нескольких значений, а контактная информация объекта уже содержит запись, +// то запись не будет добавлена. +// +Процедура ДобавитьКонтактнуюИнформацию(СсылкаИлиОбъект, ЗначениеИлиПредставление, ВидКонтактнойИнформации, Дата = Неопределено, Замещать = Истина) Экспорт + + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СсылкаИлиОбъект)) Тогда + Объект = СсылкаИлиОбъект.ПолучитьОбъект(); + Записывать = Истина; + Иначе + Объект = СсылкаИлиОбъект; + Записывать = Ложь; + КонецЕсли; + КонтактнаяИнформация = Объект.КонтактнаяИнформация; + ЭтоКонтактнаяИнформацияВXML = УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначениеИлиПредставление); + + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); + Если МетаданныеОбъекта = Неопределено + Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");; + КонецЕсли; + + ФорматКонтактнойИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидКонтактнойИнформации, "Тип, ВключатьСтрануВПредставление, ПроверятьПоФИАС"); + Если ЭтоКонтактнаяИнформацияВXML Тогда + ФорматКонтактнойИнформации.Вставить("ФорматАдреса", ?(ФорматКонтактнойИнформации.ПроверятьПоФИАС, "ФИАС", "КЛАДР")); + Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(ЗначениеИлиПредставление, ФорматКонтактнойИнформации); + ЗначенияПолей = ЗначениеИлиПредставление; + Иначе + КонтактнаяИнформацияXDTO = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(ЗначениеИлиПредставление, ВидКонтактнойИнформации); + ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(КонтактнаяИнформацияXDTO); + Представление = ЗначениеИлиПредставление; + КонецЕсли; + + Если Замещать Тогда + НайденныеСтроки = НайтиСтрокиКонтактнойИнформации(ВидКонтактнойИнформации, Дата, КонтактнаяИнформация); + Для Каждого СтрокаТабличнойЧасти Из НайденныеСтроки Цикл + КонтактнаяИнформация.Удалить(СтрокаТабличнойЧасти); + КонецЦикла; + СтрокаКонтактнойИнформации = КонтактнаяИнформация.Добавить(); + Иначе + Если ЭтоКонтактнаяИнформацияВXML Тогда + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(ЗначениеИлиПредставление, "ЗначенияПолей") + Иначе + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(ЗначениеИлиПредставление, "Представление") + КонецЕсли; + Если СтрокаКонтактнойИнформации = Неопределено Тогда + Если ЗапрещенВводНесколькихЗначений(ВидКонтактнойИнформации, КонтактнаяИнформация) Тогда + Возврат; + КонецЕсли; + СтрокаКонтактнойИнформации = КонтактнаяИнформация.Добавить(); + КонецЕсли; + КонецЕсли; + + СтрокаКонтактнойИнформации.Представление = Представление; + СтрокаКонтактнойИнформации.ЗначенияПолей = ЗначенияПолей; + СтрокаКонтактнойИнформации.Вид = ВидКонтактнойИнформации; + СтрокаКонтактнойИнформации.Тип = ФорматКонтактнойИнформации.Тип; + Если ЗначениеЗаполнено(Дата) Тогда + СтрокаКонтактнойИнформации.ДействуетС = Дата; + КонецЕсли; + + ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(СтрокаКонтактнойИнформации.ЗначенияПолей, ВидКонтактнойИнформации); + ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, ОбъектКонтактнойИнформации, ФорматКонтактнойИнформации); + + Если Записывать Тогда + Объект.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Добавляет или изменяет контактную информацию для нескольких владельцев контактной информации. +// +// Параметры: +// КонтактнаяИнформация - ТаблицаЗначений - Таблица содержащая контактную информацию +// Описание колонок см. функцию НоваяКонтактнаяИнформация. +// Важно! Если в колонке Объект указана ссылка, то после добавления +// контактной информации владелец будет записан. +// В случае, если колонка Объект содержит объект владельца контактной информации, +// то для сохранения изменений объекты необходимо будет записать отдельно. +// Замещать - Булево - Если Истина(по умолчанию), то будет заменена вся +// вся контактная информация по переданном виду контактной информации. +// Если Ложь, то запись будет добавлена. Если вид контактной информации не разрешает +// ввод нескольких значений, а контактная информация объекта уже содержит запись, +// то запись не будет добавлена. +// +Процедура УстановитьКонтактнуюИнформациюОбъектов(КонтактнаяИнформация, Замещать = Истина) Экспорт + + Если КонтактнаяИнформация.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ВладельцыКонтактнойИнформации = Новый Соответствие; + Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл + ПараметрыКонтактнойИнформации = ВладельцыКонтактнойИнформации[СтрокаКонтактнойИнформации.Объект]; + Если ПараметрыКонтактнойИнформации = Неопределено Тогда + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(СтрокаКонтактнойИнформации.Объект)); + Если МетаданныеОбъекта = Неопределено + Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");; + КонецЕсли; + + ПараметрыКонтактнойИнформации = Новый Структура; + ЭтоСсылка = ОбщегоНазначения.ЗначениеСсылочногоТипа(СтрокаКонтактнойИнформации.Объект); + ПараметрыКонтактнойИнформации.Вставить("ЭтоСсылка", ЭтоСсылка); + ПараметрыКонтактнойИнформации.Вставить("Периодическая", МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено); + + ВладельцыКонтактнойИнформации.Вставить(СтрокаКонтактнойИнформации.Объект, ПараметрыКонтактнойИнформации); + КонецЕсли; + + ОбработатьСтрокуКонтактнойИнформации(СтрокаКонтактнойИнформации, ПараметрыКонтактнойИнформации.Периодическая); + + КонецЦикла; + + Для каждого ВладелецКонтактнойИнформации Из ВладельцыКонтактнойИнформации Цикл + Отбор = Новый Структура("Объект", ВладелецКонтактнойИнформации.Ключ); + СтрокиКонтактнойИнформацииОбъекта = КонтактнаяИнформация.НайтиСтроки(Отбор); + + Если ВладелецКонтактнойИнформации.Значение["ЭтоСсылка"] Тогда + Объект = ВладелецКонтактнойИнформации.Ключ.ПолучитьОбъект(); + Иначе + Объект = ВладелецКонтактнойИнформации.Ключ; + КонецЕсли; + + Если Замещать Тогда + Объект.КонтактнаяИнформация.Очистить(); + КонецЕсли; + + Для каждого КонтактнаяИнформацияОбъекта Из СтрокиКонтактнойИнформацииОбъекта Цикл + Если Замещать Тогда + Если ЗапрещенВводНесколькихЗначений(КонтактнаяИнформацияОбъекта.Вид, Объект.КонтактнаяИнформация) Тогда + Продолжить; + КонецЕсли; + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить(); + Иначе + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(КонтактнаяИнформацияОбъекта.ЗначенияПолей, "ЗначенияПолей"); + Если СтрокаКонтактнойИнформации = Неопределено Тогда + Если ЗапрещенВводНесколькихЗначений(КонтактнаяИнформацияОбъекта.Вид, Объект.КонтактнаяИнформация) Тогда + Продолжить; + КонецЕсли; + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить(); + КонецЕсли; + КонецЕсли; + + ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(КонтактнаяИнформацияОбъекта, ВладелецКонтактнойИнформации.Значение["Периодическая"], СтрокаКонтактнойИнформации); + КонецЦикла; + + Если ВладелецКонтактнойИнформации.Значение["ЭтоСсылка"] Тогда + Объект.Записать(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Добавляет или изменяет контактную информацию у владельца контактной информации. +// +// Параметры: +// СсылкаИлиОбъект - Произвольный - Ссылка или объект владельца содержащего контактную информацию. +// Для ссылки после добавления контактной информации владелец будет записан. +// Если передан объект, то контактная информация будет добавлена без записи. +// Для сохранения изменений объект необходимо будет записать отдельно. +// КонтактнаяИнформация - ТаблицаЗначений - Таблица, содержащая контактную информацию +// Описание колонок см. функцию НоваяКонтактнаяИнформация. +// Важно! Если передана пустая таблица значений и указан режим замещения, то +// произойдет очистка всей контактной информации владельца контактной информации. +// Замещать - Булево - Если Истина(по умолчанию), то будет заменена +// вся контактная информация по переданном виду контактной информации. +// Если Ложь, то запись будет добавлена. Если вид контактной информации +// не разрешает ввод нескольких значений, а контактная информация объекта +// уже содержит запись, то запись не будет добавлена. +// +Процедура УстановитьКонтактнуюИнформациюОбъекта(СсылкаИлиОбъект, Знач КонтактнаяИнформация, Замещать = Истина) Экспорт + + ЭтоСсылка = ОбщегоНазначения.ЗначениеСсылочногоТипа(СсылкаИлиОбъект); + Объект =?(ЭтоСсылка, СсылкаИлиОбъект.ПолучитьОбъект(), СсылкаИлиОбъект); + + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(СсылкаИлиОбъект)); + Если МетаданныеОбъекта = Неопределено + Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");; + КонецЕсли; + + Если КонтактнаяИнформация.Количество() = 0 Тогда + Если Замещать Тогда + Объект.КонтактнаяИнформация.Очистить(); + Если ЭтоСсылка Тогда + Объект.Записать(); + КонецЕсли; + КонецЕсли; + Возврат; + КонецЕсли; + + Периодическая = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено; + + Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл + ОбработатьСтрокуКонтактнойИнформации(СтрокаКонтактнойИнформации, Периодическая); + КонецЦикла; + + Если Замещать Тогда + Если Периодическая Тогда + Для каждого КонтактнаяИнформацияОбъекта Из КонтактнаяИнформация Цикл + НайденныеСтроки = НайтиСтрокиКонтактнойИнформации(КонтактнаяИнформацияОбъекта.Вид, КонтактнаяИнформацияОбъекта.Дата, Объект.КонтактнаяИнформация); + Для каждого Строка Из НайденныеСтроки Цикл + Объект.КонтактнаяИнформация.Удалить(Строка); + КонецЦикла; + КонецЦикла; + Иначе + Объект.КонтактнаяИнформация.Очистить(); + КонецЕсли; + КонецЕсли; + + Для каждого КонтактнаяИнформацияОбъекта Из КонтактнаяИнформация Цикл + Если Замещать Тогда + Если ЗапрещенВводНесколькихЗначений(КонтактнаяИнформацияОбъекта.Вид, Объект.КонтактнаяИнформация) Тогда + Продолжить; + КонецЕсли; + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить(); + Иначе + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(КонтактнаяИнформацияОбъекта.ЗначенияПолей, "ЗначенияПолей"); + Если СтрокаКонтактнойИнформации = Неопределено Тогда + Если ЗапрещенВводНесколькихЗначений(КонтактнаяИнформацияОбъекта.Вид, КонтактнаяИнформация) Тогда + Продолжить; + КонецЕсли; + СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить(); + КонецЕсли; + КонецЕсли; + + ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(КонтактнаяИнформацияОбъекта, Периодическая, СтрокаКонтактнойИнформации); + + КонецЦикла; + + Если ЭтоСсылка Тогда + Объект.Записать(); + КонецЕсли; + + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Работа с контактной информацией из других подсистем. + +// Преобразует все входящие форматы контактной информации в XML. +// +// Параметры: +// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - Описание полей контактной информации. +// Представление - Строка - Представление контактной информации. Используется, если невозможно определить +// представление из параметра ЗначенияПолей (например, отсутствует поле "Представление"). +// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации - +// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. +// +// Возвращаемое значение: +// Строка - Контактная информация в виде XML советующего структуре XDTO пакетов КонтактнаяИнформация и Адрес. +// +Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйВид = Неопределено) Экспорт + + Результат = УправлениеКонтактнойИнформациейСлужебный.ПривестиКонтактнуюИнформациюXML(Новый Структура( + "ЗначенияПолей, Представление, ВидКонтактнойИнформации", + ЗначенияПолей, Представление, ОжидаемыйВид)); + Возврат Результат.ДанныеXML; + +КонецФункции + +// Возвращает тип контактной информации. +// +// Параметры: +// XMLСтрока - Строка - Контактная информация в виде XML советующего структуре XDTO пакетов КонтактнаяИнформация и Адрес. +// +// Возвращаемое значение: +// ПеречислениеСсылка.ТипыКонтактнойИнформации - соответствующий тип. +// +Функция ТипКонтактнойИнформации(Знач XMLСтрока) Экспорт + Возврат УправлениеКонтактнойИнформациейСлужебный.ТипКонтактнойИнформации(XMLСтрока); +КонецФункции + +// Преобразует представление контактной информации в XML строку соответствующую структуре +// XDTO пакетам КонтактнаяИнформация и Адрес. +// Для адресов, введенных в свободной форме, корректное преобразование не гарантируется. +// +// Параметры: +// Представление - Строка - Строковое представление контактной информации, выводимое пользователю. +// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, +// Структура - Вид или тип контактной информации. +// +// Возвращаемое значение: +// Строка - Контактная информация в виде XML советующего структуре XDTO пакетов КонтактнаяИнформация и Адрес. +// +Функция КонтактнаяИнформацияXMLПоПредставлению(Представление, ОжидаемыйВид) Экспорт + + Возврат УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML( + УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ОжидаемыйВид)); + +КонецФункции + +// Возвращает представление контактной информации (адреса, телефона, электронной почты и т.п.). +// +// Параметры: +// XMLСтрока - Строка, ОбъектXDTO - Строка XML или объект XDTO соответствующие XDTO пакетам +// КонтактнаяИнформация или Адрес. +// ВидКонтактнойИнформации - Структура - Дополнительные параметры, влияющие на формирование представления адреса: +// * ВключатьСтрануВПредставление - Булево - В представление будет включена страна адреса; +// * ФорматАдреса - Строка - Варианты "ФИАС" или "КЛАДР". +// Если указано "КЛАДР", то в представление адреса +// не включаются значения уровней округ и внутригородской район. +// +// Возвращаемое значение: +// Строка - Представление контактной информации. +// +Функция ПредставлениеКонтактнойИнформации(Знач XMLСтрока, Знач ВидКонтактнойИнформации = Неопределено) Экспорт + + Возврат УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(XMLСтрока, ВидКонтактнойИнформации); + +КонецФункции + +// Возвращает комментарий контактной информации. +// +// Параметры: +// XMLСтрока - ОбъектXDTO, Строка - Строка XML или объект XDTO соответствующие XDTO пакетам +// КонтактнаяИнформация или Адрес. +// +// Возвращаемое значение: +// Строка - Комментарий контактной информации или пустая строка, +// если значение параметра XMLСтрока не является контактной информацией. +// +Функция КомментарийКонтактнойИнформации(XMLСтрока) Экспорт + + ЭтоСтрока = ТипЗнч(XMLСтрока) = Тип("Строка"); + Если ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XMLСтрока) Тогда + // Предыдущий формат значений полей, комментарий отсутствует. + Возврат ""; + КонецЕсли; + + ОбъектXDTO = ?(ЭтоСтрока, УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(XMLСтрока), XMLСтрока); + Возврат ОбъектXDTO.Комментарий; + +КонецФункции + +// Устанавливает новый комментарий для контактной информации. +// +// Параметры: +// XMLСтрока - ОбъектXDTO, Строка - Строка XML или объект XDTO соответствующие XDTO пакетам +// КонтактнаяИнформация или Адрес. +// Комментарий - Строка - Новое значение комментария. +// +Процедура УстановитьКомментарийКонтактнойИнформации(XMLСтрока, Знач Комментарий) Экспорт + + ЭтоСтрока = ТипЗнч(XMLСтрока) = Тип("Строка"); + Если ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XMLСтрока) Тогда + // Предыдущий формат значений полей, комментарий отсутствует. + Возврат; + КонецЕсли; + + ОбъектXDTO = ?(ЭтоСтрока, УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(XMLСтрока), XMLСтрока); + ОбъектXDTO.Комментарий = Комментарий; + Если ЭтоСтрока Тогда + XMLСтрока = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO); + КонецЕсли; + +КонецПроцедуры + +// Возвращает информацию о стране адреса. +// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. +// Если передана пустая строка, то возвращается пустая структура. +// Если страна не найдена в справочнике, но найдена в классификаторе ОКСМ, то поле "Ссылка" результата не будет заполнена. +// Если страна не найдена ни в адресе, ни в классификаторе ОКСМ, то будет заполнено только поле "Наименование". +// +// Параметры: +// XMLСтрока - Строка - Строка XML соответствующая XDTO пакетам КонтактнаяИнформация или Адрес. +// +// Возвращаемое значение: +// Структура - Описание страны адреса. Содержит поля: +// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - Ссылка на элемент справочника страны мира. +// * Наименование - Строка - Наименование страны. +// * Код - Строка - Код страны. +// * НаименованиеПолное - Строка - Полное наименование страны. +// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2. +// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3. +// +Функция СтранаАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + + Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); + Если ПустаяСтрока(XMLСтрока) Тогда + Возврат Результат; + КонецЕсли; + + // Читаем наименование страны + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLСтрока); + XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Адрес = XDTOАдрес.Состав; + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить страну, ожидается адрес.'"); + КонецЕсли; + + Результат.Наименование = СокрЛП(Адрес.Страна); + ДанныеСтраны = ДанныеСтраныМира(, Результат.Наименование); + Возврат ?(ДанныеСтраны = Неопределено, Результат, ДанныеСтраны); +КонецФункции + +// Возвращает домен сетевого адреса для веб-ссылки или адреса электронной почты. +// +// Параметры: +// XMLСтрока - Строка - Строка XML контактной информации соответствующая XDTO пакету КонтактнаяИнформация. +// +// Возвращаемое значение: +// Строка - Домен адреса. +// +Функция ДоменАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + Если ПустаяСтрока(XMLСтрока) Тогда + Возврат ""; + КонецЕсли; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLСтрока); + XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Состав = XDTOАдрес.Состав; + Если Состав <> Неопределено Тогда + Тип = Состав.Тип(); + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда + ДоменАдреса = СокрЛП(Состав.Значение); + Позиция = СтрНайти(ДоменАдреса, "://"); + Если Позиция > 0 Тогда + ДоменАдреса = Сред(ДоменАдреса, Позиция + 3); + КонецЕсли; + Позиция = СтрНайти(ДоменАдреса, "/"); + Возврат ?(Позиция = 0, ДоменАдреса, Лев(ДоменАдреса, Позиция - 1)); + + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда + ДоменАдреса = СокрЛП(Состав.Значение); + Позиция = СтрНайти(ДоменАдреса, "@"); + Возврат ?(Позиция = 0, ДоменАдреса, Сред(ДоменАдреса, Позиция + 1)); + + КонецЕсли; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Невозможно определить домен, ожидается электронная почта или веб-ссылка.'"); +КонецФункции + +// Возвращает строку с номером телефона без кода и дополнительного номера. +// +// Параметры: +// XMLСтрока - Строка - Строка XML контактной информации соответствующая XDTO пакету КонтактнаяИнформация. +// +// Возвращаемое значение: +// Строка - Номер телефона. +// +Функция НомерТелефонаКонтактнойИнформации(Знач XMLСтрока) Экспорт + Если ПустаяСтрока(XMLСтрока) Тогда + Возврат ""; + КонецЕсли; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XMLСтрока); + XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Состав = XDTOАдрес.Состав; + Если Состав <> Неопределено Тогда + Тип = Состав.Тип(); + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + Возврат СокрЛП(Состав.Номер); + + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда + Возврат СокрЛП(Состав.Номер); + + КонецЕсли; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Невозможно определить номер, ожидается телефона или факс.'"); +КонецФункции + +// Сравнивает два экземпляра контактной информации. +// +// Параметры: +// Данные1 - ОбъектXTDO - Объект с контактной информацией. +// - Строка - Контактная информация в формате XML. +// - Структура - Описание контактной информацию. Ожидаются поля: +// * ЗначенияПолей - Строка, Структура, СписокЗначений, Соответствие - поля контактной информации. +// * Представление - Строка - Представление. Используется в случае, если не удалось вычислить +// представление из ЗначенияПолей (отсутствие в них поля Представление). +// * Комментарий - Строка - комментарий. Используется в случае, если не удалось вычислить комментарий +// из ЗначенияПолей. +// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, +// ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура - +// Используется в случае, если не удалось вычислить тип из ЗначенияПолей. +// Данные2 - ОбъектXTDO, Строка, Структура - аналогично Данные1. +// +// Возвращаемое значение: +// ТаблицаЗначений: - таблица отличающихся полей со следующими колонками: +// * Путь - Строка - XPath, идентифицирующий различающееся значение. Значение "ТипКонтактнойИнформации" +// означает, что переданные экземпляры контактной информации различаются типом. +// * Описание - Строка - описание отличающегося реквизита в терминах предметной области. +// * Значение1 - Строка - значение, соответствующая объекту, переданному в параметре Данные1. +// * Значение2 - Строка - значение, соответствующая объекту, переданному в параметре Данные2. +// +Функция РазличияКонтактнойИнформации(Знач Данные1, Знач Данные2) Экспорт + Возврат УправлениеКонтактнойИнформациейСлужебный.РазличияКонтактнойИнформации(Данные1, Данные2); +КонецФункции + +// Создает временную таблицу с контактной информацией нескольких объектов. +// +// Параметры: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - В менеджере создается временная таблица +// ВТКонтактнаяИнформация с полями: +// * Объект - Ссылка - владелец контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес. +// * Представление - Строка - Представление контактной информации. +// МассивОбъектов - Массив - Владельцы контактной информации. +// ТипыКонтактнойИнформации - Массив - Если указаны, то временная таблица будет содержать только контактную +// информацию этих типов. +// ВидыКонтактнойИнформации - Массив - Если указаны, то временная таблица будет содержать только контактную +// информацию этих видов. +// Дата - Дата - Дата, с которой действует запись контактной информации, используется при +// хранении истории изменения контактной информации. Если владелец хранит историю +// изменений, то при несоответствии параметра дате будет вызвано исключение. +// +Процедура СоздатьВТКонтактнаяИнформация(МенеджерВременныхТаблиц, МассивОбъектов, ТипыКонтактнойИнформации = Неопределено, ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт + + Если ТипЗнч(МассивОбъектов) <> Тип("Массив") ИЛИ МассивОбъектов.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Неверное значение для массива владельцев контактной информации.'"); + КонецЕсли; + + ОбъектыСГруппировкойПоТипам = Новый Соответствие; + Для каждого Ссылка Из МассивОбъектов Цикл + ТипОбъекта = ТипЗнч(Ссылка); + НайденныйОбъект = ОбъектыСГруппировкойПоТипам.Получить(ТипОбъекта); + Если НайденныйОбъект = Неопределено Тогда + НаборСсылок = Новый Массив; + НаборСсылок.Добавить(Ссылка); + ОбъектыСГруппировкойПоТипам.Вставить(ТипОбъекта, НаборСсылок); + Иначе + НайденныйОбъект.Добавить(Ссылка); + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос(); + ТекстЗапросаПодготовкаДанных = ""; + ЕстьКонтактнаяИнформацияСДатой = Ложь; + СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ "; + СтрокаВременнойТаблицы = "ПОМЕСТИТЬ ВТКонтактнаяИнформация"; + + Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); + Если МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда + ВызватьИсключение МетаданныеОбъекта.Имя + " " + НСтр("ru = 'не содержит контактную информацию.'"); + КонецЕсли; + ИмяТаблицы = МетаданныеОбъекта.Имя; + Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда + ТекстЗапросаПодготовкаДанных = ТекстЗапросаПодготовкаДанных + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КонтактнаяИнформация.Ссылка КАК Объект, + | КонтактнаяИнформация.Вид КАК Вид, + | МАКСИМУМ(КонтактнаяИнформация.ДействуетС) КАК ДействуетС + |ПОМЕСТИТЬ СрезКонтактнойИнформации" + ИмяТаблицы + " + |ИЗ + | " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация + |ГДЕ + | КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") + | И КонтактнаяИнформация.ДействуетС <= &ДействуетС + | И КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) + | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) + | + |СГРУППИРОВАТЬ ПО + | КонтактнаяИнформация.Вид, КонтактнаяИнформация.Ссылка + |;" + КонецЕсли; + КонецЦикла; + + ТекстЗапроса = ""; + Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл + ТекстЗапроса = ТекстЗапроса + ?(НЕ ПустаяСтрока(ТекстЗапроса), Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС, ""); + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); + ИмяТаблицы = МетаданныеОбъекта.Имя; + + Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда + Если ТипЗнч(Дата) <> Тип("Дата") Тогда + ВызватьИсключение НСтр("ru = 'Для получения контактной информации, хранящей историю изменений, + |требуется указывать дату, с которой действует запись контактной информации.'"); + КонецЕсли; + + УсловияОтбора = ?(ВидыКонтактнойИнформации = Неопределено, "", " КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)"); + Если ПустаяСтрока(УсловияОтбора) Тогда + УсловиеИ = ""; + Иначе + УсловиеИ = " И "; + КонецЕсли; + УсловияОтбора = УсловияОтбора + ?(ТипыКонтактнойИнформации = Неопределено, "", УсловиеИ + " КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)"); + Если НЕ ПустаяСтрока(УсловияОтбора) Тогда + УсловияОтбора = " ГДЕ " + УсловияОтбора; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " + | КонтактнаяИнформация.Ссылка КАК Объект, + | КонтактнаяИнформация.Вид КАК Вид, + | КонтактнаяИнформация.Тип КАК Тип, + | КонтактнаяИнформация.ДействуетС КАК ДействуетС, + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.ЗначенияПолей + | " + СтрокаВременнойТаблицы + " + |ИЗ + | СрезКонтактнойИнформации" + ИмяТаблицы + " КАК СрезКонтактнойИнформации + | ЛЕВОЕ СОЕДИНЕНИЕ " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация + | ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид + | И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС + | И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка " + УсловияОтбора; + Иначе + ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " + | КонтактнаяИнформация.Ссылка КАК Объект, + | КонтактнаяИнформация.Вид КАК Вид, + | КонтактнаяИнформация.Тип КАК Тип, + | ДАТАВРЕМЯ(1,1,1) КАК ДействуетС, + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей + | " + СтрокаВременнойТаблицы + " + |ИЗ + | " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация + |ГДЕ + | КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) + | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) + | И КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") + | " + ?(ТипыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)") + " + | " + ?(ВидыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)") + " + |"; + КонецЕсли; + СтрокаРАЗРЕШЕННЫЕ =""; + СтрокаВременнойТаблицы = ""; + + Запрос.УстановитьПараметр("МассивОбъектов" + ИмяТаблицы, ОбъектСКонтактнойИнформацией.Значение); + КонецЦикла; + + Запрос.Текст = ТекстЗапросаПодготовкаДанных + ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Запрос.УстановитьПараметр("ДействуетС", Дата); + Запрос.УстановитьПараметр("ТипыКонтактнойИнформации", ТипыКонтактнойИнформации); + Запрос.УстановитьПараметр("ВидыКонтактнойИнформации", ВидыКонтактнойИнформации); + Запрос.Выполнить(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Страны мира + +// Возвращает данные о стране по справочнику стран мира или классификатору ОКСМ. +// +// Параметры: +// КодСтраны - Строка, Число - Код страны по классификатору ОКСМ. Если не указано, то поиск по коду не производится. +// Наименование - Строка - Наименование страны. Если не указано, то поиск по наименованию не производится. +// +// Возвращаемое значение: +// Структура - описание страны. Содержит поля: +// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - Соответствующий элемент страны мира. +// * Наименование - Строка - Наименование страны. +// * Код - Строка - Код страны. +// * НаименованиеПолное - Строка - Полное наименование страны. +// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2. +// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3. +// Неопределено - страна не найдена ни в адресе, ни в классификаторе ОКСМ. +// +Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт + Результат = Неопределено; + + Если КодСтраны = Неопределено И Наименование = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + НормализованныйКод = КодСтраныМира(КодСтраны); + Если КодСтраны = Неопределено Тогда + УсловиеПоиска = "ИСТИНА"; + ФильтрКлассификатора = Новый Структура; + Иначе + УсловиеПоиска = "Код=" + КонтрольКавычекВСтроке(НормализованныйКод); + ФильтрКлассификатора = Новый Структура("Код", НормализованныйКод); + КонецЕсли; + + Если Наименование<>Неопределено Тогда + УсловиеПоиска = УсловиеПоиска + " И Наименование=" + КонтрольКавычекВСтроке(Наименование); + ФильтрКлассификатора.Вставить("Наименование", Наименование); + КонецЕсли; + + Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); + + Запрос = Новый Запрос(" + |ВЫБРАТЬ ПЕРВЫЕ 1 + | Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3 + |ИЗ + | Справочник.СтраныМира + |ГДЕ + | " + УсловиеПоиска + " + |УПОРЯДОЧИТЬ ПО + | Наименование + |"); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ЗаполнитьЗначенияСвойств(Результат, Выборка); + Иначе + ДанныеКлассификатора = ТаблицаКлассификатора(); + СтрокиДанных = ДанныеКлассификатора.НайтиСтроки(ФильтрКлассификатора); + Если СтрокиДанных.Количество()=0 Тогда + Результат = Неопределено; + Иначе + ЗаполнитьЗначенияСвойств(Результат, СтрокиДанных[0]); + КонецЕсли; + + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает данные страны по коду. +// +// Параметры: +// Код - Строка, Число - Код ОКСМ страны. +// ТипКода - Строка - Варианты: КодСтраны (по умолчанию), Альфа2, Альфа3. +// +// Возвращаемое значение: +// Структура - описание страны. Содержит поля: +// * Наименование - Строка - Наименование страны. +// * Код - Строка - Код страны. +// * НаименованиеПолное - Строка - Полное наименование страны. +// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2. +// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3. +// Неопределено - страна не найдена ни в адресе, ни в классификаторе ОКСМ. +// +Функция ДанныеКлассификатораСтранМираПоКоду(Знач Код, Знач ТипКода = "КодСтраны") Экспорт + + ДанныеКлассификатора = ТаблицаКлассификатора(); + Если СтрСравнить(ТипКода, "Альфа2") = 0 Тогда + СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа2"); + ИначеЕсли СтрСравнить(ТипКода, "Альфа3") = 0 Тогда + СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа3"); + Иначе + СтрокаДанных = ДанныеКлассификатора.Найти(КодСтраныМира(Код), "Код"); + КонецЕсли; + + Если СтрокаДанных=Неопределено Тогда + Результат = Неопределено; + Иначе + Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); + ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает данные о стране по наименованию страны. +// +// Параметры: +// Наименование - Строка - Наименование страны. +// +// Возвращаемое значение: +// Структура - Описание страны. Содержит поля: +// * Наименование - Строка - Наименование страны. +// * Код - Строка - Код страны. +// * НаименованиеПолное - Строка - Полное наименование страны. +// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2. +// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3. +// Неопределено - Страна не найдена в классификаторе. +// +Функция ДанныеКлассификатораСтранМираПоНаименованию(Знач Наименование) Экспорт + ДанныеКлассификатора = ТаблицаКлассификатора(); + СтрокаДанных = ДанныеКлассификатора.Найти(Наименование, "Наименование"); + Если СтрокаДанных=Неопределено Тогда + Результат = Неопределено; + Иначе + Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); + ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает ссылку на элемент справочника страны мира по коду или наименованию. +// Если элемент справочника СтраныМиры не найден, то он будет создан на основании данных заполнения. +// +// Параметры: +// КодИлиНаименование - Строка - Код страны, код альфа2, код альфа3 или наименование страны. +// ДанныеЗаполнения - Структура - Необязательный. Данные для заполнения в случае создания нового элемента. +// Ключи структуры соответствуют реквизитам справочника СтраныМира. +// +// Возвращаемое значение: +// СправочникСсылка.СтраныМира - Ссылка на элемент справочника СтраныМиры. +// Если найдено несколько значений, то будет возвращено первое. +// Если ничего не найдено, данные заполнения не указаны, то возвращается пустая ссылка. +// +Функция СтранаМираПоКодуИлиНаименованию(КодИлиНаименование, ДанныеЗаполнения = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СтраныМира.Ссылка КАК Ссылка + |ИЗ + | Справочник.СтраныМира КАК СтраныМира + |ГДЕ + | (СтраныМира.Код = &КодИлиНаименование + | ИЛИ СтраныМира.КодАльфа2 = &КодИлиНаименование + | ИЛИ СтраныМира.КодАльфа3 = &КодИлиНаименование + | ИЛИ СтраныМира.Наименование = &КодИлиНаименование + | ИЛИ СтраныМира.НаименованиеПолное = &КодИлиНаименование)"; + + Запрос.УстановитьПараметр("КодИлиНаименование", КодИлиНаименование); + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + + Если РезультатЗапроса.Следующий() Тогда + Возврат РезультатЗапроса.Ссылка; + КонецЕсли; + + ДанныеКлассификатора = ТаблицаКлассификатора(); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ТаблицаКлассификатор.Код, + | ТаблицаКлассификатор.КодАльфа2, + | ТаблицаКлассификатор.КодАльфа3, + | ТаблицаКлассификатор.Наименование, + | ТаблицаКлассификатор.НаименованиеПолное, + | ТаблицаКлассификатор.Неактуальный + |ПОМЕСТИТЬ ТаблицаКлассификатор + |ИЗ + | &ТаблицаКлассификатор КАК ТаблицаКлассификатор + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтранаМира.Код, + | СтранаМира.КодАльфа2, + | СтранаМира.КодАльфа3, + | СтранаМира.Наименование, + | СтранаМира.НаименованиеПолное, + | СтранаМира.Неактуальный + |ИЗ + | ТаблицаКлассификатор КАК СтранаМира + |ГДЕ + | (СтранаМира.Код = &КодИлиНаименование + | ИЛИ СтранаМира.КодАльфа2 = &КодИлиНаименование + | ИЛИ СтранаМира.КодАльфа3 = &КодИлиНаименование + | ИЛИ СтранаМира.Наименование = &КодИлиНаименование + | ИЛИ СтранаМира.НаименованиеПолное = &КодИлиНаименование)"; + + Запрос.УстановитьПараметр("ТаблицаКлассификатор", ДанныеКлассификатора); + Запрос.УстановитьПараметр("КодИлиНаименование", КодИлиНаименование); + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + + Если РезультатЗапроса.Следующий() Тогда + ДанныеЗаполнения = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(РезультатЗапроса); + КонецЕсли; + + Если ДанныеЗаполнения = Неопределено + ИЛИ НЕ ДанныеЗаполнения.Свойство("Наименование") + ИЛИ ПустаяСтрока(ДанныеЗаполнения.Наименование) Тогда + Возврат Справочники.СтраныМира.ПустаяСсылка(); + КонецЕсли; + + ОбъектСтраны = Справочники.СтраныМира.СоздатьЭлемент(); + ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДанныеЗаполнения); + ОбъектСтраны.Записать(); + Возврат ОбъектСтраны.Ссылка; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы и модуля объекта вызываемые при внедрении подсистемы. // Обработчик для события формы ПриСозданииНаСервере. // Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы. // // Параметры: -// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной. -// Информации. +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации. // Объект - Произвольный - Объект-владелец контактной информации. Если это ссылка, то контактная информация // будет получена из объекта по ссылке, иначе из таблицы КонтактнаяИнформация объекта. -// ИмяЭлементаДляРазмещения - Строка - группа, куда будут размещены элементы контактной информации. -// ПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Может принимать значения. +// ДополнительныеПараметры - Структура - Описание настроек контактной информации - см. ПараметрыКонтактнойИнформации. +// Предыдущие название параметра ИмяЭлементаДляРазмещения. Устарел, следует +// использовать ДополнительныеПараметры. Группа, куда будут размещены элементы +// контактной информации. +// УдалитьПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Устарел, следует использовать ДополнительныеПараметры. +// Может принимать значения: // ПоложениеЗаголовкаЭлементаФормы.Верх или // ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию). +// УдалитьИсключаемыеВиды - Массив - Устарел,следует использовать ДополнительныеПараметры. +// УдалитьОтложеннаяИнициализация - Массив - Устарел,следует использовать ДополнительныеПараметры. // -Процедура ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация", ПоложениеЗаголовкаКИ = "", - Знач ИсключаемыеВиды = Неопределено, ОтложеннаяИнициализация = Ложь) Экспорт +Процедура ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры = Неопределено, УдалитьПоложениеЗаголовкаКИ = "", + Знач УдалитьИсключаемыеВиды = Неопределено, УдалитьОтложеннаяИнициализация = Ложь) Экспорт + + ТипПомещения = Неопределено; + + Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + + ДополнительныеПараметры.Свойство("ТипПомещения", ТипПомещения); + ОтложеннаяИнициализация = ?(ДополнительныеПараметры.Свойство("ОтложеннаяИнициализация"), ДополнительныеПараметры.ОтложеннаяИнициализация, Ложь); + ПоложениеЗаголовкаКИ = ?(ДополнительныеПараметры.Свойство("ПоложениеЗаголовкаКИ"), ДополнительныеПараметры.ПоложениеЗаголовкаКИ, ""); + ИсключаемыеВиды = ?(ДополнительныеПараметры.Свойство("ИсключаемыеВиды"), ДополнительныеПараметры.ИсключаемыеВиды, Неопределено); + ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения"), ДополнительныеПараметры.ИмяЭлементаДляРазмещения, "ГруппаКонтактнаяИнформация"); + Иначе + ИмяЭлементаДляРазмещения =?(ДополнительныеПараметры = Неопределено, "ГруппаКонтактнаяИнформация", ДополнительныеПараметры); + ОтложеннаяИнициализация = УдалитьОтложеннаяИнициализация; + ИсключаемыеВиды = УдалитьИсключаемыеВиды; + ПоложениеЗаголовкаКИ = УдалитьПоложениеЗаголовкаКИ; + КонецЕсли; Если ИсключаемыеВиды = Неопределено Тогда ИсключаемыеВиды = Новый Массив; @@ -52,8 +1144,8 @@ КонецЕсли; КонецЦикла; - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, - ОтложеннаяИнициализация, ИсключаемыеВиды); + ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, + ОтложеннаяИнициализация, ИсключаемыеВиды); ПараметрыКонтактнойИнформации.ДобавленныеРеквизиты = ДобавленныеРеквизиты; ПараметрыКонтактнойИнформации.Владелец = СсылкаНаОбъект; @@ -87,7 +1179,7 @@ ПоляКонтактнойИнформации = ""; Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти", - "ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти"); + "ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти"); КонецЕсли; Если ЕстьКолонкаДействуетС Тогда @@ -127,7 +1219,7 @@ КонецЕсли; КонецЦикла; ТекстЗапросаИсторическаяИнформация = " КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация КАК ЭтоИсторическаяКонтактнаяИнформация, - | КонтактнаяИнформация.ДействуетС КАК ДействуетС,"; + | КонтактнаяИнформация.ДействуетС КАК ДействуетС,"; Иначе ТекстЗапросаИсторическаяИнформация = "ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация,0 КАК ДействуетС, "; КонецЕсли; @@ -184,7 +1276,7 @@ Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти", - "ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти"); + "ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти"); КонецЕсли; Запрос = Новый Запрос(ТекстЗапроса); @@ -230,10 +1322,10 @@ Если ТекущийВид <> ПредыдущийВид Тогда ИмяРеквизита = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1%2%3%4", - "КонтактнаяИнформацияПоле", - ИмяТабличнойЧасти, - СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x"), - ОбъектКонтактнойИнформации.Строки.Индекс(СтрокаКИ)); + "КонтактнаяИнформацияПоле", + ИмяТабличнойЧасти, + СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x"), + ОбъектКонтактнойИнформации.Строки.Индекс(СтрокаКИ)); ПутьРеквизитов = "Объект." + ИмяТабличнойЧасти; @@ -263,9 +1355,9 @@ Если Индекс = Неопределено Тогда ИмяРеквизита = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1%2%3", - "КонтактнаяИнформацияПоле", - СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x"), - ПорядковыйНомер); + "КонтактнаяИнформацияПоле", + СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x"), + ПорядковыйНомер); ОбъектКонтактнойИнформации.ИмяРеквизита = ИмяРеквизита; Если Не ОтложеннаяИнициализация Тогда @@ -295,9 +1387,10 @@ Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецЕсли; - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, - ОтложеннаяИнициализация, ИсключаемыеВиды); + ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, + ОтложеннаяИнициализация, ИсключаемыеВиды); ПараметрыКонтактнойИнформации.Владелец = СсылкаНаОбъект; + ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения = ТипПомещения; ПредыдущийВид = Неопределено; @@ -315,7 +1408,7 @@ Если СтрокаКИ.ЭтоРеквизитТабличнойЧасти Тогда - ИмяВидаКИ = ОбщегоНазначения.ИмяПредопределенного(СтрокаКИ.Вид); + ИмяВидаКИ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаКИ.Вид, "ИмяПредопределенныхДанных"); Поз = СтрНайти(ИмяВидаКИ, ИмяОбъекта); ИмяТабличнойЧасти = Сред(ИмяВидаКИ, Поз + СтрДлина(ИмяОбъекта)); @@ -349,7 +1442,7 @@ КонецЕсли; Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].ДобавленныеЭлементы.Добавить(СтрокаТабличнойЧастиКИ.ИмяРеквизита, - 2, Ложь); + 2, Ложь); ДобавитьРеквизитВОписание(Форма, СтрокаТабличнойЧастиКИ, Ложь, Истина,, ИмяЭлементаДляРазмещения); ПредыдущийВидТЧ = ВидТЧ; @@ -393,7 +1486,7 @@ Иначе СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0, Неопределено, - ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ)); + ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ)); Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда ДобавитьСтрокуКонтактнойИнформации(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, КоличествоАдресов, СледующаяСтрока); @@ -407,6 +1500,8 @@ КонецЦикла; + ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения); + Если Не ОтложеннаяИнициализация И Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Количество() > 0 Тогда Описание = НСтр("ru = 'Добавить дополнительное поле контактной информации'"); @@ -435,23 +1530,23 @@ Если ОтложеннаяИнициализация И ГруппаДляРазмещения.Вид = ВидГруппыФормы.Страница И Форма.Элементы.Найти("КонтактнаяИнформацияЗаглушка") = Неопределено Тогда - ГруппаСтраниц = ГруппаДляРазмещения.Родитель; - ЗаголовокСтраницы = ?(ЗначениеЗаполнено(ГруппаДляРазмещения.Заголовок), ГруппаДляРазмещения.Заголовок, ГруппаДляРазмещения.Имя); - ЗаголовокГруппыСтраниц = ?(ЗначениеЗаполнено(ГруппаСтраниц.Заголовок), ГруппаСтраниц.Заголовок, ГруппаСтраниц.Имя); - - ПредупреждениеОРазмещении = НСтр("ru = 'Для отображения контактной информации необходимо разместить группу ""%1"" не первым элементом (после любой другой группы) в группе ""%2"" (меню Еще - Изменить форму).'"); - ПредупреждениеОРазмещении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредупреждениеОРазмещении, - ЗаголовокСтраницы, ЗаголовокГруппыСтраниц); - ТекстПодсказки = НСтр("ru = 'Также можно установить стандартные настройки формы: - | • в меню Еще выбрать пункт Изменить форму...; - | • в открывшейся форме ""Настройка формы"" в меню Еще выбрать пункт ""Установить стандартные настройки"".'"); - - Декорация = Форма.Элементы.Добавить("КонтактнаяИнформацияЗаглушка", Тип("ДекорацияФормы"), ГруппаДляРазмещения); - Декорация.Заголовок = ПредупреждениеОРазмещении; - Декорация.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; - Декорация.Подсказка = ТекстПодсказки; - Декорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст; - Декорация.АвтоМаксимальнаяВысота = Ложь; + ГруппаСтраниц = ГруппаДляРазмещения.Родитель; + ЗаголовокСтраницы = ?(ЗначениеЗаполнено(ГруппаДляРазмещения.Заголовок), ГруппаДляРазмещения.Заголовок, ГруппаДляРазмещения.Имя); + ЗаголовокГруппыСтраниц = ?(ЗначениеЗаполнено(ГруппаСтраниц.Заголовок), ГруппаСтраниц.Заголовок, ГруппаСтраниц.Имя); + + ПредупреждениеОРазмещении = НСтр("ru = 'Для отображения контактной информации необходимо разместить группу ""%1"" не первым элементом (после любой другой группы) в группе ""%2"" (меню Еще - Изменить форму).'"); + ПредупреждениеОРазмещении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредупреждениеОРазмещении, + ЗаголовокСтраницы, ЗаголовокГруппыСтраниц); + ТекстПодсказки = НСтр("ru = 'Также можно установить стандартные настройки формы: + | • в меню Еще выбрать пункт Изменить форму...; + | • в открывшейся форме ""Настройка формы"" в меню Еще выбрать пункт ""Установить стандартные настройки"".'"); + + Декорация = Форма.Элементы.Добавить("КонтактнаяИнформацияЗаглушка", Тип("ДекорацияФормы"), ГруппаДляРазмещения); + Декорация.Заголовок = ПредупреждениеОРазмещении; + Декорация.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + Декорация.Подсказка = ТекстПодсказки; + Декорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст; + Декорация.АвтоМаксимальнаяВысота = Ложь; КонецЕсли; КонецЕсли; @@ -523,7 +1618,7 @@ МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧасти + "." + РеквизитФормы.ИмяРеквизита + "ЗначенияПолей"); ИначеЕсли НЕ РеквизитФормы.Свойство("ЭтоИсторическаяКонтактнаяИнформация") - ИЛИ НЕ РеквизитФормы.ЭтоИсторическаяКонтактнаяИнформация Тогда + ИЛИ НЕ РеквизитФормы.ЭтоИсторическаяКонтактнаяИнформация Тогда Индекс = СтатическиеРеквизиты.Найти(РеквизитФормы.Вид); @@ -566,25 +1661,25 @@ ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(СтрокиТабличнойЧасти, ИмяОбъекта); Для Каждого СтрокаТаблицы Из СтрокиТабличнойЧасти Цикл - ВидИнформации = СтрокаТаблицы.Вид; - ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита; - ТабличнаяЧастьФормы = Форма.Объект[ИменаТабличныхЧастейПоВидамКИ[ВидИнформации]]; + ВидИнформации = СтрокаТаблицы.Вид; + ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита; + ТабличнаяЧастьФормы = Форма.Объект[ИменаТабличныхЧастейПоВидамКИ[ВидИнформации]]; + + Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл - Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл + Отбор = Новый Структура; + Отбор.Вставить("Вид", ВидИнформации); + Отбор.Вставить("ИдентификаторСтрокиТабличнойЧасти", СтрокаТабличнойЧастиФормы.ИдентификаторСтрокиТабличнойЧасти); + НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор); + + Если НайденныеСтроки.Количество() = 1 Тогда - Отбор = Новый Структура; - Отбор.Вставить("Вид", ВидИнформации); - Отбор.Вставить("ИдентификаторСтрокиТабличнойЧасти", СтрокаТабличнойЧастиФормы.ИдентификаторСтрокиТабличнойЧасти); - НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор); + СтрокаКИ = НайденныеСтроки[0]; + СтрокаТабличнойЧастиФормы[ИмяРеквизита] = СтрокаКИ.Представление; + СтрокаТабличнойЧастиФормы[ИмяРеквизита + "ЗначенияПолей"] = СтрокаКИ.ЗначенияПолей; - Если НайденныеСтроки.Количество() = 1 Тогда - - СтрокаКИ = НайденныеСтроки[0]; - СтрокаТабличнойЧастиФормы[ИмяРеквизита] = СтрокаКИ.Представление; - СтрокаТабличнойЧастиФормы[ИмяРеквизита + "ЗначенияПолей"] = СтрокаКИ.ЗначенияПолей; - - КонецЕсли; - КонецЦикла; + КонецЕсли; + КонецЦикла; КонецЦикла; КонецПроцедуры @@ -595,6 +1690,7 @@ // Параметры: // Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации. // Объект - Произвольный - Объект-владелец контактной информации. +// Отказ - Булево - Если Истина, то во время проверки были обнаружены ошибки. // Процедура ОбработкаПроверкиЗаполненияНаСервере(Форма, Объект, Отказ) Экспорт @@ -620,7 +1716,7 @@ ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта); КонецЕсли; - ИмяТабличнойЧасти = ИменаТабличныхЧастейПоВидамКИ[ВидИнформации]; // ИмяТабличнойЧастиПоВидуКИ(ВидИнформации, ИмяОбъекта); + ИмяТабличнойЧасти = ИменаТабличныхЧастейПоВидамКИ[ВидИнформации]; ТабличнаяЧастьФормы = Форма.Объект[ИмяТабличнойЧасти]; Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл @@ -631,7 +1727,7 @@ Если ОбязательноеЗаполнение И ПустаяСтрока(Представление) Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,Поле); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,Поле); ТекущийУровеньОшибок = 2; Иначе @@ -664,13 +1760,13 @@ // И нет других строк с данными для видов КИ с множественными значениями. ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,, ИмяРеквизита); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,, ИмяРеквизита); ТекущийУровеньОшибок = 2; Иначе ТекущийУровеньОшибок = ПроверитьЗаполнениеКонтактнойИнформации(Представление, СтрокаТаблицы.ЗначенияПолей, - ВидИнформации, ТипИнформации, ИмяРеквизита, Комментарий); + ВидИнформации, ТипИнформации, ИмяРеквизита, Комментарий); КонецЕсли; @@ -694,6 +1790,7 @@ // Параметры: // Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации. // Объект - Произвольный - Объект-владелец контактной информации. +// Отказ - Булево - Если Истина, то объект не был записан, т.к. во время записи возникли ошибки. // Процедура ПередЗаписьюНаСервере(Форма, Объект, Отказ = Ложь) Экспорт @@ -716,7 +1813,7 @@ Если Элемент.Вид = ВидПоляФормы.ПолеНадписи И Элемент.Гиперссылка Тогда Если ПустаяСтрока(СтрокаТаблицы.Представление) ИЛИ СтрокаТаблицы.Представление = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки() Тогда - Продолжить; + Продолжить; КонецЕсли; КонецЕсли; КонецЕсли; @@ -740,7 +1837,6 @@ СтрокаТабличнойЧасти.ИдентификаторСтрокиТабличнойЧасти = ИдентификаторСтроки; ЗначенияПолей = СтрокаТабличнойЧастиФормы[ИмяРеквизита + "ЗначенияПолей"]; - ЗначенияПолей = ?(ЗначениеЗаполнено(СтрокаТаблицы.ЗначенияПолей), СтрокаТаблицы.ЗначенияПолей, СтрокаТаблицы.Представление); ЗаписатьКонтактнуюИнформацию(Объект, ЗначенияПолей, ВидИнформации, ТипИнформации, ИдентификаторСтроки); @@ -751,10 +1847,8 @@ Продолжить; КонецЕсли; - ДействуетС = ?(СтрокаТаблицы.Свойство("ДействуетС"), СтрокаТаблицы.ДействуетС, Неопределено); - ЗначенияПолей = ?(ЗначениеЗаполнено(СтрокаТаблицы.ЗначенияПолей), СтрокаТаблицы.ЗначенияПолей, СтрокаТаблицы.Представление); - - ЗаписатьКонтактнуюИнформацию(Объект, ЗначенияПолей, ВидИнформации, ТипИнформации,, ДействуетС); + ДействуетС = ?(СтрокаТаблицы.Свойство("ДействуетС"), СтрокаТаблицы.ДействуетС, Неопределено); + ЗаписатьКонтактнуюИнформацию(Объект, СтрокаТаблицы.ЗначенияПолей, ВидИнформации, ТипИнформации,, ДействуетС); КонецЕсли; ПредыдущийВид = ВидИнформации; @@ -768,14 +1862,14 @@ // // Параметры: // Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации. -// Объект - Произвольный - Объект-владелец контактной информации. -// Результат - Произвольный - Необязательный служебный реквизит, полученный из предыдущего обработчика события. +// Объект - Произвольный - Объект-владелец контактной информации. +// Результат - Произвольный - Необязательный служебный реквизит, полученный из предыдущего обработчика события. // // Возвращаемое значение: -// Неопределено +// Неопределено - значение не используется, обратная совместимость. // Функция ОбновитьКонтактнуюИнформацию(Форма, Объект, Результат = Неопределено) Экспорт - + Если Результат = Неопределено Тогда Возврат Неопределено; КонецЕсли; @@ -803,16 +1897,26 @@ Форма.Элементы[Результат.ВторойЭлемент].Подсказка = НайденнаяСтрокаВторойЭлемент.Комментарий; КонецЕсли; + Если Результат.Свойство("ОбновитьКонтекстноеМеню") Тогда + Если Результат.Свойство("ИмяЭлементаДляРазмещения") Тогда + ОбновитьКонтекстноеМеню(Форма, Результат.ИмяЭлементаДляРазмещения); + Иначе + Для каждого ИмяЭлементаРазмещения Из Форма.ПараметрыКонтактнойИнформации Цикл + ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаРазмещения.Ключ); + КонецЦикла; + КонецЕсли; + КонецЕсли; + Возврат Неопределено; КонецФункции // Обработчик подписки события "ОбработкаЗаполнения". // // Параметры: -// Источник - СправочникОбъект, ДокументОбъект - объект, содержащий контактную информацию. -// ДанныеЗаполнения - Структура - данные для заполнения контактной информации. -// ТекстЗаполнения - Строка - не используется. -// СтандартнаяОбработка - Булево - флаг необходимости выполнения стандартной обработки. +// Источник - Произвольный - Объект, содержащий контактную информацию. +// ДанныеЗаполнения - Структура - данные с контактной информацией для заполнения объекта. +// ТекстЗаполнения - Строка - Не используется. +// СтандартнаяОбработка - Булево - Не используется. // Процедура ОбработкаЗаполненияКонтактнойИнформации(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт @@ -823,8 +1927,8 @@ // Обработчик подписки события "ПередЗаписью" для обновления контактной информации для списков. // // Параметры: -// Объект - СправочникОбъект, ДокументОбъект - объект, содержащий контактную информацию. -// Отказ - Булево - флаг отказа от выполнения обработчика. +// Объект - Произвольный - Объект, содержащий контактную информацию. +// Отказ - Булево - Не используется, обратная совместимость. // Процедура ОбработкаОбновленияКонтактнойИнформации(Объект, Отказ) Экспорт @@ -833,15 +1937,15 @@ КонецЕсли; ОбновитьКонтактнуюИнформациюДляСписков(Объект); - + КонецПроцедуры // Обработчик подписки события "ОбработкаЗаполнения" для документов. // // Параметры: -// Источник - ДокументОбъект - объект, содержащий контактную информацию. -// ДанныеЗаполнения - Структура - данные для заполнения контактной информации. -// СтандартнаяОбработка - Булево - флаг необходимости выполнения стандартной обработки. +// Источник - Произвольный - Объект, содержащий контактную информацию. +// ДанныеЗаполнения - Структура - Данные с контактной информацией для заполнения объекта. +// СтандартнаяОбработка - Булево - Не используется. // Процедура ОбработкаЗаполненияКонтактнойИнформацииДокумента(Источник, ДанныеЗаполнения, СтандартнаяОбработка) Экспорт @@ -852,9 +1956,9 @@ // Выполняет отложенную инициализацию реквизитов и элементов контактной информации. // // Параметры: -// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной. -// Информации. -// Объект - Произвольный - Объект-владелец контактной информации. +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации. +// Объект - Произвольный - Объект-владелец контактной информации. +// ИмяЭлементаДляРазмещения - Строка - Имя группы где размещена контактная информация. // Процедура ВыполнитьОтложеннуюИнициализацию(Форма, Объект, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт @@ -894,650 +1998,52 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Чтение контактной информации другими подсистемами. +// Вспомогательные функции и конструкторы. -// Проверяет адрес на соответствие требованиям к адресной информации. -// -// Параметры: -// АдресВXML - Строка - строка XML контактной информации. -// ПараметрыПроверки - Структура, СправочникСсылка.ВидыКонтактнойИнформации - флаги проверки адреса. -// АдресТолькоРоссийский - Булево - Адрес должен быть только Российским. По умолчанию ИСТИНА. -// ФорматАдреса - Строка - По какому классификатору проверять "КЛАДР" или "ФИАС". По умолчанию "КЛАДР". +// Описание параметров контактной информацией используемых в обработчике ПриСозданииНаСервере. +// // Возвращаемое значение: -// Структура - содержит структуру с полями: -// * Результат - Строка - результат проверки: "Корректный", "НеПроверен", "СодержитОшибки". -// * СписокОшибок - СписокЗначений - Информация о ошибках. -Функция ПроверитьАдрес(Знач АдресВXML, ПараметрыПроверки = Неопределено) Экспорт - - Возврат УправлениеКонтактнойИнформациейСлужебный.ПроверитьАдресВXML(АдресВXML, ПараметрыПроверки); -КонецФункции +// Структура - параметры контактной информации. +// * Индекс - Строка - Индекс адреса. +// * Страна - Строка - Страна адреса. +// * ТипПомещения - Строка - Наименование типа помещения, который будет установлен +// в форме ввода нового адреса. По умолчанию, "Квартира". +// * ИмяЭлементаДляРазмещения - Строка - Группа, куда будут размещены элементы контактной информации. +// * ИсключаемыеВиды - Массив - Виды контактной информации, которые не требуется отображать на форме. +// * ОтложеннаяИнициализация - Булево - Если Истина, то создание полей контактной информации на форме будет отложено. +// * ПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Может принимать значения: +// ПоложениеЗаголовкаЭлементаФормы.Верх или +// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию). +// +Функция ПараметрыКонтактнойИнформации() Экспорт -// Преобразует все входящие форматы контактной информации в XML. -// -// Параметры: -// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - описание полей контактной информации. -// Представление - Строка - представления. Используется, если невозможно определить представление из параметра. -// ЗначенияПолей (отсутствие поля "Представление"). -// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации - -// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. -// -// Возвращаемое значение: -// Строка - XML данные контактной информации. -// -Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйВид = Неопределено) Экспорт + Результат = Новый Структура; + Результат.Вставить("ТипПомещения", "Квартира"); + Результат.Вставить("Индекс", Неопределено); + Результат.Вставить("Страна", Неопределено); + Результат.Вставить("ОтложеннаяИнициализация", Ложь); + Результат.Вставить("ПоложениеЗаголовкаКИ", ""); + Результат.Вставить("ИсключаемыеВиды", Неопределено); + Результат.Вставить("ИмяЭлементаДляРазмещения", "ГруппаКонтактнаяИнформация"); - Результат = УправлениеКонтактнойИнформациейСлужебный.ПривестиКонтактнуюИнформациюXML(Новый Структура( - "ЗначенияПолей, Представление, ВидКонтактнойИнформации", - ЗначенияПолей, Представление, ОжидаемыйВид)); - Возврат Результат.ДанныеXML; - -КонецФункции + Возврат Результат; -// Возвращает соответствующее значение перечисления "ТипыКонтактнойИнформации" по строке XML. -// -// Параметры: -// XMLСтрока - Строка - контактная информацию. -// -// Возвращаемое значение: -// ПеречислениеСсылка.ТипыКонтактнойИнформации - соответствующий тип. -// -Функция ТипКонтактнойИнформации(Знач XMLСтрока) Экспорт - Возврат УправлениеКонтактнойИнформациейСлужебный.ТипКонтактнойИнформации(XMLСтрока); -КонецФункции +КонецФункции -// Разбирает представление контактной информации и возвращает строку XML. -// Для почтовых адресов корректный разбор не гарантируется. -// -// Параметры: -// Представление - Строка - строковое представление контактной информации, выводимое пользователю. -// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура. -// -// Возвращаемое значение: -// Строка - контактная информация в XML. -// -Функция КонтактнаяИнформацияXMLПоПредставлению(Представление, ОжидаемыйВид) Экспорт - - Возврат УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML( - УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ОжидаемыйВид)); - -КонецФункции - -// Получает представление контактной информации (адреса, телефона, электронной почты и т.п.). -// -// Параметры: -// XMLСтрока - ОбъектXDTO, Строка - объект или XML контактной информации. -// ВидКонтактнойИнформации - Структура - дополнительные параметры формирования представления для адресов: -// * ВключатьСтрануВПредставление - Булево - в представление будет включена страна адреса; -// * ФорматАдреса - Строка - если указано "КЛАДР", то в представление адреса -// не включаются округ и внутригородской район. -// -// Возвращаемое значение: -// Строка - представление контактной информации. -// -Функция ПредставлениеКонтактнойИнформации(Знач XMLСтрока, Знач ВидКонтактнойИнформации = Неопределено) Экспорт - - Возврат УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(XMLСтрока, ВидКонтактнойИнформации); - -КонецФункции - -// Получает комментарий для контактной информации. -// -// Параметры: -// XMLСтрока - ОбъектXDTO, Строка - объект или XML контактной информации. -// -// Возвращаемое значение: -// Строка -// -Функция КомментарийКонтактнойИнформации(XMLСтрока) Экспорт - - ЭтоСтрока = ТипЗнч(XMLСтрока) = Тип("Строка"); - Если ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XMLСтрока) Тогда - // Предыдущий формат значений полей, комментарий отсутствует. - Возврат ""; - КонецЕсли; - - ОбъектXDTO = ?(ЭтоСтрока, УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(XMLСтрока), XMLСтрока); - Возврат ОбъектXDTO.Комментарий; - -КонецФункции - -// Получает комментарий для контактной информации. -// -// Параметры: -// XMLСтрока - ОбъектXDTO, Строка - объект или XML контактной информации. -// Комментарий - Строка - новое значение комментария. -// -// -Процедура УстановитьКомментарийКонтактнойИнформации(XMLСтрока, Знач Комментарий) Экспорт - - ЭтоСтрока = ТипЗнч(XMLСтрока) = Тип("Строка"); - Если ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XMLСтрока) Тогда - // Предыдущий формат значений полей, комментарий отсутствует. - Возврат; - КонецЕсли; - - ОбъектXDTO = ?(ЭтоСтрока, УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(XMLСтрока), XMLСтрока); - ОбъектXDTO.Комментарий = Комментарий; - Если ЭтоСтрока Тогда - XMLСтрока = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO); - КонецЕсли; - -КонецПроцедуры - -// Возвращает информацию о стране адреса. -// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. -// -// Параметры: -// XMLСтрока - Строка - XML контактной информации. -// -// Возвращаемое значение: -// Структура - описание страны адреса. Содержит поля: -// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - соответствующий элемент страны мира. -// * Наименование - Строка - часть описания страны. -// * Код - Строка - часть описания страны. -// * НаименованиеПолное - Строка - часть описания страны. -// * КодАльфа2 - Строка - часть описания страны. -// * КодАльфа3 - Строка - часть описания страны. -// -// Если передана пустая строка, то возвращается пустая структура. -// Если страна не найдена в справочнике, то но найдена в классификаторе, то поле "Ссылка" результата не заполнено. -// Если страна не найдена ни в адресе, ни в классификаторе, то будет заполнено только поле "Наименование". -// -Функция СтранаАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт - - Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3"); - Если ПустаяСтрока(XMLСтрока) Тогда - Возврат Результат; - КонецЕсли; - - // Читаем наименование страны - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLСтрока); - XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Адрес = XDTOАдрес.Состав; - Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru = 'Невозможно определить страну, ожидается адрес.'"); - КонецЕсли; - - Результат.Наименование = СокрЛП(Адрес.Страна); - ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, Результат.Наименование); - Возврат ?(ДанныеСтраны = Неопределено, Результат, ДанныеСтраны); -КонецФункции - -// Возвращает наименование субъекта РФ для адреса или пустую строку, если субъект не определен. -// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. -// -// Параметры: -// XMLСтрока - Строка - XML контактной информации. -// -// Возвращаемое значение: -// Строка - наименование -// -Функция РегионАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт - - Если ПустаяСтрока(XMLСтрока) Тогда - Возврат ""; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLСтрока); - XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Адрес = XDTOАдрес.Состав; - Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru = 'Невозможно определить субъекта РФ, ожидается адрес.'"); - КонецЕсли; - - АдресРФ = УправлениеКонтактнойИнформациейСлужебный.РоссийскийАдрес(Адрес); - Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.СубъектРФ)); - -КонецФункции - -// Возвращает наименование города для адреса РФ или пустую строку для иностранного адреса. -// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. -// -// Параметры: -// XMLСтрока - Строка - XML контактной информации. -// -// Возвращаемое значение: -// Строка - наименование -// -Функция ГородАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт - - Если ПустаяСтрока(XMLСтрока) Тогда - Возврат ""; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLСтрока); - XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Адрес = XDTOАдрес.Состав; - Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru = 'Невозможно определить город, ожидается адрес.'"); - КонецЕсли; - - АдресРФ = УправлениеКонтактнойИнформациейСлужебный.РоссийскийАдрес(Адрес); - Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.Город)); - -КонецФункции - -// Возвращает домен сетевого адреса для веб-ссылки или адреса электронной почты. -// -// Параметры: -// XMLСтрока - Строка - XML контактной информации. -// -// Возвращаемое значение: -// Строка - требуемое значение. -// -Функция ДоменАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт - Если ПустаяСтрока(XMLСтрока) Тогда - Возврат ""; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLСтрока); - XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Состав = XDTOАдрес.Состав; - Если Состав <> Неопределено Тогда - Тип = Состав.Тип(); - Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда - ДоменАдреса = СокрЛП(Состав.Значение); - Позиция = СтрНайти(ДоменАдреса, "://"); - Если Позиция > 0 Тогда - ДоменАдреса = Сред(ДоменАдреса, Позиция + 3); - КонецЕсли; - Позиция = СтрНайти(ДоменАдреса, "/"); - Возврат ?(Позиция = 0, ДоменАдреса, Лев(ДоменАдреса, Позиция - 1)); - - ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда - ДоменАдреса = СокрЛП(Состав.Значение); - Позиция = СтрНайти(ДоменАдреса, "@"); - Возврат ?(Позиция = 0, ДоменАдреса, Сред(ДоменАдреса, Позиция + 1)); - - КонецЕсли; - КонецЕсли; - - ВызватьИсключение НСтр("ru = 'Невозможно определить домен, ожидается электронная почта или веб-ссылка.'"); -КонецФункции - -// Возвращает строку с номером телефона без кода и дополнительного номера. -// -// Параметры: -// XMLСтрока - Строка - XML контактной информации. -// -// Возвращаемое значение: -// Строка - требуемое значение. -// -Функция НомерТелефонаКонтактнойИнформации(Знач XMLСтрока) Экспорт - Если ПустаяСтрока(XMLСтрока) Тогда - Возврат ""; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XMLСтрока); - XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Состав = XDTOАдрес.Состав; - Если Состав <> Неопределено Тогда - Тип = Состав.Тип(); - Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда - Возврат СокрЛП(Состав.Номер); - - ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда - Возврат СокрЛП(Состав.Номер); - - КонецЕсли; - КонецЕсли; - - ВызватьИсключение НСтр("ru = 'Невозможно определить номер, ожидается телефона или факс.'"); -КонецФункции - -// Сравнивает два экземпляра контактной информации. -// -// Параметры: -// Данные1 - ОбъектXTDO - объект с контактной информацией. -// - Строка - контактная информация в формате XML. -// - Структура - описание контактной информацию. Ожидаются поля: -// * ЗначенияПолей - Строка, Структура, СписокЗначений, Соответствие - поля контактной информации. -// * Представление - Строка - Представление. Используется в случае, если не удалось вычислить -// представление из ЗначенияПолей (отсутствие в них поля Представление). -// * Комментарий - Строка - комментарий. Используется в случае, если не удалось вычислить комментарий -// из ЗначенияПолей. -// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура - -// Используется в случае, если не удалось вычислить тип из ЗначенияПолей. -// Данные2 - ОбъектXTDO, Строка, Структура - аналогично Данные1. -// -// Возвращаемое значение: -// ТаблицаЗначений: - таблица отличающихся полей со следующими колонками: -// * Путь - Строка - XPath, идентифицирующий различающееся значение. Значение "ТипКонтактнойИнформации" -// означает, что переданные экземпляры контактной информации различаются типом. -// * Описание - Строка - описание отличающегося реквизита в терминах предметной области. -// * Значение1 - Строка - значение, соответствующая объекту, переданному в параметре Данные1. -// * Значение2 - Строка - значение, соответствующая объекту, переданному в параметре Данные2. -// -Функция РазличияКонтактнойИнформации(Знач Данные1, Знач Данные2) Экспорт - Возврат УправлениеКонтактнойИнформациейСлужебный.РазличияКонтактнойИнформации(Данные1, Данные2); -КонецФункции - -// Получить значение определенного вида контактной информации у объекта. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, -// контрагент, партнер и т.д.). -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - параметры обработки. -// -// Возвращаемое значение: -// Строка - строковое представление значения. -// -Функция КонтактнаяИнформацияОбъекта(Ссылка, ВидКонтактнойИнформации, Дата = Неопределено) Экспорт - - МассивОбъектов = Новый Массив; - МассивОбъектов.Добавить(Ссылка); - - КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов,, ВидКонтактнойИнформации, Дата); - - Если КонтактнаяИнформацияОбъекта.Количество() > 0 Тогда - Возврат КонтактнаяИнформацияОбъекта[0].Представление; - КонецЕсли; - - Возврат ""; - -КонецФункции - -// Предназначена для создания временной таблицы с контактной информацией нескольких объектов. -// -// Параметры: -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - для формирования. -// МассивОбъектов - Массив - владельцы контактной информации. -// ТипыКИ - Массив - необязательный, используется, если не задан все типы. -// ВидыКИ - Массив - необязательный, используется, если не задан все виды. -// Дата - Дата - необязательный, дата с которой действует запись контактной информации, -// используется при хранении истории изменения контактной информации. -// Если владелец хранит историю изменений, то при несоответствии параметра -// дате будет вызвано исключение. -// -// В менеджере создается временная таблица ВТКонтактнаяИнформация с полями: -// * Объект - Ссылка - владелец КИ. -// * Вид - СправочникСсылка.ВидыКонтактнойИнформации -// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации -// * ЗначенияПолей - Строка - данные значений полей. -// * Представление - Строка - представление КИ. -// -Процедура СоздатьВТКонтактнаяИнформация(МенеджерВременныхТаблиц, МассивОбъектов, ТипыКИ = Неопределено, ВидыКИ = Неопределено, Дата = Неопределено) Экспорт - - Если ТипЗнч(МассивОбъектов) <> Тип("Массив") ИЛИ МассивОбъектов.Количество() = 0 Тогда - ВызватьИсключение НСтр("ru = 'Неверное значение для массива владельцев контактной информации.'"); - КонецЕсли; - - ОбъектыСГруппировкойПоТипам = Новый Соответствие; - Для каждого Ссылка Из МассивОбъектов Цикл - ТипОбъекта = ТипЗнч(Ссылка); - НайденныйОбъект = ОбъектыСГруппировкойПоТипам.Получить(ТипОбъекта); - Если НайденныйОбъект = Неопределено Тогда - НаборСсылок = Новый Массив; - НаборСсылок.Добавить(Ссылка); - ОбъектыСГруппировкойПоТипам.Вставить(ТипОбъекта, НаборСсылок); - Иначе - НайденныйОбъект.Добавить(Ссылка); - КонецЕсли; - КонецЦикла; - - Запрос = Новый Запрос(); - ТекстЗапросаПодготовкаДанных = ""; - ЕстьКонтактнаяИнформацияСДатой = Ложь; - СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ "; - СтрокаВременнойТаблицы = "ПОМЕСТИТЬ ВТКонтактнаяИнформация"; - - Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл - МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); - Если МетаданныеОбъекта = Неопределено Тогда - Возврат; - КонецЕсли; - Если МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда - ВызватьИсключение МетаданныеОбъекта.Имя + " " + НСтр("ru = 'не содержит контактную информацию.'"); - КонецЕсли; - ИмяТаблицы = МетаданныеОбъекта.Имя; - Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда - ТекстЗапросаПодготовкаДанных = ТекстЗапросаПодготовкаДанных + "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | КонтактнаяИнформация.Ссылка КАК Объект, - | КонтактнаяИнформация.Вид КАК Вид, - | МАКСИМУМ(КонтактнаяИнформация.ДействуетС) КАК ДействуетС - |ПОМЕСТИТЬ СрезКонтактнойИнформации" + ИмяТаблицы + " - |ИЗ - | " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация - |ГДЕ - | КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") - | И КонтактнаяИнформация.ДействуетС <= &ДействуетС - | И КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) - | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) - | - |СГРУППИРОВАТЬ ПО - | КонтактнаяИнформация.Вид, КонтактнаяИнформация.Ссылка - |;" - КонецЕсли; - КонецЦикла; - - ТекстЗапроса = ""; - Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл - ТекстЗапроса = ТекстЗапроса + ?(НЕ ПустаяСтрока(ТекстЗапроса), Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС, ""); - МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); - ИмяТаблицы = МетаданныеОбъекта.Имя; - - Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда - Если ТипЗнч(Дата) <> Тип("Дата") Тогда - Дата = ТекущаяДатаСеанса(); - КонецЕсли; - - УсловияОтбора = ?(ВидыКИ = Неопределено, "", " КонтактнаяИнформация.Вид В (&ВидыКИ)"); - Если ПустаяСтрока(УсловияОтбора) Тогда - УсловиеИ = ""; - Иначе - УсловиеИ = " И "; - КонецЕсли; - УсловияОтбора = УсловияОтбора + ?(ТипыКИ = Неопределено, "", УсловиеИ + " КонтактнаяИнформация.Тип В (&ТипыКИ)"); - Если НЕ ПустаяСтрока(УсловияОтбора) Тогда - УсловияОтбора = " ГДЕ " + УсловияОтбора; - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " - | КонтактнаяИнформация.Ссылка КАК Объект, - | КонтактнаяИнформация.Вид КАК Вид, - | КонтактнаяИнформация.Тип КАК Тип, - | КонтактнаяИнформация.ДействуетС КАК ДействуетС, - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.ЗначенияПолей - | " + СтрокаВременнойТаблицы + " - |ИЗ - | СрезКонтактнойИнформации" + ИмяТаблицы + " КАК СрезКонтактнойИнформации - | ЛЕВОЕ СОЕДИНЕНИЕ " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация - | ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид - | И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС - | И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка " + УсловияОтбора; - Иначе - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " - | КонтактнаяИнформация.Ссылка КАК Объект, - | КонтактнаяИнформация.Вид КАК Вид, - | КонтактнаяИнформация.Тип КАК Тип, - | ДАТАВРЕМЯ(1,1,1) КАК ДействуетС, - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей - | " + СтрокаВременнойТаблицы + " - |ИЗ - | " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация - |ГДЕ - | КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) - | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) - | И КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") - | " + ?(ТипыКИ = Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКИ)") + " - | " + ?(ВидыКИ = Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКИ)") + " - |"; - КонецЕсли; - СтрокаРАЗРЕШЕННЫЕ =""; - СтрокаВременнойТаблицы = ""; - - Запрос.УстановитьПараметр("МассивОбъектов" + ИмяТаблицы, ОбъектСКонтактнойИнформацией.Значение); - КонецЦикла; - - Запрос.Текст = ТекстЗапросаПодготовкаДанных + ТекстЗапроса; - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - - Запрос.УстановитьПараметр("ДействуетС", Дата); - Запрос.УстановитьПараметр("ТипыКИ", ТипыКИ); - Запрос.УстановитьПараметр("ВидыКИ", ВидыКИ); - Запрос.Выполнить(); -КонецПроцедуры - -// Предназначена для получения контактной информации для нескольких объектов. -// -// Параметры: -// МассивОбъектов - Массив - владельцы контактной информации. -// ТипыКИ - Массив - необязательный, используется, если не задан все типы. -// ВидыКИ - Массив - необязательный, используется, если не задан все виды. -// Дата - Дата - необязательный, дата с которой действует запись контактной информации, -// используется при хранении истории изменения контактной информации. -// Если владелец хранит историю изменений, то при несоответствии параметра -// дате будет вызвано исключение. -// -// Возвращаемое значение: -// Таблица значений - результат. Колонки: -// * Объект - Ссылка - владелец КИ. -// * Вид - СправочникСсылка.ВидыКонтактнойИнформации -// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации -// * ЗначенияПолей - Строка - данные значений полей. -// * Представление - Строка - представление КИ. -// -Функция КонтактнаяИнформацияОбъектов(МассивОбъектов, ТипыКИ = Неопределено, ВидыКИ = Неопределено, Дата = Неопределено) Экспорт - - Если Дата = Неопределено Тогда - Дата = ТекущаяДатаСеанса(); - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - - СоздатьВТКонтактнаяИнформация(Запрос.МенеджерВременныхТаблиц, МассивОбъектов, ТипыКИ, ВидыКИ, Дата); - ДействуетС = " КонтактнаяИнформация.ДействуетС КАК ДействуетС, "; - - Запрос.Текст = "ВЫБРАТЬ - | КонтактнаяИнформация.Объект КАК Объект, - | КонтактнаяИнформация.Вид КАК Вид, - | КонтактнаяИнформация.Тип КАК Тип, - | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей, " + ДействуетС + " - | КонтактнаяИнформация.Представление КАК Представление - |ИЗ - | ВТКонтактнаяИнформация КАК КонтактнаяИнформация"; - - Возврат Запрос.Выполнить().Выгрузить(); - -КонецФункции - -// Заполняет контактную информацию в объектах. -// -// Параметры: -// ДанныеЗаполнения - ТаблицаЗначений - описывает объекты для для заполнения. Содержит колонки: -// * Приемник - Произвольный - ссылка или объект, в котором нужно заполнить КИ. -// * ВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации, заполняемый в -// приемнике. -// * СтруктураКИ - СписокЗначений, Строка, Структура - данные значений полей контактной информации. -// * КлючСтроки - Структура - фильтр для поиска строки в табличной части, где Ключ - имя колонки в табличной -// части, Значение - значение отбора. -// -Процедура ЗаполнитьКонтактнуюИнформациюОбъектов(ДанныеЗаполнения, Дата = Неопределено) Экспорт - - ПредыдущийПриемник = Неопределено; - ДанныеЗаполнения.Сортировать("Приемник, ВидКИ"); - - Для Каждого СтрокаЗаполнения Из ДанныеЗаполнения Цикл - - Приемник = СтрокаЗаполнения.Приемник; - Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Приемник)) Тогда - Приемник = Приемник.ПолучитьОбъект(); - КонецЕсли; - - Если ПредыдущийПриемник <> Неопределено И ПредыдущийПриемник <> Приемник Тогда - Если ПредыдущийПриемник.Ссылка = Приемник.Ссылка Тогда - Приемник = ПредыдущийПриемник; - Иначе - ПредыдущийПриемник.Записать(); - КонецЕсли; - КонецЕсли; - - ВидКИ = СтрокаЗаполнения.ВидКИ; - ИмяОбъектаПриемника = Приемник.Метаданные().Имя; - ИмяТабличнойЧасти = ИмяТабличнойЧастиПоВидуКИ(ВидКИ, ИмяОбъектаПриемника); - - Если ПустаяСтрока(ИмяТабличнойЧасти) Тогда - ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ,, Дата); - Иначе - Если ТипЗнч(СтрокаЗаполнения.КлючСтроки) <> Тип("Структура") Тогда - Продолжить; - КонецЕсли; - - Если СтрокаЗаполнения.КлючСтроки.Свойство("НомерСтроки") Тогда - КоличествоСтрокТабличнойЧасти = Приемник[ИмяТабличнойЧасти].Количество(); - НомерСтроки = СтрокаЗаполнения.КлючСтроки.НомерСтроки; - Если НомерСтроки > 0 И НомерСтроки <= КоличествоСтрокТабличнойЧасти Тогда - СтрокаТабличнойЧасти = Приемник[ИмяТабличнойЧасти][НомерСтроки - 1]; - ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ, СтрокаТабличнойЧасти, Дата); - КонецЕсли; - Иначе - СтрокиТабличнойЧасти = Приемник[ИмяТабличнойЧасти].НайтиСтроки(СтрокаЗаполнения.КлючСтроки); - Для каждого СтрокаТабличнойЧасти Из СтрокиТабличнойЧасти Цикл - ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ, СтрокаТабличнойЧасти, Дата); - КонецЦикла; - КонецЕсли; - КонецЕсли; - - ПредыдущийПриемник = Приемник; - - КонецЦикла; - - Если ПредыдущийПриемник <> Неопределено Тогда - ПредыдущийПриемник.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Заполняет контактную информацию объекта. -// -// Параметры: -// Приемник - Произвольный - ссылка или объект, в котором нужно заполнить КИ. -// ВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации, заполняемый в приемнике. -// СтруктураКИ - Структура - заполненная структура контактной информации. -// КлючСтроки - Структура - отбор для поиска строки в табличной части, Ключ - Имя колонки в табличной части, -// значение - значение отбора. -// -Процедура ЗаполнитьКонтактнуюИнформациюОбъекта(Приемник, ВидКИ, СтруктураКИ, КлючСтроки = Неопределено, Дата = Неопределено) Экспорт - - ДанныеЗаполнения = Новый ТаблицаЗначений; - ДанныеЗаполнения.Колонки.Добавить("Приемник"); - ДанныеЗаполнения.Колонки.Добавить("ВидКИ"); - ДанныеЗаполнения.Колонки.Добавить("СтруктураКИ"); - ДанныеЗаполнения.Колонки.Добавить("КлючСтроки"); - - СтрокаЗаполнения = ДанныеЗаполнения.Добавить(); - СтрокаЗаполнения.Приемник = Приемник; - СтрокаЗаполнения.ВидКИ = ВидКИ; - СтрокаЗаполнения.СтруктураКИ = СтруктураКИ; - СтрокаЗаполнения.КлючСтроки = КлючСтроки; - - ЗаполнитьКонтактнуюИнформациюОбъектов(ДанныеЗаполнения, Дата); - -КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Проверка и сведения об адресе // Проверяет контактную информацию. // // Параметры: -// Представление - Строка - Строка - представления. Используется, если невозможно определить представление из параметра. -// ЗначенияПолей (отсутствие поля "Представление"). -// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - описание полей контактной информации. -// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. -// ТипИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. -// ИмяРеквизита - Строка - Имя реквизита на форме. -// Комментарий - Строка - Комментарий +// Представление - Строка - Представление контактной информации. Используется, если невозможно определить +// представление из параметра ЗначенияПолей (отсутствие поля "Представление"). +// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - Описание полей контактной информации. +// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Используется для определения типа, если его невозможно +// определить по параметру ЗначенияПолей. +// ТипИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации. +// ИмяРеквизита - Строка - Имя реквизита на форме. +// Комментарий - Строка - Текст комментария. // ПутьКРеквизиту - Строка - Путь к реквизиту. // // Возвращаемое значение: @@ -1578,400 +2084,18 @@ КонецФункции -// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. -// -// Параметры: -// Адреса - Массив - XDTO объекты или строки XML контактной информации. -// ДополнительныеПараметры - Структура - параметры контактной информации. -// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. -// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. -// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. -// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. -// Возвращаемое значение: -// Массив - содержит массив структур, содержимое структуры см. описание функции СведенияОбАдресе. -// -Функция СведенияОбАдресах(Адреса, ДополнительныеПараметры = Неопределено) Экспорт - Возврат УправлениеКонтактнойИнформациейСлужебный.СведенияОбАдресахВВидеСтруктуры(Адреса, ДополнительныеПараметры); -КонецФункции - -// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. -// -// Параметры: -// Адрес - Строка, ОбъектXDTO - XDTO объект или строка XML контактной информации. -// ДополнительныеПараметры - Структура - параметры контактной информации. -// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. -// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. -// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. -// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. -// Возвращаемое значение: -// Структура - набор пар ключ-значение. Состав свойств для адреса: -// * Страна - Строка - текстовое представление страны. -// * КодСтраны - Строка - код страны по ОКСМ. -// * Индекс - Строка - почтовый индекс. -// * КодРегиона - Строка - код региона РФ. -// * Регион - Строка - текстовое представление региона РФ. -// * РегионСокращение - Строка - сокращение региона. -// * Округ - Строка - текстовое представление округа. -// * ОкругСокращение - Строка - сокращение округа. -// * Район - Строка - текстовое представление района. -// * РайонСокращение - Строка - сокращение района. -// * Город - Строка - текстовое представление города. -// * ГородСокращение - Строка - сокращение города. -// * ВнутригородскойРайон - Строка - текстовое представление внутригородского района. -// * ВнутригородскойРайонСокращение - Строка - сокращение внутригородского района. -// * НаселенныйПункт - Строка - текстовое представление населенного пункта. -// * НаселенныйПунктСокращение - Строка - сокращение населенного пункта. -// * Улица - Строка - текстовое представление улицы. -// * УлицаСокращение - Строка - сокращение улицы. -// * ДополнительнаяТерритория - Строка - текстовое представление дополнительной территории. -// * ДополнительнаяТерриторияСокращение - Строка - сокращение дополнительной территории. -// * ЭлементДополнительнойТерритории - Строка - текстовое представление элемента дополнительной территории. -// * ЭлементДополнительнойТерриторииСокращение - Строка - сокращение элемента дополнительной территории. -// * Здание - Структура - структура с информацией о здании адреса. -// ** ТипЗдания - Строка - тип объекта адресации адреса РФ согласно приказу ФНС ММВ-7-1/525 от 31.08.2011. -// ** Номер - Строка - текстовое представление номера дома (только для адресов РФ). -// * Корпуса - Массив - содержит структуры(поля структуры: ТипКорпуса, Номер) с перечнем корпусов адреса. -// * Помещения - Массив - содержит структуры(поля структуры: ТипПомещения, Номер) с перечнем помещений адреса. -// * КодыКЛАДР - Структура - Коды КЛАДР, если установлен параметр КодыКЛАДР. -// ** Регион - Строка - код КЛАДР региона. -// ** Район - Строка - код КЛАДР район. -// ** Город - Строка - код КЛАДР города. -// ** НаселенныйПункт - Строка - код КЛАДР населенного пункта. -// ** Улица - Строка - код КЛАДР улица. -// * ДополнительныеКоды - Структура - Коды ОКТМО, ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ. -Функция СведенияОбАдресе(Адрес, ДополнительныеПараметры = Неопределено) Экспорт - Возврат УправлениеКонтактнойИнформациейСлужебный.СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры); -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обратная совместимость. - -// Возвращает значения всей контактной информации определенного вида для объекта-владельца. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, -// контрагент, партнер и т.д.). -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - параметры обработки. -// -// Возвращаемое значение: -// Таблица значений -информация. Колонками: -// * НомерСтроки - Число - номер строки дополнительной табличной части объекта-владельца. -// * Представление - Строка - представление КИ, введенное пользователем. -// * СтруктураПолей - Структура - пары ключ-значение данных информации. -// -Функция ТаблицаКонтактнойИнформацииОбъекта(Ссылка, ВидКонтактнойИнформации, Дата = Неопределено) Экспорт - - МетаданныеОбъекта = Ссылка.Метаданные(); - - Запрос = Новый Запрос; - Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда - ДействуетС = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()); - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ РАЗРЕШЕННЫЕ - | КонтактнаяИнформация.Ссылка КАК Объект, - | КонтактнаяИнформация.Вид КАК Вид, - | МАКСИМУМ(КонтактнаяИнформация.ДействуетС) КАК ДействуетС - |ПОМЕСТИТЬ СрезКонтактнойИнформации - |ИЗ - | %1.КонтактнаяИнформация КАК КонтактнаяИнформация - |ГДЕ - | КонтактнаяИнформация.Ссылка = &Ссылка - | И КонтактнаяИнформация.ДействуетС <= &ДействуетС - | И КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) - | И КонтактнаяИнформация.Вид = &Вид - | - |СГРУППИРОВАТЬ ПО - | КонтактнаяИнформация.Вид, - | КонтактнаяИнформация.Ссылка - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК НомерСтроки, - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.ЗначенияПолей - |ИЗ - | СрезКонтактнойИнформации КАК СрезКонтактнойИнформации - | ЛЕВОЕ СОЕДИНЕНИЕ %1.КонтактнаяИнформация КАК КонтактнаяИнформация - | ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид - | И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС - | И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка - |УПОРЯДОЧИТЬ ПО - | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти", МетаданныеОбъекта.ПолноеИмя()); - - Запрос.УстановитьПараметр("ДействуетС", ДействуетС); - Иначе - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ - | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК НомерСтроки, - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей - |ИЗ - | %1.КонтактнаяИнформация КАК КонтактнаяИнформация - |ГДЕ - | КонтактнаяИнформация.Ссылка = &Ссылка - | И КонтактнаяИнформация.Вид = &Вид - |УПОРЯДОЧИТЬ ПО - | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти", МетаданныеОбъекта.ПолноеИмя()); - - КонецЕсли; - - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.УстановитьПараметр("Вид", ВидКонтактнойИнформации); - - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("НомерСтроки"); - Результат.Колонки.Добавить("Представление"); - Результат.Колонки.Добавить("СтруктураПолей"); - Результат.Индексы.Добавить("НомерСтроки"); - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - СтрокаДанных = Результат.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаДанных, Выборка, "НомерСтроки, Представление"); - СтрокаДанных.СтруктураПолей = ПредыдущаяСтруктураКонтактнойИнформацииXML( - Выборка.ЗначенияПолей, ВидКонтактнойИнформации); - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Преобразует данные формата XML в предыдущий формат контактной информации. -// -// Параметры: -// Данные - Строка - XML контактной информации. -// СокращенныйСоставПолей - Булево - если Ложь, то из состава полей будут исключены -// поля, отсутствующие в версиях БСП младше 2.1.3. -// -// Возвращаемое значение: -// Строка - набор пар ключ-значение, разделенных переносом строки. -// -Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СокращенныйСоставПолей = Ложь) Экспорт - - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда - СтарыйФормат = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтаруюСтруктуру(Данные, СокращенныйСоставПолей); - Возврат УправлениеКонтактнойИнформациейКлиентСервер.ПреобразоватьСписокПолейВСтроку( - СтарыйФормат.ЗначенияПолей, Ложь); - КонецЕсли; - - Возврат Данные; -КонецФункции - -// Преобразует данные нового формата XML контактной информации в структуру старого формата. -// -// Параметры: -// Данные - Строка - XML контактной информации или пары ключ-значение. -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - параметры контактной информации. -// -// Возвращаемое значение: -// Структура - набор пар ключ-значение. Состав свойств для адреса: -// ** Страна - Строка - текстовое представление страны. -// ** КодСтраны - Строка - код страны по ОКСМ. -// ** Индекс - Строка - почтовый индекс (только для адресов РФ). -// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). -// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). -// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). -// ** Район - Строка - текстовое представление района (только для адресов РФ). -// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). -// ** Город - Строка - текстовое представление города (только для адресов РФ). -// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). -// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). -// ** НаселенныйПунктСокращение - Строка - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). -// ** Улица - Строка - текстовое представление улицы (только для адресов РФ). -// ** УлицаСокращение - Строка - сокращение улицы (если СтарыйСоставПолей = Ложь). -// ** ТипДома - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Дом - Строка - текстовое представление дома (только для адресов РФ). -// ** ТипКорпуса - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). -// ** ТипКвартиры - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). -// Состав свойств для телефона: -// ** КодСтраны - Строка - код страны. Например, +7. -// ** КодГорода - Строка - код города. Например, 495. -// ** НомерТелефона - Строка - номер телефона. -// ** Добавочный - Строка - добавочный номер телефона. -// -Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации = Неопределено) Экспорт - - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда - // Новый формат КИ - Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей( - ПредыдущийФорматКонтактнойИнформацииXML(Данные)); - - ИначеЕсли ПустаяСтрока(Данные) И ВидКонтактнойИнформации <> Неопределено Тогда - // Генерируем по виду - Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу( - ВидКонтактнойИнформации.Тип); - - КонецЕсли; - - // Возвращаем полную структуру для данного вида с заполненными полями. - Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей(Данные, ВидКонтактнойИнформации); -КонецФункции - -// Преобразует адреса нового формата XML ФИАС в адрес формата КЛАДР. -// -// Параметры: -// Данные - Строка - XML контактной информации или пары ключ-значение. -// -// Возвращаемое значение: -// Структура - набор пар ключ-значение. Состав свойств для адреса: -// ** Страна - Строка - текстовое представление страны. -// ** КодСтраны - Строка - код страны по ОКСМ. -// ** Индекс - Строка - почтовый индекс (только для адресов РФ). -// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). -// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). -// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). -// ** Район - Строка - текстовое представление района (только для адресов РФ). -// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). -// ** Город - Строка - текстовое представление города (только для адресов РФ). -// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). -// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). -// ** НаселенныйПунктСокращение - Строка - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). -// ** Улица - Строка - текстовое представление улицы (только для адресов РФ). -// ** УлицаСокращение - Строка - сокращение улицы (если СтарыйСоставПолей = Ложь). -// ** ТипДома - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Дом - Строка - текстовое представление дома (только для адресов РФ). -// ** ТипКорпуса - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). -// ** ТипКвартиры - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). -// ** АдресРФ - Булево - Если Истина, то адрес российский. -// ** Представление - Строка - текстовое представление адреса. -// -Функция АдресВФорматеКЛАДР(Знач Данные) Экспорт - - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда - // Новый формат КИ - Результат = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей( - ПредыдущийФорматКонтактнойИнформацииXML(Данные)); - Представление = ПредставлениеКонтактнойИнформации(Данные); - - ИначеЕсли ПустаяСтрока(Данные) Тогда - // Генерируем пустую структуру по виду - Результат = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу( - Перечисления.ТипыКонтактнойИнформации.Адрес); - Представление = ""; - КонецЕсли; - - - Если Результат.Свойство("Страна") - И СтрСравнить(Результат.Страна, Справочники.СтраныМира.Россия.Наименование) = 0 Тогда - Результат.Вставить("АдресРФ", Истина); - Иначе - Результат.Вставить("АдресРФ", Ложь); - КонецЕсли; - Результат.Вставить("Представление", Представление); - - Возврат Результат; -КонецФункции - - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -// Определяет данные страны по справочнику стран или классификатору ОКСМ. -// -// Параметры: -// КодСтраны - Строка, Число - код ОКСМ страны. Если не указано, то поиск по коду не производится. -// Наименование - Строка - Наименование страны. Если не указано, то поиск по наименованию не производится. -// -// Возвращаемое значение: -// Структура - описание страны. Содержит поля: -// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - соответствующий элемент страны мира. -// * Наименование - Строка - часть описания страны. -// * Код - Строка - часть описания страны. -// * НаименованиеПолное - Строка - часть описания страны. -// * КодАльфа2 - Строка - часть описания страны. -// * КодАльфа3 - Строка - часть описания страны. -// Неопределено - страна не найдена ни в адресе, ни в классификаторе. -// -Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт - Возврат Справочники.СтраныМира.ДанныеСтраныМира(КодСтраны, Наименование); -КонецФункции - -// Определяет данные страны по классификатору ОКСМ. -// -// Параметры: -// Параметры: -// Код - Строка, Число - код ОКСМ страны. -// ТипКода - Строка - Варианты: КодСтраны (по умолчанию), Альфа2, Альфа3. -// -// Возвращаемое значение: -// Структура - описание страны. Содержит поля: -// * Наименование - Строка - часть описания страны. -// * Код - Строка - часть описания страны. -// * НаименованиеПолное - Строка - часть описания страны. -// * КодАльфа2 - Строка - часть описания страны. -// * КодАльфа3 - Строка - часть описания страны. -// Неопределено - страна не найдена в классификаторе. -// -Функция ДанныеКлассификатораСтранМираПоКоду(Знач Код, Знач ТипКода = "КодСтраны") Экспорт - Возврат Справочники.СтраныМира.ДанныеКлассификатораСтранМираПоКоду(Код, ТипКода); -КонецФункции - -// Определяет данные страны по классификатору ОКСМ. -// -// Параметры: -// Наименование - Строка - наименование страны. -// -// Возвращаемое значение: -// Структура - описание страны. Содержит поля: -// * Наименование - Строка - часть описания страны. -// * Код - Строка - часть описания страны. -// * НаименованиеПолное - Строка - часть описания страны. -// * КодАльфа2 - Строка - часть описания страны. -// * КодАльфа3 - Строка - часть описания страны. -// Неопределено - страна не найдена в классификаторе. -// -Функция ДанныеКлассификатораСтранМираПоНаименованию(Знач Наименование) Экспорт - Возврат Справочники.СтраныМира.ДанныеКлассификатораСтранМираПоНаименованию(Наименование); -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. -// Получить значения определенного типа контактной информации у объекта. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, контрагент, партнер и т.д.). -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации. -// -// Возвращаемое значение: -// ТаблицаЗначений - колонки. -// * Значение - строка - строковое представление значения. -// * Вид - строка - представление вида контактной информации. -// -Функция ЗначенияКонтактнойИнформацииОбъекта(Ссылка, ТипКонтактнойИнформации) Экспорт - - МассивОбъектов = Новый Массив; - МассивОбъектов.Добавить(Ссылка); - - КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов, ТипКонтактнойИнформации); - - Запрос = Новый Запрос; - - Запрос.УстановитьПараметр("КонтактнаяИнформацияОбъекта", КонтактнаяИнформацияОбъекта); - - Запрос.Текст = - "ВЫБРАТЬ - | КонтактнаяИнформацияОбъекта.Представление, - | КонтактнаяИнформацияОбъекта.Вид - |ПОМЕСТИТЬ ВТКонтактнаяИнформацияОбъекта - |ИЗ - | &КонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КонтактнаяИнформацияОбъекта.Представление КАК Значение, - | ПРЕДСТАВЛЕНИЕ(КонтактнаяИнформацияОбъекта.Вид) КАК Вид - |ИЗ - | ВТКонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта"; - - Возврат Запрос.Выполнить().Выгрузить(); - -КонецФункции - // Устанавливает свойства вида контактной информации. +// Примечание. При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. +// Если после выполнения обновления значения порядка окажутся неуникальными в пределах группы, то настройка порядка +// пользователем будет невозможна. +// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением +// 0 (порядок будет назначен автоматически в подсистеме "Настройка порядка элементов" при выполнении процедуры). +// Для размещения видов КИ в определенной последовательности относительно друг друга без явного размещения в начале +// списка достаточно вызывать данную процедуру в нужной последовательности для каждого вида КИ с указанием порядка 0. +// Если добавляется предопределенный вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок в явном виде. // // Параметры: // Параметры - Структура - содержит структуру с полями: @@ -1995,7 +2119,8 @@ // * ЗапретитьРедактированиеПользователем - Булево - Признак недоступности редактирования // пользователем свойства вида контактной // информации. -// * ХранитьИсториюИзменений - Булево - Признак хранения истории изменений вида контактной информации. +// * ХранитьИсториюИзменений - Булево - Признак хранения истории изменений вида +// контактной информации. // Значение по умолчанию Ложь. // * Используется - Булево - Признак использования вида контактной информации. // Значение по умолчанию Истина. @@ -2004,17 +2129,16 @@ // Значение по умолчанию - ОднострочноеШирокое. // * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации. // Для типа Адрес - Структура, содержащая поля: -// * АдресТолькоРоссийский - Булево - Истина, если возможен ввод только российских адресов. +// * ТолькоНациональныйАдрес - Булево - Истина, если возможен ввод только российских адресов. // * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать -// некорректный адрес (только если АдресТолькоРоссийский = Истина). // * ПроверятьПоФИАС - Булево - Истина, если требуется проверка адреса по ФИАС, иначе -// проверка по КЛАДР (только если АдресТолькоРоссийский = Истина +// проверка по КЛАДР (только если ТолькоНациональныйАдрес = Истина // и ПроверятьКорректность = Истина). // * ЗапрещатьВводНекорректного - Булево - Устарел. Все переданные значения игнорируются. // Для запрета пользователю записывать некорректные адреса, // следует использовать параметр ПроверятьКорректность. // * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при -// вводе (только если АдресТолькоРоссийский = Истина). +// вводе (только если ТолькоНациональныйАдрес = Истина). // * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в // представление адреса. // Для типа АдресЭлектроннойПочты - Структура, содержащая поля: @@ -2025,18 +2149,6 @@ // следует использовать параметр ПроверятьКорректность. // Для остальных типов или для задания настроек по умолчанию используется Неопределено. // -// Примечание: -// -// При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. Если -// после выполнения обновления значения порядка окажутся неуникальными в пределах группы, то настройка порядка -// пользователем будет невозможна. -// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением -// 0 (порядок будет назначен автоматически в подсистеме "Настройка порядка элементов" при выполнении процедуры). -// Для размещения видов КИ в определенной последовательности относительно друг друга без явного размещения в начале -// списка достаточно вызывать данную процедуру в нужной последовательности для каждого вида КИ с указанием -// порядка 0. Если добавляется предопределенный вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок -// в явном виде. -// Процедура УстановитьСвойстваВидаКонтактнойИнформации(Параметры) Экспорт Если ТипЗнч(Параметры.Вид) = Тип("Строка") Тогда @@ -2117,14 +2229,14 @@ // Значение по умолчанию Истина. // * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации. // Для типа Адрес - Структура, содержащая поля: -// * АдресТолькоРоссийский - Булево - Истина, если возможен ввод только российских адресов. +// * ТолькоНациональныйАдрес - Булево - Истина, если возможен ввод только российских адресов. // * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать -// некорректный адрес (только если АдресТолькоРоссийский = Истина). +// некорректный адрес (только если ТолькоНациональныйАдрес = Истина). // * ПроверятьПоФИАС - Булево - Истина, если требуется проверка адреса по ФИАС, иначе -// проверка по КЛАДР (только если АдресТолькоРоссийский = Истина +// проверка по КЛАДР (только если ТолькоНациональныйАдрес = Истина // и ПроверятьКорректность = Истина). // * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при -// вводе (только если АдресТолькоРоссийский = Истина). +// вводе (только если ТолькоНациональныйАдрес = Истина). // * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в // представление адреса. // Для типа АдресЭлектроннойПочты - Структура, содержащая поля: @@ -2154,7 +2266,7 @@ Если УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда НастройкиПроверки = Новый Структура; - НастройкиПроверки.Вставить("АдресТолькоРоссийский", Ложь); + НастройкиПроверки.Вставить("ТолькоНациональныйАдрес", Ложь); НастройкиПроверки.Вставить("ПроверятьКорректность", Ложь); НастройкиПроверки.Вставить("ПроверятьПоФИАС", Ложь); НастройкиПроверки.Вставить("СкрыватьНеактуальныеАдреса", Ложь); @@ -2211,22 +2323,7 @@ КонецЕсли; // Заполнение дополнительных реквизитов ТЧ. - Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда - ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(НоваяСтрока, ОбъектКИ); - - ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(НоваяСтрока, ОбъектКИ); - - ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда - ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(НоваяСтрока, ОбъектКИ); - - ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда - ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(НоваяСтрока, ОбъектКИ); - - ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда - ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(НоваяСтрока, ОбъектКИ); - - КонецЕсли; + ЗаполнитьТехническиеПоляКонтактнойИнформации(НоваяСтрока, ОбъектКИ, ТипИнформации); КонецПроцедуры @@ -2245,7 +2342,7 @@ УправлениеКонтактнойИнформациейСлужебный.ОбновитьКонтактнуюИнформациюДляСписковДляОбъекта(Объект); КонецЕсли; КонецЕсли; - + КонецПроцедуры // Выполняет отложенное обновление контактной информации для списков. @@ -2278,12 +2375,12 @@ Разделитель = ""; ШаблонЗапроса = "ВЫБРАТЬ - | КОЛИЧЕСТВО(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Количество, - | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Ссылка - |ИЗ - | %1.%2 КАК ТаблицаСКонтактнойИнформацией - | СГРУППИРОВАТЬ ПО - | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка)"; + | КОЛИЧЕСТВО(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Количество, + | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Ссылка + |ИЗ + | %1.%2 КАК ТаблицаСКонтактнойИнформацией + | СГРУППИРОВАТЬ ПО + | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка)"; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если СтрНачинаетсяС(ВыборкаДетальныеЗаписи.ИмяПредопределенныхДанных, "Справочник") Тогда @@ -2344,7 +2441,7 @@ | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ) = 0"; - + Запрос = Новый Запрос(ТекстЗапроса); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Количество = РезультатЗапроса.Количество(); @@ -2361,7 +2458,7 @@ Иначе ОбъектыСВидомДляСписка.Удалить(0); КонецЕсли; - + Если ОбъектыСВидомДляСписка.Количество() > 0 Тогда Параметры.ОбработкаЗавершена = Ложь; КонецЕсли; @@ -2370,6 +2467,529 @@ КонецПроцедуры +#Область УстаревшиеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обратная совместимость. + +// Устарела. Следует использовать РаботаСАдресами.ПредыдущийФорматКонтактнойИнформацииXML. +// Преобразует данные формата XML в предыдущий формат контактной информации. +// +// Параметры: +// Данные - Строка - XML контактной информации. +// СокращенныйСоставПолей - Булево - если Ложь, то из состава полей будут исключены +// поля, отсутствующие в версиях БСП младше 2.1.3. +// +// Возвращаемое значение: +// Строка - набор пар ключ-значение, разделенных переносом строки. +// +Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СокращенныйСоставПолей = Ложь) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.ПредыдущийФорматКонтактнойИнформацииXML(Данные, СокращенныйСоставПолей); + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.ПредыдущаяСтруктураКонтактнойИнформацииXML. +// Преобразует данные нового формата XML контактной информации в структуру старого формата. +// +// Параметры: +// Данные - Строка - XML контактной информации или пары ключ-значение. +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - параметры контактной информации. +// +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// ** Страна - Строка - текстовое представление страны. +// ** КодСтраны - Строка - код страны по ОКСМ. +// ** Индекс - Строка - почтовый индекс (только для адресов РФ). +// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). +// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). +// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). +// ** Район - Строка - текстовое представление района (только для адресов РФ). +// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). +// ** Город - Строка - текстовое представление города (только для адресов РФ). +// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). +// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). +// ** НаселенныйПунктСокращение - Строка - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). +// ** Улица - Строка - текстовое представление улицы (только для адресов РФ). +// ** УлицаСокращение - Строка - сокращение улицы (если СтарыйСоставПолей = Ложь). +// ** ТипДома - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Дом - Строка - текстовое представление дома (только для адресов РФ). +// ** ТипКорпуса - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). +// ** ТипКвартиры - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). +// Состав свойств для телефона: +// ** КодСтраны - Строка - код страны. Например, +7. +// ** КодГорода - Строка - код города. Например, 495. +// ** НомерТелефона - Строка - номер телефона. +// ** Добавочный - Строка - добавочный номер телефона. +// +Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации = Неопределено) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.ПредыдущаяСтруктураКонтактнойИнформацииXML(Данные, ВидКонтактнойИнформации); + КонецЕсли; + + Возврат Новый Структура; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.АдресВФорматеКЛАДР. +// Преобразует адреса нового формата XML ФИАС в адрес формата КЛАДР. +// +// Параметры: +// Данные - Строка - XML контактной информации или пары ключ-значение. +// +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// ** Страна - Строка - текстовое представление страны. +// ** КодСтраны - Строка - код страны по ОКСМ. +// ** Индекс - Строка - почтовый индекс (только для адресов РФ). +// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). +// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). +// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). +// ** Район - Строка - текстовое представление района (только для адресов РФ). +// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). +// ** Город - Строка - текстовое представление города (только для адресов РФ). +// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). +// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). +// ** НаселенныйПунктСокращение - Строка - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). +// ** Улица - Строка - текстовое представление улицы (только для адресов РФ). +// ** УлицаСокращение - Строка - сокращение улицы (если СтарыйСоставПолей = Ложь). +// ** ТипДома - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Дом - Строка - текстовое представление дома (только для адресов РФ). +// ** ТипКорпуса - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). +// ** ТипКвартиры - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ. +// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). +// ** АдресРФ - Булево - Если Истина, то адрес российский. +// ** Представление - Строка - текстовое представление адреса. +// +Функция АдресВФорматеКЛАДР(Знач Данные) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.АдресВФорматеКЛАДР(Данные); + КонецЕсли; + + Возврат Новый Структура; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.СведенияОбАдресах. +// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. +// +// Параметры: +// Адреса - Массив - XDTO объекты или строки XML контактной информации. +// ДополнительныеПараметры - Структура - параметры контактной информации. +// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. +// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. +// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. +// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. +// Возвращаемое значение: +// Массив - содержит массив структур, содержимое структуры см. описание функции РаботаСАдресами.СведенияОбАдресе. +// +Функция СведенияОбАдресах(Адреса, ДополнительныеПараметры = Неопределено) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.СведенияОбАдресах(Адреса, ДополнительныеПараметры); + КонецЕсли; + + Возврат Новый Массив; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.СведенияОбАдресе. +// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. +// +// Параметры: +// Адрес - Строка, ОбъектXDTO - XDTO объект или строка XML контактной информации. +// ДополнительныеПараметры - Структура - параметры контактной информации. +// * БезПредставлений - Булево - Если Истина, то поле представления адреса будет отсутствовать. +// * КодыКЛАДР - Булево - Если Истина, то возвращает структуру с кодами КЛАДР по всем частям адреса. +// * ПолныеНаименованияСокращений - Булево - Если Истина, то возвращает полное наименование адресных объектов. +// * НаименованиеВключаетСокращение - Булево - Если Истина, то поля содержат сокращениям в наименованиях адресных объектов. +// Возвращаемое значение: +// Структура - набор пар ключ-значение. Состав свойств для адреса: +// * Страна - Строка - текстовое представление страны. +// * КодСтраны - Строка - код страны по ОКСМ. +// * Индекс - Строка - почтовый индекс. +// * КодРегиона - Строка - код региона РФ. +// * Регион - Строка - текстовое представление региона РФ. +// * РегионСокращение - Строка - сокращение региона. +// * Округ - Строка - текстовое представление округа. +// * ОкругСокращение - Строка - сокращение округа. +// * Район - Строка - текстовое представление района. +// * РайонСокращение - Строка - сокращение района. +// * Город - Строка - текстовое представление города. +// * ГородСокращение - Строка - сокращение города. +// * ВнутригородскойРайон - Строка - текстовое представление внутригородского района. +// * ВнутригородскойРайонСокращение - Строка - сокращение внутригородского района. +// * НаселенныйПункт - Строка - текстовое представление населенного пункта. +// * НаселенныйПунктСокращение - Строка - сокращение населенного пункта. +// * Улица - Строка - текстовое представление улицы. +// * УлицаСокращение - Строка - сокращение улицы. +// * ДополнительнаяТерритория - Строка - текстовое представление дополнительной территории. +// * ДополнительнаяТерриторияСокращение - Строка - сокращение дополнительной территории. +// * ЭлементДополнительнойТерритории - Строка - текстовое представление элемента дополнительной территории. +// * ЭлементДополнительнойТерриторииСокращение - Строка - сокращение элемента дополнительной территории. +// * Здание - Структура - структура с информацией о здании адреса. +// ** ТипЗдания - Строка - тип объекта адресации адреса РФ согласно приказу ФНС ММВ-7-1/525 от 31.08.2011. +// ** Номер - Строка - текстовое представление номера дома (только для адресов РФ). +// * Корпуса - Массив - содержит структуры(поля структуры: ТипКорпуса, Номер) с перечнем корпусов адреса. +// * Помещения - Массив - содержит структуры(поля структуры: ТипПомещения, Номер) с перечнем помещений адреса. +// * КодыКЛАДР - Структура - Коды КЛАДР, если установлен параметр КодыКЛАДР. +// ** Регион - Строка - код КЛАДР региона. +// ** Район - Строка - код КЛАДР район. +// ** Город - Строка - код КЛАДР города. +// ** НаселенныйПункт - Строка - код КЛАДР населенного пункта. +// ** Улица - Строка - код КЛАДР улица. +// * ДополнительныеКоды - Структура - Коды ОКТМО, ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ. +Функция СведенияОбАдресе(Адрес, ДополнительныеПараметры = Неопределено) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.СведенияОбАдресе(Адрес, ДополнительныеПараметры); + КонецЕсли; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.РегионАдресаКонтактнойИнформации. +// Возвращает наименование субъекта РФ для адреса или пустую строку, если субъект не определен. +// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. +// +// Параметры: +// XMLСтрока - Строка - XML контактной информации. +// +// Возвращаемое значение: +// Строка - наименование +// +Функция РегионАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.РегионАдресаКонтактнойИнформации(XMLСтрока); + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Устарела. Следует использовать РаботаСАдресами.ГородАдресаКонтактнойИнформации. +// Возвращает наименование города для адреса РФ или пустую строку для иностранного адреса. +// Если переданная строка не содержит информации об адресе, то будет вызвано исключение. +// +// Параметры: +// XMLСтрока - Строка - XML контактной информации. +// +// Возвращаемое значение: +// Строка - наименование +// +Функция ГородАдресаКонтактнойИнформации(Знач XMLСтрока) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.ГородАдресаКонтактнойИнформации(XMLСтрока); + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Устарела. Следует использовать УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта. +// Получить значения определенного типа контактной информации у объекта. +// +// Параметры: +// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, контрагент, +// партнер и т.д.). +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип получаемой контактной информации. +// +// Возвращаемое значение: +// ТаблицаЗначений - колонки. +// * Значение - строка - строковое представление значения. +// * Вид - строка - представление вида контактной информации. +// +Функция ЗначенияКонтактнойИнформацииОбъекта(Ссылка, ТипКонтактнойИнформации) Экспорт + + МассивОбъектов = Новый Массив; + МассивОбъектов.Добавить(Ссылка); + + КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов, ТипКонтактнойИнформации); + + Запрос = Новый Запрос; + + Запрос.УстановитьПараметр("КонтактнаяИнформацияОбъекта", КонтактнаяИнформацияОбъекта); + + Запрос.Текст = + "ВЫБРАТЬ + | КонтактнаяИнформацияОбъекта.Представление, + | КонтактнаяИнформацияОбъекта.Вид + |ПОМЕСТИТЬ ВТКонтактнаяИнформацияОбъекта + |ИЗ + | &КонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КонтактнаяИнформацияОбъекта.Представление КАК Значение, + | ПРЕДСТАВЛЕНИЕ(КонтактнаяИнформацияОбъекта.Вид) КАК Вид + |ИЗ + | ВТКонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта"; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// Устарела. Следует использовать УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта. +// Возвращает значения всей контактной информации определенного вида для объекта-владельца. +// +// Параметры: +// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, +// контрагент, партнер и т.д.). +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - параметры обработки. +// Дата - Дата - Необязательный, дата с которой действует запись контактной информации, +// используется при хранении истории изменения контактной информации. +// +// Возвращаемое значение: +// Таблица значений -информация. Колонками: +// * НомерСтроки - Число - номер строки дополнительной табличной части объекта-владельца. +// * Представление - Строка - представление КИ, введенное пользователем. +// * СтруктураПолей - Структура - пары ключ-значение данных информации. +// +Функция ТаблицаКонтактнойИнформацииОбъекта(Ссылка, ВидКонтактнойИнформации, Дата = Неопределено) Экспорт + + МетаданныеОбъекта = Ссылка.Метаданные(); + + Запрос = Новый Запрос; + Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда + ДействуетС = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()); + ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КонтактнаяИнформация.Ссылка КАК Объект, + | КонтактнаяИнформация.Вид КАК Вид, + | МАКСИМУМ(КонтактнаяИнформация.ДействуетС) КАК ДействуетС + |ПОМЕСТИТЬ СрезКонтактнойИнформации + |ИЗ + | %1.КонтактнаяИнформация КАК КонтактнаяИнформация + |ГДЕ + | КонтактнаяИнформация.Ссылка = &Ссылка + | И КонтактнаяИнформация.ДействуетС <= &ДействуетС + | И КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) + | И КонтактнаяИнформация.Вид = &Вид + | + |СГРУППИРОВАТЬ ПО + | КонтактнаяИнформация.Вид, + | КонтактнаяИнформация.Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК НомерСтроки, + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.ЗначенияПолей + |ИЗ + | СрезКонтактнойИнформации КАК СрезКонтактнойИнформации + | ЛЕВОЕ СОЕДИНЕНИЕ %1.КонтактнаяИнформация КАК КонтактнаяИнформация + | ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид + | И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС + | И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка + |УПОРЯДОЧИТЬ ПО + | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти", МетаданныеОбъекта.ПолноеИмя()); + + Запрос.УстановитьПараметр("ДействуетС", ДействуетС); + Иначе + ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ + | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК НомерСтроки, + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей + |ИЗ + | %1.КонтактнаяИнформация КАК КонтактнаяИнформация + |ГДЕ + | КонтактнаяИнформация.Ссылка = &Ссылка + | И КонтактнаяИнформация.Вид = &Вид + |УПОРЯДОЧИТЬ ПО + | КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти", МетаданныеОбъекта.ПолноеИмя()); + + КонецЕсли; + + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("Вид", ВидКонтактнойИнформации); + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("НомерСтроки"); + Результат.Колонки.Добавить("Представление"); + Результат.Колонки.Добавить("СтруктураПолей"); + Результат.Индексы.Добавить("НомерСтроки"); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СтрокаДанных = Результат.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаДанных, Выборка, "НомерСтроки, Представление"); + СтрокаДанных.СтруктураПолей = ПредыдущаяСтруктураКонтактнойИнформацииXML( + Выборка.ЗначенияПолей, ВидКонтактнойИнформации); + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Устарела. Следует использовать УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъектов. +// Заполняет контактную информацию в объектах. +// +// Параметры: +// ДанныеЗаполнения - ТаблицаЗначений - описывает объекты для для заполнения. Содержит колонки: +// * Приемник - Произвольный - ссылка или объект, в котором нужно заполнить КИ. +// * ВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации, заполняемый в приемнике. +// * СтруктураКИ - СписокЗначений, Строка, Структура - данные значений полей контактной информации. +// * КлючСтроки - Структура - фильтр для поиска строки в табличной части, +// где Ключ - имя колонки в табличной части, Значение - значение отбора. +// Дата - Дата - необязательный, дата с которой действует запись контактной информации, +// используется при хранении истории изменения контактной информации. +// Если не указано, то будет установленная текущая дата. +// +Процедура ЗаполнитьКонтактнуюИнформациюОбъектов(ДанныеЗаполнения, Дата = Неопределено) Экспорт + + ПредыдущийПриемник = Неопределено; + ДанныеЗаполнения.Сортировать("Приемник, ВидКИ"); + + Для Каждого СтрокаЗаполнения Из ДанныеЗаполнения Цикл + + Приемник = СтрокаЗаполнения.Приемник; + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Приемник)) Тогда + Приемник = Приемник.ПолучитьОбъект(); + КонецЕсли; + + Если ПредыдущийПриемник <> Неопределено И ПредыдущийПриемник <> Приемник Тогда + Если ПредыдущийПриемник.Ссылка = Приемник.Ссылка Тогда + Приемник = ПредыдущийПриемник; + Иначе + ПредыдущийПриемник.Записать(); + КонецЕсли; + КонецЕсли; + + ВидКИ = СтрокаЗаполнения.ВидКИ; + ИмяОбъектаПриемника = Приемник.Метаданные().Имя; + ИмяТабличнойЧасти = ИмяТабличнойЧастиПоВидуКИ(ВидКИ, ИмяОбъектаПриемника); + + Если ПустаяСтрока(ИмяТабличнойЧасти) Тогда + ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ,, Дата); + Иначе + Если ТипЗнч(СтрокаЗаполнения.КлючСтроки) <> Тип("Структура") Тогда + Продолжить; + КонецЕсли; + + Если СтрокаЗаполнения.КлючСтроки.Свойство("НомерСтроки") Тогда + КоличествоСтрокТабличнойЧасти = Приемник[ИмяТабличнойЧасти].Количество(); + НомерСтроки = СтрокаЗаполнения.КлючСтроки.НомерСтроки; + Если НомерСтроки > 0 И НомерСтроки <= КоличествоСтрокТабличнойЧасти Тогда + СтрокаТабличнойЧасти = Приемник[ИмяТабличнойЧасти][НомерСтроки - 1]; + ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ, СтрокаТабличнойЧасти, Дата); + КонецЕсли; + Иначе + СтрокиТабличнойЧасти = Приемник[ИмяТабличнойЧасти].НайтиСтроки(СтрокаЗаполнения.КлючСтроки); + Для каждого СтрокаТабличнойЧасти Из СтрокиТабличнойЧасти Цикл + ЗаполнитьКонтактнуюИнформациюТабличнойЧасти(Приемник, ВидКИ, СтрокаЗаполнения.СтруктураКИ, СтрокаТабличнойЧасти, Дата); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + ПредыдущийПриемник = Приемник; + + КонецЦикла; + + Если ПредыдущийПриемник <> Неопределено Тогда + ПредыдущийПриемник.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Устарела. Следует использовать УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта. +// Заполняет контактную информацию объекта. +// +// Параметры: +// Приемник - Произвольный - Ссылка или объект, в котором нужно заполнить КИ. +// ВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации, заполняемый в приемнике. +// СтруктураКИ - Структура - Заполненная структура контактной информации. +// КлючСтроки - Структура - Отбор для поиска строки в табличной части. +// * Ключ - Строка - Имя колонки в табличной части. +// * Значение - Строка - Значение отбора. +// Дата - Дата - Необязательный, дата с которой действует запись контактной информации, +// используется при хранении истории изменения контактной информации. +// Если не указано, то будет установленная текущая дата. +// +Процедура ЗаполнитьКонтактнуюИнформациюОбъекта(Приемник, ВидКИ, СтруктураКИ, КлючСтроки = Неопределено, Дата = Неопределено) Экспорт + + ДанныеЗаполнения = Новый ТаблицаЗначений; + ДанныеЗаполнения.Колонки.Добавить("Приемник"); + ДанныеЗаполнения.Колонки.Добавить("ВидКИ"); + ДанныеЗаполнения.Колонки.Добавить("СтруктураКИ"); + ДанныеЗаполнения.Колонки.Добавить("КлючСтроки"); + + СтрокаЗаполнения = ДанныеЗаполнения.Добавить(); + СтрокаЗаполнения.Приемник = Приемник; + СтрокаЗаполнения.ВидКИ = ВидКИ; + СтрокаЗаполнения.СтруктураКИ = СтруктураКИ; + СтрокаЗаполнения.КлючСтроки = КлючСтроки; + + ЗаполнитьКонтактнуюИнформациюОбъектов(ДанныеЗаполнения, Дата); + +КонецПроцедуры + +// Устарела. Следует использовать РаботаСАдресами.ПроверитьАдрес. +// Проверяет адрес на соответствие требованиям к адресной информации. +// +// Параметры: +// АдресВXML - Строка - строка XML контактной информации. +// ПараметрыПроверки - Структура, СправочникСсылка.ВидыКонтактнойИнформации - флаги проверки адреса. +// ТолькоНациональныйАдрес - Булево - Адрес должен быть только Российским. По умолчанию ИСТИНА. +// ФорматАдреса - Строка - По какому классификатору проверять "КЛАДР" или "ФИАС". По умолчанию "КЛАДР". +// Возвращаемое значение: +// Структура - содержит структуру с полями: +// * Результат - Строка - результат проверки: "Корректный", "НеПроверен", "СодержитОшибки". +// * СписокОшибок - СписокЗначений - Информация о ошибках. +Функция ПроверитьАдрес(Знач АдресВXML, ПараметрыПроверки = Неопределено) Экспорт + Возврат УправлениеКонтактнойИнформациейСлужебный.ПроверитьАдресВXML(АдресВXML, ПараметрыПроверки); +КонецФункции + +// Устарела. Следует использовать ПараметрыКонтактнойИнформации. +// Описание параметров контактной информацией используемых в обработчике ПриСозданииНаСервере. +// +// Возвращаемое значение: +// Структура - параметры контактной информации. +// * Индекс - Строка - Индекс адреса. +// * Страна - Строка - Страна адреса. +// * ТипПомещения - Строка - Наименование типа помещения, который будет установлен +// в форме ввода нового адреса. По умолчанию, "Квартира". +// * ИмяЭлементаДляРазмещения - Строка - Группа, куда будут размещены элементы контактной информации. +// * ИсключаемыеВиды - Массив - Виды контактной информации, которые не требуется отображать на форме. +// * ОтложеннаяИнициализация - Булево - Если Истина, то создание полей контактной информации на форме будет отложено. +// * ПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Может принимать значения: +// ПоложениеЗаголовкаЭлементаФормы.Верх или +// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию). +// +Функция ПараметрыКонтактнойИнформацией() Экспорт + + Результат = Новый Структура; + Результат.Вставить("ТипПомещения", "Квартира"); + Результат.Вставить("Индекс", Неопределено); + Результат.Вставить("Страна", Неопределено); + Результат.Вставить("ОтложеннаяИнициализация", Ложь); + Результат.Вставить("ПоложениеЗаголовкаКИ", ""); + Результат.Вставить("ИсключаемыеВиды", Неопределено); + Результат.Вставить("ИмяЭлементаДляРазмещения", "ГруппаКонтактнаяИнформация"); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -2477,14 +3097,14 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ВидыКонтактнойИнформации.Ссылка КАК Ссылка, - | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных - |ИЗ - | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации - |ГДЕ - | ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА - | И ВидыКонтактнойИнформации.ПометкаУдаления = ЛОЖЬ - | И ВидыКонтактнойИнформации.Используется = ИСТИНА"; + | ВидыКонтактнойИнформации.Ссылка КАК Ссылка, + | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + |ИЗ + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА + | И ВидыКонтактнойИнформации.ПометкаУдаления = ЛОЖЬ + | И ВидыКонтактнойИнформации.Используется = ИСТИНА"; РезультатЗапроса = Запрос.Выполнить().Выбрать(); Пока РезультатЗапроса.Следующий() Цикл @@ -2523,6 +3143,27 @@ КонецФункции +// Возвращает полные данные ОКСМ классификатора. +// +// Возвращаемое значение: +// ТаблицаЗначений - данные классификатора с колонками: +// * Код - Строка - данные страны. +// * Наименование - Строка - данные страны. +// * НаименованиеПолное - Строка - данные страны. +// * КодАльфа2 - Строка - данные страны. +// * КодАльфа3 - Строка - данные страны. +// +// Таблица значений проиндексирована по полям "Код", "Наименование". +// +Функция ТаблицаКлассификатора() Экспорт + Макет = Справочники.СтраныМира.ПолучитьМакет("Классификатор"); + + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(Макет.ПолучитьТекст()); + + Возврат СериализаторXDTO.ПрочитатьXML(Чтение); +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2603,9 +3244,9 @@ НоваяСтрока = ТаблицаКонтактнойИнформации.Вставить(ИндексДобавляемойСтроки); ИмяРеквизита = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1%2%3", - "КонтактнаяИнформацияПоле", - СтрЗаменить(ДобавляемыйВид.УникальныйИдентификатор(), "-", "x"), - КоличествоСтрокВида + 1); + "КонтактнаяИнформацияПоле", + СтрЗаменить(ДобавляемыйВид.УникальныйИдентификатор(), "-", "x"), + КоличествоСтрокВида + 1); НоваяСтрока.ИмяРеквизита = ИмяРеквизита; НоваяСтрока.Вид = ДобавляемыйВид; НоваяСтрока.Тип = ИнформацияОВидеКИ.Тип; @@ -2779,8 +3420,11 @@ КонецЕсли; Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ГруппаРазделительКарты = Форма.Элементы.Добавить("ПодменюРазделительКонтекстКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню); + ГруппаРазделительКарты.Вид = ВидГруппыФормы.ГруппаКнопок; + ИмяКоманды = "КонтекстноеМенюКартаЯндекс" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), Элемент.КонтекстноеМеню); + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты); Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'"); Команда = Форма.Команды.Добавить(ИмяКоманды); Команда.Картинка = БиблиотекаКартинок.ЯндексКарты; @@ -2792,7 +3436,7 @@ ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); ИмяКоманды = "КонтекстноеМенюКартаGoogle" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), Элемент.КонтекстноеМеню); + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты); Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'"); Команда = Форма.Команды.Добавить(ИмяКоманды); Команда.Картинка = БиблиотекаКартинок.GoogleMaps; @@ -2802,7 +3446,16 @@ ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - + + ГруппКнопокРазделитель = Форма.Элементы.Добавить("ПодменюРазделительКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню); + ГруппКнопокРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; + + // Заполнить + ГруппаПодменюАдреса = Форма.Элементы.Добавить("КонтекстноеПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппКнопокРазделитель); + ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю; + ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст; + ГруппаПодменюАдреса.Заголовок = НСтр("ru='Заполнить'"); + КонецЕсли; Если ОбязательноеЗаполнение И ЭтоНовыйВидКИ И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда @@ -2813,13 +3466,13 @@ Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(ИнформацияОВидеКИ.Тип) И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда - Элемент.КнопкаВыбора = Истина; - Если ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда - Элемент.РедактированиеТекста = Ложь; - Элемент.ЦветФона = ЦветаСтиля.КонтактнаяИнформацияСРедактированиемВДиалогеЦвет; - КонецЕсли; - Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора"); - + Элемент.КнопкаВыбора = Истина; + Если ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда + Элемент.РедактированиеТекста = Ложь; + Элемент.ЦветФона = ЦветаСтиля.КонтактнаяИнформацияСРедактированиемВДиалогеЦвет; + КонецЕсли; + Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора"); + КонецЕсли; Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении"); @@ -2834,7 +3487,7 @@ Иначе ИмяКоманды = "КонтекстноеМенюВниз" + ПредыдущийЭлемент.Имя; КонецЕсли; - + Команда = Форма.Команды.Добавить(ИмяКоманды); Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ПредыдущийЭлемент.КонтекстноеМеню); @@ -2854,7 +3507,7 @@ ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - + КонецПроцедуры // Убирает разделители в номере телефона. @@ -2916,7 +3569,7 @@ Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500)); ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов"; - + Если СоздатьТаблицуКонтактнойИнформации Тогда Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500)); @@ -2978,7 +3631,7 @@ Объект.ПроверятьПоФИАС = ?(НастройкиПроверки = Неопределено, Ложь, НастройкиПроверки.ПроверятьПоФИАС); КонецЕсли; - Объект.АдресТолькоРоссийский = Ложь; + Объект.ТолькоНациональныйАдрес = Ложь; Объект.ВключатьСтрануВПредставление = Ложь; Объект.СкрыватьНеактуальныеАдреса = Ложь; @@ -3085,18 +3738,18 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных КАК ИмяВидаКонтактнойИнформации - |ИЗ - | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации - |ГДЕ - | ВидыКонтактнойИнформации.Ссылка = &Ссылка"; + | ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных КАК ИмяВидаКонтактнойИнформации + |ИЗ + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | ВидыКонтактнойИнформации.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ВидКИ); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Если РезультатЗапроса.Следующий() Тогда Возврат Сред(РезультатЗапроса.ИмяВидаКонтактнойИнформации, - СтрНайти(РезультатЗапроса.ИмяВидаКонтактнойИнформации, ИмяОбъекта) + СтрДлина(ИмяОбъекта)); + СтрНайти(РезультатЗапроса.ИмяВидаКонтактнойИнформации, ИмяОбъекта) + СтрДлина(ИмяОбъекта)); КонецЕсли; Возврат ""; @@ -3117,20 +3770,20 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ВидыКонтактнойИнформации.Вид КАК ВидКИ - |ПОМЕСТИТЬ ВидыКИ - |ИЗ - | &ТаблицаВидовКонтактнойИнформации КАК ВидыКонтактнойИнформации - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных КАК ИмяТабличнойЧасти, - | ВидыКИ.ВидКИ КАК ВидКонтактнойИнформации - |ИЗ - | ВидыКИ КАК ВидыКИ - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации - | ПО ВидыКИ.ВидКИ = ВидыКонтактнойИнформации.Ссылка"; + | ВидыКонтактнойИнформации.Вид КАК ВидКИ + |ПОМЕСТИТЬ ВидыКИ + |ИЗ + | &ТаблицаВидовКонтактнойИнформации КАК ВидыКонтактнойИнформации + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных КАК ИмяТабличнойЧасти, + | ВидыКИ.ВидКИ КАК ВидКонтактнойИнформации + |ИЗ + | ВидыКИ КАК ВидыКИ + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + | ПО ВидыКИ.ВидКИ = ВидыКонтактнойИнформации.Ссылка"; Запрос.УстановитьПараметр("ТаблицаВидовКонтактнойИнформации", ТаблицаВидовКонтактнойИнформации); РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -3156,7 +3809,7 @@ Функция ЕстьДругиеЗаполненныеСтрокКИДанногоВида(Знач Форма, Знач ПроверяемаяСтрока, Знач ВидКонтактнойИнформации) ВсеСтрокиЭтогоВида = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки( - Новый Структура("Вид", ВидКонтактнойИнформации)); + Новый Структура("Вид", ВидКонтактнойИнформации)); Для Каждого СтрокаВида Из ВсеСтрокиЭтогоВида Цикл @@ -3182,6 +3835,27 @@ //////////////////////////////////////////////////////////////////////////////// // Заполнение дополнительных реквизитов табличной части "Контактная информация". +Процедура ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, Объект, ТипКонтактнойИнформации) + + // Заполнение дополнительных реквизитов ТЧ. + Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаКонтактнойИнформации, Объект); + + ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(СтрокаКонтактнойИнформации, Объект); + + ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКонтактнойИнформации, Объект); + + ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда + ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКонтактнойИнформации, Объект); + + ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(СтрокаКонтактнойИнформации, Объект); + КонецЕсли; + +КонецПроцедуры + // Заполняет дополнительные реквизиты табличной части "Контактная информация" для адреса. // // Параметры: @@ -3199,13 +3873,11 @@ ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); ЭтоАдрес = ТипЗнч(Адрес) = Тип("ОбъектXDTO") И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес"); - Если ЭтоАдрес И Адрес.Состав <> Неопределено Тогда + Если ЭтоАдрес И Адрес.Состав <> Неопределено Тогда СтрокаТабличнойЧасти.Страна = Адрес.Страна; - АдресРФ = УправлениеКонтактнойИнформациейСлужебный.РоссийскийАдрес(Адрес); - Если АдресРФ <> Неопределено Тогда - // Российский адрес - СтрокаТабличнойЧасти.Регион = АдресРФ.СубъектРФ; - СтрокаТабличнойЧасти.Город = АдресРФ.Город; + + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + Обработки["РасширенныйВводКонтактнойИнформации"].ЗаполнитьРасширенныеРеквизитыТабличнойЧастиДляАдреса(Адрес, СтрокаТабличнойЧасти); КонецЕсли; КонецЕсли; @@ -3411,7 +4083,7 @@ КонецЕсли; ТипИнформации = СтрокаКИ.Тип; - + Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаКИ, ОбъектКИ); @@ -3487,7 +4159,7 @@ КонецЕсли; ЕстьОшибки = Ложь; - Если НЕ УправлениеКонтактнойИнформациейСлужебный.ЭтоРоссийскийАдрес(Источник) Тогда + Если НЕ УправлениеКонтактнойИнформациейСлужебный.ЭтоНациональныйАдрес(Источник) Тогда Возврат 0; КонецЕсли; ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); @@ -3499,11 +4171,13 @@ КонецЕсли; Если Адрес <> Неопределено И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - СписокОшибок = УправлениеКонтактнойИнформациейСлужебный.ОшибкиЗаполненияАдресаXDTO(Адрес, ВидИнформации); - Для Каждого Элемент Из СписокОшибок Цикл - ВывестиСообщениеПользователю(Элемент.Представление, ИмяРеквизита, ПолеРеквизита); - ЕстьОшибки = Истина; - КонецЦикла; + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + СписокОшибок = Обработки["РасширенныйВводКонтактнойИнформации"].ОшибкиЗаполненияАдресаXDTO(Адрес, ВидИнформации); + Для Каждого Элемент Из СписокОшибок Цикл + ВывестиСообщениеПользователю(Элемент.Представление, ИмяРеквизита, ПолеРеквизита); + ЕстьОшибки = Истина; + КонецЦикла; + КонецЕсли; КонецЕсли; Если ЕстьОшибки И ВидИнформации.ПроверятьКорректность Тогда @@ -3553,14 +4227,14 @@ Наименование = Неопределено; Если ДанныеЗаполнения.Свойство("Наименование", Наименование) И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "Наименование") Тогда - Объект.Наименование = Наименование; + Объект.Наименование = Наименование; КонецЕсли; // Таблица контактной информации, заполняется только если КИ не находится в другой ТЧ. КонтактнаяИнформация = Неопределено; Если ДанныеЗаполнения.Свойство("КонтактнаяИнформация", КонтактнаяИнформация) И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "КонтактнаяИнформация") Тогда - + Если ТипЗнч(КонтактнаяИнформация) = Тип("ТаблицаЗначений") Тогда КолонкиТаблицы = КонтактнаяИнформация.Колонки; Иначе @@ -3587,8 +4261,8 @@ КонецФункции -Функция ПараметрыКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ИсключаемыеВиды) - +Функция ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ИсключаемыеВиды) + Если ТипЗнч(Форма.ПараметрыКонтактнойИнформации) <> Тип("Структура") Тогда Форма.ПараметрыКонтактнойИнформации = Новый Структура; КонецЕсли; @@ -3611,6 +4285,8 @@ ПараметрыКонтактнойИнформации.Вставить("СписокДобавляемыхЭлементов", Новый СписокЗначений); ПараметрыКонтактнойИнформации.Вставить("МожноОтправлятьSMS", МожноОтправлятьSMS); ПараметрыКонтактнойИнформации.Вставить("Владелец", Неопределено); + ПараметрыАдреса = Новый Структура("ТипПомещения, Страна, Индекс", "Квартира"); + ПараметрыКонтактнойИнформации.Вставить("ПараметрыАдреса", ПараметрыАдреса); Форма.ПараметрыКонтактнойИнформации.Вставить(ИмяЭлементаДляРазмещения, ПараметрыКонтактнойИнформации); @@ -3625,7 +4301,7 @@ ГруппаВидовКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации[ИмяГруппыВидовКИ]; Возврат ГруппаВидовКонтактнойИнформации; - + КонецФункции // Определяет значение положения заголовка. Для поддержки локализованных конфигураций. @@ -3679,26 +4355,100 @@ СоздаватьДействиеДляТипа[Тип] = Ложь; КонецЕсли; + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); Если СоздаватьДействиеДляТипа[Тип] = Истина Тогда - // Есть действие - ИмяКоманды = "Команда" + ИмяРеквизита; - Команда = Форма.Команды.Добавить(ИмяКоманды); - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - Команда.Отображение = ОтображениеКнопки.Картинка; - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - - Элемент = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаДействий); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2); - Элемент.ИмяКоманды = ИмяКоманды; + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ГруппаПодменюВерхнийУровень = Форма.Элементы.Добавить("КоманднаяПанель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаДействий); + ГруппаПодменюВерхнийУровень.Вид = ВидГруппыФормы.КоманднаяПанель; + ГруппаПодменю = Форма.Элементы.Добавить("Подменю" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменюВерхнийУровень); + ГруппаПодменю.Вид = ВидГруппыФормы.Подменю; + ГруппаПодменю.Картинка = БиблиотекаКартинок.МенюДополнительныеФункции; + ГруппаПодменю.Отображение = ОтображениеКнопки.Картинка; + Иначе + ГруппаПодменю = ГруппаДействий; + + // Есть действие + ИмяКоманды = "Команда" + ИмяРеквизита; + Команда = Форма.Команды.Добавить(ИмяКоманды); + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + Команда.Отображение = ОтображениеКнопки.Картинка; + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + + Элемент = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2); + Элемент.ИмяКоманды = ИмяКоманды; + КонецЕсли; Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - Элемент.Заголовок = НСтр("ru = 'Заполнить'"); - Команда.Подсказка = НСтр("ru = 'Заполнить адрес из другого поля'"); - Команда.Картинка = БиблиотекаКартинок.ПереместитьВлево; - Команда.ИзменяетСохраняемыеДанные = Истина; + // Ввод комментария через контекстное меню. + ИмяКоманды = "КонтекстноеМенюПодменю" + ИмяРеквизита; + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю); + Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'"); + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Подсказка = НСтр("ru = 'Ввести комментарий'"); + Команда.Картинка = БиблиотекаКартинок.Комментарий; + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Команда.ИзменяетСохраняемыеДанные = Истина; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + + // История изменений + Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда + + ИмяКоманды = "КонтекстноеМенюПодменюИстория" + ИмяРеквизита; + Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаПодменю); + Кнопка.Заголовок = НСтр("ru = 'История изменений...'"); + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Картинка = БиблиотекаКартинок.ИсторияИзменений; + Команда.Подсказка = НСтр("ru = 'Показывает историю изменения контактной информации'"); + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Команда.ИзменяетСохраняемыеДанные = Ложь; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + КонецЕсли; + + // Устанавливаем свойства поля ввода. + ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделительАдрес" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменю); + ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; + + ИмяКоманды = "КартаЯндексМеню" + ИмяРеквизита; + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель); + Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'"); + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Картинка = БиблиотекаКартинок.ЯндексКарты; + Команда.Подсказка = НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'"); + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + + ИмяКоманды = "КартаGoogleМеню" + ИмяРеквизита; + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель); + Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'"); + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Картинка = БиблиотекаКартинок.GoogleMaps; + Команда.Подсказка = НСтр("ru = 'Показывает адрес на карте Google Maps'"); + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + + ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделитель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель); + ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; + + ГруппаПодменюАдреса = Форма.Элементы.Добавить("ПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель); + ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю; + ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст; + ГруппаПодменюАдреса.Заголовок = НСтр("ru='Заполнить'"); ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда @@ -3714,9 +4464,9 @@ ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда Если Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].МожноОтправлятьSMS Тогда - Элемент.Заголовок = НСтр("ru = 'Позвонить или отправить SMS'"); - Команда.Подсказка = НСтр("ru = 'Позвонить или отправить SMS'"); - Команда.Картинка = БиблиотекаКартинок.ПозвонитьИлиОтправитьSMS; + Элемент.Заголовок = НСтр("ru = 'Позвонить или отправить SMS'"); + Команда.Подсказка = НСтр("ru = 'Позвонить или отправить SMS'"); + Команда.Картинка = БиблиотекаКартинок.ПозвонитьИлиОтправитьSMS; Иначе Элемент.Заголовок = НСтр("ru = 'Позвонить'"); Команда.Подсказка = НСтр("ru = 'Позвонить по телефону'"); @@ -3760,4 +4510,140 @@ Возврат Неопределено; КонецФункции +Функция НайтиСтрокиКонтактнойИнформации(ВидКонтактнойИнформации, Дата, КонтактнаяИнформация) + + Отбор = Новый Структура("Вид", ВидКонтактнойИнформации); + Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда + Отбор.Вставить("ДействуетС", Дата); + КонецЕсли; + НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор); + Возврат НайденныеСтроки; + +КонецФункции + +Функция ЗапрещенВводНесколькихЗначений(ВидКонтактнойИнформации, КонтактнаяИнформация) + + Если ВидКонтактнойИнформации.РазрешитьВводНесколькихЗначений Тогда + Возврат Ложь; + КонецЕсли; + + Отбор = Новый Структура("Вид", ВидКонтактнойИнформации); + НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор); + Возврат НайденныеСтроки.Количество() > 0; + +КонецФункции + +Процедура ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(КонтактнаяИнформацияОбъекта, Периодическая, СтрокаКонтактнойИнформации) + + ЗаполнитьЗначенияСвойств(СтрокаКонтактнойИнформации, КонтактнаяИнформацияОбъекта); + Если Периодическая Тогда + СтрокаКонтактнойИнформации.ДействуетС = КонтактнаяИнформацияОбъекта.Дата; + КонецЕсли; + ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(СтрокаКонтактнойИнформации.ЗначенияПолей, СтрокаКонтактнойИнформации.Вид); + ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, ОбъектКонтактнойИнформации, КонтактнаяИнформацияОбъекта.Тип); + +КонецПроцедуры + +Процедура ОбработатьСтрокуКонтактнойИнформации(СтрокаКонтактнойИнформации, Периодическая) + + Если ПустаяСтрока(СтрокаКонтактнойИнформации.Представление) + И ПустаяСтрока(СтрокаКонтактнойИнформации.ЗначенияПолей) Тогда + Возврат; + КонецЕсли; + + Если ПустаяСтрока(СтрокаКонтактнойИнформации.Представление) Тогда + ФорматКонтактнойИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаКонтактнойИнформации.Вид, "Тип, ВключатьСтрануВПредставление, ПроверятьПоФИАС"); + ФорматКонтактнойИнформации.Вставить("ФорматАдреса", ?(ФорматКонтактнойИнформации.ПроверятьПоФИАС, "ФИАС", "КЛАДР")); + СтрокаКонтактнойИнформации.Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(СтрокаКонтактнойИнформации.ЗначенияПолей, ФорматКонтактнойИнформации); + КонецЕсли; + Если ПустаяСтрока(СтрокаКонтактнойИнформации.ЗначенияПолей) Тогда + КонтактнаяИнформацияXDTO = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(СтрокаКонтактнойИнформации.Представление, СтрокаКонтактнойИнформации.Вид); + СтрокаКонтактнойИнформации.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(КонтактнаяИнформацияXDTO); + КонецЕсли; + Если ПустаяСтрока(СтрокаКонтактнойИнформации.Тип) Тогда + СтрокаКонтактнойИнформации.Тип = СтрокаКонтактнойИнформации.Вид.Тип; + КонецЕсли; + + Если Периодическая + И НЕ ЗначениеЗаполнено(СтрокаКонтактнойИнформации.Дата) + И СтрокаКонтактнойИнформации.Вид.ХранитьИсториюИзменений Тогда + СтрокаКонтактнойИнформации.Дата = ТекущаяДатаСеанса(); + КонецЕсли; + +КонецПроцедуры + +// Приводит код страны к единому виду - строка длиной три символа. +// +Функция КодСтраныМира(Знач КодСтраны) + + Если ТипЗнч(КодСтраны)=Тип("Число") Тогда + Возврат Формат(КодСтраны, "ЧЦ=3; ЧН=; ЧВН=; ЧГ="); + КонецЕсли; + + Возврат Прав("000" + КодСтраны, 3); +КонецФункции + +// Возвращает строку в кавычках. +// +Функция КонтрольКавычекВСтроке(Знач Строка) + Возврат """" + СтрЗаменить(Строка, """", """""") + """"; +КонецФункции + +Процедура ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения) + + ПараметрыКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; + ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + НайденныеСтроки = ВсеСтроки.НайтиСтроки( Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", Перечисления.ТипыКонтактнойИнформации.Адрес, Ложь) ); + + Для Каждого СтрокаКИ Из ВсеСтроки Цикл + Если СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ЭлементФормы = Форма.Элементы.Найти("ПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); + ЭлементФормыКонтекстноеПодменю = Форма.Элементы.Найти("КонтекстноеПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); + Если ЭлементФормыКонтекстноеПодменю <> Неопределено Тогда + + Для Каждого Адрес Из НайденныеСтроки Цикл + Если НЕ Адрес.ЭтоИсторическаяКонтактнаяИнформация + И Адрес.ИмяРеквизита <> СтрокаКИ.ИмяРеквизита Тогда + Если ЭлементФормы <> Неопределено Тогда + ИмяКоманды = "МенюПодменюАдрес" + СтрокаКИ.ИмяРеквизита + "_" + Адрес.ИмяРеквизита; + Кнопка = Форма.Элементы.Найти(ИмяКоманды); + Если Кнопка = Неопределено Тогда + Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭлементФормы); + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Подсказка = НСтр("ru = 'Скопировать адрес'"); + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Команда.ИзменяетСохраняемыеДанные = Истина; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + КонецЕсли; + Кнопка.Заголовок = Адрес.Представление; + Кнопка.Видимость = ЗначениеЗаполнено(Адрес.Представление); + КонецЕсли; + ИмяКоманды = "МенюПодменюАдрес" + СтрокаКИ.ИмяРеквизита + "_" + Адрес.ИмяРеквизита +"_"; + Кнопка = Форма.Элементы.Найти(ИмяКоманды); + Если Кнопка = Неопределено Тогда + Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ЭлементФормыКонтекстноеПодменю); + Кнопка.Заголовок = Адрес.Представление; + Команда = Форма.Команды.Добавить(ИмяКоманды); + Команда.Подсказка = НСтр("ru = 'Скопировать адрес'"); + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Команда.ИзменяетСохраняемыеДанные = Истина; + Кнопка.ИмяКоманды = ИмяКоманды; + + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + КонецЕсли; + Кнопка.Заголовок = Адрес.Представление; + Кнопка.Видимость = ЗначениеЗаполнено(Адрес.Представление); + + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl index c38b97f3b..f52f6aac3 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Обработчик события ПриИзменении поля формы контактной информации. @@ -14,51 +9,8 @@ // ЭтоТабличнаяЧасть - Булево - Флаг того, что элемент является частью таблицы формы. // Процедура ПриИзменении(Форма, Элемент, ЭтоТабличнаяЧасть = Ложь) Экспорт - - ЭтоТабличнаяЧасть = ЭтоТабличнаяЧасть(Элемент); - Если ЭтоТабличнаяЧасть Тогда - ДанныеЗаполнения = Форма.Элементы[Форма.ТекущийЭлемент.Имя].ТекущиеДанные; - Если ДанныеЗаполнения = Неопределено Тогда - Возврат; - КонецЕсли; - Иначе - ДанныеЗаполнения = Форма; - КонецЕсли; - - // Если это очистка, то сбрасываем представление. - ДанныеСтроки = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть); - Если ДанныеСтроки = Неопределено Тогда - Возврат; - КонецЕсли; - - Текст = Элемент.ТекстРедактирования; - Если ПустаяСтрока(Текст) Тогда - ДанныеЗаполнения[Элемент.Имя] = ""; - Если ЭтоТабличнаяЧасть Тогда - ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = ""; - КонецЕсли; - ДанныеСтроки.Представление = ""; - ДанныеСтроки.ЗначенияПолей = Неопределено; - Возврат; - КонецЕсли; - - Если ДанныеСтроки.Свойство("ХранитьИсториюИзменений") - И ДанныеСтроки.ХранитьИсториюИзменений - И НачалоДня(ДанныеСтроки.ДействуетС) <> НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()) Тогда - ИсторическаяКонтактнаяИнформация = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); - ЗаполнитьЗначенияСвойств(ИсторическаяКонтактнаяИнформация, ДанныеСтроки); - ИсторическаяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина; - ИсторическаяКонтактнаяИнформация.ИмяРеквизита = ""; - ДанныеСтроки.ДействуетС = НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()); - КонецЕсли; - - ДанныеСтроки.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияXMLПоПредставлению(Текст, ДанныеСтроки.Вид); - ДанныеСтроки.Представление = Текст; - - Если ЭтоТабличнаяЧасть Тогда - ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = ДанныеСтроки.ЗначенияПолей; - КонецЕсли; + ПриИзмененииКонтактнойИнформации(Форма, Элемент, ЭтоТабличнаяЧасть, Истина); КонецПроцедуры @@ -92,10 +44,12 @@ ДанныеСтроки = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть); // Если представление было изменено в поле и не соответствует реквизиту, то приводим в соответствие. + ОбновитьКонтекстноеМеню = Ложь; Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда Если ДанныеЗаполнения[Элемент.Имя] <> Элемент.ТекстРедактирования Тогда ДанныеЗаполнения[Элемент.Имя] = Элемент.ТекстРедактирования; - ПриИзменении(Форма, Элемент, ЭтоТабличнаяЧасть); + ПриИзмененииКонтактнойИнформации(Форма, Элемент, ЭтоТабличнаяЧасть, Ложь); + ОбновитьКонтекстноеМеню = Истина; Форма.Модифицированность = Истина; КонецЕсли; ТекстРедактирования = Элемент.ТекстРедактирования; @@ -103,11 +57,16 @@ ТекстРедактирования = ?(ЗначениеЗаполнено(ДанныеСтроки.ЗначенияПолей), Форма[Элемент.Имя], ""); КонецЕсли; + ПараметрыКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ДанныеСтроки.ИмяЭлементаДляРазмещения]; + ПараметрыОткрытияФормы = Новый Структура; ПараметрыОткрытияФормы.Вставить("ВидКонтактнойИнформации", ДанныеСтроки.Вид); - ПараметрыОткрытияФормы.Вставить("ЗначенияПолей", ДанныеСтроки.ЗначенияПолей); - ПараметрыОткрытияФормы.Вставить("Представление", ТекстРедактирования); + ПараметрыОткрытияФормы.Вставить("ЗначенияПолей", ДанныеСтроки.ЗначенияПолей); + ПараметрыОткрытияФормы.Вставить("Представление", ТекстРедактирования); ПараметрыОткрытияФормы.Вставить("ТолькоПросмотр", Форма.ТолькоПросмотр); + ПараметрыОткрытияФормы.Вставить("ТипПомещения", ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения); + ПараметрыОткрытияФормы.Вставить("Страна", ПараметрыКонтактнойИнформации.ПараметрыАдреса.Страна); + ПараметрыОткрытияФормы.Вставить("Индекс", ПараметрыКонтактнойИнформации.ПараметрыАдреса.Индекс); ПараметрыОткрытияФормы.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов", Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов); Если Не ЭтоТабличнаяЧасть Тогда @@ -121,15 +80,17 @@ КонецЕсли; Оповещение = Новый ОписаниеОповещения("ПредставлениеНачалоВыбораЗавершение", ЭтотОбъект, Новый Структура); - Оповещение.ДополнительныеПараметры.Вставить("ДанныеЗаполнения", ДанныеЗаполнения); - Оповещение.ДополнительныеПараметры.Вставить("ЭтоТабличнаяЧасть", ЭтоТабличнаяЧасть); - Оповещение.ДополнительныеПараметры.Вставить("ИмяЭлементаРазмещения", ДанныеСтроки.ИмяЭлементаДляРазмещения); - Оповещение.ДополнительныеПараметры.Вставить("ДанныеСтроки", ДанныеСтроки); - Оповещение.ДополнительныеПараметры.Вставить("Элемент", Элемент); - Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); - Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); + Оповещение.ДополнительныеПараметры.Вставить("ДанныеЗаполнения", ДанныеЗаполнения); + Оповещение.ДополнительныеПараметры.Вставить("ЭтоТабличнаяЧасть", ЭтоТабличнаяЧасть); + Оповещение.ДополнительныеПараметры.Вставить("ИмяЭлементаРазмещения", ДанныеСтроки.ИмяЭлементаДляРазмещения); + Оповещение.ДополнительныеПараметры.Вставить("ДанныеСтроки", ДанныеСтроки); + Оповещение.ДополнительныеПараметры.Вставить("Элемент", Элемент); + Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); + Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); + Оповещение.ДополнительныеПараметры.Вставить("ОбновитьКонтекстноеМеню", ОбновитьКонтекстноеМеню); ОткрытьФормуКонтактнойИнформации(ПараметрыОткрытияФормы,, Оповещение); + КонецПроцедуры // Обработчик события Очистка поля формы контактной информации. @@ -149,6 +110,11 @@ Форма[ИмяРеквизита] = ""; Форма.Модифицированность = Истина; + + Если НайденнаяСтрока.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); + Результат.Вставить("ИмяЭлементаДляРазмещения", НайденнаяСтрока.ИмяЭлементаДляРазмещения); + КонецЕсли; ОбновитьКонтактнуюИнформациюФормы(Форма, Результат); КонецПроцедуры @@ -175,6 +141,16 @@ ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "Команда") Тогда ИмяРеквизита = СтрЗаменить(ИмяКоманды, "Команда", ""); КомандаКонтекстногоМеню = Неопределено; + ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "МенюПодменюАдрес") Тогда + ИмяРеквизита = СтрЗаменить(ИмяКоманды, "МенюПодменюАдрес", ""); + ИмяРеквизитаСтруктура = СтрРазделить(ИмяРеквизита, "_"); + ИмяРеквизитаИсточник = ИмяРеквизитаСтруктура[0]; + ИмяРеквизита = ИмяРеквизитаСтруктура[1]; + КомандаКонтекстногоМеню = Неопределено; + ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "КартаЯндексМеню") + ИЛИ СтрНачинаетсяС(ИмяКоманды, "КартаGoogleМеню") Тогда + КомандаКонтекстногоМеню = КомандаКонтекстногоМеню(ИмяКоманды); + ИмяРеквизита = Сред(КомандаКонтекстногоМеню.ИмяРеквизита, 5); Иначе КомандаКонтекстногоМеню = КомандаКонтекстногоМеню(ИмяКоманды); ИмяРеквизита = КомандаКонтекстногоМеню.ИмяРеквизита; @@ -212,12 +188,20 @@ КонецЕсли; ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда - ЗаполнитьАдрес(Форма, ИмяРеквизита, НайденнаяСтрока, Результат); + + Результат = Новый Структура("ИмяРеквизита", ИмяРеквизитаИсточник); + СтрокаПотребитель = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; + ЗаполнитьЗначенияСвойств(СтрокаПотребитель, НайденнаяСтрока, "ЗначенияПолей,Представление,Комментарий"); + Форма[СтрокаПотребитель.ИмяРеквизита] = НайденнаяСтрока.Представление; + + Форма.Модифицированность = Истина; + Результат = Новый Структура("ОбновитьКонтекстноеМеню, ИмяЭлементаДляРазмещения", Истина, НайденнаяСтрока.ИмяЭлементаДляРазмещения); + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат); ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда АдресПочты = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; ИсточникКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].Владелец; - СоздатьЭлектронноеПисьмо("", АдресПочты , ТипКонтактнойИнформации, ИсточникКонтактнойИнформации); + СоздатьЭлектронноеПисьмо("", АдресПочты, ТипКонтактнойИнформации, ИсточникКонтактнойИнформации); ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда МожноОтправлятьSMS = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].МожноОтправлятьSMS; @@ -329,24 +313,32 @@ // Конструктор для структуры параметров открытия формы контактной информации. // -// Параметры: -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид редактируемой контактной информации. -// Значение - Строка - Сериализованное значение полей контактной информации в формате XML. -// Представление - Строка - Необязательный. Представление контактной информации. -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Необязательный. Тип контактной информации. -// Если указан, то в возвращаемую структуру добавляются поля соответствующие типу. +// Параметры: +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид редактируемой контактной информации. +// Значение - Строка - Сериализованное значение полей контактной информации в формате XML. +// Представление - Строка - Необязательный. Представление контактной информации. +// Комментарий - Строка - Комментарий контактной информации. +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Необязательный. Тип контактной информации. +// Если указан, то в возвращаемую структуру добавляются поля соответствующие типу. +// // Возвращаемое значение: -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид редактируемой информации, -// Значение - Строка - Сериализованное значение полей контактной информации. -// Представление - Строка - Необязательное представление. -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации, если был указан в параметрах. -// Страна - Строка - Страна мира, только если указан тип контактной информации Адрес. -// Регион - Строка - Значение поле региона, только если указан тип контактной информации Адрес. Актуально для стран ЕАЭС. -// Индекс - Строка - Страна мира, только если указан тип контактной информации Адрес. -// КодСтраны - Строка - Телефонный код страны мира, только если указан тип контактной информации Телефон. -// КодГорода - Строка - Телефонный код города, только если указан тип контактной информации Телефон. -// НомерТелефона - Строка - Телефонный номер, только если указан тип контактной информации Телефон. -// Добавочный - Строка - Добавочный телефонный номер, только если указан тип контактной информации Телефон. +// Структура - содержит поля: +// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид редактируемой информации, +// * Значение - Строка - Сериализованное значение полей контактной информации. +// * Представление - Строка - Необязательное представление. +// * ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации, если был указан +// в параметрах. +// * Страна - Строка - Страна мира, только если указан тип контактной информации Адрес. +// * Регион - Строка - Значение поле региона, только если указан тип контактной информации Адрес. +// Актуально для стран ЕАЭС. +// * Индекс - Строка - Страна мира, только если указан тип контактной информации Адрес. +// * ТипПомещения - Строка - Тип помещения в форме ввода нового адреса, , только если указан тип контактной +// информации Адрес. +// * КодСтраны - Строка - Телефонный код страны мира, только если указан тип контактной информации Телефон. +// * КодГорода - Строка - Телефонный код города, только если указан тип контактной информации Телефон. +// * НомерТелефона - Строка - Телефонный номер, только если указан тип контактной информации Телефон. +// * Добавочный - Строка - Добавочный телефонный номер, только если указан тип контактной информации Телефон. +// Функция ПараметрыФормыКонтактнойИнформации(ВидКонтактнойИнформации, Значение, Представление = Неопределено, Комментарий = Неопределено, ТипКонтактнойИнформации = Неопределено) Экспорт @@ -361,6 +353,7 @@ ПараметрыФормы.Вставить("Страна"); ПараметрыФормы.Вставить("Регион"); ПараметрыФормы.Вставить("Индекс"); + ПараметрыФормы.Вставить("ТипПомещения", "Квартира"); ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда ПараметрыФормы.Вставить("КодСтраны"); ПараметрыФормы.Вставить("КодГорода"); @@ -381,7 +374,7 @@ // Оповещение - ОписаниеОповещения - для обработки закрытия формы. // // Возвращаемое значение: -// УправляемаяФорма - необходимая форма. +// УправляемаяФорма - необходимая форма. // Функция ОткрытьФормуКонтактнойИнформации(Параметры, Владелец = Неопределено, Оповещение = Неопределено) Экспорт Параметры.Вставить("ОткрытаПоСценарию", Истина); @@ -390,13 +383,13 @@ // Создает письмо по контактной информации. // -// Параметры: -// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - контактная информация. -// Представление - Строка - представление. Используется, если невозможно определить представление из параметра. -// ЗначенияПолей (отсутствие поля "Представление"). -// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура - -// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. -// ИсточникКонтактнойИнформации - ЛюбаяСсылка - Ссылка на источник являющийся владельцем адрес электронной почты. +// Параметры: +// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - значение контактной информации. +// Представление - Строка - Представление контактной информации. Используется, если невозможно определить +// представление из параметра. ЗначенияПолей (отсутствие поля "Представление"). +// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, +// Структура - Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. +// ИсточникКонтактнойИнформации - Произвольный - Объект владелец контактной информации. // Процедура СоздатьЭлектронноеПисьмо(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено, ИсточникКонтактнойИнформации = Неопределено) Экспорт @@ -423,27 +416,29 @@ МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); Получатель = Новый Массив; - Получатель.Добавить(Новый Структура("Адрес, Представление, ИсточникКонтактнойИнформации", АдресПочты, Строка(ИсточникКонтактнойИнформации), ИсточникКонтактнойИнформации)); + Получатель.Добавить(Новый Структура("Адрес, Представление, ИсточникКонтактнойИнформации", + АдресПочты, СтрЗаменить(Строка(ИсточникКонтактнойИнформации), ",", ""), ИсточникКонтактнойИнформации)); ПараметрыОтправки = Новый Структура("Получатель", Получатель); МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); - Возврат; + Иначе + // Нет подсистемы почты, запускаем системное. + Оповещение = Новый ОписаниеОповещения("СоздатьПисьмоПоКонтактнойИнформацииЗавершение", ЭтотОбъект, АдресПочты); + ТекстПредложения = НСтр("ru = 'Для отправки письма необходимо установить расширение для работы с файлами.'"); + ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстПредложения); КонецЕсли; - // Нет подсистемы почты, запускаем системное. - Оповещение = Новый ОписаниеОповещения("СоздатьПисьмоПоКонтактнойИнформацииЗавершение", ЭтотОбъект, АдресПочты); - ТекстПредложения = НСтр("ru = 'Для отправки письма необходимо установить расширение для работы с файлами.'"); - ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстПредложения); - КонецПроцедуры // Создает письмо по контактной информации. // -// Параметры: -// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - контактная информация. -// Представление - Строка - представление. Используется, если невозможно определить представление из параметра. -// ЗначенияПолей (отсутствие поля "Представление"). -// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура -// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. +// Параметры: +// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - Контактная информация. +// Представление - Строка - Представление. Используется, если невозможно определить представление из параметра. +// ЗначенияПолей (отсутствие поля "Представление"). +// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, +// Структура - Используется для определения типа, если его невозможно вычислить по полю +// ЗначенияПолей. +// ИсточникКонтактнойИнформации - ЛюбаяСсылка - Объект который является источником контактной информации. // Процедура СоздатьSMS(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено, ИсточникКонтактнойИнформации = "") Экспорт @@ -483,14 +478,69 @@ КонецПроцедуры +// Совершает звонок на переданный номер телефона по SIP телефонии, +// а если она не доступна, то с использованием программы Skype. +// +// Параметры: +// НомерТелефона -Строка - номера телефона на который будет осуществлен звонок. +// +Процедура ПозвонитьПоТелефону(НомерТелефона) Экспорт + + НомерТелефона = СтроковыеФункцииКлиентСервер.ЗаменитьОдниСимволыДругими("()_- ", НомерТелефона, ""); + + ИмяПротокола = "tel"; // по умолчанию используем "tel". + + #Если НЕ ВебКлиент Тогда + ДоступноеИмяПротокола = ПрограммаТелефонииУстановлена(); + Если ДоступноеИмяПротокола = Неопределено Тогда + СтрокаСПредупреждением = Новый ФорматированнаяСтрока( + НСтр("ru = 'Для совершения звонка требуется установить программу телефонии, например'"), + " ", Новый ФорматированнаяСтрока("Skype",,,, "http://www.skype.com"), "."); + ПоказатьПредупреждение(Неопределено, СтрокаСПредупреждением); + Возврат; + ИначеЕсли НЕ ПустаяСтрока(ДоступноеИмяПротокола) Тогда + ИмяПротокола = ДоступноеИмяПротокола; + КонецЕсли; + #КонецЕсли + + СтрокаЗапуска = ИмяПротокола + ":" + НомерТелефона; + + Оповещение = Новый ОписаниеОповещения("СовершитьЗвонок", ЭтотОбъект, СтрокаЗапуска); + ТекстСообщения = НСтр("ru = 'Для совершения звонка необходимо установить расширение работы с файлами.'"); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); + +КонецПроцедуры + +// Совершает звонок в программы Skype. +// +// Параметры: +// ЛогинSkype - Строка - Логин Skype. +// +Процедура ПозвонитьНаSkype(ЛогинSkype) Экспорт + + ОткрытьSkype("skype:" + ЛогинSkype + "?call"); + +КонецПроцедуры + +// Открыть окно беседы(чат) в программе Skype +// +// Параметры: +// ЛогинSkype - Строка - Логин Skype. +// +Процедура НачатьБеседуВSkype(ЛогинSkype) Экспорт + + ОткрытьSkype("skype:" + ЛогинSkype + "?chat"); + +КонецПроцедуры + // Открывает ссылку по контактной информации. // // Параметры: -// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - контактная информация. -// Представление - Строка - представление. Используется, если невозможно определить представление из параметра. -// ЗначенияПолей (отсутствие поля "Представление"). -// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура -// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. +// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - Контактная информация. +// Представление - Строка - Представление. Используется, если невозможно определить представление из параметра. +// ЗначенияПолей (отсутствие поля "Представление"). +// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура - +// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. // Процедура ПерейтиПоВебСсылке(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено) Экспорт @@ -537,14 +587,14 @@ // Отображает форму с историей изменения контактной информации. // // Параметры: -// Форма - УправляемаяФорма - Форма владельца контактной информации. -// ПараметрыКонтактнойИнформации - Структура -параметры контактной информации. +// Форма - УправляемаяФорма - Форма с контактной информацией. +// ПараметрыКонтактнойИнформации - Структура - Сведения о элементе контактной информации. // Процедура ОткрытьФормуИсторииИзменений(Форма, ПараметрыКонтактнойИнформации) Экспорт Результат = Новый Структура("Вид", ПараметрыКонтактнойИнформации.Вид); НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат); - + СписокКонтактнойИнформации = Новый Массив; Для каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл КонтактнаяИнформация = Новый Структура("Представление, ЗначенияПолей, ДействуетС"); @@ -570,8 +620,6 @@ #Область УстаревшиеПроцедурыИФункции // Устарела. Следует использовать ПриИзменении(). -// Обработчик события ПриИзменении поля формы контактной информации. -// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация". // // Параметры: // Форма - УправляемаяФорма - Форма владельца контактной информации. @@ -583,17 +631,15 @@ КонецПроцедуры // Устарела. Следует использовать НачалоВыбора(). -// Обработчик события НачалоВыбора поля формы контактной информации. -// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация". // // Параметры: // Форма - УправляемаяФорма - Форма владельца контактной информации. // Элемент - ПолеФормы - Элемент формы, содержащий представление контактной информации. // Модифицированность - Булево - Устанавливаемый флаг модифицированности формы. // СтандартнаяОбработка - Булево - Устанавливаемый флаг стандартной обработки события формы. -// +// // Возвращаемое значение: -// Неопределено - не используется, оставлено для обратной совместимости. +// Неопределено - Не используется, обратная совместимость. // Функция ПредставлениеНачалоВыбора(Форма, Элемент, Модифицированность = Истина, СтандартнаяОбработка = Ложь) Экспорт НачалоВыбора(Форма, Элемент, Модифицированность, СтандартнаяОбработка); @@ -601,15 +647,13 @@ КонецФункции // Устарела. Следует использовать Очистка(). -// Обработчик события Очистка поля формы контактной информации. -// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация". // // Параметры: -// Форма - УправляемаяФорма - Форма владельца контактной информации. -// ИмяРеквизита - Строка - Имя реквизита формы, связанного с представление контактной информации. -// +// Форма - УправляемаяФорма - Форма владельца контактной информации. +// ИмяРеквизита - Строка - Имя реквизита формы, связанного с представление контактной информации. +// // Возвращаемое значение: -// Неопределено - не используется, оставлено для обратной совместимости. +// Неопределено - Не используется, обратная совместимость. // Функция ПредставлениеОчистка(Форма, ИмяРеквизита) Экспорт Очистка(Форма, ИмяРеквизита); @@ -617,15 +661,13 @@ КонецФункции // Устарела. Следует использовать ВыполнитьКоманду(). -// Обработчик команды, связанной с контактной информации (написать письмо, открыть адрес, и т.п.). -// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация". // // Параметры: -// Форма - УправляемаяФорма - Форма владельца контактной информации. -// ИмяКоманды - Строка - Имя автоматически сгенерированной команды действия. -// +// Форма - УправляемаяФорма - Форма владельца контактной информации. +// ИмяКоманды - Строка - Имя автоматически сгенерированной команды действия. +// // Возвращаемое значение: -// Неопределено - не используется, оставлено для обратной совместимости. +// Неопределено - Не используется, обратная совместимость. // Функция ПодключаемаяКоманда(Форма, ИмяКоманды) Экспорт ВыполнитьКоманду(Форма, ИмяКоманды); @@ -692,6 +734,13 @@ Процедура ПредставлениеНачалоВыбораЗавершение(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт Если ТипЗнч(РезультатЗакрытия) <> Тип("Структура") Тогда + Если ДополнительныеПараметры.Свойство("ОбновитьКонтекстноеМеню") + И ДополнительныеПараметры.ОбновитьКонтекстноеМеню Тогда + Результат = Новый Структура(); + Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); + Результат.Вставить("ИмяЭлементаДляРазмещения", ДополнительныеПараметры.ИмяЭлементаРазмещения); + ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, Результат); + КонецЕсли; Возврат; КонецЕсли; @@ -718,7 +767,7 @@ ЭтоИсторическаяКонтактнаяИнформация = Ложь; ПоследниеЗначениеПолей = ""; - Если НайденныеСтроки.Количество() > 1 Тогда + Если НайденныеСтроки.Количество() > 1 Тогда СтрокаСДействующимАдресом = Неопределено; МинимальнаяДата = Неопределено; @@ -727,6 +776,7 @@ НоваяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяКонтактнаяИнформация, СтрокаКонтактнойИнформации); + НоваяКонтактнаяИнформация.ИмяЭлементаДляРазмещения = ДополнительныеПараметры.ИмяЭлементаРазмещения; Если СтрокаСДействующимАдресом = Неопределено ИЛИ СтрокаКонтактнойИнформации.ДействуетС > СтрокаСДействующимАдресом.ДействуетС Тогда @@ -757,6 +807,7 @@ ИначеЕсли НайденныеСтроки.Количество() = 1 Тогда НоваяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяКонтактнаяИнформация, НайденныеСтроки[0],, "ДействуетС"); + НоваяКонтактнаяИнформация.ИмяЭлементаДляРазмещения = ДополнительныеПараметры.ИмяЭлементаРазмещения; НоваяСтрока.ДействуетС = Дата(1, 1, 1); КонецЕсли; @@ -796,6 +847,10 @@ ДанныеЗаполнения[Элемент.Имя] = ТекстПредставления; КонецЕсли; + Если РезультатЗакрытия.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); + КонецЕсли; + Форма.Модифицированность = Истина; ОбновитьКонтактнуюИнформациюФормы(Форма, Результат); КонецПроцедуры @@ -810,6 +865,9 @@ Результат.Вставить("ДобавляемыйВид", ВыбранныйЭлемент.Значение); Результат.Вставить("ИмяЭлементаДляРазмещения", ДополнительныеПараметры.ИмяЭлементаДляРазмещения); Результат.Вставить("ИмяКоманды", ДополнительныеПараметры.ИмяКоманды); + Если ВыбранныйЭлемент.Значение.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); + КонецЕсли; ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, Результат); КонецПроцедуры @@ -818,106 +876,7 @@ // Процедура заглушка, т.к. НачатьЗапускПриложения требуется наличие обработчика оповещения. КонецПроцедуры -// Обработчик события НачалоВыбора для улицы. -// -// Параметры: -// Владелец - Произвольный - вызывающий элемент формы. -// ИдентификаторНаселенногоПункта - УникальныйИдентификатор - ограничение по населенному пункту. -// ТекущееЗначение - УникальныйИдентификатор, Строка - текущее значение - или код классификатора, -// или текст. -// ДополнительныеПараметры - Структура - дополнительная структура параметров. -// -Процедура НачалоВыбораУлицы(Владелец, ИдентификаторНаселенногоПункта, ТекущееЗначение, ДополнительныеПараметры) Экспорт - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат; - КонецЕсли; - - СкрыватьНеактуальныеАдреса = Неопределено; - ДополнительныеПараметры.Свойство("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); - Если СкрыватьНеактуальныеАдреса = Неопределено Тогда - СкрыватьНеактуальныеАдреса = Ложь; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("Родитель", ИдентификаторНаселенногоПункта); - Параметры.Вставить("ПредставлениеУлицы", ТекущееЗначение); - Параметры.Вставить("Уровень", 7); - Параметры.Вставить("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); - Параметры.Вставить("НаселенныйПунктДетально", ДополнительныеПараметры.НаселенныйПунктДетально); - - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборУлицы", Параметры, Владелец, - ,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); -КонецПроцедуры - -// Предлагает загрузить адресный классификатор. -// -// Параметры: -// Текст - Строка - Дополнительный текст предложения. -// Регион - Число, Строка - Код или название региона для загрузки. -// -Процедура ПредложениеЗагрузкиКлассификатора(Знач Текст = "", Знач Регион = Неопределено) Экспорт - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат; - КонецЕсли; - - НеЗагружатьАдресныйКлассификатор = ПараметрыПриложения.Получить("АдресныйКлассификатор.НеЗагружатьКлассификатор"); - Если НеЗагружатьАдресныйКлассификатор = Неопределено ИЛИ НеЗагружатьАдресныйКлассификатор = Ложь Тогда - ТипПараметраРегиона = ТипЗнч(Регион); - ПараметрыФормы = Новый Структура; - ПараметрыЗагрузки = Новый Структура; - ПараметрыФормы.Вставить("ТекстПредупреждения", Текст); - - Если ТипПараметраРегиона = Тип("Число") Тогда - ПараметрыЗагрузки.Вставить("КодРегионаДляЗагрузки", Регион); - - ИначеЕсли ТипПараметраРегиона = Тип("Строка") Тогда - ПараметрыЗагрузки.Вставить("НазваниеРегиона", Регион); - ПараметрыФормы.Вставить("НазваниеРегиона", Регион); - КонецЕсли; - - Оповещение = Новый ОписаниеОповещения("ПредложениеЗагрузкиКлассификатораЗавершение", ЭтотОбъект, ПараметрыЗагрузки); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ЗагрузкаАдресногоКлассификатора", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - КонецЕсли; - -КонецПроцедуры - -Процедура ПредложениеЗагрузкиКлассификатораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт - - Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); -КонецПроцедуры - -// Загружает адресный классификатор. -// -Процедура ЗагрузитьАдресныйКлассификатор(Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); - МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); - КонецЕсли; - -КонецПроцедуры - -// Страны ЕАЭС поддерживающие структурированный ввод. -// -// Возвращаемое значение: -// Соответствие - Список стран. -// -Функция СтраныПоддерживающиеСтруктурированныйВвод() Экспорт - СписокСтран = Новый Соответствие; - СписокСтран.Вставить("БЕЛАРУСЬ", Истина); - СписокСтран.Вставить("КАЗАХСТАН", Истина); - СписокСтран.Вставить("АРМЕНИЯ", Истина); - СписокСтран.Вставить("КИРГИЗИЯ", Истина); - Возврат СписокСтран; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////// // Завершение модального диалога создания письма. Процедура СоздатьПисьмоПоКонтактнойИнформацииЗавершение(Действие, АдресПочты) Экспорт @@ -930,34 +889,6 @@ #Область СлужебныеПроцедурыИФункции -Процедура ПослеВыбораИзМенюSkype(ВыбранныйЭлемент, Параметры) Экспорт - - Если ВыбранныйЭлемент = Неопределено Тогда - Возврат; - КонецЕсли; - - #Если НЕ ВебКлиент Тогда - Если ПустаяСтрока(ПрограммаТелефонииУстановлена("skype")) Тогда - ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Для совершения звонка по Skype требуется установить программу.'")); - Возврат; - КонецЕсли; - #КонецЕсли - - СтрокаЗапуска = "skype:" + Параметры.ЛогинSkype; - Если ВыбранныйЭлемент.Значение = "Позвонить" Тогда - СтрокаЗапуска = СтрокаЗапуска + "?call"; - ИначеЕсли ВыбранныйЭлемент.Значение = "НачатьЧат" Тогда - СтрокаЗапуска = СтрокаЗапуска + "?chat"; - Иначе - СтрокаЗапуска = СтрокаЗапуска + "?userinfo"; - КонецЕсли; - - Оповещение = Новый ОписаниеОповещения("ЗапускSkype", ЭтотОбъект, СтрокаЗапуска); - ТекстСообщения = НСтр("ru = 'Для запуска Skype необходимо установить расширение работы с файлами.'"); - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); - -КонецПроцедуры - Процедура ПослеВыбораИзМенюТелефон(ВыбранныйЭлемент, Параметры) Экспорт Если ВыбранныйЭлемент <> Неопределено Тогда @@ -969,6 +900,35 @@ КонецЕсли; КонецПроцедуры +Процедура ПослеВыбораИзМенюSkype(ВыбранныйЭлемент, Параметры) Экспорт + + Если ВыбранныйЭлемент = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ВыбранныйЭлемент.Значение = "Позвонить" Тогда + ПозвонитьНаSkype(Параметры.ЛогинSkype); + ИначеЕсли ВыбранныйЭлемент.Значение = "НачатьЧат" Тогда + НачатьБеседуВSkype(Параметры.ЛогинSkype); + КонецЕсли; + +КонецПроцедуры + +Процедура ОткрытьSkype(СтрокаЗапуска) + + #Если НЕ ВебКлиент Тогда + Если ПустаяСтрока(ПрограммаТелефонииУстановлена("skype")) Тогда + ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Для совершения звонка по Skype требуется установить программу.'")); + Возврат; + КонецЕсли; + #КонецЕсли + + Оповещение = Новый ОписаниеОповещения("ЗапускSkype", ЭтотОбъект, СтрокаЗапуска); + ТекстСообщения = НСтр("ru = 'Для запуска Skype необходимо установить расширение работы с файлами.'"); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); + +КонецПроцедуры + Процедура ЗапускSkype(РасширениеПодключено, СтрокаЗапуска) Экспорт Если РасширениеПодключено Тогда @@ -978,34 +938,6 @@ КонецПроцедуры -Процедура ПозвонитьПоТелефону(НомерТелефона) - - НомерТелефона = СтроковыеФункцииКлиентСервер.ЗаменитьОдниСимволыДругими("()_- ", НомерТелефона, ""); - - // по умолчанию используем "tel". - ИмяПротокола = "tel"; - - #Если НЕ ВебКлиент Тогда - ДоступноеИмяПротокола = ПрограммаТелефонииУстановлена(); - Если ДоступноеИмяПротокола = Неопределено Тогда - СтрокаСПредупреждением = Новый ФорматированнаяСтрока( - НСтр("ru = 'Для совершения звонка требуется установить программу телефонии, например'"), - " ", Новый ФорматированнаяСтрока("Skype",,,, "http://www.skype.com"), "."); - ПоказатьПредупреждение(Неопределено, СтрокаСПредупреждением); - Возврат; - ИначеЕсли НЕ ПустаяСтрока(ДоступноеИмяПротокола) Тогда - ИмяПротокола = ДоступноеИмяПротокола; - КонецЕсли; - #КонецЕсли - - СтрокаЗапуска = ИмяПротокола + ":" + НомерТелефона; - - Оповещение = Новый ОписаниеОповещения("СовершитьЗвонок", ЭтотОбъект, СтрокаЗапуска); - ТекстСообщения = НСтр("ru = 'Для совершения звонка необходимо установить расширение работы с файлами.'"); - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); - -КонецПроцедуры - Процедура СовершитьЗвонок(РасширениеПодключено, СтрокаЗапуска) Экспорт Если РасширениеПодключено Тогда @@ -1044,64 +976,6 @@ КонецФункции -// Заполнение адреса другим адресом. -Процедура ЗаполнитьАдрес(Знач Форма, Знач ИмяРеквизита, Знач НайденнаяСтрока, Знач Результат) - - // Все строки - адреса, - ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - НайденныеСтроки = ВсеСтроки.НайтиСтроки( Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", НайденнаяСтрока.Тип, Ложь) ); - НайденныеСтроки.Удалить( НайденныеСтроки.Найти(НайденнаяСтрока) ); - - ЗначенияПолейДляАнализа = Новый Массив; - Для Каждого Адрес Из НайденныеСтроки Цикл - СтруктураАдреса = Новый Структура; - СтруктураАдреса.Вставить("Идентификатор", Адрес.ПолучитьИдентификатор()); - СтруктураАдреса.Вставить("Представление", Адрес.Представление); - СтруктураАдреса.Вставить("ЗначениеПолей", Адрес.ЗначенияПолей); - СтруктураАдреса.Вставить("ВидАдреса", Адрес.Вид); - ЗначенияПолейДляАнализа.Добавить(СтруктураАдреса); - КонецЦикла; - - АдресаДляЗаполнения = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.ДоступныеДляКопированияАдреса(ЗначенияПолейДляАнализа, НайденнаяСтрока.Вид); - - Если АдресаДляЗаполнения.Количество() = 0 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Для того чтобы не вводить один и тот же адрес несколько раз, можно скопировать в это поле значение, ранее введенное в соседнем поле.'") - ,, НСтр("ru = 'Копирование адреса'")); - Возврат; - КонецЕсли; - - Оповещение = Новый ОписаниеОповещения("ЗаполнитьАдресЗавершение", ЭтотОбъект, Новый Структура); - Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); - Оповещение.ДополнительныеПараметры.Вставить("НайденнаяСтрока", НайденнаяСтрока); - Оповещение.ДополнительныеПараметры.Вставить("ИмяРеквизита", ИмяРеквизита); - Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); - - Форма.ПоказатьВыборИзМеню(Оповещение, АдресаДляЗаполнения, Форма.Элементы["Команда" + ИмяРеквизита]); -КонецПроцедуры - -// Завершение немодального диалога. -Процедура ЗаполнитьАдресЗавершение(Знач ВыбранныйЭлемент, Знач ДополнительныеПараметры) Экспорт - Если ВыбранныйЭлемент = Неопределено Тогда - Возврат; - КонецЕсли; - - ВсеСтроки = ДополнительныеПараметры.Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - СтрокаИсточник = ВсеСтроки.НайтиПоИдентификатору(ВыбранныйЭлемент.Значение); - Если СтрокаИсточник = Неопределено Тогда - Возврат; - КонецЕсли; - - ДополнительныеПараметры.НайденнаяСтрока.ЗначенияПолей = СтрокаИсточник.ЗначенияПолей; - ДополнительныеПараметры.НайденнаяСтрока.Представление = СтрокаИсточник.Представление; - ДополнительныеПараметры.НайденнаяСтрока.Комментарий = СтрокаИсточник.Комментарий; - - ДополнительныеПараметры.Форма[ДополнительныеПараметры.ИмяРеквизита] = СтрокаИсточник.Представление; - - ДополнительныеПараметры.Форма.Модифицированность = Истина; - ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Результат); - -КонецПроцедуры - // Ввод комментария из контекстного меню. Процедура ВвестиКомментарий(Знач Форма, Знач ИмяРеквизита, Знач НайденнаяСтрока, Знач Результат) Комментарий = НайденнаяСтрока.Комментарий; @@ -1154,6 +1028,62 @@ КонецПроцедуры +Процедура ПриИзмененииКонтактнойИнформации(Форма, Элемент, ЭтоТабличнаяЧасть, ОбновитьФорму) + + Перем ДанныеЗаполнения, ДанныеСтроки, ИсторическаяКонтактнаяИнформация, Результат, Текст; + + ЭтоТабличнаяЧасть = ЭтоТабличнаяЧасть(Элемент); + + Если ЭтоТабличнаяЧасть Тогда + ДанныеЗаполнения = Форма.Элементы[Форма.ТекущийЭлемент.Имя].ТекущиеДанные; + Если ДанныеЗаполнения = Неопределено Тогда + Возврат; + КонецЕсли; + Иначе + ДанныеЗаполнения = Форма; + КонецЕсли; + + // Если это очистка, то сбрасываем представление. + ДанныеСтроки = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть); + Если ДанныеСтроки = Неопределено Тогда + Возврат; + КонецЕсли; + + Текст = Элемент.ТекстРедактирования; + Если ПустаяСтрока(Текст) Тогда + ДанныеЗаполнения[Элемент.Имя] = ""; + Если ЭтоТабличнаяЧасть Тогда + ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = ""; + КонецЕсли; + ДанныеСтроки.Представление = ""; + ДанныеСтроки.ЗначенияПолей = Неопределено; + Возврат; + КонецЕсли; + + Если ДанныеСтроки.Свойство("ХранитьИсториюИзменений") + И ДанныеСтроки.ХранитьИсториюИзменений + И НачалоДня(ДанныеСтроки.ДействуетС) <> НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()) Тогда + ИсторическаяКонтактнаяИнформация = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(ИсторическаяКонтактнаяИнформация, ДанныеСтроки); + ИсторическаяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина; + ИсторическаяКонтактнаяИнформация.ИмяРеквизита = ""; + ДанныеСтроки.ДействуетС = НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()); + КонецЕсли; + + ДанныеСтроки.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияXMLПоПредставлению(Текст, ДанныеСтроки.Вид); + ДанныеСтроки.Представление = Текст; + + Если ЭтоТабличнаяЧасть Тогда + ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = ДанныеСтроки.ЗначенияПолей; + КонецЕсли; + + Если ДанныеСтроки.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") И ОбновитьФорму Тогда + Результат = Новый Структура("ОбновитьКонтекстноеМеню, ИмяЭлементаДляРазмещения", Истина, ДанныеСтроки.ИмяЭлементаДляРазмещения); + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат) + КонецЕсли; + +КонецПроцедуры + Функция ЭтоТабличнаяЧасть(Элемент) Родитель = Элемент.Родитель; @@ -1177,7 +1107,9 @@ Результат = Новый Структура("Команда, НаправлениеПеремещения, ИмяРеквизита", Неопределено, 0, Неопределено); - ИмяРеквизита = СтрЗаменить(ИмяКоманды, "КонтекстноеМеню", ""); + ИмяРеквизита = ?(СтрНачинаетсяС(ИмяКоманды, "КонтекстноеМенюПодменю"), + СтрЗаменить(ИмяКоманды, "КонтекстноеМенюПодменю", ""), СтрЗаменить(ИмяКоманды, "КонтекстноеМеню", "")); + Если СтрНачинаетсяС(ИмяРеквизита, "Вверх") Тогда Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Вверх", ""); Результат.НаправлениеПеремещения = -1; @@ -1204,9 +1136,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - // Проверяет, установлена ли программа телефонии на компьютер. // Проверка возможна только в тонком клиенте для Windows. // @@ -1265,7 +1194,7 @@ Символ = Сред(Строка, НомерСимвола, 1); // пропускаем A..Z, a..z, 0..9 - Если Найти("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", Символ) > 0 Тогда // символы -_.!~*\() кодируем как небезопасные + Если СтрНайти("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", Символ) > 0 Тогда // символы -_.!~*\() кодируем как небезопасные Результат = Результат + Символ; Продолжить; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl index b4b88f5dc..5500fe6fa 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl @@ -1,17 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Функция формирует представление с видом для формы ввода адреса. +// Формирует представление с указанным видом для формы ввода адреса. // // Параметры: -// СтруктураАдреса - Структура - Адрес в виде структуры. Описание структур см. в функциях -// СведенияОбАдресе и ПредыдущаяСтруктураКонтактнойИнформацииXML. -// Представление - Строка - Представление адреса. -// НаименованиеВида - Строка - Наименование вида. +// СтруктураАдреса - Структура - Адрес в виде структуры. +// Описание структуры см. в функции РаботаСАдресами.СведенияОбАдресе. +// Описание предыдущей версии структуры см. в функции РаботаСАдресами.ПредыдущаяСтруктураКонтактнойИнформацииXML. +// Представление - Строка - Представление адреса. +// НаименованиеВида - Строка - Наименование вида. // // Возвращаемое значение: // Строка - Представление адреса с видом. @@ -79,7 +75,8 @@ // Добавочный - Строка - добавочный номер. // Комментарий - Строка - комментарий. // -// Возвращаемое значение - Строка - представление телефона. +// Возвращаемое значение: +// - Строка - Представление телефона. // Функция СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, Комментарий) Экспорт @@ -108,26 +105,6 @@ КонецФункции -// Возвращает структуру контактной информации по типу. -// -// Параметры: -// ТипКИ - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. -// -// Возвращаемое значение: -// Структура - пустая структура контактной информации, ключи - имена полей, значения поля. -// -Функция СтруктураКонтактнойИнформацииПоТипу(ТипКИ, ФорматАдреса = "КЛАДР") Экспорт - - Если ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда - Возврат СтруктураПолейАдреса(ФорматАдреса); - ИначеЕсли ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда - Возврат СтруктураПолейТелефона(); - Иначе - Возврат Новый Структура; - КонецЕсли; - -КонецФункции - // Возвращает признак того, является ли строка данных контактной информации XML данными. // // Параметры: @@ -142,21 +119,57 @@ КонецФункции +// Текст, который выводит в поле контактной информации, когда он не заполнен и отображается в виде гиперссылки. +// +// Возвращаемое значение: +// Строка - Текст, который выводит в поле контактной информации. +// +Функция ТекстПустогоАдресаВВидеГиперссылки() Экспорт + Возврат НСтр("ru = 'Заполнить'"); +КонецФункции + +// Определяет, введена ли информация в поле контактной информации, для случаев когда она отображается в виде гиперссылки. +// +// Параметры: +// Значение - Строка - Значение контактной информации. +// +// Возвращаемое значение: +// Булево - Если Истина, то поле контактной информации было заполнено. +// +Функция КонтактнаяИнформацияЗаполнена(Значение) Экспорт + Возврат Значение <> ТекстПустогоАдресаВВидеГиперссылки(); +КонецФункции + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РаботаСАдресамиКлиентСервер.СтруктураКонтактнойИнформацииПоТипу. +// Возвращает структуру контактной информации по типу. +// +// Параметры: +// ТипКИ - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. +// ФорматАдреса - Строка - Не используется, оставлен для обратной совместимости. +// +// Возвращаемое значение: +// Структура - пустая структура контактной информации, ключи - имена полей, значения поля. +// +Функция СтруктураКонтактнойИнформацииПоТипу(ТипКИ, ФорматАдреса = Неопределено) Экспорт + + Если ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + Возврат СтруктураПолейАдреса(); + ИначеЕсли ТипКИ = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда + Возврат СтруктураПолейТелефона(); + Иначе + Возврат Новый Структура; + КонецЕсли; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -// Возвращает XPath для района. -// -// Возвращаемое значение: -// Строка - XPath -// -Функция XPathРайона() Экспорт - - Возврат "СвРайМО/Район"; - -КонецФункции - // Возвращает пространство имен для оперирования с XDTO контактной информации. // // Возвращаемое значение: @@ -166,238 +179,27 @@ Возврат "http://www.v8.1c.ru/ssl/contactinfo"; КонецФункции -// Возвращает массив структур с информацией о частях адреса согласно приказу ФНС ММВ-7-1/525 от 31.08.2011. -// -// Возвращаемое значение: -// Массив - содержит структуры - описания. -// -Функция ТипыОбъектовАдресацииАдресаРФ() Экспорт - - Результат = Новый Массив; - - // Код, Наименование, Тип, Порядок, КодФИАС - // Тип: 1 - владение, 2 - здание, 3 - помещение. - - Результат.Добавить(СтрокаОбъектаАдресации("1010", НСтр("ru = 'Дом'"), 1, 1, 2)); - Результат.Добавить(СтрокаОбъектаАдресации("1020", НСтр("ru = 'Владение'"), 1, 2, 1)); - Результат.Добавить(СтрокаОбъектаАдресации("1030", НСтр("ru = 'Домовладение'"), 1, 3, 3)); - - Результат.Добавить(СтрокаОбъектаАдресации("1050", НСтр("ru = 'Корпус'"), 2, 1)); - Результат.Добавить(СтрокаОбъектаАдресации("1060", НСтр("ru = 'Строение'"), 2, 2, 1)); - Результат.Добавить(СтрокаОбъектаАдресации("1080", НСтр("ru = 'Литера'"), 2, 3, 3)); - Результат.Добавить(СтрокаОбъектаАдресации("1070", НСтр("ru = 'Сооружение'"), 2, 4, 2)); - Результат.Добавить(СтрокаОбъектаАдресации("1040", НСтр("ru = 'Участок'"), 2, 5)); - - Результат.Добавить(СтрокаОбъектаАдресации("2010", НСтр("ru = 'Квартира'"), 3, 1)); - Результат.Добавить(СтрокаОбъектаАдресации("2030", НСтр("ru = 'Офис'"), 3, 2)); - Результат.Добавить(СтрокаОбъектаАдресации("2040", НСтр("ru = 'Бокс'"), 3, 3)); - Результат.Добавить(СтрокаОбъектаАдресации("2020", НСтр("ru = 'Помещение'"), 3, 4)); - Результат.Добавить(СтрокаОбъектаАдресации("2050", НСтр("ru = 'Комната'"), 3, 5)); - Результат.Добавить(СтрокаОбъектаАдресации("2060", НСтр("ru = 'Этаж'"), 3, 6)); - // Наши сокращения для поддержки обратной совместимости при парсинге. - Результат.Добавить(СтрокаОбъектаАдресации("2010", НСтр("ru = 'кв.'"), 3, 6)); - Результат.Добавить(СтрокаОбъектаАдресации("2030", НСтр("ru = 'оф.'"), 3, 7)); - - // Уточняющие объекты - Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10200000", НСтр("ru = 'Адресная точка'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10300000", НСтр("ru = 'Садовое товарищество'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10400000", НСтр("ru = 'Элемент улично-дорожной сети, планировочной структуры дополнительного адресного элемента'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10500000", НСтр("ru = 'Промышленная зона'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10600000", НСтр("ru = 'Гаражно-строительный кооператив'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10700000", НСтр("ru = 'Территория'"))); - - Возврат Результат; -КонецФункции - #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Возвращает код дополнительной части адреса для сериализации. -// -// Параметры: -// СтрокаЗначения - Строка - значение для поиска, например "Дом", "Корпус", "Литера". +// Возвращает пустую структура адреса. // // Возвращаемое значение: -// Число - код -// -Функция КодСериализацииОбъектаАдресации(СтрокаЗначения) Экспорт - - Ключ = ВРег(СокрЛП(СтрокаЗначения)); - Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл - Если Элемент.Ключ = Ключ Тогда - Возврат Элемент.Код; - КонецЕсли; - КонецЦикла; - - Возврат Неопределено; -КонецФункции - -// Возвращает код дополнительной части адреса для почтового индекса. +// Структура - адрес, ключи - имена полей, значения поля. // -// Возвращаемое значение: -// Строка - код -// -Функция КодСериализацииПочтовогоИндекса() Экспорт +Функция СтруктураПолейАдреса() - Возврат КодСериализацииОбъектаАдресации(НСтр("ru = 'Почтовый индекс'")); + СтруктураАдреса = Новый Структура; + СтруктураАдреса.Вставить("Представление", ""); + СтруктураАдреса.Вставить("Страна", ""); + СтруктураАдреса.Вставить("НаименованиеСтраны", ""); + СтруктураАдреса.Вставить("КодСтраны",""); + + Возврат СтруктураАдреса; КонецФункции -// Возвращает XPath для почтового индекса. -// -// Возвращаемое значение: -// Строка - XPath -// -Функция XPathПочтовогоИндекса() Экспорт - - Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализацииПочтовогоИндекса() + "']"; - -КонецФункции - -Функция КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "") Экспорт - - Если Уровень = 90 Тогда - Если ВРег(ТипаАдресногоЭлемента) = "ГСК" Тогда - Возврат "10600000"; - ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "СНТ" Тогда - Возврат "10300000"; - ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "ТЕР" Тогда - Возврат "10700000"; - Иначе - Возврат "10200000"; - КонецЕсли; - ИначеЕсли Уровень = 91 Тогда - Возврат "10400000"; - КонецЕсли; - - // Все остальное - считаем ориентиром. - Возврат "Местоположение"; -КонецФункции - -// Возвращает XPath для дополнительного объекта адресации по умолчанию. -// -// Параметры; -// Уровень - Число - уровень объекта. 90 - дополнительный(Варианты: ГСК, СНТ, ТЕР), 91 - подчиненный, -1 - -// Ориентир. -// -// Возвращаемое значение: -// Строка - XPath -// -Функция XPathДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "") Экспорт - КодСериализации = КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента); - Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализации + "']"; -КонецФункции - -// Возвращает XPath для номера дополнительного объекта адресации. -// -// Параметры; -// СтрокаЗначения - Строка - искомый тип, например "Дом", "Корпус". -// -// Возвращаемое значение: -// Строка - XPath -// -Функция XPathНомераДополнительногоОбъектаАдресации(СтрокаЗначения) Экспорт - - Код = КодСериализацииОбъектаАдресации(СтрокаЗначения); - Если Код = Неопределено Тогда - Код = СтрЗаменить(СтрокаЗначения, "'", ""); - КонецЕсли; - - Возврат "ДопАдрЭл/Номер[Тип='" + Код + "']"; -КонецФункции - -// Возвращает строку с описанием типа по коду части адреса. -// Противоположность функции "КодСериализацииОбъектаАдресации". -// -// Параметры: -// Код - Строка - код -// -// Возвращаемое значение: -// Число - Тип -// -Функция ТипОбъектаПоКодуСериализации(Код) Экспорт - Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл - Если Элемент.Код = Код Тогда - Возврат Элемент; - КонецЕсли; - КонецЦикла; - - Возврат Неопределено; -КонецФункции - -// Возвращает массив вариантов наименований по типу (по признаку владения, строения, и т.п). -// -// Параметры: -// Тип - Число - запрашиваемый тип. -// ДопускатьПовторыКода - Булево - Истина - будут возвращены все варианты с повторами ("квартира" - "кв." и т.п.). -// -// Возвращаемое значение: -// Массив - содержит структуры - описания. -// -Функция НаименованияОбъектовАдресацииПоТипу(Тип, ДопускатьПовторыКода = Истина) Экспорт - Результат = Новый Массив; - Повторы = Новый Соответствие; - - Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл - Если Элемент.Тип = Тип Тогда - Если ДопускатьПовторыКода Тогда - Результат.Добавить(Элемент.Наименование); - Иначе - Если Повторы.Получить(Элемент.Код) = Неопределено Тогда - Результат.Добавить(Элемент.Наименование); - КонецЕсли; - Повторы.Вставить(Элемент.Код, Истина); - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Возвращает сокращения частей адреса -// -// Возвращаемое значение: -// Соответствие - Список сокращений. -// -Функция СокращенияОбъектовАдресацииАдресаРФ() Экспорт - - Результат = Новый Соответствие; - - Результат.Вставить(НСтр("ru = 'Дом'"), НСтр("ru = 'Д.'")); - Результат.Вставить(НСтр("ru = 'Владение'"), НСтр("ru = 'Вл.'")); - Результат.Вставить(НСтр("ru = 'Домовладение'"), НСтр("ru = 'Домовл.'")); - - Результат.Вставить(НСтр("ru = 'Корпус'"), НСтр("ru = 'Корп.'")); - Результат.Вставить(НСтр("ru = 'Строение'"), НСтр("ru = 'Стр.'")); - Результат.Вставить(НСтр("ru = 'Литера'"), НСтр("ru = 'Лит.'")); - Результат.Вставить(НСтр("ru = 'Сооружение'"), НСтр("ru = 'Сооруж.'")); - Результат.Вставить(НСтр("ru = 'Участок'"), НСтр("ru = 'Уч.'")); - - Результат.Вставить(НСтр("ru = 'Квартира'"), НСтр("ru = 'Кв.'")); - Результат.Вставить(НСтр("ru = 'Офис'"), НСтр("ru = 'Оф.'")); - Результат.Вставить(НСтр("ru = 'Бокс'"), НСтр("ru = 'Бокс'")); - Результат.Вставить(НСтр("ru = 'Помещение'"), НСтр("ru = 'Пом.'")); - Результат.Вставить(НСтр("ru = 'Комната'"), НСтр("ru = 'Ком.'")); - Результат.Вставить(НСтр("ru = 'Этаж'"), НСтр("ru = 'Этаж'")); - - Возврат Результат; -КонецФункции - -Функция СтрокаОбъектаАдресации(Код, Наименование, Тип = 0, Порядок = 0, КодФИАС = 0) - - СтруктураОбъектаАдресации = Новый Структура; - СтруктураОбъектаАдресации.Вставить("Код", Код); - СтруктураОбъектаАдресации.Вставить("Наименование", Наименование); - СтруктураОбъектаАдресации.Вставить("Тип", Тип); - СтруктураОбъектаАдресации.Вставить("Порядок", Порядок); - СтруктураОбъектаАдресации.Вставить("КодФИАС", КодФИАС); - СтруктураОбъектаАдресации.Вставить("Сокращение", НРег(Наименование)); - СтруктураОбъектаАдресации.Вставить("Ключ", ВРег(Наименование)); - Возврат СтруктураОбъектаАдресации; - -КонецФункции // Функция формирует полное наименование из массив адреса. // @@ -421,7 +223,6 @@ #Область СлужебныеПроцедурыИФункцииПоРаботеСXMLАдресами - // Возвращает структуру с наименованием и сокращением от значения. // // Параметры: @@ -555,43 +356,6 @@ Возврат Неопределено; КонецФункции -// Возвращает структуру, описывающую населенный пункт в иерархии младший-старший. -// -// Параметры: -// ВариантКлассификатора Строка - Требуемый вид классификатора ФИАС, КЛАДР. -// -// Возвращаемое значение: -// Структура - описание населенного пункта. -// -Функция СтруктураЧастейАдресаНаселенногоПункта(ВариантКлассификатора = "ФИАС") Экспорт - - Результат = Новый Структура; - - Результат.Вставить("Регион", ЭлементАдреснойСтруктуры(НСтр("ru = 'Регион'"), НСтр("ru = 'Регион адреса'"), "СубъектРФ", 1)); - Если ВариантКлассификатора = "ФИАС" Тогда - Результат.Вставить("Округ", ЭлементАдреснойСтруктуры(НСтр("ru = 'Округ'"), НСтр("ru = 'Округ адреса'"), "Округ", 2)); - КонецЕсли; - Результат.Вставить("Район", ЭлементАдреснойСтруктуры(НСтр("ru = 'Район'"), НСтр("ru = 'Район адреса'"), "СвРайМО/Район", 3)); - Результат.Вставить("Город", ЭлементАдреснойСтруктуры(НСтр("ru = 'Город'"), НСтр("ru = 'Город адреса'"), "Город", 4)); - Если ВариантКлассификатора = "ФИАС" Тогда - Результат.Вставить("ВнутригРайон", ЭлементАдреснойСтруктуры(НСтр("ru = 'Внутр. р-н.'"), НСтр("ru = 'Внутригородской район'"), "ВнутригРайон", 5)); - КонецЕсли; - Результат.Вставить("НаселенныйПункт", ЭлементАдреснойСтруктуры(НСтр("ru = 'Нас.пункт'"), - НСтр("ru = 'Населенный пункт адреса'"), "НаселПункт", 6, Истина)); - - Если ВариантКлассификатора <> "БезКлассификатора" Тогда - Результат.Вставить("Улица", ЭлементАдреснойСтруктуры(НСтр("ru = 'Улица'"), - НСтр("ru = 'Улица адреса'"), "Улица", 7)); - Результат.Вставить("ДополнительныйЭлемент", ЭлементАдреснойСтруктуры(НСтр("ru = 'ДополнительныйЭлемент'"), - НСтр("ru = 'Дополнительный элемент адреса'"), "ДопАдрЭл[ТипАдрЭл='10200000']", 90)); - Результат.Вставить("ПодчиненныйЭлемент", ЭлементАдреснойСтруктуры(НСтр("ru = 'Подчиненный элемент'"), - НСтр("ru = 'Подчиненный элемент адреса'"), "ДопАдрЭл[ТипАдрЭл='10400000']", 91)); - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Обрабатывает структуру частей адреса и возвращает идентификатор ближайшего определенного родителя. // // Параметры: @@ -691,70 +455,6 @@ Возврат Представление; КонецФункции -// Возвращает полное наименование для населенного пункта. Под населенным пунктом понимается синтетическое -// поле, характеризующее все, что больше улицы. -// -// Параметры: -// ЧастиАдреса - Структура - Описание текущего состояния адреса. -// ВариантКлассификатора - Строка - Вариант классификатора. -// -Функция ПредставлениеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса, ВариантКлассификатора = "ФИАС") Экспорт - - Уровни = Новый Массив; - Уровни.Добавить(1); - Уровни.Добавить(3); - Уровни.Добавить(4); - Уровни.Добавить(6); - Если ВариантКлассификатора = "ФИАС" Тогда - Уровни.Добавить(2); - Уровни.Добавить(5); - КонецЕсли; - Возврат ПредставлениеПоЧастямАдреса(ЧастиАдреса,Уровни); - -КонецФункции - -// Конструктор внутренней структуры элемента адреса. -// -Функция ЭлементАдреснойСтруктуры(Заголовок, Подсказка, ПутьXPath, Уровень, Предопределенный = Ложь) - - Результат = Новый Структура("Наименование, Сокращение, Идентификатор, Представление"); - Результат.Вставить("Заголовок", Заголовок); - Результат.Вставить("Подсказка", Подсказка); - Результат.Вставить("ПутьXPath", ПутьXPath); - Результат.Вставить("Предопределенный", Предопределенный); - Результат.Вставить("Уровень", Уровень); - - Возврат Результат; -КонецФункции - -// Строка представления по частям адреса в нужном порядке. -// -Функция ПредставлениеПоЧастямАдреса(ЧастиАдреса, Уровни) - - Эталон = СтруктураЧастейАдресаНаселенногоПункта(); - - Порядок = Новый СписокЗначений; - Для Каждого КлючЗначение Из Эталон Цикл - Если Уровни.Найти(КлючЗначение.Значение.Уровень) <> Неопределено Тогда - Порядок.Добавить(КлючЗначение.Значение.Уровень, КлючЗначение.Ключ); - КонецЕсли; - КонецЦикла; - Порядок.СортироватьПоЗначению(НаправлениеСортировки.Убыв); - - Результат = ""; - Для Каждого ЭлементСписка Из Порядок Цикл - ИмяРеквизита = ЭлементСписка.Представление; - Если ЧастиАдреса.Свойство(ИмяРеквизита) Тогда - ЧастьПредставления = ЧастиАдреса[ИмяРеквизита].Представление; - Если Не ПустаяСтрока(ЧастьПредставления) Тогда - Результат = Результат + ", " + ЧастьПредставления; - КонецЕсли; - КонецЕсли - КонецЦикла; - - Возврат СокрЛП(Сред(Результат, 2)); -КонецФункции - #КонецОбласти #Область ПрочиеСлужебныеПроцедурыИФункции @@ -813,55 +513,12 @@ КонецЕсли; КонецПроцедуры -// Возвращает пустую структура адреса. -// -// Возвращаемое значение: -// Структура - адрес, ключи - имена полей, значения поля. -// -Функция СтруктураПолейАдреса(ФорматАдреса) - - СтруктураАдреса = Новый Структура; - СтруктураАдреса.Вставить("Представление", ""); - СтруктураАдреса.Вставить("Страна", ""); - СтруктураАдреса.Вставить("НаименованиеСтраны", ""); - СтруктураАдреса.Вставить("КодСтраны",""); - СтруктураАдреса.Вставить("Индекс",""); - СтруктураАдреса.Вставить("Регион",""); - СтруктураАдреса.Вставить("РегионСокращение",""); - СтруктураАдреса.Вставить("Район",""); - СтруктураАдреса.Вставить("РайонСокращение",""); - СтруктураАдреса.Вставить("Город",""); - СтруктураАдреса.Вставить("ГородСокращение",""); - СтруктураАдреса.Вставить("НаселенныйПункт",""); - СтруктураАдреса.Вставить("НаселенныйПунктСокращение",""); - СтруктураАдреса.Вставить("Улица",""); - СтруктураАдреса.Вставить("УлицаСокращение",""); - СтруктураАдреса.Вставить("Дом",""); - СтруктураАдреса.Вставить("Корпус",""); - СтруктураАдреса.Вставить("Квартира",""); - СтруктураАдреса.Вставить("ТипДома",""); - СтруктураАдреса.Вставить("ТипКорпуса",""); - СтруктураАдреса.Вставить("ТипКвартиры",""); - СтруктураАдреса.Вставить("НаименованиеВида",""); - - Если ВРег(ФорматАдреса) = "ФИАС" Тогда - СтруктураАдреса.Вставить("Округ",""); - СтруктураАдреса.Вставить("ОкругСокращение",""); - СтруктураАдреса.Вставить("ВнутригородскойРайон",""); - СтруктураАдреса.Вставить("ВнутригородскойРайонСокращение",""); - КонецЕсли; - - Возврат СтруктураАдреса; - -КонецФункции - - // Возвращает пустую структура телефона. // // Возвращаемое значение: // Структура - ключи - имена полей, значения поля. // -Функция СтруктураПолейТелефона() +Функция СтруктураПолейТелефона() Экспорт СтруктураТелефона = Новый Структура; СтруктураТелефона.Вставить("Представление", ""); @@ -875,69 +532,6 @@ КонецФункции -// Получает сокращение географического названия объекта. -// -// Параметры: -// ГеографическоеНазвание - Строка - географическое название объекта. -// -// Возвращаемое значение: -// Строка - пустая строка или последнее слово в географическом названии. -// -Функция АдресноеСокращение(Знач ГеографическоеНазвание) - - Сокращение = ""; - МассивСлов = СтрРазделить(ГеографическоеНазвание, " ", Ложь); - Если МассивСлов.Количество() > 1 Тогда - Сокращение = МассивСлов[МассивСлов.Количество() - 1]; - КонецЕсли; - - Возврат Сокращение; - -КонецФункции - -// Возвращает строку списка полей. -// -// Параметры: -// СоответствиеПолей - СписокЗначений - соответствия полей. -// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. -// -// Возвращаемое значение: -// Строка - результат, преобразованный из списка. -// -Функция ПреобразоватьСписокПолейВСтроку(СоответствиеПолей, БезПустыхПолей = Истина) Экспорт - - КвартираДобавлена = Ложь; - КорпусДобавлен = Ложь; - ПредыдущиеЗначение = Неопределено; - - СтруктураЗначенийПолей = Новый Структура; - Для Каждого Элемент Из СоответствиеПолей Цикл - - Если Элемент.Представление = "Корпус" ИЛИ Элемент.Представление = "ТипКорпуса" Тогда - Если ПредыдущиеЗначение <> Неопределено И ПредыдущиеЗначение.Представление = "ТипКорпуса" - И ПредыдущиеЗначение.Значение = "Корпус" Тогда - СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); - КорпусДобавлен = Истина; - ИначеЕсли НЕ КорпусДобавлен Тогда - СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); - КонецЕсли; - ИначеЕсли Элемент.Представление = "Квартира" ИЛИ Элемент.Представление = "ТипКвартиры" Тогда - Если ПредыдущиеЗначение <> Неопределено И ПредыдущиеЗначение.Представление = "ТипКвартиры" - И ПредыдущиеЗначение.Значение = "Квартира" Тогда - СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); - КвартираДобавлена = Истина; - ИначеЕсли НЕ КвартираДобавлена Тогда - СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); - КонецЕсли; - Иначе - СтруктураЗначенийПолей.Вставить(Элемент.Представление, Элемент.Значение); - КонецЕсли; - ПредыдущиеЗначение = Элемент; - КонецЦикла; - - Возврат СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей); -КонецФункции - // Возвращает список значений. Преобразует строку полей в список значений. // // Параметры: @@ -964,6 +558,26 @@ КонецФункции +// Получает сокращение географического названия объекта. +// +// Параметры: +// ГеографическоеНазвание - Строка - географическое название объекта. +// +// Возвращаемое значение: +// Строка - пустая строка или последнее слово в географическом названии. +// +Функция АдресноеСокращение(Знач ГеографическоеНазвание) + + Сокращение = ""; + МассивСлов = СтрРазделить(ГеографическоеНазвание, " ", Ложь); + Если МассивСлов.Количество() > 1 Тогда + Сокращение = МассивСлов[МассивСлов.Количество() - 1]; + КонецЕсли; + + Возврат Сокращение; + +КонецФункции + // Преобразует строку полей вида ключ = значение в структуру. // // Параметры: @@ -1010,36 +624,6 @@ Возврат Результат; КонецФункции -// Возвращает строку списка полей. -// -// Параметры: -// СтруктураЗначенийПолей - Структура - структура значений полей. -// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. -// -// Возвращаемое значение: -/// Строка - результат преобразования из структуры. -// -Функция СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей = Истина) Экспорт - - Результат = ""; - Для Каждого ЗначениеПоля Из СтруктураЗначенийПолей Цикл - Если БезПустыхПолей И ПустаяСтрока(ЗначениеПоля.Значение) Тогда - Продолжить; - КонецЕсли; - - Результат = Результат + ?(Результат = "", "", Символы.ПС) - + ЗначениеПоля.Ключ + "=" + СтрЗаменить(ЗначениеПоля.Значение, Символы.ПС, Символы.ПС + Символы.Таб); - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Текст, который выводит в поле адрес, когда он не заполнен и отображается в виде гиперссылки. -// -Функция ТекстПустогоАдресаВВидеГиперссылки() Экспорт - Возврат НСтр("ru = 'Заполнить'"); -КонецФункции - #КонецОбласти #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl index 2c084ef20..312284e4d 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl @@ -1,329 +1,27 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления" - ].Добавить("УправлениеКонтактнойИнформациейСлужебный"); - -КонецПроцедуры - -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". +// Возвращает значение перечисления тип вида контактной информации. // -// Параметры: -// Обработчики - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. +// Параметры: +// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - источник данных. // -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт +Функция ТипВидаКонтактнойИнформации(Знач ВидИнформации) Экспорт + Результат = Неопределено; - // Загрузка в классификатор стран мира запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СтраныМира.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + Тип = ТипЗнч(ВидИнформации); + Если Тип = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + Результат = ВидИнформации; + ИначеЕсли Тип = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + Результат = ВидИнформации.Тип; + ИначеЕсли ВидИнформации <> Неопределено Тогда + Данные = Новый Структура("Тип"); + ЗаполнитьЗначенияСвойств(Данные, ВидИнформации); + Результат = Данные.Тип; КонецЕсли; -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность редактирования реквизитов -// с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Запрет редактирования реквизитов объектов". -// В качестве значения - пустую строку. -// -Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт - - Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), ""); - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. -// -Функция СведенияОбАдресахВВидеСтруктуры(Адреса, ДополнительныеПараметры) Экспорт - Результат = Новый Массив; - Для каждого Адрес Из Адреса Цикл - Результат.Добавить(СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры)); - КонецЦикла; - Возврат Результат; -КонецФункции - -// Возвращает сведения об адресе в виде структуру частей адреса и кодов КЛАДР. -// -Функция СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры) Экспорт - - Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда - ПолноеНаименованиеСокращений = ?(ДополнительныеПараметры.Свойство("ПолноеНаименованиеСокращений"), ДополнительныеПараметры.ПолноеНаименованиеСокращений, Ложь); - НаименованиеВключаетСокращение = ?(ДополнительныеПараметры.Свойство("НаименованиеВключаетСокращение"), ДополнительныеПараметры.НаименованиеВключаетСокращение, Ложь); - ЗаполнятьКоды = ?(ДополнительныеПараметры.Свойство("КодыКЛАДР"), ДополнительныеПараметры.КодыКЛАДР, Ложь); - Иначе - НаименованиеВключаетСокращение = Ложь; - ПолноеНаименованиеСокращений = Ложь; - ЗаполнятьКоды = Ложь; - КонецЕсли; - - НаименованиеСтраны = ""; - Результат = Новый Структура; - Формат9Запятых = Ложь; - - ЭлементыАдреса = Новый Соответствие; - - Если ТипЗнч(Адрес) = Тип("Строка") Тогда - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда - XDTOАдрес = КонтактнаяИнформацияИзXML(Адрес); - Иначе - Если СтрЧислоВхождений(Адрес, ",") = 9 Тогда - Формат9Запятых = Истина; - АдресРФ = Адрес; - Иначе - XDTOАдрес = ДесериализацияАдресаОбщая(Адрес, ""); - КонецЕсли; - КонецЕсли; - Иначе - XDTOАдрес = Адрес - КонецЕсли; - - Если НЕ Формат9Запятых Тогда - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Состав = XDTOАдрес.Состав; - - Если Состав = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - XDTOТип = Состав.Тип(); - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - - Результат.Вставить("Страна", Состав.Страна); - Если ПустаяСтрока(Состав.Страна) Тогда - Страна = Справочники.СтраныМира.Россия; - НаименованиеСтраны = Страна.Наименование; - КодСтраны = СокрЛП(Страна.Код); - Иначе - Страна = Справочники.СтраныМира.НайтиПоНаименованию(Состав.Страна, Истина); - НаименованиеСтраны = Страна.Наименование; - КодСтраны = СокрЛП(Страна.Код); - КонецЕсли; - Результат.Вставить("КодСтраны", КодСтраны); - - АдресРФ = Состав.Состав; - - ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - АдресРФ = Состав; - Иначе - Возврат Результат; - КонецЕсли; - - Если ТипЗнч(АдресРФ) = Тип("Строка") Тогда - Если СтрЧислоВхождений(АдресРФ, ",") = 9 Тогда - ЭлементыАдреса = СтруктураАдресаПоФормату9Запятых(АдресРФ); - Формат9Запятых = Истина; - Иначе - // адрес в свободной форме (РФ или Иностранный) - ЭлементыАдреса.Вставить("Страна", НаименованиеСтраны); - ЭлементыАдреса.Вставить("Индекс", ""); - ЭлементыАдреса.Вставить("Регион", ""); - ЭлементыАдреса.Вставить("Район", ""); - ЭлементыАдреса.Вставить("Город", ""); - ЭлементыАдреса.Вставить("НаселенныйПункт", ""); - ЭлементыАдреса.Вставить("Улица", ""); - ЭлементыАдреса.Вставить("Округ", ""); - ЭлементыАдреса.Вставить("ВнутригРайон", ""); - ЭлементыАдреса.Вставить("Дом",""); - ЭлементыАдреса.Вставить("Корпус", ""); - ЭлементыАдреса.Вставить("Квартира", ""); - ЭлементыАдреса.Вставить("ДополнительнаяТерритория", ""); - ЭлементыАдреса.Вставить("ЭлементДополнительнойТерритории", ""); - КонецЕсли; - Иначе - ЭлементыАдреса.Вставить("Страна", НаименованиеСтраны); - ЭлементыАдреса.Вставить("Индекс", ПочтовыйИндексАдреса(АдресРФ)); - ЭлементыАдреса.Вставить("Регион", АдресРФ.СубъектРФ); - ЭлементыАдреса.Вставить("Район", РайонАдреса(АдресРФ)); - ЭлементыАдреса.Вставить("Город", АдресРФ.Город); - ЭлементыАдреса.Вставить("НаселенныйПункт", АдресРФ.НаселПункт); - ЭлементыАдреса.Вставить("Улица", АдресРФ.Улица); - ЭлементыАдреса.Вставить("Округ", АдресРФ.Округ); - ЭлементыАдреса.Вставить("ВнутригРайон", АдресРФ.ВнутригРайон); - ЭлементыАдреса.Вставить("Дом",""); - ЭлементыАдреса.Вставить("Корпус", ""); - ЭлементыАдреса.Вставить("Квартира", ""); - ЭлементыАдреса.Вставить("ДополнительнаяТерритория", НайтиДополнительныйЭлементАдреса(АдресРФ).Значение); - ЭлементыАдреса.Вставить("ЭлементДополнительнойТерритории", - ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); - КонецЕсли; - КонецЕсли; - - СоответствиеСокращений = Новый Соответствие; - - ЭтоРоссийскийАдрес = ?(СтрСравнить(НаименованиеСтраны, Справочники.СтраныМира.Россия.Наименование) = 0, Истина, Ложь); - Если ЭтоРоссийскийАдрес Тогда - Результат.Вставить("КодРегиона", КодРегиона(ЭлементыАдреса["Регион"])); - КонецЕсли; - - Результат.Вставить("Индекс", ЭлементыАдреса.Получить("Индекс")); - - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Регион"], "Регион", СоответствиеСокращений, НаименованиеВключаетСокращение, 1); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Округ"], "Округ", СоответствиеСокращений, НаименованиеВключаетСокращение, 2); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Район"], "Район", СоответствиеСокращений, НаименованиеВключаетСокращение, 3); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Город"], "Город", СоответствиеСокращений, НаименованиеВключаетСокращение, 4); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ВнутригРайон"], "ВнутригородскойРайон", СоответствиеСокращений, НаименованиеВключаетСокращение, 5); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["НаселенныйПункт"], "НаселенныйПункт", СоответствиеСокращений, НаименованиеВключаетСокращение, 6); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Улица"], "Улица", СоответствиеСокращений, НаименованиеВключаетСокращение, 7); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ДополнительнаяТерритория"], "ДополнительнаяТерритория", СоответствиеСокращений, НаименованиеВключаетСокращение, 90); - ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ЭлементДополнительнойТерритории"], "ЭлементДополнительнойТерритории", СоответствиеСокращений, НаименованиеВключаетСокращение, 91); - - Если ПолноеНаименованиеСокращений = Истина Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - МодульАдресныйКлассификаторСлужебный.ПолныеНаименованияСокращений(СоответствиеСокращений); - КонецЕсли; - КонецЕсли; - - Результат.Вставить("РегионСокращение", СоответствиеСокращений[1]); - Результат.Вставить("ОкругСокращение", СоответствиеСокращений[2]); - Результат.Вставить("РайонСокращение", СоответствиеСокращений[3]); - Результат.Вставить("ГородСокращение", СоответствиеСокращений[4]); - Результат.Вставить("ВнутригородскойРайонСокращение", СоответствиеСокращений[5]); - Результат.Вставить("НаселенныйПунктСокращение", СоответствиеСокращений[6]); - Результат.Вставить("УлицаСокращение", СоответствиеСокращений[7]); - Результат.Вставить("ДополнительнаяТерриторияСокращение", СоответствиеСокращений[90]); - Результат.Вставить("ЭлементДополнительнойТерриторииСокращение", СоответствиеСокращений[91]); - Результат.Вставить("Здание", Новый Структура("ТипЗдания, Номер")); - Результат.Вставить("Корпуса", Новый Массив); - Результат.Вставить("Помещения", Новый Массив); - - Если НЕ Формат9Запятых Тогда - - ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ); - Для каждого Здание Из ЗданияИПомещения.Здания Цикл - Если Здание.Вид = 1 Тогда - Результат.Здание.ТипЗдания = Здание.Тип; - Результат.Здание.Номер = Здание.Значение; - Иначе - Результат.Корпуса.Добавить(Новый Структура("ТипКорпуса, Номер", Здание.Тип, Здание.Значение)); - КонецЕсли; - КонецЦикла; - - Для каждого Помещение Из ЗданияИПомещения.Помещения Цикл - Результат.Помещения.Добавить(Новый Структура("ТипПомещения, Номер", Помещение.Тип, Помещение.Значение)); - КонецЦикла; - - Иначе - Здание = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Дом"]); - Результат.Здание.ТипЗдания = Здание.Наименование; - Результат.Здание.Номер = Здание.Сокращение; - - Корпус = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Корпус"]); - Результат.Корпуса.Добавить(Новый Структура("ТипКорпуса, Номер", Корпус.Наименование, Корпус.Сокращение)); - - Квартира = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Квартира"]); - Результат.Помещения.Добавить(Новый Структура("ТипПомещения, Номер", Квартира.Наименование, Квартира.Сокращение)); - КонецЕсли; - - Если ЗаполнятьКоды И ЭтоРоссийскийАдрес Тогда - ЗаполнитьКодыАдреса(Результат, Адрес); - ОпределитьФорматКодов(Результат, АдресРФ); - КонецЕсли; - // Из XDTO пустые значение приходят как Неопределено - ЗаменитьВСтруктуреНеопределеноНаПустуюСтроку(Результат); - Возврат Результат; КонецФункции -Функция СтруктураАдресаПоФормату9Запятых(АдресВФормате9Запятых) - Результат = Новый Соответствие; - АдресМассив = СтрРазделить(АдресВФормате9Запятых, ",", Истина); - Результат.Вставить("Страна", АдресМассив[0]); - Результат.Вставить("Индекс", АдресМассив[1]); - Результат.Вставить("Регион", АдресМассив[2]); - Результат.Вставить("Район", АдресМассив[3]); - Результат.Вставить("Город", АдресМассив[4]); - Результат.Вставить("НаселенныйПункт", АдресМассив[5]); - Результат.Вставить("Улица", АдресМассив[6]); - Результат.Вставить("Дом", АдресМассив[7]); - Результат.Вставить("Корпус", АдресМассив[8]); - Результат.Вставить("Квартира", АдресМассив[9]); - - Результат.Вставить("Округ", Неопределено); - Результат.Вставить("ВнутригРайон", Неопределено); - Возврат Результат; - -КонецФункции - -// Заполняет коды по структуре адреса. -// -Процедура ЗаполнитьКодыАдреса(Результат, Адрес) - - КодыКЛАДР = Новый Структура("Регион, Округ, Город, ВнутригородскойРайон, НаселенныйПункт, Улица"); - ДополнительныеКоды = Новый Структура("ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ"); - Результат.Вставить("КодыКЛАДР", КодыКЛАДР); - Результат.Вставить("ДополнительныеКоды", ДополнительныеКоды); - - Если ПустаяСтрока(Результат.Регион) Тогда - Возврат; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - АдресныеКоды = МодульАдресныйКлассификаторСлужебный.КодыАдресаИКодыКЛАДР(Адрес); - Результат.ДополнительныеКоды = АдресныеКоды.КодыАдреса; - Результат.КодыКЛАДР = АдресныеКоды.КодыКЛАДР; - КонецЕсли; - -КонецПроцедуры - -// Возвращает ОКТОМ в правильном формате 8 или 11 символов. -// -// Параметры: -// ОКТМО - Строка, Число - Код ОКТМО. -// -// Возвращаемое значение: -// Строка - Код ОКТМО. -// -Функция ОКТМО(ОКТМО) Экспорт - - ОКТМОСтрока = Формат(ОКТМО, "ЧГ=0"); - - Если СтрДлина(ОКТМОСтрока) < 8 Тогда - Возврат Формат(ОКТМО, "ЧЦ=8; ЧВН=; ЧГ=0"); - ИначеЕсли СтрДлина(ОКТМОСтрока) = 10 Тогда - Возврат Формат(ОКТМО, "ЧЦ=11; ЧВН=; ЧГ=0"); - КонецЕсли; - - Возврат ОКТМОСтрока; - -КонецФункции - // Получить первое значение определенного вида контактной информации у объекта. // // Параметры: @@ -384,72 +82,71 @@ КонецФункции -// Дополняет объект реквизитами, хранящимися отдельно от объекта, либо в служебной части самого объекта, -// не предназначенной для вывода в отчетах. +Функция ПроверитьАдресВXML(АдресВXML, ПараметрыПроверкиАдреса = Неопределено) Экспорт + + РезультатПроверки = Новый Структура("Результат, СписокОшибок"); + РезультатПроверки.СписокОшибок = Новый СписокЗначений; + + Если НЕ ЭтоСтрокаXML(АдресВXML) Тогда + РезультатПроверки.Результат = "СодержитОшибки"; + РезультатПроверки.СписокОшибок.Добавить("ФорматАдреса", НСтр("ru = 'Некорректный формат адреса'")); + Возврат РезультатПроверки; + КонецЕсли; + + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + Обработки["РасширенныйВводКонтактнойИнформации"].ПроверитьАдресВXML(АдресВXML, РезультатПроверки, ПараметрыПроверкиАдреса); + КонецЕсли; + + Возврат РезультатПроверки; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта. Процедура ПриПодготовкеДанныхОбъекта(Объект, ДополнительныеРеквизиты) Экспорт Если Объект.Метаданные().ТабличныеЧасти.Найти("КонтактнаяИнформация") <> Неопределено Тогда - Для Каждого Контакт Из УправлениеКонтактнойИнформацией.ЗначенияКонтактнойИнформацииОбъекта(Объект.Ссылка, Неопределено) Цикл + Для Каждого Контакт Из УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Объект.Ссылка,, ТекущаяДатаСеанса(), Ложь) Цикл Если ЗначениеЗаполнено(Контакт.Вид) Тогда Реквизит = ДополнительныеРеквизиты.Добавить(); - Реквизит.Наименование = Контакт.Вид; - Реквизит.Значение = Контакт.Значение; + Реквизит.Наименование = Контакт.Вид.Наименование; + Реквизит.Значение = Контакт.Представление; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ОпределитьФорматКодов(Результат, АдресРФ) - Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда - Если ЗначениеЗаполнено(АдресРФ.ОКТМО) Тогда - Результат.ДополнительныеКоды.ОКТМО = ОКТМО(АдресРФ.ОКТМО); - КонецЕсли; - Если ЗначениеЗаполнено(АдресРФ.ОКАТО) Тогда - Результат.ДополнительныеКоды.ОКАТО = Формат(АдресРФ.ОКАТО, "ЧГ=0"); - КонецЕсли; +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + // Загрузка в классификатор стран мира запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СтраныМира.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); КонецЕсли; КонецПроцедуры -// Возвращает значение перечисления тип вида контактной информации. -// -// Параметры: -// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - источник данных. -// -Функция ТипВидаКонтактнойИнформации(Знач ВидИнформации) - Результат = Неопределено; +// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт - Тип = ТипЗнч(ВидИнформации); - Если Тип = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда - Результат = ВидИнформации; - ИначеЕсли Тип = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда - Результат = ВидИнформации.Тип; - ИначеЕсли ВидИнформации <> Неопределено Тогда - Данные = Новый Структура("Тип"); - ЗаполнитьЗначенияСвойств(Данные, ВидИнформации); - Результат = Данные.Тип; - КонецЕсли; + Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), ""); - Возврат Результат; -КонецФункции +КонецПроцедуры -#Область ОбновлениеИнформационнойБазы +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт // Разделение стран мира - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.4.8"; Обработчик.Процедура = "УправлениеКонтактнойИнформациейСлужебный.ПодготовкаЭталонаРазделенныхСтранМира"; @@ -503,35 +200,42 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.3.15"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("72f43d1a-9c4f-4789-81a9-e610cd56f8b2"); - Обработчик.Процедура = "Справочники.ВидыКонтактнойИнформации.ОбновитьВидПоляДругое"; + Обработчик.Версия = "2.3.3.15"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("72f43d1a-9c4f-4789-81a9-e610cd56f8b2"); + Обработчик.Процедура = "Справочники.ВидыКонтактнойИнформации.ЗаполнитьВидыКонтактнойИнформации"; Обработчик.РежимВыполнения = "Отложенно"; Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ВидыКонтактнойИнформации.ЗаполнитьВидыКонтактнойИнформацииСПолемДругоеКОбработке"; Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ЧитаемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; - Обработчик.ИзменяемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; - Обработчик.БлокируемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.ЧитаемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; + Обработчик.ИзменяемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; + Обработчик.БлокируемыеОбъекты = "Справочник.ВидыКонтактнойИнформации"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.Комментарий = НСтр("ru = 'Заполнение значения поля ""Другое"" у видов контактной информации. |До завершения обработки данные документов будут отображаться некорректно.'"); - + Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.5.41"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("dfc6a0fa-7c7b-4096-9d04-2c67d5eb17a4"); - Обработчик.Процедура = "Справочники.СтраныМира.ОбновитьСтраныМираПоОКСМ"; + Обработчик.Версия = "2.4.1.72"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("dfc6a0fa-7c7b-4096-9d04-2c67d5eb17a4"); + Обработчик.Процедура = "Справочники.СтраныМира.ОбновитьСтраныМираПоОКСМ"; Обработчик.РежимВыполнения = "Отложенно"; Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.СтраныМира.ЗаполнитьСписокСтранКОбработке"; Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ЧитаемыеОбъекты = "Справочник.СтраныМира"; - Обработчик.ИзменяемыеОбъекты = "Справочник.СтраныМира"; + Обработчик.ЧитаемыеОбъекты = "Справочник.СтраныМира"; + Обработчик.ИзменяемыеОбъекты = "Справочник.СтраныМира"; Обработчик.БлокируемыеОбъекты = "Справочник.СтраныМира"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.Комментарий = НСтр("ru = 'Обновление сведений о странах мирах в соответствии с общероссийским классификатором стран мира. |До завершения обработки данные документов будут отображаться некорректно.'"); КонецПроцедуры +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ОбновлениеИнформационнойБазы + // Неразделенный монопольный обработчик для копирования стран мира из нулевой области. // Сохраняет эталон и список областей данных - адресатов. // @@ -547,10 +251,12 @@ Возврат; КонецЕсли; + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + УстановитьПривилегированныйРежим(Истина); // Запрашиваем данные из нулевой области, создаем эталон с точностью до ссылки. - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, 0); + МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, 0); Запрос = Новый Запрос(" |ВЫБРАТЬ | Справочник.Ссылка КАК Ссылка, @@ -564,7 +270,7 @@ |"); Эталон = Запрос.Выполнить().Выгрузить(); - ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь); // Пишем эталон Набор = РегистрыСведений[ИмяРегистраЭталона].СоздатьНаборЗаписей(); @@ -651,7 +357,7 @@ Фильтр = Новый Структура("Код"); // Сравнивать в запросе нельзя из-за возможной регистронезависимости базы данных. - Для Каждого СтрокаКлассификатора Из Справочники.СтраныМира.ТаблицаКлассификатора() Цикл + Для Каждого СтрокаКлассификатора Из УправлениеКонтактнойИнформацией.ТаблицаКлассификатора() Цикл Фильтр.Код = СтрокаКлассификатора.Код; Выборка = Справочники.СтраныМира.Выбрать(,, Фильтр); СтранаНайдена = Выборка.Следующий(); @@ -949,756 +655,14 @@ КонецПроцедуры -#КонецОбласти - -#Область ВзаимодействиеСАдреснымКлассификатором - -// Возвращает список всех регионов адресного классификатора. -// -// Возвращаемое значение: -// ТаблицаЗначений - содержит колонки: -// * КодСубъектаРФ - Число - Код региона. -// * Идентификатор - УникальныйИдентификатор - Идентификатор региона. -// * Представление - Строка - Наименование и сокращение региона. -// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. -// * ДатаВерсии - Дата - UTC версия загруженных данных. -// Неопределено - если нет подсистемы адресного классификатора. -// -Функция ВсеРегионы() Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Возврат МодульАдресныйКлассификаторСлужебный.СведенияОЗагрузкеСубъектовРФ(); - КонецЕсли; - Возврат Неопределено; - -КонецФункции - -// Возвращает наименование региона по его коду. -// -// Параметры: -// Код - Строка, Число - код региона. -// -// Возвращаемое значение: -// Строка - полное наименование региона с сокращением. -// Неопределено - если нет ни одной подсистемы адресного классификатора. -// -Функция РегионКода(Знач Код) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); - Возврат МодульАдресныйКлассификатор.НаименованиеРегионаПоКоду(Код); - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -// Возвращает код региона по его полному наименованию. -// -// Параметры: -// НаименованиеРегиона - Строка - полное наименование региона с сокращением. -// -// Возвращаемое значение: -// Строка - код региона из двух цифр. Пустая строка, если наименование определить не удалось. -// Неопределено - если нет ни одной подсистемы адресного классификатора. -// -Функция КодРегиона(Знач ПолноеНаименование) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); - Код = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(ПолноеНаименование); - Возврат Формат(Код, "ЧЦ=2; ЧН=; ЧВН="); - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -// Возвращает адрес по представлению. -// -// Параметры: -// Текст - Строка - текст автоподбора. -Функция НаселенныеПунктыПоПредставлению(Знач Текст) Экспорт - - Результат = Новый СписокЗначений; - - ДанныеАнализа = ЧастиАдресаТаблицей(Текст); - Если ДанныеАнализа.Количество() = 0 Тогда - Возврат Результат; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - АдресРФ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ")); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - АдресПоУровням = МодульАдресныйКлассификаторСлужебный.УстановитьСоответствиеЧастейАдресаИхУровнюДляНаселенногоПункта(ДанныеАнализа, УровниАдресныхОбъектов("НаселенныйПункт")); - Если АдресПоУровням <> Неопределено Тогда - ПоместитьАдресВXDTO(АдресРФ, АдресПоУровням); - - // Что-то осталось, добавляем это на уровень населенного пункта. - Фильтр = Новый Структура("Уровень", 0); - СтрокиСУровнем0 = АдресПоУровням.НайтиСтроки(Фильтр); - Разделитель = ""; - НаселПункт = ""; - Для каждого ЭлементАдреса Из СтрокиСУровнем0 Цикл - НаселПункт = НаселПункт + Разделитель + ЭлементАдреса.Значение; - Разделитель = ", "; - КонецЦикла; - Иначе - НаселПункт = Текст; - КонецЕсли; - Иначе - ПозицияСубъектРФ = СтрНайти(Текст, ",", НаправлениеПоиска.СКонца); - Если ПозицияСубъектРФ > 0 Тогда - Регион = СокрЛП(Сред(Текст, ПозицияСубъектРФ + 1)); - УстановитьСвойствоПоXPath(АдресРФ, "СубъектРФ", Регион); - НаселПункт = СокрЛП(Лев(Текст, ПозицияСубъектРФ - 1)); - Иначе - НаселПункт = Текст; - КонецЕсли; - КонецЕсли; - - Если НЕ ПустаяСтрока(НаселПункт) Тогда - Если ЗначениеЗаполнено(АдресРФ.НаселПункт) Тогда - НаселПункт = НаселПункт + ", " + АдресРФ.НаселПункт; - КонецЕсли; - УстановитьСвойствоПоXPath(АдресРФ, "НаселПункт", НаселПункт); - КонецЕсли; - - Возврат АдресРФ; - -КонецФункции - -// Возвращает структуру с полем "ДанныеВыбора", содержащую список вариантов населенных пунктов -// по иерархическому представлению младший-старший. -// -// Параметры: -// ИдентификаторНаселенногоПункта - УникальныйИдентификатор - код классификатора для ограничения подбора. -// Текст - Текст - строка автоподбора. -// СкрыватьНеактуальныеАдреса - Булево - флаг того, что неактуальные адреса не должны попадать в автоподбор. -// ВыбиратьСтрок - Число - ограничение на количество результатов. -// -// Возвращаемое значение: -// Структура - результат поиска данных. Содержит поля: -// * СлишкомМногоДанных - Булево - признак того, что результирующий список не полон. -// * ДанныеВыбора - СписокЗначений - данные для автоподбора. -// -Функция УлицыПоПредставлению(ИдентификаторНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса = Ложь, ВыбиратьСтрок = 50) Экспорт - - Если ЗначениеЗаполнено(ИдентификаторНаселенногоПункта) - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ЧастиАдреса = ЧастиАдресаТаблицей(Текст); - Если ЧастиАдреса.Количество() = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - МодульАдресныйКлассификаторСлужебный.УстановитьУровниУлицыПоЧастямАдреса(ИдентификаторНаселенногоПункта, ЧастиАдреса); - Возврат ЧастиАдреса; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -// Возвращает структуру, описывающую населенный пункт в иерархии младший-старший -// для текущего адресного классификатора. Имена ключей структуры зависят от -// классификатора. -// -// Параметры: -// Идентификатор - УникальныйИдентификатор - Идентификатор объекта. Если указан, то структура -// заполняется данными для этого объекта. -// ВариантКлассификатора - Строка - Требуемый вид классификатора. -// -// Возвращаемое значение: -// Структура - описание населенного пункта. -// -Функция СписокРеквизитовНаселенныйПункт(Идентификатор = Неопределено, ВариантКлассификатора = "КЛАДР") Экспорт - - Результат = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ВариантКлассификатора); - - Если Идентификатор = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат Неопределено; - КонецЕсли; - - // Заполняем данные по идентификатору. - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - СтруктураДанных = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); - - Если Не СтруктураДанных.Отказ Тогда - Адрес = СтруктураДанных.Данные; - Для Каждого КлючЗначение Из Результат Цикл - Часть = КлючЗначение.Значение; - Часть.Представление = СокрЛП(ПолучитьXDTOРеквизитОбъекта(Адрес, Часть.ПутьXPath)); - НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(Часть.Представление); - Часть.Наименование = НаименованиеСокращение.Наименование; - Часть.Сокращение = НаименованиеСокращение.Сокращение; - КонецЦикла; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Устанавливает значения полей населенного пункта в XDTO адресе. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - адрес РФ. -// Идентификатор - УникальныйИдентификатор - Источник данных для заполнения. -// -Процедура УстановитьНаселенныйПунктАдресаПоИдентификатору(XDTOАдрес, Идентификатор) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат; - КонецЕсли; - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - ДанныеАдреса = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); - Если ДанныеАдреса.Отказ Тогда - // Классификатор поломан - Возврат; - КонецЕсли; - - Эталон = ДанныеАдреса.Данные; - - ЧастиАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(); - Для Каждого КлючЗначение Из ЧастиАдреса Цикл - Если КлючЗначение.Значение.Уровень < 7 Тогда - Путь = КлючЗначение.Значение.ПутьXPath; - УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Устанавливает значения полей улицы. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - адрес РФ. -// Идентификатор - УникальныйИдентификатор - Источник данных для заполнения. -// -Процедура УстановитьУлицуАдресаПоИдентификатору(XDTOАдрес, Идентификатор) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат; - КонецЕсли; - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - ДанныеАдреса = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); - Если ДанныеАдреса.Отказ Тогда - // Классификатор поломан - Возврат; - КонецЕсли; - - Эталон = ДанныеАдреса.Данные; - КодСериализацииПочтовогоИндекса = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииПочтовогоИндекса(); - КодСериализацииДополнительногоОбъектаАдресации = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(91); - - ЧастиАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(); - Для Каждого КлючЗначение Из ЧастиАдреса Цикл - Если КлючЗначение.Значение.Уровень = 90 Тогда - Для каждого ДопАдрЭл Из Эталон.ДопАдрЭл Цикл - Если ДопАдрЭл.ТипАдрЭл <> КодСериализацииДополнительногоОбъектаАдресации - И ДопАдрЭл.ТипАдрЭл <> КодСериализацииПочтовогоИндекса Тогда - Путь = "ДопАдрЭл[ТипАдрЭл='" + ДопАдрЭл.ТипАдрЭл + "']"; - УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); - КонецЕсли; - КонецЦикла; - ИначеЕсли КлючЗначение.Значение.Уровень = 91 Тогда - Для каждого ДопАдрЭл Из Эталон.ДопАдрЭл Цикл - Если ДопАдрЭл.ТипАдрЭл = КодСериализацииДополнительногоОбъектаАдресации Тогда - Путь = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91, ДопАдрЭл.ТипАдрЭл); - УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); - КонецЕсли; - КонецЦикла; - ИначеЕсли КлючЗначение.Значение.Уровень = 7 Тогда - Путь = КлючЗначение.Значение.ПутьXPath; - УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Устанавливает значения идентификаторов для частей адреса. -// -// Параметры: -// НаселенныйПунктДетально - Структура - части адреса. -// ИдентификаторАдреса - УникальныйИдентификатор - Источник данных для заполнения. -// -Процедура ЗаполнитьИдентификаторыНаселенногоПункта(НаселенныйПунктДетально) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - МодульАдресныйКлассификаторСлужебный.УстановитьИдентификаторыНаселенногоПункта(НаселенныйПунктДетально); - КонецЕсли; - -КонецПроцедуры - -// Определение режима работы форм ввода. -// -// Возвращаемое значение: -// Булево - Истина, если работа с классификатором ведется через веб-сервис. -// -Функция КлассификаторДоступенЧерезВебСервис() Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат Ложь; - КонецЕсли; - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Источник = МодульАдресныйКлассификаторСлужебный.ИсточникДанныхАдресногоКлассификатора(); - - Возврат Не ПустаяСтрока(Источник); -КонецФункции - -// Проверка доступности поставщика - локальной базы или сервиса. Запрос версии. -// -// Возвращаемое значение: -// Структура - описание состояния. -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * Данные - Строка - Описание версии поставщика. -// -Функция ВерсияПоставщикаДанныхКлассификатора() - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Возврат МодульАдресныйКлассификаторСлужебный.ВерсияПоставщикаДанных(); - КонецЕсли; - - Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); - Результат.Вставить("Версия"); - Возврат Результат; - -КонецФункции - -// Проверяет доступность классификатора и помещает результат в хранилище -// -Процедура ПроверитьДоступностьКлассификатора(ДоступностьКлассификатораАдрес, АдресРезультата) Экспорт - - ПоместитьВоВременноеХранилище(ВерсияПоставщикаДанныхКлассификатора(), АдресРезультата); - -КонецПроцедуры - -Функция ПроверитьАдресВXML(АдресВXML, ПараметрыПроверкиАдреса = Неопределено) Экспорт - - РезультатПроверки = Новый Структура("Результат, СписокОшибок"); - РезультатПроверки.СписокОшибок = Новый СписокЗначений; - - Если НЕ ЭтоСтрокаXML(АдресВXML) Тогда - РезультатПроверки.Результат = "СодержитОшибки"; - РезультатПроверки.СписокОшибок.Добавить("ФорматАдреса", НСтр("ru = 'Некорректный формат адреса'")); - Возврат РезультатПроверки; - КонецЕсли; - - Источник = АдресXMLВXDTO(АдресВXML,, Перечисления.ТипыКонтактнойИнформации.Адрес); - ЕстьОшибки = Ложь; - - ФорматАдреса = "КЛАДР"; - АдресТолькоРоссийский = Истина; - Если ТипЗнч(ПараметрыПроверкиАдреса) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда - ПараметрыПроверки = СтруктураВидаКонтактнойИнформации(ПараметрыПроверкиАдреса); - ФорматАдреса = ?(ПараметрыПроверки.ПроверятьПоФИАС, "ФИАС", "КЛАДР"); - АдресТолькоРоссийский = ПараметрыПроверки.АдресТолькоРоссийский; - Иначе - ПараметрыПроверки = СтруктураВидаКонтактнойИнформации(); - Если ПараметрыПроверкиАдреса <> Неопределено Тогда - Если ПараметрыПроверкиАдреса.Свойство("ФорматАдреса") И ЗначениеЗаполнено(ПараметрыПроверкиАдреса.ФорматАдреса) Тогда - ФорматАдреса = ПараметрыПроверкиАдреса.ФорматАдреса; - КонецЕсли; - Если ПараметрыПроверкиАдреса.Свойство("АдресТолькоРоссийский") И ЗначениеЗаполнено(ПараметрыПроверкиАдреса.АдресТолькоРоссийский) Тогда - АдресТолькоРоссийский = ПараметрыПроверкиАдреса.АдресТолькоРоссийский; - КонецЕсли; - КонецЕсли; - ПараметрыПроверки.ПроверятьКорректность = Истина; - КонецЕсли; - - Если ВРег(ФорматАдреса) = "ФИАС" Тогда - ПараметрыПроверки.Вставить("ПроверятьПоФИАС", Истина); - КонецЕсли; - - ПараметрыПроверки.Вставить("ФорматАдреса", ФорматАдреса); - ПараметрыПроверки.Вставить("АдресТолькоРоссийский ", АдресТолькоРоссийский); - - Адрес = Источник.Состав; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Если Адрес <> Неопределено И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - СписокОшибок = ОшибкиЗаполненияАдресаXDTO(Адрес, ПараметрыПроверки); - КонецЕсли; - - Если СписокОшибок.Количество() = 0 Тогда - РезультатПроверки.Результат = "Корректный"; - Иначе - Если НЕ СписокОшибок[0].Пометка Тогда - РезультатПроверки.Результат = "НеПроверен"; - Иначе - РезультатПроверки.Результат = "СодержитОшибки"; - КонецЕсли; - КонецЕсли; - - РезультатПроверки.СписокОшибок = СписокОшибок; - Возврат РезультатПроверки; - -КонецФункции - -// Возвращает данные классификатора по почтовому индексу. -// -// Параметры: -// Индекс - Строка, Число - почтовый индекс, для которого необходимо получать данные. -// -// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: -// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию Ложь. -// * ФорматАдреса - Строка - тип используемого классификатора. -// -// Возвращаемое значение: -// Структура - найденные варианты. Содержит поля: -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. -// * Данные - ТаблицаЗначений - Содержит данные для выбора. Колонки: -// ** Неактуален - Булево - Флаг неактуальности строки данных. -// ** Идентификатор - УникальныйИдентификатор - Код классификатора для поиска -// вариантов по индексу. -// ** Представление - Строка - Представление варианта. -// -Функция АдресаКлассификатораПоПочтовомуИндексу(Знач Индекс, Знач ДополнительныеПараметры) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - - ТипЧисло = Новый ОписаниеТипов("Число"); - ИндексЧислом = ТипЧисло.ПривестиЗначение(Индекс); - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Возврат МодульАдресныйКлассификаторСлужебный.АдресаПоПочтовомуИндексуКлассификатора(ИндексЧислом, ДополнительныеПараметры); - - КонецЕсли; - - Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); - Результат.Вставить("Данные", Новый ТаблицаЗначений); - Возврат Результат; - -КонецФункции - -// Возвращает данные классификатора поля выбора по уровню. -// -// Параметры: -// Родитель - УникальныйИдентификатор - Родительский объект. -// Уровень - Число - Требуемый уровень данных. 1-7, 90, 91 - адресные объекты, -1 -// - ориентиры. -// ДополнительныеПараметры - Структура - Описание настройке поиска. Поля: -// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию -// Ложь. -// * ФорматАдреса - Строка - тип используемого классификатора. -// -// * РазмерПорции - Число - Необязательный размер порции возвращаемых данных. Если не указано -// или 0, то возвращает все элементы. -// * ПерваяЗапись - УникальныйИдентификатор - Элемент, с которого начинается порция данных. Сам элемент не -// входит в выборку. -// * Сортировка - Строка - Направление сортировки для порции. -// -// Возвращаемое значение: -// Структура - найденные варианты. Содержит поля: -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * Заголовок - Строка - Строка с предложением выбора. -// * Данные - ТаблицаЗначений - Содержит данные для выбора. Колонки: -// ** Неактуален - Булево - Флаг неактуальности строки данных. -// ** Идентификатор - УникальныйИдентификатор - Код классификатора для поиска вариантов по индексу. -// ** Представление - Строка - Представление варианта. -// -Функция АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ДополнительныеПараметры) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Возврат МодульАдресныйКлассификаторСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ДополнительныеПараметры); - КонецЕсли; - - Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); - Результат.Вставить("Заголовок"); - Результат.Вставить("Данные", Новый ТаблицаЗначений); - Возврат Результат; - -КонецФункции - -// Возвращает список для автоподбора населенного пункта, поиск по подобию. Список ограничен 20 записями. -// -// Параметры: -// Текст - Строка - Текст, введенный в поле. -// ИмяЧастиАдреса - Строка - Идентификатор обрабатываемой части адреса. -// ЧастиАдреса - Структура - Значения для других частей адреса. -// ДополнительныеПараметры - Структура - Описание настройке поиска. Поля: -// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По -// умолчанию Ложь. -// * ФорматАдреса - Строка - Тип используемого классификатора. -// -// Возвращаемое значение: -// Структура - найденные варианты. Содержит поля: -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * Данные - СписокЗначений - результат для автоподбора. -// -Функция СписокАвтоподбораЧастиАдреса(Текст, ИмяЧастиАдреса, ЧастиАдреса, ДополнительныеПараметры) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Результат = Новый Структура("Данные", Новый СписокЗначений); - Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); - КонецЕсли; - - ЧастьАдреса = ЧастиАдреса[ИмяЧастиАдреса]; - Родитель = УправлениеКонтактнойИнформациейКлиентСервер.ИдентификаторРодителяЧастиАдресаЭлемента(ЧастьАдреса, ЧастиАдреса); - - Уровни = Новый Массив; - Уровни.Добавить(ЧастьАдреса.Уровень); - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, Родитель, Уровни, ДополнительныеПараметры); - - ТабличныеДанные = Результат.Данные; - - Результат.Данные = Новый СписокЗначений; - Если Не Результат.Отказ Тогда - ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Ложь); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Возвращает структуру с полем "Данные", содержащую список для автоподбора населенного пункта -// по иерархическому представлению младший-старший. -// -// Параметры: -// Текст - Строка - текст автоподбора. -// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: -// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию -// Ложь. -// * ФорматАдреса - Строка - тип используемого классификатора. -// -// Возвращаемое значение: -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. -// * Данные - СписокЗначений - результат для автоподбора. -// -Функция СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Результат = Новый Структура("Данные", Новый СписокЗначений); - Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); - КонецЕсли; - - ЧастиАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ДополнительныеПараметры.ФорматАдреса); - - Родитель = Неопределено; - Уровни = Новый Массив; - Для Каждого КлючЗначение Из ЧастиАдреса Цикл - Если КлючЗначение.Значение.Уровень < 7 Тогда - Уровни.Добавить(КлючЗначение.Значение.Уровень); - КонецЕсли; - КонецЦикла; - - ПреобразоватьВводАдреса(Текст); - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, Родитель, Уровни, ДополнительныеПараметры); - - ТабличныеДанные = Результат.Данные; - - Результат.Данные = Новый СписокЗначений; - Если Не Результат.Отказ Тогда - ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Ложь); - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Возвращает структуру с полем "Данные", содержащую список для автоподбора улицы -// по иерархическому представлению младший-старший. -// -// Параметры: -// НаселенныйПункт - УникальныйИдентификатор - Населенный пункт. -// Текст - Строка - Текст автоподбора. -// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: -// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию -// Ложь. -// * ФорматАдреса - Строка - Тип используемого классификатора. -// * РазмерПорции - Число - Количество возвращаемых данных. -// -// Возвращаемое значение: -// * Отказ - Булево - Поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ -// = Ложь. -// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. -// * Данные - СписокЗначений - результат для автоподбора. -// -Функция СписокАвтоподбораУлицы(НаселенныйПункт, Текст, ДополнительныеПараметры) Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Результат = Новый Структура("Данные", Новый СписокЗначений); - Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); - КонецЕсли; - - ЧастиАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ДополнительныеПараметры.ФорматАдреса); - - Уровни = Новый Массив; - Для Каждого КлючЗначение Из ЧастиАдреса Цикл - Если КлючЗначение.Значение.Уровень > 6 Тогда - Уровни.Добавить(КлючЗначение.Значение.Уровень); - КонецЕсли; - КонецЦикла; - - ПреобразоватьВводАдреса(Текст); - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, НаселенныйПункт, Уровни, ДополнительныеПараметры); - - ТабличныеДанные = Результат.Данные; - - Результат.Данные = Новый СписокЗначений; - Если Не Результат.Отказ Тогда - ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Истина); - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Возвращает список значение содержащий номера домов для автоподбора. -// -// Параметры: -// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Населенный пункт или улица. -// СтрокаПоиска - Строка - Текст автоподбора. -// Возвращаемое значение: -// СписокЗначений - результат для автоподбора. -// -Функция СписокАвтоподбораНомераДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска) Экспорт - - ВариантыДомов = Новый СписокЗначений; - - СписокДомов = СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска); - Если СписокДомов <> Неопределено Тогда - ВариантыДомов = Новый СписокЗначений; - Для каждого Строка Из СписокДомов Цикл - ВариантыДомов.Добавить(Строка.Значение, Строка.Представление); - КонецЦикла; - КонецЕсли; - - Возврат ВариантыДомов; -КонецФункции - -// Возвращает список домов по идентификатору адресного объекта, поиск по подобию. -// -// Параметры: -// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Родительский объект. -// СтрокаПоиска - Строка - Текст, отбора в списке домов. -// -// Возвращаемое значение: -// ТаблицаЗначений - найденные варианты. -// -Функция СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска = "") Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - СписокДомов = МодульАдресныйКлассификаторСлужебный.СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска); - Возврат СписокДомов; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - - #КонецОбласти #Область ОбщиеСлужебныеПроцедурыИФункции -// Функция раскладывает строку с данными об адресе (в формате 9 запятых) на элементы структуры. -Функция РазложитьАдресВСтруктуру(Знач СтрокаАдрес) Экспорт - - Страна = ""; - Индекс = ""; - Регион = ""; - Район = ""; - Город = ""; - НаселенныйПункт = ""; - Улица =""; - Дом =""; - Корпус =""; - Квартира =""; - - МассивАдрес = СтрРазделить(СтрокаАдрес, ",", Истина); - ЭлементовВМассиве = МассивАдрес.Количество(); - - Если ЭлементовВМассиве > 0 Тогда - Страна = СокрЛП(МассивАдрес[0]); - КонецЕсли; - Если ЭлементовВМассиве > 1 Тогда - Индекс = СокрЛП(МассивАдрес[1]); - КонецЕсли; - Если ЭлементовВМассиве > 2 Тогда - Регион = СокрЛП(МассивАдрес[2]); - КонецЕсли; - Если ЭлементовВМассиве > 3 Тогда - Район = СокрЛП(МассивАдрес[3]); - КонецЕсли; - Если ЭлементовВМассиве > 4 Тогда - Город = СокрЛП(МассивАдрес[4]); - КонецЕсли; - Если ЭлементовВМассиве > 5 Тогда - НаселенныйПункт = СокрЛП(МассивАдрес[5]); - КонецЕсли; - Если ЭлементовВМассиве > 6 Тогда - Улица = СокрЛП(МассивАдрес[6]); - КонецЕсли; - Если ЭлементовВМассиве > 7 Тогда - Дом = СокрЛП(МассивАдрес[7]); - КонецЕсли; - Если ЭлементовВМассиве > 8 Тогда - Корпус = СокрЛП(МассивАдрес[8]); - КонецЕсли; - Если ЭлементовВМассиве> 9 Тогда - Квартира = СокрЛП(МассивАдрес[9]); - КонецЕсли; - - СтруктураВозврата = Новый Структура; - СтруктураВозврата.Вставить("Страна",Страна); - СтруктураВозврата.Вставить("Индекс",Индекс); - СтруктураВозврата.Вставить("Регион",Регион); - СтруктураВозврата.Вставить("Район",Район); - СтруктураВозврата.Вставить("Город",Город); - СтруктураВозврата.Вставить("НаселенныйПункт",НаселенныйПункт); - СтруктураВозврата.Вставить("Улица",Улица); - СтруктураВозврата.Вставить("Дом",Дом); - СтруктураВозврата.Вставить("Корпус",Корпус); - СтруктураВозврата.Вставить("Квартира",Квартира); - - Возврат СтруктураВозврата; - -КонецФункции - // Возвращает список значений Функция ДоступныеДляКопированияАдреса(Знач ЗначенияПолейДляАнализа, Знач ВидАдреса) Экспорт - АдресТолькоРоссийский = ВидАдреса.АдресТолькоРоссийский; + ТолькоНациональныйАдрес = ВидАдреса.ТолькоНациональныйАдрес; Результат = Новый СписокЗначений; @@ -1710,11 +674,11 @@ // Не пустое представление ДопустимыйИсточник = Ложь; Иначе - Если АдресТолькоРоссийский Тогда + Если ТолькоНациональныйАдрес Тогда // В адрес, ограниченный Россией, нельзя копировать иностранный адрес. XMLАдрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(Адрес.ЗначениеПолей, Представление, ВидАдреса); XDTOАдрес = КонтактнаяИнформацияИзXML(XMLАдрес, ВидАдреса); - Если Не ЭтоРоссийскийАдрес(XDTOАдрес) Тогда + Если Не ЭтоНациональныйАдрес(XDTOАдрес) Тогда ДопустимыйИсточник = Ложь; КонецЕсли; КонецЕсли; @@ -1734,103 +698,6 @@ КонецФункции -// Возвращает варианты типов домов (по признаку владения). -Функция ВариантыДанныхДом() Экспорт - - Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", - УправлениеКонтактнойИнформациейКлиентСервер.НаименованияОбъектовАдресацииПоТипу(1), Ложь); - -КонецФункции - -// Возвращает варианты типов домов (по признаку строения). -Функция ВариантыДанныхСтроение() Экспорт - - Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", - УправлениеКонтактнойИнформациейКлиентСервер.НаименованияОбъектовАдресацииПоТипу(2), Ложь); - -КонецФункции - -// Возвращает варианты типов помещений. -Функция ВариантыДанныхПомещение() Экспорт - - Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", - УправлениеКонтактнойИнформациейКлиентСервер.НаименованияОбъектовАдресацииПоТипу(3, Ложь), Ложь); - -КонецФункции - -Процедура ЗаполнитьСписокАвтоподбораИзТаблицы(Результат, ТабличныеДанные, ЭтоПодборУлицы) - - Для Каждого Строка Из ТабличныеДанные Цикл - - Если Строка.Неактуален Тогда - Пометка = Истина; - Представление = Новый ФорматированнаяСтрока(Строка.Представление,, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Предупреждение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес ""%1"" неактуален.'"), Строка.Представление); - Иначе - Предупреждение = Неопределено; - Пометка = Ложь; - Представление = Строка.Представление; - КонецЕсли; - - ЗначениеЭлемента = Новый Структура; - ЗначениеЭлемента.Вставить("Идентификатор", Строка.Идентификатор); - ЗначениеЭлемента.Вставить("Представление", Строка.Представление); - ЗначениеЭлемента.Вставить("Автоподбор", Истина); - ЗначениеЭлемента.Вставить("РегионЗагружен", Строка.РегионЗагружен); - Если ЭтоПодборУлицы Тогда - Если Строка.Уровень = 90 Тогда - ЗначениеЭлемента.Вставить("Улица", ""); - ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", Строка.Представление); - ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", ""); - ИначеЕсли Строка.Уровень = 91 Тогда - ЗначениеЭлемента.Вставить("Улица", ""); - ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", ""); - ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", Строка.Представление); - Иначе - ЗначениеЭлемента.Вставить("Улица", Строка.Представление); - ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", ""); - ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", ""); - КонецЕсли; - ЗначениеЭлемента.Вставить("ТипАдресногоЭлемента", Строка.ТипАдресногоЭлемента); - - КонецЕсли; - - Результат.Добавить( - Новый Структура("Предупреждение, Значение", Предупреждение, ЗначениеЭлемента), - Представление, Пометка); - КонецЦикла; - -КонецПроцедуры - -// Преобразует введенные английские буквы к русской раскладке при подборе адреса -// -Процедура ПреобразоватьВводАдреса(Текст) - РусскиеКлавиши = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ"; - АнглийскиеКлавиши = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.`"; - Текст = ВРег(Текст); - Для Позиция = 0 По СтрДлина(Текст) Цикл - Символ = Сред(Текст, Позиция, 1); - ПозицияСимвола = СтрНайти(АнглийскиеКлавиши, Символ); - Если ПозицияСимвола > 0 Тогда - Текст = СтрЗаменить(Текст, Символ, Сред(РусскиеКлавиши, ПозицияСимвола, 1)); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Функция СтруктураОшибкиПоставщикаАдресногоКлассификатора(ИсходнаяСтруктура = Неопределено) - - Если ИсходнаяСтруктура = Неопределено Тогда - ИсходнаяСтруктура = Новый Структура; - КонецЕсли; - - ИсходнаяСтруктура.Вставить("Отказ", Ложь); - ИсходнаяСтруктура.Вставить("ПодробноеПредставлениеОшибки"); - ИсходнаяСтруктура.Вставить("КраткоеПредставлениеОшибки"); - - Возврат ИсходнаяСтруктура; -КонецФункции - // Преобразует контактную информацию XDTO в XML. // // Параметры: @@ -1851,6 +718,11 @@ Результат = СтрЗаменить(Запись.Закрыть(), Символы.ПС, " "); Результат = СтрЗаменить(Результат, "<ВнутригРайон/>", "");// Совместимость с КЛАДР + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Результат = МодульРаботаСАдресами.ПередЗаписьюXDTOКонтактнаяИнформация(Результат); + КонецЕсли; + Возврат Результат; КонецФункции @@ -1882,6 +754,12 @@ ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Текст) Тогда ЧтениеXML = Новый ЧтениеXML; + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Текст = МодульРаботаСАдресами.ПередЧтениемXDTOКонтактнаяИнформация(Текст); + КонецЕсли; + ЧтениеXML.УстановитьСтроку(Текст); ТекстОшибки = Неопределено; @@ -2005,6 +883,7 @@ Возврат Результат; КонецФункции + // Разбирает представление КИ и возвращает XDTO. // // Параметры: @@ -2057,17 +936,8 @@ // Функция АдресXMLВXDTO(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйТип = Неопределено) Экспорт - ТипЗначения = ТипЗнч(ЗначенияПолей); - РазбиратьПоПолям = (ТипЗначения = Тип("СписокЗначений") Или ТипЗначения = Тип("Структура") - Или (ТипЗначения = Тип("Строка") И Не ПустаяСтрока(ЗначенияПолей))); - Если РазбиратьПоПолям Тогда - // Разбираем из значений полей. - Возврат ДесериализацияАдресаОбщая(ЗначенияПолей, Представление, ОжидаемыйТип); - КонецЕсли; - - // Разбираем адрес из его представления по классификатору. - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат СформироватьАдресПоПредставлению(Представление); + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + Возврат Обработки["РасширенныйВводКонтактнойИнформации"].АдресXMLВXDTO(ЗначенияПолей, Представление, ОжидаемыйТип); КонецЕсли; // Пустой объект с представлением. @@ -2080,309 +950,6 @@ КонецФункции -Функция УровниАдресныхОбъектов(ТипАдресногоОбъекта = "Полный") - Уровни = Новый Массив; - Если ТипАдресногоОбъекта = "Улица" Тогда - Уровни.Добавить(7); - Уровни.Добавить(90); - Уровни.Добавить(91); - ИначеЕсли ТипАдресногоОбъекта = "НаселенныйПункт" Тогда - Уровни.Добавить(1); - Уровни.Добавить(2); - Уровни.Добавить(3); - Уровни.Добавить(4); - Уровни.Добавить(5); - Уровни.Добавить(6); - Иначе - Уровни.Добавить(1); - Уровни.Добавить(2); - Уровни.Добавить(3); - Уровни.Добавить(4); - Уровни.Добавить(5); - Уровни.Добавить(6); - Уровни.Добавить(7); - Уровни.Добавить(90); - Уровни.Добавить(91); - КонецЕсли; - - Возврат Уровни; -КонецФункции - -Функция СформироватьАдресПоПредставлению(Представление) - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - - Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); - Результат.Представление = Представление; - - Адрес = Результат.Состав; - НаименованиеРоссии = СокрЛП(Справочники.СтраныМира.Россия.Наименование); - - ДанныеАнализа = ЧастиАдресаТаблицей(Представление); - Если ДанныеАнализа.Количество() = 0 Тогда - Возврат Результат; - КонецЕсли; - - ОпределитьСтрануИИндекс(ДанныеАнализа); - СтрокаСтраны = ДанныеАнализа.Найти(-2, "Уровень"); - Если СтрокаСтраны = Неопределено Тогда - Адрес.Страна = НаименованиеРоссии; - Иначе - Адрес.Страна = СокрЛП(ВРег(СтрокаСтраны.Значение)); - // Проверка наличия страны в справочнике Страны мира и неявное добавление ее в случае отсутствия. - ДанныеСтраныМира = Справочники.СтраныМира.ДанныеСтраныМира(, Адрес.Страна); - Если ДанныеСтраныМира <> Неопределено И НЕ ЗначениеЗаполнено(ДанныеСтраныМира.Ссылка) Тогда - СтранаМира = Справочники.СтраныМира.СсылкаПоДаннымКлассификатора(ДанныеСтраныМира); - КонецЕсли; - КонецЕсли; - - Если Адрес.Страна = НаименованиеРоссии Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - АдресРФ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ")); - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - АдресПоУровням = МодульАдресныйКлассификаторСлужебный.УстановитьСоответствиеЧастейАдресаИхУровню(ДанныеАнализа, УровниАдресныхОбъектов()); - Если АдресПоУровням <> Неопределено Тогда - ПоместитьАдресВXDTO(АдресРФ, АдресПоУровням); - КонецЕсли; - - Если АдресПоУровням.Найти(0, "Уровень") <> Неопределено Тогда - // Что-то осталось, считаем адресом в свободной форме. - АдресРФ.Адрес_По_Документу = Представление; - КонецЕсли; - Адрес.Состав = АдресРФ; - КонецЕсли; - Иначе - // Состав без страны, она остается в представлении. - Позиция = СтрокаСтраны.Начало + СтрокаСтраны.Длина; - Длина = СтрДлина(Представление); - Разделители = "," + Символы.ПС; - Пока Позиция <= Длина И СтрНайти(Разделители, Сред(Представление, Позиция, 1)) <= 0 Цикл - Позиция = Позиция + 1; - КонецЦикла; - Пока Позиция <= Длина И СтрНайти(Разделители, Сред(Представление, Позиция, 1)) > 0 Цикл - Позиция = Позиция + 1; - КонецЦикла; - Адрес.Состав = СокрЛП(Лев(Представление, СтрокаСтраны.Начало - 1) + " " + СокрЛП(Сред(Представление, Позиция))); - - КонецЕсли; - - Возврат Результат; -КонецФункции - -Функция ЧастиАдресаТаблицей(Знач Текст) - - ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(128)); - ТипЧисло = Новый ОписаниеТипов("Число"); - - Результат = Новый ТаблицаЗначений; - Колонки = Результат.Колонки; - Колонки.Добавить("Уровень", ТипЧисло); - Колонки.Добавить("Позиция", ТипЧисло); - Колонки.Добавить("Значение", ТипСтрока); - Колонки.Добавить("Наименование", ТипСтрока); - Колонки.Добавить("Сокращение", ТипСтрока); - Колонки.Добавить("Начало", ТипЧисло); - Колонки.Добавить("Длина", ТипЧисло); - Колонки.Добавить("Идентификатор", ТипСтрока); - - Номер = 1; - Для Каждого Часть Из СловаТекстаТаблицей(Текст, "," + Символы.ПС) Цикл - Значение = СокрЛП(Часть.Значение); - Если ПустаяСтрока(Значение) Тогда - Продолжить; - КонецЕсли; - - Строка = Результат.Добавить(); - - Строка.Уровень = 0; - Строка.Позиция = Номер; - Номер = Номер + 1; - - Строка.Начало = Часть.Начало; - Строка.Длина = Часть.Длина; - - Позиция = СтрДлина(Значение); - Пока Позиция > 0 Цикл - Символ = Сред(Значение, Позиция, 1); - Если ПустаяСтрока(Символ) Тогда - Строка.Наименование = СокрЛП(Лев(Значение, Позиция-1)); - Прервать; - КонецЕсли; - Строка.Сокращение = Символ + Строка.Сокращение; - Позиция = Позиция - 1; - КонецЦикла; - - Если ПустаяСтрока(Строка.Наименование) Тогда - Строка.Наименование = СокрЛП(Строка.Сокращение); - Строка.Сокращение = ""; - КонецЕсли; - Строка.Значение = Строка.Наименование + " " + Строка.Сокращение; // Значение; - КонецЦикла; - - Возврат Результат; -КонецФункции - -Процедура ОпределитьСтрануИИндекс(ДанныеАдреса) - - Классификатор = Справочники.СтраныМира.ТаблицаКлассификатора(); - Для каждого ЭлементАдреса Из ДанныеАдреса Цикл - Индекс = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ЭлементАдреса.Наименование); - Если Индекс <> Неопределено И Индекс >= 100000 И Индекс < 1000000 Тогда - ЭлементАдреса.Уровень = -1; - Иначе - Если Классификатор.Найти(ВРег(ЭлементАдреса.Наименование), "Наименование") <> Неопределено Тогда - ЭлементАдреса.Уровень = -2; - КонецЕсли; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура ПоместитьАдресВXDTO(АдресРФ, АдресПоУровням) - - ТаблицаЗданийПомещений = Новый ТаблицаЗначений; - ТаблицаЗданийПомещений.Колонки.Добавить("Тип"); - ТаблицаЗданийПомещений.Колонки.Добавить("Значение"); - - Для каждого ЭлементАдреса Из АдресПоУровням Цикл - // XPath - Если ЭлементАдреса.Уровень = 1 Тогда - Путь = "СубъектРФ"; - ИначеЕсли ЭлементАдреса.Уровень = 2 Тогда - Путь = "Округ"; - ИначеЕсли ЭлементАдреса.Уровень = 3 Тогда - Путь = "СвРайМО/Район"; - ИначеЕсли ЭлементАдреса.Уровень = 4 Тогда - Путь = "Город"; - ИначеЕсли ЭлементАдреса.Уровень = 5 Тогда - Путь = "ВнутригРайон"; - ИначеЕсли ЭлементАдреса.Уровень = 6 Тогда - Путь = "НаселПункт"; - ИначеЕсли ЭлементАдреса.Уровень = 7 Тогда - Путь = "Улица"; - ИначеЕсли ЭлементАдреса.Уровень = 90 Тогда - ДобавитьДополнительныеЭлементыАдреса(АдресРФ, ЭлементАдреса.Значение, 90); - ИначеЕсли ЭлементАдреса.Уровень = 91 Тогда - ДобавитьДополнительныеЭлементыАдреса(АдресРФ, ЭлементАдреса.Значение, 91); - ИначеЕсли ЭлементАдреса.Уровень = -3 Тогда - Продолжить; - ИначеЕсли ЭлементАдреса.Уровень = -1 Тогда - ПочтовыйИндексАдреса(АдресРФ, ЭлементАдреса.Наименование); - Иначе - // Проверка на квартиру или здание. - Тип = СокрЛП(СтрЗаменить(ЭлементАдреса.Наименование, "№", "")); - Если УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации(Тип) <> Неопределено Тогда - // Вставляем в начало, так как порядок результата запроса у нас обратный. - НоваяСтрока = ТаблицаЗданийПомещений.Вставить(0); - НоваяСтрока.Значение = СокрЛП(СтрЗаменить(ЭлементАдреса.Сокращение, "№", "")); - НоваяСтрока.Тип = Тип; - ЭлементАдреса.Уровень = -3; - КонецЕсли; - - Продолжить; - КонецЕсли; - - Если ЭлементАдреса.Уровень > 0 И ЭлементАдреса.Уровень < 90 Тогда - УстановитьСвойствоПоXPath(АдресРФ, Путь, ЭлементАдреса.Значение); - КонецЕсли; - - КонецЦикла; - - ЗданияИПомещения = Новый Структура("Здания, Помещения", ТаблицаЗданийПомещений, ТаблицаЗданийПомещений); - ЗданияИПомещенияАдреса(АдресРФ, ЗданияИПомещения); - -КонецПроцедуры - -// Установка глубокого свойства объекта. -Процедура УстановитьСвойствоПоXPath(ОбъектXTDO, XPath, Значение) - - // Переносов строки в XPath не ожидаем. - СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); - - ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); - Если ЧислоСвойств = 1 Тогда - ОбъектXTDO.Установить(СтрокаСвойств, Значение); - Возврат; - ИначеЕсли ЧислоСвойств < 1 Тогда - Возврат; - КонецЕсли; - - РодительскийОбъект = Неопределено; - ТекущийОбъект = ОбъектXTDO; - Для Индекс = 1 По ЧислоСвойств Цикл - - ТекущееИмя = СтрПолучитьСтроку(СтрокаСвойств, Индекс); - Если ТекущийОбъект.Установлено(ТекущееИмя) Тогда - РодительскийОбъект = ТекущийОбъект; - ТекущийОбъект = ТекущийОбъект.ПолучитьXDTO(ТекущееИмя); - Иначе - НовыйТип = ТекущийОбъект.Свойства().Получить(ТекущееИмя).Тип; - ТипТипа = ТипЗнч(НовыйТип); - Если ТипТипа = Тип("ТипОбъектаXDTO") Тогда - НовыйОбъект = ФабрикаXDTO.Создать(НовыйТип); - ТекущийОбъект.Установить(ТекущееИмя, НовыйОбъект); - РодительскийОбъект = ТекущийОбъект; - ТекущийОбъект = НовыйОбъект; - ИначеЕсли ТипТипа = Тип("ТипЗначенияXDTO") Тогда - // Непосредственное значение - ТекущийОбъект.Установить(ТекущееИмя, Значение); - РодительскийОбъект = Неопределено; - Прервать; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Если РодительскийОбъект <> Неопределено Тогда - РодительскийОбъект.Установить(ТекущееИмя, Значение); - КонецЕсли; - -КонецПроцедуры - -Функция СловаТекстаТаблицей(Знач Текст, Знач Разделители = Неопределено) - - // Удаление из текста спец. символов "точек, "номеров". - Текст = СтрЗаменить(Текст, "№", ""); - - НачалоСлова = 0; - Состояние = 0; - - ТипСтрока = Новый ОписаниеТипов("Строка"); - ТипЧисло = Новый ОписаниеТипов("Число"); - - Результат = Новый ТаблицаЗначений; - Колонки = Результат.Колонки; - Колонки.Добавить("Значение", ТипСтрока); - Колонки.Добавить("Начало", ТипЧисло); - Колонки.Добавить("Длина", ТипЧисло); - - Для Позиция = 1 По СтрДлина(Текст) Цикл - ТекущийСимвол = Сред(Текст, Позиция, 1); - ЭтоРазделитель = ?(Разделители = Неопределено, ПустаяСтрока(ТекущийСимвол), СтрНайти(Разделители, ТекущийСимвол) > 0); - - Если Состояние = 0 И (Не ЭтоРазделитель) Тогда - НачалоСлова = Позиция; - Состояние = 1; - ИначеЕсли Состояние = 1 И ЭтоРазделитель Тогда - Строка = Результат.Добавить(); - Строка.Начало = НачалоСлова; - Строка.Длина = Позиция-НачалоСлова; - Строка.Значение = Сред(Текст, Строка.Начало, Строка.Длина); - Состояние = 0; - КонецЕсли; - КонецЦикла; - - Если Состояние = 1 Тогда - Строка = Результат.Добавить(); - Строка.Начало = НачалоСлова; - Строка.Длина = Позиция-НачалоСлова; - Строка.Значение = Сред(Текст, Строка.Начало, Строка.Длина) - КонецЕсли; - - Возврат Результат; -КонецФункции - // Преобразует строку в XDTO контактную информацию телефона. // // ЗначенияПолей - Строка - сериализованная информация, значения полей. @@ -2493,7 +1060,7 @@ КонецФункции -// Вычисляет и устанавливает флаг того, что адрес был введен в свободной форме. +// Вычисляет и устанавливает флаг того, что адрес был введен в свободной форме. // В качестве флага используется не пустота значения поля "Адрес_по_документу". // // Параметры: @@ -2511,7 +1078,7 @@ КонецЕсли; ОбъектXDTO = ?(НадоСериализовать, КонтактнаяИнформацияИзXML(XDTOИнформация), XDTOИнформация); - Если Не ЭтоРоссийскийАдрес(ОбъектXDTO) Тогда + Если Не ЭтоНациональныйАдрес(ОбъектXDTO) Тогда // Не поддерживаем Возврат Ложь; КонецЕсли; @@ -2591,408 +1158,12 @@ // Возвращаемое значение: // Булево - результат проверки. // -Функция ЭтоРоссийскийАдрес(XDTOАдрес) Экспорт - Возврат РоссийскийАдрес(XDTOАдрес) <> Неопределено; -КонецФункции - -// Возвращает извлеченный XDTO российского адреса или Неопределено для адреса иностранного. -// -// Параметры: -// ОбъектИнформации - ОбъектXDTO - Контактная информация или XDTO адреса. -// -// Возвращаемое значение: -// ОбъектXDTO - российский адрес. -// Неопределено - нет российского адреса. -// -Функция РоссийскийАдрес(ОбъектИнформации) Экспорт - Результат = Неопределено; - ТипXDTO = Тип("ОбъектXDTO"); - - Если ТипЗнч(ОбъектИнформации) = ТипXDTO Тогда - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - - Если ОбъектИнформации.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") Тогда - Адрес = ОбъектИнформации.Состав; - Иначе - Адрес = ОбъектИнформации; - КонецЕсли; - - Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - Адрес = Адрес.Состав; - КонецЕсли; - - Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - Результат = Адрес; - КонецЕсли; +Функция ЭтоНациональныйАдрес(XDTOАдрес) Экспорт + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + Возврат Обработки["РасширенныйВводКонтактнойИнформации"].НациональныйАдрес(XDTOАдрес) <> Неопределено; КонецЕсли; - Возврат Результат; -КонецФункции - -// Возвращает значения уровней 90(дополнительный элемент) и 91(подчиненный) из адреса. -// -Функция ЗначениеДополнительныхЭлементов(Знач XDTOАдрес) - - Результат = Новый Структура("ДополнительныйЭлемент, ПодчиненныйЭлемент"); - - АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - - ДополнительныйЭлементАдреса = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; - - Результат.ДополнительныйЭлемент = ДополнительныйЭлементАдреса; - Результат.ПодчиненныйЭлемент = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91)); - - Возврат Результат; - -КонецФункции - -// Читает и устанавливает почтовый индекс адреса. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. -// НовоеЗначение - Строка - устанавливаемое значение. -// -// Возвращаемое значение: -// Строка - почтовый индекс. -// -Функция ПочтовыйИндексАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт - - АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Если НовоеЗначение = Неопределено Тогда - // Чтение - Результат = АдресРФ.Получить( УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса() ); - Если Результат <> Неопределено Тогда - Результат = Результат.Значение; - КонецЕсли; - Возврат Результат; - КонецЕсли; - - // Запись - КодИндекса = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииПочтовогоИндекса(); - - ЗаписьИндекса = АдресРФ.Получить(УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса()); - Если ЗаписьИндекса = Неопределено Тогда - ЗаписьИндекса = АдресРФ.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип)); - ЗаписьИндекса.ТипАдрЭл = КодИндекса; - КонецЕсли; - - ЗаписьИндекса.Значение = СокрЛП(НовоеЗначение); - Возврат НовоеЗначение; -КонецФункции - -// Читает дополнительные элемент адреса по его пути. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. -// XPathЭлемента - Строка - Путь к элементу. -// -// Возвращаемое значение: -// Строка - значение элемента. -Функция ДополнительныйЭлементАдреса(XDTOАдрес, XPathЭлемента) - - АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Результат = АдресРФ.Получить(XPathЭлемента); - Если Результат <> Неопределено Тогда - Возврат Результат.Значение; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Возвращает дополнительный адреса. -// -Функция НайтиДополнительныйЭлементАдреса(АдресРФ) Экспорт - - ВариантыДополнительногоЭлементаАдреса = ВариантыДополнительногоЭлементаАдреса(); - - XPath = ""; - ДополнительныйЭлементАдреса = Неопределено; - Для каждого ВариантДополнительныйЭлементАдреса Из ВариантыДополнительногоЭлементаАдреса Цикл - XPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, ВариантДополнительныйЭлементАдреса); - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, XPath); - Если ДополнительныйЭлементАдреса <> Неопределено Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Возврат Новый Структура("Значение, XPath", ДополнительныйЭлементАдреса, XPath); - -КонецФункции - -Функция ВариантыДополнительногоЭлементаАдреса() - - ВариантыДополнительногоЭлементаАдреса = Новый Массив; - ВариантыДополнительногоЭлементаАдреса.Добавить("СНТ"); - ВариантыДополнительногоЭлементаАдреса.Добавить("ГСК"); - ВариантыДополнительногоЭлементаАдреса.Добавить("ТЕР"); - ВариантыДополнительногоЭлементаАдреса.Добавить(""); - Возврат ВариантыДополнительногоЭлементаАдреса; - -КонецФункции - -// Добавляет дополнительные элемент адреса по его пути. -// -Процедура ДобавитьДополнительныеЭлементыАдреса(XDTOАдрес, НовоеЗначение, Уровень) Экспорт - - АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ = Неопределено Тогда - Возврат; - КонецЕсли; - - - Если Уровень = 90 Тогда - НаименованиеИСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(НовоеЗначение); - КодСериализацииДополнительногоОбъектаАдресации = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(90, НаименованиеИСокращение.Сокращение); - ИначеЕсли Уровень = 91 Тогда - КодСериализацииДополнительногоОбъектаАдресации = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(91); - Иначе - КодСериализацииДополнительногоОбъектаАдресации = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(0); - КонецЕсли; - - XPathЭлемента = "ДопАдрЭл[ТипАдрЭл='" + КодСериализацииДополнительногоОбъектаАдресации + "']"; - ЗначениеПоля = АдресРФ.Получить(XPathЭлемента); - Если ЗначениеПоля = Неопределено Тогда - ЗначениеПоля = АдресРФ.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип)); - ЗначениеПоля.ТипАдрЭл = КодСериализацииДополнительногоОбъектаАдресации; - КонецЕсли; - ЗначениеПоля.Значение = НовоеЗначение; - -КонецПроцедуры - -// Возвращает почтовый индекс и ОКТМО для адреса по данным классификатора. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. -// -// Возвращаемое значение: -// Структура - почтовый индекс и ОКТМО. -// * Индекс - почтовый индекс. -// * ОКТМО - ОКТМО -// Неопределено - индекс не найден или адрес иностранный. -// -Функция ОпределитьПочтовыйИндексИОКТМОАдреса(XDTOАдрес, Идентификатор = Неопределено) Экспорт - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - - Если XDTOАдрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - XDTOАдресРФ = XDTOАдрес.Состав; - Иначе - XDTOАдресРФ = XDTOАдрес; - КонецЕсли; - - Если XDTOАдресРФ = Неопределено Или XDTOАдресРФ.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - Возврат Неопределено;// Иностранный или пустой адрес. - КонецЕсли; - - ИндексИОКМТО = Новый Структура("Индекс, ОКТМО"); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - // Вызов анализа и возврат индекса варианта. - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - ИндексИОКМТО = МодульАдресныйКлассификаторСлужебный.ИндексИОКТМОАдресаПоЧастямАдреса(XDTOАдресРФ, Идентификатор); - КонецЕсли; - - Возврат ИндексИОКМТО; -КонецФункции - -// Читает и устанавливает район адреса. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. -// НовоеЗначение - Строка - устанавливаемое значение. -// -// Возвращаемое значение: -// Строка - новое значение. -// -Функция РайонАдреса(XDTOАдрес, НовоеЗначение = Неопределено) - - Если НовоеЗначение = Неопределено Тогда - // Чтение - - Результат = Неопределено; - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - - XDTOТип = XDTOАдрес.Тип(); - Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - АдресРФ = XDTOАдрес; - Иначе - АдресРФ = XDTOАдрес.Состав; - КонецЕсли; - - Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда - Возврат ПолучитьXDTOРеквизитОбъекта(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathРайона()); - КонецЕсли; - - Возврат Неопределено; - КонецЕсли; - - // Запись - Запись = СвРайМО(XDTOАдрес); - Запись.Район = НовоеЗначение; - Возврат НовоеЗначение; -КонецФункции - -// Читает и устанавливает здания и помещения адреса. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. -// НовоеЗначение - Структура - устанавливаемое значение. Ожидаются поля: -// * Здания - ТаблицаЗначений с колонками: -// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных -// объектов. Например "Корпус". -// ** Значение - Строка - значение номера дома, квартиры и т.п. -// * Помещения - ТаблицаЗначений с колонками, аналогично полю Здание. -// -// Возвращаемое значение: -// Структура - текущие данные. Содержит поля: -// * Здания - ТаблицаЗначений с колонками: -// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных объектов. -// Например "Корпус". -// ** Сокращение - Строка - сокращение названия для использования в представлении. -// ** Значение - Строка - значение номера дома, квартиры и т.п. -// ** ПутьXPath - Строка - путь к значению объекта. -// * Помещения - ТаблицаЗначений с колонками, аналогично полю Здание. -// -Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт - - Результат = Новый Структура("Здания, Помещения", - ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"), - ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид")); - - АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Если НовоеЗначение <> Неопределено Тогда - // Запись - Если НовоеЗначение.Свойство("Здания") Тогда - Для Каждого Строка Из НовоеЗначение.Здания Цикл - ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение); - КонецЦикла; - КонецЕсли; - Если НовоеЗначение.Свойство("Помещения") Тогда - Для Каждого Строка Из НовоеЗначение.Помещения Цикл - ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение); - КонецЦикла; - КонецЕсли; - Возврат НовоеЗначение - КонецЕсли; - - // Чтение - Для Каждого ДопЭлемент Из АдресРФ.ДопАдрЭл Цикл - Если ДопЭлемент.Номер <> Неопределено Тогда - КодОбъекта = ДопЭлемент.Номер.Тип; - ТипОбъекта = УправлениеКонтактнойИнформациейКлиентСервер.ТипОбъектаПоКодуСериализации(КодОбъекта); - Если ТипОбъекта <> Неопределено Тогда - Вид = ТипОбъекта.Тип; - Если Вид = 1 Или Вид = 2 Тогда - НоваяСтрока = Результат.Здания.Добавить(); - ИначеЕсли Вид = 3 Тогда - НоваяСтрока = Результат.Помещения.Добавить(); - Иначе - НоваяСтрока = Неопределено; - КонецЕсли; - Если НоваяСтрока <> Неопределено Тогда - НоваяСтрока.Тип = ТипОбъекта.Наименование; - НоваяСтрока.Значение = ДопЭлемент.Номер.Значение; - НоваяСтрока.Сокращение = ТипОбъекта.Сокращение; - НоваяСтрока.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(НоваяСтрока.Тип); - НоваяСтрока.Вид = Вид; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Результат.Здания.Сортировать("Вид"); - Результат.Помещения.Сортировать("Вид"); - - Возврат Результат; -КонецФункции - -// Возвращает представление младший-старший для населенного пункта. -// -// Параметры: -// ОбъектАдреса - ОбъектXDTO - адрес РФ. -// -// Возвращаемое значение: -// Строка - представление. -// -Функция ПредставлениеНаселенногоПункта(ОбъектАдреса) Экспорт - - АдресРФ = РоссийскийАдрес(ОбъектАдреса); - Если АдресРФ = Неопределено Тогда - Возврат ""; - КонецЕсли; - - Если АдресРФ.СвРайМО = Неопределено Тогда - Район = ""; - ИначеЕсли АдресРФ.СвРайМО.Район <> Неопределено Тогда - Район = АдресРФ.СвРайМО.Район; - ИначеЕсли АдресРФ.СвРайМО.СвМО <> Неопределено Тогда - Районы = Новый Массив(АдресРФ.СвРайМО.СвМО.МунОбр2, АдресРФ.СвРайМО.СвМО.МунОбр1); - Район = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Районы); - Иначе - Район = ""; - КонецЕсли; - - Адрес = Новый Массив; - Адрес.Добавить(АдресРФ.НаселПункт); - Адрес.Добавить(АдресРФ.ВнутригРайон); - Адрес.Добавить(АдресРФ.Город); - Адрес.Добавить(Район); - Адрес.Добавить(АдресРФ.Округ); - Адрес.Добавить(АдресРФ.СубъектРФ); - - Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); - -КонецФункции - -// Возвращает представление младший-старший для населенного пункта. -// -// Параметры: -// ОбъектАдреса - ОбъектXDTO - адрес РФ. -// -// Возвращаемое значение: -// Строка - представление. -// -Функция ПредставлениеУлицы(ОбъектАдреса) Экспорт - - АдресРФ = РоссийскийАдрес(ОбъектАдреса); - Если АдресРФ = Неопределено Тогда - Возврат ""; - КонецЕсли; - - Адрес = Новый Массив; - Адрес.Добавить(АдресРФ.Улица); - - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "СНТ")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ГСК")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ТЕР")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90)); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Адрес.Добавить(ДополнительныйЭлементАдреса); - Адрес.Добавить(ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); - - Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); - + Возврат Ложь; КонецФункции // Формирует представление для адреса по правилу: @@ -3002,67 +1173,21 @@ // Функция ПредставлениеАдреса(Знач XDTOАдрес, Знач ВидИнформации) Экспорт - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - АдресРФ = XDTOАдрес.Состав; - Страна = СокрЛП(XDTOАдрес.Страна); - Если ЭтоРоссийскийАдрес(АдресРФ) Тогда - - // Значимые части - Адрес = Новый Массив; - Адрес.Добавить(ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса())); - Адрес.Добавить(АдресРФ.СубъектРФ); - Если ВидИнформации.ФорматАдреса = "ФИАС" Тогда - Адрес.Добавить(АдресРФ.Округ); - КонецЕсли; - Адрес.Добавить(РайонАдреса(АдресРФ)); - Адрес.Добавить(АдресРФ.Город); - Если ВидИнформации.ФорматАдреса = "ФИАС" Тогда - Адрес.Добавить(АдресРФ.ВнутригРайон); - КонецЕсли; - Адрес.Добавить(АдресРФ.НаселПункт); - Адрес.Добавить(АдресРФ.Улица); - - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "СНТ")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ГСК")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ТЕР")); - Если ДополнительныйЭлементАдреса = Неопределено Тогда - ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90)); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Адрес.Добавить(ДополнительныйЭлементАдреса); - Адрес.Добавить(ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); - - Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + НациональныйАдрес = XDTOАдрес.Состав; + Страна = СокрЛП(XDTOАдрес.Страна); - // Строения и помещения - НомерНеВыведен = Истина; - Данные = ЗданияИПомещенияАдреса(АдресРФ); - Для Каждого Строка Из Данные.Здания Цикл - Здания = Новый Массив; - Здания.Добавить(Представление); - Здания.Добавить(СокрЛП(Строка.Сокращение + ?(НомерНеВыведен, " № ", " ") + Строка.Значение)); - Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Здания); - НомерНеВыведен = Ложь; - КонецЦикла; - - Для Каждого Строка Из Данные.Помещения Цикл - Помещения = Новый Массив; - Помещения.Добавить(Представление); - Помещения.Добавить(СокрЛП(Строка.Сокращение + " " + Строка.Значение)); - Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Помещения); - КонецЦикла; - - // При пустом представлении страну нет смысла выводить. - Если ПустаяСтрока(Представление) Тогда - Страна = ""; - КонецЕсли; + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + ЭтоНациональныйАдрес = Обработки["РасширенныйВводКонтактнойИнформации"].ЭтоНациональныйАдрес(НациональныйАдрес); + Иначе + ЭтоНациональныйАдрес = Ложь; + КонецЕсли; + + Если ЭтоНациональныйАдрес Тогда + Представление = Обработки["РасширенныйВводКонтактнойИнформации"].ПредставлениеАдреса(ВидИнформации, НациональныйАдрес, Страна); Иначе // Это иностранный адрес - Представление = СокрЛП(АдресРФ); + Представление = СокрЛП(НациональныйАдрес); Если СтрЧислоВхождений(Представление, ",") = 9 Тогда // Удаляем пустые значения и страну. @@ -3087,450 +1212,6 @@ КонецФункции -// Возвращает перечень ошибок для адреса. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO, СписокЗначений, Строка - описание адреса. -// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - ссылка на соответствующий вид -// контактной информации. -// РезультатГруппами - Булево - если указана Истина, то будет возвращен массив групп ошибок, иначе - список -// значений. -// -// Возвращаемое значение: -// СписокЗначений - если параметр РезультатГруппами равен Ложь. Внутри представление - текст ошибки, значение - -// XPath ошибочного поля. -// Массив - если параметр РезультатГруппами равен Истина. Содержит структуры с полями: -// ** ТипОшибки - Строка - наименование группы (типа) ошибки. Возможные значения: -// "ПредставлениеНеСоответствуетНаборуПолей" -// "НеЗаполненыОбязательныеПоля" -// "НеУказаныСокращенияПолей" -// "НедопустимыеСимволыПолей" -// "НеСоответствуетДлинаПолей" -// "ОшибкиПоКлассификатору". -// ** Сообщение - Строка - подробный текст ошибки. -// ** Поля - Массив - содержит структуры описания ошибочных полей. Каждая структура имеет -// реквизиты: -// *** ИмяПоля - Строка - внутренний идентификатор ошибочного элемента адреса. -// *** Сообщение - Строка - подробный текст ошибки для этого поля. -// -Функция ОшибкиЗаполненияАдресаXDTO(XDTOАдрес, ВидИнформации, РезультатГруппами = Ложь) Экспорт - - Если ТипЗнч(XDTOАдрес) = Тип("ОбъектXDTO") Тогда - АдресРФ = XDTOАдрес.Состав; - Иначе - XTDOКонтактная = АдресXMLВXDTO(XDTOАдрес); - Адрес = XTDOКонтактная.Состав; - АдресРФ = ?(Адрес = Неопределено, Неопределено, Адрес.Состав); - КонецЕсли; - - // Флаги проверки - Если ТипЗнч(ВидИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда - ФлагиПроверки = СтруктураВидаКонтактнойИнформации(ВидИнформации); - Иначе - ФлагиПроверки = ВидИнформации; - КонецЕсли; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Если ТипЗнч(АдресРФ) <> Тип("ОбъектXDTO") Или АдресРФ.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - // Адрес за пределами РФ - Результат = ?(РезультатГруппами, Новый Массив, Новый СписокЗначений); - - Если ФлагиПроверки.АдресТолькоРоссийский Тогда - ТекстОшибки = НСтр("ru = 'Адрес должен быть только российским.'"); - Если РезультатГруппами Тогда - Результат.Добавить(Новый Структура("Поля, ТипОшибки, Сообщение", Новый Массив, - "НеЗаполненыОбязательныеПоля", ТекстОшибки)); - Иначе - Результат.Добавить("/", ТекстОшибки); - КонецЕсли; - КонецЕсли; - - Возврат Результат; - КонецЕсли; - - // Отдельно проверяем пустой адрес, если необходимо его заполнение. - Если Не XDTOКонтактнаяИнформацияЗаполнена(АдресРФ) Тогда - // Адрес пуст - Если ФлагиПроверки.ОбязательноеЗаполнение Тогда - // Но должен быть заполнен - ТекстОшибки = НСтр("ru = 'Адрес не заполнен.'"); - - Если РезультатГруппами Тогда - Результат = Новый Массив; - Результат.Добавить(Новый Структура("Поля, ТипОшибки, Сообщение", Новый Массив, - "НеЗаполненыОбязательныеПоля", ТекстОшибки)); - Иначе - Результат = Новый СписокЗначений; - Результат.Добавить("/", ТекстОшибки); - КонецЕсли; - - Возврат Результат - КонецЕсли; - - // Адрес пуст и не должен быть заполнен - считаем его корректным. - Возврат ?(РезультатГруппами, Новый Массив, Новый СписокЗначений); - КонецЕсли; - - ВсеОшибки = ОбщиеГруппыОшибокЗаполненияАдреса(АдресРФ, ФлагиПроверки); - ПроверятьКлассификатор = Истина; - - Для Каждого Группа Из ВсеОшибки Цикл - Если СтрНайти("НеУказаныСокращенияПолей, НедопустимыеСимволыПолей", Группа.ТипОшибки) > 0 Тогда - // Некорректные данные в полях, проверять их по классификатору нет смысла. - ПроверятьКлассификатор = Ложь; - Прервать; - КонецЕсли - КонецЦикла; - - ОшибкиКлассификатора = Новый СписокЗначений; - Если ПроверятьКлассификатор И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ЗаполнитьОшибкиАдресаПоКлассификатору(АдресРФ, ФлагиПроверки, ОшибкиКлассификатора); - КонецЕсли; - - Если РезультатГруппами Тогда - НаименованиеГруппыОшибки = "ОшибкиПоКлассификатору"; - КоличествоОшибок = ОшибкиКлассификатора.Количество(); - - Если КоличествоОшибок = 1 И ОшибкиКлассификатора[0].Значение <> Неопределено - И ОшибкиКлассификатора[0].Значение.ПутьXPath = Неопределено Тогда - ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, ОшибкиКлассификатора[0].Представление)); - - ИначеЕсли КоличествоОшибок > 0 Тогда - // Подробное описание ошибок - ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, - НСтр("ru = 'Части адреса не соответствуют адресному классификатору:'"))); - - ГруппаОшибокКлассификатора = ВсеОшибки[ВсеОшибки.ВГраница()]; - - СписокСущностей = ""; - Для Каждого Элемент Из ОшибкиКлассификатора Цикл - ЭлементОшибки = Элемент.Значение; - Если ЭлементОшибки = Неопределено Тогда - // Абстрактная ошибка - ДобавитьОшибкуЗаполненияАдреса(ГруппаОшибокКлассификатора, "", Элемент.Представление); - Иначе - ДобавитьОшибкуЗаполненияАдреса(ГруппаОшибокКлассификатора, ЭлементОшибки.ПутьXPath, Элемент.Представление); - СписокСущностей = СписокСущностей + ", " + ЭлементОшибки.СущностьПоля; - КонецЕсли; - КонецЦикла; - - ГруппаОшибокКлассификатора.Сообщение = ГруппаОшибокКлассификатора.Сообщение + Сред(СписокСущностей, 2); - КонецЕсли; - - Возврат ВсеОшибки; - КонецЕсли; - - // Объединяем все в список - Результат = Новый СписокЗначений; - Для Каждого Группа Из ВсеОшибки Цикл - Для Каждого Поле Из Группа.Поля Цикл - Результат.Добавить(Поле.ИмяПоля, Поле.Сообщение, Истина); - КонецЦикла; - КонецЦикла; - Для Каждого ЭлементСписка Из ОшибкиКлассификатора Цикл - Результат.Добавить(ЭлементСписка.Значение.ПутьXPath, ЭлементСписка.Представление, ЭлементСписка.Значение.АдресПроверен); - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Общие проверки на корректность адреса. -// -// Параметры: -// ДанныеАдреса - Строка, СписокЗначений - XML, XDTO с данными адреса РФ. -// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на соответствующий вид контактной информации. -// -// Возвращаемое значение: -// Массив - содержит структуры с полями: -// * ТипОшибки - Строка - идентификатор группы ошибки. Может принимать значение: -// "ПредставлениеНеСоответствуетНаборуПолей", -// "НеЗаполненыОбязательныеПоля" -// "НеУказаныСокращенияПолей" -// "НедопустимыеСимволыПолей" -// "НеСоответствуетДлинаПолей". -// * Сообщение - Строка - Подробный текст ошибки. -// * Поля - Массив структур с полями: -// ** ИмяПоля - внутренний идентификатор ошибочного поля. -// ** Сообщение - подробный текст ошибки для поля. -// -Функция ОбщиеГруппыОшибокЗаполненияАдреса(Знач ДанныеАдреса, Знач ВидИнформации) - Результат = Новый Массив; - - Если ТипЗнч(ДанныеАдреса) = Тип("ОбъектXDTO") Тогда - АдресРФ = ДанныеАдреса; - - Иначе - XTDOКонтактная = АдресXMLВXDTO(ДанныеАдреса); - Адрес = XTDOКонтактная.Состав; - Если Не ЭтоРоссийскийАдрес(Адрес) Тогда - Возврат Результат; - КонецЕсли; - АдресРФ = Адрес.Состав; - - // С) совпадение представления и набора данных. - Представление = ПредставлениеАдреса(АдресРФ, ВидИнформации); - Если XTDOКонтактная.Представление <> Представление Тогда - Результат.Добавить(ГруппаОшибокАдреса("ПредставлениеНеСоответствуетНаборуПолей", - НСтр("ru = 'Адрес не соответствует значениям в наборе полей.'"))); - ДобавитьОшибкуЗаполненияАдреса(Результат[0], "", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Представление адреса для вида контактной информации ""%1"" отличается от данных в адресе.'"), - Строка(ВидИнформации.Наименование))); - КонецЕсли; - КонецЕсли; - - НеЗаполненыОбязательныеПоля = ГруппаОшибокАдреса("НеЗаполненыОбязательныеПоля", - НСтр("ru = 'Не заполнены обязательные поля:'")); - Результат.Добавить(НеЗаполненыОбязательныеПоля); - - НеУказаныСокращенияПолей = ГруппаОшибокАдреса("НеУказаныСокращенияПолей", - НСтр("ru = 'Не указано сокращение для полей:'")); - Результат.Добавить(НеУказаныСокращенияПолей); - - НедопустимыеСимволыПолей = ГруппаОшибокАдреса("НедопустимыеСимволыПолей", - НСтр("ru = 'Найдены недопустимые символы в полях:'")); - Результат.Добавить(НедопустимыеСимволыПолей); - - НеСоответствуетДлинаПолей = ГруппаОшибокАдреса("НеСоответствуетДлинаПолей", - НСтр("ru = 'Не соответствует установленной длина полей:'")); - Результат.Добавить(НеСоответствуетДлинаПолей); - - // 2) Индекс, Регион, Дом должны быть заполнены. - Индекс = ПочтовыйИндексАдреса(АдресРФ); - Если ПустаяСтрока(Индекс) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса(), - НСтр("ru = 'Не указан почтовый индекс.'"), "Индекс"); - КонецЕсли; - - Регион = АдресРФ.СубъектРФ; - Если ПустаяСтрока(Регион) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "СубъектРФ", - НСтр("ru = 'Не указан регион.'"), "Регион"); - КонецЕсли; - - ЗданияПомещения = ЗданияИПомещенияАдреса(АдресРФ); - - // 3) Регион, Район, Город, НаселенныйПункт, Улица должны: - // - иметь сокращение. - // - не длинней 50 символов. - // - только кириллица. - - ДопустимоКромеКириллицы = "/,-. 0123456789_N"; - - // Регион - Если Не ПустаяСтрока(Регион) Тогда - Поле = "СубъектРФ"; - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Регион)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, "СубъектРФ", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии региона ""%1"".'"), Регион), НСтр("ru = 'Регион'")); - КонецЕсли; - Если СтрДлина(Регион) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название региона ""%1"" должно быть короче 50 символов.'"),Регион), НСтр("ru = 'Регион'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Регион, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии региона ""%1"" есть не кириллические символы.'"), Регион), НСтр("ru = 'Регион'")); - КонецЕсли - КонецЕсли; - - // Район - Район = РайонАдреса(АдресРФ); - Если Не ПустаяСтрока(Район) Тогда - Поле = УправлениеКонтактнойИнформациейКлиентСервер.XPathРайона(); - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Район)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии района ""%1"".'"), Район), НСтр("ru = 'Район'")); - КонецЕсли; - Если СтрДлина(Район) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название района ""%1"" должно быть короче 50 символов.'"), Район), НСтр("ru = 'Район'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Район, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии района ""%1"" есть не кириллические символы.'"), Район), НСтр("ru = 'Район'")); - КонецЕсли; - КонецЕсли; - - // Город - Город = АдресРФ.Город; - Если Не ПустаяСтрока(Город) Тогда - Поле = "Город"; - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Город)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии города ""%1"".'"), Город), НСтр("ru = 'Город'")); - КонецЕсли; - Если СтрДлина(Город) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название города ""%1"" должно быть короче 50 символов.'"), Город), НСтр("ru = 'Город'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Город, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии города ""%1"" есть не кириллические символы.'"), Город), НСтр("ru = 'Город'")); - КонецЕсли; - КонецЕсли; - - // Населенный пункт - НаселенныйПункт = АдресРФ.НаселПункт; - Если Не ПустаяСтрока(НаселенныйПункт) Тогда - Поле = "НаселПункт"; - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(НаселенныйПункт)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии населенного пункта ""%1"".'"), НаселенныйПункт), - НСтр("ru = 'Населенный пункт'")); - КонецЕсли; - Если СтрДлина(НаселенныйПункт) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название населенного пункта ""%1"" должно быть короче 50 символов.'"), НаселенныйПункт), - НСтр("ru = 'Населенный пункт'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(НаселенныйПункт, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии населенного пункта ""%1"" есть не кириллические символы.'"), НаселенныйПункт), - НСтр("ru = 'Населенный пункт'")); - КонецЕсли; - КонецЕсли; - - // Улица - Улица = АдресРФ.Улица; - Если Не ПустаяСтрока(Улица) Тогда - Поле = "Улица"; - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Улица)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии улицы ""%1"".'"), Улица), НСтр("ru = 'Улица'")); - КонецЕсли; - Если СтрДлина(Район) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название улицы ""%1"" должно быть короче 50 символов.'"), Улица), НСтр("ru = 'Улица'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Улица, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии улицы ""%1"" есть не кириллические символы.'"), Улица), НСтр("ru = 'Улица'")); - КонецЕсли; - КонецЕсли; - - // Дополнительный элемент - ДополнительныйЭлемент = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; - Если ЗначениеЗаполнено(ДополнительныйЭлемент) Тогда - Поле = "Улица"; - Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(ДополнительныйЭлемент)) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение у дополнительного элемента ""%1"".'"), ДополнительныйЭлемент), - НСтр("ru = 'Улица'")); - КонецЕсли; - Если СтрДлина(Район) > 50 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название дополнительного элемента ""%1"" должно быть короче 50 символов.'"), ДополнительныйЭлемент), - НСтр("ru = 'ДополнительныйЭлемент'")); - КонецЕсли; - Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ДополнительныйЭлемент, Ложь, ДопустимоКромеКириллицы) Тогда - ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии дополнительного элемента ""%1"" есть не кириллические символы.'"), ДополнительныйЭлемент), - НСтр("ru = 'ДополнительныйЭлемент'")); - КонецЕсли; - КонецЕсли; - - // 4) Индекс - если есть, то 6 цифр. - Если Не ПустаяСтрока(Индекс) Тогда - Поле = УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса(); - Если СтрДлина(Индекс) <> 6 Или Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Индекс) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - НСтр("ru = 'Почтовый индекс должен состоять из 6 цифр.'"), - НСтр("ru = 'Индекс'")); - КонецЕсли; - КонецЕсли; - - // 5) Дом, Корпус, Квартира не длинней 12 символов. - Для Каждого ДанныеЗдания Из ЗданияПомещения.Здания Цикл - Если СтрДлина(ДанныеЗдания.Значение) > 12 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеЗдания.ПутьXPath, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Значение поля ""%1"" должно быть короче 12 символов.'"), ДанныеЗдания.Тип), ДанныеЗдания.Тип); - КонецЕсли; - КонецЦикла; - Для Каждого ДанныеПомещения Из ЗданияПомещения.Помещения Цикл - Если СтрДлина(ДанныеПомещения.Значение) > 12 Тогда - ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеПомещения.ПутьXPath, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Значение поля ""%1"" должно быть короче 12 символов.'"), ДанныеПомещения.Тип), ДанныеПомещения.Тип); - КонецЕсли; - КонецЦикла; - - // 6) Поля Город и НаселенныйПункт могут быть одновременно пустые только в регионе - городе ФЗ. - Если ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Район) Тогда - Если НазванияГородовФедеральногоЗначения().Найти(ВРег(Регион)) = Неопределено Тогда - ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Город", - НСтр("ru = 'Город может быть не указан только в регионе - городе федерального значения.'"), - НСтр("ru = 'Город'")); - ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "НаселПункт", - НСтр("ru = 'Населенный пункт может быть не указан только в регионе - городе федерального значения.'"), - НСтр("ru = 'Населенный пункт'")); - КонецЕсли; - КонецЕсли; - - // 7) Улица не может быть пустой если НаселенныйПункт пустой. - Если Не ИсключатьПроверкуУлицыВАдресе(АдресРФ) Тогда - - Если ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Улица) И НЕ ЗначениеЗаполнено(ДополнительныйЭлемент) Тогда - ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Улица", - НСтр("ru = 'Город или населенный пункт должен содержать название улицы.'"), - НСтр("ru = 'Улица'")); - КонецЕсли; - - КонецЕсли; - - // Все. Убираем пустые результаты, корректируем сообщение группы. - Для Индекс = 1-Результат.Количество() По 0 Цикл - Группа = Результат[-Индекс]; - Поля = Группа.Поля; - СписокСущностей = ""; - Для ИндексПоля = 1-Поля.Количество() По 0 Цикл - Поле = Поля[-ИндексПоля]; - Если ПустаяСтрока(Поле.Сообщение) Тогда - Поля.Удалить(-ИндексПоля); - Иначе - СписокСущностей = ", " + Поле.СущностьПоля + СписокСущностей; - Поле.Удалить("СущностьПоля"); - КонецЕсли; - КонецЦикла; - Если Поля.Количество() = 0 Тогда - Результат.Удалить(-Индекс); - ИначеЕсли Не ПустаяСтрока(СписокСущностей) Тогда - Группа.Сообщение = Группа.Сообщение + Сред(СписокСущностей, 2); - КонецЕсли; - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Локальные исключения при проверке адреса. -// -Функция ИсключатьПроверкуУлицыВАдресе(Знач АдресРФ) - Результат = Ложь; - - // В Зеленограде улицы не проверяем. - Если ВРег(СокрЛП(АдресРФ.СубъектРФ)) = НСтр("ru = 'МОСКВА Г'") И ВРег(СокрЛП(АдресРФ.Город)) = НСтр("ru = 'ЗЕЛЕНОГРАД Г'") Тогда - Результат = Истина; - КонецЕсли; - - // Дополнительные элементы адреса могут быть без улиц. - ДополнительныеЭлементы = ЗначениеДополнительныхЭлементов(АдресРФ); - Если ЗначениеЗаполнено(ДополнительныеЭлементы.ДополнительныйЭлемент) Тогда - Результат = Истина; - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Возвращает массив наименований регионов - городов федерального значения. -Функция НазванияГородовФедеральногоЗначения() - - Результат = Новый Массив; - Результат.Добавить("МОСКВА Г"); - Результат.Добавить("САНКТ-ПЕТЕРБУРГ Г"); - Результат.Добавить("СЕВАСТОПОЛЬ Г"); - Результат.Добавить("БАЙКОНУР Г"); - - Возврат Результат; -КонецФункции - Функция ПредставлениеТелефона(XDTOДанные) Экспорт Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона( @@ -3542,7 +1223,7 @@ КонецФункции -// Возвращает представление факса. +// Возвращает представление факса. // // Параметры: // XDTOДанные - ОбъектXDTO - контактная информация. @@ -3560,22 +1241,6 @@ ""); КонецФункции -// Возвращает флаг того, что текущий пользователь может загружать или очищать адресный классификатор. -// -// Возвращаемое значение: -// Булево- результат проверки. -// -Функция ЕстьВозможностьИзмененияАдресногоКлассификатора() Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ОбъектКонтроля = Метаданные.РегистрыСведений.Найти("АдресныеОбъекты"); - Возврат ОбъектКонтроля <> Неопределено И ПравоДоступа("Изменение", ОбъектКонтроля) И НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено(); - КонецЕсли; - - Возврат Ложь; - -КонецФункции - // Конструктор структуры, совместимой по полям со справочникам видов КИ. // // Параметры: @@ -3870,7 +1535,7 @@ Разделитель = ""; Если ВидКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - Если НЕ ВидКонтактнойИнформации.АдресТолькоРоссийский + Если НЕ ВидКонтактнойИнформации.ТолькоНациональныйАдрес И (ВидКонтактнойИнформации.ПроверятьКорректность ИЛИ ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса) Тогда Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Некорректно заполнены настройки проверки адреса у вида контактной информации %1. @@ -3891,259 +1556,7 @@ КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункцииДляСовместимости - -// Возвращает поля контактной информации. -// -// Параметры: -// XDTOКонтактнаяИнформация - ОбъектXDTO, Строка - контактная информация или строка XML. -// СтарыйСоставПолей - Булево - необязательный флаг того, что из состава полей будут исключены -// поля, отсутствующие в версиях БСП младше 2.1.3. -// -// Возвращаемое значение: -// Структура - данные. Содержит поля: -// * Представление - Строка - представление адреса. -// * ЗначенияПолей - СписокЗначений - значения. Состав значений для адреса: -// ** Страна - Строка - текстовое представление страны. -// ** КодСтраны - Строка - код страны по ОКСМ. -// ** Индекс - Строка - почтовый индекс (только для адресов РФ). -// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). -// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). -// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). -// ** Район - Строка - текстовое представление района (только для адресов РФ). -// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). -// ** Город - Строка - текстовое представление города (только для адресов РФ). -// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). -// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). -// ** НаселенныйПунктСокращение - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). -// ** ТипДома - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Дом - Строка - текстовое представление дома (только для адресов РФ). -// ** ТипКорпуса - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). -// ** ТипКвартиры - Строка - см. ТипыОбъектовАдресацииАдресаРФ(). -// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). -// Состав значений для телефона: -// ** КодСтраны - Строка - код страны. Например, +7. -// ** КодГорода - Строка - код города. Например, 495. -// ** НомерТелефона - Строка - номер телефона. -// ** Добавочный - Строка - добавочный номер телефона. -// -Функция КонтактнаяИнформацияВСтаруюСтруктуру(XDTOКонтактнаяИнформация, СтарыйСоставПолей = Ложь) Экспорт - - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOКонтактнаяИнформация) Тогда - XDTOКонтактная = КонтактнаяИнформацияИзXML(XDTOКонтактнаяИнформация); - Иначе - XDTOКонтактная = XDTOКонтактнаяИнформация - КонецЕсли; - - Результат = Новый Структура("Представление, ЗначенияПолей", XDTOКонтактная.Представление, Новый СписокЗначений); - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - Состав = XDTOКонтактная.Состав; - - Если Состав = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Тип = Состав.Тип(); - Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - Результат.ЗначенияПолей = АдресВСтарыйСписокПолей(Состав, Не СтарыйСоставПолей); - Результат.ЗначенияПолей.Добавить(Результат.Представление, "Представление"); - - ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда - Результат.ЗначенияПолей = НомерТелефонаВСтарыйСписокПолей(Состав); - Результат.ЗначенияПолей.Добавить(XDTOКонтактная.Комментарий, "Комментарий"); - - КонецЕсли; - - Возврат Результат; -КонецФункции - -// Преобразует адрес формата XDTO в старый список полей типа СписокЗначений. -// -// Параметры: -// XDTOАдрес - ОбъектXDTO, Строка - контактная информация или строка XML. -// РасширенныйСоставПолей - Булево - необязательный флаг того, что состав полей будет сокращен для совместимости -// с обменом БСП 2.1.2. -// -// Возвращаемое значение: -// СписокЗначений -// -Функция АдресВСтарыйСписокПолей(XDTOАдрес, РасширенныйСоставПолей = Истина) - Список = Новый СписокЗначений; - - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - XDTOТип = XDTOАдрес.Тип(); - Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - - // Страна с кодом - ДобавитьЗначение(Список, "Страна", XDTOАдрес.Страна); - Если ПустаяСтрока(XDTOАдрес.Страна) Тогда - КодСтраны = ""; - Иначе - Страна = Справочники.СтраныМира.НайтиПоНаименованию(XDTOАдрес.Страна, Истина); - КодСтраны = СокрЛП(Страна.Код); - КонецЕсли; - ДобавитьЗначение(Список, "КодСтраны", КодСтраны); - - Если Не ЭтоРоссийскийАдрес(XDTOАдрес) Тогда - Возврат Список; - КонецЕсли; - - АдресРФ = XDTOАдрес.Состав; - - ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - АдресРФ = XDTOАдрес; - - Иначе - Возврат Список; - - КонецЕсли; - - ДобавитьЗначение(Список, "Индекс", ПочтовыйИндексАдреса(АдресРФ) ); - - ДобавитьЗначение(Список, "Регион", АдресРФ.СубъектРФ); - ДобавитьЗначение(Список, "КодРегиона", КодРегиона(АдресРФ.СубъектРФ) ); - Если РасширенныйСоставПолей Тогда - ДобавитьЗначение(Список, "РегионСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(АдресРФ.СубъектРФ)); - КонецЕсли; - - Район = РайонАдреса(АдресРФ); - ДобавитьЗначение(Список, "Район", Район); - Если РасширенныйСоставПолей Тогда - ДобавитьЗначение(Список, "РайонСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Район)); - КонецЕсли; - - ДобавитьЗначение(Список, "Город", АдресРФ.Город); - Если РасширенныйСоставПолей Тогда - ДобавитьЗначение(Список, "ГородСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(АдресРФ.Город)); - КонецЕсли; - - // преобразование ФИАС в КЛАДР - НаселПункт = АдресРФ.НаселПункт; - Улица = АдресРФ.Улица; - ДополнительныйЭлементАдреса = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; - ПодчиненныйЭлементЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, - УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91)); - - ЕстьУлица = ЗначениеЗаполнено(Улица); - ЕстьДополнительныйЭлементАдреса = ЗначениеЗаполнено(ДополнительныйЭлементАдреса); - ЕстьПодчиненныйЭлементЭлементАдреса = ЗначениеЗаполнено(ПодчиненныйЭлементЭлементАдреса); - - Если ЕстьДополнительныйЭлементАдреса Тогда - Если ЕстьПодчиненныйЭлементЭлементАдреса Тогда - НаселПункт = ДополнительныйЭлементАдреса; - Улица = ПодчиненныйЭлементЭлементАдреса; - Иначе - Улица = ДополнительныйЭлементАдреса; - КонецЕсли; - ИначеЕсли ЕстьПодчиненныйЭлементЭлементАдреса Тогда - Улица = ПодчиненныйЭлементЭлементАдреса; - КонецЕсли; - - ДобавитьЗначение(Список, "НаселенныйПункт", НаселПункт); - Если РасширенныйСоставПолей Тогда - ДобавитьЗначение(Список, "НаселенныйПунктСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(НаселПункт)); - КонецЕсли; - - ДобавитьЗначение(Список, "Улица", Улица); - Если РасширенныйСоставПолей Тогда - ДобавитьЗначение(Список, "УлицаСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Улица)); - КонецЕсли; - - // Дом и корпус - ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ); - - ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхДом(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество() = 0 Тогда - ДобавитьЗначение(Список, "ТипДома", ""); - ДобавитьЗначение(Список, "Дом", ""); - Иначе - Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл - ДобавитьЗначение(Список, "ТипДома", СтрокаОбъекта.Тип, РасширенныйСоставПолей); - ДобавитьЗначение(Список, "Дом", СтрокаОбъекта.Значение, РасширенныйСоставПолей); - КонецЦикла; - КонецЕсли; - - ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхСтроение(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество() = 0 Тогда - ДобавитьЗначение(Список, "ТипКорпуса", ""); - ДобавитьЗначение(Список, "Корпус", ""); - ИначеЕсли ПараметрыОбъекта.Количество() = 1 Тогда - СтрокаОбъекта = ПараметрыОбъекта[0]; - ДобавитьЗначение(Список, "ТипКорпуса", СтрокаОбъекта.Тип, РасширенныйСоставПолей); - ДобавитьЗначение(Список, "Корпус", СтрокаОбъекта.Значение, РасширенныйСоставПолей); - Иначе - ТипКорпуса = ПараметрыОбъекта[0].Тип; - ЗначениеКорпуса = ""; - Разделитель = ""; - Сокращения = УправлениеКонтактнойИнформациейКлиентСервер.СокращенияОбъектовАдресацииАдресаРФ(); - Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл - ИмяЗдания = ?(ЗначениеЗаполнено(Сокращения[СтрокаОбъекта.Тип]), Сокращения[СтрокаОбъекта.Тип], СтрокаОбъекта.Тип); - ЗначениеКорпуса = ЗначениеКорпуса + Разделитель + ИмяЗдания + " " + СтрокаОбъекта.Значение; - Разделитель = ", " ; - КонецЦикла; - ДобавитьЗначение(Список, "ТипКорпуса", ТипКорпуса, РасширенныйСоставПолей); - ДобавитьЗначение(Список, "Корпус", ЗначениеКорпуса , РасширенныйСоставПолей); - КонецЕсли; - - ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Помещения, ВариантыДанныхПомещение(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество() = 0 Тогда - ДобавитьЗначение(Список, "ТипКвартиры", ""); - ДобавитьЗначение(Список, "Квартира", ""); - ИначеЕсли ПараметрыОбъекта.Количество() = 1 Тогда - СтрокаОбъекта = ПараметрыОбъекта[0]; - ДобавитьЗначение(Список, "ТипКвартиры", СтрокаОбъекта.Тип, РасширенныйСоставПолей); - ДобавитьЗначение(Список, "Квартира", СтрокаОбъекта.Значение, РасширенныйСоставПолей); - Иначе - ТипПомещения = ПараметрыОбъекта[0].Тип; - ЗначениеПомещения = ""; - Разделитель = ""; - Сокращения = УправлениеКонтактнойИнформациейКлиентСервер.СокращенияОбъектовАдресацииАдресаРФ(); - Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл - ИмяПомещения = ?(ЗначениеЗаполнено(Сокращения[СтрокаОбъекта.Тип]), Сокращения[СтрокаОбъекта.Тип], СтрокаОбъекта.Тип); - ЗначениеПомещения = ЗначениеПомещения + Разделитель + ИмяПомещения + " " + СтрокаОбъекта.Значение; - Разделитель = ", " ; - КонецЦикла; - ДобавитьЗначение(Список, "ТипКвартиры", ТипПомещения, РасширенныйСоставПолей); - ДобавитьЗначение(Список, "Квартира", ЗначениеПомещения, РасширенныйСоставПолей); - КонецЕсли; - - Возврат Список; -КонецФункции - -Процедура ДобавитьЗначение(Список, ИмяПоля, Значение, РазрешитьДубли = Ложь) - - Если Не РазрешитьДубли Тогда - Для Каждого Элемент Из Список Цикл - Если Элемент.Представление = ИмяПоля Тогда - Элемент.Значение = Строка(Значение); - Возврат; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Список.Добавить(Строка(Значение), ИмяПоля); -КонецПроцедуры - -Функция ЗначениеЗданияИлиПомещения(Данные, Варианты, ВсеЗначенияВарианта) - Результат = ТаблицаЗначений("Тип, Значение"); - - Для Каждого Вариант Из Варианты.ВариантыТипа Цикл - Для Каждого Строка Из Данные.НайтиСтроки(Новый Структура("Тип", Вариант)) Цикл - ЗаполнитьЗначенияСвойств(Результат.Добавить(), Строка); - Если Не ВсеЗначенияВарианта Тогда - Прервать; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - Возврат Результат; -КонецФункции - -Функция НомерТелефонаВСтарыйСписокПолей(XDTOТелефон) +Функция НомерТелефонаВСтарыйСписокПолей(XDTOТелефон) Экспорт Результат = Новый СписокЗначений; Результат.Добавить(XDTOТелефон.КодСтраны, "КодСтраны"); @@ -4154,229 +1567,9 @@ Возврат Результат; КонецФункции -Функция ГруппаОшибокАдреса(ТипОшибки, Сообщение) - Возврат Новый Структура("ТипОшибки, Сообщение, Поля", ТипОшибки, Сообщение, Новый Массив); -КонецФункции +#КонецОбласти -Процедура ДобавитьОшибкуЗаполненияАдреса(Группа, ИмяПоля = "", Сообщение = "", СущностьПоля = "") - Группа.Поля.Добавить(Новый Структура("ИмяПоля, Сообщение, СущностьПоля", ИмяПоля, Сообщение, СущностьПоля)); -КонецПроцедуры - -Процедура ЗаполнитьОшибкиАдресаПоКлассификатору(XDTOАдресРФ, ФлагиПроверки, Результат) - - Адреса = Новый Массив; - - Если ФлагиПроверки.ПроверятьПоФИАС Тогда - Адреса.Добавить( Новый Структура("Адрес, ФорматАдреса", XDTOАдресРФ, "ФИАС") ); - ИначеЕсли ФлагиПроверки.ПроверятьКорректность Тогда - Адреса.Добавить( Новый Структура("Адрес, ФорматАдреса", XDTOАдресРФ, "КЛАДР") ); - КонецЕсли; - - Если Адреса.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - РезультатыАнализа = МодульАдресныйКлассификаторСлужебный.РезультатПроверкиАдресовПоКлассификатору(Адреса); - Если РезультатыАнализа.Отказ Тогда - Результат.Добавить( Новый Структура("ПутьXPath, СущностьПоля, АдресПроверен", "/",, Ложь), РезультатыАнализа.КраткоеПредставлениеОшибки); - Возврат; - КонецЕсли; - - // Только уникальные ошибки - мы могли проверить адрес два раза. - Обработанные = Новый Соответствие; - Для Каждого РезультатПроверки Из РезультатыАнализа.Данные Цикл - Для Каждого ОшибкаАдреса Из РезультатПроверки.Ошибки Цикл - Ключ = ОшибкаАдреса.Ключ; - Если Обработанные[Ключ] = Неопределено Тогда - Результат.Добавить(Новый Структура("ПутьXPath, СущностьПоля, АдресПроверен", Ключ,, РезультатПроверки.АдресПроверен), - СокрЛП(ОшибкаАдреса.Текст + Символы.ПС + ОшибкаАдреса.Подсказка)); - Обработанные[Ключ] = Истина; - КонецЕсли; - КонецЦикла; - КонецЦикла; - -КонецПроцедуры - -// Конструктор таблицы значений. -// -Функция ТаблицаЗначений(СписокКолонок, СписокИндексов = "") - ТаблицаРезультата = Новый ТаблицаЗначений; - - Для Каждого КлючЗначение Из (Новый Структура(СписокКолонок)) Цикл - ТаблицаРезультата.Колонки.Добавить(КлючЗначение.Ключ); - КонецЦикла; - - СтрокиИндексов = СтрЗаменить(СписокИндексов, "|", Символы.ПС); - Для НомерИндекса = 1 По СтрЧислоСтрок(СтрокиИндексов) Цикл - КолонкиИндекса = СокрЛП(СтрПолучитьСтроку(СтрокиИндексов, НомерИндекса)); - Для Каждого КлючЗначение Из (Новый Структура(КолонкиИндекса)) Цикл - ТаблицаРезультата.Индексы.Добавить(КлючЗначение.Ключ); - КонецЦикла; - КонецЦикла; - - Возврат ТаблицаРезультата; -КонецФункции - -// Внутреннее для сериализации. -Функция ДесериализацияАдресаОбщая(Знач ЗначенияПолей, Знач Представление, Знач ОжидаемыйТип = Неопределено) - - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей) Тогда - // Общий формат контактной информации. - Возврат КонтактнаяИнформацияИзXML(ЗначенияПолей, ОжидаемыйТип); - КонецЕсли; - - Если ОжидаемыйТип <> Неопределено Тогда - Если ОжидаемыйТип <> Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - ВызватьИсключение НСтр("ru = 'Ошибка десериализации контактной информации, ожидается адрес'"); - КонецЕсли; - КонецЕсли; - - // Старый формат через разделитель строк и равенство. - ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); - - Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); - - Результат.Комментарий = ""; - Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); - - НазваниеРоссии = ВРег(Справочники.СтраныМира.Россия.Наименование); - ЭлементКвартира = Неопределено; - ЭлементКорпус = Неопределено; - ЭлементДом = Неопределено; - - // Российский - АдресРФ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ")); - - // Общий состав - Адрес = Результат.Состав; - Адрес.Страна = НазваниеРоссии; // Страна по умолчанию Россия - АдресРоссийский = Истина; - - ТипЗначенийПолей = ТипЗнч(ЗначенияПолей); - Если ТипЗначенийПолей = Тип("СписокЗначений") Тогда - СписокПолей = ЗначенияПолей; - ИначеЕсли ТипЗначенийПолей = Тип("Структура") Тогда - СписокПолей = УправлениеКонтактнойИнформациейКлиентСервер.ПреобразоватьСтрокуВСписокПолей( - УправлениеКонтактнойИнформациейКлиентСервер.СтрокаПолей(ЗначенияПолей, Ложь)); - Иначе - // Уже преобразовано в строку - СписокПолей = УправлениеКонтактнойИнформациейКлиентСервер.ПреобразоватьСтрокуВСписокПолей(ЗначенияПолей); - КонецЕсли; - - ТипКвартирыНеопределен = Истина; - ТипКорпусаНеопределен = Истина; - ТипДомаНеопределен = Истина; - ПолеПредставления = ""; - - Для Каждого ЭлементСписка Из СписокПолей Цикл - ИмяПоля = ВРег(ЭлементСписка.Представление); - - Если ИмяПоля="ИНДЕКС" Тогда - ЭлементИндекс = СоздатьДопАдрЭлемента(АдресРФ); - ЭлементИндекс.ТипАдрЭл = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииПочтовогоИндекса(); - ЭлементИндекс.Значение = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "СТРАНА" Тогда - Адрес.Страна = ЭлементСписка.Значение; - Если ВРег(ЭлементСписка.Значение) <> НазваниеРоссии Тогда - АдресРоссийский = Ложь; - КонецЕсли; - - ИначеЕсли ИмяПоля = "КОДСТРАНЫ" Тогда - // действия не требуется - - ИначеЕсли ИмяПоля = "КОДРЕГИОНА" Тогда - АдресРФ.СубъектРФ = РегионКода(ЭлементСписка.Значение); - - ИначеЕсли ИмяПоля = "РЕГИОН" Тогда - АдресРФ.СубъектРФ = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "РАЙОН" Тогда - Если АдресРФ.СвРайМО = Неопределено Тогда - АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Тип().Свойства.Получить("СвРайМО").Тип ) - КонецЕсли; - АдресРФ.СвРайМО.Район = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "ГОРОД" Тогда - АдресРФ.Город = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "НАСЕЛЕННЫЙПУНКТ" Тогда - АдресРФ.НаселПункт = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "УЛИЦА" Тогда - АдресРФ.Улица = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "ТИПДОМА" Тогда - Если ЭлементДом = Неопределено Тогда - ЭлементДом = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементДом.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); - ТипДомаНеопределен = Ложь; - - ИначеЕсли ИмяПоля = "ДОМ" Тогда - Если ЭлементДом = Неопределено Тогда - ЭлементДом = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементДом.Значение = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "ТИПКОРПУСА" Тогда - Если ЭлементКорпус = Неопределено Тогда - ЭлементКорпус = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементКорпус.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); - ТипКорпусаНеопределен = Ложь; - - ИначеЕсли ИмяПоля = "КОРПУС" Тогда - Если ЭлементКорпус = Неопределено Тогда - ЭлементКорпус = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементКорпус.Значение = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "ТИПКВАРТИРЫ" Тогда - Если ЭлементКвартира = Неопределено Тогда - ЭлементКвартира = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементКвартира.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); - ТипКвартирыНеопределен = Ложь; - - ИначеЕсли ИмяПоля = "КВАРТИРА" Тогда - Если ЭлементКвартира = Неопределено Тогда - ЭлементКвартира = СоздатьНомерДопАдрЭлемента(АдресРФ); - КонецЕсли; - ЭлементКвартира.Значение = ЭлементСписка.Значение; - - ИначеЕсли ИмяПоля = "ПРЕДСТАВЛЕНИЕ" Тогда - ПолеПредставления = СокрЛП(ЭлементСписка.Значение); - - КонецЕсли; - - КонецЦикла; - - // Умолчания - Если ТипДомаНеопределен И ЭлементДом <> Неопределено Тогда - ЭлементДом.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации("Дом"); - КонецЕсли; - - Если ТипКорпусаНеопределен И ЭлементКорпус <> Неопределено Тогда - ЭлементКорпус.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации("Корпус"); - КонецЕсли; - - Если ТипКвартирыНеопределен И ЭлементКвартира <> Неопределено Тогда - ЭлементКвартира.Тип = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации("Квартира"); - КонецЕсли; - - // Представление с приоритетами. - Если Не ПустаяСтрока(Представление) Тогда - Результат.Представление = Представление; - Иначе - Результат.Представление = ПолеПредставления; - КонецЕсли; - - Адрес.Состав = ?(АдресРоссийский, АдресРФ, Результат.Представление); - - Возврат Результат; -КонецФункции +#Область СлужебныеПроцедурыИФункцииДляСовместимости // Возвращает флаг того, что переданных объект КИ содержит данные. // @@ -4410,15 +1603,11 @@ // Страна не влияет на заполнение при остальных пустых. Игнорируем. Игнорируемые.Вставить(Владелец.Свойства().Получить("Страна"), Истина); - ИначеЕсли ТипВладельца = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - // Игнорируем список с пустыми значениями и возможно непустыми типами. - Список = Владелец.ПолучитьСписок("ДопАдрЭл"); - Если Список <> Неопределено Тогда - Для Каждого СвойствоСписка Из Список Цикл - Если ПустаяСтрока(СвойствоСписка.Значение) Тогда - Игнорируемые.Вставить(СвойствоСписка, Истина); - КонецЕсли; - КонецЦикла; + Иначе + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Обработки["РасширенныйВводКонтактнойИнформации"].ЗаполнитьСвойстваXDTOКонтактнойИнформацииДляРасширенныхАдресов(Владелец, + Игнорируемые, МодульРаботаСАдресами.ПространствоИмен(), ТипВладельца); КонецЕсли; КонецЕсли; @@ -4460,59 +1649,7 @@ Возврат Ложь; КонецФункции -Процедура ВставитьЗданиеПомещение(XDTOАдрес, Тип, Значение) - Если ПустаяСтрока(Значение) Тогда - Возврат; - КонецЕсли; - - Запись = XDTOАдрес.Получить(УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Тип) ); - Если Запись = Неопределено Тогда - Запись = XDTOАдрес.ДопАдрЭл.Добавить( ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип) ); - Запись.Номер = ФабрикаXDTO.Создать(Запись.Свойства().Получить("Номер").Тип); - Запись.Номер.Значение = Значение; - - КодТипа = УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииОбъектаАдресации(Тип); - Если КодТипа = Неопределено Тогда - КодТипа = Тип; - КонецЕсли; - Запись.Номер.Тип = КодТипа - Иначе - Запись.Значение = Значение; - КонецЕсли; - -КонецПроцедуры - -Функция СоздатьНомерДопАдрЭлемента(АдресРФ) - ДопАдрЭл = СоздатьДопАдрЭлемента(АдресРФ); - ДопАдрЭл.Номер = ФабрикаXDTO.Создать(ДопАдрЭл.Тип().Свойства.Получить("Номер").Тип); - Возврат ДопАдрЭл.Номер; -КонецФункции - -Функция СоздатьДопАдрЭлемента(АдресРФ) - СвойствоДопАдрЭлемента = АдресРФ.ДопАдрЭл.ВладеющееСвойство; - ДопАдрЭлемента = ФабрикаXDTO.Создать(СвойствоДопАдрЭлемента.Тип); - АдресРФ.ДопАдрЭл.Добавить(ДопАдрЭлемента); - Возврат ДопАдрЭлемента; -КонецФункции - -Функция СвРайМО(АдресРФ) - Если АдресРФ.СвРайМО <> Неопределено Тогда - Возврат АдресРФ.СвРайМО; - КонецЕсли; - - АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Свойства().Получить("СвРайМО").Тип ); - Возврат АдресРФ.СвРайМО; -КонецФункции - -Процедура ОпределитьСоответствиеСокращений(Результат, ЭлементаАдреса, ИмяЭлемента, СоответствиеСокращений, НаименованиеВключаетСокращение, Уровень) - - НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементаАдреса); - Результат.Вставить(ИмяЭлемента, ?(НаименованиеВключаетСокращение, ЭлементаАдреса, НаименованиеСокращение.Наименование)); - СоответствиеСокращений.Вставить(Уровень, НаименованиеСокращение.Сокращение); - -КонецПроцедуры - -Процедура ЗаменитьВСтруктуреНеопределеноНаПустуюСтроку(СтруктураДляОбхода) +Процедура ЗаменитьВСтруктуреНеопределеноНаПустуюСтроку(СтруктураДляОбхода) Экспорт Для каждого КлючЗначение Из СтруктураДляОбхода Цикл Если ТипЗнч(КлючЗначение.Значение) = Тип("Структура")Тогда @@ -4585,10 +1722,8 @@ // Представление с приоритетами. Если Не ПустаяСтрока(Представление) Тогда Результат.Представление = Представление; - ИначеЕсли ЗначениеЗаполнено(ПолеПредставления) Тогда - Результат.Представление = ПолеПредставления; Иначе - Результат.Представление = ПредставлениеТелефона(Данные); + Результат.Представление = ПолеПредставления; КонецЕсли; Возврат Результат; @@ -4707,80 +1842,6 @@ КонецФункции -// Получение глубокого свойства объекта. -// -Функция ПолучитьXDTOРеквизитОбъекта(ОбъектXTDO, XPath) Экспорт - - // Переносов строки в XPath не ожидаем. - СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); - - ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); - Если ЧислоСвойств = 1 Тогда - Результат = ОбъектXTDO.Получить(СтрокаСвойств); - Если ТипЗнч(Результат) = Тип("ОбъектXDTO") Тогда - Возврат Результат.Значение; - КонецЕсли; - Возврат Результат; - КонецЕсли; - - Результат = ?(ЧислоСвойств = 0, Неопределено, ОбъектXTDO); - Для Индекс = 1 По ЧислоСвойств Цикл - Результат = Результат.Получить(СтрПолучитьСтроку(СтрокаСвойств, Индекс)); - Если Результат = Неопределено Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Возврат Результат; -КонецФункции - -// Устанавливает в XDTO адресе значение по XPath. -// -Процедура УстановитьXDTOРеквизитОбъекта(ОбъектXDTO, ПутьXPath, Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - // Части XPath - ЧастиПути = СтрЗаменить(ПутьXPath, "/", Символы.ПС); - ЧастейПути = СтрЧислоСтрок(ЧастиПути); - - ВедущийОбъект = ОбъектXDTO; - Объект = ОбъектXDTO; - - Для Позиция = 1 По ЧастейПути Цикл - ЧастьПути = СтрПолучитьСтроку(ЧастиПути, Позиция); - Если ЧастейПути = 1 Тогда - Прервать; - КонецЕсли; - - Свойство = Объект.Свойства().Получить(ЧастьПути); - Если Не Объект.Установлено(Свойство) Тогда - Объект.Установить(Свойство, ФабрикаXDTO.Создать(Свойство.Тип)); - КонецЕсли; - ВедущийОбъект = Объект; - Объект = Объект[ЧастьПути]; - КонецЦикла; - - Если Объект <> Неопределено Тогда - - Если СтрНайти(ЧастьПути, "ДопАдрЭл") = 0 Тогда - Объект[ЧастьПути] = Значение; - Иначе - КодПутьXPath = Сред(ЧастьПути, 20, 8); - ЗначениеПоля = Объект.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(Объект.ДопАдрЭл.ВладеющееСвойство.Тип)); - ЗначениеПоля.ТипАдрЭл = КодПутьXPath; - ЗначениеПоля.Значение = Значение; - КонецЕсли; - - ИначеЕсли ВедущийОбъект <> Неопределено Тогда - ВедущийОбъект[ЧастьПути] = Значение; - - КонецЕсли; - -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункцииПоРаботеСXML @@ -4832,10 +1893,11 @@ // * ЗначенияПолей - Строка, Структура, СписокЗначений, Соответствие - поля контактной информации. // * Представление - Строка - Представление. Используется в случае, если не удалось вычислить // представление из ЗначенияПолей (отсутствие в них поля Представление). -// * Комментарий - Строка - комментарий. Используется в случае, если не удалось вычислить комментарий +// * Комментарий - Строка - комментарий. Используется в случае, если не удалось вычислить комментарий // из ЗначенияПолей. -// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура -// Используется в случае, если не удалось вычислить тип из ЗначенияПолей. +// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, +// ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура - +// Используется в случае, если не удалось вычислить тип из ЗначенияПолей. // Данные2 - ОбъектXTDO, Строка, Структура - аналогично Данные1. // // Возвращаемое значение: @@ -4882,7 +1944,8 @@ // представление из ЗначенияПолей (отсутствие в них поля Представление). // * Комментарий - Строка - комментарий. Используется в случае, если не удалось вычислить комментарий // из ЗначенияПолей. -// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура +// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, +// ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура // Используется в случае, если не удалось вычислить тип из ЗначенияПолей. // // Возвращаемое значение: @@ -5263,7 +2326,7 @@ |"); Преобразователь = Новый ПреобразованиеXSL; - Преобразователь.ЗагрузитьИзСтроки( XSLT_Текст.ПолучитьТекст() ); + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(XSLT_Текст.ПолучитьТекст()); Возврат Преобразователь.ПреобразоватьИзСтроки(Текст); КонецФункции @@ -5286,7 +2349,7 @@ КонецЕсли; Преобразователь = Новый ПреобразованиеXSL; - Преобразователь.ЗагрузитьИзСтроки(" + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(" | @@ -5433,6 +2496,82 @@ КонецФункции +Функция КонтактнаяИнформацияВСтаруюСтруктуру(XDTOКонтактнаяИнформация) Экспорт + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOКонтактнаяИнформация) Тогда + XDTOКонтактная = КонтактнаяИнформацияИзXML(XDTOКонтактнаяИнформация); + Иначе + XDTOКонтактная = XDTOКонтактнаяИнформация + КонецЕсли; + + Результат = Новый Структура("Представление, ЗначенияПолей", XDTOКонтактная.Представление, Новый СписокЗначений); + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Состав = XDTOКонтактная.Состав; + + Если Состав = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Тип = Состав.Тип(); + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Результат.ЗначенияПолей = АдресВСписокПолей(Состав); + Результат.ЗначенияПолей.Добавить(Результат.Представление, "Представление"); + + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + Результат.ЗначенияПолей = НомерТелефонаВСтарыйСписокПолей(Состав); + Результат.ЗначенияПолей.Добавить(XDTOКонтактная.Комментарий, "Комментарий"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Преобразует адрес формата XDTO в старый список полей типа СписокЗначений. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO, Строка - контактная информация или строка XML. +// РасширенныйСоставПолей - Булево - необязательный флаг того, что состав полей будет сокращен для совместимости +// с обменом БСП 2.1.2. +// +// Возвращаемое значение: +// СписокЗначений +// +Функция АдресВСписокПолей(XDTOАдрес) + Список = Новый СписокЗначений; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + XDTOТип = XDTOАдрес.Тип(); + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + + // Страна с кодом + ДобавитьЗначение(Список, "Страна", XDTOАдрес.Страна); + Если ПустаяСтрока(XDTOАдрес.Страна) Тогда + КодСтраны = ""; + Иначе + Страна = Справочники.СтраныМира.НайтиПоНаименованию(XDTOАдрес.Страна, Истина); + КодСтраны = СокрЛП(Страна.Код); + КонецЕсли; + ДобавитьЗначение(Список, "КодСтраны", КодСтраны); + КонецЕсли; + Возврат Список; + +КонецФункции + +Процедура ДобавитьЗначение(Список, ИмяПоля, Значение, РазрешитьДубли = Ложь) + + Если Не РазрешитьДубли Тогда + Для Каждого Элемент Из Список Цикл + Если Элемент.Представление = ИмяПоля Тогда + Элемент.Значение = Строка(Значение); + Возврат; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Список.Добавить(Строка(Значение), ИмяПоля); +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйВызовСервера/Module.bsl index 922658560..394a615e2 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Разбирает представление контактной информации и возвращает строку XML со значениями полей. @@ -50,9 +45,8 @@ // Функция СтранаМираПоДаннымКлассификатора(Знач КодСтраны) Экспорт - Возврат Справочники.СтраныМира.СсылкаПоДаннымКлассификатора( - Новый Структура("Код", КодСтраны)); - + Возврат УправлениеКонтактнойИнформацией.СтранаМираПоКодуИлиНаименованию(КодСтраны); + КонецФункции // Заполняет коллекцию ссылками на найденные или созданные страны мира. @@ -60,10 +54,9 @@ Процедура КоллекцияСтранМираПоДаннымКлассификатора(Коллекция) Экспорт Для Каждого КлючЗначение Из Коллекция Цикл - Коллекция[КлючЗначение.Ключ] = Справочники.СтраныМира.СсылкаПоДаннымКлассификатора( - Новый Структура("Код", КлючЗначение.Значение.Код)); + Коллекция[КлючЗначение.Ключ] = УправлениеКонтактнойИнформацией.СтранаМираПоКодуИлиНаименованию(КлючЗначение.Значение.Код); КонецЦикла; - + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl index 83dcc41df..6878cbcba 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Определяет наличие доступности подсистемы АдресныйКлассификатор и наличие записей о регионах в регистре сведений @@ -10,7 +5,7 @@ // Функция АдресныйКлассификаторДоступен() Экспорт ЕстьКлассификатор = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор"); - Если ЕстьКлассификатор И НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ЕстьКлассификатор И НЕ ОбщегоНазначения.РазделениеВключено() Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); ЕстьКлассификатор = МодульАдресныйКлассификаторСлужебный.ПроверитьНачальноеЗаполнение(); КонецЕсли; @@ -27,7 +22,7 @@ Преобразователь = Новый ПреобразованиеXSL; // Пространство имен должно быть пустым! - Преобразователь.ЗагрузитьИзСтроки(" + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(" | | | @@ -383,7 +378,7 @@ // Функция XSLT_ТипКонтактнойИнформацииПоСтрокеXML() Экспорт Преобразователь = Новый ПреобразованиеXSL; - Преобразователь.ЗагрузитьИзСтроки(" + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(" |" + ДополнительныйАдресныйЭлемент.Код + ""); - КонецЦикла; - - КодыРегионов = Новый ТекстовыйДокумент; - ВсеРегионы = УправлениеКонтактнойИнформациейСлужебный.ВсеРегионы(); - Если ВсеРегионы <> Неопределено Тогда - Для Каждого Строка Из ВсеРегионы Цикл - КодыРегионов.ДобавитьСтроку("" - + Строка.Представление + ""); - КонецЦикла; + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + ДополнительныеПравилаПреобразования = МодульРаботаСАдресами.ДополнительныеПравилаПреобразования(); КонецЕсли; Преобразователь = Новый ПреобразованиеXSL; - Преобразователь.ЗагрузитьИзСтроки(" + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(" | | - | - | - | - | АдресРФ - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | " + УправлениеКонтактнойИнформациейКлиентСервер.КодСериализацииПочтовогоИндекса() + " - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |" + КодыДополнительныхАдресныхЭлементов.ПолучитьТекст() + " - | - | - | - | - |" + КодыРегионов.ПолучитьТекст() + " - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |"); - Возврат Преобразователь; + |" + ДополнительныеПравилаПреобразования); + + Возврат Преобразователь; КонецФункции // Преобразует сериализованную структуру в контактную информацию в виде XML. @@ -758,7 +622,7 @@ // Функция XSLT_СтруктураВСтроковыйСостав(Знач ИмяXDTOТипа) Преобразователь = Новый ПреобразованиеXSL; - Преобразователь.ЗагрузитьИзСтроки(" + Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(" | Неопределено Тогда - Возврат; // Команды печати уже выведены при помощи механики подключаемых команд. - КонецЕсли; - - ИмяФормы = Форма.ИмяФормы; - - СписокОбъектов = Неопределено; - Если ОбъектыПечати <> Неопределено Тогда - СписокОбъектов = Новый Массив; - Для Каждого ОбъектМетаданных Из ОбъектыПечати Цикл - СписокОбъектов.Добавить(ОбъектМетаданных.ПолноеИмя()); - КонецЦикла; - СписокОбъектов = ОбщегоНазначения.ЗначениеВСтрокуXML(СписокОбъектов); - КонецЕсли; - КомандыПечати = УправлениеПечатьюПовтИсп.КомандыПечатиФормы(ИмяФормы, СписокОбъектов).Скопировать(); - - Если МестоРазмещенияКомандПоУмолчанию = Неопределено Тогда - МестоРазмещенияКомандПоУмолчанию = Форма.Элементы.Найти("ПодменюПечать"); - КонецЕсли; - Если МестоРазмещенияКомандПоУмолчанию <> Неопределено Тогда - Для Каждого КомандаПечати Из КомандыПечати Цикл - Если ПустаяСтрока(КомандаПечати.МестоРазмещения) Тогда - КомандаПечати.МестоРазмещения = МестоРазмещенияКомандПоУмолчанию.Имя; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - ТаблицаКоманд = КомандыПечати.Скопировать(,"МестоРазмещения"); - ТаблицаКоманд.Свернуть("МестоРазмещения"); - МестаРазмещения = ТаблицаКоманд.ВыгрузитьКолонку("МестоРазмещения"); - - Для Каждого МестоРазмещения Из МестаРазмещения Цикл - НайденныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МестоРазмещения,СкрытаФункциональнымиОпциями,Отключена", МестоРазмещения, Ложь, Ложь)); - ЭлементФормыДляРазмещения = Форма.Элементы.Найти(МестоРазмещения); - Если ЭлементФормыДляРазмещения = Неопределено Тогда - ЭлементФормыДляРазмещения = МестоРазмещенияКомандПоУмолчанию; - КонецЕсли; - - Если НайденныеКоманды.Количество() > 0 Тогда - ДобавитьКомандыПечати(Форма, НайденныеКоманды, ЭлементФормыДляРазмещения); - КонецЕсли; - КонецЦикла; - - АдресКомандПечатиВоВременномХранилище = "АдресКомандПечатиВоВременномХранилище"; - КомандаФормы = Форма.Команды.Найти(АдресКомандПечатиВоВременномХранилище); - Если КомандаФормы = Неопределено Тогда - КомандаФормы = Форма.Команды.Добавить(АдресКомандПечатиВоВременномХранилище); - КомандаФормы.Действие = ПоместитьВоВременноеХранилище(КомандыПечати, Форма.УникальныйИдентификатор); - Иначе - ОбщийСписокКомандПечатиФормы = ПолучитьИзВременногоХранилища(КомандаФормы.Действие); - Для Каждого КомандаПечати Из КомандыПечати Цикл - ЗаполнитьЗначенияСвойств(ОбщийСписокКомандПечатиФормы.Добавить(), КомандаПечати); - КонецЦикла; - КомандаФормы.Действие = ПоместитьВоВременноеХранилище(ОбщийСписокКомандПечатиФормы, Форма.УникальныйИдентификатор); - КонецЕсли; - -КонецПроцедуры - // Возвращает список команд печати для указанной формы. // // Параметры: // Форма - УправляемаяФорма, Строка - форма или полное имя формы, для которой необходимо получить список команд печати. -// ИсточникиКоманд - Массив - список объектов метаданных, из которых необходимо брать команды печати. -// +// СписокОбъектов - Массив - коллекция объектов метаданных, команды печати которых необходимо использовать при составлении +// списка команд печати для указанной формы. // Возвращаемое значение: // ТаблицаЗначений - описание см. в СоздатьКоллекциюКомандПечати(). -Функция КомандыПечатиФормы(Форма, ИсточникиКоманд = Неопределено) Экспорт - - СписокОбъектов = Неопределено; - Если ТипЗнч(ИсточникиКоманд) = Тип("Массив") И ИсточникиКоманд.Количество() > 0 Тогда - Если ТипЗнч(ИсточникиКоманд[0]) = Тип("Строка") Тогда - СписокОбъектов = Новый Массив; - Для Каждого ИмяОбъектаМетаданных Из ИсточникиКоманд Цикл - СписокОбъектов.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных)); - КонецЦикла; - Иначе - СписокОбъектов = ИсточникиКоманд; - КонецЕсли; - КонецЕсли; +// +Функция КомандыПечатиФормы(Форма, СписокОбъектов = Неопределено) Экспорт Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда ИмяФормы = Форма.ИмяФормы; @@ -209,7 +132,7 @@ Иначе ОбъектМетаданных = Неопределено; КонецЕсли; - + Если ОбъектМетаданных <> Неопределено Тогда СсылкаОМ = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); КонецЕсли; @@ -258,13 +181,13 @@ КонецЕсли; Если ОбъектМетаданных <> Неопределено Тогда - НастройкиРасширений = ПодключаемыеКоманды.НастройкиРасширенийПодключенныхКОбъектуМетаданных(СсылкаОМ); - РасширенияПечати = НастройкиРасширений.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); - Для Каждого Расширение Из РасширенияПечати Цикл - Расширение.Менеджер.ДобавитьКомандыПечати(КомандыПечати); + ПодключенныеОтчетыИОбработки = ПодключаемыеКоманды.ПодключенныеОбъекты(СсылкаОМ); + Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); + Для Каждого ПодключенныйОбъект Из Найденные Цикл + ПодключенныйОбъект.Менеджер.ДобавитьКомандыПечати(КомандыПечати); ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МенеджерПечати", Неопределено)); Для Каждого Команда Из ДобавленныеКоманды Цикл - Команда.МенеджерПечати = Расширение.ПолноеИмя; + Команда.МенеджерПечати = ПодключенныйОбъект.ПолноеИмя; КонецЦикла; КонецЦикла; КонецЕсли; @@ -300,7 +223,10 @@ КонецФункции -// Создает пустую таблицу для размещения в нее команд печати. +// Создает пустую таблицу с описанием команд печати. +// Таблица команд печати передается в процедуры ДобавитьКомандыПечати, +// размещенные в модулях менеджеров объектов конфигурации, которые перечислены в процедуре +// УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. // // Возвращаемое значение: // ТаблицаЗначений - описание команд печати: @@ -350,9 +276,10 @@ // Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется когда процедура размещена // в общем модуле. // Формат "<ИмяПроцедуры>" используется когда процедура размещена -// в модуле основной формы отчета или обработки. -// Пример: "ОбработчикиПечатиКлиент.ПечатьСчетовНаОплатуПокупателю". -// Пример обработчика в модуле формы: +// в модуле основной формы отчета или обработки, указанной в МенеджерПечати. +// Пример: +// КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю"; +// Пример обработчика в модуле формы: // // Формирует печатную форму <представление печатной формы>. // // // // Параметры: @@ -364,9 +291,12 @@ // // подробнее см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати. // // // &НаКлиенте -// Функция <ИмяПроцедуры>(ПараметрыПечати) Экспорт +// Функция <ИмяФункции>(ПараметрыПечати) Экспорт // // Обработчик печати. // КонецФункции +// Следует иметь в виду, что обработчик вызывается при помощи метода Вычислить, +// поэтому в качестве обработчика может выступать только функция. +// При этом возвращаемое значение функции никак в дальнейшем не используется подсистемой. // // * Порядок - Число - (необязательный) Значение от 1 до 100, указывающее порядок размещения команды // по отношению к другим командам. Сортировка команд меню Печать осуществляется @@ -394,14 +324,16 @@ // * ФункциональныеОпции - Строка - (необязательный) Имена функциональных опций через запятую, от которых зависит // доступность команды печати. // -// * УсловияВидимости - Массив - - (необязательный) Коллекция условий видимости команды в зависимости от +// * УсловияВидимости - Массив - (необязательный) Коллекция условий видимости команды в зависимости от // контекста. Условия видимости команды задаются при помощи процедуры // ДобавитьУсловиеВидимостиКоманды. // Если параметр не задан, команда видна вне зависимости от контекста. // -// * ПроверкаПроведенияПередПечатью - Булево - (необязательный) Признак необходимости проверки проведенности -// документов перед печатью. Если параметр не указан, то проверка проведенности -// не выполняется. +// * ПроверкаПроведенияПередПечатью - Булево - (необязательный) Признак необходимости проверки проведенности +// документов перед печатью. Если выбран хотя бы один непроведенный документ, то +// перед выполнением команды печати возникает диалог проведения. +// Для непроведенных документов команда печати не выполняется. +// Если параметр не указан, то проверка проведенности не выполняется. // // * СразуНаПринтер - Булево - (необязательный) Признак необходимости печати документов без предварительного // просмотра, сразу на принтер. Если параметр не указан, то при выборе команды @@ -442,6 +374,8 @@ // с файлами перед выполнением команды. Если параметр не указан, подключение // расширения работы с файлами выполняться не будет. // +// Пример: +// Функция СоздатьКоллекциюКомандПечати() Экспорт Результат = Новый ТаблицаЗначений; @@ -527,15 +461,79 @@ КомандаПечати.УсловияВидимости.Добавить(УсловиеВидимости); КонецПроцедуры +// Используется при переносе макета (объекта метаданных) печатной формы в другой объект. +// Предназначена для вызова в процедуре заполнения данных обновления (для "отложенного" обработчика). +// Регистрирует новый адрес макета для обработки. +// +// Параметры: +// ИмяМакета - Строка - Новое имя макета в формате +// "Документ.<ИмяДокумента>.<ИмяМакета>" +// "Обработка.<ИмяОбработки>.<ИмяМакета>" +// "ОбщийМакет.<ИмяМакета>": +// Параметры - Структура - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. +// +Процедура ЗарегистрироватьНовоеИмяМакета(ИмяМакета, Параметры) Экспорт + ЧастиИмениМакета = ЧастиИмениМакета(ИмяМакета); + + НаборЗаписей = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИмяМакета.Установить(ЧастиИмениМакета.ИмяМакета); + НаборЗаписей.Отбор.Объект.Установить(ЧастиИмениМакета.ИмяОбъекта); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, НаборЗаписей); +КонецПроцедуры + +// Используется при переносе макета (объекта метаданных) печатной формы в другой объект. +// Предназначена для вызова в "отложенном" обработчике обновления. +// Переносит пользовательские данные, относящиеся макету на новый адрес. +// +// Параметры: +// Макеты - Соответствие - Сведения о прежних и новых именах макетов в формате +// "Документ.<ИмяДокумента>.<ИмяМакета>" +// "Обработка.<ИмяОбработки>.<ИмяМакета>" +// "ОбщийМакет.<ИмяМакета>": +// * Ключ - Строка - Новое имя макета. +// * Значение - Строка - Прежнее имя макета. +// +// Параметры - Структура - параметры, передаваемые в "отложенный" обработчик обновления. +// +Процедура ПеренестиПользовательскиеМакеты(Макеты, Параметры) Экспорт + + ДанныеДляОбработки = ОбновлениеИнформационнойБазы.ВыбратьИзмеренияНезависимогоРегистраСведенийДляОбработки(Параметры.Очередь, "РегистрСведений.ПользовательскиеМакетыПечати"); + Пока ДанныеДляОбработки.Следующий() Цикл + НовоеИмяМакета = ДанныеДляОбработки.Объект + "." + ДанныеДляОбработки.ИмяМакета; + ПрежнееИмяМакета = Макеты[НовоеИмяМакета]; + ЧастиИмениМакета = ЧастиИмениМакета(ПрежнееИмяМакета); + + МенеджерЗаписи = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ИмяМакета = ЧастиИмениМакета.ИмяМакета; + МенеджерЗаписи.Объект = ЧастиИмениМакета.ИмяОбъекта; + МенеджерЗаписи.Прочитать(); + + Если МенеджерЗаписи.Выбран() Тогда + НаборЗаписей = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИмяМакета.Установить(ДанныеДляОбработки.ИмяМакета); + НаборЗаписей.Отбор.Объект.Установить(ДанныеДляОбработки.Объект); + Запись = НаборЗаписей.Добавить(); + Запись.ИмяМакета = ДанныеДляОбработки.ИмяМакета; + Запись.Объект = ДанныеДляОбработки.Объект; + ЗаполнитьЗначенияСвойств(Запись, МенеджерЗаписи, , "ИмяМакета,Объект"); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); + МенеджерЗаписи.Удалить(); + КонецЕсли; + КонецЦикла; + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "РегистрСведений.ПользовательскиеМакетыПечати"); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Работа с шаблонами офисных документов. // Добавляет к параметру НаборОбластей новую запись об области. // // Параметры: -// МакетаОфисногоДокумента - Массив - набор областей (массив структур) макета офисного документа. -// ИмяОбласти - Строка - имя добавляемой области. -// ТипОбласти - Строка - тип области: +// ОбластиМакетаОфисногоДокумента - Массив - набор областей (массив структур) макета офисного документа. +// ИмяОбласти - Строка - имя добавляемой области. +// ТипОбласти - Строка - тип области: // ВерхнийКолонтитул // НижнийКолонтитул // Общая @@ -575,6 +573,13 @@ // ИменаМакетов - Строка - имена макетов, по которым будут формироваться печатные формы. // СоставДокументов - Массив - ссылки на объекты информационной базы (должны быть одного типа). // +// Возвращаемое значение: +// Соответствие - коллекция ссылок на объекты и их данные: +// * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы; +// * Значение - Структура - макет и данные: +// ** Ключ - Строка - имя макета; +// ** Значение - Структура - данные объекта. +// Функция МакетыИДанныеОбъектовДляПечати(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач СоставДокументов) Экспорт МассивИменМакетов = СтрРазделить(ИменаМакетов, ", ", Ложь); @@ -625,11 +630,13 @@ Запрос.Параметры.Вставить("Объект", ПутьКМетаданным); Запрос.Параметры.Вставить("ИмяМакета", ПутьКОбъектуМетаданных); + УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); Выборка = Запрос.Выполнить().Выбрать(); УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); Результат = Неопределено; @@ -657,7 +664,7 @@ // ДвоичныеДанныеДокумента - ДвоичныеДанные - двоичные данные табличного документа. // // Возвращаемое значение: -// ТабличныйДокумент. +// ТабличныйДокумент - табличный документ. // Функция ТабличныйДокументПоДвоичнымДанным(ДвоичныеДанныеДокумента) Экспорт @@ -692,8 +699,6 @@ // Размер - Число - определяет длину стороны выходного изображения в пикселях. // Если минимально возможный размер изображения больше этого параметра - код сформирован не будет. // -// ТекстОшибки - Строка - в этот параметр помещается описание возникшей ошибки (если возникла). -// // Возвращаемое значение: // ДвоичныеДанные - буфер, содержащий байты PNG-изображения QR-кода. // @@ -735,86 +740,85 @@ // виде QR-кода. // // Параметры: -// ДанныеДокумента - Структура - содержит значения полей документа. -// - Данные документа будут закодированы согласно стандарту -// "СТАНДАРТЫ ФИНАНСОВЫХ ОПЕРАЦИЙ Символы двумерного штрихового кода для осуществления платежей физических лиц". -// - ДанныеДокумента должны содержать информацию в полях, описанных ниже. +// ДанныеДокумента - Структура - содержит значения полей документа. +// Данные документа будут закодированы согласно стандарту +// "СТАНДАРТЫ ФИНАНСОВЫХ ОПЕРАЦИЙ Символы двумерного штрихового кода для осуществления платежей физических лиц". +// ДанныеДокумента должны содержать информацию в полях, описанных ниже. +// Обязательные поля структуры: +// * ТекстПолучателя - Наименование получателя платежа - Макс. 160 символов; +// * НомерСчетаПолучателя - Номер счета получателя платежа - Макс. 20 символов; +// * НаименованиеБанкаПолучателя - Наименование банка получателя платежа - Макс. 45 символов; +// * БИКБанкаПолучателя - БИК - Макс. 9 символов; +// * СчетБанкаПолучателя - Номер к/с банка получателя платежа - Макс. 20 символов; +// Дополнительные поля структуры: +// * СуммаЧислом - Сумма платежа, в рублях - Макс. 16 символов. +// * НазначениеПлатежа - Наименование платежа (назначение) - Макс. 210 символов; +// * ИННПолучателя - ИНН получателя платежа - Макс. 12 символов; +// * ИННПлательщика - ИНН плательщика - Макс. 12 символов; +// * СтатусСоставителя - Статус составителя платежного документа - Макс. 2 символа; +// * КПППолучателя - КПП получателя платежа - Макс. 9 символов. +// * КодБК - КБК - Макс. 20 символов; +// * КодОКТМО - Код КодОКТМО - Макс. 11 символов; +// * ПоказательОснования - Основание налогового платежа - Макс. 2 символа; +// * ПоказательПериода - Налоговый период - Макс. 10 символов; +// * ПоказательНомера - Номер документа - Макс. 15 символов; +// * ПоказательДаты - Дата документа - Макс. 10 символ. +// * ПоказательТипа - Тип платежа - Макс. 2 символа. +// Прочие дополнительные поля. +// * ФамилияПлательщика - Фамилия плательщика. +// * ИмяПлательщика - Имя плательщика. +// * ОтчествоПлательщика - Отчество плательщика. +// * АдресПлательщика - Адрес плательщика. +// * ЛицевойСчетБюджетногоПолучателя - Лицевой счет бюджетного получателя. +// * ИндексПлатежногоДокумента - Индекс платежного документа. +// * СНИЛС - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. +// * НомерДоговора - Номер договора. +// * НомерЛицевогоСчетаПлательщика - Номер лицевого счета плательщика в организации (в системе учета ПУ). +// * НомерКвартиры - Номер квартиры. +// * НомерТелефона - Номер телефона. +// * ВидПлательщика - Вид ДУЛ плательщика. +// * НомерПлательщик - Номер ДУЛ плательщика. +// * ФИОРебенка - Ф.И.О. ребенка/учащегося. +// * ДатаРождения - Дата рождения. +// * СрокПлатежа - Срок платежа/дата выставления счета. +// * ПериодОплаты - Период оплаты. +// * ВидПлатежа - Вид платежа. +// * КодУслуги - Код услуги/название прибора учета. +// * НомерПрибораУчета - Номер прибора учета. +// * ПоказаниеПрибораУчета - Показание прибора учета. +// * НомерИзвещения - Номер извещения, начисления, счета. +// * ДатаИзвещения - Дата извещения/начисления/счета/постановления (для ГИБДД). +// * НомерУчреждения - Номер учреждения (образовательного, медицинского). +// * НомерГруппы - Номер группы детсада/класса школы. +// * ФИОПреподавателя - ФИО преподавателя, специалиста, оказывающего услугу. +// * СуммаСтраховки - Сумма страховки/дополнительной услуги/Сумма пени (в копейках). +// * НомерПостановления - Номер постановления (для ГИБДД). +// * НомерИсполнительногоПроизводства - Номер исполнительного производства. +// * КодВидаПлатежа - Код вида платежа (например, для платежей в адрес Росреестра). +// * ИдентификаторНачисления - Уникальный идентификатор начисления. +// * ТехническийКод - Технический код, рекомендуемый для заполнения поставщиком услуг. +// Может использоваться принимающей организацией для вызова соответствующей +// обрабатывающей ИТ-системы. +// Перечень значений кода представлен ниже. // -// - Обязательные поля структуры. -// * ТекстПолучателя - Наименование получателя платежа - Макс. 160 символов; -// * НомерСчетаПолучателя - Номер счета получателя платежа - Макс. 20 символов; -// * НаименованиеБанкаПолучателя - Наименование банка получателя платежа - Макс. 45 символов; -// * БИКБанкаПолучателя - БИК - Макс. 9 символов; -// * СчетБанкаПолучателя - Номер к/с банка получателя платежа - Макс. 20 символов; -// - Дополнительные поля структуры. -// * СуммаЧислом - Сумма платежа, в рублях - Макс. 16 символов. -// * НазначениеПлатежа - Наименование платежа (назначение) - Макс. 210 символов; -// * ИННПолучателя - ИНН получателя платежа - Макс. 12 символов; -// * ИННПлательщика - ИНН плательщика - Макс. 12 символов; -// * СтатусСоставителя - Статус составителя платежного документа - Макс. 2 символа; -// * КПППолучателя - КПП получателя платежа - Макс. 9 символов. -// * КодБК - КБК - Макс. 20 символов; -// * КодОКТМО - Код КодОКТМО - Макс. 11 символов; -// * ПоказательОснования - Основание налогового платежа - Макс. 2 символа; -// * ПоказательПериода - Налоговый период - Макс. 10 символов; -// * ПоказательНомера - Номер документа - Макс. 15 символов; -// * ПоказательДаты - Дата документа - Макс. 10 символ. -// * ПоказательТипа - Тип платежа - Макс. 2 символа. -// - Прочие дополнительные поля. -// * ФамилияПлательщика - Фамилия плательщика. -// * ИмяПлательщика - Имя плательщика. -// * ОтчествоПлательщика - Отчество плательщика. -// * АдресПлательщика - Адрес плательщика. -// * ЛицевойСчетБюджетногоПолучателя - Лицевой счет бюджетного получателя. -// * ИндексПлатежногоДокумента - Индекс платежного документа. -// * СНИЛС - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. -// * НомерДоговора - Номер договора. -// * НомерЛицевогоСчетаПлательщика - Номер лицевого счета плательщика в организации (в системе учета ПУ). -// * НомерКвартиры - Номер квартиры. -// * НомерТелефона - Номер телефона. -// * ВидПлательщика - Вид ДУЛ плательщика. -// * НомерПлательщик - Номер ДУЛ плательщика. -// * ФИОРебенка - Ф.И.О. ребенка/учащегося. -// * ДатаРождения - Дата рождения. -// * СрокПлатежа - Срок платежа/дата выставления счета. -// * ПериодОплаты - Период оплаты. -// * ВидПлатежа - Вид платежа. -// * КодУслуги - Код услуги/название прибора учета. -// * НомерПрибораУчета - Номер прибора учета. -// * ПоказаниеПрибораУчета - Показание прибора учета. -// * НомерИзвещения - Номер извещения, начисления, счета. -// * ДатаИзвещения - Дата извещения/начисления/счета/постановления (для ГИБДД). -// * НомерУчреждения - Номер учреждения (образовательного, медицинского). -// * НомерГруппы - Номер группы детсада/класса школы. -// * ФИОПреподавателя - ФИО преподавателя, специалиста, оказывающего услугу. -// * СуммаСтраховки - Сумма страховки/дополнительной услуги/Сумма пени (в копейках). -// * НомерПостановления - Номер постановления (для ГИБДД). -// * НомерИсполнительногоПроизводства - Номер исполнительного производства. -// * КодВидаПлатежа - Код вида платежа (например, для платежей в адрес Росреестра). -// * ИдентификаторНачисления - Уникальный идентификатор начисления. -// * ТехническийКод - Технический код, рекомендуемый для заполнения поставщиком услуг. -// Может использоваться принимающей организацией для вызова соответствующей -// обрабатывающей ИТ-системы. -// Перечень значений кода представлен ниже. -// -// Код назначения Наименование назначения платежа -// платежа. -// -// 01 Мобильная связь, стационарный телефон. -// 02 Коммунальные услуги, ЖКХ. -// 03 ГИБДД, налоги, пошлины, бюджетные платежи. -// 04 Охранные услуги -// 05 Услуги, оказываемые УФМС. -// 06 ПФР -// 07 Погашение кредитов -// 08 Образовательные учреждения. -// 09 Интернет и ТВ -// 10 Электронные деньги -// 11 Отдых и путешествия. -// 12 Инвестиции и страхование. -// 13 Спорт и здоровье -// 14 Благотворительные и общественные организации. -// 15 Прочие услуги. +// Код назначения Наименование назначения платежа +// платежа. +// +// 01 Мобильная связь, стационарный телефон. +// 02 Коммунальные услуги, ЖКХ. +// 03 ГИБДД, налоги, пошлины, бюджетные платежи. +// 04 Охранные услуги +// 05 Услуги, оказываемые УФМС. +// 06 ПФР +// 07 Погашение кредитов +// 08 Образовательные учреждения. +// 09 Интернет и ТВ +// 10 Электронные деньги +// 11 Отдых и путешествия. +// 12 Инвестиции и страхование. +// 13 Спорт и здоровье +// 14 Благотворительные и общественные организации. +// 15 Прочие услуги. // // Возвращаемое значение: // Строка - строка данных в формате УФЭБС. @@ -891,8 +895,41 @@ #Область УстаревшиеПроцедурыИФункции +// Устарела. Следует использовать ПодключаемыеКоманды.ПриСозданииНаСервере. +// Размещает команды печати на форме. +// +// Параметры: +// Форма - УправляемаяФорма - форма, в которой необходимо разместить подменю Печать. +// МестоРазмещенияКомандПоУмолчанию - ЭлементФормы - группа, в которую необходимо разместить подменю Печать, +// по умолчанию размещается в командную панель формы. +// ОбъектыПечати - Массив - список объектов метаданных, для которых необходимо сформировать +// объединенное подменю Печать. +Процедура ПриСозданииНаСервере(Форма, МестоРазмещенияКомандПоУмолчанию = Неопределено, ОбъектыПечати = Неопределено) Экспорт + ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения(); + Если ТипЗнч(МестоРазмещенияКомандПоУмолчанию) = Тип("ГруппаФормы") Тогда + Если МестоРазмещенияКомандПоУмолчанию.Вид = ВидГруппыФормы.Подменю + Или МестоРазмещенияКомандПоУмолчанию.Заголовок = НСтр("ru = 'Печать'") + Или МестоРазмещенияКомандПоУмолчанию.Имя = "ПодменюПечать" Тогда + Родитель = МестоРазмещенияКомандПоУмолчанию.Родитель; + Если ТипЗнч(Родитель) = Тип("ГруппаФормы") Тогда + ПараметрыРазмещения.КоманднаяПанель = Родитель; + КонецЕсли; + Иначе + ПараметрыРазмещения.КоманднаяПанель = МестоРазмещенияКомандПоУмолчанию; + КонецЕсли; + КонецЕсли; + Если ТипЗнч(ОбъектыПечати) = Тип("Массив") Тогда + ПараметрыРазмещения.Источники = ОбъектыПечати; + КонецЕсли; + ПодключаемыеКоманды.ПриСозданииНаСервере(Форма, ПараметрыРазмещения); +КонецПроцедуры + // Устарела. Настройка ЛокальныйКаталогФайловПечати больше не используется. // Возвращает путь к каталогу, используемому при печати. +// +// Возвращаемое значение: +// Строка - полный путь к каталогу временных файлов печати. +// Функция ПолучитьЛокальныйКаталогФайловПечати() Экспорт Возврат ""; КонецФункции @@ -903,49 +940,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Объявляет события подсистемы Печать. -// -// Серверные события: -// ПриОпределенииОбъектовСКомандамиПечати. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Определяет объекты, в которых есть процедура ДобавитьКомандыПечати(). - // - // Параметры: - // СписокОбъектов - Массив - список менеджеров объектов. - // - // Синтаксис: - // Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт - // - // (То же, что - // УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати). - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.Печать\ПриОпределенииОбъектовСКомандамиПечати"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "УправлениеПечатью"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "УправлениеПечатью"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить( - "УправлениеПечатью"); - КонецЕсли; - -КонецПроцедуры - // Скрывает команды печати из подменю "Печать". Процедура ОтключитьКомандыПечати(СписокОбъектов, СписокКоманд) Экспорт НаборЗаписей = РегистрыСведений.НастройкиКомандПечати.СоздатьНаборЗаписей(); @@ -1001,14 +995,9 @@ Функция ИсточникиКомандПечати() Экспорт ОбъектыСКомандамиПечати = Новый Массив; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.Печать\ПриОпределенииОбъектовСКомандамиПечати"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - СписокОбъектов = Новый Массив; - Обработчик.Модуль.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); - КонецЦикла; + СписокОбъектов = Новый Массив; + ИнтеграцияСтандартныхПодсистем.ПриОпределенииОбъектовСКомандамиПечати(ОбъектыСКомандамиПечати); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); СписокОбъектов = Новый Массив; УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); @@ -1018,7 +1007,7 @@ Для Каждого ОбъектМенеджер Из ОбъектыСКомандамиПечати Цикл Результат.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ОбъектМенеджер))); КонецЦикла; - + Возврат Результат; КонецФункции @@ -1070,6 +1059,9 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Шаблоны сообщений. + // Подготавливает печатные формы для шаблонов сообщений // Функция ПодготовитьПечатныеФормы(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач МассивОбъектов, Знач ПараметрыПечати, @@ -1087,105 +1079,150 @@ Возврат КомандыПечатиОбъекта(ОбъектМетаданных); КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - -// См. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -Процедура ПриОпределенииСтруктурыНастроекПодключаемыхОбъектов(СтруктураНастроек) Экспорт - СтруктураНастроек.Вставить("ДобавитьКомандыПечати", Новый ОписаниеТипов("Булево")); -КонецПроцедуры - -// См. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -Процедура ПриОпределенииИспользуемыхПодменю(Форма, ИспользуемыеПодменю) Экспорт - Если Форма.Команды.Найти("АдресКомандПечатиВоВременномХранилище") <> Неопределено Тогда - Возврат; // Команды печати уже выведены при помощи механики печати. - КонецЕсли; - Если Форма.Элементы.Найти("ПодменюПечать") <> Неопределено Тогда - ИспользуемыеПодменю.Добавить("ПодменюПечать"); - КонецЕсли; -КонецПроцедуры - -// См. описание этой же процедуры в модуле ИнтеграцияСтандартныхПодсистем. -Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, НастройкиОбъекта, НастройкиРасширений, Команды) Экспорт - Если НастройкиФормы.ИспользуемыеПодменю.Найти("ПодменюПечать") = Неопределено Тогда - Возврат; +// Формирует печатную форму по внешнему источнику. +// +// Параметры: +// ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - внешняя обработка. +// ПараметрыИсточника - Структура - структура со свойствами: +// * ИдентификаторКоманды - Строка - список макетов, перечисленных через запятую. +// * ОбъектыНазначения - Массив +// КоллекцияПечатныхФорм - ТаблицаЗначений - см. описание процедуры Печать() в документации. +// ОбъектыПечати - СписокЗначений - см. описание процедуры Печать() в документации. +// ПараметрыВывода - Структура - см. описание процедуры Печать() в документации. +// +Процедура ПечатьПоВнешнемуИсточнику(ДополнительнаяОбработкаСсылка, ПараметрыИсточника, КоллекцияПечатныхФорм, + ОбъектыПечати, ПараметрыВывода) Экспорт + + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + ВнешняяОбработкаОбъект = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ДополнительнаяОбработкаСсылка); + Если ВнешняяОбработкаОбъект = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внешняя обработка ""%1"" (тип ""%2"") не обслуживается.'"), + Строка(ДополнительнаяОбработкаСсылка), + Строка(ТипЗнч(ДополнительнаяОбработкаСсылка))); КонецЕсли; - КомандыПечати = СоздатьКоллекциюКомандПечати(); + КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(ПараметрыИсточника.ИдентификаторКоманды); + ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода(); + ПараметрыВывода.Вставить("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); - СтандартнаяОбработка = НастройкиОбъекта.Менеджер <> Неопределено; - УправлениеПечатьюПереопределяемый.ПередДобавлениемКомандПечати(НастройкиФормы.ИмяФормы, КомандыПечати, СтандартнаяОбработка); + ВнешняяОбработкаОбъект.Печать( + ПараметрыИсточника.ОбъектыНазначения, + КоллекцияПечатныхФорм, + ОбъектыПечати, + ПараметрыВывода); - Если СтандартнаяОбработка Тогда - НастройкиСписка = Новый Структура; - НастройкиСписка.Вставить("МенеджерКомандПечати", НастройкиОбъекта.Менеджер); - НастройкиСписка.Вставить("АвтоматическоеЗаполнение", НастройкиОбъекта.ЭтоЖурналДокументов); - Если НастройкиСписка.АвтоматическоеЗаполнение Тогда - УправлениеПечатьюПереопределяемый.ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка); + // Проверим, все ли макеты были сформированы. + Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл + Если ПечатнаяФорма.ТабличныйДокумент = Неопределено Тогда + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В обработчике печати не был сформирован табличный документ для: %1'"), + ПечатнаяФорма.ИмяМакета); + ВызватьИсключение(ТекстСообщенияОбОшибке); КонецЕсли; - Если НастройкиСписка.АвтоматическоеЗаполнение Тогда - ЗаполнитьКомандыПечатиДляСпискаОбъектов(НастройкиОбъекта.Метаданные.РегистрируемыеДокументы, КомандыПечати); - Иначе - НастройкиОбъекта.Менеджер.ДобавитьКомандыПечати(КомандыПечати); - ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МенеджерПечати", Неопределено)); - Для Каждого КомандаПечати Из ДобавленныеКоманды Цикл - КомандаПечати.МенеджерПечати = НастройкиОбъекта.ПолноеИмя; - КонецЦикла; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, НастройкиОбъекта.ПолноеИмя); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - РасширенияПечати = НастройкиРасширений.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); - Для Каждого Расширение Из РасширенияПечати Цикл - Расширение.Менеджер.ДобавитьКомандыПечати(КомандыПечати); - ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МенеджерПечати", Неопределено)); - Для Каждого КомандаПечати Из ДобавленныеКоманды Цикл - КомандаПечати.МенеджерПечати = Расширение.ПолноеИмя; - КонецЦикла; + + ПечатнаяФорма.ТабличныйДокумент.КоличествоЭкземпляров = ПечатнаяФорма.Экземпляров; КонецЦикла; - Если КомандыПечати.Количество() = 0 Тогда - Возврат; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. +Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт + Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); + Настройка.Ключ = "ДобавитьКомандыПечати"; + Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево"); +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. +Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт + Вид = ВидыПодключаемыхКоманд.Добавить(); + Вид.Имя = "Печать"; + Вид.ИмяПодменю = "ПодменюПечать"; + Вид.Заголовок = НСтр("ru = 'Печать'"); + Вид.Порядок = 40; + Вид.Картинка = БиблиотекаКартинок.Печать; + Вид.Отображение = ОтображениеКнопки.КартинкаИТекст; +КонецПроцедуры + +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт + КомандыПечати = СоздатьКоллекциюКомандПечати(); + КомандыПечати.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево")); + ИсточникиКомандПечати = ИсточникиКомандПечати(); + Отключенные = Неопределено; + ЕстьФильтрПоОтключенным = Ложь; + + СтандартнаяОбработка = Истина; + УправлениеПечатьюПереопределяемый.ПередДобавлениемКомандПечати(НастройкиФормы.ИмяФормы, КомандыПечати, СтандартнаяОбработка); + КомандыПечати.ЗаполнитьЗначения(Истина, "Обработана"); + Если СтандартнаяОбработка Тогда + Для Каждого Источник Из Источники.Строки Цикл + НастройкиСписка = Новый Структура; + НастройкиСписка.Вставить("МенеджерКомандПечати", Источник.Менеджер); + НастройкиСписка.Вставить("АвтоматическоеЗаполнение", Источник.Строки.Количество() > 0); + УправлениеПечатьюПереопределяемый.ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка); + Если НастройкиСписка.АвтоматическоеЗаполнение Тогда + Для Каждого ДокументРегистратор Из Источник.Строки Цикл + Если ИсточникиКомандПечати.Найти(ДокументРегистратор.Метаданные) <> Неопределено Тогда + ПриПолученииКомандПечатиОбъекта(КомандыПечати, ДокументРегистратор, Истина); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ИсточникиКомандПечати.Найти(Источник.Метаданные) <> Неопределено Тогда + ПриПолученииКомандПечатиОбъекта(КомандыПечати, Источник, Истина); + КонецЕсли; + + ОтключенныеКомандыПечати = ОтключенныеКомандыПечати(Источник.СсылкаМетаданных); + Если ОтключенныеКомандыПечати.Количество() > 0 Тогда + ЕстьФильтрПоОтключенным = Истина; + Если Отключенные = Неопределено Тогда + Отключенные = ОтключенныеКомандыПечати; + Иначе + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Отключенные, ОтключенныеКомандыПечати); + КонецЕсли; + КонецЕсли; + КонецЦикла; КонецЕсли; - ОтключенныеКомандыПечати = ОтключенныеКомандыПечати(НастройкиОбъекта.Ссылка); - ЕстьФильтрПоОтключенным = ОтключенныеКомандыПечати.Количество() > 0; + Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); + Для Каждого ПодключенныйОбъект Из Найденные Цикл + ПриПолученииКомандПечатиОбъекта(КомандыПечати, ПодключенныйОбъект, Ложь); + КонецЦикла; КлючиПараметровОбработчика = "Обработчик, МенеджерПечати, ЗаголовокФормы, СразуНаПринтер, ФорматСохранения, |ПереопределитьПользовательскиеНастройкиКоличества, ДополнитьКомплектВнешнимиПечатнымиФормами, |ФиксированныйКомплект, ДополнительныеПараметры"; Для Каждого КомандаПечати Из КомандыПечати Цикл + КомандаПечати.ДополнительныеПараметры.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", КомандаПечати.ДополнитьКомплектВнешнимиПечатнымиФормами); Если ЕстьФильтрПоОтключенным Тогда КомандаПечати.УникальныйИдентификатор = УникальныйИдентификаторКомандыПечати(КомандаПечати); - Если ОтключенныеКомандыПечати.Найти(КомандаПечати.УникальныйИдентификатор) <> Неопределено Тогда + Если Отключенные.Найти(КомандаПечати.УникальныйИдентификатор) <> Неопределено Тогда Продолжить; КонецЕсли; КонецЕсли; - КомандаПечати.ДополнительныеПараметры.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", КомандаПечати.ДополнитьКомплектВнешнимиПечатнымиФормами); Команда = Команды.Добавить(); ЗаполнитьЗначенияСвойств(Команда, КомандаПечати, , "Обработчик"); + Команда.Вид = "Печать"; Если Команда.Порядок = 0 Тогда Команда.Порядок = 50; КонецЕсли; - Команда.Группа = КомандаПечати.МестоРазмещения; - Если ПустаяСтрока(Команда.Группа) Тогда - Команда.Группа = "ПодменюПечать"; - КонецЕсли; + Команда.Подменю = КомандаПечати.МестоРазмещения; Команда.МножественныйВыбор = Истина; Если ТипЗнч(КомандаПечати.ТипыОбъектовПечати) = Тип("Массив") И КомандаПечати.ТипыОбъектовПечати.Количество() > 0 Тогда Команда.ТипПараметра = Новый ОписаниеТипов(КомандаПечати.ТипыОбъектовПечати); КонецЕсли; Команда.ВидимостьВФормах = КомандаПечати.СписокФорм; Если КомандаПечати.НеВыполнятьЗаписьВФорме Тогда - Команда.РежимЗаписи = "БезЗаписи"; + Команда.РежимЗаписи = "НеЗаписывать"; ИначеЕсли КомандаПечати.ПроверкаПроведенияПередПечатью Тогда - Команда.РежимЗаписи = "Проведение"; + Команда.РежимЗаписи = "Проводить"; Иначе - Команда.РежимЗаписи = "Запись"; + Команда.РежимЗаписи = "Записывать"; КонецЕсли; Команда.ТребуетсяРаботаСФайлами = КомандаПечати.ТребуетсяРасширениеРаботыСФайлами; @@ -1195,16 +1232,31 @@ КонецЦикла; КонецПроцедуры -#КонецОбласти +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. +Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт + + // ТолькоДляПользователейСистемы. + НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить( + Метаданные.Роли.РедактированиеПечатныхФорм.Имя); + +КонецПроцедуры -#Область СлужебныеПроцедурыИФункции +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + ОписаниеПрофиля = МодульУправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа();; + ОписаниеПрофиля.Идентификатор = "70179f20-2315-11e6-9bff-d850e648b60c"; + ОписаниеПрофиля.Наименование = НСтр("ru = 'Редактирование, отправка по почте, сохранение в файл печатных форм (дополнительно)'", + Метаданные.ОсновнойЯзык.КодЯзыка); + ОписаниеПрофиля.Описание = НСтр("ru = 'Дополнительно назначается пользователям, которым должна быть доступна возможность редактирования, + |перед печатью, отправка по почте и сохранение в файл сформированных печатных форм.'", Метаданные.ОсновнойЯзык.КодЯзыка); + ОписаниеПрофиля.Роли.Добавить("РедактированиеПечатныхФорм"); + ОписанияПрофилей.Добавить(ОписаниеПрофиля); + +КонецПроцедуры -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1215,38 +1267,27 @@ Обработчик.Версия = "2.1.3.22"; Обработчик.Процедура = "УправлениеПечатью.ПреобразоватьДвоичныеДанныеПользовательскихМакетовMXLВТабличныеДокументы"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "УправлениеПечатью.ДобавитьРольРедактированиеПечатныхФормВПрофилиСБазовымиПравами"; + Обработчик.РежимВыполнения = "Оперативно"; + КонецПроцедуры -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Разрешения = Новый Массив; + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты( + "ОбщийМакет.КомпонентаПечатиQRКода", НСтр("ru = 'Печать QR кодов.'"))); ЗапросыРазрешений.Добавить( - РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения())); + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения)); КонецПроцедуры -// Заполняет список текущих дел пользователя. -// -// Параметры: -// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела". -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -1314,20 +1355,9 @@ КонецПроцедуры -// Возвращает список разрешений для загрузки классификатора банков с сайта РБК. -// -// Возвращаемое значение: -// Массив. -// -Функция Разрешения() - - Разрешения = Новый Массив; - Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты( - "ОбщийМакет.КомпонентаПечатиQRКода", НСтр("ru = 'Печать QR кодов.'"))); - - Возврат Разрешения; - -КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции // Сбрасывает пользовательские настройки количества печатных форм и порядка. Процедура СброситьПользовательскиеНастройкиФормыПечатьДокументов() Экспорт @@ -1382,6 +1412,26 @@ КонецПроцедуры +// Добавляет роль РедактированиеПечатныхФорм во все профили, в которые входит роль БазовыеПрава. +Процедура ДобавитьРольРедактированиеПечатныхФормВПрофилиСБазовымиПравами() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + НовыеРоли = Новый Массив; + НовыеРоли.Добавить(Метаданные.Роли.БазовыеПрава.Имя); + НовыеРоли.Добавить(Метаданные.Роли.РедактированиеПечатныхФорм.Имя); + + ЗаменяемыеРоли = Новый Соответствие; + ЗаменяемыеРоли.Вставить(Метаданные.Роли.БазовыеПрава.Имя, НовыеРоли); + + МодульУправлениеДоступом.ЗаменитьРолиВПрофилях(ЗаменяемыеРоли); + +КонецПроцедуры + // Возвращает ссылку на объект-источник внешней печатной формы. // // Параметры: @@ -1391,10 +1441,13 @@ // // Возвращаемое значение: // Ссылка. -Функция ВнешняяПечатнаяФорма(Идентификатор, ПолноеИмяОбъектаМетаданных) +Функция СсылкаДополнительнойПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных) ВнешняяПечатнаяФормаСсылка = Неопределено; - ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка); + КонецЕсли; Возврат ВнешняяПечатнаяФормаСсылка; КонецФункции @@ -1502,9 +1555,8 @@ // Вызов процедуры Печать из менеджера печати. Если ВнешняяПечатнаяФорма <> Неопределено Тогда // Менеджер печати во внешней печатной форме. - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику( - ВнешняяПечатнаяФорма(ВнешняяПечатнаяФорма.Значение, ИсточникВнешнихПечатныхФорм), + ПечатьПоВнешнемуИсточнику( + СсылкаДополнительнойПечатнойФормы(ВнешняяПечатнаяФорма.Значение, ИсточникВнешнихПечатныхФорм), Новый Структура("ИдентификаторКоманды, ОбъектыНазначения", ВнешняяПечатнаяФорма.Значение, ОбъектыСоответствующиеПечатнойФорме), ВременнаяКоллекцияДляОднойПечатнойФормы, ОбъектыПечати, @@ -1558,8 +1610,10 @@ УправлениеПечатьюПереопределяемый.ПриПечати(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); - // Установка количества экземпляров табличным документам. + // Установка количества экземпляров табличным документам, проверка областей. Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл + ПроверитьРазметкуТабличногоДокументаПоОбъектамПечати(ПечатнаяФорма.ТабличныйДокумент, + ОбъектыПечати, ИмяМенеджераПечати, ПечатнаяФорма.ИмяМакета); Если ДобавленныеВнешниеПечатныеФормы.Найти(ПечатнаяФорма.ИмяМакета) <> Неопределено Тогда ПечатнаяФорма.Экземпляров = 0; // Для автоматически добавленных форм. КонецЕсли; @@ -1657,76 +1711,7 @@ // Функция НастройкиФорматовСохраненияТабличногоДокумента() Экспорт - ТаблицаФорматов = Новый ТаблицаЗначений; - - ТаблицаФорматов.Колонки.Добавить("ТипФайлаТабличногоДокумента", Новый ОписаниеТипов("ТипФайлаТабличногоДокумента")); - ТаблицаФорматов.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ПеречислениеСсылка.ФорматыСохраненияОтчетов")); - ТаблицаФорматов.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - ТаблицаФорматов.Колонки.Добавить("Расширение", Новый ОписаниеТипов("Строка")); - ТаблицаФорматов.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка")); - - // Документ PDF (.pdf) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.PDF; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.PDF; - НовыйФормат.Расширение = "pdf"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматPDF; - - // Лист Microsoft Excel 2007 (.xlsx) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLSX; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLSX; - НовыйФормат.Расширение = "xlsx"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel2007; - - // Лист Microsoft Excel 97-2003 (.xls) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLS; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLS; - НовыйФормат.Расширение = "xls"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel; - - // Электронная таблица OpenDocument (.ods). - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ODS; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ODS; - НовыйФормат.Расширение = "ods"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматOpenOfficeCalc; - - // Табличный документ (.mxl) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.MXL; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.MXL; - НовыйФормат.Расширение = "mxl"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматMXL; - - // Документ Word 2007 (.docx) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.DOCX; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.DOCX; - НовыйФормат.Расширение = "docx"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматWord2007; - - // Веб-страница (.html) - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.HTML5; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.HTML; - НовыйФормат.Расширение = "html"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматHTML; - - // Текстовый документ UTF-8 (.txt). - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.TXT; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.TXT; - НовыйФормат.Расширение = "txt"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT; - - // Текстовый документ ANSI (.txt). - НовыйФормат = ТаблицаФорматов.Добавить(); - НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ANSITXT; - НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ANSITXT; - НовыйФормат.Расширение = "txt"; - НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT; + ТаблицаФорматов = СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента(); // Дополнительные форматы / изменение списка текущих. УправлениеПечатьюПереопределяемый.ПриЗаполненииНастроекФорматовСохраненияТабличногоДокумента(ТаблицаФорматов); @@ -1739,116 +1724,6 @@ КонецФункции -// Создает подменю "Печать" на форме и добавляет в него команды печати. -// Если команда печати одна, то вместо подменю добавляется кнопка с названием печатной формы. -Процедура ДобавитьКомандыПечати(Форма, КомандыПечати, Знач МестоРазмещенияКоманд = Неопределено) - - Если МестоРазмещенияКоманд = Неопределено Тогда - МестоРазмещенияКоманд = Форма.КоманднаяПанель; - КонецЕсли; - - ОднаКомандаПечати = КомандыПечати.Количество() = 1; - Если МестоРазмещенияКоманд.Вид = ВидГруппыФормы.Подменю Тогда - Если ОднаКомандаПечати Тогда - МестоРазмещенияКоманд.Вид = ВидГруппыФормы.ГруппаКнопок; - КонецЕсли; - Иначе - Если Не ОднаКомандаПечати Тогда - ПодменюПечать = Форма.Элементы.Добавить(МестоРазмещенияКоманд.Имя + "ПодменюПечать", Тип("ГруппаФормы"), МестоРазмещенияКоманд); - ПодменюПечать.Вид = ВидГруппыФормы.Подменю; - ПодменюПечать.Заголовок = НСтр("ru = 'Печать'"); - ПодменюПечать.Картинка = БиблиотекаКартинок.Печать; - - МестоРазмещенияКоманд = ПодменюПечать; - КонецЕсли; - КонецЕсли; - - Для Каждого ОписаниеКомандыПечати Из КомандыПечати Цикл - НомерКоманды = ОписаниеКомандыПечати.Владелец().Индекс(ОписаниеКомандыПечати); - ИмяКоманды = МестоРазмещенияКоманд.Имя + "КомандаПечати" + НомерКоманды; - - КомандаФормы = Форма.Команды.Добавить(ИмяКоманды); - КомандаФормы.Действие = "Подключаемый_ВыполнитьКомандуПечати"; - КомандаФормы.Заголовок = ОписаниеКомандыПечати.Представление; - КомандаФормы.ИзменяетСохраняемыеДанные = Ложь; - КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст; - - Если ЗначениеЗаполнено(ОписаниеКомандыПечати.Картинка) Тогда - КомандаФормы.Картинка = ОписаниеКомандыПечати.Картинка; - ИначеЕсли ОднаКомандаПечати Тогда - КомандаФормы.Картинка = БиблиотекаКартинок.Печать; - КонецЕсли; - - ОписаниеКомандыПечати.ИмяКомандыНаФорме = ИмяКоманды; - - НовыйЭлемент = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), МестоРазмещенияКоманд); - НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; - НовыйЭлемент.ИмяКоманды = ИмяКоманды; - КонецЦикла; - - // заглушка - ИмяКоманды = МестоРазмещенияКоманд.Имя + "КомандаПечатиЗаглушка"; - - КомандаФормы = Форма.Команды.Добавить(ИмяКоманды); - КомандаФормы.Действие = ""; - КомандаФормы.Заголовок = НСтр("ru = '(нет печатных форм)'"); - КомандаФормы.ИзменяетСохраняемыеДанные = Ложь; - КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст; - - НовыйЭлемент = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), МестоРазмещенияКоманд); - НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; - НовыйЭлемент.ИмяКоманды = ИмяКоманды; - НовыйЭлемент.Видимость = Ложь; - НовыйЭлемент.Доступность = Ложь; - -КонецПроцедуры - -// Возвращает описание команды по имени элемента формы. -// -// Возвращаемое значение -// Структура - строка таблицы из функции КомандыПечатиФормы, преобразованная в структуру. -Функция ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище) Экспорт - - КомандыПечати = ПолучитьИзВременногоХранилища(АдресКомандПечатиВоВременномХранилище); - Для Каждого КомандаПечати Из КомандыПечати.НайтиСтроки(Новый Структура("ИмяКомандыНаФорме", ИмяКоманды)) Цикл - Возврат ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(КомандаПечати); - КонецЦикла; - -КонецФункции - -Функция СписокКомандЭкземпляраФормы(АдресКомандПечатиВоВременномХранилище) Экспорт - Команды = ПолучитьИзВременногоХранилища(АдресКомандПечатиВоВременномХранилище); - Если Команды.Колонки.Найти("ИмяКомандыНаФорме") = Неопределено Тогда - КомандыПечати = СоздатьКоллекциюКомандПечати(); - Для Каждого Команда Из Команды Цикл - КомандаПечати = КомандыПечати.Добавить(); - ЗаполнитьЗначенияСвойств(КомандаПечати, Команда, , "Обработчик"); - ЗаполнитьЗначенияСвойств(КомандаПечати, Команда.ДополнительныеПараметры); - КомандаПечати.МестоРазмещения = Команда.Группа; - Если ТипЗнч(Команда.ТипПараметра) = Тип("ОписаниеТипов") Тогда - КомандаПечати.ТипыОбъектовПечати = Команда.ТипПараметра.Типы(); - КонецЕсли; - КомандаПечати.СписокФорм = Команда.ВидимостьВФормах; - Если Команда.РежимЗаписи = "БезЗаписи" Тогда - КомандаПечати.НеВыполнятьЗаписьВФорме = Истина; - Иначе - КомандаПечати.НеВыполнятьЗаписьВФорме = Ложь; - Если Команда.РежимЗаписи = "Проведение" Тогда - КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; - Иначе - КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь; - КонецЕсли; - КонецЕсли; - КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Команда.ТребуетсяРаботаСФайлами; - КомандаПечати.ИмяКомандыНаФорме = Команда.ИмяВФорме; - КонецЦикла; - Иначе - КомандыПечати = Команды; - КонецЕсли; - - Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КомандыПечати); -КонецФункции - // Фильтрует список команд печати в соответствии с установленными функциональными опциями. Процедура ОпределитьВидимостьКомандПечатиПоФункциональнымОпциям(КомандыПечати, Форма = Неопределено) Для НомерКоманды = -КомандыПечати.Количество() + 1 По 0 Цикл @@ -2124,7 +1999,7 @@ КонецЕсли; ТабличныйДокумент = ПечатнаяФорма.ПолучитьОбласть(Область.Верх, , Область.Низ); - ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ФоноваяКартинка,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); + ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); ПакетОтображаемыхДокументов.Состав.Добавить().Данные = ПакетСОднимТабличнымДокументом(ТабличныйДокумент); КонецЦикла; @@ -2133,7 +2008,7 @@ Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.Вывести(ПечатнаяФорма); - ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ФоноваяКартинка,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); + ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, "АвтоМасштаб,Вывод,ВысотаСтраницы,ДвусторонняяПечать,Защита,ИмяПринтера,КодЯзыка,КоличествоЭкземпляров,МасштабПечати,ОриентацияСтраницы,ПолеСверху,ПолеСлева,ПолеСнизу,ПолеСправа,РазборПоКопиям,РазмерКолонтитулаСверху,РазмерКолонтитулаСнизу,РазмерСтраницы,ТочностьПечати,ЧерноБелаяПечать,ШиринаСтраницы,ЭкземпляровНаСтранице"); ПакетОтображаемыхДокументов.Состав.Добавить().Данные = ПакетСОднимТабличнымДокументом(ТабличныйДокумент); КонецЦикла; КонецЕсли; @@ -2144,10 +2019,6 @@ ПакетКомплектов.Состав.Добавить().Данные = ПакетОтображаемыхДокументов; КонецЦикла; - Если КоллекцияПечатныхФорм.Количество() > 0 Тогда - ПакетКомплектов.ИмяПринтера = КоллекцияПечатныхФорм[0].ИмяПринтера; - КонецЕсли; - Возврат ПакетКомплектов; КонецФункции @@ -2156,9 +2027,9 @@ Функция ПакетСОднимТабличнымДокументом(ТабличныйДокумент) АдресТабличногоДокументаВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличныйДокумент); ПакетСОднимДокументом = Новый ПакетОтображаемыхДокументов; + ПакетСОднимДокументом.РазборПоКопиям = Истина; ПакетСОднимДокументом.Состав.Добавить(АдресТабличногоДокументаВоВременномХранилище); ЗаполнитьЗначенияСвойств(ПакетСОднимДокументом, ТабличныйДокумент, "Вывод, ДвусторонняяПечать, ИмяПринтера, КоличествоЭкземпляров, ТочностьПечати"); - ПакетСОднимДокументом.РазборПоКопиям = Истина; Если ТабличныйДокумент.РазборПоКопиям <> Неопределено Тогда ПакетСОднимДокументом.РазборПоКопиям = ТабличныйДокумент.РазборПоКопиям; КонецЕсли; @@ -2252,12 +2123,6 @@ КонецПроцедуры -Функция ХешСумма(Ключ) - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(Ключ); - Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); -КонецФункции - Функция УникальныйИдентификаторКомандыПечати(КомандаПечати) Параметры = Новый Массив; @@ -2272,23 +2137,26 @@ СтруктураПараметров = Новый Структура(СтрСоединить(Параметры, ",")); ЗаполнитьЗначенияСвойств(СтруктураПараметров, КомандаПечати); - Возврат ХешСумма(ОбщегоНазначения.ЗначениеВСтрокуXML(СтруктураПараметров)); + Возврат ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтруктураПараметров); КонецФункции Функция КомандыПечатиОбъекта(ОбъектМетаданных) Экспорт - КомандыПечати = СоздатьКоллекциюКомандПечати(); - ИмяОбъекта = ОбъектМетаданных.ПолноеИмя(); - СсылкаОМ = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); - МенеджерПечати = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта); + Источники = ПодключаемыеКоманды.ДеревоИсточниковКоманд(); + НастройкиAPI = ПодключаемыеКоманды.НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов(); + ПодключенныеОтчетыИОбработки = ПодключаемыеКоманды.ТаблицаПодключаемыхОбъектов(НастройкиAPI); + Источник = ПодключаемыеКоманды.ЗарегистрироватьИсточник(ОбъектМетаданных, Источники, ПодключенныеОтчетыИОбработки, НастройкиAPI); + Если Источник.Менеджер = Неопределено Тогда + Возврат КомандыПечати; + КонецЕсли; + ДобавляемыеКомандыПечати = СоздатьКоллекциюКомандПечати(); - МенеджерПечати.ДобавитьКомандыПечати(ДобавляемыеКомандыПечати); - + Источник.Менеджер.ДобавитьКомандыПечати(ДобавляемыеКомандыПечати); Для Каждого КомандаПечати Из ДобавляемыеКомандыПечати Цикл Если КомандаПечати.МенеджерПечати = Неопределено Тогда - КомандаПечати.МенеджерПечати = ИмяОбъекта; + КомандаПечати.МенеджерПечати = Источник.ПолноеИмя; КонецЕсли; Если КомандаПечати.Порядок = 0 Тогда КомандаПечати.Порядок = 50; @@ -2298,16 +2166,15 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, ИмяОбъекта); + МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, Источник.ПолноеИмя); КонецЕсли; - НастройкиРасширений = ПодключаемыеКоманды.НастройкиРасширенийПодключенныхКОбъектуМетаданных(СсылкаОМ); - РасширенияПечати = НастройкиРасширений.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); - Для Каждого Расширение Из РасширенияПечати Цикл - Расширение.Менеджер.ДобавитьКомандыПечати(КомандыПечати); + Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); + Для Каждого ПодключенныйОбъект Из Найденные Цикл + ПодключенныйОбъект.Менеджер.ДобавитьКомандыПечати(КомандыПечати); ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МенеджерПечати", Неопределено)); Для Каждого Команда Из ДобавленныеКоманды Цикл - Команда.МенеджерПечати = Расширение.ПолноеИмя; + Команда.МенеджерПечати = ПодключенныйОбъект.ПолноеИмя; КонецЦикла; КонецЦикла; @@ -2316,11 +2183,10 @@ КонецЦикла; КомандыПечати.Сортировать("Порядок Возр, Представление Возр"); - УстановитьНастройкиКомандПечати(КомандыПечати, СсылкаОМ); + УстановитьНастройкиКомандПечати(КомандыПечати, Источник.СсылкаМетаданных); ОпределитьВидимостьКомандПечатиПоФункциональнымОпциям(КомандыПечати); Возврат КомандыПечати; - КонецФункции Функция ОтключенныеКомандыПечати(СсылкаОбъектаМетаданных) @@ -2338,52 +2204,70 @@ Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("УникальныйИдентификатор"); КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Определяет возможность сохранения печатной формы при объекте. -// Вызывается из общей формы СохранениеПечатнойФормы. -// -// Параметры: -// СсылкаНаОбъект - ЛюбаяСсылка - объект, к которому надо присоединить файл печатной формы; -// МожноПрисоединять - Булево - (возвращаемый) признак возможности присоединения файлов к объекту. -// -Процедура ПриПроверкеВозможностиПрисоединенияФайловКОбъекту(СсылкаНаОбъект, МожноПрисоединять) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - МожноПрисоединять = МодульПрисоединенныеФайлы.КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект); - КонецЕсли; - -КонецПроцедуры - -// Заполняет список печатных форм из внешних источников. -// -// Параметры: -// ВнешниеПечатныеФормы - СписокЗначений: -// Значение - Строка - идентификатор печатной формы; -// Представление - Строка - название печатной формы. -// ПолноеИмяОбъектаМетаданных - Строка - полное имя объекта метаданных, для которого требуется получить список -// печатных форм. -// -Процедура ПриПолученииСпискаВнешнихПечатныхФорм(ВнешниеПечатныеФормы, ПолноеИмяОбъектаМетаданных) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда +// Вызывается из ПриОпределенииКомандПодключенныхКОбъекту(). +Процедура ПриПолученииКомандПечатиОбъекта(КомандыПечати, СведенияОбОбъекте, ДобавлятьДополнительные) + СведенияОбОбъекте.Менеджер.ДобавитьКомандыПечати(КомандыПечати); + Если ДобавлятьДополнительные И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииСпискаВнешнихПечатныхФорм(ВнешниеПечатныеФормы, ПолноеИмяОбъектаМетаданных); + МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, СведенияОбОбъекте.ПолноеИмя); КонецЕсли; + ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("Обработана", Ложь)); + Для Каждого Команда Из ДобавленныеКоманды Цикл + Если Не ЗначениеЗаполнено(Команда.МенеджерПечати) Тогда + Команда.МенеджерПечати = СведенияОбОбъекте.ПолноеИмя; + КонецЕсли; + Если Команда.ТипыОбъектовПечати.Количество() = 0 Тогда + Если ТипЗнч(СведенияОбОбъекте.ТипСсылкиДанных) = Тип("ОписаниеТипов") Тогда + Команда.ТипыОбъектовПечати = СведенияОбОбъекте.ТипСсылкиДанных.Типы(); + ИначеЕсли ТипЗнч(СведенияОбОбъекте.ТипСсылкиДанных) = Тип("Тип") Тогда + Команда.ТипыОбъектовПечати.Добавить(СведенияОбОбъекте.ТипСсылкиДанных); + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Процедура ПроверитьРазметкуТабличногоДокументаПоОбъектамПечати(ТабличныйДокумент, ОбъектыПечати, Знач МенеджерПечати, Знач Идентификатор) + + Если ТабличныйДокумент.ВысотаТаблицы = 0 Или ОбъектыПечати.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЕстьРазметкаПоОбъектамПечати = Ложь; + Для Каждого ОбъектПечати Из ОбъектыПечати Цикл + Для Каждого Область Из ТабличныйДокумент.Области Цикл + Если Область.Имя = ОбъектПечати.Представление Тогда + ЕстьРазметкаПоОбъектамПечати = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если СтрНайти(Идентификатор, ".") > 0 Тогда + Позиция = СтрНайти(Идентификатор, ".", НаправлениеПоиска.СКонца); + МенеджерПечати = Лев(Идентификатор, Позиция - 1); + Идентификатор = Сред(Идентификатор, Позиция + 1); + КонецЕсли; + + ТекстОшибкиРазметки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отсутствует разметка табличного документа ""%1"" по объектам печати. + |Необходимо использовать процедуру УправлениеПечатью.ЗадатьОбластьПечатиДокумента() + |при формировании табличного документа'"), Идентификатор); + ОбщегоНазначенияКлиентСервер.Проверить(ЕстьРазметкаПоОбъектамПечати, ТекстОшибкиРазметки, МенеджерПечати + "." + "Печать()"); КонецПроцедуры -// Возвращает ссылку на объект внешней печатной формы. -// -Процедура ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка) +Функция ЧастиИмениМакета(ПолноеИмяМакета) + ЧастиСтроки = СтрРазделить(ПолноеИмяМакета, "."); + ИндексПоследнегоЭлемента = ЧастиСтроки.ВГраница(); + ИмяМакета = ЧастиСтроки[ИндексПоследнегоЭлемента]; + ЧастиСтроки.Удалить(ИндексПоследнегоЭлемента); + ИмяОбъекта = СтрСоединить(ЧастиСтроки, "."); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка); - КонецЕсли; + Результат = Новый Структура; + Результат.Вставить("ИмяМакета", ИмяМакета); + Результат.Вставить("ИмяОбъекта", ИмяОбъекта); -КонецПроцедуры + Возврат Результат; +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl index 4f06bd4c4..1cf7c85b6 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// // Печать с использованием макетов в формате MS Word. // @@ -57,8 +52,6 @@ // Копирование стилей из макета. Макет.COMСоединение.ActiveDocument.Close(); Handler.COMСоединение.ActiveDocument.CopyStylesFromTemplate(Макет.ИмяФайла); - - Макет.COMСоединение.WordBasic.DisableAutoMacros(1); Макет.COMСоединение.Documents.Open(Макет.ИмяФайла); КонецЕсли; @@ -112,7 +105,6 @@ #КонецЕсли Попытка - COMОбъект.WordBasic.DisableAutoMacros(1); COMОбъект.Documents.Open(ИмяВременногоФайла); Исключение COMОбъект.Quit(0); @@ -602,7 +594,7 @@ Процедура НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке) #Если ВебКлиент Тогда - ТекстУточнения = НСтр("ru = 'При работе через веб требуется браузер Internet Explorer под управлением операционной системы Windows. См. также главу документации ""Настройка веб-браузеров для работы в веб-клиенте""'"); + ТекстУточнения = НСтр("ru = 'Для формирования этой печатной формы необходимо воспользоваться тонким клиентом.'"); #Иначе ТекстУточнения = ""; #КонецЕсли diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl index 5d48703dc..8fb115e31 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// // Open Office Writer - специфичные функции. // @@ -116,18 +111,12 @@ ДвоичныеДанныеШаблона.Записать(ИмяВременногоФайла); #КонецЕсли - ПараметрыДокумента = ПолучитьComSafeArray(); + Параметры = ПолучитьComSafeArray(); #Если Не ВебКлиент Тогда - ПараметрыДокумента.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина)); + Параметры.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина)); #КонецЕсли - // Параметры открытия: отключение исполнения макросов. - РежимЗапуска = СвойствоЗначение(ServiceManager, - "MacroExecutionMode", - 0); // const short NEVER_EXECUTE = 0 - ПараметрыДокумента.SetValue(0, РежимЗапуска); - - Document = Desktop.LoadComponentFromURL("file:///" + СтрЗаменить(ИмяВременногоФайла, "\", "/"), "_blank", 0, ПараметрыДокумента); + Document = Desktop.LoadComponentFromURL("file:///" + СтрЗаменить(ИмяВременногоФайла, "\", "/"), "_blank", 0, Параметры); #Если ВебКлиент Тогда Document.getCurrentController().getFrame().getContainerWindow().setVisible(Ложь); @@ -505,7 +494,7 @@ Процедура НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке) #Если ВебКлиент Тогда - ТекстУточнения = Символы.ПС + НСтр("ru = 'При работе через веб, требуется браузер Internet Explorer под управлением операционной системы Windows.'"); + ТекстУточнения = Символы.ПС + НСтр("ru = 'Для формирования этой печатной формы необходимо воспользоваться тонким клиентом.'"); #Иначе ТекстУточнения = ""; #КонецЕсли diff --git a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl index 293ce4532..e8d36585b 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -17,6 +12,13 @@ // ИменаМакетов - Строка - имена макетов, по которым будут формироваться печатные формы. // СоставДокументов - Массив - ссылки на объекты информационной базы (должны быть одного типа). // +// Возвращаемое значение: +// Соответствие - коллекция ссылок на объекты и их данные: +// * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы; +// * Значение - Структура - макет и данные: +// ** Ключ - Строка - имя макета; +// ** Значение - Структура - данные объекта. +// Функция МакетыИДанныеОбъектовДляПечати(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач СоставДокументов) Экспорт Возврат УправлениеПечатью.МакетыИДанныеОбъектовДляПечати(ИмяМенеджераПечати, ИменаМакетов, СоставДокументов); @@ -49,16 +51,6 @@ КонецФункции -// Возвращает описание команды по имени элемента формы. -// -// См. УправлениеПечатью.ОписаниеКомандыПечати -// -Функция ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище) Экспорт - - Возврат УправлениеПечатью.ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище); - -КонецФункции - // Возвращает истину, если есть право проведения хотя бы для одного документа. Функция ДоступноПравоПроведения(СписокДокументов) Экспорт Возврат УправлениеПечатью.ДоступноПравоПроведения(СписокДокументов); @@ -72,39 +64,8 @@ КонецФункции -// Сообщение о недоступности команды печати для выбранного объекта. -Функция СообщениеОПредназначенииКомандыПечати(ТипыОбъектовПечати) Экспорт - ТекстСообщения = НСтр("ru = 'Выбранная команда печати предназначена для документов'") - + ?(ТипыОбъектовПечати.Количество() = 1, " ", ": " + Символы.ПС); - Для Каждого Тип Из ТипыОбъектовПечати Цикл - ТекстСообщения = ТекстСообщения + Метаданные.НайтиПоТипу(Тип).ПредставлениеСписка + Символы.ПС; - КонецЦикла; - Возврат СокрЛП(ТекстСообщения); -КонецФункции - Функция НоваяКоллекцияПечатныхФорм(Идентификаторы) Экспорт Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Идентификаторы)); КонецФункции -Функция СписокКомандЭкземпляраФормы(АдресКомандПечатиВоВременномХранилище) Экспорт - Возврат УправлениеПечатью.СписокКомандЭкземпляраФормы(АдресКомандПечатиВоВременномХранилище); -КонецФункции - -Функция ПровестиДокументы(Документы) Экспорт - Результат = Новый Структура; - Результат.Вставить("Непроведенные", ОбщегоНазначения.ПровестиДокументы(Документы)); - - Проведенные = Новый Массив; - Для Каждого Документ Из Документы Цикл - Если Результат.Непроведенные.Найти(Документ) = Неопределено Тогда - Проведенные.Добавить(Документ); - КонецЕсли; - КонецЦикла; - - ДанныеДляОповещения = СтандартныеПодсистемыСервер.ПодготовитьОповещениеФормОбИзменении(Проведенные); - Результат.Вставить("ДанныеДляОповещения", ДанныеДляОповещения); - - Возврат Результат; -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl index 8e6e96b84..2fa2923b5 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Формирует и выводит на экран печатные формы. @@ -41,7 +36,6 @@ // ИмяМенеджераПечати - Строка - менеджер печати для печатаемых объектов; // ИменаМакетов - Строка - идентификаторы печатных форм; // МассивОбъектов - Ссылка, Массив - объекты печати; -// ВладелецФормы - УправляемаяФорма - форма, из которой выполняется печать; // ПараметрыПечати - Структура - произвольные параметры для передачи в менеджер печати. // Процедура ВыполнитьКомандуПечатиНаПринтер(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати = Неопределено) Экспорт @@ -128,54 +122,10 @@ КонецПроцедуры -// Обработчик динамически подключаемой команды печати. -// -// Команда - КомандаФормы - подключаемая команда формы, выполняющая обработчик Подключаемый_ВыполнитьКомандуПечати. -// (альтернативный вызов*) Структура - строка таблицы КомандыПечати, преобразованная в структуру. -// Источник - ТаблицаФормы, ДанныеФормыСтруктура - источник объектов печати (Форма.Объект, Форма.Элементы.Список). -// (альтернативный вызов*) Массив - список объектов печати. -// -// *Альтернативный вызов - указанные типы используются в случае, если вызов выполняется не из штатного -// обработчика Подключаемый_ВыполнитьКомандуПечати. -// -Процедура ВыполнитьПодключаемуюКомандуПечати(Знач Команда, Знач Форма, Знач Источник) Экспорт - - ОписаниеКоманды = Команда; - Если ТипЗнч(Команда) = Тип("КомандаФормы") Тогда - ОписаниеКоманды = ОписаниеКомандыПечати(Команда.Имя, Форма.Команды.Найти("АдресКомандПечатиВоВременномХранилище").Действие); - КонецЕсли; - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ОписаниеКоманды", ОписаниеКоманды); - ДополнительныеПараметры.Вставить("Форма", Форма); - ДополнительныеПараметры.Вставить("Источник", Источник); - - Если Не ОписаниеКоманды.НеВыполнятьЗаписьВФорме И ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура") - И (Источник.Ссылка.Пустая() Или Форма.Модифицированность) Тогда - - Если Источник.Ссылка.Пустая() Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Данные еще не записаны. - |Выполнение действия ""%1"" возможно только после записи данных. - |Данные будут записаны.'"), - ОписаниеКоманды.Представление); - - ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи", УправлениеПечатьюСлужебныйКлиент, ДополнительныеПараметры); - ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); - Возврат; - КонецЕсли; - УправлениеПечатьюСлужебныйКлиент.ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(КодВозвратаДиалога.ОК, ДополнительныеПараметры); - Возврат; - КонецЕсли; - - УправлениеПечатьюСлужебныйКлиент.ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(Неопределено, ДополнительныеПараметры); - -КонецПроцедуры - // Открывает форму ПечатьДокументов для коллекции табличных документов. // // Параметры: -// КоллекцияПечатныхФорм - Массив - коллекция описаний печатных форм, см. НоваяКоллекцияПечатныхФорм; +// КоллекцияПечатныхФорм - Массив - коллекция описаний печатных форм, см. НоваяКоллекцияПечатныхФорм(); // ОбъектыПечати - СписокЗначений - значение - ссылка на объект; // представление - имя области в которой был выведен объект (выходной параметр); // ВладелецФормы - УправляемаяФорма - форма, из которой выполняется печать. @@ -202,7 +152,8 @@ // Идентификаторы - Строка - идентификаторы печатных форм. // // Возвращаемое значение: -// Массив - коллекция описаний печатных форм. +// Массив - коллекция описаний печатных форм. Коллекция предназначена для использования в качестве +// параметра КоллекцияПечатныхФорм в других процедурах клиентского программного интерфейса подсистемы. Функция НоваяКоллекцияПечатныхФорм(Идентификаторы) Экспорт Возврат УправлениеПечатьюВызовСервера.НоваяКоллекцияПечатныхФорм(Идентификаторы); КонецФункции @@ -211,10 +162,10 @@ // Если описание не найдено, возвращает Неопределено. // // Параметры: -// КоллекцияПечатныхФорм - Массив - см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(); +// КоллекцияПечатныхФорм - Массив - см. НоваяКоллекцияПечатныхФорм(); // Идентификатор - Строка - идентификатор печатной формы. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Структура - найденное описание печатной формы. Функция ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, Идентификатор) Экспорт Для Каждого ОписаниеПечатнойФормы Из КоллекцияПечатныхФорм Цикл @@ -225,16 +176,6 @@ Возврат Неопределено; КонецФункции -// Запускает отложенный процесс обновления команд печати на форме. -// -// Параметры: -// Форма - УправляемаяФорма - форма, на которой необходимо обновить команды печати. -// -Процедура НачатьОбновлениеКоманд(Форма) Экспорт - Форма.ОтключитьОбработчикОжидания("Подключаемый_ОбновитьКоманды"); - Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбновитьКоманды", 0.2, Истина); -КонецПроцедуры - // Открывает форму выбора режима открытия макетов. // Процедура ЗадатьДействиеПриВыбореМакетаПечатнойФормы() Экспорт @@ -281,15 +222,14 @@ // Перед выполнением функции в веб-клиенте необходимо подключить расширение работы с файлами. // // Параметры: -// ТипДокумента - Строка - тип печатной формы "DOC" или "ODT"; -// НастройкиСтраницыМакета - Соответствие - параметры из структуры, возвращаемой функцией ИнициализироватьМакет; -// Макет - Структура - результат функции ИнициализироватьМакет. +// ТипДокумента - Строка - тип печатной формы "DOC" или "ODT"; +// НастройкиСтраницыМакета - Соответствие - параметры из структуры, возвращаемой функцией ИнициализироватьМакет +// (параметр устарел, его следует пропускать и использовать параметр Макет); +// Макет - Структура - результат функции ИнициализироватьМакет. // // Возвращаемое значение: -// Структура. +// Структура - новая печатная форма. // -// Примечание: параметр НастройкиСтраницыМакета устарел, его следует пропускать и использовать параметр Макет. -// Функция ИнициализироватьПечатнуюФорму(Знач ТипДокумента, Знач НастройкиСтраницыМакета = Неопределено, Макет = Неопределено) Экспорт Если ВРег(ТипДокумента) = "DOC" Тогда @@ -316,8 +256,9 @@ // ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета; // ТипМакета - Строка - тип макета печатной формы "DOC" или "ODT"; // ИмяМакета - Строка - имя, которое будет использовано при создании временного файла макета. +// // Возвращаемое значение: -// Структура. +// Структура - макет. // Функция ИнициализироватьМакетОфисногоДокумента(Знач ДвоичныеДанныеМакета, Знач ТипМакета, Знач ИмяМакета = "") Экспорт @@ -334,11 +275,15 @@ Если ВРег(ТипМакета) = "DOC" Тогда Макет = УправлениеПечатьюMSWordКлиент.ПолучитьМакетMSWord(ДвоичныеДанныеМакета, ИмяВременногоФайла); - Макет.Вставить("Тип", "DOC"); + Если Макет <> Неопределено Тогда + Макет.Вставить("Тип", "DOC"); + КонецЕсли; ИначеЕсли ВРег(ТипМакета) = "ODT" Тогда Макет = УправлениеПечатьюOOWriterКлиент.ПолучитьМакетOOWriter(ДвоичныеДанныеМакета, ИмяВременногоФайла); - Макет.Вставить("Тип", "ODT"); - Макет.Вставить("НастройкиСтраницыМакета", Неопределено); + Если Макет <> Неопределено Тогда + Макет.Вставить("Тип", "ODT"); + Макет.Вставить("НастройкиСтраницыМакета", Неопределено); + КонецЕсли; КонецЕсли; Возврат Макет; @@ -346,23 +291,23 @@ КонецФункции // Освобождает ссылки в созданном интерфейсе связи с офисным приложением. -// Необходимо вызывать каждый раз после завершения формирования макета и выводе -// печатной формы пользователю. -// Параметры: -// Handler - СсылкаПечатнаяФорма, СсылкаМакет -// ЗакрытьПриложение - булево - признак, требуется ли закрыть приложение. -// Соединение с макетом требуется закрывать с закрытием приложения. -// ПечатнуюФорму не требуется закрывать. +// Необходимо вызывать каждый раз после завершения формирования макета и выводе печатной формы пользователю. // -Процедура ОчиститьСсылки(Handler, Знач ЗакрытьПриложение = Истина) Экспорт +// Параметры: +// ПечатнаяФорма - Структура - результат функций ИнициализироватьПечатнуюФорму и ИнициализироватьМакетОфисногоДокумента; +// ЗакрытьПриложение - Булево - Истина, если требуется ли закрыть приложение. +// Соединение с макетом требуется закрывать с закрытием приложения. +// ПечатнуюФорму не требуется закрывать. +// +Процедура ОчиститьСсылки(ПечатнаяФорма, Знач ЗакрытьПриложение = Истина) Экспорт - Если Handler <> Неопределено Тогда - Если Handler.Тип = "DOC" Тогда - УправлениеПечатьюMSWordКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); + Если ПечатнаяФорма <> Неопределено Тогда + Если ПечатнаяФорма.Тип = "DOC" Тогда + УправлениеПечатьюMSWordКлиент.ЗакрытьСоединение(ПечатнаяФорма, ЗакрытьПриложение); Иначе - УправлениеПечатьюOOWriterКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); + УправлениеПечатьюOOWriterКлиент.ЗакрытьСоединение(ПечатнаяФорма, ЗакрытьПриложение); КонецЕсли; - Handler = Неопределено; + ПечатнаяФорма = Неопределено; КонецЕсли; КонецПроцедуры @@ -371,16 +316,16 @@ // Функция отображения печатной формы пользователю. // Показывает сформированный документ пользователю. -// Фактически устанавливает ему признак видимости. -// Параметры: -// Handler - СсылкаПечатнаяФорма. // -Процедура ПоказатьДокумент(Знач Handler) Экспорт +// Параметры: +// ПечатнаяФорма - Структура - результат функции ИнициализироватьПечатнуюФорму. +// +Процедура ПоказатьДокумент(Знач ПечатнаяФорма) Экспорт - Если Handler.Тип = "DOC" Тогда - УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(Handler); - ИначеЕсли Handler.Тип = "ODT" Тогда - УправлениеПечатьюOOWriterКлиент.ПоказатьДокументOOWriter(Handler); + Если ПечатнаяФорма.Тип = "DOC" Тогда + УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(ПечатнаяФорма); + ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда + УправлениеПечатьюOOWriterКлиент.ПоказатьДокументOOWriter(ПечатнаяФорма); КонецЕсли; КонецПроцедуры @@ -392,11 +337,11 @@ // Получает область из макета печатной формы. // // Параметры: -// СсылкаНаМакет - Структура - ссылка на макет печатной формы. +// СсылкаНаМакет - Структура - макет печатной формы. // ОписаниеОбласти - Структура - описание области. // -// Возвращаемое значение -// Структура - область из макета. +// Возвращаемое значение: +// Структура - область макета. // Функция ОбластьМакета(Знач СсылкаНаМакет, Знач ОписаниеОбласти) Экспорт @@ -414,7 +359,7 @@ ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ТипОбласти); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан некорректно: %1.'"), ОписаниеОбласти.ТипОбласти); КонецЕсли; Если Область <> Неопределено Тогда @@ -431,7 +376,7 @@ ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьМакета(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти); Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ИмяОбласти); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан некорректно: %1.'"), ОписаниеОбласти.ИмяОбласти); КонецЕсли; Если Область <> Неопределено Тогда @@ -447,18 +392,16 @@ // Применяется при одиночном выводе области. // // Параметры: -// ПечатнаяФорма - СсылкаПечатнаяФорма - ссылка на печатную форму. -// ОбластьМакета - Область - область из макета. -// ПереходНаСледующуюСтроку - булево, требуется ли вставлять разрыв после вывода области. +// ПечатнаяФорма - Структура - печатная форма, см. ИнициализироватьПечатнуюФорму(). +// ОбластьМакета - Структура - см. ОбластьМакета(). +// ПереходНаСледующуюСтроку - Булево - Истина, если требуется вставить разрыв после вывода области. // -Процедура ПрисоединитьОбласть(Знач ПечатнаяФорма, - Знач ОбластьМакета, - Знач ПереходНаСледующуюСтроку = Истина) Экспорт - +Процедура ПрисоединитьОбласть(Знач ПечатнаяФорма, Знач ОбластьМакета, Знач ПереходНаСледующуюСтроку = Истина) Экспорт + Если ОбластьМакета = Неопределено Тогда - Возврат; - КонецЕсли; - + Возврат; + КонецЕсли; + Попытка ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; @@ -483,7 +426,7 @@ ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); КонецЕсли; Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно.'")); + ВызватьИсключение ТекстТипОбластиУказанНекорректно(); КонецЕсли; ОписаниеОбласти.Вставить("Область", ВыведеннаяОбласть); @@ -505,7 +448,7 @@ УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина); Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + ВызватьИсключение ТекстТипОбластиУказанНекорректно(); КонецЕсли; // Содержит тип области, и границы области (если требуется). ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; @@ -523,8 +466,8 @@ // Заполняет параметры области печатной формы. // // Параметры: -// ПечатнаяФорма - СсылкаПечатнаяФорма, Область - область печатной формы, либо сама печатная форма. -// Данные - ДанныеЗаполнения. +// ПечатнаяФорма - Структура - область печатной формы, либо сама печатная форма. +// Данные - Структура - данные заполнения. // Процедура ЗаполнитьПараметры(Знач ПечатнаяФорма, Знач Данные) Экспорт @@ -540,7 +483,7 @@ ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметры(ПечатнаяФорма.ПоследняяВыведеннаяОбласть.Область, Данные); Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + ВызватьИсключение ТекстТипОбластиУказанНекорректно(); КонецЕсли; ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "ВерхнийКолонтитул" Тогда @@ -557,21 +500,18 @@ КонецПроцедуры -// Добавляет область в печатную форму из макета, при этом заменяя -// параметры в области значениями из данных объекта. +// Добавляет область в печатную форму из макета, при этом заменяя параметры в области значениями из данных объекта. // Применяется при одиночном выводе области. // // Параметры: -// ПечатнаяФорма - СсылкаПечатнаяФорма -// ОбластьМакета - Область -// Данные - ДанныеОбъекта -// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области. +// ПечатнаяФорма - Структура - печатная форма, см. ИнициализироватьПечатнуюФорму(). +// ОбластьМакета - Структура - см. ОбластьМакета(). +// Данные - Структура - данные заполнения. +// ПереходНаСледующуюСтроку - Булево - Истина, если требуется вставить разрыв после вывода области. // -Процедура ПрисоединитьОбластьИЗаполнитьПараметры(Знач ПечатнаяФорма, - Знач ОбластьМакета, - Знач Данные, - Знач ПереходНаСледующуюСтроку = Истина) Экспорт - +Процедура ПрисоединитьОбластьИЗаполнитьПараметры(Знач ПечатнаяФорма, Знач ОбластьМакета, + Знач Данные, Знач ПереходНаСледующуюСтроку = Истина) Экспорт + Если ОбластьМакета <> Неопределено Тогда ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); ЗаполнитьПараметры(ПечатнаяФорма, Данные) @@ -584,10 +524,10 @@ // Применяется при одиночном выводе области. // // Параметры: -// ПечатнаяФорма - СсылкаПечатнаяФорма -// ОбластьМакета - Область - область макета. -// Данные - ДанныеОбъекта (массив структур). -// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области. +// ПечатнаяФорма - Структура - печатная форма, см. ИнициализироватьПечатнуюФорму(). +// ОбластьМакета - Структура - см. ОбластьМакета(). +// Данные - Массив - коллекция элементов типа Структура, данные объекта. +// ПереходНаСледСтроку - Булево - Истина, если требуется вставить разрыв после вывода области. // Процедура ПрисоединитьИЗаполнитьКоллекцию(Знач ПечатнаяФорма, Знач ОбластьМакета, @@ -605,7 +545,7 @@ ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьНабор(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку); Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + ВызватьИсключение ТекстТипОбластиУказанНекорректно(); КонецЕсли; ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда Если ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда @@ -613,15 +553,16 @@ ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Ложь, ПереходНаСледСтроку); Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + ВызватьИсключение ТекстТипОбластиУказанНекорректно(); КонецЕсли; КонецЕсли; КонецПроцедуры // Вставляет разрыв между строками в виде символа перевода строки. +// // Параметры: -// ПечатнаяФорма - СсылкаПечатнаяФорма. +// ПечатнаяФорма - Структура - печатная форма, см. ИнициализироватьПечатнуюФорму(). // Процедура ВставитьРазрывНаНовуюСтроку(Знач ПечатнаяФорма) Экспорт @@ -635,6 +576,35 @@ #КонецОбласти +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ПодключаемыеКомандыКлиент.ВыполнитьКоманду. +// +// Обработчик динамически подключаемой команды печати. +// +// Параметры: +// Команда - КомандаФормы - подключаемая команда формы, выполняющая обработчик Подключаемый_ВыполнитьКомандуПечати. +// - Структура - строка таблицы КомандыПечати, преобразованная в структуру. +// Форма - УправляемаяФорма - форма, из которой была вызвана команда. +// Источник - ТаблицаФормы, ДанныеФормыСтруктура - источник объектов печати (Форма.Объект, Форма.Элементы.Список). +// - Массив - список объектов печати. +Процедура ВыполнитьПодключаемуюКомандуПечати(Знач Команда, Знач Форма, Знач Источник) Экспорт + ПодключаемыеКомандыКлиент.ВыполнитьКоманду(Форма, Команда, Источник); +КонецПроцедуры + +// Устарела. Следует использовать ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд. +// +// Запускает отложенный процесс обновления команд печати на форме. +// +// Параметры: +// Форма - УправляемаяФорма - форма, на которой необходимо обновить команды печати. +// +Процедура НачатьОбновлениеКоманд(Форма) Экспорт + ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(Форма); +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -660,14 +630,8 @@ КонецФункции -// Возвращает описание команды по имени элемента формы. -// -// См. УправлениеПечатью.ОписаниеКомандыПечати -// -Функция ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище) - - Возврат УправлениеПечатьюКлиентПовтИсп.ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище); - +Функция ТекстТипОбластиУказанНекорректно() + Возврат НСтр("ru = 'Тип области не указан или указан некорректно.'"); КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиентПовтИсп/Module.bsl index e611328ad..e69de29bb 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиентПовтИсп/Module.bsl @@ -1,22 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// Возвращает описание команды по имени элемента формы. -// -// См. УправлениеПечатью.ОписаниеКомандыПечати -// -Функция ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище) Экспорт - - Возврат УправлениеПечатьюВызовСервера.ОписаниеКомандыПечати(ИмяКоманды, АдресКомандПечатиВоВременномХранилище); - -КонецФункции - -Функция СписокКомандЭкземпляраФормы(АдресКомандПечатиВоВременномХранилище) Экспорт - Возврат УправлениеПечатьюВызовСервера.СписокКомандЭкземпляраФормы(АдресКомандПечатиВоВременномХранилище); -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl index de3127cc6..2d99686ae 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl @@ -1,10 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды. +// // Обновляет список команд печати в зависимости от текущего контекста. // // Параметры: @@ -12,125 +11,9 @@ // Источник - ДанныеФормыСтруктура, ТаблицаФормы - контекст для проверки условий (Форма.Объект или Форма.Элементы.Список). // Процедура ОбновитьКоманды(Форма, Источник) Экспорт - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ВыбранныеОбъекты = Новый Массив; - #Если Клиент Тогда - ВыделенныеСтроки = Источник.ВыделенныеСтроки; - Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); - Если ТекущаяСтрока <> Неопределено Тогда - ВыбранныеОбъекты.Добавить(ТекущаяСтрока); - КонецЕсли; - КонецЦикла; - #КонецЕсли - ОбновитьКомандыПечатиСпискаФормы(Форма, ВыбранныеОбъекты); - Иначе - ОбновитьКомандыПечатиФормыОбъекта(Форма, Источник); - КонецЕсли; + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(Форма, Источник); КонецПроцедуры #КонецОбласти -#Область СлужебныеПроцедурыИФункции - -Функция КомандыНаФорме(Форма) - КомандаФормы = Форма.Команды.Найти("АдресКомандПечатиВоВременномХранилище"); - Если КомандаФормы = Неопределено Тогда - Возврат Новый Массив; - КонецЕсли; -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Результат = УправлениеПечатью.СписокКомандЭкземпляраФормы(КомандаФормы.Действие); -#Иначе - Результат = УправлениеПечатьюКлиентПовтИсп.СписокКомандЭкземпляраФормы(КомандаФормы.Действие); -#КонецЕсли - Возврат Результат; -КонецФункции - -Процедура ОбновитьКомандыПечатиСпискаФормы(Форма, ВыбранныеОбъекты) - ГруппыПечать = Новый Соответствие; - КомандыНаФорме = КомандыНаФорме(Форма); - Для Каждого Команда Из КомандыНаФорме Цикл - Если Не ЗначениеЗаполнено(Команда.ИмяКомандыНаФорме) Тогда - Продолжить; - КонецЕсли; - ПоказыватьКоманду = Истина; - Для Каждого Объект Из ВыбранныеОбъекты Цикл - ПоказыватьКоманду = ПоказыватьКоманду И (Команда.ТипыОбъектовПечати.Количество() = 0 - Или Команда.ТипыОбъектовПечати.Найти(ТипЗнч(Объект.Ссылка)) <> Неопределено); - Если ПоказыватьКоманду Тогда - ПоказыватьКоманду = ПоказыватьКоманду И УсловияВыполняются(Команда.УсловияВидимости, Объект); - КонецЕсли; - Если Не ПоказыватьКоманду Тогда - Прервать; - КонецЕсли; - КонецЦикла; - КомандаЭлемент = Форма.Элементы[Команда.ИмяКомандыНаФорме]; - КомандаЭлемент.Видимость = ПоказыватьКоманду; - ГруппыПечать.Вставить(КомандаЭлемент.Родитель); - КонецЦикла; - - Для Каждого Элемент Из ГруппыПечать Цикл - ОбновитьВидГруппыПечать(Элемент.Ключ); - КонецЦикла; -КонецПроцедуры - -Процедура ОбновитьКомандыПечатиФормыОбъекта(Форма, Объект) - КомандыНаФорме = КомандыНаФорме(Форма); - Для Каждого Команда Из КомандыНаФорме Цикл - Если Не ЗначениеЗаполнено(Команда.ИмяКомандыНаФорме) Тогда - Продолжить; - КонецЕсли; - Видимость = УсловияВыполняются(Команда.УсловияВидимости, Объект); - КомандаЭлемент = Форма.Элементы[Команда.ИмяКомандыНаФорме]; - КомандаЭлемент.Видимость = Видимость; - КонецЦикла; -КонецПроцедуры - -Процедура ОбновитьВидГруппыПечать(Группа) - ИмяЭлементаЗаглушки = Группа.Имя + "КомандаПечатиЗаглушка"; - КоличествоВидимых = 0; - Для Каждого Элемент Из Группа.ПодчиненныеЭлементы Цикл - Если Элемент.Имя <> ИмяЭлементаЗаглушки И Элемент.Видимость Тогда - КоличествоВидимых = КоличествоВидимых + 1; - КонецЕсли; - КонецЦикла; - ЭлементЗаглушка = Группа.ПодчиненныеЭлементы.Найти(ИмяЭлементаЗаглушки); - ЭлементЗаглушка.Видимость = КоличествоВидимых = 0; -КонецПроцедуры - -Функция УсловияВыполняются(Условия, ЗначенияРеквизитов) - Результат = Истина; - Для Каждого Условие Из Условия Цикл - ИмяРеквизита = Условие.Реквизит; - Если ТипЗнч(ЗначенияРеквизитов) = Тип("ДанныеФормыСтруктура") - И Не ЗначенияРеквизитов.Свойство(ИмяРеквизита) Тогда - Продолжить; - КонецЕсли; - Если Условие.ВидСравнения = ВидСравнения.Равно Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] = Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.Больше Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] > Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.БольшеИлиРавно Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] >= Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.Меньше Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] < Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.МеньшеИлиРавно Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] <= Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.НеРавно Тогда - Результат = Результат И ЗначенияРеквизитов[ИмяРеквизита] <> Условие.Значение; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.ВСписке Тогда - Результат = Результат И Условие.Значение.Найти(ЗначенияРеквизитов[ИмяРеквизита]) <> Неопределено; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.НеВСписке Тогда - Результат = Результат И Условие.Значение.Найти(ЗначенияРеквизитов[ИмяРеквизита]) = Неопределено; - КонецЕсли; - Если Не Результат Тогда - Прервать; - КонецЕсли; - КонецЦикла; - Возврат Результат; -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl index 845e32ebf..716333b0d 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -1,54 +1,11 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Переопределяет таблицу возможных форматов для сохранения табличного документа. -// Вызывается из ОбщегоНазначения.НастройкиФорматовСохраненияТабличногоДокумента() +// Определяет объекты конфигурации, в модулях менеджеров которых размещена процедура ДобавитьКомандыПечати, +// формирующая список команд печати, предоставляемых этим объектом. +// Синтаксис процедуры ДобавитьКомандыПечати см. в документации к подсистеме. // // Параметры: -// ТаблицаФорматов - ТаблицаЗначений: -// * ТипФайлаТабличногоДокумента - ТипФайлаТабличногоДокумента - значение в -// платформе, -// соответствующее -// формату; -// * Ссылка - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на -// метаданные, где -// хранится -// представление; -// * Представление - Строка - - представление типа -// файла (заполняется из перечисления); -// * Расширение - Строка - - тип файла для -// операционной системы; -// * Картинка - Картинка - значок формата. -// -Процедура ПриЗаполненииНастроекФорматовСохраненияТабличногоДокумента(ТаблицаФорматов) Экспорт - -КонецПроцедуры - -// Переопределяет список команд печати, получаемый функцией УправлениеПечатью.КомандыПечатиФормы. -Процедура ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка) Экспорт - -КонецПроцедуры - -// Дополнительные настройки списка команд печати. -// -// Параметры: -// НастройкиСписка - Структура - модификаторы списка команд печати. -// * МенеджерКомандПечати - МенеджерОбъекта - менеджер объекта, в котором формируется список команд печати; -// * АвтоматическоеЗаполнение - Булево - заполнять команды печати из объектов, входящих в состав журнала. -// Значение по умолчанию: Истина. -// -Процедура ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка) Экспорт - -КонецПроцедуры - -// Определяет объекты, в которых есть процедура ДобавитьКомандыПечати(). -// -// Параметры: -// СписокОбъектов - Массив - список менеджеров объектов. +// СписокОбъектов - Массив - менеджеры объектов с процедурой ДобавитьКомандыПечати. // Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт @@ -56,9 +13,56 @@ КонецПроцедуры -// Вызывается после завершения вызова процедуры Печать менеджера печати объекта, имеет те же параметры. +// Переопределяет таблицу возможных форматов для сохранения табличного документа. +// Вызывается из ОбщегоНазначения.НастройкиФорматовСохраненияТабличногоДокумента(). +// Используется в случае, когда необходимо сократить список форматов сохранения, предлагаемый пользователю +// перед сохранением печатной формы в файл, либо перед отправкой по почте. +// +// Параметры: +// ТаблицаФорматов - ТаблицаЗначений - коллекция форматов сохранения: +// * ТипФайлаТабличногоДокумента - ТипФайлаТабличногоДокумента - значение в платформе, соответствующее формату; +// * Ссылка - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на метаданные, где хранится представление; +// * Представление - Строка - представление типа файла (заполняется из перечисления); +// * Расширение - Строка - тип файла для операционной системы; +// * Картинка - Картинка - значок формата. +// +Процедура ПриЗаполненииНастроекФорматовСохраненияТабличногоДокумента(ТаблицаФорматов) Экспорт + +КонецПроцедуры + +// Переопределяет список команд печати, получаемый функцией УправлениеПечатью.КомандыПечатиФормы. +// Используется для общих форм, у которых нет модуля менеджера для размещения в нем процедуры ДобавитьКомандыПечати, +// для случаев, когда штатных средств добавления команд в такие формы недостаточно. Например, если нужны свои команды, +// которых нет в других объектах. // // Параметры: +// ИмяФормы - Строка - полное имя формы, в которой добавляются команды печати; +// КомандыПечати - ТаблицаЗначений - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати; +// СтандартнаяОбработка - Булево - при установке значения Ложь не будет автоматически заполняться коллекция КомандыПечати. +// +Процедура ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка) Экспорт + +КонецПроцедуры + +// Дополнительные настройки списка команд печати в журналах документов. +// +// Параметры: +// НастройкиСписка - Структура - модификаторы списка команд печати. +// * МенеджерКомандПечати - МенеджерОбъекта - менеджер объекта, в котором формируется список команд печати; +// * АвтоматическоеЗаполнение - Булево - заполнять команды печати из объектов, входящих в состав журнала. +// Если установлено значение Ложь, то список команд печати журнала будет +// заполнен вызовом метода ДобавитьКомандыПечати из модуля менеджера журнала. +// Значение по умолчанию: Истина - метод ДобавитьКомандыПечати будет вызван из +// модулей менеджеров документов, входящих в состав журнала. +Процедура ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка) Экспорт + +КонецПроцедуры + +// Вызывается после завершения вызова процедуры Печать менеджера печати объекта, имеет те же параметры. +// Может использоваться для постобработки всех печатных форм при их формировании. +// Например, можно вставить в колонтитул дату формирования печатной формы. +// +// Параметры: // МассивОбъектов - Массив - список объектов, для которых была выполнена процедура Печать; // ПараметрыПечати - Структура - произвольные параметры, переданные при вызове команды печати; // КоллекцияПечатныхФорм - ТаблицаЗначений - содержит табличные документы и дополнительную информацию; @@ -78,21 +82,21 @@ КонецПроцедуры // Переопределяет параметры отправки печатных форм при подготовке письма. -// -// Параметры: +// Может использоваться, например, для подготовки текста письма. // -// ПараметрыОтправки -// * Получатель - Массив -// * Тема - Строка -// * Текст - Строка -// * Вложения - Структура: -// ** АдресВоВременномХранилище - Строка. -// ** Представление - Строка - имя файла. -// ОбъектыПечати - Массив - параметр МассивСсылок в вызове процедуры Печать. +// Параметры: +// ПараметрыОтправки - Структура - коллекция параметров: +// * Получатель - Массив - коллекция имен получателей; +// * Тема - Строка - тема письма; +// * Текст - Строка - текст письма; +// * Вложения - Структура - коллекция вложений: +// ** АдресВоВременномХранилище - Строка - адрес вложения во временном хранилище; +// ** Представление - Строка - имя файла вложения. +// ОбъектыПечати - Массив - коллекция объектов, по которым сформированы печатные формы. // ПараметрыВывода - Структура - параметр ПараметрыВывода в вызове процедуры Печать. // ПечатныеФормы - ТаблицаЗначений - коллекция табличных документов: -// * Название - Строка - название печатной формы; -// * ТабличныйДокумент - ТабличныйДокумент - печатая форма. +// * Название - Строка - название печатной формы; +// * ТабличныйДокумент - ТабличныйДокумент - печатая форма. Процедура ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, ПечатныеФормы) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl index e7eccc806..cce2cdd3d 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl @@ -1,19 +1,7 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции Функция КомандыПечатиФормы(ИмяФормы, СписокОбъектов = Неопределено) Экспорт - ОбъектыПечати = Неопределено; - Если СписокОбъектов <> Неопределено Тогда - ОбъектыПечати = Новый Массив; - Для Каждого ИмяОбъекта Из ОбщегоНазначения.ЗначениеИзСтрокиXML(СписокОбъектов) Цикл - ОбъектыПечати.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); - КонецЦикла; - КонецЕсли; - Возврат УправлениеПечатью.КомандыПечатиФормы(ИмяФормы, ОбъектыПечати); + Возврат УправлениеПечатью.КомандыПечатиФормы(ИмяФормы, СписокОбъектов); КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl index c53296a67..3b17ac62b 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Печать". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Обработчик подключенной команды. @@ -23,13 +18,37 @@ ВыполнитьПодключаемуюКомандуПечатиЗавершение(Истина, ПараметрыВыполнения); КонецПроцедуры +// Формирует табличный документ в форме подсистемы "Печать". +Процедура ВыполнитьОткрытиеПечатнойФормы(ИсточникДанных, ИдентификаторКоманды, ОбъектыНазначения, Форма, СтандартнаяОбработка) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ИсточникДанных", ИсточникДанных); + Параметры.Вставить("ИдентификаторКоманды", ИдентификаторКоманды); + Если СтандартнаяОбработка Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОткрытиеПечатнойФормыЗавершение", ЭтотОбъект, Параметры); + УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыНазначения, Форма); + Иначе + ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, Параметры); + КонецЕсли; + +КонецПроцедуры + +// Открывает форму настроек видимости команд в подменю "Печать". +Процедура ОткрытьФормуНастроекПодменюПечать(Отбор) Экспорт + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("Отбор", Отбор); + ОткрытьФорму("ОбщаяФорма.НастройкаКомандПечати", ПараметрыОткрытия, , , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); +КонецПроцедуры + // Открыть форму для выбора вариантов формата вложений // // Параметры: // НастройкиФормата - Структура - Описание настроек // * УпаковатьВАрхив - Булево - Признак необходимости упаковки вложений в архив. // * ФорматыСохранения - Массив - Список выбранных форматов вложений. -// Оповещение - ОписаниеОповещения - - оповещение, которое вызывается после закрытие формы для обработки результатов выбора. +// Оповещение - ОписаниеОповещения - - оповещение, которое вызывается после закрытие формы для обработки +// результатов выбора. // Процедура ОткрытьФормуВыбораФорматаВложений(НастройкиФормата, Оповещение) Экспорт ПараметрыФормы = Новый Структура("НастройкиФормата", НастройкиФормата); @@ -41,85 +60,7 @@ #Область СлужебныеПроцедурыИФункции // Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. -Процедура ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(РезультатВопроса, ДополнительныеПараметры) Экспорт - - ОписаниеКоманды = ДополнительныеПараметры.ОписаниеКоманды; - Форма = ДополнительныеПараметры.Форма; - Источник = ДополнительныеПараметры.Источник; - - Если РезультатВопроса = КодВозвратаДиалога.ОК Тогда - ОчиститьСообщения(); - Форма.Записать(); - Если Источник.Ссылка.Пустая() Или Форма.Модифицированность Тогда - Возврат; // Запись не удалась, сообщения о причинах выводит платформа. - КонецЕсли; - ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда - Возврат; - КонецЕсли; - - ВыполнитьПодключаемуюКомандуПечатиПодготовкаОбъектовПечати(ДополнительныеПараметры); - -КонецПроцедуры - -// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. -Процедура ВыполнитьПодключаемуюКомандуПечатиПодготовкаОбъектовПечати(ДополнительныеПараметры) - - ОбъектыПечати = ДополнительныеПараметры.Источник; - Если ТипЗнч(ОбъектыПечати) <> Тип("Массив") Тогда - ОбъектыПечати = ОбъектыПечати(ОбъектыПечати); - КонецЕсли; - - Если ОбъектыПечати.Количество() = 0 Тогда - ВызватьИсключение НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'") - КонецЕсли; - - Если ДополнительныеПараметры.ОписаниеКоманды.ТипыОбъектовПечати.Количество() <> 0 Тогда // требуется проверка типа - ЕстьПечатаемыеОбъекты = Ложь; - Для Каждого ОбъектПечати Из ОбъектыПечати Цикл - Если ДополнительныеПараметры.ОписаниеКоманды.ТипыОбъектовПечати.Найти(ТипЗнч(ОбъектПечати)) <> Неопределено Тогда - ЕстьПечатаемыеОбъекты = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не ЕстьПечатаемыеОбъекты Тогда - ТекстСообщения = УправлениеПечатьюВызовСервера.СообщениеОПредназначенииКомандыПечати(ДополнительныеПараметры.ОписаниеКоманды.ТипыОбъектовПечати); - ПоказатьПредупреждение(, ТекстСообщения); - Возврат; - КонецЕсли; - КонецЕсли; - - Если ДополнительныеПараметры.ОписаниеКоманды.ПроверкаПроведенияПередПечатью Тогда - ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры); - УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыПечати, ДополнительныеПараметры.Форма); - Возврат; - КонецЕсли; - - ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами(ОбъектыПечати, ДополнительныеПараметры); - -КонецПроцедуры - -// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. -Процедура ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами(ОбъектыПечати, ДополнительныеПараметры) Экспорт - - Если ОбъектыПечати.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ДополнительныеПараметры.Вставить("ОбъектыПечати", ОбъектыПечати); - - Если ДополнительныеПараметры.ОписаниеКоманды.ТребуетсяРасширениеРаботыСФайлами Тогда - ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиЗавершение", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - Возврат; - КонецЕсли; - - ВыполнитьПодключаемуюКомандуПечатиЗавершение(Истина, ДополнительныеПараметры); - -КонецПроцедуры - -// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. -Процедура ВыполнитьПодключаемуюКомандуПечатиЗавершение(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт +Процедура ВыполнитьПодключаемуюКомандуПечатиЗавершение(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Если Не РасширениеРаботыСФайламиПодключено Тогда Возврат; @@ -207,8 +148,8 @@ КонецЕсли; ОчиститьСообщения(); - РезультатПроведения = УправлениеПечатьюВызовСервера.ПровестиДокументы(ДополнительныеПараметры.НепроведенныеДокументы); - ДанныеОНепроведенныхДокументах = РезультатПроведения.Непроведенные; + ДанныеОНепроведенныхДокументах = ОбщегоНазначенияВызовСервера.ПровестиДокументы(ДополнительныеПараметры.НепроведенныеДокументы); + ШаблонСообщения = НСтр("ru = 'Документ %1 не проведен: %2'"); НепроведенныеДокументы = Новый Массив; Для Каждого ИнформацияОДокументе Из ДанныеОНепроведенныхДокументах Цикл @@ -217,13 +158,13 @@ ИнформацияОДокументе.Ссылка); НепроведенныеДокументы.Добавить(ИнформацияОДокументе.Ссылка); КонецЦикла; - ДополнительныеПараметры.Вставить("НепроведенныеДокументы", НепроведенныеДокументы); - ПроведенныеДокументы = ОбщегоНазначенияКлиентСервер.СократитьМассив(ДополнительныеПараметры.СписокДокументов, НепроведенныеДокументы); + ИзмененныеДокументы = ОбщегоНазначенияКлиентСервер.СократитьМассив(ДополнительныеПараметры.НепроведенныеДокументы, НепроведенныеДокументы); + + ДополнительныеПараметры.Вставить("НепроведенныеДокументы", НепроведенныеДокументы); ДополнительныеПараметры.Вставить("ПроведенныеДокументы", ПроведенныеДокументы); - // Оповещаем открытые формы о том, что были проведены документы. - СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(РезультатПроведения.ДанныеДляОповещения); + ОбщегоНазначенияКлиент.ОповеститьОбИзмененииОбъектов(ИзмененныеДокументы); // Если команда была вызвана из формы, то зачитываем в форму актуальную (проведенную) копию из базы. Если ТипЗнч(ДополнительныеПараметры.Форма) = Тип("УправляемаяФорма") Тогда @@ -267,30 +208,6 @@ КонецПроцедуры -// Возвращает ссылки на объекты, выбранные в данный момент на форме. -Функция ОбъектыПечати(Источник) - - Результат = Новый Массив; - - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ВыделенныеСтроки = Источник.ВыделенныеСтроки; - Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); - Если ТекущаяСтрока <> Неопределено Тогда - Результат.Добавить(ТекущаяСтрока.Ссылка); - КонецЕсли; - КонецЦикла; - Иначе - Результат.Добавить(Источник.Ссылка); - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Проверяет что менеджер печати является отчетом или обработкой. Функция ЭтоОтчетИлиОбработка(МенеджерПечати) Если Не ЗначениеЗаполнено(МенеджерПечати) Тогда @@ -304,22 +221,22 @@ Возврат Вид = "ОТЧЕТ" Или Вид = "ОБРАБОТКА"; КонецФункции -// Проверяет наличие установленного расширения работы с файлами в веб-клиенте и предлагает установку в случае -// отсутствия. -// -// Параметры: -// ОписаниеОповещения - ОписаниеОповещения - описание процедуры, вызов которой будет произведен после проверки. -// Процедура должна содержать следующие параметры: -// Результат - (не используется); -// ДополнительныеПараметры - (не используется). -// -Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) - #Если ВебКлиент Тогда - ТекстСообщения = НСтр("ru = 'Для продолжения печати необходимо установить расширение для веб-клиента 1С:Предприятие.'"); - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения, ТекстСообщения, Ложь); - Возврат; - #КонецЕсли - ВыполнитьОбработкуОповещения(ОписаниеОповещения, Истина); +// Продолжение процедуры ВыполнитьОткрытиеПечатнойФормы. +Процедура ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, ДополнительныеПараметры) Экспорт + + Форма = ДополнительныеПараметры.Форма; + + ПараметрыИсточника = Новый Структура; + ПараметрыИсточника.Вставить("ИдентификаторКоманды", ДополнительныеПараметры.ИдентификаторКоманды); + ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначения); + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ИсточникДанных", ДополнительныеПараметры.ИсточникДанных); + ПараметрыОткрытия.Вставить("ПараметрыИсточника", ПараметрыИсточника); + ПараметрыОткрытия.Вставить("ПараметрКоманды", ОбъектыНазначения); + + ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, Форма); + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl index 6126701ac..4377e0758 100644 --- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Свойства" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -103,7 +98,9 @@ Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта, Ложь, Истина); Если Форма.ПараметрыСвойств.Свойство("ДобавленаПустаяДекорация") Тогда - Форма.Элементы.Свойства_ПустаяДекорация.Видимость = Не СведенияНеНайдены; + Для Каждого ИмяДекорации Из Форма.ПараметрыСвойств.КоллекцияДекораций Цикл + Форма.Элементы[ИмяДекорации].Видимость = Не СведенияНеНайдены; + КонецЦикла; КонецЕсли; ОбновитьКлючНазначенияФормы(Форма, КлючНазначения); @@ -195,9 +192,13 @@ Для Каждого ЗависимыйРеквизит Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл Если ЗависимыйРеквизит.ИмяРеквизитаЗначение = Строка.ИмяРеквизитаЗначение И ЗависимыйРеквизит.УсловиеОбязательностиЗаполнения <> Неопределено Тогда - ЗначенияПараметров = ЗависимыйРеквизит.УсловиеОбязательностиЗаполнения.ЗначенияПараметров; - КодУсловия = ЗависимыйРеквизит.УсловиеОбязательностиЗаполнения.КодУсловия; - Выполнить("Результат = (" + КодУсловия + ")"); + + Параметры = Новый Структура; + Параметры.Вставить("ЗначенияПараметров", ЗависимыйРеквизит.УсловиеОбязательностиЗаполнения.ЗначенияПараметров); + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ОписаниеОбъекта", ОписаниеОбъекта); + Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме(ЗависимыйРеквизит.УсловиеОбязательностиЗаполнения.КодУсловия, Параметры); + Прервать; КонецЕсли; КонецЦикла; @@ -206,17 +207,16 @@ КонецЕсли; Если НЕ ЗначениеЗаполнено(Форма[Строка.ИмяРеквизитаЗначение]) Тогда - - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - Строка.ИмяРеквизитаЗначение, + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), Строка.Наименование), - ""); + , + Строка.ИмяРеквизитаЗначение, + , + Отказ); КонецЕсли; КонецЕсли; КонецЦикла; - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); - КонецПроцедуры // Обновляет наборы дополнительных реквизитов и сведений для вида объектов со свойствами. @@ -383,6 +383,8 @@ Ложь); ОписаниеСвойств.Колонки.Добавить("ИмяРеквизитаЗначение"); + ОписаниеСвойств.Колонки.Добавить("СтрокаСсылочногоТипа"); + ОписаниеСвойств.Колонки.Добавить("ИмяСсылочногоРеквизитаЗначение"); ОписаниеСвойств.Колонки.Добавить("ИмяУникальнаяЧасть"); ОписаниеСвойств.Колонки.Добавить("ДополнительноеЗначение"); ОписаниеСвойств.Колонки.Добавить("Булево"); @@ -395,6 +397,8 @@ Для каждого ОписаниеСвойства Из ОписаниеСвойств Цикл ТипЗначенияСвойства = ОписаниеСвойства.ТипЗначения; + СписокТипов = ТипЗначенияСвойства.Типы(); + СтроковыйРеквизит = (СписокТипов.Количество() = 1) И (СписокТипов[0] = Тип("Строка")); // Поддержка строк неограниченной длины. ИспользоватьНеограниченнуюСтроку = УправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку( @@ -418,6 +422,18 @@ ОписаниеСвойства.ИмяРеквизитаЗначение = "ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть; + ОписаниеСвойства.СтрокаСсылочногоТипа = Ложь; + Если СтроковыйРеквизит + И Не ИспользоватьНеограниченнуюСтроку + И ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда + ФорматированнаяСтрока = Новый ОписаниеТипов("ФорматированнаяСтрока"); + ОписаниеСвойства.СтрокаСсылочногоТипа = Истина; + ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение = "СсылочныйДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть; + + Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина); + ДобавляемыеРеквизиты.Добавить(Реквизит); + КонецЕсли; + Если ОписаниеСвойства.Удалено Тогда ТипЗначенияСвойства = Новый ОписаниеТипов("Строка"); КонецЕсли; @@ -433,11 +449,24 @@ Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); // Создание элементов формы. - ИмяЭлементаДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения; - ЭлементРазмещения = ?(ИмяЭлементаДляРазмещения = "", Неопределено, Форма.Элементы[ИмяЭлементаДляРазмещения]); - Для Каждого ОписаниеСвойства Из ОписаниеСвойств Цикл + ИмяЭлементаДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения; + Если ТипЗнч(ИмяЭлементаДляРазмещения) <> Тип("СписокЗначений") Тогда + Если ИмяЭлементаДляРазмещения = Неопределено Тогда + ИмяЭлементаДляРазмещения = ""; + КонецЕсли; + + ЭлементРазмещения = ?(ИмяЭлементаДляРазмещения = "", Неопределено, Форма.Элементы[ИмяЭлементаДляРазмещения]); + Иначе + РазделыДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения; + РазмещениеНабора = РазделыДляРазмещения.НайтиПоЗначению(ОписаниеСвойства.Набор); + Если РазмещениеНабора = Неопределено Тогда + РазмещениеНабора = РазделыДляРазмещения.НайтиПоЗначению("ВсеОстальные"); + КонецЕсли; + ЭлементРазмещения = Форма.Элементы[РазмещениеНабора.Представление]; + КонецЕсли; + ФормаОписаниеСвойства = Форма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить(); ЗаполнитьЗначенияСвойств(ФормаОписаниеСвойства, ОписаниеСвойства); @@ -454,13 +483,13 @@ КонецЕсли; Если ТипЗнч(СтрокаТаблицы.Реквизит) = Тип("Строка") Тогда - ПутьКРеквизиту = "ОписаниеОбъекта." + СтрокаТаблицы.Реквизит; + ПутьКРеквизиту = "Параметры.ОписаниеОбъекта." + СтрокаТаблицы.Реквизит; Иначе ОписаниеДополнительногоРеквизита = ОписаниеСвойств.Найти(СтрокаТаблицы.Реквизит, "Свойство"); Если ОписаниеДополнительногоРеквизита = Неопределено Тогда Продолжить; // Дополнительный реквизит не существует, условие игнорируется. КонецЕсли; - ПутьКРеквизиту = "Форма." + ОписаниеДополнительногоРеквизита.ИмяРеквизитаЗначение; + ПутьКРеквизиту = "Параметры.Форма." + ОписаниеДополнительногоРеквизита.ИмяРеквизитаЗначение; КонецЕсли; ШаблонУсловия = ""; @@ -470,9 +499,15 @@ ШаблонУсловия = "%1 <> %2"; КонецЕсли; + Если СтрокаТаблицы.Условие = "В списке" Тогда // не ошибка, идентификатор. + ШаблонУсловия = "%2.НайтиПоЗначению(%1) <> Неопределено" + ИначеЕсли СтрокаТаблицы.Условие = "Не в списке" Тогда // не ошибка, идентификатор. + ШаблонУсловия = "%2.НайтиПоЗначению(%1) = Неопределено" + КонецЕсли; + ПравоеЗначение = ""; Если ЗначениеЗаполнено(ШаблонУсловия) Тогда - ПравоеЗначение = "ЗначенияПараметров[""" + ПутьКРеквизиту + """]"; + ПравоеЗначение = "Параметры.ЗначенияПараметров[""" + ПутьКРеквизиту + """]"; КонецЕсли; Если СтрокаТаблицы.Условие = "Заполнено" Тогда @@ -488,14 +523,25 @@ КонецЕсли; Если СтрокаТаблицы.ЗависимоеСвойство = "Доступен" Тогда - УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеДоступности, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия); + УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеДоступности, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия, СтрокаТаблицы.Условие); ИначеЕсли СтрокаТаблицы.ЗависимоеСвойство = "Виден" Тогда - УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеВидимости, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия); + УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеВидимости, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия, СтрокаТаблицы.Условие); Иначе - УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия); + УстановитьУсловиеЗависимости(ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия, СтрокаТаблицы.Условие); КонецЕсли; КонецЦикла; + Если ОписаниеСвойства.СтрокаСсылочногоТипа Тогда + Если ЗначениеЗаполнено(ОписаниеСвойства.Значение) Тогда + Значение = ОписаниеСвойства.ТипЗначения.ПривестиЗначение(ОписаниеСвойства.Значение); + СтрокаЗначение = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(Значение); + Иначе + Значение = НСтр("ru = 'не задано'"); + СсылкаРедактирования = "НеЗадано"; + СтрокаЗначение = Новый ФорматированнаяСтрока(Значение,, ЦветаСтиля.ЦветПустойГиперссылки,, СсылкаРедактирования); + КонецЕсли; + Форма[ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение] = СтрокаЗначение; + КонецЕсли; Форма[ОписаниеСвойства.ИмяРеквизитаЗначение] = ОписаниеСвойства.Значение; Если ОписаниеСвойства.Удалено И Форма.Свойства_СкрытьУдаленные Тогда @@ -552,7 +598,36 @@ Родитель = ЭлементРазмещения; КонецЕсли; - Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), Родитель); + Если ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда + ИмяГруппыГиперссылки = "Группа_" + ОписаниеСвойства.ИмяУникальнаяЧасть; + ГруппаГиперссылки = Форма.Элементы.Добавить(ИмяГруппыГиперссылки, Тип("ГруппаФормы"), Родитель); + ГруппаГиперссылки.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаГиперссылки.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаГиперссылки.ОтображатьЗаголовок = Ложь; + ГруппаГиперссылки.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ГруппаГиперссылки.Заголовок = ОписаниеСвойства.Наименование; + + Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), ГруппаГиперссылки); + + Если Не ПоляНадписей Тогда + ИмяКнопки = "Кнопка_" + ОписаниеСвойства.ИмяУникальнаяЧасть; + Кнопка = Форма.Элементы.Добавить( + ИмяКнопки, + Тип("КнопкаФормы"), + ГруппаГиперссылки); + + Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ИмяКоманды = "РедактироватьГиперссылкуРеквизита"; + Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.ПриАктивности; + КонецЕсли; + + Если Не ОписаниеСвойства.СтрокаСсылочногоТипа И ЗначениеЗаполнено(ОписаниеСвойства.Значение) Тогда + Элемент.Гиперссылка = Истина; + КонецЕсли; + Иначе + Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), Родитель); + КонецЕсли; + ФормаОписаниеСвойства.ЭлементФормыДобавлен = Истина; Если ОписаниеСвойства.Булево И ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда @@ -561,6 +636,10 @@ Иначе Если ПоляНадписей Тогда Элемент.Вид = ВидПоляФормы.ПолеВвода; + ИначеЕсли ОписаниеСвойства.ВыводитьВВидеГиперссылки + И (ОписаниеСвойства.СтрокаСсылочногоТипа + Или ЗначениеЗаполнено(ОписаниеСвойства.Значение))Тогда + Элемент.Вид = ВидПоляФормы.ПолеНадписи; Иначе Элемент.Вид = ВидПоляФормы.ПолеВвода; Элемент.АвтоОтметкаНезаполненного = ОписаниеСвойства.ЗаполнятьОбязательно И НЕ ОписаниеСвойства.Удалено; @@ -570,7 +649,12 @@ Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево; КонецЕсли; - Элемент.ПутьКДанным = ОписаниеСвойства.ИмяРеквизитаЗначение; + Если ОписаниеСвойства.СтрокаСсылочногоТипа Тогда + Элемент.ПутьКДанным = ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение; + Элемент.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_СвойстваВыполнитьКоманду"); + Иначе + Элемент.ПутьКДанным = ОписаниеСвойства.ИмяРеквизитаЗначение; + КонецЕсли; Элемент.Подсказка = ОписаниеСвойства.Свойство.Подсказка; Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииДополнительногоРеквизита"); @@ -589,7 +673,8 @@ Элемент.Высота = ОписаниеСвойства.Свойство.МногострочноеПолеВвода; КонецЕсли; - Если НЕ ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда + Если НЕ ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) + И Не ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда Если ПоляНадписей Тогда Элемент.Формат = ОписаниеСвойства.ФорматСвойства; Иначе @@ -661,7 +746,7 @@ КонецЦикла; КонецЕсли; - Если НЕ ПоляНадписей И ОписаниеСвойства.ДополнительноеЗначение Тогда + Если НЕ ПоляНадписей И ОписаниеСвойства.ДополнительноеЗначение И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда ПараметрыВыбора = Новый Массив; ПараметрыВыбора.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ?(ЗначениеЗаполнено(ОписаниеСвойства.ВладелецДополнительныхЗначений), @@ -673,28 +758,34 @@ // Установка видимости, доступности и обязательности заполнения дополнительных реквизитов. Для Каждого ОписаниеЗависимогоРеквизита Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл + Если ОписаниеЗависимогоРеквизита.ВыводитьВВидеГиперссылки Тогда + ОбрабатываемыйЭлемент = СтрЗаменить(ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение, "ДополнительныйРеквизитЗначение_", "Группа_"); + Иначе + ОбрабатываемыйЭлемент = ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение; + КонецЕсли; + Если ОписаниеЗависимогоРеквизита.УсловиеДоступности <> Неопределено Тогда Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеДоступности); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; Если Элемент.Доступность <> Результат Тогда Элемент.Доступность = Результат; КонецЕсли; КонецЕсли; Если ОписаниеЗависимогоРеквизита.УсловиеВидимости <> Неопределено Тогда Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеВидимости); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; Если Элемент.Видимость <> Результат Тогда Элемент.Видимость = Результат; КонецЕсли; КонецЕсли; - Если ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения <> Неопределено - И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда - Если Не ОписаниеЗависимогоРеквизита.ЗаполнятьОбязательно Тогда + Если ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения <> Неопределено Тогда + Если Не ОписаниеЗависимогоРеквизита.ЗаполнятьОбязательно + Или Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение].Вид = ВидПоляФормы.ПолеВвода Тогда Продолжить; КонецЕсли; Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; Если Элемент.АвтоОтметкаНезаполненного <> Результат Тогда Элемент.АвтоОтметкаНезаполненного = Результат; КонецЕсли; @@ -708,7 +799,9 @@ Форма.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация = Истина; // Удаление временной декорации, если она была добавлена. Если Форма.ПараметрыСвойств.Свойство("ДобавленаПустаяДекорация") Тогда - Форма.Элементы.Удалить(Форма.Элементы.Свойства_ПустаяДекорация); + Для Каждого ИмяДекорации Из Форма.ПараметрыСвойств.КоллекцияДекораций Цикл + Форма.Элементы.Удалить(Форма.Элементы[ИмяДекорации]); + КонецЦикла; Форма.ПараметрыСвойств.Удалить("ДобавленаПустаяДекорация"); КонецЕсли; КонецЕсли; @@ -737,9 +830,18 @@ УдаляемыеРеквизиты = Новый Массив; Для каждого ОписаниеСвойства Из Форма.Свойства_ОписаниеДополнительныхРеквизитов Цикл + УникальнаяЧасть = СтрЗаменить(ОписаниеСвойства.ИмяРеквизитаЗначение, "ДополнительныйРеквизитЗначение_", ""); + УдаляемыеРеквизиты.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение); + Если ОписаниеСвойства.СтрокаСсылочногоТипа Тогда + УдаляемыеРеквизиты.Добавить("СсылочныйДополнительныйРеквизитЗначение_" + УникальнаяЧасть); + КонецЕсли; Если ОписаниеСвойства.ЭлементФормыДобавлен Тогда - Форма.Элементы.Удалить(Форма.Элементы[ОписаниеСвойства.ИмяРеквизитаЗначение]); + Если ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда + Форма.Элементы.Удалить(Форма.Элементы["Группа_" + УникальнаяЧасть]); + Иначе + Форма.Элементы.Удалить(Форма.Элементы[ОписаниеСвойства.ИмяРеквизитаЗначение]); + КонецЕсли; КонецЕсли; КонецЦикла; @@ -1016,44 +1118,47 @@ КонецЕсли; КонецЦикла; - НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); - - Если ЕстьДопРеквизиты Тогда - ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка); - Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл - Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда - Продолжить; - КонецЕсли; - МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство)); - Если МассивСтрок.Количество() Тогда - СтрокаСвойства = МассивСтрок[0]; - Иначе - СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить(); - КонецЕсли; - ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение"); - КонецЦикла; - ВладелецСвойствОбъект.Записать(); - КонецЕсли; - - Если ЕстьДопСведения Тогда - Для Каждого ДопСведение Из ТаблицаДопСведений Цикл - Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда - Продолжить; - КонецЕсли; - - МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); - - МенеджерЗаписи.Объект = ВладелецСвойств; - МенеджерЗаписи.Свойство = ДопСведение.Свойство; - МенеджерЗаписи.Значение = ДопСведение.Значение; - - МенеджерЗаписи.Записать(Истина); - КонецЦикла; + НачатьТранзакцию(); + Попытка + Если ЕстьДопРеквизиты Тогда + ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка); + Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл + Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда + Продолжить; + КонецЕсли; + МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство)); + Если МассивСтрок.Количество() Тогда + СтрокаСвойства = МассивСтрок[0]; + Иначе + СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить(); + КонецЕсли; + ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение"); + КонецЦикла; + ВладелецСвойствОбъект.Записать(); + КонецЕсли; - КонецЕсли; - - ЗафиксироватьТранзакцию(); + Если ЕстьДопСведения Тогда + Для Каждого ДопСведение Из ТаблицаДопСведений Цикл + Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда + Продолжить; + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); + + МенеджерЗаписи.Объект = ВладелецСвойств; + МенеджерЗаписи.Свойство = ДопСведение.Свойство; + МенеджерЗаписи.Значение = ДопСведение.Значение; + + МенеджерЗаписи.Записать(Истина); + КонецЦикла; + + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -1184,9 +1289,11 @@ // Получает структуру параметров для набора свойств. // -// Возвращаемое значение: Структура с полями. -// * Используется - Булево - Признак использования набора свойств. -// Устанавливается в Ложь, например, если объект отключен функциональной опцией. +// Возвращаемое значение: +// Структура - со свойствами: +// * Используется - Булево - Признак использования набора свойств. +// Устанавливается в Ложь, например, если +// объект отключен функциональной опцией. // Функция СтруктураПараметровНабораСвойств() Экспорт @@ -1246,6 +1353,10 @@ "Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"), ИмяОписания)); + Реквизиты.Добавить(Новый РеквизитФормы( + "ВладелецДополнительныхЗначений", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"), + ИмяОписания)); + Реквизиты.Добавить(Новый РеквизитФормы( "ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов"), ИмяОписания)); @@ -1270,6 +1381,12 @@ Реквизиты.Добавить(Новый РеквизитФормы( "ЭлементФормыДобавлен", Новый ОписаниеТипов("Булево"), ИмяОписания)); + Реквизиты.Добавить(Новый РеквизитФормы( + "ВыводитьВВидеГиперссылки", Новый ОписаниеТипов("Булево"), ИмяОписания)); + + Реквизиты.Добавить(Новый РеквизитФормы( + "СтрокаСсылочногоТипа", Новый ОписаниеТипов("Булево"), ИмяОписания)); + // Добавление реквизита описания зависимых реквизитов. ТаблицаЗависимыхРеквизитов = "Свойства_ОписаниеЗависимыхДополнительныхРеквизитов"; @@ -1297,20 +1414,24 @@ Реквизиты.Добавить(Новый РеквизитФормы( "УсловиеОбязательностиЗаполнения", Новый ОписаниеТипов(), ТаблицаЗависимыхРеквизитов)); + Реквизиты.Добавить(Новый РеквизитФормы( + "ВыводитьВВидеГиперссылки", Новый ОписаниеТипов("Булево"), ТаблицаЗависимыхРеквизитов)); + // Добавление реквизита содержащего элементы создаваемых групп дополнительных реквизитов. Реквизиты.Добавить(Новый РеквизитФормы( "Свойства_ЭлементыГруппДополнительныхРеквизитов", Новый ОписаниеТипов("СписокЗначений"))); // Добавление реквизита с именем элемента в котором будут размещаться поля ввода. Реквизиты.Добавить(Новый РеквизитФормы( - "Свойства_ИмяЭлементаДляРазмещения", Новый ОписаниеТипов("Строка"))); + "Свойства_ИмяЭлементаДляРазмещения", Новый ОписаниеТипов())); - // Добавление команды формы, если установлена роль "ДобавлениеИзменениеДополнительныхРеквизитовИСведений" или это полноправный пользователь. + // Добавление команды формы, если установлена роль "ДобавлениеИзменениеДополнительныхРеквизитовИСведений" или это + // полноправный пользователь. Если Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхРеквизитовИСведений") Тогда // Добавление команды. Команда = Форма.Команды.Добавить("РедактироватьСоставДополнительныхРеквизитов"); Команда.Заголовок = НСтр("ru = 'Изменить состав дополнительных реквизитов'"); - Команда.Действие = "Подключаемый_РедактироватьСоставСвойств"; + Команда.Действие = "Подключаемый_СвойстваВыполнитьКоманду"; Команда.Подсказка = НСтр("ru = 'Изменить состав дополнительных реквизитов'"); Команда.Картинка = БиблиотекаКартинок.НастройкаСписка; @@ -1324,6 +1445,13 @@ Кнопка.ТолькоВоВсехДействиях = Истина; Кнопка.ИмяКоманды = "РедактироватьСоставДополнительныхРеквизитов"; КонецЕсли; + + Команда = Форма.Команды.Добавить("РедактироватьГиперссылкуРеквизита"); + Команда.Заголовок = НСтр("ru = 'Начать/закончить редактирование'"); + Команда.Действие = "Подключаемый_СвойстваВыполнитьКоманду"; + Команда.Подсказка = НСтр("ru = 'Начать/закончить редактирование'"); + Команда.Картинка = БиблиотекаКартинок.Изменить; + Команда.Отображение = ОтображениеКнопки.Картинка; КонецЕсли; КонецЕсли; @@ -1354,38 +1482,63 @@ Если ОпцияИспользоватьСвойства И ОтложеннаяИнициализация И ИмяЭлементаДляРазмещения <> "" Тогда - ГруппаФормы = Форма.Элементы[Контекст.ИмяЭлементаДляРазмещения]; - Декорация = Форма.Элементы.Добавить("Свойства_ПустаяДекорация", Тип("ДекорацияФормы"), ГруппаФормы); + Форма.ПараметрыСвойств.Вставить("КоллекцияДекораций"); + Форма.ПараметрыСвойств.КоллекцияДекораций = Новый Массив; + Форма.ПараметрыСвойств.Вставить("ДобавленаПустаяДекорация", Истина); - Если ГруппаФормы.Вид <> ВидГруппыФормы.Страница Тогда - Родитель = СтраницаРодитель(ГруппаФормы); + Если ТипЗнч(ИмяЭлементаДляРазмещения ) = Тип("СписокЗначений") Тогда + Индекс = 0; + Для Каждого ГруппаРазмещения Из ИмяЭлементаДляРазмещения Цикл + ПодготовитьФормуДляОтложеннойИнициализации(Форма, Контекст, ГруппаРазмещения.Представление, Индекс); + Индекс = Индекс + 1; + КонецЦикла; Иначе - Родитель = ГруппаФормы; + ПодготовитьФормуДляОтложеннойИнициализации(Форма, Контекст, ИмяЭлементаДляРазмещения, ""); КонецЕсли; - Если Родитель <> Неопределено Тогда - ГруппаСтраниц = Родитель.Родитель; - ЗаголовокСтраницы = ?(ЗначениеЗаполнено(Родитель.Заголовок), Родитель.Заголовок, Родитель.Имя); - ЗаголовокГруппыСтраниц = ?(ЗначениеЗаполнено(ГруппаСтраниц.Заголовок), ГруппаСтраниц.Заголовок, ГруппаСтраниц.Имя); - - ПредупреждениеОРазмещении = НСтр("ru = 'Для отображения дополнительных реквизитов необходимо разместить группу ""%1"" не первым элементом (после любой другой группы) в группе ""%2"" (меню Еще - Изменить форму).'"); - ПредупреждениеОРазмещении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредупреждениеОРазмещении, - ЗаголовокСтраницы, ЗаголовокГруппыСтраниц); - ТекстПодсказки = НСтр("ru = 'Также можно установить стандартные настройки формы: - | • в меню Еще выбрать пункт Изменить форму...; - | • в открывшейся форме ""Настройка формы"" в меню Еще выбрать пункт ""Установить стандартные настройки"".'"); - - Декорация.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; - Декорация.Заголовок = ПредупреждениеОРазмещении; - Декорация.Подсказка = ТекстПодсказки; - Декорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст; - КонецЕсли; - - ГруппаФормы.РазрешитьИзменениеСостава = Ложь; КонецЕсли; КонецПроцедуры +Процедура ПодготовитьФормуДляОтложеннойИнициализации(Форма, Контекст, ИмяЭлементаДляРазмещения, Индекс) + + ГруппаФормы = Форма.Элементы[ИмяЭлементаДляРазмещения]; + Если ГруппаФормы.Вид <> ВидГруппыФормы.Страница Тогда + Родитель = СтраницаРодитель(ГруппаФормы); + Иначе + Родитель = ГруппаФормы; + КонецЕсли; + + Если Родитель <> Неопределено + И Не Форма.ПараметрыСвойств.Свойство(Родитель.Имя) Тогда + ИмяДекорации = "Свойства_ПустаяДекорация" + Индекс; + Форма.ПараметрыСвойств.КоллекцияДекораций.Добавить(ИмяДекорации); + Декорация = Форма.Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"), ГруппаФормы); + + ГруппаСтраниц = Родитель.Родитель; + ЗаголовокСтраницы = ?(ЗначениеЗаполнено(Родитель.Заголовок), Родитель.Заголовок, Родитель.Имя); + ЗаголовокГруппыСтраниц = ?(ЗначениеЗаполнено(ГруппаСтраниц.Заголовок), ГруппаСтраниц.Заголовок, ГруппаСтраниц.Имя); + + ПредупреждениеОРазмещении = НСтр("ru = 'Для отображения дополнительных реквизитов необходимо разместить группу ""%1"" не первым элементом (после любой другой группы) в группе ""%2"" (меню Еще - Изменить форму).'"); + ПредупреждениеОРазмещении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредупреждениеОРазмещении, + ЗаголовокСтраницы, ЗаголовокГруппыСтраниц); + ТекстПодсказки = НСтр("ru = 'Также можно установить стандартные настройки формы: + | • в меню Еще выбрать пункт Изменить форму...; + | • в открывшейся форме ""Настройка формы"" в меню Еще выбрать пункт ""Установить стандартные настройки"".'"); + + Декорация.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + Декорация.Заголовок = ПредупреждениеОРазмещении; + Декорация.Подсказка = ТекстПодсказки; + Декорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст; + + // Страница, на которой размещаются дополнительные реквизиты. + Форма.ПараметрыСвойств.Вставить(Родитель.Имя); + КонецЕсли; + + ГруппаФормы.РазрешитьИзменениеСостава = Ложь; + +КонецПроцедуры + Функция СтраницаРодитель(ГруппаФормы) Родитель = ГруппаФормы.Родитель; @@ -1402,13 +1555,23 @@ КонецФункции -Процедура УстановитьУсловиеЗависимости(СтруктураЗависимостей, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия) +Процедура УстановитьУсловиеЗависимости(СтруктураЗависимостей, ПутьКРеквизиту, СтрокаТаблицы, КодУсловия, Условие) Если СтруктураЗависимостей = Неопределено Тогда ЗначенияПараметров = Новый Соответствие; - ЗначенияПараметров.Вставить(ПутьКРеквизиту, СтрокаТаблицы.Значение); + Если Условие = "В списке" + Или Условие = "Не в списке" Тогда + Значение = Новый СписокЗначений; + Значение.Добавить(СтрокаТаблицы.Значение); + Иначе + Значение = СтрокаТаблицы.Значение; + КонецЕсли; + ЗначенияПараметров.Вставить(ПутьКРеквизиту, Значение); СтруктураЗависимостей = Новый Структура; СтруктураЗависимостей.Вставить("КодУсловия", КодУсловия); СтруктураЗависимостей.Вставить("ЗначенияПараметров", ЗначенияПараметров); + ИначеЕсли (Условие = "В списке" Или Условие = "Не в списке") + И ТипЗнч(СтруктураЗависимостей.ЗначенияПараметров[ПутьКРеквизиту]) = Тип("СписокЗначений") Тогда + СтруктураЗависимостей.ЗначенияПараметров[ПутьКРеквизиту].Добавить(СтрокаТаблицы.Значение); Иначе СтруктураЗависимостей.КодУсловия = СтруктураЗависимостей.КодУсловия + " И " + КодУсловия; СтруктураЗависимостей.ЗначенияПараметров.Вставить(ПутьКРеквизиту, СтрокаТаблицы.Значение); @@ -1445,11 +1608,12 @@ КонецПроцедуры Функция РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, Параметры) - Результат = Неопределено; - ЗначенияПараметров = Параметры.ЗначенияПараметров; - Выполнить("Результат = " + Параметры.КодУсловия); + ПараметрыУсловия = Новый Структура; + ПараметрыУсловия.Вставить("ЗначенияПараметров", Параметры.ЗначенияПараметров); + ПараметрыУсловия.Вставить("Форма", Форма); + ПараметрыУсловия.Вставить("ОписаниеОбъекта", ОписаниеОбъекта); - Возврат Результат; + Возврат ОбщегоНазначения.ВычислитьВБезопасномРежиме(Параметры.КодУсловия, ПараметрыУсловия); КонецФункции Функция НовыйКлючНазначения(ТекущийКлюч, НачалоКлюча, КлючНаборовСвойств) @@ -1485,10 +1649,7 @@ СтрокаИдентификаторов = СтрокаИдентификаторов + СтрЗаменить(ЭлементСписка.Значение, "-", ""); КонецЦикла; - ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); - ХешированиеДанных.Добавить(СтрокаИдентификаторов); - - Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + Возврат ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтрокаИдентификаторов); КонецФункции @@ -1500,13 +1661,20 @@ КонецЕсли; Если ДополнительныеПараметры <> Неопределено - И ДополнительныеПараметры.Свойство("Объект") Тогда - ТипОбъекта = ТипЗнч(ДополнительныеПараметры.Объект.Ссылка); - ПолноеИмя = Метаданные.НайтиПоТипу(ТипОбъекта).ПолноеИмя(); - Иначе - ПолноеИмя = Форма.ИмяФормы; + И ДополнительныеПараметры.Свойство("ПроизвольныйОбъект") + И ДополнительныеПараметры.ПроизвольныйОбъект Тогда + Возврат Истина; КонецЕсли; + Если ДополнительныеПараметры <> Неопределено + И ДополнительныеПараметры.Свойство("Объект") Тогда + ОписаниеОбъекта = ДополнительныеПараметры.Объект; + Иначе + ОписаниеОбъекта = Форма.Объект; + КонецЕсли; + ТипОбъекта = ТипЗнч(ОписаниеОбъекта.Ссылка); + ПолноеИмя = Метаданные.НайтиПоТипу(ТипОбъекта).ПолноеИмя(); + МассивИмениФормы = СтрРазделить(ПолноеИмя, "."); ИмяЭлемента = МассивИмениФормы[0] + "_" + МассивИмениФормы[1]; @@ -1530,7 +1698,13 @@ Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда Если ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения") Тогда - Форма.Элементы[ДополнительныеПараметры.ИмяЭлементаДляРазмещения].Видимость = Ложь; + Если ТипЗнч(ДополнительныеПараметры.ИмяЭлементаДляРазмещения) = Тип("СписокЗначений") Тогда + Для Каждого ЭлементСписка Из ДополнительныеПараметры.ИмяЭлементаДляРазмещения Цикл + Форма.Элементы[ЭлементСписка.Представление].Видимость = Ложь; + КонецЦикла; + Иначе + Форма.Элементы[ДополнительныеПараметры.ИмяЭлементаДляРазмещения].Видимость = Ложь; + КонецЕсли; КонецЕсли; Если ДополнительныеПараметры.Свойство("ОтложеннаяИнициализация") Тогда @@ -1538,7 +1712,6 @@ МассивРеквизитов.Добавить(РеквизитПараметрыСвойств); ПараметрыСвойствДобавлены = Истина; КонецЕсли; - КонецЕсли; Форма.ИзменитьРеквизиты(МассивРеквизитов); diff --git a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl index 9a6de9aec..1698a3149 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl @@ -1,17 +1,182 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Свойства" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +// Определяет, что указанное событие - это событие об изменении набора свойств. +// +// Параметры: +// Форма - УправляемаяФорма - форма, в которой была вызвана обработка оповещения. +// ИмяСобытия - Строка - имя обрабатываемого события. +// Параметр - Произвольный - параметры, переданные в событии. +// +// Возвращаемое значение: +// Булево - если Истина, тогда это оповещение об изменении набора свойств и +// его нужно обработать в форме. +// +Функция ОбрабатыватьОповещения(Форма, ИмяСобытия, Параметр) Экспорт + + Если НЕ Форма.Свойства_ИспользоватьСвойства + ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда + + Возврат Ложь; + КонецЕсли; + + Если ИмяСобытия = "Запись_НаборыДополнительныхРеквизитовИСведений" Тогда + Если Не Параметр.Свойство("Ссылка") Тогда + Возврат Истина; + Иначе + Возврат Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта.НайтиПоЗначению(Параметр.Ссылка) <> Неопределено; + КонецЕсли; + + ИначеЕсли ИмяСобытия = "Запись_ДополнительныеРеквизитыИСведения" Тогда + + Если Форма.ПараметрыСвойств.Свойство("ВыполненаОтложеннаяИнициализация") + И Не Форма.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация + Или Не Параметр.Свойство("Ссылка") Тогда + Возврат Истина; + Иначе + Отбор = Новый Структура("Свойство", Параметр.Ссылка); + Возврат Форма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор).Количество() > 0; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Обновляет видимость, доступность и обязательность заполнения +// дополнительных реквизитов. +// +// Параметры: +// Форма - УправляемаяФорма - обрабатываемая форма. +// Объект - ДанныеФормыСтруктура - описание объекта, к которому подключены свойства, +// если свойство не указано или Неопределено, то будет +// объект будет взят из реквизита формы "Объект". +// +Процедура ОбновитьЗависимостиДополнительныхРеквизитов(Форма, Объект = Неопределено) Экспорт + + Если НЕ Форма.Свойства_ИспользоватьСвойства + ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда + + Возврат; + КонецЕсли; + + Если Объект = Неопределено Тогда + ОписаниеОбъекта = Форма.Объект; + Иначе + ОписаниеОбъекта = Объект; + КонецЕсли; + + Для Каждого ОписаниеЗависимогоРеквизита Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл + Если ОписаниеЗависимогоРеквизита.ВыводитьВВидеГиперссылки Тогда + ОбрабатываемыйЭлемент = СтрЗаменить(ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение, "ДополнительныйРеквизитЗначение_", "Группа_"); + Иначе + ОбрабатываемыйЭлемент = ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение; + КонецЕсли; + + Если ОписаниеЗависимогоРеквизита.УсловиеДоступности <> Неопределено Тогда + Параметры = Новый Структура; + Параметры.Вставить("ЗначенияПараметров", ОписаниеЗависимогоРеквизита.УсловиеДоступности.ЗначенияПараметров); + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ОписаниеОбъекта", ОписаниеОбъекта); + Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеДоступности.КодУсловия); + + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; + Если Элемент.Доступность <> Результат Тогда + Элемент.Доступность = Результат; + КонецЕсли; + КонецЕсли; + Если ОписаниеЗависимогоРеквизита.УсловиеВидимости <> Неопределено Тогда + Параметры = Новый Структура; + Параметры.Вставить("ЗначенияПараметров", ОписаниеЗависимогоРеквизита.УсловиеВидимости.ЗначенияПараметров); + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ОписаниеОбъекта", ОписаниеОбъекта); + Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеВидимости.КодУсловия); + + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; + Если Элемент.Видимость <> Результат Тогда + Элемент.Видимость = Результат; + КонецЕсли; + КонецЕсли; + Если ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения <> Неопределено Тогда + Если Не ОписаниеЗависимогоРеквизита.ЗаполнятьОбязательно Тогда + Продолжить; + КонецЕсли; + + Параметры = Новый Структура; + Параметры.Вставить("ЗначенияПараметров", ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения.ЗначенияПараметров); + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ОписаниеОбъекта", ОписаниеОбъекта); + Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения.КодУсловия); + + Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; + Если Элемент.АвтоОтметкаНезаполненного <> Результат Тогда + Элемент.АвтоОтметкаНезаполненного = Результат; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Проверяет наличие зависимых дополнительных реквизитов на форме +// и, при необходимости, подключает обработчик ожидания проверки зависимостей реквизитов. +// +// Параметры: +// Форма - УправляемаяФорма - проверяемая форма. +// +Процедура ПослеЗагрузкиДополнительныхРеквизитов(Форма) Экспорт + + Если НЕ Форма.Свойства_ИспользоватьСвойства + Или НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда + + Возврат; + КонецЕсли; + + Если Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов.Количество() > 0 Тогда + Форма.ПодключитьОбработчикОжидания("ОбновитьЗависимостиДополнительныхРеквизитов", 2); + КонецЕсли; + +КонецПроцедуры + +// Обработчик команд с форм, к которым подключены дополнительные свойства. +// +// Параметры: +// Форма - УправляемаяФорма - форма с дополнительными реквизитами, предварительно +// настроенная в процедуре УправлениеСвойствами.ПриСозданииНаСервере(). +// Элемент - ПолеФормы, КомандаФормы - элемент, нажатие которого необходимо обработать. +// СтандартнаяОбработка - Булево - возвращаемый параметр, если необходимо выполнить интерактивные +// действия с пользователем, то устанавливается в значение Ложь. +// +Процедура ВыполнитьКоманду(Форма, Элемент = Неопределено, СтандартнаяОбработка = Неопределено) Экспорт + + Если Элемент = Неопределено Тогда + ИмяКоманды = "РедактироватьСоставДополнительныхРеквизитов"; + ИначеЕсли ТипЗнч(Элемент) = Тип("КомандаФормы") Тогда + ИмяКоманды = Элемент.Имя; + Иначе + ЗначениеРеквизита = Форма[Элемент.Имя]; + Если Не ЗначениеЗаполнено(ЗначениеРеквизита) Тогда + РедактироватьГиперссылкуРеквизита(Форма, Истина, Элемент); + СтандартнаяОбработка = Ложь; + КонецЕсли; + Возврат; + КонецЕсли; + + Если ИмяКоманды = "РедактироватьСоставДополнительныхРеквизитов" Тогда + РедактироватьСоставСвойств(Форма); + ИначеЕсли ИмяКоманды = "РедактироватьГиперссылкуРеквизита" Тогда + РедактироватьГиперссылкуРеквизита(Форма); + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Открывает форму редактирования набора дополнительных реквизитов. // // Параметры: -// Форма - УправляемаяФорма, предварительно настроенная в процедуре. -// УправлениеСвойствами.ПриСозданииНаСервере(). +// Форма - УправляемаяФорма - форма, из которой осуществляется вызов метода. // -Процедура РедактироватьСоставСвойств(Форма, Ссылка = Неопределено) Экспорт +Процедура РедактироватьСоставСвойств(Форма) Наборы = Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта; @@ -55,114 +220,73 @@ КонецПроцедуры -// Определяет, что указанное событие - это событие об изменении набора свойств. -// -// Возвращаемое значение: -// Булево - если Истина, тогда это оповещение об изменении набора свойств и -// его нужно обработать в форме. -// -Функция ОбрабатыватьОповещения(Форма, ИмяСобытия, Параметр) Экспорт - - Если НЕ Форма.Свойства_ИспользоватьСвойства - ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда - - Возврат Ложь; - КонецЕсли; - - Если ИмяСобытия = "Запись_НаборыДополнительныхРеквизитовИСведений" Тогда - Если Не Параметр.Свойство("Ссылка") Тогда - Возврат Истина; - Иначе - Возврат Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта.НайтиПоЗначению(Параметр.Ссылка) <> Неопределено; - КонецЕсли; - - ИначеЕсли ИмяСобытия = "Запись_ДополнительныеРеквизитыИСведения" Тогда - - Если Форма.ПараметрыСвойств.Свойство("ВыполненаОтложеннаяИнициализация") - И Не Форма.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация - Или Не Параметр.Свойство("Ссылка") Тогда - Возврат Истина; - Иначе - Отбор = Новый Структура("Свойство", Параметр.Ссылка); - Возврат Форма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор).Количество() > 0; - КонецЕсли; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Обновляет видимость, доступность и обязательность заполнения -// дополнительных реквизитов. -// -// Параметры: -// УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере. -// -Процедура ОбновитьЗависимостиДополнительныхРеквизитов(Форма, Объект = Неопределено) Экспорт - - Если НЕ Форма.Свойства_ИспользоватьСвойства - ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда - - Возврат; - КонецЕсли; - - Если Объект = Неопределено Тогда - ОписаниеОбъекта = Форма.Объект; +Процедура РедактироватьГиперссылкуРеквизита(Форма, ПереходПоГиперссылке = Ложь, Элемент = Неопределено) + Если Не ПереходПоГиперссылке Тогда + ИмяКнопки = Форма.ТекущийЭлемент.Имя; + УникальнаяЧасть = СтрЗаменить(ИмяКнопки, "Кнопка_", ""); + ИмяРеквизита = "ДополнительныйРеквизитЗначение_" + УникальнаяЧасть; Иначе - ОписаниеОбъекта = Объект; + ИмяРеквизита = Элемент.Имя; + УникальнаяЧасть = СтрЗаменить(ИмяРеквизита, "ДополнительныйРеквизитЗначение_", ""); КонецЕсли; - Для Каждого ОписаниеЗависимогоРеквизита Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл - Если ОписаниеЗависимогоРеквизита.УсловиеДоступности <> Неопределено Тогда - ЗначенияПараметров = ОписаниеЗависимогоРеквизита.УсловиеДоступности.ЗначенияПараметров; - Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеДоступности.КодУсловия); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; - Если Элемент.Доступность <> Результат Тогда - Элемент.Доступность = Результат; - КонецЕсли; - КонецЕсли; - Если ОписаниеЗависимогоРеквизита.УсловиеВидимости <> Неопределено Тогда - ЗначенияПараметров = ОписаниеЗависимогоРеквизита.УсловиеВидимости.ЗначенияПараметров; - Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеВидимости.КодУсловия); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; - Если Элемент.Видимость <> Результат Тогда - Элемент.Видимость = Результат; - КонецЕсли; - КонецЕсли; - Если ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения <> Неопределено Тогда - Если Не ОписаниеЗависимогоРеквизита.ЗаполнятьОбязательно Тогда - Продолжить; - КонецЕсли; - ЗначенияПараметров = ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения.ЗначенияПараметров; - Результат = Вычислить(ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения.КодУсловия); - Элемент = Форма.Элементы[ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение]; - Если Элемент.АвтоОтметкаНезаполненного <> Результат Тогда - Элемент.АвтоОтметкаНезаполненного = Результат; - КонецЕсли; - КонецЕсли; - КонецЦикла; + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("ИмяРеквизитаЗначение", ИмяРеквизита); -КонецПроцедуры - -// Проверяет наличие зависимых дополнительных реквизитов на форме -// и, при необходимости, подключает обработчик ожидания проверки зависимостей реквизитов. -// -// Параметры: -// УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере. -// -Процедура ПослеЗагрузкиДополнительныхРеквизитов(Форма) Экспорт + ОписаниеРеквизитов = Форма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(ПараметрыОтбора); + Если ОписаниеРеквизитов.Количество() <> 1 Тогда + Возврат; + КонецЕсли; + ОписаниеРеквизита = ОписаниеРеквизитов[0]; - Если НЕ Форма.Свойства_ИспользоватьСвойства - Или НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда + Если Не ОписаниеРеквизита.СтрокаСсылочногоТипа Тогда + Если Форма.Элементы[ИмяРеквизита].Вид = ВидПоляФормы.ПолеВвода Тогда + Форма.Элементы[ИмяРеквизита].Вид = ВидПоляФормы.ПолеНадписи; + Форма.Элементы[ИмяРеквизита].Гиперссылка = Истина; + Иначе + Форма.Элементы[ИмяРеквизита].Вид = ВидПоляФормы.ПолеВвода; + Если ОписаниеРеквизита.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) + ИЛИ ОписаниеРеквизита.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектовИерархия")) Тогда + ПараметрВыбора = ?(ЗначениеЗаполнено(ОписаниеРеквизита.ВладелецДополнительныхЗначений), + ОписаниеРеквизита.ВладелецДополнительныхЗначений, ОписаниеРеквизита.Свойство); + ПараметрыВыбораМассив = Новый Массив; + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ПараметрВыбора)); + + Форма.Элементы[ИмяРеквизита].ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); + КонецЕсли; + КонецЕсли; Возврат; КонецЕсли; - Если Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов.Количество() > 0 Тогда - Форма.ПодключитьОбработчикОжидания("ОбновитьЗависимостиДополнительныхРеквизитов", 2); + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ИмяРеквизита", ИмяРеквизита); + ПараметрыОткрытия.Вставить("ТипЗначения", ОписаниеРеквизита.ТипЗначения); + ПараметрыОткрытия.Вставить("НаименованиеРеквизита", ОписаниеРеквизита.Наименование); + ПараметрыОткрытия.Вставить("СтрокаСсылочногоТипа", ОписаниеРеквизита.СтрокаСсылочногоТипа); + ПараметрыОткрытия.Вставить("ЗначениеРеквизита", Форма[ИмяРеквизита]); + ПараметрыОткрытия.Вставить("ТолькоПросмотр", Форма.ТолькоПросмотр); + Если ОписаниеРеквизита.СтрокаСсылочногоТипа Тогда + ПараметрыОткрытия.Вставить("ИмяРеквизитаСсылки", "СсылочныйДополнительныйРеквизитЗначение_" + УникальнаяЧасть); + Иначе + ПараметрыОткрытия.Вставить("Свойство", ОписаниеРеквизита.Свойство); + ПараметрыОткрытия.Вставить("ВладелецДополнительныхЗначений", ОписаниеРеквизита.ВладелецДополнительныхЗначений); КонецЕсли; - + ОписаниеОповещения = Новый ОписаниеОповещения("РедактироватьГиперссылкуРеквизитаЗавершение", УправлениеСвойствамиКлиент, Форма); + ОткрытьФорму("ОбщаяФорма.РедактированиеГиперссылки", ПараметрыОткрытия,,,,, ОписаниеОповещения); КонецПроцедуры -#КонецОбласти +Процедура РедактироватьГиперссылкуРеквизитаЗавершение(Результат, ДополнительныеПараметры) Экспорт + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Форма = ДополнительныеПараметры; + Форма[Результат.ИмяРеквизита] = Результат.Значение; + Если Результат.СтрокаСсылочногоТипа Тогда + Форма[Результат.ИмяРеквизитаСсылки] = Результат.ФорматированнаяСтрока; + КонецЕсли; + Форма.Модифицированность = Истина; +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl index 7659872d4..d7c1246b3 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl @@ -1,22 +1,18 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Свойства" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Заполняет наборы свойств объекта. Обычно требуется, если наборов более одного. // // Параметры: -// Объект - Ссылка на владельца свойств. -// Объект владельца свойств. -// ДанныеФормыСтруктура (по типу объекта владельца свойств). +// Объект - ЛюбаяСсылка - Ссылка на объект со свойствами. +// - УправляемаяФорма - Форма объекта, к которому подключены свойства. +// - ДанныеФормыСтруктура - Описание объекта, к которому подключены свойства. // // ТипСсылки - Тип - тип ссылки владельца свойств. // -// НаборыСвойств - ТаблицаЗначений с колонками: +// НаборыСвойств - ТаблицаЗначений - с колонками: // Набор - СправочникСсылка.НаборыДополнительныхРеквизитовИСведений. -// +// ОбщийНабор - Булево - Истина, если набор свойств содержит свойства, +// общие для всех объектов. // // Далее свойства элемента формы типа ГруппаФормы вида обычная группа // // или страница, которая создается, если наборов больше одного без учета // // пустого набора, который описывает свойства группы удаленных реквизитов. diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl index 83f4478c2..20dc62b4d 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl @@ -1,85 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Свойства" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "УправлениеСвойствамиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( - "УправлениеСвойствамиСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( - "УправлениеСвойствамиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"].Добавить( - "УправлениеСвойствамиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( - "УправлениеСвойствамиСлужебный"); - КонецЕсли; - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ОбщиеДанные = Истина; - Обработчик.УправлениеОбработчиками = Истина; - Обработчик.Версия = "*"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьОбработчикиРазделенныхДанных"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "УправлениеСвойствами.ОбновитьНаименованияНаборовИСвойств"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.0.6.7"; - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ОбновитьСписокДополнительныхСвойств_1_0_6"; - - Обработчик = Обработчики.Добавить(); - Обработчик.ВыполнятьВГруппеОбязательных = Истина; - Обработчик.Версия = "2.1.5.3"; - Обработчик.Приоритет = 1; - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьНовыеДанные_2_1_5"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.5.18"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("b3885620-c224-49f1-bda0-4510c7c18584"); - Обработчик.Комментарий = НСтр("ru = 'Реструктуризация дополнительных реквизитов и сведений. - |Возможна некорректная работа отборов по дополнительным реквизитам и сведениям в списках.'"); - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ОбновитьСоставСвойствВсехГруппНаборов"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.1.14"; - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьНовыеСвойстваДополнительныхРеквизитовИСведений"; - Обработчик.РежимВыполнения = "Монопольно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.1.21"; - Обработчик.Процедура = "УправлениеСвойствамиСлужебный.УстановитьЗначениеПризнакаИспользуется"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.НачальноеЗаполнение = Истина; - -КонецПроцедуры - // Возвращает список всех свойств для объекта метаданных. // // Параметры: @@ -212,30 +132,61 @@ КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность редактирования реквизитов -// с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Запрет редактирования реквизитов объектов". -// В качестве значения - пустую строку. -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.ОбщиеДанные = Истина; + Обработчик.УправлениеОбработчиками = Истина; + Обработчик.Версия = "*"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьОбработчикиРазделенныхДанных"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "УправлениеСвойствами.ОбновитьНаименованияНаборовИСвойств"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.7"; + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ОбновитьСписокДополнительныхСвойств_1_0_6"; + + Обработчик = Обработчики.Добавить(); + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Версия = "2.1.5.3"; + Обработчик.Приоритет = 1; + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьНовыеДанные_2_1_5"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.5.18"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("b3885620-c224-49f1-bda0-4510c7c18584"); + Обработчик.Комментарий = НСтр("ru = 'Реструктуризация дополнительных реквизитов и сведений. + |Возможна некорректная работа отборов по дополнительным реквизитам и сведениям в списках.'"); + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ОбновитьСоставСвойствВсехГруппНаборов"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.1.14"; + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.ЗаполнитьНовыеСвойстваДополнительныхРеквизитовИСведений"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.1.21"; + Обработчик.Процедура = "УправлениеСвойствамиСлужебный.УстановитьЗначениеПризнакаИспользуется"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.НачальноеЗаполнение = Истина; + +КонецПроцедуры + +// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), ""); КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); Объекты.Вставить(Метаданные.Справочники.ЗначенияСвойствОбъектов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); @@ -243,8 +194,7 @@ Объекты.Вставить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Дополняет объект реквизитами, хранящимися отдельно от объекта, либо в служебной части самого объекта, -// не предназначенной для вывода в отчетах. +// См. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта. Процедура ПриПодготовкеДанныхОбъекта(Объект, ДополнительныеРеквизиты) Экспорт Если УправлениеСвойствами.ИспользоватьДопРеквизиты(Объект.Ссылка) Тогда @@ -285,11 +235,63 @@ КонецПроцедуры +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт + + Массив.Добавить(Метаданные.РегистрыСведений.ДополнительныеСведения.ПолноеИмя()); + Массив.Добавить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя()); + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт + + ВидДоступа = ВидыДоступа.Добавить(); + ВидДоступа.Имя = "ДополнительныеСведения"; + ВидДоступа.Представление = НСтр("ru = 'Дополнительные сведения'"); + ВидДоступа.ТипЗначений = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"); + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа. +Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ВидДоступа = "ДополнительныеСведения" Тогда + Использование = Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить(); + КонецЕсли; + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. +Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("ДополнительныеСведения") Тогда + + Описание = Описание + " + | + |Справочник.ЗначенияСвойствОбъектов.Чтение.ДополнительныеСведения + |Справочник.ЗначенияСвойствОбъектовИерархия.Чтение.ДополнительныеСведения + |ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Чтение.ДополнительныеСведения + |РегистрСведений.ДополнительныеСведения.Чтение.ДополнительныеСведения + |РегистрСведений.ДополнительныеСведения.Изменение.ДополнительныеСведения + |"; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -// См. одноименную процедуру в общем модуле УправлениеСвойствами. +// См. УправлениеСвойствами.ПеренестиЗначенияИзРеквизитовФормыВОбъект. Процедура ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект = Неопределено, ПередЗаписью = Ложь) Экспорт Приемник = Новый Структура; @@ -338,15 +340,24 @@ Продолжить; КонецЕсли; + // Поддержка строк гиперссылок. + ИспользоватьСтрокуВВидеСсылки = ИспользоватьСтрокуВВидеСсылки( + Строка.ТипЗначения, Строка.ВыводитьВВидеГиперссылки, Строка.МногострочноеПолеВвода); + НоваяСтрока = ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(); НоваяСтрока.Свойство = Строка.Свойство; - НоваяСтрока.Значение = Значение; + Если ИспользоватьСтрокуВВидеСсылки Тогда + АдресИПредставление = АдресИПредставление(Значение); + НоваяСтрока.Значение = АдресИПредставление.Представление; + Иначе + НоваяСтрока.Значение = Значение; + КонецЕсли; // Поддержка строк неограниченной длины. ИспользоватьНеограниченнуюСтроку = ИспользоватьНеограниченнуюСтроку( Строка.ТипЗначения, Строка.МногострочноеПолеВвода); - Если ИспользоватьНеограниченнуюСтроку Тогда + Если ИспользоватьНеограниченнуюСтроку Или ИспользоватьСтрокуВВидеСсылки Тогда НоваяСтрока.ТекстоваяСтрока = Значение; КонецЕсли; КонецЦикла; @@ -392,6 +403,7 @@ НаборыСвойств.Колонки.Добавить("Отображение"); НаборыСвойств.Колонки.Добавить("Картинка"); НаборыСвойств.Колонки.Добавить("ОтображатьЗаголовок"); + НаборыСвойств.Колонки.Добавить("ОбщийНабор", Новый ОписаниеТипов("Булево")); // Устарело: НаборыСвойств.Колонки.Добавить("ШиринаПодчиненныхЭлементов"); @@ -532,6 +544,7 @@ | ВсеСвойства.Удалено КАК Удалено, | ДополнительныеРеквизитыИСведения.Доступен, | ДополнительныеРеквизитыИСведения.Виден, + | ДополнительныеРеквизитыИСведения.ВыводитьВВидеГиперссылки, | ДополнительныеРеквизитыИСведения.ЗависимостиДополнительныхРеквизитов.( | ЗависимоеСвойство, | Реквизит, @@ -581,9 +594,14 @@ Если ОписаниеСвойства <> Неопределено Тогда // Поддержка строк неограниченной длины. Если НЕ ЭтоДополнительноеСведение - И ИспользоватьНеограниченнуюСтроку( - ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) - И НЕ ПустаяСтрока(Строка.ТекстоваяСтрока) Тогда + И (ИспользоватьНеограниченнуюСтроку( + ОписаниеСвойства.ТипЗначения, + ОписаниеСвойства.МногострочноеПолеВвода) + Или ИспользоватьСтрокуВВидеСсылки( + ОписаниеСвойства.ТипЗначения, + ОписаниеСвойства.ВыводитьВВидеГиперссылки, + ОписаниеСвойства.МногострочноеПолеВвода)) + И НЕ ПустаяСтрока(Строка.ТекстоваяСтрока) Тогда ОписаниеСвойства.Значение = Строка.ТекстоваяСтрока; Иначе @@ -652,7 +670,7 @@ СсылкаПредопределенного = СвойстваСсылки.Родитель; КонецЕсли; - ИмяПредопределенного = ОбщегоНазначения.ИмяПредопределенного(СсылкаПредопределенного); + ИмяПредопределенного = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаПредопределенного, "ИмяПредопределенныхДанных"); Позиция = СтрНайти(ИмяПредопределенного, "_"); @@ -721,6 +739,80 @@ КонецФункции +Функция ИспользоватьСтрокуВВидеСсылки(ТипЗначенияСвойства, ВыводитьВВидеГиперссылки, МногострочноеПолеВвода) + СписокТипов = ТипЗначенияСвойства.Типы(); + + Если Не ИспользоватьНеограниченнуюСтроку(ТипЗначенияСвойства, МногострочноеПолеВвода) + И СписокТипов.Количество() = 1 + И СписокТипов[0] = Тип("Строка") + И ВыводитьВВидеГиперссылки Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +Функция АдресИПредставление(Строка) Экспорт + + Результат = Новый Структура; + НачалоВыделения = СтрНайти(Строка, ""); + + Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2)); + Если СтрНачинаетсяС(Ссылка, """") Тогда + Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1); + КонецЕсли; + Если СтрЗаканчиваетсяНа(Ссылка, """") Тогда + Ссылка = Сред(Ссылка, 1, СтрДлина(Ссылка) - 1); + КонецЕсли; + + СтрокаПослеСсылки = Сред(СтрокаПослеОткрывающегоТега, ЗакрывающийТег + 1); + КонецВыделения = СтрНайти(СтрокаПослеСсылки, ""); + ТекстСсылки = Лев(СтрокаПослеСсылки, КонецВыделения - 1); + Результат.Вставить("Представление", ТекстСсылки); + Результат.Вставить("Ссылка", Ссылка); + + Возврат Результат; + +КонецФункции + +// Обработчик события СвойстваПередУдалениемСсылочногоОбъекта. +// Выполняет поиск ссылок на удаляемые объекты в таблице зависимостей дополнительных реквизитов. +// +Процедура ПередУдалениемСсылочногоОбъекта(Объект, Отказ) Экспорт + Если Объект.ОбменДанными.Загрузка = Истина + Или Отказ Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Зависимости.Ссылка КАК Ссылка + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ЗависимостиДополнительныхРеквизитов КАК Зависимости + |ГДЕ + | Зависимости.Значение = &Значение + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + Запрос.УстановитьПараметр("Значение", Объект.Ссылка); + Результат = Запрос.Выполнить().Выгрузить(); + + Для Каждого Строка Из Результат Цикл + РеквизитОбъект = Строка.Ссылка.ПолучитьОбъект(); + ПараметрыОтбора = Новый Структура("Значение", Объект.Ссылка); + НайденныеСтроки = РеквизитОбъект.ЗависимостиДополнительныхРеквизитов.НайтиСтроки(ПараметрыОтбора); + Для Каждого Зависимость Из НайденныеСтроки Цикл + РеквизитОбъект.ЗависимостиДополнительныхРеквизитов.Удалить(Зависимость); + КонецЦикла; + РеквизитОбъект.Записать(); + КонецЦикла; +КонецПроцедуры + // Проверяет наличие объектов, использующих свойство. // // Параметры: @@ -832,7 +924,7 @@ Если ТипЗнч(Набор) = Тип("Строка") Тогда ИмяПредопределенного = Набор; Иначе - ИмяПредопределенного = ОбщегоНазначения.ИмяПредопределенного(Набор); + ИмяПредопределенного = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Набор, "ИмяПредопределенныхДанных"); КонецЕсли; Позиция = СтрНайти(ИмяПредопределенного, "_"); @@ -946,121 +1038,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП. - -// Заполняет массив списком имен объектов метаданных, данные которых могут -// содержать ссылки на различные объекты метаданных, -// но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - массив строк, например, Метаданные.РегистрыСведений.ВерсииОбъектов.ПолноеИмя(). -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт - - Массив.Добавить(Метаданные.РегистрыСведений.ДополнительныеСведения.ПолноеИмя()); - Массив.Добавить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя()); - -КонецПроцедуры - -// Заполняет виды доступа, используемые в ограничениях прав доступа. -// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. -// Их можно удалить, если они не требуются для ограничения прав доступа. -// -// Параметры: -// ВидыДоступа - ТаблицаЗначений - с колонками: -// * Имя - Строка - имя используемое в описании поставляемых -// профилей групп доступа и текстах ОДД. -// * Представление - Строка - представляет вид доступа в профилях и группах доступа. -// * ТипЗначений - Тип - тип ссылки значений доступа. -// Например, Тип("СправочникСсылка.Номенклатура"). -// * ТипГруппЗначений - Тип - тип ссылки групп значений доступа. -// Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). -// * НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), можно -// выбрать несколько групп значений (Групп доступа номенклатуры). -// -Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт - - ВидДоступа = ВидыДоступа.Добавить(); - ВидДоступа.Имя = "ДополнительныеСведения"; - ВидДоступа.Представление = НСтр("ru = 'Дополнительные сведения'"); - ВидДоступа.ТипЗначений = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"); - -КонецПроцедуры - -// Заполняет использование видов доступа в зависимости от функциональных опций конфигурации, -// например, ИспользоватьГруппыДоступаНоменклатуры. -// -// Параметры: -// ВидДоступа - Строка - имя вида доступа заданное в процедуре ПриЗаполненииВидовДоступа. -// Использование - Булево - начальное значение Истина. -// -Процедура ПриЗаполненииИспользованияВидаДоступа(ИмяВидаДоступа, Использование) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ИмяВидаДоступа = "ДополнительныеСведения" Тогда - Использование = Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить(); - КонецЕсли; - -КонецПроцедуры - -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы. -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта]. -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в -// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому -// ограничивается текущий объект таблицы. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, -// которые используются для этого вида доступа. Т.е. перечислить типы, -// которые соответствуют полю, использованному в шаблоне ограничения доступа -// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" -// нужно перечислить только те типы поля, которые есть у поля. -// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// -Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - - Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - Возврат; - КонецЕсли; - - МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - - Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("ДополнительныеСведения") Тогда - - Описание = Описание + " - | - |Справочник.ЗначенияСвойствОбъектов.Чтение.ДополнительныеСведения - |Справочник.ЗначенияСвойствОбъектовИерархия.Чтение.ДополнительныеСведения - |ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Чтение.ДополнительныеСведения - |РегистрСведений.ДополнительныеСведения.Чтение.ДополнительныеСведения - |РегистрСведений.ДополнительныеСведения.Изменение.ДополнительныеСведения - |"; - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -1112,17 +1089,13 @@ УстановитьПривилегированныйРежим(Истина); - Справочники.НаборыДополнительныхРеквизитовИСведений - .ОбновитьСоставНаименованийПредопределенныхНаборов(); - - Параметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыДополнительныхРеквизитовИСведений"); + Справочники.НаборыДополнительныхРеквизитовИСведений.ОбновитьСоставНаименованийПредопределенныхНаборов(); ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы( - Параметры, "ПредопределенныеНаборыДополнительныхРеквизитовИСведений"); - + "СтандартныеПодсистемы.Свойства.ПредопределенныеНаборыДополнительныхРеквизитовИСведений"); + Если ПоследниеИзменения = Неопределено - ИЛИ ПоследниеИзменения.Количество() > 0 Тогда + Или ПоследниеИзменения.Количество() > 0 Тогда Возврат Истина; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl index a7ebbd50f..500872a4b 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl @@ -1,38 +1,19 @@ +#Область СлужебныйПрограммныйИнтерфейс + //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить("ПолучениеИОтправкаЭлектронныхПисем"); + +КонецПроцедуры + +#КонецОбласти #Область СлужебныеПроцедурыИФункции -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "УправлениеЭлектроннойПочтой"); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("ПолучениеИОтправкаЭлектронныхПисем"); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Получение и отправка писем @@ -57,21 +38,25 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, - | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, - | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, - | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ПомещатьПисьмоВПапкуПисьмаОснования, ЛОЖЬ) КАК ПомещатьПисьмоВПапкуПисьмаОснования, - | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК ОтветственныйЗаОбработкуПисем, - | УчетныеЗаписиЭлектроннойПочты.ОставлятьКопииСообщенийНаСервере КАК ОставлятьКопии, - | УчетныеЗаписиЭлектроннойПочты.ПериодХраненияСообщенийНаСервере КАК ОставлятьДней, - | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяПользователя, - | УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК ПротоколВходящейПочты, - | ЕСТЬNULL(ДатыПоследнейЗагрузкиПочтовыхСообщений.ДатаЗагрузкиПисем, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаЗагрузкиПисем, + | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, + | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, + | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, + | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ПомещатьПисьмоВПапкуПисьмаОснования, ЛОЖЬ) КАК ПомещатьПисьмоВПапкуПисьмаОснования, + | ВЫБОР + | КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ТОГДА ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) + | ИНАЧЕ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи + | КОНЕЦ КАК ОтветственныйЗаОбработкуПисем, + | УчетныеЗаписиЭлектроннойПочты.ОставлятьКопииСообщенийНаСервере КАК ОставлятьКопии, + | УчетныеЗаписиЭлектроннойПочты.ПериодХраненияСообщенийНаСервере КАК ОставлятьДней, + | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяПользователя, + | УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК ПротоколВходящейПочты, + | ЕСТЬNULL(ДатыПоследнейЗагрузкиПочтовыхСообщений.ДатаЗагрузкиПисем, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаЗагрузкиПисем, | ВЫБОР | КОГДА УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты = ""IMAP"" - | ТОГДА ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОбработкаПисемВыполняетсяВДругомПочтовомКлиенте, ЛОЖЬ) + | ТОГДА ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОбработкаПисемВыполняетсяВДругомПочтовомКлиенте, ЛОЖЬ) | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ОбработкаПисемВедетсяВДругомПочтовомКлиенте + | КОНЕЦ КАК ОбработкаПисемВедетсяВДругомПочтовомКлиенте |ИЗ | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты @@ -80,7 +65,9 @@ | ПО (ДатыПоследнейЗагрузкиПочтовыхСообщений.УчетнаяЗапись = УчетныеЗаписиЭлектроннойПочты.Ссылка) |ГДЕ | УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляПолучения - | И НЕ ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте, ЛОЖЬ)"; + | И НЕ ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте, ЛОЖЬ) + | И УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты <> """" + | И УчетныеЗаписиЭлектроннойПочты.СерверВходящейПочты <> """""; Выборка = Запрос.Выполнить().Выбрать(); @@ -95,11 +82,11 @@ Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ - | ЭлектронноеПисьмоИсходящее.Ссылка, - | ПРЕДСТАВЛЕНИЕ(ЭлектронноеПисьмоИсходящее.Ссылка) КАК ПредставлениеПисьма, - | ЭлектронноеПисьмоИсходящее.УдалятьПослеОтправки, - | ЭлектронноеПисьмоИсходящее.УчетнаяЗапись КАК УчетнаяЗапись, - | ЕСТЬNULL(ПапкиЭлектронныхПисем.ПредопределеннаяПапка, ИСТИНА) КАК ТребуетсяОпределениеПапки, + | ЭлектронноеПисьмоИсходящее.Ссылка КАК Ссылка, + | ПРЕДСТАВЛЕНИЕ(ЭлектронноеПисьмоИсходящее.Ссылка) КАК ПредставлениеПисьма, + | ЭлектронноеПисьмоИсходящее.УдалятьПослеОтправки КАК УдалятьПослеОтправки, + | ЭлектронноеПисьмоИсходящее.УчетнаяЗапись КАК УчетнаяЗапись, + | ЕСТЬNULL(ПапкиЭлектронныхПисем.ПредопределеннаяПапка, ИСТИНА) КАК ТребуетсяОпределениеПапки, | ЕСТЬNULL(НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.КоличествоПопыток, 0) КАК КоличествоПопыток |ИЗ | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее @@ -115,7 +102,6 @@ | НЕ ЭлектронноеПисьмоИсходящее.ПометкаУдаления | И УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты <> """" | И УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты <> """" - | И УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки | И ЭлектронноеПисьмоИсходящее.СтатусПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее) | И ВЫБОР | КОГДА ЭлектронноеПисьмоИсходящее.ДатаКогдаОтправить = ДАТАВРЕМЯ(1, 1, 1) @@ -137,7 +123,7 @@ Пока ВыборкаУчетныеЗаписи.Следующий() Цикл Профиль = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(ВыборкаУчетныеЗаписи.УчетнаяЗапись); - + Попытка Соединение = Новый ИнтернетПочта; @@ -178,29 +164,57 @@ ПисьмоОбъект = ВыборкаПисьма.Ссылка.ПолучитьОбъект(); Попытка + ПараметрыПисьма = Неопределено; - ИдентификаторПисьма = Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма); + Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма); + Исключение - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время отправки электронного письма %1 произошла ошибка - |%2'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ВыборкаПисьма.ПредставлениеПисьма, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ДанныеАнализаОшибочныхПолучателей = РезультатАнализаОшибочныхПолучателей(ПисьмоОбъект, ПараметрыПисьма.ОшибочныеПолучатели); + ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = ДанныеАнализаОшибочныхПолучателей.ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов; + ВсеАдресатыПисьмаОтвергнутыСервером = ДанныеАнализаОшибочныхПолучателей.ВсеАдресатыПисьмаОтвергнутыСервером; + ПредставлениеОшибочныхАдресатов = ДанныеАнализаОшибочныхПолучателей.ПредставлениеОшибочныхАдресатов; + + Если ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов + И Не ВсеАдресатыПисьмаОтвергнутыСервером Тогда + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Следующие адресаты электронного письма %1 не приняты почтовым сервером: + |%2. Письмо отправлено остальным адресатам.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ВыборкаПисьма.ПредставлениеПисьма, + ПредставлениеОшибочныхАдресатов); + + Иначе + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время отправки электронного письма %1 произошла ошибка + |%2'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ВыборкаПисьма.ПредставлениеПисьма, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецЕсли; + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); - МенеджерЗаписи = РегистрыСведений.НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Письмо = ВыборкаПисьма.Ссылка; - МенеджерЗаписи.КоличествоПопыток = ВыборкаПисьма.КоличествоПопыток + 1; - МенеджерЗаписи.ИнформацияООшибке = ТекстСообщенияОбОшибке; - МенеджерЗаписи.Записать(); + Если НЕ ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов + Или ВсеАдресатыПисьмаОтвергнутыСервером Тогда + + МенеджерЗаписи = РегистрыСведений.НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Письмо = ВыборкаПисьма.Ссылка; + МенеджерЗаписи.КоличествоПопыток = ВыборкаПисьма.КоличествоПопыток + 1; + МенеджерЗаписи.ИнформацияООшибке = ТекстСообщенияОбОшибке; + МенеджерЗаписи.Записать(); + + Продолжить; + + КонецЕсли; - Продолжить; КонецПопытки; + ИдентификаторПисьма = ПараметрыПисьма.ИдентификаторСообщения; ИдентификаторСообщенияОтправкаIMAP = ""; Если ВыборкаПисьма.УдалятьПослеОтправки Тогда @@ -210,21 +224,30 @@ Попытка Если ПротоколПодключения = ПротоколИнтернетПочты.IMAP Тогда - ИдентификаторСообщенияОтправкаIMAP = Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма, "IMAP"); + Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма, "IMAP"); + ИдентификаторСообщенияОтправкаIMAP = ПараметрыПисьма.ИдентификаторСообщения; КонецЕсли; Исключение - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время передачи электронного письма %1 на сервер произошла ошибка - |%2. - |Письмо отправлено, но не сохранено на почтовом сервере.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ВыборкаПисьма.ПредставлениеПисьма, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДанныеАнализаОшибочныхПолучателей = РезультатАнализаОшибочныхПолучателей(ПисьмоОбъект, ПараметрыПисьма.ОшибочныеПолучатели); + + ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = ДанныеАнализаОшибочныхПолучателей.ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов; - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - ТекстСообщенияОбОшибке); + Если Не ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов Тогда + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время передачи электронного письма %1 на сервер произошла ошибка + |%2. + |Письмо отправлено, но не сохранено на почтовом сервере.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ВыборкаПисьма.ПредставлениеПисьма, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщенияОбОшибке); + + КонецЕсли; КонецПопытки; @@ -334,58 +357,38 @@ // Процедура ЗагрузитьПочтуПользователя(ПолученоПисем, ДоступноУчетныхЗаписей, ЕстьОшибки) Экспорт - МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, - | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, - | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, - | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ПомещатьПисьмоВПапкуПисьмаОснования, ЛОЖЬ) КАК ПомещатьПисьмоВПапкуПисьмаОснования, - | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК ОтветственныйЗаОбработкуПисем, - | УчетныеЗаписиЭлектроннойПочты.ОставлятьКопииСообщенийНаСервере КАК ОставлятьКопии, - | УчетныеЗаписиЭлектроннойПочты.ПериодХраненияСообщенийНаСервере КАК ОставлятьДней, - | УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК ПротоколВходящейПочты, - | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяПользователя, + | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, + | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, + | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, + | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ПомещатьПисьмоВПапкуПисьмаОснования, ЛОЖЬ) КАК ПомещатьПисьмоВПапкуПисьмаОснования, + | ВЫБОР + | КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ТОГДА ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) + | ИНАЧЕ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи + | КОНЕЦ КАК ОтветственныйЗаОбработкуПисем, + | УчетныеЗаписиЭлектроннойПочты.ОставлятьКопииСообщенийНаСервере КАК ОставлятьКопии, + | УчетныеЗаписиЭлектроннойПочты.ПериодХраненияСообщенийНаСервере КАК ОставлятьДней, + | УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК ПротоколВходящейПочты, + | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяПользователя, + | ЕСТЬNULL(ДатыПоследнейЗагрузкиПочтовыхСообщений.ДатаЗагрузкиПисем, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаЗагрузкиПисем, | ВЫБОР | КОГДА УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты = ""IMAP"" | ТОГДА ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.ОбработкаПисемВыполняетсяВДругомПочтовомКлиенте, ЛОЖЬ) | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ОбработкаПисемВедетсяВДругомПочтовомКлиенте - |ПОМЕСТИТЬ УчетныеЗаписиПользователя + | КОНЕЦ КАК ОбработкаПисемВедетсяВДругомПочтовомКлиенте |ИЗ | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты | ПО (НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДатыПоследнейЗагрузкиПочтовыхСообщений КАК ДатыПоследнейЗагрузкиПочтовыхСообщений + | ПО (ДатыПоследнейЗагрузкиПочтовыхСообщений.УчетнаяЗапись = УчетныеЗаписиЭлектроннойПочты.Ссылка) |ГДЕ | УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляПолучения | И НЕ ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте, ЛОЖЬ)"; - Результат = Запрос.Выполнить(); - - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, - | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, - | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, - | УчетныеЗаписиЭлектроннойПочты.ПомещатьПисьмоВПапкуПисьмаОснования КАК ПомещатьПисьмоВПапкуПисьмаОснования, - | УчетныеЗаписиЭлектроннойПочты.ОтветственныйЗаОбработкуПисем КАК ОтветственныйЗаОбработкуПисем, - | УчетныеЗаписиЭлектроннойПочты.ОставлятьКопии КАК ОставлятьКопии, - | УчетныеЗаписиЭлектроннойПочты.ОставлятьДней КАК ОставлятьДней, - | УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК ПротоколВходящейПочты, - | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяПользователя, - | УчетныеЗаписиЭлектроннойПочты.ОбработкаПисемВедетсяВДругомПочтовомКлиенте КАК ОбработкаПисемВедетсяВДругомПочтовомКлиенте, - | ЕСТЬNULL(ДатыПоследнейЗагрузкиПочтовыхСообщений.ДатаЗагрузкиПисем, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаЗагрузкиПисем - |ИЗ - | УчетныеЗаписиПользователя КАК УчетныеЗаписиЭлектроннойПочты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДатыПоследнейЗагрузкиПочтовыхСообщений КАК ДатыПоследнейЗагрузкиПочтовыхСообщений - | ПО УчетныеЗаписиЭлектроннойПочты.Ссылка = ДатыПоследнейЗагрузкиПочтовыхСообщений.УчетнаяЗапись"; - - УстановитьПривилегированныйРежим(Истина); Выборка = Запрос.Выполнить().Выбрать(); ПолученоПисем = 0; @@ -395,6 +398,8 @@ Возврат; КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + Пока Выборка.Следующий() Цикл Получено = 0; @@ -467,7 +472,7 @@ Пока ВыборкаУчетныеЗаписи.Следующий() Цикл Профиль = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(ВыборкаУчетныеЗаписи.УчетнаяЗапись); - + Попытка Соединение = Новый ИнтернетПочта; @@ -505,28 +510,56 @@ Пока ВыборкаПисьма.Следующий() Цикл ПисьмоОбъект = ВыборкаПисьма.Ссылка.ПолучитьОбъект(); - Попытка + ПараметрыПисьма = Неопределено; - ИдентификаторПисьма = Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма); + Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма); + Исключение - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + + ДанныеАнализаОшибочныхПолучателей = РезультатАнализаОшибочныхПолучателей(ПисьмоОбъект, ПараметрыПисьма.ОшибочныеПолучатели); + + ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = ДанныеАнализаОшибочныхПолучателей.ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов; + ВсеАдресатыПисьмаОтвергнутыСервером = ДанныеАнализаОшибочныхПолучателей.ВсеАдресатыПисьмаОтвергнутыСервером; + ПредставлениеОшибочныхАдресатов = ДанныеАнализаОшибочныхПолучателей.ПредставлениеОшибочныхАдресатов; + + Если ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов + И Не ВсеАдресатыПисьмаОтвергнутыСервером Тогда + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Следующие адресаты электронного письма %1 не приняты почтовым сервером: + |%2. Письмо отправлено остальным адресатам.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ВыборкаПисьма.ПредставлениеПисьма, + ПредставлениеОшибочныхАдресатов); + + Иначе + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Во время отправки электронного письма %1 произошла ошибка |%2'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), ВыборкаПисьма.ПредставлениеПисьма, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке, ВыборкаПисьма.Ссылка); - МенеджерЗаписи = РегистрыСведений.НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Письмо = ВыборкаПисьма.Ссылка; - МенеджерЗаписи.КоличествоПопыток = ВыборкаПисьма.КоличествоПопыток + 1; - МенеджерЗаписи.ИнформацияООшибке = ТекстСообщенияОбОшибке; - МенеджерЗаписи.Записать(); + Если НЕ ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов + Или ВсеАдресатыПисьмаОтвергнутыСервером Тогда + + МенеджерЗаписи = РегистрыСведений.НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Письмо = ВыборкаПисьма.Ссылка; + МенеджерЗаписи.КоличествоПопыток = ?(ВсеАдресатыПисьмаОтвергнутыСервером, 5, ВыборкаПисьма.КоличествоПопыток + 1); + МенеджерЗаписи.ИнформацияООшибке = ТекстСообщенияОбОшибке; + МенеджерЗаписи.Записать(); + + Продолжить; + + КонецЕсли; - Продолжить; КонецПопытки; + ИдентификаторПисьма = ПараметрыПисьма.ИдентификаторСообщения; ИдентификаторСообщенияОтправкаIMAP = ""; Если ВыборкаПисьма.УдалятьПослеОтправки Тогда @@ -536,26 +569,35 @@ Попытка Если ПротоколПодключения = ПротоколИнтернетПочты.IMAP Тогда - ИдентификаторСообщенияОтправкаIMAP = Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма, "IMAP"); + Взаимодействия.ВыполнитьОтправкуПисьма(ПисьмоОбъект, Соединение, ПараметрыПисьма, "IMAP"); + ИдентификаторСообщенияОтправкаIMAP = ПараметрыПисьма.ИдентификаторСообщения; КонецЕсли; Исключение - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время передачи электронного письма %1 на сервер произошла ошибка + ДанныеАнализаОшибочныхПолучателей = РезультатАнализаОшибочныхПолучателей(ПисьмоОбъект, ПараметрыПисьма.ОшибочныеПолучатели); + + ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = ДанныеАнализаОшибочныхПолучателей.ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов; + + Если Не ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов Тогда + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время передачи электронного письма %1 на сервер произошла ошибка |%2. |Письмо отправлено, но не сохранено на почтовом сервере.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ВыборкаПисьма.ПредставлениеПисьма, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке, ВыборкаПисьма.Ссылка); + ВыборкаПисьма.ПредставлениеПисьма, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке, ВыборкаПисьма.Ссылка); + + КонецЕсли; КонецПопытки; - ПисьмоОбъект.ИдентификаторСообщения = ИдентификаторПисьма; + ПисьмоОбъект.ИдентификаторСообщения = ИдентификаторПисьма; ПисьмоОбъект.ИдентификаторСообщенияОтправкаIMAP = ИдентификаторСообщенияОтправкаIMAP; - ПисьмоОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; - ПисьмоОбъект.Размер = Взаимодействия.ОценитьРазмерИсходящегоЭлектронногоПисьма(ПисьмоОбъект.Ссылка); + ПисьмоОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; + ПисьмоОбъект.Размер = Взаимодействия.ОценитьРазмерИсходящегоЭлектронногоПисьма(ПисьмоОбъект.Ссылка); ПисьмоОбъект.ДатаОтправления = ТекущаяДатаСеанса(); ПисьмоОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ПисьмоОбъект.Записать(РежимЗаписиДокумента.Запись); @@ -640,6 +682,78 @@ КонецПроцедуры +Функция РезультатАнализаОшибочныхПолучателей(ПисьмоОбъект, ОшибочныеПолучатели) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов",Ложь); + Результат.Вставить("ВсеАдресатыПисьмаОтвергнутыСервером",Ложь); + Результат.Вставить("ПредставлениеОшибочныхАдресатов",""); + + ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = Ложь; + ВсеАдресатыПисьмаОтвергнутыСервером = Ложь; + + КоличествоОшибочныхПолучателей = ОшибочныеПолучатели.Количество(); + + Если КоличествоОшибочныхПолучателей > 0 Тогда + + Результат.ЭтоПроблемаОтвергнутыхСерверомПочтовыхАдресов = Истина; + + МассивПолучателейПисьма = Новый Массив; + Для Каждого СтрокаПолучателя Из ПисьмоОбъект.ПолучателиПисьма Цикл + Если МассивПолучателейПисьма.Найти(СтрокаПолучателя.Адрес) = Неопределено Тогда + МассивПолучателейПисьма.Добавить(СтрокаПолучателя.Адрес); + КонецЕсли; + КонецЦикла; + Для Каждого СтрокаПолучателя Из ПисьмоОбъект.ПолучателиКопий Цикл + Если МассивПолучателейПисьма.Найти(СтрокаПолучателя.Адрес) = Неопределено Тогда + МассивПолучателейПисьма.Добавить(СтрокаПолучателя.Адрес); + КонецЕсли; + КонецЦикла; + Для Каждого СтрокаПолучателя Из ПисьмоОбъект.ПолучателиСкрытыхКопий Цикл + Если МассивПолучателейПисьма.Найти(СтрокаПолучателя.Адрес) = Неопределено Тогда + МассивПолучателейПисьма.Добавить(СтрокаПолучателя.Адрес); + КонецЕсли; + КонецЦикла; + + КоличествоПолучателейПисьма = МассивПолучателейПисьма.Количество(); + + Если КоличествоПолучателейПисьма = КоличествоОшибочныхПолучателей Тогда + Результат.ВсеАдресатыПисьмаОтвергнутыСервером = Истина; + КонецЕсли; + + ПредставлениеОшибочныхАдресатов = ""; + Для Каждого ОшибочныйАдресат Из ОшибочныеПолучатели Цикл + Если Не ПустаяСтрока(ПредставлениеОшибочныхАдресатов) Тогда + ПредставлениеОшибочныхАдресатов = ПредставлениеОшибочныхАдресатов + ", "; + КонецЕсли; + ПредставлениеОшибочныхАдресатов = ПредставлениеОшибочныхАдресатов + ОшибочныйАдресат.Ключ; + КонецЦикла; + + Результат.ПредставлениеОшибочныхАдресатов = ПредставлениеОшибочныхАдресатов; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + + +// Заполняет ИнтернетПочтовыеАдреса в объекте ИнтернетПочтовоеСообщение по переданной таблице адресов. +// +// Параметры: +// ТабличнаяЧасть - ИнтернетПочтовыеАдреса - адреса, которые будут заполнены в письме. +// Адреса - ТаблицаЗначений - таблица, содержащая адреса для указания в письме. +// +Процедура ЗаполнитьИнтернетПочтовыеАдреса(ТабличнаяЧасть, Адреса) Экспорт + + Для Каждого Адрес Из Адреса Цикл + НоваяСтрока = ТабличнаяЧасть.Добавить(); + НоваяСтрока.Адрес = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Адрес.Адрес, ""); + НоваяСтрока.Представление = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Адрес.ОтображаемоеИмя, ""); + КонецЦикла; + +КонецПроцедуры + Процедура ПолучитьПисьма(ДанныеУчетнойЗаписи, ЕстьОшибки, Получено, СтруктураМассивовСозданныхПисем) // Проверим блокировку учетной записи и если она доступна для получения, установим блокировку. @@ -664,11 +778,29 @@ КонецЕсли; - МенеджерЗаписи = РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.УчетнаяЗапись = ДанныеУчетнойЗаписи.Ссылка; - МенеджерЗаписи.ДатаБлокировки = ТекущаяДатаСеанса(); - МенеджерЗаписи.Записать(); - + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗаблокированныеДляПолученияУчетныеЗаписи"); + ЭлементБлокировки.УстановитьЗначение("УчетнаяЗапись", ДанныеУчетнойЗаписи.Ссылка); + Блокировка.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.УчетнаяЗапись = ДанныеУчетнойЗаписи.Ссылка; + МенеджерЗаписи.ДатаБлокировки = ТекущаяДатаСеанса(); + МенеджерЗаписи.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + // ----------------------------------------------------------------- // Сформируем почтовый профиль и подключимся к почтовому серверу. Профиль = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(ДанныеУчетнойЗаписи.Ссылка, Истина); @@ -840,7 +972,7 @@ ПараметрыОтбора = Новый Структура; - Если Не ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем = Дата(1,1,1,1,1,1) Тогда + Если Не ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем = Дата(1,1,1) Тогда ПараметрыОтбора.Вставить("ПослеДатыОтправления",ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем); Иначе ПараметрыОтбора.Вставить("Удаленные", Ложь); @@ -870,8 +1002,8 @@ Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ - | ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма, - | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере + | ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма КАК ИдентификаторПисьма, + | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере КАК ИдентификаторНаСервере |ПОМЕСТИТЬ ИдентификаторыПисемКЗагрузке |ИЗ | &ИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке @@ -879,17 +1011,17 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма, - | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере + | ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма КАК ИдентификаторПисьма, + | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере КАК ИдентификаторНаСервере |ИЗ | ИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее | ПО ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма = ЭлектронноеПисьмоВходящее.ИдентификаторСообщения | И (ЭлектронноеПисьмоВходящее.УчетнаяЗапись = &УчетнаяЗапись) | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее - | ПО (ЭлектронноеПисьмоИсходящее.УчетнаяЗапись = &УчетнаяЗапись) - | И (ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма = ЭлектронноеПисьмоИсходящее.ИдентификаторСообщения + | ПО (ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма = ЭлектронноеПисьмоИсходящее.ИдентификаторСообщения | ИЛИ ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма = ЭлектронноеПисьмоИсходящее.ИдентификаторСообщенияОтправкаIMAP) + | И (ЭлектронноеПисьмоИсходящее.УчетнаяЗапись = &УчетнаяЗапись) |ГДЕ | ЭлектронноеПисьмоВходящее.Ссылка ЕСТЬ NULL | И ЭлектронноеПисьмоИсходящее.Ссылка ЕСТЬ NULL"; @@ -1330,12 +1462,11 @@ ПризнакРассмотрено = ?(ЭтоИсходящееПисьмо, Истина, Ложь); КонецЕсли; - СтруктураДляЗаписи = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи( - Папка, - ?(ЗначениеЗаполнено(Предмет),Предмет,Письмо.Ссылка), - ПризнакРассмотрено, - , - Ложь); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + СтруктураДляЗаписи.Папка = Папка; + СтруктураДляЗаписи.Предмет = ?(ЗначениеЗаполнено(Предмет),Предмет,Письмо.Ссылка); + СтруктураДляЗаписи.Рассмотрено = ПризнакРассмотрено; + СтруктураДляЗаписи.РассчитыватьРассмотрено = Ложь; ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Письмо.Ссылка, СтруктураДляЗаписи); МассивИменВложений = Новый Массив; @@ -1412,10 +1543,6 @@ КонецЦикла; КонецЕсли; - Если Письмо.НепринятыеВложения.Количество() > 0 Тогда - Письмо.Записать(); - КонецЕсли; - // Запишем идентификатор Если Не ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP" Тогда @@ -1445,13 +1572,13 @@ Если Не ЭтоИсходящееПисьмо Тогда - Письмо.ДатаПолучения = Сообщение.ДатаПолучения; + Письмо.ДатаПолучения = Сообщение.ДатаОтправления; Письмо.ОтправительАдрес = ОтправительАдрес; Иначе Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; - Письмо.ДатаОтправления = Сообщение.ДатаОтправления; + Письмо.ДатаОтправления = Сообщение.ДатаПолучения; КонецЕсли; @@ -1490,7 +1617,7 @@ Письмо.ИдентификаторыОснований = Сообщение.ПолучитьПолеЗаголовка("References", "Строка"); Для каждого Вложение Из Сообщение.Вложения Цикл - Если ПустаяСтрока(Вложение.Идентификатор) И ТипЗнч(Вложение.Данные) = Тип("ДвоичныеДанные") Тогда + Если ПустаяСтрока(Вложение.Идентификатор) Тогда Письмо.ЕстьВложения = Истина; Прервать; КонецЕсли; @@ -1799,32 +1926,32 @@ | ОБЪЕДИНИТЬ ВСЕ | | ") + "ВЫБРАТЬ - | Таблица.Адрес, - | Таблица.Контакт + | Получатели.Адрес, + | Получатели.Контакт | ИЗ - | Документ.ЭлектронноеПисьмоВходящее.ПолучателиПисьма КАК Таблица + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиПисьма КАК Получатели | ГДЕ - | Таблица.Ссылка = &Письмо + | Получатели.Ссылка = &Письмо | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ - | Таблица.Адрес, - | Таблица.Контакт + | Получатели.Адрес, + | Получатели.Контакт | ИЗ - | Документ.ЭлектронноеПисьмоВходящее.ПолучателиКопий КАК Таблица + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиКопий КАК Получатели | ГДЕ - | Таблица.Ссылка = &Письмо + | Получатели.Ссылка = &Письмо | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ - | Таблица.Адрес, - | Таблица.Контакт + | Получатели.Адрес, + | Получатели.Контакт | ИЗ - | Документ.ЭлектронноеПисьмоВходящее.ПолучателиОтвета КАК Таблица + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиОтвета КАК Получатели | ГДЕ - | Таблица.Ссылка = &Письмо) КАК Адреса + | Получатели.Ссылка = &Письмо) КАК Адреса |ГДЕ | (НЕ Адреса.Контакт ЕСТЬ NULL )"; Запрос.УстановитьПараметр("Письмо", Письмо); @@ -1854,16 +1981,6 @@ КонецПроцедуры -Процедура ЗаполнитьИнтернетПочтовыеАдреса(ТабличнаяЧасть, Адреса) - - Для Каждого Адрес Из Адреса Цикл - НоваяСтрока = ТабличнаяЧасть.Добавить(); - НоваяСтрока.Адрес = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Адрес.Адрес, ""); - НоваяСтрока.Представление = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Адрес.ОтображаемоеИмя, ""); - КонецЦикла; - -КонецПроцедуры - Функция ИзПисьмаПолучитьИдентификаторОснования(Сообщение) СтрокаИдентификаторы = СокрЛП(Сообщение.ПолучитьПолеЗаголовка("In-Reply-To", "Строка")); @@ -1882,7 +1999,7 @@ КонецФункции -Процедура УстановитьТекстПисьма(Письмо, Сообщение) +Процедура УстановитьТекстПисьма(Письмо, Сообщение) Экспорт ТекстHTML = ""; ТекстПростой = ""; @@ -2028,7 +2145,9 @@ КонецЕсли; МассивДобавляемыхКОбработкеПисем = Новый Массив; - + МетаданныеИсходящееПисьмо = Метаданные.Документы.ЭлектронноеПисьмоИсходящее; + МетаданныеВходящееПисьмо = Метаданные.Документы.ЭлектронноеПисьмоВходящее; + Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ @@ -2102,45 +2221,74 @@ Пока Выборка.Следующий() Цикл - ПисьмоОбъект = Выборка.Письмо.ПолучитьОбъект(); - ПисьмоОбъект.ВзаимодействиеОснование = Выборка.СсылкаНаОснование; - ПисьмоОбъект.Записать(); + НачатьТранзакцию(); - Если Выборка.ПредметПисьмаОснования <> Выборка.ПредметПисьмаПодчиненное Тогда + Попытка - Если Выборка.ПредметПисьмаПодчиненное = Выборка.Письмо Тогда + МетаданныеДокумента = ?(ТипЗнч(Выборка.Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее"), + МетаданныеВходящееПисьмо, + МетаданныеИсходящееПисьмо); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеДокумента.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Письмо); + Блокировка.Заблокировать(); + + ПисьмоОбъект = Выборка.Письмо.ПолучитьОбъект(); + ПисьмоОбъект.ВзаимодействиеОснование = Выборка.СсылкаНаОснование; + ПисьмоОбъект.Записать(); + + Если Выборка.ПредметПисьмаОснования <> Выборка.ПредметПисьмаПодчиненное Тогда - Взаимодействия.УстановитьПредмет(Выборка.Письмо, Выборка.ПредметПисьмаОснования, Ложь); - - ИначеЕсли НЕ ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаПодчиненное) Тогда - - Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаОснования) Тогда + Если Выборка.ПредметПисьмаПодчиненное = Выборка.Письмо Тогда Взаимодействия.УстановитьПредмет(Выборка.Письмо, Выборка.ПредметПисьмаОснования, Ложь); - МассивДобавляемыхКОбработкеПисем.Добавить(Выборка.Письмо); - Иначе + ИначеЕсли НЕ ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаПодчиненное) Тогда - Взаимодействия.УстановитьПредмет(Выборка.СсылкаНаОснование, Выборка.ПредметПисьмаПодчиненное, Ложь); + Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаОснования) Тогда + + Взаимодействия.УстановитьПредмет(Выборка.Письмо, Выборка.ПредметПисьмаОснования, Ложь); + МассивДобавляемыхКОбработкеПисем.Добавить(Выборка.Письмо); + + Иначе + + Взаимодействия.УстановитьПредмет(Выборка.СсылкаНаОснование, Выборка.ПредметПисьмаПодчиненное, Ложь); + + КонецЕсли; - КонецЕсли; - - Иначе - - Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаОснования) Тогда + Иначе - Взаимодействия.УстановитьПредмет(Выборка.Письмо, Выборка.ПредметПисьмаОснования, Ложь); - МассивДобавляемыхКОбработкеПисем.Добавить(Выборка.Письмо); - - Иначе - - Взаимодействия.УстановитьПредмет(Выборка.СсылкаНаОснование, Выборка.ПредметПисьмаПодчиненное, Ложь); + Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Выборка.ПредметПисьмаОснования) Тогда + + Взаимодействия.УстановитьПредмет(Выборка.Письмо, Выборка.ПредметПисьмаОснования, Ложь); + МассивДобавляемыхКОбработкеПисем.Добавить(Выборка.Письмо); + + Иначе + + Взаимодействия.УстановитьПредмет(Выборка.СсылкаНаОснование, Выборка.ПредметПисьмаПодчиненное, Ложь); + + КонецЕсли; КонецЕсли; КонецЕсли; - КонецЕсли; + ЗафиксироватьТранзакцию(); + + Исключение + + ТекстСообщения = НСтр("ru = 'Не установить письмо основание у %Ссылка% по причине: %Причина%'"); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", Выборка.Письмо); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, + МетаданныеДокумента, + Выборка.Письмо, + ТекстСообщения); + ОтменитьТранзакцию(); + + КонецПопытки; КонецЦикла; @@ -2151,45 +2299,55 @@ //////////////////////////////////////////////////////////////////////////////// // Работа с вложения электронных писем. +Функция ИнтернетПочтовоеСообщениеИзДвоичныхДанных(ДвоичныеДанные) + + ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; + ПочтовоеСообщение.УстановитьИсходныеДанные(ДвоичныеДанные); + + Возврат ПочтовоеСообщение; + +КонецФункции + Процедура ЗаписатьВложениеЭлектронногоПисьма(Объект, Вложение,МассивПодписей,КоличествоПустыхИменВоВложениях) ПисьмоСсылка = Объект.Ссылка; Размер = 0; + ЭтоВложениеПисьмо = Ложь; + Если ТипЗнч(Вложение.Данные) = Тип("ДвоичныеДанные") Тогда - Размер = Вложение.Данные.Размер(); + + ДанныеВложения = Вложение.Данные; + ИмяФайла = Вложение.ИмяФайла; + ЭтоВложениеПисьмо = ФайлЯвляетсяЭлектроннымПисьмом(ИмяФайла, ДанныеВложения); + Иначе - // А может быть и тип ИнтернетПочтовоеСообщение. На данный момент не поддерживаем. - Если ТипЗнч(Вложение.Данные) = Тип("ИнтернетПочтовоеСообщение") Тогда - НовоеУдаленноеВложение = Объект.НепринятыеВложения.Добавить(); - НовоеУдаленноеВложение.ИмяВложение = Вложение.Данные.Тема + " " + НСтр("ru = 'от'") + " " +Вложение.Данные.ДатаОтправления; - КонецЕсли; - Возврат; + + ДанныеВложения = Вложение.Данные.ПолучитьИсходныеДанные(); + ИмяФайла = ВзаимодействияКлиентСервер.ПредставлениеПисьма(Вложение.Данные.Тема, Вложение.Данные.ДатаПолучения) + ".eml"; + ЭтоВложениеПисьмо = Истина; + КонецЕсли; - Адрес = ПоместитьВоВременноеХранилище(Вложение.Данные, ""); + Размер = ДанныеВложения.Размер(); + Адрес = ПоместитьВоВременноеХранилище(ДанныеВложения, ""); - Если Не ПустаяСтрока(Вложение.Идентификатор) Тогда + Если Не ПустаяСтрока(Вложение.Идентификатор) + И (СтрНайти(Объект.ТекстHTML, Вложение.Имя) > 0 + Или СтрНайти(Объект.ТекстHTML, Вложение.Идентификатор) = 0) Тогда - Если СтрНайти(Объект.ТекстHTML, Вложение.Идентификатор) = 0 Тогда - - Вложение.Идентификатор = ""; - - ИначеЕсли СтрНайти(Объект.ТекстHTML, Вложение.Имя) > 0 - И СтрНайти(Вложение.Идентификатор, Вложение.Имя + "@") = 0 Тогда - - Вложение.Идентификатор = ""; - - КонецЕсли; + Вложение.Идентификатор = ""; КонецЕсли; ВложениеПисьмаСсылка = ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища( - ПисьмоСсылка, Адрес, Вложение.ИмяФайла, Размер,КоличествоПустыхИменВоВложениях); + ПисьмоСсылка, Адрес, ИмяФайла, Размер,КоличествоПустыхИменВоВложениях); ЕстьПодписи = (МассивПодписей.Количество() > 0); ЭтоОтображаемыйФайл = НЕ ПустаяСтрока(Вложение.Идентификатор); - Если ЕстьПодписи Или ЭтоОтображаемыйФайл Тогда + Если ЕстьПодписи + Или ЭтоОтображаемыйФайл + Или ЭтоВложениеПисьмо Тогда ВложениеПисьмаОбъект = ВложениеПисьмаСсылка.ПолучитьОбъект(); @@ -2221,6 +2379,12 @@ КонецЕсли; + Если ЭтоВложениеПисьмо Тогда + + ВложениеПисьмаОбъект.ЭтоВложениеПисьмо = Истина; + + КонецЕсли; + ВложениеПисьмаОбъект.Записать(); КонецЕсли; @@ -2232,12 +2396,14 @@ // Получает вложения электронного письма. // // Параметры: -// Письмо - ДокументСсылка - документ электронное письмо для которого необходимо получить вложения. +// Письмо - ДокументСсылка - документ электронное письмо для которого необходимо получить вложения. +// ФормироватьРазмерПредставление - Булево - признак того, что в результате запроса будет пустая строковая колонка РазмерПредставление. +// ТолькоСПустымИД - Булево - если Истина, то будут получены только вложения без ИДФайлаЭлектронногоПисьма. // // Возвращаемое значение: // ТаблицаЗначений - таблица значений, содержащая информацию о вложениях. // -Функция ПолучитьВложенияЭлектронногоПисьма(Письмо,ФормироватьРазмерПредставление = Ложь) Экспорт +Функция ПолучитьВложенияЭлектронногоПисьма(Письмо,ФормироватьРазмерПредставление = Ложь, ТолькоСПустымИД = Ложь) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -2264,11 +2430,11 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | Файлы.Ссылка, - | Файлы.ИндексКартинки, - | Файлы.Размер, - | Файлы.ИДФайлаЭлектронногоПисьма, - | &ПодписанЭП КАК ПодписанЭП, + | Файлы.Ссылка КАК Ссылка, + | Файлы.ИндексКартинки КАК ИндексКартинки, + | Файлы.Размер КАК Размер, + | Файлы.ИДФайлаЭлектронногоПисьма КАК ИДФайлаЭлектронногоПисьма, + | &ПодписанЭП КАК ПодписанЭП, | ВЫБОР | КОГДА Файлы.Расширение = &ПустаяСтрока | ТОГДА Файлы.Наименование @@ -2288,6 +2454,11 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ПодписанЭП", СтрокаПодписанЭП); + Если ТолькоСПустымИД Тогда + Запрос.Текст = Запрос.Текст + " + | И Файлы.ИДФайлаЭлектронногоПисьма = """""; + КонецЕсли; + Запрос.УстановитьПараметр("Письмо", ВладелецФайлов); Запрос.УстановитьПараметр("ПустаяСтрока",""); @@ -2302,6 +2473,8 @@ КонецЦикла; КонецЕсли; + ТаблицаКВозврату.Индексы.Добавить("ИДФайлаЭлектронногоПисьма"); + Возврат ТаблицаКВозврату; КонецФункции @@ -2315,8 +2488,9 @@ КоличествоПустыхИменВоВложениях = 0) Экспорт ИмяФайлаДляРазбора = ИмяФайла; - РасширениеБезТочки = ВзаимодействияКлиентСервер.ПолучитьРасширениеФайла(ИмяФайлаДляРазбора); + РасширениеБезТочки = ВзаимодействияКлиентСервер.РасширениеФайла(ИмяФайлаДляРазбора); ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаДляРазбора); + Если ПустаяСтрока(ИмяБезРасширения) Тогда ИмяФайлаБезРасширения = @@ -2337,7 +2511,7 @@ ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); ПараметрыФайла.Вставить("ВремяИзменения", Неопределено); ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено); - Возврат ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл( + Возврат РаботаСФайлами.ДобавитьФайл( ПараметрыФайла, АдресВоВременномХранилище, ""); @@ -2350,7 +2524,7 @@ СсылкаНаФайл, УникальныйИдентификаторФормы) Экспорт - ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла( + ДанныеФайла = РаботаСФайлами.ДанныеФайла( СсылкаНаФайл, УникальныйИдентификаторФормы, Истина); ПараметрыФайла = Новый Структура; @@ -2360,7 +2534,7 @@ ПараметрыФайла.Вставить("РасширениеБезТочки", ДанныеФайла.Расширение); ПараметрыФайла.Вставить("ВремяИзменения", Неопределено); ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ДанныеФайла.ДатаМодификацииУниверсальная); - Возврат ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл( + Возврат РаботаСФайлами.ДобавитьФайл( ПараметрыФайла, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ""); @@ -2432,6 +2606,36 @@ КонецПроцедуры +// Проверяет, являются ли двоичные данные при десериализации ИнтернетПочтовоеСообщение. +// +// Параметры: +// ДвоичныеДанные - ДвоичныеДанные - проверяемые двоичные данные. +// +// Возвращаемое значение: +// Булево - Истина, если двоичные данные корректно десериализуются в объект ИнтернетПочтовоеСообщение. +// +Функция ДвоичныеДанныеКорректноеИнтернетПочтовоеСообщение(ДвоичныеДанные) + + ПочтовоеСообщение = ИнтернетПочтовоеСообщениеИзДвоичныхДанных(ДвоичныеДанные); + Возврат ПочтовоеСообщение.СтатусРазбора = СтатусРазбораИнтернетПочтовогоСообщения.ОшибокНеОбнаружено; + +КонецФункции + +Функция ФайлЯвляетсяЭлектроннымПисьмом(ИмяФайла, ДвоичныеДанные) Экспорт + + Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ИмяФайла) + И ДвоичныеДанныеКорректноеИнтернетПочтовоеСообщение(ДвоичныеДанные) Тогда + + Возврат Истина; + + Иначе + + Возврат Ложь; + + КонецЕсли; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Уведомления о прочтении @@ -2690,10 +2894,11 @@ | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты, | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.УдалятьПисьмаПослеОтправки, ЛОЖЬ) КАК УдалятьПослеОтправки, | ВЫБОР - | КОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем = &ТекущийПользователь - | И НастройкиУчетныхЗаписейЭлектроннойПочты.ПерсональнаяУчетнаяЗапись + | КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = &ТекущийПользователь | ТОГДА 0 - | КОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем = &ТекущийПользователь + | КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем = &ТекущийПользователь | ТОГДА 1 | ИНАЧЕ 2 | КОНЕЦ КАК ЗначениеУпорядочивания @@ -2772,7 +2977,7 @@ // // Возвращаемое значение: // Строка,Неопределено - имя объекта метаданных присоединенных файлов электронного письма. - Функция ПолучитьИмяОбъектаМетаданныхПрисоединенныхФайловПисьма(Письмо) Экспорт +Функция ПолучитьИмяОбъектаМетаданныхПрисоединенныхФайловПисьма(Письмо) Экспорт Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда @@ -2791,11 +2996,29 @@ КонецФункции Процедура СнятьБлокировкуУчетнойЗаписиДляПолучения(УчетнаяЗапись) + + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗаблокированныеДляПолученияУчетныеЗаписи"); + ЭлементБлокировки.УстановитьЗначение("УчетнаяЗапись", УчетнаяЗапись); + Блокировка.Заблокировать(); + + НаборЗаписей = РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); + НаборЗаписей.Записать(); - НаборЗаписей = РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); - НаборЗаписей.Записать(); - + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl index be5642eeb..2a5f4b3ba 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl @@ -1,9 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Открывает вложенный файл электронного письма. @@ -15,7 +9,7 @@ // Процедура ОткрытьВложение(Ссылка, Форма) Экспорт - ДанныеФайла = ПрисоединенныеФайлыКлиент.ПолучитьДанныеФайла(Ссылка, Форма.УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(Ссылка, Форма.УникальныйИдентификатор); Если Форма.ЗапрещенныеРасширения.НайтиПоЗначению(ДанныеФайла.Расширение) <> Неопределено Тогда @@ -29,14 +23,14 @@ КонецЕсли; - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла); - + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла); + КонецПроцедуры Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДополнительныеПараметры.ДанныеФайла); + РаботаСФайламиКлиент.ОткрытьФайл(ДополнительныеПараметры.ДанныеФайла); КонецЕсли; КонецПроцедуры @@ -71,9 +65,7 @@ ДоступноУчетныхЗаписей = 0; ЕстьОшибки = Ложь; - Состояние(НСтр("ru = 'Идет отправка и получение электронной почты ...'")); ВзаимодействияВызовСервера.ОтправитьЗагрузитьПочтуПользователя(ПолученоПисем, ДоступноУчетныхЗаписей, ЕстьОшибки); - Состояние(); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загружено писем: %1'"), ПолученоПисем); Если ДоступноУчетныхЗаписей > 1 Тогда diff --git a/SSL/src/CommonModules/ФайловыеФункции/Module.bsl b/SSL/src/CommonModules/ФайловыеФункции/Module.bsl index 3eba49da4..55ea0109f 100644 --- a/SSL/src/CommonModules/ФайловыеФункции/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункции/Module.bsl @@ -1,76 +1,75 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать РаботаСФайлами.НастройкиРаботыСФайлами(); // Возвращает структуру, содержащую персональные настройки работы с файлами. // // Возвращаемое значение: // Структура - со свойствами: -// * ПоказыватьЗанятыеФайлыПриЗавершенииРаботы - Булево - Существует, только если внедрена подсистема Работа с файлами. -// * СпрашиватьРежимРедактированияПриОткрытииФайла - Булево - Существует, только если внедрена подсистема Работа с файлами. -// * ПоказыватьКолонкуРазмер - Булево - Существует, только если внедрена подсистема Работа с файлами. -// * ДействиеПоДвойномуЩелчкуМыши - Строка - Существует, только если внедрена подсистема Работа с файлами. -// * СпособСравненияВерсийФайлов - Строка - Существует, только если внедрена подсистема Работа с файлами. -// * ГрафическиеСхемыРасширение - Строка - -// * ГрафическиеСхемыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - -// * ТекстовыеФайлыРасширение - Строка - -// * ТекстовыеФайлыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - -// * МаксимальныйРазмерЛокальногоКэшаФайлов - Число - -// * ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов - Булево - -// * ПоказыватьИнформациюЧтоФайлНеБылИзменен - Булево - -// * ПоказыватьПодсказкиПриРедактированииФайлов - Булево - -// * ПутьКЛокальномуКэшуФайлов - Строка - -// * ЭтоПолноправныйПользователь - Булево - -// * УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования - Булево - . +// * ПоказыватьЗанятыеФайлыПриЗавершенииРаботы - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * СпрашиватьРежимРедактированияПриОткрытииФайла - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * ПоказыватьКолонкуРазмер - Булево - Существует, только если внедрена подсистема Работа с +// файлами. +// * ДействиеПоДвойномуЩелчкуМыши - Строка - Существует, только если внедрена подсистема Работа с +// файлами. +// * СпособСравненияВерсийФайлов - Строка - Существует, только если внедрена подсистема Работа с +// файлами. +// * ГрафическиеСхемыРасширение - Строка - Список расширений для графических схем. +// * ГрафическиеСхемыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия графических схем. +// * ТекстовыеФайлыРасширение - Строка - Расширения файлов открытого формата документов. +// * ТекстовыеФайлыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия текстовых файлов. +// * МаксимальныйРазмерЛокальногоКэшаФайлов - Число - Определяет максимальный размер локального кэша файлов. +// * ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов - Булево - Задавать вопрос при удалении файлов из локального кэша. +// * ПоказыватьИнформациюЧтоФайлНеБылИзменен - Булево - Показывать файлы при завершении работы. +// * ПоказыватьПодсказкиПриРедактированииФайлов - Булево - В веб-клиенте показывать подсказки при +// редактировании файлов. +// * ПутьКЛокальномуКэшуФайлов - Строка - Путь к локальному кэшу файлов. +// * ЭтоПолноправныйПользователь - Булево - Истина, если это полноправный пользователь. +// * УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования - Булево - удаления файлов из локального кэша при +// завершении редактирования. // Функция НастройкиРаботыСФайлами() Экспорт - Возврат ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + Возврат РаботаСФайлами.НастройкиРаботыСФайлами(); КонецФункции +// Устарела. Следует использовать РаботаСФайлами.СохранитьНастройкиРаботыСФайлами(); // Сохраняет настройки работы с файлами. // // Параметры: -// НастройкиРаботыСФайлами - Структура настроек работы с файлами с их значениями. -// В качестве ключа настройки возможно указывать строки с именем настроек: -// ПоказыватьИнформациюЧтоФайлНеБылИзменен, -// ПоказыватьЗанятыеФайлыПриЗавершенииРаботы, -// ПоказыватьКолонкуРазмер, -// ТекстовыеФайлыРасширение, -// ТекстовыеФайлыСпособОткрытия, -// ГрафическиеСхемыРасширение, -// ПоказыватьПодсказкиПриРедактированииФайлов, -// СпрашиватьРежимРедактированияПриОткрытииФайла, -// СпособСравненияВерсийФайлов, -// ДействиеПоДвойномуЩелчкуМыши, -// ГрафическиеСхемыСпособОткрытия. +// НастройкиРаботыСФайлами - Структура - настройки работы с файлами с их значениями. +// * ПоказыватьИнформациюЧтоФайлНеБылИзменен - Булево - Необязательный. Показывать сообщение, если файл не +// был изменен. +// * ПоказыватьЗанятыеФайлыПриЗавершенииРаботы - Булево - Необязательный. Показывать файлы при завершении работы. +// * ПоказыватьКолонкуРазмер - Булево - Необязательный. Отображать колонку размер в формах +// списках файлов. +// * ТекстовыеФайлыРасширение - Строка - Расширения файлов открытого формата документов. +// * ТекстовыеФайлыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - способ +// открытия текстовых файлов. +// * ГрафическиеСхемыРасширение - Строка - Список расширений графических файлов. +// * ПоказыватьПодсказкиПриРедактированииФайлов - Булево - Необязательный. В веб-клиенте показывать подсказки +// при редактировании файлов. +// * СпрашиватьРежимРедактированияПриОткрытииФайла - Булево - Необязательный. Выбирать режим редактирования при +// открытии файла. +// * СпособСравненияВерсийФайлов - ПеречислениеСсылка.СпособыСравненияВерсийФайлов - +// Необязательный. Способ сравнения версий и файлов. +// * ДействиеПоДвойномуЩелчкуМыши - ПеречислениеСсылка.ДействияСФайламиПоДвойномуЩелчку - Необязательный. +// * ГрафическиеСхемыСпособОткрытия - ПеречислениеСсылка.СпособыОткрытияФайлаНаПросмотр - +// Необязательный. Способ открытия файла на просмотр. // Процедура СохранитьНастройкиРаботыСФайлами(НастройкиРаботыСФайлами) Экспорт - КлючиОбъектовНастроекРаботыСФайлами = КлючиОбъектовНастроекРаботыСФайлами(); - - Для Каждого Настройка Из НастройкиРаботыСФайлами Цикл - - КлючОбъектаНастройки = КлючиОбъектовНастроекРаботыСФайлами[Настройка.Ключ]; - Если КлючОбъектаНастройки <> Неопределено Тогда - Если СтрНачинаетсяС(КлючОбъектаНастройки, "НастройкиОткрытияФайлов\") Тогда - ТипФайловНастройки = СтрЗаменить(КлючОбъектаНастройки, "НастройкиОткрытияФайлов\", ""); - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъектаНастройки, - СтрЗаменить(Настройка.Ключ, ТипФайловНастройки, ""), Настройка.Значение); - Иначе - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъектаНастройки, Настройка.Ключ, Настройка.Значение); - КонецЕсли; - - КонецЕсли; - - КонецЦикла; + РаботаСФайлами.СохранитьНастройкиРаботыСФайлами(НастройкиРаботыСФайлами); КонецПроцедуры +// Устарела. Следует использовать РаботаСФайлами.МаксимальныйРазмерФайла(); // Возвращает максимальный размер файла. // // Возвращаемое значение: @@ -78,39 +77,11 @@ // Функция МаксимальныйРазмерФайла() Экспорт - УстановитьПривилегированныйРежим(Истина); - - МаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); - - Если МаксимальныйРазмерФайла = Неопределено - ИЛИ МаксимальныйРазмерФайла = 0 Тогда - - МаксимальныйРазмерФайла = 50*1024*1024; // 50 мб - Константы.МаксимальныйРазмерФайла.Установить(МаксимальныйРазмерФайла); - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - МаксимальныйРазмерФайлаОбластиДанных = - Константы.МаксимальныйРазмерФайлаОбластиДанных.Получить(); - - Если МаксимальныйРазмерФайлаОбластиДанных = Неопределено - ИЛИ МаксимальныйРазмерФайлаОбластиДанных = 0 Тогда - - МаксимальныйРазмерФайлаОбластиДанных = 50*1024*1024; // 50 мб - - Константы.МаксимальныйРазмерФайлаОбластиДанных.Установить( - МаксимальныйРазмерФайлаОбластиДанных); - КонецЕсли; - - МаксимальныйРазмерФайла = Мин(МаксимальныйРазмерФайла, МаксимальныйРазмерФайлаОбластиДанных); - КонецЕсли; - - Возврат МаксимальныйРазмерФайла; + Возврат РаботаСФайлами.МаксимальныйРазмерФайла(); КонецФункции +// Устарела. Следует использовать РаботаСФайлами.МаксимальныйРазмерФайлаОбщий(); // Возвращает максимальный размер файла провайдера. // // Возвращаемое значение: @@ -118,24 +89,14 @@ // Функция МаксимальныйРазмерФайлаОбщий() Экспорт - УстановитьПривилегированныйРежим(Истина); - - МаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); - - Если МаксимальныйРазмерФайла = Неопределено - ИЛИ МаксимальныйРазмерФайла = 0 Тогда - - МаксимальныйРазмерФайла = 50*1024*1024; // 50 мб - Константы.МаксимальныйРазмерФайла.Установить(МаксимальныйРазмерФайла); - КонецЕсли; - - Возврат МаксимальныйРазмерФайла; + Возврат РаботаСФайлами.МаксимальныйРазмерФайлаОбщий(); КонецФункции //////////////////////////////////////////////////////////////////////////////// // Работа с томами файлов +// Устарела. Следует использовать РаботаСФайлами.ЕстьТомаХраненияФайлов(); // Есть ли хоть один том хранения файлов. // // Возвращаемое значение: @@ -143,69 +104,10 @@ // Функция ЕстьТомаХраненияФайлов() Экспорт - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов - |ГДЕ - | ТомаХраненияФайлов.ПометкаУдаления = ЛОЖЬ"; - - Возврат НЕ Запрос.Выполнить().Пустой(); + Возврат РаботаСФайлами.ЕстьТомаХраненияФайлов(); КонецФункции #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -Процедура СобратьСтатистикуКонфигурации() Экспорт - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - Возврат; - КонецЕсли; - - МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); - - ТекстЗапроса = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(1) КАК Количество - |ИЗ - | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов"; - - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.УчетныеЗаписиСинхронизацииФайлов", Выборка.Количество()); - -КонецПроцедуры - #КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает ключи объектов настроек работы с файлами. -// -Функция КлючиОбъектовНастроекРаботыСФайлами() - - КлючиОбъектовНастроекРаботыСФайлами = Новый Соответствие; - - ФайловыеФункцииСлужебный.ПриСохраненииНастроекРаботыСФайлами( - КлючиОбъектовНастроекРаботыСФайлами); - - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ТекстовыеФайлыРасширение" , "НастройкиОткрытияФайлов\ТекстовыеФайлы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ТекстовыеФайлыСпособОткрытия" , "НастройкиОткрытияФайлов\ТекстовыеФайлы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ГрафическиеСхемыРасширение" , "НастройкиОткрытияФайлов\ГрафическиеСхемы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ГрафическиеСхемыСпособОткрытия" ,"НастройкиОткрытияФайлов\ГрафическиеСхемы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьПодсказкиПриРедактированииФайлов" ,"НастройкиПрограммы"); - КлючиОбъектовНастроекРаботыСФайлами.Вставить("ПоказыватьИнформациюЧтоФайлНеБылИзменен" , "НастройкиПрограммы"); - - Возврат КлючиОбъектовНастроекРаботыСФайлами; - -КонецФункции - -#КонецОбласти - diff --git a/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl index 855294d7e..88726e7ea 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl @@ -1,70 +1,18 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функция для работы со сканером. +// Устарела. Следует использовать РаботаСФайламиКлиент.ОткрытьФормуНастройкиСканирования(); // Открывает форму настройки сканирования. Процедура ОткрытьФормуНастройкиСканирования() Экспорт - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - ТекстСообщения = НСтр("ru = 'Сканирование поддерживается только в клиенте под управлением ОС Windows.'"); - ПоказатьПредупреждение(, ТекстСообщения); - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда - ТекстСообщения = НСтр("ru = 'Сканирование не поддерживается в веб-клиенте.'"); - ПоказатьПредупреждение(, ТекстСообщения); - Возврат; - КонецЕсли; - - КомпонентаУстановлена = ФайловыеФункцииСлужебныйКлиент.ПроинициализироватьКомпоненту(); - - Если Не КомпонентаУстановлена Тогда - ТекстВопроса = НСтр("ru = 'Для продолжения работы необходимо установить компоненту сканирования. - |Установить компоненту?'"); - Обработчик = Новый ОписаниеОповещения("ПоказатьВопросУстановкиКомпонентыСканирования", ЭтотОбъект, КомпонентаУстановлена); - ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Возврат; - КонецЕсли; - - ОткрытьФормуНастройкиСканированияЗавершение(КомпонентаУстановлена, Неопределено); + РаботаСФайламиКлиент.ОткрытьФормуНастройкиСканирования(); КонецПроцедуры #КонецОбласти -#Область СлужебныеПроцедурыИФункции - -Функция ПоказатьВопросУстановкиКомпонентыСканирования(Результат, КомпонентаУстановлена) Экспорт - - Если Результат = КодВозвратаДиалога.Да Тогда - Обработчик = Новый ОписаниеОповещения("ОткрытьФормуНастройкиСканированияЗавершение", ЭтотОбъект); - ФайловыеФункцииСлужебныйКлиент.УстановитьКомпоненту(Обработчик); - КонецЕсли; - -КонецФункции - -Процедура ОткрытьФормуНастройкиСканированияЗавершение(КомпонентаУстановлена, ПараметрыВыполнения) Экспорт - - Если Не КомпонентаУстановлена Тогда - Возврат; - КонецЕсли; - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("КомпонентаУстановлена", КомпонентаУстановлена); - ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); - - ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканирования", ПараметрыФормы); - -КонецПроцедуры - -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl deleted file mode 100644 index 79a85a602..000000000 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl +++ /dev/null @@ -1,4033 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Объявляет служебные события подсистемы ФайловыеФункции: -// -// Серверные события: -// ПриДобавленииФайловВТомаПриРазмещении, -// ПриУдаленииРегистрацииИзменений, -// ПриОпределенииТекстаЗапросаДляИзвлеченияТекста, -// ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом, -// ПриЗаписиИзвлеченногоТекста, -// ПриОпределенииКоличестваФайловВТомах, -// ПриОпределенииНаличияХранимыхФайлов, -// ПриПолученииХранимыхФайлов, -// ПриОпределенииНавигационнойСсылкиФайла, -// ПриОпределенииИмениФайлаСПутемКДвоичнымДанным. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Добавляет файл на том при "Разместить файлы начального образа". - // - // Синтаксис: - // Процедура ПриДобавленииФайловВТомаПриРазмещении(СоответствиеПутейФайлов, ХранитьФайлыВТомахНаДиске, ПрисоединяемыеФайлы) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"); - - // Удаляет регистрацию изменений после "Разместить файлы начального образа". - // - // Синтаксис: - // Процедура ПриУдаленииРегистрацииИзменений(ПланОбменаСсылка, ПрисоединяемыеФайлы) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриУдаленииРегистрацииИзменений"); - - // Заполняет текст запроса для получения файлов у которых не извлечен текст. - // В качестве параметра может прийти другой запрос, с которым следует сделать объединение. - // - // Параметры: - // ТекстЗапроса - Строка (возвращаемое значение), варианты передаваемых значений: - // Пустая строка - будет возвращен требуемый текст запроса. - // Непустая строка - будет возвращен требуемый текст запроса, добавленный - // к переданному тексту посредством "ОБЪЕДИНИТЬ ВСЕ". - // - // ПолучитьВсеФайлы - Булево - начальное значение Ложь. Позволяет отключить выборку - // файлов по частям, если передать Истина. - // - // Синтаксис: - // Процедура ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(ТекстЗапроса, ПолучитьВсеФайлы = Ложь) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"); - - // Возвращает число файлов с неизвлеченным текстом. - // - // Синтаксис: - // Процедура ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом(ЧислоВерсий) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом"); - - // Записывает извлеченный текст. - // - // Синтаксис: - // Процедура ПриЗаписиИзвлеченногоТекста(ФайлОбъект) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриЗаписиИзвлеченногоТекста"); - - // Возвращает в параметре КоличествоФайловВТомах количество файлов в томах. - // - // Синтаксис: - // Процедура ПриОпределенииКоличестваФайловВТомах(КоличествоФайловВТомах) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваФайловВТомах"); - - // Возвращает Истина в параметре ЕстьХранимыеФайлы, если есть хранимые файлы к объекту ВнешнийОбъект. - // - // Синтаксис: - // Процедура ПриОпределенииНаличияХранимыхФайлов(ВнешнийОбъект, ЕстьХранимыеФайлы) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНаличияХранимыхФайлов"); - - // Возвращает в параметре ХранимыеФайлы массив хранимых файлов к объекту ВнешнийОбъект. - // - // Синтаксис: - // Процедура ПриПолученииХранимыхФайлов(ВнешнийОбъект, ХранимыеФайлы) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриПолученииХранимыхФайлов"); - - // Возвращает навигационную ссылку на файл (на реквизит или во временное хранилище). - // - // Синтаксис: - // Процедура ПриОпределенииНавигационнойСсылкиФайла(ФайлСсылка, УникальныйИдентификатор, НавигационнаяСсылка) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"); - - // Получает полный путь к файлу на диске. - // - // Синтаксис: - // Процедура ПриОпределенииИмениФайлаСПутемКДвоичнымДанным(ФайлСсылка, ПутьКФайлу, ПустойПутьДляПустыхДанных = Ложь) Экспорт - // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииИмениФайлаСПутемКДвоичнымДанным"); - -КонецПроцедуры - -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ФайловыеФункцииСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"].Добавить( - "ФайловыеФункцииСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам"].Добавить( - "ФайловыеФункцииСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ФайловыеФункцииСлужебный"); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( - "ФайловыеФункцииСлужебный"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.ВариантыОтчетов\ПриНастройкеВариантовОтчетов"].Добавить( - "ФайловыеФункцииСлужебный"); - КонецЕсли; - -КонецПроцедуры - -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник ТомаХраненияФайлов запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Поддержка обмена файлами - -// Служебная функции. Используется для удаления файла на сервере. -// -Процедура УдалитьФайлыНаСервере(ПрежнийПутьНаТоме) Экспорт - - // Удаляем файл. - ФайлВременный = Новый Файл(ПрежнийПутьНаТоме); - Если ФайлВременный.Существует() Тогда - - Попытка - ФайлВременный.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПрежнийПутьНаТоме); - Исключение - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Удаление файлов в томе при обмене'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ИнформацияОбОшибке()); - КонецПопытки; - - КонецЕсли; - - // Удаляем каталог файла, если после удаления файла каталог стал пустым. - Попытка - МассивФайловВКаталоге = НайтиФайлы(ФайлВременный.Путь, "*.*"); - Если МассивФайловВКаталоге.Количество() = 0 Тогда - УдалитьФайлы(ФайлВременный.Путь); - КонецЕсли; - Исключение - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Удаление файлов в томе при обмене'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ИнформацияОбОшибке() ); - КонецПопытки; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Работа с томами файлов - -// Возвращает тип хранения файлов. -// -// Возвращаемое значение: -// Булево. Истина, если указано хранить файлы в томах на диске. -// -Функция ХранениеФайловВТомахНаДиске() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ХранитьФайлыВТомахНаДиске = Константы.ХранитьФайлыВТомахНаДиске.Получить(); - - Возврат ХранитьФайлыВТомахНаДиске; - -КонецФункции - -// Возвращает тип хранения файлов с учетом наличия томов. -// Если томов хранения файлов нет, тогда хранение в ИБ. -// -// Возвращаемое значение: -// ПеречисленияСсылка.ТипыХраненияФайлов. -// -Функция ТипХраненияФайлов() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ХранитьФайлыВТомахНаДиске = Константы.ХранитьФайлыВТомахНаДиске.Получить(); - - Если ХранитьФайлыВТомахНаДиске Тогда - - Если ФайловыеФункции.ЕстьТомаХраненияФайлов() Тогда - Возврат Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; - Иначе - Возврат Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - КонецЕсли; - - Иначе - Возврат Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - КонецЕсли; - -КонецФункции - -// Проверяет, что хотя бы в одном томе есть хотя бы один файл. -// -// Возвращаемое значение: -// Булево. -// -Функция ЕстьФайлыВТомах() Экспорт - - Если КоличествоФайловВТомах() <> 0 Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Возвращает полный путь тома - в зависимости от ОС. -Функция ПолныйПутьТома(СсылкаНаТом) Экспорт - - СистемнаяИнфо = Новый СистемнаяИнформация; - ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; - - Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 - Или ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда - - Возврат СсылкаНаТом.ПолныйПутьWindows; - Иначе - Возврат СсылкаНаТом.ПолныйПутьLinux; - КонецЕсли; - -КонецФункции - -// Добавляет файл в один из томов (где есть свободное место). -// -// Параметры: -// ДвоичныеДанныеИлиПуть - ДвоичныеДанные, Строка - двоичные данные файла или полный путь к файлу на диске. -// ВремяИзмененияУниверсальное - Дата - универсальное время, которое будет установлено файлу как время последнего -// изменения. -// ИмяБезРасширения - Строка - имя файла без расширения. -// Расширение - Строка - расширение файла без точки. -// НомерВерсии - Строка - номер версии файла. Если указан, то имя файла для хранения на диске формируется -// как: -// ИмяБезРасширения + "." + НомерВерсии + "." + Расширение -// в противном случае, ИмяБезРасширения + "." + Расширение. -// Зашифрован - Булево - если Истина, то к полному имени файла будет добавлено расширение ".p7m". -// ДатаДляРазмещенияВТоме - Дата - если не указано, то используется текущее время сеанса. -// -// Возвращаемое значение: -// Структура - со свойствами: -// * Том - СправочникСсылка.ТомаХраненияФайлов - том, в котором был размещен файл. -// * ПутьКФайлу - Строка - путь, по которому был размещен файл в томе. -// -Функция ДобавитьФайлВТом(ДвоичныеДанныеИлиПуть, ВремяИзмененияУниверсальное, ИмяБезРасширения, Расширение, - НомерВерсии = "", Зашифрован = Ложь, ДатаДляРазмещенияВТоме = Неопределено) Экспорт - - ОжидаемыеТипы = Новый Массив; - ОжидаемыеТипы.Добавить(Тип("ДвоичныеДанные")); - ОжидаемыеТипы.Добавить(Тип("Строка")); - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ФайловыеФункцииСлужебный.ДобавитьНаДиск", "ДвоичныеДанныеИлиПуть", ДвоичныеДанныеИлиПуть, - Новый ОписаниеТипов(ОжидаемыеТипы)); - - УстановитьПривилегированныйРежим(Истина); - - СсылкаНаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); - - КраткоеОписаниеВсехОшибок = ""; // Ошибки со всех томов. - ПодробноеОписаниеВсехОшибок = ""; // Для журнала регистрации. - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТомаХраненияФайлов.Ссылка - |ИЗ - | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов - |ГДЕ - | ТомаХраненияФайлов.ПометкаУдаления = ЛОЖЬ - | - |УПОРЯДОЧИТЬ ПО - | ТомаХраненияФайлов.ПорядокЗаполнения"; - - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Количество() = 0 Тогда - ВызватьИсключение НСтр("ru = 'Нет ни одного тома для размещения файла.'"); - КонецЕсли; - - Пока Выборка.Следующий() Цикл - - СсылкаНаТом = Выборка.Ссылка; - - ПутьКТому = ПолныйПутьТома(СсылкаНаТом); - // Добавляем слэш в конце, если его нет. - ПутьКТому = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКТому); - - // Имя файла для хранения на диске формировать следующим образом - // - имя файла.номер версии.расширение файла. - Если ПустаяСтрока(НомерВерсии) Тогда - ИмяФайла = ИмяБезРасширения + "." + Расширение; - Иначе - ИмяФайла = ИмяБезРасширения + "." + НомерВерсии + "." + Расширение; - КонецЕсли; - - Если Зашифрован Тогда - ИмяФайла = ИмяФайла + "." + "p7m"; - КонецЕсли; - - Попытка - - Если ТипЗнч(ДвоичныеДанныеИлиПуть) = Тип("ДвоичныеДанные") Тогда - РазмерФайла = ДвоичныеДанныеИлиПуть.Размер(); - Иначе // Считаем, что иначе это путь к файлу на диске. - ФайлИсточник = Новый Файл(ДвоичныеДанныеИлиПуть); - РазмерФайла = ФайлИсточник.Размер(); - КонецЕсли; - - // Если МаксимальныйРазмер = 0 - нет ограничения на размер файлов на томе. - Если СсылкаНаТом.МаксимальныйРазмер <> 0 Тогда - - ТекущийРазмерВБайтах = 0; - - ПриОпределенииРазмераФайловНаТоме(СсылкаНаТом.Ссылка, ТекущийРазмерВБайтах); - - НовыйРазмерВБайтах = ТекущийРазмерВБайтах + РазмерФайла; - НовыйРазмер = НовыйРазмерВБайтах / (1024 * 1024); - - Если НовыйРазмер > СсылкаНаТом.МаксимальныйРазмер Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Превышен максимальный размер тома (%1 Мб).'"), - СсылкаНаТом.МаксимальныйРазмер); - КонецЕсли; - КонецЕсли; - - Дата = ТекущаяДатаСеанса(); - Если ДатаДляРазмещенияВТоме <> Неопределено Тогда - Дата = ДатаДляРазмещенияВТоме; - КонецЕсли; - - // Использование абсолютного формата даты "ДФ" в следующей строке - // является правильным, так как дата используется не для просмотра пользователем. - ПутьДня = Формат(Дата, "ДФ=ггггММдд") + ПолучитьРазделительПути(); - - ПутьКТому = ПутьКТому + ПутьДня; - - ИмяФайлаСПутем = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ПутьКТому, ИмяФайла); - ПолноеИмяФайлаСПутем = ПутьКТому + ИмяФайлаСПутем; - - Если ТипЗнч(ДвоичныеДанныеИлиПуть) = Тип("ДвоичныеДанные") Тогда - ДвоичныеДанныеИлиПуть.Записать(ПолноеИмяФайлаСПутем); - Иначе // Считаем, что иначе это путь к файлу на диске. - КопироватьФайл(ДвоичныеДанныеИлиПуть, ПолноеИмяФайлаСПутем); - КонецЕсли; - - // Установка времени изменения файла таким, как оно стоит в текущей версии. - ФайлНаДиске = Новый Файл(ПолноеИмяФайлаСПутем); - ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ВремяИзмененияУниверсальное); - ФайлНаДиске.УстановитьТолькоЧтение(Истина); - - Возврат Новый Структура("Том,ПутьКФайлу", СсылкаНаТом, ПутьДня + ИмяФайлаСПутем); - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - Если ПодробноеОписаниеВсехОшибок <> "" Тогда - ПодробноеОписаниеВсехОшибок = ПодробноеОписаниеВсехОшибок + Символы.ПС + Символы.ПС; - КраткоеОписаниеВсехОшибок = КраткоеОписаниеВсехОшибок + Символы.ПС + Символы.ПС; - КонецЕсли; - - ШаблонОписанияОшибки = - НСтр("ru = 'Ошибка при добавлении файла ""%1"" - |в том ""%2"" (%3): - |""%4"".'"); - - ПодробноеОписаниеВсехОшибок = ПодробноеОписаниеВсехОшибок - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОписанияОшибки, - ИмяФайла, - Строка(СсылкаНаТом), - ПутьКТому, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - - КраткоеОписаниеВсехОшибок = КраткоеОписаниеВсехОшибок - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОписанияОшибки, - ИмяФайла, - Строка(СсылкаНаТом), - ПутьКТому, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - - // Надо переходить к следующему тому. - Продолжить; - КонецПопытки; - - КонецЦикла; - - УстановитьПривилегированныйРежим(Ложь); - - // Запись в журнал регистрации для администратора - // здесь выдадим ошибки со всех томов. - ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось добавить файл ни в один из томов. - |Список ошибок: - | - |%1'"); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Добавление файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, ПодробноеОписаниеВсехОшибок)); - - Если Пользователи.ЭтоПолноправныйПользователь() Тогда - СтрокаИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, КраткоеОписаниеВсехОшибок); - Иначе - // Сообщение обычному пользователю. - СтрокаИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось добавить файл: - |""%1.%2"". - | - |Обратитесь к администратору.'"), - ИмяБезРасширения, Расширение); - КонецЕсли; - - ВызватьИсключение СтрокаИсключения; - -КонецФункции - -// Возвращает количество файлов, хранящихся в томах. -Функция КоличествоФайловВТомах() - - КоличествоФайловВТомах = 0; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваФайловВТомах"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииКоличестваФайловВТомах(КоличествоФайловВТомах); - КонецЦикла; - - Возврат КоличествоФайловВТомах; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Электронная подпись и шифрование для файлов. - -// Управляет видимостью элементов и команд в зависимости от наличия и -// использования электронной подписи и шифрования. -// -Процедура КриптографияПриСозданииФормыНаСервере(Форма, ЭтоФормаСписка = Истина, ТолькоКартинкаСтрок = Ложь) Экспорт - - Элементы = Форма.Элементы; - - ЭлектронноеПодписание = Ложь; - Шифрование = Ложь; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") - И Пользователи.РолиДоступны("ДобавлениеИзменениеЭлектронныхПодписейИШифрование") - И Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиентПодMacOS() Тогда - - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - - ЭлектронноеПодписание = МодульЭлектроннаяПодпись.ИспользоватьЭлектронныеПодписи(); - Шифрование = МодульЭлектроннаяПодпись.ИспользоватьШифрование(); - КонецЕсли; - - Используется = ЭлектронноеПодписание Или Шифрование; - - Если ЭтоФормаСписка Тогда - Элементы.СписокНомерКартинкиПодписанЗашифрован.Видимость = Используется; - КонецЕсли; - - Если Не ТолькоКартинкаСтрок Тогда - Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Видимость = Используется; - - Если ЭтоФормаСписка Тогда - Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Видимость = Используется; - Иначе - Элементы.ГруппаЭлектронныеПодписи.Видимость = ЭлектронноеПодписание; - Элементы.ГруппаСертификатыШифрования.Видимость = Шифрование; - Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц = - ?(Используется, ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет); - КонецЕсли; - КонецЕсли; - - Если Не Используется Тогда - Возврат; - КонецЕсли; - - Если Не ТолькоКартинкаСтрок Тогда - Элементы.ФормаГруппаКомандЭлектроннаяПодпись.Видимость = ЭлектронноеПодписание; - Элементы.ФормаГруппаКомандШифрование.Видимость = Шифрование; - - Если ЭтоФормаСписка Тогда - Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодпись.Видимость = ЭлектронноеПодписание; - Элементы.СписокКонтекстноеМенюГруппаКомандШифрование.Видимость = Шифрование; - КонецЕсли; - КонецЕсли; - - Если ЭлектронноеПодписание И Шифрование Тогда - Заголовок = НСтр("ru = 'Электронная подпись и шифрование'"); - Подсказка = НСтр("ru = 'Наличие электронной подписи или шифрования'"); - Картинка = БиблиотекаКартинок["ПодписанЗашифрованЗаголовок"]; - ИначеЕсли ЭлектронноеПодписание Тогда - Заголовок = НСтр("ru = 'Электронная подпись'"); - Подсказка = НСтр("ru = 'Наличие электронной подписи'"); - Картинка = БиблиотекаКартинок["ПодписанЭП"]; - Иначе // Шифрование - Заголовок = НСтр("ru = 'Шифрование'"); - Подсказка = НСтр("ru = 'Наличие шифрования'"); - Картинка = БиблиотекаКартинок["Зашифрован"]; - КонецЕсли; - - Если ЭтоФормаСписка Тогда - Элементы.СписокНомерКартинкиПодписанЗашифрован.КартинкаШапки = Картинка; - Элементы.СписокНомерКартинкиПодписанЗашифрован.Подсказка = Подсказка; - КонецЕсли; - - Если Не ТолькоКартинкаСтрок Тогда - Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Заголовок = Заголовок; - Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Подсказка = Заголовок; - Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Картинка = Картинка; - - Если ЭтоФормаСписка Тогда - Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Заголовок = Заголовок; - Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Подсказка = Заголовок; - Элементы.СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрование.Картинка = Картинка; - КонецЕсли; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ОформитьСписокПодписей(Форма, "ЭлектронныеПодписи"); - КонецЕсли; - -КонецПроцедуры - -// Только для внутреннего использования. -Процедура ПеренестиРезультатыПроверкиПодписей(ПодписиВФорме, ПодписиВОбъекте) Экспорт - - Если ПодписиВФорме.Количество() <> ПодписиВОбъекте.Количество() Тогда - Возврат; // Если объект был изменен, результаты проверки не переносятся. - КонецЕсли; - - Если ПодписиВФорме.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Свойства = Новый Структура("ДатаПроверкиПодписи, ПодписьВерна", Null, Null); - ЗаполнитьЗначенияСвойств(Свойства, ПодписиВОбъекте[0]); - Если Свойства.ДатаПроверкиПодписи = Null - Или Свойства.ПодписьВерна = Null Тогда - Возврат; // Если в объекте нет реквизитов проверки, результаты проверки не переносятся. - КонецЕсли; - - Для Каждого Строка Из ПодписиВФорме Цикл - СтрокаВОбъекте = ПодписиВОбъекте.Получить(ПодписиВФорме.Индекс(Строка)); - Если Строка.ДатаПодписи <> СтрокаВОбъекте.ДатаПодписи - Или Строка.Комментарий <> СтрокаВОбъекте.Комментарий - Или Строка.КомуВыданСертификат <> СтрокаВОбъекте.КомуВыданСертификат - Или Строка.Отпечаток <> СтрокаВОбъекте.Отпечаток - Или Строка.УстановившийПодпись <> СтрокаВОбъекте.УстановившийПодпись Тогда - Возврат; // Если объект был изменен, результаты проверки не переносятся. - КонецЕсли; - КонецЦикла; - - Для Каждого Строка Из ПодписиВФорме Цикл - СтрокаВОбъекте = ПодписиВОбъекте.Получить(ПодписиВФорме.Индекс(Строка)); - ЗаполнитьЗначенияСвойств(Свойства, СтрокаВОбъекте); - Если Строка.ДатаПроверкиПодписи = Свойства.ДатаПроверкиПодписи - И Строка.ПодписьВерна = Свойства.ПодписьВерна Тогда - Продолжить; // Не нужно устанавливать модифицированность, если результаты проверки совпадают. - КонецЕсли; - ЗаполнитьЗначенияСвойств(Свойства, Строка); - ЗаполнитьЗначенияСвойств(СтрокаВОбъекте, Свойства); - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Прочие функции - -// Возвращает Истина, если текст из файлов извлекается на сервере, а не на клиенте. -// -// Возвращаемое значение: -// Булево. Ложь - если текст не извлекается на сервере, -// т.е. может и должен быть извлечен на клиенте. -// -Функция ИзвлекатьТекстыФайловНаСервере() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Возврат Константы.ИзвлекатьТекстыФайловНаСервере.Получить(); - -КонецФункции - -// Возвращает Истина, если сервер работает под Windows. -Функция ЭтоПлатформаWindows() Экспорт - - СистемнаяИнфо = Новый СистемнаяИнформация; - ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; - - Возврат (ТипПлатформыСервера = ТипПлатформы.Windows_x86) - Или (ТипПлатформыСервера = ТипПлатформы.Windows_x86_64); - -КонецФункции - -// Получает строку из временного хранилища (передача с клиента на сервер, -// делается через временное хранилище). -// -Функция ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста) Экспорт - - Если ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда - Возврат ""; - КонецЕсли; - - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); - ПолучитьИзВременногоХранилища(АдресВременногоХранилищаТекста).Записать(ИмяВременногоФайла); - - ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); - Текст = ТекстовыйФайл.Прочитать(); - ТекстовыйФайл.Закрыть(); - УдалитьФайлы(ИмяВременногоФайла); - - Возврат Текст; - -КонецФункции - -// Служебная функция используется для помещения двоичных данных файла в томе -// в хранилище значения. -// -Функция ПоместитьДвоичныеДанныеВХранилище(Том, ПутьКФайлу, УникальныйИдентификатор) Экспорт - - ПолныйПуть = ПолныйПутьТома(Том) + ПутьКФайлу; - УникальныйИдентификатор = УникальныйИдентификатор; - - ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); - Возврат Новый ХранилищеЗначения(ДвоичныеДанные); - -КонецФункции - -// Служебная функция используется при создании начального образа. -// Выполняется всегда на сервере. -// -Процедура СкопироватьФайлПриСозданииНачальногоОбраза(ПолныйПуть, НовыйПутьФайла) Экспорт - - Попытка - // Если файл в томе - скопируем его во временный каталог (при создании начального образа). - КопироватьФайл(ПолныйПуть, НовыйПутьФайла); - ФайлВременный = Новый Файл(НовыйПутьФайла); - ФайлВременный.УстановитьТолькоЧтение(Ложь); - Исключение - // Не регистрируется, возможно файл не найден. - КонецПопытки; - -КонецПроцедуры - -// Записывает на сервер результат извлечения текста - извлеченный текст и СтатусИзвлеченияТекста. -Процедура ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияСсылка, - РезультатИзвлечения, - АдресВременногоХранилищаТекста) Экспорт - - ФайлИлиВерсияОбъект = ФайлИлиВерсияСсылка.ПолучитьОбъект(); - ФайлИлиВерсияОбъект.Заблокировать(); - - Если ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда - Текст = ""; - Иначе - Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); - ФайлИлиВерсияОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); - УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); - КонецЕсли; - - Если РезультатИзвлечения = "НеИзвлечен" Тогда - ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - ИначеЕсли РезультатИзвлечения = "Извлечен" Тогда - ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - ИначеЕсли РезультатИзвлечения = "ИзвлечьНеУдалось" Тогда - ФайлИлиВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; - КонецЕсли; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриЗаписиИзвлеченногоТекста"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаписиИзвлеченногоТекста(ФайлИлиВерсияОбъект); - КонецЦикла; - -КонецПроцедуры - -// Получает кодировку текстового файла, указанную пользователем (если есть). -// -// Параметры: -// ВерсияФайла - ссылка на версию файла. -// -// Возвращаемое значение: -// Строка - идентификатор кодировки текста или пустая строка. -// -Функция ПолучитьКодировкуВерсииФайла(ВерсияФайла) Экспорт - - Кодировка = ""; - ПриОпределенииКодировкиВерсииФайла(ВерсияФайла, Кодировка); - - Возврат Кодировка; - -КонецФункции - -Функция СписокРасширенийДляПредпросмотра() Экспорт - - // См. также перечисление ФорматКартинки. - РасширенияДляПредпросмотра = Новый СписокЗначений; - РасширенияДляПредпросмотра.Добавить("bmp"); - РасширенияДляПредпросмотра.Добавить("emf"); - РасширенияДляПредпросмотра.Добавить("gif"); - РасширенияДляПредпросмотра.Добавить("ico"); - РасширенияДляПредпросмотра.Добавить("icon"); - РасширенияДляПредпросмотра.Добавить("jpg"); - РасширенияДляПредпросмотра.Добавить("jpeg"); - РасширенияДляПредпросмотра.Добавить("png"); - РасширенияДляПредпросмотра.Добавить("tiff"); - РасширенияДляПредпросмотра.Добавить("tif"); - РасширенияДляПредпросмотра.Добавить("wmf"); - - Возврат РасширенияДляПредпросмотра; - -КонецФункции - -Функция СписокЗапрещенныхРасширений() Экспорт - - СписокЗапрещенныхРасширений = Новый СписокЗначений; - СписокЗапрещенныхРасширений.Добавить("ade"); - СписокЗапрещенныхРасширений.Добавить("adp"); - СписокЗапрещенныхРасширений.Добавить("app"); - СписокЗапрещенныхРасширений.Добавить("bas"); - СписокЗапрещенныхРасширений.Добавить("bat"); - СписокЗапрещенныхРасширений.Добавить("chm"); - СписокЗапрещенныхРасширений.Добавить("class"); - СписокЗапрещенныхРасширений.Добавить("cmd"); - СписокЗапрещенныхРасширений.Добавить("com"); - СписокЗапрещенныхРасширений.Добавить("cpl"); - СписокЗапрещенныхРасширений.Добавить("crt"); - СписокЗапрещенныхРасширений.Добавить("dll"); - СписокЗапрещенныхРасширений.Добавить("exe"); - СписокЗапрещенныхРасширений.Добавить("fxp"); - СписокЗапрещенныхРасширений.Добавить("hlp"); - СписокЗапрещенныхРасширений.Добавить("hta"); - СписокЗапрещенныхРасширений.Добавить("ins"); - СписокЗапрещенныхРасширений.Добавить("isp"); - СписокЗапрещенныхРасширений.Добавить("jse"); - СписокЗапрещенныхРасширений.Добавить("js"); - СписокЗапрещенныхРасширений.Добавить("lnk"); - СписокЗапрещенныхРасширений.Добавить("mda"); - СписокЗапрещенныхРасширений.Добавить("mdb"); - СписокЗапрещенныхРасширений.Добавить("mde"); - СписокЗапрещенныхРасширений.Добавить("mdt"); - СписокЗапрещенныхРасширений.Добавить("mdw"); - СписокЗапрещенныхРасширений.Добавить("mdz"); - СписокЗапрещенныхРасширений.Добавить("msc"); - СписокЗапрещенныхРасширений.Добавить("msi"); - СписокЗапрещенныхРасширений.Добавить("msp"); - СписокЗапрещенныхРасширений.Добавить("mst"); - СписокЗапрещенныхРасширений.Добавить("ops"); - СписокЗапрещенныхРасширений.Добавить("pcd"); - СписокЗапрещенныхРасширений.Добавить("pif"); - СписокЗапрещенныхРасширений.Добавить("prf"); - СписокЗапрещенныхРасширений.Добавить("prg"); - СписокЗапрещенныхРасширений.Добавить("reg"); - СписокЗапрещенныхРасширений.Добавить("scf"); - СписокЗапрещенныхРасширений.Добавить("scr"); - СписокЗапрещенныхРасширений.Добавить("sct"); - СписокЗапрещенныхРасширений.Добавить("shb"); - СписокЗапрещенныхРасширений.Добавить("shs"); - СписокЗапрещенныхРасширений.Добавить("url"); - СписокЗапрещенныхРасширений.Добавить("vb"); - СписокЗапрещенныхРасширений.Добавить("vbe"); - СписокЗапрещенныхРасширений.Добавить("vbs"); - СписокЗапрещенныхРасширений.Добавить("wsc"); - СписокЗапрещенныхРасширений.Добавить("wsf"); - СписокЗапрещенныхРасширений.Добавить("wsh"); - - Возврат СписокЗапрещенныхРасширений; - -КонецФункции - -Функция ПодготовитьСтруктуруПараметровОтправки() Экспорт - - Возврат Новый Структура("Получатель,Тема,Текст", Неопределено, "", ""); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов - -Функция ФайлРедактируетсяВОблаке(Файл) Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл - |ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - |ГДЕ - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &Файл"; - - Запрос.УстановитьПараметр("Файл", Файл); - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - Возврат Истина; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в эту подсистему. - -// См. описание одноименной процедуры в общем модуле РегламентныеЗаданияПереопределяемый. -// -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ИзвлечениеТекста; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); - Зависимость.ФункциональнаяОпция = МодульПолнотекстовыйПоискСервер.ИспользоватьПолнотекстовыйПоиск(); - КонецЕсли; - Зависимость.ДоступноВМоделиСервиса = Ложь; - - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОчисткаНенужныхФайлов; - Зависимость.РаботаетСВнешнимиРесурсами = Истина; - - Зависимость = Зависимости.Добавить(); - Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияФайлов; - Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюФайлов; - Зависимость.РаботаетСВнешнимиРесурсами = Истина; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов с облачным сервисом. -Процедура ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта) Экспорт - - ВсеСправочники = Справочники.ТипВсеСсылки(); - ВсеДокументы = Документы.ТипВсеСсылки(); - - Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Справочник.Реквизиты Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + " КАК " + Реквизит.Имя +","; - КонецЦикла; - ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Документ = Метаданные.Документы[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Документ.Реквизиты Цикл - Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + ","; - КонецЦикла; - КонецЕсли; - -КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий подсистем БСП. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.1.6"; - Обработчик.Процедура = "ФайловыеФункцииСлужебный.ПеренестиКонстантыРасширений"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.5"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ФайловыеФункцииСлужебный.ОбновитьСписокЗапрещенныхРасширений"; - Обработчик.РежимВыполнения = "Оперативно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.5"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ФайловыеФункцииСлужебный.ОбновитьСписокЗапрещенныхРасширенийВОбластиДанных"; - Обработчик.РежимВыполнения = "Оперативно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.4.52"; - Обработчик.ОбщиеДанные = Истина; - Обработчик.Процедура = "ФайловыеФункцииСлужебный.ОбновитьПутьТомаLinux"; - Обработчик.РежимВыполнения = "Оперативно"; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - НастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами(); - - Параметры.Вставить("ПерсональныеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( - НастройкиРаботыСФайлами.ПерсональныеНастройки)); - - Параметры.Вставить("ОбщиеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( - НастройкиРаботыСФайлами.ОбщиеНастройки)); - -КонецПроцедуры - -// Добавляет параметры работы клиентской логики при запуске системы для подсистемы обмена данными в модели сервиса. -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - НастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйПовтИсп.НастройкиРаботыСФайлами(); - - Параметры.Вставить("ПерсональныеНастройкиРаботыСФайлами", Новый ФиксированнаяСтруктура( - НастройкиРаботыСФайлами.ПерсональныеНастройки)); - -КонецПроцедуры - -// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены -// при создании информационной базы или обновлении программы. -// -// Параметры: -// ЗапросыРазрешений - Массив - список значений, возвращенных функцией. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(). -// -Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - - Если ПолучитьФункциональнуюОпцию("ХранитьФайлыВТомахНаДиске") Тогда - Справочники.ТомаХраненияФайлов.ДобавитьЗапросыНаИспользованиеВнешнихРесурсовВсехТомов(ЗапросыРазрешений); - КонецЕсли; - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок -// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок -// гарантируется с помощью других механизмов. -// -// Параметры: -// Типы - Массив(ОбъектМетаданных). -// -Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - - // В процессе выгрузки данных ссылки на справочник ТомаХраненияФайлов очищаются, - // а при загрузке загрузка производится относительно настройки томов в ИБ, в которую - // производится загрузка, а не относительно настройки томов в ИБ, из которой были - // выгружены данные. - Типы.Добавить(Метаданные.Справочники.ТомаХраненияФайлов); - -КонецПроцедуры - -// Содержит настройки размещения вариантов отчетов в панели отчетов. -// -// Параметры: -// Настройки - Коллекция - Содержит настройки всех отчетов и вариантов конфигурации. -// Используется для передачи в параметрах вспомогательных методов. -// -// Описание: -// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// -// Вспомогательные методы: -// 1. Функции ОписаниеОтчета и ОписаниеВарианта формируют описание настроек отчета и варианта для последующего изменения: -// НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); -// Возвращаемые коллекции содержат одинаковый набор свойств. -// НастройкиОтчета используются как умолчания для вариантов, описания которых еще не получены. -// Подробнее - см. "свойства для изменения" в комментарии к ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). -// 2. Процедура УстановитьРежимВыводаВПанеляхОтчетов позволяет настроить режим группировки вариантов в панелях отчетов: -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Отчеты.<ИмяОтчета>, Истина/Ложь); -// ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, Метаданные.Подсистемы.<ИмяПодсистемы>, Истина/Ложь); -// 3. Процедура НастроитьОтчетВМодулеМенеджера позволяет переопределять настройки отчета в его модуле менеджера: -// ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.<ИмяОтчета>); -// -Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ОбъемНенужныхФайлов); - МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПроверкаЦелостностиТома); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обмен файлами - -// Подготовка параметров и предварительные проверки перед созданием файлового начального образа. -// -Функция ПодготовитьДанныеДляСозданияФайловогоНачальногоОбраза(СтруктураПараметров) Экспорт - - Результат = Новый Структура("ДанныеПодготовлены, ТребуетсяПодтверждение, ТекстВопроса", Истина, Ложь, ""); - - Узел = СтруктураПараметров.Узел; - УникальныйИдентификаторФормы = СтруктураПараметров.УникальныйИдентификаторФормы; - Язык = СтруктураПараметров.Язык; - ПолноеИмяФайловойБазыWindows = СтруктураПараметров.ПолноеИмяФайловойБазыWindows; - ПолноеИмяФайловойБазыLinux = СтруктураПараметров.ПолноеИмяФайловойБазыLinux; - ПутьКАрхивуСФайламиТомовWindows = СтруктураПараметров.ПутьКАрхивуСФайламиТомовWindows; - ПутьКАрхивуСФайламиТомовLinux = СтруктураПараметров.ПутьКАрхивуСФайламиТомов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 = 'Укажите полное имя архива с файлами томов (файл *.zip)'"),, - "ПутьКАрхивуСФайламиТомовWindows"); - Результат.ДанныеПодготовлены = Ложь; - Иначе - Файл = Новый Файл(ПутьКАрхивуСФайламиТомов); - - Если Файл.Существует() И ФайлБазы.Существует() Тогда - Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файлы ""%1"" и ""%2"" уже существуют. - |Заменить существующие файлы?'"), ПутьКАрхивуСФайламиТомов, ПолноеИмяФайловойБазы); - Результат.ТребуетсяПодтверждение = Истина; - ИначеЕсли Файл.Существует() Тогда - Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" уже существует. - |Заменить существующий файл?'"), ПутьКАрхивуСФайламиТомов); - Результат.ТребуетсяПодтверждение = Истина; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если Результат.ДанныеПодготовлены Тогда - Если ФайлБазы.Существует() И НЕ Результат.ТребуетсяПодтверждение Тогда - Результат.ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" уже существует. - |Заменить существующий файл?'"), ПолноеИмяФайловойБазы); - Результат.ТребуетсяПодтверждение = Истина; - КонецЕсли; - - // Создать временный каталог. - ИмяКаталога = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ИмяКаталога); - - // Создать временный каталог для файлов. - ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ИмяКаталогаФайлов); - - // Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. - СохранитьНастройку("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); - - // Добавляем в параметры переменные, которые потребуются для создания начального образа. - СтруктураПараметров.Вставить("ИмяКаталога", ИмяКаталога); - СтруктураПараметров.Вставить("ИмяКаталогаФайлов", ИмяКаталогаФайлов); - СтруктураПараметров.Вставить("ЕстьФайлыВТомах", ЕстьФайлыВТомах); - СтруктураПараметров.Вставить("ПутьКАрхивуСФайламиТомов", ПутьКАрхивуСФайламиТомов); - СтруктураПараметров.Вставить("ПолноеИмяФайловойБазы", ПолноеИмяФайловойБазы); - КонецЕсли; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Создать файловый начальный образ на сервере. -// -Процедура СоздатьФайловыйНачальныйОбразНаСервере(Параметры, АдресХранилища) Экспорт - - Попытка - - СтрокаСоединения = "File=""" + Параметры.ИмяКаталога + """;" - + "Locale=""" + Параметры.Язык + """;"; - ПланыОбмена.СоздатьНачальныйОбраз(Параметры.Узел, СтрокаСоединения); // Собственно создание начального образа. - - Если Параметры.ЕстьФайлыВТомах Тогда - ZIP = Новый ЗаписьZipФайла; - ZIP.Открыть(Параметры.ПутьКАрхивуСФайламиТомов); - - ВременныеФайлы = Новый Массив; - ВременныеФайлы = НайтиФайлы(Параметры.ИмяКаталогаФайлов, "*.*"); - - Для Каждого ВременныйФайл Из ВременныеФайлы Цикл - Если ВременныйФайл.ЭтоФайл() Тогда - ПутьВременногоФайла = ВременныйФайл.ПолноеИмя; - ZIP.Добавить(ПутьВременногоФайла); - КонецЕсли; - КонецЦикла; - - ZIP.Записать(); - - УдалитьФайлы(Параметры.ИмяКаталогаФайлов); // Удаляем вместе с файлами внутри. - КонецЕсли; - - Исключение - - УдалитьФайлы(Параметры.ИмяКаталога); - ВызватьИсключение; - - КонецПопытки; - - ПутьВременногоФайлаБазы = Параметры.ИмяКаталога + "\1Cv8.1CD"; - ПереместитьФайл(ПутьВременногоФайлаБазы, Параметры.ПолноеИмяФайловойБазы); - - // очистка - УдалитьФайлы(Параметры.ИмяКаталога); - -КонецПроцедуры - -// Подготовка параметров и предварительные проверки перед созданием серверного начального образа. -// -Функция ПодготовитьДанныеДляСозданияСерверногоНачальногоОбраза(СтруктураПараметров) Экспорт - - Результат = Новый Структура("ДанныеПодготовлены, ТребуетсяПодтверждение, ТекстВопроса", Истина, Ложь, ""); - - Узел = СтруктураПараметров.Узел; - СтрокаСоединения = СтруктураПараметров.СтрокаСоединения; - ПутьКАрхивуСФайламиТомовWindows = СтруктураПараметров.ПутьКАрхивуСФайламиТомовWindows; - ПутьКАрхивуСФайламиТомовLinux = СтруктураПараметров.ПутьКАрхивуСФайламиТомов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.Записать(); - УдалитьФайлы(Параметры.ИмяКаталогаФайлов); // Удаляем вместе с файлами внутри. - КонецЕсли; - - Исключение - - УдалитьФайлы(Параметры.ИмяКаталога); - ВызватьИсключение; - - КонецПопытки; - - // очистка - УдалитьФайлы(Параметры.ИмяКаталога); - -КонецПроцедуры - -// Размещает файлы в томах, устанавливая ссылки в ВерсииФайла. -// -Функция ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux) Экспорт - - ПолноеИмяФайлаZip = ""; - СистемнаяИнфо = Новый СистемнаяИнформация; - ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; - Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда - ПолноеИмяФайлаZip = ПутьКАрхивуWindows; - Иначе - ПолноеИмяФайлаZip = ПутьКАрхивуLinux; - КонецЕсли; - - ИмяКаталога = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ИмяКаталога); - - ZIP = Новый ЧтениеZipФайла(ПолноеИмяФайлаZip); - ZIP.ИзвлечьВсе(ИмяКаталога, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - - СоответствиеПутейФайлов = Новый Соответствие; - - Для Каждого ZIPЭлемент Из ZIP.Элементы Цикл - ПолныйПутьФайла = ИмяКаталога + "\" + ZIPЭлемент.Имя; - УникальныйИдентификатор = ZIPЭлемент.ИмяБезРасширения; - - СоответствиеПутейФайлов.Вставить(УникальныйИдентификатор, ПолныйПутьФайла); - КонецЦикла; - - ТипХраненияФайлов = ТипХраненияФайлов(); - ПрисоединяемыеФайлы = Новый Массив; - НачатьТранзакцию(); - Попытка - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДобавленииФайловВТомаПриРазмещении( - СоответствиеПутейФайлов, ТипХраненияФайлов, ПрисоединяемыеФайлы); - КонецЦикла; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - // Очистим регистрацию изменений, которые мы только что сделали. - Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - ИмяПланаОбмена = ПланОбмена.Имя; - МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; - - ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); - Выборка = МенеджерПланаОбмена.Выбрать(); - - Пока Выборка.Следующий() Цикл - - ПланОбменаОбъект = Выборка.ПолучитьОбъект(); - Если ПланОбменаОбъект.Ссылка <> ЭтотУзел Тогда - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриУдаленииРегистрацииИзменений"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриУдаленииРегистрацииИзменений( - ПланОбменаОбъект.Ссылка, ПрисоединяемыеФайлы); - КонецЦикла; - - КонецЕсли; - КонецЦикла; - - КонецЦикла; - -КонецФункции - -// Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. -// -Процедура СохранитьНастройку(КлючОбъекта, КлючНастроек, Настройки) - - УстановитьПривилегированныйРежим(Истина); - ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики регламентных заданий. - -// Обработчик регламентного задания ИзвлечениеТекста. -// Извлекает текст из файлов на диске. -// -Процедура ИзвлечьТекстИзФайловНаСервере() Экспорт - - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ИзвлечениеТекста); - - ИзвлечьТекстИзФайлов(); - -КонецПроцедуры - -Процедура ИзвлечьТекстИзФайлов() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если НЕ ЭтоПлатформаWindows() Тогда - Возврат; // Извлечение текста работает только под Windows. - КонецЕсли; - - ИмяСРасширениемФайла = ""; - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Извлечение текста'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - , - , - НСтр("ru = 'Начато регламентное извлечения текста'")); - - ИтоговыйТекстЗапроса = ""; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - ТекущийТекстЗапроса = ""; - Обработчик.Модуль.ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(ТекущийТекстЗапроса); - Если НЕ ПустаяСтрока(ТекущийТекстЗапроса) Тогда - Если ПустаяСтрока(ИтоговыйТекстЗапроса) Тогда - ИтоговыйТекстЗапроса = ТекущийТекстЗапроса; - Иначе - ИтоговыйТекстЗапроса = ИтоговыйТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - | - |" + ТекущийТекстЗапроса; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Если ПустаяСтрока(ИтоговыйТекстЗапроса) Тогда - Возврат; - КонецЕсли; - - Запрос = Новый Запрос(ИтоговыйТекстЗапроса); - Результат = Запрос.Выполнить(); - - ТаблицаВыгрузки = Результат.Выгрузить(); - - Для Каждого Строка Из ТаблицаВыгрузки Цикл - - ФайлОбъект = Строка.Ссылка.ПолучитьОбъект(); - Попытка - ФайлОбъект.Заблокировать(); - Исключение - // Заблокированные файлы будут обработаны в следующий раз. - Продолжить; - КонецПопытки; - - ИмяСРасширениемФайла = ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение; - ИмяФайлаСПутем = ""; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииИмениФайлаСПутемКДвоичнымДанным"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииИмениФайлаСПутемКДвоичнымДанным( - ФайлОбъект.Ссылка, ИмяФайлаСПутем, Истина); - КонецЦикла; - - Кодировка = ПолучитьКодировкуВерсииФайла(Строка.Ссылка); - - Отказ = Ложь; - Если ПустаяСтрока(ИмяФайлаСПутем) Тогда - Отказ = Истина; - Текст = ""; - Иначе - Текст = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекст(ИмяФайлаСПутем, Отказ, Кодировка); - КонецЕсли; - - Если Отказ = Ложь Тогда - ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; - Иначе - // Если текст некому извлечь это не ошибка, а нормальный случай. - ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; - КонецЕсли; - - Если Строка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе - И Не ПустаяСтрока(ИмяФайлаСПутем) Тогда - - УдалитьФайлы(ИмяФайлаСПутем); - КонецЕсли; - - ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст, Новый СжатиеДанных); - - Попытка - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриЗаписиИзвлеченногоТекста"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаписиИзвлеченногоТекста(ФайлОбъект); - КонецЦикла; - Исключение - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Извлечение текста'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время регламентного извлечения текста из файла - |""%1"" - |произошла ошибка: - |""%2"".'"), - ИмяСРасширениемФайла, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) )); - КонецПопытки; - - КонецЦикла; - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Извлечение текста'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - , - , - НСтр("ru = 'Закончено регламентное извлечение текста'")); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы. - -// Перенести константы СписокЗапрещенныхРасширений и СписокРасширенийФайловOpenDocument. -Процедура ПеренестиКонстантыРасширений() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - СписокЗапрещенныхРасширений = Константы.СписокЗапрещенныхРасширений.Получить(); - Константы.СписокЗапрещенныхРасширенийОбластиДанных.Установить(СписокЗапрещенныхРасширений); - - СписокРасширенийФайловOpenDocument = Константы.СписокРасширенийФайловOpenDocument.Получить(); - Константы.СписокРасширенийФайловOpenDocumentОбластиДанных.Установить(СписокРасширенийФайловOpenDocument); - - КонецЕсли; - -КонецПроцедуры - -Процедура ОбновитьПутьТомаLinux() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТомаХраненияФайлов.Ссылка - |ИЗ - | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов - |ГДЕ - | ТомаХраненияФайлов.ПолныйПутьLinux ПОДОБНО ""%/\"""; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - НачатьТранзакцию(); - Попытка - Том = Выборка.Ссылка.ПолучитьОбъект(); - Том.ПолныйПутьLinux = СтрЗаменить(Том.ПолныйПутьLinux , "/\", "/"); - Том.Записать(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось обработать том хранения файлов: %1 по причине: - |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, - Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); - КонецПопытки; - - КонецЦикла; - -КонецПроцедуры - -Процедура ОбновитьСписокЗапрещенныхРасширений() Экспорт - - СписокЗапрещенныхРасширенийДляЗагрузки = СписокЗапрещенныхРасширений(); - - СписокЗапрещенныхРасширенийВБазе = Константы.СписокЗапрещенныхРасширений.Получить(); - МассивЗапрещенныхРасширений = СтрРазделить(СписокЗапрещенныхРасширенийВБазе, " "); - ОбновитьСписокЗапрещенныхРасширений = Ложь; - Для Каждого Расширение Из СписокЗапрещенныхРасширенийДляЗагрузки Цикл - Если МассивЗапрещенныхРасширений.Найти(ВРег(Расширение)) = Неопределено Тогда - ОбновитьСписокЗапрещенныхРасширений = Истина; - МассивЗапрещенныхРасширений.Добавить(ВРег(Расширение)); - КонецЕсли; - КонецЦикла; - СписокЗапрещенныхРасширенийВБазе = СтрСоединить(МассивЗапрещенныхРасширений, " "); - Если ОбновитьСписокЗапрещенныхРасширений Тогда - Константы.СписокЗапрещенныхРасширений.Установить(СписокЗапрещенныхРасширенийВБазе); - КонецЕсли; - -КонецПроцедуры - -Процедура ОбновитьСписокЗапрещенныхРасширенийВОбластиДанных() Экспорт - - СписокЗапрещенныхРасширенийДляЗагрузки = СписокЗапрещенныхРасширений(); - - ОбновитьСписокЗапрещенныхРасширенийОбластиДанных = Ложь; - СписокЗапрещенныхРасширенийОбластиДанных = Константы.СписокЗапрещенныхРасширенийОбластиДанных.Получить(); - МассивЗапрещенныхРасширенийОбластиДанных = СтрРазделить(СписокЗапрещенныхРасширенийОбластиДанных, " "); - Для Каждого Расширение Из СписокЗапрещенныхРасширенийДляЗагрузки Цикл - Если МассивЗапрещенныхРасширенийОбластиДанных.Найти(ВРег(Расширение)) = Неопределено Тогда - МассивЗапрещенныхРасширенийОбластиДанных.Добавить(ВРег(Расширение)); - ОбновитьСписокЗапрещенныхРасширенийОбластиДанных = Истина; - КонецЕсли; - КонецЦикла; - СписокЗапрещенныхРасширенийОбластиДанных = СтрСоединить(МассивЗапрещенныхРасширенийОбластиДанных, " "); - Если ОбновитьСписокЗапрещенныхРасширенийОбластиДанных Тогда - Константы.СписокЗапрещенныхРасширенийОбластиДанных.Установить(СписокЗапрещенныхРасширенийОбластиДанных); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы. - -// Дополняет структуру, содержащую общие и персональные настройки по работе с файлами. -Процедура ПриДобавленииНастроекРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - МодульРаботаСФайламиСлужебныйВызовСервера.ДобавитьНастройкиРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки); - КонецЕсли; - -КонецПроцедуры - -Процедура ПриСохраненииНастроекРаботыСФайлами(КлючиОбъектовНастроекРаботыСФайлами) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриСохраненииНастроекРаботыСФайлами(КлючиОбъектовНастроекРаботыСФайлами); - КонецЕсли; - -КонецПроцедуры - -// Вычисляет объем файлов тома в байтах, результат возвращается в параметр РазмерФайлов. -Процедура ПриОпределенииРазмераФайловНаТоме(СсылкаТома, РазмерФайлов) Экспорт - - РазмерФайлов = 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; - КонецЕсли; - - Результат = Новый Структура; - Результат.Вставить("Разрешение", Разрешение); - Результат.Вставить("Цветность", Цветность); - Результат.Вставить("Поворот", Поворот); - Результат.Вставить("РазмерБумаги", РазмерБумаги); - Возврат Результат; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Очистка ненужных файлов - -Процедура ОчиститьНенужныеФайлы(Параметры = Неопределено, АдресРезультата = Неопределено) Экспорт - - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОчисткаНенужныхФайлов); - - УстановитьПривилегированныйРежим(Истина); - - НастройкиОчистки = РегистрыСведений.НастройкиОчисткиФайлов.ТекущиеНастройкиОчистки(); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - НастройкиОчисткиСВерсиями = НастройкиОчистки.НайтиСтроки(Новый Структура("ЭтоФайл, ЭтоНастройкаДляЭлементаСправочника", - Истина, - Ложь)); - - Для Каждого Настройка Из НастройкиОчисткиСВерсиями Цикл - - МассивИсключений = Новый Массив; - ДетализированныеНастройки = НастройкиОчистки.НайтиСтроки(Новый Структура( - "ИдентификаторВладельца, ЭтоФайл, ЭтоНастройкаДляЭлементаСправочника", - Настройка.ВладелецФайла, - Истина, - Истина)); - Если ДетализированныеНастройки.Количество() > 0 Тогда - Для Каждого ЭлементИсключение Из ДетализированныеНастройки Цикл - МассивИсключений.Добавить(ЭлементИсключение.ВладелецФайла); - ОчиститьДанныеНенужныхФайлов(ЭлементИсключение); - КонецЦикла; - КонецЕсли; - - ОчиститьДанныеНенужныхФайлов(Настройка, МассивИсключений); - КонецЦикла; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - НастройкиОчисткиБезВерсий = НастройкиОчистки.НайтиСтроки(Новый Структура("ЭтоФайл, ЭтоНастройкаДляЭлементаСправочника", - Ложь, - Ложь)); - Для Каждого Настройка Из НастройкиОчисткиБезВерсий Цикл - МассивИсключений = Новый Массив; - ДетализированныеНастройки = НастройкиОчистки.НайтиСтроки(Новый Структура( - "ИдентификаторВладельца, ЭтоФайл, ЭтоНастройкаДляЭлементаСправочника", - Настройка.ВладелецФайла, - Ложь, - Истина)); - Если ДетализированныеНастройки.Количество() > 0 Тогда - Для Каждого ЭлементИсключение Из ДетализированныеНастройки Цикл - МассивИсключений.Добавить(ЭлементИсключение.ВладелецФайла); - ОчиститьДанныеНенужныхФайлов(ЭлементИсключение); - КонецЦикла; - КонецЕсли; - - ОчиститьДанныеНенужныхФайлов(Настройка, МассивИсключений); - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -Процедура ОчиститьДанныеНенужныхФайлов(НастройкаОчистки, МассивИсключений = Неопределено) - - Если НастройкаОчистки.Действие = Перечисления.ВариантыОчисткиФайлов.НеОчищать Тогда - Возврат; - КонецЕсли; - - Если МассивИсключений = Неопределено Тогда - МассивИсключений = Новый Массив; - КонецЕсли; - - ДеревоВладельцев = ВыбратьДанныеПоПравилу(НастройкаОчистки, МассивИсключений); - - Если ДеревоВладельцев.Строки.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Файл Из ДеревоВладельцев.Строки Цикл - - Если НастройкаОчистки.ЭтоФайл Тогда - - Если НастройкаОчистки.Действие = Перечисления.ВариантыОчисткиФайлов.ОчиститьФайлыИВерсии Тогда - ФайлДляПометки = Файл.ФайлСсылка.ПолучитьОбъект(); - // Пропускаем удаление, если файл занят для редактирования. - Если ЗначениеЗаполнено(ФайлДляПометки.Редактирует) Тогда - Продолжить; - КонецЕсли; - ФайлДляПометки.УстановитьПометкуУдаления(Истина); - КонецЕсли; - - Для Каждого Версия Из Файл.Строки Цикл - ВыполнитьОчисткуДанныхОФайле(Версия.ВерсияСсылка, Истина); - КонецЦикла; - - Иначе - ВыполнитьОчисткуДанныхОФайле(Файл.ФайлСсылка, Ложь); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Функция ВыбратьДанныеПоПравилу(НастройкаОчистки, МассивИсключений) - - КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; - - ОчищатьПоПравилу = НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.ПоПравилу; - Если ОчищатьПоПравилу Тогда - НастройкиКомпоновщика = НастройкаОчистки.ПравилоОтбора.Получить(); - Если НастройкиКомпоновщика <> Неопределено Тогда - КомпоновщикНастроек.ЗагрузитьНастройки(НастройкаОчистки.ПравилоОтбора.Получить()); - КонецЕсли; - КонецЕсли; - - СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; - ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); - ИсточникДанных.Имя = "ИсточникДанных1"; - ИсточникДанных.ТипИсточникаДанных = "Local"; - - НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - НаборДанных.Имя = "НаборДанных1"; - НаборДанных.ИсточникДанных = ИсточникДанных.Имя; - - СхемаКомпоновкиДанных.ПоляИтога.Очистить(); - - Если НастройкаОчистки.ЭтоНастройкаДляЭлементаСправочника Тогда - ВладелецФайла = НастройкаОчистки.ИдентификаторВладельца; - ЭлементИсключение = НастройкаОчистки.ВладелецФайла; - Иначе - ВладелецФайла = НастройкаОчистки.ВладелецФайла; - ЭлементИсключение = Неопределено; - КонецЕсли; - - СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляОчисткиФайлов( - ВладелецФайла, - НастройкаОчистки, - МассивИсключений, - ЭлементИсключение); - - Структура = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ФайлСсылка"); - - Если НастройкаОчистки.ЭтоФайл Тогда - - СтруктураВерсий = Структура.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - - ВыбранноеПоле = СтруктураВерсий.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ВерсияСсылка"); - - КонецЕсли; - - КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); - - Настройки = КомпоновщикНастроек.ПолучитьНастройки(); - - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипВладельца"); - Параметр.Значение = ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки); - Параметр.Использование = Истина; - - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодОчистки"); - Если Параметр <> Неопределено Тогда - Если НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеМесяца Тогда - ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -1); - ИначеЕсли НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеГода Тогда - ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -12); - ИначеЕсли НастройкаОчистки.ПериодОчистки = Перечисления.ПериодОчисткиФайлов.СтаршеШестиМесяцев Тогда - ЗначениеПериодаОчистки = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -6); - КонецЕсли; - Параметр.Значение = ЗначениеПериодаОчистки; - Параметр.Использование = Истина; - КонецЕсли; - - ПараметрТекущаяДата = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТекущаяДата"); - Если ПараметрТекущаяДата <> Неопределено Тогда - ПараметрТекущаяДата.Значение = ТекущаяДатаСеанса(); - ПараметрТекущаяДата.Использование = Истина; - КонецЕсли; - - Если МассивИсключений.Количество() > 0 Тогда - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивИсключений"); - Параметр.Значение = МассивИсключений; - Параметр.Использование = Истина; - КонецЕсли; - - Если НастройкаОчистки.ЭтоНастройкаДляЭлементаСправочника Тогда - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ЭлементИсключение"); - Параметр.Значение = ЭлементИсключение; - Параметр.Использование = Истина; - КонецЕсли; - - КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; - ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; - ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; - ДеревоЗначений = Новый ДеревоЗначений; - - МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); - ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); - ПроцессорВывода.УстановитьОбъект(ДеревоЗначений); - ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); - - Возврат ДеревоЗначений; - -КонецФункции - -Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение) - - Если Настройка.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - Возврат МодульРаботаСФайламиСлужебный.ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение); - - КонецЕсли; - - Если Не Настройка.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - Возврат МодульПрисоединенныеФайлыСлужебный.ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение); - - КонецЕсли; - -КонецФункции - -Функция ТекстЗапросаПолногоОбъемаФайлов() Экспорт - - ТекстЗапроса = ""; - - ДобавитьПсевдонимПоля = Истина; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.СформироватьТекстЗапросаПолногоОбъемаФайлов(ТекстЗапроса); - ДобавитьПсевдонимПоля = Ложь; - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.СформироватьТекстЗапросаПолногоОбъемаФайлов(ТекстЗапроса, ДобавитьПсевдонимПоля); - - КонецЕсли; - - Возврат ТекстЗапроса; - -КонецФункции - -Процедура ВыполнитьОчисткуДанныхОФайле(ФайлСсылка, ЭтоФайл) - - Если ЭтоФайл Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ВыполнитьОчисткуДанныхОФайле(ФайлСсылка); - Иначе - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ВыполнитьОчисткуДанныхОФайле(ФайлСсылка); - КонецЕсли; - -КонецПроцедуры - -Процедура ПроверитьЦелостностьФайлов(ТаблицаФайлов, Том) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПроверитьЦелостностьФайлов(ТаблицаФайлов, Том); - ДобавитьПсевдонимПоля = Ложь; - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ПроверитьЦелостностьФайлов(ТаблицаФайлов, Том); - - КонецЕсли - -КонецПроцедуры - -Функция ОбъектыИсключенияПриОчисткеФайлов() Экспорт - - МассивОбъектов = Новый Массив; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиПереопределяемый = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиПереопределяемый"); - МодульРаботаСФайламиПереопределяемый.ПриОпределенииОбъектовИсключенияОчисткиФайлов(МассивОбъектов); - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеПереопределяемый = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыПереопределяемый"); - МодульПрисоединенныеПереопределяемый.ПриОпределенииОбъектовИсключенияОчисткиФайлов(МассивОбъектов); - - КонецЕсли; - - Возврат МассивОбъектов; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Синхронизация файлов - -Функция ПриОпределенииОбъектовИсключенияСинхронизацииФайлов() Экспорт - - Массив = Новый Массив; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиПереопределяемый = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиПереопределяемый"); - МодульРаботаСФайламиПереопределяемый.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Массив); - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеПереопределяемый = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыПереопределяемый"); - МодульПрисоединенныеПереопределяемый.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Массив); - - КонецЕсли; - - Возврат Массив; - -КонецФункции - -// Проверяет, была ли ошибка при выполнении HTTP запроса, и вызывает соответствующее исключение. -Процедура ПроверитьИсключениеHTTP1С(Ответ, АдресСервера) - Если (Ответ.КодСостояния >= 400) И (Ответ.КодСостояния <= 599) Тогда - ШаблонОшибки = НСтр("ru = 'Ошибка HTTP 1С : %1 в %2'"); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, Ответ.КодСостояния, РаскодироватьСтроку(АдресСервера, СпособКодированияСтроки.URLВКодировкеURL)); - КонецЕсли; -КонецПроцедуры - -// Выполняет метод протокола webdav. -Процедура ВыполнитьМетодWebdav(ИмяМетода, Href, СоответствиеЗаголовков, СтруктураОбмена, XMLЗапрос="", ТекстПротокола = Неопределено) - - СтруктураHref = СтруктураURIРаскодированная(Href); - - HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref, СтруктураОбмена); - - HTTPЗапросWebdav = Новый HTTPЗапрос(КодироватьСтроку(СтруктураHref.ПутьНаСервере, СпособКодированияСтроки.URLВКодировкеURL), СоответствиеЗаголовков); - - Если ЗначениеЗаполнено(XMLЗапрос) Тогда - HTTPЗапросWebdav.УстановитьТелоИзСтроки(XMLЗапрос); - КонецЕсли; - - Если ТекстПротокола<>Неопределено Тогда - ТекстПротокола = ТекстПротокола + ?(ПустаяСтрока(ТекстПротокола), "", Символы.ПС) - + ИмяМетода + " " + Href + Символы.ПС + Символы.ПС + XMLЗапрос + Символы.ПС; - КонецЕсли; - - СтруктураОбмена.Ответ = HTTP.ВызватьHTTPМетод(ИмяМетода,HTTPЗапросWebdav); - - Если ТекстПротокола<>Неопределено Тогда - ТекстПротокола = ТекстПротокола + ?(ПустаяСтрока(ТекстПротокола), "", Символы.ПС) + "HTTP RESPONSE " - + СтруктураОбмена.Ответ.КодСостояния + Символы.ПС + Символы.ПС; - Для каждого ЗаголовокОтвета Из СтруктураОбмена.Ответ.Заголовки Цикл - ТекстПротокола = ТекстПротокола+ЗаголовокОтвета.Ключ+": " + ЗаголовокОтвета.Значение + Символы.ПС; - КонецЦикла; - ТекстПротокола = ТекстПротокола+Символы.ПС+СтруктураОбмена.Ответ.ПолучитьТелоКакСтроку() + Символы.ПС; - КонецЕсли; - - ПроверитьИсключениеHTTP1С(СтруктураОбмена.Ответ,Href); - -КонецПроцедуры - -// Обновляет уникальный служебный реквизит файла на сервере webdav. -Процедура ОбновитьUID1CФайла(Href, UID1C, ПараметрыСинхронизации) - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-type"] = "text/xml"; - ЗаголовкиHTTP["Accept"] = "text/xml"; - - ВыполнитьМетодWebdav("PROPPATCH",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, - " - | - | - | "+UID1C+" - | - |"); - -КонецПроцедуры - -// Считывает уникальный служебный реквизит файла на сервере webdav. -Функция ПолучитьUID1C(Href,ПараметрыСинхронизации) - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-type"] = "text/xml"; - ЗаголовкиHTTP["Accept"] = "text/xml"; - ЗаголовкиHTTP["Depth"] = "0"; - - ВыполнитьМетодWebdav("PROPFIND",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, - " - | - | - |"); - - КонтекстXml = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); - - НайденныеEtag = ВычислитьXPath("//*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']/*[local-name()='UID1C']",КонтекстXml).ПолучитьСледующий(); - Если НайденныеEtag<>Неопределено Тогда - Возврат НайденныеEtag.ТекстовоеСодержимое; - КонецЕсли; - - Возврат ""; - -КонецФункции - -// Проверяет, поддерживает ли сервер webdav пользовательские свойства для файла. -Функция ПроверитьВозможностьUID1C(Href, UID1C, ПараметрыСинхронизации) - - Попытка - - ОбновитьUID1CФайла(Href, UID1C, ПараметрыСинхронизации); - Возврат ЗначениеЗаполнено(ПолучитьUID1C(Href, ПараметрыСинхронизации)); - - Исключение - - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(), ПараметрыСинхронизации); - - КонецПопытки; - - Возврат Ложь; - -КонецФункции - -// Выполняет MCKOL на сервере webdav. -Процедура ВызватьМетодMKCOL(Href, ПараметрыСинхронизации) - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ВыполнитьМетодWebdav("MKCOL",Href,ЗаголовкиHTTP,ПараметрыСинхронизации); - -КонецПроцедуры // ВызватьМетодMKCOL() - -// Выполняет DELETE на сервере webdav. -Процедура ВызватьМетодDELETE(Href, ПараметрыСинхронизации) - - HrefБезСлеша = ЗакончитьБезСлеша(Href); - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ВыполнитьМетодWebdav("DELETE", HrefБезСлеша, ЗаголовкиHTTP, ПараметрыСинхронизации); - -КонецПроцедуры - -// Получает Etag файла на сервере. -Функция ПолучитьEtag(Href,ПараметрыСинхронизации) - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-type"] = "text/xml"; - ЗаголовкиHTTP["Accept"] = "text/xml"; - ЗаголовкиHTTP["Depth"] = "0"; - - ВыполнитьМетодWebdav("PROPFIND",Href,ЗаголовкиHTTP,ПараметрыСинхронизации, - " - | - | - |"); - - КонтекстXml = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); - - НайденныеEtag = ВычислитьXPath("//*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']/*[local-name()='getetag']",КонтекстXml).ПолучитьСледующий(); - Если НайденныеEtag<>Неопределено Тогда - Возврат НайденныеEtag.ТекстовоеСодержимое; - КонецЕсли; - - Возврат ""; -КонецФункции - -// Инициализирует объект HTTPСоединение. -Функция СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации) - - Если НЕ ЗначениеЗаполнено(СтруктураHref.Порт) Тогда - HTTP = Новый HTTPСоединение( - СтруктураHref.Хост, - , - ПараметрыСинхронизации.Логин, - ПараметрыСинхронизации.Пароль, - , - 20, - ?(СтруктураHref.Схема="https",Новый(Тип("ЗащищенноеСоединениеOpenSSL")),Неопределено)); - Иначе - HTTP = Новый HTTPСоединение( - СтруктураHref.Хост, - СтруктураHref.Порт, - ПараметрыСинхронизации.Логин, - ПараметрыСинхронизации.Пароль, - , - 20, - ?(СтруктураHref.Схема="https",Новый(Тип("ЗащищенноеСоединениеOpenSSL")),Неопределено)); - КонецЕсли; - - Возврат HTTP; - -КонецФункции // - -// Вызывает метод GET на сервере webdav и возвращает адрес загруженного файла во временном хранилище. -Функция ВызватьМетодGET(Href, Etag, ПараметрыСинхронизации, ДатаМодификацииФайла = Неопределено, ДлинаФайла = Неопределено) - - СтруктураHref = СтруктураURIРаскодированная(Href); - - HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации); - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"]="1C Enterprise 8.3"; - ЗаголовкиHTTP["Accept"]="application/octet-stream"; - - HTTPЗапросWebdav = Новый HTTPЗапрос(КодироватьСтроку(СтруктураHref.ПутьНаСервере,СпособКодированияСтроки.URLВКодировкеURL),ЗаголовкиHTTP); - - ПараметрыСинхронизации.Ответ = HTTP.Получить(HTTPЗапросWebdav); - - ПроверитьИсключениеHTTP1С(ПараметрыСинхронизации.Ответ, Href); - - ФайлСДвоичнымиДанными = ПараметрыСинхронизации.Ответ.ПолучитьТелоКакДвоичныеДанные(); - - Etag = ?(ПараметрыСинхронизации.Ответ.Заголовки["ETag"] = Неопределено, "", ПараметрыСинхронизации.Ответ.Заголовки["ETag"]); - ДатаМодификацииФайла = ?(ПараметрыСинхронизации.Ответ.Заголовки["Last-Modified"] = Неопределено,ТекущаяУниверсальнаяДата(),ДатаRFC1123(ПараметрыСинхронизации.Ответ.Заголовки["Last-Modified"])); - ДлинаФайла = ФайлСДвоичнымиДанными.Размер(); - - АдресВременныхДанных = ПоместитьВоВременноеХранилище(ФайлСДвоичнымиДанными); - - Возврат АдресВременныхДанных; - -КонецФункции - -// Помещает файл на сервер webdav с помощью метода PUT и возвращает присвоенный etag в переменную. -Функция ВызватьМетодPUT(Href, ФайлСсылка, ПараметрыСинхронизации, ЭтоФайл) - - Если ЭтоФайл Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - ФайлСДвоичнымиДанными = МодульРаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(ФайлСсылка).ДвоичныеДанные; - Иначе - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - ФайлСДвоичнымиДанными = МодульПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(ФайлСсылка); - КонецЕсли; - - СтруктураHref = СтруктураURIРаскодированная(Href); - - HTTP = СоздатьHTTPСоединениеWebdav(СтруктураHref,ПараметрыСинхронизации); - - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"]="1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-Type"]="application/octet-stream"; - - HTTPЗапросWebdav = Новый HTTPЗапрос(КодироватьСтроку(СтруктураHref.ПутьНаСервере,СпособКодированияСтроки.URLВКодировкеURL),ЗаголовкиHTTP); - - HTTPЗапросWebdav.УстановитьТелоИзДвоичныхДанных(ФайлСДвоичнымиДанными); - - ПараметрыСинхронизации.Ответ = HTTP.Записать(HTTPЗапросWebdav); - - ПроверитьИсключениеHTTP1С(ПараметрыСинхронизации.Ответ,Href); - - Возврат ПолучитьEtag(Href,ПараметрыСинхронизации); - -КонецФункции - -// Загружает файл с сервера с созданием новой версии. -Процедура ЗагрузитьФайлССервера(ПараметрыФайла, ЭтоФайл = Неопределено) - - Перем АдресЗагруженногоФайла, НовыйФайл, СтруктураИмениФайла, ФайлUID1C; - - ИмяФайла = ПараметрыФайла.ИмяФайла; - Href = ПараметрыФайла.Href; - Etag = ПараметрыФайла.Etag; - ДатаМодификацииФайла = ПараметрыФайла.ДатаМодификацииФайла; - ДлинаФайла = ПараметрыФайла.ДлинаФайла; - ДляПользователя = ПараметрыФайла.ДляПользователя; - ОбъектВладелец = ПараметрыФайла.ОбъектВладелец; - СсылкаСуществующегоФайла = ПараметрыФайла.СсылкаСуществующегоФайла; - ПараметрыСинхронизации = ПараметрыФайла.ПараметрыСинхронизации; - ТекстСобытия = НСтр("ru = 'Загрузка файла с сервера: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, ИмяФайла), ПараметрыСинхронизации); - АдресЗагруженногоФайла = ВызватьМетодGET(Href, Etag, ПараметрыСинхронизации, ДатаМодификацииФайла, ДлинаФайла); - - Если ЭтоФайл = Неопределено Тогда - ЭтоФайл = ОбъектЯвляетсяФайлом(ПараметрыФайла.ОбъектВладелец); - КонецЕсли; - - Если АдресЗагруженногоФайла <> Неопределено Тогда - - СтруктураИмениФайла = Новый Файл(ИмяФайла); - - Если СсылкаСуществующегоФайла = Неопределено Тогда - - Если ЭтоФайл Тогда - - МодульРаботаСФайламиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиКлиентСервер"); - ОписаниеФайла = МодульРаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); - - ОписаниеФайла.ИмяБезРасширения = СтруктураИмениФайла.ИмяБезРасширения; - ОписаниеФайла.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение); - ОписаниеФайла.ВремяИзменения = МестноеВремя(ДатаМодификацииФайла,ЧасовойПоясСеанса()); - ОписаниеФайла.ВремяИзмененияУниверсальное = ДатаМодификацииФайла; - ОписаниеФайла.Размер = ДлинаФайла; - ОписаниеФайла.АдресВременногоХранилищаФайла = АдресЗагруженногоФайла; - ОписаниеФайла.Автор = ПараметрыСинхронизации.АвторФайлов; - ОписаниеФайла.НоваяВерсияАвтор = ДляПользователя; - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - НовыйФайл = МодульРаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ОбъектВладелец, ОписаниеФайла); - ДанныеФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(НовыйФайл); - МодульРаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , , ПараметрыФайла.ДляПользователя); - Иначе - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ВладелецФайлов", ОбъектВладелец); - ПараметрыФайла.Вставить("Автор", ПараметрыСинхронизации.АвторФайлов); - ПараметрыФайла.Вставить("ИмяБезРасширения", СтруктураИмениФайла.ИмяБезРасширения); - ПараметрыФайла.Вставить("РасширениеБезТочки", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение)); - ПараметрыФайла.Вставить("ВремяИзменения", МестноеВремя(ДатаМодификацииФайла,ЧасовойПоясСеанса())); - ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ДатаМодификацииФайла); - - НовыйФайл = МодульПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла, АдресЗагруженногоФайла); - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(НовыйФайл, ПараметрыСинхронизации.АвторФайлов); - КонецЕсли; - - Иначе - - Если ЭтоФайл Тогда - - МодульРаботаСФайламиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиКлиентСервер"); - ОписаниеФайла = МодульРаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); - - ОписаниеФайла.ИмяБезРасширения = СтруктураИмениФайла.ИмяБезРасширения; - ОписаниеФайла.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение); - ОписаниеФайла.ВремяИзменения = МестноеВремя(ДатаМодификацииФайла,ЧасовойПоясСеанса()); - ОписаниеФайла.ВремяИзмененияУниверсальное = ДатаМодификацииФайла; - ОписаниеФайла.Размер = ДлинаФайла; - ОписаниеФайла.АдресВременногоХранилищаФайла = АдресЗагруженногоФайла; - ОписаниеФайла.Автор = ПараметрыСинхронизации.АвторФайлов; - ОписаниеФайла.НоваяВерсияАвтор = ПараметрыСинхронизации.АвторФайлов; - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - ВерсияФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ОбновитьВерсиюФайла(СсылкаСуществующегоФайла, ОписаниеФайла, , , ПараметрыСинхронизации.АвторФайлов); - МодульРаботаСФайламиСлужебныйВызовСервера.ОбновитьВерсиюВФайле(СсылкаСуществующегоФайла, ВерсияФайла, Неопределено); - ДанныеФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(СсылкаСуществующегоФайла); - МодульРаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , , ПараметрыФайла.ДляПользователя); - - НовыйФайл = СсылкаСуществующегоФайла; - Иначе - ИнформацияОФайле = Новый Структура; - ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", АдресЗагруженногоФайла); - ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", Неопределено); - ИнформацияОФайле.Вставить("ИмяБезРасширения", СтруктураИмениФайла.ИмяБезРасширения); - ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", ДатаМодификацииФайла); - ИнформацияОФайле.Вставить("Расширение", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение)); - ИнформацияОФайле.Вставить("Редактирует", ПараметрыСинхронизации.АвторФайлов); - - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); - МодульПрисоединенныеФайлы.ОбновитьПрисоединенныйФайл(СсылкаСуществующегоФайла, ИнформацияОФайле); - НовыйФайл = СсылкаСуществующегоФайла; - КонецЕсли; - - КонецЕсли; - - ФайлUID1C = Строка(НовыйФайл.Ссылка.УникальныйИдентификатор()); - ОбновитьUID1CФайла(Href, ФайлUID1C, ПараметрыСинхронизации); - - ЗапомнитьСерверныеДанныеСсылки( - НовыйФайл.Ссылка, - Href, - Etag, - ЭтоФайл, - ОбъектВладелец, - Ложь, - ПараметрыСинхронизации.УчетнаяЗапись); - - ТекстСообщения = НСтр("ru = 'Загружен файл с сервера: %1'"); - Иначе - ТекстСообщения = НСтр("ru = 'Не удалось загрузить файл с сервера: %1'"); - КонецЕсли; - - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайла), ПараметрыСинхронизации); - -КонецПроцедуры - -// Записывает событие в журнал регистрации. -Процедура ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСообщения, ПараметрыСинхронизации) - - ЗаписьЖурналаРегистрации(НСтр("ru = 'Синхронизация файлов с облачным сервисом:'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - , - ПараметрыСинхронизации.УчетнаяЗапись, - ТекстСообщения); - -КонецПроцедуры - -// Возвращает дату, преобразованную из формата RFC 1123 в тип Дата. -Функция ДатаRFC1123(ДатаСтрокойHTTP) - - ИменаМесяцев = "janfebmaraprmayjunjulaugsepoctnovdec"; - // rfc1123-date = wkday "," SP date1 SP time SP "GMT". - ПозицияПервогоПробела = СтрНайти(ДатаСтрокойHTTP, " ");//с первого пробела до второго пробела идет дата. - ПодстрокаДата = Сред(ДатаСтрокойHTTP,ПозицияПервогоПробела+1); - ПодстрокаВремя = Сред(ПодстрокаДата,13); - ПодстрокаДата = Лев(ПодстрокаДата,11); - ПозицияПервогоПробела = СтрНайти(ПодстрокаВремя, " "); - ПодстрокаВремя = Лев(ПодстрокаВремя,ПозицияПервогоПробела-1); - // date1 = 2DIGIT SP month SP 4DIGIT. - ПодстрокаДень = Лев(ПодстрокаДата,2); - ПодстрокаМесяц = Формат(Цел(СтрНайти(ИменаМесяцев,НРег(Сред(ПодстрокаДата,4,3))) / 3)+1,"ЧЦ=2; ЧН=00; ЧВН="); - ПодстрокаГод = Сред(ПодстрокаДата,8); - // time = 2DIGIT ":" 2DIGIT ":" 2DIGIT. - ПодстрокаЧас = Лев(ПодстрокаВремя,2); - ПодстрокаМинута = Сред(ПодстрокаВремя,4,2); - ПодстрокаСекунда = Прав(ПодстрокаВремя,2); - - Возврат Дата(ПодстрокаГод+ПодстрокаМесяц+ПодстрокаДень+ПодстрокаЧас+ПодстрокаМинута+ПодстрокаСекунда); - -КонецФункции - -// Считывает основные данные о состоянии каталога на сервере. Используется для проверки подключения. -Процедура ПрочитатьПараметрыКаталога(РезультатПроверки, HttpАдрес, СтруктураОбмена) - - СтруктураАдресаHTTP = СтруктураURIРаскодированная(HttpАдрес); - АдресСервера = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP); - - Попытка - // получаем каталог - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-type"] = "text/xml"; - ЗаголовкиHTTP["Accept"] = "text/xml"; - ЗаголовкиHTTP["Depth"] = "0"; - - ВыполнитьМетодWebdav("PROPFIND", АдресСервера, ЗаголовкиHTTP, СтруктураОбмена, - " - | - | - |" - ,РезультатПроверки.РезультатПротокол); - - КонтекстДокументаXML = ОпределитьКонтекстXML(СтруктураОбмена.Ответ.ПолучитьТелоКакСтроку()); - - РезультатXPath = ВычислитьXPath("//*[local-name()='response']",КонтекстДокументаXML); - - НайденныйResponse = РезультатXPath.ПолучитьСледующий(); - - Пока НайденныйResponse <> Неопределено Цикл - - НайденныйPropstat = ВычислитьXPath("./*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); - - Если НайденныйPropstat<>Неопределено Тогда - Для каждого ДочернийУзелPropstat Из НайденныйPropstat.ДочерниеУзлы Цикл - Если ДочернийУзелPropstat.ЛокальноеИмя = "quota-available-bytes" Тогда - Попытка - РазмерВМегабайтах = Окр(Число(ДочернийУзелPropstat.ТекстовоеСодержимое)/1024/1024, 1); - Исключение - РазмерВМегабайтах = 0; - КонецПопытки; - - ИнформацияОСвободномМесте = НСтр("ru = 'Свободное место (байт): %1(%2 Мб)'"); - - РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИнформацияОСвободномМесте, ДочернийУзелPropstat.ТекстовоеСодержимое, РазмерВМегабайтах); - ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "quota-used-bytes" Тогда - Попытка - РазмерВМегабайтах = Окр(Число(ДочернийУзелPropstat.ТекстовоеСодержимое)/1024/1024, 1); - Исключение - РазмерВМегабайтах = 0; - КонецПопытки; - - ИнформацияОЗанятомМесте = НСтр("ru = 'Занято (байт): %1(%2 Мб)'"); - - РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИнформацияОЗанятомМесте, ДочернийУзелPropstat.ТекстовоеСодержимое, РазмерВМегабайтах); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - НайденныйResponse = РезультатXPath.ПолучитьСледующий(); - - КонецЦикла; - - Исключение - ОписаниеОшибки = ОписаниеОшибки(); - РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) + ОписаниеОшибки; - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки,СтруктураОбмена); - Отказ = Истина; - РезультатПроверки.Отказ = Истина; - КонецПопытки; - -КонецПроцедуры - -// Возвращает структуру URI -Функция СтруктураURIРаскодированная(Знач СтрокаURI) - - СтрокаURI = СокрЛП(СтрокаURI); - - // Схема - Схема = ""; - Позиция = СтрНайти(СтрокаURI, "://"); - Если Позиция > 0 Тогда - Схема = НРег(Лев(СтрокаURI, Позиция - 1)); - СтрокаURI = Сред(СтрокаURI, Позиция + 3); - КонецЕсли; - - // Строка соединения и путь на сервере. - СтрокаСоединения = СтрокаURI; - ПутьНаСервере = ""; - Позиция = СтрНайти(СтрокаСоединения, "/"); - Если Позиция > 0 Тогда - // Включая первый слэш - ПутьНаСервере = Сред(СтрокаСоединения, Позиция); - СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1); - КонецЕсли; - - // Информация пользователя и имя сервера. - СтрокаАвторизации = ""; - ИмяСервера = СтрокаСоединения; - Позиция = СтрНайти(СтрокаСоединения, "@"); - Если Позиция > 0 Тогда - СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1); - ИмяСервера = Сред(СтрокаСоединения, Позиция + 1); - КонецЕсли; - - // Логин и пароль - Логин = СтрокаАвторизации; - Пароль = ""; - Позиция = СтрНайти(СтрокаАвторизации, ":"); - Если Позиция > 0 Тогда - Логин = Лев(СтрокаАвторизации, Позиция - 1); - Пароль = Сред(СтрокаАвторизации, Позиция + 1); - КонецЕсли; - - // Хост и порт - Хост = ИмяСервера; - Порт = ""; - Позиция = СтрНайти(ИмяСервера, ":"); - Если Позиция > 0 Тогда - Хост = Лев(ИмяСервера, Позиция - 1); - Порт = Сред(ИмяСервера, Позиция + 1); - КонецЕсли; - - Результат = Новый Структура; - Результат.Вставить("Схема", НРег(Схема)); - Результат.Вставить("Логин", Логин); - Результат.Вставить("Пароль", Пароль); - Результат.Вставить("ИмяСервера", НРег(ИмяСервера)); - Результат.Вставить("Хост", НРег(Хост)); - Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт))); - Результат.Вставить("ПутьНаСервере", РаскодироватьСтроку(ЗакончитьБезСлеша(ПутьНаСервере),СпособКодированияСтроки.URLВКодировкеURL)); - - // Путь на сервере всегда будет с начальным, но без конечного слэша, универсально для файлов и папок. - Возврат Результат; - -КонецФункции - -// Возвращает URI, составленный из структуры. -Функция КодироватьURIПоСтруктуре(Знач СтруктураURI, ВключаяПутьНаСервере = Истина) - Результат = ""; - - // Протокол - Если Не ПустаяСтрока(СтруктураURI.Схема) Тогда - Результат = Результат + СтруктураURI.Схема + "://"; - КонецЕсли; - - // Авторизация - Если Не ПустаяСтрока(СтруктураURI.Логин) Тогда - Результат = Результат + СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@"; - КонецЕсли; - - // Все остальное - Результат = Результат + СтруктураURI.Хост; - Если ЗначениеЗаполнено(СтруктураURI.Порт) Тогда - Результат = Результат + ":" + ?(ТипЗнч(СтруктураURI.Порт) = Тип("Число"), Формат(СтруктураURI.Порт, "ЧГ=0"), СтруктураURI.Порт); - КонецЕсли; - - Результат = Результат + ?(ВключаяПутьНаСервере, КодироватьСтроку(ЗакончитьБезСлеша(СтруктураURI.ПутьНаСервере), СпособКодированияСтроки.URLВКодировкеURL),""); - - // Всегда без конечного слеша - Возврат Результат; - -КонецФункции - -// Возвращает строку, гарантированно начинающуюся прямым слешем. -Функция НачатьСлешем(Знач ИсходнаяСтрока) - Возврат ?(Лев(ИсходнаяСтрока,1)="/",ИсходнаяСтрока,"/"+ИсходнаяСтрока); -КонецФункции - -// Возвращает строку, гарантированно заканчивающуюся без прямого слэша. -Функция ЗакончитьБезСлеша(Знач ИсходнаяСтрока) - Возврат ?(Прав(ИсходнаяСтрока,1)="/",Лев(ИсходнаяСтрока,СтрДлина(ИсходнаяСтрока)-1),ИсходнаяСтрока); -КонецФункции - -// Возвращает результат сравнения путей двух URI, вне зависимости от наличия начального и конечного прямого слеша, -// кодирования спецсимволов, а так же адреса сервера. -Функция ЭтоОдинаковыеПутиURI(URI1,URI2,ЧувствительноКРегистру = Истина) - - // Гарантирует идентичность вне зависимости от слэшей и кодирования. - СтруктураURI1 = СтруктураURIРаскодированная(URI1); - СтруктураURI2 = СтруктураURIРаскодированная(URI2); - Если НЕ ЧувствительноКРегистру Тогда - СтруктураURI1.ПутьНаСервере = НРег(СтруктураURI1.ПутьНаСервере); - СтруктураURI2.ПутьНаСервере = НРег(СтруктураURI2.ПутьНаСервере); - КонецЕсли; - - Возврат КодироватьURIПоСтруктуре(СтруктураURI1,Истина) = КодироватьURIПоСтруктуре(СтруктураURI2,Истина); - -КонецФункции - -// Возвращает имя файла по Href. -Функция ИмяФайлаПоHref(Href) - - URI = ЗакончитьБезСлеша(Href); - ДлинаURI = СтрДлина(URI); - - // Находим последний слэш, после него будет имя файла. - - Для Сч = 1 По ДлинаURI Цикл - СимволURI = Сред(URI,ДлинаURI - Сч + 1, 1); - Если СимволURI = "/" Тогда - Возврат РаскодироватьСтроку(Сред(URI,ДлинаURI - Сч + 2), СпособКодированияСтроки.КодировкаURL); - КонецЕсли; - КонецЦикла; - - Возврат РаскодироватьСтроку(URI,СпособКодированияСтроки.КодировкаURL); - -КонецФункции - -// Сохраняет данные о Href и Etag файла или папки в базе данных. -Процедура ЗапомнитьСерверныеДанныеСсылки( - Ссылка, - Href, - Etag, - ЭтоФайл, - ВладелецФайла, - ЭтоПапка, - УчетнаяЗапись = Неопределено) - - ЗаписьРегистра = РегистрыСведений.СтатусыСинхронизацииФайловСОблачнымСервисом.СоздатьМенеджерЗаписи(); - ЗаписьРегистра.Файл = Ссылка; - ЗаписьРегистра.Href = Href; - ЗаписьРегистра.Etag = Etag; - ЗаписьРегистра.УникальныйИдентификатор1С = Ссылка.УникальныйИдентификатор(); - ЗаписьРегистра.ЭтоФайл = ЭтоФайл; - ЗаписьРегистра.ЭтоВладелецФайла = ЭтоПапка; - ЗаписьРегистра.ВладелецФайла = ВладелецФайла; - ЗаписьРегистра.УчетнаяЗапись = УчетнаяЗапись; - ЗаписьРегистра.Записать(Истина); - -КонецПроцедуры - -// Удаляет данные о Href и Etag файла или папки в базе данных. -Процедура УдалитьСерверныеДанныеСсылки(Ссылка, УчетнаяЗапись) - - НаборРегистра = РегистрыСведений.СтатусыСинхронизацииФайловСОблачнымСервисом.СоздатьНаборЗаписей(); - НаборРегистра.Отбор.Файл.Установить(Ссылка); - НаборРегистра.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); - НаборРегистра.Записать(Истина); - -КонецПроцедуры - -// Определяет контекст xml -Функция ОпределитьКонтекстXML(ТекстXML) - - ЧтениеXMLТекста = Новый ЧтениеXML; - ЧтениеXMLТекста.УстановитьСтроку(ТекстXML); - ПостроительDOMДляXML = Новый ПостроительDOM; - ДокументDOMДляXML = ПостроительDOMДляXML.Прочитать(ЧтениеXMLТекста); - РазыменовательИменДляXML = Новый РазыменовательПространствИменDOM(ДокументDOMДляXML); - Возврат Новый Структура("ДокументDOM,РазыменовательDOM", ДокументDOMДляXML, РазыменовательИменДляXML); - -КонецФункции - -// Вычисляет выражение xpath для контекста xml. -Функция ВычислитьXPath(Выражение, Контекст, УзелКонтекста = Неопределено) - - Возврат Контекст.ДокументDOM.ВычислитьВыражениеXPath(Выражение,?(УзелКонтекста=Неопределено,Контекст.ДокументDOM,УзелКонтекста),Контекст.РазыменовательDOM); - -КонецФункции - -// Возвращает Href, рассчитанный для строки из таблицы файлов, методом поиска всех родителей. -Функция РассчитатьHref(СтрокаФайлов,ТаблицаФайлов) - // Рекурсивно собираем наименования. - НайденыСтрокиФайлов = ТаблицаФайлов.Найти(СтрокаФайлов.Родитель,"ФайлСсылка"); - Если НайденыСтрокиФайлов = Неопределено Тогда - Возврат ?(ЗначениеЗаполнено(СтрокаФайлов.Наименование), КодироватьСтроку(СтрокаФайлов.Наименование,СпособКодированияСтроки.КодировкаURL)+"/",""); - Иначе - Возврат РассчитатьHref(НайденыСтрокиФайлов,ТаблицаФайлов) + КодироватьСтроку(СтрокаФайлов.Наименование,СпособКодированияСтроки.КодировкаURL)+"/"; - КонецЕсли; -КонецФункции - -// Возвращает строку таблицы файлов по URI, при этом, учитывается возможное различное написание URI -// (например, закодированное, относительное или абсолютное и т.п.). -Функция НайтиСтрокуПоURI(ИскомоеURI, ТаблицаСURI, КолонкаURI) - - Для каждого СтрокаТаблицы Из ТаблицаСURI Цикл - Если ЭтоОдинаковыеПутиURI(ИскомоеURI,СтрокаТаблицы[КолонкаURI]) Тогда - Возврат СтрокаТаблицы; - КонецЕсли; - КонецЦикла; - - Возврат Неопределено; - -КонецФункции - -// Вычисляется уровень строки файлов, рекурсивным алгоритмом. -Функция РекурсивноУровень(СтрокаФайлов,ТаблицаФайлов) - - // Равен уровню в базе или на сервере, в зависимости от того, где он меньше. - НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.Родитель)); - КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество()=0,0,1); - Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл - КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровень(НайденнаяСтрокаФайлов,ТаблицаФайлов); - КонецЦикла; - - Возврат КоличествоПрибавления; - -КонецФункции - -// Вычисляется уровень файла на сервере webdav, рекурсивным алгоритмом. -Функция РекурсивноУровеньНаСервере(СтрокаФайлов,ТаблицаФайлов) - - НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.РодительСервер)); - КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество() =0, 0, 1); - Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл - КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровеньНаСервере(НайденнаяСтрокаФайлов, ТаблицаФайлов); - КонецЦикла; - - Возврат КоличествоПрибавления; - -КонецФункции - -// Вычисляет уровни всех строк таблицы файлов. -Процедура ВычислитьУровеньРекурсивно(ТаблицаФайлов) - - Для каждого СтрокаФайлов Из ТаблицаФайлов Цикл - // Равен уровню в базе или на сервере, в зависимости от того, где он меньше. - УровеньВБазе = РекурсивноУровень(СтрокаФайлов, ТаблицаФайлов); - УровеньНаСервере = РекурсивноУровеньНаСервере(СтрокаФайлов, ТаблицаФайлов); - Если УровеньНаСервере = 0 Тогда - СтрокаФайлов.Уровень = УровеньВБазе; - СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель; - Иначе - Если УровеньВБазе <= УровеньНаСервере Тогда - СтрокаФайлов.Уровень = УровеньВБазе; - СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель; - Иначе - СтрокаФайлов.Уровень = УровеньНаСервере; - СтрокаФайлов.РодительСортировка = СтрокаФайлов.РодительСервер; - КонецЕсли; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// При изменении серверного пути к папке необходимо заменить пути к подчиненным файлам, что и делает эта процедура. -Процедура РекурсивноОбновитьСсылкиПодчиненных(СтрокаФайлов,знач ToHref,знач ToHref2,ТаблицаФайлов) - - // Меняем корневую ссылку, всегда должна быть закодирована. - СтрокаФайлов.ToHref = КодироватьСтроку( - СтрЗаменить( - РаскодироватьСтроку(ЗакончитьБезСлеша(СтрокаФайлов.ToHref), СпособКодированияСтроки.URLВКодировкеURL), - РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref), СпособКодированияСтроки.URLВКодировкеURL), - РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref2), СпособКодированияСтроки.URLВКодировкеURL)) - ,СпособКодированияСтроки.URLВКодировкеURL); - - НайденныеПодчиненныеСтроки = ТаблицаФайлов.НайтиСтроки(Новый Структура("РодительСервер", СтрокаФайлов.Ссылка)); - Для каждого ПодчиненнаяСтрока Из НайденныеПодчиненныеСтроки Цикл - РекурсивноОбновитьСсылкиПодчиненных(ПодчиненнаяСтрока,ToHref,ToHref2,ТаблицаФайлов); - КонецЦикла; - -КонецПроцедуры - -// Рекурсивно загружает перечень файлов с сервера в таблицу файлов. -Процедура СкачатьДеревоФайловРекурсивно(ТекущиеСтрокиДереваФайлов, HttpАдрес, ПараметрыСинхронизации, Отказ=Ложь) - - СтруктураАдресаHTTP = СтруктураURIРаскодированная(HttpАдрес); - АдресОблачногоСервиса = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP, Ложь); - АдресСервера = КодироватьURIПоСтруктуре(СтруктураАдресаHTTP); - - Попытка - // Получаем каталог - ЗаголовкиHTTP = Новый Соответствие; - ЗаголовкиHTTP["User-Agent"] = "1C Enterprise 8.3"; - ЗаголовкиHTTP["Content-type"] = "text/xml"; - ЗаголовкиHTTP["Accept"] = "text/xml"; - ЗаголовкиHTTP["Depth"] = "1"; - - ВыполнитьМетодWebdav("PROPFIND",АдресСервера,ЗаголовкиHTTP,ПараметрыСинхронизации, - " - | - | - | - |"); - - КонтекстДокументаXML = ОпределитьКонтекстXML(ПараметрыСинхронизации.Ответ.ПолучитьТелоКакСтроку()); - - РезультатXPath = ВычислитьXPath("//*[local-name()='response']", КонтекстДокументаXML); - - НайденныйResponse = РезультатXPath.ПолучитьСледующий(); - - Пока НайденныйResponse <> Неопределено Цикл - - // Href есть всегда, иначе это критическая ошибка. - НайденныйHref = ВычислитьXPath("./*[local-name()='href']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); - Если НайденныйHref = Неопределено Тогда - ТекстОшибки = НСтр("ru = 'Ошибка ответа от сервера: не найден HREF в %1'"); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, АдресСервера); - КонецЕсли; - - ТекстHref = ЗакончитьБезСлеша(НачатьСлешем(НайденныйHref.ТекстовоеСодержимое)); - - Если ЭтоОдинаковыеПутиURI(АдресОблачногоСервиса + ТекстHref, АдресСервера) Тогда - НайденныйResponse = РезультатXPath.ПолучитьСледующий(); - Продолжить; - КонецЕсли; - - НоваяСтрокаДереваФайлов = ТекущиеСтрокиДереваФайлов.Добавить(); - // Всегда закодирована - НоваяСтрокаДереваФайлов.Href = КодироватьСтроку(АдресОблачногоСервиса + ТекстHref, СпособКодированияСтроки.URLВКодировкеURL); - НоваяСтрокаДереваФайлов.ИмяФайла = ИмяФайлаПоHref(НоваяСтрокаДереваФайлов.Href); - НоваяСтрокаДереваФайлов.Etag = ""; - НоваяСтрокаДереваФайлов.UID1C = ""; - НоваяСтрокаДереваФайлов.ЭтоПапка = Неопределено; - - НайденныйPropstat = ВычислитьXPath("./*[local-name()='propstat'][contains(./*[local-name()='status'],'200 OK')]/*[local-name()='prop']", КонтекстДокументаXML, НайденныйResponse).ПолучитьСледующий(); - - Если НайденныйPropstat <> Неопределено Тогда - Для каждого ДочернийУзелPropstat Из НайденныйPropstat.ДочерниеУзлы Цикл - Если ДочернийУзелPropstat.ЛокальноеИмя = "resourcetype" Тогда - НоваяСтрокаДереваФайлов.ЭтоПапка = ВычислитьXPath("./*[local-name()='collection']", КонтекстДокументаXML, ДочернийУзелPropstat).ПолучитьСледующий() <> Неопределено; - ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "UID1C" Тогда - НоваяСтрокаДереваФайлов.UID1C = ДочернийУзелPropstat.ТекстовоеСодержимое; - ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getetag" Тогда - НоваяСтрокаДереваФайлов.Etag = ДочернийУзелPropstat.ТекстовоеСодержимое; - ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getlastmodified" Тогда - НоваяСтрокаДереваФайлов.ДатаМодификации = ДатаRFC1123(ДочернийУзелPropstat.ТекстовоеСодержимое);//UTC - ИначеЕсли ДочернийУзелPropstat.ЛокальноеИмя = "getcontentlength" Тогда - НоваяСтрокаДереваФайлов.Длина = Число(СтрЗаменить(ДочернийУзелPropstat.ТекстовоеСодержимое," ","")); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Если не было UID, пробуем получить его отдельно, это нужно, например, для owncloud. - Если НЕ ЗначениеЗаполнено(НоваяСтрокаДереваФайлов.UID1C) Тогда - НоваяСтрокаДереваФайлов.UID1C = ПолучитьUID1C(НоваяСтрокаДереваФайлов.Href, ПараметрыСинхронизации); - КонецЕсли; - - НайденныйResponse = РезультатXPath.ПолучитьСледующий(); - - КонецЦикла; - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - Отказ = Истина; - КонецПопытки; - - Для каждого СтрокаДереваФайлов Из ТекущиеСтрокиДереваФайлов Цикл - Если СтрокаДереваФайлов.ЭтоПапка = Истина Тогда - СкачатьДеревоФайловРекурсивно(СтрокаДереваФайлов.Строки, СтрокаДереваФайлов.Href, ПараметрыСинхронизации, Отказ); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Загружает с сервера webdav новые папки и файлы, которых еще нет в базе, и отражает их в таблице файлов. -Процедура ЗагрузитьНовыеПрисоединенныеФайлы(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) - - ПодсистемаРаботаСФайламиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами"); - - Для каждого СтрокаДереваФайлов Из СтрокиДереваФайлов Цикл - - Если СтрокаДереваФайлов.ЭтоПапка Тогда - // Папка определяется сначала по UID1C, если не найдена, то по старому Href, т.к. UID может теряться при редактировании, а новый Href еще не может быть найден в базе, - // если UID потерялся при редактировали и папку переместили в другую папку (Href поменялся), то она будет загружена в новую карточку папки - // поиск по Href оправдан, т.к. он уникален на файловом сервере для каждой папки. - ТекущаяПапкаФайлов = Неопределено; - // Теоретически еще можно искать файлы по Etag, но встанет вопрос дублей, поэтому дальше не ищем. - - Если Не ПустаяСтрока(СтрокаДереваФайлов.UID1C) Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл КАК Ссылка - |ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - |ГДЕ - | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С = &УникальныйИдентификатор1С"; - - Запрос.УстановитьПараметр("УникальныйИдентификатор1С", Новый УникальныйИдентификатор(СтрокаДереваФайлов.UID1C)); - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ТекущаяПапкаФайлов = ВыборкаДетальныеЗаписи; - КонецЦикла; - - КонецЕсли; - - Если (ТекущаяПапкаФайлов = Неопределено) И (ТаблицаФайлов.Найти(СтрокаДереваФайлов.Href, "Href") = Неопределено) Тогда - // Это новая папка на сервере - грузим ее, - // но сначала проверим возможность хранения UID1C, и если нельзя - то папка не грузится. - - Если ПодсистемаРаботаСФайламиСуществует Тогда - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - ВозможностьСозданияПапки = МодульРаботаСФайламиСлужебный.ВозможностьСозданияПапки(ОбъектВладелец); - - Если Не ВозможностьСозданияПапки Тогда - Продолжить; - КонецЕсли; - - Если НЕ ПроверитьВозможностьUID1C(СтрокаДереваФайлов.Href,Строка(Новый УникальныйИдентификатор), ПараметрыСинхронизации) Тогда - ТекстСобытия = НСтр("ru = 'Невозможно сохранение дополнительных свойств файла, он не будет загружен: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаДереваФайлов.ИмяФайла), ПараметрыСинхронизации); - Продолжить; - КонецЕсли; - - Попытка - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - ТекущаяПапкаФайлов = МодульРаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(СтрокаДереваФайлов.ИмяФайла, ОбъектВладелец, ПараметрыСинхронизации.АвторФайлов); - - СтрокаДереваФайлов.UID1C = Строка(ТекущаяПапкаФайлов.УникальныйИдентификатор()); - ОбновитьUID1CФайла(СтрокаДереваФайлов.Href,СтрокаДереваФайлов.UID1C,ПараметрыСинхронизации); - - НоваяСтрокаТаблицыФайлов = ТаблицаФайлов.Добавить(); - НоваяСтрокаТаблицыФайлов.ФайлСсылка = ТекущаяПапкаФайлов; - НоваяСтрокаТаблицыФайлов.ПометкаУдаления = Ложь; - НоваяСтрокаТаблицыФайлов.Родитель = ОбъектВладелец; - НоваяСтрокаТаблицыФайлов.ЭтоПапка = Истина; - НоваяСтрокаТаблицыФайлов.UID1C = СтрокаДереваФайлов.UID1C; - НоваяСтрокаТаблицыФайлов.ЕстьВБазе = Истина; - НоваяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - НоваяСтрокаТаблицыФайлов.ИзмененНаСервере = Ложь; - НоваяСтрокаТаблицыФайлов.Изменения = ТекущаяПапкаФайлов; - НоваяСтрокаТаблицыФайлов.Href = ""; - НоваяСтрокаТаблицыФайлов.Etag = ""; - НоваяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - НоваяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - НоваяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - НоваяСтрокаТаблицыФайлов.Наименование = СтрокаДереваФайлов.ИмяФайла; - НоваяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; - НоваяСтрокаТаблицыФайлов.Обработан = Истина; - НоваяСтрокаТаблицыФайлов.ЭтоФайл = Истина; - - ЗапомнитьСерверныеДанныеСсылки( - НоваяСтрокаТаблицыФайлов.ФайлСсылка, - НоваяСтрокаТаблицыФайлов.ToHref, - НоваяСтрокаТаблицыФайлов.ToEtag, - НоваяСтрокаТаблицыФайлов.ЭтоФайл, - НоваяСтрокаТаблицыФайлов.Родитель, - НоваяСтрокаТаблицыФайлов.ЭтоПапка, - ПараметрыСинхронизации.УчетнаяЗапись); - - ТекстСобытия = НСтр("ru = 'Загружена папка с сервера: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, НоваяСтрокаТаблицыФайлов.НаименованиеСервер), ПараметрыСинхронизации); - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - КонецПопытки; - КонецЕсли; - - Иначе - // Обновим ToHref - СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка, "ФайлСсылка"); - СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; - СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); - КонецЕсли; - // Для подчиненных строк это теперь родитель. - ЗагрузитьНовыеПрисоединенныеФайлы(СтрокаДереваФайлов.Строки, ТаблицаФайлов, ПараметрыСинхронизации, ТекущаяПапкаФайлов.Ссылка); - - Иначе - // Это файл - // Файл определяется сначала по UID1C, если не найден, то по старому Href, т.к. UID может теряться при редактировании, а новый Href еще не может быть найден в базе, - // если UID потерялся при редактировали и файл переместили в другую папку (Href поменялся), то он будет загружен в новую карточку файла - // поиск по Href оправдан, т.к. он уникален на файловом сервере для каждого файла. - - ТекущийФайл = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href, ТаблицаФайлов, "Href"); - - Если (ТекущийФайл = Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка ,"ФайлСсылка") = Неопределено) Тогда - // Это новый файл на сервере - грузим его. - Если НЕ ПроверитьВозможностьUID1C(СтрокаДереваФайлов.Href, Строка(Новый УникальныйИдентификатор), ПараметрыСинхронизации) Тогда - ТекстСобытия = НСтр("ru = 'Невозможно сохранение дополнительных свойств файла, он не будет загружен: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаДереваФайлов.ИмяФайла), ПараметрыСинхронизации); - Продолжить; - КонецЕсли; - - Попытка - - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ИмяФайла", СтрокаДереваФайлов.ИмяФайла); - ПараметрыФайла.Вставить("Href", СтрокаДереваФайлов.Href); - ПараметрыФайла.Вставить("Etag", СтрокаДереваФайлов.Etag); - ПараметрыФайла.Вставить("ДатаМодификацииФайла", СтрокаДереваФайлов.ДатаМодификации); - ПараметрыФайла.Вставить("ДлинаФайла", СтрокаДереваФайлов.Длина); - ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); - ПараметрыФайла.Вставить("ОбъектВладелец", ОбъектВладелец); - ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", Неопределено); - ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); - ЗагрузитьФайлССервера(ПараметрыФайла); - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - КонецПопытки; - - Иначе - // Обновим ToHref - СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка"); - СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; - СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаполнитьДанныеИзОблачногоСервиса(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) - - ПодсистемаРаботаСФайламиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами"); - - Для каждого СтрокаДереваФайлов Из СтрокиДереваФайлов Цикл - - Если СтрокаДереваФайлов.ЭтоПапка = Истина Тогда //папки - // Папка определяется сначала по UID1C, если не найдена, то по старому Href, т.к. UID может теряться при редактировании, а новый Href еще не может быть найден в базе, - // если UID потерялся при редактировали и папку переместили в другую папку (Href поменялся), то она будет загружена в новую карточку папки - // поиск по Href оправдан, т.к. он уникален на файловом сервере для каждой папки. - ТекущаяПапкаФайлов = Неопределено; - // Теоретически еще можно искать файлы по Etag, но встанет вопрос дублей, поэтому дальше не ищем. - - Если Не ПустаяСтрока(СтрокаДереваФайлов.UID1C) Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл - |ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - |ГДЕ - | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С = &УникальныйИдентификатор1С"; - - Запрос.УстановитьПараметр("УникальныйИдентификатор1С", Новый УникальныйИдентификатор(СтрокаДереваФайлов.UID1C)); - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ТекущаяПапкаФайлов = ВыборкаДетальныеЗаписи.Файл; - КонецЦикла; - - КонецЕсли; - - Если ТекущаяПапкаФайлов = Неопределено Тогда - ТекущаяПапкаФайлов = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href, ТаблицаФайлов,"Href");// может быть помечена на удаление, тогда у нее нет Href, и тут она не будет найдена. - КонецЕсли; - - Если (ТекущаяПапкаФайлов <> Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка,"ФайлСсылка") <> Неопределено) Тогда - СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущаяПапкаФайлов.Ссылка, "ФайлСсылка"); - СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; - СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); - КонецЕсли; - // Для подчиненных строк это теперь родитель. - ЗаполнитьДанныеИзОблачногоСервиса(СтрокаДереваФайлов.Строки, ТаблицаФайлов, ПараметрыСинхронизации, ТекущаяПапкаФайлов.Ссылка); - - Иначе - // Это файл - // Файл определяется сначала по UID1C, если не найден, то по старому Href, т.к. UID может теряться при редактировании, а новый Href еще не может быть найден в базе, - // если UID потерялся при редактировали и файл переместили в другую папку (Href поменялся), то он будет загружен в новую карточку файла - // поиск по Href оправдан, т.к. он уникален на файловом сервере для каждого файла. - - ТекущийФайл = НайтиСтрокуПоURI(СтрокаДереваФайлов.Href,ТаблицаФайлов,"Href"); - - Если (ТекущийФайл <> Неопределено) ИЛИ (ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка") <> Неопределено) Тогда - // Обновим ToHref - СтараяСтрокаТаблицыФайлов = ТаблицаФайлов.Найти(ТекущийФайл.ФайлСсылка,"ФайлСсылка"); - СтараяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - СтараяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - СтараяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - СтараяСтрокаТаблицыФайлов.НаименованиеСервер = СтрокаДереваФайлов.ИмяФайла; - СтараяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - СтараяСтрокаТаблицыФайлов.ИзмененНаСервере = НЕ ЭтоОдинаковыеПутиURI(СтараяСтрокаТаблицыФайлов.ToHref,СтараяСтрокаТаблицыФайлов.Href); - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -// Подготавливает структуру обмена, содержащую значения на время сеанса обмена. -Функция ОсновныеОбъектыСинхронизации(УчетнаяЗапись) - - СтруктураВозврата = Новый Структура("СтруктураАдресаСервера, Ответ, Логин, Пароль"); - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | УчетныеЗаписиСинхронизацииФайлов.Ссылка КАК УчетнаяЗапись, - | УчетныеЗаписиСинхронизацииФайлов.Сервис КАК АдресСервера, - | УчетныеЗаписиСинхронизацииФайлов.КорневаяПапка, - | УчетныеЗаписиСинхронизацииФайлов.АвторФайлов - |ИЗ - | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов - |ГДЕ - | УчетныеЗаписиСинхронизацииФайлов.Ссылка = &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", УчетнаяЗапись); - - Результат = Запрос.Выполнить().Выгрузить(); - - Если Результат.Количество() = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - Для каждого КолонкаРезультата Из Результат.Колонки Цикл - СтруктураВозврата.Вставить(КолонкаРезультата.Имя,Результат[0][КолонкаРезультата.Имя]); - КонецЦикла; - - Если Не ПустаяСтрока(СтруктураВозврата.КорневаяПапка) Тогда - СтруктураВозврата.АдресСервера = СтруктураВозврата.АдресСервера + "/" + СтруктураВозврата.КорневаяПапка; - КонецЕсли; - - Если ПустаяСтрока(СтруктураВозврата.АвторФайлов) Тогда - СтруктураВозврата.АвторФайлов = УчетнаяЗапись; - КонецЕсли; - - СтруктураВозврата.СтруктураАдресаСервера = СтруктураURIРаскодированная(СтруктураВозврата.АдресСервера); - - УстановитьПривилегированныйРежим(Истина); - СтруктураВозврата.Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись, "Логин"); - СтруктураВозврата.Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись); - УстановитьПривилегированныйРежим(Ложь); - - Возврат СтруктураВозврата; - -КонецФункции - -Процедура СинхронизироватьФайлыСОблачнымСервисом(УчетнаяЗапись) - - ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); - - Если ПараметрыСинхронизации = Неопределено Тогда - Возврат; - КонецЕсли; - - АдресОблачногоСервиса = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера, Ложь); - АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); - - ТекстСобытия = НСтр("ru = 'Начало синхронизации файлов с облачным сервисом.'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - - Попытка - - ДеревоФайловСервера = Новый ДеревоЗначений; - ДеревоФайловСервера.Колонки.Добавить("Href"); - ДеревоФайловСервера.Колонки.Добавить("UID1C"); - ДеревоФайловСервера.Колонки.Добавить("Etag"); - ДеревоФайловСервера.Колонки.Добавить("ИмяФайла"); - ДеревоФайловСервера.Колонки.Добавить("ЭтоПапка"); - ДеревоФайловСервера.Колонки.Добавить("ДатаМодификации"); - ДеревоФайловСервера.Колонки.Добавить("Длина"); - - Отказ = Ложь; - СкачатьДеревоФайловРекурсивно(ДеревоФайловСервера.Строки, АдресСервера, ПараметрыСинхронизации, Отказ); - Если Отказ = Истина Тогда - ТекстОшибки = НСтр("ru = 'При загрузке структуры файлов с сервера произошла ошибка, синхронизация не выполнена.'"); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - - // Сравниваем с деревом файлов в системе, синхронизация идет по уникальному идентификатору. - МассивИсключений = Новый Массив; - ТаблицаФайлов = ВыбратьДанныеПоПравилам(УчетнаяЗапись, МассивИсключений); - - Для каждого СтрокаТаблицы Из ТаблицаФайлов Цикл - СтрокаТаблицы.UID1C = Строка(СтрокаТаблицы.ФайлСсылка.УникальныйИдентификатор()); - КонецЦикла; - - // Перебираем дерево, загружаем и добавляем те, которых нет в базе, в таблицу, а по старым заполняем реквизиты с сервера. - ЗагрузитьНовыеПрисоединенныеФайлы(ДеревоФайловСервера.Строки, ТаблицаФайлов, ПараметрыСинхронизации); - - ВычислитьУровеньРекурсивно(ТаблицаФайлов); - ТаблицаФайлов.Сортировать("ЭтоПапка УБЫВ, Уровень, РодительСортировка"); - // Перебираем таблицу и решаем что делать с файлами и папками. - Для Каждого СтрокаТаблицы Из ТаблицаФайлов Цикл - - Если СтрокаТаблицы.Обработан Тогда - Продолжить; - КонецЕсли; - - ОбновитьСтатусСинхронизацииФайла = Ложь; - - СозданНовыйВБазе = (НЕ ЗначениеЗаполнено(СтрокаТаблицы.Href)) И (НЕ ЗначениеЗаполнено(СтрокаТаблицы.ToHref)); - - ИзмененВБазе = ЗначениеЗаполнено(СтрокаТаблицы.Изменения);// что-то поменялось - ИзмененоСодержимоеНаСервере = ЗначениеЗаполнено(СтрокаТаблицы.Etag) И ЗначениеЗаполнено(СтрокаТаблицы.ToEtag) И (СтрокаТаблицы.Etag <> СтрокаТаблицы.ToEtag);// поменялось содержимое - ИзмененНаСервере = ИзмененоСодержимоеНаСервере ИЛИ СтрокаТаблицы.ИзмененНаСервере;// поменялось имя/подчиненность или содержание - - УдаленВБазе = СтрокаТаблицы.ПометкаУдаления; - УдаленНаСервере = ЗначениеЗаполнено(СтрокаТаблицы.Href) И НЕ ЗначениеЗаполнено(СтрокаТаблицы.ToHref); - - НачатьТранзакцию(); - - Попытка - - Если СозданНовыйВБазе И НЕ УдаленВБазе Тогда - - // отправим новый на сервер - СтрокаТаблицы.Наименование = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(СтрокаТаблицы.Наименование, "-"); - СтрокаТаблицы.ToHref = ЗакончитьБезСлеша(АдресСервера) + НачатьСлешем(ЗакончитьБезСлеша(РассчитатьHref(СтрокаТаблицы,ТаблицаФайлов))); - Если СтрокаТаблицы.ЭтоПапка Тогда - ВызватьМетодMKCOL(СтрокаТаблицы.ToHref, ПараметрыСинхронизации); - Иначе - СтрокаТаблицы.ToEtag = ВызватьМетодPUT(СтрокаТаблицы.ToHref, СтрокаТаблицы.ФайлСсылка, ПараметрыСинхронизации, СтрокаТаблицы.ЭтоФайл); - КонецЕсли; - ОбновитьUID1CФайла(СтрокаТаблицы.ToHref, СтрокаТаблицы.UID1C, ПараметрыСинхронизации); - СтрокаТаблицы.РодительСервер = СтрокаТаблицы.Родитель; - СтрокаТаблицы.НаименованиеСервер = СтрокаТаблицы.Наименование; - СтрокаТаблицы.ЕстьНаСервере = Истина; - СтрокаТаблицы.Обработан = Истина; - - Если Не СтрокаТаблицы.ЭтоФайл - И Не СтрокаТаблицы.ЭтоПапка Тогда - Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТаблицы.ФайлСсылка, "Редактирует") <> ПараметрыСинхронизации.АвторФайлов Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(СтрокаТаблицы.ФайлСсылка, ПараметрыСинхронизации.АвторФайлов); - КонецЕсли; - ИначеЕсли Не СтрокаТаблицы.ЭтоПапка Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - ДанныеФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(СтрокаТаблицы.ФайлСсылка); - МодульРаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , , ПараметрыСинхронизации.АвторФайлов); - КонецЕсли; - - ТекстСобытия = НСтр("ru = 'Создан объект в облачном сервисе %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); - - ОбновитьСтатусСинхронизацииФайла = Истина; - - ИначеЕсли УдаленНаСервере И НЕ УдаленВБазе Тогда - - Если Не ЗначениеЗаполнено(СтрокаТаблицы.ФайлСсылка) Тогда - Продолжить; - КонецЕсли; - - // Если это элемент справочника ИдентификаторыОбъектовМетаданных, то не удаляем. - Если ТипЗнч(СтрокаТаблицы.ФайлСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - СтрокаТаблицы.Обработан = Истина; - Продолжить; - КонецЕсли; - // удаляем в базе - СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина,Ложь); - СтрокаТаблицы.ПометкаУдаления = Истина; - СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; - СтрокаТаблицы.Обработан = Истина; - - ТекстСобытия = НСтр("ru = 'Удалено в базе: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); - - ОбновитьСтатусСинхронизацииФайла = Истина; - - ИначеЕсли (ИзмененВБазе ИЛИ ИзмененНаСервере) И НЕ (УдаленВБазе ИЛИ УдаленНаСервере) Тогда - - Если ИзмененНаСервере И НЕ ИзмененВБазе Тогда - // загрузим с сервера - Если СтрокаТаблицы.ЭтоПапка Тогда - // Возможно можно отследить переименование. - ОбъектСтрокиТаблицы = СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект(); - ОбъектСтрокиТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; - ОбъектСтрокиТаблицы.Родитель = Неопределено; - ОбъектСтрокиТаблицы.ПометкаУдаления = Ложь; - ОбъектСтрокиТаблицы.Записать(); - - СтрокаТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; - СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; - СтрокаТаблицы.Родитель = СтрокаТаблицы.РодительСервер; - СтрокаТаблицы.ПометкаУдаления = Ложь; - - ОбновитьСтатусСинхронизацииФайла = Истина; - Иначе - - СтруктураИмениФайла = Новый Файл(СтрокаТаблицы.НаименованиеСервер); - НовоеРасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураИмениФайла.Расширение); - // Загружаем только если поменялось содержимое, т.е. Etag, иначе обновляем реквизиты. - Если СтрокаТаблицы.ЭтоФайл Тогда - Если ИзмененоСодержимоеНаСервере ИЛИ (НовоеРасширениеФайла <> СтрокаТаблицы.ФайлСсылка.ТекущаяВерсияРасширение) Тогда - - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ИмяФайла", СтрокаТаблицы.НаименованиеСервер); - ПараметрыФайла.Вставить("Href", СтрокаТаблицы.ToHref); - ПараметрыФайла.Вставить("Etag", СтрокаТаблицы.ToEtag); - ПараметрыФайла.Вставить("ДатаМодификацииФайла", Неопределено); - ПараметрыФайла.Вставить("ДлинаФайла", Неопределено); - ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); - ПараметрыФайла.Вставить("ОбъектВладелец", СтрокаТаблицы.Родитель); - ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", СтрокаТаблицы.ФайлСсылка); - ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); - - ЗагрузитьФайлССервера(ПараметрыФайла, СтрокаТаблицы.ЭтоФайл); - - КонецЕсли; - Иначе - Если ИзмененоСодержимоеНаСервере ИЛИ (НовоеРасширениеФайла <> СтрокаТаблицы.ФайлСсылка.Расширение) Тогда - - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ИмяФайла", СтрокаТаблицы.НаименованиеСервер); - ПараметрыФайла.Вставить("Href", СтрокаТаблицы.ToHref); - ПараметрыФайла.Вставить("Etag", СтрокаТаблицы.ToEtag); - ПараметрыФайла.Вставить("ЭтоФайл", СтрокаТаблицы.ЭтоФайл); - ПараметрыФайла.Вставить("ДатаМодификацииФайла", Неопределено); - ПараметрыФайла.Вставить("ДлинаФайла", Неопределено); - ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); - ПараметрыФайла.Вставить("ОбъектВладелец", СтрокаТаблицы.Родитель); - ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", СтрокаТаблицы.ФайлСсылка); - ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); - - ЗагрузитьФайлССервера(ПараметрыФайла, СтрокаТаблицы.ЭтоФайл); - - КонецЕсли; - КонецЕсли; - - ОбъектСтрокиТаблицы = СтрокаТаблицы.ФайлСсылка.ПолучитьОбъект(); - Если СтрокаТаблицы.ЭтоФайл Тогда - ОбъектСтрокиТаблицы.ПолноеНаименование = СтруктураИмениФайла.ИмяБезРасширения; - Иначе - ОбъектСтрокиТаблицы.Наименование = СтруктураИмениФайла.ИмяБезРасширения; - КонецЕсли; - ОбъектСтрокиТаблицы.ВладелецФайла = СтрокаТаблицы.РодительСервер; - ОбъектСтрокиТаблицы.ПометкаУдаления = Ложь; - ОбъектСтрокиТаблицы.Записать(); - - СтрокаТаблицы.Наименование = СтрокаТаблицы.НаименованиеСервер; - СтрокаТаблицы.Изменения = СтрокаТаблицы.ФайлСсылка; - СтрокаТаблицы.Родитель = СтрокаТаблицы.РодительСервер; - СтрокаТаблицы.ПометкаУдаления = Ложь; - - КонецЕсли; - - СтрокаТаблицы.Обработан = Истина; - ТекстСобытия = НСтр("ru = 'Обновлен объект в базе: %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.Наименование), ПараметрыСинхронизации); - - ОбновитьСтатусСинхронизацииФайла = Истина; - - КонецЕсли; - - КонецЕсли; - - Если ОбновитьСтатусСинхронизацииФайла Тогда - // Записываем обновления в регистр сведений статусов. - Если СтрокаТаблицы.ПометкаУдаления Тогда - // Удаляем последний Href, чтобы повторно не идентифицировать. - УдалитьСерверныеДанныеСсылки(СтрокаТаблицы.ФайлСсылка, УчетнаяЗапись); - Иначе - ЗапомнитьСерверныеДанныеСсылки( - СтрокаТаблицы.ФайлСсылка, - СтрокаТаблицы.ToHref, - СтрокаТаблицы.ToEtag, - СтрокаТаблицы.ЭтоФайл, - СтрокаТаблицы.Родитель, - СтрокаТаблицы.ЭтоПапка, - УчетнаяЗапись); - КонецЕсли; - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - ОтменитьТранзакцию(); - КонецПопытки; - - КонецЦикла; - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - КонецПопытки; - - ТекстСобытия = НСтр("ru = 'Завершена синхронизация файлов с облачным сервисом'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - -КонецПроцедуры - -Функция ВыбратьДанныеПоПравилам(УчетнаяЗапись, МассивИсключений) - - ЗапросНастройкиСинхронизации = Новый Запрос; - ЗапросНастройкиСинхронизации.Текст = "ВЫБРАТЬ - | НастройкиСинхронизацииФайлов.ВладелецФайла, - | НастройкиСинхронизацииФайлов.ТипВладельцаФайла, - | ИдентификаторыОбъектовМетаданных.Ссылка КАК ИдентификаторВладельца, - | ВЫБОР - | КОГДА ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.Ссылка) <> ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ЭтоНастройкаДляЭлементаСправочника, - | НастройкиСинхронизацииФайлов.ПравилоОтбора, - | НастройкиСинхронизацииФайлов.ЭтоФайл, - | НастройкиСинхронизацииФайлов.УчетнаяЗапись - |ИЗ - | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных - | ПО (ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки)) - |ГДЕ - | НастройкиСинхронизацииФайлов.Синхронизировать - | И НастройкиСинхронизацииФайлов.УчетнаяЗапись = &УчетнаяЗапись"; - ЗапросНастройкиСинхронизации.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); - НастройкиСинхронизации = ЗапросНастройкиСинхронизации.Выполнить().Выгрузить(); - - ТаблицаФайлов = Неопределено; - - Для Каждого Настройка Из НастройкиСинхронизации Цикл - ДеревоФайлов = ВыбратьДанныеПоПравилуСинхронизации(Настройка, МассивИсключений); - Если ТаблицаФайлов = Неопределено Тогда - ТаблицаФайлов = Новый ТаблицаЗначений; - Для Каждого Колонка Из ДеревоФайлов.Колонки Цикл - ТаблицаФайлов.Колонки.Добавить(Колонка.Имя); - КонецЦикла; - КонецЕсли; - - Если Настройка.ЭтоНастройкаДляЭлементаСправочника Тогда - КорневаяПапка = Настройка.ИдентификаторВладельца; - Иначе - КорневаяПапка = Настройка.ВладелецФайла; - КонецЕсли; - - Для Каждого СтрокаФайлов Из ДеревоФайлов.Строки Цикл - НоваяСтрока = ТаблицаФайлов.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаФайлов); - Если НоваяСтрока.ФайлСсылка = Неопределено Тогда - НоваяСтрока.ФайлСсылка = КорневаяПапка; - КонецЕсли; - Если НоваяСтрока.Родитель = Неопределено Тогда - НоваяСтрока.Родитель = КорневаяПапка; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВЫБОР - | КОГДА ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) - | ТОГДА НастройкиСинхронизацииФайлов.ВладелецФайла - | ИНАЧЕ ИдентификаторыОбъектовМетаданных.Ссылка - | КОНЕЦ КАК ФайлСсылка, - | НастройкиСинхронизацииФайлов.ЭтоФайл КАК ЭтоФайл, - | НастройкиСинхронизацииФайлов.УчетнаяЗапись КАК УчетнаяЗапись, - | НастройкиСинхронизацииФайлов.ВладелецФайла КАК ВладелецФайла, - | НастройкиСинхронизацииФайлов.ТипВладельцаФайла КАК ТипВладельцаФайла - |ПОМЕСТИТЬ ВТВиртуальныеКорневыеПапки - |ИЗ - | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных - | ПО (ТИПЗНАЧЕНИЯ(НастройкиСинхронизацииФайлов.ВладелецФайла) = ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки)) - |ГДЕ - | НастройкиСинхронизацииФайлов.Синхронизировать - | И НастройкиСинхронизацииФайлов.УчетнаяЗапись = &УчетнаяЗапись - | - |ИНДЕКСИРОВАТЬ ПО - | УчетнаяЗапись - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВТВиртуальныеКорневыеПапки.ФайлСсылка КАК ФайлСсылка, - | ВТВиртуальныеКорневыеПапки.ЭтоФайл КАК ЭтоФайл, - | ЛОЖЬ КАК ПометкаУдаления, - | ИСТИНА КАК ЭтоПапка, - | ИСТИНА КАК ЕстьВБазе, - | ЛОЖЬ КАК ЕстьНаСервере, - | ЛОЖЬ КАК Обработан, - | ЛОЖЬ КАК ИзмененНаСервере, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Href КАК Href, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Etag КАК Etag, - | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С КАК УникальныйИдентификатор1С, - | ВТВиртуальныеКорневыеПапки.ВладелецФайла, - | ВТВиртуальныеКорневыеПапки.ТипВладельцаФайла - |ИЗ - | ВТВиртуальныеКорневыеПапки КАК ВТВиртуальныеКорневыеПапки - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - | ПО ВТВиртуальныеКорневыеПапки.УчетнаяЗапись = СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись - | И ВТВиртуальныеКорневыеПапки.ФайлСсылка = СтатусыСинхронизацииФайловСОблачнымСервисом.Файл - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |УНИЧТОЖИТЬ ВТВиртуальныеКорневыеПапки"; - - Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - МассивВиртуальныхПапок = Новый Массив; - - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - Если МассивВиртуальныхПапок.Найти(ВыборкаДетальныеЗаписи.ФайлСсылка) <> Неопределено Тогда - Продолжить; - КонецЕсли; - МассивВиртуальныхПапок.Добавить(ВыборкаДетальныеЗаписи.ФайлСсылка); - СтрокаВиртуальнойКорневойПапки = ТаблицаФайлов.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаВиртуальнойКорневойПапки, ВыборкаДетальныеЗаписи); - СтрокаВиртуальнойКорневойПапки.Наименование = СтрЗаменить(ВыборкаДетальныеЗаписи.ФайлСсылка.Синоним, ":", ""); - КонецЦикла; - - Возврат ТаблицаФайлов; - -КонецФункции - -Функция ВыбратьДанныеПоПравилуСинхронизации(НастройкаСинхронизации, МассивИсключений) - - КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; - - НастройкиКомпоновщика = НастройкаСинхронизации.ПравилоОтбора.Получить(); - Если НастройкиКомпоновщика <> Неопределено Тогда - КомпоновщикНастроек.ЗагрузитьНастройки(НастройкаСинхронизации.ПравилоОтбора.Получить()); - КонецЕсли; - - СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; - ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); - ИсточникДанных.Имя = "ИсточникДанных1"; - ИсточникДанных.ТипИсточникаДанных = "Local"; - - НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - НаборДанных.Имя = "НаборДанных1"; - НаборДанных.ИсточникДанных = ИсточникДанных.Имя; - - СхемаКомпоновкиДанных.ПоляИтога.Очистить(); - - Если НастройкаСинхронизации.ЭтоНастройкаДляЭлементаСправочника Тогда - ВладелецФайла = НастройкаСинхронизации.ИдентификаторВладельца; - ЭлементИсключение = НастройкаСинхронизации.ВладелецФайла; - Иначе - ВладелецФайла = НастройкаСинхронизации.ВладелецФайла; - ЭлементИсключение = Неопределено; - КонецЕсли; - - СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляСинхронизацииФайлов( - ВладелецФайла, - НастройкаСинхронизации, - МассивИсключений, - ЭлементИсключение); - - Структура = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ФайлСсылка"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Наименование"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ПометкаУдаления"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Родитель"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЭтоПапка"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЕстьВБазе"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЕстьНаСервере"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Изменения"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Href"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Etag"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Обработан"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("UID1C"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ToHref"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ToEtag"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("РодительСервер"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("НаименованиеСервер"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ИзмененНаСервере"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Уровень"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("РодительСортировка"); - - ВыбранноеПоле = Структура.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); - ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЭтоФайл"); - - КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); - - Настройки = КомпоновщикНастроек.ПолучитьНастройки(); - - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("УчетнаяЗапись"); - Параметр.Значение = НастройкаСинхронизации.УчетнаяЗапись; - Параметр.Использование = Истина; - - Если НастройкаСинхронизации.ЭтоФайл Тогда - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипВладельца"); - Параметр.Значение = ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки); - Параметр.Использование = Истина; - КонецЕсли; - - Если МассивИсключений.Количество() > 0 Тогда - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивИсключений"); - Параметр.Значение = МассивИсключений; - Параметр.Использование = Истина; - КонецЕсли; - - Если НастройкаСинхронизации.ЭтоНастройкаДляЭлементаСправочника Тогда - Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ЭлементИсключение"); - Параметр.Значение = ЭлементИсключение; - Параметр.Использование = Истина; - КонецЕсли; - - КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; - ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; - ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; - ДеревоЗначений = Новый ДеревоЗначений; - - МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); - ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); - ПроцессорВывода.УстановитьОбъект(ДеревоЗначений); - ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); - - Возврат ДеревоЗначений; - -КонецФункции - -Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение) - - Если НастройкаСинхронизации.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - Возврат МодульРаботаСФайламиСлужебный.ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение); - - КонецЕсли; - - Если Не НастройкаСинхронизации.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - Возврат МодульПрисоединенныеФайлыСлужебный.ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение); - - КонецЕсли; - -КонецФункции - -Процедура РегламентнаяСинхронизацияФайловWebdav(Параметры = Неопределено, АдресРезультата = Неопределено) Экспорт - - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияФайлов); - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | УчетныеЗаписиСинхронизацииФайлов.Ссылка, - | УчетныеЗаписиСинхронизацииФайлов.Сервис - |ИЗ - | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов - | ПО НастройкиСинхронизацииФайлов.УчетнаяЗапись = УчетныеЗаписиСинхронизацииФайлов.Ссылка - |ГДЕ - | НЕ УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления - | И НастройкиСинхронизацииФайлов.Синхронизировать"; - - Результат = Запрос.Выполнить().Выгрузить(); - Для каждого Выборка Из Результат Цикл - Если ПустаяСтрока(Выборка.Сервис) Тогда - Продолжить; - КонецЕсли; - СинхронизироватьФайлыСОблачнымСервисом(Выборка.Ссылка); - КонецЦикла; - - ОсвободитьЗахваченныеФайлы(); - -КонецПроцедуры - -Процедура ВыполнитьПроверкуПодключения(УчетнаяЗапись, РезультатПроверки) Экспорт - - РезультатПроверки = Новый Структура("РезультатТекст,РезультатПротокол,Отказ","","",Ложь); - - ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); - - АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); - - ТекстСобытия = НСтр("ru = 'Начата проверка синхронизации файлов'") + " " + УчетнаяЗапись.Наименование; - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - - ПрочитатьПараметрыКаталога(РезультатПроверки,АдресСервера, ПараметрыСинхронизации); - - ТекстСобытия = НСтр("ru = 'Завершена проверка синхронизации файлов'") + " " + УчетнаяЗапись.Наименование; - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - -КонецПроцедуры - -Процедура ОсвободитьЗахваченныеФайлы() - - Запрос = Новый Запрос; - - Запрос.Текст = - "ВЫБРАТЬ - | УчетныеЗаписиСинхронизацииФайлов.Ссылка КАК УчетнаяЗапись - |ПОМЕСТИТЬ НеактивныеУчетныеЗаписи - |ИЗ - | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов - |ГДЕ - | УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | УчетныеЗаписиСинхронизацииФайлов.Ссылка - |ИЗ - | Справочник.УчетныеЗаписиСинхронизацииФайлов КАК УчетныеЗаписиСинхронизацииФайлов - |ГДЕ - | НЕ УчетныеЗаписиСинхронизацииФайлов.ПометкаУдаления - | И НЕ УчетныеЗаписиСинхронизацииФайлов.Ссылка В - | (ВЫБРАТЬ - | НастройкиСинхронизацииФайлов.УчетнаяЗапись - | ИЗ - | РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов - | ГДЕ - | НастройкиСинхронизацииФайлов.Синхронизировать) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | НеактивныеУчетныеЗаписи.УчетнаяЗапись - |ИЗ - | НеактивныеУчетныеЗаписи КАК НеактивныеУчетныеЗаписи - |ГДЕ - | НеактивныеУчетныеЗаписи.УчетнаяЗапись В - | (ВЫБРАТЬ - | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись - | ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом)"; - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаУчетнаяЗапись = РезультатЗапроса.Выбрать(); - - Пока ВыборкаУчетнаяЗапись.Следующий() Цикл - ОсвободитьЗахваченныеФайлыУчетнойЗаписи(ВыборкаУчетнаяЗапись.УчетнаяЗапись); - КонецЦикла; - -КонецПроцедуры - -// Освобождение файлов, захваченных учетными записями с пометкой на удаление или с отключенными настройками синхронизации. -// -Процедура ОсвободитьЗахваченныеФайлыУчетнойЗаписи(УчетнаяЗапись = Неопределено) - - ПараметрыСинхронизации = ОсновныеОбъектыСинхронизации(УчетнаяЗапись); - - Если ПараметрыСинхронизации = Неопределено Тогда - Возврат; - КонецЕсли; - - АдресОблачногоСервиса = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера, Ложь); - АдресСервера = КодироватьURIПоСтруктуре(ПараметрыСинхронизации.СтруктураАдресаСервера); - - ТекстСобытия = НСтр("ru = 'Начало освобождения файлов, захваченных облачным сервисом.'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - - Попытка - - ДеревоФайловСервера = Новый ДеревоЗначений; - ДеревоФайловСервера.Колонки.Добавить("Href"); - ДеревоФайловСервера.Колонки.Добавить("UID1C"); - ДеревоФайловСервера.Колонки.Добавить("Etag"); - ДеревоФайловСервера.Колонки.Добавить("ИмяФайла"); - ДеревоФайловСервера.Колонки.Добавить("ЭтоПапка"); - ДеревоФайловСервера.Колонки.Добавить("ДатаМодификации"); - ДеревоФайловСервера.Колонки.Добавить("Длина"); - - Отказ = Ложь; - СкачатьДеревоФайловРекурсивно(ДеревоФайловСервера.Строки, АдресСервера, ПараметрыСинхронизации, Отказ); - Если Отказ = Истина Тогда - ТекстОшибки = НСтр("ru = 'При загрузке структуры файлов с сервера произошла ошибка, синхронизация не выполнена.'"); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - - // Сравниваем с деревом файлов в системе, синхронизация идет по уникальному идентификатору. - ТаблицаФайлов = ЗахваченныеФайлы(УчетнаяЗапись); - - // Перебираем дерево, загружаем и добавляем те, которых нет в базе, в таблицу, а по старым заполняем реквизиты с сервера. - ЗаполнитьДанныеИзОблачногоСервиса(ДеревоФайловСервера.Строки, ТаблицаФайлов, ПараметрыСинхронизации); - - ВычислитьУровеньРекурсивно(ТаблицаФайлов); - ТаблицаФайлов.Сортировать("ЭтоПапка ВОЗР, Уровень УБЫВ, РодительСортировка УБЫВ"); - // Перебираем таблицу и решаем что делать с файлами и папками. - Для Каждого СтрокаТаблицы Из ТаблицаФайлов Цикл - - Если СтрокаТаблицы.Обработан Тогда - Продолжить; - КонецЕсли; - - НачатьТранзакцию(); - - Попытка - - // удаляем на сервере - ВызватьМетодDELETE(СтрокаТаблицы.Href, ПараметрыСинхронизации); - - ТекстСобытия = НСтр("ru = 'Удален объект в облачном сервисе %1'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСобытия, СтрокаТаблицы.НаименованиеСервер), ПараметрыСинхронизации); - - СтрокаТаблицы.РодительСервер = Неопределено; - СтрокаТаблицы.НаименованиеСервер = ""; - СтрокаТаблицы.ЕстьНаСервере = Ложь; - СтрокаТаблицы.Обработан = Истина; - - Если Не СтрокаТаблицы.ЭтоПапка Тогда - - Если Не СтрокаТаблицы.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ОсвободитьФайл(СтрокаТаблицы.ФайлСсылка); - - КонецЕсли; - - Если СтрокаТаблицы.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - МодульРаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(СтрокаТаблицы.ФайлСсылка); - - КонецЕсли; - - КонецЕсли; - - // Удаляем последний Href, чтобы повторно не идентифицировать. - УдалитьСерверныеДанныеСсылки(СтрокаТаблицы.ФайлСсылка, УчетнаяЗапись); - - ЗафиксироватьТранзакцию(); - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - ОтменитьТранзакцию(); - КонецПопытки; - - КонецЦикла; - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки(),ПараметрыСинхронизации); - КонецПопытки; - - ТекстСобытия = НСтр("ru = 'Завершено освобождения файлов, захваченных облачным сервисом'"); - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстСобытия, ПараметрыСинхронизации); - -КонецПроцедуры - -Функция ОбъектЯвляетсяФайлом(ОбъектВладелец) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - Возврат МодульРаботаСФайламиСлужебный.ОбъектЯвляетсяФайлом(ОбъектВладелец); - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция ЗахваченныеФайлы(УчетнаяЗапись) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл КАК ФайлСсылка, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Файл.Наименование КАК Наименование, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Href, - | СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, - | СтатусыСинхронизацииФайловСОблачнымСервисом.УникальныйИдентификатор1С КАК UID1C, - | СтатусыСинхронизацииФайловСОблачнымСервисом.ЭтоФайл, - | СтатусыСинхронизацииФайловСОблачнымСервисом.ЭтоВладелецФайла КАК ЭтоПапка, - | СтатусыСинхронизацииФайловСОблачнымСервисом.ВладелецФайла КАК Родитель, - | ИСТИНА КАК ЕстьВБазе, - | ЛОЖЬ КАК ЕстьНаСервере, - | НЕОПРЕДЕЛЕНО КАК Изменения, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Href, """") КАК Href, - | ЕСТЬNULL(СтатусыСинхронизацииФайловСОблачнымСервисом.Etag, """") КАК Etag, - | ЛОЖЬ КАК Обработан, - | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК ToHref, - | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК ToEtag, - | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК РодительСервер, - | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК НаименованиеСервер, - | ЛОЖЬ КАК ИзмененНаСервере, - | НЕОПРЕДЕЛЕНО КАК Уровень, - | ВЫРАЗИТЬ("""" КАК СТРОКА(255)) КАК РодительСортировка - |ИЗ - | РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом - |ГДЕ - | СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись = &УчетнаяЗапись"; - - Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); - - РезультатЗапроса = Запрос.Выполнить(); - - ЗахваченныеФайлы = РезультатЗапроса.Выгрузить(); - - Возврат ЗахваченныеФайлы; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl index 5346584f5..15b8f2611 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl @@ -1,127 +1,5 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции в модели сервиса". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - СерверныеОбработчики[ - "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ФайловыеФункцииСлужебныйВМоделиСервиса"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( - "ФайловыеФункцииСлужебныйВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( - "ФайловыеФункцииСлужебныйВМоделиСервиса"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( - "ФайловыеФункцииСлужебныйВМоделиСервиса"); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики[ - "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ФайловыеФункцииСлужебныйВМоделиСервиса"); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события ПриОпределенииПсевдонимовОбработчиков. -// -// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. -// -// Параметры: -// СоответствиеИменПсевдонимам - Соответствие -// Ключ - Псевдоним метода, например ОчиститьОбластьДанных. -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных. -// В качестве значения можно указать Неопределено, в этом случае считается что имя -// совпадает с псевдонимом. -// -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить("ФайловыеФункцииСлужебный.ИзвлечьТекстИзФайлов"); - СоответствиеИменПсевдонимам.Вставить("ФайловыеФункцииСлужебный.ОчиститьНенужныеФайлы"); - СоответствиеИменПсевдонимам.Вставить("ФайловыеФункцииСлужебный.РегламентнаяСинхронизацияФайловWebdav"); - -КонецПроцедуры - -// Формирует таблицу регламентных заданий -// с признаком использования в модели сервиса. -// -// Параметры: -// ТаблицаИспользования - ТаблицаЗначений - таблица, которую необходимо -// заполнить регламентными заданиями и признаком использования, колонки: -// РегламентноеЗадание - Строка - имя предопределенного регламентного задания. -// Использование - Булево - Истина, если регламентное задание должно -// выполняться в модели сервиса. Ложь - если не должно. -// -Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт - - НоваяСтрока = ТаблицаИспользования.Добавить(); - НоваяСтрока.РегламентноеЗадание = "ПланированиеИзвлеченияТекстаВМоделиСервиса"; - НоваяСтрока.Использование = ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск"); - -КонецПроцедуры - -// Обработчик события ПриПолученииСпискаШаблонов. -// -// Формирует список шаблонов заданий очереди. -// -// Параметры: -// Шаблоны - Массив строк. В параметр следует добавить имена предопределенных -// неразделенных регламентных заданий, которые должны использоваться в качестве -// шаблонов для заданий очереди. -// -Процедура ПриПолученииСпискаШаблонов(Шаблоны) Экспорт - - Шаблоны.Добавить("ОчисткаНенужныхФайлов"); - Шаблоны.Добавить("СинхронизацияФайлов"); - -КонецПроцедуры - -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - Массив(Типы). -// -Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - - Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИзвлеченияТекста); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Стандартный программный интерфейс. - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.2.4"; - Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ЗаполнитьОчередьИзвлеченияТекста"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.19"; - Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ПеренестиОчередьИзвлеченияТекстаВоВспомогательныеДанные"; - Обработчик.ОбщиеДанные = Истина; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Извлечение текста @@ -139,14 +17,14 @@ УстановитьПривилегированныйРежим(Истина); НаборЗаписей = РегистрыСведений.ОчередьИзвлеченияТекста.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(ОбщегоНазначения.ЗначениеРазделителяСеанса()); + НаборЗаписей.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); НаборЗаписей.Отбор.ИсточникТекста.Установить(ИсточникТекста); Если СостояниеИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен ИЛИ СостояниеИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка() Тогда Запись = НаборЗаписей.Добавить(); - Запись.ОбластьДанныхВспомогательныеДанные = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + Запись.ОбластьДанныхВспомогательныеДанные = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Запись.ИсточникТекста = ИсточникТекста.Ссылка; КонецЕсли; @@ -155,6 +33,69 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.ИзвлечьТекстИзФайлов"); + СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.ОчиститьНенужныеФайлы"); + СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.РегламентнаяСинхронизацияФайловWebdav"); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. +Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт + + НоваяСтрока = ТаблицаИспользования.Добавить(); + НоваяСтрока.РегламентноеЗадание = "ПланированиеИзвлеченияТекстаВМоделиСервиса"; + НоваяСтрока.Использование = ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск"); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить("ОчисткаНенужныхФайлов"); + ШаблоныЗаданий.Добавить("СинхронизацияФайлов"); + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИзвлеченияТекста); + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.2.4"; + Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ЗаполнитьОчередьИзвлеченияТекста"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.19"; + Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ПеренестиОчередьИзвлеченияТекстаВоВспомогательныеДанные"; + Обработчик.ОбщиеДанные = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Комментарий = + НСтр("ru = 'Очистка регистра сведений УдалитьОчередьИзвлеченияТекста.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("86349f2d-6efb-462e-b05a-cead295ecf1a"); + Обработчик.Процедура = "РегистрыСведений.УдалитьОчередьИзвлеченияТекста.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ЧитаемыеОбъекты = "РегистрСведений.УдалитьОчередьИзвлеченияТекста"; + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.УдалитьОчередьИзвлеченияТекста"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.УдалитьОчередьИзвлеченияТекста.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -167,7 +108,7 @@ // Процедура ОбработатьОчередьИзвлеченияТекста() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -175,7 +116,7 @@ УстановитьПривилегированныйРежим(Истина); - ИмяРазделенногоМетода = "ФайловыеФункцииСлужебный.ИзвлечьТекстИзФайлов"; + ИмяРазделенногоМетода = "РаботаСФайламиСлужебный.ИзвлечьТекстИзФайлов"; ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ @@ -198,7 +139,7 @@ Запрос.УстановитьПараметр("ОбрабатываемыеОбластиДанных", ОчередьЗаданий.ПолучитьЗадания( Новый Структура("ИмяМетода", ИмяРазделенногоМетода))); - Выборка = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать(); + Выборка = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать(); Пока Выборка.Следующий() Цикл // Проверка блокировки области. Если РаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда @@ -222,24 +163,13 @@ // обновлении. Процедура ЗаполнитьОчередьИзвлеченияТекста() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда + Если НЕ РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда Возврат; КонецЕсли; - ТекстЗапроса = ""; + Запрос = Новый Запрос; + Запрос.Текст = РаботаСФайламиСлужебныйВызовСервера.ТекстЗапросаДляИзвлеченияТекста(Истина); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(ТекстЗапроса, Истина); - КонецЦикла; - - Если ПустаяСтрока(ТекстЗапроса) Тогда - Возврат; - КонецЕсли; - - Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОбновитьСостояниеОчередиИзвлеченияТекста(Выборка.Ссылка, Выборка.СтатусИзвлеченияТекста); @@ -252,7 +182,7 @@ // Процедура ПеренестиОчередьИзвлеченияТекстаВоВспомогательныеДанные() Экспорт - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если Не РаботаВМоделиСервисаПовтИсп.РазделениеВключено() Тогда Возврат; КонецЕсли; @@ -262,7 +192,6 @@ Блокировка = Новый БлокировкаДанных(); БлокировкаРегистра = Блокировка.Добавить("РегистрСведений.ОчередьИзвлеченияТекста"); - БлокировкаРегистра.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ТекстЗапроса = diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/Module.bsl deleted file mode 100644 index 815fcf685..000000000 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/Module.bsl +++ /dev/null @@ -1,194 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// См. эту процедуру в модуле ФайловыеФункцииСлужебный. -Процедура ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияСсылка, - РезультатИзвлечения, - АдресВременногоХранилищаТекста) Экспорт - - ФайловыеФункцииСлужебный.ЗаписатьРезультатИзвлеченияТекста( - ФайлИлиВерсияСсылка, - РезультатИзвлечения, - АдресВременногоХранилищаТекста); - -КонецПроцедуры - -// Только для внутреннего использования. -Процедура ПроверитьПодписи(ИсходныеДанные, ДанныеСтрок) Экспорт - - ДатаПроверкиПодписи = ТекущаяДатаСеанса(); - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - - МенеджерКриптографии = МодульЭлектроннаяПодпись.МенеджерКриптографии("ПроверкаПодписи"); - - Для каждого СтрокаПодписи Из ДанныеСтрок Цикл - ОписаниеОшибки = ""; - ПодписьВерна = МодульЭлектроннаяПодпись.ПроверитьПодпись(МенеджерКриптографии, - ИсходныеДанные, СтрокаПодписи.АдресПодписи, ОписаниеОшибки, СтрокаПодписи.ДатаПодписи); - - СтрокаПодписи.ДатаПроверкиПодписи = ТекущаяДатаСеанса(); - СтрокаПодписи.ПодписьВерна = ПодписьВерна; - ФайловыеФункцииСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(СтрокаПодписи, ОписаниеОшибки); - КонецЦикла; - -КонецПроцедуры - -// Возвращает номер по нарастанию. Предыдущее значение берется из регистра сведений НомераОтсканированныхФайлов. -// Параметры: -// Владелец - ЛюбаяСсылка - владелец файла. -// -// Возвращаемое значение: -// Число - новый номер для сканирования. -// -Функция ПолучитьНовыйНомерДляСканирования(Владелец) Экспорт - - // Подготовить структуру отбора по измерениям. - СтруктураОтбора = Новый Структура; - СтруктураОтбора.Вставить("Владелец", Владелец); - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераОтсканированныхФайлов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Владелец", Владелец); - Блокировка.Заблокировать(); - - // Получить структуру с данными ресурсов записи. - СтруктураРесурсов = РегистрыСведений.НомераОтсканированныхФайлов.Получить(СтруктураОтбора); - - // Получить максимальный номер из регистра. - Номер = СтруктураРесурсов.Номер; - Номер = Номер + 1; // увеличим на 1 - - // Запишем новый номер в регистр. - НаборЗаписей = РегистрыСведений.НомераОтсканированныхФайлов.СоздатьНаборЗаписей(); - - НаборЗаписей.Отбор.Владелец.Установить(Владелец); - - НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Владелец = Владелец; - НоваяЗапись.Номер = Номер; - - НаборЗаписей.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Возврат Номер; - -КонецФункции - -// Заносит номер в регистр сведений НомераОтсканированныхФайлов. -// -// Параметры: -// Владелец - ЛюбаяСсылка - владелец файла. -// НовыйНомер - Число - максимальный номер для сканирования. -// -Процедура ЗанестиМаксимальныйНомерДляСканирования(Владелец, НовыйНомер) Экспорт - - // Подготовить структуру отбора по измерениям. - СтруктураОтбора = Новый Структура; - СтруктураОтбора.Вставить("Владелец", Владелец); - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераОтсканированныхФайлов"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Владелец", Владелец); - Блокировка.Заблокировать(); - - // Получить структуру с данными ресурсов записи. - СтруктураРесурсов = РегистрыСведений.НомераОтсканированныхФайлов.Получить(СтруктураОтбора); - - // Получить максимальный номер из регистра. - Номер = СтруктураРесурсов.Номер; - Если НовыйНомер <= Номер Тогда // Кто-то другой уже записал бОльший номер. - ОтменитьТранзакцию(); - Возврат; - КонецЕсли; - - Номер = НовыйНомер; - - // Запишем новый номер в регистр. - НаборЗаписей = РегистрыСведений.НомераОтсканированныхФайлов.СоздатьНаборЗаписей(); - - НаборЗаписей.Отбор.Владелец.Установить(Владелец); - - НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Владелец = Владелец; - НоваяЗапись.Номер = Номер; - - НаборЗаписей.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -Функция ДанныеФайлаИДвоичныеДанные(ФайлВложение, Параметры) Экспорт - - Если Параметры.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - ДанныеФайлаИДвоичныеДанные = МодульРаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(ФайлВложение); - ДанныеФайла = ДанныеФайлаИДвоичныеДанные.ДанныеФайла; - ДвоичныеДанные = ДанныеФайлаИДвоичныеДанные.ДвоичныеДанные; - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Параметры.ИдентификаторФормы); - ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ИмяФайла); - ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); - - Возврат ОписаниеФайла; - - КонецЕсли; - - Если Не Параметры.ЭтоФайл И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - - МодульПрисоединенныеФайлыСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебныйВызовСервера"); - ДанныеФайлаИДвоичныеДанные = МодульПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла(ФайлВложение, Параметры.ИдентификаторФормы); - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ДанныеФайлаИДвоичныеДанные.Наименование, ДанныеФайлаИДвоичныеДанные.Расширение); - ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ИмяФайла); - ОписаниеФайла.Вставить("АдресВоВременномХранилище", ДанныеФайлаИДвоичныеДанные.СсылкаНаДвоичныеДанныеФайла); - - Возврат ОписаниеФайла; - - КонецЕсли; - -КонецФункции - -Функция ПоместитьФайлыВоВременноеХранилище(Параметры) Экспорт - - Перем ЗаписьZipФайла, ИмяАрхива; - - Результат = Новый Массив; - - ИспользованныеИменаФайлов = Новый Соответствие; - - Для Каждого ФайлВложение Из Параметры.МассивФайлов Цикл - ОписаниеФайла = ДанныеФайлаИДвоичныеДанные(ФайлВложение, Параметры); - Результат.Добавить(ОписаниеФайла); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/ФайловыеФункцииСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/ФайловыеФункцииСлужебныйВызовСервера.mdo deleted file mode 100644 index 6ad614442..000000000 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВызовСервера/ФайловыеФункцииСлужебныйВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ФайловыеФункцииСлужебныйВызовСервера - - ru - Файловые функции служебный вызов сервера - - true - true - diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl deleted file mode 100644 index 80265b497..000000000 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl +++ /dev/null @@ -1,1483 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Показывает напоминание о порядке работы с файлом в веб-клиенте, -// если включена настройка "Показывать подсказки при редактировании файлов". -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. -// -Процедура ВывестиНапоминаниеПриРедактировании(ОбработчикРезультата) Экспорт - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда - Если НЕ РасширениеРаботыСФайламиПодключено() Тогда - ОткрытьФорму("ОбщаяФорма.НапоминаниеПриРедактировании", , , , , , ОбработчикРезультата); - Возврат; - КонецЕсли; - КонецЕсли; - ВернутьРезультат(ОбработчикРезультата, Истина); -КонецПроцедуры - -// Показывает стандартное предупреждение. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. -// ПредставлениеКоманды - Строка - Необязательный. Имя команды, для выполнения которой необходимо расширение. -// -Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт - Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда - ТекстПредупреждения = НСтр("ru = 'Выполнение команды ""%1"" в браузерах - |Google Chrome и Mozilla Firefox не поддерживается.'"); - Иначе - ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо - |установить расширение для веб-клиента 1С:Предприятие.'"); - КонецЕсли; - Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда - ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды); - Иначе - ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, " ""%1""", ""); - КонецЕсли; - ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Неопределено); -КонецПроцедуры - -// Возвращает путь к рабочему каталогу пользователя. -Функция РабочийКаталогПользователя() Экспорт - - Возврат ФайловыеФункцииСлужебныйКлиентПовтИсп.РабочийКаталогПользователя(); - -КонецФункции - -// Возвращает путь к рабочему каталогу пользователя. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего -// каталога пользователя. В качестве результата возвращается Структура со свойствами: -// * Каталог - Строка - полное имя рабочего каталога пользователя. -// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. -// -Процедура ПолучитьРабочийКаталогПользователя(Оповещение) Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); - КонецЕсли; - - ИмяКаталога = - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов; - - // Уже установлен. - Если ИмяКаталога <> Неопределено - И НЕ ПустаяСтрока(ИмяКаталога) - И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда - - Результат = Новый Структура; - Результат.Вставить("Каталог", ИмяКаталога); - Результат.Вставить("ОписаниеОшибки", ""); - - ВыполнитьОбработкуОповещения(Оповещение, Результат); - Возврат; - КонецЕсли; - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("Каталог", ИмяКаталога); - - ПолучитьРабочийКаталогДанныхПользователя(Новый ОписаниеОповещения( - "ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных", ЭтотОбъект, Контекст)); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьРабочийКаталогПользователя. -Процедура ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных(Результат, Контекст) Экспорт - - Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - Возврат; - КонецЕсли; - -#Если НЕ ВебКлиент Тогда - - Если Результат.Каталог <> Контекст.Каталог Тогда - // Создать каталог для файлов. - Попытка - СоздатьКаталог(Контекст.Каталог); - ИмяКаталогаТестовое = Контекст.Каталог + "ПроверкаДоступа\"; - СоздатьКаталог(ИмяКаталогаТестовое); - УдалитьФайлы(ИмяКаталогаТестовое); - Исключение - // Нет прав на создание каталога, или такой путь отсутствует, - // тогда установка настроек по умолчанию. - Контекст.Каталог = Неопределено; - КонецПопытки; - КонецЕсли; - -#КонецЕсли - - ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; - - Если Контекст.Каталог = Неопределено Тогда - УстановитьРабочийКаталогПользователя(Результат.Каталог); - Иначе - Результат.Каталог = Контекст.Каталог; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - -КонецПроцедуры - -// Сохраняет путь к рабочему каталогу пользователя в настройках. -// -// Параметры: -// ИмяКаталога - Строка - имя каталога. -// -Процедура УстановитьРабочийКаталогПользователя(ИмяКаталога) Экспорт - - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов", ИмяКаталога); - -КонецПроцедуры - -// Возвращает каталог "Мои Документы" + имя текущего пользователя или -// ранее использованную папку для выгрузки. -// -Функция КаталогВыгрузки() Экспорт - - Путь = ""; - -#Если Не ВебКлиент Тогда - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); - - Путь = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки"); - - Если Путь = Неопределено Тогда - Если НЕ ПараметрыКлиента.ЭтоБазоваяВерсияКонфигурации Тогда - Путь = КаталогМоиДокументы(); - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( - "ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", Путь); - КонецЕсли; - КонецЕсли; - -#КонецЕсли - - Возврат Путь; - -КонецФункции - -// Возвращает каталог "Мои Документы". -// -Функция КаталогМоиДокументы() Экспорт - Возврат КаталогДокументов(); -КонецФункции - -// Показывает пользователю диалог выбора файлов и возвращает -// массив - выбранные файлы для импорта. -// -Функция ИмпортируемыеФайлы() Экспорт - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.МножественныйВыбор = Истина; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); - - МассивИменФайлов = Новый Массив; - - Если ДиалогОткрытияФайла.Выбрать() Тогда - МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; - - Для Каждого ИмяФайла Из МассивФайлов Цикл - МассивИменФайлов.Добавить(ИмяФайла); - КонецЦикла; - - КонецЕсли; - - Возврат МассивИменФайлов; - -КонецФункции - -// Проверяет имя файла на наличие некорректных символов. -// -// Параметры: -// ИмяФайла - Строка- проверяемое имя файла. -// -// УдалятьНекорректныеСимволы - Булево - Истина указывает удалять некорректные -// символы из переданной строки. -// -Процедура КорректноеИмяФайла(ИмяФайла, УдалятьНекорректныеСимволы = Ложь) Экспорт - - // Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru - // при этом были объединены запрещенные символы для файловых систем FAT и NTFS. - - СтрИсключения = ОбщегоНазначенияКлиентСервер.ПолучитьНедопустимыеСимволыВИмениФайла(); - - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В имени файла не должно быть следующих символов: %1'"), СтрИсключения); - - Результат = Истина; - - МассивНайденныхНедопустимыхСимволов = - ОбщегоНазначенияКлиентСервер.НайтиНедопустимыеСимволыВИмениФайла(ИмяФайла); - - Если МассивНайденныхНедопустимыхСимволов.Количество() <> 0 Тогда - - Результат = Ложь; - - Если УдалятьНекорректныеСимволы Тогда - ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла, ""); - КонецЕсли; - - КонецЕсли; - - Если Не Результат Тогда - ВызватьИсключение ТекстОшибки; - КонецЕсли; - -КонецПроцедуры - -// Рекурсивно обходит каталоги и подсчитывает количество файлов и их суммарный размер. -Процедура ОбходФайловРазмер(Путь, МассивФайлов, РазмерСуммарный, КоличествоСуммарное) Экспорт - - Для Каждого ВыбранныйФайл Из МассивФайлов Цикл - - Если ВыбранныйФайл.ЭтоКаталог() Тогда - НовыйПуть = Строка(Путь); - - НовыйПуть = НовыйПуть + ПолучитьРазделительПути(); - - НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); - МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, "*.*"); - - Если МассивФайловВКаталоге.Количество() <> 0 Тогда - ОбходФайловРазмер( - НовыйПуть, МассивФайловВКаталоге, РазмерСуммарный, КоличествоСуммарное); - КонецЕсли; - - Продолжить; - КонецЕсли; - - РазмерСуммарный = РазмерСуммарный + ВыбранныйФайл.Размер(); - КоличествоСуммарное = КоличествоСуммарное + 1; - - КонецЦикла; - -КонецПроцедуры - -// Возвращает путь к каталогу вида -// "C:\Documents and Settings\ИМЯ ПОЛЬЗОВАТЕЛЯ\Application Data\1C\ФайлыА8\". -// -Функция ВыбратьПутьККаталогуДанныхПользователя() Экспорт - - ИмяКаталога = ""; - Если РасширениеРаботыСФайламиПодключено() Тогда - ИмяКаталога = РабочийКаталогДанныхПользователя(); - КонецЕсли; - - Возврат ИмяКаталога; - -КонецФункции - -// Открывает Проводник Windows и выделяет указанный файл. -Функция ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) Экспорт - - ФайлНаДиске = Новый Файл(ПолноеИмяФайла); - - Если НЕ ФайлНаДиске.Существует() Тогда - Возврат Ложь; - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - ЗапуститьПриложение("explorer.exe /select, """ + ФайлНаДиске.ПолноеИмя + """"); - Иначе - ЗапуститьПриложение(ФайлНаДиске.Путь); - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Проверяет свойства файла в рабочем каталоге и в хранилище файлов, -// если требуется уточняет у пользователя и возвращает действие. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. -// ИмяФайлаСПутем - Строка - полное имя файла с путем в рабочем каталоге. -// -// ДанныеФайла - Структура со свойствами: -// Размер - Число. -// ДатаМодификацииУниверсальная - Дата. -// ВРабочемКаталогеНаЧтение - Булево. -// -// Возвращаемое значение: -// Строка - возможные строки: -// "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". -// -Процедура ДействиеПриОткрытииФайлаВРабочемКаталоге(ОбработчикРезультата, ИмяФайлаСПутем, ДанныеФайла) Экспорт - - Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда - ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); - Возврат; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("ДействиеНадФайлом", "ОткрытиеВРабочемКаталоге"); - Параметры.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ИмяФайлаСПутем); - - Файл = Новый Файл(Параметры.ПолноеИмяФайлаВРабочемКаталоге); - - Параметры.Вставить("ДатаИзмененияУниверсальнаяВХранилищеФайлов", - ДанныеФайла.ДатаМодификацииУниверсальная); - - Параметры.Вставить("ДатаИзмененияУниверсальнаяВРабочемКаталоге", - Файл.ПолучитьУниверсальноеВремяИзменения()); - - Параметры.Вставить("ДатаИзмененияВРабочемКаталоге", - МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге)); - - Параметры.Вставить("ДатаИзмененияВХранилищеФайлов", - МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов)); - - Параметры.Вставить("РазмерВРабочемКаталоге", Файл.Размер()); - Параметры.Вставить("РазмерВХранилищеФайлов", ДанныеФайла.Размер); - - РазницаДат = Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге - - Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов; - - Если РазницаДат < 0 Тогда - РазницаДат = -РазницаДат; - КонецЕсли; - - Если РазницаДат <= 1 Тогда // С секунда - допустимая разница (на Win95 может быть такое). - - Если Параметры.РазмерВХранилищеФайлов <> 0 - И Параметры.РазмерВХранилищеФайлов <> Параметры.РазмерВРабочемКаталоге Тогда - // Дата одинаковая, но размер отличается - редкий, но возможный случай. - - Параметры.Вставить("Заголовок", - НСтр("ru = 'Размер файла отличается'")); - - Параметры.Вставить("Сообщение", - НСтр("ru = 'Размер файла в рабочем каталоге и в хранилище файлов отличается. - | - |Взять файл из хранилища файлов и заменить им существующий или - |открыть существующий без обновления?'")); - Иначе - // Все совпадает - и дата, и размер. - ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); - Возврат; - КонецЕсли; - - ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге - < Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда - // В хранилище файлов более новый файл. - - Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь Тогда - // Файл в рабочем каталоге для редактирования. - - Параметры.Вставить("Заголовок", НСтр("ru = 'В хранилище файлов новый файл'")); - - Параметры.Вставить("Сообщение", - НСтр("ru = 'Файл в хранилище файлов, отмеченный как занятый для редактирования, - |имеет более позднюю дату изменения (новее), чем в рабочем каталоге. - | - |Взять файл из хранилища файлов и заменить им существующий или - |открыть существующий без обновления?'")); - Иначе - // Файл в рабочем каталоге для чтения. - - // Обновление из хранилища файлов без вопросов. - ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); - Возврат; - КонецЕсли; - - ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге - > Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда - // В рабочем каталоге более новый файл. - - Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь - И ДанныеФайла.Редактирует = ПользователиКлиентСервер.ТекущийПользователь() Тогда - - // Файл в рабочем каталоге для редактирования и занят текущим пользователем. - ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); - Возврат; - Иначе - // Файл в рабочем каталоге для чтения. - - Параметры.Вставить("Заголовок", НСтр("ru = 'В рабочем каталоге новый файл'")); - - Параметры.Вставить( - "Сообщение", - НСтр("ru = 'Файл в рабочем каталоге имеет более позднюю дату изменения (новее), - |чем в хранилище файлов. Возможно, он был изменен. - | - |Открыть существующий файл или заменить его на файл - |из хранилища файлов c потерей изменений и открыть?'")); - КонецЕсли; - КонецЕсли; - - // ВыборДействияПриОбнаруженииОтличийФайла - ОткрытьФорму("ОбщаяФорма.ВыборДействияПриОбнаруженииОтличийФайла", Параметры, , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); - -КонецПроцедуры - -// Возвращает результат подключения расширения работы с файлами. -// -// Возвращаемое значение: -// Булево - в тонком клиенте всегда Истина, в браузере Google Chrome -// всегда ложь. -// -Функция РасширениеРаботыСФайламиПодключено() Экспорт - Если КлиентПоддерживаетСинхронныеВызовы() Тогда - Возврат ПодключитьРасширениеРаботыСФайлами(); - Иначе - Возврат Ложь; - КонецЕсли; -КонецФункции - -// Описание процедуры см. ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами. -// -Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) Экспорт - Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда - ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь); - Иначе - ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - КонецЕсли; -КонецПроцедуры - -Процедура ОтправитьФайлыПоПочте(МассивФайлов, ИдентификаторФормы, ПараметрыОтправки, ЭтоФайл = Ложь) Экспорт - - Если МассивФайлов.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("МассивФайлов", МассивФайлов); - Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Параметры.Вставить("ЭтоФайл", ЭтоФайл); - Параметры.Вставить("ПараметрыОтправки", ПараметрыОтправки); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект, Параметры); - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); - КонецЕсли; - -КонецПроцедуры - -Процедура ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт - - Если УчетнаяЗаписьНастроена <> Истина Тогда - Возврат; - КонецЕсли; - - СписокВложений = ФайловыеФункцииСлужебныйВызовСервера.ПоместитьФайлыВоВременноеХранилище(ДополнительныеПараметры); - ПараметрыОтправки = ДополнительныеПараметры.ПараметрыОтправки; - - ПараметрыНовогоПисьма = Новый Структура; - ПараметрыНовогоПисьма.Вставить("Получатель", ПараметрыОтправки.Получатель); - ПараметрыНовогоПисьма.Вставить("Тема", ПараметрыОтправки.Тема); - ПараметрыНовогоПисьма.Вставить("Текст", ПараметрыОтправки.Текст); - ПараметрыНовогоПисьма.Вставить("Вложения", СписокВложений); - ПараметрыНовогоПисьма.Вставить("УдалятьФайлыПослеОтправки", Истина); - - МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыНовогоПисьма); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции работы с криптографией. - -// Проверить подписи данных объекта в таблице. -// -// Параметры: -// Форма - УправляемаяФорма - с реквизитами: -// * Объект - ДанныеФормыСтруктура - как у объекта со свойствами Ссылка, Зашифрован. -// Например, СправочникОбъект.Файл, СправочникОбъект.ДокументПрисоединенныеФайлы. -// -// * ЭлектронныеПодписи - ДанныеФормыКоллекция - с полями: -// * ДатаПроверкиПодписи - Дата - (возвращаемое значение) - дата проверки. -// * Статус - Строка - (возвращаемое значение) - результат проверки. -// * АдресПодписи - Строка - адрес данных подписи во временном хранилище. -// -// СсылкаНаДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. -// - Строка - адрес во временном хранилище или навигационная ссылка. -// -// ВыделенныеСтроки - Массив - свойство таблицы формы параметра ЭлектронныеПодписи. -// - Неопределено - проверить все подписи. -// -Процедура ПроверитьПодписи(Форма, СсылкаНаДвоичныеДанные, ВыделенныеСтроки = Неопределено) Экспорт - - // 1. Получаем адрес двоичных данных, адреса двоичных данных подписей. - // 2. Если файл зашифрован, то расшифровываем, далее выполняем проверку. - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Форма", Форма); - ДополнительныеПараметры.Вставить("ВыделенныеСтроки", ВыделенныеСтроки); - - Если Не Форма.Объект.Зашифрован Тогда - ПроверитьПодписиПослеПодготовкиДанных(СсылкаНаДвоичныеДанные, ДополнительныеПараметры); - Возврат; - КонецЕсли; - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Данные", СсылкаНаДвоичныеДанные); - ОписаниеДанных.Вставить("Представление", Форма.Объект.Ссылка); - ОписаниеДанных.Вставить("СертификатыШифрования", Форма.Объект.Ссылка); - ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); - - ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеРасшифровкиФайла", ЭтотОбъект, ДополнительныеПараметры); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); - -КонецПроцедуры - -// Продолжение процедуры ПроверитьПодписи. Вызывается из подсистемы ЭлектроннаяПодпись. -Процедура ПослеРасшифровкиФайла(ОписаниеДанных, ДополнительныеПараметры) Экспорт - - Если Не ОписаниеДанных.Успех Тогда - Возврат; - КонецЕсли; - - ПроверитьПодписиПослеПодготовкиДанных(ОписаниеДанных.РасшифрованныеДанные, ДополнительныеПараметры); - -КонецПроцедуры - -// Продолжение процедуры ПроверитьПодписи. -Процедура ПроверитьПодписиПослеПодготовкиДанных(Данные, ДополнительныеПараметры) - - Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - МодульЭлектроннаяПодписьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиентСервер"); - - ПроверятьЭлектронныеПодписиНаСервере = - МодульЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере; - - Если ДополнительныеПараметры.ВыделенныеСтроки = Неопределено Тогда - Коллекция = ДополнительныеПараметры.Форма.ЭлектронныеПодписи; - Иначе - Коллекция = ДополнительныеПараметры.ВыделенныеСтроки; - КонецЕсли; - - Если Не ПроверятьЭлектронныеПодписиНаСервере Тогда - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - ДополнительныеПараметры.Вставить("Данные", Данные); - ДополнительныеПараметры.Вставить("Коллекция", Коллекция); - ДополнительныеПараметры.Вставить("МодульЭлектроннаяПодписьКлиент", МодульЭлектроннаяПодписьКлиент); - МодульЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии( - Новый ОписаниеОповещения("ПроверитьПодписиПослеСозданияМенеджераКриптографии", - ЭтотОбъект, ДополнительныеПараметры), - "ПроверкаПодписи"); - Возврат; - КонецЕсли; - - Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда - АдресДанных = ПоместитьВоВременноеХранилище(Данные, ДополнительныеПараметры.ИдентификаторФормы); - Иначе - АдресДанных = Данные; - КонецЕсли; - - ДанныеСтрок = Новый Массив; - - Для каждого Элемент Из Коллекция Цикл - СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, - ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); - - ДанныеСтроки = Новый Структура; - ДанныеСтроки.Вставить("АдресПодписи", СтрокаПодписи.АдресПодписи); - ДанныеСтроки.Вставить("Статус", СтрокаПодписи.Статус); - ДанныеСтроки.Вставить("ПодписьВерна", СтрокаПодписи.ПодписьВерна); - ДанныеСтроки.Вставить("ДатаПодписи", СтрокаПодписи.ДатаПодписи); - ДанныеСтроки.Вставить("ДатаПроверкиПодписи", СтрокаПодписи.ДатаПроверкиПодписи); - ДанныеСтрок.Добавить(ДанныеСтроки); - КонецЦикла; - - ФайловыеФункцииСлужебныйВызовСервера.ПроверитьПодписи(АдресДанных, ДанныеСтрок); - - Индекс = 0; - Для каждого Элемент Из Коллекция Цикл - СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, - ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); - - СтрокаПодписи.Статус = ДанныеСтрок[Индекс].Статус; - СтрокаПодписи.ПодписьВерна = ДанныеСтрок[Индекс].ПодписьВерна; - СтрокаПодписи.ДатаПроверкиПодписи = ДанныеСтрок[Индекс].ДатаПроверкиПодписи; - Индекс = Индекс + 1; - КонецЦикла; - -КонецПроцедуры - -// Продолжение процедуры ПроверитьПодписи. -Процедура ПроверитьПодписиПослеСозданияМенеджераКриптографии(МенеджерКриптографии, ДополнительныеПараметры) Экспорт - - Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда - Возврат; - КонецЕсли; - - ДополнительныеПараметры.Вставить("Индекс", -1); - ДополнительныеПараметры.Вставить("МенеджерКриптографии", МенеджерКриптографии); - - ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); - -КонецПроцедуры - -// Продолжение процедуры ПроверитьПодписи. -Процедура ПроверитьПодписиЦиклНачало(ДополнительныеПараметры) - - Если ДополнительныеПараметры.Коллекция.Количество() <= ДополнительныеПараметры.Индекс + 1 Тогда - ДополнительныеПараметры.Форма.ОбновитьОтображениеДанных(); - Возврат; - КонецЕсли; - - ДополнительныеПараметры.Индекс = ДополнительныеПараметры.Индекс + 1; - Элемент = ДополнительныеПараметры.Коллекция[ДополнительныеПараметры.Индекс]; - - ДополнительныеПараметры.Вставить("СтрокаПодписи", ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, - ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент))); - - МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьКлиент.ПроверитьПодпись( - Новый ОписаниеОповещения("ПроверитьПодписиПослеПроверкиСтроки", ЭтотОбъект, ДополнительныеПараметры), - ДополнительныеПараметры.Данные, - ДополнительныеПараметры.СтрокаПодписи.АдресПодписи, - ДополнительныеПараметры.МенеджерКриптографии, - ДополнительныеПараметры.СтрокаПодписи.ДатаПодписи); - -КонецПроцедуры - -// Продолжение процедуры ПроверитьПодписи. -Процедура ПроверитьПодписиПослеПроверкиСтроки(Результат, ДополнительныеПараметры) Экспорт - - СтрокаПодписи = ДополнительныеПараметры.СтрокаПодписи; - СтрокаПодписи.ДатаПроверкиПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); - СтрокаПодписи.ПодписьВерна = (Результат = Истина); - ФайловыеФункцииСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(СтрокаПодписи, Результат); - - ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); - -КонецПроцедуры - -// Для формы файла. -Процедура УстановитьДоступностьКомандСпискаЭлектронныхПодписей(Форма) Экспорт - - Элементы = Форма.Элементы; - ЕстьПодписи = (Форма.ЭлектронныеПодписи.Количество() <> 0); - - Элементы.ЭлектронныеПодписиОткрыть.Доступность = ЕстьПодписи; - Элементы.ЭлектронныеПодписиПроверить.Доступность = ЕстьПодписи; - Элементы.ЭлектронныеПодписиПроверитьВсе.Доступность = ЕстьПодписи; - Элементы.ЭлектронныеПодписиСохранить.Доступность = ЕстьПодписи; - Элементы.ЭлектронныеПодписиУдалить.Доступность = ЕстьПодписи; - -КонецПроцедуры - -// Для формы файла. -Процедура УстановитьДоступностьКомандСпискаСертификатовШифрования(Форма) Экспорт - - Объект = Форма.Объект; - Элементы = Форма.Элементы; - - Элементы.СертификатыШифрованияОткрыть.Доступность = Объект.Зашифрован; - -КонецПроцедуры - -// Проверяет установлена ли компонента сканирования и есть ли хоть один сканер. -Функция ДоступнаКомандаСканировать() Экспорт - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - Возврат Ложь; - КонецЕсли; - - Если Не ПроинициализироватьКомпоненту() Тогда - Возврат Ложь; - КонецЕсли; - - Если ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ЕстьУстройства() Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Открывает диалог сканирования и просмотра картинки. -Процедура ДобавитьСоСканера(ПараметрыВыполнения) Экспорт - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); - Возврат; - КонецЕсли; - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); - ПараметрыФормы.Вставить("ЭтоФайл", ПараметрыВыполнения.ЭтоФайл); - ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); - ПараметрыФормы.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла); - - ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); - ОткрытьФорму("Обработка.Сканирование.Форма.РезультатСканирования", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Общие процедуры и функции работы с файлами операционной системы. - -// Выполняет пакет неинтерактивных действий с файлом. -// Если файл не существует, то действия не будут пропущены. -// -// Можно получить следующие свойства: Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение, Существует, -// ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость, Размер, ЭтоКаталог, ЭтоФайл. -// -// Можно установить следующие свойства: ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость. -// Можно выполнить действия с файлом: Удалить. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после выполнения -// действий с файлом. В качестве результата возвращается Структура со свойствами: -// * ОписаниеОшибки - Строка - текст ошибки, если одно из действий выполнить не удалось. -// * Результаты - Массив - содержит результат по каждому действию в виде структуры: -// * Файл - Файл - инициализированный объект файл. -// - Неопределено - ошибка инициализации файла. -// * Существует - Булево - Ложь, если файл не существует. -// -// ДействияСФайлом - Массив - содержащий структуры с именем действия и параметрами действия; -// * Действие - Строка - ПолучитьСвойства, УстановитьСвойства, Удалить, СкопироватьИзИсточника, -// СоздатьКаталог, Получить, Поместить. -// * Файл - Строка - полное имя файла на компьютере. -// - Файл - инициализированный объект Файл. -// * Свойства - Структура - см. свойства которые можно получить или установить. -// * Источник - Строка - полное имя файла на компьютере из которого нужно создать копию. -// * Адрес - Строка - адрес двоичных данных файла, например, адрес временного хранилища. -// * ЗаголовокОшибки - Строка - текст к которому нужно добавить перевод строки и представление ошибки. -// -Процедура ОбработатьФайл(Оповещение, ДействияСФайлом, ИдентификаторФормы = Неопределено) Экспорт - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); - Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); - - Контекст.Вставить("РезультатДействий", Новый Структура); - Контекст.РезультатДействий.Вставить("ОписаниеОшибки", ""); - Контекст.РезультатДействий.Вставить("Результаты", Новый Массив); - - Контекст.Вставить("Индекс", -1); - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает путь к рабочему каталогу данных пользователя. Этот каталог используется -// в качестве начального значения для рабочего каталога пользователя. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего -// каталога пользователя. В качестве результата возвращается Структура со свойствами: -// * Каталог - Строка - полное имя рабочего каталога данных пользователя. -// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. -// -Процедура ПолучитьРабочийКаталогДанныхПользователя(Оповещение) - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - - НачатьПолучениеРабочегоКаталогаДанныхПользователя(Новый ОписаниеОповещения( - "ПолучитьРабочийКаталогДанныхПользователяПослеПолучения", ЭтотОбъект, Контекст, - "ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения", ЭтотОбъект)); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. -Процедура ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - - Результат = Новый Структура; - Результат.Вставить("Каталог", ""); - Результат.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось получить рабочий каталог данных пользователя по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. -Процедура ПолучитьРабочийКаталогДанныхПользователяПослеПолучения(КаталогДанныхПользователя, Контекст) Экспорт - - Результат = Новый Структура; - Результат.Вставить("Каталог", КаталогДанныхПользователя); - Результат.Вставить("ОписаниеОшибки", ""); - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); - -КонецПроцедуры - - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлЦиклНачало(Контекст) - - Если Контекст.Индекс + 1 >= Контекст.ДействияСФайлом.Количество() Тогда - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); - Возврат; - КонецЕсли; - - Контекст.Индекс = Контекст.Индекс + 1; - Контекст.Вставить("ОписаниеДействия", Контекст.ДействияСФайлом[Контекст.Индекс]); - - Контекст.Вставить("Результат", Новый Структура); - Контекст.Результат.Вставить("Файл", Неопределено); - Контекст.Результат.Вставить("Существует", Ложь); - - Контекст.РезультатДействий.Результаты.Добавить(Контекст.Результат); - - Контекст.Вставить("СвойстваДляПолучения", Новый Структура); - Контекст.Вставить("СвойстваДляУстановки", Новый Структура); - - Действие = Контекст.ОписаниеДействия.Действие; - Файл = Контекст.ОписаниеДействия.Файл; - ПолноеИмяФайла = ?(ТипЗнч(Файл) = Тип("Файл"), Файл.ПолноеИмя, Файл); - - Если Действие = "Удалить" Тогда - НачатьУдалениеФайлов(Новый ОписаниеОповещения( - "ОбработатьФайлПослеУдаленияФайлов", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); - Возврат; - - ИначеЕсли Действие = "СкопироватьИзИсточника" Тогда - НачатьКопированиеФайла(Новый ОписаниеОповещения( - "ОбработатьФайлПослеКопированияФайла", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.ОписаниеДействия.Источник, ПолноеИмяФайла); - Возврат; - - ИначеЕсли Действие = "СоздатьКаталог" Тогда - НачатьСозданиеКаталога(Новый ОписаниеОповещения( - "ОбработатьФайлПослеСозданияКаталога", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); - Возврат; - - ИначеЕсли Действие = "Получить" Тогда - ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Контекст.ОписаниеДействия.Адрес); - ПолучаемыеФайлы = Новый Массив; - ПолучаемыеФайлы.Добавить(ОписаниеФайла); - НачатьПолучениеФайлов(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияФайлов", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), - ПолучаемыеФайлы, , Ложь); - Возврат; - - ИначеЕсли Действие = "Поместить" Тогда - ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла); - ПомещаемыеФайлы = Новый Массив; - ПомещаемыеФайлы.Добавить(ОписаниеФайла); - НачатьПомещениеФайлов(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПомещенияФайлов", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), - ПомещаемыеФайлы, , Ложь, Контекст.ИдентификаторФормы); - Возврат; - - ИначеЕсли Действие = "ПолучитьСвойства" Тогда - Контекст.Вставить("СвойстваДляПолучения", Контекст.ОписаниеДействия.Свойства); - - ИначеЕсли Действие = "УстановитьСвойства" Тогда - Контекст.Вставить("СвойстваДляУстановки", Контекст.ОписаниеДействия.Свойства); - КонецЕсли; - - Если ТипЗнч(Файл) = Тип("Файл") Тогда - Контекст.Вставить("Файл", Файл); - ОбработатьФайлПослеИнициализацииФайла(Файл, Контекст); - Иначе - Контекст.Вставить("Файл", Новый Файл); - Контекст.Файл.НачатьИнициализацию(Новый ОписаниеОповещения( - "ОбработатьФайлПослеИнициализацииФайла", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Файл); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - - Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - Контекст.РезультатДействий.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - Иначе - Контекст.РезультатДействий.ОписаниеОшибки = ИнформацияОбОшибке; - КонецЕсли; - - Если Контекст.ОписаниеДействия.Свойство("ЗаголовокОшибки") Тогда - Контекст.РезультатДействий.ОписаниеОшибки = Контекст.ОписаниеДействия.ЗаголовокОшибки - + Символы.ПС + Контекст.РезультатДействий.ОписаниеОшибки; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеУдаленияФайлов(Контекст) Экспорт - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеКопированияФайла(СкопированныйФайл, Контекст) Экспорт - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеСозданияКаталога(ИмяКаталога, Контекст) Экспорт - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт - - Если ТипЗнч(ПолученныеФайлы) <> Тип("Массив") Или ПолученныеФайлы.Количество() = 0 Тогда - ОбработатьФайлПослеОшибки(НСтр("ru = 'Получение файла было отменено.'"), , Контекст); - Возврат; - КонецЕсли; - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт - - Если ТипЗнч(ПомещенныеФайлы) <> Тип("Массив") Или ПомещенныеФайлы.Количество() = 0 Тогда - ОбработатьФайлПослеОшибки(НСтр("ru = 'Помещение файла было отменено.'"), , Контекст); - Возврат; - КонецЕсли; - - Контекст.ОписаниеДействия.Вставить("Адрес", ПомещенныеФайлы[0].Хранение); - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеИнициализацииФайла(Файл, Контекст) Экспорт - - Контекст.Вставить("Файл", Файл); - Контекст.Результат.Вставить("Файл", Файл); - ЗаполнитьЗначенияСвойств(Контекст.СвойстваДляПолучения, Файл); - - Контекст.Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПроверкиСуществования", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПроверкиСуществования(Существует, Контекст) Экспорт - - Контекст.Результат.Вставить("Существует", Существует); - - Если Не Контекст.Результат.Существует Тогда - ОбработатьФайлЦиклНачало(Контекст); - Возврат; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Количество() = 0 Тогда - ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); - - ИначеЕсли Контекст.СвойстваДляПолучения.Свойство("ВремяИзменения") Тогда - Контекст.Файл.НачатьПолучениеВремениИзменения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияВремениИзменения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПолученияВремениИзменения(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияВремениИзменения(ВремяИзменения, Контекст) Экспорт - - Если ВремяИзменения <> Null Тогда - Контекст.СвойстваДляПолучения.ВремяИзменения = ВремяИзменения; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("УниверсальноеВремяИзменения") Тогда - Контекст.Файл.НачатьПолучениеУниверсальногоВремениИзменения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(УниверсальноеВремяИзменения, Контекст) Экспорт - - Если УниверсальноеВремяИзменения <> Null Тогда - Контекст.СвойстваДляПолучения.УниверсальноеВремяИзменения = УниверсальноеВремяИзменения; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("ТолькоЧтение") Тогда - Контекст.Файл.НачатьПолучениеТолькоЧтения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияТолькоЧтения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПолученияТолькоЧтения(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияТолькоЧтения(ТолькоЧтение, Контекст) Экспорт - - Если ТолькоЧтение <> Null Тогда - Контекст.СвойстваДляПолучения.ТолькоЧтение = ТолькоЧтение; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("Невидимость") Тогда - Контекст.Файл.НачатьПолучениеНевидимости(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияНевидимости", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПолученияНевидимости(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияНевидимости(Невидимость, Контекст) Экспорт - - Если Невидимость <> Null Тогда - Контекст.СвойстваДляПолучения.Невидимость = Невидимость; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("Размер") Тогда - Контекст.Файл.НачатьПолучениеРазмера(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПолученияРазмера", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПолученияРазмера(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПолученияРазмера(Размер, Контекст) Экспорт - - Если Размер <> Null Тогда - Контекст.СвойстваДляПолучения.Размер = Размер; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("ЭтоКаталог") Тогда - Контекст.Файл.НачатьПроверкуЭтоКаталог(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПроверкиЭтоКаталог", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПроверкиЭтоКаталог(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПроверкиЭтоКаталог(ЭтоКаталог, Контекст) Экспорт - - Если ЭтоКаталог <> Null Тогда - Контекст.СвойстваДляПолучения.ЭтоКаталог = ЭтоКаталог; - КонецЕсли; - - Если Контекст.СвойстваДляПолучения.Свойство("ЭтоФайл") Тогда - Контекст.Файл.НачатьПроверкуЭтоФайл(Новый ОписаниеОповещения( - "ОбработатьФайлПослеПроверкиЭтоФайл", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект)); - Иначе - ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеПроверкиЭтоФайл(ЭтоФайл, Контекст) Экспорт - - Если ЭтоФайл <> Null Тогда - Контекст.СвойстваДляПолучения.ЭтоФайл = ЭтоФайл; - КонецЕсли; - - Если Контекст.СвойстваДляУстановки.Количество() = 0 Тогда - ОбработатьФайлПослеУстановкиНевидимости(Контекст); - - ИначеЕсли Контекст.СвойстваДляУстановки.Свойство("ВремяИзменения") Тогда - Контекст.Файл.НачатьУстановкуВремениИзменения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеУстановкиВремениИзменения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ВремяИзменения); - Иначе - ОбработатьФайлПослеУстановкиВремениИзменения(Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеУстановкиВремениИзменения(Контекст) Экспорт - - Если Контекст.СвойстваДляУстановки.Свойство("УниверсальноеВремяИзменения") Тогда - Контекст.Файл.НачатьУстановкуУниверсальногоВремениИзменения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.УниверсальноеВремяИзменения); - Иначе - ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст) Экспорт - - Если Контекст.СвойстваДляУстановки.Свойство("ТолькоЧтение") Тогда - Контекст.Файл.НачатьУстановкуТолькоЧтения(Новый ОписаниеОповещения( - "ОбработатьФайлПослеУстановкиТолькоЧтения", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ТолькоЧтение); - Иначе - ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст) Экспорт - - Если Контекст.СвойстваДляУстановки.Свойство("Невидимость") Тогда - Контекст.Файл.НачатьУстановкуНевидимости(Новый ОписаниеОповещения( - "ОбработатьФайлПослеУстановкиНевидимости", ЭтотОбъект, Контекст, - "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.Невидимость); - Иначе - ОбработатьФайлПослеУстановкиНевидимости(Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ОбработатьФайл. -Процедура ОбработатьФайлПослеУстановкиНевидимости(Контекст) Экспорт - - ОбработатьФайлЦиклНачало(Контекст); - -КонецПроцедуры - -#Если НЕ ВебКлиент Тогда -// Извлекает текст из файла на диске на клиенте и помещает результат на сервер. -Процедура ИзвлечьТекстВерсии(ФайлИлиВерсияФайла, - АдресФайла, - Расширение, - УникальныйИдентификатор, - Кодировка = Неопределено) Экспорт - - ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Расширение); - - Если Не ПолучитьФайл(АдресФайла, ИмяФайлаСПутем, Ложь) Тогда - Возврат; - КонецЕсли; - - // Для варианта с хранением файлов на диске (на сервере) - // удаление Файла из временного хранилища после получения. - Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда - УдалитьИзВременногоХранилища(АдресФайла); - КонецЕсли; - - РезультатИзвлечения = "НеИзвлечен"; - АдресВременногоХранилищаТекста = ""; - - Текст = ""; - Если ИмяФайлаСПутем <> "" Тогда - - // Извлечение текста из файла. - Отказ = Ложь; - Текст = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекст(ИмяФайлаСПутем, Отказ, Кодировка); - - Если Отказ = Ложь Тогда - РезультатИзвлечения = "Извлечен"; - - Если Не ПустаяСтрока(Текст) Тогда - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); - ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); - ТекстовыйФайл.Записать(Текст); - ТекстовыйФайл.Закрыть(); - - РезультатЗагрузки = ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); - Если РезультатЗагрузки <> Неопределено Тогда - АдресВременногоХранилищаТекста = РезультатЗагрузки; - КонецЕсли; - - УдалитьФайлы(ИмяВременногоФайла); - КонецЕсли; - Иначе - // Когда Текст извлечь "некому" - это нормальный случай, - // сообщение об ошибке не формируется. - РезультатИзвлечения = "ИзвлечьНеУдалось"; - КонецЕсли; - - КонецЕсли; - - УдалитьФайлы(ИмяФайлаСПутем); - - ФайловыеФункцииСлужебныйВызовСервера.ЗаписатьРезультатИзвлеченияТекста( - ФайлИлиВерсияФайла, РезультатИзвлечения, АдресВременногоХранилищаТекста); - -КонецПроцедуры -#КонецЕсли - -// Загружает файл с клиента во временное хранилище на сервере. Не работает без расширения работы с файлами. -Функция ПоместитьФайлСДискаВоВременноеХранилище(ПолноеИмяФайла, АдресФайла = "", УникальныйИдентификатор = Неопределено) Экспорт - Если Не РасширениеРаботыСФайламиПодключено() Тогда - Возврат Неопределено; - КонецЕсли; - ЧтоЗагрузить = Новый Массив; - ЧтоЗагрузить.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, АдресФайла)); - РезультатЗагрузки = Новый Массив; - ФайлЗагружен = ПоместитьФайлы(ЧтоЗагрузить, РезультатЗагрузки, , Ложь, УникальныйИдентификатор); - Если Не ФайлЗагружен Или РезультатЗагрузки.Количество() = 0 Тогда - Возврат Неопределено; - КонецЕсли; - Возврат РезультатЗагрузки[0].Хранение; -КонецФункции - -// На основе переданного пути к файлу на диске создает Файл его и открывает карточку. -Процедура ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения) Экспорт - - Если ПараметрыВыполнения.ЭтоФайл И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); - МодульРаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения); - ИначеЕсли Не ПараметрыВыполнения.ЭтоФайл И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПрисоединенныеФайлыСлужебныйКлиент"); - МодульПрисоединенныеФайлыСлужебныйКлиент.ДобавитьФайлыРасширениеПредложено(Истина, ПараметрыВыполнения); - КонецЕсли; - -КонецПроцедуры - -// На основе переданного пути к файлу на диске создает Файл и открывает карточку. -Функция ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения) Экспорт - - Если ПараметрыВыполнения.ЭтоФайл И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); - Возврат МодульРаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения); - ИначеЕсли Не ПараметрыВыполнения.ЭтоФайл И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПрисоединенныеФайлыСлужебныйКлиент"); - МодульПрисоединенныеФайлыСлужебныйКлиент.ДобавитьФайлыРасширениеПредложено(Истина, ПараметрыВыполнения); - - Результат = Новый Структура; - Результат.Вставить("ФайлДобавлен", Истина); - Результат.Вставить("ФайлСсылка", Неопределено); - Результат.Вставить("ТекстОшибки", ""); - - Возврат Результат; - КонецЕсли; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функция для работы со сканером. - -// Инициализация компоненты сканирования. -Функция ПроинициализироватьКомпоненту() Экспорт - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - Возврат Ложь; - КонецЕсли; - - ИмяПараметра = "СтандартныеПодсистемы.КомпонентаTwain"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); - Если Не КодВозврата Тогда - Возврат Ложь; - КонецЕсли; - - ПараметрыПриложения.Вставить(ИмяПараметра, Новый("AddIn.twain.AddInNativeExtension")); - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Установка компоненты сканирования. -// -// Параметры: -// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. -// -// Возвращаемое значение: -// Булево - Успешно ли выполнена операция. -// -// См. также: -// Переменную глобального контекста КомпонентаTwain. -// -Процедура УстановитьКомпоненту(ОбработчикРезультата) Экспорт - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - ВернутьРезультат(ОбработчикРезультата, Ложь); - Возврат; - КонецЕсли; - - Если ПроинициализироватьКомпоненту() Тогда - Состояние(НСтр("ru = 'Компонента сканирования уже установлена.'")); - ВернутьРезультат(ОбработчикРезультата, Истина); - Возврат; - КонецЕсли; - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Обработчик = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект, ПараметрыВыполнения); - НачатьУстановкуВнешнейКомпоненты(Обработчик, "ОбщийМакет.КомпонентаTWAIN"); - -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура УстановитьКомпонентуЗавершение(ПараметрыВыполнения) Экспорт - - КомпонентаПодключена = ПроинициализироватьКомпоненту(); - ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, КомпонентаПодключена); - -КонецПроцедуры - -// Возвращает устройства TWAIN (массив строк). -Функция ПолучитьУстройства() Экспорт - - Массив = Новый Массив; - - Если Не ПроинициализироватьКомпоненту() Тогда - Возврат Массив; - КонецЕсли; - - СтрокаУстройств = ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ПолучитьУстройства(); - - Для Индекс = 1 По СтрЧислоСтрок(СтрокаУстройств) Цикл - Строка = СтрПолучитьСтроку(СтрокаУстройств, Индекс); - Массив.Добавить(Строка); - КонецЦикла; - - Возврат Массив; - -КонецФункции - -// Возвращает настройку сканера по имени. -// -// Параметры: -// ИмяУстройства - Строка - Имя сканера. -// ИмяНастройки - Строка - Имя настройки, -// например "XRESOLUTION", или "PIXELTYPE", или "ROTATION", или "SUPPORTEDSIZES". -// -// Возвращаемое значение: -// Число - Значение настройки сканера. -// -Функция ПолучитьНастройку(ИмяУстройства, ИмяНастройки) Экспорт - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент() Тогда - Возврат -1; - КонецЕсли; - - Попытка - Возврат ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ПолучитьНастройку(ИмяУстройства, ИмяНастройки); - Исключение - Возврат -1; - КонецПопытки; - -КонецФункции - -// Подготовка обработчика асинхронного диалога. -Функция ПодготовитьОбработчикДляДиалога(ОбработчикИлиСтруктура) - - Если ТипЗнч(ОбработчикИлиСтруктура) = Тип("Структура") Тогда - // Рекурсивная регистрация всех обработчиков вызывающего кода. - Если ОбработчикИлиСтруктура.Свойство("ОбработчикРезультата") Тогда - ОбработчикИлиСтруктура.ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ОбработчикИлиСтруктура.ОбработчикРезультата); - КонецЕсли; - Если ОбработчикИлиСтруктура.Свойство("АсинхронныйДиалог") Тогда - // Регистрация открытого диалога. - ОбработчикИлиСтруктура.АсинхронныйДиалог.Открыт = Истина; - // Формирование обработчика (при этом фиксируется вся структура параметров). - Обработчик = Новый ОписаниеОповещения( - ОбработчикИлиСтруктура.АсинхронныйДиалог.ИмяПроцедуры, - ОбработчикИлиСтруктура.АсинхронныйДиалог.Модуль, - ОбработчикИлиСтруктура); - Иначе - Обработчик = Неопределено; - КонецЕсли; - Иначе - Обработчик = ОбработчикИлиСтруктура; - КонецЕсли; - - Возврат Обработчик; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры для поддержки асинхронной модели. -// -// Общее описание параметров: -// ОбработчикРезультата - Процедура-обработчик асинхронного метода. -// - Неопределено - Обработка не требуется. -// - ОписаниеОповещения - Описание процедуры-обработчика. -// Результат - Произвольный - Значение, которое необходимо вернуть в ОбработчикРезультата. - -// Показывает текст и вызывает обработчик с заданным результатом. -Процедура ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Результат) - Если ТипЗнч(ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); - ПараметрыОбработчика.Вставить("Результат", Результат); - Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); - ПоказатьПредупреждение(Обработчик, ТекстПредупреждения); - Иначе - ПоказатьПредупреждение(, ТекстПредупреждения); - КонецЕсли; -КонецПроцедуры - -// Обработчик результата работы процедуры ВернутьРезультатПослеПоказаПредупреждения. -Процедура ВернутьРезультатПослеЗакрытияПростогоДиалога(Структура) - ВыполнитьОбработкуОповещения(Структура.ОбработчикРезультата, Структура.Результат); -КонецПроцедуры - -// Возвращает результат прямого вызова, когда не потребовалось открывать диалог. -Процедура ВернутьРезультат(ОбработчикРезультата, Результат) - Если ТипЗнч(ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда - ВыполнитьОбработкуОповещения(ОбработчикРезультата, Результат); - КонецЕсли; -КонецПроцедуры - -Функция КлиентПоддерживаетСинхронныеВызовы() - -#Если ВебКлиент Тогда - // В Chrome и Firefox синхронные методы не поддерживаются. - СистемнаяИнформация = Новый СистемнаяИнформация; - ИнформацияПрограммыМассив = СтрРазделить(СистемнаяИнформация.ИнформацияПрограммыПросмотра, " ", Ложь); - - Для Каждого ИнформацияПрограммы Из ИнформацияПрограммыМассив Цикл - Если СтрНайти(ИнформацияПрограммы, "Chrome") > 0 ИЛИ СтрНайти(ИнформацияПрограммы, "Firefox") > 0 Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; -#КонецЕсли - - Возврат Истина; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl deleted file mode 100644 index ef2abb576..000000000 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl +++ /dev/null @@ -1,85 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// Возвращает структуру, содержащую различные персональные настройки. -Функция ПерсональныеНастройкиРаботыСФайлами() Экспорт - - ПерсональныеНастройки = - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами; - - // Проверка и обновление настроек сохраненных на сервере, - // которые вычисляются на клиенте. - - Возврат ПерсональныеНастройки; - -КонецФункции - -// Возвращает структуру, содержащую различные персональные настройки. -Функция ОбщиеНастройкиРаботыСФайлами() Экспорт - - ОбщиеНастройки = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ОбщиеНастройкиРаботыСФайлами; - - // Проверка и обновление настроек сохраненных на сервере, - // которые вычисляются на клиенте. - - Возврат ОбщиеНастройки; - -КонецФункции - -// Возвращает параметр сеанса ПутьКРабочемуКаталогуПользователя. -Функция РабочийКаталогПользователя() Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); - КонецЕсли; - - ИмяКаталога = - СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов; - - // Уже установлен. - Если ИмяКаталога <> Неопределено - И НЕ ПустаяСтрока(ИмяКаталога) - И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда - - Возврат ИмяКаталога; - КонецЕсли; - - Если ИмяКаталога = Неопределено Тогда - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя(); - Если НЕ ПустаяСтрока(ИмяКаталога) Тогда - ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); - Иначе - ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; - Возврат ""; // Веб клиент без расширения работы с файлами. - КонецЕсли; - КонецЕсли; - -#Если НЕ ВебКлиент Тогда - - // Создать каталог для файлов. - Попытка - СоздатьКаталог(ИмяКаталога); - ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; - СоздатьКаталог(ИмяКаталогаТестовое); - УдалитьФайлы(ИмяКаталогаТестовое); - Исключение - // Нет прав на создание каталога, или такой путь отсутствует, - // тогда установка настроек по умолчанию. - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя(); - ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); - КонецПопытки; - -#КонецЕсли - - ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; - - Возврат ИмяКаталога; - -КонецФункции - -#КонецОбласти diff --git a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl index 58f8ed614..a7d4e7747 100644 --- a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl @@ -1,20 +1,25 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Физические лица". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс -// Раскладывает полное имя в структуру. +// Раскладывает полное имя физического лица на составные части - фамилию, имя и отчество. +// Если в конце полного имени встречаются "оглы", "улы", "уулу", "кызы" или "гызы", +// то они также считаются частью отчества. // // Параметры: -// ФамилияИмяОтчество - Строка - полное имя. +// ФамилияИмяОтчество - Строка - полное имя в виде "Фамилия Имя Отчество". // // Возвращаемое значение: -// Структура - коллекция со свойствами: -// * Фамилия - Строка; -// * Имя - Строка; -// * Отчество - Строка. +// Структура - части полного имени: +// * Фамилия - Строка - фамилия; +// * Имя - Строка - имя; +// * Отчество - Строка - отчество. +// +// Пример: +// 1. ФизическиеЛицаКлиентСервер.ЧастиИмени("Иванов Иван Иванович") +// вернет структуру со значениями свойств: "Иванов", "Иван", "Иванович". +// 2. ФизическиеЛицаКлиентСервер.ЧастиИмени("Смит Джон") +// вернет структуру со значениями свойств: "Смит", "Джон", "". +// 3. ФизическиеЛицаКлиентСервер.ЧастиИмени("Алиев Ахмед Октай оглы Мамедов") +// вернет структуру со значениями свойств: "Алиев", "Алиев", "Октай оглы Мамедов". // Функция ЧастиИмени(ФамилияИмяОтчество) Экспорт @@ -51,20 +56,21 @@ КонецФункции -// Формирует краткое представление из полного имени. +// Формирует краткое представление из полного имени физического лица. // // Параметры: -// ФамилияИмяОтчество - Строка - полное имя; -// - Структура - коллекция со свойствами: -// * Фамилия - Строка; -// * Имя - Строка; -// * Отчество - Строка. +// ФамилияИмяОтчество - Строка - полное имя в виде "Фамилия Имя Отчество"; +// - Структура - части полного имени: +// * Фамилия - Строка - фамилия; +// * Имя - Строка - имя; +// * Отчество - Строка - отчество. // // Возвращаемое значение: -// Строка - фамилия и инициалы. +// Строка - фамилия и инициалы. Например, "Пупкин В. И.". // // Пример: -// Результат = ФамилияИнициалыФизЛица("Пупкин Василий Иванович"); // Результат = "Пупкин В. И." +// Результат = ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица("Пупкин Василий Иванович"); +// - возвращает "Пупкин В. И.". // Функция ФамилияИнициалы(Знач ФамилияИмяОтчество) Экспорт @@ -88,24 +94,22 @@ КонецФункции -// Проверяет верно ли написано ФИО. -// ФИО может быть написано либо только на кириллице, либо только на латинице. -// Также можно указать, что ФИО может быть верным только в кириллице. +// Проверяет, верно ли написано ФИО физического лица. +// ФИО считается верным, если содержит только кириллицу, либо только латиницу. // // Параметры: -// СтрокаПараметр - строка - ФИО. -// ДопустимаТолькоКириллица - если Истина, то ФИО проверяется на кириллицу, латиница в этом случае считается ошибкой. -// Ложь - ФИО считается верным, если оно написано либо на латинице, либо на кириллице. +// ФИО - Строка - фамилия, имя и отчество. Например, "Пупкин Василий Иванович". +// ТолькоКириллица - Булево - при проверке допустимой будет только кириллица в ФИО. // // Возвращаемое значение: -// Истина - ФИО написано верно, иначе Ложь. +// Булево - Истина, если ФИО написано верно. // -Функция ФИОНаписаноВерно(Знач СтрокаПараметр, ТолькоКириллица = Ложь) Экспорт +Функция ФИОНаписаноВерно(Знач ФИО, ТолькоКириллица = Ложь) Экспорт ДопустимыеСимволы = "-"; - Возврат (Не ТолькоКириллица И СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(СтрокаПараметр, Ложь, ДопустимыеСимволы)) - Или СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(СтрокаПараметр, Ложь, ДопустимыеСимволы); + Возврат (Не ТолькоКириллица И СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(ФИО, Ложь, ДопустимыеСимволы)) + Или СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ФИО, Ложь, ДопустимыеСимволы); КонецФункции @@ -113,16 +117,16 @@ // Устарела. Следует использовать ЧастиИмени. // -// Функция раскладывает ФИО в структуру. +// Функция раскладывает строку ФИО в структуру. // // Параметры: -// ФИО - строка - наименование. +// ФИО - Строка - наименование. // // Возвращаемое значение: -// Структура - со свойствами: -// * Фамилия - Строка -// * Имя - Строка -// * Отчество - Строка +// Структура - фамилия, имя и отчество: +// * Фамилия - Строка - фамилия; +// * Имя - Строка - имя; +// * Отчество - Строка - отчество. // Функция ФамилияИмяОтчество(Знач ФИО) Экспорт diff --git a/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl b/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl index 61d4ca537..d469782a0 100644 --- a/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl @@ -117,7 +117,7 @@ Параметры.Вставить(ТекМетаданные.Ключ, Новый Структура("Запрос, ОперацииСтатистики, ВидСтатистики", ТекМетаданные.Значение,,0)); КонецЦикла; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ОбластьДанныхСтрока = Формат(МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), "ЧГ=0"); Иначе @@ -140,7 +140,7 @@ Если Значение <> 0 Тогда ОперацияСтатистики = ЦентрМониторингаПовтИсп.ПолучитьСсылкуОперацииСтатистики(ИмяОбъекта); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ОбластьДанныхСтрока = Формат(МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), "ЧГ=0"); Иначе diff --git a/SSL/src/CommonModules/ЦентрМониторингаКлиентСлужебный/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаКлиентСлужебный/Module.bsl index e28560fab..888e09dfa 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаКлиентСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаКлиентСлужебный/Module.bsl @@ -4,13 +4,11 @@ Окна = ПолучитьОкна(); АктивныхОкон = 0; - Если Окна <> Неопределено Тогда - Для Каждого ТекОкно Из Окна Цикл - Если Не ТекОкно.Основное Тогда - АктивныхОкон = АктивныхОкон + 1; - КонецЕсли; - КонецЦикла; - КонецЕсли; + Для Каждого ТекОкно Из Окна Цикл + Если Не ТекОкно.Основное Тогда + АктивныхОкон = АктивныхОкон + 1; + КонецЕсли; + КонецЦикла; ПараметрыПриложенияЦентрМониторинга = ПолучитьПараметрыПриложения(); ПараметрыПриложенияЦентрМониторинга["ИнформацияКлиента"].Вставить("АктивныхОкон", АктивныхОкон); @@ -104,8 +102,8 @@ КонецФункции Функция ПараметрыКлиента() - - ПараметрыКлиента = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"],"ЦентрМониторинга"); + + ПараметрыКлиента = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(),"ЦентрМониторинга"); Если ПараметрыКлиента = Неопределено Тогда ПараметрыКлиента = Новый Структура("ЧасовойПоясСеанса, ХешПользователя, РегистрироватьБизнесСтатистику", Неопределено, Неопределено, Ложь); КонецЕсли; diff --git a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl index 48b00a745..1c7039d22 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl @@ -86,22 +86,9 @@ Обработчик = Обработчики.Добавить(); Обработчик.РежимВыполнения = "Оперативно"; Обработчик.ОбщиеДанные = Истина; - Обработчик.Версия = "2.3.6.3"; + Обработчик.Версия = "2.4.1.7"; Обработчик.Процедура = "ЦентрМониторингаСлужебный.ДобавитьИдентификаторИнформационнойБазыПостоянный"; - Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() И НЕ РазделениеПоОбластямДанныхВключено() Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Версия = "2.3.6.124"; - Обработчик.Комментарий = НСтр("ru = 'Включает отправку сведений об использовании программы в фирму ""1С"". Отключить отправку сведений можно в разделе Администрирование / Интернет-поддержка и сервисы / Центр мониторинга'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("68c8c60c-5b23-436a-9555-a6f24a6b1ffd"); - Обработчик.Процедура = "ЦентрМониторингаСлужебный.ВключитьОтправкуСведений"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "ЦентрМониторингаСлужебный.ВключитьОтправкуСведенийЗаполнение"; - Обработчик.ЧитаемыеОбъекты = "Константа.ПараметрыЦентраМониторинга"; - Обработчик.ИзменяемыеОбъекты = "Константа.ПараметрыЦентраМониторинга, РегламентноеЗадание.СборИОтправкаСтатистики"; - КонецЕсли; - КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске. @@ -111,7 +98,7 @@ УникальныйИдентификаторПользователя = Строка(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор); НомерСеанса = Формат(НомерСеансаИнформационнойБазы(), "ЧГ=0"); - ХешПользователя = ХешMD5(УникальныйИдентификаторПользователя + НомерСеанса); + ХешПользователя = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(УникальныйИдентификаторПользователя + НомерСеанса); РегистрироватьБизнесСтатистику = ПолучитьПараметрыЦентраМониторинга("РегистрироватьБизнесСтатистику"); @@ -125,32 +112,28 @@ Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт - Если Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["РегистрироватьБизнесСтатистику"] Тогда - - РегистрироватьБизнесСтатистику = ПолучитьПараметрыЦентраМониторинга("РегистрироватьБизнесСтатистику"); - - ПараметрыНовые = Новый Соответствие(Параметры); - ПараметрыНовые.Вставить("РегистрироватьБизнесСтатистику", РегистрироватьБизнесСтатистику); - - КлючФоновогоЗадания = "ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне" + Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"]; - - Отбор = Новый Структура; - Отбор.Вставить("Ключ", КлючФоновогоЗадания); - Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - АктивныеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - - Если АктивныеФоновыеЗадания.Количество() = 0 Тогда - ПараметрыФоновогоЗадания = Новый Массив; - ПараметрыФоновогоЗадания.Добавить(Параметры); - ФоновыеЗадания.Выполнить("ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне", - ПараметрыФоновогоЗадания, - КлючФоновогоЗадания, - "ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере"); - КонецЕсли; - - Параметры = Новый ФиксированноеСоответствие(ПараметрыНовые); - - КонецЕсли; + РегистрироватьБизнесСтатистику = ПолучитьПараметрыЦентраМониторинга("РегистрироватьБизнесСтатистику"); + + ПараметрыНовые = Новый Соответствие(Параметры); + ПараметрыНовые.Вставить("РегистрироватьБизнесСтатистику", РегистрироватьБизнесСтатистику); + + КлючФоновогоЗадания = "ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне" + Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"]; + + Отбор = Новый Структура; + Отбор.Вставить("Ключ", КлючФоновогоЗадания); + Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + АктивныеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + + Если АктивныеФоновыеЗадания.Количество() = 0 Тогда + ПараметрыФоновогоЗадания = Новый Массив; + ПараметрыФоновогоЗадания.Добавить(Параметры); + ФоновыеЗадания.Выполнить("ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне", + ПараметрыФоновогоЗадания, + КлючФоновогоЗадания, + "ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере"); + КонецЕсли; + + Параметры = Новый ФиксированноеСоответствие(ПараметрыНовые); КонецПроцедуры @@ -163,22 +146,6 @@ КонецПроцедуры -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -// -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - - // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( - "ЦентрМониторингаКлиентСлужебный"); - - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "ЦентрМониторингаСлужебный"); - -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -745,17 +712,11 @@ СекцияСтатистикаКонфигурации.StatisticsConfiguration.StatisticsConfigurationByRegions.Вставить(ОбластьДанныхСтрока, СтатистикаКонфигурацииОбласти[ОбластьДанныхСтрока]); КонецЕсли; КонецЦикла; - ДанныеОбИспользуемыхРасширениях = Новый Структура; Иначе РезультатЗапроса = РегистрыСведений.СтатистикаКонфигурации.ПолучитьСтатистику(0); ДопПараметры = Новый Структура("MetadataName", Метаданные.Имя); ДопПараметры.Вставить("WorkingMode", ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(), "F", "S")); ДопПараметры.Вставить("DivisionByRegions", РазделениеПоОбластямДанныхВключено); - ДопПараметры.Вставить("CompatibilityMode", Строка(Метаданные.РежимСовместимости)); - ДопПараметры.Вставить("InterfaceCompatibilityMode", Строка(Метаданные.РежимСовместимостиИнтерфейса)); - ДопПараметры.Вставить("ModalityUseMode", Строка(Метаданные.РежимИспользованияМодальности)); - ДанныеОбИспользуемыхРасширениях = ДанныеОбИспользуемыхРасширениях(); - ДопПараметры.Вставить("UsingExtensions", ДанныеОбИспользуемыхРасширениях.ИспользованиеРасширений); ДополнительныеПараметры = Новый Соответствие; ДополнительныеПараметры.Вставить("ДатаНачала", ДатаНачала); @@ -884,7 +845,6 @@ Если ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации Тогда JSONСтруктура.Вставить("config", СекцияСтатистикаКонфигурации["StatisticsConfiguration"]); - JSONСтруктура.Вставить("extensionsInfo", ДанныеОбИспользуемыхРасширениях); КонецЕсли; Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации Тогда @@ -977,8 +937,11 @@ КонецФункции Функция ЗаписатьДанныеВАрхив(Данные) - ИмяФайлаДанных = ПолучитьИмяВременногоФайла("txt"); - ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); + ВременныйКаталог = КаталогВременныхФайлов(); + + ИдентификаторФайла = Строка(Новый УникальныйИдентификатор()); + ИмяФайлаДанных = ВременныйКаталог + ИдентификаторФайла + ".txt"; + ИмяФайлаАрхива = ВременныйКаталог + ИдентификаторФайла + ".zip"; ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаДанных); ЗаписьТекста.Записать(Данные); @@ -1068,7 +1031,7 @@ Для Каждого ФайлДампа Из ФайлыДампов Цикл Если ФайлыДамповЗарегистрированные[ФайлДампа.ПолноеИмя] = Неопределено Тогда ДампНовый = Новый Структура; - СтруктураДампа = ОписаниеДампа(ФайлДампа.ИмяБезРасширения); + СтруктураДампа = ОписаниеДампа(ФайлДампа.Имя); ДампНовый.Вставить("ДатаРегистрации", ТекущаяУниверсальнаяДатаВМиллисекундах()); ДампНовый.Вставить("ВариантДампа", СтруктураДампа.Процесс + "_" + СтруктураДампа.ВерсияПлатформы + "_" + СтруктураДампа.Смещение); @@ -1313,8 +1276,7 @@ HTTPОтвет = HTTPСервисОтправитьКакТекст(Параметры.Сервер, АдресРесурса, Пакет.ТелоПакета, Параметры.Порт, Параметры.ЗащищенноеСоединение); Если HTTPОтвет.КодСостояния = 200 Тогда - ПараметрыОтвета = СтрокаJSONВСтруктуру(HTTPОтвет.Тело); - УстановитьПараметрыОтправки(ПараметрыОтвета); + УстановитьПараметрыОтправки(СтрокаJSONВСтруктуру(HTTPОтвет.Тело)); РегистрыСведений.ПакетыДляОтправки.УдалитьПакет(НомерПакета); Иначе Прервать; @@ -1860,13 +1822,6 @@ КонецЕсли; КонецФункции -// Генерирует путь к каталогу дампов. -// Каталог дампов очищается автоматически методом РегистрацияДампов. -// Параметры: -// ПутьКаталога - Строка - путь к каталогу, в котором хранится файл настроек технологического журнала. -// Возвращаемое значение: -// КаталогДампов - Строка - путь к каталогу, в котором будут храниться минидампы. -// Функция СоздатьФайлНастроекСбораДампов(ПутьКаталога) ИмяФайлаНастроек = "logcfg.xml"; @@ -2000,7 +1955,7 @@ ИмяФайла = СтрЗаменить(ИмяФайла, "_", Символы.ПС); СтруктураДампа = Новый Структура; - Если СтрЧислоСтрок(ИмяФайла) >= 3 Тогда + Если СтрЧислоСтрок(ИмяФайла) = 3 Тогда СтруктураДампа.Вставить("Процесс", СтрПолучитьСтроку(ИмяФайла, 1)); СтруктураДампа.Вставить("ВерсияПлатформы", СтрПолучитьСтроку(ИмяФайла, 2)); СтруктураДампа.Вставить("Смещение", СтрПолучитьСтроку(ИмяФайла, 3)); @@ -2031,7 +1986,7 @@ СисИнфо = Новый СистемнаяИнформация; Результат = Новый Структура; - Результат.Вставить("ИмяКомпьютера", ХешMD5(ИмяКомпьютера())); + Результат.Вставить("ИмяКомпьютера", ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ИмяКомпьютера())); Результат.Вставить("ВерсияОС", Строка(СисИнфо.ВерсияОС)); Результат.Вставить("ВерсияПриложения", Строка(СисИнфо.ВерсияПриложения)); Результат.Вставить("ИдентификаторКлиента", Строка(СисИнфо.ИдентификаторКлиента)); @@ -2070,145 +2025,19 @@ #КонецОбласти -#Область РаботаСРасширениямиКонфигурации - -Функция ДанныеОбИспользуемыхРасширениях() - - СтруктураРасширения = Новый Структура; - - МассивРасширений = РасширенияКонфигурации.Получить(); - ИспользуютсяРасширения = МассивРасширений.Количество()>0; - СтруктураРасширения.Вставить("ИспользованиеРасширений", ИспользуютсяРасширения); - - Если Не ИспользуютсяРасширения Тогда - Возврат СтруктураРасширения; - КонецЕсли; - - МассивОписанийРасширений = Новый Массив; - Для Каждого Расширение Из МассивРасширений Цикл - ОписаниеРасширения = Новый Структура("Имя, Версия, Назначение, БезопасныйРежим, ЗащитаОтОпасныхДействий, Синоним"); - ЗаполнитьЗначенияСвойств(ОписаниеРасширения, Расширение); - ОписаниеРасширения.Вставить("ЗащитаОтОпасныхДействий", ?(ОписаниеРасширения.ЗащитаОтОпасныхДействий = Неопределено, Ложь, ОписаниеРасширения.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях)); - ОписаниеРасширения.Вставить("Назначение", Строка(ОписаниеРасширения.Назначение)); - МассивОписанийРасширений.Добавить(ОписаниеРасширения); - КонецЦикла; - - СтруктураРасширения.Вставить("ОписанияРасширений", МассивОписанийРасширений); - - МетаданныеРасширений = Новый Соответствие; - ОписаниеМетаданных = ОписаниеМетаданных(); - Для Каждого СтрЗапись Из ОписаниеМетаданных Цикл - ДобавитьИнформациюОРасширениях(СтрЗапись.Ключ, СтрЗапись.Значение, МетаданныеРасширений); - КонецЦикла; - - СтруктураРасширения.Вставить("МетаданныеРасширений", МетаданныеРасширений); - - Возврат СтруктураРасширения; - -КонецФункции - -Процедура ДобавитьИнформациюОРасширениях(КлассОбъекта, АрхитектураОбъекта, МетаданныеРасширений) - Для Каждого ОбъектМетаданных Из Метаданные[КлассОбъекта] Цикл - // Сначала обходим подчиненные. - Для Каждого ЭлементСтруктуры Из АрхитектураОбъекта Цикл - Если ЭлементСтруктуры.Значение = "Рекурсивно" Тогда - ДобавитьИнформациюОРасширенияхРекурсивно(ОбъектМетаданных, ЭлементСтруктуры.Ключ, АрхитектураОбъекта, МетаданныеРасширений); - КонецЕсли; - Для Каждого ПодчиненныйОбъект Из ОбъектМетаданных[ЭлементСтруктуры.Ключ] Цикл - РасширениеОбъекта = ПодчиненныйОбъект.РасширениеКонфигурации(); - Если РасширениеОбъекта = Неопределено Тогда - Продолжить; - КонецЕсли; - МетаданныеРасширений.Вставить(ПодчиненныйОбъект.ПолноеИмя(), РасширениеОбъекта.Имя); - КонецЦикла; - КонецЦикла; - - РасширениеОбъекта = ОбъектМетаданных.РасширениеКонфигурации(); - Если РасширениеОбъекта = Неопределено Тогда - Продолжить; - КонецЕсли; - МетаданныеРасширений.Вставить(ОбъектМетаданных.ПолноеИмя(), РасширениеОбъекта.Имя); - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьИнформациюОРасширенияхРекурсивно(Объект, ИмяРекурсивногоАтрибута, АрхитектураОбъекта, МетаданныеРасширений) - Для Каждого РекурсивныйОбъект Из Объект[ИмяРекурсивногоАтрибута] Цикл - Для Каждого ЭлементСтруктуры Из АрхитектураОбъекта Цикл - Если ЭлементСтруктуры.Значение = "Рекурсивно" Тогда - ДобавитьИнформациюОРасширенияхРекурсивно(РекурсивныйОбъект, ЭлементСтруктуры.Ключ, АрхитектураОбъекта, МетаданныеРасширений); - КонецЕсли; - Для Каждого ПодчиненныйОбъект Из РекурсивныйОбъект[ЭлементСтруктуры.Ключ] Цикл - РасширениеОбъекта = ПодчиненныйОбъект.РасширениеКонфигурации(); - Если РасширениеОбъекта = Неопределено Тогда - Продолжить; - КонецЕсли; - МетаданныеРасширений.Вставить(ПодчиненныйОбъект.ПолноеИмя(), РасширениеОбъекта.Имя); - КонецЦикла; - КонецЦикла; - - РасширениеОбъекта = РекурсивныйОбъект.РасширениеКонфигурации(); - Если РасширениеОбъекта = Неопределено Тогда - Продолжить; - КонецЕсли; - МетаданныеРасширений.Вставить(РекурсивныйОбъект.ПолноеИмя(), РасширениеОбъекта.Имя); - КонецЦикла; -КонецПроцедуры - -Функция ОписаниеМетаданных() - ОписаниеМетаданных = Новый Соответствие; - ОписаниеМетаданных.Вставить("Подсистемы", Новый Структура("Подсистемы", "Рекурсивно")); - ОписаниеМетаданных.Вставить("ОбщиеМодули", Новый Структура); - ОписаниеМетаданных.Вставить("ПараметрыСеанса", Новый Структура); - ОписаниеМетаданных.Вставить("ОбщиеРеквизиты", Новый Структура); - ОписаниеМетаданных.Вставить("ОбщиеРеквизиты", Новый Структура); - ОписаниеМетаданных.Вставить("ПланыОбмена", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("КритерииОтбора", Новый Структура("Формы, Команды")); - ОписаниеМетаданных.Вставить("ПодпискиНаСобытия", Новый Структура); - ОписаниеМетаданных.Вставить("РегламентныеЗадания", Новый Структура); - ОписаниеМетаданных.Вставить("ФункциональныеОпции", Новый Структура); - ОписаниеМетаданных.Вставить("ПараметрыФункциональныхОпций", Новый Структура); - ОписаниеМетаданных.Вставить("ОпределяемыеТипы", Новый Структура); - ОписаниеМетаданных.Вставить("ХранилищаНастроек", Новый Структура("Формы, Макеты")); - ОписаниеМетаданных.Вставить("ОбщиеФормы", Новый Структура); - ОписаниеМетаданных.Вставить("ОбщиеКоманды", Новый Структура); - ОписаниеМетаданных.Вставить("ГруппыКоманд", Новый Структура); - ОписаниеМетаданных.Вставить("ОбщиеМакеты", Новый Структура); - ОписаниеМетаданных.Вставить("ОбщиеКартинки", Новый Структура); - ОписаниеМетаданных.Вставить("ПакетыXDTO", Новый Структура); - ОписаниеМетаданных.Вставить("WebСервисы", Новый Структура); - ОписаниеМетаданных.Вставить("HTTPСервисы", Новый Структура); - ОписаниеМетаданных.Вставить("WSСсылки", Новый Структура); - ОписаниеМетаданных.Вставить("ЭлементыСтиля", Новый Структура); - ОписаниеМетаданных.Вставить("Языки", Новый Структура); - ОписаниеМетаданных.Вставить("Константы", Новый Структура); - ОписаниеМетаданных.Вставить("Справочники", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("Документы", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("ЖурналыДокументов", Новый Структура("Графы, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("Перечисления", Новый Структура("ЗначенияПеречисления, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("Отчеты", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("Обработки", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("ПланыВидовХарактеристик", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("ПланыСчетов", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("ПланыВидовРасчета", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("РегистрыСведений", Новый Структура("Измерения, Ресурсы, Реквизиты, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("РегистрыНакопления", Новый Структура("Измерения, Ресурсы, Реквизиты, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("РегистрыБухгалтерии", Новый Структура("Измерения, Ресурсы, Реквизиты, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("РегистрыРасчета", Новый Структура("Измерения, Ресурсы, Реквизиты, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("БизнесПроцессы", Новый Структура("Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - ОписаниеМетаданных.Вставить("Задачи", Новый Структура("РеквизитыАдресации, Реквизиты, ТабличныеЧасти, Формы, Команды, Макеты")); - - Возврат ОписаниеМетаданных; -КонецФункции - -#КонецОбласти - #Область РаботаВРежимеРазделенияПоОбластямДанных Функция РазделениеПоОбластямДанныхВключено() Экспорт - РазделениеПоОбластямДанныхВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + ОбщийМодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + РазделениеПоОбластямДанныхВключено = ОбщийМодульРаботаВМоделиСервиса.РазделениеВключено(); + Иначе + РазделениеПоОбластямДанныхВключено = Ложь; + КонецЕсли; Возврат РазделениеПоОбластямДанныхВключено; + КонецФункции #КонецОбласти @@ -2232,14 +2061,6 @@ Функция СобытиеЖурналаРегистрацииЦентрМониторингаРазобратьБуферОперацийСтатистики() Возврат НСтр("ru = 'Центр мониторинга.Разобрать буфер операций статистики'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); КонецФункции - -Функция ХешMD5(Данные) - Хеш = Новый ХешированиеДанных(ХешФункция.MD5); - Хеш.Добавить(Данные); - ХешСумма = СтрЗаменить(Строка(Хеш.ХешСумма), " ", ""); - - Возврат ХешСумма; -КонецФункции #КонецОбласти #Область ИнформацияКлиента @@ -2344,14 +2165,14 @@ Если РазделениеПоОбластямДанныхВключено() Тогда Возврат; КонецЕсли; - + ТекДата = ТекущаяУниверсальнаяДата(); - УдалитьПараметрыЦентраМониторинга(); + УдалитьПараметрыЦентраМониторинга(); ПараметрыЦентраМониторинга = ПолучитьПараметрыПоУмолчанию(); Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - ПараметрыЦентраМониторинга.БизнесСтатистикаПериодФормирования = 3600; + ПараметрыЦентраМониторинга.БизнесСтатистикаПериодФормирования = 3600; КонецЕсли; ПараметрыЦентраМониторинга.РегистрацияДамповСледующееФормирование = ТекДата + ПараметрыЦентраМониторинга.РегистрацияДамповПериодФормирования; @@ -2365,46 +2186,18 @@ ПараметрыЦентраМониторинга.ПериодАгрегацииМалый = 600; ПараметрыЦентраМониторинга.ПериодАгрегации = 3600; ПараметрыЦентраМониторинга.ПериодУдаления = 86400; - - Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга = Истина; - КонецЕсли; + УстановитьПараметрыЦентраМониторинга(ПараметрыЦентраМониторинга); - - Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - РегЗадание = ПолучитьРегламентноеЗадание("СборИОтправкаСтатистики", Истина); - УстановитьРасписаниеПоУмолчанию(РегЗадание); - КонецЕсли; - + КонецПроцедуры Процедура ДобавитьИдентификаторИнформационнойБазыПостоянный() Экспорт - - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); - ПараметрыЦентраМониторинга.Вставить("ИдентификаторИнформационнойБазыПостоянный", ПараметрыЦентраМониторинга.ИдентификаторИнформационнойБазы); - УстановитьПараметрыЦентраМониторинга(ПараметрыЦентраМониторинга); - -КонецПроцедуры - -Процедура ВключитьОтправкуСведений(Параметры) Экспорт - - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме")); - // Если уже включено, не делаем ничего. - Если ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга ИЛИ ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме Тогда - Параметры.ОбработкаЗавершена = Истина; - Возврат; - КонецЕсли; - ПараметрыЦентраМониторинга = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Истина, Ложь); - УстановитьПараметрыЦентраМониторинга(ПараметрыЦентраМониторинга); - РегЗадание = ПолучитьРегламентноеЗадание("СборИОтправкаСтатистики", Истина); - УстановитьРасписаниеПоУмолчанию(РегЗадание); - - Параметры.ОбработкаЗавершена = Истина; -КонецПроцедуры - -Процедура ВключитьОтправкуСведенийЗаполнение(Параметры) Экспорт - + + ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); + ПараметрыЦентраМониторинга.Вставить("ИдентификаторИнформационнойБазыПостоянный", ПараметрыЦентраМониторинга.ИдентификаторИнформационнойБазы); + УстановитьПараметрыЦентраМониторинга(ПараметрыЦентраМониторинга); + КонецПроцедуры Процедура ЗаписатьОперациюБизнесСтатистикиСлужебная(ПараметрыЗаписи) Экспорт diff --git a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl index 33a8e07ef..ba8714efc 100644 --- a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl @@ -4,13 +4,16 @@ // // Параметры: // Шаблон - СправочникСсылка.ШаблоныСообщений - ссылка на шаблон сообщения. -// Предмет - Произвольный - Объект основания для шаблона сообщений, типы объектов перечислены в определяемом типе ПредметШаблонаСообщения. -// УникальныйИдентификатор - УникальныйИдентификатор - Идентификатор формы, необходим для размещения вложений во временном хранилище при клиент-серверном вызове. -// Если вызов происходит только на сервере, то можно использовать любой идентификатор. -// ДополнительныеПараметры - Структура - Необязательный, список дополнительных параметров, который будет передан в параметр Сообщение -// в процедурах ПриФормированииСообщения при создании сообщения. -// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет необходимо ли преобразование HTML текста сообщения -// содержащего картинки в тексте письма из-за особенностей вывода изображений в форматированном документе. +// Предмет - Произвольный - Объект основания для шаблона сообщений, типы объектов перечислены в +// определяемом типе ПредметШаблонаСообщения. +// УникальныйИдентификатор - УникальныйИдентификатор - Идентификатор формы, необходим для размещения вложений во +// временном хранилище при клиент-серверном вызове. Если вызов +// происходит только на сервере, то можно использовать любой идентификатор. +// ДополнительныеПараметры - Структура - Необязательный, список дополнительных параметров, который будет передан в +// параметр Сообщение в процедурах ПриФормированииСообщения при создании сообщения. +// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет +// необходимо ли преобразование HTML текста сообщения содержащего картинки в тексте письма из-за +// особенностей вывода изображений в форматированном документе. // // Возвращаемое значение: // Структура - подготовленное сообщение на основание шаблона для отправки. @@ -36,12 +39,15 @@ // // Параметры: // Шаблон - СправочникСсылка.ШаблоныСообщений - ссылка на шаблон сообщения. -// Предмет - Произвольный - объект основания для шаблона сообщений, типы объектов перечислены в определяемом типе ПредметШаблонаСообщения. -// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы, необходим для размещения вложений во временном хранилище. -// ДополнительныеПараметры - Структура - Необязательный, список дополнительных параметров, который будет передан в параметр Сообщение -// в процедурах ПриФормированииСообщения при создании сообщения. -// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет необходимо ли преобразование HTML текста сообщения -// содержащего картинки в тексте письма из-за особенностей вывода изображений в форматированном документе. +// Предмет - Произвольный - объект основания для шаблона сообщений, типы объектов перечислены в +// определяемом типе ПредметШаблонаСообщения. +// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы, необходим для размещения вложений во +// временном хранилище. +// ДополнительныеПараметры - Структура - Необязательный, список дополнительных параметров, который будет передан в +// параметр Сообщение в процедурах ПриФормированииСообщения при создании сообщения. +// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет +// необходимо ли преобразование HTML текста сообщения содержащего картинки в тексте письма из-за +// особенностей вывода изображений в форматированном документе. // // Возвращаемое значение: // Структура - результат отправки сообщения. @@ -63,6 +69,17 @@ ШаблоныСообщенийСлужебный.РеквизитыПоСКД(Реквизиты, Макет); КонецПроцедуры +// Заполняет список реквизитов шаблона сообщений на основание макета СКД. +// +// Параметры: +// Реквизиты - Соответствие - Список реквизитов. +// Предмет - Произвольный - Ссылка на объект основания для шаблона сообщений. +// ПараметрыШаблона - Структура - Список параметров шаблона. см функцию ПараметрыШаблона. +// +Процедура ЗаполнитьРеквизитыПоСКД(Реквизиты, Предмет, ПараметрыШаблона) Экспорт + ШаблоныСообщенийСлужебный.ЗаполнитьРеквизитыПоСКД(Реквизиты, Предмет, ПараметрыШаблона); +КонецПроцедуры + // Создать шаблон сообщения // // Параметры: @@ -91,7 +108,7 @@ // Функция ОписаниеПараметровШаблона() Экспорт - ПараметрыШаблона = ШаблоныСообщенийСлужебный.ОписаниеПараметровШаблона(); + ПараметрыШаблона = ШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона(); ПараметрыШаблона.Удалить("РазворачиватьСсылочныеРеквизиты"); Возврат ПараметрыШаблона; @@ -115,8 +132,10 @@ // Параметры: // ПолучателиПисьма - ТаблицаЗначений - Список получателей письма или сообщения SMS // ПредметСообщения - Произвольный - Объект-родитель, у которого есть реквизиты, содержащие контактной информацию. -// ИмяРеквизита - Строка - Имя реквизита в объекте-родителе, из которого следует получить адреса почты или номера телефонов. -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Если тип Адрес, то будут добавлены адреса почта, если Телефон, то номера телефонов. +// ИмяРеквизита - Строка - Имя реквизита в объекте-родителе, из которого следует получить адреса почты или +// номера телефонов. +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Если тип Адрес, то будут добавлены адреса +// почта, если Телефон, то номера телефонов. // Процедура ЗаполнитьПолучателей(ПолучателиПисьма, ПредметСообщения, ИмяРеквизита, ТипКонтактнойИнформации = Неопределено) Экспорт @@ -230,6 +249,48 @@ КонецФункции +// Возвращает описание параметров шаблона сообщения по данным формы, ссылке на элемент справочника шаблона +// сообщения или определив контекстный шаблон по его владельцу. Если шаблон не будет найден, то будет возвращена +// структура с незаполненными полями шаблона сообщения. Заполнив которые можно создать новый шаблон сообщения. +// +// Параметры: +// Шаблон - ДанныеФормыСтруктура, СправочникСсылка.ШаблоныСообщений, +// ЛюбаяСсылка - Ссылка на шаблон сообщения или на владельца контекстного шаблона. +// +// Возвращаемое значение: +// Структура - Сведения о шаблоне. Подробнее см. ШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона. +// +Функция ПараметрыШаблона(Знач Шаблон) Экспорт + + ПоискПоВладельцу = Ложь; + Если ТипЗнч(Шаблон) <> Тип("ДанныеФормыСтруктура") + И ТипЗнч(Шаблон) <> Тип("СправочникСсылка.ШаблоныСообщений") Тогда + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ШаблоныСообщений.Ссылка КАК Ссылка + |ИЗ + | Справочник.ШаблоныСообщений КАК ШаблоныСообщений + |ГДЕ + | ШаблоныСообщений.ВладелецШаблона = &ВладелецШаблона"; + Запрос.УстановитьПараметр("ВладелецШаблона", Шаблон); + + РезультатЗапроса = Запрос.Выполнить().Выбрать(); + Если РезультатЗапроса.Следующий() Тогда + Шаблон = РезультатЗапроса.Ссылка; + Иначе + ПоискПоВладельцу = Истина; + КонецЕсли; + КонецЕсли; + + Результат = ШаблоныСообщенийСлужебный.ПараметрыШаблона(Шаблон); + Если ПоискПоВладельцу Тогда + Результат.ВладелецШаблона = Шаблон; + КонецЕсли; + Возврат Результат; +КонецФункции + // Обратная совместимость. // Подставляет в шаблон значения параметров сообщения и формирует текст сообщения. @@ -258,33 +319,11 @@ Возврат ШаблоныСообщенийСлужебный.ПараметрыИзТекстаСообщения(ПараметрыШаблона); КонецФункции -// Возвращает сведения о шаблоне сообщения. -// -// Параметры: -// Шаблон - ДанныеФормыСтруктура, СправочникСсылка.ШаблоныСообщений - Шаблон сообщения. -// -// Возвращаемое значение: -// Структура - Сведения о шаблоне. -// -Функция ПараметрыШаблона(Шаблон) Экспорт - Возврат ШаблоныСообщенийСлужебный.ПараметрыШаблона(Шаблон); -КонецФункции #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Заполняет список реквизитов шаблона сообщений на основание макета СКД. -// -// Параметры: -// Реквизиты - Соответствие - Список реквизитов. -// Предмет - Произвольный - Ссылка на объект основания для шаблона сообщений. -// ПараметрыШаблона - Структура - Список параметров шаблона. см функцию ПараметрыШаблона. -// -Процедура ЗаполнитьРеквизитыПоСКД(Реквизиты, Предмет, ПараметрыШаблона) Экспорт - ШаблоныСообщенийСлужебный.ЗаполнитьРеквизитыПоСКД(Реквизиты, Предмет, ПараметрыШаблона); -КонецПроцедуры - Функция СформироватьПараметрыОтправки(Шаблон, Предмет, УникальныйИдентификатор, ДополнительныеПараметры = Неопределено) ПараметрыОтправки = Новый Структура(); diff --git a/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl index 6dae2b3f9..9163071b2 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl @@ -8,12 +8,80 @@ Процедура ВыбратьШаблон(Оповещение) Экспорт ДополнительныеПараметры = Новый Структура("Оповещение", Оповещение); - ПараметрыФормы = Новый Структура("Назначение, РежимВыбора, ВидСообщения", "Общий", Истина, "ЭлектронноеПисьмо"); + ПараметрыФормы = Новый Структура("Назначение, РежимВыбора, ВидСообщения", "Общий", Истина, "Письмо"); Оповещение = Новый ОписаниеОповещения("ЗаполнитьПоШаблонуПослеВыбораШаблона", ЭтотОбъект, ДополнительныеПараметры); ОткрытьФорму("Справочник.ШаблоныСообщений.Форма.СформироватьСообщение", ПараметрыФормы, ЭтотОбъект,,,, Оповещение); КонецПроцедуры +// Показывает форму шаблона сообщения. +// +// Параметры: +// Значение - СправочникСсылка.ШаблоныСообщений, Структура, ЛюбаяСсылка - Если передана ссылка на шаблон сообщения, + // то будет открыт этот шаблон. + // Если передана структура, то будет открыто окно нового шаблона сообщения заполненного из полей +// структуры. Описание полей. см. ШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона. +// Если ЛюбаяСсылка, то будет открыт шаблон сообщения по владельцу. +// ПараметрыОткрытия - Структура - параметры открытия формы: +// * Владелец - Произвольный - Форма или элемент управления другой формы. +// * Уникальность - Произвольный - Ключ, значение которого будет использоваться для поиска уже открытых форм. +// * НавигационнаяСсылка - Строка - Задает навигационную ссылку, возвращаемую формой. +// * ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после +// закрытия формы. +// * РежимОткрытияОкна - РежимОткрытияОкнаФормы - Указывает режим открытия окна управляемой формы. +// +Процедура ПоказатьФормуШаблона(Значение, ПараметрыОткрытия = Неопределено) Экспорт + + ПараметрыОткрытияФормы = ПараметрыФормы(ПараметрыОткрытия); + + ПараметрыФормы = Новый Структура; + Если ТипЗнч(Значение) = Тип("Структура") Тогда + ПараметрыФормы.Вставить("Основание", Значение); + ПараметрыФормы.Вставить("ВладелецШаблона", Значение.ВладелецШаблона); + ИначеЕсли ТипЗнч(Значение) = Тип("СправочникСсылка.ШаблоныСообщений") Тогда + ПараметрыФормы.Вставить("Ключ", Значение); + Иначе + ПараметрыФормы.Вставить("ВладелецШаблона", Значение); + ПараметрыФормы.Вставить("Ключ", Значение); + КонецЕсли; + + ОткрытьФорму("Справочник.ШаблоныСообщений.ФормаОбъекта", ПараметрыФормы, ПараметрыОткрытияФормы.Владелец, + ПараметрыОткрытияФормы.Уникальность,, ПараметрыОткрытияФормы.НавигационнаяСсылка, + ПараметрыОткрытияФормы.ОписаниеОповещенияОЗакрытии, ПараметрыОткрытияФормы.РежимОткрытияОкна); +КонецПроцедуры + +// Возвращает параметры открытия формы шаблона сообщения. +// +// Параметры: +// ДанныеЗаполнения - Произвольный - Значение, на основании которого выполняется заполнение. +// Значение данного параметра не может быть следующих типов: +// Неопределено, Null, Число, Строка, Дата, Булево, Дата. +// +// Возвращаемое значение: +// Структура - Список параметров открытия формы. +// * Владелец - Произвольный - Форма или элемент управления другой формы. +// * Уникальность - Произвольный - Ключ, значение которого будет использоваться для поиска уже открытых форм. +// * НавигационнаяСсылка - Строка - Задает навигационную ссылку, возвращаемую формой. +// * ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после +// закрытия формы. +// * РежимОткрытияОкна - РежимОткрытияОкнаФормы - Указывает режим открытия окна управляемой формы. +// +Функция ПараметрыФормы(ДанныеЗаполнения) Экспорт + ПараметрыОткрытия = Новый Структура(); + ПараметрыОткрытия.Вставить("Владелец", Неопределено); + ПараметрыОткрытия.Вставить("Уникальность", Неопределено); + ПараметрыОткрытия.Вставить("НавигационнаяСсылка", Неопределено); + ПараметрыОткрытия.Вставить("ОписаниеОповещенияОЗакрытии", Неопределено); + ПараметрыОткрытия.Вставить("РежимОткрытияОкна", Неопределено); + + Если ДанныеЗаполнения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыОткрытия, ДанныеЗаполнения); + КонецЕсли; + + Возврат ПараметрыОткрытия; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -27,4 +95,3 @@ #КонецОбласти - diff --git a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl index 5e8f384c3..3195f5f98 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl @@ -48,14 +48,46 @@ КонецФункции +// Конструктор параметров шаблона. +// +// Возвращаемое значение: +// Структура - список параметров шаблона. +// +Функция ОписаниеПараметровШаблона() Экспорт + Результат = Новый Структура; + + Результат.Вставить("Текст", ""); + Результат.Вставить("Тема", ""); + Результат.Вставить("ТипШаблона", "Письмо"); + Результат.Вставить("Назначение", ""); + Результат.Вставить("ПолноеИмяТипаНазначения", ""); + Результат.Вставить("ФорматПисьма", ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML")); + Результат.Вставить("УпаковатьВАрхив", Ложь); + Результат.Вставить("ТранслитерироватьИменаФайлов", Ложь); + Результат.Вставить("ПеревестиВТранслит", Ложь); + Результат.Вставить("Отправитель", ""); + Результат.Вставить("ВнешняяОбработка", Неопределено); + Результат.Вставить("ШаблонПоВнешнейОбработке", Ложь); + Результат.Вставить("РазворачиватьСсылочныеРеквизиты", Истина); + Результат.Вставить("ФорматыВложений", Новый СписокЗначений); + Результат.Вставить("ВыбранныеВложения", Новый Соответствие); + Результат.Вставить("Макет", ""); + Результат.Вставить("Параметры", Новый Соответствие); + Результат.Вставить("ПараметрыСКД", Новый Соответствие); + Результат.Вставить("ВладелецШаблона", Неопределено); + Результат.Вставить("Ссылка", Неопределено); + Результат.Вставить("Наименование", ""); + + Возврат Результат; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции - Функция ЗаголовокПроизвольныхПараметров() Экспорт Возврат НСтр("ru = 'Произвольные'"); КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl index 86ab4d5d9..054e436b0 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl @@ -14,8 +14,10 @@ // ** Имя - Строка - Уникальное имя общего реквизита. // ** Представление - Строка - Представление общего реквизита. // ** Тип - Тип - Тип общего реквизита. По умолчанию строка. -// * ИспользоватьПроизвольныеПараметры - Булево - указывает, можно ли использовать произвольные пользовательские параметры в шаблонах сообщений. -// * ЗначенияПараметровСКД - Структура - Общие значения параметров СКД, для всех макетов, где состав реквизитов определяется средствами СКД. +// * ИспользоватьПроизвольныеПараметры - Булево - указывает, можно ли использовать произвольные пользовательские +// параметры в шаблонах сообщений. +// * ЗначенияПараметровСКД - Структура - Общие значения параметров СКД, для всех макетов, где состав реквизитов +// определяется средствами СКД. // Процедура ПриОпределенииНастроек(Настройки) Экспорт @@ -36,7 +38,8 @@ // ** Имя - Строка - Уникальное имя вложения. // ** Представление - Строка - Представление варианта. // ** Подсказка - Строка - Расширенная информация о вложении. -// ** ТипФайла - Строка - Тип вложения, который соответствует расширению файла: "pdf", "png", "jpg", mxl" и др. +// ** ТипФайла - Строка - Тип вложения, который соответствует расширению файла: "pdf", "png", "jpg", mxl" +// и др. // НазначениеШаблона - Строка - Имя назначения шаблон сообщения. // ДополнительныеПараметры - Структура - дополнительные сведения о шаблоне сообщений. // diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСервер/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийСервер/Module.bsl index 9e43cd88b..f41380e69 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийСервер/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийСервер/Module.bsl @@ -1,21 +1,23 @@ - #Область ПрограммныйИнтерфейс - // Обратная совместимость. // Создает описание таблицы параметров шаблона сообщения. // // Возвращаемое значение: -// ТаблицаЗначений - сформированная пустая таблица значений. +// ТаблицаЗначений - Сформированная пустая таблица значений. +// * ИмяПараметра - Строка - Имя параметра. +// * ОписаниеТипа - ОписаниеТипов - Описание типа параметра. +// * ЭтоПредопределенныйПараметр - Булево - Является ли параметр предопределенным. +// * ПредставлениеПараметра - Строка - Представление параметра. // Функция ТаблицаПараметров() Экспорт ПараметрыШаблона = Новый ТаблицаЗначений; - ПараметрыШаблона.Колонки.Добавить("ИмяПараметра" , Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная))); + ПараметрыШаблона.Колонки.Добавить("ИмяПараметра" , Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная))); ПараметрыШаблона.Колонки.Добавить("ОписаниеТипа" , Новый ОписаниеТипов("ОписаниеТипов")); ПараметрыШаблона.Колонки.Добавить("ЭтоПредопределенныйПараметр" , Новый ОписаниеТипов("Булево")); - ПараметрыШаблона.Колонки.Добавить("ПредставлениеПараметра" , Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150, ДопустимаяДлина.Переменная))); + ПараметрыШаблона.Колонки.Добавить("ПредставлениеПараметра" , Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150, ДопустимаяДлина.Переменная))); Возврат ПараметрыШаблона; diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl index e9c954637..2d3bda7ea 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl @@ -63,7 +63,11 @@ Для каждого Вложение Из Сообщение.Вложения Цикл НовоеВложение = СформированноеСообщение.Вложения.Добавить(); - НовоеВложение.Представление = Вложение.Ключ; + Если ПараметрыШаблона.ТранслитерироватьИменаФайлов Тогда + НовоеВложение.Представление = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Вложение.Ключ); + Иначе + НовоеВложение.Представление = Вложение.Ключ; + КонецЕсли; НовоеВложение.АдресВоВременномХранилище = Вложение.Значение; КонецЦикла; @@ -82,12 +86,14 @@ Результат = Новый Структура("Отправлено, ОписаниеОшибки", Ложь); + Сообщение = СформироватьСообщение(ПараметрыОтправки); + Если ПараметрыОтправки.Шаблон.ПредназначенДляSMS Тогда - Сообщение = СформироватьСообщение(ПараметрыОтправки); Если Сообщение.Получатель.Количество() = 0 Тогда Результат.ОписаниеОшибки = НСтр("ru = 'Для отправки сообщения необходимо ввести номер телефонов получателей.'"); Возврат Результат; КонецЕсли; + НомераПолучателей = Новый Массив; Для каждого Получатель Из Сообщение.Получатель Цикл НомераПолучателей.Добавить(Получатель.Значение); @@ -104,29 +110,32 @@ КонецЕсли; Возврат Результат; КонецЕсли; + Иначе - Сообщение = СформироватьСообщение(ПараметрыОтправки); Если Сообщение.Получатель.Количество() = 0 Тогда Результат.ОписаниеОшибки = НСтр("ru = 'Сообщение не может быть отправлено сразу, т.к необходимо ввести адрес электронной почты.'"); Возврат Результат; КонецЕсли; + ПараметрыПисьма = Новый Структура(); - ПараметрыПисьма.Вставить("Тема", Сообщение.Тема); - ПараметрыПисьма.Вставить("Вложения", Новый Соответствие); + ПараметрыПисьма.Вставить("Тема", Сообщение.Тема); + ПараметрыПисьма.Вставить("Тело", Сообщение.Текст); + ПараметрыПисьма.Вставить("Вложения", Новый Соответствие); + ПараметрыПисьма.Вставить("Кодировка", "utf-8"); + Для каждого Вложение Из Сообщение.Вложения Цикл НовоеВложение = Новый Структура("ДвоичныеДанные, Идентификатор"); НовоеВложение.ДвоичныеДанные = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище); НовоеВложение.Идентификатор = Вложение.Идентификатор; ПараметрыПисьма.Вложения.Вставить(Вложение.Представление, НовоеВложение); КонецЦикла; - ПараметрыПисьма.Вставить("Тело", Сообщение.Текст); - ПараметрыПисьма.Вставить("Кодировка", "utf-8"); Если Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками; Иначе ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст; КонецЕсли; + ПараметрыПисьма.Вставить("ТипТекста", ТипТекста); Кому = Новый Массив; Для каждого Получатель Из Сообщение.Получатель Цикл @@ -135,6 +144,7 @@ ПолучательСообщения.Вставить("Представление", Получатель.Представление); Кому.Добавить(ПолучательСообщения); КонецЦикла; + ПараметрыПисьма.Вставить("Кому", Кому); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда @@ -148,6 +158,7 @@ Возврат Результат; КонецЕсли; КонецЕсли + КонецЕсли; Возврат Результат; @@ -159,6 +170,43 @@ Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции +// Возвращает список объектов метаданных к которым подключена подсистема Шаблоны сообщений. +// +// Возвращаемое значение: +// Массив - список из элементов типа ОбъектМетаданных. +Функция ИсточникиШаблоновСообщений() Экспорт + + МассивТиповИлиМетаданных = Метаданные.ОпределяемыеТипы.ПредметШаблонаСообщения.Тип.Типы(); + + ИндексТипаИдентификаторыОбъектовМетаданных = МассивТиповИлиМетаданных.Найти(Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + Если ИндексТипаИдентификаторыОбъектовМетаданных <> Неопределено Тогда + МассивТиповИлиМетаданных.Удалить(ИндексТипаИдентификаторыОбъектовМетаданных); + КонецЕсли; + + Возврат МассивТиповИлиМетаданных; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. +Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + + Описание = Описание + " + |Справочник.ШаблоныСообщений.Чтение.Пользователи + |Справочник.ШаблоныСообщений.Изменение.Пользователи + |"; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Описание = Описание + " + |Справочник.ШаблоныСообщенийПрисоединенныеФайлы.Чтение.Пользователи + |Справочник.ШаблоныСообщенийПрисоединенныеФайлы.Изменение.Пользователи + |"; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -171,7 +219,7 @@ Сообщение.Вставить("Получатель", Новый СписокЗначений); Сообщение.Вставить("ДополнительныеПараметры", ?(ПараметрыШаблона <> Неопределено, ПараметрыШаблона, Новый Структура())); - Сообщение.Вставить("СообщенияПользователю"); + Сообщение.Вставить("СообщенияПользователю", Новый Массив()); ТипСтрока = Новый ОписаниеТипов("Строка"); Вложения = Новый ТаблицаЗначений; @@ -194,7 +242,7 @@ СведенияОШаблоне.Реквизиты = ДеревоРеквизитов(); СведенияОШаблоне.Вложения = ТаблицаВложений(); - НастройкиШаблоновСообщений = ПриОпределенииНастроек(); + НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебныйПовтИсп.ПриОпределенииНастроек(); СведенияОШаблоне.ОбщиеРеквизиты = НастройкиШаблоновСообщений.ОбщиеРеквизиты; ИмяУзлаОбщихРеквизитов = ИмяУзлаОбщихРеквизитов(); Если ТипЗнч(СведенияОШаблоне.ОбщиеРеквизиты) = Тип("ДеревоЗначений") Тогда @@ -354,7 +402,7 @@ Функция СообщениеБезШаблона(ПараметрыОтправки) - ПараметрыШаблона = ОписаниеПараметровШаблона(); + ПараметрыШаблона = ШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона(); Если ПараметрыОтправки.ДополнительныеПараметры.Свойство("ВидСообщения") И ПараметрыОтправки.ДополнительныеПараметры.ВидСообщения = "СообщениеSMS" Тогда ПараметрыШаблона.ТипШаблона = "SMS"; @@ -369,74 +417,6 @@ // Настройки -Функция ПриОпределенииНастроек() Экспорт - - Настройки = Новый Структура("ПредметыШаблонов, ОбщиеРеквизиты"); - Настройки.Вставить("ИспользоватьПроизвольныеПараметры", Ложь); - Настройки.Вставить("ЗначенияПараметровСКД", Новый Структура); - - ОбщиеРеквизитыДерево = ОпределитьОбщиеРеквизиты(); - Настройки.ОбщиеРеквизиты = ОбщиеРеквизиты(ОбщиеРеквизитыДерево); - Настройки.ПредметыШаблонов = ОпределитьПредметыШаблонов(); - - ШаблоныСообщенийПереопределяемый.ПриОпределенииНастроек(Настройки); - Настройки.ОбщиеРеквизиты = ОбщиеРеквизитыДерево; - - Для каждого ПредметШаблона Из Настройки.ПредметыШаблонов Цикл - Для каждого ПараметрСКД Из Настройки.ЗначенияПараметровСКД Цикл - Если НЕ ПредметШаблона.ЗначенияПараметровСКД.Свойство(ПараметрСКД.Ключ) - ИЛИ ПредметШаблона.ЗначенияПараметровСКД[ПараметрСКД.Ключ] = Null Тогда - ПредметШаблона.ЗначенияПараметровСКД.Вставить(ПараметрСКД.Ключ, Настройки.ЗначенияПараметровСКД[ПараметрСКД.Ключ]); - КонецЕсли; - КонецЦикла; - КонецЦикла; - - Настройки.ПредметыШаблонов.Сортировать("Представление"); - - Возврат Настройки; - -КонецФункции - -Функция ОпределитьПредметыШаблонов() - ИмяМакетаШаблонаПоУмолчанию = "ДанныеШаблонаСообщений"; - - ОснованияДляШаблоновСообщений = Новый ТаблицаЗначений; - ОснованияДляШаблоновСообщений.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); - ОснованияДляШаблоновСообщений.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - ОснованияДляШаблоновСообщений.Колонки.Добавить("Макет", Новый ОписаниеТипов("Строка")); - ОснованияДляШаблоновСообщений.Колонки.Добавить("ЗначенияПараметровСКД", Новый ОписаниеТипов("Структура")); - - ТипыПредметовШаблоновСообщений = Метаданные.ОпределяемыеТипы.ПредметШаблонаСообщения.Тип.Типы(); - Для каждого ТипПредметаШаблонаСообщения Из ТипыПредметовШаблоновСообщений Цикл - Если ТипПредметаШаблонаСообщения <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Назначение = ОснованияДляШаблоновСообщений.Добавить(); - МетаданныеОбъект = Метаданные.НайтиПоТипу(ТипПредметаШаблонаСообщения); - Назначение.Имя = МетаданныеОбъект.ПолноеИмя(); - Назначение.Представление = МетаданныеОбъект.Представление(); - Если МетаданныеОбъект.Макеты.Найти(ИмяМакетаШаблонаПоУмолчанию) <> Неопределено Тогда - Назначение.Макет = ИмяМакетаШаблонаПоУмолчанию; - - // Параметры СКД - МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Назначение.Имя); - МакетСКД = МенеджерОбъекта.ПолучитьМакет(ИмяМакетаШаблонаПоУмолчанию); - АдресСхемы = ПоместитьВоВременноеХранилище(МакетСКД); - КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; - КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); - Для Каждого ДоступныйПараметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы Цикл - ИмяПараметра = Строка(ДоступныйПараметр.Параметр); - Если НЕ (СтрСравнить(ИмяПараметра , "Период") = 0 - ИЛИ СтрСравнить(ИмяПараметра, МетаданныеОбъект.Имя) = 0) Тогда - Назначение.ЗначенияПараметровСКД.Вставить(ИмяПараметра, NULL); - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат ОснованияДляШаблоновСообщений; - -КонецФункции - Функция ВидыШаблонов() Экспорт ТипыШаблонов = Новый СписокЗначений; ТипыШаблонов.Добавить("Email", НСтр("ru = 'Электронного письма'")); @@ -446,7 +426,7 @@ Функция ПодготовитьЗапросДляПолученияСпискаШаблонов(ТипШаблона, Предмет = Неопределено) Экспорт -Если ТипШаблона = "SMS" Тогда + Если ТипШаблона = "SMS" Тогда ПредназначенДляSMS = Истина; ПредназначенДляЭлектронныхПисем = Ложь; Иначе @@ -509,7 +489,7 @@ МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(ПолноеИмяТипаНазначения); Если МетаданныеОбъект <> Неопределено Тогда ИмяРодителя = МетаданныеОбъект.Имя; - Представление = МетаданныеОбъект.Представление(); + Представление = ?(ЗначениеЗаполнено(Представление), Представление, МетаданныеОбъект.Представление()); Иначе ИмяРодителя = ПолноеИмяТипаНазначения; Представление = ?(ЗначениеЗаполнено(Представление), Представление, ПолноеИмяТипаНазначения); @@ -551,29 +531,31 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - ИсточникиКомандПечати = МодульУправлениеПечатью.ИсточникиКомандПечати(); + + ИсточникиКомандПечати = МодульУправлениеПечатью.ИсточникиКомандПечати(); Если ИсточникиКомандПечати.Найти(МетаданныеОбъект) <> Неопределено Тогда + КомандыПечатиОбъекта = МодульУправлениеПечатью.КомандыПечатиОбъектаДоступныеДляВложений(МетаданныеОбъект); - ПроверкаНаДубли = Новый Соответствие; + ПроверкаНаДубли = Новый Соответствие; + Для каждого Вложение Из КомандыПечатиОбъекта Цикл - Если НЕ Вложение.Отключена + Если НЕ Вложение.Отключена И СтрНайти(Вложение.Идентификатор, ",") = 0 И НЕ ПустаяСтрока(Вложение.МенеджерПечати) - И НЕ Вложение.СразуНаПринтер + И НЕ Вложение.СразуНаПринтер И НЕ Вложение.СкрытаФункциональнымиОпциями И ПроверкаНаДубли[Вложение.УникальныйИдентификатор] = Неопределено Тогда - НоваяСтрока = ПараметрыШаблона.Вложения.Добавить(); - НоваяСтрока.Имя = Вложение.Идентификатор; - НоваяСтрока.Идентификатор = Вложение.УникальныйИдентификатор; - НоваяСтрока.Представление = Вложение.Представление; - НоваяСтрока.МенеджерПечати = Вложение.МенеджерПечати; - НоваяСтрока.ТипФайла = "MXL"; - НоваяСтрока.Статус = "ПечатнаяФорма"; - НоваяСтрока.ИмяПараметра = ИмяПараметра; - НоваяСтрока.ПараметрыПечати = Вложение.ДополнительныеПараметры; + НоваяСтрока = ПараметрыШаблона.Вложения.Добавить(); + НоваяСтрока.Имя = Вложение.Идентификатор; + НоваяСтрока.Идентификатор = Вложение.УникальныйИдентификатор; + НоваяСтрока.Представление = Вложение.Представление; + НоваяСтрока.МенеджерПечати = Вложение.МенеджерПечати; + НоваяСтрока.ТипФайла = "MXL"; + НоваяСтрока.Статус = "ПечатнаяФорма"; ПроверкаНаДубли.Вставить(Вложение.УникальныйИдентификатор, Истина); КонецЕсли; КонецЦикла; + КонецЕсли; КонецЕсли; @@ -584,8 +566,8 @@ АдресВоВременномХранилище = Сведения.Имя; Описание = Сведения.Идентификатор; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); ИмяФайлаДляРазбора = ИмяФайла; РасширениеБезТочки = ПолучитьРасширениеФайла(ИмяФайлаДляРазбора); @@ -607,7 +589,7 @@ ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); ПараметрыФайла.Вставить("ВремяИзменения", Неопределено); ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено); - Возврат МодульПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла, АдресВоВременномХранилище, "", Описание); + Возврат МодульРаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВоВременномХранилище, "", Описание); КонецЕсли; Возврат Неопределено; @@ -694,7 +676,7 @@ НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ЭлементСписка.Значение))[0]; ТабличныйДокумент = ПечатнаяФорма.ТабличныйДокумент; - ИмяФайла = ПолучитьИмяВременногоФайлаДляПечатнойФормы(ПечатнаяФорма.СинонимМакета, НастройкиФормата.Расширение, ИспользованныеИменаФайлов); + ИмяФайла = ПолучитьИмяВременногоФайлаДляПечатнойФормы(ПечатнаяФорма.СинонимМакета, НастройкиФормата.Расширение, ИспользованныеИменаФайлов, ПараметрыШаблоны.ТранслитерироватьИменаФайлов); ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременнойПапки) + ИмяФайла; ТабличныйДокумент.Записать(ПолноеИмяФайла, ЭлементСписка.Значение); @@ -735,7 +717,7 @@ КонецФункции -Функция ПолучитьИмяВременногоФайлаДляПечатнойФормы(ИмяМакета, Расширение, ИспользованныеИменаФайлов) +Функция ПолучитьИмяВременногоФайлаДляПечатнойФормы(ИмяМакета, Расширение, ИспользованныеИменаФайлов, ТранслитерироватьИменаФайлов) ШаблонИмениФайла = "%1%2.%3"; @@ -758,6 +740,10 @@ Расширение)); КонецЕсли; + Если ТранслитерироватьИменаФайлов Тогда + ИмяВременногоФайла = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ИмяВременногоФайла); + КонецЕсли; + Возврат ИмяВременногоФайла; КонецФункции @@ -817,38 +803,35 @@ // Функция ПараметрыШаблона(Шаблон) Экспорт - Результат = ОписаниеПараметровШаблона(); + Результат = ШаблоныСообщенийКлиентСервер.ОписаниеПараметровШаблона(); Если ТипЗнч(Шаблон) = Тип("ДанныеФормыСтруктура") Тогда - Результат.ТипШаблона = ?(Шаблон.ПредназначенДляSMS, "SMS", "Письмо"); - Результат.Тема = Шаблон.ТемаПисьма; + Результат.ТипШаблона = ?(Шаблон.ПредназначенДляSMS, "SMS", "Письмо"); + Результат.Тема = Шаблон.ТемаПисьма; + Если Шаблон.ПредназначенДляВводаНаОсновании Тогда Результат.ПолноеИмяТипаНазначения = Шаблон.ПолноеИмяТипаПараметраВводаНаОсновании; Результат.Назначение = Шаблон.Назначение; КонецЕсли; - Результат.ФорматПисьма = Шаблон.ТипТекстаПисьма; - Результат.УпаковатьВАрхив = Шаблон.УпаковатьВАрхив; - Результат.ПеревестиВТранслит = Шаблон.ОтправлятьВТранслите; - Результат.Отправитель = Шаблон.Отправитель; + Результат.ФорматПисьма = Шаблон.ТипТекстаПисьма; + Результат.УпаковатьВАрхив = Шаблон.УпаковатьВАрхив; + Результат.ПеревестиВТранслит = Шаблон.ОтправлятьВТранслите; + Результат.Отправитель = Шаблон.Отправитель; Если Результат.ТипШаблона = "SMS" Тогда - Результат.Текст = Шаблон.ТекстШаблонаSMS; + Результат.Текст = Шаблон.ТекстШаблонаSMS; ИначеЕсли Шаблон.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда - Результат.Текст = Шаблон.ТекстШаблонаПисьмаHTML; + Результат.Текст = Шаблон.ТекстШаблонаПисьмаHTML; Иначе - Результат.Текст = Шаблон.ТекстШаблонаПисьма; + Результат.Текст = Шаблон.ТекстШаблонаПисьма; КонецЕсли; - Результат.ШаблонПоВнешнейОбработке = Шаблон.ШаблонПоВнешнейОбработке; - Результат.ВнешняяОбработка = Шаблон.ВнешняяОбработка; + Результат.ТранслитерироватьИменаФайлов = Шаблон.ТранслитерироватьИменаФайлов; + ЗаполнитьЗначенияСвойств(Результат, Шаблон,, "Параметры"); Для каждого ПечатныеФормыИВложения Из Шаблон.ПечатныеФормыИВложения Цикл Результат.ВыбранныеВложения.Вставить(ПечатныеФормыИВложения.Идентификатор, ПечатныеФормыИВложения.Имя); КонецЦикла; - Если СтрНачинаетсяС(Результат.Назначение, "Служебный") Тогда - Результат.Служебный = Истина; - КонецЕсли; - Для каждого СтрокаПараметр Из Шаблон.Параметры Цикл Результат.Параметры.Вставить(СтрокаПараметр.ИмяПараметра, Новый Структура("ОписаниеТипа, Представление", СтрокаПараметр.ОписаниеТипа, СтрокаПараметр.ПредставлениеПараметра)); КонецЦикла; @@ -859,6 +842,7 @@ | ШаблоныСообщений.ПредназначенДляВводаНаОсновании, | ШаблоныСообщений.ПолноеИмяТипаПараметраВводаНаОсновании, | ШаблоныСообщений.Назначение, + | ШаблоныСообщений.Наименование, | ШаблоныСообщений.ПредназначенДляЭлектронныхПисем, | ШаблоныСообщений.ТипТекстаПисьма, | ВЫБОР @@ -872,11 +856,14 @@ | КОНЕЦ КАК ТекстШаблона, | ШаблоныСообщений.ТемаПисьма, | ШаблоныСообщений.УпаковатьВАрхив, + | ШаблоныСообщений.ТранслитерироватьИменаФайлов, | ШаблоныСообщений.ФорматВложений, | ШаблоныСообщений.ПредназначенДляSMS, | ШаблоныСообщений.ОтправлятьВТранслите, | ШаблоныСообщений.ШаблонПоВнешнейОбработке, - | ШаблоныСообщений.ВнешняяОбработка + | ШаблоныСообщений.ВнешняяОбработка, + | ШаблоныСообщений.Ссылка, + | ШаблоныСообщений.ВладелецШаблона |ИЗ | Справочник.ШаблоныСообщений КАК ШаблоныСообщений |ГДЕ @@ -911,34 +898,28 @@ Если СведенияОШаблоне.Количество() > 0 Тогда СтрокаСведенийОШаблоне = СведенияОШаблоне[0]; - Для каждого ВыбраннаяПечатнаяФорма Из РезультатЗапроса[1].Выгрузить() Цикл Результат.ВыбранныеВложения.Вставить(ВыбраннаяПечатнаяФорма.Идентификатор, ВыбраннаяПечатнаяФорма.Имя); КонецЦикла; - Результат.Текст = СтрокаСведенийОШаблоне.ТекстШаблона; - Результат.ТипШаблона = ?(СтрокаСведенийОШаблоне.ПредназначенДляSMS, "SMS", "Письмо"); + Результат.Текст = СтрокаСведенийОШаблоне.ТекстШаблона; + Результат.ТипШаблона = ?(СтрокаСведенийОШаблоне.ПредназначенДляSMS, "SMS", "Письмо"); Если СтрокаСведенийОШаблоне.ПредназначенДляВводаНаОсновании Тогда - Результат.Назначение = СтрокаСведенийОШаблоне.Назначение; - Результат.ПолноеИмяТипаНазначения = СтрокаСведенийОШаблоне.ПолноеИмяТипаПараметраВводаНаОсновании; - КонецЕсли; - Результат.ФорматПисьма = СтрокаСведенийОШаблоне.ТипТекстаПисьма; - - Если СтрНачинаетсяС(Результат.Назначение, "Служебный") Тогда - Результат.Служебный = Истина; + Результат.Назначение = СтрокаСведенийОШаблоне.Назначение; + Результат.ПолноеИмяТипаНазначения = СтрокаСведенийОШаблоне.ПолноеИмяТипаПараметраВводаНаОсновании; КонецЕсли; + Результат.ФорматПисьма = СтрокаСведенийОШаблоне.ТипТекстаПисьма; Если Результат.ТипШаблона = "SMS" Тогда - Результат.ПеревестиВТранслит = СтрокаСведенийОШаблоне.ОтправлятьВТранслите; + Результат.ПеревестиВТранслит = СтрокаСведенийОШаблоне.ОтправлятьВТранслите; Иначе - Результат.Тема = СтрокаСведенийОШаблоне.ТемаПисьма; - Результат.УпаковатьВАрхив = СтрокаСведенийОШаблоне.УпаковатьВАрхив; - Результат.ФорматПисьма = СтрокаСведенийОШаблоне.ТипТекстаПисьма; + Результат.Тема = СтрокаСведенийОШаблоне.ТемаПисьма; + Результат.УпаковатьВАрхив = СтрокаСведенийОШаблоне.УпаковатьВАрхив; + Результат.ФорматПисьма = СтрокаСведенийОШаблоне.ТипТекстаПисьма; КонецЕсли; - Результат.ВнешняяОбработка = СтрокаСведенийОШаблоне.ВнешняяОбработка; - Результат.ШаблонПоВнешнейОбработке = СтрокаСведенийОШаблоне.ШаблонПоВнешнейОбработке; - Результат.ФорматыВложений = СтрокаСведенийОШаблоне.ФорматВложений.Получить(); + ЗаполнитьЗначенияСвойств(Результат, СтрокаСведенийОШаблоне); + Результат.ФорматыВложений = СтрокаСведенийОШаблоне.ФорматВложений.Получить(); Для каждого СтрокаПараметр Из РезультатЗапроса[2].Выгрузить() Цикл Результат.Параметры.Вставить(СтрокаПараметр.ИмяПараметра, Новый Структура("ОписаниеТипа, Представление", СтрокаПараметр.ТипПараметра.Получить(), СтрокаПараметр.ПредставлениеПараметра)); @@ -947,7 +928,7 @@ КонецЕсли; КонецЕсли; - НастройкиШаблоновСообщений = ПриОпределенииНастроек(); + НастройкиШаблоновСообщений = ШаблоныСообщенийСлужебныйПовтИсп.ПриОпределенииНастроек(); СведенияОПредмете = НастройкиШаблоновСообщений.ПредметыШаблонов.Найти(Результат.ПолноеИмяТипаНазначения, "Имя"); Если СведенияОПредмете <> Неопределено Тогда Результат.Макет = СведенияОПредмете.Макет; @@ -958,32 +939,6 @@ КонецФункции -Функция ОписаниеПараметровШаблона() Экспорт - Результат = Новый Структура; - - Результат.Вставить("Текст", ""); - Результат.Вставить("Тема", ""); - Результат.Вставить("ТипШаблона", "Письмо"); - Результат.Вставить("Назначение", ""); - Результат.Вставить("ПолноеИмяТипаНазначения", ""); - Результат.Вставить("ФорматПисьма", Перечисления.СпособыРедактированияЭлектронныхПисем.HTML); - Результат.Вставить("УпаковатьВАрхив", Ложь); - Результат.Вставить("ПеревестиВТранслит", Ложь); - Результат.Вставить("Отправитель", ""); - Результат.Вставить("ВнешняяОбработка", Неопределено); - Результат.Вставить("ШаблонПоВнешнейОбработке", Ложь); - Результат.Вставить("РазворачиватьСсылочныеРеквизиты", Истина); - Результат.Вставить("ФорматыВложений", Новый СписокЗначений); - Результат.Вставить("ВыбранныеВложения", Новый Соответствие); - Результат.Вставить("Макет", ""); - Результат.Вставить("Параметры", Новый Соответствие); - Результат.Вставить("ПараметрыСКД", Новый Соответствие); - Результат.Вставить("Служебный", Ложь); - - Возврат Результат; - -КонецФункции - // Возвращает соответствие параметров текста сообщения шаблона. // // Параметры: @@ -1081,7 +1036,7 @@ СписокРеквизитов = ""; Для каждого Реквизит Из ПараметрыТекстаСообщения Цикл Если ТипЗнч(Реквизит.Значение) = Тип("Соответствие") Тогда - СписокРеквизитов = СписокРеквизитов + СписокПараметров(Реквизит.Значение, Реквизит.Ключ + "."); // + " КАК " + СтрЗаменить(Реквизит.Ключ, ".", "_"); + СписокРеквизитов = СписокРеквизитов + СписокПараметров(Реквизит.Значение, Реквизит.Ключ + "."); Иначе Если ПустаяСтрока(Реквизит.Значение) Тогда ИмяРеквизита = Реквизит.Ключ; @@ -1148,9 +1103,6 @@ Если ПараметрыТекстаСообщения[ИмяОбъекта] <> Неопределено Тогда ЗаполнитьРеквизитыПоПредмету(ПараметрыТекстаСообщения[ИмяОбъекта], ПроизвольныйПараметр.Значение); ЗаполнитьРеквизитыСвойствИКонтактнойИнформации(ПараметрыТекстаСообщения[ИмяОбъекта], ПроизвольныйПараметр.Значение); - Сообщение.ЗначенияРеквизитов = ПараметрыТекстаСообщения[ИмяОбъекта]; - Иначе - Сообщение.ЗначенияРеквизитов = ПараметрыТекстаСообщения; КонецЕсли; КонецЕсли; КонецЦикла; @@ -1215,20 +1167,6 @@ Возврат ОписаниеТипа.ПривестиЗначение(Значение); КонецФункции -Функция ОпределитьОбщиеРеквизиты() - - ОбщиеРеквизиты = ДеревоРеквизитов(); - ОбщиеРеквизитыСтроки = ОбщиеРеквизиты(ОбщиеРеквизиты); - - ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ТекущаяДата", НСтр("ru = 'Текущая дата'"), Новый ОписаниеТипов("Дата")); - ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ЗаголовокСистемы", НСтр("ru = 'Заголовок системы'")); - ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ТекущийПользователь", НСтр("ru = 'Текущий пользователь'"), Новый ОписаниеТипов("СправочникСсылка.Пользователи")); - РазвернутьРеквизит(ИмяУзлаОбщихРеквизитов() + ".ТекущийПользователь", ОбщиеРеквизитыСтроки.Строки,, "Недействителен, ИдентификаторПользователяИБ, ИдентификаторПользователяСервиса, Подготовлен, Служебный"); - - Возврат ОбщиеРеквизиты; - -КонецФункции - Процедура ЗаполнитьОбщиеРеквизиты(ОбщиеРеквизиты) Если ТипЗнч(ОбщиеРеквизиты) = Тип("Соответствие") Тогда @@ -1238,6 +1176,13 @@ Если ОбщиеРеквизиты.Получить("ЗаголовокСистемы") <> Неопределено Тогда ОбщиеРеквизиты["ЗаголовокСистемы"] = ИмяЭтойИнформационнойБазы(); КонецЕсли; + Если ОбщиеРеквизиты.Получить("АдресБазыВИнтернете") <> Неопределено Тогда + ОбщиеРеквизиты["АдресБазыВИнтернете"] = ОбщегоНазначения.АдресПубликацииИнформационнойБазыВИнтернете(); + КонецЕсли; + Если ОбщиеРеквизиты.Получить("АдресБазыВЛокальнойСети") <> Неопределено Тогда + ОбщиеРеквизиты["АдресБазыВЛокальнойСети"] = ОбщегоНазначения.АдресПубликацииИнформационнойБазыВЛокальнойСети(); + КонецЕсли; + Если ТипЗнч(ОбщиеРеквизиты.Получить("ТекущийПользователь")) = Тип("Соответствие") Тогда ТекущийПользователь = Пользователи.АвторизованныйПользователь(); ЗаполнитьРеквизитыПоПредмету(ОбщиеРеквизиты.Получить("ТекущийПользователь"), ТекущийПользователь); @@ -1376,12 +1321,12 @@ Возврат; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); Если СписокФайлов = Неопределено Тогда СписокФайлов = Новый Массив; - МодульПрисоединенныеФайлы.ПолучитьПрикрепленныеФайлыКОбъекту(ПараметрыШаблона.Шаблон, СписокФайлов); + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ПараметрыШаблона.Шаблон, СписокФайлов); КонецЕсли; ДокументHTML = ПолучитьОбъектДокументHTMLИзТекстаHTML(СформированноеСообщение.Текст); @@ -1392,7 +1337,7 @@ ИзображениеОтсутствуетВПрисоединенныхФайлах = Истина; Для Каждого ПрисоединенныйФайл Из СписокФайлов Цикл Если СтрЧислоВхождений(АтрибутИсточникКартинки.Значение, ПрисоединенныйФайл.ИДФайлаЭлектронногоПисьма) > 0 Тогда - ДанныеФайла = МодульПрисоединенныеФайлы .ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыШаблона.УникальныйИдентификатор); + ДанныеФайла = МодульРаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыШаблона.УникальныйИдентификатор); ОбработатьКартинкуВТекстеHTMLДляФорматированногоДокумента(Картинка, ДанныеФайла, СформированноеСообщение, АтрибутИсточникКартинки, ПрисоединенныйФайл.Наименование, ПрисоединенныйФайл.ИДФайлаЭлектронногоПисьма); ИзображениеОтсутствуетВПрисоединенныхФайлах = Ложь; @@ -1403,7 +1348,7 @@ СформированноеСообщение.Вложения.Удалить(НайденнаяСтрока); КонецЕсли; - ДанныеФайла = МодульПрисоединенныеФайлы .ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыШаблона.УникальныйИдентификатор); + ДанныеФайла = МодульРаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыШаблона.УникальныйИдентификатор); ОбработатьКартинкуВТекстеHTMLДляФорматированногоДокумента(Картинка, ДанныеФайла, СформированноеСообщение, АтрибутИсточникКартинки, ПрисоединенныйФайл.Наименование, ПрисоединенныйФайл.Наименование); ИзображениеОтсутствуетВПрисоединенныхФайлах = Ложь; @@ -1806,7 +1751,7 @@ Возврат НСтр("ru = 'ОбщиеРеквизиты'"); КонецФункции -Функция ОбщиеРеквизиты(Реквизиты) +Функция ОбщиеРеквизиты(Реквизиты) Экспорт УзелРеквизитов = Реквизиты.Строки.Найти(ИмяУзлаОбщихРеквизитов(), "Имя"); Если УзелРеквизитов = Неопределено Тогда @@ -1819,6 +1764,22 @@ КонецФункции +Функция ОпределитьОбщиеРеквизиты() Экспорт + + ОбщиеРеквизиты = ДеревоРеквизитов(); + ОбщиеРеквизитыСтроки = ОбщиеРеквизиты(ОбщиеРеквизиты); + + ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ТекущаяДата", НСтр("ru = 'Текущая дата'"), Новый ОписаниеТипов("Дата")); + ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ЗаголовокСистемы", НСтр("ru = 'Заголовок системы'")); + ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "АдресБазыВИнтернете", НСтр("ru = 'Адрес базы в Интернете'"), Новый ОписаниеТипов("Строка")); + ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "АдресБазыВЛокальнойСети", НСтр("ru = 'Адрес базы в локальной сети'"), Новый ОписаниеТипов("Строка")); + ДобавитьОбщийРеквизит(ОбщиеРеквизитыСтроки, "ТекущийПользователь", НСтр("ru = 'Текущий пользователь'"), Новый ОписаниеТипов("СправочникСсылка.Пользователи")); + РазвернутьРеквизит(ИмяУзлаОбщихРеквизитов() + ".ТекущийПользователь", ОбщиеРеквизитыСтроки.Строки,, "Недействителен, ИдентификаторПользователяИБ, ИдентификаторПользователяСервиса, Подготовлен, Служебный"); + + Возврат ОбщиеРеквизиты; + +КонецФункции + Процедура ДобавитьОбщийРеквизит(ОбщиеРеквизиты, Имя, Представление, Тип = Неопределено) НовыйРеквизит = ОбщиеРеквизиты.Строки.Добавить(); @@ -1886,14 +1847,14 @@ // Файлы Процедура ДобавитьПрисоединенныеФайлыВоВложения(Знач ПараметрыОтправки, Знач Сообщение) - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); СписокПрисоединенныхФайлов = Новый Массив; - МодульПрисоединенныеФайлы.ПолучитьПрикрепленныеФайлыКОбъекту(ПараметрыОтправки.Шаблон, СписокПрисоединенныхФайлов); + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ПараметрыОтправки.Шаблон, СписокПрисоединенныхФайлов); Для каждого ПрисоединенныйФайл Из СписокПрисоединенныхФайлов Цикл Если ПустаяСтрока(ПрисоединенныйФайл.ИДФайлаЭлектронногоПисьма) Тогда - ОписаниеФайла = МодульПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыОтправки.УникальныйИдентификатор); + ОписаниеФайла = МодульРаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл.Ссылка, ПараметрыОтправки.УникальныйИдентификатор); Если Прав(ОписаниеФайла.ИмяФайла, 1) = "." Тогда ОписаниеФайлаИмяФайла = Лев(ОписаниеФайла.ИмяФайла, СтрДлина(ОписаниеФайла.ИмяФайла) - 1); Иначе @@ -1997,8 +1958,8 @@ Если КонтактнаяИнформацияОбъектов.Количество() > 0 Тогда Для каждого КонтактнаяИнформацияОбъекта Из КонтактнаяИнформацияОбъектов Цикл НоваяСтрока= Получатели.Добавить(); - НоваяСтрока[ИмяКолонки] = КонтактнаяИнформацияОбъекта.Представление; - НоваяСтрока.Представление = Строка(КонтактнаяИнформацияОбъекта.Объект) + " <" + КонтактнаяИнформацияОбъекта.Представление + ">"; + НоваяСтрока[ИмяКолонки] = КонтактнаяИнформацияОбъекта.Представление; + НоваяСтрока.Представление = СтрЗаменить(Строка(КонтактнаяИнформацияОбъекта.Объект), ",", ""); КонецЦикла; КонецЕсли; КонецЕсли; @@ -2031,4 +1992,78 @@ КонецФункции -#КонецОбласти +Процедура СформироватьСообщениеВФоне(ПараметрыВызоваСервера, АдресХранилища) Экспорт + + ПараметрыОтправки = ПараметрыВызоваСервера.ПараметрыОтправки; + ВидСообщения = ПараметрыВызоваСервера.ВидСообщения; + + Если ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу Тогда + Результат = СформироватьСообщениеИОтправить(ПараметрыОтправки); + ПоместитьВоВременноеХранилище(Результат, АдресХранилища); + Иначе + Сообщение = ШаблоныСообщений.СформироватьСообщение(ПараметрыОтправки.Шаблон, ПараметрыОтправки.Предмет, ПараметрыОтправки.УникальныйИдентификатор, ПараметрыОтправки.ДополнительныеПараметры); + Если ВидСообщения = "Письмо" Тогда + Сообщение = ПреобразоватьПараметрыПисьма(Сообщение); + Иначе + Сообщение.Вложения = Неопределено; + КонецЕсли; + + ПоместитьВоВременноеХранилище(Сообщение, АдресХранилища); + КонецЕсли; + +КонецПроцедуры + +Функция ПреобразоватьПараметрыПисьма(Сообщение) + + ПараметрыПисьма = Новый Структура(); + ПараметрыПисьма.Вставить("Отправитель"); + ПараметрыПисьма.Вставить("Тема", Сообщение.Тема); + ПараметрыПисьма.Вставить("Текст", Сообщение.Текст); + ПараметрыПисьма.Вставить("СообщенияПользователю", Сообщение.СообщенияПользователю); + ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", Ложь); + + Если Сообщение.Получатель = Неопределено ИЛИ Сообщение.Получатель.Количество() = 0 Тогда + ПараметрыПисьма.Вставить("Получатель", ""); + Иначе + ПараметрыПисьма.Вставить("Получатель", Сообщение.Получатель); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") + И ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Если ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") Тогда + СтруктураВложений = Новый Структура(); + + Индекс = Сообщение.Вложения.Количество() - 1; + Пока Индекс >= 0 Цикл + Вложение = Сообщение.Вложения[Индекс]; + Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда + Картинка = Новый Картинка(ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище)); + СтруктураВложений.Вставить(Вложение.Представление, Картинка); + Сообщение.Вложения.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + ПараметрыПисьма.Текст = Новый Структура("ТекстHTML, СтруктураВложений", ПараметрыПисьма.Текст, СтруктураВложений); + Иначе + Если СтрНачинаетсяС(ПараметрыПисьма.Текст, " Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Назначение = ОснованияДляШаблоновСообщений.Добавить(); + МетаданныеОбъект = Метаданные.НайтиПоТипу(ТипПредметаШаблонаСообщения); + Назначение.Имя = МетаданныеОбъект.ПолноеИмя(); + Назначение.Представление = МетаданныеОбъект.Представление(); + Если МетаданныеОбъект.Макеты.Найти(ИмяМакетаШаблонаПоУмолчанию) <> Неопределено Тогда + Назначение.Макет = ИмяМакетаШаблонаПоУмолчанию; + + // Параметры СКД + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Назначение.Имя); + МакетСКД = МенеджерОбъекта.ПолучитьМакет(ИмяМакетаШаблонаПоУмолчанию); + АдресСхемы = ПоместитьВоВременноеХранилище(МакетСКД); + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); + Для Каждого ДоступныйПараметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы Цикл + ИмяПараметра = Строка(ДоступныйПараметр.Параметр); + Если НЕ (СтрСравнить(ИмяПараметра , "Период") = 0 + ИЛИ СтрСравнить(ИмяПараметра, МетаданныеОбъект.Имя) = 0) Тогда + Назначение.ЗначенияПараметровСКД.Вставить(ИмяПараметра, NULL); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ОснованияДляШаблоновСообщений; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСлужебныйПовтИсп/ШаблоныСообщенийСлужебныйПовтИсп.mdo b/SSL/src/CommonModules/ШаблоныСообщенийСлужебныйПовтИсп/ШаблоныСообщенийСлужебныйПовтИсп.mdo new file mode 100644 index 000000000..6deee3f6a --- /dev/null +++ b/SSL/src/CommonModules/ШаблоныСообщенийСлужебныйПовтИсп/ШаблоныСообщенийСлужебныйПовтИсп.mdo @@ -0,0 +1,12 @@ + + + ШаблоныСообщенийСлужебныйПовтИсп + + ru + Шаблоны сообщений служебный повт исп + + true + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl index f41ca0ad9..cadeb3ff2 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl @@ -1,11 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает текущую настройку использования электронных подписей. +// +// Возвращаемое значение: +// Булево - если Истина, электронные подписи используются. +// Функция ИспользоватьЭлектронныеПодписи() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ИспользоватьЭлектронныеПодписи; @@ -13,6 +12,10 @@ КонецФункции // Возвращает текущую настройку использования шифрования. +// +// Возвращаемое значение: +// Булево - если Истина, шифрование используется. +// Функция ИспользоватьШифрование() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ИспользоватьШифрование; @@ -20,6 +23,10 @@ КонецФункции // Возвращает текущую настройку проверки электронных подписей на сервере. +// +// Возвращаемое значение: +// Булево - если Истина, электронные подписи будут проверяться на сервере. +// Функция ПроверятьЭлектронныеПодписиНаСервере() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере; @@ -29,224 +36,101 @@ // Возвращает текущую настройку создания электронных подписей на сервере. // Настройка также предполагает шифрование и расшифровку на сервере. // +// Возвращаемое значение: +// Булево - если Истина, электронные подписи будут создаваться на сервере. +// Функция СоздаватьЭлектронныеПодписиНаСервере() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере; КонецФункции -// Возвращает менеджер криптографии (на сервере) для указанной программы. -// -// Параметры: -// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют -// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, -// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов. -// -// ПоказатьОшибку - Булево - если Истина, тогда будет вызвано исключение, содержащее описание ошибки. -// -// ОписаниеОшибки - Строка - возвращаемое описание ошибки, когда функция возвратила значение Неопределено. -// -// Программа - Неопределено - возвращает менеджер криптографии первой -// программы из справочника для которой удалось его создать. -// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа -// для которой нужно создать и вернуть менеджер криптографии. -// -// Возвращаемое значение: -// МенеджерКриптографии - менеджер криптографии. -// Неопределено - произошла ошибка, описание которой в параметре ОписаниеОшибки. -// -Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт - - Ошибка = ""; - Результат = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(Операция, ПоказатьОшибку, Ошибка, Программа); - - Если Результат = Неопределено Тогда - ОписаниеОшибки = Ошибка; - КонецЕсли; - - Возврат Результат; - -КонецФункции -// Проверяет действительность подписи и сертификата. +// Получает подписи объекта и возвращает их. // // Параметры: -// МенеджерКриптографии - Неопределено - получить менеджер криптографии для проверки -// электронных подписей, как настроил администратор. -// - МенеджерКриптографии - использовать указанный менеджер криптографии. -// -// ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны. -// - Строка - адрес временного хранилища, содержащего двоичные данные. -// - Строка - полное имя файла, содержащего двоичные данные, -// которые были подписаны. -// - Структура - со свойствами: -// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего -// модуля ЭлектроннаяПодписьКлиентСервер. -// * КонвертSOAP - Строка - шаблон сообщения . -// -// Подпись - ДвоичныеДанные - двоичные данные электронной подписи. -// - Строка - адрес временного хранилища, содержащего двоичные данные. -// - Строка - полное имя файла, содержащего двоичные данные -// электронной подписи. -// - Неопределено - если ИсходныеДанные конверт SOAP. -// -// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки. -// - Строка - содержит описание ошибки, если произошла ошибка. -// -// НаДату - Дата - проверить сертификат на указанную дату, -// если дату не удалось извлечь из подписи. -// Если параметр не заполнен, тогда проверять на текущую дату сеанса, -// если дату не удалось извлечь из подписи. +//  Объект - Ссылка - Ссылка на подписанный объект. +//                    Объект должен иметь реквизит ПодписанЭП. // // Возвращаемое значение: -// Булево - Истина, если проверка выполнена успешно. -// - Ложь, если не удалось получить менеджер криптографии (когда не указан), -// или произошла ошибка указанная в параметре ОписаниеОшибки. +//  Массив - массив описанных ниже структур. +//    - Структура - развернутое описание подписи: +//     * Подпись                 - ДвоичныеДанные - результат подписания. +//     * УстановившийПодпись     - СправочникСсылка.Пользователи - пользователь, который +//                                подписал объект информационной базы. +//     * Комментарий             - Строка - комментарий, если он был введен при подписании. +//     * ИмяФайлаПодписи         - Строка - если подпись добавлена из файла. +//     * ДатаПодписи             - Дата   - дата, когда подпись была сделана. Имеет смысл для случая, +//                                      когда дату невозможно извлечь из данных подписи. +//     * ДатаПроверкиПодписи     - Дата   - дата последней проверки подписи. +//     * ПодписьВерна            - Булево - результат последней проверки подписи. +//     * ПорядковыйНомер         - Число - идентификатор подписи, по которому можно упорядочивать их в списке. // -Функция ПроверитьПодпись(МенеджерКриптографии, ИсходныеДанные, Подпись, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт +//     Производные свойства: +//     * Сертификат              - ДвоичныеДанные - содержит выгрузку сертификата, +//                                который использовался для подписания (содержится в подписи). +//     * Отпечаток               - Строка - отпечаток сертификата в формате строки Base64. +//     * КомуВыданСертификат     - Строка - представление субъекта, полученное из двоичных данных сертификата. +// +Функция УстановленныеПодписи(Объект) Экспорт - МенеджерКриптографииДляПроверки = МенеджерКриптографии; - Если МенеджерКриптографииДляПроверки = Неопределено Тогда - МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаПодписи", ОписаниеОшибки = Null, ОписаниеОшибки); - Если МенеджерКриптографииДляПроверки = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.УстановленныеПодписи",, Истина); - ИсходныеДанныеДляПроверки = ИсходныеДанные; - Если ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные) Тогда - ИсходныеДанныеДляПроверки = ПолучитьИзВременногоХранилища(ИсходныеДанные); - КонецЕсли; + УстановитьПривилегированныйРежим(Истина); - ПодписьДляПроверки = Подпись; - Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда - ПодписьДляПроверки = ПолучитьИзВременногоХранилища(Подпись); - КонецЕсли; + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЭлектронныеПодписи.Подпись, + | ЭлектронныеПодписи.ПорядковыйНомер КАК ПорядковыйНомер, + | ЭлектронныеПодписи.УстановившийПодпись, + | ЭлектронныеПодписи.Комментарий, + | ЭлектронныеПодписи.ИмяФайлаПодписи, + | ЭлектронныеПодписи.ДатаПодписи, + | ЭлектронныеПодписи.ДатаПроверкиПодписи, + | ЭлектронныеПодписи.ПодписьВерна, + | ЭлектронныеПодписи.Сертификат, + | ЭлектронныеПодписи.Отпечаток, + | ЭлектронныеПодписи.КомуВыданСертификат + |ИЗ + | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи + |ГДЕ + | ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект + | + |УПОРЯДОЧИТЬ ПО + | ПорядковыйНомер"; - Если ТипЗнч(ИсходныеДанныеДляПроверки) = Тип("Структура") - И ИсходныеДанныеДляПроверки.Свойство("ПараметрыXMLDSig") Тогда - - Попытка - Результат = ЭлектроннаяПодписьСлужебный.ПроверитьПодпись( - ИсходныеДанныеДляПроверки.КонвертSOAP, - ИсходныеДанныеДляПроверки.ПараметрыXMLDSig, - МенеджерКриптографииДляПроверки); - Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Возврат Ложь; - КонецПопытки; - - Сертификат = Результат.Сертификат; - ДатаПодписания = Результат.ДатаПодписания; - + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда + Запрос.УстановитьПараметр("ПодписанныйОбъект", Объект); Иначе - - Сертификат = Неопределено; - Попытка - МенеджерКриптографииДляПроверки.ПроверитьПодпись(ИсходныеДанныеДляПроверки, ПодписьДляПроверки, Сертификат); - Исключение - Если ОписаниеОшибки = Null Тогда - ВызватьИсключение; - КонецЕсли; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Возврат Ложь; - КонецПопытки; - - ДатаПодписания = ДатаПодписания(ПодписьДляПроверки); - Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда - ДатаПодписания = НаДату; - КонецЕсли; - + Запрос.УстановитьПараметр("ПодписанныйОбъект", Объект.Ссылка); КонецЕсли; - Возврат ПроверитьСертификат(МенеджерКриптографииДляПроверки, Сертификат, ОписаниеОшибки, ДатаПодписания); + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + МассивЭлектронныхПодписей = Новый Массив; + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ОтпечатокСтруктура = Новый Структура( + "ПорядковыйНомер, ДатаПодписи, УстановившийПодпись, + |ДатаПроверкиПодписи, ИмяФайлаПодписи, Комментарий, КомуВыданСертификат, + |Отпечаток, Подпись, ПодписьВерна, Сертификат"); + ЗаполнитьЗначенияСвойств(ОтпечатокСтруктура, ВыборкаДетальныеЗаписи); + ОтпечатокСтруктура.Подпись = ОтпечатокСтруктура.Подпись.Получить(); + МассивЭлектронныхПодписей.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + Возврат МассивЭлектронныхПодписей; КонецФункции -// Проверяет действительность сертификата криптографии. -// -// Параметры: -// МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически. -// - МенеджерКриптографии - использовать указанный менеджер криптографии. -// -// Сертификат - СертификатКриптографии - сертификат. -// - ДвоичныеДанные - двоичные данные сертификата. -// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. -// -// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки. -// - Строка - содержит описание ошибки, если произошла ошибка. -// -// НаДату - Дата - проверить сертификат на указанную дату. -// Если параметр не указан или указана пустая дата, -// тогда проверять на текущую дату сеанса. -// -// Возвращаемое значение: -// Булево - Истина, если проверка выполнена успешно, -// - Ложь, если не удалось получить менеджер криптографии (когда не указан). -// -Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт - - МенеджерКриптографииДляПроверки = МенеджерКриптографии; - - Если МенеджерКриптографииДляПроверки = Неопределено Тогда - МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаСертификата", ОписаниеОшибки = Null, ОписаниеОшибки); - Если МенеджерКриптографииДляПроверки = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - СертификатДляПроверки = Сертификат; - - Если ТипЗнч(Сертификат) = Тип("Строка") Тогда - СертификатДляПроверки = ПолучитьИзВременногоХранилища(Сертификат); - КонецЕсли; - - Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда - СертификатДляПроверки = Новый СертификатКриптографии(СертификатДляПроверки); - КонецЕсли; - - РежимыПроверкиСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата( - ЗначениеЗаполнено(НаДату)); - - Попытка - МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата); - Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Возврат Ложь; - КонецПопытки; - - ОшибкаПросрочки = ЭлектроннаяПодписьСлужебныйКлиентСервер.СертификатПросрочен(СертификатДляПроверки, НаДату); - Если ЗначениеЗаполнено(ОшибкаПросрочки) Тогда - ОписаниеОшибки = ОшибкаПросрочки; - Возврат Ложь; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Находит сертификат на компьютере по строке отпечатка. -// -// Параметры: -// Отпечаток - Строка - Base64 кодированный отпечаток сертификата. -// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. -// -// Возвращаемое значение: -// СертификатКриптографии - сертификат электронной подписи и шифрования. -// Неопределено - сертификат не найден в хранилище. -// -Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище) Экспорт - - Возврат ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); - -КонецФункции - -// Добавляет подпись в табличную часть объекта и записывает его. +// Добавляет подпись к объекту и записывает его. // Устанавливает реквизиту ПодписанЭП значение Истина. // // Параметры: // Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь табличную часть ЭлектронныеПодписи и реквизит ПодписанЭП. +// Объект должен иметь реквизит ПодписанЭП. // - Объект - объект будет изменен без блокировки и без записи. // // СвойстваПодписи - Массив - массив описанных ниже структур или адресов структур. @@ -268,6 +152,13 @@ // который использовался для подписания (содержится в подписи). // * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. // * КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. +// * ОписаниеСертификата - Структура - необязательное свойство, требуемое для сертификатов, которые +// не могут быть переданы в метод платформы СертификатКриптографии, со свойствами: +// ** СерийныйНомер - Строка - серийный номер сертификата, как у объекта платформы СертификатКриптографии. +// ** КемВыдан - Строка - как возвращает функция ПредставлениеИздателя. +// ** КомуВыдан - Строка - как возвращает функция ПредставлениеСубъекта. +// ** ДатаНачала - Строка - дата сертификата, как у объекта платформы СертификатКриптографии в формате "ДЛФ=D". +// ** ДатаОкончания - Строка - дата сертификата, как у объекта платформы СертификатКриптографии в формате "ДЛФ=D". // // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, используемый для блокировки, // если передана ссылка на объект. @@ -281,6 +172,8 @@ Процедура ДобавитьПодпись(Объект, Знач СвойстваПодписи, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.ДобавитьПодпись"); + Если ТипЗнч(СвойстваПодписи) = Тип("Строка") Тогда СвойстваПодписи = ПолучитьИзВременногоХранилища(СвойстваПодписи); @@ -302,24 +195,119 @@ ОбъектДанных = Объект; КонецЕсли; + СообщениеЖурналаРегистрации = ""; + Если ТипЗнч(СвойстваПодписи) = Тип("Массив") Тогда - Для каждого ТекущиеСвойства Из СвойстваПодписи Цикл - ДобавитьСтрокуПодписи(ОбъектДанных, ТекущиеСвойства); + Для Каждого ТекущиеСвойства Из СвойстваПодписи Цикл + ДобавитьСтрокуПодписи(ОбъектДанных, ТекущиеСвойства, СообщениеЖурналаРегистрации); КонецЦикла; Иначе - ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи); + ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи, СообщениеЖурналаРегистрации); КонецЕсли; - ОбъектДанных.ПодписанЭП = Истина; + Если Не ОбъектДанных.ПодписанЭП + И (ТипЗнч(СвойстваПодписи) <> Тип("Массив") + Или СвойстваПодписи.Количество() > 0) Тогда + + ОбъектДанных.ПодписанЭП = Истина; + КонецЕсли; Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда // Чтобы определить, что это запись с целью добавления/удаления подписи. ОбъектДанных.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - ОбъектДанных.Записать(); + Если ОбъектДанных.Модифицированность() Тогда + ОбъектДанных.Записать(); + КонецЕсли; РазблокироватьДанныеДляРедактирования(Объект.Ссылка, ИдентификаторФормы); ЗаписанныйОбъект = ОбъектДанных; КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если ЗначениеЗаполнено(СообщениеЖурналаРегистрации) Тогда + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Ошибка добавления подписи'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + Объект.Метаданные(), + Объект.Ссылка, + СообщениеЖурналаРегистрации + " + | + |" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Обновляет подпись объекта. +// +// Параметры: +// Объект - Ссылка - ссылка на подписанный объект, для которого требуется обновить подпись. +// +// СвойстваПодписи - Строка - адрес временного хранилища, содержащий описанную ниже структуру. +// - Структура - развернутое описание подписи: +// * Подпись - ДвоичныеДанные - результат подписания. +// * УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который +// подписал объект информационной базы. +// * Комментарий - Строка - комментарий, если он был введен при подписании. +// * ИмяФайлаПодписи - Строка - если подпись добавлена из файла. +// * ДатаПодписи - Дата - дата, когда подпись была сделана. Имеет смысл для случая, +// когда дату невозможно извлечь из данных подписи. Если не +// указана или пустая, тогда используется текущая дата сеанса. +// * ДатаПроверкиПодписи - Дата - дата последней проверки подписи. +// * ПодписьВерна - Булево - результат последней проверки подписи. +// * ПорядковыйНомер - Число - идентификатор подписи, по которому можно упорядочивать их в списке. +// +// Производные свойства: +// * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, +// который использовался для подписания (содержится в подписи). +// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// * КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. +// +Процедура ОбновитьПодпись(Объект, Знач СвойстваПодписи) Экспорт + + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.ОбновитьПодпись",, Истина); + + Если ТипЗнч(Объект) = Тип("СправочникСсылка." + "ВерсииФайлов") + Или ТипЗнч(Объект) = Тип("СправочникОбъект." + "ВерсииФайлов") Тогда + + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("СправочникСсылка." + "Файлы")); + МассивТипов.Добавить(Тип("СправочникОбъект." + "Файлы")); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодпись.УдалитьПодпись", + "Объект", Объект, МассивТипов); + КонецЕсли; + + Если ТипЗнч(СвойстваПодписи) = Тип("Строка") Тогда + СвойстваПодписи = ПолучитьИзВременногоХранилища(СвойстваПодписи); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЭлектронныеПодписи"); + ЭлементБлокировки.УстановитьЗначение("ПодписанныйОбъект", Объект); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПодписиОбъекта = УстановленныеПодписи(Объект); + + Для Каждого ПодписьОбъекта Из ПодписиОбъекта Цикл + ДвоичныеДанныеПодписи = ПодписьОбъекта.Подпись; + // Если двоичные данные совпадают, то обновляем подпись. + Если ДвоичныеДанныеПодписи = СвойстваПодписи.Подпись Тогда + ОбновляемаяПодпись = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); + ОбновляемаяПодпись.ПорядковыйНомер = СвойстваПодписи.ПорядковыйНомер; + ОбновляемаяПодпись.ПодписанныйОбъект = Объект; + ОбновляемаяПодпись.Прочитать(); + ЗаполнитьЗначенияСвойств(ОбновляемаяПодпись, СвойстваПодписи, , "Подпись, Сертификат"); + ОбновляемаяПодпись.Записать(Истина); + КонецЕсли; + КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); @@ -328,12 +316,139 @@ КонецПроцедуры -// Помещает сертификаты шифрования в табличную часть объекта и записывает его. -// Устанавливает реквизит Зашифрован по наличию строк в табличной части. +// Удаляет подпись объекта и записывает его. // // Параметры: // Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь табличную часть СертификатыШифрования и реквизит Зашифрован. +// Объект должен иметь реквизит ПодписанЭП. +// - Объект - объект будет изменен без блокировки и без записи. +// +// ПорядковыйНомер - Число - порядковый номер подписи. +// - Массив - значения указанного выше типа. +// +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, используемый для блокировки, +// если передана ссылка на объект. +// +// ВерсияОбъекта - Строка - версия данных объекта, если передана ссылка на объект. Используемая +// для блокировки объекта перед записью, с учетом того, что подписание +// выполняется на клиенте и за время подписания объект мог быть изменен. +// +// ЗаписанныйОбъект - Объект - объект, который был получен и записан, если передавалась ссылка. +// +Процедура УдалитьПодпись(Объект, ПорядковыйНомер, ИдентификаторФормы = Неопределено, + ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт + + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.УдалитьПодпись"); + + НачатьТранзакцию(); + Попытка + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда + ЗаблокироватьДанныеДляРедактирования(Объект, ВерсияОбъекта, ИдентификаторФормы); + ОбъектДанных = Объект.ПолучитьОбъект(); + Иначе + ОбъектДанных = Объект; + КонецЕсли; + + СообщениеЖурналаРегистрации = ""; + + Если ТипЗнч(ПорядковыйНомер) = Тип("Массив") Тогда + Список = Новый СписокЗначений; + Список.ЗагрузитьЗначения(ПорядковыйНомер); + Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв); + Для Каждого ЭлементСписка Из Список Цикл + УдалитьСтрокуПодписи(ОбъектДанных, ЭлементСписка.Значение, СообщениеЖурналаРегистрации); + КонецЦикла; + Иначе + УдалитьСтрокуПодписи(ОбъектДанных, ПорядковыйНомер, СообщениеЖурналаРегистрации); + КонецЕсли; + + ОбновитьНумерациюПодписей(ОбъектДанных); + + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда + // Чтобы определить, что это запись с целью добавления/удаления подписи. + ОбъектДанных.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); + ОбъектДанных.Записать(); + РазблокироватьДанныеДляРедактирования(Объект.Ссылка, ИдентификаторФормы); + ЗаписанныйОбъект = ОбъектДанных; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если ЗначениеЗаполнено(СообщениеЖурналаРегистрации) Тогда + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Ошибка удаления подписи'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + Объект.Метаданные(), + Объект.Ссылка, + СообщениеЖурналаРегистрации + " + | + |" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + + +// Получает массив сертификатов шифрования. +// Параметры: +// Объект - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы", "ВерсииФайлов" или "Файлы". +// +// Возвращаемое значение: +// Массив - массив структур +// +Функция СертификатыШифрования(Объект) Экспорт + + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.СертификатыШифрования", Ложь, Истина); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодпись.СертификатыШифрования", "Объект", Объект, + Новый ОписаниеТипов(Метаданные.РегистрыСведений.СертификатыШифрования.Измерения.ЗашифрованныйОбъект.Тип,, + "СправочникСсылка.ВерсииФайлов")); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СертификатыШифрования.Представление, + | СертификатыШифрования.Отпечаток, + | СертификатыШифрования.Сертификат, + | СертификатыШифрования.ПорядковыйНомер КАК ПорядковыйНомер + |ИЗ + | РегистрСведений.СертификатыШифрования КАК СертификатыШифрования + |ГДЕ + | СертификатыШифрования.ЗашифрованныйОбъект = &ЗашифрованныйОбъект + | + |УПОРЯДОЧИТЬ ПО + | ПорядковыйНомер"; + + Запрос.УстановитьПараметр("ЗашифрованныйОбъект", Объект); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + МассивСертификатовШифрования = Новый Массив; + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ОтпечатокСтруктура = Новый Структура; + ОтпечатокСтруктура.Вставить("Отпечаток", ВыборкаДетальныеЗаписи.Отпечаток); + ОтпечатокСтруктура.Вставить("Представление", ВыборкаДетальныеЗаписи.Представление); + ОтпечатокСтруктура.Вставить("Сертификат", ВыборкаДетальныеЗаписи.Сертификат.Получить()); + ОтпечатокСтруктура.Вставить("ПорядковыйНомер", ВыборкаДетальныеЗаписи.ПорядковыйНомер); + МассивСертификатовШифрования.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + Возврат МассивСертификатовШифрования; + +КонецФункции + +// Помещает сертификаты шифрования в регистр сведений и записывает объект. +// Устанавливает реквизит Зашифрован по наличию сертификатов в регистре сведений СертификатаШифрования. +// +// Параметры: +// Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. +// Объект должен иметь реквизит Зашифрован. // - Объект - объект будет изменен без блокировки и без записи. // // СертификатыШифрования - Строка - адрес временного хранилища, содержащий описанный ниже массив. @@ -356,6 +471,8 @@ Процедура ЗаписатьСертификатыШифрования(Объект, Знач СертификатыШифрования, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт + ПроверитьПараметрОбъект(Объект, "ЭлектроннаяПодпись.ЗаписатьСертификатыШифрования", Ложь); + Если ТипЗнч(СертификатыШифрования) = Тип("Строка") Тогда СертификатыШифрования = ПолучитьИзВременногоХранилища(СертификатыШифрования); КонецЕсли; @@ -369,18 +486,22 @@ ОбъектДанных = Объект; КонецЕсли; - ОбъектДанных.СертификатыШифрования.Очистить(); - - Для каждого СертификатШифрования Из СертификатыШифрования Цикл - ЗаполнитьЗначенияСвойств(ОбъектДанных.СертификатыШифрования.Добавить(), СертификатШифрования); + УстановитьПривилегированныйРежим(Истина); + НаборЗаписей = РегистрыСведений.СертификатыШифрования.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ЗашифрованныйОбъект.Установить(ОбъектДанных.Ссылка); + ПорядковыйНомер = 1; + Для Каждого СертификатШифрования Из СертификатыШифрования Цикл + НовыйСертификат = НаборЗаписей.Добавить(); + НовыйСертификат.ЗашифрованныйОбъект = ОбъектДанных.Ссылка; + ЗаполнитьЗначенияСвойств(НовыйСертификат, СертификатШифрования); + НовыйСертификат.ПорядковыйНомер = ПорядковыйНомер; + ПорядковыйНомер = ПорядковыйНомер + 1; КонецЦикла; - ОбъектДанных.Зашифрован = ОбъектДанных.СертификатыШифрования.Количество() > 0; + ОбъектДанных.Зашифрован = НаборЗаписей.Количество() > 0; + НаборЗаписей.Записать(); Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда - // Чтобы определить, что это запись с целью шифрования/расшифровки. - ОбъектДанных.ДополнительныеСвойства.Вставить("ЗаписьПриШифрованииРасшифровкеОбъекта", Истина); - ОбъектДанных.Записать(); РазблокироватьДанныеДляРедактирования(Объект.Ссылка, ИдентификаторФормы); ЗаписанныйОбъект = ОбъектДанных; КонецЕсли; @@ -393,65 +514,6 @@ КонецПроцедуры -// Удалят подпись из табличной части объекта и записывает его. -// -// Параметры: -// Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь табличную часть ЭлектронныеПодписи и реквизит ПодписанЭП. -// - Объект - объект будет изменен без блокировки и без записи. -// -// ИдентификаторПодписи - Число - индекс строки табличной части. -// - Массив - значения указанного выше типа. -// -// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, используемый для блокировки, -// если передана ссылка на объект. -// -// ВерсияОбъекта - Строка - версия данных объекта, если передана ссылка на объект. Используемая -// для блокировки объекта перед записью, с учетом того, что подписание -// выполняется на клиенте и за время подписания объект мог быть изменен. -// -// ЗаписанныйОбъект - Объект - объект, который был получен и записан, если передавалась ссылка. -// -Процедура УдалитьПодпись(Объект, ИдентификаторПодписи, ИдентификаторФормы = Неопределено, - ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт - - НачатьТранзакцию(); - Попытка - Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда - ЗаблокироватьДанныеДляРедактирования(Объект, ВерсияОбъекта, ИдентификаторФормы); - ОбъектДанных = Объект.ПолучитьОбъект(); - Иначе - ОбъектДанных = Объект; - КонецЕсли; - - Если ТипЗнч(ИдентификаторПодписи) = Тип("Массив") Тогда - Список = Новый СписокЗначений; - Список.ЗагрузитьЗначения(ИдентификаторПодписи); - Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв); - Для каждого ЭлементСписка Из Список Цикл - УдалитьСтрокуПодписи(ОбъектДанных, ЭлементСписка.Значение); - КонецЦикла; - Иначе - УдалитьСтрокуПодписи(ОбъектДанных, ИдентификаторПодписи); - КонецЕсли; - - ОбъектДанных.ПодписанЭП = ОбъектДанных.ЭлектронныеПодписи.Количество() <> 0; - - Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда - // Чтобы определить, что это запись с целью добавления/удаления подписи. - ОбъектДанных.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - ОбъектДанных.Записать(); - РазблокироватьДанныеДляРедактирования(Объект.Ссылка, ИдентификаторФормы); - ЗаписанныйОбъект = ОбъектДанных; - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры // Возвращает дату, извлеченную из двоичных данных подписи или Неопределено. // @@ -465,7 +527,10 @@ // Функция ДатаПодписания(Подпись, ПривестиКЧасовомуПоясуСеанса = Истина) Экспорт - ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписанияУниверсальная(Подпись); + ЧтениеДанных = Новый ЧтениеДанных(Подпись); + РезультатЧтения = ЧтениеДанных.Прочитать(); + Буфер = РезультатЧтения.ПолучитьБуферДвоичныхДанных(); + ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписанияУниверсальная(Буфер); Если ДатаПодписания = Неопределено Тогда Возврат Неопределено; @@ -479,140 +544,6 @@ КонецФункции -// Позволяет заполнить справочник ПрограммыЭлектроннойПодписиИШифрования, например, при обновлении ИБ. -// Дополняет стандартный список из двух программ: ViPNet и КриптоПро. -// Если программа с указанными именем и типом уже существует, то ее свойства перезаполняются -// указанными. При заполнении не проверяется корректность указанных свойств. -// -// При заполнении можно использовать поставляемые описания программ, -// список которых находится в процедуре ПоставляемыеНастройкиПрограмм -// модуля менеджера справочника ПрограммыЭлектроннойПодписиИШифрования. -// -// Параметры: -// ОписаниеПрограмм - Массив - содержит значения типа Структура со свойствами: -// * ИмяПрограммы - Строка - уникальное имя программы, присвоенное ее разработчиком, -// например, "Signal-COM CPGOST Cryptographic Provider". -// * ТипПрограммы - Число - специальное число, которое описывает тип программы и -// дополняет имя программы, например, 75. -// -// Следующие параметры требуются, если указано Имя и Тип программы, -// описание которой не поставляется, либо требуется обновить отдельные свойства. -// -// * Представление - Строка - наименование программы, которое увидит пользователь, -// например, "Сигнал-КОМ CSP (RFC 4357)". -// * АлгоритмПодписи - Строка - имя алгоритма подписи, который поддерживает -// указанная программа, например, "ECR3410-CP". -// * АлгоритмХеширования - Строка - имя алгоритма хеширования данных, который поддерживает -// указанная программа, например, "RUS-HASH-CP". Используется для подготовки -// данных при формировании подписи с помощью алгоритма подписания. -// * АлгоритмШифрования - Строка - имя алгоритма шифрования, который поддерживает -// указанная программа, например, "GOST28147". -// -// Пример: -// ОписаниеПрограмм = Новый Массив; -// -// // Заполнение дополнительной программы "Сигнал-КОМ CSP (RFC 4357)". -// ОписаниеПрограммы = ЭлектроннаяПодпись.НовоеОписаниеПрограммы(); -// ОписаниеПрограммы.ИмяПрограммы = "Signal-COM CPGOST Cryptographic Provider"; -// ОписаниеПрограммы.ТипПрограммы = 75; -// ОписаниеПрограмм.Добавить(ОписаниеПрограммы); -// -// // Изменение алгоритма поставляемой программы ViPNet CSP. -// ОписаниеПрограммы = ЭлектроннаяПодпись.НовоеОписаниеПрограммы(); -// ОписаниеПрограммы.ИмяПрограммы = "Infotecs Cryptographic Service Provider"; -// ОписаниеПрограммы.ТипПрограммы = 2; -// ОписаниеПрограммы.АлгоритмПодписи = "GOST 34.10-2012 512"; -// ОписаниеПрограмм.Добавить(ОписаниеПрограммы); -// -// ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм(ОписаниеПрограмм); -// -Процедура ЗаполнитьСписокПрограмм(ОписаниеПрограмм) Экспорт - - ПоставляемыеНастройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); - ВыполняетсяОбновлениеИнформационнойБазы = ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы(); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Программы.Ссылка КАК Ссылка, - | Программы.ИмяПрограммы, - | Программы.ТипПрограммы - |ИЗ - | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы"; - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - Выгрузка = Запрос.Выполнить().Выгрузить(); - - Для Каждого ОписаниеПрограммы Из ОписаниеПрограмм Цикл - Отбор = Новый Структура; - Отбор.Вставить("ИмяПрограммы", ОписаниеПрограммы.ИмяПрограммы); - Отбор.Вставить("ТипПрограммы", ОписаниеПрограммы.ТипПрограммы); - - Строки = Выгрузка.НайтиСтроки(Отбор); - Если Строки.Количество() > 0 Тогда - ПрограммаОбъект = Строки[0].Ссылка.ПолучитьОбъект(); - Иначе - ПрограммаОбъект = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент(); - КонецЕсли; - ОбновитьЗначение(ПрограммаОбъект.ПометкаУдаления, Ложь); - - Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); - Для Каждого КлючИЗначение Из ОписаниеПрограммы Цикл - ИмяПоля = ?(КлючИЗначение.Ключ = "Представление", "Наименование", КлючИЗначение.Ключ); - Если КлючИЗначение.Значение <> Неопределено Тогда - ОбновитьЗначение(ПрограммаОбъект[ИмяПоля], КлючИЗначение.Значение, Истина); - ИначеЕсли Строки.Количество() > 0 Тогда - ОбновитьЗначение(ПрограммаОбъект[ИмяПоля], Строки[0][КлючИЗначение.Ключ], Истина); - КонецЕсли; - КонецЦикла; - - Если Не ПрограммаОбъект.Модифицированность() Тогда - Продолжить; - КонецЕсли; - - Если ВыполняетсяОбновлениеИнформационнойБазы Тогда - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрограммаОбъект); - Иначе - ПрограммаОбъект.Записать(); - КонецЕсли; - КонецЦикла; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Для использования в процедуре ЗаполнитьСписокПрограмм (см. выше). -// -// Параметры: -// ИмяПрограммы - Строка - можно указать имя программы сразу при создании описания. -// ТипПрограммы - Строка - можно указать тип программы сразу при создании описания. -// -// Возвращаемое значение: -// Структура со свойствами для использования в процедуре ЗаполнитьСписокПрограмм. -// -Функция НовоеОписаниеПрограммы(ИмяПрограммы = Неопределено, ТипПрограммы = Неопределено) Экспорт - - ОписаниеПрограммы = Новый Структура; - ОписаниеПрограммы.Вставить("ИмяПрограммы", ИмяПрограммы); - ОписаниеПрограммы.Вставить("ТипПрограммы", ТипПрограммы); - ОписаниеПрограммы.Вставить("Представление"); - ОписаниеПрограммы.Вставить("АлгоритмПодписи"); - ОписаниеПрограммы.Вставить("АлгоритмХеширования"); - ОписаниеПрограммы.Вставить("АлгоритмШифрования"); - - Возврат ОписаниеПрограммы; - -КонецФункции - // Выполняет поиск сертификата в справочнике, возвращает ссылку, если сертификат найден. // // Параметры: @@ -761,6 +692,471 @@ КонецФункции +// Возвращает табличный документ, содержащий штамп визуализации электронной подписи. +// +// Параметры: +// Сертификат - СертификатКриптографии - сертификат, которым подписан документ. +// ДатаПодписи - Дата - дата подписания документа. +// ТекстОтметки - Строка - текст, выводящийся непосредственно под штампом и описывающий +// расположение подлинника документа. +// ЛоготипОрганизации - Картинка - если не указан, то будет использована стандартная картинка. +// +// Возвращаемое значение: +// ТабличныйДокумент - табличный документ, содержащий готовый штамп электронной подписи. +// +Функция ШтампВизуализацииЭлектроннойПодписи(Сертификат, ДатаПодписи = Неопределено, ТекстОтметки = "", ЛоготипОрганизации = Неопределено) Экспорт + + СертификатКриптографии = Сертификат; + + СвойстваСубъекта = ЭлектроннаяПодписьКлиентСервер.СвойстваСубъектаСертификата(СертификатКриптографии); + СвойстваСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии); + + ПериодДействия = НСтр("ru = 'с %1 по %2'"); + ПериодДействия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПериодДействия, Формат(СертификатКриптографии.ДатаНачала, "ДЛФ=D"), Формат(СертификатКриптографии.ДатаОкончания, "ДЛФ=D")); + + Штамп = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолучитьМакет("Штамп"); + + Штамп.Параметры.ДатаПодписи = ДатаПодписи; + Штамп.Параметры.НомерСертификата = СертификатКриптографии.СерийныйНомер; + Штамп.Параметры.ВыдалСертификат = СвойстваСертификата.КемВыдан; + Штамп.Параметры.ВладелецСертификата = СвойстваСертификата.КомуВыдан; + Штамп.Параметры.СрокДействия = ПериодДействия; + Штамп.Параметры.ТекстОтметки = ТекстОтметки; + + Если ЛоготипОрганизации <> Неопределено Тогда + Штамп.Области.Картинка.Картинка = ЛоготипОрганизации; + КонецЕсли; + + Возврат Штамп; + +КонецФункции + +// Размещает штампы в переданном табличном документе. +// +// Параметры: +// Документ - ТабличныйДокумент - табличный документ, в который требуется добавить штампы. +// ОписаниеШтампов - Массив - массив табличных документов, содержащих штампы, полученные +// функцией ЭлектроннаяПодпись.ШтампВизуализацииЭлектроннойПодписи. +// В данном случае переданные штампы будут выведены в конец документа, +// если в макете подписываемого табличного документа не определены области +// для размещения штампов которые удовлетворяют следующим условиям: +// - область вывода штампа размером две колонки и семь строк, с +// произвольной шириной колонок. +// - имя области задано как ШтампЭП + порядковый номер штампа, +// например, ШтампЭП1 и .т.д. +// В таком случае штампы будут выведены в заданные области в том +// порядке, в котором документ был подписан. +// - Соответствие - описывает места вывода штампов, где: +// * Ключ - Строка - имя области, куда выводить штамп. Для такой области должна +// быть установлена произвольная ширина колонок, +// отличная от ширины колонок остального документа. +// * Значение - ТабличныйДокумент - штамп, полученный функцией +// ЭлектроннаяПодпись.ШтампВизуализацииЭлектроннойПодписи. +// Размеры - Структура - необязательный параметр, позволяет изменять размеры штампа, со свойствами: +// * ЛеваяКолонка - Число - ширина левой колонки штампа, содержащей заголовки свойств. +// По умолчанию - 10. +// * ПраваяКолонка - Число - ширина правой колонки штампа, содержащей значения свойств. +// По умолчанию - 30. +// +Процедура ДобавитьШтампыВТабличныйДокумент(Документ, ОписаниеШтампов, Размеры = Неопределено) Экспорт + + Если Размеры = Неопределено Тогда + Размеры = Новый Структура; + Размеры.Вставить("ЛеваяКолонка", 10); + Размеры.Вставить("ПраваяКолонка", 30); + КонецЕсли; + + Если ТипЗнч(ОписаниеШтампов) = Тип("Массив") Тогда + ИндексШтампа = 1; + Для Каждого Штамп Из ОписаниеШтампов Цикл + ИмяОбласти = "ШтампЭП" + Строка(ИндексШтампа); + ОбластьНайдена = Документ.Области.Найти(ИмяОбласти) <> Неопределено; + + Если ОбластьНайдена Тогда + Документ.ВставитьОбласть(Штамп.Области.Штамп, Документ.Области[ИмяОбласти],, Истина); + Документ.Области.ШтампЛеваяКолонка.ШиринаКолонки = Размеры.ЛеваяКолонка; + Документ.Области.ШтампПраваяКолонка.ШиринаКолонки = Размеры.ПраваяКолонка; + Иначе + Документ.Вывести(Штамп.ПолучитьОбласть("Отступ")); + Документ.Вывести(Штамп.ПолучитьОбласть("ОбластьСтрокШтамп")); + Документ.Области.ОбластьСтрокШтамп.ШиринаКолонки = 10; + + Документ.Области.ШтампЛеваяКолонка.ШиринаКолонки = Размеры.ЛеваяКолонка; + Документ.Области.ШтампПраваяКолонка.ШиринаКолонки = Размеры.ПраваяКолонка; + Документ.Области.ОтступШтампа.ШиринаКолонки = 3; + КонецЕсли; + + ИндексШтампа = ИндексШтампа + 1; + КонецЦикла; + Иначе + Для Каждого ОписаниеШтампа Из ОписаниеШтампов Цикл + ИмяОбласти = ОписаниеШтампа.Ключ; + Штамп = ОписаниеШтампа.Значение; + ОбластьНайдена = Документ.Области.Найти(ИмяОбласти) <> Неопределено; + Если ОбластьНайдена Тогда + Документ.ВставитьОбласть(Штамп.Области.Штамп, Документ.Области[ИмяОбласти],, Истина); + Документ.Области.ШтампЛеваяКолонка.ШиринаКолонки = Размеры.ЛеваяКолонка; + Документ.Области.ШтампПраваяКолонка.ШиринаКолонки = Размеры.ПраваяКолонка; + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С:Библиотека электронных документов. + +// Возвращает менеджер криптографии (на сервере) для указанной программы. +// +// Параметры: +// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют +// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, +// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов. +// +// ПоказатьОшибку - Булево - если Истина, тогда будет вызвано исключение, содержащее описание ошибки. +// +// ОписаниеОшибки - Строка - возвращаемое описание ошибки, когда функция возвратила значение Неопределено. +// +// Программа - Неопределено - возвращает менеджер криптографии первой +// программы из справочника для которой удалось его создать. +// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа +// для которой нужно создать и вернуть менеджер криптографии. +// +// Возвращаемое значение: +// МенеджерКриптографии - менеджер криптографии. +// Неопределено - произошла ошибка, описание которой в параметре ОписаниеОшибки. +// +Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт + + Ошибка = ""; + Результат = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(Операция, ПоказатьОшибку, Ошибка, Программа); + + Если Результат = Неопределено Тогда + ОписаниеОшибки = Ошибка; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет действительность подписи и сертификата. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// МенеджерКриптографии - Неопределено - получить менеджер криптографии для проверки +// электронных подписей, как настроил администратор. +// - МенеджерКриптографии - использовать указанный менеджер криптографии. +// +// ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны. +// - Строка - адрес временного хранилища, содержащего двоичные данные. +// - Строка - полное имя файла, содержащего двоичные данные, +// которые были подписаны. +// - Структура - со свойствами: +// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего +// модуля ЭлектроннаяПодписьКлиентСервер. +// * КонвертSOAP - Строка - шаблон сообщения . +// +// Подпись - ДвоичныеДанные - двоичные данные электронной подписи. +// - Строка - адрес временного хранилища, содержащего двоичные данные. +// - Строка - полное имя файла, содержащего двоичные данные +// электронной подписи. +// - Неопределено - если ИсходныеДанные конверт SOAP. +// +// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки. +// - Строка - содержит описание ошибки, если произошла ошибка. +// +// НаДату - Дата - проверить сертификат на указанную дату, +// если дату не удалось извлечь из подписи. +// Если параметр не заполнен, тогда проверять на текущую дату сеанса, +// если дату не удалось извлечь из подписи. +// +// Возвращаемое значение: +// Булево - Истина, если проверка выполнена успешно. +// - Ложь, если не удалось получить менеджер криптографии (когда не указан), +// или произошла ошибка указанная в параметре ОписаниеОшибки. +// +Функция ПроверитьПодпись(МенеджерКриптографии, ИсходныеДанные, Подпись, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт + + МенеджерКриптографииДляПроверки = МенеджерКриптографии; + Если МенеджерКриптографииДляПроверки = Неопределено Тогда + МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаПодписи", ОписаниеОшибки = Null, ОписаниеОшибки); + Если МенеджерКриптографииДляПроверки = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + ИсходныеДанныеДляПроверки = ИсходныеДанные; + Если ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные) Тогда + ИсходныеДанныеДляПроверки = ПолучитьИзВременногоХранилища(ИсходныеДанные); + КонецЕсли; + + ПодписьДляПроверки = Подпись; + Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда + ПодписьДляПроверки = ПолучитьИзВременногоХранилища(Подпись); + КонецЕсли; + + Если ТипЗнч(ИсходныеДанныеДляПроверки) = Тип("Структура") + И ИсходныеДанныеДляПроверки.Свойство("ПараметрыXMLDSig") Тогда + + Попытка + Результат = ЭлектроннаяПодписьСлужебный.ПроверитьПодпись( + ИсходныеДанныеДляПроверки.КонвертSOAP, + ИсходныеДанныеДляПроверки.ПараметрыXMLDSig, + МенеджерКриптографииДляПроверки); + Исключение + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Ложь; + КонецПопытки; + + Сертификат = Результат.Сертификат; + ДатаПодписания = Результат.ДатаПодписания; + + Иначе + + Сертификат = Неопределено; + Попытка + МенеджерКриптографииДляПроверки.ПроверитьПодпись(ИсходныеДанныеДляПроверки, ПодписьДляПроверки, Сертификат); + Исключение + Если ОписаниеОшибки = Null Тогда + ВызватьИсключение; + КонецЕсли; + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Ложь; + КонецПопытки; + + ДатаПодписания = ДатаПодписания(ПодписьДляПроверки); + Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда + ДатаПодписания = НаДату; + КонецЕсли; + + КонецЕсли; + + Возврат ПроверитьСертификат(МенеджерКриптографииДляПроверки, Сертификат, ОписаниеОшибки, ДатаПодписания); + +КонецФункции + +// Проверяет действительность сертификата криптографии. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически. +// - МенеджерКриптографии - использовать указанный менеджер криптографии. +// +// Сертификат - СертификатКриптографии - сертификат. +// - ДвоичныеДанные - двоичные данные сертификата. +// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. +// +// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки. +// - Строка - содержит описание ошибки, если произошла ошибка. +// +// НаДату - Дата - проверить сертификат на указанную дату. +// Если параметр не указан или указана пустая дата, +// тогда проверять на текущую дату сеанса. +// +// Возвращаемое значение: +// Булево - Истина, если проверка выполнена успешно, +// - Ложь, если не удалось получить менеджер криптографии (когда не указан). +// +Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт + + МенеджерКриптографииДляПроверки = МенеджерКриптографии; + + Если МенеджерКриптографииДляПроверки = Неопределено Тогда + МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаСертификата", ОписаниеОшибки = Null, ОписаниеОшибки); + Если МенеджерКриптографииДляПроверки = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + СертификатДляПроверки = Сертификат; + + Если ТипЗнч(Сертификат) = Тип("Строка") Тогда + СертификатДляПроверки = ПолучитьИзВременногоХранилища(Сертификат); + КонецЕсли; + + Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда + СертификатДляПроверки = Новый СертификатКриптографии(СертификатДляПроверки); + КонецЕсли; + + РежимыПроверкиСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата( + ЗначениеЗаполнено(НаДату)); + + Попытка + МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата); + Исключение + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Ложь; + КонецПопытки; + + ОшибкаПросрочки = ЭлектроннаяПодписьСлужебныйКлиентСервер.СертификатПросрочен(СертификатДляПроверки, НаДату); + Если ЗначениеЗаполнено(ОшибкаПросрочки) Тогда + ОписаниеОшибки = ОшибкаПросрочки; + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Находит сертификат на компьютере по строке отпечатка. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// Отпечаток - Строка - Base64 кодированный отпечаток сертификата. +// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. +// +// Возвращаемое значение: +// СертификатКриптографии - сертификат электронной подписи и шифрования. +// Неопределено - сертификат не найден в хранилище. +// +Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище) Экспорт + + Возврат ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + +КонецФункции + +// Позволяет заполнить справочник ПрограммыЭлектроннойПодписиИШифрования, например, при обновлении ИБ. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Дополняет стандартный список из двух программ: ViPNet и КриптоПро. +// Если программа с указанными именем и типом уже существует, то ее свойства перезаполняются +// указанными. При заполнении не проверяется корректность указанных свойств. +// +// При заполнении можно использовать поставляемые описания программ, +// список которых находится в процедуре ПоставляемыеНастройкиПрограмм +// модуля менеджера справочника ПрограммыЭлектроннойПодписиИШифрования. +// +// Параметры: +// ОписаниеПрограмм - Массив - содержит значения типа Структура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы. +// Свойства структуры: +// * ИмяПрограммы - Строка - уникальное имя программы, присвоенное ее разработчиком, +// например, "Signal-COM CPGOST Cryptographic Provider". +// * ТипПрограммы - Число - специальное число, которое описывает тип программы и +// дополняет имя программы, например, 75. +// +// Следующие параметры требуются, если указано Имя и Тип программы, +// описание которой не поставляется, либо требуется обновить отдельные свойства. +// +// * Представление - Строка - наименование программы, которое увидит пользователь, +// например, "Сигнал-КОМ CSP (RFC 4357)". +// * АлгоритмПодписи - Строка - имя алгоритма подписи, который поддерживает +// указанная программа, например, "ECR3410-CP". +// * АлгоритмХеширования - Строка - имя алгоритма хеширования данных, который поддерживает +// указанная программа, например, "RUS-HASH-CP". Используется для подготовки +// данных при формировании подписи с помощью алгоритма подписания. +// * АлгоритмШифрования - Строка - имя алгоритма шифрования, который поддерживает +// указанная программа, например, "GOST28147". +// +// Пример: +// ОписаниеПрограмм = Новый Массив; +// +// // Заполнение дополнительной программы "Сигнал-КОМ CSP (RFC 4357)". +// ОписаниеПрограммы = ЭлектроннаяПодпись.НовоеОписаниеПрограммы(); +// ОписаниеПрограммы.ИмяПрограммы = "Signal-COM CPGOST Cryptographic Provider"; +// ОписаниеПрограммы.ТипПрограммы = 75; +// ОписаниеПрограмм.Добавить(ОписаниеПрограммы); +// +// // Изменение алгоритма поставляемой программы ViPNet CSP. +// ОписаниеПрограммы = ЭлектроннаяПодпись.НовоеОписаниеПрограммы(); +// ОписаниеПрограммы.ИмяПрограммы = "Infotecs Cryptographic Service Provider"; +// ОписаниеПрограммы.ТипПрограммы = 2; +// ОписаниеПрограммы.АлгоритмПодписи = "GOST 34.10-2012 512"; +// ОписаниеПрограмм.Добавить(ОписаниеПрограммы); +// +// ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм(ОписаниеПрограмм); +// +Процедура ЗаполнитьСписокПрограмм(ОписаниеПрограмм) Экспорт + + ПоставляемыеНастройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); + ВыполняетсяОбновлениеИнформационнойБазы = ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Программы.Ссылка КАК Ссылка, + | Программы.ИмяПрограммы, + | Программы.ТипПрограммы + |ИЗ + | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы"; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Выгрузка = Запрос.Выполнить().Выгрузить(); + + Для Каждого ОписаниеПрограммы Из ОписаниеПрограмм Цикл + Отбор = Новый Структура; + Отбор.Вставить("ИмяПрограммы", ОписаниеПрограммы.ИмяПрограммы); + Отбор.Вставить("ТипПрограммы", ОписаниеПрограммы.ТипПрограммы); + + Строки = Выгрузка.НайтиСтроки(Отбор); + Если Строки.Количество() > 0 Тогда + ПрограммаОбъект = Строки[0].Ссылка.ПолучитьОбъект(); + Иначе + ПрограммаОбъект = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент(); + КонецЕсли; + ОбновитьЗначение(ПрограммаОбъект.ПометкаУдаления, Ложь); + + Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); + Для Каждого КлючИЗначение Из ОписаниеПрограммы Цикл + ИмяПоля = ?(КлючИЗначение.Ключ = "Представление", "Наименование", КлючИЗначение.Ключ); + Если КлючИЗначение.Значение <> Неопределено Тогда + ОбновитьЗначение(ПрограммаОбъект[ИмяПоля], КлючИЗначение.Значение, Истина); + ИначеЕсли Строки.Количество() > 0 Тогда + ОбновитьЗначение(ПрограммаОбъект[ИмяПоля], Строки[0][КлючИЗначение.Ключ], Истина); + КонецЕсли; + КонецЦикла; + + Если Не ПрограммаОбъект.Модифицированность() Тогда + Продолжить; + КонецЕсли; + + Если ВыполняетсяОбновлениеИнформационнойБазы Тогда + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрограммаОбъект); + Иначе + ПрограммаОбъект.Записать(); + КонецЕсли; + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Для использования в процедуре ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// ИмяПрограммы - Строка - имя программы электронной подписи и шифрования. +// ТипПрограммы - Строка - тип программы. +// +// Возвращаемое значение: +// Структура - для передачи в процедуру ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм +// (см. в ней описание свойств). +// +Функция НовоеОписаниеПрограммы(ИмяПрограммы = Неопределено, ТипПрограммы = Неопределено) Экспорт + + ОписаниеПрограммы = Новый Структура; + ОписаниеПрограммы.Вставить("ИмяПрограммы", ИмяПрограммы); + ОписаниеПрограммы.Вставить("ТипПрограммы", ТипПрограммы); + ОписаниеПрограммы.Вставить("Представление"); + ОписаниеПрограммы.Вставить("АлгоритмПодписи"); + ОписаниеПрограммы.Вставить("АлгоритмХеширования"); + ОписаниеПрограммы.Вставить("АлгоритмШифрования"); + + Возврат ОписаниеПрограммы; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -860,6 +1256,7 @@ ПерсональныеНастройки.Вставить("ПутиКПрограммамЭлектроннойПодписиИШифрования", Новый Соответствие); ПерсональныеНастройки.Вставить("РасширениеДляФайловПодписи", "p7s"); ПерсональныеНастройки.Вставить("РасширениеДляЗашифрованныхФайлов", "p7m"); + ПерсональныеНастройки.Вставить("СохранятьСертификатВместеСПодписью", Ложь); КлючПодсистемы = ЭлектроннаяПодписьСлужебный.КлючХраненияНастроек(); @@ -882,14 +1279,41 @@ // Вспомогательные процедуры и функции. // Для процедуры ДобавитьПодпись. -Процедура ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи) +Процедура ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи, СообщениеЖурналаРегистрации) - НоваяЗапись = ОбъектДанных.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяЗапись, СвойстваПодписи,, "Подпись, Сертификат"); + УстановитьПривилегированныйРежим(Истина); + НоваяЗапись = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); + + ЗаполнитьЗначенияСвойств(НоваяЗапись, СвойстваПодписи, , "Подпись, Сертификат"); + + НоваяЗапись.ПодписанныйОбъект = ОбъектДанных.Ссылка; НоваяЗапись.Подпись = Новый ХранилищеЗначения(СвойстваПодписи.Подпись); НоваяЗапись.Сертификат = Новый ХранилищеЗначения(СвойстваПодписи.Сертификат); + ПорядковыйНомер = 1; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(ЭлектронныеПодписи.ПодписанныйОбъект) КАК ПоследнийПорядковыйНомер + |ИЗ + | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи + |ГДЕ + | ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект"; + + Запрос.УстановитьПараметр("ПодписанныйОбъект", ОбъектДанных.Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ПорядковыйНомер = ВыборкаДетальныеЗаписи.ПоследнийПорядковыйНомер + 1; + КонецЦикла; + + НоваяЗапись.ПорядковыйНомер = ПорядковыйНомер; + Если Не ЗначениеЗаполнено(НоваяЗапись.УстановившийПодпись) Тогда НоваяЗапись.УстановившийПодпись = Пользователи.АвторизованныйПользователь(); КонецЕсли; @@ -903,24 +1327,132 @@ НоваяЗапись.ДатаПодписи = ТекущаяДатаСеанса(); КонецЕсли; + СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( + НоваяЗапись.ДатаПодписи, СвойстваПодписи); + + НоваяЗапись.Записать(); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Добавление подписи'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + ОбъектДанных.Метаданные(), + ОбъектДанных.Ссылка, + СообщениеЖурналаРегистрации, + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + КонецПроцедуры // Для процедуры УдалитьПодпись. -Процедура УдалитьСтрокуПодписи(ПодписанныйОбъект, ИндексСтроки) +Процедура УдалитьСтрокуПодписи(ПодписанныйОбъект, ПорядковыйНомер, СообщениеЖурналаРегистрации) - Если ПодписанныйОбъект.ЭлектронныеПодписи.Количество() < ИндексСтроки + 1 Тогда + ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЭлектронныеПодписи.ПорядковыйНомер КАК ПорядковыйНомер, + | ЭлектронныеПодписи.ПодписанныйОбъект КАК ПодписанныйОбъект + |ИЗ + | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи + |ГДЕ + | ЭлектронныеПодписи.ПорядковыйНомер = &ПорядковыйНомер + | И ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект"; + + Запрос.УстановитьПараметр("ПорядковыйНомер", ПорядковыйНомер); + Запрос.УстановитьПараметр("ПодписанныйОбъект", ПодписанныйОбъект.Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Если ВыборкаДетальныеЗаписи.Количество() = 0 Тогда ВызватьИсключение НСтр("ru = 'Строка с подписью не найдена.'"); КонецЕсли; - СтрокаТабличнойЧасти = ПодписанныйОбъект.ЭлектронныеПодписи.Получить(ИндексСтроки); - - Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда - Если СтрокаТабличнойЧасти.УстановившийПодпись <> Пользователи.ТекущийПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав на удаление подписи.'"); - КонецЕсли; + МенеджерЗаписи = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи); + КонецЦикла; + МенеджерЗаписи.Прочитать(); + + ЕстьПрава = ЭтоПолноправныйПользователь + Или МенеджерЗаписи.УстановившийПодпись = Пользователи.АвторизованныйПользователь(); + + СвойстваПодписи = Новый Структура; + СвойстваПодписи.Вставить("Сертификат", МенеджерЗаписи.Сертификат.Получить()); + СвойстваПодписи.Вставить("КомуВыданСертификат", МенеджерЗаписи.КомуВыданСертификат); + + СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( + МенеджерЗаписи.ДатаПодписи, СвойстваПодписи); + + Если ЕстьПрава Тогда + МенеджерЗаписи.Удалить(); + Иначе + ВызватьИсключение НСтр("ru = 'Недостаточно прав на удаление подписи.'"); КонецЕсли; - ПодписанныйОбъект.ЭлектронныеПодписи.Удалить(СтрокаТабличнойЧасти); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Удаление подписи'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, + ПодписанныйОбъект.Метаданные(), + ПодписанныйОбъект.Ссылка, + СообщениеЖурналаРегистрации, + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + +КонецПроцедуры + +// Для процедуры УдалитьПодпись. +Процедура ОбновитьНумерациюПодписей(ПодписанныйОбъект) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЭлектронныеПодписи.ПодписанныйОбъект, + | ЭлектронныеПодписи.ПорядковыйНомер КАК ПорядковыйНомер, + | ЭлектронныеПодписи.ДатаПодписи, + | ЭлектронныеПодписи.ДатаПроверкиПодписи, + | ЭлектронныеПодписи.ИмяФайлаПодписи, + | ЭлектронныеПодписи.Комментарий, + | ЭлектронныеПодписи.КомуВыданСертификат, + | ЭлектронныеПодписи.Отпечаток, + | ЭлектронныеПодписи.Подпись, + | ЭлектронныеПодписи.ПодписьВерна, + | ЭлектронныеПодписи.Сертификат, + | ЭлектронныеПодписи.УстановившийПодпись + |ИЗ + | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи + |ГДЕ + | ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект + | + |УПОРЯДОЧИТЬ ПО + | ПорядковыйНомер"; + + Запрос.УстановитьПараметр("ПодписанныйОбъект", ПодписанныйОбъект.Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + ПодписанныйОбъект.ПодписанЭП = Ложь; + + НаборЗаписей = РегистрыСведений.ЭлектронныеПодписи.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ПодписанныйОбъект.Установить(ПодписанныйОбъект.Ссылка); + НаборЗаписей.Прочитать(); + + ПорядковыйНомер = 1; + Для Каждого ЭлектроннаяПодписьОбъекта Из НаборЗаписей Цикл + ЭлектроннаяПодписьОбъекта.ПорядковыйНомер = ПорядковыйНомер; + ПорядковыйНомер = ПорядковыйНомер + 1; + ПодписанныйОбъект.ПодписанЭП = Истина; + КонецЦикла; + + НаборЗаписей.Записать(Истина); + + УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры @@ -937,4 +1469,11 @@ КонецПроцедуры +Процедура ПроверитьПараметрОбъект(Объект, ИмяПроцедуры, РегистрПодписей = Истина, ТолькоСсылки = Ложь) + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Объект", Объект, + ЭлектроннаяПодписьСлужебныйПовтИсп.ТипыВладельцев(РегистрПодписей, ТолькоСсылки)); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl index 169e793c4..e3c0b1984 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl @@ -1,11 +1,10 @@ - //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает текущую настройку использования электронных подписей. +// +// Возвращаемое значение: +// Булево - если Истина, электронные подписи используются. +// Функция ИспользоватьЭлектронныеПодписи() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ИспользоватьЭлектронныеПодписи; @@ -13,6 +12,10 @@ КонецФункции // Возвращает текущую настройку использования шифрования. +// +// Возвращаемое значение: +// Булево - если Истина, шифрование используется. +// Функция ИспользоватьШифрование() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ИспользоватьШифрование; @@ -20,6 +23,10 @@ КонецФункции // Возвращает текущую настройку проверки электронных подписей на сервере. +// +// Возвращаемое значение: +// Булево - если Истина, электронные подписи будут проверяться на сервере. +// Функция ПроверятьЭлектронныеПодписиНаСервере() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере; @@ -29,49 +36,15 @@ // Возвращает текущую настройку создания электронных подписей на сервере. // Настройка также предполагает шифрование и расшифровку на сервере. // +// Возвращаемое значение: +// Булево - если Истина, электронные подписи будут создаваться на сервере. +// Функция СоздаватьЭлектронныеПодписиНаСервере() Экспорт Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере; КонецФункции - -// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов. -// МенеджерКриптографии - инициализированный менеджер криптографии. -// Строка - описание ошибки при создании менеджера криптографии. -// -// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют -// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, -// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов. -// -// ПоказатьОшибку - Булево - если Истина, тогда будет открыта форма ОшибкаОбращенияКПрограмме -// из которой можно перейти к списку установленных программ -// в форму персональных настроек на страницу "Установленные программы", -// в которой можно увидеть почему программу не удалось задействовать, -// а также открыть инструкцию по установке. -// -// Программа - Неопределено - возвращает менеджер криптографии первой -// программы из справочника для которой удалось его создать. -// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа -// для которой нужно создать и вернуть менеджер криптографии. -// -Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт - - Если ТипЗнч(Операция) <> Тип("Строка") Тогда - Операция = ""; - КонецЕсли; - - Если ПоказатьОшибку <> Истина Тогда - ПоказатьОшибку = Ложь; - КонецЕсли; - - ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку, Программа); - -КонецПроцедуры - // Подписывает данные, возвращает подпись и добавляет подпись в объект, если указано. // // Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных. @@ -93,6 +66,9 @@ // СертификатыЭлектроннойПодписиИШифрования, которые могут быть выбраны // пользователем. Отбор блокирует возможность выбора других сертификатов // из личного хранилища. +// - Структура - со свойством: +// Организация - ОпределяемыйТип.Организация - содержит ссылку на организацию, по которой +// будет установлен отбор в списке сертификатов пользователя. // * БезПодтверждения - Булево - (необязательный) - пропустить подтверждение пользователя, если // в свойстве ОтборСертификатов только один сертификат и: // а) либо сертификат выпущен с усиленной защитой закрытого ключа, @@ -138,11 +114,10 @@ // * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего // модуля ЭлектроннаяПодписьКлиентСервер. // * КонвертSOAP - Строка - шаблон сообщения . -// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью. -// ЭлектронныеПодписи, в которую нужно добавить подпись. +// * Объект - Ссылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // Если не указан, то подпись не требуется добавлять. // * -- // -- - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в -// табличную часть ЭлектронныеПодписи. Следует учесть общий подход (см. выше). +// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). // В момент вызова в ОписаниеДанных уже вставлен параметр СвойстваПодписи. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр СвойстваПодписи. @@ -257,10 +232,9 @@ // * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл. // * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме // добавления подписей. Если не указан, значит Ложь. -// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью. -// ЭлектронныеПодписи, в которую нужно добавить подпись. +// * Объект - Ссылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // * -- // -- - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в -// табличную часть ЭлектронныеПодписи. Следует учесть общий подход (см. выше). +// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). // В момент вызова в ОписаниеДанных уже вставлен параметр Подписи. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением подписи. @@ -373,8 +347,7 @@ // добавления подписей. Если не указан, значит Ложь. // * Представление - Ссылка, Строка - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. -// * Объект - Ссылка - ссылка на объект с табличной частью ЭлектронныеПодписи, -// из которой нужно получить список подписей. +// * Объект - Ссылка - ссылка на объект, из которого нужно получить список подписей. // * -- // -- - Строка - адрес временного хранилища массива подписей с составом свойств, // как возвращает процедура ДобавитьПодписьИзФайла. // * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени @@ -464,8 +437,7 @@ // - Массив - (необязательный) содержит значения // типа СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования или // типа ДвоичныеДанные (выгрузка сертификата). -// - Ссылка - (необязательный) - ссылка на объект с табличной -// частью СертификатыШифрования из которой их нужно получить. +// - Ссылка - (необязательный) - ссылка на объект, для которого необходимо получить сертификаты. // * ИзменятьНабор - Булево - если Истина и НаборСертификатов задан и содержит только ссылки // на сертификаты, тогда будет возможность изменить состав сертификатов. // * БезПодтверждения - Булево - (необязательный) - пропустить подтверждение пользователя, @@ -498,8 +470,7 @@ // В момент вызова в ОписаниеДанных уже вставлен параметр ЗашифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр ЗашифрованныеДанные. -// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью. -// СертификатыШифрования, в которую нужно их добавить после шифрования. +// * Объект - Ссылка - (необязательный) - ссылка на объект, который необходимо зашифровать. // Если не указан, то сертификаты шифрования не требуется добавлять. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением сертификатов шифрования. @@ -648,9 +619,9 @@ // В момент вызова в ОписаниеДанных уже вставлен параметр РасшифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр РасшифрованныеДанные. -// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью. -// СертификатыШифрования, из которой нужно получить сертификаты, -// а также очистить после успешного завершения расшифровки. +// * Объект - Ссылка - (необязательный) - ссылка на объект, который необходимо расшифровать, +// а также очистить записи из регистра сведений СертификатыШифрования +// после успешного завершения расшифровки. // Если не указан, то сертификаты не требуется получать из объекта и очищать. // * -- // -- - Строка - адрес временного хранилища, содержащего массив сертификатов // шифрования в виде структур со свойствами: @@ -759,7 +730,6 @@ КонецПроцедуры - // Проверяет действительность сертификата криптографии. // // Параметры: @@ -837,61 +807,22 @@ КонецПроцедуры -// Находит сертификат на компьютере по строке отпечатка. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// СертификатКриптографии - найденный сертификат. -// Неопределено - сертификат не найден в хранилище. -// Строка - текст ошибки создания менеджера криптографии (или другая ошибка). -// -// Отпечаток - Строка - Base64 кодированный отпечаток сертификата. -// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. -// ПоказатьОшибку - Булево - если Ложь, тогда ошибка, текст который будет возвращен, не будет показана. -// -Процедура ПолучитьСертификатПоОтпечатку(Оповещение, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку = Истина) Экспорт - - Если ТипЗнч(ПоказатьОшибку) <> Тип("Булево") Тогда - ПоказатьОшибку = Истина; - КонецЕсли; - - ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Оповещение, - Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку); - -КонецПроцедуры - -// Получает отпечатки сертификатов пользователя ОС на компьютере. -// -// Параметры: -// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение: -// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина; -// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка). -// -// ТолькоЛичные - Булево - Если Ложь, то к личным сертификатам добавляются сертификаты получателей. -// -// ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии. -// -Процедура ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку = Истина) Экспорт - - ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку); - -КонецПроцедуры - // Показывает диалог установки расширения для работы с электронной подписью и шифрованием. +// Только для работы через средства платформы (МенеджерКриптографии). // // Параметры: -// БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет. -// Требуется, если пользователь нажал на кнопку Установить расширение. +// БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет. +// Требуется, если пользователь нажал на кнопку Установить расширение. // -// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора. -// ТекстВопроса - Строка - Текст вопроса. -// ЗаголовокВопроса - Строка - Заголовок вопроса. +// ОбработчикРезультата - ОписаниеОповещения - описание процедуры, принимающей результат выбора в +// первый параметр (РасширениеУстановлено) в виде одного из значений: +// Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено. +// Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить. +// Неопределено - Пользователь отказался от установки. +// +// ТекстВопроса - Строка - Текст вопроса. +// ЗаголовокВопроса - Строка - Заголовок вопроса. // -// Значение первого параметра, возвращаемого в обработчик вызывающего кода: -// РасширениеУстановлено -// * Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено. -// * Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить. -// * Неопределено - Пользователь отказался от установки. // Процедура УстановитьРасширение(БезВопроса, ОбработчикРезультата = Неопределено, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт @@ -934,6 +865,14 @@ КонецПроцедуры +// Открывает ссылку на раздел ИТС "Инструкции по работе с программами электронной подписи и шифрования". +// +Процедура ОткрытьИнструкциюПоРаботеСПрограммами() Экспорт + + ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьИнструкциюПоРаботеСПрограммами(); + +КонецПроцедуры + // Открывает инструкцию с описанием типичных проблем при работе с программами // электронной подписи и вариантами их решения. // @@ -943,7 +882,192 @@ КонецПроцедуры +// Возвращает дату, извлеченную из двоичных данных подписи или Неопределено. +// +// Параметры: +// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение: +// Дата - успешно извлеченная дата подписи. +// Неопределено - не удалось извлечь дату из данных подписи. +// Подпись - ДвоичныеДанные - данные подписи из которых нужно извлечь дату. +// ПривестиКЧасовомуПоясуСеанса - Булево - привести универсальное время к времени сеанса. +// +Процедура ДатаПодписания(Оповещение, Подпись, ПривестиКЧасовомуПоясуСеанса = Истина) Экспорт + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Оповещение", Оповещение); + ПараметрыОповещения.Вставить("ПривестиКЧасовомуПоясуСеанса", ПривестиКЧасовомуПоясуСеанса); + + ЧтениеДанных = Новый ЧтениеДанных(Подпись); + ЧтениеДанных.НачатьЧтениеВБуферДвоичныхДанных(Новый ОписаниеОповещения( + "ДатаПодписанияПослеЧтенияВБуферДвоичныхДанных", + ЭлектроннаяПодписьСлужебныйКлиент, + ПараметрыОповещения)); + +КонецПроцедуры + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С:Библиотека электронных документов. + +// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов. +// МенеджерКриптографии - инициализированный менеджер криптографии. +// Строка - описание ошибки при создании менеджера криптографии. +// +// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют +// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, +// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов. +// +// ПоказатьОшибку - Булево - если Истина, тогда будет открыта форма ОшибкаОбращенияКПрограмме +// из которой можно перейти к списку установленных программ +// в форму персональных настроек на страницу "Установленные программы", +// в которой можно увидеть почему программу не удалось задействовать, +// а также открыть инструкцию по установке. +// +// Программа - Неопределено - возвращает менеджер криптографии первой +// программы из справочника для которой удалось его создать. +// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа +// для которой нужно создать и вернуть менеджер криптографии. +// +Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт + + Если ТипЗнч(Операция) <> Тип("Строка") Тогда + Операция = ""; + КонецЕсли; + + Если ПоказатьОшибку <> Истина Тогда + ПоказатьОшибку = Ложь; + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Оповещение, + Операция, ПоказатьОшибку, Программа); + +КонецПроцедуры + +// Находит сертификат на компьютере по строке отпечатка. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: +// СертификатКриптографии - найденный сертификат. +// Неопределено - сертификат не найден в хранилище. +// Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// +// Отпечаток - Строка - Base64 кодированный отпечаток сертификата. +// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. +// ПоказатьОшибку - Булево - если Ложь, тогда ошибка, текст который будет возвращен, не будет показана. +// +Процедура ПолучитьСертификатПоОтпечатку(Оповещение, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку = Истина) Экспорт + + Если ТипЗнч(ПоказатьОшибку) <> Тип("Булево") Тогда + ПоказатьОшибку = Истина; + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Оповещение, + Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку); + +КонецПроцедуры + +// Получает отпечатки сертификатов пользователя ОС на компьютере. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение: +// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина; +// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// +// ТолькоЛичные - Булево - Если Ложь, то к личным сертификатам добавляются сертификаты получателей. +// +// ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии. +// +Процедура ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку = Истина) Экспорт + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку); + +КонецПроцедуры + +// Процедура проверяет наличие сертификата в личном хранилище, срок действия, что текущий пользователь +// указан в сертификате или не указан никакой, а также, что заполнена программа для работы с сертификатом. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение с результатом +// Массив - со значениями Структура со свойствами: +// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. +// * Наименование - Строка - представление сертификата в списке. +// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// * Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. +// * Организация - СправочникСсылка.Организация - организация к которой относится сертификат. +// Отбор - Неопределено - использовать значения по умолчанию, для свойств структуры, описанных ниже. +// - Структура - со свойствами: +// * ПроверятьСрокДействия - Булево - если свойства нет, значит Истина. +// * ТолькоСертификатыСЗаполненнойПрограммой - Булево - если свойства нет, значит Истина, +// в запросе к справочнику выбираются только те сертификаты, +// у которых заполнено поле Программа. +// * ВключатьСертификатыСПустымПользователем - Булево - если свойства нет, значит Истина, +// в запросе к справочнику выбираются не только сертификаты, у которых поле Пользователь +// совпадает с текущим пользователем, но и те, у которых оно не заполнено. +// * Организация - ОпределяемыйТип.Организация - если свойство есть и заполнено, тогда +// в запросе к справочнику выбираются только сертификаты, у которых поле Организация +// совпадает с указанной. +// +Процедура НайтиДействительныеЛичныеСертификаты(Оповещение, Отбор = Неопределено) Экспорт + + МассивТиповОтбора = Новый Массив; + МассивТиповОтбора.Добавить(Тип("Структура")); + МассивТиповОтбора.Добавить(Тип("Неопределено")); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиДействительныеЛичныеСертификаты", + "Отбор", Отбор, МассивТиповОтбора); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиДействительныеЛичныеСертификаты", + "Оповещение", Оповещение, Тип("ОписаниеОповещения")); + + ЭлектроннаяПодписьСлужебныйКлиент.НайтиДействительныеЛичныеСертификаты(Оповещение, Отбор); + +КонецПроцедуры + +// Осуществляет поиск установленных программ на клиенте и на сервере. +// Только для работы через средства платформы (МенеджерКриптографии). +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение с результатом +// Массив - со значениями Структура со свойствами, как и ОписаниеПрограмм, а также дополнительными свойствами: +// * РезультатПроверки - Булево - если Истина, то установлена либо на клиенте, либо на сервере. +// * РезультатПроверкиНаКлиенте - Строка - если пустая строка, то установлена, иначе описание ошибки. +// * РезультатПроверкиНаСервере - Строка - если пустая строка, то установлена, иначе описание ошибки. +// - Неопределено - проверка не выполнялась. +// +// ОписаниеПрограмм - Массив - как в процедуре ЗаполнитьСписокПрограмм. +// Указанные описания будут добавлены к поставляемым описаниям или +// заменят их в части совпадений имени и типа программы. +// +// ПроверятьНаСервере - Булево - Истина, если включено подписание или шифрование на сервере и +// значение не указано явно. +// +Процедура НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм = Неопределено, ПроверятьНаСервере = Неопределено) Экспорт + + МассивТиповПроверятьНаСервере = Новый Массив; + МассивТиповПроверятьНаСервере.Добавить(Тип("Булево")); + МассивТиповПроверятьНаСервере.Добавить(Тип("Неопределено")); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "ПроверятьНаСервере", + ПроверятьНаСервере, МассивТиповПроверятьНаСервере); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "Оповещение", + Оповещение, Тип("ОписаниеОповещения")); + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "ОписаниеПрограмм", + ОписаниеПрограмм, Тип("Массив")); + + ЭлектроннаяПодписьСлужебныйКлиент.НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм, ПроверятьНаСервере); + +КонецПроцедуры + // Устанавливает пароль в хранилище паролей на клиенте на время сеанса. +// Только для работы через средства платформы (МенеджерКриптографии). +// // Установка пароля позволяют не вводить пароль пользователю при очередной // операции, что полезно при выполнении пакета операций. // Если для сертификата установлен пароль, тогда флажок ЗапомнитьПароль @@ -1001,32 +1125,7 @@ КонецПроцедуры -// Возвращает дату, извлеченную из двоичных данных подписи или Неопределено. -// -// Параметры: -// Подпись - ДвоичныеДанные - данные подписи из которых нужно извлечь дату. -// ПривестиКЧасовомуПоясуСеанса - Булево - привести универсальное время к времени сеанса. -// -// Возвращаемое значение: -// Дата - успешно извлеченная дата подписи. -// Неопределено - не удалось извлечь дату из данных подписи. -// -Функция ДатаПодписания(Подпись, ПривестиКЧасовомуПоясуСеанса = Истина) Экспорт - - ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписанияУниверсальная(Подпись); - - Если ДатаПодписания = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Если ПривестиКЧасовомуПоясуСеанса Тогда - ДатаПодписания = ДатаПодписания + (ОбщегоНазначенияКлиент.ДатаСеанса() - - ОбщегоНазначенияКлиент.ДатаУниверсальная()); - КонецЕсли; - - Возврат ДатаПодписания; - -КонецФункции +#КонецОбласти #КонецОбласти @@ -1039,7 +1138,7 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда + Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиентПодMacOS() Тогда Возврат; КонецЕсли; @@ -1047,7 +1146,7 @@ "ДатаПодписи, Комментарий, КомуВыданСертификат, Отпечаток, |АдресПодписи, УстановившийПодпись, АдресСертификата, |Статус, ОписаниеОшибки, ПодписьВерна, ДатаПроверкиПодписи"); - + ЗаполнитьЗначенияСвойств(СвойстваПодписи, ТекущиеДанные); ПараметрыФормы = Новый Структура("СвойстваПодписи", СвойстваПодписи); @@ -1084,8 +1183,8 @@ // По окончании подписания сообщает о подписании. // // Параметры: -// ПредставлениеДанных - Произвольный - ссылка на объект, в табличную -// часть которого добавлена электронная подпись. +// ПредставлениеДанных - Произвольный - ссылка на объект, к которому +// добавлена электронная подпись. // МножествоДанных - Булево - определяет вид сообщения множественное // или единственное число элементов. // ИзФайла - Булево - определяет вид сообщения добавления diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl index 586d3eb96..a73f99251 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается после создания на сервере, но до открытия форм ПодписаниеДанных, РасшифровкаДанных. @@ -46,6 +41,13 @@ // Это описание сможет увидеть пользователь при нажатии на картинку результата. // * ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение // начальное значение Ложь. +// * Пароль - Строка - пароль, введенный пользователем. +// - Неопределено - если свойство ВводитьПароль установлено Ложь в процедуре +// ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. +// * РезультатыПроверок - Структура - со свойствами: +// * Ключ - Строка - имя стандартной или дополнительной проверки. +// * Значение - Неопределено - проверка не выполнялась (ОписаниеОшибки осталось Неопределено). +// - Булево - результат выполнения дополнительной проверки. // Процедура ПриДополнительнойПроверкеСертификата(Параметры) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl index 3a28f9c61..9b11aa661 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает представление сертификата в справочнике, формируемое @@ -138,7 +133,7 @@ // алгоритмов подписания и хеширования. // // Возвращаемое значение: -// Структура - со свойствами: +// Структура - со свойствами: // * XPathSignedInfo - Строка - например, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]". // * XPathПодписываемыйТег - Строка - например, "(//. | //@* | //namespace::*)[ancestor-or-self::soap:Body]". // * ИмяАлгоритмаПодписи - Строка - например, "GOST R 34.10-2001". @@ -163,56 +158,6 @@ КонецФункции -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Возвращает структуру, содержащую различные общие настройки. -// -// Возвращаемое значение: -// См. ЭлектроннаяПодпись.ОбщиеНастройки(). -// -// См. также: -// ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования - место определения данных параметров и -// их текстовые описания. -// -Функция ОбщиеНастройки() Экспорт - #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Возврат ЭлектроннаяПодпись.ОбщиеНастройки(); - #Иначе - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ОбщиеНастройки; - #КонецЕсли -КонецФункции - -// Возвращает структуру, содержащую различные персональные настройки. -// -// Возвращаемое значение: -// Структура - Персональные настройки для работы с электронной подписью. -// * ДействияПриСохраненииСЭП - Строка - Что делать при сохранении файлов с электронной подписью: -// ** "Спрашивать" - Показывать диалог выбора подписей для сохранения. -// ** "СохранятьВсеПодписи" - Всегда все подписи. -// * ПутиКПрограммамЭлектроннойПодписиИШифрования - Соответствие - где: -// ** Ключ - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа. -// ** Значение - Строка - путь к программе на компьютере пользователя. -// * РасширениеДляФайловПодписи - Строка - Расширение для файлов ЭП. -// * РасширениеДляЗашифрованныхФайлов - Строка - Расширение для зашифрованных файлов. -// -// См. также: -// ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования - место ввода данных параметров и -// их пользовательские представления. -// -Функция ПерсональныеНастройки() Экспорт - #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Возврат ЭлектроннаяПодпись.ПерсональныеНастройки(); - #Иначе - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ПерсональныеНастройки; - #КонецЕсли -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - // Возвращает свойства субъекта сертификата криптографии с учетом их состава (ЮЛ,ИП,ФЛ). // // Параметры: @@ -220,7 +165,7 @@ // // Возвращаемое значение: // Структура - возвращаемое значение, со свойствами: -// * ОбщееИмя - Строка(64) - извлекается из поля CN. +// * ОбщееИмя - Строка - (64) - извлекается из поля CN. // ЮЛ: В зависимости от типа конечного владельца СКПЭП // - наименование организации; // - название автоматизированной системы; @@ -228,70 +173,70 @@ // ФЛ: ФИО. // - Неопределено - нужное свойство сертификата не найдено. // -// * Страна - Строка(2) - извлекается из поля C - двухсимвольный код страны +// * Страна - Строка - (2) - извлекается из поля C - двухсимвольный код страны // согласно ГОСТ 7.67-2003 (ИСО 3166-1:1997). // - Неопределено - нужное свойство сертификата не найдено. // -// * Регион - Строка(128) - извлекается из поля S - наименование субъекта РФ. +// * Регион - Строка - (128) - извлекается из поля S - наименование субъекта РФ. // ЮЛ: По адресу местонахождения. // ФЛ: По адресу регистрации. // - Неопределено - нужное свойство сертификата не найдено. // -// * НаселенныйПункт - Строка(128) - извлекается из поля L - наименование населенного пункта. +// * НаселенныйПункт - Строка - (128) - извлекается из поля L - наименование населенного пункта. // ЮЛ: По адресу местонахождения. // ФЛ: По адресу регистрации. // - Неопределено - нужное свойство сертификата не найдено. // -// * Улица - Строка(128) - извлекается из поля Street - наименование улицы, дома, офиса. +// * Улица - Строка - (128) - извлекается из поля Street - наименование улицы, дома, офиса. // ЮЛ: По адресу местонахождения. // ФЛ: По адресу регистрации. // - Неопределено - нужное свойство сертификата не найдено. // -// * Организация - Строка(64) - извлекается из поля O. +// * Организация - Строка - (64) - извлекается из поля O. // ЮЛ: Полное или сокращенное наименование организации. // - Неопределено - нужное свойство сертификата не найдено. // -// * Подразделение - Строка(64) - извлекается из поля OU. +// * Подразделение - Строка - (64) - извлекается из поля OU. // ЮЛ: В случае выпуска СКПЭП на должностное лицо - подразделение организации. // Подразделение - это территориальная структурная единица крупной организации, // которое обычно не заполняется в сертификате. // - Неопределено - нужное свойство сертификата не найдено. // -// * Должность - Строка(64) - извлекается из поля T. +// * Должность - Строка - (64) - извлекается из поля T. // ЮЛ: В случае выпуска СКПЭП на должностное лицо - его должность. // - Неопределено - нужное свойство сертификата не найдено. // -// * ЭлектроннаяПочта - Строка(128) - извлекается из поля E - адрес электронной почты. +// * ЭлектроннаяПочта - Строка - (128) - извлекается из поля E - адрес электронной почты. // ЮЛ: адрес электронной почты должностного лица. // ФЛ: адрес электронной почты физического лица. // - Неопределено - нужное свойство сертификата не найдено. // -// * ОГРН - Строка(13) - извлекается из поля OGRN. +// * ОГРН - Строка - (13) - извлекается из поля OGRN. // ЮЛ: ОГРН организации. // - Неопределено - нужное свойство сертификата не найдено. // -// * ОГРНИП - Строка(15) - извлекается из поля OGRNIP. +// * ОГРНИП - Строка - (15) - извлекается из поля OGRNIP. // ИП: ОГРН индивидуального предпринимателя. // - Неопределено - нужное свойство сертификата не найдено. // -// * СНИЛС - Строка(11) - извлекается из поля SNILS. +// * СНИЛС - Строка - (11) - извлекается из поля SNILS. // ФЛ: СНИЛС // ЮЛ: Не обязательно, в случае выпуска СКПЭП на должностное лицо - его СНИЛС. // - Неопределено - нужное свойство сертификата не найдено. // -// * ИНН - Строка(12) - извлекается из поля INN. +// * ИНН - Строка - (12) - извлекается из поля INN. // ФЛ: ИНН. // ИП: ИНН. // ЮЛ: Не обязательно, но может быть заполнен для целей взаимодействия с ФНС. // - Неопределено - нужное свойство сертификата не найдено. // -// * Фамилия - Строка(64) - извлекается из поля SN, если заполнено. +// * Фамилия - Строка - (64) - извлекается из поля SN, если заполнено. // - Неопределено - нужное свойство сертификата не найдено. // -// * Имя - Строка(64) - извлекается из поля GN, если заполнено. +// * Имя - Строка - (64) - извлекается из поля GN, если заполнено. // - Неопределено - нужное свойство сертификата не найдено. // -// * Отчество - Строка(64) - извлекается из поля GN, если заполнено. +// * Отчество - Строка - (64) - извлекается из поля GN, если заполнено. // - Неопределено - нужное свойство сертификата не найдено. // Функция СвойстваСубъектаСертификата(Сертификат) Экспорт @@ -444,41 +389,41 @@ // // Возвращаемое значение: // Структура - возвращаемое значение, со свойствами: -// * ОбщееИмя - Строка(64) - извлекается из поля CN - псевдоним удостоверяющего центра. +// * ОбщееИмя - Строка - (64) - извлекается из поля CN - псевдоним удостоверяющего центра. // - Неопределено - нужное свойство сертификата не найдено. // -// * Страна - Строка(2) - извлекается из поля C - двухсимвольный код страны +// * Страна - Строка - (2) - извлекается из поля C - двухсимвольный код страны // согласно ГОСТ 7.67-2003 (ИСО 3166-1:1997). // - Неопределено - нужное свойство сертификата не найдено. // -// * Регион - Строка(128) - извлекается из поля S - наименование субъекта РФ +// * Регион - Строка - (128) - извлекается из поля S - наименование субъекта РФ // по адресу местонахождения ПАК УЦ. // - Неопределено - нужное свойство сертификата не найдено. // -// * НаселенныйПункт - Строка(128) - извлекается из поля L - наименование населенного пункта +// * НаселенныйПункт - Строка - (128) - извлекается из поля L - наименование населенного пункта // по адресу местонахождения ПАК УЦ. // - Неопределено - нужное свойство сертификата не найдено. // -// * Улица - Строка(128) - извлекается из поля Street - наименование улицы, дома, офиса +// * Улица - Строка - (128) - извлекается из поля Street - наименование улицы, дома, офиса // по адресу местонахождения ПАК УЦ. // - Неопределено - нужное свойство сертификата не найдено. // -// * Организация - Строка(64) - извлекается из поля O +// * Организация - Строка - (64) - извлекается из поля O // полное или сокращенное наименование организации. // - Неопределено - нужное свойство сертификата не найдено. // -// * Подразделение - Строка(64) - извлекается из поля OU подразделение организации. +// * Подразделение - Строка - (64) - извлекается из поля OU подразделение организации. // Подразделение - это территориальная структурная единица крупной организации, // которое обычно не заполняется в сертификате. // - Неопределено - нужное свойство сертификата не найдено. // -// * ЭлектроннаяПочта - Строка(128) - извлекается из поля E - адрес электронной почты удостоверяющего центра. +// * ЭлектроннаяПочта - Строка - (128) - извлекается из поля E - адрес электронной почты удостоверяющего центра. // - Неопределено - нужное свойство сертификата не найдено. // -// * ОГРН - Строка(13) - извлекается из поля OGRN- ОГРН организации удостоверяющего центра. +// * ОГРН - Строка - (13) - извлекается из поля OGRN- ОГРН организации удостоверяющего центра. // - Неопределено - нужное свойство сертификата не найдено. // -// * ИНН - Строка(12) - извлекается из поля INN - ИНН организации удостоверяющего центра. +// * ИНН - Строка - (12) - извлекается из поля INN - ИНН организации удостоверяющего центра. // - Неопределено - нужное свойство сертификата не найдено. // Функция СвойстваИздателяСертификата(Сертификат) Экспорт @@ -547,6 +492,56 @@ КонецФункции +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Возвращает структуру, содержащую различные общие настройки. +// +// Возвращаемое значение: +// См. ЭлектроннаяПодпись.ОбщиеНастройки(). +// +// См. также: +// ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования - место определения данных параметров и +// их текстовые описания. +// +Функция ОбщиеНастройки() Экспорт + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Возврат ЭлектроннаяПодпись.ОбщиеНастройки(); + #Иначе + Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ОбщиеНастройки; + #КонецЕсли +КонецФункции + +// Возвращает структуру, содержащую различные персональные настройки. +// +// Возвращаемое значение: +// Структура - Персональные настройки для работы с электронной подписью. +// * ДействияПриСохраненииСЭП - Строка - Что делать при сохранении файлов с электронной подписью: +// ** "Спрашивать" - Показывать диалог выбора подписей для сохранения. +// ** "СохранятьВсеПодписи" - Всегда все подписи. +// * ПутиКПрограммамЭлектроннойПодписиИШифрования - Соответствие - где: +// ** Ключ - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа. +// ** Значение - Строка - путь к программе на компьютере пользователя. +// * РасширениеДляФайловПодписи - Строка - Расширение для файлов ЭП. +// * РасширениеДляЗашифрованныхФайлов - Строка - Расширение для зашифрованных файлов. +// +// См. также: +// ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования - место ввода данных параметров и +// их пользовательские представления. +// +Функция ПерсональныеНастройки() Экспорт + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Возврат ЭлектроннаяПодпись.ПерсональныеНастройки(); + #Иначе + Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ПерсональныеНастройки; + #КонецЕсли +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Заполняет таблицу описания сертификата из четырех полей: КомуВыдан, КемВыдан, ДействуетДо, Назначение. Функция ЗаполнитьОписаниеДанныхСертификата(Таблица, Сертификат) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl index b26b98061..31b665594 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается в форме добавления заявления на новый сертификат для заполнения реквизитов организации и при ее выборе. @@ -21,25 +16,39 @@ // Истина - указанная организация является индивидуальным предпринимателем. // // * НаименованиеСокращенное - Строка - (возвращаемое значение) краткое наименование организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * НаименованиеПолное - Строка - (возвращаемое значение) краткое наименование организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * ИНН - Строка - (возвращаемое значение) ИНН организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * КПП - Строка - (возвращаемое значение) КПП организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * ОГРН - Строка - (возвращаемое значение) ОГРН организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * РасчетныйСчет - Строка - (возвращаемое значение) основной расчетный счет организации для договора. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * БИК - Строка - (возвращаемое значение) БИК банка расчетного счета. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * КорреспондентскийСчет - Строка - (возвращаемое значение) корреспондентский счет банка расчетного счета. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * Телефон - Строка - (возвращаемое значение) телефон организации в формате XML, как его -// возвращает функция КонтактнаяИнформацияВXML общего модуля -// УправлениеКонтактнойИнформацией. +// возвращает функция КонтактнаяИнформацияВXML общего модуля УправлениеКонтактнойИнформацией. // // * ЮридическийАдрес - Строка - (возвращаемое значение) юридический адрес организации в формате XML, как его // возвращает функция КонтактнаяИнформацияВXML общего модуля УправлениеКонтактнойИнформацией. +// - Неопределено - значение не указано, не изменять имеющееся значение. // // * ФактическийАдрес - Строка - (возвращаемое значение) фактический адрес организации в формате XML, как его // возвращает функция КонтактнаяИнформацияВXML общего модуля УправлениеКонтактнойИнформацией. -// -// Если реквизит (возвращаемое значение) остается равным начальному значению Неопределено, -// тогда он пропускается, если для значения Неопределено не указано другое поведение. +// - Неопределено - значение не указано, не изменять имеющееся значение. // Процедура ПриЗаполненииРеквизитовОрганизацииВЗаявленииНаСертификат(Параметры) Экспорт @@ -74,36 +83,63 @@ // Записывается в сертификат в поле Пользователь, может быть изменено в дальнейшем. // // * Фамилия - Строка - (возвращаемое значение) фамилия сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * Имя - Строка - (возвращаемое значение) имя сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * Отчество - Строка - (возвращаемое значение) отчество сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * ДатаРождения - Дата - (возвращаемое значение) дата рождения сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * Пол - Строка - (возвращаемое значение) пол сотрудника "Мужской" или "Женский". +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * МестоРождения - Строка - (возвращаемое значение) описание места рождения сотрудника. -// * Гражданство - СправочникСсылка.СтраныМира -// - (возвращаемое значение) гражданство сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// +// * Гражданство - СправочникСсылка.СтраныМира - (возвращаемое значение) гражданство сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * СтраховойНомерПФР - Строка - (возвращаемое значение) СНИЛС сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // * Должность - Строка - (возвращаемое значение) должность сотрудника в организации. +// - Неопределено - значение не указано, не изменять имеющееся значение. // // * Подразделение - Строка - (возвращаемое значение) обособленное подразделение организации, // в котором работает сотрудник. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ДокументВид - Строка - (возвращаемое значение) строки "21" или "91". 21 - паспорт гражданина РФ, // 91 - иной документ предусмотренный законодательством РФ (по СПДУЛ). +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ДокументНомер - Строка - (возвращаемое значение) номер документа сотрудника (серия и // номер для паспорта гражданина РФ). +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ДокументКемВыдан - Строка - (возвращаемое значение) кем выдан документ сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ДокументКодПодразделения - Строка - (возвращаемое значение) - код подразделения, если вид документа 21. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ДокументДатаВыдачи - Дата - (возвращаемое значение) дата выдачи документа сотрудника. +// - Неопределено - значение не указано, не изменять имеющееся значение. +// // // * ЭлектроннаяПочта - Строка - (возвращаемое значение) адрес электронной почты сотрудника в формате XML, как его // возвращает функция КонтактнаяИнформацияВXML общего модуля УправлениеКонтактнойИнформацией. +// - Неопределено - значение не указано, не изменять имеющееся значение. // -// Если реквизит (возвращаемое значение) остается равным начальному значению Неопределено, -// тогда он пропускается, если для значения Неопределено не указано другое поведение. // Процедура ПриЗаполненииРеквизитовВладельцаВЗаявленииНаСертификат(Параметры) Экспорт @@ -119,8 +155,7 @@ // * Организация - СправочникСсылка.Организации - выбранная организация, на которую оформляется сертификат. // - Неопределено, если ОпределяемыйТип.Организации не настроен. // -// * ТипРуководителя - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы из которых можно сделать -// выбор. +// * ТипРуководителя - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы из которых можно сделать выбор. // - Неопределено - (возвращаемое значение) выбор партнера не поддерживается. // // * Руководитель - ТипРуководителя - это значение, выбранное пользователем по которому нужно заполнить должность. @@ -131,11 +166,11 @@ // - Неопределено - получить представление от значения Руководитель. // // * Должность - Строка - (возвращаемое значение) - должность руководителя, который будет подписывать документы. -// * Основание - Строка - (возвращаемое значение) - основание на котором действует должностное лицо (устав, -// доверенность, ...). +// - Неопределено - значение не указано, не изменять имеющееся значение. // -// Если реквизит (возвращаемое значение) остается равным начальному значению Неопределено, -// тогда он пропускается, если для значения Неопределено не указано другое поведение. +// * Основание - Строка - (возвращаемое значение) - основание на котором действует +// должностное лицо (устав, доверенность, ...). +// - Неопределено - значение не указано, не изменять имеющееся значение. // Процедура ПриЗаполненииРеквизитовРуководителяВЗаявленииНаСертификат(Параметры) Экспорт @@ -166,10 +201,10 @@ // Истина - указанный партнер является индивидуальным предпринимателем. // // * ИНН - Строка - (возвращаемое значение) ИНН партнера. -// * КПП - Строка - (возвращаемое значение) КПП партнера. +// - Неопределено - значение не указано, не изменять имеющееся значение. // -// Если реквизит (возвращаемое значение) остается равным начальному значению Неопределено, -// тогда он пропускается, если для значения Неопределено не указано другое поведение. +// * КПП - Строка - (возвращаемое значение) КПП партнера. +// - Неопределено - значение не указано, не изменять имеющееся значение. // Процедура ПриЗаполненииРеквизитовПартнераВЗаявленииНаСертификат(Параметры) Экспорт @@ -242,8 +277,10 @@ // процедуры ПроверитьСертификатСправочника общего модуля ЭлектроннаяПодписьКлиент, кроме того // параметр МенеджерКриптографии не будет определен в процедурах ПриДополнительнойПроверкеСертификата // общих модулей ЭлектроннаяПодписьПереопределяемый и ЭлектроннаяПодписьКлиентПереопределяемый. +// ВводитьПароль - Булево - если установить Ложь, тогда ввод пароля для закрытой части ключа сертификата будет скрыт. +// Не учитывается, если параметр СтандартныеПроверки не установлен в Ложь. // -Процедура ПриСозданииФормыПроверкаСертификата(Сертификат, ДополнительныеПроверки, ПараметрыДополнительныхПроверок, СтандартныеПроверки) Экспорт +Процедура ПриСозданииФормыПроверкаСертификата(Сертификат, ДополнительныеПроверки, ПараметрыДополнительныхПроверок, СтандартныеПроверки, ВводитьПароль = Истина) Экспорт @@ -252,19 +289,27 @@ // Вызывается из формы ПроверкаСертификата, если при создании формы были добавлены дополнительные проверки. // // Параметры: -// Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - проверяемый сертификат. -// Проверка - Строка - имя проверки, добавленное в процедуре ПриСозданииФормыПроверкаСертификата -// общего модуля ЭлектроннаяПодписьПереопределяемый. -// МенеджерКриптографии - МенеджерКриптографии - подготовленный менеджер криптографии для -// выполнения проверки. -// - Неопределено - если стандартные проверки отключены в процедуре -// ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. -// ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки. -// Это описание сможет увидеть пользователь при нажатии на картинку результата. -// ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение +// Параметры - Структура - со свойствами: +// * Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - проверяемый сертификат. +// * Проверка - Строка - имя проверки, добавленное в процедуре ПриСозданииФормыПроверкаСертификата +// общего модуля ЭлектроннаяПодписьПереопределяемый. +// * МенеджерКриптографии - МенеджерКриптографии - подготовленный менеджер криптографии для +// выполнения проверки. +// - Неопределено - если стандартные проверки отключены в процедуре +// ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. +// * ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки. +// Это описание сможет увидеть пользователь при нажатии на картинку результата. +// * ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение // начальное значение Ложь. -// -Процедура ПриДополнительнойПроверкеСертификата(Сертификат, Проверка, МенеджерКриптографии, ОписаниеОшибки, ЭтоПредупреждение) Экспорт +// * Пароль - Строка - пароль, введенный пользователем. +// - Неопределено - если свойство ВводитьПароль установлено Ложь в процедуре +// ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. +// * РезультатыПроверок - Структура - со свойствами: +// * Ключ - Строка - имя дополнительной проверки, которая уже выполнена. +// * Значение - Неопределено - дополнительная проверка не выполнялась (ОписаниеОшибки осталось Неопределено). +// - Булево - результат выполнения дополнительной проверки. +// +Процедура ПриДополнительнойПроверкеСертификата(Параметры) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl index cef4a68b1..65d23a62a 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl @@ -1,73 +1,102 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Добавление обработчиков служебных событий (подписок). +// Добавляет сертификаты к переданному объекту. +Процедура ДобавитьСертификатыШифрования(ОбъектСсылка, МассивОтпечатков) Экспорт + УстановитьПривилегированныйРежим(Истина); + + ПорядковыйНомер = 1; + Для Каждого ОтпечатокСтруктура Из МассивОтпечатков Цикл + МенеджерЗаписи = РегистрыСведений.СертификатыШифрования.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ЗашифрованныйОбъект = ОбъектСсылка; + МенеджерЗаписи.Отпечаток = ОтпечатокСтруктура.Отпечаток; + МенеджерЗаписи.Представление = ОтпечатокСтруктура.Представление; + МенеджерЗаписи.Сертификат = Новый ХранилищеЗначения(ОтпечатокСтруктура.Сертификат); + МенеджерЗаписи.ПорядковыйНомер = ПорядковыйНомер; + ПорядковыйНомер = ПорядковыйНомер + 1; + МенеджерЗаписи.Записать(); + КонецЦикла; -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт +КонецПроцедуры + +// Очищает записи о сертификатах шифрования после расшифровка объекта. +Процедура ОчиститьСертификатыШифрования(ОбъектСсылка) Экспорт + УстановитьПривилегированныйРежим(Истина); - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. + НаборЗаписей = РегистрыСведений.СертификатыШифрования.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ЗашифрованныйОбъект.Установить(ОбъектСсылка); + НаборЗаписей.Записать(Истина); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОформитьСписокПодписей(Форма, ИмяСпискаПодписей) Экспорт - ИмяМодуля = "ЭлектроннаяПодписьСлужебный"; + Элемент = Форма.УсловноеОформление.Элементы.Добавить(); - ИмяСобытия = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; - СерверныеОбработчики[ИмяСобытия].Добавить(ИмяМодуля); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей); - ИмяСобытия = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"; - СерверныеОбработчики[ИмяСобытия].Добавить(ИмяМодуля); + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей + ".ПодписьВерна"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; - ИмяСобытия = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"; - СерверныеОбработчики[ИмяСобытия].Добавить(ИмяМодуля); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий. +// Определяет доступность электронной подписи для файла по его типу +Функция ДоступнаЭлектроннаяПодпись(ТипФайла) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Для каждого ТипОбъекта Из Метаданные.ОпределяемыеТипы.ПодписанныйОбъект.Тип.Типы() Цикл + Если ТипФайла = ТипОбъекта Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Ложь; + +КонецФункции -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). -// +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗаполнитьНачальныеНастройки"; - Обработчик.РежимВыполнения = "Монопольно"; + Если Метаданные.Обработки.Найти("ПрограммыЭлектроннойПодписиИШифрования") <> Неопределено Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "Обработки.ПрограммыЭлектроннойПодписиИШифрования.ЗаполнитьНачальныеНастройки"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.3.3.28"; + Обработчик.Комментарий = + НСтр("ru = 'Заполнение справочника Программы электронной подписи и шифрования.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("8e76369a-e16c-415d-bfeb-95e7e5f07a00"); + Обработчик.Процедура = "Обработки.ПрограммыЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Обработки.ПрограммыЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; + Обработчик.ИзменяемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + + КонецЕсли; Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.2.4.7"; Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ПеренестиНастройкиМенеджераКриптографии"; Обработчик.РежимВыполнения = "Монопольно"; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.3.6.207"; - Обработчик.Комментарий = - НСтр("ru = 'Заполнение справочника Программы электронной подписи и шифрования.'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("8e76369a-e16c-415d-bfeb-95e7e5f07a00"); - Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; - Обработчик.ИзменяемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// См. также: -// ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -90,14 +119,10 @@ КонецПроцедуры -// Определяет параметры работы клиента. -// -// Параметры: -// Параметры - Структура - Все параметры работы клиента. -// +// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда НастройкиПодсистемы = Новый Структура; НастройкиПодсистемы.Вставить("ПерсональныеНастройки", ЭлектроннаяПодпись.ПерсональныеНастройки()); НастройкиПодсистемы.Вставить("ОбщиеНастройки", ЭлектроннаяПодпись.ОбщиеНастройки()); @@ -109,15 +134,7 @@ КонецПроцедуры -// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла". -// -// Параметры: -// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных. -// * ПолноеИмя - Строка - полное имя справочника (как в метаданных). -// * Представление - Строка - представление справочника в списке выбора. -// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и -// в модуле менеджера справочника определены функции. -// +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт // Загрузка в справочник ПрограммыЭлектроннойПодписиИШифрования запрещена. @@ -134,43 +151,12 @@ КонецПроцедуры -// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность -// редактирования реквизитов при групповом изменении. -// -// Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Групповое изменение объектов". -// Дополнительно в значении могут быть перечислены имена экспортных функций: -// "РеквизитыНеРедактируемыеВГрупповойОбработке", -// "РеквизитыРедактируемыеВГрупповойОбработке". -// Каждое имя должно начинаться с новой строки. -// Если указана пустая строка, значит в модуле менеджера определены обе функции. -// +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); Объекты.Вставить(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Прочие процедуры и функции. - -// Только для внутреннего использования. -Процедура ОформитьСписокПодписей(Форма, ИмяСпискаПодписей) Экспорт - - Элемент = Форма.УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей + ".ПодписьВерна"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = Ложь; - - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); - -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -358,8 +344,8 @@ Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Сертификат не найден на сервере по причине: - |%1 - |'"), + |%1'") + + Символы.ПС, ПредставлениеОшибки); Иначе ТекстОшибки = НСтр("ru = 'Сертификат не найден на сервере.'"); @@ -453,13 +439,105 @@ КонецПроцедуры +// Только для внутреннего использования. +Функция СведенияОПодписиДляЖурналаРегистрации(ДатаПодписи, СвойстваПодписи, ЭтоОшибкаПодписания = Ложь) Экспорт + + Если СвойстваПодписи.Свойство("ОписаниеСертификата") Тогда + СвойстваСертификата = СвойстваПодписи.ОписаниеСертификата; + Иначе + СвойстваСертификата = Новый Структура; + СвойстваСертификата.Вставить("СерийныйНомер", ""); + СвойстваСертификата.Вставить("КемВыдан", ""); + СвойстваСертификата.Вставить("КомуВыдан", ""); + СвойстваСертификата.Вставить("ДатаНачала", ""); + СвойстваСертификата.Вставить("ДатаОкончания", ""); + + Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("Строка") + И ЭтоАдресВременногоХранилища(СвойстваПодписи.Сертификат) Тогда + Сертификат = ПолучитьИзВременногоХранилища(СвойстваПодписи.Сертификат); + Иначе + Сертификат = СвойстваПодписи.Сертификат; + КонецЕсли; + + Если ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда + СертификатКриптографии = Новый СертификатКриптографии(Сертификат); + СвойстваСертификатаКриптографии = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии); + + СвойстваСертификата.СерийныйНомер = Строка(СертификатКриптографии.СерийныйНомер); + СвойстваСертификата.КемВыдан = СвойстваСертификатаКриптографии.КемВыдан; + СвойстваСертификата.КомуВыдан = СвойстваСертификатаКриптографии.КомуВыдан; + СвойстваСертификата.ДатаНачала = Формат(СертификатКриптографии.ДатаНачала, "ДЛФ=D"); + СвойстваСертификата.ДатаОкончания = Формат(СертификатКриптографии.ДатаОкончания, "ДЛФ=D"); + + ИначеЕсли СвойстваПодписи.Свойство("КомуВыданСертификат") Тогда + СвойстваСертификата.КомуВыдан = СвойстваПодписи.КомуВыданСертификат; + КонецЕсли; + КонецЕсли; + + Если ЭтоОшибкаПодписания Тогда + СведенияОПодписи = ""; + Иначе + СведенияОПодписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дата подписи: %1'"), Формат(ДатаПодписи, "ДЛФ=DT")) + Символы.ПС; + КонецЕсли; + + СведенияОПодписи = СведенияОПодписи + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат: %1 + |Кем выдан: %2 + |Владелец: %3 + |Действителен: с %4 по %5'"), + СвойстваСертификата.СерийныйНомер, + СвойстваСертификата.КемВыдан, + СвойстваСертификата.КомуВыдан, + СвойстваСертификата.ДатаНачала, + СвойстваСертификата.ДатаОкончания); + + Возврат СведенияОПодписи; + +КонецФункции + +// Только для внутреннего использования. +Процедура ЗарегистрироватьПодписаниеДанныхВЖурнале(ЭлементДанных, ОписаниеОшибки = "") Экспорт + + ЭтоОшибкаПодписания = ЗначениеЗаполнено(ОписаниеОшибки); + + СообщениеЖурналаРегистрации = СведенияОПодписиДляЖурналаРегистрации( + ЭлементДанных.СвойстваПодписи.ДатаПодписи, + ЭлементДанных.СвойстваПодписи, + ЭтоОшибкаПодписания); + + Если ЭтоОшибкаПодписания Тогда + ИмяСобытия = НСтр("ru = 'Электронная подпись.Ошибка подписания данных'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + + СообщениеЖурналаРегистрации = СообщениеЖурналаРегистрации + " + | + |" + ОписаниеОшибки; + Иначе + ИмяСобытия = НСтр("ru = 'Электронная подпись.Подписание данных'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + КонецЕсли; + + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ЭлементДанных.ПредставлениеДанных)) Тогда + МетаданныеЭлементаДанных = ЭлементДанных.ПредставлениеДанных.Метаданные(); + Иначе + МетаданныеЭлементаДанных = Неопределено; + КонецЕсли; + + ЗаписьЖурналаРегистрации(ИмяСобытия, + УровеньЖурналаРегистрации.Информация, + МетаданныеЭлементаДанных, + ЭлементДанных.ПредставлениеДанных, + СообщениеЖурналаРегистрации); + +КонецПроцедуры // Только для внутреннего использования. Процедура ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, КромеУжеДобавленных, - Личные, Ошибка, БезОтбора) Экспорт + Личные, Ошибка, БезОтбора, ОтборПоОрганизации = Неопределено) Экспорт ТаблицаСвойствСертификатов = Новый ТаблицаЗначений; - ТаблицаСвойствСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(255))); + ТаблицаСвойствСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255))); ТаблицаСвойствСертификатов.Колонки.Добавить("КемВыдан"); ТаблицаСвойствСертификатов.Колонки.Добавить("Представление"); ТаблицаСвойствСертификатов.Колонки.Добавить("НаКлиенте", Новый ОписаниеТипов("Булево")); @@ -518,9 +596,9 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов( ТаблицаСвойствСертификатов, МассивСертификатов, БезОтбора, , Истина); КонецЕсли; - КонецЕсли; + КонецЕсли; - ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, Не БезОтбора И КромеУжеДобавленных); + ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, Не БезОтбора И КромеУжеДобавленных, ОтборПоОрганизации); ТаблицаСвойствСертификатов.Индексы.Добавить("Представление"); ТаблицаСвойствСертификатов.Сортировать("Представление Возр"); @@ -577,17 +655,22 @@ Элементы = Форма.Элементы; Параметры = Форма.Параметры; - Форма.Заголовок = Параметры.Операция; + Элементы.Сертификат.КнопкаВыпадающегоСписка = Истина; + Элементы.Сертификат.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.ОтображатьВВыпадающемСписке; + Форма.Заголовок = Параметры.Операция; Форма.ВыполнятьНаСервере = Параметры.ВыполнятьНаСервере; Если Шифрование Тогда - Если Форма.УказанНаборСертификатов Тогда + Если Форма.УказанНеизменяемыйНаборСертификатов Тогда Форма.БезПодтверждения = Параметры.БезПодтверждения; КонецЕсли; Иначе + Форма.ОтборСертификатов = Новый СписокЗначений; Если ТипЗнч(Параметры.ОтборСертификатов) = Тип("Массив") Тогда Форма.ОтборСертификатов.ЗагрузитьЗначения(Параметры.ОтборСертификатов); + ИначеЕсли ТипЗнч(Параметры.ОтборСертификатов) = Тип("Структура") Тогда + Форма.ОтборСертификатов = Параметры.ОтборСертификатов.Организация; КонецЕсли; Форма.БезПодтверждения = Параметры.БезПодтверждения; КонецЕсли; @@ -633,13 +716,15 @@ КонецЕсли; КонецЕсли; - Если Форма.ОтборСертификатов.Количество() > 1 Тогда - Сертификат = Неопределено; - ИначеЕсли Форма.ОтборСертификатов.Количество() = 1 Тогда - Сертификат = Форма.ОтборСертификатов[0].Значение; + Если ТипЗнч(Форма.ОтборСертификатов) = Тип("СписокЗначений") Тогда + Если Форма.ОтборСертификатов.Количество() > 1 Тогда + Сертификат = Неопределено; + ИначеЕсли Форма.ОтборСертификатов.Количество() = 1 Тогда + Сертификат = Форма.ОтборСертификатов[0].Значение; + КонецЕсли; КонецЕсли; - Если Не (Шифрование И Форма.УказанНаборСертификатов) Тогда + Если Не (Шифрование И Форма.УказанНеизменяемыйНаборСертификатов) Тогда Форма.Сертификат = Сертификат; КонецЕсли; @@ -656,7 +741,7 @@ Элементы.Пароль.АктивизироватьПоУмолчанию = Истина; КонецЕсли; Иначе - Если Не (Шифрование И Форма.УказанНаборСертификатов) Тогда + Если Не (Шифрование И Форма.УказанНеизменяемыйНаборСертификатов) Тогда Элементы.Сертификат.АктивизироватьПоУмолчанию = Истина; КонецЕсли; КонецЕсли; @@ -679,14 +764,14 @@ // Только для внутреннего использования. Процедура СертификатПриИзмененииНаСервере(Форма, ОтпечаткиСертификатовНаКлиенте, Шифрование = Ложь, Расшифровка = Ложь) Экспорт - Если Форма.ОтборСертификатов.Количество() = 0 - И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Если ТипЗнч(Форма.ОтборСертификатов) <> Тип("СписокЗначений") И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда Если Шифрование Тогда ХранилищеОбщихНастроек.Сохранить("Криптография", "СертификатДляШифрования", Форма.Сертификат); ИначеЕсли Не Расшифровка Тогда ХранилищеОбщихНастроек.Сохранить("Криптография", "СертификатДляПодписания", Форма.Сертификат); КонецЕсли; + КонецЕсли; ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора, @@ -829,16 +914,12 @@ ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; ЭлементЦветаОформления.Использование = Истина; - Если ИсключитьЗаявления Тогда - СписокСостояний = Новый СписокЗначений; - СписокСостояний.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка()); - СписокСостояний.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено); - - ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеЗаявления"); - ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; - ЭлементОтбораДанных.ПравоеЗначение = СписокСостояний; - ЭлементОтбораДанных.Использование = Истина; + Если ИсключитьЗаявления И Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.УстановитьУсловноеОформлениеСпискаСертификатов( + ЭлементУсловногоОформления); КонецЕсли; ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); @@ -1084,7 +1165,7 @@ Если ПодписьВерна Тогда ВызватьИсключение НСтр("ru = 'Подпись не верна (SignatureValue корректно, отличается DigestValue).'") Иначе - ВызватьИсключение НСтр("ru = 'Подпись не верна (SignatureValue не корректно.'"); + ВызватьИсключение НСтр("ru = 'Подпись не верна (SignatureValue некорректно.'"); КонецЕсли; КонецЕсли; @@ -1374,7 +1455,7 @@ КонецФункции // Для процедуры ОбновитьСписокСертификатов. -Процедура ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, КромеУжеДобавленных) +Процедура ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, КромеУжеДобавленных, ОтборПоОрганизации = Неопределено) Запрос = Новый Запрос; Запрос.УстановитьПараметр("Отпечатки", ТаблицаСвойствСертификатов.Скопировать(, "Отпечаток")); @@ -1390,18 +1471,21 @@ |ВЫБРАТЬ | Сертификаты.Отпечаток, | Сертификаты.Наименование КАК Представление, - | ВЫБОР - | КОГДА Сертификаты.СостояниеЗаявления = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка) - | ТОГДА ЛОЖЬ - | КОГДА Сертификаты.СостояниеЗаявления = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено) - | ТОГДА ЛОЖЬ - | ИНАЧЕ ИСТИНА - | КОНЕЦ КАК ЭтоЗаявление + | ЛОЖЬ КАК ЭтоЗаявление, + | Сертификаты.Организация |ИЗ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Отпечатки КАК Отпечатки | ПО Сертификаты.Отпечаток = Отпечатки.Отпечаток"; + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросПриДобавленииСертификатов( + Запрос.Текст); + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -1410,6 +1494,10 @@ Если Строка <> Неопределено Тогда // Защита от ошибки в данных (дубли сертификатов). ТаблицаСвойствСертификатов.Удалить(Строка); КонецЕсли; + ИначеЕсли ЗначениеЗаполнено(ОтборПоОрганизации) Тогда + Если Строка <> Неопределено И Выборка.Организация <> ОтборПоОрганизации Тогда // Защита от ошибки в данных (дубли сертификатов). + ТаблицаСвойствСертификатов.Удалить(Строка); + КонецЕсли; Иначе Строка.Представление = Выборка.Представление; Строка.ЭтоЗаявление = Выборка.ЭтоЗаявление; @@ -1496,10 +1584,28 @@ Сертификаты = Новый Массив; - Выборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Описание, "СертификатыШифрования").Выбрать(); - Пока Выборка.Следующий() Цикл + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СертификатыШифрования.Представление, + | СертификатыШифрования.Отпечаток, + | СертификатыШифрования.Сертификат + |ИЗ + | РегистрСведений.СертификатыШифрования КАК СертификатыШифрования + |ГДЕ + | СертификатыШифрования.ЗашифрованныйОбъект = &ЗашифрованныйОбъект"; + + Запрос.УстановитьПараметр("ЗашифрованныйОбъект", Описание); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл СвойстваСертификата = Новый Структура("Отпечаток, Представление, Сертификат"); - ЗаполнитьЗначенияСвойств(СвойстваСертификата, Выборка); + ЗаполнитьЗначенияСвойств(СвойстваСертификата, ВыборкаДетальныеЗаписи); СвойстваСертификата.Сертификат = СвойстваСертификата.Сертификат.Получить(); Сертификаты.Добавить(СвойстваСертификата); КонецЦикла; @@ -1528,16 +1634,22 @@ КонецЕсли; КонецЕсли; - Если ОтборСертификатов.Количество() > 0 Тогда - Для каждого ЭлементСписка Из ОтборСертификатов Цикл - Свойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( - ЭлементСписка.Значение, "Ссылка, Наименование, Отпечаток"); - - Если ОтпечаткиСертификатовНаКлиенте.Найти(Свойства.Отпечаток) <> Неопределено Тогда - СписокВыбора.Добавить(Свойства.Ссылка, Свойства.Наименование); - КонецЕсли; - КонецЦикла; - Возврат; + ОтборПоОрганизации = Ложь; + + Если ТипЗнч(ОтборСертификатов) = Тип("СписокЗначений") Тогда + Если ОтборСертификатов.Количество() > 0 Тогда + Для каждого ЭлементСписка Из ОтборСертификатов Цикл + Свойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( + ЭлементСписка.Значение, "Ссылка, Наименование, Отпечаток"); + + Если ОтпечаткиСертификатовНаКлиенте.Найти(Свойства.Отпечаток) <> Неопределено Тогда + СписокВыбора.Добавить(Свойства.Ссылка, Свойства.Наименование); + КонецЕсли; + КонецЦикла; + Возврат; + КонецЕсли; + ИначеЕсли Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(ТипЗнч(ОтборСертификатов)) Тогда + ОтборПоОрганизации = Истина; КонецЕсли; Если ОтборОтпечатков <> Неопределено Тогда @@ -1586,10 +1698,16 @@ | И Сертификаты.Пользователь = &Пользователь | И Сертификаты.Отозван = ЛОЖЬ | И Сертификаты.Отпечаток В(&Отпечатки) + | И ИСТИНА | |УПОРЯДОЧИТЬ ПО | Наименование"; + Если ОтборПоОрганизации Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИСТИНА", "Сертификаты.Организация = &Организация"); + Запрос.УстановитьПараметр("Организация", ОтборСертификатов); + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СписокВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); @@ -1759,5 +1877,4 @@ КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl index 3ec3ecfb8..197c80fed 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl @@ -1,10 +1,116 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции +// Только для внутреннего использования +Функция ЛичныеСертификаты(СвойстваСертификатовНаКлиенте, Отбор, Ошибка = "") Экспорт + + ТаблицаСвойствСертификатов = Новый ТаблицаЗначений; + ТаблицаСвойствСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(255))); + ТаблицаСвойствСертификатов.Колонки.Добавить("КемВыдан"); + ТаблицаСвойствСертификатов.Колонки.Добавить("Представление"); + ТаблицаСвойствСертификатов.Колонки.Добавить("НаКлиенте", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствСертификатов.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствСертификатов.Колонки.Добавить("ЭтоЗаявление", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствСертификатов.Колонки.Добавить("ВОблачномСервисе", Новый ОписаниеТипов("Булево")); + + Для Каждого СвойстваСертификата Из СвойстваСертификатовНаКлиенте Цикл + НоваяСтрока = ТаблицаСвойствСертификатов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваСертификата); + НоваяСтрока.НаКлиенте = Истина; + КонецЦикла; + + ТаблицаСвойствСертификатов.Индексы.Добавить("Отпечаток"); + + Если ЭлектроннаяПодпись.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда + + МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПолучениеСертификатов", Ложь, Ошибка); + Если МенеджерКриптографии <> Неопределено Тогда + + МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( + ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов( + ТаблицаСвойствСертификатов, МассивСертификатов, Истина); + КонецЕсли; + КонецЕсли; + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьВМоделиСервисаКлиентСервер"); + Если МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер.ИспользованиеВозможно() Тогда + + МассивСертификатов = Новый Массив; + МодульХранилищеСертификатов = ОбщегоНазначения.ОбщийМодуль("ХранилищеСертификатов"); + ПерсональныеСертификаты = МодульХранилищеСертификатов.Получить("ПерсональныеСертификаты"); + Для Каждого ПерсональныйСертификат Из ПерсональныеСертификаты Цикл + МассивСертификатов.Добавить(ПерсональныйСертификат); + КонецЦикла; + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов( + ТаблицаСвойствСертификатов, МассивСертификатов, Истина, , Истина); + КонецЕсли; + КонецЕсли; + + Возврат ОбработатьЛичныеСертификаты(ТаблицаСвойствСертификатов, Отбор); + +КонецФункции + +// Только для внутреннего использования +Функция ОбработатьЛичныеСертификаты(ТаблицаСвойствСертификатов, Отбор) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Отпечатки", ТаблицаСвойствСертификатов.Скопировать(, "Отпечаток")); + Запрос.Текст = + "ВЫБРАТЬ + | Отпечатки.Отпечаток + |ПОМЕСТИТЬ Отпечатки + |ИЗ + | &Отпечатки КАК Отпечатки + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Сертификаты.Отпечаток, + | Сертификаты.Наименование КАК Наименование, + | Сертификаты.Организация, + | Сертификаты.Ссылка, + | Сертификаты.ДанныеСертификата + |ИЗ + | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Отпечатки КАК Отпечатки + | ПО Сертификаты.Отпечаток = Отпечатки.Отпечаток + |ГДЕ + | НЕ Сертификаты.Программа = ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка) + | И НЕ Сертификаты.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И Сертификаты.Организация = &Организация"; + + Если Не Отбор.ТолькоСертификатыСЗаполненнойПрограммой Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕ Сертификаты.Программа = ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка)", "ИСТИНА"); + КонецЕсли; + Если Отбор.ВключатьСертификатыСПустымПользователем Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕ Сертификаты.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)", "ИСТИНА"); + КонецЕсли; + Если ЗначениеЗаполнено(Отбор.Организация) Тогда + Запрос.УстановитьПараметр("Организация", Отбор.Организация); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Сертификаты.Организация = &Организация", "ИСТИНА"); + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); + + МассивЛичныхСертификатов = Новый Массив; + + Пока Выборка.Следующий() Цикл + Строка = ТаблицаСвойствСертификатов.Найти(Выборка.Отпечаток, "Отпечаток"); + Если Строка <> Неопределено Тогда + СтруктураСертификата = Новый Структура("Ссылка, Наименование, Отпечаток, Данные, Организация"); + ЗаполнитьЗначенияСвойств(СтруктураСертификата, Выборка); + СтруктураСертификата.Данные = ПоместитьВоВременноеХранилище(Выборка.ДанныеСертификата, Неопределено); + МассивЛичныхСертификатов.Добавить(СтруктураСертификата); + КонецЕсли; + КонецЦикла; + + Возврат МассивЛичныхСертификатов; + +КонецФункции + // Только для внутреннего использования. Функция ПроверитьПодпись(АдресИсходныхДанных, АдресПодписи, ОписаниеОшибки) Экспорт @@ -175,15 +281,12 @@ Если Параметры.ЭлементДанныхДляСервера.Свойство("Объект") Тогда ВерсияОбъекта = Неопределено; Параметры.ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", ВерсияОбъекта); - Попытка - ЭлектроннаяПодпись.ДобавитьПодпись(Параметры.ЭлементДанныхДляСервера.Объект, СвойстваПодписи, - Параметры.ИдентификаторФормы, ВерсияОбъекта); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПредставлениеОшибки = ДобавитьПодпись(Параметры.ЭлементДанныхДляСервера.Объект, + СвойстваПодписи, Параметры.ИдентификаторФормы, ВерсияОбъекта); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ОшибкаНаСервере.Вставить("ОписаниеОшибки", ПредставлениеОшибки); Возврат Ложь; - КонецПопытки; + КонецЕсли; КонецЕсли; Иначе АдресРезультата = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРезультата, Параметры.ИдентификаторФормы); @@ -194,9 +297,27 @@ КонецФункции // Только для внутреннего использования. -Процедура ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта) Экспорт +Функция ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта) Экспорт - ЭлектроннаяПодпись.ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта); + ЭлектроннаяПодписьСлужебный.ЗарегистрироватьПодписаниеДанныхВЖурнале(СсылкаНаОбъект, СвойстваПодписи); + + ПредставлениеОшибки = ""; + Попытка + ЭлектроннаяПодпись.ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПредставлениеОшибки = НСтр("ru = 'При записи подписи возникла ошибка:'") + + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + + Возврат ПредставлениеОшибки; + +КонецФункции + +// Только для внутреннего использования. +Процедура ЗарегистрироватьПодписаниеДанныхВЖурнале(ЭлементДанных) Экспорт + + ЭлектроннаяПодписьСлужебный.ЗарегистрироватьПодписаниеДанныхВЖурнале(ЭлементДанных); КонецПроцедуры @@ -216,4 +337,191 @@ КонецФункции +Процедура НайтиУстановленныеПрограммы(Контекст) Экспорт + + Контекст.Вставить("Индекс", -1); + + НайтиУстановленныеПрограммыНаСервереЦиклНачало(Контекст); + +КонецПроцедуры + +Процедура НайтиУстановленныеПрограммыНаСервереЦиклНачало(Контекст) + + Если Контекст.Программы.Количество() <= Контекст.Индекс + 1 Тогда + // После цикла. + Возврат; + КонецЕсли; + Контекст.Индекс = Контекст.Индекс + 1; + ОписаниеПрограммы = Контекст.Программы.Получить(Контекст.Индекс); + + Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы); + + ОписанияПрограмм = Новый Массив; + ОписанияПрограмм.Добавить(Контекст.ОписаниеПрограммы); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОписанияПрограмм", ОписанияПрограмм); + ПараметрыВыполнения.Вставить("Индекс", -1); + ПараметрыВыполнения.Вставить("ПоказатьОшибку", Ложь); + ПараметрыВыполнения.Вставить("СвойстваОшибки", Новый Структура("Ошибки", Новый Массив)); + ПараметрыВыполнения.Вставить("ЭтоLinux", Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент()); + ПараметрыВыполнения.Вставить("Менеджер", Неопределено); + + Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); + СоздатьМенеджерКриптографииЦиклНачало(ПараметрыВыполнения, Контекст); + +КонецПроцедуры + +Процедура СоздатьМенеджерКриптографииЦиклНачало(Контекст, ПараметрыВыполнения) + + Контекст.Вставить("ОписаниеПрограммы", Контекст.ОписанияПрограмм[0]); + + СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы( + Контекст.ОписаниеПрограммы, + Контекст.ЭтоLinux, + Контекст.СвойстваОшибки.Ошибки, + Ложь); + + Если СвойстваПрограммы = Неопределено Тогда + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + Попытка + ИнформацияМодуля = СредстваКриптографии.ПолучитьИнформациюМодуляКриптографии( + СвойстваПрограммы.ИмяПрограммы, + СвойстваПрограммы.ПутьКПрограмме, + СвойстваПрограммы.ТипПрограммы); + Исключение + ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Контекст.СвойстваОшибки.Ошибки, + Неопределено, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + Истина, Истина, Истина); + ТекстОшибки = НСтр("ru = 'Не установлена на сервере.'") + " " + Контекст.СвойстваОшибки.Ошибки[0].Описание; + ОбновитьЗначение(Контекст.ОписаниеПрограммы.РезультатПроверкиНаСервере, ТекстОшибки); + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецПопытки; + + Если ИнформацияМодуля = Неопределено Тогда + ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииПрограммаНеНайдена( + Контекст.ОписаниеПрограммы, Контекст.Ошибки, Истина); + + Менеджер = Неопределено; + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + Если Не Контекст.ЭтоLinux Тогда + ИмяПрограммыПолученное = ИнформацияМодуля.Имя; + + ИмяПрограммыСовпадает = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииИмяПрограммыСовпадает( + Контекст.ОписаниеПрограммы, ИмяПрограммыПолученное, Контекст.СвойстваОшибки.Ошибки, Истина); + + Если Не ИмяПрограммыСовпадает Тогда + Менеджер = Неопределено; + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецЕсли; + КонецЕсли; + + Попытка + Менеджер = Новый МенеджерКриптографии( + СвойстваПрограммы.ИмяПрограммы, + СвойстваПрограммы.ПутьКПрограмме, + СвойстваПрограммы.ТипПрограммы); + Исключение + ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Контекст.СвойстваОшибки.Ошибки, + Неопределено, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + Истина, Истина, Истина); + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецПопытки; + + АлгоритмыУстановлены = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииАлгоритмыУстановлены( + Контекст.ОписаниеПрограммы, Менеджер, Контекст.СвойстваОшибки.Ошибки); + + Если Не АлгоритмыУстановлены Тогда + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОбновитьЗначение(Контекст.ОписаниеПрограммы.РезультатПроверкиНаСервере, ""); + ОбновитьЗначение(Контекст.ОписаниеПрограммы.Установлена, Истина); + + НайтиУстановленныеПрограммыНаСервереЦиклНачало(ПараметрыВыполнения); + +КонецПроцедуры + +Процедура ОбновитьЗначение(СтароеЗначение, НовоеЗначение) + + Если СтароеЗначение <> НовоеЗначение Тогда + СтароеЗначение = НовоеЗначение; + КонецЕсли; + +КонецПроцедуры + +// Для процедуры НайтиУстановленныеПрограммы. +Функция ЗаполнитьСписокПрограммДляПоиска(ОписаниеПрограмм) Экспорт + + ПоставляемыеНастройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); + + ОбновленныеОписанияПрограмм = Новый Массив; + + МассивИсключений = Новый Массив; + МассивИсключений.Добавить("Установлена"); + МассивИсключений.Добавить("Ссылка"); + МассивИсключений.Добавить("РезультатПроверкиНаКлиенте"); + МассивИсключений.Добавить("РезультатПроверкиНаСервере"); + + Для Каждого ОписаниеПрограммы Из ОписаниеПрограмм Цикл + Отбор = Новый Структура; + Отбор.Вставить("ИмяПрограммы", ОписаниеПрограммы.ИмяПрограммы); + Отбор.Вставить("ТипПрограммы", ОписаниеПрограммы.ТипПрограммы); + + Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); + Если Строки.Количество() = 0 Тогда + НовоеОписаниеПрограммы = РасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(НовоеОписаниеПрограммы, ОписаниеПрограммы); + ОбновленныеОписанияПрограмм.Добавить(НовоеОписаниеПрограммы); + Иначе + Для Каждого КлючИЗначение Из ОписаниеПрограммы Цикл + Если МассивИсключений.Найти(КлючИЗначение.Ключ) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Если КлючИЗначение.Значение <> Неопределено Тогда + ОбновитьЗначение(Строки[0][КлючИЗначение.Ключ], КлючИЗначение.Значение); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Для Каждого ПоставляемаяПрограмма Из ПоставляемыеНастройки Цикл + ОписаниеПрограммы = РасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(ОписаниеПрограммы, ПоставляемаяПрограмма); + ОбновленныеОписанияПрограмм.Добавить(ОписаниеПрограммы); + КонецЦикла; + + Возврат ОбновленныеОписанияПрограмм; + +КонецФункции + +// Для процедуры НайтиУстановленныеПрограммы. +Функция РасширенноеОписаниеПрограммы() + + ОписаниеПрограммы = ЭлектроннаяПодпись.НовоеОписаниеПрограммы(); + ОписаниеПрограммы.Вставить("Ссылка", Неопределено); + ОписаниеПрограммы.Вставить("Установлена", Ложь); + ОписаниеПрограммы.Вставить("РезультатПроверкиНаКлиенте", ""); + ОписаниеПрограммы.Вставить("РезультатПроверкиНаСервере", Неопределено); + + Возврат ОписаниеПрограммы; + +КонецФункции + +Функция ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Экспорт + + Возврат ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса(); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl index 11f34fb12..87352d221 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl @@ -1,10 +1,178 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции +// Продолжение процедуры ДатаПодписания. +Процедура ДатаПодписанияПослеЧтенияВБуферДвоичныхДанных(БуферДанныхПодписи, Контекст) Экспорт + + ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписанияУниверсальная(БуферДанныхПодписи); + + Если ДатаПодписания = Неопределено Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Неопределено); + Возврат; + КонецЕсли; + + Если Контекст.ПривестиКЧасовомуПоясуСеанса Тогда + ДатаПодписания = ДатаПодписания + (ОбщегоНазначенияКлиент.ДатаСеанса() + - ОбщегоНазначенияКлиент.ДатаУниверсальная()); + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, ДатаПодписания); + +КонецПроцедуры + +// Продолжение процедуры НайтиДействительныеЛичныеСертификаты. +Процедура НайтиДействительныеЛичныеСертификаты(Оповещение, Отбор = Неопределено) Экспорт + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Оповещение); + + Если Отбор = Неопределено Тогда + Отбор = Новый Структура; + КонецЕсли; + + Если Не Отбор.Свойство("ПроверятьСрокДействия") Тогда + Отбор.Вставить("ПроверятьСрокДействия", Истина); + КонецЕсли; + + Если Не Отбор.Свойство("ТолькоСертификатыСЗаполненнойПрограммой") Тогда + Отбор.Вставить("ТолькоСертификатыСЗаполненнойПрограммой", Истина); + КонецЕсли; + + Если Не Отбор.Свойство("ВключатьСертификатыСПустымПользователем") Тогда + Отбор.Вставить("ВключатьСертификатыСПустымПользователем", Истина); + КонецЕсли; + + Если Не Отбор.Свойство("Организация") Тогда + Отбор.Вставить("Организация", Неопределено); + КонецЕсли; + + ПараметрыОповещения.Вставить("Отбор", Отбор); + + Оповещение = Новый ОписаниеОповещения("НайтиДействительныеЛичныеСертификатыПослеПолученияПодписейНаКлиенте", ЭтотОбъект, ПараметрыОповещения); + ПолучитьСвойстваСертификатовНаКлиенте(Оповещение, Не Отбор.ПроверятьСрокДействия, Истина); + +КонецПроцедуры + +// Продолжение процедуры НайтиДействительныеЛичныеСертификаты. +Процедура НайтиДействительныеЛичныеСертификатыПослеПолученияПодписейНаКлиенте(Результат, ДополнительныеПараметры) Экспорт + + ЛичныеСертификаты = ЭлектроннаяПодписьСлужебныйВызовСервера.ЛичныеСертификаты(Результат.СвойстваСертификатовНаКлиенте, ДополнительныеПараметры.Отбор); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, ЛичныеСертификаты); + +КонецПроцедуры + +// Продолжение процедуры НайтиУстановленныеПрограммы. +Процедура НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм, ПроверятьНаСервере) Экспорт + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Программы", ЭлектроннаяПодписьСлужебныйВызовСервера.ЗаполнитьСписокПрограммДляПоиска(ОписаниеПрограмм)); + ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Оповещение); + Если ПроверятьНаСервере = Неопределено Тогда + ОбщиеНастройки = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); + ПроверятьНаСервере = ОбщиеНастройки.ПроверятьЭлектронныеПодписиНаСервере + Или ОбщиеНастройки.СоздаватьЭлектронныеПодписиНаСервере; + КонецЕсли; + ПараметрыОповещения.Вставить("ПроверятьНаСервере", ПроверятьНаСервере); + + Оповещение = Новый ОписаниеОповещения("НайтиУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект, ПараметрыОповещения); + + ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина, Оповещение); + +КонецПроцедуры + +// Продолжение процедуры НайтиУстановленныеПрограммы. +Процедура НайтиУстановленныеПрограммыПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт + + Если Не Подключено Тогда + Возврат; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Индекс", -1); + Контекст.Вставить("Программы", ДополнительныеПараметры.Программы); + Контекст.Вставить("ПроверятьНаСервере", ДополнительныеПараметры.ПроверятьНаСервере); + Контекст.Вставить("ОповещениеОЗавершении", ДополнительныеПараметры.ОповещениеОЗавершении); + + НайтиУстановленныеПрограммыЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры НайтиУстановленныеПрограммы. +Процедура НайтиУстановленныеПрограммыЦиклНачало(Контекст) + + Если Контекст.Программы.Количество() <= Контекст.Индекс + 1 Тогда + // После цикла. + ОповещениеОЗавершении = Контекст.ОповещениеОЗавершении; + Если Контекст.ПроверятьНаСервере Тогда + Контекст.ПараметрыВыполнения.Вставить("Менеджер", Неопределено); + Контекст.ПараметрыВыполнения.Вставить("Оповещение", Неопределено); + Контекст.Вставить("ОповещениеОЗавершении", Неопределено); + ЭлектроннаяПодписьСлужебныйВызовСервера.НайтиУстановленныеПрограммы(Контекст); + КонецЕсли; + ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Контекст.Программы); + Возврат; + КонецЕсли; + Контекст.Индекс = Контекст.Индекс + 1; + ОписаниеПрограммы = Контекст.Программы.Получить(Контекст.Индекс); + + Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы); + + ОписанияПрограмм = Новый Массив; + ОписанияПрограмм.Добавить(Контекст.ОписаниеПрограммы); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОписанияПрограмм", ОписанияПрограмм); + ПараметрыВыполнения.Вставить("Индекс", -1); + ПараметрыВыполнения.Вставить("ПоказатьОшибку", Ложь); + ПараметрыВыполнения.Вставить("СвойстваОшибки", Новый Структура("Ошибки", Новый Массив)); + ПараметрыВыполнения.Вставить("ЭтоLinux", Не ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент()); + ПараметрыВыполнения.Вставить("Менеджер", Неопределено); + ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения( + "НайтиУстановленныеПрограммыЦиклПродолжение", ЭтотОбъект, Контекст)); + + Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); + СоздатьМенеджерКриптографииЦиклНачало(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры НайтиУстановленныеПрограммы. +Процедура НайтиУстановленныеПрограммыЦиклПродолжение(Менеджер, Контекст) Экспорт + + ОписаниеПрограммы = Контекст.ОписаниеПрограммы; + Ошибки = Контекст.ПараметрыВыполнения.СвойстваОшибки.Ошибки; + + Если Менеджер <> Неопределено Тогда + ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверкиНаКлиенте, ""); + ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина); + НайтиУстановленныеПрограммыЦиклНачало(Контекст); + Возврат; + КонецЕсли; + + Для каждого Ошибка Из Ошибки Цикл + Прервать; + КонецЦикла; + + Если Ошибка.НеУказанПуть Тогда + ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверкиНаКлиенте, НСтр("ru = 'Не указан путь к программе.'")); + ОбновитьЗначение(ОписаниеПрограммы.Установлена, ""); + Иначе + ТекстОшибки = НСтр("ru = 'Не установлена на компьютере.'") + " " + Ошибка.Описание; + ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверкиНаКлиенте, ТекстОшибки); + ОбновитьЗначение(ОписаниеПрограммы.Установлена, Ложь); + КонецЕсли; + + НайтиУстановленныеПрограммыЦиклНачало(Контекст); + +КонецПроцедуры + +// Для процедуры НайтиУстановленныеПрограммы. +Процедура ОбновитьЗначение(СтароеЗначение, НовоеЗначение) + + Если СтароеЗначение <> НовоеЗначение Тогда + СтароеЗначение = НовоеЗначение; + КонецЕсли; + +КонецПроцедуры + // Открывает форму просмотра данных сертификата. // // Параметры: @@ -124,7 +292,6 @@ КонецПроцедуры - // Сохраняет сертификат в файл на диск. // // Параметры: @@ -238,7 +405,6 @@ КонецПроцедуры - // Сохраняет запрос на сертификат в файл на диск. // // Параметры: @@ -323,7 +489,6 @@ КонецПроцедуры - // Сохраняет подпись на диск Процедура СохранитьПодпись(АдресПодписи) Экспорт @@ -455,7 +620,7 @@ // Продолжение процедуры ПолучитьСертификатПоОтпечатку. Процедура ПолучитьСертификатПоОтпечаткуПослеОшибкиПолученияХранилища(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - Если Контекст.ПоказатьОшибку Тогда + Если Контекст.ПоказатьОшибку = Истина Тогда Возврат; КонецЕсли; @@ -479,7 +644,7 @@ // Продолжение процедуры ПолучитьСертификатПоОтпечатку. Процедура ПолучитьСертификатПоОтпечаткуПослеОшибкиПоиска(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - Если Контекст.ПоказатьОшибку Тогда + Если Контекст.ПоказатьОшибку = Истина Тогда Возврат; КонецЕсли; @@ -786,16 +951,26 @@ МенеджерКриптографии = Неопределено; КонецЕсли; - ДатаПодписания = ЭлектроннаяПодписьКлиент.ДатаПодписания(Контекст.ДанныеПодписи); + Контекст.Вставить("Сертификат", Сертификат); + Контекст.Вставить("МенеджерКриптографии", МенеджерКриптографии); + + ЭлектроннаяПодписьКлиент.ДатаПодписания( + Новый ОписаниеОповещения("ПроверитьПодписьНаКлиентеПослеПолученияДатыПодписания", ЭтотОбъект, Контекст), + Контекст.ДанныеПодписи); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьНаКлиентеПослеПолученияДатыПодписания(ДатаПодписания, Контекст) Экспорт + Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда ДатаПодписания = Контекст.НаДату; КонецЕсли; - ПроверитьСертификат(Контекст.Оповещение, Сертификат, МенеджерКриптографии, ДатаПодписания); + ПроверитьСертификат(Контекст.Оповещение, Контекст.Сертификат, Контекст.МенеджерКриптографии, ДатаПодписания); КонецПроцедуры - // Проверяет действительность сертификата криптографии. // // Параметры: @@ -1049,7 +1224,7 @@ Если Не Подключено Тогда ТекстОшибки = - НСтр("ru = 'В обозреватель интернет требуется установить расширение + НСтр("ru = 'В браузере требуется установить расширение |для работы с электронной подписью и шифрованием.'"); СвойстваОшибки.Вставить("Описание", ТекстОшибки); @@ -1084,7 +1259,9 @@ Контекст.Вставить("Менеджер", Неопределено); - Если ОписанияПрограмм = Неопределено Или ОписанияПрограмм.Количество() = 0 Тогда + Если ОписанияПрограмм = Неопределено + Или ОписанияПрограмм.Количество() = 0 Тогда + СоздатьМенеджерКриптографииПослеЦикла(Контекст); Возврат; КонецЕсли; @@ -1220,7 +1397,7 @@ СвойстваОшибки.Вставить("Описание", ТекстОшибки); СвойстваОшибки.Общая = Истина; СвойстваОшибки.КАдминистратору = Истина; - Если Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоПолноправныйПользователь Тогда + Если Не СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоПолноправныйПользователь Тогда ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'"); КонецЕсли; СвойстваОшибки.Вставить("Инструкция", Истина); @@ -1305,8 +1482,8 @@ Если Назначение = "ЗаявлениеНаВыпускСертификата" Тогда ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", ПараметрыСоздания.ВЛичныйСписок); ПараметрыФормы.Вставить("Организация", ПараметрыСоздания.Организация); - ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата", - ПараметрыФормы); + ИмяОбработкиЗаявления = "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"; + ОткрытьФорму(ИмяОбработкиЗаявления, ПараметрыФормы); Возврат; КонецЕсли; @@ -1566,6 +1743,7 @@ ПараметрыФормы.Вставить("ПоказатьИнструкцию", Ложь); ПараметрыФормы.Вставить("ПоказатьПереходКНастройкеПрограмм", Ложь); ПараметрыФормы.Вставить("ПоказатьУстановкуРасширения", Ложь); + ПараметрыФормы.Вставить("НеподписанныеДанные"); Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДополнительныеПараметры); @@ -1914,12 +2092,15 @@ ПерсональныеНастройки = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки(); СохранятьВсеПодписи = ПерсональныеНастройки.ДействияПриСохраненииСЭП = "СохранятьВсеПодписи"; + СохранятьСертификатВместеСПодписью = ПерсональныеНастройки.СохранятьСертификатВместеСПодписью; СерверныеПараметры = Новый Структура; СерверныеПараметры.Вставить("ЗаголовокДанных", НСтр("ru = 'Данные'")); СерверныеПараметры.Вставить("ПоказатьКомментарий", Ложь); ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных); + Контекст.Вставить("СохранятьСертификатВместеСПодписью", СохранятьСертификатВместеСПодписью); + СерверныеПараметры.Вставить("СохранятьВсеПодписи", СохранятьВсеПодписи); СерверныеПараметры.Вставить("Объект", ОписаниеДанных.Объект); @@ -2137,6 +2318,92 @@ ПолучитьФайл(Контекст.ОписаниеПодписи.АдресПодписи, СоставИмениФайлаПодписи.Имя); КонецЕсли; + Если Контекст.СохранятьСертификатВместеСПодписью Тогда + СохранитьДанныеСертификатаВместеСПодписьюЦиклНачало(Контекст); + Иначе + СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. +Процедура СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст) + + Если Контекст.Подключено Тогда + Контекст.Вставить("ПолноеИмяФайлаСертификата", Контекст.ПутьКФайлам + Контекст.ИмяФайлаСертификата); + Иначе + Контекст.Вставить("ПолноеИмяФайлаСертификата", Контекст.ИмяФайлаСертификата); + КонецЕсли; + + Если Контекст.ИменаФайлов[Контекст.ИмяФайлаСертификата] <> Неопределено Тогда + СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла(Истина, Контекст); + + ИначеЕсли Контекст.Подключено Тогда + Файл = Новый Файл; + Файл.НачатьИнициализацию(Новый ОписаниеОповещения( + "СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеИнициализацииФайла", ЭтотОбъект, Контекст), + Контекст.ПолноеИмяФайлаСертификата); + Иначе + СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеИнициализацииФайла(Ложь, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. +Процедура СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеИнициализацииФайла(Файл, Контекст) Экспорт + + Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения( + "СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. +Процедура СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла(Существует, Контекст) Экспорт + + Если Не Существует Тогда + СохранитьДанныеСертификатаВместеСПодписьюЦиклПослеВнутреннегоЦикла(Контекст); + Возврат; + КонецЕсли; + + Контекст.ИмяФайлаСертификата = Контекст.ИмяФайлаСертификатаБезРасширения + + " (" + Строка(Контекст.Счетчик) + ")" + "." + Контекст.ОписаниеПодписи.РасширениеСертификата; + + Контекст.ИмяФайлаСертификата = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Контекст.ИмяФайлаСертификата); + + СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. +Процедура СохранитьДанныеСертификатаВместеСПодписьюЦиклНачало(Контекст) + + Контекст.Вставить("ИмяФайлаСертификата", ""); + + Контекст.ИмяФайлаСертификата = Контекст.СоставИмениФайлаДанных.ИмяБезРасширения + " - " + + Строка(Контекст.ОписаниеПодписи.КомуВыданСертификат) + "." + Контекст.ОписаниеПодписи.РасширениеСертификата; + + Контекст.ИмяФайлаСертификата = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Контекст.ИмяФайлаСертификата); + СоставИмениФайлаСертификата = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Контекст.ИмяФайлаСертификата); + Контекст.Вставить("ИмяФайлаСертификатаБезРасширения", СоставИмениФайлаСертификата.ИмяБезРасширения); + + СохранитьДанныеСертификатаВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст); + +КонецПроцедуры + +// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. +Процедура СохранитьДанныеСертификатаВместеСПодписьюЦиклПослеВнутреннегоЦикла(Контекст) + + СоставИмениФайлаСертификата = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Контекст.ПолноеИмяФайлаСертификата); + Контекст.ИменаФайлов.Вставить(СоставИмениФайлаСертификата.Имя, Ложь); + + Если Контекст.Подключено Тогда + Описание = Новый ОписаниеПередаваемогоФайла(СоставИмениФайлаСертификата.Имя, Контекст.ОписаниеПодписи.АдресСертификата); + Контекст.ПолучаемыеФайлы.Добавить(Описание); + Иначе + // Сохранение Файла из базы данных на диск. + ПолучитьФайл(Контекст.ОписаниеПодписи.АдресСертификата, СоставИмениФайлаСертификата.Имя); + КонецЕсли; + СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст); КонецПроцедуры @@ -2234,7 +2501,7 @@ Новый ОписаниеОповещения("СохранитьДанныеВместеСПодписьюПослеЗакрытияОтчета", ЭтотОбъект, Контекст)); КонецПроцедуры - + // Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью. Процедура СохранитьДанныеВместеСПодписьюПослеЗакрытияОтчета(Результат, Контекст) Экспорт @@ -2244,7 +2511,6 @@ КонецПроцедуры - // Только для внутреннего использования. Процедура ОткрытьИнструкциюПоРаботеСПрограммами() Экспорт @@ -2655,7 +2921,9 @@ // Только для внутреннего использования. Процедура ВыполнитьНаСтороне(Оповещение, Операция, СторонаВыполнения, ПараметрыВыполнения) Экспорт - Контекст = Новый Структура("ОписаниеДанных, Форма, ИдентификаторФормы, ЗначениеПароля, СертификатВерен"); + Контекст = Новый Структура("ОписаниеДанных, Форма, ИдентификаторФормы, ЗначениеПароля, + |СертификатВерен, СертификатАдрес, ТекущийСписокПредставлений, ПолноеПредставлениеДанных"); + ЗаполнитьЗначенияСвойств(Контекст, ПараметрыВыполнения); Контекст.Вставить("Оповещение", Оповещение); @@ -3054,6 +3322,8 @@ ЭлементДанных.Вставить("СвойстваПодписи", СвойстваПодписи); Если Не ЭлементДанных.Свойство("Объект") Тогда + ЭлектроннаяПодписьСлужебныйВызовСервера.ЗарегистрироватьПодписаниеДанныхВЖурнале( + СвойстваТекущегоЭлементаДанных(Контекст, СвойстваПодписи.ДатаПодписи)); ВыполнитьНаСторонеЦиклНачало(Контекст); Возврат; КонецЕсли; @@ -3062,24 +3332,23 @@ Если Контекст.НаСторонеКлиента Тогда ВерсияОбъекта = Неопределено; ЭлементДанных.Свойство("ВерсияОбъекта", ВерсияОбъекта); - Попытка - ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьПодпись(ЭлементДанных.Объект, - СвойстваПодписи, Контекст.ИдентификаторФормы, ВерсияОбъекта); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПредставлениеОшибки = ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьПодпись( + ЭлементДанных.Объект, СвойстваПодписи, Контекст.ИдентификаторФормы, ВерсияОбъекта); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда ЭлементДанных.Удалить("СвойстваПодписи"); - ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", - НСтр("ru = 'При записи подписи возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ПредставлениеОшибки); ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); Возврат; - КонецПопытки; + КонецЕсли; КонецЕсли; ОповеститьОбИзменении(ЭлементДанных.Объект); ВыполнитьНаСторонеЦиклНачало(Контекст); Возврат; КонецЕсли; + ЭлектроннаяПодписьСлужебныйВызовСервера.ЗарегистрироватьПодписаниеДанныхВЖурнале( + СвойстваТекущегоЭлементаДанных(Контекст, СвойстваПодписи.ДатаПодписи)); + ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных); ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения( @@ -3219,6 +3488,33 @@ КонецПроцедуры +// Только для внутреннего использования. +Функция СвойстваТекущегоЭлементаДанных(ПараметрыВыполнения, ДатаПодписи = '00010101') Экспорт + + Если ПараметрыВыполнения.ОписаниеДанных.Свойство("Данные") Тогда + ПредставлениеЭлементаДанных = ПараметрыВыполнения.ТекущийСписокПредставлений[0].Значение; + Иначе + ПредставлениеЭлементаДанных = ПараметрыВыполнения.ТекущийСписокПредставлений[ + ПараметрыВыполнения.ОписаниеДанных.НаборДанных.Найти( + ПараметрыВыполнения.ОписаниеДанных.ТекущийЭлементНабораДанных)].Значение; + КонецЕсли; + + Если ТипЗнч(ПредставлениеЭлементаДанных) = Тип("ОписаниеОповещения") Тогда + ПредставлениеЭлементаДанных = ПараметрыВыполнения.ПолноеПредставлениеДанных; + КонецЕсли; + + СвойстваЭлементаДанных = Новый Структура; + СвойстваПодписи = Новый Структура; + СвойстваПодписи.Вставить("Сертификат", ПараметрыВыполнения.СертификатАдрес); + СвойстваПодписи.Вставить("ДатаПодписи", ДатаПодписи); + + СвойстваЭлементаДанных.Вставить("СвойстваПодписи", СвойстваПодписи); + СвойстваЭлементаДанных.Вставить("ПредставлениеДанных", ПредставлениеЭлементаДанных); + + Возврат СвойстваЭлементаДанных; + +КонецФункции + // Только для внутреннего использования. Процедура ПолучитьДанныеИзОписанияДанных(Оповещение, Форма, ОписаниеДанных, ИсточникДанных, ДляСтороныКлиента) Экспорт @@ -3553,7 +3849,7 @@ Процедура НачатьПодписаниеСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ПараметрыРаботыКлиента.ТипыПрограммЭлектроннойПодписи[ИмяКриптопровайдера]; @@ -3770,7 +4066,7 @@ Процедура НачатьПроверкуПодписиСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ПараметрыРаботыКлиента.ТипыПрограммЭлектроннойПодписи[ИмяКриптопровайдера]; @@ -3921,7 +4217,7 @@ ЗавершитьОперациюСОшибкой( Контекст, - НСтр("ru = 'Подпись не верна (SignatureValue не корректно.'")); + НСтр("ru = 'Подпись не верна (SignatureValue некорректно.'")); Иначе @@ -4018,21 +4314,27 @@ ДвоичныеДанные = Base64Значение(Контекст.СертификатКриптографииBase64); - ДатаПодписания = ЭлектроннаяПодписьКлиент.ДатаПодписания(ДвоичныеДанные); - Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда - ДатаПодписания = Неопределено; - КонецЕсли; - - ВозвращаемоеЗначение = Новый Структура; - ВозвращаемоеЗначение.Вставить("Сертификат", Контекст.СертификатКриптографии); - ВозвращаемоеЗначение.Вставить("ДатаПодписания", ДатаПодписания); - - ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, ВозвращаемоеЗначение); + ЭлектроннаяПодписьКлиент.ДатаПодписания( + Новый ОписаниеОповещения("Проверка_ПослеВыполненияHash_ПодписываемыйТегПослеПолученияДатыПодписания", ЭтотОбъект, Контекст), ДвоичныеДанные); КонецЕсли; КонецПроцедуры +Процедура Проверка_ПослеВыполненияHash_ПодписываемыйТегПослеПолученияДатыПодписания(ДатаПодписания, Контекст) Экспорт + + Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда + ДатаПодписания = Неопределено; + КонецЕсли; + + ВозвращаемоеЗначение = Новый Структура; + ВозвращаемоеЗначение.Вставить("Сертификат", Контекст.СертификатКриптографии); + ВозвращаемоеЗначение.Вставить("ДатаПодписания", ДатаПодписания); + + ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, ВозвращаемоеЗначение); + +КонецПроцедуры + Процедура НачатьПолучениеТекстаОшибки(НачалоОписанияТекстаОшибки, Контекст) @@ -4339,7 +4641,7 @@ КонецФункции // Продолжение процедуры ПроверитьПодпись. -Процедура ПроверитьПодписьВМоделиСервиса(Контекст) Экспорт +Процедура ПроверитьПодписьВМоделиСервиса(Контекст) Если Не ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере Тогда diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl index 2d93735ef..20cc1483d 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Из переданных имен файлов выделяются имена файлов данных и имена файлов их подписей. @@ -424,37 +419,24 @@ КонецФункции // Только для внутреннего использования. -Функция ДатаПодписанияУниверсальная(Подпись) Экспорт - -#Если ВебКлиент Тогда - СимволыПодписи = СимволыБайтДвоичныхДанных(Подпись); -#Иначе - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); - Подпись.Записать(ИмяВременногоФайла); - - ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла); - СимволыПодписи = ЧтениеТекста.Прочитать(); - - ЧтениеТекста.Закрыть(); - УдалитьФайлы(ИмяВременногоФайла); -#КонецЕсли +Функция ДатаПодписанияУниверсальная(БуферДвоичныхДанныхПодписи) Экспорт ДатаПодписания = Неопределено; - ЗаголовокДаты = Символ(15) + Символ(23) + Символ(13); - Позиция = СтрНайти(СимволыПодписи, ЗаголовокДаты); - Пока Позиция > 0 Цикл - ДатаСтрокой = Сред(СимволыПодписи, Позиция + 3, 12); // Дата в формате ASCII. - Если ЭтоЦифры(ДатаСтрокой) Тогда - Попытка - ДатаПодписания = Дата("20" + ДатаСтрокой); // Универсальное время. - Прервать; - Исключение - ДатаПодписания = Неопределено; - КонецПопытки; + Позиция = 0; + Для Каждого Байт Из БуферДвоичныхДанныхПодписи Цикл + Если Байт = 15 И ЭтоЗаголовокДаты(БуферДвоичныхДанныхПодписи, Позиция) Тогда + ДатаСтрокой = ДатаСтрокой(БуферДвоичныхДанныхПодписи, Позиция); + Если ЭтоЦифры(ДатаСтрокой) Тогда + Попытка + ДатаПодписания = Дата("20" + ДатаСтрокой); // Универсальное время. + Прервать; + Исключение + ДатаПодписания = Неопределено; + КонецПопытки; + КонецЕсли; КонецЕсли; - СимволыПодписи = Сред(СимволыПодписи, Позиция + 1); - Позиция = СтрНайти(СимволыПодписи, ЗаголовокДаты); + Позиция = Позиция + 1; КонецЦикла; Возврат ДатаПодписания; @@ -466,7 +448,8 @@ // Параметры: // Текст - Строка - текст XML, в котором выполняется поиск. // ИмяТега - Строка - тег, содержимое которого необходимо найти. -// ВключатьОткрывающийЗакрывающийТег - Булево - признак необходимости найденного тегом, по которому выполнялся поиск, по умолчанию Ложь. +// ВключатьОткрывающийЗакрывающийТег - Булево - признак необходимости найденного тегом, +// по которому выполнялся поиск, по умолчанию Ложь. // НомерПоПорядку - Число - позиция, с которой начинается поиск, по умолчанию 1. // // Возвращаемое значение: @@ -548,76 +531,6 @@ КонецФункции -// Для процедуры ДатаПодписанияУниверсальная. -Функция СимволыБайтДвоичныхДанных(ДвоичныеДанные) - - Строки = СтрРазделить(Base64Строка(ДвоичныеДанные), Символы.ПС, Ложь); - СимволыБайт = ""; - - ТекущийНомерСимвола = 0; - - Шаблон = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - Для Каждого Строка Из Строки Цикл - Строка = СокрП(Строка); - Пока СтрДлина(Строка) > 0 Цикл - Четверка = Лев(Строка, 4); - Строка = Сред(Строка, 5); - - КоличествоБайт = 1; - - Символ = Сред(Четверка, 1, 1); - Позиция = СтрНайти(Шаблон, Символ); - Если Позиция > 0 Тогда - Старшие6БитБайта1 = (Позиция - 1) * 4; - Иначе - Возврат ""; - КонецЕсли; - - Символ = Сред(Четверка, 2, 1); - Позиция = СтрНайти(Шаблон, Символ); - Если Позиция > 0 Тогда - Число2 = Позиция - 1; - ИначеЕсли Символ <> "=" И Символ <> "" Тогда - Возврат ""; - Иначе - Прервать; - КонецЕсли; - Младшие2БитаБайта1 = Цел(Число2 / 16); - СимволыБайт = СимволыБайт + Символ(Старшие6БитБайта1 + Младшие2БитаБайта1); - - Символ = Сред(Четверка, 3, 1); - Позиция = СтрНайти(Шаблон, Символ); - Если Позиция > 0 Тогда - Число3 = Позиция - 1; - ИначеЕсли Символ <> "=" И Символ <> "" Тогда - Возврат ""; - Иначе - Прервать; - КонецЕсли; - Старшие4БитаБайта2 = (Число2 - Младшие2БитаБайта1 * 16) * 16; - Младшие4БитаБайта2 = Цел(Число3 / 4); - СимволыБайт = СимволыБайт + Символ(Старшие4БитаБайта2 + Младшие4БитаБайта2); - - Символ = Сред(Четверка, 4, 1); - Позиция = СтрНайти(Шаблон, Символ); - Если Позиция > 0 Тогда - Младшие6БитБайта3 = Позиция - 1; - ИначеЕсли Символ <> "=" И Символ <> "" Тогда - Возврат ""; - Иначе - Прервать; - КонецЕсли; - Старшие2БитаБайта3 = (Число3 - Младшие4БитаБайта2 * 4) * 64; - СимволыБайт = СимволыБайт + Символ(Старшие2БитаБайта3 + Младшие6БитБайта3); - - КонецЦикла; - КонецЦикла; - - Возврат СимволыБайт; - -КонецФункции - // Для процедуры ДатаПодписанияУниверсальная. Функция ЭтоЦифры(Строка) @@ -632,4 +545,43 @@ КонецФункции +// Для процедуры ДатаПодписанияУниверсальная. +Функция ЭтоЗаголовокДаты(БуферДвоичныхДанных, Позиция) + + Если БуферДвоичныхДанных.Размер - Позиция < 3 Тогда + Возврат Ложь; + КонецЕсли; + + БуферЗаголовка = БуферДвоичныхДанных.Прочитать(Позиция, 3); + + Если БуферЗаголовка.Размер = 3 + И БуферЗаголовка[1] = 23 + И БуферЗаголовка[2] = 13 Тогда + + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Для процедуры ДатаПодписанияУниверсальная. +Функция ДатаСтрокой(БуферДвоичныхДанных, Позиция) + + ПредставлениеДаты = ""; + + Если БуферДвоичныхДанных.Размер - (Позиция + 3) < 12 Тогда + Возврат ПредставлениеДаты; + КонецЕсли; + + БуферДаты = БуферДвоичныхДанных.Прочитать(Позиция + 3, 12); + + Для Каждого Байт Из БуферДаты Цикл + ПредставлениеДаты = ПредставлениеДаты + Символ(Байт); + КонецЦикла; + + Возврат ПредставлениеДаты; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl index 55c66599c..627a68f4a 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl @@ -1,8 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Электронная подпись". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Только для внутреннего использования. @@ -18,7 +13,7 @@ ОбщиеНастройки.Вставить("ИспользоватьШифрование", Константы.ИспользоватьШифрование.Получить()); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() Или ОбщегоНазначения.ИнформационнаяБазаФайловая() И Не ОбщегоНазначенияКлиентСервер.КлиентПодключенЧерезВебСервер() Тогда @@ -44,7 +39,8 @@ И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") - И ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей")); + И ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") + И Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено); Запрос = Новый Запрос; Запрос.Текст = @@ -100,7 +96,7 @@ // Функция ТипыПрограммЭлектроннойПодписи() Экспорт - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Новый ФиксированноеСоответствие(Новый Соответствие); КонецЕсли; @@ -125,4 +121,37 @@ КонецФункции +Функция ТипыВладельцев(РегистрПодписей = Истина, ТолькоСсылки = Ложь) Экспорт + + МассивТипов = Новый Массив; + Если РегистрПодписей Тогда + Типы = Метаданные.РегистрыСведений.ЭлектронныеПодписи.Измерения.ПодписанныйОбъект.Тип.Типы(); + Иначе + Типы = Метаданные.РегистрыСведений.СертификатыШифрования.Измерения.ЗашифрованныйОбъект.Тип.Типы(); + КонецЕсли; + + МассивТипов = Новый Массив; + + Для Каждого Тип Из Типы Цикл + Если Тип = Тип("Неопределено") + Или Тип = Тип("Строка") + Или Тип = Тип("СправочникСсылка." + "ВерсииФайлов") Тогда + Продолжить; + КонецЕсли; + МассивТипов.Добавить(Тип); + Если Не ТолькоСсылки Тогда + ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + ИмяТипаОбъекта = СтрЗаменить(ПолноеИмя, ".", "Объект."); + Иначе + ИмяТипаОбъекта = СтрЗаменить(ПолноеИмя, ".", "Object."); + КонецЕсли; + МассивТипов.Добавить(Тип(ИмяТипаОбъекта)); + КонецЕсли; + КонецЦикла; + + Возврат МассивТипов; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonPictures/GoogleMaps/Picture.png b/SSL/src/CommonPictures/GoogleMaps/Picture.png deleted file mode 100644 index c9909f819..000000000 Binary files a/SSL/src/CommonPictures/GoogleMaps/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/GoogleMaps/Picture.zip b/SSL/src/CommonPictures/GoogleMaps/Picture.zip new file mode 100644 index 000000000..db75cef80 Binary files /dev/null and b/SSL/src/CommonPictures/GoogleMaps/Picture.zip differ diff --git a/SSL/src/CommonPictures/Skype/Picture.png b/SSL/src/CommonPictures/Skype/Picture.png deleted file mode 100644 index 08aaabe3a..000000000 Binary files a/SSL/src/CommonPictures/Skype/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Skype/Picture.zip b/SSL/src/CommonPictures/Skype/Picture.zip new file mode 100644 index 000000000..9e385f910 Binary files /dev/null and b/SSL/src/CommonPictures/Skype/Picture.zip differ diff --git a/SSL/src/CommonPictures/АрхивАнкета/Picture.png b/SSL/src/CommonPictures/АрхивАнкета/Picture.png deleted file mode 100644 index 5449f887b..000000000 Binary files a/SSL/src/CommonPictures/АрхивАнкета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/АрхивАнкета/Picture.zip b/SSL/src/CommonPictures/АрхивАнкета/Picture.zip new file mode 100644 index 000000000..2b1ade13d Binary files /dev/null and b/SSL/src/CommonPictures/АрхивАнкета/Picture.zip differ diff --git a/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.png b/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.png deleted file mode 100644 index 53290c4c8..000000000 Binary files a/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.zip b/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.zip new file mode 100644 index 000000000..510058779 Binary files /dev/null and b/SSL/src/CommonPictures/БыстрыеНастройкиОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступ/Picture.png b/SSL/src/CommonPictures/БыстрыйДоступ/Picture.png deleted file mode 100644 index d6bee1868..000000000 Binary files a/SSL/src/CommonPictures/БыстрыйДоступ/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступ/Picture.zip b/SSL/src/CommonPictures/БыстрыйДоступ/Picture.zip new file mode 100644 index 000000000..feeab1791 Binary files /dev/null and b/SSL/src/CommonPictures/БыстрыйДоступ/Picture.zip differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.png b/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.png deleted file mode 100644 index 9eacc4ef0..000000000 Binary files a/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.zip b/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.zip new file mode 100644 index 000000000..52f264431 Binary files /dev/null and b/SSL/src/CommonPictures/БыстрыйДоступДобавить/Picture.zip differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.png b/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.png deleted file mode 100644 index 830a8e0f7..000000000 Binary files a/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.zip b/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.zip new file mode 100644 index 000000000..a874c93bb Binary files /dev/null and b/SSL/src/CommonPictures/БыстрыйДоступСФлажком/Picture.zip differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.png b/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.png deleted file mode 100644 index a57774eec..000000000 Binary files a/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.zip b/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.zip new file mode 100644 index 000000000..45a664784 Binary files /dev/null and b/SSL/src/CommonPictures/БыстрыйДоступУдалить/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.png b/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.png deleted file mode 100644 index 1fdaa91e6..000000000 Binary files a/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.zip b/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.zip new file mode 100644 index 000000000..73c9f4549 Binary files /dev/null and b/SSL/src/CommonPictures/ВариантыОтчетовДоступныеВсемПользователям/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.png b/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.png deleted file mode 100644 index adfc96cad..000000000 Binary files a/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.zip b/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.zip new file mode 100644 index 000000000..1ba0fa725 Binary files /dev/null and b/SSL/src/CommonPictures/ВедущаяКонечнаяТочка/Picture.zip differ diff --git a/SSL/src/CommonPictures/Взаимодействия/Picture.png b/SSL/src/CommonPictures/Взаимодействия/Picture.png deleted file mode 100644 index e33c95117..000000000 Binary files a/SSL/src/CommonPictures/Взаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Взаимодействия/Picture.zip b/SSL/src/CommonPictures/Взаимодействия/Picture.zip new file mode 100644 index 000000000..d46aed113 Binary files /dev/null and b/SSL/src/CommonPictures/Взаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидСравнения/Picture.png b/SSL/src/CommonPictures/ВидСравнения/Picture.png deleted file mode 100644 index acf5df2f2..000000000 Binary files a/SSL/src/CommonPictures/ВидСравнения/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидСравнения/Picture.zip b/SSL/src/CommonPictures/ВидСравнения/Picture.zip new file mode 100644 index 000000000..44e6a0570 Binary files /dev/null and b/SSL/src/CommonPictures/ВидСравнения/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.png b/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.png deleted file mode 100644 index 25ad8f4e2..000000000 Binary files a/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.zip b/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.zip new file mode 100644 index 000000000..0af15d1dc Binary files /dev/null and b/SSL/src/CommonPictures/ВидыКонтактнойИнформации/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.png b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.png deleted file mode 100644 index de886e465..000000000 Binary files a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.zip b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.zip new file mode 100644 index 000000000..ca395369d Binary files /dev/null and b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.png b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.png deleted file mode 100644 index 9d77bcbc7..000000000 Binary files a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.zip b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.zip new file mode 100644 index 000000000..9f7dea32d Binary files /dev/null and b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКатегорий/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.png b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.png deleted file mode 100644 index 40cdab87e..000000000 Binary files a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.zip b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.zip new file mode 100644 index 000000000..cc8b89603 Binary files /dev/null and b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтКонтактов/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.png b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.png deleted file mode 100644 index 58319f904..000000000 Binary files a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.zip b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.zip new file mode 100644 index 000000000..95c550a7b Binary files /dev/null and b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтПредметовВзаимодействий/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.png b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.png deleted file mode 100644 index d70240b56..000000000 Binary files a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.zip b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.zip new file mode 100644 index 000000000..7adf8a445 Binary files /dev/null and b/SSL/src/CommonPictures/ВидыНавигацииПоВзаимодействиямОтРеквизитаПредмета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВидыОпераций/Picture.png b/SSL/src/CommonPictures/ВидыОпераций/Picture.png deleted file mode 100644 index 1fc4d4895..000000000 Binary files a/SSL/src/CommonPictures/ВидыОпераций/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВидыОпераций/Picture.zip b/SSL/src/CommonPictures/ВидыОпераций/Picture.zip new file mode 100644 index 000000000..faec1c4cb Binary files /dev/null and b/SSL/src/CommonPictures/ВидыОпераций/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.png b/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.png deleted file mode 100644 index cf09755c0..000000000 Binary files a/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.zip b/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.zip new file mode 100644 index 000000000..bd726b617 Binary files /dev/null and b/SSL/src/CommonPictures/ВнешняяСсылкаНаОбъектИнформационнойБазы/Picture.zip differ diff --git a/SSL/src/CommonPictures/Вопрос32/Picture.png b/SSL/src/CommonPictures/Вопрос32/Picture.png deleted file mode 100644 index 9bcce95ce..000000000 Binary files a/SSL/src/CommonPictures/Вопрос32/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Вопрос32/Picture.zip b/SSL/src/CommonPictures/Вопрос32/Picture.zip new file mode 100644 index 000000000..dc67202fb Binary files /dev/null and b/SSL/src/CommonPictures/Вопрос32/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.png b/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.png deleted file mode 100644 index 2ae0c4615..000000000 Binary files a/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.zip b/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.zip new file mode 100644 index 000000000..491a4ab98 Binary files /dev/null and b/SSL/src/CommonPictures/ВосклицательныйЗнакКрасный/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.png b/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.png deleted file mode 100644 index b14d9ed08..000000000 Binary files a/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.zip b/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.zip new file mode 100644 index 000000000..f2aa1e597 Binary files /dev/null and b/SSL/src/CommonPictures/ВосклицательныйЗнакСерый/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.png b/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.png deleted file mode 100644 index 8ae4176c9..000000000 Binary files a/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.zip b/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.zip new file mode 100644 index 000000000..a03213603 Binary files /dev/null and b/SSL/src/CommonPictures/ВставитьИзБуфераОбмена/Picture.zip differ diff --git a/SSL/src/CommonPictures/Встреча/Picture.png b/SSL/src/CommonPictures/Встреча/Picture.png deleted file mode 100644 index 3e336e690..000000000 Binary files a/SSL/src/CommonPictures/Встреча/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Встреча/Picture.zip b/SSL/src/CommonPictures/Встреча/Picture.zip new file mode 100644 index 000000000..3a7656210 Binary files /dev/null and b/SSL/src/CommonPictures/Встреча/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.png b/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.png deleted file mode 100644 index 2fc02a370..000000000 Binary files a/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.zip b/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.zip new file mode 100644 index 000000000..c0808cc87 Binary files /dev/null and b/SSL/src/CommonPictures/ВыбратьВариантОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.png b/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.png deleted file mode 100644 index 43f862f9f..000000000 Binary files a/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.zip b/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.zip new file mode 100644 index 000000000..7d47ebfae Binary files /dev/null and b/SSL/src/CommonPictures/ВыполнитьРегламентноеЗаданиеВручную/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.png b/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.png deleted file mode 100644 index 3e728964a..000000000 Binary files a/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.zip b/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.zip new file mode 100644 index 000000000..40e136807 Binary files /dev/null and b/SSL/src/CommonPictures/ВыравниваниеПоЛевомуКраю/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.png b/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.png deleted file mode 100644 index 8c7efd5b0..000000000 Binary files a/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.zip b/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.zip new file mode 100644 index 000000000..0de5b080f Binary files /dev/null and b/SSL/src/CommonPictures/ВыравниваниеПоПравомуКраю/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.png b/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.png deleted file mode 100644 index a811db437..000000000 Binary files a/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.zip b/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.zip new file mode 100644 index 000000000..6078afc2b Binary files /dev/null and b/SSL/src/CommonPictures/ВыравниваниеПоЦентру/Picture.zip differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.png b/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.png deleted file mode 100644 index 4df108b9e..000000000 Binary files a/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.zip b/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.zip new file mode 100644 index 000000000..5875ad637 Binary files /dev/null and b/SSL/src/CommonPictures/ВыравниваниеПоШирине/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаВезде/Picture.png b/SSL/src/CommonPictures/ГраницаВезде/Picture.png deleted file mode 100644 index 3c301ee3f..000000000 Binary files a/SSL/src/CommonPictures/ГраницаВезде/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаВезде/Picture.zip b/SSL/src/CommonPictures/ГраницаВезде/Picture.zip new file mode 100644 index 000000000..e21455156 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаВезде/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаВнутри/Picture.png b/SSL/src/CommonPictures/ГраницаВнутри/Picture.png deleted file mode 100644 index 3ef50c2b6..000000000 Binary files a/SSL/src/CommonPictures/ГраницаВнутри/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаВнутри/Picture.zip b/SSL/src/CommonPictures/ГраницаВнутри/Picture.zip new file mode 100644 index 000000000..cac80d3a6 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаВнутри/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаВокруг/Picture.png b/SSL/src/CommonPictures/ГраницаВокруг/Picture.png deleted file mode 100644 index 04d16e71b..000000000 Binary files a/SSL/src/CommonPictures/ГраницаВокруг/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаВокруг/Picture.zip b/SSL/src/CommonPictures/ГраницаВокруг/Picture.zip new file mode 100644 index 000000000..40f3180f4 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаВокруг/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаСверху/Picture.png b/SSL/src/CommonPictures/ГраницаСверху/Picture.png deleted file mode 100644 index dbed8a345..000000000 Binary files a/SSL/src/CommonPictures/ГраницаСверху/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаСверху/Picture.zip b/SSL/src/CommonPictures/ГраницаСверху/Picture.zip new file mode 100644 index 000000000..1b4373e37 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаСверху/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаСлева/Picture.png b/SSL/src/CommonPictures/ГраницаСлева/Picture.png deleted file mode 100644 index 320006f22..000000000 Binary files a/SSL/src/CommonPictures/ГраницаСлева/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаСлева/Picture.zip b/SSL/src/CommonPictures/ГраницаСлева/Picture.zip new file mode 100644 index 000000000..195aa8ac8 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаСлева/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаСнизу/Picture.png b/SSL/src/CommonPictures/ГраницаСнизу/Picture.png deleted file mode 100644 index dd8e18111..000000000 Binary files a/SSL/src/CommonPictures/ГраницаСнизу/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаСнизу/Picture.zip b/SSL/src/CommonPictures/ГраницаСнизу/Picture.zip new file mode 100644 index 000000000..dd302a4c4 Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаСнизу/Picture.zip differ diff --git a/SSL/src/CommonPictures/ГраницаСправа/Picture.png b/SSL/src/CommonPictures/ГраницаСправа/Picture.png deleted file mode 100644 index e04b138be..000000000 Binary files a/SSL/src/CommonPictures/ГраницаСправа/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ГраницаСправа/Picture.zip b/SSL/src/CommonPictures/ГраницаСправа/Picture.zip new file mode 100644 index 000000000..484bd99aa Binary files /dev/null and b/SSL/src/CommonPictures/ГраницаСправа/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif b/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif deleted file mode 100644 index fd636e679..000000000 Binary files a/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif and /dev/null differ diff --git a/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.zip b/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.zip new file mode 100644 index 000000000..ba4e35787 Binary files /dev/null and b/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.png deleted file mode 100644 index 1126ab107..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.zip b/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.zip new file mode 100644 index 000000000..2d633689b Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьКомплексныйВопрос/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png deleted file mode 100644 index d2949b0ae..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.zip b/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.zip new file mode 100644 index 000000000..2a0543fad Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png deleted file mode 100644 index bf43eb741..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.zip b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.zip new file mode 100644 index 000000000..35dc51fe4 Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьРодительский/Picture.png b/SSL/src/CommonPictures/ДобавитьРодительский/Picture.png deleted file mode 100644 index 03304877c..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьРодительский/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьРодительский/Picture.zip b/SSL/src/CommonPictures/ДобавитьРодительский/Picture.zip new file mode 100644 index 000000000..aa34237c6 Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьРодительский/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png deleted file mode 100644 index e9ce88532..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.zip b/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.zip new file mode 100644 index 000000000..07d5c208c Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png deleted file mode 100644 index d2cd7a363..000000000 Binary files a/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.zip b/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.zip new file mode 100644 index 000000000..d3437a30a Binary files /dev/null and b/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png deleted file mode 100644 index 5fb62338f..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.zip new file mode 100644 index 000000000..ef2e8f77c Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png deleted file mode 100644 index 29eda4a2b..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..8cabbc5f6 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png deleted file mode 100644 index 911868cda..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.zip new file mode 100644 index 000000000..4044b88c7 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png deleted file mode 100644 index a7c072c78..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.zip new file mode 100644 index 000000000..37236ec66 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png deleted file mode 100644 index 9808bcc23..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.zip new file mode 100644 index 000000000..a6c2de9f5 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png deleted file mode 100644 index c31009928..000000000 Binary files a/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.zip b/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.zip new file mode 100644 index 000000000..ddadd555f Binary files /dev/null and b/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png deleted file mode 100644 index 06418a2b4..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.zip new file mode 100644 index 000000000..9da1ba5db Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png deleted file mode 100644 index a241dc25d..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..76f37052b Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png deleted file mode 100644 index affa2a4a2..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.zip new file mode 100644 index 000000000..c8f7ab4d8 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png deleted file mode 100644 index c3416b9c8..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip new file mode 100644 index 000000000..ecf9698f8 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png deleted file mode 100644 index 8ec0b8df8..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip new file mode 100644 index 000000000..5a36809c6 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png deleted file mode 100644 index c852b516a..000000000 Binary files a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.zip new file mode 100644 index 000000000..8d6a036c8 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png deleted file mode 100644 index 889408115..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.zip new file mode 100644 index 000000000..c4754043c Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png deleted file mode 100644 index 2c5059b67..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..2e9c22675 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png deleted file mode 100644 index e50808a6a..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.zip new file mode 100644 index 000000000..f43396769 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png deleted file mode 100644 index 696924981..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.zip new file mode 100644 index 000000000..0eef561a7 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png deleted file mode 100644 index d237f33dd..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.zip new file mode 100644 index 000000000..37503e66b Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png deleted file mode 100644 index 1b17e500b..000000000 Binary files a/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.zip b/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.zip new file mode 100644 index 000000000..e78898ca6 Binary files /dev/null and b/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png b/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png deleted file mode 100644 index d48733b32..000000000 Binary files a/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.zip b/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.zip new file mode 100644 index 000000000..78a1e05aa Binary files /dev/null and b/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДополнительныеСведения/Picture.png b/SSL/src/CommonPictures/ДополнительныеСведения/Picture.png deleted file mode 100644 index 38948fcc4..000000000 Binary files a/SSL/src/CommonPictures/ДополнительныеСведения/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДополнительныеСведения/Picture.zip b/SSL/src/CommonPictures/ДополнительныеСведения/Picture.zip new file mode 100644 index 000000000..41e3fc810 Binary files /dev/null and b/SSL/src/CommonPictures/ДополнительныеСведения/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.png b/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.png deleted file mode 100644 index 9a7019f1d..000000000 Binary files a/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.zip b/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.zip new file mode 100644 index 000000000..e99dbcd69 Binary files /dev/null and b/SSL/src/CommonPictures/ДосьеУвеличениеПоказателя/Picture.zip differ diff --git a/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.png b/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.png deleted file mode 100644 index 90f18100f..000000000 Binary files a/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.zip b/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.zip new file mode 100644 index 000000000..fe9d41ce2 Binary files /dev/null and b/SSL/src/CommonPictures/ДосьеУменьшениеПоказателя/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗавершитьРаботу/Picture.zip b/SSL/src/CommonPictures/ЗавершитьРаботу/Picture.zip new file mode 100644 index 000000000..b51159a4f Binary files /dev/null and b/SSL/src/CommonPictures/ЗавершитьРаботу/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗавершитьРаботу/ЗавершитьРаботу.mdo b/SSL/src/CommonPictures/ЗавершитьРаботу/ЗавершитьРаботу.mdo new file mode 100644 index 000000000..7752f27cf --- /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 deleted file mode 100644 index 824eb3805..000000000 Binary files a/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.zip b/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.zip new file mode 100644 index 000000000..9d6fcdff5 Binary files /dev/null and b/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.png b/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.png deleted file mode 100644 index 5710ba6b8..000000000 Binary files a/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.zip b/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.zip new file mode 100644 index 000000000..b8ec15e13 Binary files /dev/null and b/SSL/src/CommonPictures/ЗакончитьРедактированиеФайла/Picture.zip differ diff --git a/SSL/src/CommonPictures/Заметка/Picture.png b/SSL/src/CommonPictures/Заметка/Picture.png deleted file mode 100644 index 03d5b73c3..000000000 Binary files a/SSL/src/CommonPictures/Заметка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Заметка/Picture.zip b/SSL/src/CommonPictures/Заметка/Picture.zip new file mode 100644 index 000000000..4fcdcaf0e Binary files /dev/null and b/SSL/src/CommonPictures/Заметка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗанятьФайл/Picture.png b/SSL/src/CommonPictures/ЗанятьФайл/Picture.png deleted file mode 100644 index adfc96cad..000000000 Binary files a/SSL/src/CommonPictures/ЗанятьФайл/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗанятьФайл/Picture.zip b/SSL/src/CommonPictures/ЗанятьФайл/Picture.zip new file mode 100644 index 000000000..7d43b6e6e Binary files /dev/null and b/SSL/src/CommonPictures/ЗанятьФайл/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.png b/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.png deleted file mode 100644 index 54139c5de..000000000 Binary files a/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.zip b/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.zip new file mode 100644 index 000000000..c28922f93 Binary files /dev/null and b/SSL/src/CommonPictures/ЗапланированноеВзаимодействие/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.png b/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.png deleted file mode 100644 index 9678e6da0..000000000 Binary files a/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.zip b/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.zip new file mode 100644 index 000000000..d5df0754f Binary files /dev/null and b/SSL/src/CommonPictures/ЗаполнитьФорму/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png deleted file mode 100644 index 3530b318c..000000000 Binary files a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.zip b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.zip new file mode 100644 index 000000000..1b98385c8 Binary files /dev/null and b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.zip differ diff --git a/SSL/src/CommonPictures/Зашифрован/Picture.png b/SSL/src/CommonPictures/Зашифрован/Picture.png deleted file mode 100644 index 9a02865c2..000000000 Binary files a/SSL/src/CommonPictures/Зашифрован/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Зашифрован/Picture.zip b/SSL/src/CommonPictures/Зашифрован/Picture.zip new file mode 100644 index 000000000..e0c32509f Binary files /dev/null and b/SSL/src/CommonPictures/Зашифрован/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.png b/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.png deleted file mode 100644 index f1c2da39e..000000000 Binary files a/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.zip b/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.zip new file mode 100644 index 000000000..0a004dc4a Binary files /dev/null and b/SSL/src/CommonPictures/ЗаявлениеНаВыпускСертификатаКлюча/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗнакСтоп/Picture.png b/SSL/src/CommonPictures/ЗнакСтоп/Picture.png deleted file mode 100644 index 6efb023e1..000000000 Binary files a/SSL/src/CommonPictures/ЗнакСтоп/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗнакСтоп/Picture.zip b/SSL/src/CommonPictures/ЗнакСтоп/Picture.zip new file mode 100644 index 000000000..568ce7a96 Binary files /dev/null and b/SSL/src/CommonPictures/ЗнакСтоп/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.png b/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.png deleted file mode 100644 index e7a7141d3..000000000 Binary files a/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.zip b/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.zip new file mode 100644 index 000000000..150f0968f Binary files /dev/null and b/SSL/src/CommonPictures/ЗнакСтопЧБ/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИерархическийСписок/Picture.png b/SSL/src/CommonPictures/ИерархическийСписок/Picture.png deleted file mode 100644 index 724ac5395..000000000 Binary files a/SSL/src/CommonPictures/ИерархическийСписок/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИерархическийСписок/Picture.zip b/SSL/src/CommonPictures/ИерархическийСписок/Picture.zip new file mode 100644 index 000000000..969f295f7 Binary files /dev/null and b/SSL/src/CommonPictures/ИерархическийСписок/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИзменитьШрифт/Picture.png b/SSL/src/CommonPictures/ИзменитьШрифт/Picture.png deleted file mode 100644 index 2813781da..000000000 Binary files a/SSL/src/CommonPictures/ИзменитьШрифт/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИзменитьШрифт/Picture.zip b/SSL/src/CommonPictures/ИзменитьШрифт/Picture.zip new file mode 100644 index 000000000..6c5c57ec8 Binary files /dev/null and b/SSL/src/CommonPictures/ИзменитьШрифт/Picture.zip differ diff --git a/SSL/src/CommonPictures/Информация/Picture.png b/SSL/src/CommonPictures/Информация/Picture.png deleted file mode 100644 index 24fea1254..000000000 Binary files a/SSL/src/CommonPictures/Информация/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Информация/Picture.zip b/SSL/src/CommonPictures/Информация/Picture.zip new file mode 100644 index 000000000..8a5c2c493 Binary files /dev/null and b/SSL/src/CommonPictures/Информация/Picture.zip differ diff --git a/SSL/src/CommonPictures/Информация32/Picture.png b/SSL/src/CommonPictures/Информация32/Picture.png deleted file mode 100644 index dd7660e75..000000000 Binary files a/SSL/src/CommonPictures/Информация32/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Информация32/Picture.zip b/SSL/src/CommonPictures/Информация32/Picture.zip new file mode 100644 index 000000000..34e51b8a2 Binary files /dev/null and b/SSL/src/CommonPictures/Информация32/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.png b/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.png deleted file mode 100644 index ecbb9ac0b..000000000 Binary files a/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.zip b/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.zip new file mode 100644 index 000000000..65b3b9839 Binary files /dev/null and b/SSL/src/CommonPictures/ИнформацияПоНедоступнымПолям/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИспользованиеМакета/Picture.png b/SSL/src/CommonPictures/ИспользованиеМакета/Picture.png deleted file mode 100644 index 173ea53db..000000000 Binary files a/SSL/src/CommonPictures/ИспользованиеМакета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИспользованиеМакета/Picture.zip b/SSL/src/CommonPictures/ИспользованиеМакета/Picture.zip new file mode 100644 index 000000000..f943edf9d Binary files /dev/null and b/SSL/src/CommonPictures/ИспользованиеМакета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png deleted file mode 100644 index 775246eb8..000000000 Binary files a/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.zip b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.zip new file mode 100644 index 000000000..bd431f360 Binary files /dev/null and b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png deleted file mode 100644 index 4a4ad5481..000000000 Binary files a/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.zip b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.zip new file mode 100644 index 000000000..e66950976 Binary files /dev/null and b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИсторияВерсий/Picture.png b/SSL/src/CommonPictures/ИсторияВерсий/Picture.png deleted file mode 100644 index cdb42ceba..000000000 Binary files a/SSL/src/CommonPictures/ИсторияВерсий/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИсторияВерсий/Picture.zip b/SSL/src/CommonPictures/ИсторияВерсий/Picture.zip new file mode 100644 index 000000000..9814a7522 Binary files /dev/null and b/SSL/src/CommonPictures/ИсторияВерсий/Picture.zip differ diff --git a/SSL/src/CommonPictures/ИсторияИзменений/Picture.png b/SSL/src/CommonPictures/ИсторияИзменений/Picture.png deleted file mode 100644 index 1313b17fd..000000000 Binary files a/SSL/src/CommonPictures/ИсторияИзменений/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ИсторияИзменений/Picture.zip b/SSL/src/CommonPictures/ИсторияИзменений/Picture.zip new file mode 100644 index 000000000..bf6f3c5e9 Binary files /dev/null and b/SSL/src/CommonPictures/ИсторияИзменений/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png b/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png deleted file mode 100644 index 626116915..000000000 Binary files a/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.zip b/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.zip new file mode 100644 index 000000000..36b47c574 Binary files /dev/null and b/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.png b/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.png deleted file mode 100644 index 8a2626b49..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.zip b/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.zip new file mode 100644 index 000000000..f15637833 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияВариантыВажности/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png b/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png deleted file mode 100644 index 60a86cbba..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.zip b/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.zip new file mode 100644 index 000000000..1c88a2455 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png deleted file mode 100644 index 34dbb5811..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.zip b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.zip new file mode 100644 index 000000000..a32a3ba78 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.png b/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.png deleted file mode 100644 index 70cc00a3f..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.zip b/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.zip new file mode 100644 index 000000000..00fa92e32 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияДеревоАнкеты/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png b/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png deleted file mode 100644 index 22b442f08..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.zip b/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.zip new file mode 100644 index 000000000..91cf30c00 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.png b/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.png deleted file mode 100644 index cca03e1e3..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.zip b/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.zip new file mode 100644 index 000000000..f31c0cd8f Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияДоступныеАнкеты/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.png b/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.png deleted file mode 100644 index 2864083ae..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.zip b/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.zip new file mode 100644 index 000000000..c80241dc0 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияЗадачиИБизнесПроцессы/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.png b/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.png deleted file mode 100644 index ee9dbd5d7..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.zip b/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.zip new file mode 100644 index 000000000..a939f9eae Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияЗаметки/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.png b/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.png deleted file mode 100644 index dcaf682fe..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.zip b/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.zip new file mode 100644 index 000000000..60f23d14a Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияКартинокСопоставлениеОбъектов/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.png b/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.png deleted file mode 100644 index 521d14f49..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.zip b/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.zip new file mode 100644 index 000000000..0614ba28d Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияКонтролируемыеСобытия152ФЗ/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.png b/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.png deleted file mode 100644 index 70f84fcd1..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.zip b/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.zip new file mode 100644 index 000000000..9ec7a636a Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияНапоминания/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.png b/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.png deleted file mode 100644 index d36e47e45..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.zip b/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.zip new file mode 100644 index 000000000..dada59ac4 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияОбъектыМетаданных/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.png b/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.png deleted file mode 100644 index d3410100d..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.zip b/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.zip new file mode 100644 index 000000000..4d831c03f Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияПиктограммПараметрыШаблонаСообщения/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.png b/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.png deleted file mode 100644 index e711bd2a3..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.zip b/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.zip new file mode 100644 index 000000000..a439dd10d Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияПиктограммФайлов/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png deleted file mode 100644 index 4ce5b02d7..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.zip b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.zip new file mode 100644 index 000000000..d5ad25b34 Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.png b/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.png deleted file mode 100644 index a5f3ed74b..000000000 Binary files a/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.zip b/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.zip new file mode 100644 index 000000000..c080cfb8b Binary files /dev/null and b/SSL/src/CommonPictures/КоллекцияСкрепка/Picture.zip differ diff --git a/SSL/src/CommonPictures/Комментарий/Picture.png b/SSL/src/CommonPictures/Комментарий/Picture.png deleted file mode 100644 index 6f23d5250..000000000 Binary files a/SSL/src/CommonPictures/Комментарий/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Комментарий/Picture.zip b/SSL/src/CommonPictures/Комментарий/Picture.zip new file mode 100644 index 000000000..9ee3c10b1 Binary files /dev/null and b/SSL/src/CommonPictures/Комментарий/Picture.zip differ diff --git a/SSL/src/CommonPictures/КомпьютерКлиент/Picture.png b/SSL/src/CommonPictures/КомпьютерКлиент/Picture.png deleted file mode 100644 index 9a202ddfa..000000000 Binary files a/SSL/src/CommonPictures/КомпьютерКлиент/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КомпьютерКлиент/Picture.zip b/SSL/src/CommonPictures/КомпьютерКлиент/Picture.zip new file mode 100644 index 000000000..aed2e7f61 Binary files /dev/null and b/SSL/src/CommonPictures/КомпьютерКлиент/Picture.zip differ diff --git a/SSL/src/CommonPictures/КомпьютерСервер/Picture.png b/SSL/src/CommonPictures/КомпьютерСервер/Picture.png deleted file mode 100644 index 98039d3f9..000000000 Binary files a/SSL/src/CommonPictures/КомпьютерСервер/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КомпьютерСервер/Picture.zip b/SSL/src/CommonPictures/КомпьютерСервер/Picture.zip new file mode 100644 index 000000000..df65a12ac Binary files /dev/null and b/SSL/src/CommonPictures/КомпьютерСервер/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png deleted file mode 100644 index 9663c3832..000000000 Binary files a/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..989cd1dc6 Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png b/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png deleted file mode 100644 index cf7b46946..000000000 Binary files a/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.zip b/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.zip new file mode 100644 index 000000000..7bc35dabe Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png deleted file mode 100644 index de2d665c8..000000000 Binary files a/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.zip b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.zip new file mode 100644 index 000000000..7cddf00bc Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png b/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png deleted file mode 100644 index d4fb2e206..000000000 Binary files a/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.zip b/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.zip new file mode 100644 index 000000000..4d365297e Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png b/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png deleted file mode 100644 index de6ce0108..000000000 Binary files a/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.zip b/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.zip new file mode 100644 index 000000000..a4ffbdc78 Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.zip differ diff --git a/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png b/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png deleted file mode 100644 index 8bae5e771..000000000 Binary files a/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.zip b/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.zip new file mode 100644 index 000000000..106d38844 Binary files /dev/null and b/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png b/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png deleted file mode 100644 index ab8d629ae..000000000 Binary files a/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.zip b/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.zip new file mode 100644 index 000000000..b6ab9c0b2 Binary files /dev/null and b/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.zip differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.png b/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.png deleted file mode 100644 index 83ceb316e..000000000 Binary files a/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.zip b/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.zip new file mode 100644 index 000000000..fdf7c051a Binary files /dev/null and b/SSL/src/CommonPictures/КонтактнаяИнформацияНеактуально/Picture.zip differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.png b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.png deleted file mode 100644 index 5244fb1b8..000000000 Binary files a/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip new file mode 100644 index 000000000..3b4cf1d8e Binary files /dev/null and b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip differ diff --git a/SSL/src/CommonPictures/КурсивноеНачертание/Picture.png b/SSL/src/CommonPictures/КурсивноеНачертание/Picture.png deleted file mode 100644 index 755adf614..000000000 Binary files a/SSL/src/CommonPictures/КурсивноеНачертание/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/КурсивноеНачертание/Picture.zip b/SSL/src/CommonPictures/КурсивноеНачертание/Picture.zip new file mode 100644 index 000000000..b8aca772e Binary files /dev/null and b/SSL/src/CommonPictures/КурсивноеНачертание/Picture.zip differ diff --git a/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip b/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip new file mode 100644 index 000000000..d519f3f27 Binary files /dev/null and b/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip differ diff --git a/SSL/src/CommonPictures/МенюДополнительныеФункции/МенюДополнительныеФункции.mdo b/SSL/src/CommonPictures/МенюДополнительныеФункции/МенюДополнительныеФункции.mdo new file mode 100644 index 000000000..5c5d79373 --- /dev/null +++ b/SSL/src/CommonPictures/МенюДополнительныеФункции/МенюДополнительныеФункции.mdo @@ -0,0 +1,8 @@ + + + МенюДополнительныеФункции + + ru + Меню дополнительные функции + + diff --git a/SSL/src/CommonPictures/НаписатьSMS/Picture.png b/SSL/src/CommonPictures/НаписатьSMS/Picture.png deleted file mode 100644 index e4f168d37..000000000 Binary files a/SSL/src/CommonPictures/НаписатьSMS/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/НаписатьSMS/Picture.zip b/SSL/src/CommonPictures/НаписатьSMS/Picture.zip new file mode 100644 index 000000000..4806840d4 Binary files /dev/null and b/SSL/src/CommonPictures/НаписатьSMS/Picture.zip differ diff --git a/SSL/src/CommonPictures/Напоминание/Picture.png b/SSL/src/CommonPictures/Напоминание/Picture.png deleted file mode 100644 index 3442d96e7..000000000 Binary files a/SSL/src/CommonPictures/Напоминание/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Напоминание/Picture.zip b/SSL/src/CommonPictures/Напоминание/Picture.zip new file mode 100644 index 000000000..c4dedfd02 Binary files /dev/null and b/SSL/src/CommonPictures/Напоминание/Picture.zip differ diff --git a/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif b/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif deleted file mode 100644 index 19c96a207..000000000 Binary files a/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif and /dev/null differ diff --git a/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.zip b/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.zip new file mode 100644 index 000000000..9a6c69c26 Binary files /dev/null and b/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.zip differ diff --git a/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png b/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png deleted file mode 100644 index e442a4ebf..000000000 Binary files a/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.zip b/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.zip new file mode 100644 index 000000000..40baeb2e9 Binary files /dev/null and b/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.zip differ diff --git a/SSL/src/CommonPictures/НетГраницы/Picture.png b/SSL/src/CommonPictures/НетГраницы/Picture.png deleted file mode 100644 index 24979b95b..000000000 Binary files a/SSL/src/CommonPictures/НетГраницы/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/НетГраницы/Picture.zip b/SSL/src/CommonPictures/НетГраницы/Picture.zip new file mode 100644 index 000000000..c9641bb17 Binary files /dev/null and b/SSL/src/CommonPictures/НетГраницы/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.png b/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.png deleted file mode 100644 index eb5426fba..000000000 Binary files a/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.zip b/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.zip new file mode 100644 index 000000000..f5913625c Binary files /dev/null and b/SSL/src/CommonPictures/ОбновитьФайлИзФайлаНаДиске/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОбновлениеВнешнихКомпонентССайта/Picture.zip b/SSL/src/CommonPictures/ОбновлениеВнешнихКомпонентССайта/Picture.zip new file mode 100644 index 000000000..8f933fac8 Binary files /dev/null and b/SSL/src/CommonPictures/ОбновлениеВнешнихКомпонентССайта/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОбновлениеВнешнихКомпонентССайта/ОбновлениеВнешнихКомпонентССайта.mdo b/SSL/src/CommonPictures/ОбновлениеВнешнихКомпонентССайта/ОбновлениеВнешнихКомпонентССайта.mdo new file mode 100644 index 000000000..fd9fa61fb --- /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 deleted file mode 100644 index 753665f65..000000000 Binary files a/SSL/src/CommonPictures/ОбъединитьЯчейки/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОбъединитьЯчейки/Picture.zip b/SSL/src/CommonPictures/ОбъединитьЯчейки/Picture.zip new file mode 100644 index 000000000..278e9de44 Binary files /dev/null and b/SSL/src/CommonPictures/ОбъединитьЯчейки/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.png b/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.png deleted file mode 100644 index d2ea6be64..000000000 Binary files a/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.zip b/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.zip new file mode 100644 index 000000000..398a02544 Binary files /dev/null and b/SSL/src/CommonPictures/ОбычныйДоступСФлажком/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.png b/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.png deleted file mode 100644 index 7ffee0b12..000000000 Binary files a/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.zip b/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.zip new file mode 100644 index 000000000..120445957 Binary files /dev/null and b/SSL/src/CommonPictures/ОпубликоватьФайл/Picture.zip differ diff --git a/SSL/src/CommonPictures/Органайзер/Picture.png b/SSL/src/CommonPictures/Органайзер/Picture.png deleted file mode 100644 index 3442d96e7..000000000 Binary files a/SSL/src/CommonPictures/Органайзер/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Органайзер/Picture.zip b/SSL/src/CommonPictures/Органайзер/Picture.zip new file mode 100644 index 000000000..9932f445b Binary files /dev/null and b/SSL/src/CommonPictures/Органайзер/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОсвободитьФайл/Picture.png b/SSL/src/CommonPictures/ОсвободитьФайл/Picture.png deleted file mode 100644 index 043029b5f..000000000 Binary files a/SSL/src/CommonPictures/ОсвободитьФайл/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОсвободитьФайл/Picture.zip b/SSL/src/CommonPictures/ОсвободитьФайл/Picture.zip new file mode 100644 index 000000000..f1b7b56cf Binary files /dev/null and b/SSL/src/CommonPictures/ОсвободитьФайл/Picture.zip differ diff --git a/SSL/src/CommonPictures/Отборы/Picture.png b/SSL/src/CommonPictures/Отборы/Picture.png deleted file mode 100644 index b657b7394..000000000 Binary files a/SSL/src/CommonPictures/Отборы/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Отборы/Picture.zip b/SSL/src/CommonPictures/Отборы/Picture.zip new file mode 100644 index 000000000..fecbb335c Binary files /dev/null and b/SSL/src/CommonPictures/Отборы/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.png b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.png deleted file mode 100644 index 345692592..000000000 Binary files a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.zip b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.zip new file mode 100644 index 000000000..fb3a893c1 Binary files /dev/null and b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмо/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.png b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.png deleted file mode 100644 index 04c1af23d..000000000 Binary files a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.zip b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.zip new file mode 100644 index 000000000..b6c3246ac Binary files /dev/null and b/SSL/src/CommonPictures/ОтветитьНаЭлектронноеПисьмоВсем/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.png b/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.png deleted file mode 100644 index f8afd9497..000000000 Binary files a/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.zip b/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.zip new file mode 100644 index 000000000..bb5f32281 Binary files /dev/null and b/SSL/src/CommonPictures/ОткрытьВыбранныйФайл/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОткрытьМакет/Picture.png b/SSL/src/CommonPictures/ОткрытьМакет/Picture.png deleted file mode 100644 index 65f1e0ed9..000000000 Binary files a/SSL/src/CommonPictures/ОткрытьМакет/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОткрытьМакет/Picture.zip b/SSL/src/CommonPictures/ОткрытьМакет/Picture.zip new file mode 100644 index 000000000..20b656b5d Binary files /dev/null and b/SSL/src/CommonPictures/ОткрытьМакет/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.png b/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.png deleted file mode 100644 index 496d185f6..000000000 Binary files a/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.zip b/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.zip new file mode 100644 index 000000000..86cccc85c Binary files /dev/null and b/SSL/src/CommonPictures/ОтложитьРассмотрениеВзаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png deleted file mode 100644 index 1fce96b26..000000000 Binary files a/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.zip b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.zip new file mode 100644 index 000000000..242e1ef0e Binary files /dev/null and b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтправитьSMS/Picture.png b/SSL/src/CommonPictures/ОтправитьSMS/Picture.png deleted file mode 100644 index cad505491..000000000 Binary files a/SSL/src/CommonPictures/ОтправитьSMS/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтправитьSMS/Picture.zip b/SSL/src/CommonPictures/ОтправитьSMS/Picture.zip new file mode 100644 index 000000000..2397c80c5 Binary files /dev/null and b/SSL/src/CommonPictures/ОтправитьSMS/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.png b/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.png deleted file mode 100644 index 84314e4c2..000000000 Binary files a/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.zip b/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.zip new file mode 100644 index 000000000..5bfa28515 Binary files /dev/null and b/SSL/src/CommonPictures/ОтправитьПолучитьПочту/Picture.zip differ diff --git a/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.png b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.png deleted file mode 100644 index 39eff3d50..000000000 Binary files a/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip new file mode 100644 index 000000000..bb31b57ea Binary files /dev/null and b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip differ diff --git a/SSL/src/CommonPictures/Отчеты/Picture.png b/SSL/src/CommonPictures/Отчеты/Picture.png deleted file mode 100644 index b7188d56f..000000000 Binary files a/SSL/src/CommonPictures/Отчеты/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Отчеты/Picture.zip b/SSL/src/CommonPictures/Отчеты/Picture.zip new file mode 100644 index 000000000..cc6b5ecff Binary files /dev/null and b/SSL/src/CommonPictures/Отчеты/Picture.zip differ diff --git a/SSL/src/CommonPictures/Оформление/Picture.png b/SSL/src/CommonPictures/Оформление/Picture.png deleted file mode 100644 index 45a7abd09..000000000 Binary files a/SSL/src/CommonPictures/Оформление/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Оформление/Picture.zip b/SSL/src/CommonPictures/Оформление/Picture.zip new file mode 100644 index 000000000..4545dcd9f Binary files /dev/null and b/SSL/src/CommonPictures/Оформление/Picture.zip differ diff --git a/SSL/src/CommonPictures/Ошибка32/Picture.png b/SSL/src/CommonPictures/Ошибка32/Picture.png deleted file mode 100644 index 9a379deec..000000000 Binary files a/SSL/src/CommonPictures/Ошибка32/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Ошибка32/Picture.zip b/SSL/src/CommonPictures/Ошибка32/Picture.zip new file mode 100644 index 000000000..b58cdf19e Binary files /dev/null and b/SSL/src/CommonPictures/Ошибка32/Picture.zip differ diff --git a/SSL/src/CommonPictures/Папка/Picture.png b/SSL/src/CommonPictures/Папка/Picture.png deleted file mode 100644 index 6a095465d..000000000 Binary files a/SSL/src/CommonPictures/Папка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Папка/Picture.zip b/SSL/src/CommonPictures/Папка/Picture.zip new file mode 100644 index 000000000..a5301ade7 Binary files /dev/null and b/SSL/src/CommonPictures/Папка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.png b/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.png deleted file mode 100644 index 2e8aa1e4a..000000000 Binary files a/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.zip b/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.zip new file mode 100644 index 000000000..3cb742079 Binary files /dev/null and b/SSL/src/CommonPictures/ПапкаОблачногоСервиса/Picture.zip differ diff --git a/SSL/src/CommonPictures/Папки/Picture.png b/SSL/src/CommonPictures/Папки/Picture.png deleted file mode 100644 index 046c0c547..000000000 Binary files a/SSL/src/CommonPictures/Папки/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Папки/Picture.zip b/SSL/src/CommonPictures/Папки/Picture.zip new file mode 100644 index 000000000..fc4c76e10 Binary files /dev/null and b/SSL/src/CommonPictures/Папки/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.png b/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.png deleted file mode 100644 index 5de68ddfa..000000000 Binary files a/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.zip b/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.zip new file mode 100644 index 000000000..5065f5f5b Binary files /dev/null and b/SSL/src/CommonPictures/ПапкиЭлектронныхПисем/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.png b/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.png deleted file mode 100644 index 066a024f5..000000000 Binary files a/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.zip b/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.zip new file mode 100644 index 000000000..8527452f1 Binary files /dev/null and b/SSL/src/CommonPictures/ПереместитьВЗакладкиВзаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.png b/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.png deleted file mode 100644 index 291a426b9..000000000 Binary files a/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.zip b/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.zip new file mode 100644 index 000000000..54da52029 Binary files /dev/null and b/SSL/src/CommonPictures/ПереместитьВПапкуПисем/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.png b/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.png deleted file mode 100644 index 0cb56e05d..000000000 Binary files a/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.zip b/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.zip new file mode 100644 index 000000000..412543f49 Binary files /dev/null and b/SSL/src/CommonPictures/ПереместитьВлевоВверх/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.png b/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.png deleted file mode 100644 index 4e67cca1f..000000000 Binary files a/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.zip b/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.zip new file mode 100644 index 000000000..f8b76c1a8 Binary files /dev/null and b/SSL/src/CommonPictures/ПереместитьВлевоВсе/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.png b/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.png deleted file mode 100644 index 5adea38da..000000000 Binary files a/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.zip b/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.zip new file mode 100644 index 000000000..8a3783440 Binary files /dev/null and b/SSL/src/CommonPictures/ПереместитьВправоВниз/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереслатьПисьмоКакВложение/Picture.zip b/SSL/src/CommonPictures/ПереслатьПисьмоКакВложение/Picture.zip new file mode 100644 index 000000000..c8a907c6b Binary files /dev/null and b/SSL/src/CommonPictures/ПереслатьПисьмоКакВложение/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПереслатьПисьмоКакВложение/ПереслатьПисьмоКакВложение.mdo b/SSL/src/CommonPictures/ПереслатьПисьмоКакВложение/ПереслатьПисьмоКакВложение.mdo new file mode 100644 index 000000000..71887b013 --- /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 deleted file mode 100644 index 6674a3b05..000000000 Binary files a/SSL/src/CommonPictures/ПереслатьЭлектронноеПисьмо/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПереслатьЭлектронноеПисьмо/Picture.zip b/SSL/src/CommonPictures/ПереслатьЭлектронноеПисьмо/Picture.zip new file mode 100644 index 000000000..3d6fa746b Binary files /dev/null and b/SSL/src/CommonPictures/ПереслатьЭлектронноеПисьмо/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.png b/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.png deleted file mode 100644 index 8f8bc9872..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.zip b/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.zip new file mode 100644 index 000000000..cd4724dab Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыДоступаКНастройкамОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png deleted file mode 100644 index f3fd86c82..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.zip b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.zip new file mode 100644 index 000000000..832f852e9 Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/Picture.png b/SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/Picture.png deleted file mode 100644 index ad63a7a5f..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.png b/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.png deleted file mode 100644 index d15a3e02b..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.zip b/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.zip new file mode 100644 index 000000000..cabde0f49 Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыПланОбменаУзел/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/Picture.png b/SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/Picture.png deleted file mode 100644 index 9ac49bea4..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.png b/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.png deleted file mode 100644 index 4d9b265c2..000000000 Binary files a/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.zip b/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.zip new file mode 100644 index 000000000..82f678e70 Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.zip differ diff --git a/SSL/src/CommonPictures/Подменю/Picture.png b/SSL/src/CommonPictures/Подменю/Picture.png deleted file mode 100644 index 5bfb1c405..000000000 Binary files a/SSL/src/CommonPictures/Подменю/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Подменю/Picture.zip b/SSL/src/CommonPictures/Подменю/Picture.zip new file mode 100644 index 000000000..d215b5476 Binary files /dev/null and b/SSL/src/CommonPictures/Подменю/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.png b/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.png deleted file mode 100644 index 769347c09..000000000 Binary files a/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.zip b/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.zip new file mode 100644 index 000000000..767d7af4d Binary files /dev/null and b/SSL/src/CommonPictures/ПодписанЗашифрованЗаголовок/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.png b/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.png deleted file mode 100644 index 17b0afa95..000000000 Binary files a/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.zip b/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.zip new file mode 100644 index 000000000..6c3630076 Binary files /dev/null and b/SSL/src/CommonPictures/ПодписанЗашифрованСостояния/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПодписанЭП/Picture.png b/SSL/src/CommonPictures/ПодписанЭП/Picture.png deleted file mode 100644 index b3703f23f..000000000 Binary files a/SSL/src/CommonPictures/ПодписанЭП/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПодписанЭП/Picture.zip b/SSL/src/CommonPictures/ПодписанЭП/Picture.zip new file mode 100644 index 000000000..c4f677c50 Binary files /dev/null and b/SSL/src/CommonPictures/ПодписанЭП/Picture.zip differ diff --git a/SSL/src/CommonPictures/Подсистема/Picture.png b/SSL/src/CommonPictures/Подсистема/Picture.png deleted file mode 100644 index 875624faa..000000000 Binary files a/SSL/src/CommonPictures/Подсистема/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Подсистема/Picture.zip b/SSL/src/CommonPictures/Подсистема/Picture.zip new file mode 100644 index 000000000..e05f27642 Binary files /dev/null and b/SSL/src/CommonPictures/Подсистема/Picture.zip differ diff --git a/SSL/src/CommonPictures/Подчеркивание/Picture.png b/SSL/src/CommonPictures/Подчеркивание/Picture.png deleted file mode 100644 index 35d9996f2..000000000 Binary files a/SSL/src/CommonPictures/Подчеркивание/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Подчеркивание/Picture.zip b/SSL/src/CommonPictures/Подчеркивание/Picture.zip new file mode 100644 index 000000000..7cce2f912 Binary files /dev/null and b/SSL/src/CommonPictures/Подчеркивание/Picture.zip differ diff --git a/SSL/src/CommonPictures/Позвонить/Picture.png b/SSL/src/CommonPictures/Позвонить/Picture.png deleted file mode 100644 index 334fe1a24..000000000 Binary files a/SSL/src/CommonPictures/Позвонить/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Позвонить/Picture.zip b/SSL/src/CommonPictures/Позвонить/Picture.zip new file mode 100644 index 000000000..82b59c058 Binary files /dev/null and b/SSL/src/CommonPictures/Позвонить/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.png b/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.png deleted file mode 100644 index 8b07bfa2a..000000000 Binary files a/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.zip b/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.zip new file mode 100644 index 000000000..00749fc30 Binary files /dev/null and b/SSL/src/CommonPictures/ПозвонитьИлиОтправитьSMS/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПоказатьОтличия/Picture.png b/SSL/src/CommonPictures/ПоказатьОтличия/Picture.png deleted file mode 100644 index efc802f4f..000000000 Binary files a/SSL/src/CommonPictures/ПоказатьОтличия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПоказатьОтличия/Picture.zip b/SSL/src/CommonPictures/ПоказатьОтличия/Picture.zip new file mode 100644 index 000000000..64f18fd6e Binary files /dev/null and b/SSL/src/CommonPictures/ПоказатьОтличия/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png deleted file mode 100644 index 91c56a0a4..000000000 Binary files a/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.zip b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.zip new file mode 100644 index 000000000..d6eb068cb Binary files /dev/null and b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png deleted file mode 100644 index 3b955e515..000000000 Binary files a/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.zip b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.zip new file mode 100644 index 000000000..8eb4f7b79 Binary files /dev/null and b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png deleted file mode 100644 index 06ddead09..000000000 Binary files a/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.zip b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.zip new file mode 100644 index 000000000..7517d0d04 Binary files /dev/null and b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.png b/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.png deleted file mode 100644 index db8b28be6..000000000 Binary files a/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.zip b/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.zip new file mode 100644 index 000000000..2de23f3d2 Binary files /dev/null and b/SSL/src/CommonPictures/ПолужирноеНачертание/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.png b/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.png deleted file mode 100644 index 1d16bdf67..000000000 Binary files a/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.zip b/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.zip new file mode 100644 index 000000000..73c0fbcff Binary files /dev/null and b/SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПоляИСортировки/Picture.png b/SSL/src/CommonPictures/ПоляИСортировки/Picture.png deleted file mode 100644 index 5a60b98e5..000000000 Binary files a/SSL/src/CommonPictures/ПоляИСортировки/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПоляИСортировки/Picture.zip b/SSL/src/CommonPictures/ПоляИСортировки/Picture.zip new file mode 100644 index 000000000..e45d29cbb Binary files /dev/null and b/SSL/src/CommonPictures/ПоляИСортировки/Picture.zip differ diff --git a/SSL/src/CommonPictures/Пометка/Picture.png b/SSL/src/CommonPictures/Пометка/Picture.png deleted file mode 100644 index 9fec2e705..000000000 Binary files a/SSL/src/CommonPictures/Пометка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Пометка/Picture.zip b/SSL/src/CommonPictures/Пометка/Picture.zip new file mode 100644 index 000000000..6df5199cf Binary files /dev/null and b/SSL/src/CommonPictures/Пометка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.png b/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.png deleted file mode 100644 index 062a8c250..000000000 Binary files a/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.zip b/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.zip new file mode 100644 index 000000000..498a6b641 Binary files /dev/null and b/SSL/src/CommonPictures/ПредопределенныйЭлемент/Picture.zip differ diff --git a/SSL/src/CommonPictures/Предупреждение/Picture.png b/SSL/src/CommonPictures/Предупреждение/Picture.png deleted file mode 100644 index 7325ab91c..000000000 Binary files a/SSL/src/CommonPictures/Предупреждение/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Предупреждение/Picture.zip b/SSL/src/CommonPictures/Предупреждение/Picture.zip new file mode 100644 index 000000000..ba6883ce6 Binary files /dev/null and b/SSL/src/CommonPictures/Предупреждение/Picture.zip differ diff --git a/SSL/src/CommonPictures/Предупреждение32/Picture.png b/SSL/src/CommonPictures/Предупреждение32/Picture.png deleted file mode 100644 index f082ad4b3..000000000 Binary files a/SSL/src/CommonPictures/Предупреждение32/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Предупреждение32/Picture.zip b/SSL/src/CommonPictures/Предупреждение32/Picture.zip new file mode 100644 index 000000000..767a271aa Binary files /dev/null and b/SSL/src/CommonPictures/Предупреждение32/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.png b/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.png deleted file mode 100644 index 0d189313f..000000000 Binary files a/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.zip b/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.zip new file mode 100644 index 000000000..713de4fba Binary files /dev/null and b/SSL/src/CommonPictures/ПрименитьПравилаОбработкиПисем/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.png b/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.png deleted file mode 100644 index f9e4782f6..000000000 Binary files a/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.zip b/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.zip new file mode 100644 index 000000000..683d93c60 Binary files /dev/null and b/SSL/src/CommonPictures/ПримечаниеЖурналаРегистрации/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПроцессОтложен/Picture.png b/SSL/src/CommonPictures/ПроцессОтложен/Picture.png deleted file mode 100644 index 7e0f44c2c..000000000 Binary files a/SSL/src/CommonPictures/ПроцессОтложен/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПроцессОтложен/Picture.zip b/SSL/src/CommonPictures/ПроцессОтложен/Picture.zip new file mode 100644 index 000000000..8b2be6041 Binary files /dev/null and b/SSL/src/CommonPictures/ПроцессОтложен/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.png b/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.png deleted file mode 100644 index f4cdbbe8f..000000000 Binary files a/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.zip b/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.zip new file mode 100644 index 000000000..ee80a01a1 Binary files /dev/null and b/SSL/src/CommonPictures/ПрочиеПользовательскиеНастройки/Picture.zip differ diff --git a/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png b/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png deleted file mode 100644 index 8ee7f218e..000000000 Binary files a/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.zip b/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.zip new file mode 100644 index 000000000..ac2d84a01 Binary files /dev/null and b/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.zip differ diff --git a/SSL/src/CommonPictures/РазделАдминистрирование/Picture.png b/SSL/src/CommonPictures/РазделАдминистрирование/Picture.png deleted file mode 100644 index 74df1b4b7..000000000 Binary files a/SSL/src/CommonPictures/РазделАдминистрирование/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РазделАдминистрирование/Picture.zip b/SSL/src/CommonPictures/РазделАдминистрирование/Picture.zip new file mode 100644 index 000000000..0a606f4cb Binary files /dev/null and b/SSL/src/CommonPictures/РазделАдминистрирование/Picture.zip differ diff --git a/SSL/src/CommonPictures/РазорватьСоединение/Picture.png b/SSL/src/CommonPictures/РазорватьСоединение/Picture.png deleted file mode 100644 index aa4710b8c..000000000 Binary files a/SSL/src/CommonPictures/РазорватьСоединение/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РазорватьСоединение/Picture.zip b/SSL/src/CommonPictures/РазорватьСоединение/Picture.zip new file mode 100644 index 000000000..ce82aa38e Binary files /dev/null and b/SSL/src/CommonPictures/РазорватьСоединение/Picture.zip differ diff --git a/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png b/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png deleted file mode 100644 index 028338c5a..000000000 Binary files a/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.zip b/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.zip new file mode 100644 index 000000000..229c749bd Binary files /dev/null and b/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.zip differ diff --git a/SSL/src/CommonPictures/Рассчитать/Picture.png b/SSL/src/CommonPictures/Рассчитать/Picture.png deleted file mode 100644 index bd7d28f54..000000000 Binary files a/SSL/src/CommonPictures/Рассчитать/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Рассчитать/Picture.zip b/SSL/src/CommonPictures/Рассчитать/Picture.zip new file mode 100644 index 000000000..5c697ac1e Binary files /dev/null and b/SSL/src/CommonPictures/Рассчитать/Picture.zip differ diff --git a/SSL/src/CommonPictures/РассылкаОтчетов/Picture.png b/SSL/src/CommonPictures/РассылкаОтчетов/Picture.png deleted file mode 100644 index b4b33e6f2..000000000 Binary files a/SSL/src/CommonPictures/РассылкаОтчетов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РассылкаОтчетов/Picture.zip b/SSL/src/CommonPictures/РассылкаОтчетов/Picture.zip new file mode 100644 index 000000000..ef4719813 Binary files /dev/null and b/SSL/src/CommonPictures/РассылкаОтчетов/Picture.zip differ diff --git a/SSL/src/CommonPictures/РедактироватьМакет/Picture.png b/SSL/src/CommonPictures/РедактироватьМакет/Picture.png deleted file mode 100644 index 0176f5eed..000000000 Binary files a/SSL/src/CommonPictures/РедактироватьМакет/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РедактироватьМакет/Picture.zip b/SSL/src/CommonPictures/РедактироватьМакет/Picture.zip new file mode 100644 index 000000000..f2f4b2370 Binary files /dev/null and b/SSL/src/CommonPictures/РедактироватьМакет/Picture.zip differ diff --git a/SSL/src/CommonPictures/РедактироватьФайл/Picture.png b/SSL/src/CommonPictures/РедактироватьФайл/Picture.png deleted file mode 100644 index b8265ecc1..000000000 Binary files a/SSL/src/CommonPictures/РедактироватьФайл/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/РедактироватьФайл/Picture.zip b/SSL/src/CommonPictures/РедактироватьФайл/Picture.zip new file mode 100644 index 000000000..06189874f Binary files /dev/null and b/SSL/src/CommonPictures/РедактироватьФайл/Picture.zip differ diff --git a/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/Picture.zip b/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/Picture.zip new file mode 100644 index 000000000..457286f2b Binary files /dev/null and b/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/Picture.zip differ diff --git a/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/РежимИспользованияПриложенияВСервисеЛокально.mdo b/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/РежимИспользованияПриложенияВСервисеЛокально.mdo new file mode 100644 index 000000000..a4072e0a6 --- /dev/null +++ b/SSL/src/CommonPictures/РежимИспользованияПриложенияВСервисеЛокально/РежимИспользованияПриложенияВСервисеЛокально.mdo @@ -0,0 +1,9 @@ + + + РежимИспользованияПриложенияВСервисеЛокально + + ru + Режим использования приложения + + Режим использования приложения (в сервисе или локально) + diff --git a/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.png b/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.png deleted file mode 100644 index 3775b34d5..000000000 Binary files a/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.zip b/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.zip new file mode 100644 index 000000000..e00d5a340 Binary files /dev/null and b/SSL/src/CommonPictures/Сервис1СКонтрагент/Picture.zip differ diff --git a/SSL/src/CommonPictures/СертификатКлюча/Picture.png b/SSL/src/CommonPictures/СертификатКлюча/Picture.png deleted file mode 100644 index b02f0df5e..000000000 Binary files a/SSL/src/CommonPictures/СертификатКлюча/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СертификатКлюча/Picture.zip b/SSL/src/CommonPictures/СертификатКлюча/Picture.zip new file mode 100644 index 000000000..8ecb1865d Binary files /dev/null and b/SSL/src/CommonPictures/СертификатКлюча/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанных/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанных/Picture.png deleted file mode 100644 index 843c1bf2a..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанных/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанных/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанных/Picture.zip new file mode 100644 index 000000000..5f37e89aa Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанных/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.gif b/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.gif deleted file mode 100644 index 26961553e..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.gif and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.zip new file mode 100644 index 000000000..19e57d3b8 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхАнализДанных48/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.png deleted file mode 100644 index ee5fd2db0..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.zip new file mode 100644 index 000000000..2f28eeeaa Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхВыполнение/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.png deleted file mode 100644 index ca51a81c1..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.zip new file mode 100644 index 000000000..c9b2b9973 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхДанныеПолучены/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.gif b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.gif deleted file mode 100644 index ef1a1bee0..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.gif and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.zip new file mode 100644 index 000000000..02175426d Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.gif b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.gif deleted file mode 100644 index fd6988ee3..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.gif and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.zip new file mode 100644 index 000000000..f152f522f Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхДлительнаяОперация48/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.png deleted file mode 100644 index 16e82831e..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.zip new file mode 100644 index 000000000..8bc6915da Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхИнтерактивноеВыполнение/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.png deleted file mode 100644 index a4a34cc7c..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.zip new file mode 100644 index 000000000..005f536f8 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхКоллизия/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.png deleted file mode 100644 index 674309c65..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.zip new file mode 100644 index 000000000..d944f5385 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхНастройка/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.png deleted file mode 100644 index bb588561e..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.zip new file mode 100644 index 000000000..92689c61b Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхНепринятыеПоДате/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.png deleted file mode 100644 index 391a9a387..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.zip new file mode 100644 index 000000000..8a6f75164 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхОтключение/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.png deleted file mode 100644 index f97faba27..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.zip new file mode 100644 index 000000000..f56898530 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхПодсистема/Picture.zip differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.png deleted file mode 100644 index 2e334ad67..000000000 Binary files a/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.zip b/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.zip new file mode 100644 index 000000000..00ebda326 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхСостояниеРасписания/Picture.zip differ diff --git a/SSL/src/CommonPictures/Сканирование/Picture.png b/SSL/src/CommonPictures/Сканирование/Picture.png deleted file mode 100644 index c3f874596..000000000 Binary files a/SSL/src/CommonPictures/Сканирование/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Сканирование/Picture.zip b/SSL/src/CommonPictures/Сканирование/Picture.zip new file mode 100644 index 000000000..faa7f2d15 Binary files /dev/null and b/SSL/src/CommonPictures/Сканирование/Picture.zip differ diff --git a/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.png b/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.png deleted file mode 100644 index 6dc16e558..000000000 Binary files a/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.zip b/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.zip new file mode 100644 index 000000000..2a49deddd Binary files /dev/null and b/SSL/src/CommonPictures/СкопироватьВБуферОбмена/Picture.zip differ diff --git a/SSL/src/CommonPictures/Скрепка/Picture.png b/SSL/src/CommonPictures/Скрепка/Picture.png deleted file mode 100644 index 15be778ae..000000000 Binary files a/SSL/src/CommonPictures/Скрепка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Скрепка/Picture.zip b/SSL/src/CommonPictures/Скрепка/Picture.zip new file mode 100644 index 000000000..273bbb324 Binary files /dev/null and b/SSL/src/CommonPictures/Скрепка/Picture.zip differ diff --git a/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.png b/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.png deleted file mode 100644 index a58b6d22f..000000000 Binary files a/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.zip b/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.zip new file mode 100644 index 000000000..8c473ffbe Binary files /dev/null and b/SSL/src/CommonPictures/СкрытаяНастройкаОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.png b/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.png deleted file mode 100644 index b8ada3e6d..000000000 Binary files a/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.zip b/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.zip new file mode 100644 index 000000000..1f7a493ba Binary files /dev/null and b/SSL/src/CommonPictures/СнятьПризнакРассмотреноУВзаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png b/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png deleted file mode 100644 index 0a9f25de9..000000000 Binary files a/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.zip b/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.zip new file mode 100644 index 000000000..bc1e17bde Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png deleted file mode 100644 index a1e9e5433..000000000 Binary files a/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.zip b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.zip new file mode 100644 index 000000000..fac12d17e Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя01/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.png deleted file mode 100644 index 07c033e54..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя01/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip new file mode 100644 index 000000000..370985a61 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя02/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.png deleted file mode 100644 index fad489a57..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя02/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip new file mode 100644 index 000000000..9f704e021 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя03/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.png deleted file mode 100644 index e16f12d68..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя03/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip new file mode 100644 index 000000000..93914cb09 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя04/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.png deleted file mode 100644 index 7d14995d3..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя04/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip new file mode 100644 index 000000000..95477c55e Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя05/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.png deleted file mode 100644 index 317379276..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя05/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip new file mode 100644 index 000000000..c34f433e8 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя06/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.png deleted file mode 100644 index c6fca7249..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя06/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip new file mode 100644 index 000000000..d8d153f9b Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя07/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.png deleted file mode 100644 index 5f4a3ec3e..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя07/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip new file mode 100644 index 000000000..3c5d04dfd Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя08/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.png deleted file mode 100644 index ce3c43d81..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя08/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip new file mode 100644 index 000000000..14f07fbb4 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя09/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.png deleted file mode 100644 index a05283dca..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя09/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip new file mode 100644 index 000000000..6cf212bfb Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя10/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.png deleted file mode 100644 index 442c76111..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя10/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip new file mode 100644 index 000000000..0528421e6 Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя11/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.png deleted file mode 100644 index a3f0445eb..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя11/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip new file mode 100644 index 000000000..99bb936da Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя12/Picture.png b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.png deleted file mode 100644 index e90f5ae44..000000000 Binary files a/SSL/src/CommonPictures/СостояниеПользователя12/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip new file mode 100644 index 000000000..f01361a8e Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.png b/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.png deleted file mode 100644 index 83e2d8f5b..000000000 Binary files a/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.zip b/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.zip new file mode 100644 index 000000000..949313fec Binary files /dev/null and b/SSL/src/CommonPictures/СостояниеРассылкиОтчетов/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостоянияПользователей/Picture.png b/SSL/src/CommonPictures/СостоянияПользователей/Picture.png deleted file mode 100644 index 63fb95d2a..000000000 Binary files a/SSL/src/CommonPictures/СостоянияПользователей/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостоянияПользователей/Picture.zip b/SSL/src/CommonPictures/СостоянияПользователей/Picture.zip new file mode 100644 index 000000000..c46000413 Binary files /dev/null and b/SSL/src/CommonPictures/СостоянияПользователей/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостоянияПроцессов/Picture.png b/SSL/src/CommonPictures/СостоянияПроцессов/Picture.png deleted file mode 100644 index 8d3b97bb4..000000000 Binary files a/SSL/src/CommonPictures/СостоянияПроцессов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостоянияПроцессов/Picture.zip b/SSL/src/CommonPictures/СостоянияПроцессов/Picture.zip new file mode 100644 index 000000000..3a057ac13 Binary files /dev/null and b/SSL/src/CommonPictures/СостоянияПроцессов/Picture.zip differ diff --git a/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.png b/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.png deleted file mode 100644 index a177a35a4..000000000 Binary files a/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.zip b/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.zip new file mode 100644 index 000000000..448c220a1 Binary files /dev/null and b/SSL/src/CommonPictures/СостоянияРасширенийКонфигурации/Picture.zip differ diff --git a/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.png b/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.png deleted file mode 100644 index 9027ba984..000000000 Binary files a/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.zip b/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.zip new file mode 100644 index 000000000..a5138fa52 Binary files /dev/null and b/SSL/src/CommonPictures/СохранитьВариантОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/СохранитьФайлКак/Picture.png b/SSL/src/CommonPictures/СохранитьФайлКак/Picture.png deleted file mode 100644 index 4e9282921..000000000 Binary files a/SSL/src/CommonPictures/СохранитьФайлКак/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СохранитьФайлКак/Picture.zip b/SSL/src/CommonPictures/СохранитьФайлКак/Picture.zip new file mode 100644 index 000000000..823e96a96 Binary files /dev/null and b/SSL/src/CommonPictures/СохранитьФайлКак/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправкаВНачало/Picture.png b/SSL/src/CommonPictures/СправкаВНачало/Picture.png deleted file mode 100644 index d3dd82db6..000000000 Binary files a/SSL/src/CommonPictures/СправкаВНачало/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправкаВНачало/Picture.zip b/SSL/src/CommonPictures/СправкаВНачало/Picture.zip new file mode 100644 index 000000000..21cdbe07a Binary files /dev/null and b/SSL/src/CommonPictures/СправкаВНачало/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправкаПереходВниз/Picture.png b/SSL/src/CommonPictures/СправкаПереходВниз/Picture.png deleted file mode 100644 index a32f4b559..000000000 Binary files a/SSL/src/CommonPictures/СправкаПереходВниз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправкаПереходВниз/Picture.zip b/SSL/src/CommonPictures/СправкаПереходВниз/Picture.zip new file mode 100644 index 000000000..5e04d26a6 Binary files /dev/null and b/SSL/src/CommonPictures/СправкаПереходВниз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.png deleted file mode 100644 index 4780a0ad0..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.zip new file mode 100644 index 000000000..19bc0bd5d Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторВверх/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.png deleted file mode 100644 index 4a8443e81..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..bf9a21e05 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.png deleted file mode 100644 index e3dfe3677..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.zip new file mode 100644 index 000000000..c62c99228 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторЛево/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.png deleted file mode 100644 index 5acadec07..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.zip new file mode 100644 index 000000000..33c935a1a Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.png deleted file mode 100644 index e0f6992d3..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.zip new file mode 100644 index 000000000..e1fcce6ac Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторЛевоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.png deleted file mode 100644 index 9023f2e3d..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.zip new file mode 100644 index 000000000..a5c3a27be Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХКоннекторНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.png deleted file mode 100644 index ae5fdbd4c..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.zip new file mode 100644 index 000000000..1633b532b Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.png deleted file mode 100644 index 57f4bad1e..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.zip new file mode 100644 index 000000000..d417e808f Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторВерхНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.png deleted file mode 100644 index 8fb51ecc6..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.zip new file mode 100644 index 000000000..6c33b3e64 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛево/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.png deleted file mode 100644 index ec48dbecd..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip new file mode 100644 index 000000000..d1def19e1 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоВерх/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.png deleted file mode 100644 index e6ad23ab7..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip new file mode 100644 index 000000000..407d6f765 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторЛевоНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.png b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.png deleted file mode 100644 index 6e62ca178..000000000 Binary files a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.zip b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.zip new file mode 100644 index 000000000..d9c020518 Binary files /dev/null and b/SSL/src/CommonPictures/СправочникПВХПомеченНаУдалениеКоннекторНиз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтатусыДокумента/Picture.png b/SSL/src/CommonPictures/СтатусыДокумента/Picture.png deleted file mode 100644 index c7fa5cc3c..000000000 Binary files a/SSL/src/CommonPictures/СтатусыДокумента/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтатусыДокумента/Picture.zip b/SSL/src/CommonPictures/СтатусыДокумента/Picture.zip new file mode 100644 index 000000000..b4d24194e Binary files /dev/null and b/SSL/src/CommonPictures/СтатусыДокумента/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png deleted file mode 100644 index fb913018f..000000000 Binary files a/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.zip b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.zip new file mode 100644 index 000000000..1941cb6b9 Binary files /dev/null and b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВверх/Picture.png b/SSL/src/CommonPictures/СтрелкаВверх/Picture.png deleted file mode 100644 index 5d23cd7f5..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВверх/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВверх/Picture.zip b/SSL/src/CommonPictures/СтрелкаВверх/Picture.zip new file mode 100644 index 000000000..95a8d076b Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВверх/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВлево/Picture.png b/SSL/src/CommonPictures/СтрелкаВлево/Picture.png deleted file mode 100644 index 58e0e3253..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВлево/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВлево/Picture.zip b/SSL/src/CommonPictures/СтрелкаВлево/Picture.zip new file mode 100644 index 000000000..2e7acdf18 Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВлево/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВниз/Picture.png b/SSL/src/CommonPictures/СтрелкаВниз/Picture.png deleted file mode 100644 index fa7913a7d..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВниз/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВниз/Picture.zip b/SSL/src/CommonPictures/СтрелкаВниз/Picture.zip new file mode 100644 index 000000000..e2377a5bf Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВниз/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.png b/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.png deleted file mode 100644 index 58d4c6897..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.zip b/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.zip new file mode 100644 index 000000000..a6c04c8c2 Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВнизСправка/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВправо/Picture.png b/SSL/src/CommonPictures/СтрелкаВправо/Picture.png deleted file mode 100644 index 1de77cd2d..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВправо/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВправо/Picture.zip b/SSL/src/CommonPictures/СтрелкаВправо/Picture.zip new file mode 100644 index 000000000..227b52a3b Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВправо/Picture.zip differ diff --git a/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.png b/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.png deleted file mode 100644 index e5c73df74..000000000 Binary files a/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.zip b/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.zip new file mode 100644 index 000000000..efaeaff6c Binary files /dev/null and b/SSL/src/CommonPictures/СтрелкаВправоКрасная/Picture.zip differ diff --git a/SSL/src/CommonPictures/Структура/Picture.png b/SSL/src/CommonPictures/Структура/Picture.png deleted file mode 100644 index d5e29f2ae..000000000 Binary files a/SSL/src/CommonPictures/Структура/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Структура/Picture.zip b/SSL/src/CommonPictures/Структура/Picture.zip new file mode 100644 index 000000000..696a42f30 Binary files /dev/null and b/SSL/src/CommonPictures/Структура/Picture.zip differ diff --git a/SSL/src/CommonPictures/Сумма/Picture.png b/SSL/src/CommonPictures/Сумма/Picture.png deleted file mode 100644 index cc6106de3..000000000 Binary files a/SSL/src/CommonPictures/Сумма/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Сумма/Picture.zip b/SSL/src/CommonPictures/Сумма/Picture.zip new file mode 100644 index 000000000..98620b6f0 Binary files /dev/null and b/SSL/src/CommonPictures/Сумма/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.png b/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.png deleted file mode 100644 index a2d3dcd1c..000000000 Binary files a/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.zip b/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.zip new file mode 100644 index 000000000..086db04a0 Binary files /dev/null and b/SSL/src/CommonPictures/ТелефонныйЗвонок/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипыМакетов/Picture.png b/SSL/src/CommonPictures/ТипыМакетов/Picture.png deleted file mode 100644 index bdc522fb0..000000000 Binary files a/SSL/src/CommonPictures/ТипыМакетов/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ТипыМакетов/Picture.zip b/SSL/src/CommonPictures/ТипыМакетов/Picture.zip new file mode 100644 index 000000000..4a5daff85 Binary files /dev/null and b/SSL/src/CommonPictures/ТипыМакетов/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.png b/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.png deleted file mode 100644 index 9fa3c2e05..000000000 Binary files a/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.zip b/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.zip new file mode 100644 index 000000000..faece806d Binary files /dev/null and b/SSL/src/CommonPictures/ТолстаяГраницаВокруг/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.png b/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.png deleted file mode 100644 index 0cd546c28..000000000 Binary files a/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.zip b/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.zip new file mode 100644 index 000000000..470c442d2 Binary files /dev/null and b/SSL/src/CommonPictures/ТолстаяГраницаСверху/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.png b/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.png deleted file mode 100644 index ec7a4b3b8..000000000 Binary files a/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.zip b/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.zip new file mode 100644 index 000000000..9509fcef5 Binary files /dev/null and b/SSL/src/CommonPictures/ТолстаяГраницаСнизу/Picture.zip differ diff --git a/SSL/src/CommonPictures/УвеличитьШрифт/Picture.png b/SSL/src/CommonPictures/УвеличитьШрифт/Picture.png deleted file mode 100644 index 6806cdf12..000000000 Binary files a/SSL/src/CommonPictures/УвеличитьШрифт/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/УвеличитьШрифт/Picture.zip b/SSL/src/CommonPictures/УвеличитьШрифт/Picture.zip new file mode 100644 index 000000000..4f28a09c8 Binary files /dev/null and b/SSL/src/CommonPictures/УвеличитьШрифт/Picture.zip differ diff --git a/SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/Picture.zip b/SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/Picture.zip new file mode 100644 index 000000000..bed281ecf Binary files /dev/null and b/SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/ПиктограммыПараметровИОтборов.mdo b/SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/УдалитьПиктограммыПараметровИОтборов.mdo similarity index 53% rename from SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/ПиктограммыПараметровИОтборов.mdo rename to SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/УдалитьПиктограммыПараметровИОтборов.mdo index f6804c9a7..fd26ebc13 100644 --- a/SSL/src/CommonPictures/ПиктограммыПараметровИОтборов/ПиктограммыПараметровИОтборов.mdo +++ b/SSL/src/CommonPictures/УдалитьПиктограммыПараметровИОтборов/УдалитьПиктограммыПараметровИОтборов.mdo @@ -1,8 +1,8 @@ - ПиктограммыПараметровИОтборов + УдалитьПиктограммыПараметровИОтборов ru - Пиктограммы параметров и отборов + (не используется) Пиктограммы параметров и отборов diff --git a/SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/Picture.zip b/SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/Picture.zip new file mode 100644 index 000000000..641ee967a Binary files /dev/null and b/SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/ПиктограммыСтруктурыОтчета.mdo b/SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/УдалитьПиктограммыСтруктурыОтчета.mdo similarity index 55% rename from SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/ПиктограммыСтруктурыОтчета.mdo rename to SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/УдалитьПиктограммыСтруктурыОтчета.mdo index cd5bb0b84..043ee435c 100644 --- a/SSL/src/CommonPictures/ПиктограммыСтруктурыОтчета/ПиктограммыСтруктурыОтчета.mdo +++ b/SSL/src/CommonPictures/УдалитьПиктограммыСтруктурыОтчета/УдалитьПиктограммыСтруктурыОтчета.mdo @@ -1,8 +1,8 @@ - ПиктограммыСтруктурыОтчета + УдалитьПиктограммыСтруктурыОтчета ru - Пиктограммы структуры отчета + (не используется) Пиктограммы структуры отчета diff --git a/SSL/src/CommonPictures/УменьшитьШрифт/Picture.png b/SSL/src/CommonPictures/УменьшитьШрифт/Picture.png deleted file mode 100644 index 69ff1af66..000000000 Binary files a/SSL/src/CommonPictures/УменьшитьШрифт/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/УменьшитьШрифт/Picture.zip b/SSL/src/CommonPictures/УменьшитьШрифт/Picture.zip new file mode 100644 index 000000000..e0893dfb7 Binary files /dev/null and b/SSL/src/CommonPictures/УменьшитьШрифт/Picture.zip differ diff --git a/SSL/src/CommonPictures/Успешно/Picture.png b/SSL/src/CommonPictures/Успешно/Picture.png deleted file mode 100644 index b60d373a7..000000000 Binary files a/SSL/src/CommonPictures/Успешно/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Успешно/Picture.zip b/SSL/src/CommonPictures/Успешно/Picture.zip new file mode 100644 index 000000000..117346422 Binary files /dev/null and b/SSL/src/CommonPictures/Успешно/Picture.zip differ diff --git a/SSL/src/CommonPictures/Успешно32/Picture.png b/SSL/src/CommonPictures/Успешно32/Picture.png deleted file mode 100644 index 15cc29c82..000000000 Binary files a/SSL/src/CommonPictures/Успешно32/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/Успешно32/Picture.zip b/SSL/src/CommonPictures/Успешно32/Picture.zip new file mode 100644 index 000000000..dc47a7f06 Binary files /dev/null and b/SSL/src/CommonPictures/Успешно32/Picture.zip differ diff --git a/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.png b/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.png deleted file mode 100644 index 82a2e932c..000000000 Binary files a/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.zip b/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.zip new file mode 100644 index 000000000..9cccbdbbe Binary files /dev/null and b/SSL/src/CommonPictures/УстановитьОтветственногоЗаВзаимодействие/Picture.zip differ diff --git a/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.png b/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.png deleted file mode 100644 index cfd49e731..000000000 Binary files a/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.zip b/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.zip new file mode 100644 index 000000000..db58a14d9 Binary files /dev/null and b/SSL/src/CommonPictures/УстановитьПредметВзаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.png b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.png deleted file mode 100644 index b60d373a7..000000000 Binary files a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.zip b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.zip new file mode 100644 index 000000000..9f5af6274 Binary files /dev/null and b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматExcel/Picture.png b/SSL/src/CommonPictures/ФорматExcel/Picture.png deleted file mode 100644 index 7e1fb0910..000000000 Binary files a/SSL/src/CommonPictures/ФорматExcel/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматExcel/Picture.zip b/SSL/src/CommonPictures/ФорматExcel/Picture.zip new file mode 100644 index 000000000..74fb7d455 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматExcel/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматExcel2007/Picture.png b/SSL/src/CommonPictures/ФорматExcel2007/Picture.png deleted file mode 100644 index 200b33ba6..000000000 Binary files a/SSL/src/CommonPictures/ФорматExcel2007/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматExcel2007/Picture.zip b/SSL/src/CommonPictures/ФорматExcel2007/Picture.zip new file mode 100644 index 000000000..5f1db34fc Binary files /dev/null and b/SSL/src/CommonPictures/ФорматExcel2007/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматHTML/Picture.png b/SSL/src/CommonPictures/ФорматHTML/Picture.png deleted file mode 100644 index e74ebff73..000000000 Binary files a/SSL/src/CommonPictures/ФорматHTML/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматHTML/Picture.zip b/SSL/src/CommonPictures/ФорматHTML/Picture.zip new file mode 100644 index 000000000..7aac6cf8b Binary files /dev/null and b/SSL/src/CommonPictures/ФорматHTML/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматMXL/Picture.png b/SSL/src/CommonPictures/ФорматMXL/Picture.png deleted file mode 100644 index e6508f033..000000000 Binary files a/SSL/src/CommonPictures/ФорматMXL/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматMXL/Picture.zip b/SSL/src/CommonPictures/ФорматMXL/Picture.zip new file mode 100644 index 000000000..82364cad2 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматMXL/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.png b/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.png deleted file mode 100644 index e6c2b0957..000000000 Binary files a/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.zip b/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.zip new file mode 100644 index 000000000..a4690cde9 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматOpenOfficeCalc/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.png b/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.png deleted file mode 100644 index 9c2c31439..000000000 Binary files a/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.zip b/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.zip new file mode 100644 index 000000000..964e1f206 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматOpenOfficeWriter/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматPDF/Picture.png b/SSL/src/CommonPictures/ФорматPDF/Picture.png deleted file mode 100644 index f66a00a49..000000000 Binary files a/SSL/src/CommonPictures/ФорматPDF/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматPDF/Picture.zip b/SSL/src/CommonPictures/ФорматPDF/Picture.zip new file mode 100644 index 000000000..e963f7f33 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматPDF/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматTXT/Picture.png b/SSL/src/CommonPictures/ФорматTXT/Picture.png deleted file mode 100644 index 2900c36a2..000000000 Binary files a/SSL/src/CommonPictures/ФорматTXT/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматTXT/Picture.zip b/SSL/src/CommonPictures/ФорматTXT/Picture.zip new file mode 100644 index 000000000..a005e745f Binary files /dev/null and b/SSL/src/CommonPictures/ФорматTXT/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматWord/Picture.png b/SSL/src/CommonPictures/ФорматWord/Picture.png deleted file mode 100644 index 7ad987d06..000000000 Binary files a/SSL/src/CommonPictures/ФорматWord/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматWord/Picture.zip b/SSL/src/CommonPictures/ФорматWord/Picture.zip new file mode 100644 index 000000000..9fd355826 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматWord/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматWord2007/Picture.png b/SSL/src/CommonPictures/ФорматWord2007/Picture.png deleted file mode 100644 index 4cf958a9e..000000000 Binary files a/SSL/src/CommonPictures/ФорматWord2007/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматWord2007/Picture.zip b/SSL/src/CommonPictures/ФорматWord2007/Picture.zip new file mode 100644 index 000000000..9959ad650 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматWord2007/Picture.zip differ diff --git a/SSL/src/CommonPictures/ФорматПустой/Picture.png b/SSL/src/CommonPictures/ФорматПустой/Picture.png deleted file mode 100644 index 02a3b1d57..000000000 Binary files a/SSL/src/CommonPictures/ФорматПустой/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ФорматПустой/Picture.zip b/SSL/src/CommonPictures/ФорматПустой/Picture.zip new file mode 100644 index 000000000..828dfe1a4 Binary files /dev/null and b/SSL/src/CommonPictures/ФорматПустой/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЦветТекста/Picture.png b/SSL/src/CommonPictures/ЦветТекста/Picture.png deleted file mode 100644 index 4d8e82932..000000000 Binary files a/SSL/src/CommonPictures/ЦветТекста/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЦветТекста/Picture.zip b/SSL/src/CommonPictures/ЦветТекста/Picture.zip new file mode 100644 index 000000000..8e881d784 Binary files /dev/null and b/SSL/src/CommonPictures/ЦветТекста/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЦветФона/Picture.png b/SSL/src/CommonPictures/ЦветФона/Picture.png deleted file mode 100644 index e868b9348..000000000 Binary files a/SSL/src/CommonPictures/ЦветФона/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЦветФона/Picture.zip b/SSL/src/CommonPictures/ЦветФона/Picture.zip new file mode 100644 index 000000000..264ffd351 Binary files /dev/null and b/SSL/src/CommonPictures/ЦветФона/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.png b/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.png deleted file mode 100644 index cb8d73d27..000000000 Binary files a/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.zip b/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.zip new file mode 100644 index 000000000..059e9b157 Binary files /dev/null and b/SSL/src/CommonPictures/ЭлектронноеПисьмо/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.png b/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.png deleted file mode 100644 index e0fccac53..000000000 Binary files a/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.zip b/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.zip new file mode 100644 index 000000000..cca766e46 Binary files /dev/null and b/SSL/src/CommonPictures/ЭлектронноеПисьмоВходящее/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.png b/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.png deleted file mode 100644 index aa224ebea..000000000 Binary files a/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.zip b/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.zip new file mode 100644 index 000000000..8d6787e0c Binary files /dev/null and b/SSL/src/CommonPictures/ЭлектронноеПисьмоИсходящее/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЯндексКарты/Picture.png b/SSL/src/CommonPictures/ЯндексКарты/Picture.png deleted file mode 100644 index d9ee0fa65..000000000 Binary files a/SSL/src/CommonPictures/ЯндексКарты/Picture.png and /dev/null differ diff --git a/SSL/src/CommonPictures/ЯндексКарты/Picture.zip b/SSL/src/CommonPictures/ЯндексКарты/Picture.zip new file mode 100644 index 000000000..e6aad3fa5 Binary files /dev/null and b/SSL/src/CommonPictures/ЯндексКарты/Picture.zip differ diff --git a/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs b/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs index b8f7a48e8..8e42d3445 100644 --- a/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs +++ b/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs @@ -518,6 +518,20 @@ false true + + ЭтоРИБСФильтром + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Это РИБСФильтром</v8:content> + </v8:item> + + + xs:boolean + + false + true + Основной Основной @@ -829,10 +843,18 @@ Equal true - - ЗапускатьТолькоВГлавномУзле - Equal - true + + OrGroup + + ЗапускатьТолькоВГлавномУзле + Equal + true + + + ПараметрыДанных.ЭтоРИБСФильтром + Equal + true + diff --git a/SSL/src/Configuration/Configuration.mdo b/SSL/src/Configuration/Configuration.mdo index 312482b39..779b08e52 100644 --- a/SSL/src/Configuration/Configuration.mdo +++ b/SSL/src/Configuration/Configuration.mdo @@ -1,17 +1,17 @@ - + БиблиотекаСтандартныхПодсистем ru Библиотека стандартных подсистем, редакция 2.3 - - - - - - - + + + + + + + ManagedApplication PersonalComputer Russian @@ -19,7 +19,7 @@ Role.АдминистраторСистемы Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Фирма "1С" - 2.3.7.10 + 2.4.1.80 http://downloads.v8.1c.ru/tmplts/ true @@ -56,7 +56,7 @@ NotAutoFree UseWithWarnings TaxiEnableVersion8_2 - 8.3.8 + 8.3.10 Русский @@ -74,8 +74,8 @@ StyleItem.ВидДняПроизводственногоКалендаряПредпраздничныйЦвет StyleItem.ВидДняПроизводственногоКалендаряРабочийЦвет StyleItem.ВидДняПроизводственногоКалендаряСубботаЦвет - StyleItem.ВидимыйВариантОтчетаЦвет StyleItem.ВыполненнаяЗадача + StyleItem.ГиперссылкаЦвет StyleItem.ГруппаВариантовОтчетовЦвет StyleItem.ГруппаВариантовОтчетовЦвет82 StyleItem.ДатаГрафикаИзмененнаяФон @@ -115,6 +115,7 @@ StyleItem.УдаленныйРеквизитФон StyleItem.ФайлЗанятыйТекущимПользователем StyleItem.ФонУправляющегоПоля + StyleItem.ЦветПустойГиперссылки StyleItem.ЦветТекстаКонтрагентаДействующего StyleItem.ЦветТекстаКонтрагентаПрекратившегоДеятельность StyleItem.ЦветТекстаНекорректногоКонтрагента @@ -189,6 +190,7 @@ CommonPicture.ДополнительныеСведения CommonPicture.ДосьеУвеличениеПоказателя CommonPicture.ДосьеУменьшениеПоказателя + CommonPicture.ЗавершитьРаботу CommonPicture.ЗавершитьРедактированиеМакета CommonPicture.ЗакончитьРедактированиеФайла CommonPicture.Заметка @@ -241,12 +243,14 @@ CommonPicture.КонтактнаяИнформацияНеактуально CommonPicture.КонтактнаяИнформацияПерейтиПоСсылке CommonPicture.КурсивноеНачертание + CommonPicture.МенюДополнительныеФункции CommonPicture.НаписатьSMS CommonPicture.Напоминание CommonPicture.НезавершившаясяПроверка CommonPicture.НекорректныйКонтрагент CommonPicture.НетГраницы CommonPicture.ОбновитьФайлИзФайлаНаДиске + CommonPicture.ОбновлениеВнешнихКомпонентССайта CommonPicture.ОбъединитьЯчейки CommonPicture.ОбычныйДоступСФлажком CommonPicture.ОпубликоватьФайл @@ -274,12 +278,11 @@ CommonPicture.ПереместитьВлевоВсе CommonPicture.ПереместитьВПапкуПисем CommonPicture.ПереместитьВправоВниз + CommonPicture.ПереслатьПисьмоКакВложение CommonPicture.ПереслатьЭлектронноеПисьмо CommonPicture.ПиктограммыДоступаКНастройкамОтчета CommonPicture.ПиктограммыНастроекОтчета - CommonPicture.ПиктограммыПараметровИОтборов CommonPicture.ПиктограммыПланОбменаУзел - CommonPicture.ПиктограммыСтруктурыОтчета CommonPicture.ПиктограммыЭлементов CommonPicture.Подменю CommonPicture.ПодписанЗашифрованЗаголовок @@ -319,6 +322,7 @@ CommonPicture.РассылкаОтчетов CommonPicture.РедактироватьМакет CommonPicture.РедактироватьФайл + CommonPicture.РежимИспользованияПриложенияВСервисеЛокально CommonPicture.Сервис1СКонтрагент CommonPicture.СертификатКлюча CommonPicture.СинхронизацияДанных @@ -389,6 +393,8 @@ CommonPicture.ТолстаяГраницаСверху CommonPicture.ТолстаяГраницаСнизу CommonPicture.УвеличитьШрифт + CommonPicture.УдалитьПиктограммыПараметровИОтборов + CommonPicture.УдалитьПиктограммыСтруктурыОтчета CommonPicture.УменьшитьШрифт CommonPicture.Успешно CommonPicture.Успешно32 @@ -452,6 +458,7 @@ Role.БазовыеПрава Role.БазовыеПраваВнешнегоПользователя Role.ВыводНаПринтерФайлБуферОбмена + Role.ВызовОнлайнПоддержки Role.ВыполнениеСинхронизацииДанных Role.ДобавлениеИзменениеАдресныхСведений Role.ДобавлениеИзменениеБанков @@ -471,9 +478,11 @@ Role.ДобавлениеИзменениеНапоминаний Role.ДобавлениеИзменениеОпросов Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + Role.ДобавлениеИзменениеПапокИФайлов Role.ДобавлениеИзменениеПользователей Role.ДобавлениеИзменениеРассылокОтчетов Role.ДобавлениеИзменениеРолейИсполнителей + Role.ДобавлениеИзменениеУчетныхЗаписейЭлектроннойПочты Role.ДобавлениеИзменениеШаблоновАнкет Role.ДобавлениеИзменениеШаблоновСообщений Role.ДобавлениеИзменениеЭлектронныхПодписейИШифрование @@ -486,7 +495,6 @@ Role.ИзменениеДополнительныхСведений Role.ИзменениеМакетовПечатныхФорм Role.ИзменениеУчастниковГруппДоступа - Role.Интеграция1СБухфон Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Role.ИспользованиеОбработкиТекущиеДела Role.ИспользованиеУниверсальногоОтчета @@ -499,7 +507,7 @@ Role.ПросмотрОписанияИзмененийПрограммы Role.ПросмотрОтчетаДосьеКонтрагента Role.ПросмотрСвязанныеДокументы - Role.РаботаСПапкамиФайлов + Role.РедактированиеПечатныхФорм Role.РедактированиеРеквизитовОбъектов Role.РежимВсеФункции Role.СохранениеДанныхПользователя @@ -516,7 +524,6 @@ Role.ЧтениеИнформацииОВерсияхОбъектов Role.ЧтениеКурсовВалют Role.ЧтениеОтветовНаВопросыАнкет - Role.ЧтениеУчетныхЗаписейЭлектроннойПочты CommonTemplate.ИнструкцияКакВыполнитьУстановкуОбновленияВручную CommonTemplate.ИнструкцияПоПроверкеКонтрагентов CommonTemplate.КомпонентаTWAIN @@ -565,10 +572,20 @@ CommonModule.ВзаимодействияКлиент CommonModule.ВзаимодействияКлиентПереопределяемый CommonModule.ВзаимодействияКлиентСервер - CommonModule.ВзаимодействияКлиентСерверПовтИспПереопределяемый + CommonModule.ВзаимодействияКлиентСерверПереопределяемый + CommonModule.ВзаимодействияКлиентСерверСлужебныйПовтИсп CommonModule.ВзаимодействияПереопределяемый CommonModule.ВзаимодействияСобытия + CommonModule.ВнешниеКомпонентыВызовСервера + CommonModule.ВнешниеКомпонентыКлиент + CommonModule.ВнешниеКомпонентыСлужебный + CommonModule.ВнешниеКомпонентыСлужебныйВызовСервера + CommonModule.ВнешниеКомпонентыСлужебныйКлиент CommonModule.ВнешниеПользователи + CommonModule.ВызовОнлайнПоддержки + CommonModule.ВызовОнлайнПоддержкиВызовСервера + CommonModule.ВызовОнлайнПоддержкиКлиент + CommonModule.ВызовОнлайнПоддержкиПереопределяемый CommonModule.ГрафикиРаботы CommonModule.ГрафикиРаботыКлиентСервер CommonModule.ГрупповоеИзменениеОбъектовКлиент @@ -584,8 +601,6 @@ CommonModule.ДлительныеОперацииГлобальный CommonModule.ДлительныеОперацииКлиент CommonModule.ДополнительныеОтчетыИОбработки - CommonModule.ДополнительныеОтчетыИОбработкиВБезопасномРежиме - CommonModule.ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера CommonModule.ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс CommonModule.ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп CommonModule.ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный @@ -616,11 +631,10 @@ CommonModule.ЗащитаПерсональныхДанныхКлиент CommonModule.ЗащитаПерсональныхДанныхПереопределяемый CommonModule.ЗащитаПерсональныхДанныхПовтИсп - CommonModule.Интеграция1СБухфон - CommonModule.Интеграция1СБухфонВызовСервера - CommonModule.Интеграция1СБухфонКлиент - CommonModule.Интеграция1СБухфонПереопределяемый CommonModule.ИнтеграцияСтандартныхПодсистем + CommonModule.ИнтеграцияСтандартныхПодсистемКлиент + CommonModule.ИнтеграцияСТехнологиейСервиса + CommonModule.ИнтеграцияСТехнологиейСервисаКлиент CommonModule.ИнтерфейсыСообщенийВМоделиСервиса CommonModule.ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый CommonModule.ИнформацияПриЗапуске @@ -629,9 +643,6 @@ CommonModule.КалендарныеГрафики CommonModule.КалендарныеГрафикиПереопределяемый CommonModule.КалендарныеГрафикиСлужебныйВМоделиСервиса - CommonModule.КонтрольДинамическогоОбновленияКонфигурацииВызовСервера - CommonModule.КонтрольДинамическогоОбновленияКонфигурацииСлужебный - CommonModule.КонтрольДинамическогоОбновленияКонфигурацииСлужебныйКлиент CommonModule.КурсыВалютСлужебныйВМоделиСервиса CommonModule.НапоминанияПользователяВызовСервера CommonModule.НапоминанияПользователяГлобальный @@ -642,12 +653,11 @@ CommonModule.НапоминанияПользователяПереопределяемый CommonModule.НапоминанияПользователяСлужебный CommonModule.НастройкаПорядкаЭлементов - CommonModule.НастройкаПорядкаЭлементовКлиент CommonModule.НастройкаПорядкаЭлементовСлужебный - CommonModule.НастройкаПорядкаЭлементовСлужебныйВызовСервера CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент + CommonModule.НастройкиПрограммыПереопределяемый CommonModule.ОбменДаннымиXDTOСервер CommonModule.ОбменДаннымиВнешнееСоединение CommonModule.ОбменДаннымиВызовСервера @@ -676,7 +686,6 @@ CommonModule.ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса CommonModule.ОбновлениеИнформационнойБазыСлужебныйВызовСервера CommonModule.ОбновлениеИнформационнойБазыСлужебныйПовтИсп - CommonModule.ОбновлениеИнформационнойБазыСобытия CommonModule.ОбновлениеКонфигурации CommonModule.ОбновлениеКонфигурацииВызовСервера CommonModule.ОбновлениеКонфигурацииКлиент @@ -689,6 +698,7 @@ CommonModule.ОбщегоНазначенияКлиентСервер CommonModule.ОбщегоНазначенияПереопределяемый CommonModule.ОбщегоНазначенияПовтИсп + CommonModule.ОбщегоНазначенияСлужебныйКлиент CommonModule.ОтправкаSMS CommonModule.ОтправкаSMSКлиент CommonModule.ОтправкаSMSКлиентПереопределяемый @@ -758,9 +768,6 @@ CommonModule.ПрисоединенныеФайлыКлиент CommonModule.ПрисоединенныеФайлыКлиентСервер CommonModule.ПрисоединенныеФайлыПереопределяемый - CommonModule.ПрисоединенныеФайлыСлужебный - CommonModule.ПрисоединенныеФайлыСлужебныйВызовСервера - CommonModule.ПрисоединенныеФайлыСлужебныйКлиент CommonModule.ПроверкаКонтрагентов CommonModule.ПроверкаКонтрагентовВызовСервера CommonModule.ПроверкаКонтрагентовВызовСервераПовтИсп @@ -777,6 +784,8 @@ CommonModule.РаботаВМоделиСервисаКлиент CommonModule.РаботаВМоделиСервисаПереопределяемый CommonModule.РаботаВМоделиСервисаПовтИсп + CommonModule.РаботаСАдресами + CommonModule.РаботаСАдресамиКлиентСервер CommonModule.РаботаСБанками CommonModule.РаботаСБанкамиГлобальный CommonModule.РаботаСБанкамиКлиент @@ -805,6 +814,8 @@ CommonModule.РаботаСФайламиСлужебныйВызовСервера CommonModule.РаботаСФайламиСлужебныйКлиент CommonModule.РаботаСФайламиСлужебныйКлиентПовтИсп + CommonModule.РаботаСФайламиСлужебныйКлиентСервер + CommonModule.РаботаСФайламиСлужебныйПовтИсп CommonModule.РассылкаОтчетов CommonModule.РассылкаОтчетовВызовСервера CommonModule.РассылкаОтчетовКлиент @@ -844,22 +855,11 @@ CommonModule.СообщенияВМоделиСервисаРазделениеДанных CommonModule.СообщенияКонтрольРезервногоКопированияИнтерфейс CommonModule.СообщенияКонтрольРезервногоКопированияОбработчикТрансляции_1_0_2_1 - CommonModule.СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс - CommonModule.СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_3 - CommonModule.СообщенияКонтрольУдаленногоАдминистрированияОбработчикТрансляции_1_0_2_4 CommonModule.СообщенияПоставляемыхДанныхОбработчикСообщения - CommonModule.СообщенияУдаленногоАдминистрированияИнтерфейс - CommonModule.СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_1 - CommonModule.СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_2 - CommonModule.СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_3 - CommonModule.СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4 - CommonModule.СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_5 - CommonModule.СообщенияУдаленногоАдминистрированияРеализация CommonModule.СообщенияУправлениеРезервнымКопированиемИнтерфейс CommonModule.СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_2_1 CommonModule.СообщенияУправлениеРезервнымКопированиемОбработчикСообщения_1_0_3_1 CommonModule.СообщенияУправлениеРезервнымКопированиемРеализация - CommonModule.СообщенияУправленияПриложениямиИнтерфейс CommonModule.СтандартныеПодсистемыВызовСервера CommonModule.СтандартныеПодсистемыГлобальный CommonModule.СтандартныеПодсистемыКлиент @@ -879,7 +879,6 @@ CommonModule.ТрансляцияXDTOСлужебный CommonModule.УдалениеПомеченныхОбъектовПереопределяемый CommonModule.УдалениеПомеченныхОбъектовСлужебный - CommonModule.УдаленноеАдминистрированиеСлужебный CommonModule.УправлениеДоступом CommonModule.УправлениеДоступомПереопределяемый CommonModule.УправлениеДоступомСлужебный @@ -913,13 +912,7 @@ CommonModule.УправлениеЭлектроннойПочтойКлиент CommonModule.ФайловыеФункции CommonModule.ФайловыеФункцииКлиент - CommonModule.ФайловыеФункцииСлужебный CommonModule.ФайловыеФункцииСлужебныйВМоделиСервиса - CommonModule.ФайловыеФункцииСлужебныйВызовСервера - CommonModule.ФайловыеФункцииСлужебныйКлиент - CommonModule.ФайловыеФункцииСлужебныйКлиентПовтИсп - CommonModule.ФайловыеФункцииСлужебныйКлиентСервер - CommonModule.ФайловыеФункцииСлужебныйПовтИсп CommonModule.ФизическиеЛицаКлиентСервер CommonModule.ЦентрМониторинга CommonModule.ЦентрМониторингаВызовСервераПовтИсп @@ -934,6 +927,7 @@ CommonModule.ШаблоныСообщенийПереопределяемый CommonModule.ШаблоныСообщенийСервер CommonModule.ШаблоныСообщенийСлужебный + CommonModule.ШаблоныСообщенийСлужебныйПовтИсп CommonModule.ЭлектроннаяПодпись CommonModule.ЭлектроннаяПодписьКлиент CommonModule.ЭлектроннаяПодписьКлиентПереопределяемый @@ -956,30 +950,19 @@ XDTOPackage.ApplicationPermissions_1_0_0_1 XDTOPackage.ApplicationPermissions_1_0_0_2 XDTOPackage.CurrencyRates - XDTOPackage.EnterpriseData_1_0_4 - XDTOPackage.EnterpriseData_1_0_beta - XDTOPackage.EnterpriseData_1_1_4 - XDTOPackage.EnterpriseData_1_2_3 - XDTOPackage.EnterpriseData_1_3_8 - XDTOPackage.EnterpriseData_1_4_4 + XDTOPackage.EnterpriseData_1_2_2 + XDTOPackage.EnterpriseData_1_3_6 + XDTOPackage.EnterpriseData_1_4_2 XDTOPackage.EnterpriseDataExchange_1_0_1_1 XDTOPackage.ExchangeMessage XDTOPackage.SuppliedData - XDTOPackage.V8AddinBundle + XDTOPackage.Адрес XDTOPackage.АдресныйКлассификатор XDTOPackage.КонтактнаяИнформация XDTOPackage.КонтрольРезервногоКопированияОбластейДанных_1_0_2_1 XDTOPackage.КонтрольРезервногоКопированияОбластейДанных_1_0_3_1 - XDTOPackage.КонтрольУдаленногоАдминистрирования_1_0_2_3 - XDTOPackage.КонтрольУдаленногоАдминистрирования_1_0_2_4 - XDTOPackage.КонтрольУдаленногоАдминистрирования_1_0_2_5 XDTOPackage.Сообщения XDTOPackage.СообщенияУдаленногоАдминистрирования - XDTOPackage.УдаленноеАдминистрированиеВМоделиСервиса_1_0_3_1 - XDTOPackage.УдаленноеАдминистрированиеВМоделиСервиса_1_0_3_2 - XDTOPackage.УдаленноеАдминистрированиеВМоделиСервиса_1_0_3_3 - XDTOPackage.УдаленноеАдминистрированиеВМоделиСервиса_1_0_3_4 - XDTOPackage.УдаленноеАдминистрированиеВМоделиСервиса_1_0_3_5 XDTOPackage.УправлениеПриложениями XDTOPackage.УправлениеРезервнымКопированиемОбластейДанных_1_0_2_1 XDTOPackage.УправлениеРезервнымКопированиемОбластейДанных_1_0_3_1 @@ -1042,16 +1025,16 @@ EventSubscription.ПроверитьУстранениеПроблемыДокумента EventSubscription.ПроверитьУстранениеПроблемыОбъекта EventSubscription.СброситьЗначениеРеквизитаУпорядочивания + EventSubscription.СвойстваПередУдалениемСсылочногоОбъекта EventSubscription.СкопироватьРеквизитыВерсииФайловВФайл EventSubscription.СоздатьПредопределенныеПапкиЭлектронныхПисем EventSubscription.СохранитьРезультатПроверкиКонтрагента EventSubscription.УстановитьПометкуУдаленияЗадач EventSubscription.УстановитьПометкуУдаленияПрисоединенныхФайлов EventSubscription.УстановитьПометкуУдаленияПрисоединенныхФайловДокументовВзаимодействия - EventSubscription.УстановитьПометкуУдаленияФайлов EventSubscription.УстановитьСнятьПометкуУдаленияЗаметок EventSubscription.УстановитьСтатусИзмененияПометкиУдаленияПользователя - ScheduledJob.ЗагрузкаКлассификатораБанковРФССайтаРБК + ScheduledJob.ЗагрузкаКлассификатораБанков ScheduledJob.ЗагрузкаКурсовВалют ScheduledJob.ЗаполнениеДанныхДляОграниченияДоступа ScheduledJob.ЗапускДополнительныхОбработок @@ -1059,6 +1042,7 @@ ScheduledJob.КонтрольАктивностиПользователей ScheduledJob.МониторингЗадач ScheduledJob.ОбновлениеАгрегатов + ScheduledJob.ОбновлениеВнешнихКомпонентССайта ScheduledJob.ОбновлениеИндексаППД ScheduledJob.ОбновлениеОбластейДанных ScheduledJob.ОбновлениеСтатусовДоставкиSMS @@ -1100,17 +1084,15 @@ FunctionalOption.ИспользоватьДатуНачалаЗадач FunctionalOption.ИспользоватьДатыЗапретаЗагрузки FunctionalOption.ИспользоватьДатыЗапретаИзменения - FunctionalOption.ИспользоватьДополнительныеОбработкиЗаполненияОбъекта FunctionalOption.ИспользоватьДополнительныеОбработкиСозданияСвязанныхОбъектов - FunctionalOption.ИспользоватьДополнительныеОтчеты FunctionalOption.ИспользоватьДополнительныеОтчетыИОбработки FunctionalOption.ИспользоватьДополнительныеРеквизитыИСведения FunctionalOption.ИспользоватьЗаметки - FunctionalOption.ИспользоватьИнтеграцию1СБухфон FunctionalOption.ИспользоватьНапоминанияПользователя FunctionalOption.ИспользоватьНесколькоПроизводственныхКалендарей FunctionalOption.ИспользоватьОбщиеДополнительныеЗначения FunctionalOption.ИспользоватьОбщиеДополнительныеРеквизитыИСведения + FunctionalOption.ИспользоватьОнлайнПоддержку FunctionalOption.ИспользоватьОтправкуSMSВШаблонахСообщений FunctionalOption.ИспользоватьПодчиненныеБизнесПроцессы FunctionalOption.ИспользоватьПолнотекстовыйПоиск @@ -1120,6 +1102,7 @@ FunctionalOption.ИспользоватьСинхронизациюДанных FunctionalOption.ИспользоватьСинхронизациюДанныхВЛокальномРежиме FunctionalOption.ИспользоватьСинхронизациюФайлов + FunctionalOption.ИспользоватьУдалениеПомеченныхОбъектов FunctionalOption.ИспользоватьШаблоныСообщений FunctionalOption.ИспользоватьШифрование FunctionalOption.ИспользоватьЭлектроннуюПочтуВШаблонахСообщений @@ -1159,7 +1142,6 @@ DefinedType.ВладелецПрисоединенныхФайловОбъект DefinedType.ВладелецСОграничениемПоНаборамЗначенийДоступаОбъект DefinedType.ВладелецФайлов - DefinedType.ВладелецФайловОбъект DefinedType.ВнешнийПользователь DefinedType.ВнешнийПользовательОбъект DefinedType.ЗначениеДоступа @@ -1174,7 +1156,8 @@ DefinedType.ОбъектСклонения DefinedType.ОбъектСНастраиваемымПорядком DefinedType.Организация - DefinedType.ОтложенныеБизнесПроцессы + DefinedType.ОтложенныйБизнесПроцесс + DefinedType.ПодписанныйОбъект DefinedType.Подразделение DefinedType.ПолучательРассылки DefinedType.Пользователь @@ -1190,6 +1173,9 @@ DefinedType.Респондент DefinedType.СубъектПерсональныхДанных DefinedType.ФизическоеЛицо + CommonCommand.ВерсииФайла + CommonCommand.ВремяТекущегоСеанса + CommonCommand.ВсеФайлы CommonCommand.ДобавитьПользователейСервиса CommonCommand.ДополнительныеОбработкиАдминистрирование CommonCommand.ДополнительныеОтчетыАдминистрирование @@ -1200,23 +1186,20 @@ CommonCommand.ЗагрузитьПравилаРегистрацииОбъектов CommonCommand.ЗадачиПоБизнесПроцессу CommonCommand.ЗадачиПоПредмету - CommonCommand.ЗаполнениеОбъекта - CommonCommand.Запустить1СБухфон CommonCommand.ИсторияИзменений CommonCommand.КартаМаршрутаБизнесПроцесса CommonCommand.МоиЗаметкиПоПредмету CommonCommand.Напомнить CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена CommonCommand.НастроитьПрава - CommonCommand.Настройка1СБухфон CommonCommand.НастройкаОбменаСообщениями + CommonCommand.НастройкаОнлайнПоддержки CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты CommonCommand.НастройкиПроверкиКонтрагентов CommonCommand.НастройкиСинхронизацииДанных CommonCommand.ОбменСообщениями CommonCommand.ОтправитьSMS CommonCommand.ОтправитьПисьмо - CommonCommand.ОтчетыОбъекта CommonCommand.ПанельОтчетовАдминистрирование CommonCommand.ПереходКНастройкамДоступаКВебСервису CommonCommand.ПерсональнаяНастройкаПроксиСервера @@ -1226,10 +1209,12 @@ CommonCommand.ПредупрежденияПриЗавершенииРаботы CommonCommand.ПредупрежденияПриСинхронизацииДанных CommonCommand.ПрисоединенныеФайлы - CommonCommand.ПрисоединенныеФайлыКОбъекту + CommonCommand.ПроверитьДоступКСервису CommonCommand.РазместитьФайлыНачальногоОбраза + CommonCommand.РедактируемыеФайлы CommonCommand.РолиИИсполнителиЗадач CommonCommand.СведенияОПользователе + CommonCommand.СвязатьсяСоСпециалистомОнлайнПоддержки CommonCommand.Синхронизировать CommonCommand.СинхронизироватьСДополнительнымиПараметрами CommonCommand.СменитьПароль @@ -1256,8 +1241,7 @@ Constant.АдресПубликацииИнформационнойБазыВЛокальнойСети Constant.БлокировкаОтправкиБыстрыхСообщений Constant.ВерсияДатЗапретаИзменения - Constant.ВерсияКлассификатораБанковРФ - Constant.ВнутреннийАдресМенеджераСервиса + Constant.ВерсияКлассификатораБанков Constant.ВыполнитьРезервноеКопированиеОбластиДанных Constant.ВыполнятьЗамерыПроизводительности Constant.ГлавныйУзел @@ -1287,11 +1271,11 @@ Constant.ИспользоватьДополнительныеОтчетыИОбработки Constant.ИспользоватьДополнительныеРеквизитыИСведения Constant.ИспользоватьЗаметки - Constant.ИспользоватьИнтеграцию1СБухфон Constant.ИспользоватьНапоминанияПользователя Constant.ИспользоватьНесколькоПроизводственныхКалендарей Constant.ИспользоватьОбщиеДополнительныеЗначения Constant.ИспользоватьОбщиеДополнительныеРеквизитыИСведения + Constant.ИспользоватьОнлайнПоддержку Constant.ИспользоватьОтправкуSMSВШаблонахСообщений Constant.ИспользоватьПодчиненныеБизнесПроцессы Constant.ИспользоватьПолнотекстовыйПоиск @@ -1304,6 +1288,7 @@ Constant.ИспользоватьСинхронизациюДанных Constant.ИспользоватьСинхронизациюДанныхВЛокальномРежиме Constant.ИспользоватьСинхронизациюДанныхВМоделиСервиса + Constant.ИспользоватьУдалениеПомеченныхОбъектов Constant.ИспользоватьШаблоныСообщений Constant.ИспользоватьШифрование Constant.ИспользоватьЭлектроннуюПочтуВШаблонахСообщений @@ -1317,7 +1302,6 @@ Constant.КлючОбластиДанных Constant.КоличествоЗамеровВПакетеЭкспорта Constant.КоличествоЭлементовВТранзакцииЗагрузкиДанных - Constant.КонечнаяТочкаМенеджераСервиса Constant.КопироватьОбластиДанныхИзЭталонной Constant.ЛогинДоступаКСервисуMorpher Constant.МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания @@ -1327,7 +1311,6 @@ Constant.НастройкаПодчиненногоУзлаРИБЗавершена Constant.НастройкаПроксиСервера Constant.НастройкиВходаПользователей - Constant.НастройкиВыполненияРегламентныхЗаданий Constant.НастройкиПодчиненногоУзлаРИБ Constant.НеИспользоватьРазделениеПоОбластямДанных Constant.ОграничиватьДоступНаУровнеЗаписей @@ -1338,14 +1321,8 @@ Constant.ПараметрыАдминистрированияИБ Constant.ПараметрыАдресногоКлассификатора Constant.ПараметрыБлокировкиРаботыСВнешнимиРесурсами - Constant.ПараметрыВариантовОтчетов - Constant.ПараметрыДополнительныхРеквизитовИСведений Constant.ПараметрыИтоговИАгрегатов - Constant.ПараметрыОграниченияДоступа - Constant.ПараметрыПодключаемыхКоманд - Constant.ПараметрыРаботыПользователей Constant.ПараметрыРезервногоКопирования - Constant.ПараметрыСлужебныхСобытий Constant.ПараметрыЦентраМониторинга Constant.ПериодХраненияЗамеров Constant.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском @@ -1356,7 +1333,6 @@ Constant.ПровайдерSMS Constant.ПроверятьЭлектронныеПодписиНаСервере Constant.ПрофильБезопасностиИнформационнойБазы - Constant.РазделыОписанияИзмененийСистемы Constant.РазмерБлокаПередачиФайла Constant.РежимИспользованияИнформационнойБазы Constant.СведенияОБлокируемыхОбъектах @@ -1374,7 +1350,9 @@ Constant.УдалитьАлгоритмПодписи Constant.УдалитьАлгоритмХеширования Constant.УдалитьАлгоритмШифрования + Constant.УдалитьВнутреннийАдресМенеджераСервиса Constant.УдалитьИмяСлужебногоПользователяМенеджераСервиса + Constant.УдалитьКонечнаяТочкаМенеджераСервиса Constant.УдалитьЛогинДляОтправкиSMS Constant.УдалитьПарольДляОтправкиSMS Constant.УдалитьПарольСлужебногоПользователяМенеджераСервиса @@ -1389,6 +1367,7 @@ CommonForm.ВводЗначенийСпискомСФлажками CommonForm.ВключениеПроверкиКонтрагентов CommonForm.Вопрос + CommonForm.ВопросОбУстановкеВнешнейКомпоненты CommonForm.ВопросОбУстановкеРасширенияРаботыСКриптографией CommonForm.ВопросОбУстановкеРасширенияРаботыСФайлами CommonForm.ВосстановлениеСвязиСГлавнымУзлом @@ -1401,7 +1380,6 @@ CommonForm.ВыборКонтакта CommonForm.ВыборОбъектовИнформационнойБазыКорреспондента CommonForm.ВыборОбъектовМетаданных - CommonForm.ВыборПолучателейСообщения CommonForm.ВыборПутиКАрхивуФайловТомов CommonForm.ВыборРолиИсполнителя CommonForm.ВыборТиповПользователей @@ -1413,14 +1391,15 @@ CommonForm.ДополнительноеОписание CommonForm.ДополнительныеОтчетыИОбработки CommonForm.ДополнительныеПараметрыПроксиСервера + CommonForm.ДоступныеВидыКлиентовВнешнейКомпоненты CommonForm.ЗаполнениеРеквизитовКонтрагента CommonForm.МастерАнкетыПоРазделам CommonForm.НапоминаниеПриРедактировании - CommonForm.Настройка1СБухфон CommonForm.НастройкаДоступаКСервисуMorpher CommonForm.НастройкаКомандПечати CommonForm.НастройкаМоихОтчетовИОбработок CommonForm.НастройкаОбменаСообщениями + CommonForm.НастройкаОнлайнПоддержки CommonForm.НастройкаОсновногоРабочегоКаталога CommonForm.НастройкаОтправкиSMS CommonForm.НастройкиВходаПользователей @@ -1440,17 +1419,16 @@ CommonForm.ПечатьДокументов CommonForm.ПодготовкаНовогоПисьма CommonForm.ПодключениеКонечнойТочки - CommonForm.ПоискИсполняемогоФайла1СБухфон + CommonForm.ПоискИсполняемогоФайлаОнлайнПоддержки CommonForm.ПоказателиВыделенныхЯчеек CommonForm.ПользователиСервиса CommonForm.ПраваДоступа CommonForm.ПраваДоступаУпрощенно CommonForm.ПредупреждениеБезопасности CommonForm.ПредупрежденияПриЗавершенииРаботы - CommonForm.ПрисоединенныеФайлы - CommonForm.ПрисоединенныйФайл CommonForm.ПустойРабочийСтол CommonForm.Расширения + CommonForm.РедактированиеГиперссылки CommonForm.РедактированиеДополнительныхСведений CommonForm.РедактированиеТабличногоДокумента CommonForm.РезультатПроверки @@ -1463,6 +1441,7 @@ CommonForm.СозданиеРезервнойКопии CommonForm.СохранениеВместеСЭлектроннойПодписью CommonForm.СохранениеПечатнойФормы + CommonForm.СравнениеТабличныхДокументов CommonForm.СтруктураПодчиненности CommonForm.УстановкаВедущейКонечнойТочки CommonForm.УточнениеКонтактов @@ -1478,6 +1457,7 @@ Catalog.ВерсииРасширений Catalog.ВерсииФайлов Catalog.ВидыКонтактнойИнформации + Catalog.ВнешниеКомпоненты Catalog.ВнешниеПользователи Catalog.ВопросыШаблонаАнкеты Catalog.ВстречаПрисоединенныеФайлы @@ -1494,7 +1474,7 @@ Catalog.ИдентификаторыОбъектовМетаданных Catalog.ИдентификаторыОбъектовРасширений Catalog.Календари - Catalog.КлассификаторБанковРФ + Catalog.КлассификаторБанков Catalog.КлючевыеОперации Catalog.НаборыДополнительныхРеквизитовИСведений Catalog.ОчередьЗаданий @@ -1546,6 +1526,7 @@ Enum.ВариантыВажностиВзаимодействия Enum.ВариантыВажностиЗадачи Enum.ВариантыВерсионированияОбъектов + Enum.ВариантыИспользованияВнешнихКомпонент Enum.ВариантыОчисткиФайлов Enum.ВариантыПубликацииДополнительныхОтчетовИОбработок Enum.ВариантыСжатияTIFF @@ -1647,14 +1628,18 @@ DataProcessor.ВыгрузкаЗагрузкаEnterpriseData DataProcessor.ВыполнениеОбменаДанными DataProcessor.ГрупповоеИзменениеРеквизитов + DataProcessor.ДоступныеАнкеты DataProcessor.ЖурналРегистрации DataProcessor.ЗагрузкаДанныхИзФайла + DataProcessor.ЗагрузкаКлассификатораБанков DataProcessor.ЗагрузкаКурсовВалют DataProcessor.ЗагрузкаПравилРегистрацииОбъектов DataProcessor.ЗаменаИОбъединениеЭлементов + DataProcessor.ЗаполнениеГрафиковРаботы + DataProcessor.ЗаполнениеКалендарныхГрафиков DataProcessor.ЗащитаПерсональныхДанных + DataProcessor.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата DataProcessor.ИнструкцияПоИспользованиюПроверкиКонтрагента - DataProcessor.ИнструментыРазработчикаПроверкаКонтрагентов DataProcessor.ИнтерактивноеИзменениеВыгрузки DataProcessor.ИнформацияПриЗапуске DataProcessor.КартаМаршрутаБизнесПроцесса @@ -1674,6 +1659,9 @@ DataProcessor.ПолнотекстовыйПоискВДанных DataProcessor.ПомощникИнтерактивногоОбменаДанными DataProcessor.ПомощникСозданияОбменаДанными + DataProcessor.ПрограммыЭлектроннойПодписиИШифрования + DataProcessor.РаботаСФайлами + DataProcessor.РасширенныйВводКонтактнойИнформации DataProcessor.РегистрацияИзмененийДляОбменаДанными DataProcessor.РегламентныеИФоновыеЗадания DataProcessor.РезервноеКопированиеИБ @@ -1683,7 +1671,6 @@ DataProcessor.Сканирование DataProcessor.СкрытиеКонфиденциальнойИнформации DataProcessor.СопоставлениеОбъектовИнформационныхБаз - DataProcessor.СписокРеспондента DataProcessor.ТекущиеДела DataProcessor.ТранспортСообщенийОбменаEMAIL DataProcessor.ТранспортСообщенийОбменаFILE @@ -1708,6 +1695,7 @@ InformationRegister.ДанныеПроизводственногоКалендаря InformationRegister.ДатыЗапретаИзменения InformationRegister.ДатыПоследнейЗагрузкиПочтовыхСообщений + InformationRegister.ДвоичныеДанныеФайлов InformationRegister.ДокументыСОшибкамиПроверкиКонтрагентов InformationRegister.ДомаЗданияСтроения InformationRegister.ДополнительныеАдресныеСведения @@ -1730,7 +1718,7 @@ InformationRegister.ИсполнителиЗадач InformationRegister.ИсторияАдресныхОбъектов InformationRegister.КалендарныеГрафики - InformationRegister.КодировкиВерсийФайлов + InformationRegister.КодировкиФайлов InformationRegister.КомментарииОперацииСтатистики InformationRegister.КомментарииСтатистики InformationRegister.КонтактыВзаимодействий @@ -1738,7 +1726,7 @@ InformationRegister.КэшПрограммныхИнтерфейсов InformationRegister.НаборыЗначенийДоступа InformationRegister.НазначениеДополнительныхОбработок - InformationRegister.НаличиеПрисоединенныхФайлов + InformationRegister.НаличиеФайлов InformationRegister.НапоминанияПользователя InformationRegister.НаследованиеНастроекПравОбъектов InformationRegister.НастройкиВариантовОтчетов @@ -1765,6 +1753,7 @@ InformationRegister.ПакетыДляОтправки InformationRegister.ПакетыИнформацииПриЗапуске InformationRegister.ПараметрыРаботыВерсийРасширений + InformationRegister.ПараметрыРаботыПрограммы InformationRegister.ПодпискиПолучателей InformationRegister.ПользовательскиеМакетыПечати InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам @@ -1773,7 +1762,6 @@ InformationRegister.ПравилаДляОбменаДанными InformationRegister.ПредметыПапкиВзаимодействий InformationRegister.ПредопределенныеВариантыОтчетовВерсийРасширений - InformationRegister.ПрисоединенныеФайлы InformationRegister.ПричиныИзмененияАдресныхСведений InformationRegister.ПроцессыДляЗапуска InformationRegister.ПубличныеИдентификаторыСинхронизируемыхОбъектов @@ -1785,7 +1773,9 @@ InformationRegister.РейтингАктивностиОбластейДанных InformationRegister.РучныеИзмененияГрафиковРаботы InformationRegister.СведенияОПользователях + InformationRegister.СведенияОФайлах InformationRegister.СеансыВерсийРасширений + InformationRegister.СертификатыШифрования InformationRegister.СклоненияПредставленийОбъектов InformationRegister.СлужебныеАдресныеСведения InformationRegister.СогласияНаОбработкуПерсональныхДанных @@ -1820,9 +1810,10 @@ InformationRegister.УдалитьПраваПоЗначениямДоступа InformationRegister.УдалитьРейтингАктивностиОбластейДанных InformationRegister.УдалитьСтраныМира + InformationRegister.УдалитьХранимыеФайлыВерсий InformationRegister.УровниСокращенийАдресныхСведений InformationRegister.ФайлыВРабочемКаталоге - InformationRegister.ХранимыеФайлыВерсий + InformationRegister.ЭлектронныеПодписи ChartOfCharacteristicTypes.ВопросыДляАнкетирования ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач diff --git a/SSL/src/Configuration/ManagedApplicationModule.bsl b/SSL/src/Configuration/ManagedApplicationModule.bsl index bc6266f71..7de630de2 100644 --- a/SSL/src/Configuration/ManagedApplicationModule.bsl +++ b/SSL/src/Configuration/ManagedApplicationModule.bsl @@ -1,8 +1,7 @@ +#Область ОписаниеПеременных // СтандартныеПодсистемы -#Область ОписаниеПеременных - // Хранилище глобальных переменных. // // ПараметрыПриложения - Соответствие - хранилище переменных, где: @@ -20,10 +19,9 @@ // ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"] = ...; Перем ПараметрыПриложения Экспорт; -#КонецОбласти - // Конец СтандартныеПодсистемы +#КонецОбласти #Область ОбработчикиСобытий diff --git a/SSL/src/Configuration/OrdinaryApplicationModule.bsl b/SSL/src/Configuration/OrdinaryApplicationModule.bsl index bc6266f71..7de630de2 100644 --- a/SSL/src/Configuration/OrdinaryApplicationModule.bsl +++ b/SSL/src/Configuration/OrdinaryApplicationModule.bsl @@ -1,8 +1,7 @@ +#Область ОписаниеПеременных // СтандартныеПодсистемы -#Область ОписаниеПеременных - // Хранилище глобальных переменных. // // ПараметрыПриложения - Соответствие - хранилище переменных, где: @@ -20,10 +19,9 @@ // ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"] = ...; Перем ПараметрыПриложения Экспорт; -#КонецОбласти - // Конец СтандартныеПодсистемы +#КонецОбласти #Область ОбработчикиСобытий diff --git a/SSL/src/Configuration/ParentConfigurations.bin b/SSL/src/Configuration/ParentConfigurations.bin index 7ee325ce6..c8f7f3280 100644 --- a/SSL/src/Configuration/ParentConfigurations.bin +++ b/SSL/src/Configuration/ParentConfigurations.bin @@ -1 +1 @@ -{6,1,1,065d14ff-8287-4648-b4dd-b41b4388c8e4,1,27fdbab7-3a1e-425b-8a93-b9d7fbd380e9,"2.3.7.10","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",5391,1,0,4cfd24bc-9b21-4f74-9f87-21eb55f88f98,4cfd24bc-9b21-4f74-9f87-21eb55f88f98,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,c27472ee-879a-4746-9d21-122738ec80b7,c27472ee-879a-4746-9d21-122738ec80b7,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,c53df2d1-4564-47a7-b66e-6a23ba28270e,c53df2d1-4564-47a7-b66e-6a23ba28270e,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,83192b3e-e7a9-4595-8887-24cda84457a9,83192b3e-e7a9-4595-8887-24cda84457a9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,1,0,08eeb8f1-944f-4450-83f6-ef20aaab7d86,08eeb8f1-944f-4450-83f6-ef20aaab7d86,1,0,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,1,0,2fd12dba-5311-4f31-949c-f6b15decc0cc,2fd12dba-5311-4f31-949c-f6b15decc0cc,1,0,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,1,0,35895e12-52b6-49a1-acdf-6d828a948af0,35895e12-52b6-49a1-acdf-6d828a948af0,1,0,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,1,0,060b6f18-538c-4ea1-9748-00efe0b1ab57,060b6f18-538c-4ea1-9748-00efe0b1ab57,1,0,307b6821-fd82-4a1c-9fdb-a26293d4f713,307b6821-fd82-4a1c-9fdb-a26293d4f713,1,0,a952960b-be1b-4ec4-bd76-80915065a60b,a952960b-be1b-4ec4-bd76-80915065a60b,1,0,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,1,0,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,1,0,ede5b7c8-42cd-4f79-90d2-b518e96d6b26,ede5b7c8-42cd-4f79-90d2-b518e96d6b26,1,0,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,1,0,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,1,0,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,1,0,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,1,0,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,1,0,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,1,0,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,1,0,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,1,0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,1,0,e15c3525-3453-4b62-834e-7c69f9efea51,e15c3525-3453-4b62-834e-7c69f9efea51,1,0,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,1,0,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,1,0,739bd762-01fc-41a8-87df-844eb201962f,739bd762-01fc-41a8-87df-844eb201962f,1,0,ad73f3a3-1dad-4920-af41-bda2b947a2f7,ad73f3a3-1dad-4920-af41-bda2b947a2f7,1,0,98b67b5a-3550-4a64-9e07-07fcc9154c73,98b67b5a-3550-4a64-9e07-07fcc9154c73,1,0,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,1,0,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,1,0,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,1,0,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,1,0,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,1,0,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,1,0,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,1,0,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,1,0,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,1,0,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,1,0,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,1,0,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,1,0,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,1,0,c3d88576-8720-41d7-9d91-919ea45523c5,c3d88576-8720-41d7-9d91-919ea45523c5,1,0,e2c90080-4ed1-4b01-bcb7-3501018d652c,e2c90080-4ed1-4b01-bcb7-3501018d652c,1,0,f997854c-1b48-4d7e-b094-2166745a918c,f997854c-1b48-4d7e-b094-2166745a918c,1,0,16cdc2b4-9ea6-477e-b1bb-dfc8fec65a8d,16cdc2b4-9ea6-477e-b1bb-dfc8fec65a8d,1,0,9a4619e0-e76b-4607-9b1a-fcc79bdd356b,9a4619e0-e76b-4607-9b1a-fcc79bdd356b,1,0,34ce3078-9d00-402e-a9a1-0d05a43ec238,34ce3078-9d00-402e-a9a1-0d05a43ec238,1,0,799944ac-e6ef-4480-9f8e-032c95d4e3fc,799944ac-e6ef-4480-9f8e-032c95d4e3fc,1,0,da280465-d43d-4513-943d-6f91bdc8cefa,da280465-d43d-4513-943d-6f91bdc8cefa,1,0,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,1,0,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,1,0,9eea8645-1ba7-4faf-9c29-868bf99964dd,9eea8645-1ba7-4faf-9c29-868bf99964dd,1,0,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,1,0,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,1,0,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,1,0,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,1,0,d5a5f53b-9cd5-4036-a379-31680cec3c24,d5a5f53b-9cd5-4036-a379-31680cec3c24,1,0,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,1,0,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,1,0,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,1,0,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,1,0,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,1,0,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,1,0,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,1,0,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,1,0,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,1,0,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,1,0,0da019ca-1fc7-4aff-8998-3ddcccf10872,0da019ca-1fc7-4aff-8998-3ddcccf10872,1,0,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,1,0,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,1,0,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,1,0,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,1,0,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,1,0,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,1,0,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,1,0,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,1,0,256981be-18fd-4d92-91f3-6d55bbe2181b,256981be-18fd-4d92-91f3-6d55bbe2181b,1,0,d6bcf961-b863-486e-9a88-c237ae84f7c3,d6bcf961-b863-486e-9a88-c237ae84f7c3,1,0,1d75bfa4-5698-4cbc-98cb-591509fcfde8,1d75bfa4-5698-4cbc-98cb-591509fcfde8,1,0,26eb08f7-6c62-459f-b1f5-363cc40cae46,26eb08f7-6c62-459f-b1f5-363cc40cae46,1,0,cdbc7f5c-dbf9-49cd-a940-95b37bc7b734,cdbc7f5c-dbf9-49cd-a940-95b37bc7b734,1,0,7b802612-3034-4413-9ee8-60e94ebed6d6,7b802612-3034-4413-9ee8-60e94ebed6d6,1,0,59420cb5-d903-4e2c-a9e1-bc5494168daf,59420cb5-d903-4e2c-a9e1-bc5494168daf,1,0,5a88f624-7b7e-43fe-8bc4-ae85d832a855,5a88f624-7b7e-43fe-8bc4-ae85d832a855,1,0,42e39ef7-268f-4053-b4e5-4bceab17d3e4,42e39ef7-268f-4053-b4e5-4bceab17d3e4,1,0,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,1,0,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,1,0,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,1,0,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,1,0,fce03f58-7f68-4d7c-a999-687667c1f03d,fce03f58-7f68-4d7c-a999-687667c1f03d,1,0,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,1,0,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,1,0,87472d14-0d8c-4813-8a3e-2721bbb26811,87472d14-0d8c-4813-8a3e-2721bbb26811,1,0,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,1,0,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,1,0,9200527c-b6b9-4962-9440-10449583e1e3,9200527c-b6b9-4962-9440-10449583e1e3,1,0,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,1,0,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,1,0,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,1,0,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,1,0,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,1,0,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,1,0,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,1,0,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,1,0,8b4614aa-c769-49f4-a281-a0ffb101abf1,8b4614aa-c769-49f4-a281-a0ffb101abf1,1,0,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,1,0,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,1,0,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,1,0,4c3a39e3-40ee-423b-91f0-14b60e045b40,4c3a39e3-40ee-423b-91f0-14b60e045b40,1,0,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,1,0,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,1,0,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,1,0,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,1,0,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,1,0,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,1,0,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,1,0,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,1,0,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,1,0,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,1,0,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,1,0,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,1,0,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,1,0,7185a8f8-48c4-43a9-b31f-102302b8f152,7185a8f8-48c4-43a9-b31f-102302b8f152,1,0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,1,0,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,1,0,c573a29f-4c39-402d-8af4-e0fff80877f8,c573a29f-4c39-402d-8af4-e0fff80877f8,1,0,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,1,0,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,1,0,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,1,0,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,1,0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,1,0,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,1,0,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,1,0,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,1,0,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,1,0,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,1,0,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,1,0,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,1,0,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,1,0,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,1,0,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,1,0,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,1,0,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,1,0,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,1,0,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,1,0,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,1,0,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,1,0,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,1,0,2782420a-65fe-4714-bc91-732c88ba5b14,2782420a-65fe-4714-bc91-732c88ba5b14,1,0,3d170774-bd17-45a2-9d8a-4af3dbabeec4,3d170774-bd17-45a2-9d8a-4af3dbabeec4,1,0,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,1,0,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,1,0,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,1,0,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,1,0,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,1,0,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,1,0,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,1,0,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,1,0,64e03321-33a4-424d-a101-90f1e0da4c2e,64e03321-33a4-424d-a101-90f1e0da4c2e,1,0,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,1,0,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,1,0,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,1,0,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,1,0,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,1,0,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,1,0,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,1,0,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,1,0,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,1,0,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,1,0,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,1,0,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,1,0,691f9902-6b95-4579-a3d9-3b2b5b548776,691f9902-6b95-4579-a3d9-3b2b5b548776,1,0,06fc381d-f27a-433c-95c3-e0981e01f22b,06fc381d-f27a-433c-95c3-e0981e01f22b,1,0,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,1,0,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,1,0,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,1,0,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,1,0,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,1,0,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,1,0,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,1,0,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,1,0,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,1,0,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,1,0,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,1,0,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,1,0,a3131bf3-88b1-431c-a01c-be6e26396f91,a3131bf3-88b1-431c-a01c-be6e26396f91,1,0,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,1,0,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,1,0,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1,0,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,1,0,2a12ce95-3214-4bd2-a0e6-c2af41875821,2a12ce95-3214-4bd2-a0e6-c2af41875821,1,0,bf05548c-babf-402b-b698-9a62e7c69add,bf05548c-babf-402b-b698-9a62e7c69add,1,0,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,1,0,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,1,0,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,1,0,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,1,0,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,1,0,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,1,0,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,1,0,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,1,0,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,1,0,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,1,0,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,1,0,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,1,0,2465986e-7519-4638-9f62-5f692bebeeac,2465986e-7519-4638-9f62-5f692bebeeac,1,0,66e24df5-f443-47c0-b0ad-97d00d6761c7,66e24df5-f443-47c0-b0ad-97d00d6761c7,1,0,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,1,0,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,1,0,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,1,0,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,1,0,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,1,0,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,1,0,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,1,0,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,1,0,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,1,0,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,1,0,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,1,0,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,1,0,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,1,0,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,1,0,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,1,0,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,1,0,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,1,0,2997e4da-d831-48e4-96e2-c29f9d077302,2997e4da-d831-48e4-96e2-c29f9d077302,1,0,30f59002-a23d-4eff-b84f-f280f11b220e,30f59002-a23d-4eff-b84f-f280f11b220e,1,0,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,1,0,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,1,0,14583452-805e-423d-be9a-e04683c7c46f,14583452-805e-423d-be9a-e04683c7c46f,1,0,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,1,0,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,1,0,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,1,0,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,1,0,b1e837ff-0edd-4525-b2e2-92cc7990e00e,b1e837ff-0edd-4525-b2e2-92cc7990e00e,1,0,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,1,0,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,1,0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,1,0,ceb286e9-4e7c-49fa-a695-424073e0dffc,ceb286e9-4e7c-49fa-a695-424073e0dffc,1,0,727689c3-c0d8-496f-a47b-4f3243ad8974,727689c3-c0d8-496f-a47b-4f3243ad8974,1,0,057aadbd-f41f-4de4-95f4-9301557e6a0e,057aadbd-f41f-4de4-95f4-9301557e6a0e,1,0,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,1,0,f0f9cf2c-bbf9-4511-a1ab-3941c15310eb,f0f9cf2c-bbf9-4511-a1ab-3941c15310eb,1,0,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,1,0,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,1,0,4bad7c64-131a-42cb-9be7-d61f14f456d0,4bad7c64-131a-42cb-9be7-d61f14f456d0,1,0,d46e141b-7a10-4d65-971f-3a35f2114017,d46e141b-7a10-4d65-971f-3a35f2114017,1,0,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,1,0,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,1,0,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,1,0,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,1,0,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1,0,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,1,0,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,1,0,e70a6eab-791f-4c70-bb92-f069c7486d1b,e70a6eab-791f-4c70-bb92-f069c7486d1b,1,0,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,1,0,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,1,0,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,1,0,772e7011-0019-4edc-b673-b7151cf4fa6c,772e7011-0019-4edc-b673-b7151cf4fa6c,1,0,21ac47fa-12c2-43e2-9b57-afdf521d3485,21ac47fa-12c2-43e2-9b57-afdf521d3485,1,0,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,1,0,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,1,0,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,1,0,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,1,0,8d1c44d7-52f2-4089-9d77-2f03bf051455,8d1c44d7-52f2-4089-9d77-2f03bf051455,1,0,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,1,0,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,1,0,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,1,0,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,1,0,8e87da88-9fa8-4dd8-b904-622b763239f4,8e87da88-9fa8-4dd8-b904-622b763239f4,1,0,529cc5b5-835f-4e70-9232-a9649fdc7ae5,529cc5b5-835f-4e70-9232-a9649fdc7ae5,1,0,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,1,0,4875a235-bcc8-47eb-83e3-a66f0f690b97,4875a235-bcc8-47eb-83e3-a66f0f690b97,1,0,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,1,0,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,1,0,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,1,0,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,1,0,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,1,0,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,1,0,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,1,0,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,1,0,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,1,0,f595539d-bdd1-4e7a-8279-3bb8a9344f45,f595539d-bdd1-4e7a-8279-3bb8a9344f45,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,1,0,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,1,0,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,1,0,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,1,0,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,1,0,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,1,0,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,1,0,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,1,0,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,1,0,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,1,0,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,1,0,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,1,0,3fe0ef25-ce56-435d-b343-eadfec91a636,3fe0ef25-ce56-435d-b343-eadfec91a636,1,0,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,1,0,62ef3558-5ad3-44ab-8578-1acbbfa54135,62ef3558-5ad3-44ab-8578-1acbbfa54135,1,0,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,1,0,c3572d8d-46ff-40bb-800c-2c07f884c219,c3572d8d-46ff-40bb-800c-2c07f884c219,1,0,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,1,0,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,1,0,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,1,0,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,1,0,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,1,0,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,1,0,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,1,0,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,1,0,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,1,0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1,0,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,1,0,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,1,0,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,1,0,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,1,0,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,1,0,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,1,0,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,1,0,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,1,0,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,1,0,ab5b0155-a4b1-47a1-ad87-12365dde20c1,ab5b0155-a4b1-47a1-ad87-12365dde20c1,1,0,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,1,0,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,1,0,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,1,0,6f21c34c-26aa-493d-aa08-2d4366b4064a,6f21c34c-26aa-493d-aa08-2d4366b4064a,1,0,0f55650a-2422-42a9-8258-61df4c17f1ef,0f55650a-2422-42a9-8258-61df4c17f1ef,1,0,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,1,0,3eaece9d-c9be-4b0b-a6f6-a3932274b806,3eaece9d-c9be-4b0b-a6f6-a3932274b806,1,0,5d9427ec-981d-4fb5-878b-8dba0d3a5536,5d9427ec-981d-4fb5-878b-8dba0d3a5536,1,0,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,1,0,a0047712-5769-495d-97af-20d06751a5b4,a0047712-5769-495d-97af-20d06751a5b4,1,0,e729c3c6-16e5-405b-99b1-a88022300c6d,e729c3c6-16e5-405b-99b1-a88022300c6d,1,0,9c089520-8233-42f6-8eee-9839ac708c6f,9c089520-8233-42f6-8eee-9839ac708c6f,1,0,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,1,0,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,1,0,89055896-49dd-4cfd-ab78-8ac3698e12d5,89055896-49dd-4cfd-ab78-8ac3698e12d5,1,0,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,1,0,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,1,0,672c4741-6d7b-4d3e-baa7-389bef0625d7,672c4741-6d7b-4d3e-baa7-389bef0625d7,1,0,04398ec0-1c13-43f8-8f5d-7b7619592a4d,04398ec0-1c13-43f8-8f5d-7b7619592a4d,1,0,ce463861-92df-47f2-bd0f-4a2dbf72aacc,ce463861-92df-47f2-bd0f-4a2dbf72aacc,1,0,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,1,0,1487d68c-7a2f-48cf-8c80-4074072ed52c,1487d68c-7a2f-48cf-8c80-4074072ed52c,1,0,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,1,0,d97c6536-fd62-4c9a-b83e-490a29a0721b,d97c6536-fd62-4c9a-b83e-490a29a0721b,1,0,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,1,0,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,1,0,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,1,0,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,1,0,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,1,0,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,1,0,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,1,0,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,1,0,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,1,0,ece15c4e-4a4b-421b-9f00-10f698da476b,ece15c4e-4a4b-421b-9f00-10f698da476b,1,0,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,1,0,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,1,0,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,1,0,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,1,0,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,1,0,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,1,0,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,1,0,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,1,0,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,1,0,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,1,0,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,1,0,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,1,0,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,1,0,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,1,0,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,1,0,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,1,0,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,1,0,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,1,0,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,1,0,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,1,0,5efc4bc4-b711-4620-8d2e-9d947c6cc141,5efc4bc4-b711-4620-8d2e-9d947c6cc141,1,0,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1,0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,1,0,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,1,0,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,1,0,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,1,0,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,1,0,aa8c4a71-3276-4b83-8be2-3528129e58b3,aa8c4a71-3276-4b83-8be2-3528129e58b3,1,0,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,1,0,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,1,0,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,1,0,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,1,0,0072986b-0463-4a39-9851-f9adeda99716,0072986b-0463-4a39-9851-f9adeda99716,1,0,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,1,0,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,1,0,0d4a26fb-7176-43f2-8767-d3e227c7306a,0d4a26fb-7176-43f2-8767-d3e227c7306a,1,0,933cbafc-5667-4a91-8b1d-dca3d7662522,933cbafc-5667-4a91-8b1d-dca3d7662522,1,0,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,1,0,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,1,0,b6e98aee-4936-491d-8c67-8490e1af2e34,b6e98aee-4936-491d-8c67-8490e1af2e34,1,0,b292eb46-df87-43c0-9a37-93c5a22af252,b292eb46-df87-43c0-9a37-93c5a22af252,1,0,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,1,0,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,1,0,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,1,0,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,1,0,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,1,0,062c507a-9d35-4eb5-bb91-d106a535a503,062c507a-9d35-4eb5-bb91-d106a535a503,1,0,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,1,0,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,1,0,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,1,0,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,1,0,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,1,0,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,1,0,f1e600b0-55ed-4611-b147-f04d5621796b,f1e600b0-55ed-4611-b147-f04d5621796b,1,0,e3b84128-95e1-45df-84db-5e1791779543,e3b84128-95e1-45df-84db-5e1791779543,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,e9d95895-8708-4035-89ad-72573b870491,e9d95895-8708-4035-89ad-72573b870491,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,312118ff-a2a4-479c-964a-5250cca0cd20,312118ff-a2a4-479c-964a-5250cca0cd20,1,0,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,89318397-b3a6-4468-985b-ed5cb8ab5cdb,89318397-b3a6-4468-985b-ed5cb8ab5cdb,1,0,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,4436b2cf-2d71-401f-99fd-012ff0c91fbd,4436b2cf-2d71-401f-99fd-012ff0c91fbd,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5396be45-d7c0-43df-aed4-cad062a02b11,5396be45-d7c0-43df-aed4-cad062a02b11,1,0,017e3da8-e48e-488b-9bbf-4fef1a4f3417,017e3da8-e48e-488b-9bbf-4fef1a4f3417,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,1e015740-5b45-4729-9732-57359a7c602f,1e015740-5b45-4729-9732-57359a7c602f,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,f0152598-ffa3-4eb7-811f-906e569373e6,f0152598-ffa3-4eb7-811f-906e569373e6,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,1,0,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,cd74d617-8ebe-4a7d-b011-38c98d856d8c,cd74d617-8ebe-4a7d-b011-38c98d856d8c,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,38b48750-1411-493b-b18e-42d39312aad8,38b48750-1411-493b-b18e-42d39312aad8,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,737404de-5b9d-4445-81c5-2c5b50b36846,737404de-5b9d-4445-81c5-2c5b50b36846,1,0,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,789a2027-8601-434c-bf47-37696a3966ad,789a2027-8601-434c-bf47-37696a3966ad,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,4c3085e1-2f86-4af4-a392-ab45e30a7152,4c3085e1-2f86-4af4-a392-ab45e30a7152,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,1,0,73e4bce2-df4a-4f60-a369-55f588a46bd1,73e4bce2-df4a-4f60-a369-55f588a46bd1,1,0,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,1,0,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1,0,c6af8b0f-3767-4198-88e2-f5763cb0294a,c6af8b0f-3767-4198-88e2-f5763cb0294a,1,0,b107a4a8-0db8-44f4-93f7-9f231e850398,b107a4a8-0db8-44f4-93f7-9f231e850398,1,0,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,1,0,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,1,0,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,1,0,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,1,0,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,1,0,904e1209-91d8-49b1-b291-364ef728cbbf,904e1209-91d8-49b1-b291-364ef728cbbf,1,0,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1,0,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,1,0,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,1,0,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,1,0,e51ae56c-d311-46b7-8d4c-19a432f4cd16,e51ae56c-d311-46b7-8d4c-19a432f4cd16,1,0,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,1,0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,1,0,23314bcd-2dd4-43f1-9fdb-ae182a48c886,23314bcd-2dd4-43f1-9fdb-ae182a48c886,1,0,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,1,0,9440a132-366f-4fc9-bd72-2544ba2b072a,9440a132-366f-4fc9-bd72-2544ba2b072a,1,0,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,1,0,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,1,0,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,1,0,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,1,0,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,1,0,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,1,0,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,1,0,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,1,0,cadb54f0-dcff-4f96-983e-a309fd72f330,cadb54f0-dcff-4f96-983e-a309fd72f330,1,0,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,1,0,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,1,0,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,1,0,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,1,0,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,1,0,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,1,0,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,1,0,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,1,0,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,1,0,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,1,0,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,1,0,9ff1c73e-71be-4ea6-97fb-e710d995ee62,9ff1c73e-71be-4ea6-97fb-e710d995ee62,1,0,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,1,0,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,1,0,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,1,0,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,1,0,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,1,0,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,1,0,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,1,0,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,1,0,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,1,0,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,1,0,68500931-89e0-491e-aba8-b013c9e6f8c3,68500931-89e0-491e-aba8-b013c9e6f8c3,1,0,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,1,0,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,1,0,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,1,0,ef6ccd0d-73c6-4314-9912-efa7ff27c823,ef6ccd0d-73c6-4314-9912-efa7ff27c823,1,0,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,1,0,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,1,0,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,1,0,70f156d8-9cb4-442d-a36b-7a43d03bcd12,70f156d8-9cb4-442d-a36b-7a43d03bcd12,1,0,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,1,0,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,1,0,f0a6de82-45ab-4153-bccf-df82fc960aa1,f0a6de82-45ab-4153-bccf-df82fc960aa1,1,0,77adf47b-6015-46fc-9e29-f1c025ea0d81,77adf47b-6015-46fc-9e29-f1c025ea0d81,1,0,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,1,0,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,1,0,60c04f0a-78a8-4c55-8844-b86906350fd1,60c04f0a-78a8-4c55-8844-b86906350fd1,1,0,851306a7-8847-4b43-8214-898bfc24b0ab,851306a7-8847-4b43-8214-898bfc24b0ab,1,0,af8d4bc9-2f0f-44d3-89ce-2593877055c8,af8d4bc9-2f0f-44d3-89ce-2593877055c8,1,0,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,1,0,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,1,0,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,1,0,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,1,0,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,1,0,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,1,0,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,1,0,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,1,0,5a4c6511-f8ed-40e4-a251-e28f62629cf2,5a4c6511-f8ed-40e4-a251-e28f62629cf2,1,0,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,1,0,17df1591-61b0-4204-8379-8d1f58445968,17df1591-61b0-4204-8379-8d1f58445968,1,0,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,1,0,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,1,0,e83ad33d-27df-4181-afd2-b7f416e6e705,e83ad33d-27df-4181-afd2-b7f416e6e705,1,0,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,1,0,f0438b0a-7916-4de4-a3a8-d43407c3295f,f0438b0a-7916-4de4-a3a8-d43407c3295f,1,0,3309648c-aae6-4684-ae8d-7ed636bc3468,3309648c-aae6-4684-ae8d-7ed636bc3468,1,0,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,1,0,f41e5a5b-394b-423a-bee5-ed4d1da0be71,f41e5a5b-394b-423a-bee5-ed4d1da0be71,1,0,23db175f-ddfb-4af7-9c0c-232b6adb7daf,23db175f-ddfb-4af7-9c0c-232b6adb7daf,1,0,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,1,0,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,1,0,4e309f26-35e8-49d9-bbd1-c7884e666dca,4e309f26-35e8-49d9-bbd1-c7884e666dca,1,0,84f05fe4-51d3-49a8-83e7-1cae2028147e,84f05fe4-51d3-49a8-83e7-1cae2028147e,1,0,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,1,0,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,1,0,3916ddbd-9023-42a4-849e-9cda6e591408,3916ddbd-9023-42a4-849e-9cda6e591408,1,0,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,1,0,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,1,0,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,1,0,d065c02e-9991-468a-ae32-b8c29d078d03,d065c02e-9991-468a-ae32-b8c29d078d03,1,0,c509683e-eb13-4e1a-91ed-cd6982ec5001,c509683e-eb13-4e1a-91ed-cd6982ec5001,1,0,88bf6f58-7943-42c4-bc0f-56b991590026,88bf6f58-7943-42c4-bc0f-56b991590026,1,0,f135b60e-6d28-4ba1-acd7-76090f14855d,f135b60e-6d28-4ba1-acd7-76090f14855d,1,0,96d66cdd-d40c-43a3-92ce-40aef2101b64,96d66cdd-d40c-43a3-92ce-40aef2101b64,1,0,9daa8270-4782-4d83-af03-c8d2b11057ff,9daa8270-4782-4d83-af03-c8d2b11057ff,1,0,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,1,0,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,1,0,52b45b3d-b01b-4aac-8a1e-e256957c39c3,52b45b3d-b01b-4aac-8a1e-e256957c39c3,1,0,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,1,0,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,1,0,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,1,0,33343620-673e-4aa3-9e58-c6a25f738001,33343620-673e-4aa3-9e58-c6a25f738001,1,0,8aaf780f-ed74-4f44-9598-c14180053ff9,8aaf780f-ed74-4f44-9598-c14180053ff9,1,0,dbd4d09d-f410-4453-9143-bd72da5464cc,dbd4d09d-f410-4453-9143-bd72da5464cc,1,0,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,1,0,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,1,0,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,1,0,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,1,0,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,1,0,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,1,0,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,1,0,0b303d25-e141-431f-828c-1778d3c247f6,0b303d25-e141-431f-828c-1778d3c247f6,1,0,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,1,0,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,1,0,e3476d0e-0ab4-4734-9261-04aef6281086,e3476d0e-0ab4-4734-9261-04aef6281086,1,0,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,1,0,29c37223-de1c-49fb-8488-77e44dd79edd,29c37223-de1c-49fb-8488-77e44dd79edd,1,0,976533bf-f162-42a1-a47e-6d681ee67b82,976533bf-f162-42a1-a47e-6d681ee67b82,1,0,19bc0dd8-9e6b-4855-bc42-b4e98443163f,19bc0dd8-9e6b-4855-bc42-b4e98443163f,1,0,a61e10af-eaba-4e7a-a641-65d77453a559,a61e10af-eaba-4e7a-a641-65d77453a559,1,0,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,1,0,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,1,0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,1,0,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1,0,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,1,0,a84891cc-e996-489a-abde-5b5af166a057,a84891cc-e996-489a-abde-5b5af166a057,1,0,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,1,0,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,1,0,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,1,0,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,1,0,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,1,0,19a307b1-9ef0-4fc6-bf4f-7636e9118399,19a307b1-9ef0-4fc6-bf4f-7636e9118399,1,0,666244a4-5636-4405-89dd-bbd8f4278071,666244a4-5636-4405-89dd-bbd8f4278071,1,0,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,1,0,29a627a9-debc-4074-88d0-ec3561e1ef9c,29a627a9-debc-4074-88d0-ec3561e1ef9c,1,0,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,1,0,39f5e272-9a10-40b0-8a10-92037828b206,39f5e272-9a10-40b0-8a10-92037828b206,1,0,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,1,0,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,1,0,f20a04a7-84fa-48e3-8ac5-28176c1fcada,f20a04a7-84fa-48e3-8ac5-28176c1fcada,1,0,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,1,0,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,1,0,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,1,0,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,1,0,4ad722ca-10fc-4a83-91c9-ef0012685f89,4ad722ca-10fc-4a83-91c9-ef0012685f89,1,0,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,1,0,3b033d29-0de7-49dd-90bc-f414b28426d7,3b033d29-0de7-49dd-90bc-f414b28426d7,1,0,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,1,0,d9e08c12-1999-41d8-b530-90187303be0a,d9e08c12-1999-41d8-b530-90187303be0a,1,0,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,1,0,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,1,0,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,1,0,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,1,0,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,1,0,2e4da82c-dddb-4462-b34f-6511cd2a8356,2e4da82c-dddb-4462-b34f-6511cd2a8356,1,0,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,1,0,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,1,0,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,1,0,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,1,0,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,1,0,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,1,0,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,1,0,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,1,0,646def82-bc88-4187-8be0-93938656a20f,646def82-bc88-4187-8be0-93938656a20f,1,0,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,1,0,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,1,0,06323ebd-5f74-494a-99a5-eb77e23d8637,06323ebd-5f74-494a-99a5-eb77e23d8637,1,0,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,1,0,7f6222c1-1a50-4565-b66b-bcb430674efc,7f6222c1-1a50-4565-b66b-bcb430674efc,1,0,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,1,0,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,1,0,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,1,0,52ae6431-afb3-4dea-b106-00e11b174ec7,52ae6431-afb3-4dea-b106-00e11b174ec7,1,0,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,1,0,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,1,0,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,1,0,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,1,0,8b83324c-e10e-49d1-99d7-5bc468c25975,8b83324c-e10e-49d1-99d7-5bc468c25975,1,0,ddb75923-27bf-4996-b024-4bc6eb0f59a7,ddb75923-27bf-4996-b024-4bc6eb0f59a7,1,0,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,1,0,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,1,0,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,1,0,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,1,0,3be0acc7-223a-46ec-9ea2-ec99b869fa78,3be0acc7-223a-46ec-9ea2-ec99b869fa78,1,0,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,1,0,642154b8-97da-4c4f-bf34-c1124215077d,642154b8-97da-4c4f-bf34-c1124215077d,1,0,abc10867-39ae-46bf-8bd7-90f645919235,abc10867-39ae-46bf-8bd7-90f645919235,1,0,b3396504-8ccb-43d6-9a0f-ab259ba0a542,b3396504-8ccb-43d6-9a0f-ab259ba0a542,1,0,f59f91c5-026a-4dc5-996e-0d59814a9604,f59f91c5-026a-4dc5-996e-0d59814a9604,1,0,aac9966f-e9ea-4106-97bb-6b9822939bc7,aac9966f-e9ea-4106-97bb-6b9822939bc7,1,0,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,1,0,486083d8-33b1-453f-9f05-5ff867e2f4ba,486083d8-33b1-453f-9f05-5ff867e2f4ba,1,0,e4f9d9f6-38d7-4056-a95a-987ad2da2211,e4f9d9f6-38d7-4056-a95a-987ad2da2211,1,0,22c21c2b-4297-43b2-88f0-9555d22f7a14,22c21c2b-4297-43b2-88f0-9555d22f7a14,1,0,734f61c4-5429-4a09-8697-8949ac5e6bd1,734f61c4-5429-4a09-8697-8949ac5e6bd1,1,0,d04e0e2d-0a5f-4866-b0b3-b582915db899,d04e0e2d-0a5f-4866-b0b3-b582915db899,1,0,19649d3f-52aa-4054-bb84-a6a11d212495,19649d3f-52aa-4054-bb84-a6a11d212495,1,0,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,1,0,58321939-f25a-456d-8dee-97e64743dc2e,58321939-f25a-456d-8dee-97e64743dc2e,1,0,416fba62-70c4-4f8c-b10b-56d47b27ca35,416fba62-70c4-4f8c-b10b-56d47b27ca35,1,0,ec48a164-bc30-4e36-a40a-a3cca07aea0d,ec48a164-bc30-4e36-a40a-a3cca07aea0d,1,0,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,1,0,b7736108-89bd-44eb-89c1-8a5a774058f1,b7736108-89bd-44eb-89c1-8a5a774058f1,1,0,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,1,0,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,1,0,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,1,0,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,1,0,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,1,0,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,1,0,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,1,0,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,1,0,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,1,0,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,1,0,1126157b-64c0-4d64-8551-f31c5ed0fd29,1126157b-64c0-4d64-8551-f31c5ed0fd29,1,0,6ae6e515-5cd4-4eca-8602-c6abe6d66276,6ae6e515-5cd4-4eca-8602-c6abe6d66276,1,0,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,1,0,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,1,0,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,1,0,2e17464f-9cef-4812-865f-4eb77ff16b6a,2e17464f-9cef-4812-865f-4eb77ff16b6a,1,0,e5ecbb1f-981d-4928-9335-22216879f7e2,e5ecbb1f-981d-4928-9335-22216879f7e2,1,0,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,1,0,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,1,0,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,1,0,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,1,0,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,1,0,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,1,0,a50fcacc-6d2d-496c-bea0-9c73cd153437,a50fcacc-6d2d-496c-bea0-9c73cd153437,1,0,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,1,0,0fb72f4b-e6f6-4b70-8ec7-fdb6d4ad928e,0fb72f4b-e6f6-4b70-8ec7-fdb6d4ad928e,1,0,a5633248-8611-4e9b-b223-2f59e7b84a65,a5633248-8611-4e9b-b223-2f59e7b84a65,1,0,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,1,0,e40b8882-737a-40c0-83b4-c35dc042f4a5,e40b8882-737a-40c0-83b4-c35dc042f4a5,1,0,d60c1e9d-1395-4293-8462-6ea2c93a0c86,d60c1e9d-1395-4293-8462-6ea2c93a0c86,1,0,a05fdefd-c0c6-4069-bb05-3fcd22819289,a05fdefd-c0c6-4069-bb05-3fcd22819289,1,0,1514f388-3c36-422f-9e23-83054934e4b3,1514f388-3c36-422f-9e23-83054934e4b3,1,0,841f4416-a85a-48f7-bae2-19865cf2979e,841f4416-a85a-48f7-bae2-19865cf2979e,1,0,8df13cd3-1b03-4c84-98e9-c771c1d5254a,8df13cd3-1b03-4c84-98e9-c771c1d5254a,1,0,a79ddc43-74f6-4997-bfc4-bdf7bc71cdd6,a79ddc43-74f6-4997-bfc4-bdf7bc71cdd6,1,0,29477058-cb8d-4fd4-b3a1-41565aeabf97,29477058-cb8d-4fd4-b3a1-41565aeabf97,1,0,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,1,0,26aea96b-20f8-4e35-b55f-4fe3602e6597,26aea96b-20f8-4e35-b55f-4fe3602e6597,1,0,a3a3a211-e361-4e41-a6f8-d731a366c163,a3a3a211-e361-4e41-a6f8-d731a366c163,1,0,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,1,0,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,1,0,ca01417c-0ffd-4e00-91e8-93cd305be82d,ca01417c-0ffd-4e00-91e8-93cd305be82d,1,0,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,1,0,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,1,0,6ac7db0c-18ed-4d3b-956a-5985214db474,6ac7db0c-18ed-4d3b-956a-5985214db474,1,0,267103e0-6703-4a74-bb4f-af610d7ef332,267103e0-6703-4a74-bb4f-af610d7ef332,1,0,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,1,0,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,1,0,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,1,0,22c60cbc-429f-40d9-bf8b-681b7786c41d,22c60cbc-429f-40d9-bf8b-681b7786c41d,1,0,d4e53d41-9335-4a1e-a06e-410c46de1d1c,d4e53d41-9335-4a1e-a06e-410c46de1d1c,1,0,4405bfaa-699a-497b-a15c-0302b86c834c,4405bfaa-699a-497b-a15c-0302b86c834c,1,0,3b3e7b9d-67f8-4cf2-ad1a-29d124169691,3b3e7b9d-67f8-4cf2-ad1a-29d124169691,1,0,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,1,0,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,1,0,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,1,0,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,1,0,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,1,0,4654d192-74bf-430f-abee-6f4dc431b182,4654d192-74bf-430f-abee-6f4dc431b182,1,0,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1,0,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,1,0,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,1,0,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,1,0,3f7ee937-d853-47b7-a1f5-d821208e3531,3f7ee937-d853-47b7-a1f5-d821208e3531,1,0,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,1,0,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,1,0,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,1,0,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,1,0,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,1,0,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,1,0,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,1,0,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,1,0,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,1,0,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,1,0,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,1,0,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,1,0,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,1,0,90032ffa-f117-4a34-82f8-cc7e5a22a542,90032ffa-f117-4a34-82f8-cc7e5a22a542,1,0,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,1,0,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,1,0,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,1,0,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,1,0,49e787c9-753a-468a-b8dd-2e970d9a1fed,49e787c9-753a-468a-b8dd-2e970d9a1fed,1,0,e871dea7-1953-4511-90b0-e0957afac4c0,e871dea7-1953-4511-90b0-e0957afac4c0,1,0,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,1,0,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,1,0,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,1,0,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,1,0,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,1,0,40ae107d-67a8-404c-adf9-1a760bba94ff,40ae107d-67a8-404c-adf9-1a760bba94ff,1,0,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,1,0,f3bd841b-fb36-4462-9627-b51801e563cd,f3bd841b-fb36-4462-9627-b51801e563cd,1,0,0a23f273-5589-4a48-be3a-eee7565749aa,0a23f273-5589-4a48-be3a-eee7565749aa,1,0,494eb9d9-4a10-4e85-b511-375408f21bbe,494eb9d9-4a10-4e85-b511-375408f21bbe,1,0,3fbbca3f-d4fa-4d65-a08f-0a348b9030c6,3fbbca3f-d4fa-4d65-a08f-0a348b9030c6,1,0,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,1,0,7172bed5-b12b-4e83-b15d-1d95b63a6272,7172bed5-b12b-4e83-b15d-1d95b63a6272,1,0,25d75a3c-b801-4b1e-aed8-90e667f36c67,25d75a3c-b801-4b1e-aed8-90e667f36c67,1,0,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,1,0,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,1,0,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,1,0,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,1,0,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,1,0,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,1,0,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,1,0,49e21b87-beae-4640-a497-ef468da0cbbc,49e21b87-beae-4640-a497-ef468da0cbbc,1,0,bbdfeebd-cda0-4911-8f31-553d751340a7,bbdfeebd-cda0-4911-8f31-553d751340a7,1,0,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,1,0,20aad006-5b1e-4cc2-94ef-668dd002667b,20aad006-5b1e-4cc2-94ef-668dd002667b,1,0,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,1,0,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,1,0,2befb2e3-7354-4a01-83d6-b24262704a5e,2befb2e3-7354-4a01-83d6-b24262704a5e,1,0,5b93975e-b2a4-4102-a060-2667f5813c94,5b93975e-b2a4-4102-a060-2667f5813c94,1,0,ca75d086-cd01-4f54-b57d-1b35bcb1272a,ca75d086-cd01-4f54-b57d-1b35bcb1272a,1,0,b4a27991-2e18-4ead-80e8-f2956a7539e3,b4a27991-2e18-4ead-80e8-f2956a7539e3,1,0,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,1,0,dcdc9c65-c2d5-4531-a325-f64b3861cbab,dcdc9c65-c2d5-4531-a325-f64b3861cbab,1,0,ca542a9e-3040-419f-9a98-2a8de230b734,ca542a9e-3040-419f-9a98-2a8de230b734,1,0,c9fc5155-1df3-4872-a83d-72872baf43c4,c9fc5155-1df3-4872-a83d-72872baf43c4,1,0,9f9adb67-66bd-4c28-8319-44ae097ae1fe,9f9adb67-66bd-4c28-8319-44ae097ae1fe,1,0,0bae3704-b370-48be-b094-f18a2e62ad1b,0bae3704-b370-48be-b094-f18a2e62ad1b,1,0,e097bf94-9235-4a27-b0eb-d6387d22cd62,e097bf94-9235-4a27-b0eb-d6387d22cd62,1,0,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,1,0,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,1,0,8d2bfd40-f185-4eab-b374-872d49310eb2,8d2bfd40-f185-4eab-b374-872d49310eb2,1,0,523de426-e5a6-49e0-8144-c637f80d8ddd,523de426-e5a6-49e0-8144-c637f80d8ddd,1,0,09256328-6205-4b04-b908-3287ae8ded75,09256328-6205-4b04-b908-3287ae8ded75,1,0,05a6e161-9791-4c5b-8753-bd6370cc4cc9,05a6e161-9791-4c5b-8753-bd6370cc4cc9,1,0,6362facc-bf95-4adf-8ee7-c65f90972a1c,6362facc-bf95-4adf-8ee7-c65f90972a1c,1,0,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,1,0,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,1,0,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,1,0,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,1,0,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,1,0,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,1,0,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,1,0,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,1,0,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,1,0,393074c4-0afc-4232-8101-11a4ea6ed28a,393074c4-0afc-4232-8101-11a4ea6ed28a,1,0,5ff23123-450c-40ae-9b79-c540da53e2a0,5ff23123-450c-40ae-9b79-c540da53e2a0,1,0,639339a1-7de5-4b05-adf3-f60e7edd922c,639339a1-7de5-4b05-adf3-f60e7edd922c,1,0,dea9af9d-13c0-40d4-a9b0-1908e0a58795,dea9af9d-13c0-40d4-a9b0-1908e0a58795,1,0,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,1,0,1abeb10b-0558-4478-8f51-d0964ba3c274,1abeb10b-0558-4478-8f51-d0964ba3c274,1,0,38325a66-588a-4db0-8e0c-21d239408369,38325a66-588a-4db0-8e0c-21d239408369,1,0,7c27e885-33fd-4da2-a60d-50336c0189b0,7c27e885-33fd-4da2-a60d-50336c0189b0,1,0,0e1a45b0-d95d-415f-b954-5689610aa393,0e1a45b0-d95d-415f-b954-5689610aa393,1,0,4736b3d3-f696-4bdd-b0e3-0884ea88f623,4736b3d3-f696-4bdd-b0e3-0884ea88f623,1,0,4b849c66-6a36-4efd-815e-af4467c6f064,4b849c66-6a36-4efd-815e-af4467c6f064,1,0,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,1,0,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,1,0,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,1,0,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,1,0,01a73950-3e8f-4f56-903f-af0d9574e72e,01a73950-3e8f-4f56-903f-af0d9574e72e,1,0,14bd0844-c829-4325-aa7f-0f417bf955dc,14bd0844-c829-4325-aa7f-0f417bf955dc,1,0,7f1cd658-ca10-49c6-80ef-b8956f3269ea,7f1cd658-ca10-49c6-80ef-b8956f3269ea,1,0,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,1,0,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,1,0,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,1,0,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,1,0,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,1,0,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,1,0,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,1,0,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,1,0,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,1,0,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,1,0,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,1,0,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,1,0,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,1,0,c7f817ee-9f6a-454c-95a0-b279fd08055e,c7f817ee-9f6a-454c-95a0-b279fd08055e,1,0,1d49b1bb-5f90-46e4-adcf-55ad46442648,1d49b1bb-5f90-46e4-adcf-55ad46442648,1,0,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,1,0,259ede1f-05d3-4ece-8994-0ae3b2e89f49,259ede1f-05d3-4ece-8994-0ae3b2e89f49,1,0,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,1,0,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,1,0,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,1,0,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,1,0,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,1,0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,1,0,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,1,0,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,1,0,97edd94a-4bf2-4ed7-b98f-677f869b0715,97edd94a-4bf2-4ed7-b98f-677f869b0715,1,0,39355e82-30a6-431e-9697-e2c42e82de83,39355e82-30a6-431e-9697-e2c42e82de83,1,0,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,1,0,edc01b03-8b01-4551-939a-f7e257892040,edc01b03-8b01-4551-939a-f7e257892040,1,0,15d09274-9508-4f64-9ea3-678c5aa50f0f,15d09274-9508-4f64-9ea3-678c5aa50f0f,1,0,4debe032-12e4-4777-b2fc-70b150f2aad1,4debe032-12e4-4777-b2fc-70b150f2aad1,1,0,37558fa2-0833-46d6-9e4f-63d4a3136870,37558fa2-0833-46d6-9e4f-63d4a3136870,1,0,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,1,0,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,1,0,2fad50a6-6a3e-4f87-ab84-907364427a63,2fad50a6-6a3e-4f87-ab84-907364427a63,1,0,9567765b-8e02-4262-89a9-5c354109cc4c,9567765b-8e02-4262-89a9-5c354109cc4c,1,0,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1,0,258736e4-93c0-4a46-8caa-75be42c9f006,258736e4-93c0-4a46-8caa-75be42c9f006,1,0,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,1,0,56d0acf3-c888-4824-a6e4-27d61fa35415,56d0acf3-c888-4824-a6e4-27d61fa35415,1,0,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,1,0,439129dd-ad00-484c-b84a-fb325af979ed,439129dd-ad00-484c-b84a-fb325af979ed,1,0,dcae6376-f44c-421e-87f2-df83413c021e,dcae6376-f44c-421e-87f2-df83413c021e,1,0,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,1,0,151f2d0a-cc43-490d-ad7d-71390703aa72,151f2d0a-cc43-490d-ad7d-71390703aa72,1,0,2a515a4f-683b-4674-b097-62dd2d940c39,2a515a4f-683b-4674-b097-62dd2d940c39,1,0,d14058f5-dfd4-47eb-ae6d-01b7062f5940,d14058f5-dfd4-47eb-ae6d-01b7062f5940,1,0,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,1,0,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,1,0,fdb5b235-1978-4c2a-a03f-02341df00c3c,fdb5b235-1978-4c2a-a03f-02341df00c3c,1,0,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,1,0,38637f61-399a-4966-9e64-4751aecffa31,38637f61-399a-4966-9e64-4751aecffa31,1,0,0f38a18b-a36c-45fe-86c1-396634aaa5df,0f38a18b-a36c-45fe-86c1-396634aaa5df,1,0,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,1,0,a81c783d-2dea-4dde-9ca1-7b23d609eb22,a81c783d-2dea-4dde-9ca1-7b23d609eb22,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,1,0,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,1,0,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,1,0,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,1,0,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,1,0,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0bf5e9c1-905a-4202-8b96-ed831b41be4b,1,0,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,1,0,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,1,0,be15e947-f671-4848-ada1-51239af73615,be15e947-f671-4848-ada1-51239af73615,1,0,3fc019d1-aec8-4835-96c5-3bbf43da0b94,3fc019d1-aec8-4835-96c5-3bbf43da0b94,1,0,5371672a-c8e0-4c12-834e-f23dd885b49a,5371672a-c8e0-4c12-834e-f23dd885b49a,1,0,d3e0dd8f-886a-4441-8f05-fd629da80f07,d3e0dd8f-886a-4441-8f05-fd629da80f07,1,0,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,1,0,1f927f76-5523-4880-9d26-d69a059f2b67,1f927f76-5523-4880-9d26-d69a059f2b67,1,0,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,1,0,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,1,0,b0b63551-4e83-4201-af9a-b4ab150c43a5,b0b63551-4e83-4201-af9a-b4ab150c43a5,1,0,ca85912b-87b4-481e-9184-017364b4603d,ca85912b-87b4-481e-9184-017364b4603d,1,0,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,1,0,572019eb-ffc4-4cfd-b4ba-c09267900c6c,572019eb-ffc4-4cfd-b4ba-c09267900c6c,1,0,bb7fad68-32d3-4e6a-be62-2c4c34c94737,bb7fad68-32d3-4e6a-be62-2c4c34c94737,1,0,da462777-f926-4308-92e5-c654da53d415,da462777-f926-4308-92e5-c654da53d415,1,0,2650db63-ca98-4a8a-8c36-165548aa5279,2650db63-ca98-4a8a-8c36-165548aa5279,1,0,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,1,0,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,1,0,a69525c7-27ff-48df-b26b-325ba580a53e,a69525c7-27ff-48df-b26b-325ba580a53e,1,0,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,1,0,33c66a15-e48e-406a-a77c-02af72ae96d5,33c66a15-e48e-406a-a77c-02af72ae96d5,1,0,ebd3dcc2-1176-4ee0-b590-ee39f85fb55b,ebd3dcc2-1176-4ee0-b590-ee39f85fb55b,1,0,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,1,0,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,1,0,459ed297-0c0d-4bdb-90a3-da387868f040,459ed297-0c0d-4bdb-90a3-da387868f040,1,0,ccb5b9a7-1a10-4803-b455-0350afe4b584,ccb5b9a7-1a10-4803-b455-0350afe4b584,1,0,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,1,0,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,1,0,ba5e7c41-0442-4f74-ba41-631d864eafb4,ba5e7c41-0442-4f74-ba41-631d864eafb4,1,0,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,1,0,d3c9b925-6b74-42db-8b21-ab21d24797d1,d3c9b925-6b74-42db-8b21-ab21d24797d1,1,0,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,1,0,39261a2d-7c46-40b1-9f8f-02d970aa04bc,39261a2d-7c46-40b1-9f8f-02d970aa04bc,1,0,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,1,0,124a516f-cdab-49ce-95d1-359921140342,124a516f-cdab-49ce-95d1-359921140342,1,0,e4294611-a770-4e67-9578-a1f370879476,e4294611-a770-4e67-9578-a1f370879476,1,0,c5033dd2-0911-4124-8688-dc9dabf3155f,c5033dd2-0911-4124-8688-dc9dabf3155f,1,0,274357df-cb5c-407d-ae72-58046c310db2,274357df-cb5c-407d-ae72-58046c310db2,1,0,5467001e-d025-4669-b16e-26381ac4403f,5467001e-d025-4669-b16e-26381ac4403f,1,0,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,1,0,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,1,0,bb3a9973-67ce-479e-8668-c2f3bb20301e,bb3a9973-67ce-479e-8668-c2f3bb20301e,1,0,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,1,0,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,1,0,37169451-1464-4f24-8ca6-802963ffb636,37169451-1464-4f24-8ca6-802963ffb636,1,0,c3a958b1-590f-4418-a74f-5982b478cf52,c3a958b1-590f-4418-a74f-5982b478cf52,1,0,ef0e618d-0942-460a-ac65-9aca2fed976e,ef0e618d-0942-460a-ac65-9aca2fed976e,1,0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,1,0,2ac8bd69-9fbf-4f15-b58d-397d9e903532,2ac8bd69-9fbf-4f15-b58d-397d9e903532,1,0,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,1,0,5b460b92-2c74-4f59-88b2-18d9aac42c04,5b460b92-2c74-4f59-88b2-18d9aac42c04,1,0,db05d35b-5f53-4c27-ba80-b477b9a98299,db05d35b-5f53-4c27-ba80-b477b9a98299,1,0,fa872ae1-b699-46fe-9d6a-e42e1388752b,fa872ae1-b699-46fe-9d6a-e42e1388752b,1,0,1acf34e6-c428-4130-82f0-5160dfcc0858,1acf34e6-c428-4130-82f0-5160dfcc0858,1,0,57046262-b9ce-4670-9cf5-6db9e58dd0d5,57046262-b9ce-4670-9cf5-6db9e58dd0d5,1,0,a9824176-36d5-4be5-9984-f4312ff48515,a9824176-36d5-4be5-9984-f4312ff48515,1,0,8e980ca0-1627-45e8-bd27-5dd1ac199459,8e980ca0-1627-45e8-bd27-5dd1ac199459,1,0,8b653beb-af9f-4f39-b691-ae14f80b7cd6,8b653beb-af9f-4f39-b691-ae14f80b7cd6,1,0,77559c11-713f-454d-aff4-56649e1350e9,77559c11-713f-454d-aff4-56649e1350e9,1,0,0c965703-c1d0-48b7-80f9-b8d869ff98f5,0c965703-c1d0-48b7-80f9-b8d869ff98f5,1,0,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,1,0,7ba42162-557b-4e34-8aca-0cdee8cb2452,7ba42162-557b-4e34-8aca-0cdee8cb2452,1,0,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,1,0,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,1,0,dd577924-c6cb-4aa9-9db5-366d8958d00f,dd577924-c6cb-4aa9-9db5-366d8958d00f,1,0,8ed8f72e-404a-4be4-a44d-ddebbad5f411,8ed8f72e-404a-4be4-a44d-ddebbad5f411,1,0,e919bc4c-86e6-44f6-be27-5a729b63d042,e919bc4c-86e6-44f6-be27-5a729b63d042,1,0,ec580e4f-1518-4923-a10e-bc1da8688b37,ec580e4f-1518-4923-a10e-bc1da8688b37,1,0,91c3902a-314f-4d40-8bcc-8dd131fed2f4,91c3902a-314f-4d40-8bcc-8dd131fed2f4,1,0,ae2b21c5-9349-49e8-9627-26f05c21f43a,ae2b21c5-9349-49e8-9627-26f05c21f43a,1,0,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,1,0,917a19d7-73db-4247-b892-397598d67879,917a19d7-73db-4247-b892-397598d67879,1,0,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1,0,d8066600-c669-449d-a187-fdd3af8f7afa,d8066600-c669-449d-a187-fdd3af8f7afa,1,0,dadf86a6-c118-4827-b1b9-6cfee731242f,dadf86a6-c118-4827-b1b9-6cfee731242f,1,0,45bf7b20-f048-491a-a989-e50bea13d028,45bf7b20-f048-491a-a989-e50bea13d028,1,0,9ad3b432-5b49-44ee-9d8d-83c36458d927,9ad3b432-5b49-44ee-9d8d-83c36458d927,1,0,a9967bff-53b9-4295-a253-3647d956d3cb,a9967bff-53b9-4295-a253-3647d956d3cb,1,0,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,1,0,b8a31397-8974-44ec-92b0-7cbdc481cf7e,b8a31397-8974-44ec-92b0-7cbdc481cf7e,1,0,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,1,0,fb16c4d5-854c-4525-92be-b21fa2df5b0d,fb16c4d5-854c-4525-92be-b21fa2df5b0d,1,0,5771de21-2086-432b-ad91-de14a39bd5bc,5771de21-2086-432b-ad91-de14a39bd5bc,1,0,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,1,0,ed96fbfa-bda7-405c-9073-d0b6feffedad,ed96fbfa-bda7-405c-9073-d0b6feffedad,1,0,50c724cb-dde1-4313-9492-b1750bd0afc1,50c724cb-dde1-4313-9492-b1750bd0afc1,1,0,12901981-6106-4471-ab3a-e127c2bb4ebd,12901981-6106-4471-ab3a-e127c2bb4ebd,1,0,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,1,0,d5ea5dea-233d-4106-b9ba-f030d4f762ef,d5ea5dea-233d-4106-b9ba-f030d4f762ef,1,0,903af05e-5ac5-46aa-843b-d74f9e417c1d,903af05e-5ac5-46aa-843b-d74f9e417c1d,1,0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,1,0,a344290a-c9be-47a7-95ad-ced1b52a0995,a344290a-c9be-47a7-95ad-ced1b52a0995,1,0,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,1,0,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,1,0,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,1,0,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,1,0,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,1,0,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,1,0,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,1,0,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,1,0,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,1,0,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,1,0,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,1,0,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,1,0,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,1,0,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,1,0,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,1,0,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,1,0,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,1,0,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,1,0,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,1,0,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,1,0,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,1,0,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,1,0,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,1,0,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,1,0,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,1,0,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,1,0,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,1,0,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,1,0,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,1,0,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,1,0,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,1,0,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,1,0,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,1,0,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,1,0,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,1,0,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,1,0,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,1,0,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,1,0,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,1,0,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,1,0,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,1,0,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,1,0,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,1,0,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,1,0,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,1,0,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,1,0,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,1,0,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,1,0,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,1,0,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,1,0,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,1,0,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,1,0,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,1,0,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,1,0,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,1,0,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,1,0,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,1,0,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,1,0,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,1,0,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,1,0,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,1,0,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,1,0,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,1,0,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,1,0,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,1,0,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,1,0,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,1,0,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,1,0,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,1,0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,1,0,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,1,0,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,1,0,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,1,0,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,1,0,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,1,0,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,1,0,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,1,0,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,1,0,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,1,0,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,1,0,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,1,0,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,1,0,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,1,0,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,1,0,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,1,0,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,1,0,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,1,0,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,1,0,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,1,0,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,1,0,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,1,0,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,1,0,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,1,0,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,1,0,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,1,0,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,1,0,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,1,0,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,1,0,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1,0,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,1,0,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,1,0,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,1,0,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,1,0,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,1,0,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,1,0,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,1,0,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,1,0,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,1,0,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,1,0,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,1,0,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,1,0,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,1,0,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,1,0,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,1,0,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,1,0,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,1,0,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,1,0,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,1,0,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,1,0,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,1,0,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,1,0,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,1,0,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,1,0,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,1,0,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,1,0,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,1,0,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,1,0,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,1,0,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,1,0,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,1,0,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,1,0,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,1,0,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,1,0,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,1,0,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,1,0,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,1,0,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,1,0,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,1,0,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,1,0,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,1,0,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,1,0,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,1,0,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,1,0,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,1,0,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,1,0,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,1,0,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,1,0,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,1,0,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,1,0,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,1,0,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,1,0,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,1,0,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,1,0,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,1,0,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,1,0,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,1,0,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,1,0,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,1,0,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,1,0,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,1,0,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,1,0,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,1,0,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,1,0,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,1,0,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,1,0,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,1,0,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,1,0,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,1,0,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,1,0,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,1,0,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,1,0,b19f1223-5ebe-4446-bacc-bc7d53486f2e,b19f1223-5ebe-4446-bacc-bc7d53486f2e,1,0,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,1,0,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,1,0,bf3167d6-3047-482a-b280-184f446ae7a3,bf3167d6-3047-482a-b280-184f446ae7a3,1,0,50c47c0a-a199-4020-9df4-91b17c159454,50c47c0a-a199-4020-9df4-91b17c159454,1,0,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,1,0,faecdc33-fed8-4b44-96f4-4215c26959b6,faecdc33-fed8-4b44-96f4-4215c26959b6,1,0,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,1,0,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,1,0,9df3792e-a4ee-4a2c-9296-c1384925521e,9df3792e-a4ee-4a2c-9296-c1384925521e,1,0,03d423db-f98a-468f-9040-5b76454e5a98,03d423db-f98a-468f-9040-5b76454e5a98,1,0,08f394f9-d254-4fe5-8651-a69c96de7a62,08f394f9-d254-4fe5-8651-a69c96de7a62,1,0,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,1,0,6aff6b2f-660b-4d75-9064-fed7a6b0feac,6aff6b2f-660b-4d75-9064-fed7a6b0feac,1,0,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,1,0,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,1,0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,1,0,e60a9221-7676-456f-8a01-b317b03a278b,e60a9221-7676-456f-8a01-b317b03a278b,1,0,4e81ec90-f668-49ca-9193-22337bafb01b,4e81ec90-f668-49ca-9193-22337bafb01b,1,0,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,1,0,cd60adec-52d6-4fa8-85ca-26551196432c,cd60adec-52d6-4fa8-85ca-26551196432c,1,0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,1,0,b71ddbdb-08bb-46be-a79d-319c4a557e76,b71ddbdb-08bb-46be-a79d-319c4a557e76,1,0,d3dfa867-3d52-4872-a69e-f27636abe1bd,d3dfa867-3d52-4872-a69e-f27636abe1bd,1,0,6952d1aa-7132-4e40-8542-f64a4dc1e029,6952d1aa-7132-4e40-8542-f64a4dc1e029,1,0,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,1,0,1621811b-dfd3-4c58-8e15-ced16690147a,1621811b-dfd3-4c58-8e15-ced16690147a,1,0,3f266e51-0476-4b7f-8d61-6f9f4456049d,3f266e51-0476-4b7f-8d61-6f9f4456049d,1,0,2b9ce591-ff13-4c2d-85c4-632a2609a211,2b9ce591-ff13-4c2d-85c4-632a2609a211,1,0,689ca0ec-61ce-4590-b73b-ac81e8f1d459,689ca0ec-61ce-4590-b73b-ac81e8f1d459,1,0,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,1,0,55ad36d7-399e-4b82-8d1c-d45bd890abfe,55ad36d7-399e-4b82-8d1c-d45bd890abfe,1,0,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,1,0,1b39a65f-5425-4bcb-85bd-1425274af8a8,1b39a65f-5425-4bcb-85bd-1425274af8a8,1,0,392a0618-a41a-4713-a561-f3a80b85abd8,392a0618-a41a-4713-a561-f3a80b85abd8,1,0,a453384d-658d-40f1-ac69-578aa3a24e39,a453384d-658d-40f1-ac69-578aa3a24e39,1,0,2215a441-b9b1-4e5c-8df3-e6cee9226c43,2215a441-b9b1-4e5c-8df3-e6cee9226c43,1,0,2a8d4908-ea0d-4837-be3f-bd78f6b61254,2a8d4908-ea0d-4837-be3f-bd78f6b61254,1,0,ec1deb79-7369-4b26-8e91-f51399e8052a,ec1deb79-7369-4b26-8e91-f51399e8052a,1,0,75dde4fb-3a1a-450c-95c2-c1f95a781db9,75dde4fb-3a1a-450c-95c2-c1f95a781db9,1,0,0ae3ac56-160a-417e-9952-719d02e7f089,0ae3ac56-160a-417e-9952-719d02e7f089,1,0,f5b3983d-d22d-44a8-9069-0a60d8b858bf,f5b3983d-d22d-44a8-9069-0a60d8b858bf,1,0,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,1,0,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,1,0,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,1,0,9f36d26e-aa71-44d5-ac27-9aaa643555c3,9f36d26e-aa71-44d5-ac27-9aaa643555c3,1,0,87b8b5d7-d3d6-450a-adb1-5c875257ec80,87b8b5d7-d3d6-450a-adb1-5c875257ec80,1,0,e3640efe-e46c-4588-b251-dda23bf0641d,e3640efe-e46c-4588-b251-dda23bf0641d,1,0,bb6e6574-4328-4cf5-a043-a7d8f6c81414,bb6e6574-4328-4cf5-a043-a7d8f6c81414,1,0,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,1,0,522a4bff-34d3-46b2-8c66-0b30d881a86e,522a4bff-34d3-46b2-8c66-0b30d881a86e,1,0,3d7908b1-bd82-475e-8488-fafcbe3458ee,3d7908b1-bd82-475e-8488-fafcbe3458ee,1,0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1,0,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,1,0,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,1,0,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,1,0,0f9c08c2-e7fa-4ea0-a935-f927feb01131,0f9c08c2-e7fa-4ea0-a935-f927feb01131,1,0,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,1,0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,1,0,57069b56-f732-41c0-9a75-cbdb1e88556c,57069b56-f732-41c0-9a75-cbdb1e88556c,1,0,6d042890-27b2-4efc-935e-8190bb57c037,6d042890-27b2-4efc-935e-8190bb57c037,1,0,23e79add-7f1c-422a-9df1-8f76ebf805df,23e79add-7f1c-422a-9df1-8f76ebf805df,1,0,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,1,0,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,1,0,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,1,0,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,1,0,5dcd8e28-b058-405a-bac4-defab7d4b789,5dcd8e28-b058-405a-bac4-defab7d4b789,1,0,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,1,0,077af11c-fd3c-4e87-b169-5f3137464f77,077af11c-fd3c-4e87-b169-5f3137464f77,1,0,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,1,0,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,1,0,da8f7f30-eb80-44db-a451-348306c90cd8,da8f7f30-eb80-44db-a451-348306c90cd8,1,0,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,1,0,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,1,0,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,1,0,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,1,0,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,1,0,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,1,0,9847676d-f44d-46a0-83e2-4a43a835caf8,9847676d-f44d-46a0-83e2-4a43a835caf8,1,0,43c18cae-21a9-413b-a350-d5cf826980f0,43c18cae-21a9-413b-a350-d5cf826980f0,1,0,16773cdb-b979-42d5-a2a5-d4b79e8737bd,16773cdb-b979-42d5-a2a5-d4b79e8737bd,1,0,c28a190a-f487-4e99-b8f8-6928268086f8,c28a190a-f487-4e99-b8f8-6928268086f8,1,0,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,1,0,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,1,0,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,1,0,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,1,0,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,1,0,f321e378-6d50-4567-8434-813f367d3a65,f321e378-6d50-4567-8434-813f367d3a65,1,0,27246fd8-a8a3-4244-b49a-c0372a812167,27246fd8-a8a3-4244-b49a-c0372a812167,1,0,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,1,0,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,1,0,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,1,0,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,1,0,5d338e31-a56b-45f0-8a62-0270ca543f6a,5d338e31-a56b-45f0-8a62-0270ca543f6a,1,0,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,1,0,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,1,0,a7098d41-a978-4c77-937c-8deebdfe0bcd,a7098d41-a978-4c77-937c-8deebdfe0bcd,1,0,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,1,0,c11d967b-1250-4345-90b0-011a96c5ae5e,c11d967b-1250-4345-90b0-011a96c5ae5e,1,0,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,1,0,ef8a82f2-d3e5-4f0d-8a16-024d9cdacce2,ef8a82f2-d3e5-4f0d-8a16-024d9cdacce2,1,0,24eed105-f612-4340-ad79-388a7b39b58c,24eed105-f612-4340-ad79-388a7b39b58c,1,0,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,1,0,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,1,0,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,1,0,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,1,0,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,1,0,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,1,0,6a2add61-edb7-4561-bae9-06b3741e7726,6a2add61-edb7-4561-bae9-06b3741e7726,1,0,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,1,0,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,1,0,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,1,0,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,1,0,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,1,0,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,1,0,e1314cd1-e662-4c29-ad51-492cb0029883,e1314cd1-e662-4c29-ad51-492cb0029883,1,0,ae3876e2-bd06-415b-9d9a-b77d787be09e,ae3876e2-bd06-415b-9d9a-b77d787be09e,1,0,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,1,0,4718392b-477c-496b-9d28-ddbdaa7a04f2,4718392b-477c-496b-9d28-ddbdaa7a04f2,1,0,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,1,0,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,1,0,9690842c-7a2c-4b5d-a238-f730afc49a7b,9690842c-7a2c-4b5d-a238-f730afc49a7b,1,0,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,1,0,cd6b749d-55a4-4e10-a933-8d97bfe2f9df,cd6b749d-55a4-4e10-a933-8d97bfe2f9df,1,0,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,1,0,b76c3bd6-924a-4378-acbe-6f17232b201b,b76c3bd6-924a-4378-acbe-6f17232b201b,1,0,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,1,0,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,1,0,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,1,0,9d358304-3fd0-4ec6-9400-cc498ff2f751,9d358304-3fd0-4ec6-9400-cc498ff2f751,1,0,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,1,0,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,1,0,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,1,0,74067eee-6cd4-4ae3-becc-457ecb51dc9a,74067eee-6cd4-4ae3-becc-457ecb51dc9a,1,0,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,1,0,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,1,0,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,1,0,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,1,0,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,1,0,343b979a-97e3-4eac-a314-3bd3eea9c15c,343b979a-97e3-4eac-a314-3bd3eea9c15c,1,0,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,1,0,f5bb88eb-c239-4ae3-a297-dfbbd679e008,f5bb88eb-c239-4ae3-a297-dfbbd679e008,1,0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,1,0,f259b6b4-d582-429f-a16f-027a6bcb7438,f259b6b4-d582-429f-a16f-027a6bcb7438,1,0,9f32e85c-2ed6-41db-b0ec-6d8596940e80,9f32e85c-2ed6-41db-b0ec-6d8596940e80,1,0,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,1,0,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,1,0,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,1,0,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,1,0,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,1,0,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,1,0,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,1,0,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,1,0,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,1,0,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,1,0,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,1,0,aa0c32ae-da52-4df9-8b77-99ea31f8df81,aa0c32ae-da52-4df9-8b77-99ea31f8df81,1,0,d7dcd391-3a0e-4aa9-9b53-467a1de67593,d7dcd391-3a0e-4aa9-9b53-467a1de67593,1,0,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,1,0,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,1,0,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,1,0,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,1,0,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,1,0,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,1,0,00e48a23-eb5b-4a29-b36c-218ab9760f23,00e48a23-eb5b-4a29-b36c-218ab9760f23,1,0,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,1,0,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,1,0,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,1,0,1511c2e3-aeb4-422a-b6ae-03412b714c93,1511c2e3-aeb4-422a-b6ae-03412b714c93,1,0,331db120-ba88-4eb3-a8ec-10691be82e2d,331db120-ba88-4eb3-a8ec-10691be82e2d,1,0,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,1,0,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,1,0,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,1,0,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,1,0,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,1,0,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,1,0,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,1,0,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,1,0,3924c17c-6ee3-4406-8023-0a79a242e389,3924c17c-6ee3-4406-8023-0a79a242e389,1,0,84a159ed-bc5f-4497-94d1-94b187b0bffe,84a159ed-bc5f-4497-94d1-94b187b0bffe,1,0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,1,0,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,1,0,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,1,0,f95adb50-fa0b-434c-93dd-b7fd211220b7,f95adb50-fa0b-434c-93dd-b7fd211220b7,1,0,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,1,0,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,1,0,bd69bf55-dee0-4553-8f90-5fd025c0f773,bd69bf55-dee0-4553-8f90-5fd025c0f773,1,0,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,1,0,3cda70d0-3116-4508-82ea-5ea0f0921262,3cda70d0-3116-4508-82ea-5ea0f0921262,1,0,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,1,0,f415296e-fceb-4835-abe9-17bb17a5d5e5,f415296e-fceb-4835-abe9-17bb17a5d5e5,1,0,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,1,0,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,1,0,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,1,0,c8679d82-075c-4556-8231-c004d144fe61,c8679d82-075c-4556-8231-c004d144fe61,1,0,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,1,0,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,1,0,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,1,0,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,1,0,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,1,0,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,1,0,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,1,0,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,1,0,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,1,0,91d7687b-7627-473f-a08d-433f9d385107,91d7687b-7627-473f-a08d-433f9d385107,1,0,83db1b00-e9e3-41da-8a59-47589dcfd618,83db1b00-e9e3-41da-8a59-47589dcfd618,1,0,91d2d798-1498-4c52-aa7b-99db4b992876,91d2d798-1498-4c52-aa7b-99db4b992876,1,0,e85a03d3-e7c7-4058-992a-515a557d9e52,e85a03d3-e7c7-4058-992a-515a557d9e52,1,0,d3a1d247-8f4a-45af-9861-7e313a100209,d3a1d247-8f4a-45af-9861-7e313a100209,1,0,83385f31-2cdf-44a1-85c3-461e4ad5fd45,83385f31-2cdf-44a1-85c3-461e4ad5fd45,1,0,b55b06db-604e-4fb9-9253-638c747bd8f9,b55b06db-604e-4fb9-9253-638c747bd8f9,1,0,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,1,0,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,1,0,deb69010-80b0-4e28-acc7-8c50e8e6f873,deb69010-80b0-4e28-acc7-8c50e8e6f873,1,0,1a9177fe-6699-42b3-9588-eed9c6008c2d,1a9177fe-6699-42b3-9588-eed9c6008c2d,1,0,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,1,0,ae698468-f42a-4400-aee6-fd849740e634,ae698468-f42a-4400-aee6-fd849740e634,1,0,d62bdb25-f261-4282-aa72-52e2b107642c,d62bdb25-f261-4282-aa72-52e2b107642c,1,0,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,1,0,6438435e-97cc-4bd2-98dc-e21cee55bb0f,6438435e-97cc-4bd2-98dc-e21cee55bb0f,1,0,00579e31-e97d-4d79-ba25-b8d500a17e7f,00579e31-e97d-4d79-ba25-b8d500a17e7f,1,0,5001bea4-c8f9-4950-9eda-d33125e3bb46,5001bea4-c8f9-4950-9eda-d33125e3bb46,1,0,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,1,0,e815010d-e03d-46e4-b482-c1556902cc26,e815010d-e03d-46e4-b482-c1556902cc26,1,0,98bdfd19-b993-43bd-b2e1-3535d001ff29,98bdfd19-b993-43bd-b2e1-3535d001ff29,1,0,00a1fdb2-d233-4179-b78a-a7e27d9c03c5,00a1fdb2-d233-4179-b78a-a7e27d9c03c5,1,0,dd03e170-4186-495b-ae1c-fc66385d7ccf,dd03e170-4186-495b-ae1c-fc66385d7ccf,1,0,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,1,0,cdef5df6-f3a1-4950-b197-4f375914f885,cdef5df6-f3a1-4950-b197-4f375914f885,1,0,c1caff49-dc4b-4b3e-be47-122ea8b70416,c1caff49-dc4b-4b3e-be47-122ea8b70416,1,0,a1185a4c-7351-48b0-b662-61f61a1ad715,a1185a4c-7351-48b0-b662-61f61a1ad715,1,0,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,1,0,71d03545-df45-4c70-aa0d-3b916f2a9041,71d03545-df45-4c70-aa0d-3b916f2a9041,1,0,28a25822-2306-409a-a7c8-6f7e42bf25e8,28a25822-2306-409a-a7c8-6f7e42bf25e8,1,0,a45fa0c3-c363-4465-861f-13cedfeb79dd,a45fa0c3-c363-4465-861f-13cedfeb79dd,1,0,a72517c3-8c91-4e40-81ac-83c762789e87,a72517c3-8c91-4e40-81ac-83c762789e87,1,0,0233b335-7e26-4661-9850-8ab09d3178e3,0233b335-7e26-4661-9850-8ab09d3178e3,1,0,d942d536-5d01-4571-b910-abd973996a38,d942d536-5d01-4571-b910-abd973996a38,1,0,b82a7103-b872-49c3-b632-81d5a0051136,b82a7103-b872-49c3-b632-81d5a0051136,1,0,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,1,0,20c2053c-8ebd-4c07-8d95-956b424d047c,20c2053c-8ebd-4c07-8d95-956b424d047c,1,0,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,1,0,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,1,0,bef6081e-f377-41d6-83a1-b0e218a3fb46,bef6081e-f377-41d6-83a1-b0e218a3fb46,1,0,9b67bfd5-ef23-4205-b7ba-9466517e9999,9b67bfd5-ef23-4205-b7ba-9466517e9999,1,0,ea2c4c8e-23cc-4884-812e-1e959da48afc,ea2c4c8e-23cc-4884-812e-1e959da48afc,1,0,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,1,0,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,1,0,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,1,0,592f55e1-b004-44ef-878a-6c2016ccbeb0,592f55e1-b004-44ef-878a-6c2016ccbeb0,1,0,19add2bd-eede-4a05-901b-cf8ce49a638f,19add2bd-eede-4a05-901b-cf8ce49a638f,1,0,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,1,0,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,1,0,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,1,0,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,1,0,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,1,0,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,1,0,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,1,0,fef727fa-f63b-4467-9367-73a2425b19e3,fef727fa-f63b-4467-9367-73a2425b19e3,1,0,3b9c03bc-8517-498f-8052-e53854fb0753,3b9c03bc-8517-498f-8052-e53854fb0753,1,0,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,1,0,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,1,0,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,1,0,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,1,0,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,1,0,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1,0,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,1,0,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1,0,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,1,0,36b080d5-a870-46fa-bf8d-0a06e3a9719f,36b080d5-a870-46fa-bf8d-0a06e3a9719f,1,0,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,1,0,b3152292-5546-4896-ad24-cb41057698d8,b3152292-5546-4896-ad24-cb41057698d8,1,0,5f3d5a05-a581-462d-96a2-2750ba0e0481,5f3d5a05-a581-462d-96a2-2750ba0e0481,1,0,477ab478-b336-4bac-898f-e20e3a4039b5,477ab478-b336-4bac-898f-e20e3a4039b5,1,0,bfa90848-930f-433d-8f6f-c11ac2c5eba2,bfa90848-930f-433d-8f6f-c11ac2c5eba2,1,0,a4d767a1-d2e6-4e0a-ab35-9207eef54998,a4d767a1-d2e6-4e0a-ab35-9207eef54998,1,0,f38069e7-6d69-4be9-8463-bc7a33158a1a,f38069e7-6d69-4be9-8463-bc7a33158a1a,1,0,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,1,0,cc3a7f15-4db6-445e-b282-f44d0460b7d3,cc3a7f15-4db6-445e-b282-f44d0460b7d3,1,0,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,1,0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,1,0,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,1,0,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,1,0,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,1,0,e7d51ada-f286-4519-bfae-ece95dd4d7b0,e7d51ada-f286-4519-bfae-ece95dd4d7b0,1,0,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,1,0,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,1,0,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,1,0,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,1,0,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,1,0,9ed2c756-80a1-4559-8494-b7a9b82a4519,9ed2c756-80a1-4559-8494-b7a9b82a4519,1,0,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,1,0,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,1,0,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,1,0,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,1,0,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,1,0,68e82adf-bc03-4f23-9ec4-749ed42241da,68e82adf-bc03-4f23-9ec4-749ed42241da,1,0,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,1,0,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,1,0,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,1,0,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,1,0,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,1,0,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,1,0,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,1,0,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,1,0,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,1,0,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,1,0,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,1,0,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,1,0,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,1,0,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,1,0,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,1,0,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,1,0,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,1,0,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,1,0,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,1,0,eaf6045f-9ac0-43ef-b165-a45be75a4d44,eaf6045f-9ac0-43ef-b165-a45be75a4d44,1,0,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,1,0,a1130128-cc48-4555-93a2-99e7f74f77dc,a1130128-cc48-4555-93a2-99e7f74f77dc,1,0,9b4b7424-1af7-4d80-8404-8819fcfeae75,9b4b7424-1af7-4d80-8404-8819fcfeae75,1,0,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,1,0,405c52c4-25fe-45ff-abab-bf01041e768d,405c52c4-25fe-45ff-abab-bf01041e768d,1,0,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,1,0,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,1,0,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,1,0,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,1,0,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,1,0,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,1,0,f60cb71a-f451-426a-aa3a-aa266b8da149,f60cb71a-f451-426a-aa3a-aa266b8da149,1,0,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,1,0,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,1,0,23abf9ba-63f9-4173-a9ce-3cbdf1ec3a52,23abf9ba-63f9-4173-a9ce-3cbdf1ec3a52,1,0,973609a2-5b5d-45c4-9606-a13d0de1a09b,973609a2-5b5d-45c4-9606-a13d0de1a09b,1,0,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,1,0,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,1,0,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,1,0,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,1,0,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,1,0,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,1,0,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,1,0,48cefa96-46c7-4870-a096-951dcbae479a,48cefa96-46c7-4870-a096-951dcbae479a,1,0,d74e01cc-941b-4974-8771-0bd2e0d86724,d74e01cc-941b-4974-8771-0bd2e0d86724,1,0,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,1,0,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,1,0,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,1,0,aae09896-3b22-4d7d-9059-e47660f8b88b,aae09896-3b22-4d7d-9059-e47660f8b88b,1,0,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,1,0,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,1,0,4093fe34-7557-4f15-831b-d654b94b8010,4093fe34-7557-4f15-831b-d654b94b8010,1,0,ee10023f-5c63-4cb3-8e6c-db566c788c9d,ee10023f-5c63-4cb3-8e6c-db566c788c9d,1,0,845530cd-36fb-44c3-b30a-730985c9ca2d,845530cd-36fb-44c3-b30a-730985c9ca2d,1,0,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,1,0,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,1,0,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,1,0,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,1,0,252eb146-0d23-46ae-9feb-ee04531dd7d8,252eb146-0d23-46ae-9feb-ee04531dd7d8,1,0,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,1,0,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,1,0,ce5549bd-ba99-4259-86a3-36521bad59f5,ce5549bd-ba99-4259-86a3-36521bad59f5,1,0,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,1,0,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,1,0,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,1,0,08552af7-3c44-42c6-94c5-63a2316127fc,08552af7-3c44-42c6-94c5-63a2316127fc,1,0,41f6f6d1-b7cf-4477-907b-ce69fc08c799,41f6f6d1-b7cf-4477-907b-ce69fc08c799,1,0,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,1,0,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,1,0,a300ecc3-8031-4a50-a17d-b08cf3a72139,a300ecc3-8031-4a50-a17d-b08cf3a72139,1,0,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,1,0,44b28019-01c0-468d-9b60-e050ff8b71ac,44b28019-01c0-468d-9b60-e050ff8b71ac,1,0,69f6173c-a570-41ff-b07f-5b85f7187515,69f6173c-a570-41ff-b07f-5b85f7187515,1,0,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,1,0,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,1,0,3e2828b4-2b55-471e-ac69-55119c2480f8,3e2828b4-2b55-471e-ac69-55119c2480f8,1,0,657b8663-713c-4a80-81e1-8c0166742a35,657b8663-713c-4a80-81e1-8c0166742a35,1,0,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,1,0,9da32b56-ff89-4739-bb99-615074b72298,9da32b56-ff89-4739-bb99-615074b72298,1,0,08baf3ee-b8ca-4f29-89fc-c15344064ad3,08baf3ee-b8ca-4f29-89fc-c15344064ad3,1,0,4766c40e-6330-4c1d-a64f-0c8c672886a4,4766c40e-6330-4c1d-a64f-0c8c672886a4,1,0,01b85e3a-9920-425a-9de5-5079fffeef93,01b85e3a-9920-425a-9de5-5079fffeef93,1,0,82e12316-cc64-4d2f-83fa-054b5a738f02,82e12316-cc64-4d2f-83fa-054b5a738f02,1,0,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,1,0,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,1,0,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,1,0,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,1,0,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,1,0,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,1,0,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,1,0,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,1,0,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,1,0,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,1,0,63470706-f14b-4733-87c2-d1173f5d7e7a,63470706-f14b-4733-87c2-d1173f5d7e7a,1,0,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,1,0,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,1,0,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,1,0,76cdcc51-0e6a-4f9c-a115-1864998c2add,76cdcc51-0e6a-4f9c-a115-1864998c2add,1,0,71c3e5d3-7504-433f-9d48-7c287b2b863b,71c3e5d3-7504-433f-9d48-7c287b2b863b,1,0,bb129cf2-5a5a-433a-924a-a1d0d895644a,bb129cf2-5a5a-433a-924a-a1d0d895644a,1,0,faa34cb8-2d48-4851-a839-fc40536a0234,faa34cb8-2d48-4851-a839-fc40536a0234,1,0,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,1,0,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,1,0,2b9dc754-cb46-4ef1-8048-8ea204a429cd,2b9dc754-cb46-4ef1-8048-8ea204a429cd,1,0,67aed41e-9707-4007-bb3c-7273476664bb,67aed41e-9707-4007-bb3c-7273476664bb,1,0,0d8c215d-1210-47a2-897d-a3257b9f849a,0d8c215d-1210-47a2-897d-a3257b9f849a,1,0,954e7804-e8b1-42aa-9d49-bef73f9d13d1,954e7804-e8b1-42aa-9d49-bef73f9d13d1,1,0,c971e0ba-53b8-4454-92f7-40b0d639058a,c971e0ba-53b8-4454-92f7-40b0d639058a,1,0,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,1,0,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,1,0,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,1,0,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,1,0,8c472f51-47ec-43c4-9858-fd19ac3e17f3,8c472f51-47ec-43c4-9858-fd19ac3e17f3,1,0,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,1,0,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,1,0,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,1,0,249b6436-bd44-4950-b118-7f40f7aaf794,249b6436-bd44-4950-b118-7f40f7aaf794,1,0,712c2b73-4697-4581-a095-70555aee8be2,712c2b73-4697-4581-a095-70555aee8be2,1,0,c1508d67-ac6d-41e3-884d-b3bdd54659f8,c1508d67-ac6d-41e3-884d-b3bdd54659f8,1,0,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,1,0,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,1,0,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,1,0,eb276904-cad7-4401-bb78-2d13946291f1,eb276904-cad7-4401-bb78-2d13946291f1,1,0,79ff04ac-4625-469b-916e-938f04de4dd2,79ff04ac-4625-469b-916e-938f04de4dd2,1,0,35103a27-230c-45c0-a8c9-24bd46608bbb,35103a27-230c-45c0-a8c9-24bd46608bbb,1,0,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,1,0,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,1,0,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,1,0,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,1,0,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,1,0,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,64f667e5-6a8f-448f-aed5-a4d461232845,64f667e5-6a8f-448f-aed5-a4d461232845,1,0,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,1,0,037842ca-aeaf-4e27-9a0e-e929438b6f40,037842ca-aeaf-4e27-9a0e-e929438b6f40,1,0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,1,0,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,1,0,de25a90c-4b46-4340-b649-93e16dde33de,de25a90c-4b46-4340-b649-93e16dde33de,1,0,4f2d0398-49f4-410c-a451-436cbf96a262,4f2d0398-49f4-410c-a451-436cbf96a262,1,0,b2c8bd74-21c9-4495-93e2-ca5355698350,b2c8bd74-21c9-4495-93e2-ca5355698350,1,0,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,1,0,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,1,0,93016393-c637-4d81-8675-aa5e51e678e0,93016393-c637-4d81-8675-aa5e51e678e0,1,0,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,1,0,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,1,0,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1,0,7a944c45-9b3d-411f-b2ef-de3c896092bb,7a944c45-9b3d-411f-b2ef-de3c896092bb,1,0,d2762764-b5c0-4aeb-8e89-3371972f22d8,d2762764-b5c0-4aeb-8e89-3371972f22d8,1,0,d67a1377-f69f-48d9-824d-2ede2594e630,d67a1377-f69f-48d9-824d-2ede2594e630,1,0,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,1,0,50d3e00e-1a83-4bd5-91db-0561560caf42,50d3e00e-1a83-4bd5-91db-0561560caf42,1,0,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1,0,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,1,0,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,1,0,4a1e6d25-89e7-468a-aef1-6ded0154dca2,4a1e6d25-89e7-468a-aef1-6ded0154dca2,1,0,44afff59-0590-4929-93b8-7b49735f21b5,44afff59-0590-4929-93b8-7b49735f21b5,1,0,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,1,0,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,1,0,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,1,0,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,1,0,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,1,0,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,1,0,f59f5511-87c5-4600-9d37-dc019bf0a6aa,f59f5511-87c5-4600-9d37-dc019bf0a6aa,1,0,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,1,0,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,1,0,9892f922-8745-4164-a200-94b5edc1ea0a,9892f922-8745-4164-a200-94b5edc1ea0a,1,0,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,1,0,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,1,0,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,1,0,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,1,0,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,1,0,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,1,0,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,1,0,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,1,0,30a87c95-4d55-4b68-877f-1055e1c1afa7,30a87c95-4d55-4b68-877f-1055e1c1afa7,1,0,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,1,0,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,1,0,4d660fec-4a76-470e-bba9-3d031941b289,4d660fec-4a76-470e-bba9-3d031941b289,1,0,26986f8d-d56d-4641-9184-2632d0881cca,26986f8d-d56d-4641-9184-2632d0881cca,1,0,144676de-f369-49f1-bb21-d60e073936df,144676de-f369-49f1-bb21-d60e073936df,1,0,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,1,0,d9f1f56b-75c8-43e9-8043-89076c225f78,d9f1f56b-75c8-43e9-8043-89076c225f78,1,0,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,1,0,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,1,0,a2a51b70-9570-4f53-9d30-e9a9b099a475,a2a51b70-9570-4f53-9d30-e9a9b099a475,1,0,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,1,0,21c1b2d3-cd96-4cdd-9ccc-ada27b127969,21c1b2d3-cd96-4cdd-9ccc-ada27b127969,1,0,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,1,0,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,1,0,fdcbe67c-55fb-444d-bed8-cee956ca3530,fdcbe67c-55fb-444d-bed8-cee956ca3530,1,0,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,1,0,6ff5b3cb-efff-430d-bf0a-957405f116ca,6ff5b3cb-efff-430d-bf0a-957405f116ca,1,0,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,1,0,7badb97b-c359-42af-9066-6bbfc0650cf9,7badb97b-c359-42af-9066-6bbfc0650cf9,1,0,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,1,0,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,1,0,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,1,0,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,1,0,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,1,0,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,1,0,fd3a6a7e-203d-447a-aebd-7626579387fb,fd3a6a7e-203d-447a-aebd-7626579387fb,1,0,8014684f-e1f1-4163-9083-459a009c0aac,8014684f-e1f1-4163-9083-459a009c0aac,1,0,ad6384d5-278b-44d3-993a-d5a39e7c98ca,ad6384d5-278b-44d3-993a-d5a39e7c98ca,1,0,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,1,0,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,1,0,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,1,0,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,1,0,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,1,0,b3554203-b930-496d-a712-353bc13a0946,b3554203-b930-496d-a712-353bc13a0946,1,0,59775ce0-f778-45f6-9453-bbd0a0ec1f27,59775ce0-f778-45f6-9453-bbd0a0ec1f27,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,1,0,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,1,0,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,1,0,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,1,0,ef6250de-a4ef-48d8-94d6-f4029e63d7d2,ef6250de-a4ef-48d8-94d6-f4029e63d7d2,1,0,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,1,0,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,1,0,83ead93b-4ff6-487d-934e-25088944fccc,83ead93b-4ff6-487d-934e-25088944fccc,1,0,764c76cc-0473-4633-868d-02f96aa43c10,764c76cc-0473-4633-868d-02f96aa43c10,1,0,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,1,0,41462827-fd8b-4ee6-a739-a884d704bba5,41462827-fd8b-4ee6-a739-a884d704bba5,1,0,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,1,0,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,1,0,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,1,0,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,1,0,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,1,0,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,1,0,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,1,0,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,1,0,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,1,0,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,1,0,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,1,0,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1,0,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,1,0,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,1,0,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,1,0,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,1,0,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,1,0,5a088468-4065-4e0c-9b84-1162de8d3fdd,5a088468-4065-4e0c-9b84-1162de8d3fdd,1,0,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,1,0,cdce186a-229d-492d-8811-147fc4d7cdf5,cdce186a-229d-492d-8811-147fc4d7cdf5,1,0,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,1,0,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,1,0,543f976e-fea3-4a51-9962-b8e0fcd3f707,543f976e-fea3-4a51-9962-b8e0fcd3f707,1,0,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,1,0,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,1,0,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,1,0,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,1,0,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,1,0,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,1,0,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,1,0,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,1,0,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,1,0,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,1,0,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,1,0,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,1,0,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,1,0,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,1,0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,1,0,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,1,0,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,1,0,ca797560-8802-4bdc-b21f-7a7fd795beae,ca797560-8802-4bdc-b21f-7a7fd795beae,1,0,56242b05-d722-4d4a-82d9-517e0e169d0b,56242b05-d722-4d4a-82d9-517e0e169d0b,1,0,5504f5d1-35d8-4a47-a0e1-003fe00395c1,5504f5d1-35d8-4a47-a0e1-003fe00395c1,1,0,73c1a829-0191-486b-97a0-7f333c6f8011,73c1a829-0191-486b-97a0-7f333c6f8011,1,0,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,1,0,06afe397-1c7e-400e-bb24-f8e611d114e8,06afe397-1c7e-400e-bb24-f8e611d114e8,1,0,f0105e51-9510-426a-8aa0-af827d93ffd9,f0105e51-9510-426a-8aa0-af827d93ffd9,1,0,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,1,0,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,1,0,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,1,0,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,1,0,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,1,0,11fe3a42-98c4-49ba-b697-86ffb172f16f,11fe3a42-98c4-49ba-b697-86ffb172f16f,1,0,07b53818-7318-4400-8af5-457fac012755,07b53818-7318-4400-8af5-457fac012755,1,0,292b47e7-5cf3-462d-a466-dac6253a7f03,292b47e7-5cf3-462d-a466-dac6253a7f03,1,0,8ecc070f-f6fb-46b1-9636-b77aa80f8804,8ecc070f-f6fb-46b1-9636-b77aa80f8804,1,0,8405be9d-465b-4744-b04f-03933b52f02e,8405be9d-465b-4744-b04f-03933b52f02e,1,0,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,1,0,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,1,0,9bf55587-1ffe-42bc-b8e8-3f956956f689,9bf55587-1ffe-42bc-b8e8-3f956956f689,1,0,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,1,0,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,1,0,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,1,0,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,1,0,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,1,0,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,1,0,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,1,0,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,1,0,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,1,0,73d8b319-9bea-4638-a602-23c12f37c227,73d8b319-9bea-4638-a602-23c12f37c227,1,0,cef55e64-d4ad-42dc-aa5a-ea65a3af7cfa,cef55e64-d4ad-42dc-aa5a-ea65a3af7cfa,1,0,a43e9de0-2921-4c58-a5f8-7446258be967,a43e9de0-2921-4c58-a5f8-7446258be967,1,0,307656e3-df7f-46e7-946c-bbd439265c95,307656e3-df7f-46e7-946c-bbd439265c95,1,0,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,1,0,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,1,0,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,1,0,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,1,0,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,1,0,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,1,0,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,1,0,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,1,0,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,1,0,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,1,0,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,1,0,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,1,0,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,1,0,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,1,0,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,1,0,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,1,0,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,1,0,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,1,0,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,1,0,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,1,0,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,1,0,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,1,0,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,1,0,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,1,0,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,1,0,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,1,0,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,1,0,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,1,0,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,1,0,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,1,0,dd383422-dddb-4a81-9326-015fd345b5c1,dd383422-dddb-4a81-9326-015fd345b5c1,1,0,9a4a0b04-3dfb-4551-90f0-16231f64b14f,9a4a0b04-3dfb-4551-90f0-16231f64b14f,1,0,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,1,0,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,1,0,98edcd6b-1c50-45c6-9a4c-390827a4ba52,98edcd6b-1c50-45c6-9a4c-390827a4ba52,1,0,b99c2068-15ea-43a1-9e9f-db29647e2387,b99c2068-15ea-43a1-9e9f-db29647e2387,1,0,346cb8b7-a20e-4a06-823e-26dfb2e3e741,346cb8b7-a20e-4a06-823e-26dfb2e3e741,1,0,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,1,0,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,1,0,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,1,0,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,1,0,7fe61c5d-30bc-440d-9e40-12ff3b296616,7fe61c5d-30bc-440d-9e40-12ff3b296616,1,0,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,1,0,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,1,0,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,1,0,13dee5d8-f165-48de-9ccb-3ef0239f4b27,13dee5d8-f165-48de-9ccb-3ef0239f4b27,1,0,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,1,0,9395eb9d-6aff-4af5-a6f1-5c39014ba67b,9395eb9d-6aff-4af5-a6f1-5c39014ba67b,1,0,8a13c899-1659-48cf-9aa2-07ca99547b7b,8a13c899-1659-48cf-9aa2-07ca99547b7b,1,0,eb3f959c-94a4-4e77-b9f9-e81954254079,eb3f959c-94a4-4e77-b9f9-e81954254079,1,0,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,1,0,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,1,0,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,1,0,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,1,0,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,1,0,e8bec681-d269-41ba-9184-556cbcc27d74,e8bec681-d269-41ba-9184-556cbcc27d74,1,0,b8aaef91-f72c-4127-a494-771c13694ca4,b8aaef91-f72c-4127-a494-771c13694ca4,1,0,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,1,0,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,1,0,3e090261-4aa2-4ece-9f77-62df83c890b3,3e090261-4aa2-4ece-9f77-62df83c890b3,1,0,bbfd9834-12b4-49ca-bdae-5c94efa80482,bbfd9834-12b4-49ca-bdae-5c94efa80482,1,0,9292034c-24e8-49a7-9b77-7974e117847d,9292034c-24e8-49a7-9b77-7974e117847d,1,0,3327b7d4-62fc-44cc-83b4-c449bfa4e706,3327b7d4-62fc-44cc-83b4-c449bfa4e706,1,0,43ecee25-68eb-48cf-bbaa-aee71052438f,43ecee25-68eb-48cf-bbaa-aee71052438f,1,0,93799f8b-0188-4546-8815-35e733bcc2b1,93799f8b-0188-4546-8815-35e733bcc2b1,1,0,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,1,0,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,1,0,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,1,0,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,1,0,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,1,0,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,1,0,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,1,0,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,1,0,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,1,0,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,1,0,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,1,0,1b4feda1-e555-4b85-b236-b21153a7246f,1b4feda1-e555-4b85-b236-b21153a7246f,1,0,61d3cef4-2c42-417d-a762-a2d2f5a28924,61d3cef4-2c42-417d-a762-a2d2f5a28924,1,0,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,1,0,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,1,0,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,1,0,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,1,0,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,1,0,7ab6acda-6732-4582-8092-d43f9a98a28d,7ab6acda-6732-4582-8092-d43f9a98a28d,1,0,5ab1d405-bfc3-4440-8cdd-3a63013b064d,5ab1d405-bfc3-4440-8cdd-3a63013b064d,1,0,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,1,0,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,1,0,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,1,0,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,1,0,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,1,0,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,1,0,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,1,0,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,1,0,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,1,0,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,1,0,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,1,0,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,1,0,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,1,0,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,1,0,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,1,0,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,1,0,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,1,0,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,1,0,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,1,0,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,1,0,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,1,0,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,1,0,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,1,0,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,1,0,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,1,0,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,1,0,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,1,0,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,1,0,e72e59c0-391d-497e-9407-063e0edf573e,e72e59c0-391d-497e-9407-063e0edf573e,1,0,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,1,0,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,1,0,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,1,0,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,1,0,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,1,0,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,1,0,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,1,0,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,1,0,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,1,0,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,1,0,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,1,0,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,1,0,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,1,0,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,1,0,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,1,0,13b27ec3-2be9-4959-92e5-94ba7bb64f03,13b27ec3-2be9-4959-92e5-94ba7bb64f03,1,0,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,1,0,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,1,0,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,1,0,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,1,0,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,1,0,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,1,0,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,1,0,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,1,0,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,1,0,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,1,0,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,1,0,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,1,0,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,1,0,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,1,0,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,1,0,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,1,0,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,1,0,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,1,0,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,1,0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,1,0,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,1,0,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,1,0,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,1,0,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,1,0,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,1,0,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,1,0,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,1,0,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,1,0,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,1,0,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,1,0,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,1,0,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,1,0,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,1,0,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,1,0,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,1,0,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,1,0,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,1,0,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,1,0,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,1,0,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,1,0,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,1,0,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,1,0,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,1,0,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,1,0,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,1,0,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,1,0,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,1,0,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,1,0,f9950ab5-1077-4033-bbbf-53899a1bcf33,f9950ab5-1077-4033-bbbf-53899a1bcf33,1,0,8f16763b-86f0-4ad0-b786-cce7dcb3460e,8f16763b-86f0-4ad0-b786-cce7dcb3460e,1,0,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,1,0,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,1,0,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,1,0,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,1,0,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,1,0,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,1,0,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1,0,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,1,0,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,1,0,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,1,0,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,1,0,295f3692-0721-4c41-a69b-171ef20a5018,295f3692-0721-4c41-a69b-171ef20a5018,1,0,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,1,0,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,1,0,8d31ce6a-4d44-46c6-a11c-47fb33e88691,8d31ce6a-4d44-46c6-a11c-47fb33e88691,1,0,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,1,0,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,1,0,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,1,0,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,1,0,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,1,0,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,1,0,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,1,0,35828c88-f1ec-42e7-b189-78748931ee4a,35828c88-f1ec-42e7-b189-78748931ee4a,1,0,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,1,0,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1,0,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,1,0,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,1,0,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,1,0,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,1,0,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,1,0,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,1,0,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,1,0,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,1,0,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,1,0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,1,0,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,1,0,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,1,0,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,1,0,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,1,0,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,1,0,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,1,0,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,1,0,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,1,0,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,1,0,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,1,0,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,1,0,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,1,0,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,1,0,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,1,0,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,1,0,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,1,0,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,1,0,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,1,0,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,1,0,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,1,0,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,1,0,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,1,0,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,1,0,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,1,0,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,1,0,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,1,0,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,1,0,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,1,0,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,1,0,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,1,0,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,1,0,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,1,0,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,1,0,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,1,0,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,1,0,211d226f-dac6-43d5-8720-952da4339e35,211d226f-dac6-43d5-8720-952da4339e35,1,0,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,1,0,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,1,0,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,1,0,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,1,0,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,1,0,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,1,0,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,1,0,463b8966-a5f9-4a80-82b9-1608a1622e13,463b8966-a5f9-4a80-82b9-1608a1622e13,1,0,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,1,0,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,1,0,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,1,0,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,1,0,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,1,0,01cb357c-af28-4855-afae-45b6df19b344,01cb357c-af28-4855-afae-45b6df19b344,1,0,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,1,0,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,1,0,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,1,0,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,1,0,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,1,0,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,1,0,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,1,0,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,1,0,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,1,0,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,1,0,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,1,0,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,1,0,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,1,0,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,1,0,aa509aa3-dd45-41f3-82c7-59662c2e2c47,aa509aa3-dd45-41f3-82c7-59662c2e2c47,1,0,c4552529-e69e-4c5c-bd66-04b2f7dac281,c4552529-e69e-4c5c-bd66-04b2f7dac281,1,0,381b49ba-793a-4418-9fd4-598844fb72a6,381b49ba-793a-4418-9fd4-598844fb72a6,1,0,1aee302d-df31-49ea-b542-436dc1d79ae1,1aee302d-df31-49ea-b542-436dc1d79ae1,1,0,593509da-d33c-49ff-a62c-a28cbc4651c1,593509da-d33c-49ff-a62c-a28cbc4651c1,1,0,5e346a0b-a322-4565-adb9-70131fb05fa3,5e346a0b-a322-4565-adb9-70131fb05fa3,1,0,9a69c559-194b-4f74-9879-82740260f5f6,9a69c559-194b-4f74-9879-82740260f5f6,1,0,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,1,0,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,1,0,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,1,0,2e19fb7b-270f-4181-b4a1-640280bbbc5c,2e19fb7b-270f-4181-b4a1-640280bbbc5c,1,0,cf69b045-665d-4f6c-827f-5044beacd125,cf69b045-665d-4f6c-827f-5044beacd125,1,0,aa773eef-0c4a-49be-9f5e-9131bc041415,aa773eef-0c4a-49be-9f5e-9131bc041415,1,0,9b31e474-01d4-4c3b-a633-3a2ff3917d62,9b31e474-01d4-4c3b-a633-3a2ff3917d62,1,0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1,0,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,1,0,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,1,0,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,1,0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,1,0,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,1,0,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,1,0,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,1,0,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,1,0,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,1,0,426cbebb-880b-49c5-b046-83c5e071273e,426cbebb-880b-49c5-b046-83c5e071273e,1,0,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,1,0,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,1,0,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,1,0,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,1,0,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,1,0,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,1,0,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,1,0,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,1,0,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,1,0,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,1,0,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,1,0,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,1,0,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,1,0,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,1,0,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,1,0,37e3d914-643e-4963-b4a0-7bc6727c0c9b,37e3d914-643e-4963-b4a0-7bc6727c0c9b,1,0,b6902500-3e03-4e83-a077-00500abc00b6,b6902500-3e03-4e83-a077-00500abc00b6,1,0,4f97b909-68f9-482a-b958-b4caa9b83763,4f97b909-68f9-482a-b958-b4caa9b83763,1,0,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,1,0,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,1,0,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,1,0,30f18fbf-4240-4708-a71a-189f8fc324f3,30f18fbf-4240-4708-a71a-189f8fc324f3,1,0,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,1,0,cd869887-0b0e-43db-8b51-04fe4a1341d5,cd869887-0b0e-43db-8b51-04fe4a1341d5,1,0,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,1,0,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,1,0,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,1,0,cd8fd85f-f02e-4f11-b4b4-40670febfaca,cd8fd85f-f02e-4f11-b4b4-40670febfaca,1,0,3f023afb-c02a-42ee-9afe-0f47ef3fe721,3f023afb-c02a-42ee-9afe-0f47ef3fe721,1,0,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,1,0,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,1,0,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,1,0,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,1,0,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,1,0,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,1,0,091ccac1-9a63-4a89-bb0c-333b274b0c70,091ccac1-9a63-4a89-bb0c-333b274b0c70,1,0,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,1,0,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,1,0,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,1,0,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,1,0,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,1,0,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,1,0,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,1,0,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,1,0,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,1,0,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,1,0,2a6e1f2b-7378-456b-9657-9e971eaff716,2a6e1f2b-7378-456b-9657-9e971eaff716,1,0,c3cdea20-3055-4b4e-a531-a02d4f3ed294,c3cdea20-3055-4b4e-a531-a02d4f3ed294,1,0,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,1,0,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,1,0,4347f77e-bad9-4525-90a0-794787f03585,4347f77e-bad9-4525-90a0-794787f03585,1,0,cfde3330-2bed-4273-8d69-c213ebdde247,cfde3330-2bed-4273-8d69-c213ebdde247,1,0,2d6ca049-89a5-437e-971c-b8e42f61b460,2d6ca049-89a5-437e-971c-b8e42f61b460,1,0,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,1,0,271d58d0-4449-40cc-bae9-cc4c50eebd9b,271d58d0-4449-40cc-bae9-cc4c50eebd9b,1,0,58df9322-c786-4dd1-af49-7cd164b378da,58df9322-c786-4dd1-af49-7cd164b378da,1,0,8d48de7f-61d6-4462-9c14-f728206a482c,8d48de7f-61d6-4462-9c14-f728206a482c,1,0,a87e890a-8924-4f56-9e37-04579b95297a,a87e890a-8924-4f56-9e37-04579b95297a,1,0,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,1,0,4c1f2581-ee42-4df5-9169-20205a18a9be,4c1f2581-ee42-4df5-9169-20205a18a9be,1,0,bb3d9ea3-8895-4950-9ee9-4249ca983d48,bb3d9ea3-8895-4950-9ee9-4249ca983d48,1,0,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,1,0,b806d2b6-bbd1-4abd-9471-7791603a2fcf,b806d2b6-bbd1-4abd-9471-7791603a2fcf,1,0,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,1,0,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,1,0,34f50dd9-de16-4013-a2ef-6595d9c28930,34f50dd9-de16-4013-a2ef-6595d9c28930,1,0,56fcca65-3429-4409-bce7-f434f6530a74,56fcca65-3429-4409-bce7-f434f6530a74,1,0,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,1,0,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,1,0,b286f047-a4d0-4808-b1b4-27997ead6d49,b286f047-a4d0-4808-b1b4-27997ead6d49,1,0,49da2d3a-657a-4cfd-8e37-422b96d2cda5,49da2d3a-657a-4cfd-8e37-422b96d2cda5,1,0,fced16ae-abee-4fbe-9582-dfd368d5610a,fced16ae-abee-4fbe-9582-dfd368d5610a,1,0,afe60bad-1585-487f-9a39-9b9e031f9576,afe60bad-1585-487f-9a39-9b9e031f9576,1,0,4c4f0475-bd11-40c8-af0d-8affec6f838d,4c4f0475-bd11-40c8-af0d-8affec6f838d,1,0,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,1,0,855439d7-a621-48f5-b6d9-bc2bbd11ad90,855439d7-a621-48f5-b6d9-bc2bbd11ad90,1,0,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,1,0,2f25e742-555b-4db8-bff2-2d345ce2a93a,2f25e742-555b-4db8-bff2-2d345ce2a93a,1,0,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,1,0,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,1,0,a7fee9d3-569d-4b5b-bd47-44790e0095f5,a7fee9d3-569d-4b5b-bd47-44790e0095f5,1,0,a258fe12-7e55-4f89-86fa-962b1d2947ac,a258fe12-7e55-4f89-86fa-962b1d2947ac,1,0,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,1,0,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,1,0,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,1,0,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,1,0,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,1,0,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,1,0,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,1,0,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,1,0,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,1,0,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,1,0,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,1,0,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,1,0,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,1,0,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,1,0,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,1,0,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,1,0,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,1,0,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,1,0,cc8e3172-491d-45d8-a7eb-fc6c400845cb,cc8e3172-491d-45d8-a7eb-fc6c400845cb,1,0,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,1,0,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,1,0,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,1,0,51d83895-5692-4479-9612-07c790d19dff,51d83895-5692-4479-9612-07c790d19dff,1,0,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,1,0,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,1,0,d854b528-8456-4453-9c2d-4f96caf10481,d854b528-8456-4453-9c2d-4f96caf10481,1,0,245f870e-a53a-4d86-aa0a-c0c7709b8acb,245f870e-a53a-4d86-aa0a-c0c7709b8acb,1,0,476f6bfa-b10c-4e0f-8499-23c652715b3f,476f6bfa-b10c-4e0f-8499-23c652715b3f,1,0,65c9754b-53f6-4616-a9d4-74826f7b0ced,65c9754b-53f6-4616-a9d4-74826f7b0ced,1,0,eca2b076-d218-4d1c-948b-7894edf9fa49,eca2b076-d218-4d1c-948b-7894edf9fa49,1,0,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,1,0,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,1,0,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,1,0,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,1,0,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,1,0,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1,0,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,1,0,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,1,0,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,1,0,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,1,0,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,1,0,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,1,0,40a59681-f31d-4fb9-9301-67c1430590e0,40a59681-f31d-4fb9-9301-67c1430590e0,1,0,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,1,0,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,1,0,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,1,0,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,1,0,9c3bc502-bcb1-4c90-ae43-53c798958339,9c3bc502-bcb1-4c90-ae43-53c798958339,1,0,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,1,0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,1,0,5eb4ca7f-027a-4860-a167-e6b424527e7a,5eb4ca7f-027a-4860-a167-e6b424527e7a,1,0,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,1,0,6871015f-d959-4a77-a091-a23cb4ebd8f9,6871015f-d959-4a77-a091-a23cb4ebd8f9,1,0,e5e1631b-a494-4e73-b356-b4330b84cc88,e5e1631b-a494-4e73-b356-b4330b84cc88,1,0,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,1,0,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,1,0,80cf54ed-8677-4c89-a378-0abef6c64010,80cf54ed-8677-4c89-a378-0abef6c64010,1,0,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,1,0,56ee3afd-5ae6-421e-b9f3-26505e40f100,56ee3afd-5ae6-421e-b9f3-26505e40f100,1,0,63c9a839-78b2-4706-b380-5aedf6914930,63c9a839-78b2-4706-b380-5aedf6914930,1,0,40f5c1cb-2654-4738-bb44-6734b0e3490b,40f5c1cb-2654-4738-bb44-6734b0e3490b,1,0,2ec484b1-95eb-43a7-9430-1c1ef49f05af,2ec484b1-95eb-43a7-9430-1c1ef49f05af,1,0,1a314ce2-03bc-4267-89a9-bb5bb866f552,1a314ce2-03bc-4267-89a9-bb5bb866f552,1,0,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,1,0,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,1,0,e859dd18-8baf-49c0-b7a0-1205b6c125d3,e859dd18-8baf-49c0-b7a0-1205b6c125d3,1,0,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,1,0,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,1,0,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,1,0,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,1,0,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,1,0,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,1,0,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,1,0,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,1,0,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,1,0,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,1,0,fcb97a46-d5fd-4bb5-b899-17723a9fe346,fcb97a46-d5fd-4bb5-b899-17723a9fe346,1,0,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,1,0,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,1,0,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,1,0,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,1,0,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,1,0,85223d37-2503-4783-94dc-fe6265e718d5,85223d37-2503-4783-94dc-fe6265e718d5,1,0,0918cd76-56e5-4314-8a1c-c21d023ba6f8,0918cd76-56e5-4314-8a1c-c21d023ba6f8,1,0,9db21c2e-79fa-44e4-902e-416abfccb54a,9db21c2e-79fa-44e4-902e-416abfccb54a,1,0,fb082db3-197b-4d1e-b9ea-362624d547ee,fb082db3-197b-4d1e-b9ea-362624d547ee,1,0,c09dcf00-a45a-4487-99c5-d3a37956ec88,c09dcf00-a45a-4487-99c5-d3a37956ec88,1,0,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,1,0,2714e1b6-6b02-43a1-bc94-2934b429ed35,2714e1b6-6b02-43a1-bc94-2934b429ed35,1,0,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,1,0,4c7016da-9991-4917-8eaa-e760cc9e29d1,4c7016da-9991-4917-8eaa-e760cc9e29d1,1,0,febb3770-5c11-4ada-9e49-a27950bdaddf,febb3770-5c11-4ada-9e49-a27950bdaddf,1,0,d7b57669-e538-4e54-ab1b-8428f0586466,d7b57669-e538-4e54-ab1b-8428f0586466,1,0,9c484a15-039e-416d-af97-4c2bd90fd873,9c484a15-039e-416d-af97-4c2bd90fd873,1,0,534855e3-4cf2-471c-b982-7138917050c9,534855e3-4cf2-471c-b982-7138917050c9,1,0,4c72b944-d000-4920-aec8-54029f88ddf4,4c72b944-d000-4920-aec8-54029f88ddf4,1,0,b4033d05-05c2-4617-80d9-abfa389c47f4,b4033d05-05c2-4617-80d9-abfa389c47f4,1,0,aa29e1be-4e99-4136-8dc1-0124908979ad,aa29e1be-4e99-4136-8dc1-0124908979ad,1,0,0d76799d-7fc7-446b-88fb-dca839de00a5,0d76799d-7fc7-446b-88fb-dca839de00a5,1,0,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,1,0,ea4a869c-861c-412c-a3be-de1c57d1a251,ea4a869c-861c-412c-a3be-de1c57d1a251,1,0,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,1,0,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,1,0,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,1,0,50ac390d-324f-40bd-b3df-0468a63b94b6,50ac390d-324f-40bd-b3df-0468a63b94b6,1,0,80337710-2c60-45c4-ae1f-bb42731fb611,80337710-2c60-45c4-ae1f-bb42731fb611,1,0,9dcf467e-7701-4c7b-b747-95f4d9b9295c,9dcf467e-7701-4c7b-b747-95f4d9b9295c,1,0,dd07b255-25af-466e-a224-c561a8ca567b,dd07b255-25af-466e-a224-c561a8ca567b,1,0,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,1,0,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,1,0,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,1,0,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,1,0,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,1,0,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,1,0,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,1,0,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,1,0,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,1,0,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,1,0,f3d8590a-dcfa-4d41-8d03-642b99ffa040,f3d8590a-dcfa-4d41-8d03-642b99ffa040,1,0,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,1,0,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,1,0,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,1,0,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,1,0,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,1,0,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,1,0,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,1,0,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,1,0,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,1,0,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,1,0,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,1,0,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,1,0,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,1,0,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,1,0,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,1,0,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,1,0,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,1,0,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,1,0,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,1,0,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,1,0,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,1,0,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,1,0,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,1,0,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,1,0,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,1,0,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,1,0,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,1,0,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,1,0,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,1,0,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,1,0,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,1,0,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,1,0,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,1,0,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,1,0,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,1,0,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,1,0,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,1,0,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,1,0,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,1,0,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,1,0,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,1,0,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,1,0,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,1,0,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,1,0,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,1,0,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,1,0,150c9d05-4ccc-4cb7-879d-b1d9c3534343,150c9d05-4ccc-4cb7-879d-b1d9c3534343,1,0,65000437-bd07-4841-a458-679d44768c46,65000437-bd07-4841-a458-679d44768c46,1,0,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,1,0,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,1,0,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,1,0,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,1,0,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,1,0,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,1,0,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,1,0,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,1,0,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,1,0,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,1,0,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,1,0,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,1,0,612f3b95-d7db-4b33-92b5-4873205b424b,612f3b95-d7db-4b33-92b5-4873205b424b,1,0,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,1,0,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,1,0,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,1,0,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,1,0,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,1,0,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,1,0,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,1,0,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,1,0,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,1,0,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,1,0,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,1,0,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,1,0,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,1,0,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,1,0,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,1,0,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,1,0,616cd2cc-eaf4-4586-bca1-c044429b491a,616cd2cc-eaf4-4586-bca1-c044429b491a,1,0,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,1,0,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,1,0,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,1,0,81d900be-ddc1-417f-ae2c-1aacf040de9a,81d900be-ddc1-417f-ae2c-1aacf040de9a,1,0,c65f69ce-be78-4e8d-b91d-293c4108ce77,c65f69ce-be78-4e8d-b91d-293c4108ce77,1,0,521a5717-0b38-401d-bd72-30cee219bd14,521a5717-0b38-401d-bd72-30cee219bd14,1,0,977c30dc-6f27-4931-9fd5-d12ed147e3ec,977c30dc-6f27-4931-9fd5-d12ed147e3ec,1,0,eea4f72e-dd1b-46c7-b270-876a482236b3,eea4f72e-dd1b-46c7-b270-876a482236b3,1,0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,1,0,2d249dad-8b4f-462b-ab13-892639a6e071,2d249dad-8b4f-462b-ab13-892639a6e071,1,0,f6249bf4-d2e7-48f3-808f-d776915d14cb,f6249bf4-d2e7-48f3-808f-d776915d14cb,1,0,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,1,0,883cdeb0-e747-4157-bbe7-0ebc423a82af,883cdeb0-e747-4157-bbe7-0ebc423a82af,1,0,ba62ac73-91da-4dad-abc7-3cf8acf7e315,ba62ac73-91da-4dad-abc7-3cf8acf7e315,1,0,6a71416d-dba1-4883-9264-597ecf9d6270,6a71416d-dba1-4883-9264-597ecf9d6270,1,0,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,1,0,6593baab-fce0-49ed-867e-be242bfc08d7,6593baab-fce0-49ed-867e-be242bfc08d7,1,0,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,1,0,57aed64d-da61-4c18-af21-dab3afdc5c03,57aed64d-da61-4c18-af21-dab3afdc5c03,1,0,452822b4-a590-44db-ab77-d8c01f7300e7,452822b4-a590-44db-ab77-d8c01f7300e7,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,19b29d30-e395-42f2-b700-7474bb2cdcb7,19b29d30-e395-42f2-b700-7474bb2cdcb7,1,0,b0deb957-624b-4bcb-824c-76aedf1affe9,b0deb957-624b-4bcb-824c-76aedf1affe9,1,0,9934e608-593d-45d0-9df3-539f0c8fc385,9934e608-593d-45d0-9df3-539f0c8fc385,1,0,80da4126-4319-425f-8427-7d60652cf754,80da4126-4319-425f-8427-7d60652cf754,1,0,05236ace-bcdd-4eb8-a1fb-5843ee311d10,05236ace-bcdd-4eb8-a1fb-5843ee311d10,1,0,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,1,0,449060fd-4711-4b9e-93e0-11b35c314fb3,449060fd-4711-4b9e-93e0-11b35c314fb3,1,0,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,1,0,0614d340-6524-4715-978d-87ab21377e72,0614d340-6524-4715-978d-87ab21377e72,1,0,d47daac5-ec3b-4d4e-8b01-045a37f7074d,d47daac5-ec3b-4d4e-8b01-045a37f7074d,1,0,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,1,0,912cbd30-1ed5-4888-a4b6-98e9215b28e9,912cbd30-1ed5-4888-a4b6-98e9215b28e9,1,0,abf093ce-be63-487d-8be4-be282aa475be,abf093ce-be63-487d-8be4-be282aa475be,1,0,7a910ad6-b922-4716-8140-1540d76296b2,7a910ad6-b922-4716-8140-1540d76296b2,1,0,a52450c7-af49-4f92-862f-47015826b447,a52450c7-af49-4f92-862f-47015826b447,1,0,2a19f8a7-4f9f-4e47-a8f4-271a6a13ddc0,2a19f8a7-4f9f-4e47-a8f4-271a6a13ddc0,1,0,3efa225a-db76-479a-b2fa-a40fd0ffb720,3efa225a-db76-479a-b2fa-a40fd0ffb720,1,0,807dd284-31cc-4725-8463-26b31a75d6bc,807dd284-31cc-4725-8463-26b31a75d6bc,1,0,00b7d44c-3f8a-4120-91f3-a63f073d8b37,00b7d44c-3f8a-4120-91f3-a63f073d8b37,1,0,d64f073e-4b58-4020-9233-ca8fbdcf85b2,d64f073e-4b58-4020-9233-ca8fbdcf85b2,1,0,5189beb9-b939-4f97-aca0-c2f3492ac8b9,5189beb9-b939-4f97-aca0-c2f3492ac8b9,1,0,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,1,0,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,1,0,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,1,0,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,1,0,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,1,0,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,1,0,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,1,0,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,1,0,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,1,0,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,1,0,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,1,0,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,1,0,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,1,0,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,1,0,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,1,0,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,1,0,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,1,0,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,1,0,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,1,0,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,1,0,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,1,0,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,1,0,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,1,0,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,1,0,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,1,0,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,1,0,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,1,0,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,1,0,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,1,0,8ce759ff-f579-461c-bb1e-9ac2b01e88df,8ce759ff-f579-461c-bb1e-9ac2b01e88df,1,0,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,1,0,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,1,0,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,1,0,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,1,0,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1,0,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,1,0,81db41a6-2580-4a69-b1fd-57cfd48a7efa,81db41a6-2580-4a69-b1fd-57cfd48a7efa,1,0,0db8b3b2-bf24-4006-9897-797084c241ef,0db8b3b2-bf24-4006-9897-797084c241ef,1,0,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,1,0,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,1,0,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,1,0,20091427-d173-40ca-b2c4-53ee99b0b5ae,20091427-d173-40ca-b2c4-53ee99b0b5ae,1,0,14cbde39-a39a-48e5-9b72-b798a0bcea3f,14cbde39-a39a-48e5-9b72-b798a0bcea3f,1,0,56871c10-e3af-4679-afad-3baa910d73bb,56871c10-e3af-4679-afad-3baa910d73bb,1,0,f81b51c5-57e4-41f8-9ad5-3d2717351b95,f81b51c5-57e4-41f8-9ad5-3d2717351b95,1,0,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,1,0,de0a39e0-d37d-47c6-a019-e44836edc8d1,de0a39e0-d37d-47c6-a019-e44836edc8d1,1,0,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1,0,71d544bf-15c1-4581-8baa-ac126308425c,71d544bf-15c1-4581-8baa-ac126308425c,1,0,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1,0,7acfe30e-73cb-465a-88f2-92b7275dc49b,7acfe30e-73cb-465a-88f2-92b7275dc49b,1,0,8e387dac-5029-49da-a013-355df0a51a44,8e387dac-5029-49da-a013-355df0a51a44,1,0,13859664-8307-40e8-855b-557b9cf2f1ec,13859664-8307-40e8-855b-557b9cf2f1ec,1,0,e4397fba-507f-497c-9414-7d08ccd4d799,e4397fba-507f-497c-9414-7d08ccd4d799,1,0,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,1,0,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,1,0,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1,0,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,1,0,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,1,0,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,1,0,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,1,0,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,1,0,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,1,0,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,1,0,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,1,0,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,1,0,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,1,0,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,1,0,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,1,0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,1,0,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,1,0,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,1,0,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,1,0,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,1,0,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,1,0,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,1,0,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,1,0,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,1,0,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,1,0,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,1,0,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,1,0,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,1,0,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,1,0,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,1,0,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,1,0,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,1,0,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,1,0,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,1,0,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,1,0,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,1,0,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,1,0,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,1,0,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,1,0,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,1,0,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,1,0,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,1,0,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,1,0,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,1,0,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,1,0,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,1,0,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,1,0,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,1,0,aa63c001-c3da-4179-8fd8-fe2ff510511e,aa63c001-c3da-4179-8fd8-fe2ff510511e,1,0,b2e894b0-6443-4a52-95b6-6b564f809680,b2e894b0-6443-4a52-95b6-6b564f809680,1,0,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,1,0,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,1,0,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,1,0,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,1,0,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,1,0,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,1,0,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,1,0,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,1,0,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,1,0,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,1,0,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,1,0,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,1,0,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,1,0,8a8848b8-345a-452d-bf95-28f9c91c7e95,8a8848b8-345a-452d-bf95-28f9c91c7e95,1,0,a9441693-87ca-4157-98e1-63375852755c,a9441693-87ca-4157-98e1-63375852755c,1,0,6303ea55-e8ed-4acc-9717-941eefafc2a9,6303ea55-e8ed-4acc-9717-941eefafc2a9,1,0,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,1,0,d0b17206-3949-4513-a47f-02e1a8ba369a,d0b17206-3949-4513-a47f-02e1a8ba369a,1,0,cb4f20d4-13e6-4c27-b491-da7931f4bf05,cb4f20d4-13e6-4c27-b491-da7931f4bf05,1,0,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,1,0,40b08a20-51a3-438b-ba54-466917ea809f,40b08a20-51a3-438b-ba54-466917ea809f,1,0,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,1,0,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,1,0,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,1,0,af22406b-daac-475d-b6a9-577452502b84,af22406b-daac-475d-b6a9-577452502b84,1,0,7a925960-a579-4b06-90e0-5121dc774024,7a925960-a579-4b06-90e0-5121dc774024,1,0,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,1,0,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,1,0,2abbd53a-0ead-42af-8df6-fde663aea300,2abbd53a-0ead-42af-8df6-fde663aea300,1,0,24611bf9-5492-443a-935c-a0058e86493f,24611bf9-5492-443a-935c-a0058e86493f,1,0,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,1,0,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,1,0,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,1,0,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,1,0,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,1,0,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,1,0,f7e73257-fae1-465a-ae74-faaa0273a416,f7e73257-fae1-465a-ae74-faaa0273a416,1,0,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,1,0,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,1,0,ff18803b-4c3a-4720-a718-7547f04c6e2f,ff18803b-4c3a-4720-a718-7547f04c6e2f,1,0,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0e0670d6-d8f7-4728-bd1b-f016fffa0570,1,0,13beb01d-dd08-4a6d-863b-651e70bbf51f,13beb01d-dd08-4a6d-863b-651e70bbf51f,1,0,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,1,0,57a0f5f3-6573-4b35-af25-cea3a25641f1,57a0f5f3-6573-4b35-af25-cea3a25641f1,1,0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,1,0,144d5498-bb61-4bec-bef3-85a5a4aec3d5,144d5498-bb61-4bec-bef3-85a5a4aec3d5,1,0,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,1,0,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,1,0,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,1,0,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,1,0,56b570b1-93b0-468a-9672-9c71113753f3,56b570b1-93b0-468a-9672-9c71113753f3,1,0,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,1,0,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,1,0,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,1,0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,1,0,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,1,0,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,1,0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,1,0,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,1,0,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,1,0,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,1,0,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,1,0,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,1,0,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,1,0,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,1,0,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1,0,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,1,0,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,1,0,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,1,0,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,1,0,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,1,0,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,1,0,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,1,0,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,1,0,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,1,0,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,1,0,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,1,0,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,1,0,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,1,0,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,1,0,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,1,0,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,1,0,8f088f33-92d7-4e35-915d-6cda1129dd80,8f088f33-92d7-4e35-915d-6cda1129dd80,1,0,9a8578a2-8a92-4ab3-a480-173340f8b34a,9a8578a2-8a92-4ab3-a480-173340f8b34a,1,0,4889d27b-435b-4059-a34d-6afdf3c77fa3,4889d27b-435b-4059-a34d-6afdf3c77fa3,1,0,4ebf0988-ccc3-440c-bd0f-2d01636bd730,4ebf0988-ccc3-440c-bd0f-2d01636bd730,1,0,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,1,0,4b54d626-dc59-4e49-a708-0a7f98833b9a,4b54d626-dc59-4e49-a708-0a7f98833b9a,1,0,1c90a423-ef1b-42dc-a43b-1fda89672481,1c90a423-ef1b-42dc-a43b-1fda89672481,1,0,095cf2d6-5a7c-452d-8d60-991afb6e52bd,095cf2d6-5a7c-452d-8d60-991afb6e52bd,1,0,f9213a70-bfd6-464f-b28b-ed35bdf351c0,f9213a70-bfd6-464f-b28b-ed35bdf351c0,1,0,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,1,0,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,1,0,eb81610a-eb2f-4068-ba74-75e0f5bbace8,eb81610a-eb2f-4068-ba74-75e0f5bbace8,1,0,21826316-0b49-4034-a49e-6d34c15ceb5c,21826316-0b49-4034-a49e-6d34c15ceb5c,1,0,3abffa47-8d47-4173-897b-708e1a06ef39,3abffa47-8d47-4173-897b-708e1a06ef39,1,0,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,1,0,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,1,0,38692186-a62a-42d1-87cd-7dbc6d4816ed,38692186-a62a-42d1-87cd-7dbc6d4816ed,1,0,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,1,0,3a28cea9-7fd7-4834-ab89-2a74331a64e3,3a28cea9-7fd7-4834-ab89-2a74331a64e3,1,0,0f881709-4520-4f18-af9d-cf08757693ff,0f881709-4520-4f18-af9d-cf08757693ff,1,0,c5151ca9-5103-42b2-8573-273c15416db8,c5151ca9-5103-42b2-8573-273c15416db8,1,0,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,1,0,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,1,0,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,1,0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,1,0,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,1,0,c13fb1cd-fe72-48a6-b383-55b6323619ce,c13fb1cd-fe72-48a6-b383-55b6323619ce,1,0,956fc8ee-96be-4309-b1e8-209372f151ab,956fc8ee-96be-4309-b1e8-209372f151ab,1,0,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,1,0,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,1,0,12f85e09-1190-4483-b531-630ab718db7f,12f85e09-1190-4483-b531-630ab718db7f,1,0,52f4453e-e968-4290-a79a-470f68fbd07f,52f4453e-e968-4290-a79a-470f68fbd07f,1,0,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,1,0,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,1,0,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,1,0,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,1,0,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,1,0,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,1,0,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,1,0,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,1,0,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,1,0,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,1,0,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,1,0,733d4494-01e2-46f5-a49b-f289267a90c9,733d4494-01e2-46f5-a49b-f289267a90c9,1,0,5422610d-b92c-4213-a58c-8db067d93b66,5422610d-b92c-4213-a58c-8db067d93b66,1,0,8f59a635-9e0e-470d-8fda-a47a262a59c2,8f59a635-9e0e-470d-8fda-a47a262a59c2,1,0,ffb50eb9-149a-46ec-9472-d8f20ad09810,ffb50eb9-149a-46ec-9472-d8f20ad09810,1,0,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,1,0,7a6449e2-e90a-4720-a769-192284ef69c1,7a6449e2-e90a-4720-a769-192284ef69c1,1,0,02118b98-2349-46b1-a328-d6e2b5781f7e,02118b98-2349-46b1-a328-d6e2b5781f7e,1,0,67de9cbb-5c80-4cff-bfbe-269a958e08e6,67de9cbb-5c80-4cff-bfbe-269a958e08e6,1,0,2228a457-6805-41ee-85af-5ebca9568bf4,2228a457-6805-41ee-85af-5ebca9568bf4,1,0,96b71795-e230-4ecb-b98d-4feb3f8b9662,96b71795-e230-4ecb-b98d-4feb3f8b9662,1,0,1e14d062-1d5a-4939-8ce6-4d9514990376,1e14d062-1d5a-4939-8ce6-4d9514990376,1,0,f86f24d2-9a83-47ae-9d95-b49a0a295770,f86f24d2-9a83-47ae-9d95-b49a0a295770,1,0,37986729-a275-4e86-8613-faee9a4f2525,37986729-a275-4e86-8613-faee9a4f2525,1,0,5814cb3a-8f7c-45b4-a590-b69d4912120f,5814cb3a-8f7c-45b4-a590-b69d4912120f,1,0,f06c8396-65ec-4ece-aed0-d45b2d8969b5,f06c8396-65ec-4ece-aed0-d45b2d8969b5,1,0,1faeab7f-7bd7-496d-8882-4aab6c425854,1faeab7f-7bd7-496d-8882-4aab6c425854,1,0,af922fb8-a99c-4154-89fe-d30a4d13024a,af922fb8-a99c-4154-89fe-d30a4d13024a,1,0,24c2f463-2bbb-471f-a409-507afad52caf,24c2f463-2bbb-471f-a409-507afad52caf,1,0,cbb07013-9ae1-43ec-8142-a724d788cb67,cbb07013-9ae1-43ec-8142-a724d788cb67,1,0,2403ac84-b513-4aa0-9a68-8d1ad705ce24,2403ac84-b513-4aa0-9a68-8d1ad705ce24,1,0,952b49e0-e1a1-4130-8fb2-083e3988255c,952b49e0-e1a1-4130-8fb2-083e3988255c,1,0,367b227f-f66e-4cec-9fc3-850bca8bc6c8,367b227f-f66e-4cec-9fc3-850bca8bc6c8,1,0,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1,0,7fcb9d79-1144-4099-8d7f-309d3bf045a5,7fcb9d79-1144-4099-8d7f-309d3bf045a5,1,0,db418313-8583-48a9-9fec-e2c5de4fdf76,db418313-8583-48a9-9fec-e2c5de4fdf76,1,0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,1,0,65a50026-88e7-45dd-bb0c-f212218ca093,65a50026-88e7-45dd-bb0c-f212218ca093,1,0,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,1,0,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1,0,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,1,0,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,1,0,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,1,0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,1,0,01a1fd57-6c09-4a5b-9f75-da4366159423,01a1fd57-6c09-4a5b-9f75-da4366159423,1,0,71d79b25-3682-4f2c-b6b2-a307e3e72844,71d79b25-3682-4f2c-b6b2-a307e3e72844,1,0,45c1ed0d-202e-4289-820f-e1de0f544386,45c1ed0d-202e-4289-820f-e1de0f544386,1,0,e889e80f-97c9-43c6-8268-d652764fcafb,e889e80f-97c9-43c6-8268-d652764fcafb,1,0,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,1,0,95ccaaf2-f6ca-4540-8a39-3c90121c4236,95ccaaf2-f6ca-4540-8a39-3c90121c4236,1,0,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,1,0,f47a9bec-2a9f-4955-a432-acb63a5b0e46,f47a9bec-2a9f-4955-a432-acb63a5b0e46,1,0,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1,0,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,1,0,b787818e-5572-4ef2-ba54-1e9b69569824,b787818e-5572-4ef2-ba54-1e9b69569824,1,0,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,1,0,231d7b21-c00c-4782-b610-d56593be436f,231d7b21-c00c-4782-b610-d56593be436f,1,0,79250d1a-77ff-4015-a5b5-83460b1611e2,79250d1a-77ff-4015-a5b5-83460b1611e2,1,0,60018ee0-71ec-4975-a95d-f6f188748ff2,60018ee0-71ec-4975-a95d-f6f188748ff2,1,0,68d35468-279a-43ef-9d71-fed44a792177,68d35468-279a-43ef-9d71-fed44a792177,1,0,77bec3d8-582a-4156-861b-4902008f014c,77bec3d8-582a-4156-861b-4902008f014c,1,0,bf3304c0-5078-478f-bbf8-6178264c5f26,bf3304c0-5078-478f-bbf8-6178264c5f26,1,0,2ad1caba-7a89-4389-934f-419970260961,2ad1caba-7a89-4389-934f-419970260961,1,0,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,1,0,f88c4a72-368c-4f45-bb2c-d18f214a5079,f88c4a72-368c-4f45-bb2c-d18f214a5079,1,0,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,1,0,9dc2e313-c086-4fd9-83e8-911859ef480d,9dc2e313-c086-4fd9-83e8-911859ef480d,1,0,8a14ced0-9e45-4b3a-a135-11413c3a33c2,8a14ced0-9e45-4b3a-a135-11413c3a33c2,1,0,af7377db-0b27-42f7-a639-e2feb4015412,af7377db-0b27-42f7-a639-e2feb4015412,1,0,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,1,0,ab7db146-f26a-418a-8c45-e2513bf84e08,ab7db146-f26a-418a-8c45-e2513bf84e08,1,0,ece3bd8d-6616-44d5-9c14-6b3557738872,ece3bd8d-6616-44d5-9c14-6b3557738872,1,0,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,1,0,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,1,0,4893ad50-df19-4d86-9469-40491ba733c9,4893ad50-df19-4d86-9469-40491ba733c9,1,0,25a65c1e-8e67-4135-843d-1e0da72dfd64,25a65c1e-8e67-4135-843d-1e0da72dfd64,1,0,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,1,0,29a6416e-b0f5-4111-8f86-1ba80244e73a,29a6416e-b0f5-4111-8f86-1ba80244e73a,1,0,0f49085a-9b83-4256-be60-f341b2ef132e,0f49085a-9b83-4256-be60-f341b2ef132e,1,0,f44c66d6-cfe2-482f-a921-de3db3cd09ea,f44c66d6-cfe2-482f-a921-de3db3cd09ea,1,0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,1,0,c521bd61-386e-41c8-bcc3-29d54b63cc32,c521bd61-386e-41c8-bcc3-29d54b63cc32,1,0,d46e3424-6d30-4229-9a56-ab256517534a,d46e3424-6d30-4229-9a56-ab256517534a,1,0,09d3633d-8e8c-47f3-8f34-d70eb94577e1,09d3633d-8e8c-47f3-8f34-d70eb94577e1,1,0,fe868143-363b-4da1-889b-98d4dd10a1fd,fe868143-363b-4da1-889b-98d4dd10a1fd,1,0,b791a549-ae94-46f2-8f04-771fdeb4cc54,b791a549-ae94-46f2-8f04-771fdeb4cc54,1,0,4681cb63-c581-4c08-b18c-016d9b478ef2,4681cb63-c581-4c08-b18c-016d9b478ef2,1,0,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,1,0,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,1,0,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,1,0,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,1,0,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,1,0,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,1,0,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,1,0,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,1,0,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,1,0,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,1,0,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,1,0,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,1,0,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,1,0,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,1,0,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,1,0,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,1,0,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,1,0,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,1,0,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,1,0,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,1,0,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,1,0,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,1,0,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,1,0,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,1,0,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,1,0,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,1,0,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,1,0,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,1,0,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,1,0,39bddcde-697c-4e77-adfd-e4a77529ea97,39bddcde-697c-4e77-adfd-e4a77529ea97,1,0,a3b15381-bf9b-4b26-96eb-392fa2cc8223,a3b15381-bf9b-4b26-96eb-392fa2cc8223,1,0,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,1,0,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,1,0,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,1,0,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,1,0,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,1,0,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,1,0,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,1,0,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,1,0,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,1,0,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,1,0,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,1,0,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,1,0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,1,0,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,1,0,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,1,0,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,1,0,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,1,0,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,1,0,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,1,0,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,1,0,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,1,0,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,1,0,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,1,0,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,1,0,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,1,0,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,1,0,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,1,0,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,1,0,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,1,0,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,1,0,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,1,0,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,1,0,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,1,0,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,1,0,b363f72f-3629-453c-9f7d-9828ef6de733,b363f72f-3629-453c-9f7d-9828ef6de733,1,0,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,1,0,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,1,0,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,1,0,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,1,0,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,1,0,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,1,0,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,1,0,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,1,0,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,1,0,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,1,0,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,1,0,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,1,0,dd0610c8-cd87-4fe2-8a1f-70157132785b,dd0610c8-cd87-4fe2-8a1f-70157132785b,1,0,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,1,0,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,1,0,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,1,0,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,1,0,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,1,0,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,1,0,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,1,0,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,1,0,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,1,0,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,1,0,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,1,0,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,1,0,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,1,0,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,1,0,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,1,0,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,1,0,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,1,0,c656771c-dcb7-4c78-9a16-e62806d5bb5a,c656771c-dcb7-4c78-9a16-e62806d5bb5a,1,0,ec42c45c-18ca-44b0-9c59-1cb204552a43,ec42c45c-18ca-44b0-9c59-1cb204552a43,1,0,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,1,0,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,1,0,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,1,0,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,1,0,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,1,0,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,1,0,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,1,0,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,1,0,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,1,0,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,1,0,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,1,0,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,1,0,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,1,0,50515bbc-43ee-4b00-bfc5-105b7981bd8f,50515bbc-43ee-4b00-bfc5-105b7981bd8f,1,0,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,1,0,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,1,0,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,1,0,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,1,0,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,1,0,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,1,0,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,1,0,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,1,0,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,1,0,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,1,0,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,1,0,699f734b-43d2-4351-bff8-e0e21e164a42,699f734b-43d2-4351-bff8-e0e21e164a42,1,0,95f0792a-7ac4-450a-b05c-219741e61abd,95f0792a-7ac4-450a-b05c-219741e61abd,1,0,742a2e8c-496e-4e02-931d-d33f7afe07a5,742a2e8c-496e-4e02-931d-d33f7afe07a5,1,0,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,1,0,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,1,0,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,1,0,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,1,0,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,1,0,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,1,0,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,1,0,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,1,0,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,1,0,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,1,0,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,1,0,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,1,0,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,1,0,6564ce89-134f-4726-8693-fd93aad46180,6564ce89-134f-4726-8693-fd93aad46180,1,0,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,1,0,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,1,0,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,1,0,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,1,0,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,1,0,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,1,0,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,1,0,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,1,0,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,1,0,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,1,0,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,1,0,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,1,0,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,1,0,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,1,0,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,1,0,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,1,0,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,1,0,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,1,0,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,1,0,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,1,0,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,1,0,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,1,0,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,1,0,d754ed75-2a32-4b86-a153-7b50c39f9836,d754ed75-2a32-4b86-a153-7b50c39f9836,1,0,b81f3ee1-66f7-4626-a35b-ef85388c678e,b81f3ee1-66f7-4626-a35b-ef85388c678e,1,0,2ad04793-c162-4915-a260-ca4da535cdac,2ad04793-c162-4915-a260-ca4da535cdac,1,0,6568d853-dfe5-4064-aa73-c1f546e951b4,6568d853-dfe5-4064-aa73-c1f546e951b4,1,0,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,1,0,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,1,0,bbe718b2-6b4c-4d78-a408-5369d356a1e6,bbe718b2-6b4c-4d78-a408-5369d356a1e6,1,0,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,1,0,eb7623df-b4e3-4272-9f92-42a9214f9f17,eb7623df-b4e3-4272-9f92-42a9214f9f17,1,0,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,1,0,b08fd921-c3d6-44eb-9401-fec5acab5d22,b08fd921-c3d6-44eb-9401-fec5acab5d22,1,0,1611855a-abf4-4269-aed3-3f78dce7bea5,1611855a-abf4-4269-aed3-3f78dce7bea5,1,0,c5bd277c-b258-43af-9c80-3e328b1581f5,c5bd277c-b258-43af-9c80-3e328b1581f5,1,0,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,1,0,f9cefef4-2182-42ca-93ef-b6a51d6555cc,f9cefef4-2182-42ca-93ef-b6a51d6555cc,1,0,71e1c7de-7367-424c-ae07-6ec04b408b83,71e1c7de-7367-424c-ae07-6ec04b408b83,1,0,b3956392-199c-4934-80d1-8cdab453d879,b3956392-199c-4934-80d1-8cdab453d879,1,0,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,1,0,d1bd7448-aa5f-43fc-9735-224f36960c3e,d1bd7448-aa5f-43fc-9735-224f36960c3e,1,0,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,1,0,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,1,0,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1,0,8227471b-8ffb-4ba7-b4da-b21570582876,8227471b-8ffb-4ba7-b4da-b21570582876,1,0,25864028-1a53-4a8d-b6e4-189fa62c62f5,25864028-1a53-4a8d-b6e4-189fa62c62f5,1,0,e923beae-0bd8-4119-a802-fd6bfb729f10,e923beae-0bd8-4119-a802-fd6bfb729f10,1,0,d40bb9f7-3397-40ad-b658-f8942bdbbaee,d40bb9f7-3397-40ad-b658-f8942bdbbaee,1,0,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,1,0,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,1,0,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,1,0,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,1,0,cfa55ab3-1335-4712-8352-03c2f0277708,cfa55ab3-1335-4712-8352-03c2f0277708,1,0,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,1,0,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,1,0,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,1,0,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,1,0,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,1,0,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,1,0,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,1,0,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,1,0,5d45a926-513f-4bbc-a002-54a2db94b297,5d45a926-513f-4bbc-a002-54a2db94b297,1,0,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,1,0,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,1,0,61dc318a-c17d-402e-bf64-a0c0a63a1c93,61dc318a-c17d-402e-bf64-a0c0a63a1c93,1,0,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,1,0,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,1,0,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,1,0,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,1,0,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,1,0,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,1,0,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,1,0,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,1,0,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,1,0,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,1,0,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,1,0,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,1,0,9db23e96-d13a-4847-941a-462f64d0619d,9db23e96-d13a-4847-941a-462f64d0619d,1,0,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,1,0,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1,0,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,1,0,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,1,0,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,1,0,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,1,0,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,1,0,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,1,0,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,1,0,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,1,0,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,1,0,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,1,0,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,1,0,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,1,0,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,1,0,fa9572ee-0303-4421-9125-70cf3dd5a8c7,fa9572ee-0303-4421-9125-70cf3dd5a8c7,1,0,4cdd7920-0c49-4950-b92f-fdf6e34578b2,4cdd7920-0c49-4950-b92f-fdf6e34578b2,1,0,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,1,0,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,1,0,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,1,0,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,1,0,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,1,0,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,1,0,6852c584-d989-418d-8d18-255492891ef0,6852c584-d989-418d-8d18-255492891ef0,1,0,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,1,0,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,1,0,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,1,0,ff830967-faa9-415f-aa6e-8d27779f91f8,ff830967-faa9-415f-aa6e-8d27779f91f8,1,0,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,1,0,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,1,0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,1,0,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,1,0,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,1,0,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,1,0,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,1,0,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,1,0,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,1,0,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,1,0,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,1,0,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,1,0,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,1,0,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,1,0,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,1,0,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,1,0,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,1,0,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,1,0,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,1,0,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,1,0,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,1,0,d97c6204-3656-4591-aea9-6ebedffe1247,d97c6204-3656-4591-aea9-6ebedffe1247,1,0,7caabe33-184f-45db-bef4-59d4e9cd2394,7caabe33-184f-45db-bef4-59d4e9cd2394,1,0,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,1,0,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1,0,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,1,0,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,1,0,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,1,0,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,1,0,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1,0,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,1,0,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,1,0,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,1,0,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,1,0,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,1,0,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,1,0,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,1,0,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,1,0,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,1,0,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,1,0,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,1,0,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,1,0,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,1,0,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,1,0,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,1,0,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,1,0,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,1,0,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,1,0,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,1,0,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,1,0,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,1,0,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,1,0,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,1,0,abf8a23d-45c3-4feb-8df2-279b709d7722,abf8a23d-45c3-4feb-8df2-279b709d7722,1,0,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,1,0,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,1,0,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,1,0,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,1,0,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,1,0,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,1,0,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,1,0,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,1,0,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,1,0,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,1,0,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,1,0,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,1,0,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,1,0,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,1,0,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,1,0,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,1,0,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,1,0,8525d945-08aa-4928-8dca-4e172ea94328,8525d945-08aa-4928-8dca-4e172ea94328,1,0,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,1,0,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,1,0,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,1,0,82be906c-bb06-40ea-b908-54574b0b4848,82be906c-bb06-40ea-b908-54574b0b4848,1,0,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,1,0,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,1,0,03f32b08-1b71-47cb-ba1d-965037df4d64,03f32b08-1b71-47cb-ba1d-965037df4d64,1,0,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,1,0,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,1,0,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,1,0,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,1,0,05558ce4-8568-4009-b1d7-307d54967515,05558ce4-8568-4009-b1d7-307d54967515,1,0,74380324-9b7b-49f6-9458-88deb9405f98,74380324-9b7b-49f6-9458-88deb9405f98,1,0,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,1,0,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,1,0,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,1,0,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,1,0,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,1,0,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,1,0,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,1,0,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,1,0,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,1,0,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,1,0,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,1,0,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,1,0,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,1,0,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,1,0,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,1,0,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,1,0,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,1,0,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,1,0,b885dbb2-6e18-46a6-929c-3d6d392343ad,b885dbb2-6e18-46a6-929c-3d6d392343ad,1,0,d31e24cf-7493-45dc-ba81-3a00618e53bc,d31e24cf-7493-45dc-ba81-3a00618e53bc,1,0,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1,0,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,1,0,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,1,0,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,1,0,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,1,0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,1,0,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,1,0,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,1,0,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,1,0,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,1,0,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,1,0,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,1,0,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,1,0,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,1,0,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,1,0,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,1,0,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,1,0,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,1,0,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,1,0,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,1,0,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,1,0,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,1,0,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,1,0,e9ab9d00-6e42-439b-8efc-fcacf727016d,e9ab9d00-6e42-439b-8efc-fcacf727016d,1,0,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,1,0,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,1,0,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,1,0,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,1,0,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,1,0,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,1,0,f9229c3e-4a47-49a4-8b14-908218012ff7,f9229c3e-4a47-49a4-8b14-908218012ff7,1,0,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,1,0,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,1,0,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,1,0,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,1,0,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,1,0,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,1,0,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,1,0,6ffd2da8-db97-46fc-9a53-8e665a598e3c,6ffd2da8-db97-46fc-9a53-8e665a598e3c,1,0,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,1,0,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,1,0,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,1,0,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,1,0,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,1,0,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,1,0,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,1,0,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,1,0,2b2bf0f7-0946-4492-bba0-27f007a70e64,2b2bf0f7-0946-4492-bba0-27f007a70e64,1,0,22c9a703-5ed3-4156-8fa6-476b1c1452f1,22c9a703-5ed3-4156-8fa6-476b1c1452f1,1,0,8be10d88-8c37-4444-9c89-6cbbe9913bda,8be10d88-8c37-4444-9c89-6cbbe9913bda,1,0,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,1,0,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,1,0,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,1,0,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,1,0,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,1,0,cb1d4a41-20a9-4d76-8798-d47d8858bff1,cb1d4a41-20a9-4d76-8798-d47d8858bff1,1,0,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,1,0,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,1,0,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,1,0,b4c026eb-4271-4366-b529-1cdfe2874563,b4c026eb-4271-4366-b529-1cdfe2874563,1,0,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,1,0,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,1,0,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,1,0,5198c6db-2100-4902-82c8-85c8ea555e78,5198c6db-2100-4902-82c8-85c8ea555e78,1,0,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,1,0,f0b1e9f4-2e07-44e6-88d2-c11457135781,f0b1e9f4-2e07-44e6-88d2-c11457135781,1,0,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,1,0,f935399f-3554-4c08-b0a6-eba13074e1b7,f935399f-3554-4c08-b0a6-eba13074e1b7,1,0,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,1,0,765f9584-fefa-4695-b130-dd54c3b0d79d,765f9584-fefa-4695-b130-dd54c3b0d79d,1,0,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,1,0,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,1,0,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,1,0,2c1c9284-ba8b-4282-a89c-429f02ea41f6,2c1c9284-ba8b-4282-a89c-429f02ea41f6,1,0,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1,0,fd7e5257-024c-46de-9ff3-edd302fadba5,fd7e5257-024c-46de-9ff3-edd302fadba5,1,0,a4168057-d99f-4b55-b762-214f95ae3a30,a4168057-d99f-4b55-b762-214f95ae3a30,1,0,ab4fe549-1c07-42d9-b412-8b89ed115591,ab4fe549-1c07-42d9-b412-8b89ed115591,1,0,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,1,0,b49c589d-b45d-4aff-8899-72cfe433e9a6,b49c589d-b45d-4aff-8899-72cfe433e9a6,1,0,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,1,0,273ad3f7-c645-434d-93b0-e832134f3043,273ad3f7-c645-434d-93b0-e832134f3043,1,0,d320803b-1de4-4e66-b455-0afe39be5c41,d320803b-1de4-4e66-b455-0afe39be5c41,1,0,483dfce4-9c66-4739-94d4-17a005d64f5b,483dfce4-9c66-4739-94d4-17a005d64f5b,1,0,19506116-43ef-433c-822c-ef8717b0da6b,19506116-43ef-433c-822c-ef8717b0da6b,1,0,464b92cc-b577-4350-ae9f-e697390248d7,464b92cc-b577-4350-ae9f-e697390248d7,1,0,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,1,0,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,1,0,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,1,0,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,1,0,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,1,0,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,1,0,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,1,0,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,1,0,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,1,0,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,1,0,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,1,0,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,1,0,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,1,0,86249619-8981-4fc4-85fc-ce30e4b9d542,86249619-8981-4fc4-85fc-ce30e4b9d542,1,0,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,1,0,8be35c43-32e6-418d-b3d6-e53ef56babb7,8be35c43-32e6-418d-b3d6-e53ef56babb7,1,0,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,1,0,935d01e1-232b-480e-a6bf-c21c617c6348,935d01e1-232b-480e-a6bf-c21c617c6348,1,0,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,1,0,05c702a1-2c74-45d5-b2ee-fdd795b0945a,05c702a1-2c74-45d5-b2ee-fdd795b0945a,1,0,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,1,0,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,1,0,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,1,0,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,1,0,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,1,0,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,1,0,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,1,0,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,1,0,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,1,0,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,1,0,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,1,0,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,1,0,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,1,0,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,1,0,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,1,0,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,1,0,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,1,0,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,1,0,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,1,0,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,1,0,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,1,0,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,1,0,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,1,0,a89ee622-6942-411a-8566-f03d139c9e5b,a89ee622-6942-411a-8566-f03d139c9e5b,1,0,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,1,0,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,1,0,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,1,0,198ea989-5001-47ac-86b8-aa2585a5f7d7,198ea989-5001-47ac-86b8-aa2585a5f7d7,1,0,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,1,0,fb84c5f7-11da-4b17-979e-41e27a74e789,fb84c5f7-11da-4b17-979e-41e27a74e789,1,0,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,1,0,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,1,0,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,1,0,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,1,0,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,1,0,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,1,0,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,1,0,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,1,0,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,1,0,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,1,0,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,1,0,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,1,0,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,1,0,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,1,0,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,1,0,fad26b16-8638-496b-bd12-381fc6f5b71f,fad26b16-8638-496b-bd12-381fc6f5b71f,1,0,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,1,0,324a56c9-02d9-4177-af84-a817b8c41169,324a56c9-02d9-4177-af84-a817b8c41169,1,0,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,1,0,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,1,0,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,1,0,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,1,0,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,1,0,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,1,0,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,1,0,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,1,0,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,1,0,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,1,0,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,1,0,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,1,0,3ab0649b-239f-4466-b897-73c0ab628927,3ab0649b-239f-4466-b897-73c0ab628927,1,0,4c697110-8941-4d6d-ba03-f2b9e96ff82e,4c697110-8941-4d6d-ba03-f2b9e96ff82e,1,0,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,1,0,b172631b-da0d-42f4-ae6b-ae122a46cced,b172631b-da0d-42f4-ae6b-ae122a46cced,1,0,1a25e744-37ae-46ca-a328-ff8eced21a82,1a25e744-37ae-46ca-a328-ff8eced21a82,1,0,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,1,0,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,1,0,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,1,0,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,1,0,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,1,0,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,1,0,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,1,0,5a94a307-3f54-4753-8ef5-ce9f88417827,5a94a307-3f54-4753-8ef5-ce9f88417827,1,0,0f09b6b8-72ac-4461-96c4-683be403e2ff,0f09b6b8-72ac-4461-96c4-683be403e2ff,1,0,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,1,0,19d1d74a-de5f-475a-896c-a32b7d28f918,19d1d74a-de5f-475a-896c-a32b7d28f918,1,0,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,1,0,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,1,0,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,1,0,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,1,0,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,1,0,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,1,0,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,1,0,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,1,0,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,1,0,e6a53f32-0b7d-499d-844e-fb8df13a3519,e6a53f32-0b7d-499d-844e-fb8df13a3519,1,0,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,1,0,2c5a56d3-386e-45df-adc2-4471f52f9bdc,2c5a56d3-386e-45df-adc2-4471f52f9bdc,1,0,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,1,0,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,1,0,22474ca3-565b-4b67-a5b4-b0b959306d10,22474ca3-565b-4b67-a5b4-b0b959306d10,1,0,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1,0,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,1,0,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,1,0,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,1,0,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,1,0,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,1,0,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,1,0,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,1,0,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,1,0,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,1,0,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,1,0,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,1,0,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,1,0,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,1,0,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,1,0,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,1,0,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,1,0,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,1,0,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,1,0,3e44d463-f253-4a64-8d68-631fcb66935c,3e44d463-f253-4a64-8d68-631fcb66935c,1,0,653d6483-029b-4453-a7d0-3a3c6d9d0b05,653d6483-029b-4453-a7d0-3a3c6d9d0b05,1,0,ac507771-50bd-4f8b-b72f-5954562c9131,ac507771-50bd-4f8b-b72f-5954562c9131,1,0,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,1,0,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,1,0,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,1,0,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,1,0,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,1,0,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,1,0,a23e6c77-8c12-4f99-ae2d-68a12274be38,a23e6c77-8c12-4f99-ae2d-68a12274be38,1,0,3c4454cd-31e9-42a5-9127-fb66a628f0e1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,1,0,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,1,0,31cac1e9-eb16-489c-9322-30d1e27a80b3,31cac1e9-eb16-489c-9322-30d1e27a80b3,1,0,0d100e33-7941-41c1-962d-7672c874e9c5,0d100e33-7941-41c1-962d-7672c874e9c5,1,0,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,1,0,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,1,0,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,1,0,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,1,0,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,1,0,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,1,0,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1,0,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,1,0,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,1,0,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,1,0,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,1,0,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,1,0,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,1,0,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,1,0,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,1,0,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,1,0,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,1,0,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,1,0,118a0e62-c0bb-435b-9e3e-c64563efa602,118a0e62-c0bb-435b-9e3e-c64563efa602,1,0,b57bc8a9-8a59-4192-a442-2e1982e83179,b57bc8a9-8a59-4192-a442-2e1982e83179,1,0,5b06ccda-2a70-4621-8273-78408cbe72a9,5b06ccda-2a70-4621-8273-78408cbe72a9,1,0,89753385-64fd-4e76-9857-bfd5d7c23f71,89753385-64fd-4e76-9857-bfd5d7c23f71,1,0,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1,0,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,1,0,e20bcb57-2f68-4709-8a11-105d561a2dda,e20bcb57-2f68-4709-8a11-105d561a2dda,1,0,3df3f61a-2c17-4278-8d82-91089f793e6a,3df3f61a-2c17-4278-8d82-91089f793e6a,1,0,ea8beea1-7d80-4613-b2f9-79ee612e977a,ea8beea1-7d80-4613-b2f9-79ee612e977a,1,0,afd62a32-fdbb-429a-9a64-89c61a07e018,afd62a32-fdbb-429a-9a64-89c61a07e018,1,0,027cef43-99bd-48d3-a1a3-2102ac003742,027cef43-99bd-48d3-a1a3-2102ac003742,1,0,00197ea9-de76-4e2a-97bc-93e44053e35e,00197ea9-de76-4e2a-97bc-93e44053e35e,1,0,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,1,0,a51f7c6f-2631-4d23-becc-c0e8b711fddd,a51f7c6f-2631-4d23-becc-c0e8b711fddd,1,0,37806357-d92c-4bea-a5ef-77f138578fda,37806357-d92c-4bea-a5ef-77f138578fda,1,0,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,1,0,0a880538-f97f-448e-a4a9-82b0194dbe28,0a880538-f97f-448e-a4a9-82b0194dbe28,1,0,179868b7-d342-4df0-9386-c114d75faf3a,179868b7-d342-4df0-9386-c114d75faf3a,1,0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,1,0,b49ea672-5d01-46c2-8ece-2511afeb740d,b49ea672-5d01-46c2-8ece-2511afeb740d,1,0,77bb5aba-1364-4db9-aa93-69f001ce2709,77bb5aba-1364-4db9-aa93-69f001ce2709,1,0,d14528d6-c2dd-4184-98c5-0b444a2bd98b,d14528d6-c2dd-4184-98c5-0b444a2bd98b,1,0,48f81387-a409-4163-85b8-ad563cb6cf2e,48f81387-a409-4163-85b8-ad563cb6cf2e,1,0,739df12e-1b6b-45c6-802b-658641fb9e90,739df12e-1b6b-45c6-802b-658641fb9e90,1,0,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,1,0,7e4afed8-5c56-4765-bcd0-a40e6121ba22,7e4afed8-5c56-4765-bcd0-a40e6121ba22,1,0,155660a1-8a63-4562-a715-d75a8af7176b,155660a1-8a63-4562-a715-d75a8af7176b,1,0,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,1,0,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,1,0,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,1,0,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,1,0,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,1,0,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,1,0,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,1,0,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,1,0,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,1,0,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,1,0,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,1,0,618b8843-7413-4634-bd65-18d904c2582f,618b8843-7413-4634-bd65-18d904c2582f,1,0,253b97a6-4e04-40d0-a39e-99500d54accb,253b97a6-4e04-40d0-a39e-99500d54accb,1,0,46cf1217-4b49-4c35-9c2b-4739dd1b8bf5,46cf1217-4b49-4c35-9c2b-4739dd1b8bf5,1,0,db367faa-e417-40ff-a082-e93421d464ca,db367faa-e417-40ff-a082-e93421d464ca,1,0,55ad14cb-7647-4d16-ae68-ac45e4a39c01,55ad14cb-7647-4d16-ae68-ac45e4a39c01,1,0,f0363f45-9d63-4f0b-b7fc-95cb0d1660af,f0363f45-9d63-4f0b-b7fc-95cb0d1660af,1,0,d8a16236-89bc-4493-9b8e-fd5d3f9298a7,d8a16236-89bc-4493-9b8e-fd5d3f9298a7,1,0,b12a0998-905e-4956-af8b-6460dc945c10,b12a0998-905e-4956-af8b-6460dc945c10,1,0,6a958a2b-e914-4321-9e95-3203e8011b8c,6a958a2b-e914-4321-9e95-3203e8011b8c,1,0,176181ff-58af-4392-817e-49e37caa73ce,176181ff-58af-4392-817e-49e37caa73ce,1,0,917d059b-91d9-4f74-8c10-d0016162f77e,917d059b-91d9-4f74-8c10-d0016162f77e,1,0,95fd99eb-b139-4b7a-93db-70419e9a809b,95fd99eb-b139-4b7a-93db-70419e9a809b,1,0,c60b9f4f-870f-4478-b2b4-e8afa9324d54,c60b9f4f-870f-4478-b2b4-e8afa9324d54,1,0,e31d2420-266e-408a-a4bf-673194a555d3,e31d2420-266e-408a-a4bf-673194a555d3,1,0,31418550-c525-448b-a054-6b055aa11267,31418550-c525-448b-a054-6b055aa11267,1,0,2003c769-556e-41a6-a7a6-4c5c7263e48d,2003c769-556e-41a6-a7a6-4c5c7263e48d,1,0,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,1,0,d3211832-c8ca-437a-8810-82e06cbb48de,d3211832-c8ca-437a-8810-82e06cbb48de,1,0,8131d701-1014-4196-9b67-914e451f8a3a,8131d701-1014-4196-9b67-914e451f8a3a,1,0,2b102933-c660-4e74-ae9a-5061a88ed672,2b102933-c660-4e74-ae9a-5061a88ed672,1,0,56c897b7-d34e-4d7d-9a3b-d0779be5c189,56c897b7-d34e-4d7d-9a3b-d0779be5c189,1,0,3ac81c80-56bd-4750-b135-07ab522e3eab,3ac81c80-56bd-4750-b135-07ab522e3eab,1,0,5657872f-c7d5-446f-bcc3-d0b86ad63a42,5657872f-c7d5-446f-bcc3-d0b86ad63a42,1,0,d5214cb9-67e2-469f-989f-3f2b662ae830,d5214cb9-67e2-469f-989f-3f2b662ae830,1,0,69679e88-4f2b-4dd6-8cb2-b88293d07b55,69679e88-4f2b-4dd6-8cb2-b88293d07b55,1,0,68679208-9972-4854-8649-49bdf6212255,68679208-9972-4854-8649-49bdf6212255,1,0,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,1,0,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,1,0,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,1,0,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,1,0,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,1,0,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,1,0,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,1,0,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,1,0,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,1,0,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,1,0,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,1,0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,1,0,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1,0,00605607-03ab-43fc-ba08-9fc32f582d0a,00605607-03ab-43fc-ba08-9fc32f582d0a,1,0,5ab0a910-74ab-4af0-b5a3-40845a789fde,5ab0a910-74ab-4af0-b5a3-40845a789fde,1,0,bb659006-c11e-4427-8d86-229ba43ef679,bb659006-c11e-4427-8d86-229ba43ef679,1,0,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,1,0,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,1,0,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,1,0,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,1,0,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,1,0,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,1,0,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,1,0,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,1,0,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,1,0,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,1,0,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,1,0,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1,0,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,1,0,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,1,0,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,1,0,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,1,0,ec11342f-594f-416f-a10f-bd1bfa695c08,ec11342f-594f-416f-a10f-bd1bfa695c08,1,0,31c3ac44-204e-43fd-bca3-fd18fa091c58,31c3ac44-204e-43fd-bca3-fd18fa091c58,1,0,74f03c35-5da0-406e-a938-e8e5d49975ef,74f03c35-5da0-406e-a938-e8e5d49975ef,1,0,c9ab3890-6d16-431f-ab2b-b5058e6202a4,c9ab3890-6d16-431f-ab2b-b5058e6202a4,1,0,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,1,0,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,1,0,4090c6f7-1d25-4b17-9baa-18daa0640b0f,4090c6f7-1d25-4b17-9baa-18daa0640b0f,1,0,26125e58-dfc8-4bbb-a3a4-80616471746e,26125e58-dfc8-4bbb-a3a4-80616471746e,1,0,b1c699cd-efdc-461c-ad37-10bfd4bc9674,b1c699cd-efdc-461c-ad37-10bfd4bc9674,1,0,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,1,0,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,1,0,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,1,0,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,1,0,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,1,0,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,1,0,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,1,0,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,1,0,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,1,0,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,1,0,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,1,0,985106b7-7476-4b48-90ac-ad86876395b5,985106b7-7476-4b48-90ac-ad86876395b5,1,0,0d8db0c9-adbc-478d-997c-3d7feccac99b,0d8db0c9-adbc-478d-997c-3d7feccac99b,1,0,3fd2ef04-c178-47bf-ab62-7baf83236d99,3fd2ef04-c178-47bf-ab62-7baf83236d99,1,0,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,1,0,320bf2e6-a3a8-490b-8aa0-21369ffb121b,320bf2e6-a3a8-490b-8aa0-21369ffb121b,1,0,a3bafc54-8fe4-4841-acc6-74a87baf9caf,a3bafc54-8fe4-4841-acc6-74a87baf9caf,1,0,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,1,0,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,1,0,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,1,0,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,1,0,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,1,0,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,1,0,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,1,0,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,1,0,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,1,0,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,1,0,00696255-ea14-4fee-8633-0962f3c441d1,00696255-ea14-4fee-8633-0962f3c441d1,1,0,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,1,0,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,1,0,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,1,0,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,1,0,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,1,0,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,1,0,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,1,0,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,1,0,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,1,0,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,1,0,fef27478-ddfd-4ad9-8161-148761f29698,fef27478-ddfd-4ad9-8161-148761f29698,1,0,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,1,0,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,1,0,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,1,0,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,1,0,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,1,0,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1,0,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,1,0,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,1,0,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,1,0,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,1,0,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,1,0,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,1,0,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,1,0,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,1,0,fc1476f7-26e6-4374-b99b-e515d86c050a,fc1476f7-26e6-4374-b99b-e515d86c050a,1,0,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,1,0,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,1,0,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,1,0,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,1,0,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,1,0,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,1,0,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,1,0,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,1,0,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,1,0,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,1,0,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,1,0,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,1,0,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,1,0,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,1,0,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,1,0,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,1,0,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,1,0,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,1,0,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,1,0,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,1,0,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,1,0,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,1,0,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,1,0,d8601e95-af94-4805-974a-99c539725d74,d8601e95-af94-4805-974a-99c539725d74,1,0,6d98f877-f3bb-4795-9025-2631468a331f,6d98f877-f3bb-4795-9025-2631468a331f,1,0,89b9379d-ace9-48cc-b979-a66fd45aeb1d,89b9379d-ace9-48cc-b979-a66fd45aeb1d,1,0,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,1,0,9767a113-5a42-4749-bf40-0f349e85615d,9767a113-5a42-4749-bf40-0f349e85615d,1,0,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,1,0,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,1,0,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,1,0,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,1,0,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,1,0,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,1,0,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,1,0,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,1,0,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,1,0,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,1,0,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,1,0,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,1,0,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,1,0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,1,0,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,1,0,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,1,0,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,1,0,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,1,0,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,1,0,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,1,0,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,1,0,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,1,0,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,1,0,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,1,0,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,1,0,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,1,0,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,1,0,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,1,0,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,1,0,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,1,0,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,1,0,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,1,0,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,1,0,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,1,0,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,1,0,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,1,0,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,1,0,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,1,0,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,1,0,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,1,0,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,1,0,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,1,0,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,1,0,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,1,0,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,1,0,b3f7f763-bea9-4f59-9450-df95e5c3d89d,b3f7f763-bea9-4f59-9450-df95e5c3d89d,1,0,9111e28e-c1c7-414b-9288-61bd06a04d04,9111e28e-c1c7-414b-9288-61bd06a04d04,1,0,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,1,0,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,1,0,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,1,0,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,1,0,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,1,0,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1,0,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,1,0,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,1,0,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,1,0,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,1,0,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,1,0,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1,0,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,1,0,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,1,0,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,1,0,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,1,0,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,1,0,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,1,0,3afe11f6-7424-4b41-a42f-91db33756fa3,3afe11f6-7424-4b41-a42f-91db33756fa3,1,0,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,1,0,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,1,0,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,1,0,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,1,0,58e92a42-b650-4282-a2b2-2fe2cc0cf50d,58e92a42-b650-4282-a2b2-2fe2cc0cf50d,1,0,8c1a0b0c-3618-4e66-98b8-8b9e7ca63ca2,8c1a0b0c-3618-4e66-98b8-8b9e7ca63ca2,1,0,6cd10bda-0741-4445-9ffa-17182c9c5a58,6cd10bda-0741-4445-9ffa-17182c9c5a58,1,0,5c874c9a-fe67-45a3-a1d3-7ec1d1c55090,5c874c9a-fe67-45a3-a1d3-7ec1d1c55090,1,0,68a623fa-099a-4688-a7e9-444fb42eb650,68a623fa-099a-4688-a7e9-444fb42eb650,1,0,36ed0626-e389-4106-81bc-77462598bb45,36ed0626-e389-4106-81bc-77462598bb45,1,0,faeefd44-4e11-4a7d-8d4e-4dc9c6b60d59,faeefd44-4e11-4a7d-8d4e-4dc9c6b60d59,1,0,737d5b7f-0ee9-46b5-a509-f06b6176a293,737d5b7f-0ee9-46b5-a509-f06b6176a293,1,0,42eb6f71-0ed7-486a-92fb-976d1b46b081,42eb6f71-0ed7-486a-92fb-976d1b46b081,1,0,4a389216-b4c9-4368-af2c-1e51e32671a5,4a389216-b4c9-4368-af2c-1e51e32671a5,1,0,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,1,0,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,1,0,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,1,0,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,1,0,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,1,0,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,1,0,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,1,0,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,1,0,c7bafd34-5b15-42ec-b329-0be3002775ad,c7bafd34-5b15-42ec-b329-0be3002775ad,1,0,6feb2278-9149-47f8-a0ec-eb4bd9f44716,6feb2278-9149-47f8-a0ec-eb4bd9f44716,1,0,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,1,0,cd6770d5-cd3c-47af-bc46-c865993adf63,cd6770d5-cd3c-47af-bc46-c865993adf63,1,0,97ec899d-a2a0-4691-83ff-25b78dd49ef6,97ec899d-a2a0-4691-83ff-25b78dd49ef6,1,0,411db885-f761-44e5-bdd1-9fdf9e741ac1,411db885-f761-44e5-bdd1-9fdf9e741ac1,1,0,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,1,0,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,1,0,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,43e37533-ed38-4000-a387-5749f8d9aaf3,43e37533-ed38-4000-a387-5749f8d9aaf3,1,0,e93bdb44-64b3-43d8-b15a-c561dbb91974,e93bdb44-64b3-43d8-b15a-c561dbb91974,1,0,a7c7c835-5402-4bdd-a0e3-d21746174d5a,a7c7c835-5402-4bdd-a0e3-d21746174d5a,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,1,0,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,1,0,ad066c0d-4f4c-48af-9cc8-bb835372150a,ad066c0d-4f4c-48af-9cc8-bb835372150a,1,0,a2145e81-239e-4267-8a43-ea3f7babe878,a2145e81-239e-4267-8a43-ea3f7babe878,1,0,39598414-9c1d-46ec-a534-8bd43e622e45,39598414-9c1d-46ec-a534-8bd43e622e45,1,0,b552c510-4fd4-4c16-9022-dc5babcafc52,b552c510-4fd4-4c16-9022-dc5babcafc52,1,0,3892c06d-28f1-4238-a929-201316cac1ed,3892c06d-28f1-4238-a929-201316cac1ed,1,0,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,1,0,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,1,0,1f587ff1-95a4-4f45-85b4-22bb97011177,1f587ff1-95a4-4f45-85b4-22bb97011177,1,0,567c68fd-74c7-4b6e-9119-56ac8d78073c,567c68fd-74c7-4b6e-9119-56ac8d78073c,1,0,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,1,0,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,1,0,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,1,0,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,1,0,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,1,0,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,1,0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,1,0,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,1,0,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,1,0,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,1,0,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,1,0,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,1,0,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,1,0,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,1,0,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,1,0,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,1,0,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,1,0,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,1,0,ee1f8545-ea64-41de-a29a-2d40e15d4f16,ee1f8545-ea64-41de-a29a-2d40e15d4f16,1,0,25ba3c5d-ace1-43cd-987f-68364b9b6970,25ba3c5d-ace1-43cd-987f-68364b9b6970,1,0,75ec7461-ec33-417a-bdb8-6337a8d08fb4,75ec7461-ec33-417a-bdb8-6337a8d08fb4,1,0,b8f5019e-b53f-4508-a042-bbadda2d1fd4,b8f5019e-b53f-4508-a042-bbadda2d1fd4,1,0,b250d233-70a0-4baf-8b7d-6e1d414a11b9,b250d233-70a0-4baf-8b7d-6e1d414a11b9,1,0,d5a73869-381e-4878-8db7-596643937202,d5a73869-381e-4878-8db7-596643937202,1,0,0c5e261f-961e-4780-877a-06589400b88a,0c5e261f-961e-4780-877a-06589400b88a,1,0,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,1,0,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,1,0,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,1,0,11a93e3a-3c5b-4242-913c-02474a383344,11a93e3a-3c5b-4242-913c-02474a383344,1,0,ddd2861c-592b-4879-b9de-4b05a22c0b43,ddd2861c-592b-4879-b9de-4b05a22c0b43,1,0,5b383021-a800-4f0b-b8a3-d344389bff6c,5b383021-a800-4f0b-b8a3-d344389bff6c,1,0,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,1,0,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,1,0,8a57d427-a34e-4121-84e6-1a86a9f9092d,8a57d427-a34e-4121-84e6-1a86a9f9092d,1,0,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,1,0,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,1,0,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,1,0,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,1,0,68447105-a784-4803-8eb8-3701b0fc819d,68447105-a784-4803-8eb8-3701b0fc819d,1,0,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,1,0,59dee70d-aeca-470a-b3c4-e43bb16c5753,59dee70d-aeca-470a-b3c4-e43bb16c5753,1,0,82777e92-0681-44bf-b51e-4d98fcd5d5bd,82777e92-0681-44bf-b51e-4d98fcd5d5bd,1,0,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,1,0,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,1,0,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,1,0,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,1,0,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,1,0,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,1,0,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,1,0,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,1,0,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,1,0,325bacdd-793f-47d8-b987-57e9d5f2782b,325bacdd-793f-47d8-b987-57e9d5f2782b,1,0,80395d47-70d7-4d8d-9b18-93283fba80c2,80395d47-70d7-4d8d-9b18-93283fba80c2,1,0,8b621ec9-24c9-4166-90ce-29c5ad30f78b,8b621ec9-24c9-4166-90ce-29c5ad30f78b,1,0,cc98670a-7b18-4973-b211-90261c5c8c10,cc98670a-7b18-4973-b211-90261c5c8c10,1,0,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,1,0,fb36c775-1124-4ba6-8af8-133bf66fcb54,fb36c775-1124-4ba6-8af8-133bf66fcb54,1,0,51f9aff4-71da-4b1b-b48b-04122a17d855,51f9aff4-71da-4b1b-b48b-04122a17d855,1,0,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,1,0,62957889-503f-4923-a372-29776dc3b5e5,62957889-503f-4923-a372-29776dc3b5e5,1,0,778e79ee-eb1a-4d52-8a31-58e781c78fe4,778e79ee-eb1a-4d52-8a31-58e781c78fe4,1,0,90385850-d37b-4b2e-ac87-95c17f32197c,90385850-d37b-4b2e-ac87-95c17f32197c,1,0,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,1,0,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,1,0,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,1,0,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,1,0,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,1,0,73afaad8-dfa9-43e3-bdaf-543c3545d788,73afaad8-dfa9-43e3-bdaf-543c3545d788,1,0,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,1,0,4f0bda80-2246-43be-95f8-ae8480682cd5,4f0bda80-2246-43be-95f8-ae8480682cd5,1,0,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,1,0,6f683f46-9eef-4e78-bc2f-7174238bf53c,6f683f46-9eef-4e78-bc2f-7174238bf53c,1,0,7d1ed38b-98cf-4a0e-a605-680bb580d904,7d1ed38b-98cf-4a0e-a605-680bb580d904,1,0,b769eda0-11de-401c-a68b-4fce4555d4fc,b769eda0-11de-401c-a68b-4fce4555d4fc,1,0,fd7a668f-3099-4e15-956a-92c6295dd4d5,fd7a668f-3099-4e15-956a-92c6295dd4d5,1,0,afcbd830-ec5f-4865-a176-ea3014dff908,afcbd830-ec5f-4865-a176-ea3014dff908,1,0,dc5fc801-14e4-42e8-b396-76eb30b69eea,dc5fc801-14e4-42e8-b396-76eb30b69eea,1,0,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,1,0,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,1,0,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,1,0,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,1,0,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,1,0,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,1,0,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,1,0,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,1,0,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,1,0,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,1,0,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,1,0,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,1,0,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,1,0,569047c2-0879-4fba-a814-44812d21043b,569047c2-0879-4fba-a814-44812d21043b,1,0,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,1,0,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,1,0,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,1,0,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,1,0,91562fe8-e630-4bcb-a14e-c0e1e129141a,91562fe8-e630-4bcb-a14e-c0e1e129141a,1,0,c261abfd-3828-47b5-aa32-dfdd3a1636ad,c261abfd-3828-47b5-aa32-dfdd3a1636ad,1,0,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,1,0,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,1,0,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,1,0,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,1,0,5e33e655-2847-4237-87ff-74775fd36756,5e33e655-2847-4237-87ff-74775fd36756,1,0,f0907d81-656e-4dfb-81d8-14a8847cb38a,f0907d81-656e-4dfb-81d8-14a8847cb38a,1,0,0e3c6508-caa3-43ef-9647-0e3b96955898,0e3c6508-caa3-43ef-9647-0e3b96955898,1,0,ceb18abf-0390-450c-9e4c-cab9e43eb2e8,ceb18abf-0390-450c-9e4c-cab9e43eb2e8,1,0,1b1fa685-dccb-4d0f-ac01-adc6febf7f15,1b1fa685-dccb-4d0f-ac01-adc6febf7f15,1,0,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,1,0,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,1,0,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,1,0,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,1,0,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,1,0,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,1,0,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,1,0,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,1,0,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,1,0,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,1,0,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,1,0,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,1,0,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,1,0,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,1,0,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,1,0,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,1,0,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,1,0,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,1,0,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,1,0,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,1,0,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,1,0,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,1,0,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,1,0,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,1,0,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,1,0,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,1,0,e870a1bd-0c08-4d1e-832a-357922983c19,e870a1bd-0c08-4d1e-832a-357922983c19,1,0,9f71aeac-f889-40dc-91bd-d670da4efd2b,9f71aeac-f889-40dc-91bd-d670da4efd2b,1,0,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,1,0,614ef0bd-3298-408b-bf71-37df8ee60702,614ef0bd-3298-408b-bf71-37df8ee60702,1,0,26ff1be6-f72a-456a-9dce-302029752603,26ff1be6-f72a-456a-9dce-302029752603,1,0,db850a08-0c99-4a57-9b04-38be64bd38fb,db850a08-0c99-4a57-9b04-38be64bd38fb,1,0,abeca127-5ae9-46af-a5e8-d6438fd68367,abeca127-5ae9-46af-a5e8-d6438fd68367,1,0,bce81631-9f6d-42b3-b4b6-2199afb08f2f,bce81631-9f6d-42b3-b4b6-2199afb08f2f,1,0,67d6878f-3e47-4142-8f98-c5a207f0b8a8,67d6878f-3e47-4142-8f98-c5a207f0b8a8,1,0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,1,0,68636657-4d46-4c2a-9b2f-11521a55dfb4,68636657-4d46-4c2a-9b2f-11521a55dfb4,1,0,18a83f43-dc84-4f8a-9580-681b19f571c4,18a83f43-dc84-4f8a-9580-681b19f571c4,1,0,01c588b0-d0ce-4978-b04d-084e6a00fcc7,01c588b0-d0ce-4978-b04d-084e6a00fcc7,1,0,a23642d9-8c4f-44a5-8865-bfb286e47c55,a23642d9-8c4f-44a5-8865-bfb286e47c55,1,0,7b37e038-dcef-41e1-b6e7-ed73c6958415,7b37e038-dcef-41e1-b6e7-ed73c6958415,1,0,24df2d14-5ebf-4ded-ba14-5daee7a0c536,24df2d14-5ebf-4ded-ba14-5daee7a0c536,1,0,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,1,0,03bb028a-ee8c-411e-8382-653046f803c6,03bb028a-ee8c-411e-8382-653046f803c6,1,0,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,1,0,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,1,0,38d5ed93-133b-44fe-827a-69a6cfc0461d,38d5ed93-133b-44fe-827a-69a6cfc0461d,1,0,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,1,0,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,1,0,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,1,0,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,1,0,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1,0,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,1,0,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,1,0,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1,0,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,1,0,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,1,0,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,1,0,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,1,0,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,1,0,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,1,0,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,1,0,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1,0,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,1,0,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,1,0,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,1,0,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,1,0,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,1,0,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,1,0,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,1,0,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,1,0,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,1,0,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,1,0,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,1,0,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1,0,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,1,0,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,1,0,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,1,0,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,1,0,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,1,0,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,1,0,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,1,0,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,1,0,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,1,0,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,1,0,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,1,0,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,1,0,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,1,0,45ca19df-90f3-4143-a659-bc0cb97efee9,45ca19df-90f3-4143-a659-bc0cb97efee9,1,0,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,1,0,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,1,0,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,1,0,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,1,0,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,1,0,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,1,0,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,1,0,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,1,0,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,1,0,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,1,0,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,1,0,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,1,0,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,1,0,cf783265-a4cb-436f-963a-1ff8220ae246,cf783265-a4cb-436f-963a-1ff8220ae246,1,0,3560f949-48f9-4fca-9fe2-81efc1ec0eee,3560f949-48f9-4fca-9fe2-81efc1ec0eee,1,0,662078f0-b75d-4c44-896f-7b7f74fd1ed4,662078f0-b75d-4c44-896f-7b7f74fd1ed4,1,0,4fa11304-fbd4-4c90-909d-5024283a6868,4fa11304-fbd4-4c90-909d-5024283a6868,1,0,207290c2-5221-48ad-99aa-bb0f7955df3f,207290c2-5221-48ad-99aa-bb0f7955df3f,1,0,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,1,0,d91a016e-cca9-4976-9c53-2c96fa95cf1a,d91a016e-cca9-4976-9c53-2c96fa95cf1a,1,0,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,1,0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,1,0,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,1,0,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,1,0,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,1,0,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,1,0,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,1,0,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,1,0,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,1,0,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,1,0,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,1,0,69c207c2-7699-4467-b127-286ecd6d0f29,69c207c2-7699-4467-b127-286ecd6d0f29,1,0,e33df42d-4c64-4475-8294-6b05ecdb4e02,e33df42d-4c64-4475-8294-6b05ecdb4e02,1,0,6094a0ed-2051-4649-ad75-dfeb389d3cbb,6094a0ed-2051-4649-ad75-dfeb389d3cbb,1,0,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,1,0,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,1,0,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,1,0,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,1,0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,1,0,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,1,0,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,1,0,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,1,0,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,1,0,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,1,0,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,1,0,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,1,0,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1,0,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,1,0,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,1,0,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,1,0,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,1,0,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,1,0,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,1,0,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,1,0,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,1,0,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,1,0,e9a2320b-71a1-4974-8b5a-1990062ec7df,e9a2320b-71a1-4974-8b5a-1990062ec7df,1,0,2e459a7c-c448-4db4-ae21-e59646527030,2e459a7c-c448-4db4-ae21-e59646527030,1,0,891194d9-9f02-4b22-89cd-941181c83ecb,891194d9-9f02-4b22-89cd-941181c83ecb,1,0,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,1,0,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,1,0,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,1,0,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,1,0,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,1,0,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1,0,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,1,0,6c205eae-9113-46c1-a245-25d29173646e,6c205eae-9113-46c1-a245-25d29173646e,1,0,4cc4aa90-49fb-4602-9f9c-d4d47d223988,4cc4aa90-49fb-4602-9f9c-d4d47d223988,1,0,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,1,0,e0227e4b-be22-4614-8980-5d573fae705d,e0227e4b-be22-4614-8980-5d573fae705d,1,0,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,1,0,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,1,0,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,1,0,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,1,0,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,1,0,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,1,0,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,1,0,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,1,0,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,1,0,c224e520-7204-4f4a-aac9-b6221ea9ce44,c224e520-7204-4f4a-aac9-b6221ea9ce44,1,0,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,1,0,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,1,0,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,1,0,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,1,0,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,1,0,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,1,0,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,1,0,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,1,0,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,1,0,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,1,0,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,1,0,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,1,0,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,1,0,f4554046-493e-4960-94df-0a8b9d02f474,f4554046-493e-4960-94df-0a8b9d02f474,1,0,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,1,0,9222a6c0-b785-4811-bfb6-44ac44a55925,9222a6c0-b785-4811-bfb6-44ac44a55925,1,0,ea84021d-2431-44ad-a446-f1fb979c9e96,ea84021d-2431-44ad-a446-f1fb979c9e96,1,0,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,1,0,8fa21575-177f-4b7c-94b5-dfeefe737cb4,8fa21575-177f-4b7c-94b5-dfeefe737cb4,1,0,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,1,0,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,1,0,491a2337-1bf9-45c1-8ae6-95605ef41992,491a2337-1bf9-45c1-8ae6-95605ef41992,1,0,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,1,0,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,1,0,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,1,0,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,1,0,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,1,0,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,1,0,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,1,0,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,1,0,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,1,0,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,1,0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,1,0,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,1,0,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,1,0,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,1,0,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,1,0,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,1,0,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,1,0,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,1,0,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,1,0,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1,0,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,1,0,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,1,0,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,1,0,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,1,0,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,1,0,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,1,0,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,1,0,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,1,0,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,1,0,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1,0,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,1,0,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,1,0,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,1,0,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,1,0,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,1,0,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,1,0,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,1,0,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,1,0,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,1,0,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,1,0,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,1,0,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,1,0,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,1,0,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,1,0,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,1,0,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,1,0,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,1,0,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,1,0,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,1,0,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,1,0,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,1,0,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,1,0,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,1,0,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,1,0,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,1,0,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,1,0,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,1,0,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,1,0,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,1,0,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1,0,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,1,0,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,1,0,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,1,0,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,1,0,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,1,0,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,1,0,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,1,0,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,1,0,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,1,0,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,1,0,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,1,0,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,1,0,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,1,0,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,1,0,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,1,0,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,1,0,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,1,0,db03a88b-2804-45c2-9089-7ddb87ef2f18,db03a88b-2804-45c2-9089-7ddb87ef2f18,1,0,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,1,0,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,1,0,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,1,0,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,1,0,9ab0fe18-4dd7-4eed-958d-8537d4896d84,9ab0fe18-4dd7-4eed-958d-8537d4896d84,1,0,2278dc46-46ce-4d00-9289-4de1640782d7,2278dc46-46ce-4d00-9289-4de1640782d7,1,0,1f983a04-c2df-40bb-bee2-b326474d89f8,1f983a04-c2df-40bb-bee2-b326474d89f8,1,0,f03f1b68-e924-4c06-b0aa-8033a9a2f592,f03f1b68-e924-4c06-b0aa-8033a9a2f592,1,0,5e453d10-235d-4e53-86b1-20eed3247992,5e453d10-235d-4e53-86b1-20eed3247992,1,0,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0eefb856-0fb4-4c3e-bb08-e88b03a44065,1,0,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,1,0,738228ad-c30a-42f4-a6ad-bde0edba6266,738228ad-c30a-42f4-a6ad-bde0edba6266,1,0,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,1,0,df8e8344-d7bc-4cf2-b498-88d3abb66c09,df8e8344-d7bc-4cf2-b498-88d3abb66c09,1,0,e6d13536-3021-45b2-a8e1-bdb0e0be850c,e6d13536-3021-45b2-a8e1-bdb0e0be850c,1,0,b49f538c-b2b2-4a1f-a6b4-a911033b1666,b49f538c-b2b2-4a1f-a6b4-a911033b1666,1,0,794e952b-6b03-4a1e-ad3f-453376bccf45,794e952b-6b03-4a1e-ad3f-453376bccf45,1,0,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,1,0,5cd997ba-f123-47b3-8cde-fbba45a4a11c,5cd997ba-f123-47b3-8cde-fbba45a4a11c,1,0,0d746247-c4f4-47a5-a373-45ec4023d3ef,0d746247-c4f4-47a5-a373-45ec4023d3ef,1,0,a25bcf4e-1a47-472b-9f93-f6ab45abf461,a25bcf4e-1a47-472b-9f93-f6ab45abf461,1,0,958b7dab-0aba-423f-ab81-b70f2b93a027,958b7dab-0aba-423f-ab81-b70f2b93a027,1,0,a17ec3be-2255-42af-a6ee-d3fb8bb00519,a17ec3be-2255-42af-a6ee-d3fb8bb00519,1,0,add0b22d-ff5a-41f7-88a1-ef34880e50c9,add0b22d-ff5a-41f7-88a1-ef34880e50c9,1,0,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,1,0,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,1,0,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,1,0,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,1,0,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,1,0,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,1,0,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,1,0,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,1,0,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,1,0,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,1,0,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,1,0,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,1,0,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,1,0,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,1,0,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,1,0,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,1,0,4a87fafc-7ca7-478e-bb31-358c2b85fa92,4a87fafc-7ca7-478e-bb31-358c2b85fa92,1,0,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,1,0,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,1,0,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,1,0,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,1,0,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,1,0,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,1,0,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,1,0,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,1,0,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,1,0,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,1,0,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,1,0,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,1,0,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,1,0,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,1,0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,1,0,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,1,0,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,1,0,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,1,0,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,1,0,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,1,0,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,1,0,61892a62-9381-401d-af31-9073ef2509fb,61892a62-9381-401d-af31-9073ef2509fb,1,0,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,1,0,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,1,0,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,1,0,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,1,0,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,1,0,a469f018-da26-485f-87c3-f580321a34f0,a469f018-da26-485f-87c3-f580321a34f0,1,0,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,1,0,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,1,0,628de771-c19c-4474-989f-8fb6cd7756a2,628de771-c19c-4474-989f-8fb6cd7756a2,1,0,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,1,0,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,1,0,6789e57b-1293-442c-97d0-b8007367602e,6789e57b-1293-442c-97d0-b8007367602e,1,0,0f193c89-b664-448e-bed3-2147430367f7,0f193c89-b664-448e-bed3-2147430367f7,1,0,4c9b2506-75a8-47d3-a5d5-d946088ba14a,4c9b2506-75a8-47d3-a5d5-d946088ba14a,1,0,36eacaa1-2efd-49c0-82de-2f8972535bf2,36eacaa1-2efd-49c0-82de-2f8972535bf2,1,0,c35a643d-fe3a-4293-93c0-074fa68a31e3,c35a643d-fe3a-4293-93c0-074fa68a31e3,1,0,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,1,0,72ee9a03-a320-4e60-be04-0ee813ea567f,72ee9a03-a320-4e60-be04-0ee813ea567f,1,0,f6f52cc8-23a3-4402-b1eb-0e41584c802a,f6f52cc8-23a3-4402-b1eb-0e41584c802a,1,0,8398e065-8b4b-4901-b057-2a048776bafe,8398e065-8b4b-4901-b057-2a048776bafe,1,0,073c56ca-bf45-422d-957a-f9c57aeee4d0,073c56ca-bf45-422d-957a-f9c57aeee4d0,1,0,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,1,0,68598d98-0c59-4cda-b0b2-6901d3aff88b,68598d98-0c59-4cda-b0b2-6901d3aff88b,1,0,219c1375-f26e-4698-aa82-4b9d735df783,219c1375-f26e-4698-aa82-4b9d735df783,1,0,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,1,0,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,1,0,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,1,0,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1,0,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,1,0,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,1,0,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,1,0,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,1,0,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,1,0,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,1,0,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,1,0,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,1,0,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,1,0,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,1,0,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,1,0,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,1,0,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,1,0,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,1,0,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,1,0,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,1,0,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,1,0,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,1,0,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,1,0,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,1,0,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,1,0,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,1,0,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,1,0,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1,0,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,1,0,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,1,0,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,1,0,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,1,0,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,1,0,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,1,0,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,1,0,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,1,0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,1,0,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,1,0,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,1,0,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,1,0,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,1,0,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,1,0,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,1,0,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,1,0,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,1,0,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1,0,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,1,0,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,1,0,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,1,0,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,1,0,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,1,0,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,1,0,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,1,0,04b5ae71-7fa4-4a64-b406-59dc603b80c5,04b5ae71-7fa4-4a64-b406-59dc603b80c5,1,0,f23a2023-f776-40db-8689-1fc3f7ebc482,f23a2023-f776-40db-8689-1fc3f7ebc482,1,0,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1,0,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,1,0,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,1,0,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,1,0,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,1,0,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,1,0,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,1,0,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,1,0,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,1,0,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,1,0,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,1,0,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,1,0,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,1,0,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,1,0,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,1,0,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,1,0,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,1,0,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,1,0,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,1,0,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,1,0,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,1,0,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,1,0,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,1,0,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,1,0,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,1,0,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,1,0,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,1,0,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,1,0,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,1,0,e62e60ea-9f0c-4a7e-869f-4639f31f826c,e62e60ea-9f0c-4a7e-869f-4639f31f826c,1,0,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,1,0,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,1,0,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,1,0,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,1,0,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,1,0,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,1,0,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,1,0,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,1,0,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,1,0,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,1,0,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,1,0,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,1,0,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,1,0,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,1,0,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,1,0,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,1,0,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,1,0,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,1,0,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,1,0,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,1,0,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,1,0,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,1,0,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,1,0,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,1,0,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,1,0,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,1,0,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,1,0,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,1,0,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,1,0,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,1,0,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,1,0,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,1,0,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,1,0,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,1,0,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,1,0,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,1,0,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,1,0,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,1,0,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,1,0,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,1,0,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,1,0,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,1,0,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,1,0,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,1,0,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,1,0,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,1,0,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,1,0,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,1,0,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,1,0,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,1,0,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,1,0,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,1,0,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,1,0,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,1,0,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,1,0,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,1,0,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,1,0,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,1,0,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,1,0,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,1,0,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,1,0,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,1,0,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,1,0,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,1,0,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,1,0,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,1,0,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,1,0,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,1,0,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,1,0,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,1,0,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,1,0,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,1,0,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,1,0,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,1,0,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,1,0,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,1,0,f692ab21-a8de-4feb-914f-4beef350543a,f692ab21-a8de-4feb-914f-4beef350543a,1,0,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,1,0,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,1,0,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,1,0,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,1,0,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,1,0,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,1,0,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,1,0,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,1,0,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,1,0,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,1,0,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,1,0,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,1,0,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,1,0,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,1,0,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,1,0,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,1,0,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,1,0,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,1,0,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,1,0,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,1,0,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,1,0,e9f393e5-04d3-4330-afb0-aa73caf0c5cd,e9f393e5-04d3-4330-afb0-aa73caf0c5cd,1,0,036868c2-e2c4-426b-8402-0d77b4224828,036868c2-e2c4-426b-8402-0d77b4224828,1,0,1bf18e24-8157-4aa4-b790-21c6535f5233,1bf18e24-8157-4aa4-b790-21c6535f5233,1,0,18470536-57df-48f0-9a85-68e4006558eb,18470536-57df-48f0-9a85-68e4006558eb,1,0,893e2f4c-b056-42ae-89fb-ecd90a53bb4c,893e2f4c-b056-42ae-89fb-ecd90a53bb4c,1,0,5eaaa3fd-3a87-4eaa-93a9-49337b19eddd,5eaaa3fd-3a87-4eaa-93a9-49337b19eddd,1,0,77ee9f6c-0be9-450f-978c-297626d6275b,77ee9f6c-0be9-450f-978c-297626d6275b,1,0,a63e6145-0d4b-4da2-9864-485a61e621df,a63e6145-0d4b-4da2-9864-485a61e621df,1,0,f29738d5-ad22-47bf-9053-497763674486,f29738d5-ad22-47bf-9053-497763674486,1,0,9c23d3bd-7a98-4d71-b9b0-78cda4ffb3ce,9c23d3bd-7a98-4d71-b9b0-78cda4ffb3ce,1,0,9aca958a-a938-4421-9e37-6606e02f7b77,9aca958a-a938-4421-9e37-6606e02f7b77,1,0,44109976-b763-4807-a013-9d04c3675bf3,44109976-b763-4807-a013-9d04c3675bf3,1,0,46127175-144d-438e-8fbe-c55ae0233620,46127175-144d-438e-8fbe-c55ae0233620,1,0,20754057-6397-4478-a484-74b8c2f243ee,20754057-6397-4478-a484-74b8c2f243ee,1,0,b8a06e8b-4581-4088-a5b4-a5d3330eab22,b8a06e8b-4581-4088-a5b4-a5d3330eab22,1,0,ea838b79-af81-4767-a8b1-fce68baa866a,ea838b79-af81-4767-a8b1-fce68baa866a,1,0,5e1056d0-6778-4030-8806-3dc90ffed318,5e1056d0-6778-4030-8806-3dc90ffed318,1,0,068e6f32-a2b6-4ade-9b9e-db3eac8b09c1,068e6f32-a2b6-4ade-9b9e-db3eac8b09c1,1,0,3701531a-b408-455f-a49d-652d3fcab4ef,3701531a-b408-455f-a49d-652d3fcab4ef,1,0,63e229aa-2638-45f1-9c5e-f821d9397ac3,63e229aa-2638-45f1-9c5e-f821d9397ac3,1,0,9e425f71-ef7d-4936-9f1b-7dceca99ca95,9e425f71-ef7d-4936-9f1b-7dceca99ca95,1,0,968ecea6-7d21-4e85-9d25-e8c6fe1b76cc,968ecea6-7d21-4e85-9d25-e8c6fe1b76cc,1,0,c6777ffe-1fb2-4807-8624-43f47a4e3947,c6777ffe-1fb2-4807-8624-43f47a4e3947,1,0,91c8e02d-ec9c-41d6-a2b1-ec1e906c055a,91c8e02d-ec9c-41d6-a2b1-ec1e906c055a,1,0,be42c5c6-b604-4180-a3d7-24b2348c8d5e,be42c5c6-b604-4180-a3d7-24b2348c8d5e,1,0,6223c072-bff3-4ea8-96a1-ac2a5bbe9f99,6223c072-bff3-4ea8-96a1-ac2a5bbe9f99,1,0,6fd083fe-a132-4f63-b38f-4891004aca8a,6fd083fe-a132-4f63-b38f-4891004aca8a,1,0,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,1,0,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,1,0,ab057ce4-ac51-4465-8aad-eadc9088c62d,ab057ce4-ac51-4465-8aad-eadc9088c62d,1,0,8842c0e3-2e20-4f37-ae7c-f5449004994b,8842c0e3-2e20-4f37-ae7c-f5449004994b,1,0,5b2cc44b-69cb-495c-a26b-003a495df40b,5b2cc44b-69cb-495c-a26b-003a495df40b,1,0,30250d93-10ff-45c9-920b-5fed3f9d8093,30250d93-10ff-45c9-920b-5fed3f9d8093,1,0,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,1,0,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,1,0,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,1,0,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,1,0,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,1,0,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,1,0,23f93492-59f5-491b-8708-45096934c7e6,23f93492-59f5-491b-8708-45096934c7e6,1,0,30f5471a-17fb-4184-9798-4f8e3ef0cccb,30f5471a-17fb-4184-9798-4f8e3ef0cccb,1,0,27abda4c-a43c-49b4-90cd-db780afe0c45,27abda4c-a43c-49b4-90cd-db780afe0c45,1,0,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,1,0,1a28db16-d410-4101-bf31-21cefa880dae,1a28db16-d410-4101-bf31-21cefa880dae,1,0,2b85bcf6-85b0-4efb-bada-b65414a8d264,2b85bcf6-85b0-4efb-bada-b65414a8d264,1,0,cf027de4-59c9-4b8f-9695-b1d4d16548fe,cf027de4-59c9-4b8f-9695-b1d4d16548fe,1,0,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,1,0,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,1,0,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,1,0,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,1,0,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,1,0,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,1,0,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,1,0,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,1,0,88cefe4a-a6c5-4753-935e-f956d9de9f77,88cefe4a-a6c5-4753-935e-f956d9de9f77,1,0,882e78b7-90bd-4b95-8852-146bdb51ec15,882e78b7-90bd-4b95-8852-146bdb51ec15,1,0,ae4435c3-62c0-4f08-b526-7f9571eed8ae,ae4435c3-62c0-4f08-b526-7f9571eed8ae,1,0,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,1,0,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,1,0,c7b46558-d688-4c42-ae52-f98de7923176,c7b46558-d688-4c42-ae52-f98de7923176,1,0,31fdbb46-1df1-4b74-a54e-b922260dcca6,31fdbb46-1df1-4b74-a54e-b922260dcca6,1,0,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,1,0,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,1,0,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,1,0,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,1,0,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,1,0,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,1,0,8317ac49-890d-4921-8c0d-1bfc676f0b40,8317ac49-890d-4921-8c0d-1bfc676f0b40,1,0,9dfb5735-6cc7-4525-b57d-04f9c798fac4,9dfb5735-6cc7-4525-b57d-04f9c798fac4,1,0,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,1,0,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,1,0,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,1,0,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,1,0,0c732569-a50f-4be3-a214-0843c6a3da47,0c732569-a50f-4be3-a214-0843c6a3da47,1,0,f55d74bf-5824-4228-9683-31f7c7fdf74d,f55d74bf-5824-4228-9683-31f7c7fdf74d,1,0,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,1,0,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,1,0,c30c6860-befb-497e-b432-3dba0f86c540,c30c6860-befb-497e-b432-3dba0f86c540,1,0,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,1,0,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,1,0,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,1,0,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,1,0,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,1,0,b53c545c-3b1c-4315-a213-4f2b2c7128aa,b53c545c-3b1c-4315-a213-4f2b2c7128aa,1,0,02a84df9-2171-43e6-8135-a74edd384826,02a84df9-2171-43e6-8135-a74edd384826,1,0,ff36356d-cb1d-4316-896a-c6ae83b92437,ff36356d-cb1d-4316-896a-c6ae83b92437,1,0,465cce6a-7064-4b0a-932c-40f842042f33,465cce6a-7064-4b0a-932c-40f842042f33,1,0,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,1,0,e67dff00-92e2-4f58-a950-d5bbca9291c5,e67dff00-92e2-4f58-a950-d5bbca9291c5,1,0,e1964724-804a-4ecc-be9e-5b84e58f2b84,e1964724-804a-4ecc-be9e-5b84e58f2b84,1,0,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,1,0,bf3cb513-2856-472b-8713-7bf8ba70cdce,bf3cb513-2856-472b-8713-7bf8ba70cdce,1,0,de4815c8-0853-47e0-862b-b60119c674f6,de4815c8-0853-47e0-862b-b60119c674f6,1,0,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,1,0,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,1,0,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,1,0,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,1,0,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,1,0,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,1,0,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,1,0,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,1,0,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,1,0,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,1,0,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,1,0,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,1,0,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,1,0,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,1,0,436b558e-6547-4ba6-8cee-954fe36743ea,436b558e-6547-4ba6-8cee-954fe36743ea,1,0,6120bb6e-b177-48bf-b467-02bab0d4cc0d,6120bb6e-b177-48bf-b467-02bab0d4cc0d,1,0,a5af4715-6c4f-484b-9599-5b1b9147713f,a5af4715-6c4f-484b-9599-5b1b9147713f,1,0,307b6e66-6fef-4777-b20a-37898928932f,307b6e66-6fef-4777-b20a-37898928932f,1,0,a69494c0-dcce-4359-aa82-c1cfae8a43eb,a69494c0-dcce-4359-aa82-c1cfae8a43eb,1,0,2b243d49-5500-403a-b177-ac1c70bb889d,2b243d49-5500-403a-b177-ac1c70bb889d,1,0,51c040c6-e7a4-4e0e-b479-039636fdb6ec,51c040c6-e7a4-4e0e-b479-039636fdb6ec,1,0,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,1,0,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,1,0,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,1,0,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,1,0,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,1,0,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,1,0,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,1,0,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,1,0,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,1,0,5083530c-9a24-4def-99c1-6eb9514e9b33,5083530c-9a24-4def-99c1-6eb9514e9b33,1,0,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,1,0,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,1,0,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,1,0,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,1,0,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,1,0,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,1,0,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,1,0,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,1,0,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,1,0,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,1,0,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,1,0,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,1,0,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,1,0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,1,0,d2160866-78ca-424a-92b9-d389fb341ee0,d2160866-78ca-424a-92b9-d389fb341ee0,1,0,73b36823-72a4-4286-8ee2-02b2f086d5ea,73b36823-72a4-4286-8ee2-02b2f086d5ea,1,0,b09fc04b-94d8-4dea-bf6c-24370f231274,b09fc04b-94d8-4dea-bf6c-24370f231274,1,0,e669a5cd-daf3-4a88-a2c0-380db496a4dd,e669a5cd-daf3-4a88-a2c0-380db496a4dd,1,0,177710c8-2441-4436-a096-64c27aa7aec5,177710c8-2441-4436-a096-64c27aa7aec5,1,0,ab143db8-185b-4093-a3b1-c65322cb8fd6,ab143db8-185b-4093-a3b1-c65322cb8fd6,1,0,e3ce5882-541e-4620-9c24-f00deacc33c2,e3ce5882-541e-4620-9c24-f00deacc33c2,1,0,c9694243-390e-4217-8996-b33924c4fe60,c9694243-390e-4217-8996-b33924c4fe60,1,0,8e08ea9b-8c63-475a-9335-c8edc6214555,8e08ea9b-8c63-475a-9335-c8edc6214555,1,0,19bd6152-7e9c-4710-80c3-c6aa399fe4e9,19bd6152-7e9c-4710-80c3-c6aa399fe4e9,1,0,72846fcc-a9ab-4393-9133-38c1805abab1,72846fcc-a9ab-4393-9133-38c1805abab1,1,0,91a81670-9124-4b65-aecd-77f252249030,91a81670-9124-4b65-aecd-77f252249030,1,0,ed2e5344-9261-4473-86a5-f914b8458cfc,ed2e5344-9261-4473-86a5-f914b8458cfc,1,0,4ff32c59-4ca5-4e60-b54c-f46f757758e2,4ff32c59-4ca5-4e60-b54c-f46f757758e2,1,0,acbc674d-d053-43f4-9d62-86fbbb962ee2,acbc674d-d053-43f4-9d62-86fbbb962ee2,1,0,e0608801-124b-4c52-9a17-9072eb5b676c,e0608801-124b-4c52-9a17-9072eb5b676c,1,0,64e3295e-89c6-4b09-8dc4-b552da47db84,64e3295e-89c6-4b09-8dc4-b552da47db84,1,0,2c1846a5-09f2-414b-b95c-67ed7432ce0e,2c1846a5-09f2-414b-b95c-67ed7432ce0e,1,0,ce339ae7-a794-425b-8d5f-b04fd4b21364,ce339ae7-a794-425b-8d5f-b04fd4b21364,1,0,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,1,0,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,1,0,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,1,0,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,1,0,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,1,0,951927d4-7bfc-4edb-b97f-dcc29a937400,951927d4-7bfc-4edb-b97f-dcc29a937400,1,0,71309e88-d514-40f3-a329-b2a420e75504,71309e88-d514-40f3-a329-b2a420e75504,1,0,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,1,0,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,1,0,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,1,0,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,1,0,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,1,0,fddfb2fd-4d58-4bc6-b196-720425a8c029,fddfb2fd-4d58-4bc6-b196-720425a8c029,1,0,ce075cf1-1778-4671-aa40-166e6c41adc8,ce075cf1-1778-4671-aa40-166e6c41adc8,1,0,eddb111f-7622-44a3-b7d8-97faec67b23c,eddb111f-7622-44a3-b7d8-97faec67b23c,1,0,84872892-842e-4d7d-a3cd-576c42343a7a,84872892-842e-4d7d-a3cd-576c42343a7a,1,0,78ad6047-473d-494b-a2ba-81e062b567e6,78ad6047-473d-494b-a2ba-81e062b567e6,1,0,911f8810-e96e-4f02-9377-47e49919f87e,911f8810-e96e-4f02-9377-47e49919f87e,1,0,cde46d6d-9f8a-45b6-98a7-9411030ccd72,cde46d6d-9f8a-45b6-98a7-9411030ccd72,1,0,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,1,0,224b9439-4b30-4b64-8edf-e7718ee90a7d,224b9439-4b30-4b64-8edf-e7718ee90a7d,1,0,74dc2374-daf1-4a8a-ba10-d3aced96af3b,74dc2374-daf1-4a8a-ba10-d3aced96af3b,1,0,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,1,0,e28e953f-93b3-4d4d-9ee4-c56df26037eb,e28e953f-93b3-4d4d-9ee4-c56df26037eb,1,0,578e0fd2-997c-437a-befc-33d128097a7e,578e0fd2-997c-437a-befc-33d128097a7e,1,0,14089231-31a8-4471-b85b-064836794ff3,14089231-31a8-4471-b85b-064836794ff3,1,0,014de276-fb2f-4deb-873f-475729be0f66,014de276-fb2f-4deb-873f-475729be0f66,1,0,40a60ff7-96ca-485b-a2d9-640a208a7de6,40a60ff7-96ca-485b-a2d9-640a208a7de6,1,0,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,1,0,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,1,0,b9ef62f6-9b1d-4d13-8016-73ed531d195a,b9ef62f6-9b1d-4d13-8016-73ed531d195a,1,0,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,1,0,229fe764-87f5-4d19-b042-c31fef5cddd6,229fe764-87f5-4d19-b042-c31fef5cddd6,1,0,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,1,0,e932800c-fd81-417d-a601-c774b888d66a,e932800c-fd81-417d-a601-c774b888d66a,1,0,a2335b6f-1dbb-4722-979b-8bed83aa8c94,a2335b6f-1dbb-4722-979b-8bed83aa8c94,1,0,211cf921-d880-4f74-b8ee-5312dea28613,211cf921-d880-4f74-b8ee-5312dea28613,1,0,2fd3a396-b8ae-409e-9373-02a039393a80,2fd3a396-b8ae-409e-9373-02a039393a80,1,0,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,1,0,346ef414-b20b-4095-86fe-18ca21c9887f,346ef414-b20b-4095-86fe-18ca21c9887f,1,0,c01ab97b-4964-4f7d-b749-56c0b94feb93,c01ab97b-4964-4f7d-b749-56c0b94feb93,1,0,0cc63813-cf16-4a99-b3bd-18a773091230,0cc63813-cf16-4a99-b3bd-18a773091230,1,0,4fc00971-c980-468a-9690-5cd520d12eb0,4fc00971-c980-468a-9690-5cd520d12eb0,1,0,85972c27-4f39-4982-9307-7877e87ef87b,85972c27-4f39-4982-9307-7877e87ef87b,1,0,96afdffb-7595-4c49-9e86-8296f50bd2f5,96afdffb-7595-4c49-9e86-8296f50bd2f5,1,0,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,1,0,e125d3e0-950f-42ee-8904-bd26091afa55,e125d3e0-950f-42ee-8904-bd26091afa55,1,0,2b4797a5-074a-4a01-b99f-1c5590cfde40,2b4797a5-074a-4a01-b99f-1c5590cfde40,1,0,718e53d2-24ec-40fb-9def-825441ada46c,718e53d2-24ec-40fb-9def-825441ada46c,1,0,4c0a7fd6-8f09-41d6-949f-65ce708c1256,4c0a7fd6-8f09-41d6-949f-65ce708c1256,1,0,792abc06-b52a-4691-ba92-96ed73ca702a,792abc06-b52a-4691-ba92-96ed73ca702a,1,0,148dbe44-86d1-4362-b9db-8ff68cd2b34d,148dbe44-86d1-4362-b9db-8ff68cd2b34d,1,0,1fbc893e-3000-4fac-88f5-c82251835d65,1fbc893e-3000-4fac-88f5-c82251835d65,1,0,05852816-63ec-4179-abca-66372bbfb04c,05852816-63ec-4179-abca-66372bbfb04c,1,0,0165f721-b011-4524-bfd5-81e35092f2be,0165f721-b011-4524-bfd5-81e35092f2be,1,0,e74925d4-1979-4600-8560-0932d26450ad,e74925d4-1979-4600-8560-0932d26450ad,1,0,aa108131-151d-4356-8a24-345e4ec74281,aa108131-151d-4356-8a24-345e4ec74281,1,0,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,1,0,e3251f1a-3c80-4c86-9960-270920bd512f,e3251f1a-3c80-4c86-9960-270920bd512f,1,0,3c3d5474-977b-4df9-88de-042e997bd10d,3c3d5474-977b-4df9-88de-042e997bd10d,1,0,4b88d172-5a44-4011-bb38-e94bf7a9c879,4b88d172-5a44-4011-bb38-e94bf7a9c879,1,0,3bced2d4-e3d7-4489-a26d-f84620b096f4,3bced2d4-e3d7-4489-a26d-f84620b096f4,1,0,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,1,0,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,1,0,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,1,0,18436045-1008-4114-8032-274fea0f4627,18436045-1008-4114-8032-274fea0f4627,1,0,cad93727-cffb-44a6-aaee-be73a078e802,cad93727-cffb-44a6-aaee-be73a078e802,1,0,c034f410-ff8e-45d7-925f-94448f88a7af,c034f410-ff8e-45d7-925f-94448f88a7af,1,0,0027727b-3917-4010-9953-1649266e8ed7,0027727b-3917-4010-9953-1649266e8ed7,1,0,b088786a-046f-458c-8e7a-5bebf8df8b34,b088786a-046f-458c-8e7a-5bebf8df8b34,1,0,6d015113-1e32-4f5e-aacd-8134d7307125,6d015113-1e32-4f5e-aacd-8134d7307125,1,0,58230238-d2f2-422e-90cb-de355996eb19,58230238-d2f2-422e-90cb-de355996eb19,1,0,3d907678-628d-4fb2-85c2-149839024c08,3d907678-628d-4fb2-85c2-149839024c08,1,0,71384d10-6acf-4139-b766-cb8b5796f1a7,71384d10-6acf-4139-b766-cb8b5796f1a7,1,0,a8f149d7-e9bc-4695-b4f4-88434e31aafb,a8f149d7-e9bc-4695-b4f4-88434e31aafb,1,0,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,1,0,11ba510f-cb57-43d0-9897-c49e10b67ccd,11ba510f-cb57-43d0-9897-c49e10b67ccd,1,0,9d92af67-c88d-4429-9e85-0b5bf04c4b79,9d92af67-c88d-4429-9e85-0b5bf04c4b79,1,0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,1,0,43523bbb-c923-4a20-bcb5-50d30cc826ee,43523bbb-c923-4a20-bcb5-50d30cc826ee,1,0,c89d9aad-3364-45df-88b5-b23ae76edbba,c89d9aad-3364-45df-88b5-b23ae76edbba,1,0,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,1,0,7e4b9dce-e332-4d35-8b5f-d3f88918989d,7e4b9dce-e332-4d35-8b5f-d3f88918989d,1,0,96fe619a-b819-4f96-9788-e1f4ef57833a,96fe619a-b819-4f96-9788-e1f4ef57833a,1,0,94dff2da-f721-411a-9fc0-5d013b685dcc,94dff2da-f721-411a-9fc0-5d013b685dcc,1,0,9343fc5f-7b08-4be5-8cd5-dbed635b819d,9343fc5f-7b08-4be5-8cd5-dbed635b819d,1,0,99e87e66-1b07-451b-a476-f5213cbd7150,99e87e66-1b07-451b-a476-f5213cbd7150,1,0,c3317f75-f6ad-41f6-97f1-77074c3ff62a,c3317f75-f6ad-41f6-97f1-77074c3ff62a,1,0,8800dec9-84f8-4643-8742-1d76fe575f58,8800dec9-84f8-4643-8742-1d76fe575f58,1,0,62903794-3b41-4d21-b800-1c26dbeda3ce,62903794-3b41-4d21-b800-1c26dbeda3ce,1,0,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,1,0,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,1,0,93de88de-0069-4aa8-96b2-d5709e4def2f,93de88de-0069-4aa8-96b2-d5709e4def2f,1,0,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,1,0,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,1,0,3a8d9010-8785-4d8d-b908-b821d7d681c9,3a8d9010-8785-4d8d-b908-b821d7d681c9,1,0,2568a935-ea49-4b99-aa9c-de27de6a0e81,2568a935-ea49-4b99-aa9c-de27de6a0e81,1,0,de2bdd4f-93f2-4341-86d6-7082fc286a5c,de2bdd4f-93f2-4341-86d6-7082fc286a5c,1,0,ba96ec0e-931e-45be-a782-e68ba4fedddb,ba96ec0e-931e-45be-a782-e68ba4fedddb,1,0,9af5882f-3a42-4fae-83df-6aa8de577112,9af5882f-3a42-4fae-83df-6aa8de577112,1,0,79bc5e39-3017-48bf-8e42-fa34e8b581ef,79bc5e39-3017-48bf-8e42-fa34e8b581ef,1,0,fe6e207f-d306-4470-8441-ffd3f3710d31,fe6e207f-d306-4470-8441-ffd3f3710d31,1,0,7451af80-7387-4e8d-a3da-2ae0540c3fd4,7451af80-7387-4e8d-a3da-2ae0540c3fd4,1,0,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1,0,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,1,0,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,1,0,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,1,0,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,1,0,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,1,0,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,1,0,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,1,0,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,1,0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,1,0,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,1,0,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,1,0,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,1,0,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1,0,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,1,0,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,1,0,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,1,0,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,1,0,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,1,0,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,1,0,b67b872e-236a-4ea7-9838-0827234867b4,b67b872e-236a-4ea7-9838-0827234867b4,1,0,1e5ced23-48a7-4f3c-aa3b-78399a2b9e2b,1e5ced23-48a7-4f3c-aa3b-78399a2b9e2b,1,0,ce422d4f-1221-4ebf-a801-975a3220a226,ce422d4f-1221-4ebf-a801-975a3220a226,1,0,8735949b-f259-48b9-97e9-a81dfc7dcc8d,8735949b-f259-48b9-97e9-a81dfc7dcc8d,1,0,b8810612-dc7a-4a45-a83c-163a8669b578,b8810612-dc7a-4a45-a83c-163a8669b578,1,0,00e4dc17-b984-4f45-8b42-2e6a7a5dbced,00e4dc17-b984-4f45-8b42-2e6a7a5dbced,1,0,349c3dc3-0729-41f3-983f-3b13170c6509,349c3dc3-0729-41f3-983f-3b13170c6509,1,0,8281df26-4bde-47ba-926e-f22a8042bf1f,8281df26-4bde-47ba-926e-f22a8042bf1f,1,0,7278fb66-1d48-4c1d-bd15-425f78ad0c32,7278fb66-1d48-4c1d-bd15-425f78ad0c32,1,0,6893007f-8354-4b3b-b205-7c7d385cbde0,6893007f-8354-4b3b-b205-7c7d385cbde0,1,0,d74365a3-b434-41d0-84a7-543c336b5880,d74365a3-b434-41d0-84a7-543c336b5880,1,0,3d42502a-5705-49d7-b4ed-29edbd6306bc,3d42502a-5705-49d7-b4ed-29edbd6306bc,1,0,221e24e6-b31c-45b6-8835-2ad08d595c5f,221e24e6-b31c-45b6-8835-2ad08d595c5f,1,0,fd0fa6c9-1f42-4907-a266-fe7b6847e58a,fd0fa6c9-1f42-4907-a266-fe7b6847e58a,1,0,2e8cbcd7-f5b5-471e-863a-e09b4bc8e163,2e8cbcd7-f5b5-471e-863a-e09b4bc8e163,1,0,55956063-b227-4c74-8d9c-4a62b4f0dbc7,55956063-b227-4c74-8d9c-4a62b4f0dbc7,1,0,b6871b83-7269-43a9-b9a6-a195ff93365d,b6871b83-7269-43a9-b9a6-a195ff93365d,1,0,7dcd627c-16f6-41f9-b474-590ad1c7d2ed,7dcd627c-16f6-41f9-b474-590ad1c7d2ed,1,0,0cf89f30-e702-4c9e-8af4-888634463b99,0cf89f30-e702-4c9e-8af4-888634463b99,1,0,77f890ac-3c9c-4043-a5b7-12158772bcf5,77f890ac-3c9c-4043-a5b7-12158772bcf5,1,0,2bc734f9-8c0d-473a-b1c3-340395069501,2bc734f9-8c0d-473a-b1c3-340395069501,1,0,316c3933-21dd-4e8a-9450-0900e85ef7e2,316c3933-21dd-4e8a-9450-0900e85ef7e2,1,0,994fe78b-9f61-4aaf-9355-fafcae6b816d,994fe78b-9f61-4aaf-9355-fafcae6b816d,1,0,8448f07b-751b-4670-b44c-3564e81e5cdc,8448f07b-751b-4670-b44c-3564e81e5cdc,1,0,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,1,0,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,1,0,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,1,0,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,1,0,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,1,0,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,1,0,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,1,0,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,1,0,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,1,0,ee0412d3-58e7-4715-8774-d49778e1ef73,ee0412d3-58e7-4715-8774-d49778e1ef73,1,0,ea31df21-1402-417a-9788-b17a7116e842,ea31df21-1402-417a-9788-b17a7116e842,1,0,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,1,0,e964753f-7f4c-4f9f-bd17-cdac317c1d35,e964753f-7f4c-4f9f-bd17-cdac317c1d35,1,0,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,1,0,43c22498-3fd6-4038-a291-05f0db9ab66a,43c22498-3fd6-4038-a291-05f0db9ab66a,1,0,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,1,0,ee6e5e56-5848-46b6-89bf-b9345a57d94c,ee6e5e56-5848-46b6-89bf-b9345a57d94c,1,0,8817c872-bdee-4577-bcc3-4046edc72803,8817c872-bdee-4577-bcc3-4046edc72803,1,0,5b88c214-4e4e-45c2-b8c5-14eb852e9900,5b88c214-4e4e-45c2-b8c5-14eb852e9900,1,0,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,1,0,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,1,0,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,1,0,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,1,0,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,1,0,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,1,0,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,1,0,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,1,0,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1,0,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,1,0,483720db-6c9e-4179-b5c7-56159c9b6073,483720db-6c9e-4179-b5c7-56159c9b6073,1,0,1725c619-9c4a-40ac-9044-00fee71945a4,1725c619-9c4a-40ac-9044-00fee71945a4,1,0,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,1,0,e95b126d-797d-4071-b7b4-b14aaf595f2d,e95b126d-797d-4071-b7b4-b14aaf595f2d,1,0,9241ea3c-633f-4469-9e70-c5a20e464da8,9241ea3c-633f-4469-9e70-c5a20e464da8,1,0,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,1,0,961ae0fb-7f7b-414d-8fbf-32b893b41085,961ae0fb-7f7b-414d-8fbf-32b893b41085,1,0,10adf8c8-6f5f-477f-b244-4452b774b766,10adf8c8-6f5f-477f-b244-4452b774b766,1,0,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,1,0,04ec5e44-8469-4e9c-8021-83d258f2ec54,04ec5e44-8469-4e9c-8021-83d258f2ec54,1,0,cff36ede-0bd1-424b-8c75-b9695133f32e,cff36ede-0bd1-424b-8c75-b9695133f32e,1,0,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,1,0,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,1,0,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,1,0,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,1,0,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,1,0,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,1,0,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,1,0,6a675752-fd31-46a5-8a62-2a1ede437c68,6a675752-fd31-46a5-8a62-2a1ede437c68,1,0,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,1,0,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,1,0,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,1,0,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,1,0,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,1,0,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,1,0,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,1,0,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,1,0,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,1,0,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,1,0,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,1,0,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,1,0,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,1,0,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,1,0,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,1,0,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,1,0,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,1,0,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,1,0,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,1,0,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,1,0,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,1,0,2b94076d-39ee-45ad-9ba5-435115cf5d4f,2b94076d-39ee-45ad-9ba5-435115cf5d4f,1,0,72ace16c-e90a-4d05-bc23-4351d4c87683,72ace16c-e90a-4d05-bc23-4351d4c87683,1,0,bd86e378-84bb-486a-be7b-319a3fe3b70b,bd86e378-84bb-486a-be7b-319a3fe3b70b,1,0,ef3bc279-6721-4949-8dc0-f96141f7f05c,ef3bc279-6721-4949-8dc0-f96141f7f05c,1,0,f81c7e21-48ad-4b64-975d-e62d34c7235a,f81c7e21-48ad-4b64-975d-e62d34c7235a,1,0,d0523c14-585e-45d3-9735-891235631004,d0523c14-585e-45d3-9735-891235631004,1,0,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,1,0,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,1,0,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,1,0,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,1,0,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,1,0,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,1,0,45af8f5d-d505-466b-a798-19f2219a180c,45af8f5d-d505-466b-a798-19f2219a180c,1,0,8a8229bc-f70a-4434-bacc-8a81fc58154b,8a8229bc-f70a-4434-bacc-8a81fc58154b,1,0,6324ad14-82ca-467b-b6b7-8d5f6049ca65,6324ad14-82ca-467b-b6b7-8d5f6049ca65,1,0,273446f0-f28b-4ce2-874c-3c6a57299b71,273446f0-f28b-4ce2-874c-3c6a57299b71,1,0,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,1,0,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,1,0,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,1,0,7a4e17bf-3649-4982-a9c6-5982390f1f1d,7a4e17bf-3649-4982-a9c6-5982390f1f1d,1,0,722be6e0-2698-431b-9206-777a36e6742f,722be6e0-2698-431b-9206-777a36e6742f,1,0,75bb0122-26bd-40be-8de8-7a57680c85ae,75bb0122-26bd-40be-8de8-7a57680c85ae,1,0,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,1,0,0153e60e-daca-48ac-b1c6-adecc89f579e,0153e60e-daca-48ac-b1c6-adecc89f579e,1,0,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1,0,a896bc34-30a6-48b6-acfc-786c24c186bd,a896bc34-30a6-48b6-acfc-786c24c186bd,1,0,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,1,0,da8ae00a-7207-4ceb-b739-9114888c5b27,da8ae00a-7207-4ceb-b739-9114888c5b27,1,0,a6be80f7-d6aa-4371-a180-3d355080d849,a6be80f7-d6aa-4371-a180-3d355080d849,1,0,b37722c3-e29f-4a40-b4eb-0317919fc7a5,b37722c3-e29f-4a40-b4eb-0317919fc7a5,1,0,b1b1cd90-094d-428b-a6bc-156521c1c54d,b1b1cd90-094d-428b-a6bc-156521c1c54d,1,0,4f79ef7c-79be-4a69-acc0-bd591c712d03,4f79ef7c-79be-4a69-acc0-bd591c712d03,1,0,a0dd2129-d3a1-4bca-b555-72b065be1c13,a0dd2129-d3a1-4bca-b555-72b065be1c13,1,0,dc5e8229-e301-477c-846e-2e7078e3ee5f,dc5e8229-e301-477c-846e-2e7078e3ee5f,1,0,24836e44-8fdd-44bd-91d8-4ddab2caf485,24836e44-8fdd-44bd-91d8-4ddab2caf485,1,0,3727bcfe-4d75-4270-86e7-4a66ab14866c,3727bcfe-4d75-4270-86e7-4a66ab14866c,1,0,870a4708-0b5a-4fa3-9978-d94b161d289a,870a4708-0b5a-4fa3-9978-d94b161d289a,1,0,30e9f89d-7b94-488e-9963-886c271b1af7,30e9f89d-7b94-488e-9963-886c271b1af7,1,0,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,1,0,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1,0,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,1,0,9693cc78-852e-445b-a7d2-f1689fa9eeec,9693cc78-852e-445b-a7d2-f1689fa9eeec,1,0,eb33e555-db41-462a-a45d-c7e0945cece8,eb33e555-db41-462a-a45d-c7e0945cece8,1,0,9cfd517c-1008-483a-9f65-7d15feb2cefc,9cfd517c-1008-483a-9f65-7d15feb2cefc,1,0,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,1,0,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,1,0,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,1,0,1d76f613-f4f6-4772-8c16-d97b3104a553,1d76f613-f4f6-4772-8c16-d97b3104a553,1,0,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,1,0,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,1,0,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,1,0,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,1,0,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,1,0,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,1,0,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,1,0,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,1,0,2d279d24-1953-4a2f-8206-77481d2fd718,2d279d24-1953-4a2f-8206-77481d2fd718,1,0,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,1,0,0a920200-77d0-42ea-abf6-0d40d63289b0,0a920200-77d0-42ea-abf6-0d40d63289b0,1,0,c850bafc-4073-44ef-b148-194f87c46f0e,c850bafc-4073-44ef-b148-194f87c46f0e,1,0,6d1dd726-815d-476e-b668-95cff4182e54,6d1dd726-815d-476e-b668-95cff4182e54,1,0,12f4a0ed-4798-4467-8834-de3eb385e22d,12f4a0ed-4798-4467-8834-de3eb385e22d,1,0,5710809e-4c41-42ab-952f-f7778fe9be0f,5710809e-4c41-42ab-952f-f7778fe9be0f,1,0,0811f6c2-6bb3-43b8-9944-910adc4c6f23,0811f6c2-6bb3-43b8-9944-910adc4c6f23,1,0,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,1,0,c86b02ab-3532-4f4c-b993-e237ed0d4d12,c86b02ab-3532-4f4c-b993-e237ed0d4d12,1,0,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,1,0,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,1,0,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,1,0,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,1,0,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,1,0,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,1,0,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,1,0,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,1,0,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,1,0,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,1,0,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,1,0,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,1,0,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,1,0,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,1,0,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,1,0,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,1,0,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,1,0,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,1,0,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,1,0,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,1,0,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,1,0,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,1,0,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,1,0,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,1,0,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,1,0,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,1,0,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,1,0,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,1,0,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,1,0,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,1,0,32eb2a75-ff35-4795-bf0c-12b1328441ee,32eb2a75-ff35-4795-bf0c-12b1328441ee,1,0,8e877990-a64c-4c45-91f1-007d47618cc7,8e877990-a64c-4c45-91f1-007d47618cc7,1,0,73c6640e-2fe6-4132-9237-d6f28cbacc1c,73c6640e-2fe6-4132-9237-d6f28cbacc1c,1,0,69489064-c131-4618-b31f-e6964d593f4a,69489064-c131-4618-b31f-e6964d593f4a,1,0,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,1,0,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,1,0,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,1,0,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,1,0,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,1,0,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,1,0,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,1,0,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,1,0,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,1,0,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,1,0,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,1,0,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,1,0,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,1,0,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,1,0,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,1,0,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,1,0,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,1,0,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,1,0,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,1,0,bd0e4aeb-19f9-48fc-b838-38d785004360,bd0e4aeb-19f9-48fc-b838-38d785004360,1,0,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,1,0,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,1,0,6d351276-2c04-4198-a3e4-865881c12f5c,6d351276-2c04-4198-a3e4-865881c12f5c,1,0,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,1,0,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,1,0,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,1,0,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,1,0,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,1,0,61b947a5-edca-43ca-82c4-5a7b529d8f82,61b947a5-edca-43ca-82c4-5a7b529d8f82,1,0,59eb6a7a-1d96-4985-8d8e-575162759415,59eb6a7a-1d96-4985-8d8e-575162759415,1,0,68564573-ed49-4519-a8b3-997865fe70a6,68564573-ed49-4519-a8b3-997865fe70a6,1,0,6c789969-d066-489d-ad88-92e2a5a6ec69,6c789969-d066-489d-ad88-92e2a5a6ec69,1,0,2a07d696-75d6-4a12-a310-30d6598b4a4c,2a07d696-75d6-4a12-a310-30d6598b4a4c,1,0,dde88f56-417c-4559-a893-85dc91e7e623,dde88f56-417c-4559-a893-85dc91e7e623,1,0,963eedab-6976-4a98-b9ad-b81f89239661,963eedab-6976-4a98-b9ad-b81f89239661,1,0,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,1,0,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,1,0,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,1,0,afde7867-15d3-43fa-b439-6d9e40df580b,afde7867-15d3-43fa-b439-6d9e40df580b,1,0,a676ff94-a0d1-4de9-8690-ec67f2c891d8,a676ff94-a0d1-4de9-8690-ec67f2c891d8,1,0,012bf716-3672-462e-b390-7bb4384ab4b1,012bf716-3672-462e-b390-7bb4384ab4b1,1,0,65342599-ff37-4f99-8e40-f05d87403bcf,65342599-ff37-4f99-8e40-f05d87403bcf,1,0,3a3f505a-7a50-4111-8029-5b9057fed232,3a3f505a-7a50-4111-8029-5b9057fed232,1,0,36baa776-83c4-413d-b70c-cbbc45e25662,36baa776-83c4-413d-b70c-cbbc45e25662,1,0,b65f9165-c20d-4053-8a0b-cff3f693b762,b65f9165-c20d-4053-8a0b-cff3f693b762,1,0,51af096b-687f-44f4-a0d8-306f670fc5ce,51af096b-687f-44f4-a0d8-306f670fc5ce,1,0,75972f88-aedd-4338-a3b5-320cd632a2e6,75972f88-aedd-4338-a3b5-320cd632a2e6,1,0,1363523a-929e-49ac-ae39-d43acf9f0478,1363523a-929e-49ac-ae39-d43acf9f0478,1,0,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,1,0,2876c476-8280-426d-8bf9-c93beda0ddd5,2876c476-8280-426d-8bf9-c93beda0ddd5,1,0,963e0813-4f6b-4d31-b66d-77125c47ce19,963e0813-4f6b-4d31-b66d-77125c47ce19,1,0,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,1,0,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,1,0,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,1,0,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,1,0,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,1,0,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,1,0,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,1,0,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,1,0,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,1,0,ebedc283-5eb0-459b-b686-f8643666b8b8,ebedc283-5eb0-459b-b686-f8643666b8b8,1,0,6a6afffd-cfed-4801-8b59-34d27e46565c,6a6afffd-cfed-4801-8b59-34d27e46565c,1,0,a469b12d-4537-419c-91e0-37abc9d31505,a469b12d-4537-419c-91e0-37abc9d31505,1,0,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,1,0,82c42232-531e-403f-8599-cc21a248fa2c,82c42232-531e-403f-8599-cc21a248fa2c,1,0,9104b791-9ac4-41ba-a7f0-9e609db3b578,9104b791-9ac4-41ba-a7f0-9e609db3b578,1,0,2d3721d1-816f-4e84-9df1-863cb269d83d,2d3721d1-816f-4e84-9df1-863cb269d83d,1,0,73554821-8ab5-44ab-a593-37ca10a1b777,73554821-8ab5-44ab-a593-37ca10a1b777,1,0,d5a98e02-e199-445e-8d53-11acd07f473f,d5a98e02-e199-445e-8d53-11acd07f473f,1,0,79db55d6-e916-4bde-b417-7d0a53bb85af,79db55d6-e916-4bde-b417-7d0a53bb85af,1,0,3084fb99-59cb-4338-ae37-0b1e8b333f01,3084fb99-59cb-4338-ae37-0b1e8b333f01,1,0,818a1fbf-17c1-44f9-8e20-27d4ceda549c,818a1fbf-17c1-44f9-8e20-27d4ceda549c,1,0,959a5d25-03e5-4911-bbb7-b93714db7eed,959a5d25-03e5-4911-bbb7-b93714db7eed,1,0,1d0b6a8d-9351-4ce2-85dd-6ac508c660c2,1d0b6a8d-9351-4ce2-85dd-6ac508c660c2,1,0,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,1,0,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,1,0,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,1,0,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,1,0,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,1,0,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,1,0,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,1,0,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,1,0,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,1,0,f0b0608c-178f-4dea-b461-0d8f00d79d30,f0b0608c-178f-4dea-b461-0d8f00d79d30,1,0,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,1,0,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,1,0,5546b9a9-a4fe-4a2b-9492-883bcb37a210,5546b9a9-a4fe-4a2b-9492-883bcb37a210,1,0,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,1,0,275a5772-8428-497a-81ef-c919f15fcccd,275a5772-8428-497a-81ef-c919f15fcccd,1,0,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,1,0,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,1,0,10336352-f3a1-4bc3-bdec-1a2eef15f176,10336352-f3a1-4bc3-bdec-1a2eef15f176,1,0,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,1,0,3b7c713e-81ae-4adc-9519-99c936599ef7,3b7c713e-81ae-4adc-9519-99c936599ef7,1,0,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1,0,ecda2c4b-6411-4b47-ab59-1918bad5acdd,ecda2c4b-6411-4b47-ab59-1918bad5acdd,1,0,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,1,0,0c24858a-7e64-426f-9b59-392449aecaf5,0c24858a-7e64-426f-9b59-392449aecaf5,1,0,b1d61e28-f3dc-418b-b5df-f75622a4b980,b1d61e28-f3dc-418b-b5df-f75622a4b980,1,0,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,1,0,4033f86b-d250-475a-8837-071bf31664b0,4033f86b-d250-475a-8837-071bf31664b0,1,0,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,1,0,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,1,0,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,1,0,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,1,0,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,1,0,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,1,0,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,1,0,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,1,0,b5ea4aff-11be-4232-94a2-cb92801b6c49,b5ea4aff-11be-4232-94a2-cb92801b6c49,1,0,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,1,0,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,1,0,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,1,0,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,1,0,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,1,0,0544376f-461c-42c3-a102-e0ae65e3c0c6,0544376f-461c-42c3-a102-e0ae65e3c0c6,1,0,6df8d316-6ac3-4626-8951-1ad36d7049ed,6df8d316-6ac3-4626-8951-1ad36d7049ed,1,0,f211b418-899d-4220-a14b-4a7302183e46,f211b418-899d-4220-a14b-4a7302183e46,1,0,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,1,0,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,1,0,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,1,0,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,1,0,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,1,0,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,1,0,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,1,0,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,1,0,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,1,0,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,1,0,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,1,0,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,1,0,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,1,0,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,1,0,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,1,0,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,1,0,e5094d4f-ee61-4142-a97b-d96172350f65,e5094d4f-ee61-4142-a97b-d96172350f65,1,0,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,1,0,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,1,0,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,1,0,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,1,0,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,1,0,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,1,0,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,1,0,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,1,0,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,1,0,20c57e30-5856-4801-9e77-8006471d89f8,20c57e30-5856-4801-9e77-8006471d89f8,1,0,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,1,0,4a3fe393-8aea-4394-8c10-a234f1f191ad,4a3fe393-8aea-4394-8c10-a234f1f191ad,1,0,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,1,0,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,1,0,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,1,0,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,1,0,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,1,0,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,1,0,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,1,0,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,1,0,fd271670-bde6-4351-abec-eb82548c6c98,fd271670-bde6-4351-abec-eb82548c6c98,1,0,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,1,0,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,1,0,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,1,0,799b3dda-fbfc-4dea-a577-30321e64f4d5,799b3dda-fbfc-4dea-a577-30321e64f4d5,1,0,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,1,0,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,1,0,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,1,0,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,1,0,05ee4a7c-63e6-4587-8be7-e206345e3471,05ee4a7c-63e6-4587-8be7-e206345e3471,1,0,98d5e98b-0382-4b28-a5d9-24392925664a,98d5e98b-0382-4b28-a5d9-24392925664a,1,0,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,1,0,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,1,0,19a18193-c5d3-4e56-86c5-5a81c525e9ad,19a18193-c5d3-4e56-86c5-5a81c525e9ad,1,0,c208fcc0-d7b2-435b-963a-e18c97727f8f,c208fcc0-d7b2-435b-963a-e18c97727f8f,1,0,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,1,0,bf11f7b1-6332-4499-ba48-b94bc10ef869,bf11f7b1-6332-4499-ba48-b94bc10ef869,1,0,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,1,0,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,1,0,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,1,0,479d9428-02fd-47d2-a869-a3695b315724,479d9428-02fd-47d2-a869-a3695b315724,1,0,838b4840-86e3-4bf3-8b95-1e58ef60e97a,838b4840-86e3-4bf3-8b95-1e58ef60e97a,1,0,36d258b5-bfda-4b40-88a8-1e0abf351805,36d258b5-bfda-4b40-88a8-1e0abf351805,1,0,cc95b010-ca42-4b54-9c50-0551b2c690ed,cc95b010-ca42-4b54-9c50-0551b2c690ed,1,0,829fb3c0-6d96-4765-adc6-f177344a4a33,829fb3c0-6d96-4765-adc6-f177344a4a33,1,0,9241e7fe-e3e8-4ddd-ac6c-4edb1a1b2f71,9241e7fe-e3e8-4ddd-ac6c-4edb1a1b2f71,1,0,05c27c89-2c26-4252-842d-9aa43ba0ea2f,05c27c89-2c26-4252-842d-9aa43ba0ea2f,1,0,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,1,0,f092729c-6b5d-4709-8b28-15e06129731d,f092729c-6b5d-4709-8b28-15e06129731d,1,0,c03be2f7-d681-417d-975a-5c8c7b716659,c03be2f7-d681-417d-975a-5c8c7b716659,1,0,fca7af5f-bdc0-4264-be68-5e5e38545368,fca7af5f-bdc0-4264-be68-5e5e38545368,1,0,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,1,0,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,1,0,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,1,0,d392a791-af74-40c9-ab20-6ed6aeabe864,d392a791-af74-40c9-ab20-6ed6aeabe864,1,0,0b7cee9b-3870-49f5-a58e-063cf5353467,0b7cee9b-3870-49f5-a58e-063cf5353467,1,0,1612570d-b069-405a-9dd3-80b8175fb468,1612570d-b069-405a-9dd3-80b8175fb468,1,0,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,1,0,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,1,0,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,1,0,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,1,0,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,1,0,561ed574-617d-4a46-b32b-f022e07846c8,561ed574-617d-4a46-b32b-f022e07846c8,1,0,cba706bf-a9a7-4dda-9c5a-a26e85119396,cba706bf-a9a7-4dda-9c5a-a26e85119396,1,0,159a4eb5-00cd-426c-86e3-09cd3f569f22,159a4eb5-00cd-426c-86e3-09cd3f569f22,1,0,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,1,0,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,1,0,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,1,0,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,1,0,2ded5135-b6c3-46dd-b563-7b6fab986d23,2ded5135-b6c3-46dd-b563-7b6fab986d23,1,0,14215720-ccb3-4e5a-8345-cd42c96a3e77,14215720-ccb3-4e5a-8345-cd42c96a3e77,1,0,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,1,0,0690a5c7-bc25-4101-afa5-69c095d415c2,0690a5c7-bc25-4101-afa5-69c095d415c2,1,0,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,1,0,79013bba-a0f2-481c-a63e-095a54ee52aa,79013bba-a0f2-481c-a63e-095a54ee52aa,1,0,8523c346-f144-41b8-a702-2d588e7097c2,8523c346-f144-41b8-a702-2d588e7097c2,1,0,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,1,0,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,1,0,fa2bd6a6-bb46-4e21-8684-248578310164,fa2bd6a6-bb46-4e21-8684-248578310164,1,0,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,1,0,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,1,0,88ccac36-169d-48f8-bc68-15e3bb775b79,88ccac36-169d-48f8-bc68-15e3bb775b79,1,0,a1640988-bd60-43b3-86f1-184b9db275c6,a1640988-bd60-43b3-86f1-184b9db275c6,1,0,300a02f7-8062-4843-b11e-0321f8b40f4d,300a02f7-8062-4843-b11e-0321f8b40f4d,1,0,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,1,0,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,1,0,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,1,0,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,1,0,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,1,0,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,1,0,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,1,0,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,1,0,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,1,0,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,1,0,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,1,0,2d942a50-b239-4b8c-812a-5a634f5dcaef,2d942a50-b239-4b8c-812a-5a634f5dcaef,1,0,8ab0c61d-85b4-47e3-aca1-1890e4c6ec8d,8ab0c61d-85b4-47e3-aca1-1890e4c6ec8d,1,0,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,1,0,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,1,0,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,1,0,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,1,0,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,1,0,fc67b510-3fb4-4305-92d2-c252bc718f03,fc67b510-3fb4-4305-92d2-c252bc718f03,1,0,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,1,0,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,1,0,cf1f7915-94ad-47e7-8676-73271d0cf71e,cf1f7915-94ad-47e7-8676-73271d0cf71e,1,0,fceb6e4a-bd51-4193-a542-70d2317af669,fceb6e4a-bd51-4193-a542-70d2317af669,1,0,80847d57-1795-46c7-a106-926e1f43ac1e,80847d57-1795-46c7-a106-926e1f43ac1e,1,0,38685415-dc87-48b4-8cc4-f85b438f2ec2,38685415-dc87-48b4-8cc4-f85b438f2ec2,1,0,110eff8b-aeec-4ba5-b710-fefc1bd60284,110eff8b-aeec-4ba5-b710-fefc1bd60284,1,0,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,1,0,75eca481-002b-4046-898d-dfac9357611f,75eca481-002b-4046-898d-dfac9357611f,1,0,0110decc-d06e-43cf-9d01-30d412edcdd7,0110decc-d06e-43cf-9d01-30d412edcdd7,1,0,3ea32a24-d37b-4fad-937a-9d1357d649a9,3ea32a24-d37b-4fad-937a-9d1357d649a9,1,0,2856ee9a-0fea-4684-b7b8-4844773eae07,2856ee9a-0fea-4684-b7b8-4844773eae07,1,0,fae4675c-dcdc-42fc-911d-07c3c577b8b8,fae4675c-dcdc-42fc-911d-07c3c577b8b8,1,0,f1050611-4f82-411b-97f2-bcd8a5c914bf,f1050611-4f82-411b-97f2-bcd8a5c914bf,1,0,efacf22d-b474-4d49-af8b-6d3784aa5cf2,efacf22d-b474-4d49-af8b-6d3784aa5cf2,1,0,f818b937-9ac3-4a0c-ba50-26c060984f09,f818b937-9ac3-4a0c-ba50-26c060984f09,1,0,f385778d-96cb-4e09-884d-533739b393b1,f385778d-96cb-4e09-884d-533739b393b1,1,0,5bdaa783-e965-4d59-b7b7-a1e86ddb89f7,5bdaa783-e965-4d59-b7b7-a1e86ddb89f7,1,0,7bf36370-3761-4fd5-bea5-90fa142a9d57,7bf36370-3761-4fd5-bea5-90fa142a9d57,1,0,3b81427f-cf64-4a5e-adb3-5415d515fecd,3b81427f-cf64-4a5e-adb3-5415d515fecd,1,0,e9f2b604-7181-476d-8b34-3a544cbb353d,e9f2b604-7181-476d-8b34-3a544cbb353d,1,0,73773919-d01c-41dd-bb31-9c66648ac0ff,73773919-d01c-41dd-bb31-9c66648ac0ff,1,0,5d1afad0-3d7e-4214-b52a-72c184490084,5d1afad0-3d7e-4214-b52a-72c184490084,1,0,5f7901a1-f992-42fa-9ddb-d63574da3b56,5f7901a1-f992-42fa-9ddb-d63574da3b56,1,0,26abd45a-12b3-4312-88fb-53c90a6e6679,26abd45a-12b3-4312-88fb-53c90a6e6679,1,0,1541ad74-3e73-4699-bccf-c13313fbedfe,1541ad74-3e73-4699-bccf-c13313fbedfe,1,0,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1,0,0b2356a4-5571-4ba0-9095-265106f2b3b3,0b2356a4-5571-4ba0-9095-265106f2b3b3,1,0,a2581834-dde8-439a-8204-6712c829738e,a2581834-dde8-439a-8204-6712c829738e,1,0,222985c4-fe09-44d1-a1c5-5a3e3cedd9b2,222985c4-fe09-44d1-a1c5-5a3e3cedd9b2,1,0,c746a268-815b-4917-8b06-af745ba9db04,c746a268-815b-4917-8b06-af745ba9db04,1,0,5cc01f13-0faa-4c3c-8e5e-156656f71efd,5cc01f13-0faa-4c3c-8e5e-156656f71efd,1,0,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,1,0,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,1,0,be2b4dba-e77e-4947-bd2f-0710b357ca2a,be2b4dba-e77e-4947-bd2f-0710b357ca2a,1,0,86182e9a-89e0-40d7-b2d7-fcd92ee42942,86182e9a-89e0-40d7-b2d7-fcd92ee42942,1,0,df750e63-50fc-4085-b8b8-f05e4751ff51,df750e63-50fc-4085-b8b8-f05e4751ff51,1,0,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,1,0,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,1,0,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,1,0,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,1,0,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,1,0,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,1,0,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,1,0,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,1,0,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,1,0,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,1,0,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,1,0,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,1,0,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,1,0,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,1,0,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,1,0,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,1,0,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,1,0,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,1,0,4770398f-8013-4d43-93ce-ec1165e40c4e,4770398f-8013-4d43-93ce-ec1165e40c4e,1,0,9a706997-90cb-430d-972c-d2bad87c4a79,9a706997-90cb-430d-972c-d2bad87c4a79,1,0,6f661660-b9c4-41d4-99a8-e08006cfe9c8,6f661660-b9c4-41d4-99a8-e08006cfe9c8,1,0,199e79fa-54d6-4748-aaaa-9c55283582a3,199e79fa-54d6-4748-aaaa-9c55283582a3,1,0,77b4ade5-149c-4803-af25-fb24ad8b7116,77b4ade5-149c-4803-af25-fb24ad8b7116,1,0,afedc975-4354-473c-8a4d-5b4b547c6e13,afedc975-4354-473c-8a4d-5b4b547c6e13,1,0,8faced7e-d498-499e-8011-7d8d2de1a25f,8faced7e-d498-499e-8011-7d8d2de1a25f,1,0,a67b69dc-ca89-4813-a78d-4a7be1aff328,a67b69dc-ca89-4813-a78d-4a7be1aff328,1,0,dec2510f-4517-4144-a525-3c344e44abc4,dec2510f-4517-4144-a525-3c344e44abc4,1,0,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,1,0,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,1,0,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,1,0,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,1,0,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,1,0,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,1,0,aa89881f-f111-4384-911c-847b04bb56dd,aa89881f-f111-4384-911c-847b04bb56dd,1,0,444d9e3b-c702-4ad6-a929-a220eff0f6e7,444d9e3b-c702-4ad6-a929-a220eff0f6e7,1,0,022c4519-1cdb-45b6-a699-89fd6688999c,022c4519-1cdb-45b6-a699-89fd6688999c,1,0,fb5b79a2-caec-4c6e-a112-27e78a184d5e,fb5b79a2-caec-4c6e-a112-27e78a184d5e,1,0,fa523958-ce1e-42e1-ae00-2dcb401b7eda,fa523958-ce1e-42e1-ae00-2dcb401b7eda,1,0,1518bca2-a004-4566-8991-7c60e6745a49,1518bca2-a004-4566-8991-7c60e6745a49,1,0,ed8618e2-3ce6-4956-856a-9f40279b4da6,ed8618e2-3ce6-4956-856a-9f40279b4da6,1,0,733f6bc2-544d-4fac-bca8-11b981b95a03,733f6bc2-544d-4fac-bca8-11b981b95a03,1,0,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,1,0,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,1,0,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,1,0,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,1,0,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,1,0,e1e9862e-c87b-400f-bca1-b1380cb98ddc,e1e9862e-c87b-400f-bca1-b1380cb98ddc,1,0,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,1,0,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,1,0,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,1,0,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,1,0,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,1,0,0db78226-37d0-4016-b4c9-5134af1aabc7,0db78226-37d0-4016-b4c9-5134af1aabc7,1,0,8d6b4d23-a260-4352-9975-c13ce3e05220,8d6b4d23-a260-4352-9975-c13ce3e05220,1,0,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,1,0,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,1,0,6f5ac40b-ea22-47cf-acf2-614406669a72,6f5ac40b-ea22-47cf-acf2-614406669a72,1,0,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,1,0,488d2644-6fef-488a-af38-40f59c0e0d8c,488d2644-6fef-488a-af38-40f59c0e0d8c,1,0,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,1,0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,1,0,f1efef30-8651-4728-becd-abe3f9026a43,f1efef30-8651-4728-becd-abe3f9026a43,1,0,c2612e22-4f0d-4713-b4eb-decd9780d088,c2612e22-4f0d-4713-b4eb-decd9780d088,1,0,11b1410f-8e14-4b2f-8890-177f4875020e,11b1410f-8e14-4b2f-8890-177f4875020e,1,0,2276b2b0-1705-4014-956f-5087e9dd5c1e,2276b2b0-1705-4014-956f-5087e9dd5c1e,1,0,4aef5419-7cf5-4443-b773-9273c983844f,4aef5419-7cf5-4443-b773-9273c983844f,1,0,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,1,0,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,1,0,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,1,0,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,1,0,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,1,0,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,1,0,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,1,0,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,1,0,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,1,0,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,1,0,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,1,0,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,1,0,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,1,0,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,1,0,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0be7f905-53b8-4bb1-8e37-dcc142e508c5,1,0,422155c7-1640-48c4-bb21-36595b405c66,422155c7-1640-48c4-bb21-36595b405c66,1,0,16d37b5a-88db-4787-b2de-fb50da0ca94b,16d37b5a-88db-4787-b2de-fb50da0ca94b,1,0,f653bcbf-5659-4605-9bb9-3737f19e79dd,f653bcbf-5659-4605-9bb9-3737f19e79dd,1,0,8b980868-fe63-49ff-ba3d-4c29732e1b90,8b980868-fe63-49ff-ba3d-4c29732e1b90,1,0,54668731-4963-4ec3-b188-9feacaefa182,54668731-4963-4ec3-b188-9feacaefa182,1,0,3702135e-5380-4ca6-82f5-63eff1b043e9,3702135e-5380-4ca6-82f5-63eff1b043e9,1,0,29b2104b-fd02-4d51-951f-51ea213b8ebd,29b2104b-fd02-4d51-951f-51ea213b8ebd,1,0,ba5c945e-554f-45a2-a2de-3157b2d7e931,ba5c945e-554f-45a2-a2de-3157b2d7e931,1,0,f7085f33-f122-4443-a3f5-4e765300175e,f7085f33-f122-4443-a3f5-4e765300175e,1,0,b7e4c512-b856-4679-a025-5f0f28918593,b7e4c512-b856-4679-a025-5f0f28918593,1,0,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,1,0,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,1,0,a9362ac4-85ee-4214-80c1-048fab769885,a9362ac4-85ee-4214-80c1-048fab769885,1,0,4ec242e0-75d1-4bf7-be18-783e7aa4f236,4ec242e0-75d1-4bf7-be18-783e7aa4f236,1,0,e02b1366-9d7a-462f-86a1-436bbf4532ff,e02b1366-9d7a-462f-86a1-436bbf4532ff,1,0,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,1,0,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,1,0,8811cc64-99d9-4f13-8309-c29965783f5a,8811cc64-99d9-4f13-8309-c29965783f5a,1,0,7c737071-e850-4a3f-8942-697ef52a8ecc,7c737071-e850-4a3f-8942-697ef52a8ecc,1,0,62eff222-7b74-4cab-9138-880db1f05147,62eff222-7b74-4cab-9138-880db1f05147,1,0,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,1,0,860f8893-22fe-4b13-adb1-24e1ea8c6544,860f8893-22fe-4b13-adb1-24e1ea8c6544,1,0,95266e9f-073f-4de3-83c6-cc0d9ee9334f,95266e9f-073f-4de3-83c6-cc0d9ee9334f,1,0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,1,0,d5012e69-89bc-40af-8e4f-377a042854ee,d5012e69-89bc-40af-8e4f-377a042854ee,1,0,02f79fd8-5315-4c90-b520-db67dcb6e371,02f79fd8-5315-4c90-b520-db67dcb6e371,1,0,9bb52788-4a3a-48b5-a551-5ca753b6c059,9bb52788-4a3a-48b5-a551-5ca753b6c059,1,0,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,1,0,872a0c47-fab5-4a54-8ab9-23940bbdefbb,872a0c47-fab5-4a54-8ab9-23940bbdefbb,1,0,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,1,0,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,1,0,b6c94efd-5994-4c4c-a641-b062ecc38b65,b6c94efd-5994-4c4c-a641-b062ecc38b65,1,0,98501228-7f0e-45a3-b58f-4c654f393f80,98501228-7f0e-45a3-b58f-4c654f393f80,1,0,502384c9-edb7-451a-b7ea-de006f657a6e,502384c9-edb7-451a-b7ea-de006f657a6e,1,0,4e1a4fe0-dca4-40ba-9369-73be303a4aef,4e1a4fe0-dca4-40ba-9369-73be303a4aef,1,0,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,1,0,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,1,0,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1,0,50968921-76f3-4108-835a-96b153671c8d,50968921-76f3-4108-835a-96b153671c8d,1,0,b773f510-1485-4886-9071-afcbf49ff856,b773f510-1485-4886-9071-afcbf49ff856,1,0,964403f2-0a87-49e1-b183-dbe3624e3805,964403f2-0a87-49e1-b183-dbe3624e3805,1,0,bb264e83-49f4-4b7a-8be2-094712fc0640,bb264e83-49f4-4b7a-8be2-094712fc0640,1,0,07bf650d-e61e-44f3-9643-6ffc95b913fb,07bf650d-e61e-44f3-9643-6ffc95b913fb,1,0,5c68c57a-31d6-4ae9-855f-3fbc57922e39,5c68c57a-31d6-4ae9-855f-3fbc57922e39,1,0,6b90ed05-813c-4324-8a69-02c2268856b2,6b90ed05-813c-4324-8a69-02c2268856b2,1,0,081ed48d-cb87-459d-97d6-9af121edbabb,081ed48d-cb87-459d-97d6-9af121edbabb,1,0,6c4074b2-f631-451d-b412-1c8c096a71b1,6c4074b2-f631-451d-b412-1c8c096a71b1,1,0,f9931a20-8391-4b13-8c6d-1836f2492e53,f9931a20-8391-4b13-8c6d-1836f2492e53,1,0,c6eec20b-13b9-44a0-968f-1325680c399b,c6eec20b-13b9-44a0-968f-1325680c399b,1,0,02fbf083-1bdd-4900-9dc1-62f415b792a4,02fbf083-1bdd-4900-9dc1-62f415b792a4,1,0,35454c2d-7088-487b-abb3-f95f2dfdcffa,35454c2d-7088-487b-abb3-f95f2dfdcffa,1,0,2c2526c1-bdf8-4115-bdff-3e79d28321cb,2c2526c1-bdf8-4115-bdff-3e79d28321cb,1,0,4f4da2e9-37ab-4505-b3b1-4b3a908f38c2,4f4da2e9-37ab-4505-b3b1-4b3a908f38c2,1,0,95ab774f-27fa-4bd4-a422-0f997f632679,95ab774f-27fa-4bd4-a422-0f997f632679,1,0,ee3ad891-b7d6-439d-892b-de2f3399d147,ee3ad891-b7d6-439d-892b-de2f3399d147,1,0,4af0f1ee-42cb-47bd-99d0-99deb70e9f82,4af0f1ee-42cb-47bd-99d0-99deb70e9f82,1,0,a2ae0338-ed11-422a-8442-f6c4002ddf0d,a2ae0338-ed11-422a-8442-f6c4002ddf0d,1,0,eb59c9c3-6043-401c-87cc-ba7620139d6a,eb59c9c3-6043-401c-87cc-ba7620139d6a,1,0,2b5ce871-8630-4f2f-9ccb-d9f863886420,2b5ce871-8630-4f2f-9ccb-d9f863886420,1,0,86ae353e-7eed-434c-b4ab-cede36e462bc,86ae353e-7eed-434c-b4ab-cede36e462bc,1,0,18e65717-738b-4d39-9c85-676bca15e6b7,18e65717-738b-4d39-9c85-676bca15e6b7,1,0,01579044-5659-4a73-a989-c52cfabaae66,01579044-5659-4a73-a989-c52cfabaae66,1,0,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,1,0,911baaa1-a4de-4558-b00e-51644144a762,911baaa1-a4de-4558-b00e-51644144a762,1,0,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,1,0,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,1,0,4e036eff-92a8-4010-89b2-ed949c123311,4e036eff-92a8-4010-89b2-ed949c123311,1,0,38160114-dc22-4d0b-86a5-d650f4756932,38160114-dc22-4d0b-86a5-d650f4756932,1,0,60aaa289-1f07-438c-8f10-81058ac671c3,60aaa289-1f07-438c-8f10-81058ac671c3,1,0,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,1,0,c44b0868-bd7f-4230-973b-544ff4dd2afe,c44b0868-bd7f-4230-973b-544ff4dd2afe,1,0,fc2675c2-1c9b-41f9-88eb-5c8be365fe41,fc2675c2-1c9b-41f9-88eb-5c8be365fe41,1,0,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,1,0,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,1,0,8b3da21b-ea3f-47cf-af48-15b886b21f20,8b3da21b-ea3f-47cf-af48-15b886b21f20,1,0,32c4750b-0096-4bbc-8dcd-c1f717734233,32c4750b-0096-4bbc-8dcd-c1f717734233,1,0,be6740b1-1f57-4c01-a67a-d48152931dc8,be6740b1-1f57-4c01-a67a-d48152931dc8,1,0,40fd038d-a93a-4be7-9221-d8ae83350ca0,40fd038d-a93a-4be7-9221-d8ae83350ca0,1,0,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,1,0,29adc9e5-a994-48ab-a5a1-919d01119c3a,29adc9e5-a994-48ab-a5a1-919d01119c3a,1,0,c47ffce7-c905-4e88-8b1f-156f47047ccd,c47ffce7-c905-4e88-8b1f-156f47047ccd,1,0,e1755eed-88cf-42c1-83e4-f9047f2c30bf,e1755eed-88cf-42c1-83e4-f9047f2c30bf,1,0,c6ec9d48-9131-4735-9cf7-b498705a57e4,c6ec9d48-9131-4735-9cf7-b498705a57e4,1,0,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,1,0,706c421a-74ce-4985-9443-b4a2032481f6,706c421a-74ce-4985-9443-b4a2032481f6,1,0,64da4c24-4aaf-42c8-8595-7f60ff3bc344,64da4c24-4aaf-42c8-8595-7f60ff3bc344,1,0,fb9577e1-00d9-4d52-8de9-23914929a683,fb9577e1-00d9-4d52-8de9-23914929a683,1,0,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,1,0,529253ae-9c92-4426-b150-8444ba622f89,529253ae-9c92-4426-b150-8444ba622f89,1,0,06a1955a-2ef0-4607-9dcb-a480a7951af7,06a1955a-2ef0-4607-9dcb-a480a7951af7,1,0,6f8fcc96-bfed-444a-908d-95c5b1c64972,6f8fcc96-bfed-444a-908d-95c5b1c64972,1,0,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,1,0,a84c89d9-2cfe-405f-9bb0-5392b3171695,a84c89d9-2cfe-405f-9bb0-5392b3171695,1,0,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,1,0,91e26e73-027f-4a10-9083-e5182e768723,91e26e73-027f-4a10-9083-e5182e768723,1,0,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,1,0,54433668-4391-4dea-8baf-43e9aa1d624e,54433668-4391-4dea-8baf-43e9aa1d624e,1,0,fc309616-060a-42c3-8401-dfef0f359bc5,fc309616-060a-42c3-8401-dfef0f359bc5,1,0,b968398d-973d-4643-95a5-16633d7e48bc,b968398d-973d-4643-95a5-16633d7e48bc,1,0,b9507495-2536-4895-b68b-62acd74343f6,b9507495-2536-4895-b68b-62acd74343f6,1,0,e05a14cc-9051-4c38-9725-19856e36d260,e05a14cc-9051-4c38-9725-19856e36d260,1,0,8154aa0f-ecd6-4ab0-9498-56ef25486a55,8154aa0f-ecd6-4ab0-9498-56ef25486a55,1,0,9d6429f7-23da-4596-822a-04818deb3088,9d6429f7-23da-4596-822a-04818deb3088,1,0,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,1,0,acb533e7-4610-4f92-b548-1a4ff1a423d4,acb533e7-4610-4f92-b548-1a4ff1a423d4,1,0,8697999d-9cdb-43d8-979b-3f283daffdd3,8697999d-9cdb-43d8-979b-3f283daffdd3,1,0,23378687-249c-4ec6-99b8-b13fb04b8643,23378687-249c-4ec6-99b8-b13fb04b8643,1,0,66315b12-7abf-46e0-a994-894b827b1301,66315b12-7abf-46e0-a994-894b827b1301,1,0,dba174fb-8392-4451-8069-ae8145658e34,dba174fb-8392-4451-8069-ae8145658e34,1,0,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,1,0,4435d99d-a1df-43e6-97ab-5e651017c61d,4435d99d-a1df-43e6-97ab-5e651017c61d,1,0,2398d69d-ecdd-4d34-bdae-34ed5507a61e,2398d69d-ecdd-4d34-bdae-34ed5507a61e,1,0,a707035a-0172-4b55-b589-fa4a8be9b596,a707035a-0172-4b55-b589-fa4a8be9b596,1,0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,1,0,4a347209-3a07-48ea-b407-6ee37f1d69f2,4a347209-3a07-48ea-b407-6ee37f1d69f2,1,0,d6aed0fd-686c-430d-b884-74494177422e,d6aed0fd-686c-430d-b884-74494177422e,1,0,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,1,0,3ed64288-8bf0-4049-8d44-1b424f31d40f,3ed64288-8bf0-4049-8d44-1b424f31d40f,1,0,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,1,0,df31eee8-387d-40d1-98df-1f7d8176b50e,df31eee8-387d-40d1-98df-1f7d8176b50e,1,0,c8364283-5525-4bef-8e96-abced54c6a4a,c8364283-5525-4bef-8e96-abced54c6a4a,1,0,bcc25539-c6ca-40d0-84fd-53c3caf1aec7,bcc25539-c6ca-40d0-84fd-53c3caf1aec7,1,0,577f2671-7d38-4806-b7ff-840d649e6d69,577f2671-7d38-4806-b7ff-840d649e6d69,1,0,4ff9376e-ffa6-48f3-bf26-b55ceb23da09,4ff9376e-ffa6-48f3-bf26-b55ceb23da09,1,0,de4c339a-a3cf-4b30-bcf2-ce86f5c2d3b0,de4c339a-a3cf-4b30-bcf2-ce86f5c2d3b0,1,0,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,1,0,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,1,0,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,1,0,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,1,0,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,1,0,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,1,0,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,1,0,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,1,0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1,0,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,1,0,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,1,0,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,1,0,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,1,0,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,1,0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,1,0,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,1,0,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,1,0,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,1,0,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,1,0,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,1,0,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,1,0,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,1,0,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,1,0,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,1,0,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,1,0,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,1,0,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,1,0,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1,0,8064eb3a-d56c-4517-9db0-b7300149c7c4,8064eb3a-d56c-4517-9db0-b7300149c7c4,1,0,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,1,0,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,1,0,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,1,0,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,1,0,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,1,0,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,1,0,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,1,0,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,1,0,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,1,0,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1,0,d6b72e00-018a-4fdc-b6a4-06dcecf89809,d6b72e00-018a-4fdc-b6a4-06dcecf89809,1,0,9f816562-57f0-473f-8c85-14f7521ffd7f,9f816562-57f0-473f-8c85-14f7521ffd7f,1,0,917b0acc-88fe-4afc-b19b-6da69e060393,917b0acc-88fe-4afc-b19b-6da69e060393,1,0,a091b76e-8ba4-4534-bbb0-9990e69b8603,a091b76e-8ba4-4534-bbb0-9990e69b8603,1,0,867ee5d2-7566-4052-a311-b56e7e46b90d,867ee5d2-7566-4052-a311-b56e7e46b90d,1,0,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,1,0,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,1,0,98422d20-9a71-40e4-966e-6958d44eaefb,98422d20-9a71-40e4-966e-6958d44eaefb,1,0,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,1,0,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,1,0,64e702e9-8934-4356-a1b2-be0e8b390630,64e702e9-8934-4356-a1b2-be0e8b390630,1,0,74880ac4-bdd3-48e6-82a0-a2103da42723,74880ac4-bdd3-48e6-82a0-a2103da42723,1,0,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,1,0,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,1,0,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,1,0,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,1,0,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,1,0,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,1,0,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,1,0,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,1,0,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,1,0,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,1,0,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,1,0,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,1,0,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,1,0,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,1,0,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,1,0,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,1,0,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,1,0,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,1,0,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,1,0,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,1,0,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,1,0,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,1,0,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,1,0,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,1,0,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,1,0,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,1,0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,1,0,71102d3f-f020-4d6f-9582-9a7eefb4e797,71102d3f-f020-4d6f-9582-9a7eefb4e797,1,0,53ef6849-a3f3-4171-9167-f349f2d6a736,53ef6849-a3f3-4171-9167-f349f2d6a736,1,0,3f588bd3-d461-42b7-8ab1-386af6399d56,3f588bd3-d461-42b7-8ab1-386af6399d56,1,0,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,1,0,8c576405-29c1-46b1-ab2e-40e52c21cab0,8c576405-29c1-46b1-ab2e-40e52c21cab0,1,0,b33a89da-8589-4902-83fa-6545e5fce23e,b33a89da-8589-4902-83fa-6545e5fce23e,1,0,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,1,0,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,1,0,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,1,0,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,1,0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,1,0,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,1,0,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,1,0,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,1,0,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,1,0,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,1,0,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,1,0,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,1,0,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,1,0,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,1,0,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,1,0,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,1,0,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,1,0,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,1,0,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,1,0,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,1,0,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,1,0,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,1,0,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,1,0,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,1,0,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,1,0,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,1,0,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,1,0,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,1,0,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,1,0,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,1,0,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,1,0,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,1,0,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,1,0,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,1,0,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file +{6,1,1,f96399c9-7810-444a-9731-58d4308090de,1,26c64b5d-4b8f-4439-ab75-0987bcc6544d,"2.4.1.80","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",5491,1,0,a427fd94-6727-4f83-8da1-4a4e50e49906,a427fd94-6727-4f83-8da1-4a4e50e49906,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,5b68d479-7880-44de-84e3-7f578b43f0dc,5b68d479-7880-44de-84e3-7f578b43f0dc,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,c27472ee-879a-4746-9d21-122738ec80b7,c27472ee-879a-4746-9d21-122738ec80b7,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,a379287d-1ce8-460d-a503-910e728e28f1,a379287d-1ce8-460d-a503-910e728e28f1,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,83192b3e-e7a9-4595-8887-24cda84457a9,83192b3e-e7a9-4595-8887-24cda84457a9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,1,0,08eeb8f1-944f-4450-83f6-ef20aaab7d86,08eeb8f1-944f-4450-83f6-ef20aaab7d86,1,0,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,1,0,2fd12dba-5311-4f31-949c-f6b15decc0cc,2fd12dba-5311-4f31-949c-f6b15decc0cc,1,0,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,1,0,35895e12-52b6-49a1-acdf-6d828a948af0,35895e12-52b6-49a1-acdf-6d828a948af0,1,0,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,1,0,060b6f18-538c-4ea1-9748-00efe0b1ab57,060b6f18-538c-4ea1-9748-00efe0b1ab57,1,0,307b6821-fd82-4a1c-9fdb-a26293d4f713,307b6821-fd82-4a1c-9fdb-a26293d4f713,1,0,a952960b-be1b-4ec4-bd76-80915065a60b,a952960b-be1b-4ec4-bd76-80915065a60b,1,0,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,1,0,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,1,0,ede5b7c8-42cd-4f79-90d2-b518e96d6b26,ede5b7c8-42cd-4f79-90d2-b518e96d6b26,1,0,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,1,0,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,1,0,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,1,0,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,1,0,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,1,0,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,1,0,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,1,0,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,1,0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,1,0,e15c3525-3453-4b62-834e-7c69f9efea51,e15c3525-3453-4b62-834e-7c69f9efea51,1,0,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,1,0,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,1,0,ad73f3a3-1dad-4920-af41-bda2b947a2f7,ad73f3a3-1dad-4920-af41-bda2b947a2f7,1,0,98b67b5a-3550-4a64-9e07-07fcc9154c73,98b67b5a-3550-4a64-9e07-07fcc9154c73,1,0,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,1,0,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,1,0,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,1,0,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,1,0,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,1,0,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,1,0,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,1,0,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,1,0,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,1,0,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,1,0,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,1,0,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,1,0,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,1,0,c3d88576-8720-41d7-9d91-919ea45523c5,c3d88576-8720-41d7-9d91-919ea45523c5,1,0,e2c90080-4ed1-4b01-bcb7-3501018d652c,e2c90080-4ed1-4b01-bcb7-3501018d652c,1,0,f997854c-1b48-4d7e-b094-2166745a918c,f997854c-1b48-4d7e-b094-2166745a918c,1,0,16cdc2b4-9ea6-477e-b1bb-dfc8fec65a8d,16cdc2b4-9ea6-477e-b1bb-dfc8fec65a8d,1,0,9a4619e0-e76b-4607-9b1a-fcc79bdd356b,9a4619e0-e76b-4607-9b1a-fcc79bdd356b,1,0,34ce3078-9d00-402e-a9a1-0d05a43ec238,34ce3078-9d00-402e-a9a1-0d05a43ec238,1,0,799944ac-e6ef-4480-9f8e-032c95d4e3fc,799944ac-e6ef-4480-9f8e-032c95d4e3fc,1,0,da280465-d43d-4513-943d-6f91bdc8cefa,da280465-d43d-4513-943d-6f91bdc8cefa,1,0,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,1,0,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,1,0,9eea8645-1ba7-4faf-9c29-868bf99964dd,9eea8645-1ba7-4faf-9c29-868bf99964dd,1,0,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,1,0,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,1,0,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,1,0,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,1,0,d5a5f53b-9cd5-4036-a379-31680cec3c24,d5a5f53b-9cd5-4036-a379-31680cec3c24,1,0,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,1,0,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,1,0,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,1,0,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,1,0,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,1,0,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,1,0,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,1,0,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,1,0,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,1,0,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,1,0,0da019ca-1fc7-4aff-8998-3ddcccf10872,0da019ca-1fc7-4aff-8998-3ddcccf10872,1,0,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,1,0,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,1,0,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,1,0,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,1,0,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,1,0,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,1,0,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,1,0,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,1,0,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,1,0,256981be-18fd-4d92-91f3-6d55bbe2181b,256981be-18fd-4d92-91f3-6d55bbe2181b,1,0,d6bcf961-b863-486e-9a88-c237ae84f7c3,d6bcf961-b863-486e-9a88-c237ae84f7c3,1,0,1d75bfa4-5698-4cbc-98cb-591509fcfde8,1d75bfa4-5698-4cbc-98cb-591509fcfde8,1,0,26eb08f7-6c62-459f-b1f5-363cc40cae46,26eb08f7-6c62-459f-b1f5-363cc40cae46,1,0,cdbc7f5c-dbf9-49cd-a940-95b37bc7b734,cdbc7f5c-dbf9-49cd-a940-95b37bc7b734,1,0,7b802612-3034-4413-9ee8-60e94ebed6d6,7b802612-3034-4413-9ee8-60e94ebed6d6,1,0,59420cb5-d903-4e2c-a9e1-bc5494168daf,59420cb5-d903-4e2c-a9e1-bc5494168daf,1,0,5a88f624-7b7e-43fe-8bc4-ae85d832a855,5a88f624-7b7e-43fe-8bc4-ae85d832a855,1,0,42e39ef7-268f-4053-b4e5-4bceab17d3e4,42e39ef7-268f-4053-b4e5-4bceab17d3e4,1,0,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,1,0,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,1,0,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,1,0,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,1,0,fce03f58-7f68-4d7c-a999-687667c1f03d,fce03f58-7f68-4d7c-a999-687667c1f03d,1,0,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,1,0,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,1,0,87472d14-0d8c-4813-8a3e-2721bbb26811,87472d14-0d8c-4813-8a3e-2721bbb26811,1,0,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,1,0,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,1,0,9200527c-b6b9-4962-9440-10449583e1e3,9200527c-b6b9-4962-9440-10449583e1e3,1,0,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,1,0,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,1,0,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,1,0,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,1,0,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,1,0,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,1,0,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,1,0,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,1,0,8b4614aa-c769-49f4-a281-a0ffb101abf1,8b4614aa-c769-49f4-a281-a0ffb101abf1,1,0,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,1,0,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,1,0,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,1,0,4c3a39e3-40ee-423b-91f0-14b60e045b40,4c3a39e3-40ee-423b-91f0-14b60e045b40,1,0,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,1,0,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,1,0,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,1,0,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,1,0,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,1,0,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,1,0,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,1,0,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,1,0,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,1,0,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,1,0,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,1,0,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,1,0,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,1,0,7185a8f8-48c4-43a9-b31f-102302b8f152,7185a8f8-48c4-43a9-b31f-102302b8f152,1,0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,1,0,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,1,0,c573a29f-4c39-402d-8af4-e0fff80877f8,c573a29f-4c39-402d-8af4-e0fff80877f8,1,0,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,1,0,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,1,0,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,1,0,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,1,0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,1,0,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,1,0,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,1,0,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,1,0,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,1,0,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,1,0,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,1,0,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,1,0,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,1,0,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,1,0,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,1,0,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,1,0,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,1,0,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,1,0,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,1,0,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,1,0,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,1,0,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,1,0,2782420a-65fe-4714-bc91-732c88ba5b14,2782420a-65fe-4714-bc91-732c88ba5b14,1,0,3d170774-bd17-45a2-9d8a-4af3dbabeec4,3d170774-bd17-45a2-9d8a-4af3dbabeec4,1,0,7f7598e5-ca54-487e-b95c-b18d330b034c,7f7598e5-ca54-487e-b95c-b18d330b034c,1,0,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,1,0,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,1,0,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,1,0,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,1,0,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,1,0,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,1,0,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,1,0,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,1,0,64e03321-33a4-424d-a101-90f1e0da4c2e,64e03321-33a4-424d-a101-90f1e0da4c2e,1,0,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,1,0,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,1,0,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,1,0,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,1,0,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,1,0,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,1,0,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,1,0,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,1,0,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,1,0,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,1,0,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,1,0,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,1,0,691f9902-6b95-4579-a3d9-3b2b5b548776,691f9902-6b95-4579-a3d9-3b2b5b548776,1,0,06fc381d-f27a-433c-95c3-e0981e01f22b,06fc381d-f27a-433c-95c3-e0981e01f22b,1,0,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,1,0,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,1,0,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,1,0,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,1,0,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,1,0,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,1,0,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,1,0,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,1,0,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,1,0,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,1,0,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,1,0,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,1,0,a3131bf3-88b1-431c-a01c-be6e26396f91,a3131bf3-88b1-431c-a01c-be6e26396f91,1,0,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,1,0,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,1,0,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1,0,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,1,0,2a12ce95-3214-4bd2-a0e6-c2af41875821,2a12ce95-3214-4bd2-a0e6-c2af41875821,1,0,bf05548c-babf-402b-b698-9a62e7c69add,bf05548c-babf-402b-b698-9a62e7c69add,1,0,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,1,0,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,1,0,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,1,0,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,1,0,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,1,0,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,1,0,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,1,0,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,1,0,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,1,0,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,1,0,c2049ace-3095-4dd7-9cc0-7721118451ad,c2049ace-3095-4dd7-9cc0-7721118451ad,1,0,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,1,0,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,1,0,2465986e-7519-4638-9f62-5f692bebeeac,2465986e-7519-4638-9f62-5f692bebeeac,1,0,66e24df5-f443-47c0-b0ad-97d00d6761c7,66e24df5-f443-47c0-b0ad-97d00d6761c7,1,0,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,1,0,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,1,0,022f99dd-e1b7-42a7-8141-a8c2e8628901,022f99dd-e1b7-42a7-8141-a8c2e8628901,1,0,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,1,0,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,1,0,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,1,0,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,1,0,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,1,0,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,1,0,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,1,0,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,1,0,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,1,0,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,1,0,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,1,0,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,1,0,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,1,0,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,1,0,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,1,0,2997e4da-d831-48e4-96e2-c29f9d077302,2997e4da-d831-48e4-96e2-c29f9d077302,1,0,30f59002-a23d-4eff-b84f-f280f11b220e,30f59002-a23d-4eff-b84f-f280f11b220e,1,0,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,1,0,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,1,0,14583452-805e-423d-be9a-e04683c7c46f,14583452-805e-423d-be9a-e04683c7c46f,1,0,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,1,0,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,1,0,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,1,0,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,1,0,b1e837ff-0edd-4525-b2e2-92cc7990e00e,b1e837ff-0edd-4525-b2e2-92cc7990e00e,1,0,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,1,0,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,1,0,cafbea88-86f0-4a44-98f4-70d1837da452,cafbea88-86f0-4a44-98f4-70d1837da452,1,0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,1,0,ceb286e9-4e7c-49fa-a695-424073e0dffc,ceb286e9-4e7c-49fa-a695-424073e0dffc,1,0,727689c3-c0d8-496f-a47b-4f3243ad8974,727689c3-c0d8-496f-a47b-4f3243ad8974,1,0,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,1,0,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,1,0,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,1,0,4bad7c64-131a-42cb-9be7-d61f14f456d0,4bad7c64-131a-42cb-9be7-d61f14f456d0,1,0,d46e141b-7a10-4d65-971f-3a35f2114017,d46e141b-7a10-4d65-971f-3a35f2114017,1,0,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,1,0,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,1,0,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,1,0,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,1,0,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1,0,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,1,0,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,1,0,e70a6eab-791f-4c70-bb92-f069c7486d1b,e70a6eab-791f-4c70-bb92-f069c7486d1b,1,0,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,1,0,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,1,0,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,1,0,772e7011-0019-4edc-b673-b7151cf4fa6c,772e7011-0019-4edc-b673-b7151cf4fa6c,1,0,21ac47fa-12c2-43e2-9b57-afdf521d3485,21ac47fa-12c2-43e2-9b57-afdf521d3485,1,0,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,1,0,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,1,0,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,1,0,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,1,0,8d1c44d7-52f2-4089-9d77-2f03bf051455,8d1c44d7-52f2-4089-9d77-2f03bf051455,1,0,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,1,0,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,1,0,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,1,0,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,1,0,8e87da88-9fa8-4dd8-b904-622b763239f4,8e87da88-9fa8-4dd8-b904-622b763239f4,1,0,529cc5b5-835f-4e70-9232-a9649fdc7ae5,529cc5b5-835f-4e70-9232-a9649fdc7ae5,1,0,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,1,0,4875a235-bcc8-47eb-83e3-a66f0f690b97,4875a235-bcc8-47eb-83e3-a66f0f690b97,1,0,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,1,0,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,1,0,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,1,0,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,1,0,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,1,0,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,1,0,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,1,0,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,1,0,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,1,0,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,1,0,f595539d-bdd1-4e7a-8279-3bb8a9344f45,f595539d-bdd1-4e7a-8279-3bb8a9344f45,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,1,0,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,1,0,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,1,0,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,1,0,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,1,0,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,1,0,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,1,0,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,1,0,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,1,0,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,1,0,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,1,0,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,1,0,3fe0ef25-ce56-435d-b343-eadfec91a636,3fe0ef25-ce56-435d-b343-eadfec91a636,1,0,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,1,0,62ef3558-5ad3-44ab-8578-1acbbfa54135,62ef3558-5ad3-44ab-8578-1acbbfa54135,1,0,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,1,0,c3572d8d-46ff-40bb-800c-2c07f884c219,c3572d8d-46ff-40bb-800c-2c07f884c219,1,0,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,1,0,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,1,0,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,1,0,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,1,0,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,1,0,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,1,0,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,1,0,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,1,0,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,1,0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1,0,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,1,0,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,1,0,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,1,0,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,1,0,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,1,0,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,1,0,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,1,0,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,1,0,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,1,0,ab5b0155-a4b1-47a1-ad87-12365dde20c1,ab5b0155-a4b1-47a1-ad87-12365dde20c1,1,0,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,1,0,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,1,0,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,1,0,6f21c34c-26aa-493d-aa08-2d4366b4064a,6f21c34c-26aa-493d-aa08-2d4366b4064a,1,0,0f55650a-2422-42a9-8258-61df4c17f1ef,0f55650a-2422-42a9-8258-61df4c17f1ef,1,0,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,1,0,3eaece9d-c9be-4b0b-a6f6-a3932274b806,3eaece9d-c9be-4b0b-a6f6-a3932274b806,1,0,5d9427ec-981d-4fb5-878b-8dba0d3a5536,5d9427ec-981d-4fb5-878b-8dba0d3a5536,1,0,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,1,0,a0047712-5769-495d-97af-20d06751a5b4,a0047712-5769-495d-97af-20d06751a5b4,1,0,e729c3c6-16e5-405b-99b1-a88022300c6d,e729c3c6-16e5-405b-99b1-a88022300c6d,1,0,9c089520-8233-42f6-8eee-9839ac708c6f,9c089520-8233-42f6-8eee-9839ac708c6f,1,0,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,1,0,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,1,0,89055896-49dd-4cfd-ab78-8ac3698e12d5,89055896-49dd-4cfd-ab78-8ac3698e12d5,1,0,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,1,0,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,1,0,672c4741-6d7b-4d3e-baa7-389bef0625d7,672c4741-6d7b-4d3e-baa7-389bef0625d7,1,0,04398ec0-1c13-43f8-8f5d-7b7619592a4d,04398ec0-1c13-43f8-8f5d-7b7619592a4d,1,0,ce463861-92df-47f2-bd0f-4a2dbf72aacc,ce463861-92df-47f2-bd0f-4a2dbf72aacc,1,0,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,1,0,1487d68c-7a2f-48cf-8c80-4074072ed52c,1487d68c-7a2f-48cf-8c80-4074072ed52c,1,0,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,1,0,d97c6536-fd62-4c9a-b83e-490a29a0721b,d97c6536-fd62-4c9a-b83e-490a29a0721b,1,0,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,1,0,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,1,0,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,1,0,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,1,0,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,1,0,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,1,0,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,1,0,057aadbd-f41f-4de4-95f4-9301557e6a0e,057aadbd-f41f-4de4-95f4-9301557e6a0e,1,0,f0f9cf2c-bbf9-4511-a1ab-3941c15310eb,f0f9cf2c-bbf9-4511-a1ab-3941c15310eb,1,0,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,1,0,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,1,0,ece15c4e-4a4b-421b-9f00-10f698da476b,ece15c4e-4a4b-421b-9f00-10f698da476b,1,0,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,1,0,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,1,0,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,1,0,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,1,0,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,1,0,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,1,0,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,1,0,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,1,0,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,1,0,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,1,0,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,1,0,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,1,0,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,1,0,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,1,0,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,1,0,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,1,0,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,1,0,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,1,0,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,1,0,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,1,0,5efc4bc4-b711-4620-8d2e-9d947c6cc141,5efc4bc4-b711-4620-8d2e-9d947c6cc141,1,0,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1,0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,1,0,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,1,0,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,1,0,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,1,0,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,1,0,aa8c4a71-3276-4b83-8be2-3528129e58b3,aa8c4a71-3276-4b83-8be2-3528129e58b3,1,0,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,1,0,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,1,0,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,1,0,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,1,0,0072986b-0463-4a39-9851-f9adeda99716,0072986b-0463-4a39-9851-f9adeda99716,1,0,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,1,0,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,1,0,0d4a26fb-7176-43f2-8767-d3e227c7306a,0d4a26fb-7176-43f2-8767-d3e227c7306a,1,0,933cbafc-5667-4a91-8b1d-dca3d7662522,933cbafc-5667-4a91-8b1d-dca3d7662522,1,0,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,1,0,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,1,0,b6e98aee-4936-491d-8c67-8490e1af2e34,b6e98aee-4936-491d-8c67-8490e1af2e34,1,0,b292eb46-df87-43c0-9a37-93c5a22af252,b292eb46-df87-43c0-9a37-93c5a22af252,1,0,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,1,0,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,1,0,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,1,0,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,1,0,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,1,0,062c507a-9d35-4eb5-bb91-d106a535a503,062c507a-9d35-4eb5-bb91-d106a535a503,1,0,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,1,0,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,1,0,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,1,0,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,1,0,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,1,0,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,1,0,f1e600b0-55ed-4611-b147-f04d5621796b,f1e600b0-55ed-4611-b147-f04d5621796b,1,0,e3b84128-95e1-45df-84db-5e1791779543,e3b84128-95e1-45df-84db-5e1791779543,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,e9d95895-8708-4035-89ad-72573b870491,e9d95895-8708-4035-89ad-72573b870491,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f0152598-ffa3-4eb7-811f-906e569373e6,f0152598-ffa3-4eb7-811f-906e569373e6,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,312118ff-a2a4-479c-964a-5250cca0cd20,312118ff-a2a4-479c-964a-5250cca0cd20,1,0,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,89318397-b3a6-4468-985b-ed5cb8ab5cdb,89318397-b3a6-4468-985b-ed5cb8ab5cdb,1,0,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,4436b2cf-2d71-401f-99fd-012ff0c91fbd,4436b2cf-2d71-401f-99fd-012ff0c91fbd,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5396be45-d7c0-43df-aed4-cad062a02b11,5396be45-d7c0-43df-aed4-cad062a02b11,1,0,017e3da8-e48e-488b-9bbf-4fef1a4f3417,017e3da8-e48e-488b-9bbf-4fef1a4f3417,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,1e015740-5b45-4729-9732-57359a7c602f,1e015740-5b45-4729-9732-57359a7c602f,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,1,0,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,cd74d617-8ebe-4a7d-b011-38c98d856d8c,cd74d617-8ebe-4a7d-b011-38c98d856d8c,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,38b48750-1411-493b-b18e-42d39312aad8,38b48750-1411-493b-b18e-42d39312aad8,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,8de2c020-0ebe-4374-93d7-d2e19ed82470,8de2c020-0ebe-4374-93d7-d2e19ed82470,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,737404de-5b9d-4445-81c5-2c5b50b36846,737404de-5b9d-4445-81c5-2c5b50b36846,1,0,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,789a2027-8601-434c-bf47-37696a3966ad,789a2027-8601-434c-bf47-37696a3966ad,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,4c3085e1-2f86-4af4-a392-ab45e30a7152,4c3085e1-2f86-4af4-a392-ab45e30a7152,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,1,0,73e4bce2-df4a-4f60-a369-55f588a46bd1,73e4bce2-df4a-4f60-a369-55f588a46bd1,1,0,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,1,0,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1,0,c6af8b0f-3767-4198-88e2-f5763cb0294a,c6af8b0f-3767-4198-88e2-f5763cb0294a,1,0,b107a4a8-0db8-44f4-93f7-9f231e850398,b107a4a8-0db8-44f4-93f7-9f231e850398,1,0,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,1,0,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,1,0,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,1,0,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,1,0,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,1,0,904e1209-91d8-49b1-b291-364ef728cbbf,904e1209-91d8-49b1-b291-364ef728cbbf,1,0,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1,0,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,1,0,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,1,0,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,1,0,e51ae56c-d311-46b7-8d4c-19a432f4cd16,e51ae56c-d311-46b7-8d4c-19a432f4cd16,1,0,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,1,0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,1,0,23314bcd-2dd4-43f1-9fdb-ae182a48c886,23314bcd-2dd4-43f1-9fdb-ae182a48c886,1,0,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,1,0,9440a132-366f-4fc9-bd72-2544ba2b072a,9440a132-366f-4fc9-bd72-2544ba2b072a,1,0,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,1,0,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,1,0,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,1,0,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,1,0,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,1,0,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,1,0,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,1,0,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,1,0,cadb54f0-dcff-4f96-983e-a309fd72f330,cadb54f0-dcff-4f96-983e-a309fd72f330,1,0,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,1,0,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,1,0,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,1,0,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,1,0,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,1,0,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,1,0,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,1,0,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,1,0,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,1,0,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,1,0,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,1,0,9ff1c73e-71be-4ea6-97fb-e710d995ee62,9ff1c73e-71be-4ea6-97fb-e710d995ee62,1,0,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,1,0,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,1,0,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,1,0,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,1,0,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,1,0,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,1,0,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,1,0,9d669d30-a0af-4095-852a-96b4224ee933,9d669d30-a0af-4095-852a-96b4224ee933,1,0,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,1,0,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,1,0,126d5d78-a2b0-4c16-b429-bf8d251280e7,126d5d78-a2b0-4c16-b429-bf8d251280e7,1,0,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,1,0,12443114-1931-4eb7-968a-7dbe166b7298,12443114-1931-4eb7-968a-7dbe166b7298,1,0,0080c29d-ec54-43a8-aab8-c67e0279b6b7,0080c29d-ec54-43a8-aab8-c67e0279b6b7,1,0,a0271f6e-dc70-4dfe-a395-203e8a89f933,a0271f6e-dc70-4dfe-a395-203e8a89f933,1,0,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,1,0,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,1,0,d065c02e-9991-468a-ae32-b8c29d078d03,d065c02e-9991-468a-ae32-b8c29d078d03,1,0,c509683e-eb13-4e1a-91ed-cd6982ec5001,c509683e-eb13-4e1a-91ed-cd6982ec5001,1,0,88bf6f58-7943-42c4-bc0f-56b991590026,88bf6f58-7943-42c4-bc0f-56b991590026,1,0,68500931-89e0-491e-aba8-b013c9e6f8c3,68500931-89e0-491e-aba8-b013c9e6f8c3,1,0,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,1,0,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,1,0,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,1,0,ef6ccd0d-73c6-4314-9912-efa7ff27c823,ef6ccd0d-73c6-4314-9912-efa7ff27c823,1,0,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,1,0,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,1,0,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,1,0,70f156d8-9cb4-442d-a36b-7a43d03bcd12,70f156d8-9cb4-442d-a36b-7a43d03bcd12,1,0,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,1,0,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,1,0,f0a6de82-45ab-4153-bccf-df82fc960aa1,f0a6de82-45ab-4153-bccf-df82fc960aa1,1,0,77adf47b-6015-46fc-9e29-f1c025ea0d81,77adf47b-6015-46fc-9e29-f1c025ea0d81,1,0,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,1,0,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,1,0,af8d4bc9-2f0f-44d3-89ce-2593877055c8,af8d4bc9-2f0f-44d3-89ce-2593877055c8,1,0,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,1,0,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,1,0,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,1,0,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,1,0,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,1,0,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,1,0,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,1,0,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,1,0,5a4c6511-f8ed-40e4-a251-e28f62629cf2,5a4c6511-f8ed-40e4-a251-e28f62629cf2,1,0,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,1,0,17df1591-61b0-4204-8379-8d1f58445968,17df1591-61b0-4204-8379-8d1f58445968,1,0,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,1,0,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,1,0,e83ad33d-27df-4181-afd2-b7f416e6e705,e83ad33d-27df-4181-afd2-b7f416e6e705,1,0,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,1,0,f0438b0a-7916-4de4-a3a8-d43407c3295f,f0438b0a-7916-4de4-a3a8-d43407c3295f,1,0,3309648c-aae6-4684-ae8d-7ed636bc3468,3309648c-aae6-4684-ae8d-7ed636bc3468,1,0,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,1,0,f41e5a5b-394b-423a-bee5-ed4d1da0be71,f41e5a5b-394b-423a-bee5-ed4d1da0be71,1,0,23db175f-ddfb-4af7-9c0c-232b6adb7daf,23db175f-ddfb-4af7-9c0c-232b6adb7daf,1,0,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,1,0,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,1,0,4e309f26-35e8-49d9-bbd1-c7884e666dca,4e309f26-35e8-49d9-bbd1-c7884e666dca,1,0,84f05fe4-51d3-49a8-83e7-1cae2028147e,84f05fe4-51d3-49a8-83e7-1cae2028147e,1,0,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,1,0,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,1,0,3916ddbd-9023-42a4-849e-9cda6e591408,3916ddbd-9023-42a4-849e-9cda6e591408,1,0,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,1,0,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,1,0,f135b60e-6d28-4ba1-acd7-76090f14855d,f135b60e-6d28-4ba1-acd7-76090f14855d,1,0,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,1,0,c6267c5a-3878-4d0c-8674-4d4dd672b99c,c6267c5a-3878-4d0c-8674-4d4dd672b99c,1,0,44c9e8a9-8efd-4391-a1b2-4ef278376b4d,44c9e8a9-8efd-4391-a1b2-4ef278376b4d,1,0,96d66cdd-d40c-43a3-92ce-40aef2101b64,96d66cdd-d40c-43a3-92ce-40aef2101b64,1,0,9daa8270-4782-4d83-af03-c8d2b11057ff,9daa8270-4782-4d83-af03-c8d2b11057ff,1,0,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,1,0,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,1,0,52b45b3d-b01b-4aac-8a1e-e256957c39c3,52b45b3d-b01b-4aac-8a1e-e256957c39c3,1,0,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,1,0,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,1,0,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,1,0,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,1,0,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,1,0,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,1,0,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,1,0,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,1,0,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,1,0,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,1,0,0b303d25-e141-431f-828c-1778d3c247f6,0b303d25-e141-431f-828c-1778d3c247f6,1,0,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,1,0,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,1,0,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,1,0,976533bf-f162-42a1-a47e-6d681ee67b82,976533bf-f162-42a1-a47e-6d681ee67b82,1,0,19bc0dd8-9e6b-4855-bc42-b4e98443163f,19bc0dd8-9e6b-4855-bc42-b4e98443163f,1,0,a61e10af-eaba-4e7a-a641-65d77453a559,a61e10af-eaba-4e7a-a641-65d77453a559,1,0,edf81bbb-905a-474d-959a-db5629a8e104,edf81bbb-905a-474d-959a-db5629a8e104,1,0,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,1,0,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,1,0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,1,0,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1,0,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,1,0,a84891cc-e996-489a-abde-5b5af166a057,a84891cc-e996-489a-abde-5b5af166a057,1,0,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,1,0,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,1,0,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,1,0,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,1,0,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,1,0,19a307b1-9ef0-4fc6-bf4f-7636e9118399,19a307b1-9ef0-4fc6-bf4f-7636e9118399,1,0,666244a4-5636-4405-89dd-bbd8f4278071,666244a4-5636-4405-89dd-bbd8f4278071,1,0,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,1,0,29a627a9-debc-4074-88d0-ec3561e1ef9c,29a627a9-debc-4074-88d0-ec3561e1ef9c,1,0,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,1,0,39f5e272-9a10-40b0-8a10-92037828b206,39f5e272-9a10-40b0-8a10-92037828b206,1,0,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,1,0,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,1,0,f20a04a7-84fa-48e3-8ac5-28176c1fcada,f20a04a7-84fa-48e3-8ac5-28176c1fcada,1,0,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,1,0,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,1,0,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,1,0,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,1,0,4ad722ca-10fc-4a83-91c9-ef0012685f89,4ad722ca-10fc-4a83-91c9-ef0012685f89,1,0,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,1,0,3b033d29-0de7-49dd-90bc-f414b28426d7,3b033d29-0de7-49dd-90bc-f414b28426d7,1,0,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,1,0,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,1,0,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,1,0,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,1,0,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,1,0,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,1,0,2e4da82c-dddb-4462-b34f-6511cd2a8356,2e4da82c-dddb-4462-b34f-6511cd2a8356,1,0,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,1,0,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,1,0,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,1,0,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,1,0,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,1,0,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,1,0,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,1,0,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,1,0,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,1,0,646def82-bc88-4187-8be0-93938656a20f,646def82-bc88-4187-8be0-93938656a20f,1,0,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,1,0,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,1,0,06323ebd-5f74-494a-99a5-eb77e23d8637,06323ebd-5f74-494a-99a5-eb77e23d8637,1,0,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,1,0,7f6222c1-1a50-4565-b66b-bcb430674efc,7f6222c1-1a50-4565-b66b-bcb430674efc,1,0,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,1,0,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,1,0,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,1,0,52ae6431-afb3-4dea-b106-00e11b174ec7,52ae6431-afb3-4dea-b106-00e11b174ec7,1,0,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,1,0,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,1,0,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,1,0,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,1,0,8b83324c-e10e-49d1-99d7-5bc468c25975,8b83324c-e10e-49d1-99d7-5bc468c25975,1,0,ddb75923-27bf-4996-b024-4bc6eb0f59a7,ddb75923-27bf-4996-b024-4bc6eb0f59a7,1,0,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,1,0,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,1,0,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,1,0,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,1,0,3be0acc7-223a-46ec-9ea2-ec99b869fa78,3be0acc7-223a-46ec-9ea2-ec99b869fa78,1,0,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,1,0,642154b8-97da-4c4f-bf34-c1124215077d,642154b8-97da-4c4f-bf34-c1124215077d,1,0,abc10867-39ae-46bf-8bd7-90f645919235,abc10867-39ae-46bf-8bd7-90f645919235,1,0,b3396504-8ccb-43d6-9a0f-ab259ba0a542,b3396504-8ccb-43d6-9a0f-ab259ba0a542,1,0,f59f91c5-026a-4dc5-996e-0d59814a9604,f59f91c5-026a-4dc5-996e-0d59814a9604,1,0,aac9966f-e9ea-4106-97bb-6b9822939bc7,aac9966f-e9ea-4106-97bb-6b9822939bc7,1,0,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,1,0,486083d8-33b1-453f-9f05-5ff867e2f4ba,486083d8-33b1-453f-9f05-5ff867e2f4ba,1,0,e4f9d9f6-38d7-4056-a95a-987ad2da2211,e4f9d9f6-38d7-4056-a95a-987ad2da2211,1,0,22c21c2b-4297-43b2-88f0-9555d22f7a14,22c21c2b-4297-43b2-88f0-9555d22f7a14,1,0,734f61c4-5429-4a09-8697-8949ac5e6bd1,734f61c4-5429-4a09-8697-8949ac5e6bd1,1,0,d04e0e2d-0a5f-4866-b0b3-b582915db899,d04e0e2d-0a5f-4866-b0b3-b582915db899,1,0,19649d3f-52aa-4054-bb84-a6a11d212495,19649d3f-52aa-4054-bb84-a6a11d212495,1,0,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,1,0,58321939-f25a-456d-8dee-97e64743dc2e,58321939-f25a-456d-8dee-97e64743dc2e,1,0,416fba62-70c4-4f8c-b10b-56d47b27ca35,416fba62-70c4-4f8c-b10b-56d47b27ca35,1,0,ec48a164-bc30-4e36-a40a-a3cca07aea0d,ec48a164-bc30-4e36-a40a-a3cca07aea0d,1,0,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,1,0,b7736108-89bd-44eb-89c1-8a5a774058f1,b7736108-89bd-44eb-89c1-8a5a774058f1,1,0,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,1,0,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,1,0,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,1,0,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,1,0,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,1,0,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,1,0,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,1,0,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,1,0,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,1,0,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,1,0,1126157b-64c0-4d64-8551-f31c5ed0fd29,1126157b-64c0-4d64-8551-f31c5ed0fd29,1,0,6ae6e515-5cd4-4eca-8602-c6abe6d66276,6ae6e515-5cd4-4eca-8602-c6abe6d66276,1,0,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,1,0,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,1,0,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,1,0,2e17464f-9cef-4812-865f-4eb77ff16b6a,2e17464f-9cef-4812-865f-4eb77ff16b6a,1,0,e5ecbb1f-981d-4928-9335-22216879f7e2,e5ecbb1f-981d-4928-9335-22216879f7e2,1,0,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,1,0,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,1,0,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,1,0,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,1,0,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,1,0,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,1,0,a50fcacc-6d2d-496c-bea0-9c73cd153437,a50fcacc-6d2d-496c-bea0-9c73cd153437,1,0,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,1,0,0fb72f4b-e6f6-4b70-8ec7-fdb6d4ad928e,0fb72f4b-e6f6-4b70-8ec7-fdb6d4ad928e,1,0,a5633248-8611-4e9b-b223-2f59e7b84a65,a5633248-8611-4e9b-b223-2f59e7b84a65,1,0,a05fdefd-c0c6-4069-bb05-3fcd22819289,a05fdefd-c0c6-4069-bb05-3fcd22819289,1,0,1514f388-3c36-422f-9e23-83054934e4b3,1514f388-3c36-422f-9e23-83054934e4b3,1,0,841f4416-a85a-48f7-bae2-19865cf2979e,841f4416-a85a-48f7-bae2-19865cf2979e,1,0,8df13cd3-1b03-4c84-98e9-c771c1d5254a,8df13cd3-1b03-4c84-98e9-c771c1d5254a,1,0,a79ddc43-74f6-4997-bfc4-bdf7bc71cdd6,a79ddc43-74f6-4997-bfc4-bdf7bc71cdd6,1,0,29477058-cb8d-4fd4-b3a1-41565aeabf97,29477058-cb8d-4fd4-b3a1-41565aeabf97,1,0,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,1,0,26aea96b-20f8-4e35-b55f-4fe3602e6597,26aea96b-20f8-4e35-b55f-4fe3602e6597,1,0,a3a3a211-e361-4e41-a6f8-d731a366c163,a3a3a211-e361-4e41-a6f8-d731a366c163,1,0,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,1,0,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,1,0,ca01417c-0ffd-4e00-91e8-93cd305be82d,ca01417c-0ffd-4e00-91e8-93cd305be82d,1,0,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,1,0,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,1,0,6ac7db0c-18ed-4d3b-956a-5985214db474,6ac7db0c-18ed-4d3b-956a-5985214db474,1,0,267103e0-6703-4a74-bb4f-af610d7ef332,267103e0-6703-4a74-bb4f-af610d7ef332,1,0,e1823be2-b646-4a1a-a9a9-c925a12c0586,e1823be2-b646-4a1a-a9a9-c925a12c0586,1,0,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,1,0,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,1,0,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,1,0,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,1,0,22c60cbc-429f-40d9-bf8b-681b7786c41d,22c60cbc-429f-40d9-bf8b-681b7786c41d,1,0,d4e53d41-9335-4a1e-a06e-410c46de1d1c,d4e53d41-9335-4a1e-a06e-410c46de1d1c,1,0,4405bfaa-699a-497b-a15c-0302b86c834c,4405bfaa-699a-497b-a15c-0302b86c834c,1,0,3b3e7b9d-67f8-4cf2-ad1a-29d124169691,3b3e7b9d-67f8-4cf2-ad1a-29d124169691,1,0,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,1,0,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,1,0,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,1,0,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,1,0,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,1,0,4654d192-74bf-430f-abee-6f4dc431b182,4654d192-74bf-430f-abee-6f4dc431b182,1,0,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1,0,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,1,0,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,1,0,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,1,0,3f7ee937-d853-47b7-a1f5-d821208e3531,3f7ee937-d853-47b7-a1f5-d821208e3531,1,0,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,1,0,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,1,0,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,1,0,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,1,0,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,1,0,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,1,0,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,1,0,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,1,0,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,1,0,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,1,0,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,1,0,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,1,0,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,1,0,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,1,0,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,1,0,90032ffa-f117-4a34-82f8-cc7e5a22a542,90032ffa-f117-4a34-82f8-cc7e5a22a542,1,0,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,1,0,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,1,0,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,1,0,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,1,0,49e787c9-753a-468a-b8dd-2e970d9a1fed,49e787c9-753a-468a-b8dd-2e970d9a1fed,1,0,e871dea7-1953-4511-90b0-e0957afac4c0,e871dea7-1953-4511-90b0-e0957afac4c0,1,0,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,1,0,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,1,0,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,1,0,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,1,0,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,1,0,40ae107d-67a8-404c-adf9-1a760bba94ff,40ae107d-67a8-404c-adf9-1a760bba94ff,1,0,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,1,0,f3bd841b-fb36-4462-9627-b51801e563cd,f3bd841b-fb36-4462-9627-b51801e563cd,1,0,0a23f273-5589-4a48-be3a-eee7565749aa,0a23f273-5589-4a48-be3a-eee7565749aa,1,0,494eb9d9-4a10-4e85-b511-375408f21bbe,494eb9d9-4a10-4e85-b511-375408f21bbe,1,0,3fbbca3f-d4fa-4d65-a08f-0a348b9030c6,3fbbca3f-d4fa-4d65-a08f-0a348b9030c6,1,0,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,1,0,7172bed5-b12b-4e83-b15d-1d95b63a6272,7172bed5-b12b-4e83-b15d-1d95b63a6272,1,0,25d75a3c-b801-4b1e-aed8-90e667f36c67,25d75a3c-b801-4b1e-aed8-90e667f36c67,1,0,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,1,0,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,1,0,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,1,0,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,1,0,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,1,0,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,1,0,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,1,0,49e21b87-beae-4640-a497-ef468da0cbbc,49e21b87-beae-4640-a497-ef468da0cbbc,1,0,bbdfeebd-cda0-4911-8f31-553d751340a7,bbdfeebd-cda0-4911-8f31-553d751340a7,1,0,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,1,0,20aad006-5b1e-4cc2-94ef-668dd002667b,20aad006-5b1e-4cc2-94ef-668dd002667b,1,0,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,1,0,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,1,0,2befb2e3-7354-4a01-83d6-b24262704a5e,2befb2e3-7354-4a01-83d6-b24262704a5e,1,0,5b93975e-b2a4-4102-a060-2667f5813c94,5b93975e-b2a4-4102-a060-2667f5813c94,1,0,dcdc9c65-c2d5-4531-a325-f64b3861cbab,dcdc9c65-c2d5-4531-a325-f64b3861cbab,1,0,8d2bfd40-f185-4eab-b374-872d49310eb2,8d2bfd40-f185-4eab-b374-872d49310eb2,1,0,523de426-e5a6-49e0-8144-c637f80d8ddd,523de426-e5a6-49e0-8144-c637f80d8ddd,1,0,09256328-6205-4b04-b908-3287ae8ded75,09256328-6205-4b04-b908-3287ae8ded75,1,0,05a6e161-9791-4c5b-8753-bd6370cc4cc9,05a6e161-9791-4c5b-8753-bd6370cc4cc9,1,0,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,1,0,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,1,0,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,1,0,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,1,0,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,1,0,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,1,0,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,1,0,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,1,0,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,1,0,393074c4-0afc-4232-8101-11a4ea6ed28a,393074c4-0afc-4232-8101-11a4ea6ed28a,1,0,5ff23123-450c-40ae-9b79-c540da53e2a0,5ff23123-450c-40ae-9b79-c540da53e2a0,1,0,639339a1-7de5-4b05-adf3-f60e7edd922c,639339a1-7de5-4b05-adf3-f60e7edd922c,1,0,dea9af9d-13c0-40d4-a9b0-1908e0a58795,dea9af9d-13c0-40d4-a9b0-1908e0a58795,1,0,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,1,0,1abeb10b-0558-4478-8f51-d0964ba3c274,1abeb10b-0558-4478-8f51-d0964ba3c274,1,0,38325a66-588a-4db0-8e0c-21d239408369,38325a66-588a-4db0-8e0c-21d239408369,1,0,7c27e885-33fd-4da2-a60d-50336c0189b0,7c27e885-33fd-4da2-a60d-50336c0189b0,1,0,0e1a45b0-d95d-415f-b954-5689610aa393,0e1a45b0-d95d-415f-b954-5689610aa393,1,0,4736b3d3-f696-4bdd-b0e3-0884ea88f623,4736b3d3-f696-4bdd-b0e3-0884ea88f623,1,0,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,1,0,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,1,0,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,1,0,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,1,0,01a73950-3e8f-4f56-903f-af0d9574e72e,01a73950-3e8f-4f56-903f-af0d9574e72e,1,0,14bd0844-c829-4325-aa7f-0f417bf955dc,14bd0844-c829-4325-aa7f-0f417bf955dc,1,0,7f1cd658-ca10-49c6-80ef-b8956f3269ea,7f1cd658-ca10-49c6-80ef-b8956f3269ea,1,0,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,1,0,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,1,0,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,1,0,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,1,0,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,1,0,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,1,0,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,1,0,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,1,0,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,1,0,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,1,0,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,1,0,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,1,0,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,1,0,c7f817ee-9f6a-454c-95a0-b279fd08055e,c7f817ee-9f6a-454c-95a0-b279fd08055e,1,0,1d49b1bb-5f90-46e4-adcf-55ad46442648,1d49b1bb-5f90-46e4-adcf-55ad46442648,1,0,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,1,0,259ede1f-05d3-4ece-8994-0ae3b2e89f49,259ede1f-05d3-4ece-8994-0ae3b2e89f49,1,0,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,1,0,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,1,0,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,1,0,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,1,0,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,1,0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,1,0,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,1,0,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,1,0,97edd94a-4bf2-4ed7-b98f-677f869b0715,97edd94a-4bf2-4ed7-b98f-677f869b0715,1,0,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,1,0,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,1,0,2fad50a6-6a3e-4f87-ab84-907364427a63,2fad50a6-6a3e-4f87-ab84-907364427a63,1,0,9567765b-8e02-4262-89a9-5c354109cc4c,9567765b-8e02-4262-89a9-5c354109cc4c,1,0,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1,0,258736e4-93c0-4a46-8caa-75be42c9f006,258736e4-93c0-4a46-8caa-75be42c9f006,1,0,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,1,0,56d0acf3-c888-4824-a6e4-27d61fa35415,56d0acf3-c888-4824-a6e4-27d61fa35415,1,0,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,1,0,439129dd-ad00-484c-b84a-fb325af979ed,439129dd-ad00-484c-b84a-fb325af979ed,1,0,dcae6376-f44c-421e-87f2-df83413c021e,dcae6376-f44c-421e-87f2-df83413c021e,1,0,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,1,0,151f2d0a-cc43-490d-ad7d-71390703aa72,151f2d0a-cc43-490d-ad7d-71390703aa72,1,0,2a515a4f-683b-4674-b097-62dd2d940c39,2a515a4f-683b-4674-b097-62dd2d940c39,1,0,d14058f5-dfd4-47eb-ae6d-01b7062f5940,d14058f5-dfd4-47eb-ae6d-01b7062f5940,1,0,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,1,0,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,1,0,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,1,0,fdb5b235-1978-4c2a-a03f-02341df00c3c,fdb5b235-1978-4c2a-a03f-02341df00c3c,1,0,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,1,0,38637f61-399a-4966-9e64-4751aecffa31,38637f61-399a-4966-9e64-4751aecffa31,1,0,0f38a18b-a36c-45fe-86c1-396634aaa5df,0f38a18b-a36c-45fe-86c1-396634aaa5df,1,0,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,1,0,a81c783d-2dea-4dde-9ca1-7b23d609eb22,a81c783d-2dea-4dde-9ca1-7b23d609eb22,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,1,0,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,1,0,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,1,0,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,1,0,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,1,0,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0bf5e9c1-905a-4202-8b96-ed831b41be4b,1,0,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,1,0,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,1,0,be15e947-f671-4848-ada1-51239af73615,be15e947-f671-4848-ada1-51239af73615,1,0,3fc019d1-aec8-4835-96c5-3bbf43da0b94,3fc019d1-aec8-4835-96c5-3bbf43da0b94,1,0,5371672a-c8e0-4c12-834e-f23dd885b49a,5371672a-c8e0-4c12-834e-f23dd885b49a,1,0,d3e0dd8f-886a-4441-8f05-fd629da80f07,d3e0dd8f-886a-4441-8f05-fd629da80f07,1,0,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,1,0,1f927f76-5523-4880-9d26-d69a059f2b67,1f927f76-5523-4880-9d26-d69a059f2b67,1,0,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,1,0,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,1,0,b0b63551-4e83-4201-af9a-b4ab150c43a5,b0b63551-4e83-4201-af9a-b4ab150c43a5,1,0,ca85912b-87b4-481e-9184-017364b4603d,ca85912b-87b4-481e-9184-017364b4603d,1,0,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,1,0,2650db63-ca98-4a8a-8c36-165548aa5279,2650db63-ca98-4a8a-8c36-165548aa5279,1,0,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,1,0,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,1,0,a69525c7-27ff-48df-b26b-325ba580a53e,a69525c7-27ff-48df-b26b-325ba580a53e,1,0,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,1,0,33c66a15-e48e-406a-a77c-02af72ae96d5,33c66a15-e48e-406a-a77c-02af72ae96d5,1,0,e57f4619-b5ed-44de-a186-a13a3897731b,e57f4619-b5ed-44de-a186-a13a3897731b,1,0,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,1,0,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,1,0,459ed297-0c0d-4bdb-90a3-da387868f040,459ed297-0c0d-4bdb-90a3-da387868f040,1,0,ccb5b9a7-1a10-4803-b455-0350afe4b584,ccb5b9a7-1a10-4803-b455-0350afe4b584,1,0,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,1,0,d3c9b925-6b74-42db-8b21-ab21d24797d1,d3c9b925-6b74-42db-8b21-ab21d24797d1,1,0,c5033dd2-0911-4124-8688-dc9dabf3155f,c5033dd2-0911-4124-8688-dc9dabf3155f,1,0,274357df-cb5c-407d-ae72-58046c310db2,274357df-cb5c-407d-ae72-58046c310db2,1,0,5467001e-d025-4669-b16e-26381ac4403f,5467001e-d025-4669-b16e-26381ac4403f,1,0,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,1,0,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,1,0,bb3a9973-67ce-479e-8668-c2f3bb20301e,bb3a9973-67ce-479e-8668-c2f3bb20301e,1,0,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,1,0,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,1,0,37169451-1464-4f24-8ca6-802963ffb636,37169451-1464-4f24-8ca6-802963ffb636,1,0,c3a958b1-590f-4418-a74f-5982b478cf52,c3a958b1-590f-4418-a74f-5982b478cf52,1,0,ef0e618d-0942-460a-ac65-9aca2fed976e,ef0e618d-0942-460a-ac65-9aca2fed976e,1,0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,1,0,2ac8bd69-9fbf-4f15-b58d-397d9e903532,2ac8bd69-9fbf-4f15-b58d-397d9e903532,1,0,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,1,0,5b460b92-2c74-4f59-88b2-18d9aac42c04,5b460b92-2c74-4f59-88b2-18d9aac42c04,1,0,db05d35b-5f53-4c27-ba80-b477b9a98299,db05d35b-5f53-4c27-ba80-b477b9a98299,1,0,fa872ae1-b699-46fe-9d6a-e42e1388752b,fa872ae1-b699-46fe-9d6a-e42e1388752b,1,0,1acf34e6-c428-4130-82f0-5160dfcc0858,1acf34e6-c428-4130-82f0-5160dfcc0858,1,0,57046262-b9ce-4670-9cf5-6db9e58dd0d5,57046262-b9ce-4670-9cf5-6db9e58dd0d5,1,0,a9824176-36d5-4be5-9984-f4312ff48515,a9824176-36d5-4be5-9984-f4312ff48515,1,0,8e980ca0-1627-45e8-bd27-5dd1ac199459,8e980ca0-1627-45e8-bd27-5dd1ac199459,1,0,8b653beb-af9f-4f39-b691-ae14f80b7cd6,8b653beb-af9f-4f39-b691-ae14f80b7cd6,1,0,77559c11-713f-454d-aff4-56649e1350e9,77559c11-713f-454d-aff4-56649e1350e9,1,0,0c965703-c1d0-48b7-80f9-b8d869ff98f5,0c965703-c1d0-48b7-80f9-b8d869ff98f5,1,0,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,1,0,7ba42162-557b-4e34-8aca-0cdee8cb2452,7ba42162-557b-4e34-8aca-0cdee8cb2452,1,0,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,1,0,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,1,0,dd577924-c6cb-4aa9-9db5-366d8958d00f,dd577924-c6cb-4aa9-9db5-366d8958d00f,1,0,8ed8f72e-404a-4be4-a44d-ddebbad5f411,8ed8f72e-404a-4be4-a44d-ddebbad5f411,1,0,e919bc4c-86e6-44f6-be27-5a729b63d042,e919bc4c-86e6-44f6-be27-5a729b63d042,1,0,ec580e4f-1518-4923-a10e-bc1da8688b37,ec580e4f-1518-4923-a10e-bc1da8688b37,1,0,91c3902a-314f-4d40-8bcc-8dd131fed2f4,91c3902a-314f-4d40-8bcc-8dd131fed2f4,1,0,ae2b21c5-9349-49e8-9627-26f05c21f43a,ae2b21c5-9349-49e8-9627-26f05c21f43a,1,0,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,1,0,917a19d7-73db-4247-b892-397598d67879,917a19d7-73db-4247-b892-397598d67879,1,0,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1,0,d8066600-c669-449d-a187-fdd3af8f7afa,d8066600-c669-449d-a187-fdd3af8f7afa,1,0,dadf86a6-c118-4827-b1b9-6cfee731242f,dadf86a6-c118-4827-b1b9-6cfee731242f,1,0,45bf7b20-f048-491a-a989-e50bea13d028,45bf7b20-f048-491a-a989-e50bea13d028,1,0,9ad3b432-5b49-44ee-9d8d-83c36458d927,9ad3b432-5b49-44ee-9d8d-83c36458d927,1,0,a9967bff-53b9-4295-a253-3647d956d3cb,a9967bff-53b9-4295-a253-3647d956d3cb,1,0,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,1,0,b8a31397-8974-44ec-92b0-7cbdc481cf7e,b8a31397-8974-44ec-92b0-7cbdc481cf7e,1,0,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,1,0,fb16c4d5-854c-4525-92be-b21fa2df5b0d,fb16c4d5-854c-4525-92be-b21fa2df5b0d,1,0,5771de21-2086-432b-ad91-de14a39bd5bc,5771de21-2086-432b-ad91-de14a39bd5bc,1,0,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,1,0,ed96fbfa-bda7-405c-9073-d0b6feffedad,ed96fbfa-bda7-405c-9073-d0b6feffedad,1,0,50c724cb-dde1-4313-9492-b1750bd0afc1,50c724cb-dde1-4313-9492-b1750bd0afc1,1,0,12901981-6106-4471-ab3a-e127c2bb4ebd,12901981-6106-4471-ab3a-e127c2bb4ebd,1,0,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,1,0,d5ea5dea-233d-4106-b9ba-f030d4f762ef,d5ea5dea-233d-4106-b9ba-f030d4f762ef,1,0,903af05e-5ac5-46aa-843b-d74f9e417c1d,903af05e-5ac5-46aa-843b-d74f9e417c1d,1,0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,1,0,a344290a-c9be-47a7-95ad-ced1b52a0995,a344290a-c9be-47a7-95ad-ced1b52a0995,1,0,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,1,0,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,1,0,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,1,0,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,1,0,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,1,0,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,1,0,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,1,0,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,1,0,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,1,0,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,1,0,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,1,0,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,1,0,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,1,0,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,1,0,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,1,0,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,1,0,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,1,0,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,1,0,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,1,0,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,1,0,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,1,0,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,1,0,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,1,0,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,1,0,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,1,0,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,1,0,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,1,0,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,1,0,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,1,0,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,1,0,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,1,0,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,1,0,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,1,0,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,1,0,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,1,0,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,1,0,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,1,0,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,1,0,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,1,0,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,1,0,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,1,0,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,1,0,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,1,0,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,1,0,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,1,0,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,1,0,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,1,0,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,1,0,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,1,0,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,1,0,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,1,0,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,1,0,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,1,0,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,1,0,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,1,0,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,1,0,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,1,0,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,1,0,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,1,0,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,1,0,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,1,0,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,1,0,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,1,0,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,1,0,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,1,0,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,1,0,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,1,0,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,1,0,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,1,0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,1,0,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,1,0,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,1,0,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,1,0,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,1,0,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,1,0,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,1,0,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,1,0,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,1,0,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,1,0,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,1,0,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,1,0,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,1,0,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,1,0,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,1,0,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,1,0,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,1,0,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,1,0,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,1,0,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,1,0,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,1,0,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,1,0,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,1,0,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,1,0,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,1,0,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,1,0,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,1,0,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,1,0,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,1,0,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1,0,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,1,0,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,1,0,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,1,0,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,1,0,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,1,0,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,1,0,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,1,0,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,1,0,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,1,0,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,1,0,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,1,0,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,1,0,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,1,0,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,1,0,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,1,0,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,1,0,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,1,0,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,1,0,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,1,0,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,1,0,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,1,0,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,1,0,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,1,0,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,1,0,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,1,0,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,1,0,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,1,0,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,1,0,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,1,0,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,1,0,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,1,0,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,1,0,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,1,0,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,1,0,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,1,0,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,1,0,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,1,0,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,1,0,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,1,0,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,1,0,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,1,0,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,1,0,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,1,0,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,1,0,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,1,0,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,1,0,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,1,0,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,1,0,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,1,0,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,1,0,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,1,0,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,1,0,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,1,0,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,1,0,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,1,0,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,1,0,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,1,0,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,1,0,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,1,0,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,1,0,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,1,0,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,1,0,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,1,0,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,1,0,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,1,0,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,1,0,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,1,0,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,1,0,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,1,0,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,1,0,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,1,0,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,1,0,b19f1223-5ebe-4446-bacc-bc7d53486f2e,b19f1223-5ebe-4446-bacc-bc7d53486f2e,1,0,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,1,0,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,1,0,bf3167d6-3047-482a-b280-184f446ae7a3,bf3167d6-3047-482a-b280-184f446ae7a3,1,0,50c47c0a-a199-4020-9df4-91b17c159454,50c47c0a-a199-4020-9df4-91b17c159454,1,0,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,1,0,faecdc33-fed8-4b44-96f4-4215c26959b6,faecdc33-fed8-4b44-96f4-4215c26959b6,1,0,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,1,0,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,1,0,9df3792e-a4ee-4a2c-9296-c1384925521e,9df3792e-a4ee-4a2c-9296-c1384925521e,1,0,03d423db-f98a-468f-9040-5b76454e5a98,03d423db-f98a-468f-9040-5b76454e5a98,1,0,08f394f9-d254-4fe5-8651-a69c96de7a62,08f394f9-d254-4fe5-8651-a69c96de7a62,1,0,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,1,0,6aff6b2f-660b-4d75-9064-fed7a6b0feac,6aff6b2f-660b-4d75-9064-fed7a6b0feac,1,0,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,1,0,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,1,0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,1,0,e60a9221-7676-456f-8a01-b317b03a278b,e60a9221-7676-456f-8a01-b317b03a278b,1,0,4e81ec90-f668-49ca-9193-22337bafb01b,4e81ec90-f668-49ca-9193-22337bafb01b,1,0,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,1,0,cd60adec-52d6-4fa8-85ca-26551196432c,cd60adec-52d6-4fa8-85ca-26551196432c,1,0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,1,0,b71ddbdb-08bb-46be-a79d-319c4a557e76,b71ddbdb-08bb-46be-a79d-319c4a557e76,1,0,d3dfa867-3d52-4872-a69e-f27636abe1bd,d3dfa867-3d52-4872-a69e-f27636abe1bd,1,0,6952d1aa-7132-4e40-8542-f64a4dc1e029,6952d1aa-7132-4e40-8542-f64a4dc1e029,1,0,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,1,0,1621811b-dfd3-4c58-8e15-ced16690147a,1621811b-dfd3-4c58-8e15-ced16690147a,1,0,3f266e51-0476-4b7f-8d61-6f9f4456049d,3f266e51-0476-4b7f-8d61-6f9f4456049d,1,0,2b9ce591-ff13-4c2d-85c4-632a2609a211,2b9ce591-ff13-4c2d-85c4-632a2609a211,1,0,689ca0ec-61ce-4590-b73b-ac81e8f1d459,689ca0ec-61ce-4590-b73b-ac81e8f1d459,1,0,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,1,0,55ad36d7-399e-4b82-8d1c-d45bd890abfe,55ad36d7-399e-4b82-8d1c-d45bd890abfe,1,0,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,1,0,1b39a65f-5425-4bcb-85bd-1425274af8a8,1b39a65f-5425-4bcb-85bd-1425274af8a8,1,0,392a0618-a41a-4713-a561-f3a80b85abd8,392a0618-a41a-4713-a561-f3a80b85abd8,1,0,a453384d-658d-40f1-ac69-578aa3a24e39,a453384d-658d-40f1-ac69-578aa3a24e39,1,0,2215a441-b9b1-4e5c-8df3-e6cee9226c43,2215a441-b9b1-4e5c-8df3-e6cee9226c43,1,0,2a8d4908-ea0d-4837-be3f-bd78f6b61254,2a8d4908-ea0d-4837-be3f-bd78f6b61254,1,0,ec1deb79-7369-4b26-8e91-f51399e8052a,ec1deb79-7369-4b26-8e91-f51399e8052a,1,0,75dde4fb-3a1a-450c-95c2-c1f95a781db9,75dde4fb-3a1a-450c-95c2-c1f95a781db9,1,0,0ae3ac56-160a-417e-9952-719d02e7f089,0ae3ac56-160a-417e-9952-719d02e7f089,1,0,f5b3983d-d22d-44a8-9069-0a60d8b858bf,f5b3983d-d22d-44a8-9069-0a60d8b858bf,1,0,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,1,0,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,1,0,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,1,0,9f36d26e-aa71-44d5-ac27-9aaa643555c3,9f36d26e-aa71-44d5-ac27-9aaa643555c3,1,0,87b8b5d7-d3d6-450a-adb1-5c875257ec80,87b8b5d7-d3d6-450a-adb1-5c875257ec80,1,0,e3640efe-e46c-4588-b251-dda23bf0641d,e3640efe-e46c-4588-b251-dda23bf0641d,1,0,bb6e6574-4328-4cf5-a043-a7d8f6c81414,bb6e6574-4328-4cf5-a043-a7d8f6c81414,1,0,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,1,0,522a4bff-34d3-46b2-8c66-0b30d881a86e,522a4bff-34d3-46b2-8c66-0b30d881a86e,1,0,3d7908b1-bd82-475e-8488-fafcbe3458ee,3d7908b1-bd82-475e-8488-fafcbe3458ee,1,0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1,0,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,1,0,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,1,0,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,1,0,0f9c08c2-e7fa-4ea0-a935-f927feb01131,0f9c08c2-e7fa-4ea0-a935-f927feb01131,1,0,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,1,0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,1,0,57069b56-f732-41c0-9a75-cbdb1e88556c,57069b56-f732-41c0-9a75-cbdb1e88556c,1,0,6d042890-27b2-4efc-935e-8190bb57c037,6d042890-27b2-4efc-935e-8190bb57c037,1,0,23e79add-7f1c-422a-9df1-8f76ebf805df,23e79add-7f1c-422a-9df1-8f76ebf805df,1,0,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,1,0,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,1,0,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,1,0,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,1,0,5dcd8e28-b058-405a-bac4-defab7d4b789,5dcd8e28-b058-405a-bac4-defab7d4b789,1,0,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,1,0,077af11c-fd3c-4e87-b169-5f3137464f77,077af11c-fd3c-4e87-b169-5f3137464f77,1,0,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,1,0,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,1,0,da8f7f30-eb80-44db-a451-348306c90cd8,da8f7f30-eb80-44db-a451-348306c90cd8,1,0,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,1,0,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,1,0,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,1,0,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,1,0,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,1,0,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,1,0,9847676d-f44d-46a0-83e2-4a43a835caf8,9847676d-f44d-46a0-83e2-4a43a835caf8,1,0,43c18cae-21a9-413b-a350-d5cf826980f0,43c18cae-21a9-413b-a350-d5cf826980f0,1,0,16773cdb-b979-42d5-a2a5-d4b79e8737bd,16773cdb-b979-42d5-a2a5-d4b79e8737bd,1,0,c28a190a-f487-4e99-b8f8-6928268086f8,c28a190a-f487-4e99-b8f8-6928268086f8,1,0,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,1,0,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,1,0,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,1,0,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,1,0,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,1,0,f321e378-6d50-4567-8434-813f367d3a65,f321e378-6d50-4567-8434-813f367d3a65,1,0,27246fd8-a8a3-4244-b49a-c0372a812167,27246fd8-a8a3-4244-b49a-c0372a812167,1,0,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,1,0,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,1,0,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,1,0,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,1,0,5d338e31-a56b-45f0-8a62-0270ca543f6a,5d338e31-a56b-45f0-8a62-0270ca543f6a,1,0,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,1,0,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,1,0,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,1,0,a7098d41-a978-4c77-937c-8deebdfe0bcd,a7098d41-a978-4c77-937c-8deebdfe0bcd,1,0,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,1,0,c11d967b-1250-4345-90b0-011a96c5ae5e,c11d967b-1250-4345-90b0-011a96c5ae5e,1,0,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,1,0,24eed105-f612-4340-ad79-388a7b39b58c,24eed105-f612-4340-ad79-388a7b39b58c,1,0,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,1,0,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,1,0,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,1,0,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,1,0,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,1,0,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,1,0,6a2add61-edb7-4561-bae9-06b3741e7726,6a2add61-edb7-4561-bae9-06b3741e7726,1,0,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,1,0,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,1,0,80048d97-e917-4d03-bb49-e797e63f7fd2,80048d97-e917-4d03-bb49-e797e63f7fd2,1,0,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,1,0,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,1,0,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,1,0,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,1,0,e1314cd1-e662-4c29-ad51-492cb0029883,e1314cd1-e662-4c29-ad51-492cb0029883,1,0,ae3876e2-bd06-415b-9d9a-b77d787be09e,ae3876e2-bd06-415b-9d9a-b77d787be09e,1,0,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,1,0,4718392b-477c-496b-9d28-ddbdaa7a04f2,4718392b-477c-496b-9d28-ddbdaa7a04f2,1,0,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,1,0,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,1,0,9690842c-7a2c-4b5d-a238-f730afc49a7b,9690842c-7a2c-4b5d-a238-f730afc49a7b,1,0,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,1,0,cd6b749d-55a4-4e10-a933-8d97bfe2f9df,cd6b749d-55a4-4e10-a933-8d97bfe2f9df,1,0,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,1,0,b76c3bd6-924a-4378-acbe-6f17232b201b,b76c3bd6-924a-4378-acbe-6f17232b201b,1,0,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,1,0,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,1,0,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,1,0,9d358304-3fd0-4ec6-9400-cc498ff2f751,9d358304-3fd0-4ec6-9400-cc498ff2f751,1,0,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,1,0,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,1,0,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,1,0,74067eee-6cd4-4ae3-becc-457ecb51dc9a,74067eee-6cd4-4ae3-becc-457ecb51dc9a,1,0,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,1,0,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,1,0,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,1,0,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,1,0,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,1,0,343b979a-97e3-4eac-a314-3bd3eea9c15c,343b979a-97e3-4eac-a314-3bd3eea9c15c,1,0,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,1,0,f5bb88eb-c239-4ae3-a297-dfbbd679e008,f5bb88eb-c239-4ae3-a297-dfbbd679e008,1,0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,1,0,f259b6b4-d582-429f-a16f-027a6bcb7438,f259b6b4-d582-429f-a16f-027a6bcb7438,1,0,9f32e85c-2ed6-41db-b0ec-6d8596940e80,9f32e85c-2ed6-41db-b0ec-6d8596940e80,1,0,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,1,0,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,1,0,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,1,0,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,1,0,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,1,0,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,1,0,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,1,0,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,1,0,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,1,0,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,1,0,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,1,0,aa0c32ae-da52-4df9-8b77-99ea31f8df81,aa0c32ae-da52-4df9-8b77-99ea31f8df81,1,0,d7dcd391-3a0e-4aa9-9b53-467a1de67593,d7dcd391-3a0e-4aa9-9b53-467a1de67593,1,0,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,1,0,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,1,0,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,1,0,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,1,0,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,1,0,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,1,0,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,1,0,1511c2e3-aeb4-422a-b6ae-03412b714c93,1511c2e3-aeb4-422a-b6ae-03412b714c93,1,0,00e48a23-eb5b-4a29-b36c-218ab9760f23,00e48a23-eb5b-4a29-b36c-218ab9760f23,1,0,331db120-ba88-4eb3-a8ec-10691be82e2d,331db120-ba88-4eb3-a8ec-10691be82e2d,1,0,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,1,0,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,1,0,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,1,0,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,1,0,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,1,0,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,1,0,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,1,0,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,1,0,9ee03c48-c338-4655-9095-d490231df2a3,9ee03c48-c338-4655-9095-d490231df2a3,1,0,3924c17c-6ee3-4406-8023-0a79a242e389,3924c17c-6ee3-4406-8023-0a79a242e389,1,0,84a159ed-bc5f-4497-94d1-94b187b0bffe,84a159ed-bc5f-4497-94d1-94b187b0bffe,1,0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,1,0,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,1,0,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,1,0,f95adb50-fa0b-434c-93dd-b7fd211220b7,f95adb50-fa0b-434c-93dd-b7fd211220b7,1,0,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,1,0,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,1,0,bd69bf55-dee0-4553-8f90-5fd025c0f773,bd69bf55-dee0-4553-8f90-5fd025c0f773,1,0,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,1,0,3cda70d0-3116-4508-82ea-5ea0f0921262,3cda70d0-3116-4508-82ea-5ea0f0921262,1,0,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,1,0,f415296e-fceb-4835-abe9-17bb17a5d5e5,f415296e-fceb-4835-abe9-17bb17a5d5e5,1,0,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,1,0,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,1,0,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,1,0,c8679d82-075c-4556-8231-c004d144fe61,c8679d82-075c-4556-8231-c004d144fe61,1,0,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,1,0,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,1,0,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,1,0,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,1,0,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,1,0,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,1,0,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,1,0,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,1,0,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,1,0,91d7687b-7627-473f-a08d-433f9d385107,91d7687b-7627-473f-a08d-433f9d385107,1,0,83db1b00-e9e3-41da-8a59-47589dcfd618,83db1b00-e9e3-41da-8a59-47589dcfd618,1,0,91d2d798-1498-4c52-aa7b-99db4b992876,91d2d798-1498-4c52-aa7b-99db4b992876,1,0,e85a03d3-e7c7-4058-992a-515a557d9e52,e85a03d3-e7c7-4058-992a-515a557d9e52,1,0,d3a1d247-8f4a-45af-9861-7e313a100209,d3a1d247-8f4a-45af-9861-7e313a100209,1,0,83385f31-2cdf-44a1-85c3-461e4ad5fd45,83385f31-2cdf-44a1-85c3-461e4ad5fd45,1,0,b55b06db-604e-4fb9-9253-638c747bd8f9,b55b06db-604e-4fb9-9253-638c747bd8f9,1,0,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,1,0,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,1,0,deb69010-80b0-4e28-acc7-8c50e8e6f873,deb69010-80b0-4e28-acc7-8c50e8e6f873,1,0,1a9177fe-6699-42b3-9588-eed9c6008c2d,1a9177fe-6699-42b3-9588-eed9c6008c2d,1,0,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,1,0,ae698468-f42a-4400-aee6-fd849740e634,ae698468-f42a-4400-aee6-fd849740e634,1,0,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,1,0,6438435e-97cc-4bd2-98dc-e21cee55bb0f,6438435e-97cc-4bd2-98dc-e21cee55bb0f,1,0,00579e31-e97d-4d79-ba25-b8d500a17e7f,00579e31-e97d-4d79-ba25-b8d500a17e7f,1,0,5001bea4-c8f9-4950-9eda-d33125e3bb46,5001bea4-c8f9-4950-9eda-d33125e3bb46,1,0,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,1,0,e815010d-e03d-46e4-b482-c1556902cc26,e815010d-e03d-46e4-b482-c1556902cc26,1,0,98bdfd19-b993-43bd-b2e1-3535d001ff29,98bdfd19-b993-43bd-b2e1-3535d001ff29,1,0,00a1fdb2-d233-4179-b78a-a7e27d9c03c5,00a1fdb2-d233-4179-b78a-a7e27d9c03c5,1,0,dd03e170-4186-495b-ae1c-fc66385d7ccf,dd03e170-4186-495b-ae1c-fc66385d7ccf,1,0,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,1,0,cdef5df6-f3a1-4950-b197-4f375914f885,cdef5df6-f3a1-4950-b197-4f375914f885,1,0,c1caff49-dc4b-4b3e-be47-122ea8b70416,c1caff49-dc4b-4b3e-be47-122ea8b70416,1,0,a1185a4c-7351-48b0-b662-61f61a1ad715,a1185a4c-7351-48b0-b662-61f61a1ad715,1,0,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,1,0,71d03545-df45-4c70-aa0d-3b916f2a9041,71d03545-df45-4c70-aa0d-3b916f2a9041,1,0,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,1,0,28a25822-2306-409a-a7c8-6f7e42bf25e8,28a25822-2306-409a-a7c8-6f7e42bf25e8,1,0,a45fa0c3-c363-4465-861f-13cedfeb79dd,a45fa0c3-c363-4465-861f-13cedfeb79dd,1,0,a72517c3-8c91-4e40-81ac-83c762789e87,a72517c3-8c91-4e40-81ac-83c762789e87,1,0,0233b335-7e26-4661-9850-8ab09d3178e3,0233b335-7e26-4661-9850-8ab09d3178e3,1,0,d942d536-5d01-4571-b910-abd973996a38,d942d536-5d01-4571-b910-abd973996a38,1,0,b82a7103-b872-49c3-b632-81d5a0051136,b82a7103-b872-49c3-b632-81d5a0051136,1,0,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,1,0,20c2053c-8ebd-4c07-8d95-956b424d047c,20c2053c-8ebd-4c07-8d95-956b424d047c,1,0,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,1,0,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,1,0,bef6081e-f377-41d6-83a1-b0e218a3fb46,bef6081e-f377-41d6-83a1-b0e218a3fb46,1,0,9b67bfd5-ef23-4205-b7ba-9466517e9999,9b67bfd5-ef23-4205-b7ba-9466517e9999,1,0,ea2c4c8e-23cc-4884-812e-1e959da48afc,ea2c4c8e-23cc-4884-812e-1e959da48afc,1,0,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,1,0,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,1,0,52e0ede7-de57-4640-b432-96e56131f277,52e0ede7-de57-4640-b432-96e56131f277,1,0,89888993-3b05-475e-ac76-3cd7ced93250,89888993-3b05-475e-ac76-3cd7ced93250,1,0,129f704b-cc63-4a4e-b6a7-9e53de4537a2,129f704b-cc63-4a4e-b6a7-9e53de4537a2,1,0,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,1,0,592f55e1-b004-44ef-878a-6c2016ccbeb0,592f55e1-b004-44ef-878a-6c2016ccbeb0,1,0,19add2bd-eede-4a05-901b-cf8ce49a638f,19add2bd-eede-4a05-901b-cf8ce49a638f,1,0,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,1,0,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,1,0,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,1,0,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,1,0,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,1,0,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,1,0,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,1,0,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,1,0,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,1,0,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,1,0,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,1,0,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,1,0,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1,0,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1,0,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,1,0,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,1,0,36b080d5-a870-46fa-bf8d-0a06e3a9719f,36b080d5-a870-46fa-bf8d-0a06e3a9719f,1,0,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,1,0,b3152292-5546-4896-ad24-cb41057698d8,b3152292-5546-4896-ad24-cb41057698d8,1,0,5f3d5a05-a581-462d-96a2-2750ba0e0481,5f3d5a05-a581-462d-96a2-2750ba0e0481,1,0,477ab478-b336-4bac-898f-e20e3a4039b5,477ab478-b336-4bac-898f-e20e3a4039b5,1,0,a4d767a1-d2e6-4e0a-ab35-9207eef54998,a4d767a1-d2e6-4e0a-ab35-9207eef54998,1,0,f38069e7-6d69-4be9-8463-bc7a33158a1a,f38069e7-6d69-4be9-8463-bc7a33158a1a,1,0,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,1,0,cc3a7f15-4db6-445e-b282-f44d0460b7d3,cc3a7f15-4db6-445e-b282-f44d0460b7d3,1,0,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,1,0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,1,0,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,1,0,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,1,0,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,1,0,c2e3f050-7465-4e5b-bc28-988a4d6bc1c2,c2e3f050-7465-4e5b-bc28-988a4d6bc1c2,1,0,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,1,0,e4216976-2747-4078-81d4-8ffab668c1f7,e4216976-2747-4078-81d4-8ffab668c1f7,1,0,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,1,0,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,1,0,3b9c03bc-8517-498f-8052-e53854fb0753,3b9c03bc-8517-498f-8052-e53854fb0753,1,0,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,1,0,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,1,0,9ed2c756-80a1-4559-8494-b7a9b82a4519,9ed2c756-80a1-4559-8494-b7a9b82a4519,1,0,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,1,0,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,1,0,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,1,0,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,1,0,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,1,0,68e82adf-bc03-4f23-9ec4-749ed42241da,68e82adf-bc03-4f23-9ec4-749ed42241da,1,0,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,1,0,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,1,0,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,1,0,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,1,0,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,1,0,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,1,0,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,1,0,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,1,0,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,1,0,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,1,0,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,1,0,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,1,0,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,1,0,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,1,0,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,1,0,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,1,0,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,1,0,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,1,0,eaf6045f-9ac0-43ef-b165-a45be75a4d44,eaf6045f-9ac0-43ef-b165-a45be75a4d44,1,0,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,1,0,a1130128-cc48-4555-93a2-99e7f74f77dc,a1130128-cc48-4555-93a2-99e7f74f77dc,1,0,9b4b7424-1af7-4d80-8404-8819fcfeae75,9b4b7424-1af7-4d80-8404-8819fcfeae75,1,0,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,1,0,405c52c4-25fe-45ff-abab-bf01041e768d,405c52c4-25fe-45ff-abab-bf01041e768d,1,0,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,1,0,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,1,0,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,1,0,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,1,0,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,1,0,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,1,0,f60cb71a-f451-426a-aa3a-aa266b8da149,f60cb71a-f451-426a-aa3a-aa266b8da149,1,0,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,1,0,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,1,0,23abf9ba-63f9-4173-a9ce-3cbdf1ec3a52,23abf9ba-63f9-4173-a9ce-3cbdf1ec3a52,1,0,973609a2-5b5d-45c4-9606-a13d0de1a09b,973609a2-5b5d-45c4-9606-a13d0de1a09b,1,0,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,1,0,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,1,0,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,1,0,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,1,0,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,1,0,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,1,0,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,1,0,48cefa96-46c7-4870-a096-951dcbae479a,48cefa96-46c7-4870-a096-951dcbae479a,1,0,d74e01cc-941b-4974-8771-0bd2e0d86724,d74e01cc-941b-4974-8771-0bd2e0d86724,1,0,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,1,0,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,1,0,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,1,0,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,1,0,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,1,0,4093fe34-7557-4f15-831b-d654b94b8010,4093fe34-7557-4f15-831b-d654b94b8010,1,0,ee10023f-5c63-4cb3-8e6c-db566c788c9d,ee10023f-5c63-4cb3-8e6c-db566c788c9d,1,0,aae09896-3b22-4d7d-9059-e47660f8b88b,aae09896-3b22-4d7d-9059-e47660f8b88b,1,0,845530cd-36fb-44c3-b30a-730985c9ca2d,845530cd-36fb-44c3-b30a-730985c9ca2d,1,0,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,1,0,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,1,0,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,1,0,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,1,0,252eb146-0d23-46ae-9feb-ee04531dd7d8,252eb146-0d23-46ae-9feb-ee04531dd7d8,1,0,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,1,0,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,1,0,ce5549bd-ba99-4259-86a3-36521bad59f5,ce5549bd-ba99-4259-86a3-36521bad59f5,1,0,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,1,0,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,1,0,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,1,0,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,1,0,08552af7-3c44-42c6-94c5-63a2316127fc,08552af7-3c44-42c6-94c5-63a2316127fc,1,0,41f6f6d1-b7cf-4477-907b-ce69fc08c799,41f6f6d1-b7cf-4477-907b-ce69fc08c799,1,0,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,1,0,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,1,0,a300ecc3-8031-4a50-a17d-b08cf3a72139,a300ecc3-8031-4a50-a17d-b08cf3a72139,1,0,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,1,0,44b28019-01c0-468d-9b60-e050ff8b71ac,44b28019-01c0-468d-9b60-e050ff8b71ac,1,0,69f6173c-a570-41ff-b07f-5b85f7187515,69f6173c-a570-41ff-b07f-5b85f7187515,1,0,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,1,0,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,1,0,3e2828b4-2b55-471e-ac69-55119c2480f8,3e2828b4-2b55-471e-ac69-55119c2480f8,1,0,657b8663-713c-4a80-81e1-8c0166742a35,657b8663-713c-4a80-81e1-8c0166742a35,1,0,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,1,0,08baf3ee-b8ca-4f29-89fc-c15344064ad3,08baf3ee-b8ca-4f29-89fc-c15344064ad3,1,0,4766c40e-6330-4c1d-a64f-0c8c672886a4,4766c40e-6330-4c1d-a64f-0c8c672886a4,1,0,01b85e3a-9920-425a-9de5-5079fffeef93,01b85e3a-9920-425a-9de5-5079fffeef93,1,0,82e12316-cc64-4d2f-83fa-054b5a738f02,82e12316-cc64-4d2f-83fa-054b5a738f02,1,0,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,1,0,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,1,0,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,1,0,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,1,0,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,1,0,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,1,0,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,1,0,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,1,0,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,1,0,63470706-f14b-4733-87c2-d1173f5d7e7a,63470706-f14b-4733-87c2-d1173f5d7e7a,1,0,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,1,0,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,1,0,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,1,0,76cdcc51-0e6a-4f9c-a115-1864998c2add,76cdcc51-0e6a-4f9c-a115-1864998c2add,1,0,71c3e5d3-7504-433f-9d48-7c287b2b863b,71c3e5d3-7504-433f-9d48-7c287b2b863b,1,0,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,1,0,0d8c215d-1210-47a2-897d-a3257b9f849a,0d8c215d-1210-47a2-897d-a3257b9f849a,1,0,c971e0ba-53b8-4454-92f7-40b0d639058a,c971e0ba-53b8-4454-92f7-40b0d639058a,1,0,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,1,0,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,1,0,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,1,0,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,1,0,8c472f51-47ec-43c4-9858-fd19ac3e17f3,8c472f51-47ec-43c4-9858-fd19ac3e17f3,1,0,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,1,0,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,1,0,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,1,0,249b6436-bd44-4950-b118-7f40f7aaf794,249b6436-bd44-4950-b118-7f40f7aaf794,1,0,c1508d67-ac6d-41e3-884d-b3bdd54659f8,c1508d67-ac6d-41e3-884d-b3bdd54659f8,1,0,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,1,0,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,1,0,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,1,0,eb276904-cad7-4401-bb78-2d13946291f1,eb276904-cad7-4401-bb78-2d13946291f1,1,0,79ff04ac-4625-469b-916e-938f04de4dd2,79ff04ac-4625-469b-916e-938f04de4dd2,1,0,35103a27-230c-45c0-a8c9-24bd46608bbb,35103a27-230c-45c0-a8c9-24bd46608bbb,1,0,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,1,0,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,1,0,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,1,0,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,1,0,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,1,0,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,64f667e5-6a8f-448f-aed5-a4d461232845,64f667e5-6a8f-448f-aed5-a4d461232845,1,0,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,1,0,037842ca-aeaf-4e27-9a0e-e929438b6f40,037842ca-aeaf-4e27-9a0e-e929438b6f40,1,0,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,1,0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,1,0,9da32b56-ff89-4739-bb99-615074b72298,9da32b56-ff89-4739-bb99-615074b72298,1,0,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,1,0,de25a90c-4b46-4340-b649-93e16dde33de,de25a90c-4b46-4340-b649-93e16dde33de,1,0,4f2d0398-49f4-410c-a451-436cbf96a262,4f2d0398-49f4-410c-a451-436cbf96a262,1,0,b2c8bd74-21c9-4495-93e2-ca5355698350,b2c8bd74-21c9-4495-93e2-ca5355698350,1,0,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,1,0,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,1,0,93016393-c637-4d81-8675-aa5e51e678e0,93016393-c637-4d81-8675-aa5e51e678e0,1,0,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,1,0,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,1,0,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1,0,7a944c45-9b3d-411f-b2ef-de3c896092bb,7a944c45-9b3d-411f-b2ef-de3c896092bb,1,0,d2762764-b5c0-4aeb-8e89-3371972f22d8,d2762764-b5c0-4aeb-8e89-3371972f22d8,1,0,d67a1377-f69f-48d9-824d-2ede2594e630,d67a1377-f69f-48d9-824d-2ede2594e630,1,0,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,1,0,323997ca-488d-4d84-aa44-da60b6b4d414,323997ca-488d-4d84-aa44-da60b6b4d414,1,0,50d3e00e-1a83-4bd5-91db-0561560caf42,50d3e00e-1a83-4bd5-91db-0561560caf42,1,0,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1,0,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,1,0,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,1,0,4a1e6d25-89e7-468a-aef1-6ded0154dca2,4a1e6d25-89e7-468a-aef1-6ded0154dca2,1,0,44afff59-0590-4929-93b8-7b49735f21b5,44afff59-0590-4929-93b8-7b49735f21b5,1,0,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,1,0,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,1,0,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,1,0,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,1,0,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,1,0,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,1,0,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,1,0,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,1,0,9892f922-8745-4164-a200-94b5edc1ea0a,9892f922-8745-4164-a200-94b5edc1ea0a,1,0,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,1,0,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,1,0,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,1,0,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,1,0,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,1,0,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,1,0,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,1,0,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,1,0,30f6aedf-946f-400c-822d-5fa375b8fb1d,30f6aedf-946f-400c-822d-5fa375b8fb1d,1,0,30a87c95-4d55-4b68-877f-1055e1c1afa7,30a87c95-4d55-4b68-877f-1055e1c1afa7,1,0,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,1,0,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,1,0,26986f8d-d56d-4641-9184-2632d0881cca,26986f8d-d56d-4641-9184-2632d0881cca,1,0,144676de-f369-49f1-bb21-d60e073936df,144676de-f369-49f1-bb21-d60e073936df,1,0,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,1,0,d9f1f56b-75c8-43e9-8043-89076c225f78,d9f1f56b-75c8-43e9-8043-89076c225f78,1,0,4d660fec-4a76-470e-bba9-3d031941b289,4d660fec-4a76-470e-bba9-3d031941b289,1,0,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,1,0,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,1,0,a2a51b70-9570-4f53-9d30-e9a9b099a475,a2a51b70-9570-4f53-9d30-e9a9b099a475,1,0,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,1,0,21c1b2d3-cd96-4cdd-9ccc-ada27b127969,21c1b2d3-cd96-4cdd-9ccc-ada27b127969,1,0,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,1,0,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,1,0,fdcbe67c-55fb-444d-bed8-cee956ca3530,fdcbe67c-55fb-444d-bed8-cee956ca3530,1,0,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,1,0,6ff5b3cb-efff-430d-bf0a-957405f116ca,6ff5b3cb-efff-430d-bf0a-957405f116ca,1,0,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,1,0,7badb97b-c359-42af-9066-6bbfc0650cf9,7badb97b-c359-42af-9066-6bbfc0650cf9,1,0,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,1,0,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,1,0,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,1,0,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,1,0,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,1,0,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,1,0,fd3a6a7e-203d-447a-aebd-7626579387fb,fd3a6a7e-203d-447a-aebd-7626579387fb,1,0,8014684f-e1f1-4163-9083-459a009c0aac,8014684f-e1f1-4163-9083-459a009c0aac,1,0,ad6384d5-278b-44d3-993a-d5a39e7c98ca,ad6384d5-278b-44d3-993a-d5a39e7c98ca,1,0,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,1,0,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,1,0,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,1,0,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,1,0,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,1,0,540be4e1-6eae-48e2-a645-8bd0a1259c65,540be4e1-6eae-48e2-a645-8bd0a1259c65,1,0,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,1,0,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,1,0,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,1,0,ef6250de-a4ef-48d8-94d6-f4029e63d7d2,ef6250de-a4ef-48d8-94d6-f4029e63d7d2,1,0,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,1,0,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,1,0,83ead93b-4ff6-487d-934e-25088944fccc,83ead93b-4ff6-487d-934e-25088944fccc,1,0,764c76cc-0473-4633-868d-02f96aa43c10,764c76cc-0473-4633-868d-02f96aa43c10,1,0,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,1,0,41462827-fd8b-4ee6-a739-a884d704bba5,41462827-fd8b-4ee6-a739-a884d704bba5,1,0,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,1,0,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,1,0,9416a741-5106-454e-b953-81f3d99d5e71,9416a741-5106-454e-b953-81f3d99d5e71,1,0,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,1,0,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,1,0,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,1,0,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,1,0,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,1,0,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,1,0,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,1,0,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,1,0,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,1,0,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1,0,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,1,0,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,1,0,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,1,0,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,1,0,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,1,0,5a088468-4065-4e0c-9b84-1162de8d3fdd,5a088468-4065-4e0c-9b84-1162de8d3fdd,1,0,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,1,0,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,1,0,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,1,0,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,1,0,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,1,0,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,1,0,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,1,0,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,1,0,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,1,0,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,1,0,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,1,0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,1,0,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,1,0,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,1,0,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,1,0,73c1a829-0191-486b-97a0-7f333c6f8011,73c1a829-0191-486b-97a0-7f333c6f8011,1,0,5504f5d1-35d8-4a47-a0e1-003fe00395c1,5504f5d1-35d8-4a47-a0e1-003fe00395c1,1,0,56242b05-d722-4d4a-82d9-517e0e169d0b,56242b05-d722-4d4a-82d9-517e0e169d0b,1,0,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,1,0,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,1,0,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,1,0,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,1,0,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,1,0,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,1,0,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,1,0,06afe397-1c7e-400e-bb24-f8e611d114e8,06afe397-1c7e-400e-bb24-f8e611d114e8,1,0,f0105e51-9510-426a-8aa0-af827d93ffd9,f0105e51-9510-426a-8aa0-af827d93ffd9,1,0,ca797560-8802-4bdc-b21f-7a7fd795beae,ca797560-8802-4bdc-b21f-7a7fd795beae,1,0,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,1,0,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,1,0,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,1,0,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,1,0,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,1,0,11fe3a42-98c4-49ba-b697-86ffb172f16f,11fe3a42-98c4-49ba-b697-86ffb172f16f,1,0,07b53818-7318-4400-8af5-457fac012755,07b53818-7318-4400-8af5-457fac012755,1,0,292b47e7-5cf3-462d-a466-dac6253a7f03,292b47e7-5cf3-462d-a466-dac6253a7f03,1,0,8ecc070f-f6fb-46b1-9636-b77aa80f8804,8ecc070f-f6fb-46b1-9636-b77aa80f8804,1,0,8405be9d-465b-4744-b04f-03933b52f02e,8405be9d-465b-4744-b04f-03933b52f02e,1,0,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,1,0,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,1,0,9bf55587-1ffe-42bc-b8e8-3f956956f689,9bf55587-1ffe-42bc-b8e8-3f956956f689,1,0,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,1,0,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,1,0,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,1,0,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,1,0,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,1,0,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,1,0,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,1,0,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,1,0,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,1,0,73d8b319-9bea-4638-a602-23c12f37c227,73d8b319-9bea-4638-a602-23c12f37c227,1,0,cef55e64-d4ad-42dc-aa5a-ea65a3af7cfa,cef55e64-d4ad-42dc-aa5a-ea65a3af7cfa,1,0,a43e9de0-2921-4c58-a5f8-7446258be967,a43e9de0-2921-4c58-a5f8-7446258be967,1,0,307656e3-df7f-46e7-946c-bbd439265c95,307656e3-df7f-46e7-946c-bbd439265c95,1,0,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,1,0,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,1,0,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,1,0,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,1,0,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,1,0,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,1,0,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,1,0,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,1,0,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,1,0,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,1,0,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,1,0,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,1,0,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,1,0,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,1,0,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,1,0,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,1,0,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,1,0,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,1,0,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,1,0,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,1,0,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,1,0,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,1,0,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,1,0,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,1,0,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,1,0,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,1,0,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,1,0,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,1,0,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,1,0,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,1,0,dd383422-dddb-4a81-9326-015fd345b5c1,dd383422-dddb-4a81-9326-015fd345b5c1,1,0,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,1,0,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,1,0,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,1,0,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,1,0,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,1,0,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,1,0,7fe61c5d-30bc-440d-9e40-12ff3b296616,7fe61c5d-30bc-440d-9e40-12ff3b296616,1,0,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,1,0,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,1,0,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,1,0,13dee5d8-f165-48de-9ccb-3ef0239f4b27,13dee5d8-f165-48de-9ccb-3ef0239f4b27,1,0,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,1,0,9395eb9d-6aff-4af5-a6f1-5c39014ba67b,9395eb9d-6aff-4af5-a6f1-5c39014ba67b,1,0,8a13c899-1659-48cf-9aa2-07ca99547b7b,8a13c899-1659-48cf-9aa2-07ca99547b7b,1,0,eb3f959c-94a4-4e77-b9f9-e81954254079,eb3f959c-94a4-4e77-b9f9-e81954254079,1,0,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,1,0,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,1610e73c-58df-41cc-8349-51b920806821,1610e73c-58df-41cc-8349-51b920806821,1,0,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,1,0,c6ccf82f-f130-4037-9e89-1e0365b996a4,c6ccf82f-f130-4037-9e89-1e0365b996a4,1,0,c532963e-0d92-44b9-9cfc-43ed2744ccf9,c532963e-0d92-44b9-9cfc-43ed2744ccf9,1,0,6aff2855-24d4-4f90-b617-53326efdd1bd,6aff2855-24d4-4f90-b617-53326efdd1bd,1,0,0107a9c7-4c85-49c4-918a-925d85d57a0b,0107a9c7-4c85-49c4-918a-925d85d57a0b,1,0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,1,0,e5b578a1-e33b-4d49-8064-427aa928a844,e5b578a1-e33b-4d49-8064-427aa928a844,1,0,f74e97ad-fef6-4122-a056-86f2d59dfdaf,f74e97ad-fef6-4122-a056-86f2d59dfdaf,1,0,df1ef691-1e86-4a80-8671-53b3d4504bfb,df1ef691-1e86-4a80-8671-53b3d4504bfb,1,0,474b9918-23da-4289-91a9-9115526c9b5d,474b9918-23da-4289-91a9-9115526c9b5d,1,0,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1,0,60aa9d44-5986-490e-8093-f65e194b3607,60aa9d44-5986-490e-8093-f65e194b3607,1,0,a36dee5e-7184-4caf-bf46-3977b165093b,a36dee5e-7184-4caf-bf46-3977b165093b,1,0,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,1,0,182916b2-972b-4e39-93ba-d45aa7a195f5,182916b2-972b-4e39-93ba-d45aa7a195f5,1,0,2b654a53-7ce8-421f-aaf5-aa1451d91415,2b654a53-7ce8-421f-aaf5-aa1451d91415,1,0,30e55306-ea5c-4ef4-9903-ea030afa3d85,30e55306-ea5c-4ef4-9903-ea030afa3d85,1,0,234c1a72-8349-472a-8373-2a25ce6252f2,234c1a72-8349-472a-8373-2a25ce6252f2,1,0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,1,0,539e0db9-be24-4086-9632-af20553ee50f,539e0db9-be24-4086-9632-af20553ee50f,1,0,b9adeb51-a009-4e83-85f8-bfa1547429d6,b9adeb51-a009-4e83-85f8-bfa1547429d6,1,0,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,1,0,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,1,0,eb0479db-2eaf-4269-9154-2fae4981e84f,eb0479db-2eaf-4269-9154-2fae4981e84f,1,0,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,1,0,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,1,0,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,1,0,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,1,0,e8bec681-d269-41ba-9184-556cbcc27d74,e8bec681-d269-41ba-9184-556cbcc27d74,1,0,b8aaef91-f72c-4127-a494-771c13694ca4,b8aaef91-f72c-4127-a494-771c13694ca4,1,0,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,1,0,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,1,0,3e090261-4aa2-4ece-9f77-62df83c890b3,3e090261-4aa2-4ece-9f77-62df83c890b3,1,0,bbfd9834-12b4-49ca-bdae-5c94efa80482,bbfd9834-12b4-49ca-bdae-5c94efa80482,1,0,9292034c-24e8-49a7-9b77-7974e117847d,9292034c-24e8-49a7-9b77-7974e117847d,1,0,3327b7d4-62fc-44cc-83b4-c449bfa4e706,3327b7d4-62fc-44cc-83b4-c449bfa4e706,1,0,43ecee25-68eb-48cf-bbaa-aee71052438f,43ecee25-68eb-48cf-bbaa-aee71052438f,1,0,93799f8b-0188-4546-8815-35e733bcc2b1,93799f8b-0188-4546-8815-35e733bcc2b1,1,0,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,1,0,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,1,0,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,1,0,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,1,0,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,1,0,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,1,0,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,1,0,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,1,0,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,1,0,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,1,0,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,1,0,1b4feda1-e555-4b85-b236-b21153a7246f,1b4feda1-e555-4b85-b236-b21153a7246f,1,0,61d3cef4-2c42-417d-a762-a2d2f5a28924,61d3cef4-2c42-417d-a762-a2d2f5a28924,1,0,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,1,0,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,1,0,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,1,0,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,1,0,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,1,0,7ab6acda-6732-4582-8092-d43f9a98a28d,7ab6acda-6732-4582-8092-d43f9a98a28d,1,0,5ab1d405-bfc3-4440-8cdd-3a63013b064d,5ab1d405-bfc3-4440-8cdd-3a63013b064d,1,0,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,1,0,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,1,0,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,1,0,6bcba052-4d81-409d-b1a2-eed6be6fb024,6bcba052-4d81-409d-b1a2-eed6be6fb024,1,0,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,1,0,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,1,0,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,1,0,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,1,0,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,1,0,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,1,0,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,1,0,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,1,0,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,1,0,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,1,0,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,1,0,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,1,0,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,1,0,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,1,0,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,1,0,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,1,0,093332f5-3eb4-478c-ac95-59dcdc96765a,093332f5-3eb4-478c-ac95-59dcdc96765a,1,0,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,1,0,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,1,0,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,1,0,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,1,0,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,1,0,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,1,0,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,1,0,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,1,0,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,1,0,e72e59c0-391d-497e-9407-063e0edf573e,e72e59c0-391d-497e-9407-063e0edf573e,1,0,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,1,0,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,1,0,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,1,0,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,1,0,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,1,0,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,1,0,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,1,0,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,1,0,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,1,0,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,1,0,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,1,0,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,1,0,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,1,0,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,1,0,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,1,0,13b27ec3-2be9-4959-92e5-94ba7bb64f03,13b27ec3-2be9-4959-92e5-94ba7bb64f03,1,0,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,1,0,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,1,0,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,1,0,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,1,0,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,1,0,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,1,0,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,1,0,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,1,0,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,1,0,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,1,0,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,1,0,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,1,0,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,1,0,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,1,0,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,1,0,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,1,0,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,1,0,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,1,0,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,1,0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,1,0,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,1,0,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,1,0,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,1,0,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,1,0,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,1,0,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,1,0,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,1,0,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,1,0,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,1,0,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,1,0,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,1,0,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,1,0,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,1,0,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,1,0,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,1,0,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,1,0,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,1,0,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,1,0,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,1,0,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,1,0,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,1,0,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,1,0,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,1,0,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,1,0,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,1,0,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,1,0,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,1,0,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,1,0,f9950ab5-1077-4033-bbbf-53899a1bcf33,f9950ab5-1077-4033-bbbf-53899a1bcf33,1,0,8f16763b-86f0-4ad0-b786-cce7dcb3460e,8f16763b-86f0-4ad0-b786-cce7dcb3460e,1,0,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,1,0,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,1,0,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,1,0,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,1,0,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,1,0,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,1,0,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1,0,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,1,0,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,1,0,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,1,0,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,1,0,295f3692-0721-4c41-a69b-171ef20a5018,295f3692-0721-4c41-a69b-171ef20a5018,1,0,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,1,0,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,1,0,8d31ce6a-4d44-46c6-a11c-47fb33e88691,8d31ce6a-4d44-46c6-a11c-47fb33e88691,1,0,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,1,0,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,1,0,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,1,0,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,1,0,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,1,0,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,1,0,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,1,0,35828c88-f1ec-42e7-b189-78748931ee4a,35828c88-f1ec-42e7-b189-78748931ee4a,1,0,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,1,0,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1,0,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,1,0,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,1,0,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,1,0,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,1,0,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,1,0,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,1,0,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,1,0,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,1,0,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,1,0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,1,0,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,1,0,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,1,0,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,1,0,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,1,0,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,1,0,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,1,0,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,1,0,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,1,0,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,1,0,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,1,0,67a04d72-afea-487a-b629-e4b7dfc1df32,67a04d72-afea-487a-b629-e4b7dfc1df32,1,0,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,1,0,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,1,0,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,1,0,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,1,0,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,1,0,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,1,0,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,1,0,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,1,0,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,1,0,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,1,0,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,1,0,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,1,0,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,1,0,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,1,0,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,1,0,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,1,0,8f09cbed-6f24-461f-9b35-31c64310e74a,8f09cbed-6f24-461f-9b35-31c64310e74a,1,0,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,1,0,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,1,0,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,1,0,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,1,0,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,1,0,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,1,0,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,1,0,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,1,0,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,1,0,211d226f-dac6-43d5-8720-952da4339e35,211d226f-dac6-43d5-8720-952da4339e35,1,0,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,1,0,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,1,0,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,1,0,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,1,0,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,1,0,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,1,0,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,1,0,463b8966-a5f9-4a80-82b9-1608a1622e13,463b8966-a5f9-4a80-82b9-1608a1622e13,1,0,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,1,0,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,1,0,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,1,0,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,1,0,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,1,0,01cb357c-af28-4855-afae-45b6df19b344,01cb357c-af28-4855-afae-45b6df19b344,1,0,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,1,0,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,1,0,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,1,0,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,1,0,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,1,0,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,1,0,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,1,0,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,1,0,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,1,0,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,1,0,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,1,0,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,1,0,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,1,0,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,1,0,aa509aa3-dd45-41f3-82c7-59662c2e2c47,aa509aa3-dd45-41f3-82c7-59662c2e2c47,1,0,c4552529-e69e-4c5c-bd66-04b2f7dac281,c4552529-e69e-4c5c-bd66-04b2f7dac281,1,0,381b49ba-793a-4418-9fd4-598844fb72a6,381b49ba-793a-4418-9fd4-598844fb72a6,1,0,1aee302d-df31-49ea-b542-436dc1d79ae1,1aee302d-df31-49ea-b542-436dc1d79ae1,1,0,593509da-d33c-49ff-a62c-a28cbc4651c1,593509da-d33c-49ff-a62c-a28cbc4651c1,1,0,5e346a0b-a322-4565-adb9-70131fb05fa3,5e346a0b-a322-4565-adb9-70131fb05fa3,1,0,9a69c559-194b-4f74-9879-82740260f5f6,9a69c559-194b-4f74-9879-82740260f5f6,1,0,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,1,0,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,1,0,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,1,0,2e19fb7b-270f-4181-b4a1-640280bbbc5c,2e19fb7b-270f-4181-b4a1-640280bbbc5c,1,0,cf69b045-665d-4f6c-827f-5044beacd125,cf69b045-665d-4f6c-827f-5044beacd125,1,0,aa773eef-0c4a-49be-9f5e-9131bc041415,aa773eef-0c4a-49be-9f5e-9131bc041415,1,0,9b31e474-01d4-4c3b-a633-3a2ff3917d62,9b31e474-01d4-4c3b-a633-3a2ff3917d62,1,0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1,0,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,1,0,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,1,0,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,1,0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,1,0,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,1,0,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,1,0,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,1,0,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,1,0,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,1,0,426cbebb-880b-49c5-b046-83c5e071273e,426cbebb-880b-49c5-b046-83c5e071273e,1,0,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,1,0,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,1,0,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,1,0,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,1,0,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,1,0,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,1,0,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,1,0,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,1,0,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,1,0,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,1,0,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,1,0,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,1,0,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,1,0,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,1,0,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,1,0,37e3d914-643e-4963-b4a0-7bc6727c0c9b,37e3d914-643e-4963-b4a0-7bc6727c0c9b,1,0,b6902500-3e03-4e83-a077-00500abc00b6,b6902500-3e03-4e83-a077-00500abc00b6,1,0,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,1,0,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,1,0,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,1,0,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,1,0,cd869887-0b0e-43db-8b51-04fe4a1341d5,cd869887-0b0e-43db-8b51-04fe4a1341d5,1,0,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,1,0,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,1,0,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,1,0,cd8fd85f-f02e-4f11-b4b4-40670febfaca,cd8fd85f-f02e-4f11-b4b4-40670febfaca,1,0,3f023afb-c02a-42ee-9afe-0f47ef3fe721,3f023afb-c02a-42ee-9afe-0f47ef3fe721,1,0,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,1,0,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,1,0,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,1,0,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,1,0,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,1,0,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,1,0,091ccac1-9a63-4a89-bb0c-333b274b0c70,091ccac1-9a63-4a89-bb0c-333b274b0c70,1,0,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,1,0,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,1,0,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,1,0,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,1,0,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,1,0,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,1,0,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,1,0,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,1,0,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,1,0,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,1,0,2a6e1f2b-7378-456b-9657-9e971eaff716,2a6e1f2b-7378-456b-9657-9e971eaff716,1,0,c3cdea20-3055-4b4e-a531-a02d4f3ed294,c3cdea20-3055-4b4e-a531-a02d4f3ed294,1,0,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,1,0,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,1,0,4347f77e-bad9-4525-90a0-794787f03585,4347f77e-bad9-4525-90a0-794787f03585,1,0,cfde3330-2bed-4273-8d69-c213ebdde247,cfde3330-2bed-4273-8d69-c213ebdde247,1,0,2d6ca049-89a5-437e-971c-b8e42f61b460,2d6ca049-89a5-437e-971c-b8e42f61b460,1,0,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,1,0,271d58d0-4449-40cc-bae9-cc4c50eebd9b,271d58d0-4449-40cc-bae9-cc4c50eebd9b,1,0,58df9322-c786-4dd1-af49-7cd164b378da,58df9322-c786-4dd1-af49-7cd164b378da,1,0,8d48de7f-61d6-4462-9c14-f728206a482c,8d48de7f-61d6-4462-9c14-f728206a482c,1,0,a87e890a-8924-4f56-9e37-04579b95297a,a87e890a-8924-4f56-9e37-04579b95297a,1,0,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,1,0,4c1f2581-ee42-4df5-9169-20205a18a9be,4c1f2581-ee42-4df5-9169-20205a18a9be,1,0,bb3d9ea3-8895-4950-9ee9-4249ca983d48,bb3d9ea3-8895-4950-9ee9-4249ca983d48,1,0,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,1,0,b806d2b6-bbd1-4abd-9471-7791603a2fcf,b806d2b6-bbd1-4abd-9471-7791603a2fcf,1,0,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,1,0,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,1,0,34f50dd9-de16-4013-a2ef-6595d9c28930,34f50dd9-de16-4013-a2ef-6595d9c28930,1,0,56fcca65-3429-4409-bce7-f434f6530a74,56fcca65-3429-4409-bce7-f434f6530a74,1,0,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,1,0,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,1,0,b286f047-a4d0-4808-b1b4-27997ead6d49,b286f047-a4d0-4808-b1b4-27997ead6d49,1,0,49da2d3a-657a-4cfd-8e37-422b96d2cda5,49da2d3a-657a-4cfd-8e37-422b96d2cda5,1,0,fced16ae-abee-4fbe-9582-dfd368d5610a,fced16ae-abee-4fbe-9582-dfd368d5610a,1,0,afe60bad-1585-487f-9a39-9b9e031f9576,afe60bad-1585-487f-9a39-9b9e031f9576,1,0,4c4f0475-bd11-40c8-af0d-8affec6f838d,4c4f0475-bd11-40c8-af0d-8affec6f838d,1,0,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,1,0,855439d7-a621-48f5-b6d9-bc2bbd11ad90,855439d7-a621-48f5-b6d9-bc2bbd11ad90,1,0,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,1,0,2f25e742-555b-4db8-bff2-2d345ce2a93a,2f25e742-555b-4db8-bff2-2d345ce2a93a,1,0,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,1,0,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,1,0,a7fee9d3-569d-4b5b-bd47-44790e0095f5,a7fee9d3-569d-4b5b-bd47-44790e0095f5,1,0,a258fe12-7e55-4f89-86fa-962b1d2947ac,a258fe12-7e55-4f89-86fa-962b1d2947ac,1,0,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,1,0,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,1,0,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,1,0,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,1,0,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,1,0,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,1,0,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,1,0,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,1,0,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,1,0,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,1,0,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,1,0,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,1,0,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,1,0,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,1,0,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,1,0,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,1,0,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,1,0,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,1,0,cc8e3172-491d-45d8-a7eb-fc6c400845cb,cc8e3172-491d-45d8-a7eb-fc6c400845cb,1,0,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,1,0,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,1,0,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,1,0,51d83895-5692-4479-9612-07c790d19dff,51d83895-5692-4479-9612-07c790d19dff,1,0,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,1,0,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,1,0,d854b528-8456-4453-9c2d-4f96caf10481,d854b528-8456-4453-9c2d-4f96caf10481,1,0,245f870e-a53a-4d86-aa0a-c0c7709b8acb,245f870e-a53a-4d86-aa0a-c0c7709b8acb,1,0,476f6bfa-b10c-4e0f-8499-23c652715b3f,476f6bfa-b10c-4e0f-8499-23c652715b3f,1,0,65c9754b-53f6-4616-a9d4-74826f7b0ced,65c9754b-53f6-4616-a9d4-74826f7b0ced,1,0,eca2b076-d218-4d1c-948b-7894edf9fa49,eca2b076-d218-4d1c-948b-7894edf9fa49,1,0,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,1,0,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,1,0,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,1,0,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,1,0,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,1,0,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1,0,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,1,0,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,1,0,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,1,0,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,1,0,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,1,0,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,1,0,40a59681-f31d-4fb9-9301-67c1430590e0,40a59681-f31d-4fb9-9301-67c1430590e0,1,0,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,1,0,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,1,0,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,1,0,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,1,0,9c3bc502-bcb1-4c90-ae43-53c798958339,9c3bc502-bcb1-4c90-ae43-53c798958339,1,0,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,1,0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,1,0,5eb4ca7f-027a-4860-a167-e6b424527e7a,5eb4ca7f-027a-4860-a167-e6b424527e7a,1,0,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,1,0,6871015f-d959-4a77-a091-a23cb4ebd8f9,6871015f-d959-4a77-a091-a23cb4ebd8f9,1,0,e5e1631b-a494-4e73-b356-b4330b84cc88,e5e1631b-a494-4e73-b356-b4330b84cc88,1,0,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,1,0,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,1,0,80cf54ed-8677-4c89-a378-0abef6c64010,80cf54ed-8677-4c89-a378-0abef6c64010,1,0,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,1,0,56ee3afd-5ae6-421e-b9f3-26505e40f100,56ee3afd-5ae6-421e-b9f3-26505e40f100,1,0,63c9a839-78b2-4706-b380-5aedf6914930,63c9a839-78b2-4706-b380-5aedf6914930,1,0,40f5c1cb-2654-4738-bb44-6734b0e3490b,40f5c1cb-2654-4738-bb44-6734b0e3490b,1,0,2ec484b1-95eb-43a7-9430-1c1ef49f05af,2ec484b1-95eb-43a7-9430-1c1ef49f05af,1,0,1a314ce2-03bc-4267-89a9-bb5bb866f552,1a314ce2-03bc-4267-89a9-bb5bb866f552,1,0,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,1,0,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,1,0,e859dd18-8baf-49c0-b7a0-1205b6c125d3,e859dd18-8baf-49c0-b7a0-1205b6c125d3,1,0,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,1,0,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,1,0,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,1,0,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,1,0,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,1,0,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,1,0,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,1,0,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,1,0,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,1,0,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,1,0,fcb97a46-d5fd-4bb5-b899-17723a9fe346,fcb97a46-d5fd-4bb5-b899-17723a9fe346,1,0,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,1,0,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,1,0,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,1,0,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,1,0,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,1,0,85223d37-2503-4783-94dc-fe6265e718d5,85223d37-2503-4783-94dc-fe6265e718d5,1,0,0918cd76-56e5-4314-8a1c-c21d023ba6f8,0918cd76-56e5-4314-8a1c-c21d023ba6f8,1,0,9db21c2e-79fa-44e4-902e-416abfccb54a,9db21c2e-79fa-44e4-902e-416abfccb54a,1,0,fb082db3-197b-4d1e-b9ea-362624d547ee,fb082db3-197b-4d1e-b9ea-362624d547ee,1,0,c09dcf00-a45a-4487-99c5-d3a37956ec88,c09dcf00-a45a-4487-99c5-d3a37956ec88,1,0,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,1,0,2714e1b6-6b02-43a1-bc94-2934b429ed35,2714e1b6-6b02-43a1-bc94-2934b429ed35,1,0,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,1,0,4c7016da-9991-4917-8eaa-e760cc9e29d1,4c7016da-9991-4917-8eaa-e760cc9e29d1,1,0,febb3770-5c11-4ada-9e49-a27950bdaddf,febb3770-5c11-4ada-9e49-a27950bdaddf,1,0,d7b57669-e538-4e54-ab1b-8428f0586466,d7b57669-e538-4e54-ab1b-8428f0586466,1,0,9c484a15-039e-416d-af97-4c2bd90fd873,9c484a15-039e-416d-af97-4c2bd90fd873,1,0,534855e3-4cf2-471c-b982-7138917050c9,534855e3-4cf2-471c-b982-7138917050c9,1,0,4c72b944-d000-4920-aec8-54029f88ddf4,4c72b944-d000-4920-aec8-54029f88ddf4,1,0,b4033d05-05c2-4617-80d9-abfa389c47f4,b4033d05-05c2-4617-80d9-abfa389c47f4,1,0,aa29e1be-4e99-4136-8dc1-0124908979ad,aa29e1be-4e99-4136-8dc1-0124908979ad,1,0,0d76799d-7fc7-446b-88fb-dca839de00a5,0d76799d-7fc7-446b-88fb-dca839de00a5,1,0,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,1,0,ea4a869c-861c-412c-a3be-de1c57d1a251,ea4a869c-861c-412c-a3be-de1c57d1a251,1,0,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,1,0,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,1,0,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,1,0,50ac390d-324f-40bd-b3df-0468a63b94b6,50ac390d-324f-40bd-b3df-0468a63b94b6,1,0,80337710-2c60-45c4-ae1f-bb42731fb611,80337710-2c60-45c4-ae1f-bb42731fb611,1,0,9dcf467e-7701-4c7b-b747-95f4d9b9295c,9dcf467e-7701-4c7b-b747-95f4d9b9295c,1,0,dd07b255-25af-466e-a224-c561a8ca567b,dd07b255-25af-466e-a224-c561a8ca567b,1,0,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,1,0,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,1,0,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,1,0,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,1,0,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,1,0,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,1,0,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,1,0,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,1,0,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,1,0,f3d8590a-dcfa-4d41-8d03-642b99ffa040,f3d8590a-dcfa-4d41-8d03-642b99ffa040,1,0,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,1,0,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,1,0,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,1,0,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,1,0,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,1,0,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,1,0,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,1,0,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,1,0,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,1,0,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,1,0,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,1,0,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,1,0,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,1,0,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,1,0,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,1,0,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,1,0,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,1,0,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,1,0,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,1,0,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,1,0,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,1,0,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,1,0,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,1,0,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,1,0,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,1,0,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,1,0,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,1,0,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,1,0,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,1,0,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,1,0,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,1,0,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,1,0,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,1,0,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,1,0,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,1,0,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,1,0,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,1,0,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,1,0,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,1,0,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,1,0,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,1,0,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,1,0,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,1,0,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,1,0,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,1,0,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,1,0,5b379a72-8605-4e88-84cb-14272a3b8f5f,5b379a72-8605-4e88-84cb-14272a3b8f5f,1,0,150c9d05-4ccc-4cb7-879d-b1d9c3534343,150c9d05-4ccc-4cb7-879d-b1d9c3534343,1,0,65000437-bd07-4841-a458-679d44768c46,65000437-bd07-4841-a458-679d44768c46,1,0,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,1,0,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,1,0,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,1,0,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,1,0,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,1,0,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,1,0,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,1,0,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,1,0,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,1,0,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,1,0,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,1,0,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,1,0,612f3b95-d7db-4b33-92b5-4873205b424b,612f3b95-d7db-4b33-92b5-4873205b424b,1,0,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,1,0,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,1,0,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,1,0,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,1,0,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,1,0,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,1,0,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,1,0,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,1,0,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,1,0,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,1,0,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,1,0,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,1,0,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,1,0,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,1,0,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,1,0,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,1,0,616cd2cc-eaf4-4586-bca1-c044429b491a,616cd2cc-eaf4-4586-bca1-c044429b491a,1,0,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,1,0,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,1,0,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,1,0,81d900be-ddc1-417f-ae2c-1aacf040de9a,81d900be-ddc1-417f-ae2c-1aacf040de9a,1,0,c65f69ce-be78-4e8d-b91d-293c4108ce77,c65f69ce-be78-4e8d-b91d-293c4108ce77,1,0,521a5717-0b38-401d-bd72-30cee219bd14,521a5717-0b38-401d-bd72-30cee219bd14,1,0,977c30dc-6f27-4931-9fd5-d12ed147e3ec,977c30dc-6f27-4931-9fd5-d12ed147e3ec,1,0,eea4f72e-dd1b-46c7-b270-876a482236b3,eea4f72e-dd1b-46c7-b270-876a482236b3,1,0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,1,0,2d249dad-8b4f-462b-ab13-892639a6e071,2d249dad-8b4f-462b-ab13-892639a6e071,1,0,f6249bf4-d2e7-48f3-808f-d776915d14cb,f6249bf4-d2e7-48f3-808f-d776915d14cb,1,0,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,1,0,883cdeb0-e747-4157-bbe7-0ebc423a82af,883cdeb0-e747-4157-bbe7-0ebc423a82af,1,0,ba62ac73-91da-4dad-abc7-3cf8acf7e315,ba62ac73-91da-4dad-abc7-3cf8acf7e315,1,0,6a71416d-dba1-4883-9264-597ecf9d6270,6a71416d-dba1-4883-9264-597ecf9d6270,1,0,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,1,0,6593baab-fce0-49ed-867e-be242bfc08d7,6593baab-fce0-49ed-867e-be242bfc08d7,1,0,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,1,0,57aed64d-da61-4c18-af21-dab3afdc5c03,57aed64d-da61-4c18-af21-dab3afdc5c03,1,0,452822b4-a590-44db-ab77-d8c01f7300e7,452822b4-a590-44db-ab77-d8c01f7300e7,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,19b29d30-e395-42f2-b700-7474bb2cdcb7,19b29d30-e395-42f2-b700-7474bb2cdcb7,1,0,b0deb957-624b-4bcb-824c-76aedf1affe9,b0deb957-624b-4bcb-824c-76aedf1affe9,1,0,9934e608-593d-45d0-9df3-539f0c8fc385,9934e608-593d-45d0-9df3-539f0c8fc385,1,0,80da4126-4319-425f-8427-7d60652cf754,80da4126-4319-425f-8427-7d60652cf754,1,0,05236ace-bcdd-4eb8-a1fb-5843ee311d10,05236ace-bcdd-4eb8-a1fb-5843ee311d10,1,0,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,1,0,449060fd-4711-4b9e-93e0-11b35c314fb3,449060fd-4711-4b9e-93e0-11b35c314fb3,1,0,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,1,0,0614d340-6524-4715-978d-87ab21377e72,0614d340-6524-4715-978d-87ab21377e72,1,0,d47daac5-ec3b-4d4e-8b01-045a37f7074d,d47daac5-ec3b-4d4e-8b01-045a37f7074d,1,0,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,1,0,912cbd30-1ed5-4888-a4b6-98e9215b28e9,912cbd30-1ed5-4888-a4b6-98e9215b28e9,1,0,abf093ce-be63-487d-8be4-be282aa475be,abf093ce-be63-487d-8be4-be282aa475be,1,0,7a910ad6-b922-4716-8140-1540d76296b2,7a910ad6-b922-4716-8140-1540d76296b2,1,0,5189beb9-b939-4f97-aca0-c2f3492ac8b9,5189beb9-b939-4f97-aca0-c2f3492ac8b9,1,0,0b139d7a-b583-4082-b9f2-8f3fb444bd51,0b139d7a-b583-4082-b9f2-8f3fb444bd51,1,0,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,1,0,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,1,0,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,1,0,0761c32c-1de6-4c40-9178-64aeb46b6622,0761c32c-1de6-4c40-9178-64aeb46b6622,1,0,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,1,0,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,1,0,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,1,0,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,1,0,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,1,0,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,1,0,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,1,0,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,1,0,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,1,0,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,1,0,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,1,0,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,1,0,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,1,0,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,1,0,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,1,0,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,1,0,b9b24093-810c-4158-846d-e2c7aea54d36,b9b24093-810c-4158-846d-e2c7aea54d36,1,0,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,1,0,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,1,0,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,1,0,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,1,0,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,1,0,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,1,0,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,1,0,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,1,0,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,1,0,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,1,0,8ce759ff-f579-461c-bb1e-9ac2b01e88df,8ce759ff-f579-461c-bb1e-9ac2b01e88df,1,0,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,1,0,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,1,0,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,1,0,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,1,0,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1,0,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,1,0,81db41a6-2580-4a69-b1fd-57cfd48a7efa,81db41a6-2580-4a69-b1fd-57cfd48a7efa,1,0,0db8b3b2-bf24-4006-9897-797084c241ef,0db8b3b2-bf24-4006-9897-797084c241ef,1,0,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,1,0,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,1,0,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,1,0,20091427-d173-40ca-b2c4-53ee99b0b5ae,20091427-d173-40ca-b2c4-53ee99b0b5ae,1,0,14cbde39-a39a-48e5-9b72-b798a0bcea3f,14cbde39-a39a-48e5-9b72-b798a0bcea3f,1,0,56871c10-e3af-4679-afad-3baa910d73bb,56871c10-e3af-4679-afad-3baa910d73bb,1,0,f81b51c5-57e4-41f8-9ad5-3d2717351b95,f81b51c5-57e4-41f8-9ad5-3d2717351b95,1,0,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,1,0,de0a39e0-d37d-47c6-a019-e44836edc8d1,de0a39e0-d37d-47c6-a019-e44836edc8d1,1,0,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1,0,71d544bf-15c1-4581-8baa-ac126308425c,71d544bf-15c1-4581-8baa-ac126308425c,1,0,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1,0,7acfe30e-73cb-465a-88f2-92b7275dc49b,7acfe30e-73cb-465a-88f2-92b7275dc49b,1,0,8e387dac-5029-49da-a013-355df0a51a44,8e387dac-5029-49da-a013-355df0a51a44,1,0,13859664-8307-40e8-855b-557b9cf2f1ec,13859664-8307-40e8-855b-557b9cf2f1ec,1,0,e4397fba-507f-497c-9414-7d08ccd4d799,e4397fba-507f-497c-9414-7d08ccd4d799,1,0,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,1,0,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,1,0,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1,0,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,1,0,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,1,0,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,1,0,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,1,0,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,1,0,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,1,0,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,1,0,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,1,0,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,1,0,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,1,0,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,1,0,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,1,0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,1,0,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,1,0,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,1,0,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,1,0,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,1,0,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,1,0,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,1,0,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,1,0,d3443b92-32f5-4ac0-8356-062647efe3d8,d3443b92-32f5-4ac0-8356-062647efe3d8,1,0,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,1,0,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,1,0,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,1,0,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,1,0,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,1,0,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,1,0,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,1,0,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,1,0,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,1,0,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,1,0,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,1,0,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,1,0,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,1,0,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,1,0,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,1,0,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,1,0,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,1,0,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,1,0,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,1,0,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,1,0,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,1,0,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,1,0,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,1,0,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,1,0,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,1,0,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,1,0,aa63c001-c3da-4179-8fd8-fe2ff510511e,aa63c001-c3da-4179-8fd8-fe2ff510511e,1,0,b2e894b0-6443-4a52-95b6-6b564f809680,b2e894b0-6443-4a52-95b6-6b564f809680,1,0,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,1,0,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,1,0,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,1,0,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,1,0,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,1,0,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,1,0,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,1,0,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,1,0,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,1,0,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,1,0,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,1,0,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,1,0,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,1,0,8a8848b8-345a-452d-bf95-28f9c91c7e95,8a8848b8-345a-452d-bf95-28f9c91c7e95,1,0,a9441693-87ca-4157-98e1-63375852755c,a9441693-87ca-4157-98e1-63375852755c,1,0,6303ea55-e8ed-4acc-9717-941eefafc2a9,6303ea55-e8ed-4acc-9717-941eefafc2a9,1,0,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,1,0,d0b17206-3949-4513-a47f-02e1a8ba369a,d0b17206-3949-4513-a47f-02e1a8ba369a,1,0,cb4f20d4-13e6-4c27-b491-da7931f4bf05,cb4f20d4-13e6-4c27-b491-da7931f4bf05,1,0,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,1,0,40b08a20-51a3-438b-ba54-466917ea809f,40b08a20-51a3-438b-ba54-466917ea809f,1,0,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,1,0,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,1,0,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,1,0,af22406b-daac-475d-b6a9-577452502b84,af22406b-daac-475d-b6a9-577452502b84,1,0,7a925960-a579-4b06-90e0-5121dc774024,7a925960-a579-4b06-90e0-5121dc774024,1,0,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,1,0,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,1,0,2abbd53a-0ead-42af-8df6-fde663aea300,2abbd53a-0ead-42af-8df6-fde663aea300,1,0,24611bf9-5492-443a-935c-a0058e86493f,24611bf9-5492-443a-935c-a0058e86493f,1,0,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,1,0,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,1,0,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,1,0,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,1,0,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,1,0,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,1,0,f7e73257-fae1-465a-ae74-faaa0273a416,f7e73257-fae1-465a-ae74-faaa0273a416,1,0,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,1,0,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,1,0,ff18803b-4c3a-4720-a718-7547f04c6e2f,ff18803b-4c3a-4720-a718-7547f04c6e2f,1,0,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0e0670d6-d8f7-4728-bd1b-f016fffa0570,1,0,13beb01d-dd08-4a6d-863b-651e70bbf51f,13beb01d-dd08-4a6d-863b-651e70bbf51f,1,0,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,1,0,57a0f5f3-6573-4b35-af25-cea3a25641f1,57a0f5f3-6573-4b35-af25-cea3a25641f1,1,0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,1,0,144d5498-bb61-4bec-bef3-85a5a4aec3d5,144d5498-bb61-4bec-bef3-85a5a4aec3d5,1,0,94bc76ae-72a0-418f-98c4-ae0a0326a2da,94bc76ae-72a0-418f-98c4-ae0a0326a2da,1,0,784475ff-eec5-462a-a511-ba31f8374c2e,784475ff-eec5-462a-a511-ba31f8374c2e,1,0,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,1,0,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,1,0,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,1,0,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,1,0,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,1,0,56b570b1-93b0-468a-9672-9c71113753f3,56b570b1-93b0-468a-9672-9c71113753f3,1,0,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,1,0,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,1,0,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,1,0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,1,0,356a8091-4c0b-41d0-b8d2-963b3a807469,356a8091-4c0b-41d0-b8d2-963b3a807469,1,0,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,1,0,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,1,0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,1,0,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,1,0,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,1,0,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,1,0,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,1,0,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,1,0,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,1,0,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,1,0,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1,0,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,1,0,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,1,0,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,1,0,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,1,0,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,1,0,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,1,0,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,1,0,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,1,0,ee008096-1ae8-4a64-9d3d-14cb15c8be70,ee008096-1ae8-4a64-9d3d-14cb15c8be70,1,0,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,1,0,a4754a7b-971f-4517-963e-b7cb9d57f86d,a4754a7b-971f-4517-963e-b7cb9d57f86d,1,0,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,1,0,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,1,0,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,1,0,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,1,0,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,1,0,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,1,0,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,1,0,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,1,0,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,1,0,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,1,0,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,1,0,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,1,0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,1,0,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,1,0,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,1,0,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,1,0,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,1,0,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,1,0,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,1,0,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,1,0,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,1,0,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,1,0,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,1,0,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,1,0,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,1,0,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,1,0,733d4494-01e2-46f5-a49b-f289267a90c9,733d4494-01e2-46f5-a49b-f289267a90c9,1,0,5422610d-b92c-4213-a58c-8db067d93b66,5422610d-b92c-4213-a58c-8db067d93b66,1,0,8f59a635-9e0e-470d-8fda-a47a262a59c2,8f59a635-9e0e-470d-8fda-a47a262a59c2,1,0,ffb50eb9-149a-46ec-9472-d8f20ad09810,ffb50eb9-149a-46ec-9472-d8f20ad09810,1,0,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,1,0,7a6449e2-e90a-4720-a769-192284ef69c1,7a6449e2-e90a-4720-a769-192284ef69c1,1,0,02118b98-2349-46b1-a328-d6e2b5781f7e,02118b98-2349-46b1-a328-d6e2b5781f7e,1,0,67de9cbb-5c80-4cff-bfbe-269a958e08e6,67de9cbb-5c80-4cff-bfbe-269a958e08e6,1,0,2228a457-6805-41ee-85af-5ebca9568bf4,2228a457-6805-41ee-85af-5ebca9568bf4,1,0,96b71795-e230-4ecb-b98d-4feb3f8b9662,96b71795-e230-4ecb-b98d-4feb3f8b9662,1,0,1e14d062-1d5a-4939-8ce6-4d9514990376,1e14d062-1d5a-4939-8ce6-4d9514990376,1,0,f86f24d2-9a83-47ae-9d95-b49a0a295770,f86f24d2-9a83-47ae-9d95-b49a0a295770,1,0,8368e1fa-da0c-4a9b-9d50-a122933c7899,8368e1fa-da0c-4a9b-9d50-a122933c7899,1,0,37986729-a275-4e86-8613-faee9a4f2525,37986729-a275-4e86-8613-faee9a4f2525,1,0,5814cb3a-8f7c-45b4-a590-b69d4912120f,5814cb3a-8f7c-45b4-a590-b69d4912120f,1,0,f06c8396-65ec-4ece-aed0-d45b2d8969b5,f06c8396-65ec-4ece-aed0-d45b2d8969b5,1,0,1faeab7f-7bd7-496d-8882-4aab6c425854,1faeab7f-7bd7-496d-8882-4aab6c425854,1,0,af922fb8-a99c-4154-89fe-d30a4d13024a,af922fb8-a99c-4154-89fe-d30a4d13024a,1,0,24c2f463-2bbb-471f-a409-507afad52caf,24c2f463-2bbb-471f-a409-507afad52caf,1,0,cbb07013-9ae1-43ec-8142-a724d788cb67,cbb07013-9ae1-43ec-8142-a724d788cb67,1,0,2403ac84-b513-4aa0-9a68-8d1ad705ce24,2403ac84-b513-4aa0-9a68-8d1ad705ce24,1,0,952b49e0-e1a1-4130-8fb2-083e3988255c,952b49e0-e1a1-4130-8fb2-083e3988255c,1,0,367b227f-f66e-4cec-9fc3-850bca8bc6c8,367b227f-f66e-4cec-9fc3-850bca8bc6c8,1,0,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1,0,7fcb9d79-1144-4099-8d7f-309d3bf045a5,7fcb9d79-1144-4099-8d7f-309d3bf045a5,1,0,db418313-8583-48a9-9fec-e2c5de4fdf76,db418313-8583-48a9-9fec-e2c5de4fdf76,1,0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,1,0,2f26970e-b964-43e2-8d6d-999bbc577689,2f26970e-b964-43e2-8d6d-999bbc577689,1,0,65a50026-88e7-45dd-bb0c-f212218ca093,65a50026-88e7-45dd-bb0c-f212218ca093,1,0,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,1,0,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1,0,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,1,0,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,1,0,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,1,0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,1,0,01a1fd57-6c09-4a5b-9f75-da4366159423,01a1fd57-6c09-4a5b-9f75-da4366159423,1,0,71d79b25-3682-4f2c-b6b2-a307e3e72844,71d79b25-3682-4f2c-b6b2-a307e3e72844,1,0,45c1ed0d-202e-4289-820f-e1de0f544386,45c1ed0d-202e-4289-820f-e1de0f544386,1,0,e889e80f-97c9-43c6-8268-d652764fcafb,e889e80f-97c9-43c6-8268-d652764fcafb,1,0,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,1,0,95ccaaf2-f6ca-4540-8a39-3c90121c4236,95ccaaf2-f6ca-4540-8a39-3c90121c4236,1,0,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,1,0,f47a9bec-2a9f-4955-a432-acb63a5b0e46,f47a9bec-2a9f-4955-a432-acb63a5b0e46,1,0,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1,0,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,1,0,b787818e-5572-4ef2-ba54-1e9b69569824,b787818e-5572-4ef2-ba54-1e9b69569824,1,0,1e13bd37-61b5-4901-a607-e00e5d1900a8,1e13bd37-61b5-4901-a607-e00e5d1900a8,1,0,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,1,0,231d7b21-c00c-4782-b610-d56593be436f,231d7b21-c00c-4782-b610-d56593be436f,1,0,79250d1a-77ff-4015-a5b5-83460b1611e2,79250d1a-77ff-4015-a5b5-83460b1611e2,1,0,60018ee0-71ec-4975-a95d-f6f188748ff2,60018ee0-71ec-4975-a95d-f6f188748ff2,1,0,68d35468-279a-43ef-9d71-fed44a792177,68d35468-279a-43ef-9d71-fed44a792177,1,0,77bec3d8-582a-4156-861b-4902008f014c,77bec3d8-582a-4156-861b-4902008f014c,1,0,bf3304c0-5078-478f-bbf8-6178264c5f26,bf3304c0-5078-478f-bbf8-6178264c5f26,1,0,2ad1caba-7a89-4389-934f-419970260961,2ad1caba-7a89-4389-934f-419970260961,1,0,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,1,0,f88c4a72-368c-4f45-bb2c-d18f214a5079,f88c4a72-368c-4f45-bb2c-d18f214a5079,1,0,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,1,0,9dc2e313-c086-4fd9-83e8-911859ef480d,9dc2e313-c086-4fd9-83e8-911859ef480d,1,0,8a14ced0-9e45-4b3a-a135-11413c3a33c2,8a14ced0-9e45-4b3a-a135-11413c3a33c2,1,0,af7377db-0b27-42f7-a639-e2feb4015412,af7377db-0b27-42f7-a639-e2feb4015412,1,0,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,1,0,ab7db146-f26a-418a-8c45-e2513bf84e08,ab7db146-f26a-418a-8c45-e2513bf84e08,1,0,ece3bd8d-6616-44d5-9c14-6b3557738872,ece3bd8d-6616-44d5-9c14-6b3557738872,1,0,663a80ba-b97e-4265-a627-4a7d273f9472,663a80ba-b97e-4265-a627-4a7d273f9472,1,0,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,1,0,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,1,0,4893ad50-df19-4d86-9469-40491ba733c9,4893ad50-df19-4d86-9469-40491ba733c9,1,0,25a65c1e-8e67-4135-843d-1e0da72dfd64,25a65c1e-8e67-4135-843d-1e0da72dfd64,1,0,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,1,0,29a6416e-b0f5-4111-8f86-1ba80244e73a,29a6416e-b0f5-4111-8f86-1ba80244e73a,1,0,0f49085a-9b83-4256-be60-f341b2ef132e,0f49085a-9b83-4256-be60-f341b2ef132e,1,0,f44c66d6-cfe2-482f-a921-de3db3cd09ea,f44c66d6-cfe2-482f-a921-de3db3cd09ea,1,0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,1,0,c521bd61-386e-41c8-bcc3-29d54b63cc32,c521bd61-386e-41c8-bcc3-29d54b63cc32,1,0,d46e3424-6d30-4229-9a56-ab256517534a,d46e3424-6d30-4229-9a56-ab256517534a,1,0,09d3633d-8e8c-47f3-8f34-d70eb94577e1,09d3633d-8e8c-47f3-8f34-d70eb94577e1,1,0,fe868143-363b-4da1-889b-98d4dd10a1fd,fe868143-363b-4da1-889b-98d4dd10a1fd,1,0,b791a549-ae94-46f2-8f04-771fdeb4cc54,b791a549-ae94-46f2-8f04-771fdeb4cc54,1,0,4681cb63-c581-4c08-b18c-016d9b478ef2,4681cb63-c581-4c08-b18c-016d9b478ef2,1,0,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,1,0,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,1,0,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,1,0,1d429511-9446-4102-95f4-df676125e14c,1d429511-9446-4102-95f4-df676125e14c,1,0,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,1,0,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,1,0,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,1,0,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,1,0,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,1,0,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,1,0,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,1,0,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,1,0,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,1,0,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,1,0,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,1,0,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,1,0,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,1,0,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,1,0,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,1,0,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,1,0,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,1,0,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,1,0,eefa9859-4168-4a10-923f-e4a713c99a3b,eefa9859-4168-4a10-923f-e4a713c99a3b,1,0,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,1,0,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,1,0,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,1,0,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,1,0,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,1,0,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,1,0,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,1,0,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,1,0,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,1,0,39bddcde-697c-4e77-adfd-e4a77529ea97,39bddcde-697c-4e77-adfd-e4a77529ea97,1,0,a3b15381-bf9b-4b26-96eb-392fa2cc8223,a3b15381-bf9b-4b26-96eb-392fa2cc8223,1,0,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,1,0,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,1,0,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,1,0,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,1,0,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,1,0,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,1,0,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,1,0,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,1,0,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,1,0,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,1,0,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,1,0,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,1,0,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,1,0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,1,0,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,1,0,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,1,0,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,1,0,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,1,0,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,1,0,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,1,0,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,1,0,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,1,0,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,1,0,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,1,0,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,1,0,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,1,0,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,1,0,c49cef0d-3b71-4e66-9e35-72b94920dae5,c49cef0d-3b71-4e66-9e35-72b94920dae5,1,0,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,1,0,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,1,0,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,1,0,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,1,0,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,1,0,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,1,0,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,1,0,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,1,0,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,1,0,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,1,0,b363f72f-3629-453c-9f7d-9828ef6de733,b363f72f-3629-453c-9f7d-9828ef6de733,1,0,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,1,0,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,1,0,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,1,0,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,1,0,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,1,0,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,1,0,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,1,0,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,1,0,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,1,0,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,1,0,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,1,0,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,1,0,dd0610c8-cd87-4fe2-8a1f-70157132785b,dd0610c8-cd87-4fe2-8a1f-70157132785b,1,0,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,1,0,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,1,0,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,1,0,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,1,0,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,1,0,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,1,0,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,1,0,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,1,0,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,1,0,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,1,0,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,1,0,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,1,0,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,1,0,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,1,0,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,1,0,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,1,0,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,1,0,c656771c-dcb7-4c78-9a16-e62806d5bb5a,c656771c-dcb7-4c78-9a16-e62806d5bb5a,1,0,ec42c45c-18ca-44b0-9c59-1cb204552a43,ec42c45c-18ca-44b0-9c59-1cb204552a43,1,0,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,1,0,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,1,0,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,1,0,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,1,0,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,1,0,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,1,0,02abb5e3-9d4e-4c45-af19-71796966ed19,02abb5e3-9d4e-4c45-af19-71796966ed19,1,0,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,1,0,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,1,0,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,1,0,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,1,0,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,1,0,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,1,0,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,1,0,50515bbc-43ee-4b00-bfc5-105b7981bd8f,50515bbc-43ee-4b00-bfc5-105b7981bd8f,1,0,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,1,0,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,1,0,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,1,0,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,1,0,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,1,0,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,1,0,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,1,0,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,1,0,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,1,0,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,1,0,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,1,0,699f734b-43d2-4351-bff8-e0e21e164a42,699f734b-43d2-4351-bff8-e0e21e164a42,1,0,95f0792a-7ac4-450a-b05c-219741e61abd,95f0792a-7ac4-450a-b05c-219741e61abd,1,0,742a2e8c-496e-4e02-931d-d33f7afe07a5,742a2e8c-496e-4e02-931d-d33f7afe07a5,1,0,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,1,0,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,1,0,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,1,0,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,1,0,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,1,0,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,1,0,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,1,0,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,1,0,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,1,0,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,1,0,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,1,0,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,1,0,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,1,0,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,1,0,6564ce89-134f-4726-8693-fd93aad46180,6564ce89-134f-4726-8693-fd93aad46180,1,0,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,1,0,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,1,0,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,1,0,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,1,0,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,1,0,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,1,0,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,1,0,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,1,0,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,1,0,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,1,0,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,1,0,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,1,0,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,1,0,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,1,0,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,1,0,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,1,0,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,1,0,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,1,0,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,1,0,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,1,0,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,1,0,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,1,0,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,1,0,d754ed75-2a32-4b86-a153-7b50c39f9836,d754ed75-2a32-4b86-a153-7b50c39f9836,1,0,b81f3ee1-66f7-4626-a35b-ef85388c678e,b81f3ee1-66f7-4626-a35b-ef85388c678e,1,0,2ad04793-c162-4915-a260-ca4da535cdac,2ad04793-c162-4915-a260-ca4da535cdac,1,0,6568d853-dfe5-4064-aa73-c1f546e951b4,6568d853-dfe5-4064-aa73-c1f546e951b4,1,0,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,1,0,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,1,0,bbe718b2-6b4c-4d78-a408-5369d356a1e6,bbe718b2-6b4c-4d78-a408-5369d356a1e6,1,0,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,1,0,eb7623df-b4e3-4272-9f92-42a9214f9f17,eb7623df-b4e3-4272-9f92-42a9214f9f17,1,0,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,1,0,b08fd921-c3d6-44eb-9401-fec5acab5d22,b08fd921-c3d6-44eb-9401-fec5acab5d22,1,0,1611855a-abf4-4269-aed3-3f78dce7bea5,1611855a-abf4-4269-aed3-3f78dce7bea5,1,0,c5bd277c-b258-43af-9c80-3e328b1581f5,c5bd277c-b258-43af-9c80-3e328b1581f5,1,0,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,1,0,f9cefef4-2182-42ca-93ef-b6a51d6555cc,f9cefef4-2182-42ca-93ef-b6a51d6555cc,1,0,71e1c7de-7367-424c-ae07-6ec04b408b83,71e1c7de-7367-424c-ae07-6ec04b408b83,1,0,b3956392-199c-4934-80d1-8cdab453d879,b3956392-199c-4934-80d1-8cdab453d879,1,0,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,1,0,d1bd7448-aa5f-43fc-9735-224f36960c3e,d1bd7448-aa5f-43fc-9735-224f36960c3e,1,0,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,1,0,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,1,0,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1,0,8227471b-8ffb-4ba7-b4da-b21570582876,8227471b-8ffb-4ba7-b4da-b21570582876,1,0,25864028-1a53-4a8d-b6e4-189fa62c62f5,25864028-1a53-4a8d-b6e4-189fa62c62f5,1,0,e923beae-0bd8-4119-a802-fd6bfb729f10,e923beae-0bd8-4119-a802-fd6bfb729f10,1,0,d40bb9f7-3397-40ad-b658-f8942bdbbaee,d40bb9f7-3397-40ad-b658-f8942bdbbaee,1,0,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,1,0,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,1,0,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,1,0,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,1,0,cfa55ab3-1335-4712-8352-03c2f0277708,cfa55ab3-1335-4712-8352-03c2f0277708,1,0,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,1,0,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,1,0,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,1,0,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,1,0,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,1,0,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,1,0,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,1,0,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,1,0,5d45a926-513f-4bbc-a002-54a2db94b297,5d45a926-513f-4bbc-a002-54a2db94b297,1,0,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,1,0,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,1,0,61dc318a-c17d-402e-bf64-a0c0a63a1c93,61dc318a-c17d-402e-bf64-a0c0a63a1c93,1,0,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,1,0,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,1,0,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,1,0,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,1,0,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,1,0,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,1,0,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,1,0,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,1,0,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,1,0,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,1,0,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,1,0,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,1,0,9db23e96-d13a-4847-941a-462f64d0619d,9db23e96-d13a-4847-941a-462f64d0619d,1,0,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,1,0,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1,0,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,1,0,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,1,0,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,1,0,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,1,0,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,1,0,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,1,0,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,1,0,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,1,0,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,1,0,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,1,0,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,1,0,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,1,0,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,1,0,fa9572ee-0303-4421-9125-70cf3dd5a8c7,fa9572ee-0303-4421-9125-70cf3dd5a8c7,1,0,4cdd7920-0c49-4950-b92f-fdf6e34578b2,4cdd7920-0c49-4950-b92f-fdf6e34578b2,1,0,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,1,0,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,1,0,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,1,0,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,1,0,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,1,0,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,1,0,6852c584-d989-418d-8d18-255492891ef0,6852c584-d989-418d-8d18-255492891ef0,1,0,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,1,0,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,1,0,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,1,0,ff830967-faa9-415f-aa6e-8d27779f91f8,ff830967-faa9-415f-aa6e-8d27779f91f8,1,0,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,1,0,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,1,0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,1,0,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,1,0,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,1,0,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,1,0,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,1,0,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,1,0,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,1,0,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,1,0,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,1,0,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,1,0,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,1,0,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,1,0,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,1,0,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,1,0,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,1,0,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,1,0,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,1,0,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,1,0,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,1,0,d97c6204-3656-4591-aea9-6ebedffe1247,d97c6204-3656-4591-aea9-6ebedffe1247,1,0,7caabe33-184f-45db-bef4-59d4e9cd2394,7caabe33-184f-45db-bef4-59d4e9cd2394,1,0,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,1,0,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1,0,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,1,0,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,1,0,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,1,0,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,1,0,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1,0,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,1,0,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,1,0,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,1,0,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,1,0,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,1,0,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,1,0,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,1,0,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,1,0,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,1,0,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,1,0,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,1,0,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,1,0,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,1,0,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,1,0,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,1,0,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,1,0,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,1,0,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,1,0,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,1,0,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,1,0,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,1,0,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,1,0,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,1,0,abf8a23d-45c3-4feb-8df2-279b709d7722,abf8a23d-45c3-4feb-8df2-279b709d7722,1,0,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,1,0,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,1,0,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,1,0,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,1,0,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,1,0,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,1,0,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,1,0,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,1,0,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,1,0,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,1,0,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,1,0,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,1,0,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,1,0,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,1,0,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,1,0,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,1,0,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,1,0,8525d945-08aa-4928-8dca-4e172ea94328,8525d945-08aa-4928-8dca-4e172ea94328,1,0,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,1,0,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,1,0,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,1,0,82be906c-bb06-40ea-b908-54574b0b4848,82be906c-bb06-40ea-b908-54574b0b4848,1,0,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,1,0,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,1,0,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1,0,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,1,0,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,1,0,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,1,0,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,1,0,05558ce4-8568-4009-b1d7-307d54967515,05558ce4-8568-4009-b1d7-307d54967515,1,0,74380324-9b7b-49f6-9458-88deb9405f98,74380324-9b7b-49f6-9458-88deb9405f98,1,0,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,1,0,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,1,0,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,1,0,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,1,0,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,1,0,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,1,0,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,1,0,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,1,0,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,1,0,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,1,0,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,1,0,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,1,0,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,1,0,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,1,0,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,1,0,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,1,0,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,1,0,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,1,0,b885dbb2-6e18-46a6-929c-3d6d392343ad,b885dbb2-6e18-46a6-929c-3d6d392343ad,1,0,d31e24cf-7493-45dc-ba81-3a00618e53bc,d31e24cf-7493-45dc-ba81-3a00618e53bc,1,0,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,1,0,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,1,0,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,1,0,19a0b881-302e-4d0e-ace0-29a9d8379a48,19a0b881-302e-4d0e-ace0-29a9d8379a48,1,0,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,1,0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,1,0,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,1,0,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,1,0,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,1,0,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,1,0,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,1,0,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,1,0,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,1,0,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,1,0,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,1,0,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,1,0,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,1,0,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,1,0,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,1,0,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,1,0,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,1,0,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,1,0,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,1,0,e9ab9d00-6e42-439b-8efc-fcacf727016d,e9ab9d00-6e42-439b-8efc-fcacf727016d,1,0,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,1,0,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,1,0,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,1,0,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,1,0,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,1,0,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,1,0,f9229c3e-4a47-49a4-8b14-908218012ff7,f9229c3e-4a47-49a4-8b14-908218012ff7,1,0,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,1,0,b9743978-ba6d-4892-bb32-f24d4a47dd50,b9743978-ba6d-4892-bb32-f24d4a47dd50,1,0,c43accb9-f33d-437f-b305-0595f8fe3032,c43accb9-f33d-437f-b305-0595f8fe3032,1,0,084a398b-836e-424c-af93-22aa39d5a15a,084a398b-836e-424c-af93-22aa39d5a15a,1,0,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,1,0,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,1,0,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,1,0,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,1,0,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,1,0,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,1,0,6ffd2da8-db97-46fc-9a53-8e665a598e3c,6ffd2da8-db97-46fc-9a53-8e665a598e3c,1,0,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,1,0,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,1,0,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,1,0,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,1,0,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,1,0,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,1,0,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,1,0,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,1,0,2b2bf0f7-0946-4492-bba0-27f007a70e64,2b2bf0f7-0946-4492-bba0-27f007a70e64,1,0,22c9a703-5ed3-4156-8fa6-476b1c1452f1,22c9a703-5ed3-4156-8fa6-476b1c1452f1,1,0,8be10d88-8c37-4444-9c89-6cbbe9913bda,8be10d88-8c37-4444-9c89-6cbbe9913bda,1,0,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,1,0,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,1,0,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,1,0,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,1,0,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,1,0,cb1d4a41-20a9-4d76-8798-d47d8858bff1,cb1d4a41-20a9-4d76-8798-d47d8858bff1,1,0,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,1,0,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,1,0,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,1,0,b4c026eb-4271-4366-b529-1cdfe2874563,b4c026eb-4271-4366-b529-1cdfe2874563,1,0,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,1,0,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,1,0,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,1,0,5198c6db-2100-4902-82c8-85c8ea555e78,5198c6db-2100-4902-82c8-85c8ea555e78,1,0,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,1,0,f0b1e9f4-2e07-44e6-88d2-c11457135781,f0b1e9f4-2e07-44e6-88d2-c11457135781,1,0,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,1,0,f935399f-3554-4c08-b0a6-eba13074e1b7,f935399f-3554-4c08-b0a6-eba13074e1b7,1,0,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,1,0,765f9584-fefa-4695-b130-dd54c3b0d79d,765f9584-fefa-4695-b130-dd54c3b0d79d,1,0,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,1,0,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,1,0,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,1,0,2c1c9284-ba8b-4282-a89c-429f02ea41f6,2c1c9284-ba8b-4282-a89c-429f02ea41f6,1,0,8c241467-76f7-4161-a8a1-5da4a6576b75,8c241467-76f7-4161-a8a1-5da4a6576b75,1,0,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1,0,fd7e5257-024c-46de-9ff3-edd302fadba5,fd7e5257-024c-46de-9ff3-edd302fadba5,1,0,a4168057-d99f-4b55-b762-214f95ae3a30,a4168057-d99f-4b55-b762-214f95ae3a30,1,0,ab4fe549-1c07-42d9-b412-8b89ed115591,ab4fe549-1c07-42d9-b412-8b89ed115591,1,0,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,1,0,b49c589d-b45d-4aff-8899-72cfe433e9a6,b49c589d-b45d-4aff-8899-72cfe433e9a6,1,0,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,1,0,273ad3f7-c645-434d-93b0-e832134f3043,273ad3f7-c645-434d-93b0-e832134f3043,1,0,d320803b-1de4-4e66-b455-0afe39be5c41,d320803b-1de4-4e66-b455-0afe39be5c41,1,0,483dfce4-9c66-4739-94d4-17a005d64f5b,483dfce4-9c66-4739-94d4-17a005d64f5b,1,0,19506116-43ef-433c-822c-ef8717b0da6b,19506116-43ef-433c-822c-ef8717b0da6b,1,0,464b92cc-b577-4350-ae9f-e697390248d7,464b92cc-b577-4350-ae9f-e697390248d7,1,0,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,1,0,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,1,0,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,1,0,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,1,0,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,1,0,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,1,0,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,1,0,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,1,0,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,1,0,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,1,0,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,1,0,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,1,0,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,1,0,86249619-8981-4fc4-85fc-ce30e4b9d542,86249619-8981-4fc4-85fc-ce30e4b9d542,1,0,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,1,0,98aa8a80-29fa-4a54-8d0e-90d413d63da1,98aa8a80-29fa-4a54-8d0e-90d413d63da1,1,0,60af0c11-852e-4b45-afb7-251d75a87150,60af0c11-852e-4b45-afb7-251d75a87150,1,0,37e81463-a558-4b03-b0e4-82ac0e99c80c,37e81463-a558-4b03-b0e4-82ac0e99c80c,1,0,8be35c43-32e6-418d-b3d6-e53ef56babb7,8be35c43-32e6-418d-b3d6-e53ef56babb7,1,0,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,1,0,935d01e1-232b-480e-a6bf-c21c617c6348,935d01e1-232b-480e-a6bf-c21c617c6348,1,0,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,1,0,05c702a1-2c74-45d5-b2ee-fdd795b0945a,05c702a1-2c74-45d5-b2ee-fdd795b0945a,1,0,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,1,0,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,1,0,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,1,0,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,1,0,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,1,0,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,1,0,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,1,0,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,1,0,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,1,0,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,1,0,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,1,0,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,1,0,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,1,0,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,1,0,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,1,0,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,1,0,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,1,0,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,1,0,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,1,0,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,1,0,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,1,0,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,1,0,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,1,0,a89ee622-6942-411a-8566-f03d139c9e5b,a89ee622-6942-411a-8566-f03d139c9e5b,1,0,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,1,0,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,1,0,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,1,0,198ea989-5001-47ac-86b8-aa2585a5f7d7,198ea989-5001-47ac-86b8-aa2585a5f7d7,1,0,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,1,0,fb84c5f7-11da-4b17-979e-41e27a74e789,fb84c5f7-11da-4b17-979e-41e27a74e789,1,0,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,1,0,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,1,0,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,1,0,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,1,0,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,1,0,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,1,0,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,1,0,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,1,0,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,1,0,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,1,0,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,1,0,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,1,0,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,1,0,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,1,0,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,1,0,fad26b16-8638-496b-bd12-381fc6f5b71f,fad26b16-8638-496b-bd12-381fc6f5b71f,1,0,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,1,0,324a56c9-02d9-4177-af84-a817b8c41169,324a56c9-02d9-4177-af84-a817b8c41169,1,0,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,1,0,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,1,0,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,1,0,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,1,0,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,1,0,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,1,0,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,1,0,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,1,0,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,1,0,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,1,0,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,1,0,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,1,0,3ab0649b-239f-4466-b897-73c0ab628927,3ab0649b-239f-4466-b897-73c0ab628927,1,0,4c697110-8941-4d6d-ba03-f2b9e96ff82e,4c697110-8941-4d6d-ba03-f2b9e96ff82e,1,0,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,1,0,b172631b-da0d-42f4-ae6b-ae122a46cced,b172631b-da0d-42f4-ae6b-ae122a46cced,1,0,1a25e744-37ae-46ca-a328-ff8eced21a82,1a25e744-37ae-46ca-a328-ff8eced21a82,1,0,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,1,0,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,1,0,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,1,0,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,1,0,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,1,0,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,1,0,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,1,0,5a94a307-3f54-4753-8ef5-ce9f88417827,5a94a307-3f54-4753-8ef5-ce9f88417827,1,0,0f09b6b8-72ac-4461-96c4-683be403e2ff,0f09b6b8-72ac-4461-96c4-683be403e2ff,1,0,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,1,0,19d1d74a-de5f-475a-896c-a32b7d28f918,19d1d74a-de5f-475a-896c-a32b7d28f918,1,0,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,1,0,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,1,0,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,1,0,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,1,0,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,1,0,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,1,0,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,1,0,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,1,0,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,1,0,e6a53f32-0b7d-499d-844e-fb8df13a3519,e6a53f32-0b7d-499d-844e-fb8df13a3519,1,0,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,1,0,2c5a56d3-386e-45df-adc2-4471f52f9bdc,2c5a56d3-386e-45df-adc2-4471f52f9bdc,1,0,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,1,0,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,1,0,22474ca3-565b-4b67-a5b4-b0b959306d10,22474ca3-565b-4b67-a5b4-b0b959306d10,1,0,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1,0,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,1,0,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,1,0,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,1,0,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,1,0,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,1,0,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,1,0,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,1,0,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,1,0,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,1,0,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,1,0,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,1,0,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,1,0,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,1,0,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,1,0,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,1,0,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,1,0,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,1,0,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,1,0,3e44d463-f253-4a64-8d68-631fcb66935c,3e44d463-f253-4a64-8d68-631fcb66935c,1,0,653d6483-029b-4453-a7d0-3a3c6d9d0b05,653d6483-029b-4453-a7d0-3a3c6d9d0b05,1,0,ac507771-50bd-4f8b-b72f-5954562c9131,ac507771-50bd-4f8b-b72f-5954562c9131,1,0,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,1,0,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,1,0,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,1,0,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,1,0,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,1,0,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,1,0,a23e6c77-8c12-4f99-ae2d-68a12274be38,a23e6c77-8c12-4f99-ae2d-68a12274be38,1,0,3c4454cd-31e9-42a5-9127-fb66a628f0e1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,1,0,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,1,0,31cac1e9-eb16-489c-9322-30d1e27a80b3,31cac1e9-eb16-489c-9322-30d1e27a80b3,1,0,0d100e33-7941-41c1-962d-7672c874e9c5,0d100e33-7941-41c1-962d-7672c874e9c5,1,0,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,1,0,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,1,0,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,1,0,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,1,0,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,1,0,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,1,0,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1,0,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,1,0,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,1,0,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,1,0,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,1,0,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,1,0,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,1,0,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,1,0,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,1,0,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,1,0,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,1,0,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,1,0,118a0e62-c0bb-435b-9e3e-c64563efa602,118a0e62-c0bb-435b-9e3e-c64563efa602,1,0,b57bc8a9-8a59-4192-a442-2e1982e83179,b57bc8a9-8a59-4192-a442-2e1982e83179,1,0,5b06ccda-2a70-4621-8273-78408cbe72a9,5b06ccda-2a70-4621-8273-78408cbe72a9,1,0,89753385-64fd-4e76-9857-bfd5d7c23f71,89753385-64fd-4e76-9857-bfd5d7c23f71,1,0,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1,0,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,1,0,e20bcb57-2f68-4709-8a11-105d561a2dda,e20bcb57-2f68-4709-8a11-105d561a2dda,1,0,3df3f61a-2c17-4278-8d82-91089f793e6a,3df3f61a-2c17-4278-8d82-91089f793e6a,1,0,ea8beea1-7d80-4613-b2f9-79ee612e977a,ea8beea1-7d80-4613-b2f9-79ee612e977a,1,0,afd62a32-fdbb-429a-9a64-89c61a07e018,afd62a32-fdbb-429a-9a64-89c61a07e018,1,0,027cef43-99bd-48d3-a1a3-2102ac003742,027cef43-99bd-48d3-a1a3-2102ac003742,1,0,00197ea9-de76-4e2a-97bc-93e44053e35e,00197ea9-de76-4e2a-97bc-93e44053e35e,1,0,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,1,0,a51f7c6f-2631-4d23-becc-c0e8b711fddd,a51f7c6f-2631-4d23-becc-c0e8b711fddd,1,0,37806357-d92c-4bea-a5ef-77f138578fda,37806357-d92c-4bea-a5ef-77f138578fda,1,0,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,1,0,0a880538-f97f-448e-a4a9-82b0194dbe28,0a880538-f97f-448e-a4a9-82b0194dbe28,1,0,179868b7-d342-4df0-9386-c114d75faf3a,179868b7-d342-4df0-9386-c114d75faf3a,1,0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,1,0,b49ea672-5d01-46c2-8ece-2511afeb740d,b49ea672-5d01-46c2-8ece-2511afeb740d,1,0,77bb5aba-1364-4db9-aa93-69f001ce2709,77bb5aba-1364-4db9-aa93-69f001ce2709,1,0,d14528d6-c2dd-4184-98c5-0b444a2bd98b,d14528d6-c2dd-4184-98c5-0b444a2bd98b,1,0,48f81387-a409-4163-85b8-ad563cb6cf2e,48f81387-a409-4163-85b8-ad563cb6cf2e,1,0,739df12e-1b6b-45c6-802b-658641fb9e90,739df12e-1b6b-45c6-802b-658641fb9e90,1,0,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,1,0,7e4afed8-5c56-4765-bcd0-a40e6121ba22,7e4afed8-5c56-4765-bcd0-a40e6121ba22,1,0,155660a1-8a63-4562-a715-d75a8af7176b,155660a1-8a63-4562-a715-d75a8af7176b,1,0,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,1,0,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,1,0,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,1,0,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,1,0,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,1,0,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,1,0,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,1,0,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,1,0,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,1,0,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,1,0,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,1,0,618b8843-7413-4634-bd65-18d904c2582f,618b8843-7413-4634-bd65-18d904c2582f,1,0,253b97a6-4e04-40d0-a39e-99500d54accb,253b97a6-4e04-40d0-a39e-99500d54accb,1,0,46cf1217-4b49-4c35-9c2b-4739dd1b8bf5,46cf1217-4b49-4c35-9c2b-4739dd1b8bf5,1,0,db367faa-e417-40ff-a082-e93421d464ca,db367faa-e417-40ff-a082-e93421d464ca,1,0,55ad14cb-7647-4d16-ae68-ac45e4a39c01,55ad14cb-7647-4d16-ae68-ac45e4a39c01,1,0,f0363f45-9d63-4f0b-b7fc-95cb0d1660af,f0363f45-9d63-4f0b-b7fc-95cb0d1660af,1,0,d8a16236-89bc-4493-9b8e-fd5d3f9298a7,d8a16236-89bc-4493-9b8e-fd5d3f9298a7,1,0,b12a0998-905e-4956-af8b-6460dc945c10,b12a0998-905e-4956-af8b-6460dc945c10,1,0,6a958a2b-e914-4321-9e95-3203e8011b8c,6a958a2b-e914-4321-9e95-3203e8011b8c,1,0,176181ff-58af-4392-817e-49e37caa73ce,176181ff-58af-4392-817e-49e37caa73ce,1,0,917d059b-91d9-4f74-8c10-d0016162f77e,917d059b-91d9-4f74-8c10-d0016162f77e,1,0,95fd99eb-b139-4b7a-93db-70419e9a809b,95fd99eb-b139-4b7a-93db-70419e9a809b,1,0,c60b9f4f-870f-4478-b2b4-e8afa9324d54,c60b9f4f-870f-4478-b2b4-e8afa9324d54,1,0,e31d2420-266e-408a-a4bf-673194a555d3,e31d2420-266e-408a-a4bf-673194a555d3,1,0,31418550-c525-448b-a054-6b055aa11267,31418550-c525-448b-a054-6b055aa11267,1,0,2003c769-556e-41a6-a7a6-4c5c7263e48d,2003c769-556e-41a6-a7a6-4c5c7263e48d,1,0,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,1,0,d3211832-c8ca-437a-8810-82e06cbb48de,d3211832-c8ca-437a-8810-82e06cbb48de,1,0,8131d701-1014-4196-9b67-914e451f8a3a,8131d701-1014-4196-9b67-914e451f8a3a,1,0,2b102933-c660-4e74-ae9a-5061a88ed672,2b102933-c660-4e74-ae9a-5061a88ed672,1,0,56c897b7-d34e-4d7d-9a3b-d0779be5c189,56c897b7-d34e-4d7d-9a3b-d0779be5c189,1,0,3ac81c80-56bd-4750-b135-07ab522e3eab,3ac81c80-56bd-4750-b135-07ab522e3eab,1,0,5657872f-c7d5-446f-bcc3-d0b86ad63a42,5657872f-c7d5-446f-bcc3-d0b86ad63a42,1,0,d5214cb9-67e2-469f-989f-3f2b662ae830,d5214cb9-67e2-469f-989f-3f2b662ae830,1,0,69679e88-4f2b-4dd6-8cb2-b88293d07b55,69679e88-4f2b-4dd6-8cb2-b88293d07b55,1,0,68679208-9972-4854-8649-49bdf6212255,68679208-9972-4854-8649-49bdf6212255,1,0,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,1,0,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,1,0,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,1,0,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,1,0,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,1,0,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,1,0,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,1,0,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,1,0,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,1,0,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,1,0,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,1,0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,1,0,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1,0,00605607-03ab-43fc-ba08-9fc32f582d0a,00605607-03ab-43fc-ba08-9fc32f582d0a,1,0,5ab0a910-74ab-4af0-b5a3-40845a789fde,5ab0a910-74ab-4af0-b5a3-40845a789fde,1,0,bb659006-c11e-4427-8d86-229ba43ef679,bb659006-c11e-4427-8d86-229ba43ef679,1,0,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,1,0,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,1,0,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,1,0,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,1,0,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,1,0,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,1,0,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,1,0,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,1,0,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,1,0,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,1,0,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,1,0,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1,0,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,1,0,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,1,0,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,1,0,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,1,0,ec11342f-594f-416f-a10f-bd1bfa695c08,ec11342f-594f-416f-a10f-bd1bfa695c08,1,0,31c3ac44-204e-43fd-bca3-fd18fa091c58,31c3ac44-204e-43fd-bca3-fd18fa091c58,1,0,74f03c35-5da0-406e-a938-e8e5d49975ef,74f03c35-5da0-406e-a938-e8e5d49975ef,1,0,c9ab3890-6d16-431f-ab2b-b5058e6202a4,c9ab3890-6d16-431f-ab2b-b5058e6202a4,1,0,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,1,0,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,1,0,4090c6f7-1d25-4b17-9baa-18daa0640b0f,4090c6f7-1d25-4b17-9baa-18daa0640b0f,1,0,26125e58-dfc8-4bbb-a3a4-80616471746e,26125e58-dfc8-4bbb-a3a4-80616471746e,1,0,b1c699cd-efdc-461c-ad37-10bfd4bc9674,b1c699cd-efdc-461c-ad37-10bfd4bc9674,1,0,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,1,0,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,1,0,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,1,0,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,1,0,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,1,0,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,1,0,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,1,0,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,1,0,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,1,0,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,1,0,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,1,0,985106b7-7476-4b48-90ac-ad86876395b5,985106b7-7476-4b48-90ac-ad86876395b5,1,0,0d8db0c9-adbc-478d-997c-3d7feccac99b,0d8db0c9-adbc-478d-997c-3d7feccac99b,1,0,3fd2ef04-c178-47bf-ab62-7baf83236d99,3fd2ef04-c178-47bf-ab62-7baf83236d99,1,0,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,1,0,320bf2e6-a3a8-490b-8aa0-21369ffb121b,320bf2e6-a3a8-490b-8aa0-21369ffb121b,1,0,a3bafc54-8fe4-4841-acc6-74a87baf9caf,a3bafc54-8fe4-4841-acc6-74a87baf9caf,1,0,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,1,0,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,1,0,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,1,0,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,1,0,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,1,0,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,1,0,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,1,0,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,1,0,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,1,0,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,1,0,00696255-ea14-4fee-8633-0962f3c441d1,00696255-ea14-4fee-8633-0962f3c441d1,1,0,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,1,0,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,1,0,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,1,0,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,1,0,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,1,0,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,1,0,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,1,0,fef27478-ddfd-4ad9-8161-148761f29698,fef27478-ddfd-4ad9-8161-148761f29698,1,0,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,1,0,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,1,0,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,1,0,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,1,0,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,1,0,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,1,0,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,1,0,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,1,0,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1,0,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,1,0,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,1,0,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,1,0,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,1,0,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,1,0,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,1,0,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,1,0,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,1,0,fc1476f7-26e6-4374-b99b-e515d86c050a,fc1476f7-26e6-4374-b99b-e515d86c050a,1,0,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,1,0,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,1,0,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,1,0,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,1,0,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,1,0,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,1,0,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,1,0,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,1,0,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,1,0,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,1,0,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,1,0,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,1,0,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,1,0,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,1,0,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,1,0,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,1,0,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,1,0,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,1,0,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,1,0,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,1,0,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,1,0,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,1,0,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,1,0,d8601e95-af94-4805-974a-99c539725d74,d8601e95-af94-4805-974a-99c539725d74,1,0,6d98f877-f3bb-4795-9025-2631468a331f,6d98f877-f3bb-4795-9025-2631468a331f,1,0,89b9379d-ace9-48cc-b979-a66fd45aeb1d,89b9379d-ace9-48cc-b979-a66fd45aeb1d,1,0,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,1,0,9767a113-5a42-4749-bf40-0f349e85615d,9767a113-5a42-4749-bf40-0f349e85615d,1,0,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,1,0,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,1,0,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,1,0,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,1,0,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,1,0,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,1,0,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,1,0,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,1,0,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,1,0,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,1,0,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,1,0,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,1,0,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,1,0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,1,0,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,1,0,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,1,0,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,1,0,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,1,0,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,1,0,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,1,0,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,1,0,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,1,0,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,1,0,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,1,0,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,1,0,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,1,0,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,1,0,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,1,0,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,1,0,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,1,0,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,1,0,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,1,0,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,1,0,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,1,0,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,1,0,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,1,0,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,1,0,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,1,0,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,1,0,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,1,0,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,1,0,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,1,0,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,1,0,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,1,0,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,1,0,b3f7f763-bea9-4f59-9450-df95e5c3d89d,b3f7f763-bea9-4f59-9450-df95e5c3d89d,1,0,9111e28e-c1c7-414b-9288-61bd06a04d04,9111e28e-c1c7-414b-9288-61bd06a04d04,1,0,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,1,0,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,1,0,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,1,0,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,1,0,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,1,0,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1,0,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,1,0,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,1,0,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,1,0,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,1,0,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,1,0,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1,0,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,1,0,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,1,0,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,1,0,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,1,0,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,1,0,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,1,0,3afe11f6-7424-4b41-a42f-91db33756fa3,3afe11f6-7424-4b41-a42f-91db33756fa3,1,0,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,1,0,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,1,0,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,1,0,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,1,0,58e92a42-b650-4282-a2b2-2fe2cc0cf50d,58e92a42-b650-4282-a2b2-2fe2cc0cf50d,1,0,8c1a0b0c-3618-4e66-98b8-8b9e7ca63ca2,8c1a0b0c-3618-4e66-98b8-8b9e7ca63ca2,1,0,6cd10bda-0741-4445-9ffa-17182c9c5a58,6cd10bda-0741-4445-9ffa-17182c9c5a58,1,0,5c874c9a-fe67-45a3-a1d3-7ec1d1c55090,5c874c9a-fe67-45a3-a1d3-7ec1d1c55090,1,0,68a623fa-099a-4688-a7e9-444fb42eb650,68a623fa-099a-4688-a7e9-444fb42eb650,1,0,36ed0626-e389-4106-81bc-77462598bb45,36ed0626-e389-4106-81bc-77462598bb45,1,0,faeefd44-4e11-4a7d-8d4e-4dc9c6b60d59,faeefd44-4e11-4a7d-8d4e-4dc9c6b60d59,1,0,737d5b7f-0ee9-46b5-a509-f06b6176a293,737d5b7f-0ee9-46b5-a509-f06b6176a293,1,0,42eb6f71-0ed7-486a-92fb-976d1b46b081,42eb6f71-0ed7-486a-92fb-976d1b46b081,1,0,4a389216-b4c9-4368-af2c-1e51e32671a5,4a389216-b4c9-4368-af2c-1e51e32671a5,1,0,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,1,0,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,1,0,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,1,0,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,1,0,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,1,0,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,1,0,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,1,0,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,1,0,c7bafd34-5b15-42ec-b329-0be3002775ad,c7bafd34-5b15-42ec-b329-0be3002775ad,1,0,6feb2278-9149-47f8-a0ec-eb4bd9f44716,6feb2278-9149-47f8-a0ec-eb4bd9f44716,1,0,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,1,0,cd6770d5-cd3c-47af-bc46-c865993adf63,cd6770d5-cd3c-47af-bc46-c865993adf63,1,0,97ec899d-a2a0-4691-83ff-25b78dd49ef6,97ec899d-a2a0-4691-83ff-25b78dd49ef6,1,0,411db885-f761-44e5-bdd1-9fdf9e741ac1,411db885-f761-44e5-bdd1-9fdf9e741ac1,1,0,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,1,0,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,1,0,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,43e37533-ed38-4000-a387-5749f8d9aaf3,43e37533-ed38-4000-a387-5749f8d9aaf3,1,0,e93bdb44-64b3-43d8-b15a-c561dbb91974,e93bdb44-64b3-43d8-b15a-c561dbb91974,1,0,a7c7c835-5402-4bdd-a0e3-d21746174d5a,a7c7c835-5402-4bdd-a0e3-d21746174d5a,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,1,0,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,1,0,ad066c0d-4f4c-48af-9cc8-bb835372150a,ad066c0d-4f4c-48af-9cc8-bb835372150a,1,0,a2145e81-239e-4267-8a43-ea3f7babe878,a2145e81-239e-4267-8a43-ea3f7babe878,1,0,39598414-9c1d-46ec-a534-8bd43e622e45,39598414-9c1d-46ec-a534-8bd43e622e45,1,0,b552c510-4fd4-4c16-9022-dc5babcafc52,b552c510-4fd4-4c16-9022-dc5babcafc52,1,0,3892c06d-28f1-4238-a929-201316cac1ed,3892c06d-28f1-4238-a929-201316cac1ed,1,0,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,1,0,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,1,0,1f587ff1-95a4-4f45-85b4-22bb97011177,1f587ff1-95a4-4f45-85b4-22bb97011177,1,0,567c68fd-74c7-4b6e-9119-56ac8d78073c,567c68fd-74c7-4b6e-9119-56ac8d78073c,1,0,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,1,0,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,1,0,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,1,0,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,1,0,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,1,0,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,1,0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,1,0,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,1,0,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,1,0,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,1,0,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,1,0,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,1,0,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,1,0,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,1,0,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,1,0,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,1,0,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,1,0,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,1,0,d5a73869-381e-4878-8db7-596643937202,d5a73869-381e-4878-8db7-596643937202,1,0,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,1,0,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,1,0,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,1,0,11a93e3a-3c5b-4242-913c-02474a383344,11a93e3a-3c5b-4242-913c-02474a383344,1,0,ddd2861c-592b-4879-b9de-4b05a22c0b43,ddd2861c-592b-4879-b9de-4b05a22c0b43,1,0,5b383021-a800-4f0b-b8a3-d344389bff6c,5b383021-a800-4f0b-b8a3-d344389bff6c,1,0,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,1,0,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,1,0,8a57d427-a34e-4121-84e6-1a86a9f9092d,8a57d427-a34e-4121-84e6-1a86a9f9092d,1,0,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,1,0,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,1,0,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,1,0,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,1,0,68447105-a784-4803-8eb8-3701b0fc819d,68447105-a784-4803-8eb8-3701b0fc819d,1,0,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,1,0,59dee70d-aeca-470a-b3c4-e43bb16c5753,59dee70d-aeca-470a-b3c4-e43bb16c5753,1,0,82777e92-0681-44bf-b51e-4d98fcd5d5bd,82777e92-0681-44bf-b51e-4d98fcd5d5bd,1,0,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,1,0,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,1,0,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,1,0,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,1,0,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,1,0,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,1,0,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,1,0,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,1,0,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,1,0,325bacdd-793f-47d8-b987-57e9d5f2782b,325bacdd-793f-47d8-b987-57e9d5f2782b,1,0,80395d47-70d7-4d8d-9b18-93283fba80c2,80395d47-70d7-4d8d-9b18-93283fba80c2,1,0,8b621ec9-24c9-4166-90ce-29c5ad30f78b,8b621ec9-24c9-4166-90ce-29c5ad30f78b,1,0,cc98670a-7b18-4973-b211-90261c5c8c10,cc98670a-7b18-4973-b211-90261c5c8c10,1,0,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,1,0,fb36c775-1124-4ba6-8af8-133bf66fcb54,fb36c775-1124-4ba6-8af8-133bf66fcb54,1,0,51f9aff4-71da-4b1b-b48b-04122a17d855,51f9aff4-71da-4b1b-b48b-04122a17d855,1,0,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,1,0,62957889-503f-4923-a372-29776dc3b5e5,62957889-503f-4923-a372-29776dc3b5e5,1,0,778e79ee-eb1a-4d52-8a31-58e781c78fe4,778e79ee-eb1a-4d52-8a31-58e781c78fe4,1,0,90385850-d37b-4b2e-ac87-95c17f32197c,90385850-d37b-4b2e-ac87-95c17f32197c,1,0,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,1,0,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,1,0,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,1,0,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,1,0,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,1,0,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,1,0,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,1,0,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,1,0,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,1,0,73afaad8-dfa9-43e3-bdaf-543c3545d788,73afaad8-dfa9-43e3-bdaf-543c3545d788,1,0,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,1,0,4f0bda80-2246-43be-95f8-ae8480682cd5,4f0bda80-2246-43be-95f8-ae8480682cd5,1,0,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,1,0,6f683f46-9eef-4e78-bc2f-7174238bf53c,6f683f46-9eef-4e78-bc2f-7174238bf53c,1,0,7d1ed38b-98cf-4a0e-a605-680bb580d904,7d1ed38b-98cf-4a0e-a605-680bb580d904,1,0,b769eda0-11de-401c-a68b-4fce4555d4fc,b769eda0-11de-401c-a68b-4fce4555d4fc,1,0,fd7a668f-3099-4e15-956a-92c6295dd4d5,fd7a668f-3099-4e15-956a-92c6295dd4d5,1,0,afcbd830-ec5f-4865-a176-ea3014dff908,afcbd830-ec5f-4865-a176-ea3014dff908,1,0,dc5fc801-14e4-42e8-b396-76eb30b69eea,dc5fc801-14e4-42e8-b396-76eb30b69eea,1,0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,1,0,b7fae67e-bdbb-4cdf-a6fd-26265e48fddb,b7fae67e-bdbb-4cdf-a6fd-26265e48fddb,1,0,398bf9d1-c353-461e-a1be-683047dcbe41,398bf9d1-c353-461e-a1be-683047dcbe41,1,0,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,1,0,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,1,0,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,1,0,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,1,0,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,1,0,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,1,0,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,1,0,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,1,0,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,1,0,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,1,0,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,1,0,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,1,0,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,1,0,569047c2-0879-4fba-a814-44812d21043b,569047c2-0879-4fba-a814-44812d21043b,1,0,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,1,0,80512d95-5458-4934-98ae-a7b58099196b,80512d95-5458-4934-98ae-a7b58099196b,1,0,6f2354cd-4a34-4921-96bb-b786486f85cf,6f2354cd-4a34-4921-96bb-b786486f85cf,1,0,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,1,0,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,1,0,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,1,0,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,1,0,91562fe8-e630-4bcb-a14e-c0e1e129141a,91562fe8-e630-4bcb-a14e-c0e1e129141a,1,0,c261abfd-3828-47b5-aa32-dfdd3a1636ad,c261abfd-3828-47b5-aa32-dfdd3a1636ad,1,0,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,1,0,1db1cb24-f364-4b91-bc96-c216764207a0,1db1cb24-f364-4b91-bc96-c216764207a0,1,0,64d7c8a7-1c15-4afb-ad97-abf8729c604e,64d7c8a7-1c15-4afb-ad97-abf8729c604e,1,0,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,1,0,c04b685a-0d2d-404c-a74a-775ffab298ce,c04b685a-0d2d-404c-a74a-775ffab298ce,1,0,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,1,0,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,1,0,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,1,0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,1,0,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,1,0,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,1,0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,1,0,e057e428-99c1-419d-a169-697c1e825e94,e057e428-99c1-419d-a169-697c1e825e94,1,0,784a60bd-4070-476d-9b8b-f607c76dc52b,784a60bd-4070-476d-9b8b-f607c76dc52b,1,0,ce1ffc4e-56c2-45ce-80e8-8b96d00316bc,ce1ffc4e-56c2-45ce-80e8-8b96d00316bc,1,0,5e33e655-2847-4237-87ff-74775fd36756,5e33e655-2847-4237-87ff-74775fd36756,1,0,f0907d81-656e-4dfb-81d8-14a8847cb38a,f0907d81-656e-4dfb-81d8-14a8847cb38a,1,0,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,1,0,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,1,0,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,1,0,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,1,0,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,1,0,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,1,0,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,1,0,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,1,0,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,1,0,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,1,0,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,1,0,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,1,0,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,1,0,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,1,0,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,1,0,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,1,0,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,1,0,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,1,0,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,1,0,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,1,0,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,1,0,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,1,0,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,1,0,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,1,0,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,1,0,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,1,0,e870a1bd-0c08-4d1e-832a-357922983c19,e870a1bd-0c08-4d1e-832a-357922983c19,1,0,9f71aeac-f889-40dc-91bd-d670da4efd2b,9f71aeac-f889-40dc-91bd-d670da4efd2b,1,0,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,1,0,614ef0bd-3298-408b-bf71-37df8ee60702,614ef0bd-3298-408b-bf71-37df8ee60702,1,0,26ff1be6-f72a-456a-9dce-302029752603,26ff1be6-f72a-456a-9dce-302029752603,1,0,db850a08-0c99-4a57-9b04-38be64bd38fb,db850a08-0c99-4a57-9b04-38be64bd38fb,1,0,abeca127-5ae9-46af-a5e8-d6438fd68367,abeca127-5ae9-46af-a5e8-d6438fd68367,1,0,bce81631-9f6d-42b3-b4b6-2199afb08f2f,bce81631-9f6d-42b3-b4b6-2199afb08f2f,1,0,67d6878f-3e47-4142-8f98-c5a207f0b8a8,67d6878f-3e47-4142-8f98-c5a207f0b8a8,1,0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,1,0,68636657-4d46-4c2a-9b2f-11521a55dfb4,68636657-4d46-4c2a-9b2f-11521a55dfb4,1,0,18a83f43-dc84-4f8a-9580-681b19f571c4,18a83f43-dc84-4f8a-9580-681b19f571c4,1,0,01c588b0-d0ce-4978-b04d-084e6a00fcc7,01c588b0-d0ce-4978-b04d-084e6a00fcc7,1,0,a23642d9-8c4f-44a5-8865-bfb286e47c55,a23642d9-8c4f-44a5-8865-bfb286e47c55,1,0,7b37e038-dcef-41e1-b6e7-ed73c6958415,7b37e038-dcef-41e1-b6e7-ed73c6958415,1,0,24df2d14-5ebf-4ded-ba14-5daee7a0c536,24df2d14-5ebf-4ded-ba14-5daee7a0c536,1,0,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,1,0,03bb028a-ee8c-411e-8382-653046f803c6,03bb028a-ee8c-411e-8382-653046f803c6,1,0,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,1,0,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,1,0,38d5ed93-133b-44fe-827a-69a6cfc0461d,38d5ed93-133b-44fe-827a-69a6cfc0461d,1,0,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,1,0,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,1,0,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,1,0,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,1,0,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1,0,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,1,0,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,1,0,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1,0,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,1,0,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,1,0,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,1,0,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,1,0,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,1,0,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,1,0,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,1,0,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1,0,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,1,0,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,1,0,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,1,0,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,1,0,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,1,0,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,1,0,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,1,0,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,1,0,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,1,0,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,1,0,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,1,0,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1,0,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,1,0,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,1,0,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,1,0,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,1,0,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,1,0,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,1,0,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,1,0,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,1,0,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,1,0,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,1,0,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,1,0,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,1,0,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,1,0,45ca19df-90f3-4143-a659-bc0cb97efee9,45ca19df-90f3-4143-a659-bc0cb97efee9,1,0,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,1,0,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,1,0,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,1,0,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,1,0,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,1,0,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,1,0,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,1,0,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,1,0,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,1,0,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,1,0,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,1,0,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,1,0,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,1,0,cf783265-a4cb-436f-963a-1ff8220ae246,cf783265-a4cb-436f-963a-1ff8220ae246,1,0,3560f949-48f9-4fca-9fe2-81efc1ec0eee,3560f949-48f9-4fca-9fe2-81efc1ec0eee,1,0,662078f0-b75d-4c44-896f-7b7f74fd1ed4,662078f0-b75d-4c44-896f-7b7f74fd1ed4,1,0,4fa11304-fbd4-4c90-909d-5024283a6868,4fa11304-fbd4-4c90-909d-5024283a6868,1,0,207290c2-5221-48ad-99aa-bb0f7955df3f,207290c2-5221-48ad-99aa-bb0f7955df3f,1,0,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,1,0,d91a016e-cca9-4976-9c53-2c96fa95cf1a,d91a016e-cca9-4976-9c53-2c96fa95cf1a,1,0,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,1,0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,1,0,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,1,0,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,1,0,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,1,0,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,1,0,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,1,0,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,1,0,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,1,0,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,1,0,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,1,0,69c207c2-7699-4467-b127-286ecd6d0f29,69c207c2-7699-4467-b127-286ecd6d0f29,1,0,e33df42d-4c64-4475-8294-6b05ecdb4e02,e33df42d-4c64-4475-8294-6b05ecdb4e02,1,0,6094a0ed-2051-4649-ad75-dfeb389d3cbb,6094a0ed-2051-4649-ad75-dfeb389d3cbb,1,0,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,1,0,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,1,0,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,1,0,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,1,0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,1,0,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,1,0,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,1,0,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,1,0,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,1,0,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,1,0,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,1,0,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,1,0,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1,0,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,1,0,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,1,0,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,1,0,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,1,0,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,1,0,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,1,0,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,1,0,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,1,0,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,1,0,e9a2320b-71a1-4974-8b5a-1990062ec7df,e9a2320b-71a1-4974-8b5a-1990062ec7df,1,0,2e459a7c-c448-4db4-ae21-e59646527030,2e459a7c-c448-4db4-ae21-e59646527030,1,0,891194d9-9f02-4b22-89cd-941181c83ecb,891194d9-9f02-4b22-89cd-941181c83ecb,1,0,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,1,0,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,1,0,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,1,0,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,1,0,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,1,0,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1,0,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,1,0,6c205eae-9113-46c1-a245-25d29173646e,6c205eae-9113-46c1-a245-25d29173646e,1,0,4cc4aa90-49fb-4602-9f9c-d4d47d223988,4cc4aa90-49fb-4602-9f9c-d4d47d223988,1,0,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,1,0,e0227e4b-be22-4614-8980-5d573fae705d,e0227e4b-be22-4614-8980-5d573fae705d,1,0,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,1,0,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,1,0,aa6444a8-6c17-4207-a623-9b734e08e30e,aa6444a8-6c17-4207-a623-9b734e08e30e,1,0,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,1,0,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,1,0,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,1,0,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,1,0,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,1,0,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,1,0,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,1,0,c224e520-7204-4f4a-aac9-b6221ea9ce44,c224e520-7204-4f4a-aac9-b6221ea9ce44,1,0,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,1,0,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,1,0,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,1,0,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,1,0,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,1,0,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,1,0,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,1,0,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,1,0,acd30e63-68dc-4ab2-a6fe-16eb69d09271,acd30e63-68dc-4ab2-a6fe-16eb69d09271,1,0,7b15bfe8-c4a9-4de8-8386-0d17268380d0,7b15bfe8-c4a9-4de8-8386-0d17268380d0,1,0,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,1,0,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,1,0,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,1,0,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,1,0,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,1,0,f4554046-493e-4960-94df-0a8b9d02f474,f4554046-493e-4960-94df-0a8b9d02f474,1,0,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,1,0,9222a6c0-b785-4811-bfb6-44ac44a55925,9222a6c0-b785-4811-bfb6-44ac44a55925,1,0,ea84021d-2431-44ad-a446-f1fb979c9e96,ea84021d-2431-44ad-a446-f1fb979c9e96,1,0,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,1,0,8fa21575-177f-4b7c-94b5-dfeefe737cb4,8fa21575-177f-4b7c-94b5-dfeefe737cb4,1,0,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,1,0,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,1,0,491a2337-1bf9-45c1-8ae6-95605ef41992,491a2337-1bf9-45c1-8ae6-95605ef41992,1,0,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,1,0,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,1,0,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,1,0,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,1,0,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,1,0,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,1,0,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,1,0,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,1,0,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,1,0,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,1,0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,1,0,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,1,0,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,1,0,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,1,0,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,1,0,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,1,0,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,1,0,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,1,0,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,1,0,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1,0,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,1,0,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,1,0,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,1,0,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,1,0,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,1,0,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,1,0,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,1,0,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,1,0,aef03c0b-2846-43b7-b382-9a51ec783e85,aef03c0b-2846-43b7-b382-9a51ec783e85,1,0,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,1,0,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1,0,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,1,0,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,1,0,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,1,0,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,1,0,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,1,0,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,1,0,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,1,0,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,1,0,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,1,0,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,1,0,1c2da2ac-e797-11e6-0489-a8667f21fde4,1c2da2ac-e797-11e6-0489-a8667f21fde4,1,0,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,1,0,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,1,0,df7892fe-e796-11e6-0489-a8667f21fde4,df7892fe-e796-11e6-0489-a8667f21fde4,1,0,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,1,0,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,1,0,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,1,0,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,1,0,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,1,0,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,1,0,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,1,0,fae8b26c-e796-11e6-0489-a8667f21fde4,fae8b26c-e796-11e6-0489-a8667f21fde4,1,0,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,1,0,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,1,0,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,1,0,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,1,0,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,1,0,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,1,0,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,1,0,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,1,0,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,1,0,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,1,0,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1,0,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,1,0,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,1,0,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,1,0,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,1,0,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,1,0,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,1,0,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,1,0,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,1,0,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,1,0,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,1,0,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,1,0,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,1,0,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,1,0,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,1,0,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,1,0,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,1,0,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,1,0,db03a88b-2804-45c2-9089-7ddb87ef2f18,db03a88b-2804-45c2-9089-7ddb87ef2f18,1,0,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,1,0,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,1,0,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,1,0,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,1,0,9ab0fe18-4dd7-4eed-958d-8537d4896d84,9ab0fe18-4dd7-4eed-958d-8537d4896d84,1,0,2278dc46-46ce-4d00-9289-4de1640782d7,2278dc46-46ce-4d00-9289-4de1640782d7,1,0,1f983a04-c2df-40bb-bee2-b326474d89f8,1f983a04-c2df-40bb-bee2-b326474d89f8,1,0,f03f1b68-e924-4c06-b0aa-8033a9a2f592,f03f1b68-e924-4c06-b0aa-8033a9a2f592,1,0,5e453d10-235d-4e53-86b1-20eed3247992,5e453d10-235d-4e53-86b1-20eed3247992,1,0,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0eefb856-0fb4-4c3e-bb08-e88b03a44065,1,0,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,1,0,738228ad-c30a-42f4-a6ad-bde0edba6266,738228ad-c30a-42f4-a6ad-bde0edba6266,1,0,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,1,0,df8e8344-d7bc-4cf2-b498-88d3abb66c09,df8e8344-d7bc-4cf2-b498-88d3abb66c09,1,0,e6d13536-3021-45b2-a8e1-bdb0e0be850c,e6d13536-3021-45b2-a8e1-bdb0e0be850c,1,0,b49f538c-b2b2-4a1f-a6b4-a911033b1666,b49f538c-b2b2-4a1f-a6b4-a911033b1666,1,0,794e952b-6b03-4a1e-ad3f-453376bccf45,794e952b-6b03-4a1e-ad3f-453376bccf45,1,0,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,1,0,5cd997ba-f123-47b3-8cde-fbba45a4a11c,5cd997ba-f123-47b3-8cde-fbba45a4a11c,1,0,0d746247-c4f4-47a5-a373-45ec4023d3ef,0d746247-c4f4-47a5-a373-45ec4023d3ef,1,0,a25bcf4e-1a47-472b-9f93-f6ab45abf461,a25bcf4e-1a47-472b-9f93-f6ab45abf461,1,0,958b7dab-0aba-423f-ab81-b70f2b93a027,958b7dab-0aba-423f-ab81-b70f2b93a027,1,0,a17ec3be-2255-42af-a6ee-d3fb8bb00519,a17ec3be-2255-42af-a6ee-d3fb8bb00519,1,0,add0b22d-ff5a-41f7-88a1-ef34880e50c9,add0b22d-ff5a-41f7-88a1-ef34880e50c9,1,0,f660bf92-7de1-4a22-9cea-777069e4679d,f660bf92-7de1-4a22-9cea-777069e4679d,1,0,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,1,0,20feb794-eb05-46a6-90e7-ca4e2376d7b2,20feb794-eb05-46a6-90e7-ca4e2376d7b2,1,0,c73da415-6fc3-449a-a784-b25aed54eccd,c73da415-6fc3-449a-a784-b25aed54eccd,1,0,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,1,0,2f484aa4-452a-46af-a707-a5a6917bc0db,2f484aa4-452a-46af-a707-a5a6917bc0db,1,0,fd6ff934-6f11-4182-b0cb-6926902d33c0,fd6ff934-6f11-4182-b0cb-6926902d33c0,1,0,315af891-2075-4833-a404-6c0f2004ee53,315af891-2075-4833-a404-6c0f2004ee53,1,0,5725db77-bfbf-4d85-9565-163b309a53ee,5725db77-bfbf-4d85-9565-163b309a53ee,1,0,99a7142c-b3c7-4221-abf8-6831a3cbc16e,99a7142c-b3c7-4221-abf8-6831a3cbc16e,1,0,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,1,0,2e09abe1-0934-42ae-970f-5e001c35c31a,2e09abe1-0934-42ae-970f-5e001c35c31a,1,0,587d48a3-5627-4481-b13e-c22740b57d8a,587d48a3-5627-4481-b13e-c22740b57d8a,1,0,1f3e3089-1e04-4147-8ece-aa96a76467dd,1f3e3089-1e04-4147-8ece-aa96a76467dd,1,0,22a213b5-ed72-4181-8ff8-89f860c87aa1,22a213b5-ed72-4181-8ff8-89f860c87aa1,1,0,4c56cbff-653e-4f16-b702-c77190d7eb7f,4c56cbff-653e-4f16-b702-c77190d7eb7f,1,0,172ff335-c7ae-4905-b705-2a1475b95713,172ff335-c7ae-4905-b705-2a1475b95713,1,0,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,1,0,cf896f41-7cea-4083-a9f8-96ad881ce641,cf896f41-7cea-4083-a9f8-96ad881ce641,1,0,1d852dc0-90c9-4568-84f9-b1d822573b6b,1d852dc0-90c9-4568-84f9-b1d822573b6b,1,0,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,1,0,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,1,0,37c8f5e1-3513-47f8-896d-a54d11b83dcd,37c8f5e1-3513-47f8-896d-a54d11b83dcd,1,0,9e07733c-39f0-491b-91e1-bf2782d957dd,9e07733c-39f0-491b-91e1-bf2782d957dd,1,0,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,1,0,5902d979-1235-4d5a-ace7-93261bdeb725,5902d979-1235-4d5a-ace7-93261bdeb725,1,0,5a090286-7969-44c9-815b-fc58aeb5d8d3,5a090286-7969-44c9-815b-fc58aeb5d8d3,1,0,73380bb1-bee3-4b73-a3df-1dbea99011d2,73380bb1-bee3-4b73-a3df-1dbea99011d2,1,0,8be29533-38de-413d-b420-7dac2e80af6c,8be29533-38de-413d-b420-7dac2e80af6c,1,0,82a77018-8e38-41dd-9d1f-3130bc29a707,82a77018-8e38-41dd-9d1f-3130bc29a707,1,0,4d75aaef-532e-4ed3-8153-083f04f05cc1,4d75aaef-532e-4ed3-8153-083f04f05cc1,1,0,3854a0ba-e156-4ba3-a301-b1a41ac386c4,3854a0ba-e156-4ba3-a301-b1a41ac386c4,1,0,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,1,0,c2321963-cd86-45ec-b323-3fdb5932da3a,c2321963-cd86-45ec-b323-3fdb5932da3a,1,0,d5af38bf-6261-4177-8f74-998a85f0ef39,d5af38bf-6261-4177-8f74-998a85f0ef39,1,0,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,1,0,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,1,0,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,1,0,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,1,0,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,1,0,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,1,0,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,1,0,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,1,0,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,1,0,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,1,0,d61ca454-505b-4fd6-be15-d7ed948a5ff6,d61ca454-505b-4fd6-be15-d7ed948a5ff6,1,0,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,1,0,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,1,0,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,1,0,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,1,0,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,1,0,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,1,0,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,1,0,4a87fafc-7ca7-478e-bb31-358c2b85fa92,4a87fafc-7ca7-478e-bb31-358c2b85fa92,1,0,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,1,0,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,1,0,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,1,0,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,1,0,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,1,0,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,1,0,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,1,0,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,1,0,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,1,0,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,1,0,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,1,0,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,1,0,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,1,0,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,1,0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,1,0,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,1,0,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,1,0,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,1,0,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,1,0,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,1,0,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,1,0,61892a62-9381-401d-af31-9073ef2509fb,61892a62-9381-401d-af31-9073ef2509fb,1,0,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,1,0,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,1,0,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,1,0,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,1,0,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,1,0,a469f018-da26-485f-87c3-f580321a34f0,a469f018-da26-485f-87c3-f580321a34f0,1,0,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,1,0,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,1,0,628de771-c19c-4474-989f-8fb6cd7756a2,628de771-c19c-4474-989f-8fb6cd7756a2,1,0,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,1,0,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,1,0,6789e57b-1293-442c-97d0-b8007367602e,6789e57b-1293-442c-97d0-b8007367602e,1,0,0f193c89-b664-448e-bed3-2147430367f7,0f193c89-b664-448e-bed3-2147430367f7,1,0,4c9b2506-75a8-47d3-a5d5-d946088ba14a,4c9b2506-75a8-47d3-a5d5-d946088ba14a,1,0,36eacaa1-2efd-49c0-82de-2f8972535bf2,36eacaa1-2efd-49c0-82de-2f8972535bf2,1,0,c35a643d-fe3a-4293-93c0-074fa68a31e3,c35a643d-fe3a-4293-93c0-074fa68a31e3,1,0,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,1,0,72ee9a03-a320-4e60-be04-0ee813ea567f,72ee9a03-a320-4e60-be04-0ee813ea567f,1,0,f6f52cc8-23a3-4402-b1eb-0e41584c802a,f6f52cc8-23a3-4402-b1eb-0e41584c802a,1,0,8398e065-8b4b-4901-b057-2a048776bafe,8398e065-8b4b-4901-b057-2a048776bafe,1,0,073c56ca-bf45-422d-957a-f9c57aeee4d0,073c56ca-bf45-422d-957a-f9c57aeee4d0,1,0,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,1,0,68598d98-0c59-4cda-b0b2-6901d3aff88b,68598d98-0c59-4cda-b0b2-6901d3aff88b,1,0,219c1375-f26e-4698-aa82-4b9d735df783,219c1375-f26e-4698-aa82-4b9d735df783,1,0,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,1,0,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,1,0,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,1,0,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1,0,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,1,0,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,1,0,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,1,0,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,1,0,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,1,0,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,1,0,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,1,0,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,1,0,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,1,0,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,1,0,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,1,0,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,1,0,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,1,0,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,1,0,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,1,0,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,1,0,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,1,0,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,1,0,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,1,0,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,1,0,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,1,0,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,1,0,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,1,0,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1,0,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,1,0,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,1,0,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,1,0,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,1,0,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,1,0,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,1,0,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,1,0,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,1,0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,1,0,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,1,0,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,1,0,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,1,0,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,1,0,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,1,0,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,1,0,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,1,0,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,1,0,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1,0,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,1,0,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,1,0,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,1,0,04b5ae71-7fa4-4a64-b406-59dc603b80c5,04b5ae71-7fa4-4a64-b406-59dc603b80c5,1,0,f23a2023-f776-40db-8689-1fc3f7ebc482,f23a2023-f776-40db-8689-1fc3f7ebc482,1,0,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1,0,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,1,0,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,1,0,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,1,0,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,1,0,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,1,0,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,1,0,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,1,0,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,1,0,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,1,0,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,1,0,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,1,0,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,1,0,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,1,0,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,1,0,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,1,0,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,1,0,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,1,0,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,1,0,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,1,0,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,1,0,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,1,0,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,1,0,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,1,0,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,1,0,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,1,0,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,1,0,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,1,0,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,1,0,e62e60ea-9f0c-4a7e-869f-4639f31f826c,e62e60ea-9f0c-4a7e-869f-4639f31f826c,1,0,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,1,0,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,1,0,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,1,0,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,1,0,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,1,0,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,1,0,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,1,0,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,1,0,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,1,0,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,1,0,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,1,0,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,1,0,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,1,0,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,1,0,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,1,0,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,1,0,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,1,0,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,1,0,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,1,0,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,1,0,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,1,0,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,1,0,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,1,0,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,1,0,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,1,0,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,1,0,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,1,0,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,1,0,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,1,0,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,1,0,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,1,0,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,1,0,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,1,0,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,1,0,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,1,0,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,1,0,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,1,0,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,1,0,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,1,0,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,1,0,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,1,0,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,1,0,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,1,0,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,1,0,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,1,0,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,1,0,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,1,0,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,1,0,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,1,0,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,1,0,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,1,0,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,1,0,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,1,0,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,1,0,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,1,0,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,1,0,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,1,0,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,1,0,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,1,0,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,1,0,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,1,0,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,1,0,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,1,0,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,1,0,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,1,0,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,1,0,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,1,0,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,1,0,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,1,0,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,1,0,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,1,0,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,1,0,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,1,0,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,1,0,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,1,0,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,1,0,f692ab21-a8de-4feb-914f-4beef350543a,f692ab21-a8de-4feb-914f-4beef350543a,1,0,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,1,0,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,1,0,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,1,0,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,1,0,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,1,0,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,1,0,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,1,0,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,1,0,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,1,0,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,1,0,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,1,0,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,1,0,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,1,0,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,1,0,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,1,0,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,1,0,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,1,0,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,1,0,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,1,0,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,1,0,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,1,0,e9f393e5-04d3-4330-afb0-aa73caf0c5cd,e9f393e5-04d3-4330-afb0-aa73caf0c5cd,1,0,036868c2-e2c4-426b-8402-0d77b4224828,036868c2-e2c4-426b-8402-0d77b4224828,1,0,1bf18e24-8157-4aa4-b790-21c6535f5233,1bf18e24-8157-4aa4-b790-21c6535f5233,1,0,18470536-57df-48f0-9a85-68e4006558eb,18470536-57df-48f0-9a85-68e4006558eb,1,0,893e2f4c-b056-42ae-89fb-ecd90a53bb4c,893e2f4c-b056-42ae-89fb-ecd90a53bb4c,1,0,5eaaa3fd-3a87-4eaa-93a9-49337b19eddd,5eaaa3fd-3a87-4eaa-93a9-49337b19eddd,1,0,77ee9f6c-0be9-450f-978c-297626d6275b,77ee9f6c-0be9-450f-978c-297626d6275b,1,0,a63e6145-0d4b-4da2-9864-485a61e621df,a63e6145-0d4b-4da2-9864-485a61e621df,1,0,f29738d5-ad22-47bf-9053-497763674486,f29738d5-ad22-47bf-9053-497763674486,1,0,9c23d3bd-7a98-4d71-b9b0-78cda4ffb3ce,9c23d3bd-7a98-4d71-b9b0-78cda4ffb3ce,1,0,9aca958a-a938-4421-9e37-6606e02f7b77,9aca958a-a938-4421-9e37-6606e02f7b77,1,0,44109976-b763-4807-a013-9d04c3675bf3,44109976-b763-4807-a013-9d04c3675bf3,1,0,46127175-144d-438e-8fbe-c55ae0233620,46127175-144d-438e-8fbe-c55ae0233620,1,0,20754057-6397-4478-a484-74b8c2f243ee,20754057-6397-4478-a484-74b8c2f243ee,1,0,b8a06e8b-4581-4088-a5b4-a5d3330eab22,b8a06e8b-4581-4088-a5b4-a5d3330eab22,1,0,ea838b79-af81-4767-a8b1-fce68baa866a,ea838b79-af81-4767-a8b1-fce68baa866a,1,0,5e1056d0-6778-4030-8806-3dc90ffed318,5e1056d0-6778-4030-8806-3dc90ffed318,1,0,068e6f32-a2b6-4ade-9b9e-db3eac8b09c1,068e6f32-a2b6-4ade-9b9e-db3eac8b09c1,1,0,3701531a-b408-455f-a49d-652d3fcab4ef,3701531a-b408-455f-a49d-652d3fcab4ef,1,0,63e229aa-2638-45f1-9c5e-f821d9397ac3,63e229aa-2638-45f1-9c5e-f821d9397ac3,1,0,9e425f71-ef7d-4936-9f1b-7dceca99ca95,9e425f71-ef7d-4936-9f1b-7dceca99ca95,1,0,968ecea6-7d21-4e85-9d25-e8c6fe1b76cc,968ecea6-7d21-4e85-9d25-e8c6fe1b76cc,1,0,c6777ffe-1fb2-4807-8624-43f47a4e3947,c6777ffe-1fb2-4807-8624-43f47a4e3947,1,0,91c8e02d-ec9c-41d6-a2b1-ec1e906c055a,91c8e02d-ec9c-41d6-a2b1-ec1e906c055a,1,0,be42c5c6-b604-4180-a3d7-24b2348c8d5e,be42c5c6-b604-4180-a3d7-24b2348c8d5e,1,0,6223c072-bff3-4ea8-96a1-ac2a5bbe9f99,6223c072-bff3-4ea8-96a1-ac2a5bbe9f99,1,0,6fd083fe-a132-4f63-b38f-4891004aca8a,6fd083fe-a132-4f63-b38f-4891004aca8a,1,0,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,1,0,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,1,0,ab057ce4-ac51-4465-8aad-eadc9088c62d,ab057ce4-ac51-4465-8aad-eadc9088c62d,1,0,8842c0e3-2e20-4f37-ae7c-f5449004994b,8842c0e3-2e20-4f37-ae7c-f5449004994b,1,0,5b2cc44b-69cb-495c-a26b-003a495df40b,5b2cc44b-69cb-495c-a26b-003a495df40b,1,0,30250d93-10ff-45c9-920b-5fed3f9d8093,30250d93-10ff-45c9-920b-5fed3f9d8093,1,0,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,1,0,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,1,0,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,1,0,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,1,0,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,1,0,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,1,0,23f93492-59f5-491b-8708-45096934c7e6,23f93492-59f5-491b-8708-45096934c7e6,1,0,30f5471a-17fb-4184-9798-4f8e3ef0cccb,30f5471a-17fb-4184-9798-4f8e3ef0cccb,1,0,27abda4c-a43c-49b4-90cd-db780afe0c45,27abda4c-a43c-49b4-90cd-db780afe0c45,1,0,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,1,0,1a28db16-d410-4101-bf31-21cefa880dae,1a28db16-d410-4101-bf31-21cefa880dae,1,0,2b85bcf6-85b0-4efb-bada-b65414a8d264,2b85bcf6-85b0-4efb-bada-b65414a8d264,1,0,cf027de4-59c9-4b8f-9695-b1d4d16548fe,cf027de4-59c9-4b8f-9695-b1d4d16548fe,1,0,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,1,0,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,1,0,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,1,0,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,1,0,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,1,0,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,1,0,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,1,0,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,1,0,88cefe4a-a6c5-4753-935e-f956d9de9f77,88cefe4a-a6c5-4753-935e-f956d9de9f77,1,0,882e78b7-90bd-4b95-8852-146bdb51ec15,882e78b7-90bd-4b95-8852-146bdb51ec15,1,0,ae4435c3-62c0-4f08-b526-7f9571eed8ae,ae4435c3-62c0-4f08-b526-7f9571eed8ae,1,0,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,1,0,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,1,0,c7b46558-d688-4c42-ae52-f98de7923176,c7b46558-d688-4c42-ae52-f98de7923176,1,0,31fdbb46-1df1-4b74-a54e-b922260dcca6,31fdbb46-1df1-4b74-a54e-b922260dcca6,1,0,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,1,0,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,1,0,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,1,0,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,1,0,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,1,0,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,1,0,8317ac49-890d-4921-8c0d-1bfc676f0b40,8317ac49-890d-4921-8c0d-1bfc676f0b40,1,0,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,1,0,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,1,0,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,1,0,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,1,0,0c732569-a50f-4be3-a214-0843c6a3da47,0c732569-a50f-4be3-a214-0843c6a3da47,1,0,f55d74bf-5824-4228-9683-31f7c7fdf74d,f55d74bf-5824-4228-9683-31f7c7fdf74d,1,0,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,1,0,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,1,0,c30c6860-befb-497e-b432-3dba0f86c540,c30c6860-befb-497e-b432-3dba0f86c540,1,0,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,1,0,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,1,0,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,1,0,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,1,0,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,1,0,b53c545c-3b1c-4315-a213-4f2b2c7128aa,b53c545c-3b1c-4315-a213-4f2b2c7128aa,1,0,02a84df9-2171-43e6-8135-a74edd384826,02a84df9-2171-43e6-8135-a74edd384826,1,0,ff36356d-cb1d-4316-896a-c6ae83b92437,ff36356d-cb1d-4316-896a-c6ae83b92437,1,0,465cce6a-7064-4b0a-932c-40f842042f33,465cce6a-7064-4b0a-932c-40f842042f33,1,0,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,1,0,e67dff00-92e2-4f58-a950-d5bbca9291c5,e67dff00-92e2-4f58-a950-d5bbca9291c5,1,0,e1964724-804a-4ecc-be9e-5b84e58f2b84,e1964724-804a-4ecc-be9e-5b84e58f2b84,1,0,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,1,0,bf3cb513-2856-472b-8713-7bf8ba70cdce,bf3cb513-2856-472b-8713-7bf8ba70cdce,1,0,de4815c8-0853-47e0-862b-b60119c674f6,de4815c8-0853-47e0-862b-b60119c674f6,1,0,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,1,0,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,1,0,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,1,0,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,1,0,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,1,0,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,1,0,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,1,0,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,1,0,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,1,0,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,1,0,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,1,0,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,1,0,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,1,0,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,1,0,436b558e-6547-4ba6-8cee-954fe36743ea,436b558e-6547-4ba6-8cee-954fe36743ea,1,0,6120bb6e-b177-48bf-b467-02bab0d4cc0d,6120bb6e-b177-48bf-b467-02bab0d4cc0d,1,0,a5af4715-6c4f-484b-9599-5b1b9147713f,a5af4715-6c4f-484b-9599-5b1b9147713f,1,0,307b6e66-6fef-4777-b20a-37898928932f,307b6e66-6fef-4777-b20a-37898928932f,1,0,a69494c0-dcce-4359-aa82-c1cfae8a43eb,a69494c0-dcce-4359-aa82-c1cfae8a43eb,1,0,2b243d49-5500-403a-b177-ac1c70bb889d,2b243d49-5500-403a-b177-ac1c70bb889d,1,0,51c040c6-e7a4-4e0e-b479-039636fdb6ec,51c040c6-e7a4-4e0e-b479-039636fdb6ec,1,0,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,1,0,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,1,0,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,1,0,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,1,0,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,1,0,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,1,0,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,1,0,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,1,0,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,1,0,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,1,0,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,1,0,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,1,0,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,1,0,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,1,0,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,1,0,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,1,0,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,1,0,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,1,0,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,1,0,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,1,0,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,1,0,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,1,0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,1,0,d2160866-78ca-424a-92b9-d389fb341ee0,d2160866-78ca-424a-92b9-d389fb341ee0,1,0,73b36823-72a4-4286-8ee2-02b2f086d5ea,73b36823-72a4-4286-8ee2-02b2f086d5ea,1,0,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,1,0,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,1,0,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,1,0,c013a650-bd4b-4e14-97cc-05df17dbb0d5,c013a650-bd4b-4e14-97cc-05df17dbb0d5,1,0,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,1,0,b09fc04b-94d8-4dea-bf6c-24370f231274,b09fc04b-94d8-4dea-bf6c-24370f231274,1,0,e669a5cd-daf3-4a88-a2c0-380db496a4dd,e669a5cd-daf3-4a88-a2c0-380db496a4dd,1,0,177710c8-2441-4436-a096-64c27aa7aec5,177710c8-2441-4436-a096-64c27aa7aec5,1,0,ab143db8-185b-4093-a3b1-c65322cb8fd6,ab143db8-185b-4093-a3b1-c65322cb8fd6,1,0,e3ce5882-541e-4620-9c24-f00deacc33c2,e3ce5882-541e-4620-9c24-f00deacc33c2,1,0,c9694243-390e-4217-8996-b33924c4fe60,c9694243-390e-4217-8996-b33924c4fe60,1,0,8e08ea9b-8c63-475a-9335-c8edc6214555,8e08ea9b-8c63-475a-9335-c8edc6214555,1,0,19bd6152-7e9c-4710-80c3-c6aa399fe4e9,19bd6152-7e9c-4710-80c3-c6aa399fe4e9,1,0,72846fcc-a9ab-4393-9133-38c1805abab1,72846fcc-a9ab-4393-9133-38c1805abab1,1,0,91a81670-9124-4b65-aecd-77f252249030,91a81670-9124-4b65-aecd-77f252249030,1,0,ed2e5344-9261-4473-86a5-f914b8458cfc,ed2e5344-9261-4473-86a5-f914b8458cfc,1,0,4ff32c59-4ca5-4e60-b54c-f46f757758e2,4ff32c59-4ca5-4e60-b54c-f46f757758e2,1,0,acbc674d-d053-43f4-9d62-86fbbb962ee2,acbc674d-d053-43f4-9d62-86fbbb962ee2,1,0,e0608801-124b-4c52-9a17-9072eb5b676c,e0608801-124b-4c52-9a17-9072eb5b676c,1,0,64e3295e-89c6-4b09-8dc4-b552da47db84,64e3295e-89c6-4b09-8dc4-b552da47db84,1,0,2c1846a5-09f2-414b-b95c-67ed7432ce0e,2c1846a5-09f2-414b-b95c-67ed7432ce0e,1,0,ce339ae7-a794-425b-8d5f-b04fd4b21364,ce339ae7-a794-425b-8d5f-b04fd4b21364,1,0,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,1,0,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,1,0,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,1,0,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,1,0,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,1,0,951927d4-7bfc-4edb-b97f-dcc29a937400,951927d4-7bfc-4edb-b97f-dcc29a937400,1,0,71309e88-d514-40f3-a329-b2a420e75504,71309e88-d514-40f3-a329-b2a420e75504,1,0,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,1,0,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,1,0,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,1,0,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,1,0,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,1,0,fddfb2fd-4d58-4bc6-b196-720425a8c029,fddfb2fd-4d58-4bc6-b196-720425a8c029,1,0,ce075cf1-1778-4671-aa40-166e6c41adc8,ce075cf1-1778-4671-aa40-166e6c41adc8,1,0,eddb111f-7622-44a3-b7d8-97faec67b23c,eddb111f-7622-44a3-b7d8-97faec67b23c,1,0,84872892-842e-4d7d-a3cd-576c42343a7a,84872892-842e-4d7d-a3cd-576c42343a7a,1,0,78ad6047-473d-494b-a2ba-81e062b567e6,78ad6047-473d-494b-a2ba-81e062b567e6,1,0,911f8810-e96e-4f02-9377-47e49919f87e,911f8810-e96e-4f02-9377-47e49919f87e,1,0,cde46d6d-9f8a-45b6-98a7-9411030ccd72,cde46d6d-9f8a-45b6-98a7-9411030ccd72,1,0,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,1,0,224b9439-4b30-4b64-8edf-e7718ee90a7d,224b9439-4b30-4b64-8edf-e7718ee90a7d,1,0,74dc2374-daf1-4a8a-ba10-d3aced96af3b,74dc2374-daf1-4a8a-ba10-d3aced96af3b,1,0,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,1,0,e28e953f-93b3-4d4d-9ee4-c56df26037eb,e28e953f-93b3-4d4d-9ee4-c56df26037eb,1,0,578e0fd2-997c-437a-befc-33d128097a7e,578e0fd2-997c-437a-befc-33d128097a7e,1,0,14089231-31a8-4471-b85b-064836794ff3,14089231-31a8-4471-b85b-064836794ff3,1,0,014de276-fb2f-4deb-873f-475729be0f66,014de276-fb2f-4deb-873f-475729be0f66,1,0,40a60ff7-96ca-485b-a2d9-640a208a7de6,40a60ff7-96ca-485b-a2d9-640a208a7de6,1,0,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,1,0,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,1,0,b9ef62f6-9b1d-4d13-8016-73ed531d195a,b9ef62f6-9b1d-4d13-8016-73ed531d195a,1,0,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,1,0,229fe764-87f5-4d19-b042-c31fef5cddd6,229fe764-87f5-4d19-b042-c31fef5cddd6,1,0,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,1,0,e932800c-fd81-417d-a601-c774b888d66a,e932800c-fd81-417d-a601-c774b888d66a,1,0,a2335b6f-1dbb-4722-979b-8bed83aa8c94,a2335b6f-1dbb-4722-979b-8bed83aa8c94,1,0,211cf921-d880-4f74-b8ee-5312dea28613,211cf921-d880-4f74-b8ee-5312dea28613,1,0,2fd3a396-b8ae-409e-9373-02a039393a80,2fd3a396-b8ae-409e-9373-02a039393a80,1,0,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,1,0,346ef414-b20b-4095-86fe-18ca21c9887f,346ef414-b20b-4095-86fe-18ca21c9887f,1,0,c01ab97b-4964-4f7d-b749-56c0b94feb93,c01ab97b-4964-4f7d-b749-56c0b94feb93,1,0,0cc63813-cf16-4a99-b3bd-18a773091230,0cc63813-cf16-4a99-b3bd-18a773091230,1,0,4fc00971-c980-468a-9690-5cd520d12eb0,4fc00971-c980-468a-9690-5cd520d12eb0,1,0,85972c27-4f39-4982-9307-7877e87ef87b,85972c27-4f39-4982-9307-7877e87ef87b,1,0,96afdffb-7595-4c49-9e86-8296f50bd2f5,96afdffb-7595-4c49-9e86-8296f50bd2f5,1,0,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,1,0,e125d3e0-950f-42ee-8904-bd26091afa55,e125d3e0-950f-42ee-8904-bd26091afa55,1,0,2b4797a5-074a-4a01-b99f-1c5590cfde40,2b4797a5-074a-4a01-b99f-1c5590cfde40,1,0,718e53d2-24ec-40fb-9def-825441ada46c,718e53d2-24ec-40fb-9def-825441ada46c,1,0,4c0a7fd6-8f09-41d6-949f-65ce708c1256,4c0a7fd6-8f09-41d6-949f-65ce708c1256,1,0,792abc06-b52a-4691-ba92-96ed73ca702a,792abc06-b52a-4691-ba92-96ed73ca702a,1,0,148dbe44-86d1-4362-b9db-8ff68cd2b34d,148dbe44-86d1-4362-b9db-8ff68cd2b34d,1,0,1fbc893e-3000-4fac-88f5-c82251835d65,1fbc893e-3000-4fac-88f5-c82251835d65,1,0,05852816-63ec-4179-abca-66372bbfb04c,05852816-63ec-4179-abca-66372bbfb04c,1,0,0165f721-b011-4524-bfd5-81e35092f2be,0165f721-b011-4524-bfd5-81e35092f2be,1,0,e74925d4-1979-4600-8560-0932d26450ad,e74925d4-1979-4600-8560-0932d26450ad,1,0,aa108131-151d-4356-8a24-345e4ec74281,aa108131-151d-4356-8a24-345e4ec74281,1,0,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,1,0,e3251f1a-3c80-4c86-9960-270920bd512f,e3251f1a-3c80-4c86-9960-270920bd512f,1,0,3c3d5474-977b-4df9-88de-042e997bd10d,3c3d5474-977b-4df9-88de-042e997bd10d,1,0,4b88d172-5a44-4011-bb38-e94bf7a9c879,4b88d172-5a44-4011-bb38-e94bf7a9c879,1,0,3bced2d4-e3d7-4489-a26d-f84620b096f4,3bced2d4-e3d7-4489-a26d-f84620b096f4,1,0,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,1,0,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,1,0,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,1,0,18436045-1008-4114-8032-274fea0f4627,18436045-1008-4114-8032-274fea0f4627,1,0,cad93727-cffb-44a6-aaee-be73a078e802,cad93727-cffb-44a6-aaee-be73a078e802,1,0,c034f410-ff8e-45d7-925f-94448f88a7af,c034f410-ff8e-45d7-925f-94448f88a7af,1,0,0027727b-3917-4010-9953-1649266e8ed7,0027727b-3917-4010-9953-1649266e8ed7,1,0,b088786a-046f-458c-8e7a-5bebf8df8b34,b088786a-046f-458c-8e7a-5bebf8df8b34,1,0,6d015113-1e32-4f5e-aacd-8134d7307125,6d015113-1e32-4f5e-aacd-8134d7307125,1,0,58230238-d2f2-422e-90cb-de355996eb19,58230238-d2f2-422e-90cb-de355996eb19,1,0,3d907678-628d-4fb2-85c2-149839024c08,3d907678-628d-4fb2-85c2-149839024c08,1,0,71384d10-6acf-4139-b766-cb8b5796f1a7,71384d10-6acf-4139-b766-cb8b5796f1a7,1,0,a8f149d7-e9bc-4695-b4f4-88434e31aafb,a8f149d7-e9bc-4695-b4f4-88434e31aafb,1,0,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,1,0,11ba510f-cb57-43d0-9897-c49e10b67ccd,11ba510f-cb57-43d0-9897-c49e10b67ccd,1,0,9d92af67-c88d-4429-9e85-0b5bf04c4b79,9d92af67-c88d-4429-9e85-0b5bf04c4b79,1,0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,1,0,43523bbb-c923-4a20-bcb5-50d30cc826ee,43523bbb-c923-4a20-bcb5-50d30cc826ee,1,0,c89d9aad-3364-45df-88b5-b23ae76edbba,c89d9aad-3364-45df-88b5-b23ae76edbba,1,0,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,1,0,7e4b9dce-e332-4d35-8b5f-d3f88918989d,7e4b9dce-e332-4d35-8b5f-d3f88918989d,1,0,96fe619a-b819-4f96-9788-e1f4ef57833a,96fe619a-b819-4f96-9788-e1f4ef57833a,1,0,94dff2da-f721-411a-9fc0-5d013b685dcc,94dff2da-f721-411a-9fc0-5d013b685dcc,1,0,9343fc5f-7b08-4be5-8cd5-dbed635b819d,9343fc5f-7b08-4be5-8cd5-dbed635b819d,1,0,99e87e66-1b07-451b-a476-f5213cbd7150,99e87e66-1b07-451b-a476-f5213cbd7150,1,0,c3317f75-f6ad-41f6-97f1-77074c3ff62a,c3317f75-f6ad-41f6-97f1-77074c3ff62a,1,0,8800dec9-84f8-4643-8742-1d76fe575f58,8800dec9-84f8-4643-8742-1d76fe575f58,1,0,62903794-3b41-4d21-b800-1c26dbeda3ce,62903794-3b41-4d21-b800-1c26dbeda3ce,1,0,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,1,0,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,1,0,93de88de-0069-4aa8-96b2-d5709e4def2f,93de88de-0069-4aa8-96b2-d5709e4def2f,1,0,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,1,0,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,1,0,3a8d9010-8785-4d8d-b908-b821d7d681c9,3a8d9010-8785-4d8d-b908-b821d7d681c9,1,0,2568a935-ea49-4b99-aa9c-de27de6a0e81,2568a935-ea49-4b99-aa9c-de27de6a0e81,1,0,de2bdd4f-93f2-4341-86d6-7082fc286a5c,de2bdd4f-93f2-4341-86d6-7082fc286a5c,1,0,ba96ec0e-931e-45be-a782-e68ba4fedddb,ba96ec0e-931e-45be-a782-e68ba4fedddb,1,0,9af5882f-3a42-4fae-83df-6aa8de577112,9af5882f-3a42-4fae-83df-6aa8de577112,1,0,79bc5e39-3017-48bf-8e42-fa34e8b581ef,79bc5e39-3017-48bf-8e42-fa34e8b581ef,1,0,fe6e207f-d306-4470-8441-ffd3f3710d31,fe6e207f-d306-4470-8441-ffd3f3710d31,1,0,7451af80-7387-4e8d-a3da-2ae0540c3fd4,7451af80-7387-4e8d-a3da-2ae0540c3fd4,1,0,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1,0,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,1,0,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,1,0,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,1,0,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,1,0,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,1,0,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,1,0,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,1,0,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,1,0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,1,0,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,1,0,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,1,0,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,1,0,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1,0,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,1,0,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,1,0,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,1,0,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,1,0,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,1,0,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,1,0,b67b872e-236a-4ea7-9838-0827234867b4,b67b872e-236a-4ea7-9838-0827234867b4,1,0,1e5ced23-48a7-4f3c-aa3b-78399a2b9e2b,1e5ced23-48a7-4f3c-aa3b-78399a2b9e2b,1,0,ce422d4f-1221-4ebf-a801-975a3220a226,ce422d4f-1221-4ebf-a801-975a3220a226,1,0,8735949b-f259-48b9-97e9-a81dfc7dcc8d,8735949b-f259-48b9-97e9-a81dfc7dcc8d,1,0,b8810612-dc7a-4a45-a83c-163a8669b578,b8810612-dc7a-4a45-a83c-163a8669b578,1,0,00e4dc17-b984-4f45-8b42-2e6a7a5dbced,00e4dc17-b984-4f45-8b42-2e6a7a5dbced,1,0,349c3dc3-0729-41f3-983f-3b13170c6509,349c3dc3-0729-41f3-983f-3b13170c6509,1,0,8281df26-4bde-47ba-926e-f22a8042bf1f,8281df26-4bde-47ba-926e-f22a8042bf1f,1,0,7278fb66-1d48-4c1d-bd15-425f78ad0c32,7278fb66-1d48-4c1d-bd15-425f78ad0c32,1,0,6893007f-8354-4b3b-b205-7c7d385cbde0,6893007f-8354-4b3b-b205-7c7d385cbde0,1,0,d74365a3-b434-41d0-84a7-543c336b5880,d74365a3-b434-41d0-84a7-543c336b5880,1,0,3d42502a-5705-49d7-b4ed-29edbd6306bc,3d42502a-5705-49d7-b4ed-29edbd6306bc,1,0,221e24e6-b31c-45b6-8835-2ad08d595c5f,221e24e6-b31c-45b6-8835-2ad08d595c5f,1,0,fd0fa6c9-1f42-4907-a266-fe7b6847e58a,fd0fa6c9-1f42-4907-a266-fe7b6847e58a,1,0,2e8cbcd7-f5b5-471e-863a-e09b4bc8e163,2e8cbcd7-f5b5-471e-863a-e09b4bc8e163,1,0,55956063-b227-4c74-8d9c-4a62b4f0dbc7,55956063-b227-4c74-8d9c-4a62b4f0dbc7,1,0,b6871b83-7269-43a9-b9a6-a195ff93365d,b6871b83-7269-43a9-b9a6-a195ff93365d,1,0,7dcd627c-16f6-41f9-b474-590ad1c7d2ed,7dcd627c-16f6-41f9-b474-590ad1c7d2ed,1,0,0cf89f30-e702-4c9e-8af4-888634463b99,0cf89f30-e702-4c9e-8af4-888634463b99,1,0,77f890ac-3c9c-4043-a5b7-12158772bcf5,77f890ac-3c9c-4043-a5b7-12158772bcf5,1,0,2bc734f9-8c0d-473a-b1c3-340395069501,2bc734f9-8c0d-473a-b1c3-340395069501,1,0,316c3933-21dd-4e8a-9450-0900e85ef7e2,316c3933-21dd-4e8a-9450-0900e85ef7e2,1,0,994fe78b-9f61-4aaf-9355-fafcae6b816d,994fe78b-9f61-4aaf-9355-fafcae6b816d,1,0,8448f07b-751b-4670-b44c-3564e81e5cdc,8448f07b-751b-4670-b44c-3564e81e5cdc,1,0,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,1,0,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,1,0,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,1,0,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,1,0,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,1,0,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,1,0,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,1,0,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,1,0,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,1,0,ee0412d3-58e7-4715-8774-d49778e1ef73,ee0412d3-58e7-4715-8774-d49778e1ef73,1,0,ea31df21-1402-417a-9788-b17a7116e842,ea31df21-1402-417a-9788-b17a7116e842,1,0,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,1,0,e964753f-7f4c-4f9f-bd17-cdac317c1d35,e964753f-7f4c-4f9f-bd17-cdac317c1d35,1,0,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,1,0,43c22498-3fd6-4038-a291-05f0db9ab66a,43c22498-3fd6-4038-a291-05f0db9ab66a,1,0,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,1,0,ee6e5e56-5848-46b6-89bf-b9345a57d94c,ee6e5e56-5848-46b6-89bf-b9345a57d94c,1,0,8817c872-bdee-4577-bcc3-4046edc72803,8817c872-bdee-4577-bcc3-4046edc72803,1,0,5b88c214-4e4e-45c2-b8c5-14eb852e9900,5b88c214-4e4e-45c2-b8c5-14eb852e9900,1,0,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,1,0,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,1,0,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,1,0,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,1,0,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,1,0,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,1,0,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,1,0,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,1,0,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1,0,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,1,0,483720db-6c9e-4179-b5c7-56159c9b6073,483720db-6c9e-4179-b5c7-56159c9b6073,1,0,1725c619-9c4a-40ac-9044-00fee71945a4,1725c619-9c4a-40ac-9044-00fee71945a4,1,0,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,1,0,e95b126d-797d-4071-b7b4-b14aaf595f2d,e95b126d-797d-4071-b7b4-b14aaf595f2d,1,0,9241ea3c-633f-4469-9e70-c5a20e464da8,9241ea3c-633f-4469-9e70-c5a20e464da8,1,0,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,1,0,961ae0fb-7f7b-414d-8fbf-32b893b41085,961ae0fb-7f7b-414d-8fbf-32b893b41085,1,0,10adf8c8-6f5f-477f-b244-4452b774b766,10adf8c8-6f5f-477f-b244-4452b774b766,1,0,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,1,0,04ec5e44-8469-4e9c-8021-83d258f2ec54,04ec5e44-8469-4e9c-8021-83d258f2ec54,1,0,cff36ede-0bd1-424b-8c75-b9695133f32e,cff36ede-0bd1-424b-8c75-b9695133f32e,1,0,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,1,0,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,1,0,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,1,0,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,1,0,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,1,0,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,1,0,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,1,0,6a675752-fd31-46a5-8a62-2a1ede437c68,6a675752-fd31-46a5-8a62-2a1ede437c68,1,0,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,1,0,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,1,0,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,1,0,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,1,0,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,1,0,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,1,0,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,1,0,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,1,0,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,1,0,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,1,0,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,1,0,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,1,0,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,1,0,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,1,0,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,1,0,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,1,0,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,1,0,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,1,0,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,1,0,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,1,0,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,1,0,2b94076d-39ee-45ad-9ba5-435115cf5d4f,2b94076d-39ee-45ad-9ba5-435115cf5d4f,1,0,72ace16c-e90a-4d05-bc23-4351d4c87683,72ace16c-e90a-4d05-bc23-4351d4c87683,1,0,bd86e378-84bb-486a-be7b-319a3fe3b70b,bd86e378-84bb-486a-be7b-319a3fe3b70b,1,0,ef3bc279-6721-4949-8dc0-f96141f7f05c,ef3bc279-6721-4949-8dc0-f96141f7f05c,1,0,f81c7e21-48ad-4b64-975d-e62d34c7235a,f81c7e21-48ad-4b64-975d-e62d34c7235a,1,0,d0523c14-585e-45d3-9735-891235631004,d0523c14-585e-45d3-9735-891235631004,1,0,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,1,0,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,1,0,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,1,0,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,1,0,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,1,0,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,1,0,45af8f5d-d505-466b-a798-19f2219a180c,45af8f5d-d505-466b-a798-19f2219a180c,1,0,8a8229bc-f70a-4434-bacc-8a81fc58154b,8a8229bc-f70a-4434-bacc-8a81fc58154b,1,0,6324ad14-82ca-467b-b6b7-8d5f6049ca65,6324ad14-82ca-467b-b6b7-8d5f6049ca65,1,0,273446f0-f28b-4ce2-874c-3c6a57299b71,273446f0-f28b-4ce2-874c-3c6a57299b71,1,0,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,1,0,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,1,0,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,1,0,7a4e17bf-3649-4982-a9c6-5982390f1f1d,7a4e17bf-3649-4982-a9c6-5982390f1f1d,1,0,722be6e0-2698-431b-9206-777a36e6742f,722be6e0-2698-431b-9206-777a36e6742f,1,0,75bb0122-26bd-40be-8de8-7a57680c85ae,75bb0122-26bd-40be-8de8-7a57680c85ae,1,0,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,1,0,0153e60e-daca-48ac-b1c6-adecc89f579e,0153e60e-daca-48ac-b1c6-adecc89f579e,1,0,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1,0,a896bc34-30a6-48b6-acfc-786c24c186bd,a896bc34-30a6-48b6-acfc-786c24c186bd,1,0,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,1,0,da8ae00a-7207-4ceb-b739-9114888c5b27,da8ae00a-7207-4ceb-b739-9114888c5b27,1,0,a6be80f7-d6aa-4371-a180-3d355080d849,a6be80f7-d6aa-4371-a180-3d355080d849,1,0,b37722c3-e29f-4a40-b4eb-0317919fc7a5,b37722c3-e29f-4a40-b4eb-0317919fc7a5,1,0,b1b1cd90-094d-428b-a6bc-156521c1c54d,b1b1cd90-094d-428b-a6bc-156521c1c54d,1,0,4f79ef7c-79be-4a69-acc0-bd591c712d03,4f79ef7c-79be-4a69-acc0-bd591c712d03,1,0,a0dd2129-d3a1-4bca-b555-72b065be1c13,a0dd2129-d3a1-4bca-b555-72b065be1c13,1,0,dc5e8229-e301-477c-846e-2e7078e3ee5f,dc5e8229-e301-477c-846e-2e7078e3ee5f,1,0,24836e44-8fdd-44bd-91d8-4ddab2caf485,24836e44-8fdd-44bd-91d8-4ddab2caf485,1,0,3727bcfe-4d75-4270-86e7-4a66ab14866c,3727bcfe-4d75-4270-86e7-4a66ab14866c,1,0,870a4708-0b5a-4fa3-9978-d94b161d289a,870a4708-0b5a-4fa3-9978-d94b161d289a,1,0,30e9f89d-7b94-488e-9963-886c271b1af7,30e9f89d-7b94-488e-9963-886c271b1af7,1,0,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,1,0,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1,0,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,1,0,9693cc78-852e-445b-a7d2-f1689fa9eeec,9693cc78-852e-445b-a7d2-f1689fa9eeec,1,0,eb33e555-db41-462a-a45d-c7e0945cece8,eb33e555-db41-462a-a45d-c7e0945cece8,1,0,9cfd517c-1008-483a-9f65-7d15feb2cefc,9cfd517c-1008-483a-9f65-7d15feb2cefc,1,0,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,1,0,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,1,0,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,1,0,1d76f613-f4f6-4772-8c16-d97b3104a553,1d76f613-f4f6-4772-8c16-d97b3104a553,1,0,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,1,0,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,1,0,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,1,0,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,1,0,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,1,0,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,1,0,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,1,0,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,1,0,2d279d24-1953-4a2f-8206-77481d2fd718,2d279d24-1953-4a2f-8206-77481d2fd718,1,0,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,1,0,0a920200-77d0-42ea-abf6-0d40d63289b0,0a920200-77d0-42ea-abf6-0d40d63289b0,1,0,c850bafc-4073-44ef-b148-194f87c46f0e,c850bafc-4073-44ef-b148-194f87c46f0e,1,0,6d1dd726-815d-476e-b668-95cff4182e54,6d1dd726-815d-476e-b668-95cff4182e54,1,0,12f4a0ed-4798-4467-8834-de3eb385e22d,12f4a0ed-4798-4467-8834-de3eb385e22d,1,0,5710809e-4c41-42ab-952f-f7778fe9be0f,5710809e-4c41-42ab-952f-f7778fe9be0f,1,0,0811f6c2-6bb3-43b8-9944-910adc4c6f23,0811f6c2-6bb3-43b8-9944-910adc4c6f23,1,0,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,1,0,c86b02ab-3532-4f4c-b993-e237ed0d4d12,c86b02ab-3532-4f4c-b993-e237ed0d4d12,1,0,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,1,0,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,1,0,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,1,0,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,1,0,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,1,0,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,1,0,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,1,0,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,1,0,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,1,0,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,1,0,feb5f490-e791-11e6-508c-a8667f21fde4,feb5f490-e791-11e6-508c-a8667f21fde4,1,0,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,1,0,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,1,0,6962f838-e792-11e6-508c-a8667f21fde4,6962f838-e792-11e6-508c-a8667f21fde4,1,0,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,1,0,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,1,0,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,1,0,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,1,0,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,1,0,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,1,0,4f2b6bf8-e792-11e6-508c-a8667f21fde4,4f2b6bf8-e792-11e6-508c-a8667f21fde4,1,0,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,1,0,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,1,0,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,1,0,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,1,0,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,1,0,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,1,0,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,1,0,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,1,0,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,1,0,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,1,0,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,1,0,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,1,0,32eb2a75-ff35-4795-bf0c-12b1328441ee,32eb2a75-ff35-4795-bf0c-12b1328441ee,1,0,8e877990-a64c-4c45-91f1-007d47618cc7,8e877990-a64c-4c45-91f1-007d47618cc7,1,0,73c6640e-2fe6-4132-9237-d6f28cbacc1c,73c6640e-2fe6-4132-9237-d6f28cbacc1c,1,0,69489064-c131-4618-b31f-e6964d593f4a,69489064-c131-4618-b31f-e6964d593f4a,1,0,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,1,0,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,1,0,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,1,0,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,1,0,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,1,0,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,1,0,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,1,0,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,1,0,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,1,0,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,1,0,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,1,0,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,1,0,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,1,0,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,1,0,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,1,0,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,1,0,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,1,0,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,1,0,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,1,0,bd0e4aeb-19f9-48fc-b838-38d785004360,bd0e4aeb-19f9-48fc-b838-38d785004360,1,0,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,1,0,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,1,0,6d351276-2c04-4198-a3e4-865881c12f5c,6d351276-2c04-4198-a3e4-865881c12f5c,1,0,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,1,0,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,1,0,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,1,0,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,1,0,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,1,0,61b947a5-edca-43ca-82c4-5a7b529d8f82,61b947a5-edca-43ca-82c4-5a7b529d8f82,1,0,59eb6a7a-1d96-4985-8d8e-575162759415,59eb6a7a-1d96-4985-8d8e-575162759415,1,0,68564573-ed49-4519-a8b3-997865fe70a6,68564573-ed49-4519-a8b3-997865fe70a6,1,0,6c789969-d066-489d-ad88-92e2a5a6ec69,6c789969-d066-489d-ad88-92e2a5a6ec69,1,0,2a07d696-75d6-4a12-a310-30d6598b4a4c,2a07d696-75d6-4a12-a310-30d6598b4a4c,1,0,dde88f56-417c-4559-a893-85dc91e7e623,dde88f56-417c-4559-a893-85dc91e7e623,1,0,963eedab-6976-4a98-b9ad-b81f89239661,963eedab-6976-4a98-b9ad-b81f89239661,1,0,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,1,0,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,1,0,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,1,0,afde7867-15d3-43fa-b439-6d9e40df580b,afde7867-15d3-43fa-b439-6d9e40df580b,1,0,a676ff94-a0d1-4de9-8690-ec67f2c891d8,a676ff94-a0d1-4de9-8690-ec67f2c891d8,1,0,012bf716-3672-462e-b390-7bb4384ab4b1,012bf716-3672-462e-b390-7bb4384ab4b1,1,0,65342599-ff37-4f99-8e40-f05d87403bcf,65342599-ff37-4f99-8e40-f05d87403bcf,1,0,3a3f505a-7a50-4111-8029-5b9057fed232,3a3f505a-7a50-4111-8029-5b9057fed232,1,0,36baa776-83c4-413d-b70c-cbbc45e25662,36baa776-83c4-413d-b70c-cbbc45e25662,1,0,b65f9165-c20d-4053-8a0b-cff3f693b762,b65f9165-c20d-4053-8a0b-cff3f693b762,1,0,51af096b-687f-44f4-a0d8-306f670fc5ce,51af096b-687f-44f4-a0d8-306f670fc5ce,1,0,75972f88-aedd-4338-a3b5-320cd632a2e6,75972f88-aedd-4338-a3b5-320cd632a2e6,1,0,1363523a-929e-49ac-ae39-d43acf9f0478,1363523a-929e-49ac-ae39-d43acf9f0478,1,0,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,1,0,2876c476-8280-426d-8bf9-c93beda0ddd5,2876c476-8280-426d-8bf9-c93beda0ddd5,1,0,963e0813-4f6b-4d31-b66d-77125c47ce19,963e0813-4f6b-4d31-b66d-77125c47ce19,1,0,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,1,0,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,1,0,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,1,0,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,1,0,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,1,0,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,1,0,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,1,0,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,1,0,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,1,0,ebedc283-5eb0-459b-b686-f8643666b8b8,ebedc283-5eb0-459b-b686-f8643666b8b8,1,0,6a6afffd-cfed-4801-8b59-34d27e46565c,6a6afffd-cfed-4801-8b59-34d27e46565c,1,0,a469b12d-4537-419c-91e0-37abc9d31505,a469b12d-4537-419c-91e0-37abc9d31505,1,0,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,1,0,82c42232-531e-403f-8599-cc21a248fa2c,82c42232-531e-403f-8599-cc21a248fa2c,1,0,9104b791-9ac4-41ba-a7f0-9e609db3b578,9104b791-9ac4-41ba-a7f0-9e609db3b578,1,0,2d3721d1-816f-4e84-9df1-863cb269d83d,2d3721d1-816f-4e84-9df1-863cb269d83d,1,0,73554821-8ab5-44ab-a593-37ca10a1b777,73554821-8ab5-44ab-a593-37ca10a1b777,1,0,d5a98e02-e199-445e-8d53-11acd07f473f,d5a98e02-e199-445e-8d53-11acd07f473f,1,0,79db55d6-e916-4bde-b417-7d0a53bb85af,79db55d6-e916-4bde-b417-7d0a53bb85af,1,0,3084fb99-59cb-4338-ae37-0b1e8b333f01,3084fb99-59cb-4338-ae37-0b1e8b333f01,1,0,818a1fbf-17c1-44f9-8e20-27d4ceda549c,818a1fbf-17c1-44f9-8e20-27d4ceda549c,1,0,959a5d25-03e5-4911-bbb7-b93714db7eed,959a5d25-03e5-4911-bbb7-b93714db7eed,1,0,1d0b6a8d-9351-4ce2-85dd-6ac508c660c2,1d0b6a8d-9351-4ce2-85dd-6ac508c660c2,1,0,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,1,0,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,1,0,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,1,0,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,1,0,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,1,0,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,1,0,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,1,0,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,1,0,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,1,0,f0b0608c-178f-4dea-b461-0d8f00d79d30,f0b0608c-178f-4dea-b461-0d8f00d79d30,1,0,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,1,0,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,1,0,5546b9a9-a4fe-4a2b-9492-883bcb37a210,5546b9a9-a4fe-4a2b-9492-883bcb37a210,1,0,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,1,0,275a5772-8428-497a-81ef-c919f15fcccd,275a5772-8428-497a-81ef-c919f15fcccd,1,0,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,1,0,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,1,0,10336352-f3a1-4bc3-bdec-1a2eef15f176,10336352-f3a1-4bc3-bdec-1a2eef15f176,1,0,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,1,0,3b7c713e-81ae-4adc-9519-99c936599ef7,3b7c713e-81ae-4adc-9519-99c936599ef7,1,0,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1,0,ecda2c4b-6411-4b47-ab59-1918bad5acdd,ecda2c4b-6411-4b47-ab59-1918bad5acdd,1,0,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,1,0,2c811ee8-f50d-4c39-82ee-0492feb1c431,2c811ee8-f50d-4c39-82ee-0492feb1c431,1,0,399f679b-f48a-4d4e-b890-5eab9e4598c3,399f679b-f48a-4d4e-b890-5eab9e4598c3,1,0,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,1,0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,1,0,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,1,0,0c24858a-7e64-426f-9b59-392449aecaf5,0c24858a-7e64-426f-9b59-392449aecaf5,1,0,b1d61e28-f3dc-418b-b5df-f75622a4b980,b1d61e28-f3dc-418b-b5df-f75622a4b980,1,0,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,1,0,4033f86b-d250-475a-8837-071bf31664b0,4033f86b-d250-475a-8837-071bf31664b0,1,0,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,1,0,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,1,0,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,1,0,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,1,0,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,1,0,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,1,0,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,1,0,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,1,0,b5ea4aff-11be-4232-94a2-cb92801b6c49,b5ea4aff-11be-4232-94a2-cb92801b6c49,1,0,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,1,0,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,1,0,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,1,0,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,1,0,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,1,0,0544376f-461c-42c3-a102-e0ae65e3c0c6,0544376f-461c-42c3-a102-e0ae65e3c0c6,1,0,6df8d316-6ac3-4626-8951-1ad36d7049ed,6df8d316-6ac3-4626-8951-1ad36d7049ed,1,0,f211b418-899d-4220-a14b-4a7302183e46,f211b418-899d-4220-a14b-4a7302183e46,1,0,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,1,0,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,1,0,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,1,0,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,1,0,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,1,0,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,1,0,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,1,0,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,1,0,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,1,0,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,1,0,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,1,0,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,1,0,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,1,0,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,1,0,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,1,0,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,1,0,e5094d4f-ee61-4142-a97b-d96172350f65,e5094d4f-ee61-4142-a97b-d96172350f65,1,0,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,1,0,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,1,0,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,1,0,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,1,0,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,1,0,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,1,0,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,1,0,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,1,0,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,1,0,20c57e30-5856-4801-9e77-8006471d89f8,20c57e30-5856-4801-9e77-8006471d89f8,1,0,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,1,0,4a3fe393-8aea-4394-8c10-a234f1f191ad,4a3fe393-8aea-4394-8c10-a234f1f191ad,1,0,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,1,0,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,1,0,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,1,0,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,1,0,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,1,0,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,1,0,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,1,0,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,1,0,fd271670-bde6-4351-abec-eb82548c6c98,fd271670-bde6-4351-abec-eb82548c6c98,1,0,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,1,0,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,1,0,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,1,0,799b3dda-fbfc-4dea-a577-30321e64f4d5,799b3dda-fbfc-4dea-a577-30321e64f4d5,1,0,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,1,0,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,1,0,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,1,0,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,1,0,05ee4a7c-63e6-4587-8be7-e206345e3471,05ee4a7c-63e6-4587-8be7-e206345e3471,1,0,98d5e98b-0382-4b28-a5d9-24392925664a,98d5e98b-0382-4b28-a5d9-24392925664a,1,0,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,1,0,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,1,0,19a18193-c5d3-4e56-86c5-5a81c525e9ad,19a18193-c5d3-4e56-86c5-5a81c525e9ad,1,0,c208fcc0-d7b2-435b-963a-e18c97727f8f,c208fcc0-d7b2-435b-963a-e18c97727f8f,1,0,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,1,0,bf11f7b1-6332-4499-ba48-b94bc10ef869,bf11f7b1-6332-4499-ba48-b94bc10ef869,1,0,479d9428-02fd-47d2-a869-a3695b315724,479d9428-02fd-47d2-a869-a3695b315724,1,0,838b4840-86e3-4bf3-8b95-1e58ef60e97a,838b4840-86e3-4bf3-8b95-1e58ef60e97a,1,0,36d258b5-bfda-4b40-88a8-1e0abf351805,36d258b5-bfda-4b40-88a8-1e0abf351805,1,0,cc95b010-ca42-4b54-9c50-0551b2c690ed,cc95b010-ca42-4b54-9c50-0551b2c690ed,1,0,829fb3c0-6d96-4765-adc6-f177344a4a33,829fb3c0-6d96-4765-adc6-f177344a4a33,1,0,9241e7fe-e3e8-4ddd-ac6c-4edb1a1b2f71,9241e7fe-e3e8-4ddd-ac6c-4edb1a1b2f71,1,0,05c27c89-2c26-4252-842d-9aa43ba0ea2f,05c27c89-2c26-4252-842d-9aa43ba0ea2f,1,0,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,1,0,f092729c-6b5d-4709-8b28-15e06129731d,f092729c-6b5d-4709-8b28-15e06129731d,1,0,c03be2f7-d681-417d-975a-5c8c7b716659,c03be2f7-d681-417d-975a-5c8c7b716659,1,0,fca7af5f-bdc0-4264-be68-5e5e38545368,fca7af5f-bdc0-4264-be68-5e5e38545368,1,0,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,1,0,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,1,0,0b7cee9b-3870-49f5-a58e-063cf5353467,0b7cee9b-3870-49f5-a58e-063cf5353467,1,0,d392a791-af74-40c9-ab20-6ed6aeabe864,d392a791-af74-40c9-ab20-6ed6aeabe864,1,0,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,1,0,1612570d-b069-405a-9dd3-80b8175fb468,1612570d-b069-405a-9dd3-80b8175fb468,1,0,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,1,0,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,1,0,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,1,0,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,1,0,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,1,0,561ed574-617d-4a46-b32b-f022e07846c8,561ed574-617d-4a46-b32b-f022e07846c8,1,0,cba706bf-a9a7-4dda-9c5a-a26e85119396,cba706bf-a9a7-4dda-9c5a-a26e85119396,1,0,159a4eb5-00cd-426c-86e3-09cd3f569f22,159a4eb5-00cd-426c-86e3-09cd3f569f22,1,0,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,1,0,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,1,0,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,1,0,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,1,0,2ded5135-b6c3-46dd-b563-7b6fab986d23,2ded5135-b6c3-46dd-b563-7b6fab986d23,1,0,14215720-ccb3-4e5a-8345-cd42c96a3e77,14215720-ccb3-4e5a-8345-cd42c96a3e77,1,0,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,1,0,0690a5c7-bc25-4101-afa5-69c095d415c2,0690a5c7-bc25-4101-afa5-69c095d415c2,1,0,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,1,0,79013bba-a0f2-481c-a63e-095a54ee52aa,79013bba-a0f2-481c-a63e-095a54ee52aa,1,0,8523c346-f144-41b8-a702-2d588e7097c2,8523c346-f144-41b8-a702-2d588e7097c2,1,0,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,1,0,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,1,0,fa2bd6a6-bb46-4e21-8684-248578310164,fa2bd6a6-bb46-4e21-8684-248578310164,1,0,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,1,0,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,1,0,88ccac36-169d-48f8-bc68-15e3bb775b79,88ccac36-169d-48f8-bc68-15e3bb775b79,1,0,a1640988-bd60-43b3-86f1-184b9db275c6,a1640988-bd60-43b3-86f1-184b9db275c6,1,0,300a02f7-8062-4843-b11e-0321f8b40f4d,300a02f7-8062-4843-b11e-0321f8b40f4d,1,0,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,1,0,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,1,0,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,1,0,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,1,0,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,1,0,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,1,0,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,1,0,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,1,0,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,1,0,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,1,0,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,1,0,2d942a50-b239-4b8c-812a-5a634f5dcaef,2d942a50-b239-4b8c-812a-5a634f5dcaef,1,0,8ab0c61d-85b4-47e3-aca1-1890e4c6ec8d,8ab0c61d-85b4-47e3-aca1-1890e4c6ec8d,1,0,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,1,0,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,1,0,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,1,0,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,1,0,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,1,0,fc67b510-3fb4-4305-92d2-c252bc718f03,fc67b510-3fb4-4305-92d2-c252bc718f03,1,0,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,1,0,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,1,0,cf1f7915-94ad-47e7-8676-73271d0cf71e,cf1f7915-94ad-47e7-8676-73271d0cf71e,1,0,fceb6e4a-bd51-4193-a542-70d2317af669,fceb6e4a-bd51-4193-a542-70d2317af669,1,0,80847d57-1795-46c7-a106-926e1f43ac1e,80847d57-1795-46c7-a106-926e1f43ac1e,1,0,38685415-dc87-48b4-8cc4-f85b438f2ec2,38685415-dc87-48b4-8cc4-f85b438f2ec2,1,0,110eff8b-aeec-4ba5-b710-fefc1bd60284,110eff8b-aeec-4ba5-b710-fefc1bd60284,1,0,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,1,0,75eca481-002b-4046-898d-dfac9357611f,75eca481-002b-4046-898d-dfac9357611f,1,0,0110decc-d06e-43cf-9d01-30d412edcdd7,0110decc-d06e-43cf-9d01-30d412edcdd7,1,0,3ea32a24-d37b-4fad-937a-9d1357d649a9,3ea32a24-d37b-4fad-937a-9d1357d649a9,1,0,2856ee9a-0fea-4684-b7b8-4844773eae07,2856ee9a-0fea-4684-b7b8-4844773eae07,1,0,84e09840-8d67-416f-87a2-7f03c04180c9,84e09840-8d67-416f-87a2-7f03c04180c9,1,0,0388f22d-f91d-45c9-a8ae-900a24cbfe67,0388f22d-f91d-45c9-a8ae-900a24cbfe67,1,0,60fa2562-4914-46d6-a00a-1bb6e2803263,60fa2562-4914-46d6-a00a-1bb6e2803263,1,0,0d61a8d4-2dc8-435e-a238-416d7640576f,0d61a8d4-2dc8-435e-a238-416d7640576f,1,0,5ea899d4-e076-4a1c-838c-e369abc4705f,5ea899d4-e076-4a1c-838c-e369abc4705f,1,0,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,1,0,ab2e75f0-8da7-4b38-8f30-537424b719db,ab2e75f0-8da7-4b38-8f30-537424b719db,1,0,db344a42-61b8-4544-9aa1-8840ab8a70f0,db344a42-61b8-4544-9aa1-8840ab8a70f0,1,0,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,1,0,043bd776-5a7b-45ff-8b4a-5eed2bba0054,043bd776-5a7b-45ff-8b4a-5eed2bba0054,1,0,6a708860-e3b6-46ea-bea5-0d3e426c72f6,6a708860-e3b6-46ea-bea5-0d3e426c72f6,1,0,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,1,0,78058cd3-eb56-483c-96f5-1bf8883abc76,78058cd3-eb56-483c-96f5-1bf8883abc76,1,0,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,1,0,fae4675c-dcdc-42fc-911d-07c3c577b8b8,fae4675c-dcdc-42fc-911d-07c3c577b8b8,1,0,f1050611-4f82-411b-97f2-bcd8a5c914bf,f1050611-4f82-411b-97f2-bcd8a5c914bf,1,0,efacf22d-b474-4d49-af8b-6d3784aa5cf2,efacf22d-b474-4d49-af8b-6d3784aa5cf2,1,0,f818b937-9ac3-4a0c-ba50-26c060984f09,f818b937-9ac3-4a0c-ba50-26c060984f09,1,0,f385778d-96cb-4e09-884d-533739b393b1,f385778d-96cb-4e09-884d-533739b393b1,1,0,5bdaa783-e965-4d59-b7b7-a1e86ddb89f7,5bdaa783-e965-4d59-b7b7-a1e86ddb89f7,1,0,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,1,0,f64089ee-72dd-4fcf-8926-31e95c6fcf77,f64089ee-72dd-4fcf-8926-31e95c6fcf77,1,0,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,1,0,e1e151cc-7b8a-4125-804f-c902a522ed81,e1e151cc-7b8a-4125-804f-c902a522ed81,1,0,f475494e-fe94-4902-b2da-3ade01eba5bb,f475494e-fe94-4902-b2da-3ade01eba5bb,1,0,fbb814b2-cb2f-474d-9c96-5571cef3030e,fbb814b2-cb2f-474d-9c96-5571cef3030e,1,0,7bf36370-3761-4fd5-bea5-90fa142a9d57,7bf36370-3761-4fd5-bea5-90fa142a9d57,1,0,3b81427f-cf64-4a5e-adb3-5415d515fecd,3b81427f-cf64-4a5e-adb3-5415d515fecd,1,0,e9f2b604-7181-476d-8b34-3a544cbb353d,e9f2b604-7181-476d-8b34-3a544cbb353d,1,0,73773919-d01c-41dd-bb31-9c66648ac0ff,73773919-d01c-41dd-bb31-9c66648ac0ff,1,0,5d1afad0-3d7e-4214-b52a-72c184490084,5d1afad0-3d7e-4214-b52a-72c184490084,1,0,5f7901a1-f992-42fa-9ddb-d63574da3b56,5f7901a1-f992-42fa-9ddb-d63574da3b56,1,0,26abd45a-12b3-4312-88fb-53c90a6e6679,26abd45a-12b3-4312-88fb-53c90a6e6679,1,0,1541ad74-3e73-4699-bccf-c13313fbedfe,1541ad74-3e73-4699-bccf-c13313fbedfe,1,0,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1,0,0b2356a4-5571-4ba0-9095-265106f2b3b3,0b2356a4-5571-4ba0-9095-265106f2b3b3,1,0,a2581834-dde8-439a-8204-6712c829738e,a2581834-dde8-439a-8204-6712c829738e,1,0,222985c4-fe09-44d1-a1c5-5a3e3cedd9b2,222985c4-fe09-44d1-a1c5-5a3e3cedd9b2,1,0,c746a268-815b-4917-8b06-af745ba9db04,c746a268-815b-4917-8b06-af745ba9db04,1,0,5cc01f13-0faa-4c3c-8e5e-156656f71efd,5cc01f13-0faa-4c3c-8e5e-156656f71efd,1,0,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,1,0,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,1,0,be2b4dba-e77e-4947-bd2f-0710b357ca2a,be2b4dba-e77e-4947-bd2f-0710b357ca2a,1,0,86182e9a-89e0-40d7-b2d7-fcd92ee42942,86182e9a-89e0-40d7-b2d7-fcd92ee42942,1,0,df750e63-50fc-4085-b8b8-f05e4751ff51,df750e63-50fc-4085-b8b8-f05e4751ff51,1,0,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,1,0,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,1,0,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,1,0,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,1,0,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,1,0,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,1,0,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,1,0,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,1,0,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,1,0,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,1,0,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,1,0,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,1,0,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,1,0,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,1,0,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,1,0,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,1,0,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,1,0,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,1,0,4770398f-8013-4d43-93ce-ec1165e40c4e,4770398f-8013-4d43-93ce-ec1165e40c4e,1,0,9a706997-90cb-430d-972c-d2bad87c4a79,9a706997-90cb-430d-972c-d2bad87c4a79,1,0,6f661660-b9c4-41d4-99a8-e08006cfe9c8,6f661660-b9c4-41d4-99a8-e08006cfe9c8,1,0,199e79fa-54d6-4748-aaaa-9c55283582a3,199e79fa-54d6-4748-aaaa-9c55283582a3,1,0,77b4ade5-149c-4803-af25-fb24ad8b7116,77b4ade5-149c-4803-af25-fb24ad8b7116,1,0,afedc975-4354-473c-8a4d-5b4b547c6e13,afedc975-4354-473c-8a4d-5b4b547c6e13,1,0,8faced7e-d498-499e-8011-7d8d2de1a25f,8faced7e-d498-499e-8011-7d8d2de1a25f,1,0,a67b69dc-ca89-4813-a78d-4a7be1aff328,a67b69dc-ca89-4813-a78d-4a7be1aff328,1,0,dec2510f-4517-4144-a525-3c344e44abc4,dec2510f-4517-4144-a525-3c344e44abc4,1,0,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,1,0,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,1,0,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,1,0,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,1,0,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,1,0,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,1,0,aa89881f-f111-4384-911c-847b04bb56dd,aa89881f-f111-4384-911c-847b04bb56dd,1,0,444d9e3b-c702-4ad6-a929-a220eff0f6e7,444d9e3b-c702-4ad6-a929-a220eff0f6e7,1,0,022c4519-1cdb-45b6-a699-89fd6688999c,022c4519-1cdb-45b6-a699-89fd6688999c,1,0,fb5b79a2-caec-4c6e-a112-27e78a184d5e,fb5b79a2-caec-4c6e-a112-27e78a184d5e,1,0,fa523958-ce1e-42e1-ae00-2dcb401b7eda,fa523958-ce1e-42e1-ae00-2dcb401b7eda,1,0,1518bca2-a004-4566-8991-7c60e6745a49,1518bca2-a004-4566-8991-7c60e6745a49,1,0,ed8618e2-3ce6-4956-856a-9f40279b4da6,ed8618e2-3ce6-4956-856a-9f40279b4da6,1,0,733f6bc2-544d-4fac-bca8-11b981b95a03,733f6bc2-544d-4fac-bca8-11b981b95a03,1,0,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,1,0,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,1,0,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,1,0,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,1,0,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,1,0,e1e9862e-c87b-400f-bca1-b1380cb98ddc,e1e9862e-c87b-400f-bca1-b1380cb98ddc,1,0,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,1,0,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,1,0,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,1,0,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,1,0,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,1,0,0db78226-37d0-4016-b4c9-5134af1aabc7,0db78226-37d0-4016-b4c9-5134af1aabc7,1,0,8d6b4d23-a260-4352-9975-c13ce3e05220,8d6b4d23-a260-4352-9975-c13ce3e05220,1,0,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,1,0,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,1,0,6f5ac40b-ea22-47cf-acf2-614406669a72,6f5ac40b-ea22-47cf-acf2-614406669a72,1,0,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,1,0,488d2644-6fef-488a-af38-40f59c0e0d8c,488d2644-6fef-488a-af38-40f59c0e0d8c,1,0,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,1,0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,1,0,f1efef30-8651-4728-becd-abe3f9026a43,f1efef30-8651-4728-becd-abe3f9026a43,1,0,c2612e22-4f0d-4713-b4eb-decd9780d088,c2612e22-4f0d-4713-b4eb-decd9780d088,1,0,11b1410f-8e14-4b2f-8890-177f4875020e,11b1410f-8e14-4b2f-8890-177f4875020e,1,0,2276b2b0-1705-4014-956f-5087e9dd5c1e,2276b2b0-1705-4014-956f-5087e9dd5c1e,1,0,4aef5419-7cf5-4443-b773-9273c983844f,4aef5419-7cf5-4443-b773-9273c983844f,1,0,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,1,0,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,1,0,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,1,0,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,1,0,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,1,0,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,1,0,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,1,0,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,1,0,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,1,0,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,1,0,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,1,0,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,1,0,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,1,0,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,1,0,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0be7f905-53b8-4bb1-8e37-dcc142e508c5,1,0,422155c7-1640-48c4-bb21-36595b405c66,422155c7-1640-48c4-bb21-36595b405c66,1,0,16d37b5a-88db-4787-b2de-fb50da0ca94b,16d37b5a-88db-4787-b2de-fb50da0ca94b,1,0,f653bcbf-5659-4605-9bb9-3737f19e79dd,f653bcbf-5659-4605-9bb9-3737f19e79dd,1,0,8b980868-fe63-49ff-ba3d-4c29732e1b90,8b980868-fe63-49ff-ba3d-4c29732e1b90,1,0,54668731-4963-4ec3-b188-9feacaefa182,54668731-4963-4ec3-b188-9feacaefa182,1,0,3702135e-5380-4ca6-82f5-63eff1b043e9,3702135e-5380-4ca6-82f5-63eff1b043e9,1,0,29b2104b-fd02-4d51-951f-51ea213b8ebd,29b2104b-fd02-4d51-951f-51ea213b8ebd,1,0,ba5c945e-554f-45a2-a2de-3157b2d7e931,ba5c945e-554f-45a2-a2de-3157b2d7e931,1,0,f7085f33-f122-4443-a3f5-4e765300175e,f7085f33-f122-4443-a3f5-4e765300175e,1,0,b7e4c512-b856-4679-a025-5f0f28918593,b7e4c512-b856-4679-a025-5f0f28918593,1,0,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,1,0,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,1,0,a9362ac4-85ee-4214-80c1-048fab769885,a9362ac4-85ee-4214-80c1-048fab769885,1,0,4ec242e0-75d1-4bf7-be18-783e7aa4f236,4ec242e0-75d1-4bf7-be18-783e7aa4f236,1,0,e02b1366-9d7a-462f-86a1-436bbf4532ff,e02b1366-9d7a-462f-86a1-436bbf4532ff,1,0,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,1,0,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,1,0,8811cc64-99d9-4f13-8309-c29965783f5a,8811cc64-99d9-4f13-8309-c29965783f5a,1,0,7c737071-e850-4a3f-8942-697ef52a8ecc,7c737071-e850-4a3f-8942-697ef52a8ecc,1,0,62eff222-7b74-4cab-9138-880db1f05147,62eff222-7b74-4cab-9138-880db1f05147,1,0,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,1,0,860f8893-22fe-4b13-adb1-24e1ea8c6544,860f8893-22fe-4b13-adb1-24e1ea8c6544,1,0,95266e9f-073f-4de3-83c6-cc0d9ee9334f,95266e9f-073f-4de3-83c6-cc0d9ee9334f,1,0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,1,0,d5012e69-89bc-40af-8e4f-377a042854ee,d5012e69-89bc-40af-8e4f-377a042854ee,1,0,02f79fd8-5315-4c90-b520-db67dcb6e371,02f79fd8-5315-4c90-b520-db67dcb6e371,1,0,9bb52788-4a3a-48b5-a551-5ca753b6c059,9bb52788-4a3a-48b5-a551-5ca753b6c059,1,0,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,1,0,872a0c47-fab5-4a54-8ab9-23940bbdefbb,872a0c47-fab5-4a54-8ab9-23940bbdefbb,1,0,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,1,0,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,1,0,b6c94efd-5994-4c4c-a641-b062ecc38b65,b6c94efd-5994-4c4c-a641-b062ecc38b65,1,0,98501228-7f0e-45a3-b58f-4c654f393f80,98501228-7f0e-45a3-b58f-4c654f393f80,1,0,502384c9-edb7-451a-b7ea-de006f657a6e,502384c9-edb7-451a-b7ea-de006f657a6e,1,0,4e1a4fe0-dca4-40ba-9369-73be303a4aef,4e1a4fe0-dca4-40ba-9369-73be303a4aef,1,0,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,1,0,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,1,0,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1,0,50968921-76f3-4108-835a-96b153671c8d,50968921-76f3-4108-835a-96b153671c8d,1,0,b773f510-1485-4886-9071-afcbf49ff856,b773f510-1485-4886-9071-afcbf49ff856,1,0,964403f2-0a87-49e1-b183-dbe3624e3805,964403f2-0a87-49e1-b183-dbe3624e3805,1,0,bb264e83-49f4-4b7a-8be2-094712fc0640,bb264e83-49f4-4b7a-8be2-094712fc0640,1,0,07bf650d-e61e-44f3-9643-6ffc95b913fb,07bf650d-e61e-44f3-9643-6ffc95b913fb,1,0,5c68c57a-31d6-4ae9-855f-3fbc57922e39,5c68c57a-31d6-4ae9-855f-3fbc57922e39,1,0,6b90ed05-813c-4324-8a69-02c2268856b2,6b90ed05-813c-4324-8a69-02c2268856b2,1,0,081ed48d-cb87-459d-97d6-9af121edbabb,081ed48d-cb87-459d-97d6-9af121edbabb,1,0,6c4074b2-f631-451d-b412-1c8c096a71b1,6c4074b2-f631-451d-b412-1c8c096a71b1,1,0,f9931a20-8391-4b13-8c6d-1836f2492e53,f9931a20-8391-4b13-8c6d-1836f2492e53,1,0,c6eec20b-13b9-44a0-968f-1325680c399b,c6eec20b-13b9-44a0-968f-1325680c399b,1,0,02fbf083-1bdd-4900-9dc1-62f415b792a4,02fbf083-1bdd-4900-9dc1-62f415b792a4,1,0,35454c2d-7088-487b-abb3-f95f2dfdcffa,35454c2d-7088-487b-abb3-f95f2dfdcffa,1,0,2c2526c1-bdf8-4115-bdff-3e79d28321cb,2c2526c1-bdf8-4115-bdff-3e79d28321cb,1,0,4f4da2e9-37ab-4505-b3b1-4b3a908f38c2,4f4da2e9-37ab-4505-b3b1-4b3a908f38c2,1,0,95ab774f-27fa-4bd4-a422-0f997f632679,95ab774f-27fa-4bd4-a422-0f997f632679,1,0,ee3ad891-b7d6-439d-892b-de2f3399d147,ee3ad891-b7d6-439d-892b-de2f3399d147,1,0,4af0f1ee-42cb-47bd-99d0-99deb70e9f82,4af0f1ee-42cb-47bd-99d0-99deb70e9f82,1,0,a2ae0338-ed11-422a-8442-f6c4002ddf0d,a2ae0338-ed11-422a-8442-f6c4002ddf0d,1,0,eb59c9c3-6043-401c-87cc-ba7620139d6a,eb59c9c3-6043-401c-87cc-ba7620139d6a,1,0,2b5ce871-8630-4f2f-9ccb-d9f863886420,2b5ce871-8630-4f2f-9ccb-d9f863886420,1,0,86ae353e-7eed-434c-b4ab-cede36e462bc,86ae353e-7eed-434c-b4ab-cede36e462bc,1,0,18e65717-738b-4d39-9c85-676bca15e6b7,18e65717-738b-4d39-9c85-676bca15e6b7,1,0,01579044-5659-4a73-a989-c52cfabaae66,01579044-5659-4a73-a989-c52cfabaae66,1,0,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,1,0,911baaa1-a4de-4558-b00e-51644144a762,911baaa1-a4de-4558-b00e-51644144a762,1,0,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,1,0,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,1,0,4e036eff-92a8-4010-89b2-ed949c123311,4e036eff-92a8-4010-89b2-ed949c123311,1,0,38160114-dc22-4d0b-86a5-d650f4756932,38160114-dc22-4d0b-86a5-d650f4756932,1,0,60aaa289-1f07-438c-8f10-81058ac671c3,60aaa289-1f07-438c-8f10-81058ac671c3,1,0,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,1,0,c44b0868-bd7f-4230-973b-544ff4dd2afe,c44b0868-bd7f-4230-973b-544ff4dd2afe,1,0,fc2675c2-1c9b-41f9-88eb-5c8be365fe41,fc2675c2-1c9b-41f9-88eb-5c8be365fe41,1,0,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,1,0,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,1,0,8b3da21b-ea3f-47cf-af48-15b886b21f20,8b3da21b-ea3f-47cf-af48-15b886b21f20,1,0,32c4750b-0096-4bbc-8dcd-c1f717734233,32c4750b-0096-4bbc-8dcd-c1f717734233,1,0,be6740b1-1f57-4c01-a67a-d48152931dc8,be6740b1-1f57-4c01-a67a-d48152931dc8,1,0,40fd038d-a93a-4be7-9221-d8ae83350ca0,40fd038d-a93a-4be7-9221-d8ae83350ca0,1,0,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,1,0,29adc9e5-a994-48ab-a5a1-919d01119c3a,29adc9e5-a994-48ab-a5a1-919d01119c3a,1,0,c47ffce7-c905-4e88-8b1f-156f47047ccd,c47ffce7-c905-4e88-8b1f-156f47047ccd,1,0,e1755eed-88cf-42c1-83e4-f9047f2c30bf,e1755eed-88cf-42c1-83e4-f9047f2c30bf,1,0,c6ec9d48-9131-4735-9cf7-b498705a57e4,c6ec9d48-9131-4735-9cf7-b498705a57e4,1,0,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,1,0,706c421a-74ce-4985-9443-b4a2032481f6,706c421a-74ce-4985-9443-b4a2032481f6,1,0,64da4c24-4aaf-42c8-8595-7f60ff3bc344,64da4c24-4aaf-42c8-8595-7f60ff3bc344,1,0,fb9577e1-00d9-4d52-8de9-23914929a683,fb9577e1-00d9-4d52-8de9-23914929a683,1,0,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,1,0,529253ae-9c92-4426-b150-8444ba622f89,529253ae-9c92-4426-b150-8444ba622f89,1,0,06a1955a-2ef0-4607-9dcb-a480a7951af7,06a1955a-2ef0-4607-9dcb-a480a7951af7,1,0,6f8fcc96-bfed-444a-908d-95c5b1c64972,6f8fcc96-bfed-444a-908d-95c5b1c64972,1,0,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,1,0,a84c89d9-2cfe-405f-9bb0-5392b3171695,a84c89d9-2cfe-405f-9bb0-5392b3171695,1,0,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,1,0,91e26e73-027f-4a10-9083-e5182e768723,91e26e73-027f-4a10-9083-e5182e768723,1,0,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,1,0,54433668-4391-4dea-8baf-43e9aa1d624e,54433668-4391-4dea-8baf-43e9aa1d624e,1,0,fc309616-060a-42c3-8401-dfef0f359bc5,fc309616-060a-42c3-8401-dfef0f359bc5,1,0,b968398d-973d-4643-95a5-16633d7e48bc,b968398d-973d-4643-95a5-16633d7e48bc,1,0,b9507495-2536-4895-b68b-62acd74343f6,b9507495-2536-4895-b68b-62acd74343f6,1,0,e05a14cc-9051-4c38-9725-19856e36d260,e05a14cc-9051-4c38-9725-19856e36d260,1,0,8154aa0f-ecd6-4ab0-9498-56ef25486a55,8154aa0f-ecd6-4ab0-9498-56ef25486a55,1,0,9d6429f7-23da-4596-822a-04818deb3088,9d6429f7-23da-4596-822a-04818deb3088,1,0,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,1,0,acb533e7-4610-4f92-b548-1a4ff1a423d4,acb533e7-4610-4f92-b548-1a4ff1a423d4,1,0,8697999d-9cdb-43d8-979b-3f283daffdd3,8697999d-9cdb-43d8-979b-3f283daffdd3,1,0,23378687-249c-4ec6-99b8-b13fb04b8643,23378687-249c-4ec6-99b8-b13fb04b8643,1,0,66315b12-7abf-46e0-a994-894b827b1301,66315b12-7abf-46e0-a994-894b827b1301,1,0,dba174fb-8392-4451-8069-ae8145658e34,dba174fb-8392-4451-8069-ae8145658e34,1,0,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,1,0,4435d99d-a1df-43e6-97ab-5e651017c61d,4435d99d-a1df-43e6-97ab-5e651017c61d,1,0,2398d69d-ecdd-4d34-bdae-34ed5507a61e,2398d69d-ecdd-4d34-bdae-34ed5507a61e,1,0,a707035a-0172-4b55-b589-fa4a8be9b596,a707035a-0172-4b55-b589-fa4a8be9b596,1,0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,1,0,4a347209-3a07-48ea-b407-6ee37f1d69f2,4a347209-3a07-48ea-b407-6ee37f1d69f2,1,0,d6aed0fd-686c-430d-b884-74494177422e,d6aed0fd-686c-430d-b884-74494177422e,1,0,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,1,0,3ed64288-8bf0-4049-8d44-1b424f31d40f,3ed64288-8bf0-4049-8d44-1b424f31d40f,1,0,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,1,0,df31eee8-387d-40d1-98df-1f7d8176b50e,df31eee8-387d-40d1-98df-1f7d8176b50e,1,0,c8364283-5525-4bef-8e96-abced54c6a4a,c8364283-5525-4bef-8e96-abced54c6a4a,1,0,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,1,0,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,1,0,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,1,0,bcc25539-c6ca-40d0-84fd-53c3caf1aec7,bcc25539-c6ca-40d0-84fd-53c3caf1aec7,1,0,577f2671-7d38-4806-b7ff-840d649e6d69,577f2671-7d38-4806-b7ff-840d649e6d69,1,0,4ff9376e-ffa6-48f3-bf26-b55ceb23da09,4ff9376e-ffa6-48f3-bf26-b55ceb23da09,1,0,de4c339a-a3cf-4b30-bcf2-ce86f5c2d3b0,de4c339a-a3cf-4b30-bcf2-ce86f5c2d3b0,1,0,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,1,0,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,1,0,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,1,0,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,1,0,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,1,0,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,1,0,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,1,0,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,1,0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1,0,b50f3157-3c3a-4553-a16a-7fcd660e2824,b50f3157-3c3a-4553-a16a-7fcd660e2824,1,0,19858faf-2bc5-4cfb-b258-cb101ab66e87,19858faf-2bc5-4cfb-b258-cb101ab66e87,1,0,f779f4a1-1fab-46d4-8043-ac25c247d361,f779f4a1-1fab-46d4-8043-ac25c247d361,1,0,308358bc-773a-43fa-adff-dcc5884a2bd4,308358bc-773a-43fa-adff-dcc5884a2bd4,1,0,ed541a1c-a842-40a9-b357-612db71ec32c,ed541a1c-a842-40a9-b357-612db71ec32c,1,0,b0e37495-7d9e-41d0-8225-652f9ac328cf,b0e37495-7d9e-41d0-8225-652f9ac328cf,1,0,3bd2e1c8-9ef3-449b-acf6-397b90669c49,3bd2e1c8-9ef3-449b-acf6-397b90669c49,1,0,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,1,0,f9865a2a-50e3-4f9c-a509-319be62dc468,f9865a2a-50e3-4f9c-a509-319be62dc468,1,0,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,1,0,766d8852-3bb4-4a6c-81c0-911722af4e8e,766d8852-3bb4-4a6c-81c0-911722af4e8e,1,0,f6dae699-06eb-41ef-878b-3fdfe1b1f213,f6dae699-06eb-41ef-878b-3fdfe1b1f213,1,0,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,1,0,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,1,0,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,1,0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,1,0,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,1,0,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,1,0,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,1,0,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,1,0,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,1,0,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,1,0,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,1,0,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,1,0,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,1,0,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,1,0,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,1,0,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,1,0,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1,0,8064eb3a-d56c-4517-9db0-b7300149c7c4,8064eb3a-d56c-4517-9db0-b7300149c7c4,1,0,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,1,0,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,1,0,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,1,0,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,1,0,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,1,0,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,1,0,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,1,0,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,1,0,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,1,0,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,1,0,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1,0,d6b72e00-018a-4fdc-b6a4-06dcecf89809,d6b72e00-018a-4fdc-b6a4-06dcecf89809,1,0,9f816562-57f0-473f-8c85-14f7521ffd7f,9f816562-57f0-473f-8c85-14f7521ffd7f,1,0,917b0acc-88fe-4afc-b19b-6da69e060393,917b0acc-88fe-4afc-b19b-6da69e060393,1,0,a091b76e-8ba4-4534-bbb0-9990e69b8603,a091b76e-8ba4-4534-bbb0-9990e69b8603,1,0,867ee5d2-7566-4052-a311-b56e7e46b90d,867ee5d2-7566-4052-a311-b56e7e46b90d,1,0,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,1,0,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,1,0,98422d20-9a71-40e4-966e-6958d44eaefb,98422d20-9a71-40e4-966e-6958d44eaefb,1,0,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,1,0,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,1,0,64e702e9-8934-4356-a1b2-be0e8b390630,64e702e9-8934-4356-a1b2-be0e8b390630,1,0,74880ac4-bdd3-48e6-82a0-a2103da42723,74880ac4-bdd3-48e6-82a0-a2103da42723,1,0,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,1,0,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,1,0,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,1,0,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,1,0,ddc6761c-a32a-41e1-b110-fdc39ad440d3,ddc6761c-a32a-41e1-b110-fdc39ad440d3,1,0,0b322ee2-b018-4d00-8f05-62ee16e519ff,0b322ee2-b018-4d00-8f05-62ee16e519ff,1,0,0866e282-055a-49bb-9aa5-b1af7c74c344,0866e282-055a-49bb-9aa5-b1af7c74c344,1,0,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,1,0,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,1,0,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,1,0,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,1,0,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,1,0,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,1,0,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,1,0,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,1,0,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,1,0,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,1,0,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,1,0,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,1,0,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,1,0,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,1,0,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,1,0,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,1,0,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,1,0,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,1,0,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,1,0,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,1,0,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,1,0,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,1,0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,1,0,71102d3f-f020-4d6f-9582-9a7eefb4e797,71102d3f-f020-4d6f-9582-9a7eefb4e797,1,0,53ef6849-a3f3-4171-9167-f349f2d6a736,53ef6849-a3f3-4171-9167-f349f2d6a736,1,0,3f588bd3-d461-42b7-8ab1-386af6399d56,3f588bd3-d461-42b7-8ab1-386af6399d56,1,0,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,1,0,8c576405-29c1-46b1-ab2e-40e52c21cab0,8c576405-29c1-46b1-ab2e-40e52c21cab0,1,0,b33a89da-8589-4902-83fa-6545e5fce23e,b33a89da-8589-4902-83fa-6545e5fce23e,1,0,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,1,0,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,1,0,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,1,0,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,1,0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,1,0,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,1,0,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,1,0,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,1,0,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,1,0,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,1,0,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,1,0,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,1,0,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,1,0,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,1,0,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,1,0,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,1,0,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,1,0,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,1,0,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,1,0,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,1,0,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,1,0,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,1,0,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,1,0,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,1,0,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,1,0,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,1,0,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,1,0,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,1,0,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,1,0,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,1,0,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,1,0,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,1,0,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,1,0,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,1,0,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file diff --git a/SSL/src/Constants/ВерсияКлассификатораБанковРФ/ВерсияКлассификатораБанковРФ.mdo b/SSL/src/Constants/ВерсияКлассификатораБанков/ВерсияКлассификатораБанков.mdo similarity index 91% rename from SSL/src/Constants/ВерсияКлассификатораБанковРФ/ВерсияКлассификатораБанковРФ.mdo rename to SSL/src/Constants/ВерсияКлассификатораБанков/ВерсияКлассификатораБанков.mdo index 24557092a..c78789435 100644 --- a/SSL/src/Constants/ВерсияКлассификатораБанковРФ/ВерсияКлассификатораБанковРФ.mdo +++ b/SSL/src/Constants/ВерсияКлассификатораБанков/ВерсияКлассификатораБанков.mdo @@ -5,10 +5,10 @@ - ВерсияКлассификатораБанковРФ + ВерсияКлассификатораБанков ru - Версия классификатора банков РФ + Версия классификатора банков Date diff --git a/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ValueManagerModule.bsl index 5778bdf9f..9b5a66b23 100644 --- a/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ValueManagerModule.bsl @@ -34,7 +34,6 @@ Константы.ИспользоватьОбщиеДополнительныеЗначения.Установить(Ложь); Константы.ИспользоватьОбщиеДополнительныеРеквизитыИСведения.Установить(Ложь); КонецЕсли; - КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Constants/ИспользоватьИнтеграцию1СБухфон/ИспользоватьИнтеграцию1СБухфон.mdo b/SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo similarity index 93% rename from SSL/src/Constants/ИспользоватьИнтеграцию1СБухфон/ИспользоватьИнтеграцию1СБухфон.mdo rename to SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo index fea56d2ca..62f1eb0bb 100644 --- a/SSL/src/Constants/ИспользоватьИнтеграцию1СБухфон/ИспользоватьИнтеграцию1СБухфон.mdo +++ b/SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo @@ -5,7 +5,7 @@ - ИспользоватьИнтеграцию1СБухфон + ИспользоватьОнлайнПоддержку ru Использовать онлайн-поддержку diff --git a/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ValueManagerModule.bsl index 27fddd10a..5def9a10c 100644 --- a/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ValueManagerModule.bsl @@ -5,7 +5,7 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс +#Область ОбработчикиСобытий Процедура ПриЗаписи(Отказ) @@ -15,13 +15,18 @@ // После того, как константа попадет в узел, должно быть включено // регламентное задание для периодической проверки контрагентов. - ИспользоватьСервис = ПроверкаКонтрагентов.ПроверкаКонтрагентовВключена(); - // Включаем/отключаем рег задание в зависимости от выбора пользователя. - РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное( - Метаданные.РегламентныеЗадания.ПроверкаКонтрагентов); + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ПроверкаКонтрагентов); + + СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(ПараметрыЗадания); + + Если СписокЗаданий.Количество() > 0 Тогда + + ИспользоватьСервис = ПроверкаКонтрагентов.ПроверкаКонтрагентовВключена(); + + РегламентноеЗадание = СписокЗаданий[0]; - Если РегламентноеЗадание <> Неопределено Тогда РегламентноеЗадание.Использование = ИспользоватьСервис; РегламентноеЗадание.Записать(); КонецЕсли; diff --git a/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ИспользоватьПроверкуКонтрагентов.mdo b/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ИспользоватьПроверкуКонтрагентов.mdo index c94b05f74..586941f2f 100644 --- a/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ИспользоватьПроверкуКонтрагентов.mdo +++ b/SSL/src/Constants/ИспользоватьПроверкуКонтрагентов/ИспользоватьПроверкуКонтрагентов.mdo @@ -10,6 +10,7 @@ ru Использовать сервис проверки данных по контрагенту + 0 - проверку никогда не включали; 1 - проверка включена; 2 - проверку отключили Number diff --git a/SSL/src/Constants/ИспользоватьРазделениеПоОбластямДанных/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьРазделениеПоОбластямДанных/ValueManagerModule.bsl index f55a88e93..26d85f130 100644 --- a/SSL/src/Constants/ИспользоватьРазделениеПоОбластямДанных/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьРазделениеПоОбластямДанных/ValueManagerModule.bsl @@ -20,7 +20,7 @@ // // Константа.ЭтоАвтономноеРабочееМесто -> ФО.РаботаВАвтономномРежиме // Константа.НеИспользоватьРазделениеПоОбластямДанных -> ФО.РаботаВЛокальномРежиме - // Константа.ИспользоватьРазделениеПоОбластямДанных -> ФО.РаботаВМоделиСервиса + // Константа.ИспользоватьРазделениеПоОбластямДанных -> ФО.РаботаВМоделиСервиса. // // Имена констант сохранены для обратной совместимости. @@ -45,14 +45,7 @@ Если Значение Тогда - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - - Обработчик.Модуль.ПриВключенииРазделенияПоОбластямДанных(); - - КонецЦикла; + ИнтеграцияСтандартныхПодсистем.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; diff --git a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl index 211ca869c..60f3be967 100644 --- a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl @@ -4,9 +4,9 @@ Процедура ПриЗаписи(Отказ) - Если Значение = Истина Тогда + Если Значение Тогда - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме.Установить(Не РазделениеВключено); Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса.Установить(РазделениеВключено); @@ -21,10 +21,17 @@ Возврат; КонецЕсли; - Если Значение = Истина Тогда - ОбменДаннымиСервер.ПриВключенииСинхронизацииДанных(Отказ); - Иначе - ОбменДаннымиСервер.ПриОтключенииСинхронизацииДанных(Отказ); + Если Не Значение + И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса.ПриОтключенииСинхронизацииДанных(Отказ); + КонецЕсли; + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание( + Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации); + Если Задание.Использование <> Значение Тогда + Задание.Использование = Значение; + Задание.Записать(); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Constants/ИспользоватьУдалениеПомеченныхОбъектов/ИспользоватьУдалениеПомеченныхОбъектов.mdo b/SSL/src/Constants/ИспользоватьУдалениеПомеченныхОбъектов/ИспользоватьУдалениеПомеченныхОбъектов.mdo new file mode 100644 index 000000000..4e3f41230 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьУдалениеПомеченныхОбъектов/ИспользоватьУдалениеПомеченныхОбъектов.mdo @@ -0,0 +1,19 @@ + + + + + + + + ИспользоватьУдалениеПомеченныхОбъектов + + ru + Использовать удаление помеченных объектов + + + Boolean + + + + Managed + diff --git a/SSL/src/Constants/ИспользуютсяПрофилиБезопасности/ValueManagerModule.bsl b/SSL/src/Constants/ИспользуютсяПрофилиБезопасности/ValueManagerModule.bsl index 3cf2d45a8..833fafef2 100644 --- a/SSL/src/Constants/ИспользуютсяПрофилиБезопасности/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользуютсяПрофилиБезопасности/ValueManagerModule.bsl @@ -11,9 +11,8 @@ КонецЕсли; Если Значение Тогда - - РаботаВБезопасномРежимеСлужебный.ПриВключенииИспользованияПрофилейБезопасности(); - + ИнтеграцияСтандартныхПодсистем.ПриВключенииИспользованияПрофилейБезопасности(); + РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности(); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/ValueManagerModule.bsl b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/ValueManagerModule.bsl index ca76efdb6..ab1f63c80 100644 --- a/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/ValueManagerModule.bsl +++ b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/ValueManagerModule.bsl @@ -2,6 +2,7 @@ #Область СлужебныйПрограммныйИнтерфейс +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт ОбменДаннымиСервер.ЗапросВнешнихРесурсовДляКаталогаСообщенийОбменаДанными(ЗапросыРазрешений, ЭтотОбъект); diff --git a/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl index ca76efdb6..ab1f63c80 100644 --- a/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl +++ b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl @@ -2,6 +2,7 @@ #Область СлужебныйПрограммныйИнтерфейс +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт ОбменДаннымиСервер.ЗапросВнешнихРесурсовДляКаталогаСообщенийОбменаДанными(ЗапросыРазрешений, ЭтотОбъект); diff --git a/SSL/src/Constants/НастройкиВыполненияРегламентныхЗаданий/НастройкиВыполненияРегламентныхЗаданий.mdo b/SSL/src/Constants/НастройкиВыполненияРегламентныхЗаданий/НастройкиВыполненияРегламентныхЗаданий.mdo deleted file mode 100644 index fbe30f0b7..000000000 --- a/SSL/src/Constants/НастройкиВыполненияРегламентныхЗаданий/НастройкиВыполненияРегламентныхЗаданий.mdo +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - НастройкиВыполненияРегламентныхЗаданий - - ru - Настройки выполнения регламентных заданий - - Только для файловой ИБ - - ValueStorage - - - - Managed - diff --git a/SSL/src/Constants/ОтправлятьПисьмаВФорматеHTML/ValueManagerModule.bsl b/SSL/src/Constants/ОтправлятьПисьмаВФорматеHTML/ValueManagerModule.bsl index 23c6517c5..c3a4d3e4a 100644 --- a/SSL/src/Constants/ОтправлятьПисьмаВФорматеHTML/ValueManagerModule.bsl +++ b/SSL/src/Constants/ОтправлятьПисьмаВФорматеHTML/ValueManagerModule.bsl @@ -12,16 +12,34 @@ Возврат; КонецЕсли; - // Переключение подписей всех учетных записей в обычный текст. - НастройкиУчетныхЗаписей = РегистрыСведений.НастройкиУчетныхЗаписейЭлектроннойПочты.СоздатьНаборЗаписей(); - НастройкиУчетныхЗаписей.Прочитать(); - Для каждого Настройка Из НастройкиУчетныхЗаписей Цикл - Настройка.ФорматПодписиДляНовыхСообщений = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; - Настройка.ФорматПодписиПриОтветеПересылке = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; - КонецЦикла; - Если НастройкиУчетныхЗаписей.Модифицированность() Тогда - НастройкиУчетныхЗаписей.Записать(); - КонецЕсли; + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Блокировка.Заблокировать(); + + // Переключение подписей всех учетных записей в обычный текст. + НастройкиУчетныхЗаписей = РегистрыСведений.НастройкиУчетныхЗаписейЭлектроннойПочты.СоздатьНаборЗаписей(); + НастройкиУчетныхЗаписей.Прочитать(); + Для каждого Настройка Из НастройкиУчетныхЗаписей Цикл + Настройка.ФорматПодписиДляНовыхСообщений = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; + Настройка.ФорматПодписиПриОтветеПересылке = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; + КонецЦикла; + Если НастройкиУчетныхЗаписей.Модифицированность() Тогда + НастройкиУчетныхЗаписей.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; КонецПроцедуры diff --git a/SSL/src/Constants/ПараметрыВариантовОтчетов/ПараметрыВариантовОтчетов.mdo b/SSL/src/Constants/ПараметрыВариантовОтчетов/ПараметрыВариантовОтчетов.mdo deleted file mode 100644 index a10f1f138..000000000 --- a/SSL/src/Constants/ПараметрыВариантовОтчетов/ПараметрыВариантовОтчетов.mdo +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - ПараметрыВариантовОтчетов - - ru - Параметры вариантов отчетов - - Структура хранения описана в процедуре ВариантыОтчетов.ЗаписатьПараметрыВариантовОтчетов(). - - ValueStorage - - true - - - Managed - diff --git a/SSL/src/Constants/ПараметрыДополнительныхРеквизитовИСведений/ПараметрыДополнительныхРеквизитовИСведений.mdo b/SSL/src/Constants/ПараметрыДополнительныхРеквизитовИСведений/ПараметрыДополнительныхРеквизитовИСведений.mdo deleted file mode 100644 index 3c19b900d..000000000 --- a/SSL/src/Constants/ПараметрыДополнительныхРеквизитовИСведений/ПараметрыДополнительныхРеквизитовИСведений.mdo +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - ПараметрыДополнительныхРеквизитовИСведений - - ru - Параметры дополнительных реквизитов и сведений - - - ValueStorage - - - ru - Используется для определения необходимости обновить наименования наборов и свойств при изменении представления соответствующих объектов метаданных со свойствами. - - - - Managed - diff --git a/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl b/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl deleted file mode 100644 index d39ad50a0..000000000 --- a/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl +++ /dev/null @@ -1,482 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Обновляет описание свойств видов доступа в -// параметрах ограничения доступа при изменении конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, -// устанавливается Истина, иначе не изменяется. -// -Процедура ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - СвойстваВидовДоступа = СвойстваВидовДоступа(); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Параметры = Неопределено; - ЕстьТекущиеИзменения = Ложь; - СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы("ПараметрыОграниченияДоступа", - "СвойстваВидовДоступа", СвойстваВидовДоступа, ЕстьТекущиеИзменения, ТолькоПроверка, Параметры); - - Если Не ТолькоПроверка Тогда - ЕстьИзмененияТиповГруппИЗначенийДоступа = ЕстьТекущиеИзменения - И (Не Параметры.Свойство("СвойстваВидовДоступа") - Или ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, Параметры.СвойстваВидовДоступа)); - - СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "ТипыГруппИЗначенийДоступа", - ?(ЕстьИзмененияТиповГруппИЗначенийДоступа, - Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), - Новый ФиксированнаяСтруктура()) ); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если ЕстьТекущиеИзменения Тогда - ЕстьИзменения = Истина; - КонецЕсли; - - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", "СвойстваВидовДоступа"); - КонецЕсли; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает свойства видов доступа, заполняемых при внедрении -// в процедуре ПриЗаполненииВидовДоступа общего модуля. -// УправлениеДоступомПереопределяемый и одноименных процедурах служебного события. -// -Функция СвойстваВидовДоступа() - - // 1. Заполнение данных, указанных при внедрении. - - ВидыДоступа = Новый ТаблицаЗначений; - ВидыДоступа.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); - ВидыДоступа.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - ВидыДоступа.Колонки.Добавить("ТипЗначений", Новый ОписаниеТипов("Тип")); - ВидыДоступа.Колонки.Добавить("ТипГруппЗначений", Новый ОписаниеТипов("Тип")); - ВидыДоступа.Колонки.Добавить("НесколькоГруппЗначений", Новый ОписаниеТипов("Булево")); - ВидыДоступа.Колонки.Добавить("ДополнительныеТипы", Новый ОписаниеТипов("ТаблицаЗначений")); - - ПользователиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииВидовДоступа(ВидыДоступа); - КонецЦикла; - - УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа); - - // Проверки: - // - тип значений доступа не указан для 2-х видов доступа - // - тип значений доступа Пользователи, ГруппыПользователей используется только для вида доступа Пользователи. - // Т тип значений доступа ВнешниеПользователи, ГруппыВнешнихПользователей используется только для вида доступа - // ВнешниеПользователи. - // И имена видов доступа Объект, Условие, НастройкиПрав, ПравоЧтения, ПравоИзменения не указаны. - // Т тип групп значений не совпадает с типом значений. - - // 2. Подготовка различных коллекций свойств видов доступа, используемых при работе программы. - МассивСвойств = Новый Массив; - ПоСсылкам = Новый Соответствие; - ПоИменам = Новый Соответствие; - ПоТипамЗначений = Новый Соответствие; - ПоТипамГруппИЗначений = Новый Соответствие; - - ЗначенияДоступаСГруппами = Новый Структура; - ЗначенияДоступаСГруппами.Вставить("ПоТипам", Новый Соответствие); - ЗначенияДоступаСГруппами.Вставить("ПоТипамСсылок", Новый Соответствие); - ЗначенияДоступаСГруппами.Вставить("ИменаТаблиц", Новый Массив); - ЗначенияДоступаСГруппами.Вставить("ТипыГруппЗначений", Новый Соответствие); - - Параметры = Новый Структура; - Параметры.Вставить("ОпределяемыеТипыЗначенийДоступа", - УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы("ОпределяемыйТип.ЗначениеДоступа")); - - ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ЗаполнитьСвойстваВидаДоступа - |общего модуля УправлениеДоступомПереопределяемый. - | - |'"); - - Параметры.Вставить("ЗаголовокОшибки", ЗаголовокОшибки); - - Параметры.Вставить("ТипыПодпискиОбновитьГруппыЗначенийДоступа", - УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы( - "ОпределяемыйТип.ЗначениеДоступаСГруппамиЗначенийДоступаОбъект")); - - ВсеИменаВидовДоступа = Новый Соответствие; - ВсеИменаВидовДоступа.Вставить(ВРег("Объект"), Истина); - ВсеИменаВидовДоступа.Вставить(ВРег("Условие"), Истина); - ВсеИменаВидовДоступа.Вставить(ВРег("НастройкиПрав"), Истина); - ВсеИменаВидовДоступа.Вставить(ВРег("ПравоЧтения"), Истина); - ВсеИменаВидовДоступа.Вставить(ВРег("ПравоИзменения"), Истина); - - ВсеТипыЗначений = Новый Соответствие; - ВсеТипыГруппЗначений = Новый Соответствие; - - Для каждого ВидДоступа Из ВидыДоступа Цикл - - Если ВсеИменаВидовДоступа[ВРег(ВидДоступа.Имя)] <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Имя вида доступа ""%1"" уже определено.'"), - ВидДоступа.Имя); - КонецЕсли; - - // Проверка повторения типов значений и групп. - ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыЗначений, Параметры); - ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); - // Проверка пересечения типов значений и групп. - ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); - ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); - - Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл - // Проверка повторения типов значений и групп. - ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыЗначений, Параметры); - ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); - // Проверка пересечения типов значений и групп. - ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); - ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); - КонецЦикла; - - ПустаяСсылкаТипаЗначений = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - Метаданные.НайтиПоТипу(ВидДоступа.ТипЗначений).ПолноеИмя()).ПустаяСсылка(); - - Свойства = Новый Структура; - Свойства.Вставить("Имя", ВидДоступа.Имя); - Свойства.Вставить("Ссылка", ПустаяСсылкаТипаЗначений); - Свойства.Вставить("Представление", ВидДоступа.Представление); - Свойства.Вставить("ТипЗначений", ВидДоступа.ТипЗначений); - Свойства.Вставить("ТипГруппЗначений", ВидДоступа.ТипГруппЗначений); - Свойства.Вставить("НесколькоГруппЗначений", ВидДоступа.НесколькоГруппЗначений); - Свойства.Вставить("ДополнительныеТипы", Новый Массив); - Свойства.Вставить("ТипыВыбираемыхЗначений", Новый Массив); - - МассивСвойств.Добавить(Свойства); - ПоИменам.Вставить(Свойства.Имя, Свойства); - ПоСсылкам.Вставить(ПустаяСсылкаТипаЗначений, Свойства); - ПоТипамЗначений.Вставить(Свойства.ТипЗначений, Свойства); - ПоТипамГруппИЗначений.Вставить(Свойства.ТипЗначений, Свойства); - Если Свойства.ТипГруппЗначений <> Тип("Неопределено") Тогда - ПоТипамГруппИЗначений.Вставить(Свойства.ТипГруппЗначений, Свойства); - КонецЕсли; - ЗаполнитьЗначенияДоступаСГруппами(Свойства, ЗначенияДоступаСГруппами, Свойства, Параметры); - - Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл - Элемент = Новый Структура; - Элемент.Вставить("ТипЗначений", Строка.ТипЗначений); - Элемент.Вставить("ТипГруппЗначений", Строка.ТипГруппЗначений); - Элемент.Вставить("НесколькоГруппЗначений", Строка.НесколькоГруппЗначений); - Свойства.ДополнительныеТипы.Добавить(Элемент); - ПоТипамЗначений.Вставить(Строка.ТипЗначений, Свойства); - ПоТипамГруппИЗначений.Вставить(Строка.ТипЗначений, Свойства); - Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда - ПоТипамГруппИЗначений.Вставить(Строка.ТипГруппЗначений, Свойства); - КонецЕсли; - ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры); - КонецЦикла; - - КонецЦикла; - - БезГруппДляЗначенияДоступа = Новый Массив; - СОднойГруппойДляЗначенияДоступа = Новый Массив; - ТипыЗначенийДоступаСГруппами = Новый Соответствие; - - ВидыДоступаСГруппами = Новый Соответствие; - - Для каждого КлючИЗначение Из ЗначенияДоступаСГруппами.ПоТипамСсылок Цикл - ИмяВидаДоступа = КлючИЗначение.Значение.Имя; - ВидыДоступаСГруппами.Вставить(ИмяВидаДоступа, Истина); - - ПустаяСсылка = УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(КлючИЗначение.Ключ); - ТипыЗначенийДоступаСГруппами.Вставить(ТипЗнч(ПустаяСсылка), ПустаяСсылка); - - Если НЕ КлючИЗначение.Значение.НесколькоГруппЗначений - И СОднойГруппойДляЗначенияДоступа.Найти(ИмяВидаДоступа) = Неопределено Тогда - - СОднойГруппойДляЗначенияДоступа.Добавить(ИмяВидаДоступа); - КонецЕсли; - КонецЦикла; - - ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.Пользователи"), - Справочники.Пользователи.ПустаяСсылка()); - - ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыПользователей"), - Справочники.ГруппыПользователей.ПустаяСсылка()); - - ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ВнешниеПользователи"), - Справочники.ВнешниеПользователи.ПустаяСсылка()); - - ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыВнешнихПользователей"), - Справочники.ГруппыВнешнихПользователей.ПустаяСсылка()); - - Для каждого СвойстваВидаДоступа Из МассивСвойств Цикл - Если ВидыДоступаСГруппами.Получить(СвойстваВидаДоступа.Имя) <> Неопределено Тогда - Продолжить; - КонецЕсли; - Если СвойстваВидаДоступа.Имя = "Пользователи" - ИЛИ СвойстваВидаДоступа.Имя = "ВнешниеПользователи" Тогда - Продолжить; - КонецЕсли; - БезГруппДляЗначенияДоступа.Добавить(СвойстваВидаДоступа.Имя); - КонецЦикла; - - СвойстваВидовДоступа = Новый Структура; - СвойстваВидовДоступа.Вставить("Массив", МассивСвойств); - СвойстваВидовДоступа.Вставить("ПоИменам", ПоИменам); - СвойстваВидовДоступа.Вставить("ПоСсылкам", ПоСсылкам); - СвойстваВидовДоступа.Вставить("ПоТипамЗначений", ПоТипамЗначений); - СвойстваВидовДоступа.Вставить("ПоТипамГруппИЗначений", ПоТипамГруппИЗначений); - СвойстваВидовДоступа.Вставить("ЗначенияДоступаСГруппами", ЗначенияДоступаСГруппами); - СвойстваВидовДоступа.Вставить("БезГруппДляЗначенияДоступа", БезГруппДляЗначенияДоступа); - СвойстваВидовДоступа.Вставить("СОднойГруппойДляЗначенияДоступа", СОднойГруппойДляЗначенияДоступа); - СвойстваВидовДоступа.Вставить("ТипыЗначенийДоступаСГруппами", ТипыЗначенийДоступаСГруппами); - - // Проверка совместимости перехода на новые версии программы. - Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить( - ТипЗнч(ПланыВидовХарактеристик.УдалитьВидыДоступа.ПустаяСсылка())) = Неопределено Тогда - - ОписаниеОшибки = - НСтр("ru = 'Тип ПланВидовХарактеристикСсылка.УдалитьВидыДоступа, - |необходимый для перехода на новые версии программы - |не указан в определяемом типе ""Значение доступа"".'"); - - ВызватьИсключение Параметры.ЗаголовокОшибки + ОписаниеОшибки; - КонецЕсли; - - Возврат ОбщегоНазначения.ФиксированныеДанные(СвойстваВидовДоступа); - -КонецФункции - -Процедура ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры) - - Если Свойства.Имя = "Пользователи" Тогда - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.Пользователи")); - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыПользователей")); - Возврат; - КонецЕсли; - - Если Свойства.Имя = "ВнешниеПользователи" Тогда - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ВнешниеПользователи")); - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыВнешнихПользователей")); - Возврат; - КонецЕсли; - - Если Строка.ТипГруппЗначений = Тип("Неопределено") Тогда - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипЗначений); - Возврат; - КонецЕсли; - - ТипСсылки = Строка.ТипЗначений; - - МетаданныеТипаЗначений = Метаданные.НайтиПоТипу(Строка.ТипЗначений); - Если ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда - ТипОбъекта = ТипСсылки; - Иначе - ТипОбъекта = СтандартныеПодсистемыСервер.ТипОбъектаИлиНабораЗаписейОбъектаМетаданных( - МетаданныеТипаЗначений); - КонецЕсли; - - Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда - ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипГруппЗначений); - КонецЕсли; - - ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипСсылки, Свойства); - ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипОбъекта, Свойства); - ЗначенияДоступаСГруппами.ПоТипамСсылок.Вставить(ТипСсылки, Свойства); - ЗначенияДоступаСГруппами.ИменаТаблиц.Добавить(МетаданныеТипаЗначений.ПолноеИмя()); - - МетаданныеТипаГруппЗначений = Метаданные.НайтиПоТипу(Строка.ТипГруппЗначений); - ПустаяСсылкаТипаГруппЗначений = - УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаГруппЗначений); - - ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить(ТипСсылки, ПустаяСсылкаТипаГруппЗначений); - ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить( - УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаЗначений), - ПустаяСсылкаТипаГруппЗначений); - - // Проверка наличия типа ссылки в соответствующих объектах метаданных. - Если Параметры.ТипыПодпискиОбновитьГруппыЗначенийДоступа.Получить(ТипОбъекта) = Неопределено - И НЕ ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда - - ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Тип значения доступа ""%1"", использующий группы значений, не указан - |в определяемом типе ""Значение доступа с группами значений доступа объект"".'"), - Строка(ТипОбъекта)); - КонецЕсли; - -КонецПроцедуры - -Процедура ПроверитьТип(ВидДоступа, Тип, ВсеТипы, Параметры, ПроверкаТиповГрупп = Ложь, ПроверкаПересечения = Ложь) - - Если Тип = Тип("Неопределено") Тогда - Если ПроверкаТиповГрупп Тогда - Возврат; - КонецЕсли; - ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для вида доступа ""%1"" не указан тип значений доступа.'"), - ВидДоступа.Имя); - КонецЕсли; - - // Проверка, что указан тип ссылки. - Если НЕ ОбщегоНазначения.ЭтоСсылка(Тип) Тогда - Если ПроверкаТиповГрупп Тогда - ОписаниеОшибки = - НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". - |Однако это не тип ссылки.'"); - Иначе - ОписаниеОшибки = - НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". - |Однако это не тип ссылки.'"); - КонецЕсли; - ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ОписаниеОшибки, Тип, ВидДоступа.Имя); - КонецЕсли; - - // Проверка повторения и пересечения типов значений и групп значений. - ДляТогоЖеВидаДоступаОшибкиНет = Ложь; - - Если ПроверкаТиповГрупп Тогда - Если ПроверкаПересечения Тогда - ОписаниеОшибки = - НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". - |Для вида доступа ""%3"" его нельзя указать, как тип групп значений.'"); - Иначе - ДляТогоЖеВидаДоступаОшибкиНет = Истина; - ОписаниеОшибки = - НСтр("ru = 'Тип групп значений ""%1"" уже указан для вида доступа ""%2"". - |Для вида доступа ""%3"" его нельзя указать.'"); - КонецЕсли; - Иначе - Если ПроверкаПересечения Тогда - ОписаниеОшибки = - НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". - |Для вида доступа ""%3"" его нельзя указать, как тип значений.'"); - Иначе - ОписаниеОшибки = - НСтр("ru = 'Тип значений ""%1"" уже указан для вида доступа ""%2"". - |Для вида доступа ""%3"" его нельзя указать.'"); - КонецЕсли; - КонецЕсли; - - Если ВсеТипы.Получить(Тип) <> Неопределено Тогда - Если НЕ (ДляТогоЖеВидаДоступаОшибкиНет И ВидДоступа.Имя = ВсеТипы.Получить(Тип)) Тогда - ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ОписаниеОшибки, Тип, ВсеТипы.Получить(Тип), ВидДоступа.Имя); - КонецЕсли; - ИначеЕсли НЕ ПроверкаПересечения Тогда - ВсеТипы.Вставить(Тип, ВидДоступа.Имя); - КонецЕсли; - - // Проверка состава определяемых типов. - ОписаниеОшибки = ""; - Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить(Тип) = Неопределено Тогда - Если ПроверкаТиповГрупп Тогда - ОписаниеОшибки = - НСтр("ru = 'Тип групп значений доступа ""%1"" вида доступа ""%2"" - |не указан в определяемом типе ""Значение доступа"".'"); - Иначе - ОписаниеОшибки = - НСтр("ru = 'Тип значений доступа ""%1"" вида доступа ""%2"" - |не указан в определяемом типе ""Значение доступа"".'"); - КонецЕсли; - КонецЕсли; - - Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда - ВызватьИсключение Параметры.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ОписаниеОшибки, Тип, ВидДоступа.Имя); - КонецЕсли; - -КонецПроцедуры - -Процедура ДобавитьВМассив(Массив, Значение) - - Если Массив.Найти(Значение) = Неопределено Тогда - Массив.Добавить(Значение); - КонецЕсли; - -КонецПроцедуры - -// Проверяет наличие изменений типов групп и значений доступа. -Функция ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, Сохраненные) - - Если НЕ ТипЗнч(Сохраненные) = Тип("ФиксированнаяСтруктура") - ИЛИ НЕ Сохраненные.Свойство("ПоТипамЗначений") - ИЛИ НЕ Сохраненные.Свойство("ТипыЗначенийДоступаСГруппами") - ИЛИ НЕ ТипЗнч(Сохраненные.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") - ИЛИ НЕ ТипЗнч(Сохраненные.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") - ИЛИ НЕ СвойстваВидовДоступа.Свойство("ПоТипамЗначений") - ИЛИ НЕ СвойстваВидовДоступа.Свойство("ТипыЗначенийДоступаСГруппами") - ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") - ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") Тогда - - Возврат Истина; - КонецЕсли; - - Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ПоТипамЗначений, Сохраненные.ПоТипамЗначений) Тогда - Возврат Истина; - КонецЕсли; - - Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами, - Сохраненные.ТипыЗначенийДоступаСГруппами) Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция КлючиСоответствийОтличаются(Новое, Старое) - - Если Новое.Количество() <> Старое.Количество() Тогда - Возврат Истина; - КонецЕсли; - - Для каждого КлючИЗначение Из Новое Цикл - Если Старое.Получить(КлючИЗначение.Ключ) = Неопределено Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/Constants/ПараметрыОграниченияДоступа/ПараметрыОграниченияДоступа.mdo b/SSL/src/Constants/ПараметрыОграниченияДоступа/ПараметрыОграниченияДоступа.mdo deleted file mode 100644 index e9dbbafa2..000000000 --- a/SSL/src/Constants/ПараметрыОграниченияДоступа/ПараметрыОграниченияДоступа.mdo +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - ПараметрыОграниченияДоступа - - ru - Параметры ограничения доступа - - - ValueStorage - - - - Managed - diff --git a/SSL/src/Constants/ПараметрыПодключаемыхКоманд/ПараметрыПодключаемыхКоманд.mdo b/SSL/src/Constants/ПараметрыПодключаемыхКоманд/ПараметрыПодключаемыхКоманд.mdo deleted file mode 100644 index afd800980..000000000 --- a/SSL/src/Constants/ПараметрыПодключаемыхКоманд/ПараметрыПодключаемыхКоманд.mdo +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - ПараметрыПодключаемыхКоманд - - ru - Параметры подключаемых команд - - Структура хранения описана в ПодключаемыеКоманды.ОперативноеОбновлениеОбщихДанных(). - - ValueStorage - - - - Managed - diff --git a/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl b/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl deleted file mode 100644 index 2c9b114d3..000000000 --- a/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl +++ /dev/null @@ -1,369 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Процедура обновляет общие параметры работы пользователей при изменении конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, -// устанавливается Истина, иначе не изменяется. -// -Процедура ОбновитьОбщиеПараметры(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - НазначениеРолей = НазначениеРолей(); - ПроверитьНазначениеРолей(НазначениеРолей); - - ВсеРоли = ВсеРоли(); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыРаботыПользователей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Параметры = Неопределено; - ЕстьТекущиеИзменения = Ложь; - СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы("ПараметрыРаботыПользователей", - "НазначениеРолей", НазначениеРолей, ЕстьТекущиеИзменения, ТолькоПроверка, Параметры); - - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы("ПараметрыРаботыПользователей", - "ВсеРоли", ВсеРоли, ЕстьТекущиеИзменения, ТолькоПроверка, Параметры); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если ЕстьТекущиеИзменения Тогда - ЕстьИзменения = Истина; - КонецЕсли; - - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыРаботыПользователей", "НазначениеРолей"); - - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыРаботыПользователей", "ВсеРоли"); - КонецЕсли; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Проверяет корректность заполнения назначения ролей, а также корректность прав в ролях по назначению. -Процедура ПроверитьНазначениеРолей(НазначениеРолей = Неопределено, ПроверитьВсе = Ложь, СписокОшибок = Неопределено) Экспорт - - Если НазначениеРолей = Неопределено Тогда - НазначениеРолей = НазначениеРолей(); - КонецЕсли; - - ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый.'"); - - ТекстОшибки = ""; - - Назначение = Новый Структура; - Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл - Роли = Новый Соответствие; - Для Каждого КлючИЗначение Из ОписаниеНазначенияРолей.Значение Цикл - Роль = Метаданные.Роли.Найти(КлючИЗначение.Ключ); - Если Роль = Неопределено Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В метаданных не найдена роль ""%1"", - |указанная в назначении %2.'"), - КлючИЗначение.Ключ, ОписаниеНазначенияРолей.Ключ); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(Неопределено, ОписаниеОшибки); - КонецЕсли; - Продолжить; - КонецЕсли; - Роли.Вставить(Роль, Истина); - Для Каждого ОписаниеНазначения Из Назначение Цикл - Если ОписаниеНазначения.Значение.Получить(Роль) = Неопределено Тогда - Продолжить; - КонецЕсли; - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Роль ""%1"" указана более чем в одном назначении: - |%2, %3.'"), - Роль.Имя, ОписаниеНазначенияРолей.Ключ, ОписаниеНазначения.Ключ); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(Роль, ОписаниеОшибки); - КонецЕсли; - КонецЦикла; - КонецЦикла; - Назначение.Вставить(ОписаниеНазначенияРолей.Ключ, Роли); - КонецЦикла; - - // Проверка ролей внешних пользователей. - НедоступныеПрава = Новый Массив; - НедоступныеПрава.Добавить("Администрирование"); - НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); - НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); - НедоступныеПрава.Добавить("АдминистрированиеДанных"); - - ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.ТолькоДляВнешнихПользователей, ТекстОшибки, - НСтр("ru = 'При проверке ролей только для внешних пользователей найдены ошибки:'"), СписокОшибок); - - ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки, - НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок); - - // Проверка ролей пользователей. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Или ПроверитьВсе Тогда - Роли = Новый Соответствие; - Для Каждого Роль Из Метаданные.Роли Цикл - Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено - Или Назначение.ТолькоДляПользователейСистемы.Получить(Роль) <> Неопределено Тогда - Продолжить; - КонецЕсли; - Роли.Вставить(Роль, Истина); - КонецЦикла; - НедоступныеПрава = Новый Массив; - НедоступныеПрава.Добавить("Администрирование"); - НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); - НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); - НедоступныеПрава.Добавить("ТолстыйКлиент"); - НедоступныеПрава.Добавить("ВнешнееСоединение"); - НедоступныеПрава.Добавить("Automation"); - НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОбработок"); - НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОтчетов"); - НедоступныеПрава.Добавить("РежимВсеФункции"); - - НеразделенныеДанные = НеразделенныеДанные(); - ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки, - НСтр("ru = 'При проверке ролей для пользователей приложения найдены ошибки:'"), СписокОшибок, НеразделенныеДанные); - КонецЕсли; - Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или ПроверитьВсе Тогда - Роли = Новый Соответствие; - Для Каждого Роль Из Метаданные.Роли Цикл - Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено - Или Назначение.ТолькоДляВнешнихПользователей.Получить(Роль) <> Неопределено Тогда - Продолжить; - КонецЕсли; - Роли.Вставить(Роль, Истина); - КонецЦикла; - НедоступныеПрава = Новый Массив; - НедоступныеПрава.Добавить("Администрирование"); - НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации"); - НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных"); - - ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки, - НСтр("ru = 'При проверке ролей для пользователей найдены ошибки:'"), СписокОшибок); - - ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки, - НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок); - КонецЕсли; - - Если ЗначениеЗаполнено(ТекстОшибки) Тогда - ВызватьИсключение ЗаголовокОшибки + ТекстОшибки; - КонецЕсли; - -КонецПроцедуры - -// Возвращает назначение ролей, определенное разработчиком. -// См. комментарий к процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый. -// -// Возвращаемое значение: -// ФиксированнаяСтруктура - со свойствами: -// * ТолькоДляАдминистраторовСистемы - ФиксированноеСоответствие - со свойствами: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. -// * ТолькоДляПользователейСистемы - ФиксированноеСоответствие - со свойствами: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. -// * ТолькоДляВнешнихПользователей - ФиксированноеСоответствие - со свойствами: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. -// * СовместноДляПользователейИВнешнихПользователей - ФиксированноеСоответствие - со свойствами: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. -// -Функция НазначениеРолей() Экспорт - - НазначениеРолей = Пользователи.НазначениеРолей(); - - Назначение = Новый Структура; - Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл - Имена = Новый Соответствие; - Для Каждого Имя Из ОписаниеНазначенияРолей.Значение Цикл - Имена.Вставить(Имя, Истина); - КонецЦикла; - Назначение.Вставить(ОписаниеНазначенияРолей.Ключ, Новый ФиксированноеСоответствие(Имена)); - КонецЦикла; - - Возврат Новый ФиксированнаяСтруктура(Назначение); - -КонецФункции - -Процедура ПроверитьСоставПравРолей(НедоступныеПрава, ОписаниеРолей, ОбщийТекстОшибки, ЗаголовокОшибки, СписокОшибок, НеразделенныеДанные = Неопределено) - - ТекстОшибки = ""; - - Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл - Роль = ОписаниеРоли.Ключ; - Для Каждого НедоступноеПраво Из НедоступныеПрава Цикл - Если ПравоДоступа(НедоступноеПраво, Метаданные, Роль) Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Роль ""%1"" содержит недоступное право %2.'"), - Роль, НедоступноеПраво); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(Роль, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); - КонецЕсли; - КонецЕсли; - КонецЦикла; - Если НеразделенныеДанные = Неопределено Тогда - Продолжить; - КонецЕсли; - Для Каждого СвойстваДанных Из НеразделенныеДанные Цикл - ОбъектМетаданных = СвойстваДанных.Значение; - Если Не ПравоДоступа("Чтение", ОбъектМетаданных, Роль) Тогда - Продолжить; - КонецЕсли; - Если ПравоДоступа("Изменение", ОбъектМетаданных, Роль) Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Роль ""%1"" содержит право Изменение неразделенного объекта %2.'"), - Роль, ОбъектМетаданных.ПолноеИмя()); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); - КонецЕсли; - КонецЕсли; - Если СвойстваДанных.Представление = "" Тогда - Продолжить; // Не ссылочный объект метаданных. - КонецЕсли; - Если ПравоДоступа("Добавление", ОбъектМетаданных, Роль) Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Роль ""%1"" содержит право Добавление неразделенного объекта %2.'"), - Роль, ОбъектМетаданных.ПолноеИмя()); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); - КонецЕсли; - КонецЕсли; - Если ПравоДоступа("Удаление", ОбъектМетаданных, Роль) Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Роль ""%1"" содержит право Удаление неразделенного объекта %2.'"), - Роль, ОбъектМетаданных.ПолноеИмя()); - Если СписокОшибок = Неопределено Тогда - ТекстОшибки = ТекстОшибки + Символы.ПС + ОписаниеОшибки; - Иначе - СписокОшибок.Добавить(ОбъектМетаданных, ЗаголовокОшибки + Символы.ПС + ОписаниеОшибки); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - Если ЗначениеЗаполнено(ТекстОшибки) Тогда - ОбщийТекстОшибки = ОбщийТекстОшибки + Символы.ПС + Символы.ПС - + ЗаголовокОшибки + ТекстОшибки; - КонецЕсли; - -КонецПроцедуры - -Функция НеразделенныеДанные() - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - Возврат Неопределено; - КонецЕсли; - - Список = Новый СписокЗначений; - - ВидыМетаданных = Новый Массив; - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыОбмена, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Константы, Ложь)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Справочники, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Последовательности, Ложь)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Документы, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыВидовХарактеристик, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыСчетов, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.ПланыВидовРасчета, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.БизнесПроцессы, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.Задачи, Истина)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыСведений, Ложь)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыНакопления, Ложь)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыБухгалтерии, Ложь)); - ВидыМетаданных.Добавить(Новый Структура("Вид, Ссылочный" , Метаданные.РегистрыРасчета, Ложь)); - - УстановитьПривилегированныйРежим(Истина); - - МодульРаботаВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаПовтИсп"); - МодельДанных = МодульРаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); - - РазделенныеОбъектыМетаданных = Новый Соответствие; - Для Каждого ЭлементМоделиДанных Из МодельДанных Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ЭлементМоделиДанных.Ключ); - РазделенныеОбъектыМетаданных.Вставить(ОбъектМетаданных, Истина); - КонецЦикла; - - Для Каждого ОписаниеВида Из ВидыМетаданных Цикл // По видам метаданных. - Для Каждого ОбъектМетаданных Из ОписаниеВида.Вид Цикл // По объектам вида. - - Если РазделенныеОбъектыМетаданных.Получить(ОбъектМетаданных) <> Неопределено Тогда - Продолжить; - КонецЕсли; - Список.Добавить(ОбъектМетаданных, ?(ОписаниеВида.Ссылочный, "Ссылочный", "")); - КонецЦикла; - КонецЦикла; - - Возврат Список; - -КонецФункции - -Функция ВсеРоли() - - Соответствие = Новый Соответствие; - - Таблица = Новый ТаблицаЗначений; - Таблица.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(256))); - - Для каждого Роль Из Метаданные.Роли Цикл - ИмяРоли = Роль.Имя; - - Соответствие.Вставить(ИмяРоли, Роль.Синоним); - Таблица.Добавить().Имя = ИмяРоли; - КонецЦикла; - - Таблица.Сортировать("Имя"); - - ВсеРоли = Новый Структура; - ВсеРоли.Вставить("Массив", Новый ФиксированныйМассив(Таблица.ВыгрузитьКолонку("Имя"))); - ВсеРоли.Вставить("Соответствие", Новый ФиксированноеСоответствие(Соответствие)); - ВсеРоли.Вставить("Таблица", Таблица); - - Возврат ОбщегоНазначения.ФиксированныеДанные(ВсеРоли, Ложь); - -КонецФункции - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/Constants/ПараметрыРаботыПользователей/ПараметрыРаботыПользователей.mdo b/SSL/src/Constants/ПараметрыРаботыПользователей/ПараметрыРаботыПользователей.mdo deleted file mode 100644 index 06c692b24..000000000 --- a/SSL/src/Constants/ПараметрыРаботыПользователей/ПараметрыРаботыПользователей.mdo +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - ПараметрыРаботыПользователей - - ru - Параметры работы пользователей - - - ValueStorage - - - - Managed - diff --git a/SSL/src/Constants/ПараметрыСлужебныхСобытий/ValueManagerModule.bsl b/SSL/src/Constants/ПараметрыСлужебныхСобытий/ValueManagerModule.bsl deleted file mode 100644 index 41f33f4df..000000000 --- a/SSL/src/Constants/ПараметрыСлужебныхСобытий/ValueManagerModule.bsl +++ /dev/null @@ -1,62 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Процедура обновляет параметры программных событий при изменении конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, -// устанавливается Истина, иначе не изменяется. -// -Процедура Обновить(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - ОбработчикиСобытий = СтандартныеПодсистемыСервер.ОбработчикиСобытий(); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыСлужебныхСобытий"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - ЕстьТекущиеИзменения = Ложь; - СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы("ПараметрыСлужебныхСобытий", - "ОбработчикиСобытий", ОбработчикиСобытий, ЕстьТекущиеИзменения, ТолькоПроверка); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если ЕстьТекущиеИзменения Тогда - ЕстьИзменения = Истина; - КонецЕсли; - - Если Не (ТолькоПроверка И ЕстьТекущиеИзменения) Тогда - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыСлужебныхСобытий", "ОбработчикиСобытий"); - КонецЕсли; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/Constants/ПараметрыСлужебныхСобытий/ПараметрыСлужебныхСобытий.mdo b/SSL/src/Constants/ПараметрыСлужебныхСобытий/ПараметрыСлужебныхСобытий.mdo deleted file mode 100644 index bcc18cb53..000000000 --- a/SSL/src/Constants/ПараметрыСлужебныхСобытий/ПараметрыСлужебныхСобытий.mdo +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - ПараметрыСлужебныхСобытий - - ru - Параметры служебных событий - - - ValueStorage - - - - Managed - diff --git a/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo index 1e49c3b13..fc37cfca0 100644 --- a/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo +++ b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo @@ -16,6 +16,10 @@ 2 + + ru + Добавляется автоматически к кодам элементов справочников и номерам документов для того, чтобы различать программы, в которых они были введены, и избежать дублирования данных. + Managed diff --git a/SSL/src/Constants/РазделыОписанияИзмененийСистемы/РазделыОписанияИзмененийСистемы.mdo b/SSL/src/Constants/РазделыОписанияИзмененийСистемы/РазделыОписанияИзмененийСистемы.mdo deleted file mode 100644 index 7043f78ef..000000000 --- a/SSL/src/Constants/РазделыОписанияИзмененийСистемы/РазделыОписанияИзмененийСистемы.mdo +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - РазделыОписанияИзмененийСистемы - - ru - Разделы описания изменений системы - - - ValueStorage - - - ru - Список всех версий, для которых есть описания изменений системы - - - - Managed - diff --git a/SSL/src/Constants/ВнутреннийАдресМенеджераСервиса/ВнутреннийАдресМенеджераСервиса.mdo b/SSL/src/Constants/УдалитьВнутреннийАдресМенеджераСервиса/УдалитьВнутреннийАдресМенеджераСервиса.mdo similarity index 81% rename from SSL/src/Constants/ВнутреннийАдресМенеджераСервиса/ВнутреннийАдресМенеджераСервиса.mdo rename to SSL/src/Constants/УдалитьВнутреннийАдресМенеджераСервиса/УдалитьВнутреннийАдресМенеджераСервиса.mdo index 531283133..08a40ec50 100644 --- a/SSL/src/Constants/ВнутреннийАдресМенеджераСервиса/ВнутреннийАдресМенеджераСервиса.mdo +++ b/SSL/src/Constants/УдалитьВнутреннийАдресМенеджераСервиса/УдалитьВнутреннийАдресМенеджераСервиса.mdo @@ -5,10 +5,10 @@ - ВнутреннийАдресМенеджераСервиса + УдалитьВнутреннийАдресМенеджераСервиса ru - Внутренний адрес менеджера сервиса + (не используется) Внутренний адрес менеджера сервиса String diff --git a/SSL/src/Constants/КонечнаяТочкаМенеджераСервиса/КонечнаяТочкаМенеджераСервиса.mdo b/SSL/src/Constants/УдалитьКонечнаяТочкаМенеджераСервиса/УдалитьКонечнаяТочкаМенеджераСервиса.mdo similarity index 82% rename from SSL/src/Constants/КонечнаяТочкаМенеджераСервиса/КонечнаяТочкаМенеджераСервиса.mdo rename to SSL/src/Constants/УдалитьКонечнаяТочкаМенеджераСервиса/УдалитьКонечнаяТочкаМенеджераСервиса.mdo index d9d7f4a68..303e5f985 100644 --- a/SSL/src/Constants/КонечнаяТочкаМенеджераСервиса/КонечнаяТочкаМенеджераСервиса.mdo +++ b/SSL/src/Constants/УдалитьКонечнаяТочкаМенеджераСервиса/УдалитьКонечнаяТочкаМенеджераСервиса.mdo @@ -5,10 +5,10 @@ - КонечнаяТочкаМенеджераСервиса + УдалитьКонечнаяТочкаМенеджераСервиса ru - Конечная точка менеджера сервиса + (не используется) Конечная точка менеджера сервиса ExchangePlanRef.ОбменСообщениями diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form index 468179bd9..42fcd041b 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form @@ -94,12 +94,8 @@ <key>ru</key> - <value>Группа интервал времени</value> + <value>Интервал времени</value> - - ru - Группа интервал времени - ГруппаИнтервалВремениExtendedTooltip 25 @@ -164,20 +160,21 @@ Normal - - КоличествоФайловСНеизвлеченнымТекстом - 12 + + ИнформацияОКоличествеФайловСНеизвлеченнымТекстом + 32 + + <key>ru</key> + <value>Количество файлов с неизвлеченным текстом: 1234</value> + true true true - - КоличествоФайловСНеизвлеченнымТекстом - - КоличествоФайловСНеизвлеченнымТекстомExtendedTooltip - 29 + ИнформацияОКоличествеФайловСНеизвлеченнымТекстомРасширеннаяПодсказка + 34 Label true true @@ -186,24 +183,15 @@ - КоличествоФайловСНеизвлеченнымТекстомКонтекстноеМеню - 13 + ИнформацияОКоличествеФайловСНеизвлеченнымТекстомКонтекстноеМеню + 33 true - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal + Label + true + true + + Left @@ -254,12 +242,8 @@ <key>ru</key> - <value>Группа статуса</value> + <value>Статуса</value> - - ru - Группа статуса - ГруппаСтатусаExtendedTooltip 30 @@ -536,6 +520,59 @@ true + + ТекущееФоновоеЗадание + + <key>ru</key> + <value>Текущее фоновое задание</value> + + 8 + + String + + + + true + + + true + + + + ИдентификаторФоновогоЗадания + + <key>ru</key> + <value>Идентификатор фонового задания</value> + + 9 + + UUID + + + true + + + true + + + + АдресРезультата + + <key>ru</key> + <value>Адрес результата</value> + + 10 + + String + + + + true + + + true + + Старт diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl index 8519473aa..e33de343d 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl @@ -19,19 +19,14 @@ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("АвтоматическоеИзвлечениеТекстов", "ИнтервалВремениВыполнения", ИнтервалВремениВыполнения); КонецЕсли; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом(КоличествоФайловСНеизвлеченнымТекстом); - КонецЦикла; - КоличествоФайловВПорции = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АвтоматическоеИзвлечениеТекстов", "КоличествоФайловВПорции"); Если КоличествоФайловВПорции = 0 Тогда КоличествоФайловВПорции = 100; ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("АвтоматическоеИзвлечениеТекстов", "КоличествоФайловВПорции", КоличествоФайловВПорции); КонецЕсли; + Элементы.ИнформацияОКоличествеФайловСНеизвлеченнымТекстом.Заголовок = ТекстСостоянияПодсчет(); + КонецПроцедуры &НаКлиенте @@ -50,6 +45,8 @@ Возврат; КонецЕсли; + ОбновитьИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); + КонецПроцедуры &НаКлиенте @@ -124,6 +121,130 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиентеНаСервереБезКонтекста +Функция ТекстСостоянияПодсчет() + Возврат НСтр("ru = 'Поиск файлов с неизвлеченным текстом...'"); +КонецФункции + +&НаКлиенте +Процедура ОбновитьИнформациюОКоличествеФайловСНеизвлеченнымТекстом() + + ОтключитьОбработчикОжидания("НачатьОбновлениеИнформацииОКоличествеФайловСНеизвлеченнымТекстом"); + Если ТекущееФоновоеЗадание = "Подсчет" И ЗначениеЗаполнено(ИдентификаторФоновогоЗадания) Тогда + ПрерватьФоновоеЗадание(); + КонецЕсли; + ПодключитьОбработчикОжидания("НачатьОбновлениеИнформацииОКоличествеФайловСНеизвлеченнымТекстом", 2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьВыполнениеФоновогоЗадания() + Если ЗначениеЗаполнено(ИдентификаторФоновогоЗадания) И Не ЗаданиеВыполнено(ИдентификаторФоновогоЗадания) Тогда + ПодключитьОбработчикОжидания("ПроверитьВыполнениеФоновогоЗадания", 5, Истина); + Иначе + ИдентификаторФоновогоЗадания = ""; + Если ТекущееФоновоеЗадание = "Подсчет" Тогда + ВывестиИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); + Возврат; + КонецЕсли; + ТекущееФоновоеЗадание = ""; + ОбновитьИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПрерватьФоновоеЗадание() + ОтменитьВыполнениеЗадания(ИдентификаторФоновогоЗадания); + ОтключитьОбработчикОжидания("ПроверитьВыполнениеФоновогоЗадания"); + ТекущееФоновоеЗадание = ""; + ИдентификаторФоновогоЗадания = ""; +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ЗаданиеВыполнено(ИдентификаторФоновогоЗадания) + Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторФоновогоЗадания); +КонецФункции + +&НаСервереБезКонтекста +Процедура ОтменитьВыполнениеЗадания(ИдентификаторФоновогоЗадания) + Если ЗначениеЗаполнено(ИдентификаторФоновогоЗадания) Тогда + ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторФоновогоЗадания); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НачатьОбновлениеИнформацииОКоличествеФайловСНеизвлеченнымТекстом() + + Если ЗначениеЗаполнено(ИдентификаторФоновогоЗадания) Тогда + Элементы.ИнформацияОКоличествеФайловСНеизвлеченнымТекстом.Заголовок = ТекстСостоянияПодсчет(); + Возврат; + КонецЕсли; + + Элементы.ИнформацияОКоличествеФайловСНеизвлеченнымТекстом.Заголовок = ТекстСостоянияПодсчет(); + ДлительнаяОперация = ВыполнитьПоискФайловСНеизвлеченнымТекстом(); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииОбновленияИнформацииОКоличествеФайловСНеизвлеченнымТекстом", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОписаниеОповещения, ПараметрыОжидания); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииОбновленияИнформацииОКоличествеФайловСНеизвлеченнымТекстом(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(НСтр("ru = 'Поиск файлов с неизвлеченным текстом'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + "Ошибка", Результат.ПодробноеПредставлениеОшибки, , Истина); + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + КонецЕсли; + + ИдентификаторФоновогоЗадания = ""; + ВывестиИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВывестиИнформациюОКоличествеФайловСНеизвлеченнымТекстом() + + ИнформацияОКоличествеФайловСНеизвлеченнымТекстом = ПолучитьИзВременногоХранилища(АдресРезультата); + Если ИнформацияОКоличествеФайловСНеизвлеченнымТекстом = Неопределено Тогда + Возврат; + КонецЕсли; + + КоличествоФайловСНеизвлеченнымТекстом = ИнформацияОКоличествеФайловСНеизвлеченнымТекстом; + + Если КоличествоФайловСНеизвлеченнымТекстом > 0 Тогда + Элементы.ИнформацияОКоличествеФайловСНеизвлеченнымТекстом.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Количество файлов с неизвлеченным текстом: %1'"), + КоличествоФайловСНеизвлеченнымТекстом); + Иначе + Элементы.ИнформацияОКоличествеФайловСНеизвлеченнымТекстом.Заголовок = НСтр("ru = 'Количество файлов с неизвлеченным текстом: нет'"); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ВыполнитьПоискФайловСНеизвлеченнымТекстом() + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Поиск файлов с неизвлеченным текстом.'"); + + ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("РаботаСФайламиСлужебныйВызовСервера.ПолучитьКоличествоВерсийСНеизвлеченнымТекстом", Новый Структура, ПараметрыВыполнения); + ТекущееФоновоеЗадание = "Подсчет"; + ИдентификаторФоновогоЗадания = ДлительнаяОперация.ИдентификаторЗадания; + АдресРезультата = ДлительнаяОперация.АдресРезультата; + + Возврат ДлительнаяОперация; + +КонецФункции + + &НаСервереБезКонтекста Процедура ЗаписьЖурналаРегистрацииСервер(ТекстСообщения) @@ -171,8 +292,6 @@ ПрогнозируемоеВремяНачалаИзвлечения = ОбщегоНазначенияКлиент.ДатаСеанса() + ИнтервалВремениВыполнения; - Состояние(НСтр("ru = 'Начато извлечение текста'")); - Попытка РазмерПорцииТекущий = КоличествоФайловВПорции; @@ -182,7 +301,7 @@ МассивФайлов = ПолучитьФайлыДляИзвлеченияТекста(РазмерПорцииТекущий); Если МассивФайлов.Количество() = 0 Тогда - Состояние(НСтр("ru = 'Нет файлов для извлечения текста'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, НСтр("ru = 'Нет файлов для извлечения текста'")); Возврат; КонецЕсли; @@ -203,7 +322,7 @@ Прогресс = Индекс * 100 / МассивФайлов.Количество(); Состояние(НСтр("ru = 'Идет извлечение текста файла'"), Прогресс, ИмяСРасширением); - ФайловыеФункцииСлужебныйКлиент.ИзвлечьТекстВерсии( + РаботаСФайламиСлужебныйКлиент.ИзвлечьТекстВерсии( ФайлИлиВерсияФайла, АдресФайла, Расширение, УникальныйИдентификатор, Кодировка); Исключение @@ -231,7 +350,7 @@ |Обработано файлов: %1'"), МассивФайлов.Количество()); - Состояние(ТекстСообщения); + ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, ТекстСообщения); Исключение @@ -244,13 +363,13 @@ ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо); - Состояние(ТекстСообщения); + ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, ТекстСообщения); ЗаписьЖурналаРегистрацииСервер(ТекстСообщения); КонецПопытки; - ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(КоличествоФайловСНеизвлеченнымТекстом); + ОбновитьИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); КонецПроцедуры #КонецЕсли @@ -260,7 +379,7 @@ УстановитьПривилегированныйРежим(Истина); - ФайловыеФункцииСлужебный.ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияФайла, РезультатИзвлечения, ""); + РаботаСФайламиСлужебный.ЗаписатьРезультатИзвлеченияТекста(ФайлИлиВерсияФайла, РезультатИзвлечения, ""); // Запись в журнал регистрации. ЗаписьЖурналаРегистрацииСервер(ТекстСообщения); @@ -275,16 +394,13 @@ Запрос = Новый Запрос; ПолучитьВсеФайлы = (КоличествоФайловВПорции = 0); - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииТекстаЗапросаДляИзвлеченияТекста"); + Запрос = Новый Запрос; + Запрос.Текст = РаботаСФайламиСлужебныйВызовСервера.ТекстЗапросаДляИзвлеченияТекста(ПолучитьВсеФайлы); + Выгрузка = Запрос.Выполнить().Выгрузить(); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииТекстаЗапросаДляИзвлеченияТекста(Запрос.Текст, ПолучитьВсеФайлы); - КонецЦикла; - - Для Каждого Строка Из Запрос.Выполнить().Выгрузить() Цикл + Для Каждого Строка Из Выгрузка Цикл - Кодировка = ФайловыеФункцииСлужебный.ПолучитьКодировкуВерсииФайла(Строка.Ссылка); + Кодировка = РаботаСФайламиСлужебный.ПолучитьКодировкуВерсииФайла(Строка.Ссылка); СтруктураСтроки = Новый Структура; СтруктураСтроки.Вставить("Ссылка", Строка.Ссылка); @@ -303,33 +419,11 @@ &НаСервереБезКонтекста Функция ПолучитьНавигационнуюСсылкуФайла(Знач ФайлИлиВерсияФайла, Знач УникальныйИдентификатор) - НавигационнаяСсылкаФайла = Неопределено; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииНавигационнойСсылкиФайла( - ФайлИлиВерсияФайла, УникальныйИдентификатор, НавигационнаяСсылкаФайла); - КонецЦикла; - - Возврат НавигационнаяСсылкаФайла; + Возврат РаботаСФайламиСлужебный.НавигационнойСсылкиФайла(ФайлИлиВерсияФайла, + УникальныйИдентификатор); КонецФункции -&НаСервереБезКонтекста -Процедура ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(КоличествоФайловСНеизвлеченнымТекстом) - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииКоличестваВерсийСНеизвлеченнымТекстом( - КоличествоФайловСНеизвлеченнымТекстом); - КонецЦикла; - -КонецПроцедуры - &НаКлиенте Процедура ВыполнитьСтоп() ОтключитьОбработчикОжидания("ИзвлечениеТекстовКлиентОбработчик"); diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form index b9307dbc6..54ce7e3bb 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form @@ -400,6 +400,10 @@ <items xsi:type="form:Table"> <name>СписокПользователей</name> <id>2</id> + <title> + <key>ru</key> + <value>Список пользователей</value> + true true @@ -946,9 +950,6 @@ Style.BorderColor - None - None - None true diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl index 9877be422..35daab00a 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl @@ -21,8 +21,15 @@ НомерСеансаИнформационнойБазы = НомерСеансаИнформационнойБазы(); УсловноеОформление.Элементы[0].Отбор.Элементы[0].ПравоеЗначение = НомерСеансаИнформационнойБазы; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() - Или Не ((Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() И Пользователи.ЭтоПолноправныйПользователь()) + Или Не ((Не СеансЗапущенБезРазделителей И Пользователи.ЭтоПолноправныйПользователь()) Или Пользователи.ЭтоПолноправныйПользователь(, Истина)) Тогда Элементы.ЗавершитьСеанс.Видимость = Ложь; @@ -30,7 +37,7 @@ КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Элементы.СписокПользователейРазделениеДанных.Видимость = Ложь; КонецЕсли; @@ -110,19 +117,13 @@ НомераСеансов.Добавить(НомерСеанса); КонецЦикла; - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиента.РазделениеВключено И ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда СтандартнаяОбработка = Истина; ОповещениеПослеЗавершенияСеансов = Новый ОписаниеОповещения( "ПослеЗавершенияСеанса", ЭтотОбъект, Новый Структура("НомераСеансов", НомераСеансов)); - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.ЗавершениеРаботыПользователей\ПриЗавершенииСеансов"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗавершенииСеансов(ЭтотОбъект, НомераСеансов, СтандартнаяОбработка, ОповещениеПослеЗавершенияСеансов); - КонецЦикла; + ИнтеграцияСТехнологиейСервисаКлиент.ПриЗавершенииСеансов(ЭтотОбъект, НомераСеансов, СтандартнаяОбработка, ОповещениеПослеЗавершенияСеансов); Иначе Если ЗапрашиватьПараметрыАдминистрированияИБ Тогда @@ -282,8 +283,8 @@ СписокПользователей.Очистить(); - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначения.РазделениеВключено() + ИЛИ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено); КонецЕсли; @@ -319,15 +320,15 @@ СтрПользователя.ПользовательСсылка = НайтиСсылкуПоИдентификаторуПользователя( СеансИБ.Пользователь.УникальныйИдентификатор); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда СтрПользователя.РазделениеДанных = ЗначенияРазделителейДанныхВСтроку( СеансИБ.Пользователь.РазделениеДанных); КонецЕсли; - ИначеЕсли ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ИначеЕсли ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда СтрПользователя.Пользователь = Пользователи.ПолноеИмяНеуказанногоПользователя(); СтрПользователя.ИмяПользователя = ""; @@ -385,8 +386,8 @@ Функция НайтиСсылкуПоИдентификаторуПользователя(Идентификатор) // Нет доступа к разделенному справочнику из неразделенного сеанса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Неопределено; КонецЕсли; diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form index c6afe80e1..566160337 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form @@ -62,6 +62,7 @@ true Label + 50 2 true true @@ -77,12 +78,8 @@ <key>ru</key> - <value>Группа ошибка</value> + <value>Ошибка</value> - - ru - Группа ошибка - ГруппаОшибкаExtendedTooltip 85 @@ -303,6 +300,10 @@ true + + <key>ru</key> + <value>Период блокировки</value> + Ctrl+S ГруппаПериодБлокировкиExtendedTooltip @@ -405,6 +406,10 @@ true + + <key>ru</key> + <value>Ввода параметров администрирования</value> + ГруппаВводаПараметровАдминистрированияРасширеннаяПодсказка 125 @@ -468,6 +473,10 @@ true + + <key>ru</key> + <value>Управление регламентными заданиями</value> + ГруппаУправлениеРегламентнымиЗаданиямиРасширеннаяПодсказка 123 @@ -490,6 +499,10 @@ true + + <key>ru</key> + <value>Запретить работу регламентных заданий</value> + ГруппаЗапретитьРаботуРегламентныхЗаданийРасширеннаяПодсказка 121 @@ -600,6 +613,7 @@ true Label + 45 true Left @@ -644,8 +658,6 @@ true Left - 15 - true 2 true true @@ -752,6 +764,10 @@ true + + <key>ru</key> + <value>Период блокировки 1</value> + true Ctrl+S @@ -779,6 +795,10 @@ true + + <key>ru</key> + <value>Содержимое</value> + ГруппаСодержимоеExtendedTooltip 108 @@ -804,6 +824,10 @@ true + + <key>ru</key> + <value>Состояние</value> + false ГруппаСостояниеExtendedTooltip @@ -858,12 +882,10 @@ <key>ru</key> - <value>Группа режим</value> + <value>Режим</value> - - ru - Группа режим - + false + false ГруппаРежимExtendedTooltip 94 @@ -965,6 +987,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 114 @@ -1033,7 +1059,6 @@ Abort Cancel - CustomizeForm Ignore No OK @@ -1048,7 +1073,6 @@ true Vertical true - true true auto true diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl index e3a6bc01c..d743c08a0 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl @@ -16,19 +16,24 @@ Возврат; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая(); ЭтоАдминистраторСистемы = Пользователи.ЭтоПолноправныйПользователь(, Истина); - СеансЗапущенБезРазделителей = ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей(); Если ЭтоФайловаяБаза Или Не ЭтоАдминистраторСистемы Тогда Элементы.ГруппаЗапретитьРаботуРегламентныхЗаданий.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не Пользователи.РолиДоступны("ПолныеПрава") Тогда + Если ОбщегоНазначения.РазделениеВключено() Или Не Пользователи.РолиДоступны("ПолныеПрава") Тогда Элементы.КодДляРазблокировки.Видимость = Ложь; КонецЕсли; - ПолучитьПараметрыБлокировки(); УстановитьНачальныйСтатусЗапретаРаботыПользователей(); ОбновитьСтраницуНастройки(); @@ -364,6 +369,7 @@ КонецЕсли; Возврат Ложь; КонецПопытки; + УстановитьНачальныйСтатусЗапретаРаботыПользователей(); Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.СтраницаНастройки; ОбновитьСтраницуНастройки(); @@ -399,9 +405,20 @@ &НаКлиентеНаСервереБезКонтекста Процедура ОбновитьСостояниеБлокировки(Форма) - Форма.Элементы.Состояние.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Пожалуйста, подождите... + Если Форма.КоличествоСеансов = 0 Тогда + + ТекстСостояния = НСтр("ru='Ожидается установка блокировки... + |Работа пользователей в программе будет запрещена в указанное время'"); + + Иначе + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Пожалуйста, подождите... |Работа пользователей завершается. Осталось активных сеансов: %1'"), Форма.КоличествоСеансов); + + КонецЕсли; + + Форма.Элементы.Состояние.Заголовок = ТекстСостояния; КонецПроцедуры @@ -438,6 +455,8 @@ &НаСервере Процедура УстановитьНачальныйСтатусЗапретаРаботыПользователей() + ПолучитьПараметрыБлокировки(); + НачальныйСтатусЗапретаРаботыПользователейЗначение = Объект.ВременноЗапретитьРаботуПользователей; Если Объект.ВременноЗапретитьРаботуПользователей Тогда Если ТекущаяДатаСеанса() < Объект.НачалоДействияБлокировки Тогда @@ -505,11 +524,13 @@ "e1cib/app/Обработка.БлокировкаРаботыПользователей", ?(Объект.ВременноЗапретитьРаботуПользователей, НСтр("ru = 'Блокировка установлена.'"), НСтр("ru = 'Блокировка снята.'")), БиблиотекаКартинок.Информация32); - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей( Объект.ВременноЗапретитьРаботуПользователей); + СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Объект.ВременноЗапретитьРаботуПользователей); Если Объект.ВременноЗапретитьРаботуПользователей Тогда + Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.СтраницаСостоянияБлокировки; ОбновитьСтраницуСостояния(ЭтотОбъект); Иначе + Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.СтраницаНастройки; ОбновитьСтраницуНастройки(); КонецЕсли; @@ -534,8 +555,7 @@ КонецЕсли; СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Ложь); - ПоказатьПредупреждение(,НСтр("ru = 'Завершение работы активных пользователей отменено. - |Вход в программу новых пользователей оставлен заблокированным.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Завершение работы активных пользователей отменено.'")); КонецПроцедуры diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form index 0ac8f2d11..d3ed44b33 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form @@ -128,7 +128,7 @@ <key>ru</key> - <value>Группа сообщение об ошибке</value> + <value>Сообщение об ошибке</value> ГруппаСообщениеОбОшибкеExtendedTooltip @@ -192,12 +192,8 @@ <key>ru</key> - <value>Группа информация</value> + <value>Информация</value> - - ru - Группа информация - ГруппаИнформацияExtendedTooltip 51 @@ -225,7 +221,7 @@ <key>ru</key> - <value>Группа информация для пользователя</value> + <value>Информация для пользователя</value> ГруппаИнформацияДляПользователяExtendedTooltip @@ -251,6 +247,10 @@ true + + <key>ru</key> + <value>Страница 1</value> + Страница1ExtendedTooltip 48 @@ -309,7 +309,7 @@ - Группа1 + ГруппаТекстПояснения 42 ТекстПояснения @@ -388,8 +388,12 @@ true + + <key>ru</key> + <value>Текст пояснения</value> + - Группа1ExtendedTooltip + ГруппаТекстПоясненияРасширеннаяПодсказка 59 Label true @@ -415,7 +419,7 @@ <key>ru</key> - <value>Группа содержание</value> + <value>Содержание</value> ГруппаСодержаниеExtendedTooltip @@ -441,6 +445,10 @@ true + + <key>ru</key> + <value>Страница 2</value> + Страница2ExtendedTooltip 56 @@ -464,7 +472,7 @@ <key>ru</key> - <value>Группа страницы</value> + <value>Страницы</value> ГруппаСтраницыExtendedTooltip diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form new file mode 100644 index 000000000..675000352 --- /dev/null +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form @@ -0,0 +1,1901 @@ + + + + <key>ru</key> + <value>Адрес</value> + + + ГруппаИсторическийАдрес + 340 + + ИсторическийАдрес + 342 + true + true + + true + + + ИсторическийАдрес + + None + + ИсторическийАдресРасширеннаяПодсказка + 344 + Label + true + true + + Left + + + + ИсторическийАдресКонтекстноеМеню + 343 + true + + LabelField + Enter + true + Left + true + + true + true + + Style.ToolTipBackColor + + + + true + + true + + + <key>ru</key> + <value>Исторический адрес</value> + + + ГруппаИсторическийАдресРасширеннаяПодсказка + 341 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СтранаАдреса + 35 + + ГруппаСтраны + 9 + + Страна + 10 + true + true + + true + + + Страна + + + ru + Страна адреса + + + OnChange + СтранаПриИзменении + + + СтранаExtendedTooltip + 107 + Label + true + true + + Left + + + + СтранаКонтекстноеМеню + 11 + true + + InputField + Left + Enter + true + Left + true + + + AutoComplete + СтранаАвтоПодбор + + + Clearing + СтранаОчистка + + + TextEditEnd + СтранаОкончаниеВводаТекста + + + ChoiceProcessing + СтранаОбработкаВыбора + + 15 + true + true + true + false + true + ShowInInputField + false + false + false + false + true + true + + ТолькоДанныеКлассификатора + + + true + + + + + РазрешитьДанныеКлассификатора + + + true + + + + + Style.ФонУправляющегоПоля + + Normal + DontUse + + + + КодСтраны + 103 + true + false + + true + + + КодСтраны + + None + + КодСтраныExtendedTooltip + 108 + Label + true + true + + Left + + + + КодСтраныКонтекстноеМеню + 104 + true + + LabelField + Enter + true + Left + true + + 3 + true + true + false + + System.DefaultGUIFont + true + false + false + false + + + + true + true + + true + + + <key>ru</key> + <value>Страна</value> + + + ГруппаСтраныExtendedTooltip + 106 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страна адреса</value> + + + СтранаАдресаExtendedTooltip + 105 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + АдресПредставлениеКомментарий + 225 + + АдресСтраницаПредставление + 227 + + ПредставлениеАдреса + 21 + true + true + + true + + + ПредставлениеАдреса + + None + + OnChange + ПредставлениеИностранногоАдресаПриИзменении + + + ПредставлениеАдресаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ПредставлениеАдресаКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + 7 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Адрес</value> + + + АдресСтраницаПредставлениеРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + АдресСтраницаКомментарий + 229 + + Комментарий + 5 + true + true + + true + + + Комментарий + + None + + ru + Дополнительный комментарий, не включаемый в представление адреса + + + OnChange + КомментарийПриИзменении + + + КомментарийExtendedTooltip + 135 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Комментарий</value> + + + АдресСтраницаКомментарийРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Адрес представление комментарий</value> + + + АдресПредставлениеКомментарийРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ПанельКоманд + 82 + + ПанельКомандФормы + 83 + + ФормаКомандаОК + 56 + true + true + + true + + + ФормаКомандаОКExtendedTooltip + 140 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 57 + true + true + + true + + + ФормаОтменаExtendedTooltip + 141 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + + ФормаВсеДействия + 231 + + ФормаВводАдресаВСвободнойФормеВсеДействия + 233 + + ПоказатьИсториюВсеДействия + 324 + true + true + + true + + + ПоказатьИсториюВсеДействияРасширеннаяПодсказка + 325 + Label + true + true + + Left + + + Form.Command.ИсторияИзменений + Normal + Auto + true + true + UserCmds + Auto + + + ПоказатьАдресНаВсеДействия + 334 + + АдресНаЯндексКарты + 336 + true + true + + true + + + АдресНаЯндексКартыРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + Form.Command.АдресНаЯндексКарты + Normal + Auto + true + true + UserCmds + Auto + + + АдресНаGoogleMaps + 338 + true + true + + true + + + АдресНаGoogleMapsРасширеннаяПодсказка + 339 + Label + true + true + + Left + + + Form.Command.АдресНаGoogleMaps + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Показать адрес на</value> + + + ПоказатьАдресНаВсеДействияРасширеннаяПодсказка + 335 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + true + true + + true + + + <key>ru</key> + <value>Форма ввод адреса в свободной форме</value> + + + ФормаВводАдресаВСвободнойФормеВсеДействияРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + + + + ФормаИзмененияАдресаВсеДействия + 237 + + ФормаОчиститьАдресВсеДействия + 241 + true + true + + true + + + ФормаОчиститьАдресВсеДействияРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + Form.Command.ОчиститьАдрес + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма изменения адреса все действия</value> + + + ФормаИзмененияАдресаВсеДействияРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + + + + ФормаСтандартныеДействия + 243 + + ИзменитьФормуВсеДействия + 245 + true + true + + true + + + ИзменитьФормуВсеДействияРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СправкаВсеДействия + 247 + true + true + + true + + + СправкаВсеДействияРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма стандартные действия</value> + + + ФормаСтандартныеДействияExtendedTooltip + 244 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Все действия</value> + + + ФормаВсеДействияExtendedTooltip + 232 + Label + true + true + + Left + + + Popup + + + CommonPicture.Подменю + + Picture + Normal + + + + ФормаВводАдресаПоказать + 101 + + ИсторияИзменений + 326 + true + true + + true + + + ИсторияИзмененийРасширеннаяПодсказка + 327 + Label + true + true + + Left + + + Form.Command.ИсторияИзменений + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + АдресНаКартеЯндексКартах + 328 + true + true + + true + + + АдресНаКартеЯндексКартахРасширеннаяПодсказка + 329 + Label + true + true + + Left + + + Form.Command.АдресНаЯндексКарты + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоказатьНаКартеGoogle + 330 + true + true + + true + + + ПоказатьНаКартеGoogleРасширеннаяПодсказка + 331 + Label + true + true + + Left + + + Form.Command.АдресНаGoogleMaps + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма ввод адреса показать</value> + + + ФормаВводАдресаПоказатьРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + + + ФормаВсеДействияИзмененияАдреса + 152 + + ФормаОчиститьАдрес + 90 + true + true + + true + + + ФормаОчиститьАдресExtendedTooltip + 143 + Label + true + true + + Left + + + Form.Command.ОчиститьАдрес + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма все действия изменения адреса</value> + + + ФормаВсеДействияИзмененияАдресаРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + + + ИзменитьФорму + 98 + true + true + + true + + + ИзменитьФормуExtendedTooltip + 147 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 99 + true + true + + true + + + СправкаExtendedTooltip + 148 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Панель команд формы</value> + + + ПанельКомандФормыExtendedTooltip + 139 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Панель команд</value> + + + ПанельКомандExtendedTooltip + 136 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Right + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + Use + UseList + true + true + Vertical + true + true + true + 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 + + CatalogRef.СтраныМира + + + true + + + true + + true + + + Индекс + + <key>ru</key> + <value>Индекс</value> + + 4 + + String + + 20 + + + + true + + + true + + true + + + Объект + + <key>ru</key> + <value>Объект</value> + + 7 + + DataProcessorObject.ВводКонтактнойИнформации + + + true + + + true + +
              true
              +
              + + Дом + + <key>ru</key> + <value>Дом</value> + + 12 + + String + + + + true + + + true + + true + + + ОсновнаяСтрана + + <key>ru</key> + <value>Основная страна</value> + + 18 + + CatalogRef.СтраныМира + + + true + + + true + + + + ВидКонтактнойИнформации + + <key>ru</key> + <value>Вид контактной информации</value> + + 22 + + + true + + + true + + + + ПроверятьКорректность + + <key>ru</key> + <value>Проверять корректность</value> + + 26 + + Boolean + + + true + + + true + + + + СкрыватьНеактуальныеАдреса + + <key>ru</key> + <value>Скрывать неактуальные адреса</value> + + 27 + + Boolean + + + true + + + true + + + + КопияКомментария + + <key>ru</key> + <value>Копия комментария</value> + + 28 + + String + + + + true + + + true + + + + АвтоЦвет + + <key>ru</key> + <value>Авто цвет</value> + + 17 + + Color + + + true + + + true + + + + ЦветФонаФормы + + <key>ru</key> + <value>Цвет фона формы</value> + + 33 + + Color + + + true + + + true + + + + ПредставлениеАдресаИзменено + + <key>ru</key> + <value>Представление адреса изменено</value> + + 34 + + Boolean + + + true + + + true + + + + ЦветФонаУправляющегоПоля + + <key>ru</key> + <value>Цвет фона управляющего поля</value> + + 35 + + Color + + + true + + + true + + + + КодСтраны + + <key>ru</key> + <value>Код страны</value> + + 36 + + String + + + + true + + + true + + + + ТекстПредупрежденияПриОткрытии + + <key>ru</key> + <value>Текст предупреждения при открытии</value> + + 37 + + String + + + + true + + + true + + + + ПолеПредупрежденияПриОткрытии + + <key>ru</key> + <value>Поле предупреждения при открытии</value> + + 39 + + String + + + + true + + + true + + + + ВозвращатьСписокЗначений + + <key>ru</key> + <value>Возвращать список значений</value> + + 38 + + Boolean + + + true + + + true + + + + АдресИзменен + + <key>ru</key> + <value>Адрес изменен</value> + + 8 + + Boolean + + + true + + + true + + + + ТекстСообщенияСервиса + + <key>ru</key> + <value>Текст сообщения сервиса</value> + + 25 + + String + + + + true + + + true + + + + ДополнительныйЭлемент + + <key>ru</key> + <value>Дополнительный элемент</value> + + 32 + + String + + + + true + + + true + + + + ПодчиненныйЭлемент + + <key>ru</key> + <value>Подчиненный элемент</value> + + 41 + + String + + + + true + + + true + + + + ИсторическийАдрес + + <key>ru</key> + <value>Исторический адрес</value> + + 45 + + String + + + + true + + + true + + + + КонтактнаяИнформацияОписаниеДополнительныхРеквизитов + + <key>ru</key> + <value>Контактная информация описание дополнительных реквизитов</value> + + 47 + + ValueTable + + + 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 + + EnumRef.ТипыКонтактнойИнформации + + + true + + + true + + + + ЗначенияПолей + + <key>ru</key> + <value>Значения полей</value> + + 4 + + ValueList + 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 + + Boolean + + + true + + + true + + + + ДействуетС + + <key>ru</key> + <value>Действует С</value> + + 8 + + Date + + Date + + + + true + + + true + + + + ЭтоИсторическаяКонтактнаяИнформация + + <key>ru</key> + <value>Это историческая контактная информация</value> + + 9 + + Boolean + + + true + + + true + + + + ХранитьИсториюИзменений + + <key>ru</key> + <value>Хранить историю изменений</value> + + 11 + + Boolean + + + true + + + true + + + + + КомандаОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Подтвердить изменения и закрыть форму + + + true + + + + КомандаОК + + + DontUse + Auto + + + ОчиститьАдрес + + <key>ru</key> + <value>Очистить адрес</value> + + 3 + + ru + Очистить адрес + + + true + + + StdPicture.InputFieldClear + + + + ОчиститьАдрес + + + true + DontUse + Auto + + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 7 + + ru + Отменить изменения и закрыть форму + + + true + + + + КомандаОтмена + + + DontUse + Auto + + + ИсторияИзменений + + <key>ru</key> + <value>История изменений...</value> + + 10 + + ru + История изменений + + + true + + + CommonPicture.ИсторияИзменений + + + + ИсторияИзменений + + + DontUse + Auto + + + АдресНаЯндексКарты + + <key>ru</key> + <value>Адрес на Яндекс.Картах</value> + + 11 + + ru + Адрес на яндекс карты + + + true + + + CommonPicture.ЯндексКарты + + + + АдресНаЯндексКарты + + + DontUse + Auto + + + АдресНаGoogleMaps + + <key>ru</key> + <value>Адрес на Google Maps</value> + + 12 + + ru + Адрес на google maps + + + true + + + CommonPicture.GoogleMaps + + + + АдресНаGoogleMaps + + + DontUse + Auto + + + ВидКонтактнойИнформации + + + + ЗначенияПолей + + true + + + Представление + + String + + + true + + + Заголовок + + 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..1de650115 --- /dev/null +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Help/ru.html @@ -0,0 +1,14 @@ + +

              Предназначена для ввода адреса.

              +

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

              +
              • +
                В некоторых списках можно просмотреть историю изменения адреса с помощью команды Еще - История изменений.

              Адрес на Яндекс.Картах, Адрес на Google Maps

              +
              • +
                С помощью этих команд любой адрес, введенный в программе, можно посмотреть на картах.

              Очистка адреса

              +
              • С помощью команды меню Еще - Очистить адрес  можно стереть неправильно введенный адрес.

              См. также:

              + \ 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..2c2670360 --- /dev/null +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Module.bsl @@ -0,0 +1,782 @@ +// Форма параметризуется: +// +// Заголовок - Строка - заголовок формы. +// ЗначенияПолей - Строка - сериализованное значение контактной информации или пустая строка для +// ввода нового. +// Представление - Строка - представление адреса (используется только при работе со старыми данными). +// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - описание того, что мы +// редактируем. +// Комментарий - Строка - необязательный комментарий, для подстановки в поле "Комментарий". +// +// ВозвращатьСписокЗначений - Булево - необязательный флаг того, что возвращаемое значение поля. +// КонтактнаяИнформация будет иметь тип СписокЗначений (совместимость). +// +// Результат выбора: +// Структура - поля: +// * КонтактнаяИнформация - Строка - XML контактной информации. +// * Представление - Строка - Представление. +// * Комментарий - Строка - Комментарий. +// * ВведеноВСвободнойФорме - Булево - флаг ввода. +// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если Не Параметры.Свойство("ОткрытаПоСценарию") Тогда + ВызватьИсключение НСтр("ru = 'Обработка не предназначена для непосредственного использования.'"); + КонецЕсли; + + // Настройки формы + ЭтоТакси = КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Такси; // Группа команд "все действия" зависит от интерфейса. + + Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений); + // Внутренняя инициализация + ЦветФонаУправляющегоПоля = ЦветаСтиля.ФонУправляющегоПоля; + ЦветФонаФормы = ЦветаСтиля.ЦветФонаФормы; + АвтоЦвет = Новый Цвет; + + ОсновнаяСтрана = ОсновнаяСтрана(); + + ВидКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Параметры.ВидКонтактнойИнформации); + + Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда + Если Параметры.Свойство("ДействуетС") И Параметры.Свойство("ДействуетДо") Тогда + ОтобразитьИнформациюОДатахДействияАдреса(Параметры.ДействуетС, Параметры.ДействуетДо); + КонецЕсли; + Если Параметры.Свойство("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов") Тогда + Для каждого СтрокаКИ Из Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл + НоваяСтрока = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКИ); + КонецЦикла; + Иначе + Элементы.ИсторияИзменений.Видимость = Ложь; + Элементы.ПоказатьИсториюВсеДействия.Видимость = Ложь; + КонецЕсли; + Иначе + Элементы.ИсторияИзменений.Видимость = Ложь; + Элементы.ПоказатьИсториюВсеДействия.Видимость = Ложь; + КонецЕсли; + + ВидКонтактнойИнформации.Вставить("Ссылка", Параметры.ВидКонтактнойИнформации); + + Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), + Строка(УправлениеКонтактнойИнформациейСлужебный.ТипВидаКонтактнойИнформации(ВидКонтактнойИнформации)), + Параметры.Заголовок); + + СкрыватьНеактуальныеАдреса = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса; + ТолькоНациональныйАдрес = ВидКонтактнойИнформации.ТолькоНациональныйАдрес; + ТипКонтактнойИнформации = ВидКонтактнойИнформации.Тип; + + // Пытаемся заполнить из параметров. + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Параметры.ЗначенияПолей) + И ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + РезультатыЧтения = Новый Структура; + XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(Параметры.ЗначенияПолей, ТипКонтактнойИнформации, РезультатыЧтения); + Если РезультатыЧтения.Свойство("ТекстОшибки") Тогда + // Распознали с ошибками, сообщим при открытии. + ТекстПредупрежденияПриОткрытии = РезультатыЧтения.ТекстОшибки; + XDTOКонтактная.Представление = Параметры.Представление; + XDTOКонтактная.Состав.Страна = Строка(ОсновнаяСтрана); + КонецЕсли; + Иначе + XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.АдресXMLВXDTO(Параметры.ЗначенияПолей, Параметры.Представление, ); + Если Параметры.Свойство("Страна") И ЗначениеЗаполнено(Параметры.Страна) Тогда + Если ТипЗнч(Параметры.Страна) = ТипЗнч(Справочники.СтраныМира.ПустаяСсылка()) Тогда + XDTOКонтактная.Состав.Страна = Параметры.Страна.Наименование; + Иначе + XDTOКонтактная.Состав.Страна = Строка(Параметры.Страна); + КонецЕсли; + Иначе + XDTOКонтактная.Состав.Страна = ОсновнаяСтрана.Наименование; + КонецЕсли; + КонецЕсли; + + Если Параметры.Комментарий <> Неопределено Тогда + // Ставим новый комментарий, иначе он придет из информации. + XDTOКонтактная.Комментарий = Параметры.Комментарий; + КонецЕсли; + + ЗначениеРеквизитовПоКонтактнойИнформации(ЭтотОбъект, XDTOКонтактная); + + Если ЗначениеЗаполнено(Страна) Тогда + КодСтраны = Страна.Код; + Иначе + Страна = ОсновнаяСтрана; + КодСтраны = ОсновнаяСтрана.Код; + КонецЕсли; + + Если ТолькоНациональныйАдрес Тогда + Элементы.Страна.Доступность = Ложь; + Элементы.Страна.ЦветФона = АвтоЦвет; + // Проверяем на корректность + Если Страна <> ОсновнаяСтрана Тогда + // Считаем адрес российским + ПредставлениеАдресаИзменено = Истина; + ТекстПредупрежденияПриОткрытии = НСтр("ru = 'Адрес введен некорректно: допускается ввод только национальных адресов. Значение поля ""Страна"" было изменено, необходимо проверить остальные поля.'"); + ПолеПредупрежденияПриОткрытии = "Страна"; + Модифицированность = Истина; + КонецЕсли; + Страна = ОсновнаяСтрана; + КонецЕсли; + + ОпределитьОтображениеЭлементовНаФорме(ЭтоТакси); + + Элементы.АдресСтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий); + + УстановитьКлючИспользованияФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбработкаИзмененияСтраныКлиент(); + Если ЗначениеЗаполнено(ТекстПредупрежденияПриОткрытии) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстПредупрежденияПриОткрытии,, ПолеПредупрежденияПриОткрытии); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СтранаПриИзменении(Элемент) + ОбработкаИзмененияСтраныКлиент(); + + Контекст = КонтекстФормыКлиент(); + ЗаполнитьПредставлениеАдреса(Контекст); + КонтекстФормыКлиент(Контекст); + +#Если ВебКлиент Тогда + // Обход особенности платформы. + Элемент.ОбновитьТекстРедактирования(); +#КонецЕсли + + // Выводим всегда представление. + Элементы.АдресПредставлениеКомментарий.ТекущаяСтраница = Элементы.АдресСтраницаПредставление; +КонецПроцедуры + +&НаКлиенте +Процедура СтранаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура СтранаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если Ожидание = 0 Тогда + // Формирование списка быстрого выбора. + Если ПустаяСтрока(Текст) Тогда + ДанныеВыбора = Новый СписокЗначений; + КонецЕсли; + Возврат; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СтранаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ПустаяСтрока(Текст) Тогда + СтандартнаяОбработка = Ложь; + КонецЕсли; + +#Если ВебКлиент Тогда + // Обход особенности платформы. + СтандартнаяОбработка = Ложь; + ДанныеВыбора = Новый СписокЗначений; + ДанныеВыбора.Добавить(Страна); +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура СтранаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеКонтактнойИнформациейКлиент.СтранаМираОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПриИзменении(Элемент) + + ПодключитьОбработчикОжидания("УстановитьПиктограммуКомментария", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеИностранногоАдресаПриИзменении(Элемент) + ПредставлениеАдресаИзменено = Истина; + ПредставлениеАдресаПриИзмененииСервер(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура КомандаОК(Команда) + ПодтвердитьИЗакрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтмена(Команда) + Модифицированность = Ложь; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьАдрес(Команда) + + ОчиститьАдресКлиент(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИсторияИзменений(Команда) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Контекст", КонтекстФормыКлиент()); + + ОписаниеДополнительныхРеквизитов = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + СписокКонтактнойИнформации = ЗаполнитьСписокКонтактнойИнформации(ВидКонтактнойИнформации.Ссылка, ОписаниеДополнительныхРеквизитов, ДополнительныеПараметры.Контекст); + + ПараметрыФормы = Новый Структура("СписокКонтактнойИнформации", СписокКонтактнойИнформации); + ПараметрыФормы.Вставить("ВидКонтактнойИнформации", ВидКонтактнойИнформации.Ссылка); + ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтотОбъект.ТолькоПросмотр); + + ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПослеЗакрытияФормыИстории", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ИсторияКонтактнойИнформации", ПараметрыФормы, ЭтотОбъект,,,, ОповещениеОЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура АдресНаЯндексКарты(Команда) + УправлениеКонтактнойИнформациейКлиент.ПоказатьАдресНаКарте(ПредставлениеАдреса, "Яндекс.Карты"); +КонецПроцедуры + +&НаКлиенте +Процедура АдресНаGoogleMaps(Команда) + УправлениеКонтактнойИнформациейКлиент.ПоказатьАдресНаКарте(ПредставлениеАдреса, "GoogleMaps"); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура УстановитьПиктограммуКомментария() + Элементы.АдресСтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий); +КонецПроцедуры + +&НаКлиенте +Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если Модифицированность Тогда // При немодифицированности работает как "отмена". + Контекст = КонтекстФормыКлиент(); + Результат = РезультатаВыбораПоОбновлениюФлагов(Контекст, ВозвращатьСписокЗначений); + + // Флаги вида были прочитаны заново. + ВидКонтактнойИнформации = Контекст.ВидКонтактнойИнформации; + + Если ВидКонтактнойИнформации.ПроверятьКорректность + И Результат.ОшибкиЗаполнения.Количество() > 0 Тогда + СообщитьОбОшибкахЗаполнения(Результат.ОшибкиЗаполнения, Ложь); + Возврат; + КонецЕсли; + + Результат = Результат.ДанныеВыбора; + Если ТипЗнч(Результат) = Тип("Структура") Тогда + Результат.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов", КонтактнаяИнформацияОписаниеДополнительныхРеквизитов); + КонецЕсли; + + СброситьМодифицированностьПриВыборе(); +#Если ВебКлиент Тогда + ФлагЗакрытия = ЗакрыватьПриВыборе; + ЗакрыватьПриВыборе = Ложь; + ОповеститьОВыборе(Результат); + ЗакрыватьПриВыборе = ФлагЗакрытия; +#Иначе + ОповеститьОВыборе(Результат); +#КонецЕсли + СохранитьСостояниеФормы(); + + ИначеЕсли Комментарий <> КопияКомментария Тогда + // Изменен только комментарий, пробуем вернуть обновленное. + Результат = РезультатВыбораТолькоКомментария(Параметры.ЗначенияПолей, Параметры.Представление, Комментарий); + Результат = Результат.ДанныеВыбора; + + СброситьМодифицированностьПриВыборе(); +#Если ВебКлиент Тогда + ФлагЗакрытия = ЗакрыватьПриВыборе; + ЗакрыватьПриВыборе = Ложь; + ОповеститьОВыборе(Результат); + ЗакрыватьПриВыборе = ФлагЗакрытия; +#Иначе + ОповеститьОВыборе(Результат); +#КонецЕсли + СохранитьСостояниеФормы(); + + Иначе + Результат = Неопределено; + КонецЕсли; + + Если (МодальныйРежим Или ЗакрыватьПриВыборе) И Открыта() Тогда + СброситьМодифицированностьПриВыборе(); + СохранитьСостояниеФормы(); + Закрыть(Результат); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗакрытияФормыИстории(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Отбор = Новый Структура("Вид", ВидКонтактнойИнформации.Ссылка); + НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + + ИмяРеквизита = ""; + Для Каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл + Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда + ИмяРеквизита = СтрокаКонтактнойИнформации.ИмяРеквизита; + КонецЕсли; + КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Удалить(СтрокаКонтактнойИнформации); + КонецЦикла; + + ЭтоИсторическаяКонтактнаяИнформация = Ложь; + ПараметрыОбновления = Новый Структура; + Для Каждого СтрокаКонтактнойИнформации Из Результат Цикл + ДанныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(ДанныеСтроки, СтрокаКонтактнойИнформации); + Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда + ДанныеСтроки.ИмяРеквизита = ИмяРеквизита; + Контекст = ДополнительныеПараметры.Контекст; + Если СтрСравнить(Контекст.ПредставлениеАдреса, СтрокаКонтактнойИнформации.Представление) <> 0 Тогда + ПерезаполнитьФормуВводаАдреса(Контекст, СтрокаКонтактнойИнформации.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип); + КонтекстФормыКлиент(Контекст); + КонецЕсли; + КонецЕсли; + КонецЦикла; + ЭтотОбъект.Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьСостояниеФормы() + УстановитьКлючИспользованияФормы(); + СохраняемыеВНастройкахДанныеМодифицированы = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура СброситьМодифицированностьПриВыборе() + Модифицированность = Ложь; + КопияКомментария = Комментарий; +КонецПроцедуры + +&НаСервереБезКонтекста +Функция РезультатВыбора(Контекст, ВозвращатьСписокЗначений = Ложь) + XDTOИнформация = КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст); + Результат = Новый Структура("ДанныеВыбора, ОшибкиЗаполнения"); + + Если ВозвращатьСписокЗначений Тогда + ДанныеВыбора = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтаруюСтруктуру(XDTOИнформация); + ДанныеВыбора = ДанныеВыбора.ЗначенияПолей; + ИначеЕсли Контекст.Страна = Контекст.ОсновнаяСтрана И ПустаяСтрока(XDTOИнформация.Представление) Тогда + ДанныеВыбора = ""; + Иначе + ДанныеВыбора = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(XDTOИнформация); + КонецЕсли; + + Результат.ДанныеВыбора = Новый Структура; + Результат.ДанныеВыбора.Вставить("КонтактнаяИнформация", ДанныеВыбора); + Результат.ДанныеВыбора.Вставить("Представление", XDTOИнформация.Представление); + Результат.ДанныеВыбора.Вставить("Комментарий", XDTOИнформация.Комментарий); + Результат.ДанныеВыбора.Вставить("ВведеноВСвободнойФорме", + УправлениеКонтактнойИнформациейСлужебный.АдресВведенВСвободнойФорме(XDTOИнформация)); + + Результат.ОшибкиЗаполнения = Новый СписокЗначений; + + Если Контекст.ВидКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес + И Контекст.ВидКонтактнойИнформации.РедактированиеТолькоВДиалоге Тогда + АдресВВидеГиперссылки = Истина; + Иначе + АдресВВидеГиперссылки = Ложь; + КонецЕсли; + Результат.ДанныеВыбора.Вставить("АдресВВидеГиперссылки", АдресВВидеГиперссылки); + + // Подавляем перенос строк в возвращаемом отдельно представлении. + Результат.ДанныеВыбора.Представление = СокрЛП(СтрЗаменить(Результат.ДанныеВыбора.Представление, Символы.ПС, " ")); + Результат.ДанныеВыбора.Вставить("Вид", Контекст.ВидКонтактнойИнформации.Ссылка); + Результат.ДанныеВыбора.Вставить("Тип", Контекст.ВидКонтактнойИнформации.Тип); + + Возврат Результат; +КонецФункции + +&НаСервереБезКонтекста +Функция ПерезаполнитьФормуВводаАдреса(Контекст, ЗначенияПолей, ТипКонтактнойИнформации) + + РезультатыЧтения = ""; + XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(ЗначенияПолей, ТипКонтактнойИнформации, РезультатыЧтения); + ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, XDTOКонтактная); + Возврат РезультатыЧтения; + +КонецФункции + +&НаСервереБезКонтекста +Функция ЗаполнитьСписокКонтактнойИнформации(ВидКонтактнойИнформации, КонтактнаяИнформацияОписаниеДополнительныхРеквизитов, Контекст) + + Отбор = Новый Структура("Вид", ВидКонтактнойИнформации); + НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + + СписокКонтактнойИнформации = Новый Массив; + Для каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл + КонтактнаяИнформация = Новый Структура("Представление, ЗначенияПолей, ДействуетС"); + Если СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда + ЗаполнитьЗначенияСвойств(КонтактнаяИнформация, СтрокаКонтактнойИнформации); + Иначе + XDTOИнформация = КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст); + ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(XDTOИнформация); + Если СтрСравнить(СтрокаКонтактнойИнформации.ЗначенияПолей, ЗначенияПолей) <> 0 Тогда + Если СтрокаКонтактнойИнформации.ДействуетС < НачалоДня(ТекущаяДатаСеанса()) Тогда + // старое значение + ЗаполнитьЗначенияСвойств(КонтактнаяИнформация, СтрокаКонтактнойИнформации); + СписокКонтактнойИнформации.Добавить(КонтактнаяИнформация); + // новое значение + КонтактнаяИнформация = Новый Структура("Представление, ЗначенияПолей, ДействуетС"); + КонтактнаяИнформация.Представление = Контекст.ПредставлениеАдреса; + КонтактнаяИнформация.ЗначенияПолей = ЗначенияПолей; + КонтактнаяИнформация.ДействуетС = ТекущаяДатаСеанса(); + Иначе + КонтактнаяИнформация.Представление = Контекст.ПредставлениеАдреса; + КонтактнаяИнформация.ЗначенияПолей = ЗначенияПолей; + КонтактнаяИнформация.ДействуетС = ТекущаяДатаСеанса(); + КонецЕсли; + Иначе + ЗаполнитьЗначенияСвойств(КонтактнаяИнформация, СтрокаКонтактнойИнформации); + КонецЕсли; + КонецЕсли; + + СписокКонтактнойИнформации.Добавить(КонтактнаяИнформация); + КонецЦикла; + + Возврат СписокКонтактнойИнформации; +КонецФункции + +&НаСервере +Функция РезультатВыбораТолькоКомментария(КонтактнаяИнфо, Представление, Комментарий) + + Если ПустаяСтрока(КонтактнаяИнфо) Тогда + НоваяКонтактная = УправлениеКонтактнойИнформациейСлужебный.АдресXMLВXDTO(""); + НоваяКонтактная.Комментарий = Комментарий; + НоваяКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(НоваяКонтактная); + АдресВведенВСвободнойФорме = Ложь; + + ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнфо) Тогда + // Копия + НоваяКонтактная = КонтактнаяИнфо; + // Модифицируем значение "НоваяКонтактная". + УправлениеКонтактнойИнформацией.УстановитьКомментарийКонтактнойИнформации(НоваяКонтактная, Комментарий); + АдресВведенВСвободнойФорме = УправлениеКонтактнойИнформациейСлужебный.АдресВведенВСвободнойФорме(КонтактнаяИнфо); + + Иначе + НоваяКонтактная = КонтактнаяИнфо; + АдресВведенВСвободнойФорме = Ложь; + КонецЕсли; + + Результат = Новый Структура("ДанныеВыбора, ОшибкиЗаполнения", Новый Структура, Новый СписокЗначений); + Результат.ДанныеВыбора.Вставить("КонтактнаяИнформация", НоваяКонтактная); + Результат.ДанныеВыбора.Вставить("Представление", Представление); + Результат.ДанныеВыбора.Вставить("Комментарий", Комментарий); + Результат.ДанныеВыбора.Вставить("ВведеноВСвободнойФорме", АдресВведенВСвободнойФорме); + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ОбработкаИзмененияСтраныКлиент() + + ЭтоНациональныйАдрес = (Страна = ОсновнаяСтрана); + +КонецПроцедуры + +&НаСервере +Процедура ОпределитьОтображениеЭлементовНаФорме(ЭтоТакси) + + // По умолчанию выводим представление. + Элементы.АдресПредставлениеКомментарий.ТекущаяСтраница = Элементы.АдресСтраницаПредставление; + + Если ЭтоТакси Тогда + Элементы.ФормаВсеДействия.Видимость = Ложь; + Иначе + Элементы.ФормаОчиститьАдрес.Видимость = Ложь; + Элементы.ИзменитьФорму.Видимость = Ложь; + Элементы.ФормаВводАдресаПоказать.Видимость = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ЗаполнитьПредставлениеАдреса(Контекст, XDTOКонтактная = Неопределено) + + // Код страны ставим всегда + Если ТипЗнч(Контекст.Страна) = Тип("СправочникСсылка.СтраныМира") Тогда + Контекст.КодСтраны = Контекст.Страна.Код + Иначе + Контекст.КодСтраны = ""; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, РедактируемаяИнформация) + + ДанныеАдреса = РедактируемаяИнформация.Состав; + + // Общие реквизиты + Контекст.ПредставлениеАдреса = РедактируемаяИнформация.Представление; + Контекст.Комментарий = РедактируемаяИнформация.Комментарий; + + // Копия комментария для анализа измененности. + Контекст.КопияКомментария = Контекст.Комментарий; + + // Страна по наименованию + НаименованиеСтраны = СокрЛП(ДанныеАдреса.Страна); + Если ПустаяСтрока(НаименованиеСтраны) Тогда + Контекст.Страна = Справочники.СтраныМира.ПустаяСсылка(); + Иначе + + СсылкаНаОсновнуюСтрану = ОсновнаяСтрана(); + + Если ВРЕГ(НаименованиеСтраны) = ВРЕГ(СокрЛП(СсылкаНаОсновнуюСтрану.Наименование)) Тогда + Контекст.Страна = СсылкаНаОсновнуюСтрану; + Контекст.КодСтраны = СсылкаНаОсновнуюСтрану.Код; + Иначе + ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, НаименованиеСтраны); + Если ДанныеСтраны = Неопределено Тогда + // Не нашли ни в справочнике, ни в классификаторе. + Контекст.Страна = Неопределено; + Контекст.КодСтраны = Неопределено; + Иначе + Контекст.Страна = ДанныеСтраны.Ссылка; + Контекст.КодСтраны = ДанныеСтраны.Код; + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст) + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + + Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Результат.Комментарий = Контекст.Комментарий; + + Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); + Адрес = Результат.Состав; + + Адрес.Страна = Строка(Контекст.Страна); + Если ВРег(Контекст.Страна) <> ВРег(Контекст.ОсновнаяСтрана.Наименование) Тогда + Результат.Представление = Контекст.ПредставлениеАдреса; + Если Контекст.ВидКонтактнойИнформации.ВключатьСтрануВПредставление + И СтрНачинаетсяС(ВРЕГ(Контекст.ПредставлениеАдреса), ВРег(Контекст.Страна)) Тогда + Адрес.Состав = Сред(Контекст.ПредставлениеАдреса, СтрДлина(Контекст.Страна) + 2); + Иначе + Адрес.Состав = Контекст.ПредставлениеАдреса; + КонецЕсли; + Возврат Результат; + КонецЕсли; + + // Представление и свободный ввод адреса. + Результат.Представление = СокрЛП(Контекст.ПредставлениеАдреса); + + Возврат Результат; +КонецФункции + +&НаСервереБезКонтекста +Функция РезультатаВыбораПоОбновлениюФлагов(Контекст, ВозвращатьСписокЗначений = Ложь) + // Обновляем некоторые флаги + ЗначениеФлагов = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Контекст.ВидКонтактнойИнформации.Ссылка); + + Контекст.ВидКонтактнойИнформации.ТолькоНациональныйАдрес = ЗначениеФлагов.ТолькоНациональныйАдрес; + Контекст.ВидКонтактнойИнформации.ПроверятьКорректность = ЗначениеФлагов.ПроверятьКорректность; + + Возврат РезультатВыбора(Контекст, ВозвращатьСписокЗначений); +КонецФункции + +&НаСервере +Процедура УдалитьГруппуЭлементов(Группа) + Пока Группа.ПодчиненныеЭлементы.Количество()>0 Цикл + Элемент = Группа.ПодчиненныеЭлементы[0]; + Если ТипЗнч(Элемент)=Тип("ГруппаФормы") Тогда + УдалитьГруппуЭлементов(Элемент); + КонецЕсли; + Элементы.Удалить(Элемент); + КонецЦикла; + Элементы.Удалить(Группа); +КонецПроцедуры + +&НаСервере +Процедура ОтобразитьИнформациюОДатахДействияАдреса(ДействуетС, ДействуетДо) + + Если ЗначениеЗаполнено(ДействуетДо) И ЗначениеЗаполнено(ДействуетС)Тогда + Если НачалоДня(ДействуетДо - 10) = НачалоДня(ДействуетС) Тогда + ТекстИсторическийАдрес = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес действовал только %1'"), Формат(ДействуетС, "ДЛФ=DD")); + Иначе + ТекстИсторическийАдрес = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес действовал с %1 по %2 (включительно)'"), Формат(ДействуетС, "ДЛФ=DD"), Формат(ДействуетДо - 10, "ДЛФ=DD")); + КонецЕсли; + ИначеЕсли НЕ ЗначениеЗаполнено(ДействуетС) И ЗначениеЗаполнено(ДействуетДо) Тогда + ТекстИсторическийАдрес = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес действовал до %1 (включительно)'"), Формат(ДействуетДо - 10, "ДЛФ=DD")); + Иначе + ТекстИсторическийАдрес = НСтр("ru = 'Адрес действует в настоящие время'"); + КонецЕсли; + ИсторическийАдрес = ТекстИсторическийАдрес; + Элементы.ПоказатьИсториюВсеДействия.Видимость = Ложь; + Элементы.ИсторияИзменений.Видимость = Ложь; + Элементы.ГруппаИсторическийАдрес.Видимость = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура СообщитьОбОшибкахЗаполнения(СписокОшибок, ПредупреждатьОбОтсутствии, ТребуетсяОбновление = Ложь) + + ОчиститьСообщения(); + + КоличествоОшибок = СписокОшибок.Количество(); + Если КоличествоОшибок = 0 И ПредупреждатьОбОтсутствии Тогда + // Нет ошибок + Если ТребуетсяОбновление Тогда + СообщениеОПроверкеАдреса = НСтр("ru='Адрес введен корректно, но адресные сведения, загруженные в программу, + |давно не обновлялись. Рекомендуется выполнить обновление и повторить проверку адреса заново. + |Для обновления адресного классификатора необходимо обратиться к администратору.'"); + ПоказатьПредупреждение(, СообщениеОПроверкеАдреса); + Иначе + ПоказатьПредупреждение(, НСтр("ru='Адрес введен корректно.'")); + КонецЕсли; + + Возврат; + КонецЕсли; + + // Сообщаем список с привязкой к полям. + Для Каждого Элемент Из СписокОшибок Цикл + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Элемент.Представление); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьАдресКлиент() + + Контекст = КонтекстФормыКлиент(); + ОчиститьАдресСервер(Контекст); + КонтекстФормыКлиент(Контекст); + + Модифицированность = Истина; +КонецПроцедуры + +&НаСервере +Процедура ОчиститьАдресСервер(Контекст) + + Контекст.ПредставлениеАдреса = ""; + Контекст.Комментарий = ""; + Контекст.Индекс = Неопределено; + + XDTOКонтактнаяИнфо = КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст); + ЗаполнитьПредставлениеАдреса(Контекст, XDTOКонтактнаяИнфо); + + // Очищаем непосредственно на форме, в контексте уже очищено. +КонецПроцедуры + +&НаСервере +Процедура УстановитьКлючИспользованияФормы() + КлючСохраненияПоложенияОкна = Строка(Страна); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Преобразовываем Реквизиты формы <-> Структура +// +&НаКлиенте +Функция КонтекстФормыКлиент(НовыеДанные = Неопределено) + + СписокРеквизитов = "ВидКонтактнойИнформации, + |Страна, КодСтраны, ОсновнаяСтрана, СкрыватьНеактуальныеАдреса, + |Индекс, ПредставлениеАдреса, Комментарий, КопияКомментария, + | ПредставлениеАдресаИзменено, Модифицированность"; + + Если НовыеДанные = Неопределено Тогда + // Читаем + Результат = Новый Структура(СписокРеквизитов); + ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, СписокРеквизитов); + Возврат Результат; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НовыеДанные, СписокРеквизитов); + + Возврат НовыеДанные; +КонецФункции + +// Представление разрешено менять только при вводе в режиме ввода в свободной форме. +// Поэтому необходимо привести остальные поля к измененному представлению. +// Страну не трогаем, режим свободного ввода возможен только в России. +// +&НаСервере +Процедура ПредставлениеАдресаПриИзмененииСервер() + + Если Страна = ОсновнаяСтрана Тогда + // Пытаемся разобрать заново + XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(ПредставлениеАдреса, ВидКонтактнойИнформации); + XDTOКонтактная.Представление = ПредставлениеАдреса; + XDTOКонтактная.Комментарий = Комментарий; + + // И проставляем в реквизиты, кроме страны и представления. + ТекущееПредставление = ПредставлениеАдреса; + ТекущаяСтрана = Страна; + + ОчиститьАдресСервер(ЭтотОбъект); + + // Возможно будет отключен свободного ввода. + ЗначениеРеквизитовПоКонтактнойИнформации(ЭтотОбъект, XDTOКонтактная); + + ПредставлениеАдреса = ТекущееПредставление; + Страна = ТекущаяСтрана; + КонецЕсли; + + // Включаем режим свободного ввода принудительно. + РазрешитьВводАдресаВСвободнойФорме = Истина; + Модифицированность = Истина; +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ОсновнаяСтрана() + + Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + Возврат МодульРаботаСАдресами.ОсновнаяСтрана(); + КонецЕсли; + + Возврат Справочники.СтраныМира.ПустаяСсылка(); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form index ba991c82c..8541d14e5 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form @@ -233,6 +233,10 @@ true + + <key>ru</key> + <value>Телефона</value> + ГруппаТелефонаExtendedTooltip 40 @@ -581,12 +585,8 @@ <key>ru</key> - <value>Группа стандартные команды</value> + <value>Стандартные команды</value> - - ru - Группа стандартные команды - ГруппаСтандартныеКомандыРасширеннаяПодсказка 67 diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl index 92612d91d..affe8fbfb 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl @@ -69,7 +69,7 @@ Элементы.Добавочный.Видимость = ВидКонтактнойИнформации.ТелефонCДобавочнымНомером; // Группа команд "все действия" зависит от интерфейса. - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда Элементы.ФормаВсеДействия.Видимость = Ложь; Иначе Элементы.ОчиститьТелефон.Видимость = Ложь; diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form index 963a91d9a..65241b2fc 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form @@ -10,6 +10,10 @@ История 1 + + <key>ru</key> + <value>История</value> + true true @@ -290,6 +294,10 @@ true + + <key>ru</key> + <value>История группа действия</value> + ИсторияГруппаДействияРасширеннаяПодсказка 33 @@ -341,10 +349,6 @@ ru История группа справка - - ru - История группа справка - ИсторияГруппаСправкаРасширеннаяПодсказка 35 @@ -634,12 +638,8 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> - - ru - Группа командная панель - ГруппаКоманднаяПанельРасширеннаяПодсказка 37 diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html index bd0ae488c..94325054d 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html @@ -6,4 +6,4 @@
            • Для этого выделите нужную строку с адресом, нажмите Изменить. После этого становится доступной кнопка  Выбрать, по которой открывается шаблон ввода адреса.
            • В окне шаблона для актуального адреса выводится сообщение Адрес действует в настоящее время.

            См. также

            \ No newline at end of file +
          \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Module.bsl index e02347738..9edd72ed1 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Module.bsl @@ -90,11 +90,6 @@ Процедура ИсторияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; - - Если Копирование Тогда - Возврат; - КонецЕсли; - Если РежимВыбора Тогда СформироватьДанные(Истина); Иначе diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html index e6d9c6445..923ef7d61 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html @@ -3,7 +3,6 @@

          Контактную информацию можно вводить:

          • в виде произвольной строки,
          • с помощью шаблонов.

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

          -

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

          Использование шаблона при вводе телефонов и факсов облегчает ввод информации, сокращает количество ошибок при вводе.

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

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

          diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ManagerModule.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ManagerModule.bsl index 95d50b2bc..fd1a0176f 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ManagerModule.bsl @@ -7,16 +7,15 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Если Параметры <> Неопределено И Параметры.Свойство("ОткрытаПоСценарию") Тогда - СтандартнаяОбработка = Ложь; - ВидИнформации = Параметры.ВидКонтактнойИнформации; - ВыбраннаяФорма = ИмяФормыВводаКонтактнойИнформации(ВидИнформации); - - Если ВыбраннаяФорма = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Не обрабатываемый тип адреса: """ + ВидИнформации + """'"); + СтандартнаяОбработка = Ложь; + ВидИнформации = Параметры.ВидКонтактнойИнформации; + ВыбраннаяФорма = ИмяФормыВводаКонтактнойИнформации(ВидИнформации); + + Если ВыбраннаяФорма = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не обрабатываемый тип адреса: """ + ВидИнформации + """'"); + КонецЕсли; КонецЕсли; - КонецЕсли; - #КонецЕсли КонецПроцедуры @@ -24,7 +23,7 @@ #КонецОбласти #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - + #Область СлужебныеПроцедурыИФункции // Возвращает имя формы для редактирования типа контактной информации. @@ -42,7 +41,12 @@ ВсеТипы = "Перечисление.ТипыКонтактнойИнформации."; Если ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Адрес") Тогда - Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводАдреса"; + + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") = Неопределено Тогда + Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводАдресаВСвободнойФорме"; + Иначе + Возврат "Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВводАдреса"; + КонецЕсли; ИначеЕсли ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Телефон") Тогда Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона"; diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo index a26614cae..a5657f950 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo @@ -9,17 +9,17 @@ ru Ввод контактной информации - DataProcessor.ВводКонтактнойИнформации.Form.ВводАдреса + DataProcessor.ВводКонтактнойИнформации.Form.ВводАдресаВСвободнойФорме ru - ВводАдреса + ВводАдресаВСвободнойФорме ru - Ввод адреса + Ввод адреса в свободной форме @@ -43,66 +43,6 @@ PersonalComputer MobileDevice - - ВыборАдресаПоПочтовомуИндексу - - ru - Выбор адреса по почтовому индексу - - - - ru - - - PersonalComputer - MobileDevice - - - ВыборАдресаПоУровню - - ru - Выбор адреса по уровню - - - - ru - - - PersonalComputer - MobileDevice - - - ВыборДома - - ru - Выбор дома - - PersonalComputer - MobileDevice - - - ВыборУлицы - - ru - Выбор улицы - - - - ru - - - PersonalComputer - MobileDevice - - - ЗагрузкаАдресногоКлассификатора - - ru - Загрузка адресного классификатора - - PersonalComputer - MobileDevice - ИсторияКонтактнойИнформации @@ -117,18 +57,4 @@ PersonalComputer MobileDevice - - НаселенныйПунктАдреса - - ru - Населенный пункт адреса - - - - ru - - - PersonalComputer - MobileDevice - diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form index add5c46a1..1e758e97b 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form @@ -92,6 +92,10 @@ КомпоновщикНастроекОтбор 6 + + <key>ru</key> + <value>Компоновщик настроек (отбор)</value> + true true diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form index 947a84efe..22d294f61 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form @@ -68,7 +68,7 @@ <key>ru</key> - <value>Группа верхняя</value> + <value>Верхняя</value> ГруппаВерхняяРасширеннаяПодсказка @@ -450,7 +450,7 @@ <key>ru</key> - <value>Группа данные для загрузки</value> + <value>Данные для загрузки</value> ГруппаДанныеДляЗагрузкиРасширеннаяПодсказка @@ -1001,7 +1001,7 @@ <key>ru</key> - <value>Группа настройки отборов</value> + <value>Настройки отборов</value> ГруппаНастройкиОтборовРасширеннаяПодсказка @@ -1026,6 +1026,10 @@ ТаблицаПравилВыгрузки 115 + + <key>ru</key> + <value>Таблица правил выгрузки</value> + true true @@ -1456,7 +1460,7 @@ <key>ru</key> - <value>Группа данные выгрузки</value> + <value>Данные выгрузки</value> ГруппаДанныеВыгрузкиРасширеннаяПодсказка @@ -2119,10 +2123,10 @@ - РежимРаботы + РазделениеВключено <key>ru</key> - <value>Режим работы</value> + <value>Разделение включено</value> 4 diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Module.bsl index 40cd1d9bb..2c150273c 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Module.bsl @@ -47,8 +47,7 @@ Объект.ИсточникВыгрузки = "Отбор"; - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если МассивДоступныхВерсий.Количество() = 0 Тогда СтрокаПоддерживаемыеВерсииФормата = НСтр("ru='Не обнаружены поддерживаемые версии формата'"); @@ -390,7 +389,7 @@ ПутьКФайлуВыгрузки = ПолученныеФайлы[0].Имя; КонецЕсли; СообщитьОбОкончанииОперации(Ложь); - ЭтаФорма.ОбновитьОтображениеДанных(); + ЭтотОбъект.ОбновитьОтображениеДанных(); КонецЕсли; КонецПроцедуры @@ -740,14 +739,14 @@ Элементы.УзелОбмена.Видимость = (РежимРазработчика И Объект.ИсточникВыгрузки = "Узел"); Элементы.ГруппаНастройкиОтборов.Видимость = (Объект.ИсточникВыгрузки = "Отбор"); Элементы.ТаблицаПравилВыгрузки.Видимость = (Объект.ИсточникВыгрузки = "Отбор"); - Элементы.ПутьКМенеджеруОбменаВыгрузки.Видимость = РежимРазработчика И НЕ РежимРаботы.МодельСервиса; + Элементы.ПутьКМенеджеруОбменаВыгрузки.Видимость = РежимРазработчика И Не РазделениеВключено; Элементы.ИсточникВыгрузки.Видимость = РежимРазработчика; Элементы.МестоВыгрузки.Видимость = РежимРазработчика; Элементы.РезультатВыгрузки.Видимость = МестоВыгрузки = 1; Элементы.ПутьКФайлуВыгрузки.Видимость = МестоВыгрузки <> 1; Элементы.ВыгрузкаОсновное.ОтображениеСтраниц = ?(МестоВыгрузки = 1, ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет); Иначе - Элементы.ПутьКМенеджеруОбменаЗагрузки.Видимость = РежимРазработчика И НЕ РежимРаботы.МодельСервиса; + Элементы.ПутьКМенеджеруОбменаЗагрузки.Видимость = РежимРазработчика И Не РазделениеВключено; Элементы.ИсточникЗагрузки.Видимость = РежимРазработчика; Элементы.ГруппаДанныеДляЗагрузки.Видимость = (ИсточникЗагрузки = 1); Элементы.ПутьКФайлуЗагрузки.Видимость = (ИсточникЗагрузки <> 1); @@ -908,7 +907,7 @@ Элементы.ФормаВыполнитьОперацию.Видимость = ФлагДоступность; Элементы.ФормаВключитьРасширенныеВозможности.Доступность = ФлагДоступность; Элементы.ФормаПрервать.Видимость = НЕ ФлагДоступность И НЕ ЭтоВнешняяОбработка; - ЭтаФорма.ОбновитьОтображениеДанных(); + ЭтотОбъект.ОбновитьОтображениеДанных(); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Help/ru.html b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Help/ru.html index e73c245fb..024bf6a76 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Help/ru.html +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

          Работа обработки, встроенной в конфигурацию

          diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl index 67d5e20e4..ef7248c61 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl @@ -25,10 +25,8 @@ КомпонентыОбмена.ВерсияФорматаОбмена = ВерсияФормата; КомпонентыОбмена.XMLСхема = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData/" + ТекВерсияФормата; - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); МенеджерОбменаВнутренний = Ложь; - Если РежимРаботы.МодельСервиса Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда МенеджерОбменаВнутренний = Истина; ИначеЕсли НаправлениеОбмена = "Отправка" И ЗначениеЗаполнено(ПутьКМенеджеруОбменаВыгрузки) Тогда Попытка @@ -44,8 +42,7 @@ ПутьКМенеджеруОбменаЗагрузки = ""; МенеджерОбменаВнутренний = Истина; КонецПопытки; - ИначеЕсли ЗначениеЗаполнено(УзелОбмена) - И ОбщегоНазначения.ЕстьРеквизитОбъекта("ПутьКМенеджеруОбмена", УзелОбмена.Метаданные()) Тогда + ИначеЕсли ЗначениеЗаполнено(УзелОбмена) Тогда ПутьКМенеджеруОбмена = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелОбмена, "ПутьКМенеджеруОбмена"); Если ЗначениеЗаполнено(ПутьКМенеджеруОбмена) Тогда КомпонентыОбмена.МенеджерОбмена = ВнешниеОбработки.Создать(ПутьКМенеджеруОбмена); @@ -714,7 +711,7 @@ Продолжить; КонецЕсли; - Позиция = Найти(ИмяПоля, "."); + Позиция = СтрНайти(ИмяПоля, "."); ИмяТаблицы = Лев(ИмяПоля, Позиция - 1); МетаданныеТабличнойЧасти = МетаданныеОбъекта.ТабличныеЧасти.Найти(ИмяТаблицы); @@ -813,7 +810,7 @@ КонецЕсли; - Позиция = Найти(ИмяПоля, "."); + Позиция = СтрНайти(ИмяПоля, "."); ИмяТаблицы = Лев(ИмяПоля, Позиция - 1); МетаТабличнаяЧасть = МетаОбъекта.ТабличныеЧасти.Найти(ИмяТаблицы); diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form index 9efe53618..41fe42ea4 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form @@ -86,10 +86,6 @@ ru Ожидание синхронизации данных - - ru - Ожидание синхронизации данных - ОжиданиеСинхронизацииДанныхExtendedTooltip 97 @@ -230,10 +226,6 @@ ru Ожидание синхронизации данных - - ru - Ожидание синхронизации данных - ОжиданиеСинхронизацииДанныхПрогрессБарЗагрузкаРасширеннаяПодсказка 171 @@ -375,10 +367,6 @@ ru Ожидание синхронизации данных - - ru - Ожидание синхронизации данных - ОжиданиеСинхронизацииДанныхПрогрессБарВыгрузкаРасширеннаяПодсказка 182 @@ -484,10 +472,6 @@ ru Обмен завершен успешно - - ru - Обмен завершен успешно - ОбменЗавершенУспешноExtendedTooltip 102 @@ -586,10 +570,6 @@ ru Обмен завершен с ошибкой - - ru - Обмен завершен с ошибкой - ОбменЗавершенСОшибкойExtendedTooltip 105 @@ -717,10 +697,6 @@ ru Статусное сообщение - - ru - Статусное сообщение - СтатусноеСообщениеExtendedTooltip 110 @@ -750,10 +726,6 @@ ru Обмен завершен с ошибкой - - ru - Обмен завершен с ошибкой - ОбменЗавершенСОшибкойДляАдминистратораExtendedTooltip 108 @@ -969,10 +941,6 @@ ru Требуется обновление ограниченные права - - ru - Требуется обновление ограниченные права - ТребуетсяОбновлениеОграниченныеПраваExtendedTooltip 119 @@ -1038,10 +1006,6 @@ ru Требуется обновление полные права - - ru - Требуется обновление полные права - ТребуетсяОбновлениеПолныеПраваExtendedTooltip 121 @@ -1068,10 +1032,6 @@ ru Панель требуется обновление - - ru - Панель требуется обновление - ПанельТребуетсяОбновлениеExtendedTooltip 118 @@ -1096,10 +1056,6 @@ ru Требуется обновление - - ru - Требуется обновление - ТребуетсяОбновлениеExtendedTooltip 116 @@ -1184,6 +1140,10 @@ true + + <key>ru</key> + <value>Ошибка расхождения версий</value> + ОшибкаРасхожденияВерсийРасширеннаяПодсказка 152 @@ -1209,10 +1169,6 @@ ru Статус завершения обмена - - ru - Статус завершения обмена - СтатусЗавершенияОбменаExtendedTooltip 101 @@ -1271,10 +1227,6 @@ ru Командная панель закрыть - - ru - Командная панель закрыть - КоманднаяПанельЗакрытьExtendedTooltip 125 @@ -1299,10 +1251,6 @@ ru Действия закрыть - - ru - Действия закрыть - ДействияЗакрытьExtendedTooltip 124 @@ -1386,10 +1334,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельУстановитьЗакрытьExtendedTooltip 128 @@ -1414,10 +1358,6 @@ ru Действия установить закрыть - - ru - Действия установить закрыть - ДействияУстановитьЗакрытьExtendedTooltip 127 @@ -1501,6 +1441,10 @@ true + + <key>ru</key> + <value>Командная панель продолжить отмена</value> + КоманднаяПанельПродолжитьОтменаРасширеннаяПодсказка 165 @@ -1521,6 +1465,10 @@ true + + <key>ru</key> + <value>Действия продолжить отмена</value> + ДействияПродолжитьОтменаРасширеннаяПодсказка 163 @@ -1547,10 +1495,6 @@ ru Панель действий - - ru - Панель действий - ПанельДействийExtendedTooltip 123 @@ -1575,10 +1519,6 @@ ru Завершение обмена - - ru - Завершение обмена - ЗавершениеОбменаExtendedTooltip 100 @@ -1718,12 +1658,8 @@ <key>ru</key> - <value>Группа ввода пароля</value> + <value>Ввода пароля</value> - - ru - Группа ввода пароля - ГруппаВводаПароляРасширеннаяПодсказка 91 @@ -1750,12 +1686,8 @@ <key>ru</key> - <value>Группа запроса пароля</value> + <value>Запроса пароля</value> - - ru - Группа запроса пароля - ГруппаЗапросаПароляРасширеннаяПодсказка 132 @@ -1781,7 +1713,7 @@ ГруппаПредупрежденияДолгойСинхронизации 136 - Группа2 + ГруппаДекорацияПредупреждение 146 Декорация3 @@ -1819,8 +1751,16 @@ true + + <key>ru</key> + <value>Декорация предупреждение</value> + + + ru + Декорация предупреждения + - Группа2РасширеннаяПодсказка + ГруппаДекорацияПредупреждениеРасширеннаяПодсказка 147 Label true @@ -1840,7 +1780,7 @@ - Группа1 + ГруппаТекстПредупреждение 141 Декорация1 @@ -1948,8 +1888,16 @@ true + + <key>ru</key> + <value>Текст предупреждение</value> + + + ru + Текст предупреждения + - Группа1РасширеннаяПодсказка + ГруппаТекстПредупреждениеРасширеннаяПодсказка 142 Label true @@ -1975,12 +1923,8 @@ <key>ru</key> - <value>Группа предупреждения долгой синхронизации</value> + <value>Предупреждения долгой синхронизации</value> - - ru - Группа предупреждения долгой синхронизации - ГруппаПредупрежденияДолгойСинхронизацииРасширеннаяПодсказка 137 @@ -2060,6 +2004,10 @@ true + + <key>ru</key> + <value>Командная панель выполнения обмена</value> + ru Командная панель закрыть @@ -2118,10 +2066,6 @@ ru Выполнение обмена данными - - ru - Выполнение обмена данными - ВыполнениеОбменаДаннымиExtendedTooltip 88 diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl index 952e34478..268a5fc1e 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl @@ -51,7 +51,7 @@ ВыполнитьОтправкуДанных = Ложь; Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") - И ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + И ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто() Тогда МодульАвтономнаяРабота = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРабота"); НеНапоминатьОДолгойСинхронизации = Не МодульАвтономнаяРабота.ФлагНастройкиВопросаОДолгойСинхронизации(); @@ -145,7 +145,7 @@ КонецЕсли; - Если Не ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если Не ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто() Тогда ПроверятьРасхождениеВерсий = Истина; КонецЕсли; @@ -216,7 +216,7 @@ &НаКлиенте Процедура ЗабылиПароль(Команда) - ОбменДаннымиКлиент.ПриОткрытииИнструкцииКакИзменитьПарольСинхронизацииДанных(АдресДляВосстановленияПароляУчетнойЗаписи); + ОбменДаннымиКлиент.ОткрытьИнструкциюКакИзменитьПарольСинхронизацииДанных(АдресДляВосстановленияПароляУчетнойЗаписи); КонецПроцедуры @@ -709,8 +709,8 @@ Функция ДанныеОтбораЖурналаРегистрации(УзелИнформационнойБазы) ОтбираемыеСобытия = Новый Массив; - ОтбираемыеСобытия.Добавить(ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных)); - ОтбираемыеСобытия.Добавить(ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных)); + ОтбираемыеСобытия.Добавить(ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных)); + ОтбираемыеСобытия.Добавить(ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных)); СостоянияОбменовДаннымиЗагрузка = ОбменДаннымиСервер.СостоянияОбменовДанными(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); СостоянияОбменовДаннымиВыгрузка = ОбменДаннымиСервер.СостоянияОбменовДанными(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); @@ -728,7 +728,7 @@ Функция СохранитьФлагВопросаОДолгойСинхронизацииСервер(Знач Флаг, Настройки = Неопределено) Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") - И ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + И ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто() Тогда МодульАвтономнаяРабота = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРабота"); НадоСохранять = Флаг <> МодульАвтономнаяРабота.ФлагНастройкиВопросаОДолгойСинхронизации(); diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form index 83a0f6482..b17fc136e 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form @@ -7,6 +7,10 @@ ДоступныеОбъектыДляИзменения 8 + + <key>ru</key> + <value>Доступные объекты для изменения</value> + true true @@ -118,10 +122,6 @@ ru Доступные объекты для изменения группа - - ru - Доступные объекты для изменения группа - ДоступныеОбъектыДляИзмененияГруппаРасширеннаяПодсказка 27 @@ -256,9 +256,6 @@ ДоступныеОбъектыДляИзменения.Picture - None - None - None true diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form index 220c40bb1..997db0ed6 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form @@ -10,6 +10,10 @@ КомпоновщикНастроекНастройкиОтбор 23 + + <key>ru</key> + <value>Компоновщик настроек настройки отбор</value> + true true @@ -64,10 +68,6 @@ ru Компоновщик настроек настройки отбор стандартные кнопки - - ru - Компоновщик настроек настройки отбор стандартные кнопки - КомпоновщикНастроекНастройкиОтборСтандартныеКнопкиРасширеннаяПодсказка 52 @@ -90,6 +90,10 @@ true + + <key>ru</key> + <value>Компоновщик настроек настройки отбор группа 1</value> + КомпоновщикНастроекНастройкиОтборГруппа1РасширеннаяПодсказка 97 @@ -228,9 +232,6 @@ true true true - None - None - None true All false @@ -244,10 +245,6 @@ ru Условия отбора - - ru - Группа условия отбора - ГруппаУсловияОтбораРасширеннаяПодсказка 28 @@ -276,6 +273,10 @@ Список 74 + + <key>ru</key> + <value>Список</value> + true true @@ -528,9 +529,6 @@ Список.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl index 1a87138c3..cbe870032 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl @@ -110,8 +110,6 @@ КоличествоВыбранных = ВыбранныеОбъекты().Строки.Количество(); Если КоличествоВыбранных > 1000 Тогда КоличествоВыбранных = НСтр("ru = '> 1000'"); - ИначеЕсли КоличествоВыбранных = 0 Тогда - Список.КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное); КонецЕсли; Элементы.ГруппаВыбранныеОбъекты.Заголовок = ПодставитьПараметрыВСтроку(НСтр("ru = 'Выбранные элементы (%1)'"), КоличествоВыбранных); @@ -137,7 +135,7 @@ Если Не ПустаяСтрока(ВыбранныеТипы) Тогда ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - ТекстЗапроса = ОбработкаОбъект.ТекстЗапроса(ВыбранныеТипы); + ТекстЗапроса = ОбработкаОбъект.ТекстЗапроса(ВыбранныеТипы, Истина); СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных; @@ -160,7 +158,6 @@ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); - АдресСпискаВыбранных = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); КонецЕсли; Возврат Результат; diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form index 8769a9741..240c6e331 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form @@ -59,12 +59,8 @@ <key>ru</key> - <value>Группа изменять в транзакции</value> + <value>Изменять в транзакции</value> - - ru - Группа изменять в транзакции - ГруппаИзменятьВТранзакцииExtendedTooltip 53 @@ -136,12 +132,8 @@ <key>ru</key> - <value>Группа прерывание при ошибке</value> + <value>Прерывание при ошибке</value> - - ru - Группа прерывание при ошибке - ГруппаПрерываниеПриОшибкеExtendedTooltip 56 @@ -213,12 +205,8 @@ <key>ru</key> - <value>Группа обрабатывать рекурсивно</value> + <value>Обрабатывать рекурсивно</value> - - ru - Группа обрабатывать рекурсивно - ГруппаОбрабатыватьРекурсивноExtendedTooltip 59 @@ -293,12 +281,8 @@ <key>ru</key> - <value>Группа показывать служебные реквизиты</value> + <value>Показывать служебные реквизиты</value> - - ru - Группа показывать служебные реквизиты - ГруппаПоказыватьСлужебныеРеквизитыРасширеннаяПодсказка 79 @@ -374,12 +358,8 @@ <key>ru</key> - <value>Группа режим разработчика</value> + <value>Режим разработчика</value> - - ru - Группа режим разработчика - ГруппаРежимРазработчикаРасширеннаяПодсказка 87 @@ -451,12 +431,8 @@ <key>ru</key> - <value>Группа настройки выбора из списков</value> + <value>Настройки выбора из списков</value> - - ru - Группа настройки выбора из списков - ГруппаНастройкиВыбораИзСписковРасширеннаяПодсказка 92 @@ -486,10 +462,6 @@ ru Специальные возможности - - ru - Специальные возможности - СпециальныеВозможностиРасширеннаяПодсказка 97 diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form index a3d47e093..6a02b4a1c 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form @@ -1,7 +1,7 @@ - Группа + ГруппаОперандыИОператоры 1 ГруппаОсновная @@ -18,6 +18,10 @@ ДеревоОперандов 69 + + <key>ru</key> + <value>Дерево операндов</value> + true true @@ -130,10 +134,6 @@ ru Дерево операндов группа представление код картинки - - ru - Дерево операндов группа представление код картинки - ДеревоОперандовГруппаПредставлениеКодКартинкиРасширеннаяПодсказка 86 @@ -313,9 +313,6 @@ ДеревоОперандов.КодКартинки - None - None - None true true @@ -327,10 +324,6 @@ ru Страница дерево операндов - - ru - Страница дерево операндов - СтраницаДеревоОперандовРасширеннаяПодсказка 68 @@ -354,6 +347,10 @@ Операнды 3 + + <key>ru</key> + <value>Операнды</value> + true true @@ -629,9 +626,6 @@ CommonPicture.КоллекцияПиктограммЭлементов - None - None - None true @@ -644,10 +638,6 @@ ru Страница числовых операндов - - ru - Страница числовых операндов - СтраницаЧисловыхОперандовExtendedTooltip 38 @@ -670,6 +660,10 @@ КомпоновщикНастроек 29 + + <key>ru</key> + <value>Компоновщик настроек</value> + true true @@ -806,9 +800,6 @@ true true true - None - None - None true true @@ -820,10 +811,6 @@ ru Страница строковых операндов - - ru - Страница строковых операндов - СтраницаСтроковыхОперандовExtendedTooltip 41 @@ -847,12 +834,8 @@ <key>ru</key> - <value>Группа операнды страницы</value> + <value>Операнды страницы</value> - - ru - Группа операнды страницы - ГруппаОперандыСтраницыExtendedTooltip 37 @@ -877,10 +860,6 @@ ru Операнды - - ru - Операнды - ГруппаОперандыExtendedTooltip 36 @@ -909,6 +888,10 @@ Операторы 8 + + <key>ru</key> + <value>Операторы</value> + true true @@ -1086,9 +1069,6 @@ true true true - None - None - None true true @@ -1100,10 +1080,6 @@ ru Операторы и функции - - ru - Операторы и функции - ГруппаОператорыExtendedTooltip 43 @@ -1133,12 +1109,8 @@ <key>ru</key> - <value>Группа основная</value> + <value>Основная</value> - - ru - Группа основная - ГруппаОсновнаяExtendedTooltip 35 @@ -1208,8 +1180,12 @@ true + + <key>ru</key> + <value>Операнды и операторы</value> + - ГруппаExtendedTooltip + ГруппаОперандыИОператорыРасширеннаяПодсказка 34 Label true @@ -1348,12 +1324,8 @@ <key>ru</key> - <value>Группа представление</value> + <value>Представление</value> - - ru - Группа представление - ГруппаПредставлениеРасширеннаяПодсказка 63 diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form index cb55014b5..2405b912f 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form @@ -109,10 +109,6 @@ ru Выбор элементов для изменения - - ru - Отбор объектов - ОтборОбъектовРасширеннаяПодсказка 111 @@ -485,9 +481,6 @@ CommonPicture.ВидыОпераций - None - None - None true @@ -566,12 +559,8 @@ <key>ru</key> - <value>Группа нет реквизитов</value> + <value>Нет реквизитов</value> - - ru - Группа нет реквизитов - ГруппаНетРеквизитовРасширеннаяПодсказка 262 @@ -601,10 +590,6 @@ ru Реквизиты - - ru - Реквизиты - РеквизитыРасширеннаяПодсказка 115 @@ -631,10 +616,6 @@ ru Состав объекта - - ru - Состав объекта - СоставОбъектаРасширеннаяПодсказка 113 @@ -660,10 +641,6 @@ ru Изменяемые реквизиты - - ru - Изменяемые реквизиты - ИзменяемыеРеквизитыРасширеннаяПодсказка 184 @@ -781,6 +758,10 @@ true + + <key>ru</key> + <value>Алгоритм</value> + ГруппаАлгоритмРасширеннаяПодсказка 284 @@ -853,10 +834,6 @@ ru Реквизиты: - - ru - Страница с надписью реквизиты - true СтраницаСНадписьюРеквизитыРасширеннаяПодсказка @@ -929,10 +906,6 @@ ru Страница невидимая - - ru - Страница невидимая - СтраницаНевидимаяРасширеннаяПодсказка 314 @@ -955,6 +928,10 @@ true + + <key>ru</key> + <value>Страницы для выравнивания</value> + ГруппаСтраницыДляВыравниванияРасширеннаяПодсказка 310 @@ -973,6 +950,10 @@ РеквизитыОбъектаАлгоритм 315 + + <key>ru</key> + <value>Реквизиты объекта алгоритм</value> + true true @@ -1155,12 +1136,8 @@ <key>ru</key> - <value>Группа реквизиты для алгоритма</value> + <value>Реквизиты для алгоритма</value> - - ru - Группа реквизиты для алгоритма - ГруппаРеквизитыДляАлгоритмаРасширеннаяПодсказка 286 @@ -1186,6 +1163,10 @@ true + + <key>ru</key> + <value>Произвольный алгоритм</value> + ГруппаПроизвольныйАлгоритмРасширеннаяПодсказка 282 @@ -1338,6 +1319,10 @@ true + + <key>ru</key> + <value>Параметры выполнения алгоритма</value> + ПараметрыВыполненияАлгоритмаРасширеннаяПодсказка 342 @@ -1366,10 +1351,6 @@ ru Произвольный алгоритм - - ru - Произвольный алгоритм - ПроизвольныйАлгоритмРасширеннаяПодсказка 274 @@ -1392,6 +1373,10 @@ true + + <key>ru</key> + <value>Страницы вид операции</value> + СтраницыВидОперацииРасширеннаяПодсказка 272 @@ -1447,10 +1432,6 @@ ru Алгоритмы - - ru - Алгоритмы - АлгоритмыРасширеннаяПодсказка 338 @@ -1505,10 +1486,6 @@ ru Ранее измененные реквизиты - - ru - Ранее измененные реквизиты - РанееИзмененныеРеквизитыРасширеннаяПодсказка 190 @@ -1565,10 +1542,6 @@ ru Панель настроек - - ru - Панель настроек - ПанельНастроекРасширеннаяПодсказка 188 @@ -1632,10 +1605,6 @@ ru Настройка изменений - - ru - Настройка изменений - НастройкаИзмененийExtendedTooltip 75 @@ -1955,9 +1924,6 @@ true true true - None - None - None true @@ -2013,12 +1979,8 @@ <key>ru</key> - <value>Группа объекты которые не удалось изменить</value> + <value>Объекты которые не удалось изменить</value> - - ru - Группа объекты которые не удалось изменить - ГруппаОбъектыКоторыеНеУдалосьИзменитьРасширеннаяПодсказка 159 @@ -2048,10 +2010,6 @@ ru Изменение объектов - - ru - Изменение объектов - ИзменениеОбъектовExtendedTooltip 86 @@ -2182,10 +2140,6 @@ ru Ожидание обработки - - ru - Ожидание обработки - ОжиданиеОбработкиExtendedTooltip 101 @@ -2279,6 +2233,10 @@ true + + <key>ru</key> + <value>Успешно завершено</value> + ГруппаУспешноЗавершеноРасширеннаяПодсказка 218 @@ -2334,10 +2292,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 74 @@ -2394,10 +2348,6 @@ ru Кнопки слева - - ru - Кнопки слева - КнопкиСлеваРасширеннаяПодсказка 210 @@ -2481,10 +2431,6 @@ ru Кнопки справа - - ru - Кнопки справа - КнопкиСправаРасширеннаяПодсказка 212 @@ -2509,10 +2455,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 214 @@ -2847,10 +2789,10 @@
          - РезультатФоновогоЗадания + ДлительнаяОперация <key>ru</key> - <value>Результат фонового задания</value> + <value>Длительная операция</value> 19 diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl index bff1bdc76..030ed3ac2 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl @@ -258,19 +258,14 @@ Если НазначениеКнопки = "Прервать" Тогда ТекущееСостояниеИзменения.ПрерватьИзменение = Истина; - Если Не РезультатФоновогоЗадания.Статус = "Выполнено" Тогда + Если Не ДлительнаяОперация.Статус = "Выполнено" Тогда ЗавершитьИзменениеОбъектов(); КонецЕсли; Возврат; КонецЕсли; - Если НазначениеКнопки = "Изменить" Или НазначениеКнопки = "Повторить" Тогда - // Сброс кэша и выбор объектов с табличными частями. - КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(Истина, Истина); - КонецЕсли; - Если НазначениеКнопки = "Изменить" Тогда - Если КоличествоОбъектовДляОбработки = 0 Тогда + Если Не ЕстьВыбранныеОбъекты() Тогда ПоказатьПредупреждение(, НСтр("ru = 'Не указаны элементы для изменения'")); Возврат; КонецЕсли; @@ -333,13 +328,13 @@ ТекущиеДанные = ПолеФормы.Родитель.ТекущиеДанные; ТекущиеДанные.Изменять = ЗначениеЗаполнено(ТекущиеДанные.Значение); ОбновитьСчетчикиИзменяемыхРеквизитов(ПолеФормы.Родитель); - СформироватьПояснениеОНастроенныхИзменениях(); + ПодключитьОбработчикОжидания("ОбновитьПояснениеОНастроенныхИзменениях", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ПриИзмененииФлажка(ПолеФормы) ОбновитьСчетчикиИзменяемыхРеквизитов(ПолеФормы.Родитель); - СформироватьПояснениеОНастроенныхИзменениях(); + ПодключитьОбработчикОжидания("ОбновитьПояснениеОНастроенныхИзменениях", 0.1, Истина); КонецПроцедуры &НаКлиенте @@ -379,6 +374,11 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура ОбновитьПояснениеОНастроенныхИзменениях() + СформироватьПояснениеОНастроенныхИзменениях(); +КонецПроцедуры + &НаКлиенте Процедура РеквизитыОбъектаЗначениеЗавершениеВыбора(Формула, ТекущиеДанные) Экспорт Если Формула = Неопределено Тогда @@ -743,40 +743,28 @@ &НаСервере Процедура УстановитьПараметрыВыбораСервер(ПараметрыВыбора, ПараметрыВыбораМассив) - Для Индекс = 1 По СтрЧислоСтрок(ПараметрыВыбора) Цикл - - ПараметрыВыбораСтрока = СтрПолучитьСтроку(ПараметрыВыбора, Индекс); - - ПараметрыВыбораМассивСтрок = СтрРазделить(ПараметрыВыбораСтрока, ";"); - ИмяПоляОтбора = СокрЛП(ПараметрыВыбораМассивСтрок[0]); - ИмяТипа = СокрЛП(ПараметрыВыбораМассивСтрок[1]); - XMLСтрока = СокрЛП(ПараметрыВыбораМассивСтрок[2]); - - Если Тип(ИмяТипа) = Тип("ФиксированныйМассив") Тогда - - Массив = Новый Массив; - - XMLСтрокаМассив = СтрРазделить(XMLСтрока, "#"); - - Для Каждого Элемент Из XMLСтрокаМассив Цикл - - ЭлементМассив = СтрРазделить(Элемент, "*"); - - ЗначениеЭлемента = XMLЗначение(Тип(ЭлементМассив[0]), ЭлементМассив[1]); - - Массив.Добавить(ЗначениеЭлемента); - - КонецЦикла; - - Значение = Новый ФиксированныйМассив(Массив); - - Иначе - Значение = XMLЗначение(Тип(ИмяТипа), XMLСтрока); - КонецЕсли; - - ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПоляОтбора, Значение)); + Для Индекс = 1 По СтрЧислоСтрок(ПараметрыВыбора) Цикл + ПараметрыВыбораСтрока = СтрПолучитьСтроку(ПараметрыВыбора, Индекс); + ПараметрыВыбораМассивСтрок = СтрРазделить(ПараметрыВыбораСтрока, ";"); + ИмяПоляОтбора = СокрЛП(ПараметрыВыбораМассивСтрок[0]); + ИмяТипа = СокрЛП(ПараметрыВыбораМассивСтрок[1]); + XMLСтрока = СокрЛП(ПараметрыВыбораМассивСтрок[2]); - КонецЦикла; + Если Тип(ИмяТипа) = Тип("ФиксированныйМассив") Тогда + Массив = Новый Массив; + XMLСтрокаМассив = СтрРазделить(XMLСтрока, "#"); + Для Каждого Элемент Из XMLСтрокаМассив Цикл + ЭлементМассив = СтрРазделить(Элемент, "*"); + ЗначениеЭлемента = XMLЗначение(Тип(ЭлементМассив[0]), ЭлементМассив[1]); + Массив.Добавить(ЗначениеЭлемента); + КонецЦикла; + Значение = Новый ФиксированныйМассив(Массив); + Иначе + Значение = XMLЗначение(Тип(ИмяТипа), XMLСтрока); + КонецЕсли; + + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПоляОтбора, Значение)); + КонецЦикла; КонецПроцедуры @@ -875,7 +863,6 @@ ОткрытьФорму(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами, ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения); Иначе - МассивСсылок = Новый Массив; ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок); @@ -947,7 +934,7 @@ ОчиститьСообщения(); ТекущееСостояниеИзменения = Новый Структура; - КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(); + КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(Истина, Истина); Если Объект.ИзменятьВТранзакции Тогда @@ -1010,7 +997,7 @@ &НаКлиенте Процедура ИзменитьПорциюОбъектов() - ДлительнаяОперация = ИзменитьНаСервере(ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке); + ИзменитьНаСервере(ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке); Если ДлительнаяОперация.Статус = "Выполнено" Тогда ОбработатьРезультатИзменения(ПолучитьИзВременногоХранилища(ДлительнаяОперация.АдресРезультата)); @@ -1067,8 +1054,7 @@ КонецЕсли; ТекстВопроса = НСтр("ru = 'При изменении элементов (группы элементов) возникли ошибки. - |Прервать изменение элементов и перейти к просмотру ошибок? - |'"); + |Прервать изменение элементов и перейти к просмотру ошибок?'"); Кнопки = Новый СписокЗначений; Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'")); Кнопки.Добавить(КодВозвратаДиалога.Пропустить, НСтр("ru = 'Продолжить'")); @@ -1208,9 +1194,9 @@ &НаСервере Процедура ЗавершающиеДействияПриИзмененииСервер() - Если РезультатФоновогоЗадания.Свойство("ИдентификаторЗадания") Тогда + Если ДлительнаяОперация.Свойство("ИдентификаторЗадания") Тогда МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); - МодульДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатФоновогоЗадания.ИдентификаторЗадания); + МодульДлительныеОперации.ОтменитьВыполнениеЗадания(ДлительнаяОперация.ИдентификаторЗадания); КонецЕсли; Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов; @@ -1373,68 +1359,43 @@ КонецФункции &НаСервере -Функция ИзменитьНаСервере(Знач ОстанавливатьИзменениеПриОшибке) +Процедура ИзменитьНаСервере(Знач ОстанавливатьИзменениеПриОшибке) ОбъектыДляОбработки = СледующаяПорцияОбъектовДляИзменения(); ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ОбрабатываемыеОбъекты", Новый ХранилищеЗначения(ОбъектыДляОбработки)); - СтруктураПараметров.Вставить("ОстанавливатьИзменениеПриОшибке", ОстанавливатьИзменениеПриОшибке); - СтруктураПараметров.Вставить("ИзменятьВТранзакции", ОбработкаОбъект.ИзменятьВТранзакции); - СтруктураПараметров.Вставить("ПрерыватьПриОшибке", ОбработкаОбъект.ПрерыватьПриОшибке); - СтруктураПараметров.Вставить("ТипОперации", ОбработкаОбъект.ТипОперации); - СтруктураПараметров.Вставить("КодАлгоритма", КодАлгоритма); - СтруктураПараметров.Вставить("РежимВыполнения", ОбработкаОбъект.РежимВыполнения); - СтруктураПараметров.Вставить("ВариантЗаписиОбъекта", ОбработкаОбъект.ВариантЗаписиОбъекта); - СтруктураПараметров.Вставить("ИспользуютсяДопРеквизиты", ОбработкаОбъект.ИспользуютсяДопРеквизиты); - СтруктураПараметров.Вставить("ИспользуютсяДопСведения", ОбработкаОбъект.ИспользуютсяДопСведения); - СтруктураПараметров.Вставить("ИзменяемыеРеквизиты", ИзменяемыеРеквизиты()); - СтруктураПараметров.Вставить("ДоступныеРеквизиты", ТаблицаЗначенийВМассив(РеквизитыОбъекта.Выгрузить(, "Имя,Представление,ВидОперации,Свойство"))); - СтруктураПараметров.Вставить("ИзменяемыеТабличныеЧасти", ИзменяемыеТабличныеЧасти()); - СтруктураПараметров.Вставить("ОбъектыДляИзменения", Новый ХранилищеЗначения(ВыбранныеОбъекты())); - СтруктураПараметров.Вставить("РежимРазработчика", ОбработкаОбъект.РежимРазработчика); + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("ОбрабатываемыеОбъекты", Новый ХранилищеЗначения(ОбъектыДляОбработки)); + ПараметрыЗадания.Вставить("ОстанавливатьИзменениеПриОшибке", ОстанавливатьИзменениеПриОшибке); + ПараметрыЗадания.Вставить("ИзменятьВТранзакции", ОбработкаОбъект.ИзменятьВТранзакции); + ПараметрыЗадания.Вставить("ПрерыватьПриОшибке", ОбработкаОбъект.ПрерыватьПриОшибке); + ПараметрыЗадания.Вставить("ТипОперации", ОбработкаОбъект.ТипОперации); + ПараметрыЗадания.Вставить("КодАлгоритма", КодАлгоритма); + ПараметрыЗадания.Вставить("РежимВыполнения", ОбработкаОбъект.РежимВыполнения); + ПараметрыЗадания.Вставить("ВариантЗаписиОбъекта", ОбработкаОбъект.ВариантЗаписиОбъекта); + ПараметрыЗадания.Вставить("ИспользуютсяДопРеквизиты", ОбработкаОбъект.ИспользуютсяДопРеквизиты); + ПараметрыЗадания.Вставить("ИспользуютсяДопСведения", ОбработкаОбъект.ИспользуютсяДопСведения); + ПараметрыЗадания.Вставить("ИзменяемыеРеквизиты", ИзменяемыеРеквизиты()); + ПараметрыЗадания.Вставить("ДоступныеРеквизиты", ТаблицаЗначенийВМассив(РеквизитыОбъекта.Выгрузить(, "Имя,Представление,ВидОперации,Свойство"))); + ПараметрыЗадания.Вставить("ИзменяемыеТабличныеЧасти", ИзменяемыеТабличныеЧасти()); + ПараметрыЗадания.Вставить("ОбъектыДляИзменения", Новый ХранилищеЗначения(ВыбранныеОбъекты())); + ПараметрыЗадания.Вставить("РежимРазработчика", ОбработкаОбъект.РежимРазработчика); ЭтоВнешняяОбработка = Не Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные()); Если Не Объект.ИзменятьВТранзакции Или Не ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); - ОбработкаОбъект.ИзменитьОбъекты(СтруктураПараметров, АдресХранилища); - РезультатФоновогоЗадания = Новый Структура("Статус, АдресРезультата", "Выполнено", АдресХранилища); + ОбработкаОбъект.ИзменитьОбъекты(ПараметрыЗадания, АдресХранилища); + ДлительнаяОперация = Новый Структура("Статус, АдресРезультата", "Выполнено", АдресХранилища); Иначе - НаименованиеЗадания = НСтр("ru = 'Групповое изменение элементов'"); - - ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки"; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ИмяОбработки", ИмяОбработки()); - ПараметрыЗадания.Вставить("ИмяМетода", "ИзменитьОбъекты"); - ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров); - ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", ЭтоВнешняяОбработка); - ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); - МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); ПараметрыВыполнения = МодульДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания; - - РезультатФоновогоЗадания = МодульДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Групповое изменение элементов'"); + ИмяПроцедуры = ОбработкаОбъект.Метаданные().ПолноеИмя() + ".МодульОбъекта.ИзменитьОбъекты"; + ДлительнаяОперация = МодульДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыЗадания, ПараметрыВыполнения); КонецЕсли; - Возврат РезультатФоновогоЗадания; - -КонецФункции - -&НаСервере -Функция ИмяОбработки() - ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - ЭтоВнешняяОбработка = Не Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные()); - ЧастиИмени = СтрРазделить(ИмяФормы, "."); - Если ЭтоВнешняяОбработка Тогда - Возврат ОбработкаОбъект.ИспользуемоеИмяФайла; - Иначе - Возврат ЧастиИмени[1]; - КонецЕсли; -КонецФункции +КонецПроцедуры &НаСервере Процедура ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок) @@ -1534,10 +1495,27 @@ КонецЕсли; КонецПроцедуры +&НаСервереБезКонтекста +Функция НастройкиОтбора() + Результат = Новый Структура; + Результат.Вставить("ОбновитьСписок", Ложь); + Результат.Вставить("ВключитьТабличныеЧастиВВыборку", Ложь); + Результат.Вставить("ОграничитьВыборку", Ложь); + Возврат Результат; +КонецФункции + &НаСервере -Функция ВыбранныеОбъекты(ОбновитьСписок = Ложь, ВключитьТабличныеЧастиВВыборку = Ложь, ТекстСообщенияОбОшибке = "") +Функция ВыбранныеОбъекты(НастройкиОтбора = Неопределено, ТекстСообщенияОбОшибке = "") - Если Не ОбновитьСписок И Не ПустаяСтрока(АдресСпискаВыбранных) Тогда + Если НастройкиОтбора = Неопределено Тогда + НастройкиОтбора = НастройкиОтбора(); + КонецЕсли; + + ОбновитьСписок = НастройкиОтбора.ОбновитьСписок; + ВключитьТабличныеЧастиВВыборку = НастройкиОтбора.ВключитьТабличныеЧастиВВыборку; + ОграничитьВыборку = НастройкиОтбора.ОграничитьВыборку; + + Если Не ОбновитьСписок И Не ОграничитьВыборку И Не ПустаяСтрока(АдресСпискаВыбранных) Тогда Возврат ПолучитьИзВременногоХранилища(АдресСпискаВыбранных); КонецЕсли; @@ -1545,7 +1523,7 @@ Если Не ПустаяСтрока(ВидыИзменяемыхОбъектов) Тогда ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - ТекстЗапроса = ОбработкаОбъект.ТекстЗапроса(ВидыИзменяемыхОбъектов); + ТекстЗапроса = ОбработкаОбъект.ТекстЗапроса(ВидыИзменяемыхОбъектов, ОграничитьВыборку); СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных; @@ -1580,7 +1558,9 @@ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); - АдресСпискаВыбранных = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); + Если Не ОграничитьВыборку Тогда + АдресСпискаВыбранных = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); + КонецЕсли; КонецЕсли; Возврат Результат; @@ -1629,9 +1609,11 @@ &НаСервере Функция КоличествоВыбранныхОбъектов(Пересчитать = Ложь, ДляИзменения = Ложь, ТекстСообщенияОбОшибке = "") + НастройкиОтбора = НастройкиОтбора(); + НастройкиОтбора.ОбновитьСписок = Пересчитать; + НастройкиОтбора.ВключитьТабличныеЧастиВВыборку = ДляИзменения; - Возврат ВыбранныеОбъекты(Пересчитать, ДляИзменения, ТекстСообщенияОбОшибке).Строки.Количество(); - + Возврат ВыбранныеОбъекты(НастройкиОтбора, ТекстСообщенияОбОшибке).Строки.Количество(); КонецФункции &НаСервере @@ -1702,8 +1684,8 @@ КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); Если ВыбранныеОбъектыВКонтексте.Количество() > 0 Тогда - Если Параметры.Свойство("Список") И ТипЗнч(Параметры.Список) = Тип("ДинамическийСписок") Тогда - НастройкиКомпоновщика = Параметры.Список.КомпоновщикНастроек.ПолучитьНастройки(); + Если Параметры.Свойство("КомпоновщикНастроек") И ТипЗнч(Параметры.КомпоновщикНастроек) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда + НастройкиКомпоновщика = Параметры.КомпоновщикНастроек.ПолучитьНастройки(); КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновщика); КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить(); @@ -2425,7 +2407,9 @@ КонецЦикла; Если КонтекстныйВызов Тогда - Для Каждого ДанныеОбъекта Из ВыбранныеОбъекты(Истина).Строки Цикл + НастройкиОтбора = НастройкиОтбора(); + НастройкиОтбора.ОбновитьСписок = Истина; + Для Каждого ДанныеОбъекта Из ВыбранныеОбъекты(НастройкиОтбора).Строки Цикл ОбъектДляИзменения = ДанныеОбъекта.Ссылка; ВидОбъектаПоСсылке = ВидОбъектаПоСсылке(ОбъектДляИзменения); @@ -2692,8 +2676,6 @@ КонецЕсли; КонецЦикла; - ЕстьВыбранныеОбъекты = КоличествоВыбранныхОбъектов() > 0; - Пояснение = ""; Если ИзменяемыеРеквизиты.Количество() > 3 Тогда Пояснение = "(" + ИзменяемыеРеквизиты.Количество() +")"; @@ -2752,7 +2734,7 @@ КонецЕсли; КонецЕсли; - Если ЕстьВыбранныеОбъекты Тогда + Если ЕстьВыбранныеОбъекты() Тогда Если Не ПустаяСтрока(Пояснение) Тогда Пояснение = НСтр("ru = 'Изменить'") + " " + Пояснение + "."; Иначе @@ -2771,6 +2753,13 @@ КонецПроцедуры +&НаСервере +Функция ЕстьВыбранныеОбъекты() + НастройкиОтбора = НастройкиОтбора(); + НастройкиОтбора.ОграничитьВыборку = Истина; + Возврат ВыбранныеОбъекты(НастройкиОтбора).Строки.Количество() > 0; +КонецФункции + &НаСервере Процедура ОбновитьНадписьКоличествоВыбранных() ЕстьОшибкиВОтборе = Ложь; diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl index d96dbbe1e..61a106e99 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl @@ -1,8 +1,16 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область СлужебныеПроцедурыИФункции +#Область ПрограммныйИнтерфейс -// Для внутреннего использования. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +// Возвращает сведения о внешней обработке. +// +// Возвращаемое значение: +// Структура - Подробнее см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(). +// Функция СведенияОВнешнейОбработке() Экспорт Перем ПараметрыРегистрации; @@ -27,8 +35,16 @@ КонецФункции +// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + // Для внутреннего использования. -Функция ТекстЗапроса(ТипыИзменяемыхОбъектов) Экспорт +Функция ТекстЗапроса(ТипыИзменяемыхОбъектов, ОграничитьВыборку = Ложь) Экспорт ОбъектыМетаданных = Новый Массив; Для Каждого ИмяОбъекта Из СтрРазделить(ТипыИзменяемыхОбъектов, ",", Ложь) Цикл @@ -70,7 +86,7 @@ |)"; КонецЦикла; - ТекстЗапроса = "ВЫБРАТЬ " + ТекстЗапроса + Символы.ПС + " + ТекстЗапроса = "ВЫБРАТЬ " + ?(ОграничитьВыборку, "ПЕРВЫЕ 1001 ", "") + ТекстЗапроса + Символы.ПС + " |ИЗ | "+ ОбъектМетаданных.ПолноеИмя() + " КАК " + ПсевдонимТаблицы; @@ -280,12 +296,12 @@ ЗаполнитьРезультатИзмененияДополнительныхСвойств(РезультатИзменения, Ссылка, ИзменяемыйОбъект, Изменения); - РазблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + РазблокироватьДанныеДляРедактирования(Ссылка); ЗафиксироватьТранзакцию(); Исключение - РазблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + РазблокироватьДанныеДляРедактирования(Ссылка); ОтменитьТранзакцию(); КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, КраткоеПредставлениеОшибки); @@ -364,16 +380,22 @@ КонецЕсли; НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Найти(Операция.Свойство, "Свойство"); - Если НайденнаяСтрока = Неопределено Тогда - НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить(); - НайденнаяСтрока.Свойство = Операция.Свойство; - КонецЕсли; - НайденнаяСтрока.Значение = Значение; - - ОписаниеСвойства = ЗначенияРеквизитовОбъекта(Операция.Свойство, "ТипЗначения, МногострочноеПолеВвода"); - МодульУправлениеСвойствами = ОбщийМодуль("УправлениеСвойствамиСлужебный"); - Если МодульУправлениеСвойствами.ИспользоватьНеограниченнуюСтроку(ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) Тогда - НайденнаяСтрока.ТекстоваяСтрока = Значение; + Если ЗначениеЗаполнено(Значение) Тогда + Если НайденнаяСтрока = Неопределено Тогда + НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить(); + НайденнаяСтрока.Свойство = Операция.Свойство; + КонецЕсли; + НайденнаяСтрока.Значение = Значение; + + ОписаниеСвойства = ЗначенияРеквизитовОбъекта(Операция.Свойство, "ТипЗначения, МногострочноеПолеВвода"); + МодульУправлениеСвойствами = ОбщийМодуль("УправлениеСвойствамиСлужебный"); + Если МодульУправлениеСвойствами.ИспользоватьНеограниченнуюСтроку(ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) Тогда + НайденнаяСтрока.ТекстоваяСтрока = Значение; + КонецЕсли; + Иначе + Если НайденнаяСтрока <> Неопределено Тогда + ИзменяемыйОбъект.ДополнительныеРеквизиты.Удалить(НайденнаяСтрока); + КонецЕсли; КонецЕсли; ИмяРеквизитаФормы = ПрефиксИмениДопРеквизита() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); @@ -1258,7 +1280,6 @@ КонецФункции - #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form similarity index 98% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form index 7a240d252..a849da52d 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form @@ -14,10 +14,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 22 @@ -42,6 +38,10 @@ ОтвеченныеАнкеты 1 + + <key>ru</key> + <value>Отвеченные анкеты</value> + true true @@ -55,6 +55,10 @@ ОтвеченныеАнкетыКодКартинки 10 + + <key>ru</key> + <value>Иконка картинки</value> + true true @@ -364,9 +368,6 @@ CommonPicture.АрхивАнкета - None - None - None true 60 @@ -413,7 +414,7 @@ Объект 1 - DataProcessorObject.СписокРеспондента + DataProcessorObject.ДоступныеАнкеты true diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Help/ru.html similarity index 100% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Help/ru.html diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl similarity index 88% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl index 77519f96a..c2a1d5077 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl @@ -4,6 +4,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьУсловноеОформление(); + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; @@ -68,4 +70,11 @@ КонецПроцедуры +&НаСервере +Процедура УстановитьУсловноеОформление() + + СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, "ОтвеченныеАнкеты.ДатаЗаполнения", Элементы.ДатаЗаполнения.Имя); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form similarity index 97% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form index 456c461ce..5680c63d0 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form @@ -40,6 +40,10 @@ ТаблицаАнкет 3 + + <key>ru</key> + <value>Таблица анкет</value> + true true @@ -226,9 +230,6 @@ CommonPicture.КоллекцияДоступныеАнкеты - None - None - None true @@ -269,10 +270,6 @@ ru Анкеты - - ru - Анкеты - АнкетыExtendedTooltip 22 @@ -299,10 +296,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 21 @@ -344,7 +337,7 @@ Объект 1 - DataProcessorObject.СписокРеспондента + DataProcessorObject.ДоступныеАнкеты true diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Module.bsl similarity index 92% rename from SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl rename to SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Module.bsl index 04fd5c8f5..ff0951197 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Module.bsl @@ -7,7 +7,7 @@ Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; - + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); Если ТипЗнч(ТекущийПользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда Объект.Респондент = ТекущийПользователь; @@ -15,15 +15,15 @@ Объект.Респондент = ВнешниеПользователи.ПолучитьОбъектАвторизацииВнешнегоПользователя(ТекущийПользователь); КонецЕсли; - ПолучитьТаблицуАнкетРеспондента(); - + ТаблицаАнкетРеспондента(); + КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "Запись_Анкета" ИЛИ ИмяСобытия = "Проведение_Анкета" Тогда - ПолучитьТаблицуАнкетРеспондента(); + ТаблицаАнкетРеспондента(); КонецЕсли; КонецПроцедуры @@ -73,14 +73,14 @@ &НаКлиенте Процедура АрхивАнкет(Команда) - ОткрытьФорму("Обработка.СписокРеспондента.Форма.АрхивАнкет",Новый Структура("Респондент",Объект.Респондент),ЭтотОбъект); + ОткрытьФорму("Обработка.ДоступныеАнкеты.Форма.АрхивАнкет",Новый Структура("Респондент",Объект.Респондент),ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура Обновить(Команда) - ПолучитьТаблицуАнкетРеспондента(); + ТаблицаАнкетРеспондента(); КонецПроцедуры @@ -89,11 +89,11 @@ #Область СлужебныеПроцедурыИФункции &НаСервере -Процедура ПолучитьТаблицуАнкетРеспондента() +Процедура ТаблицаАнкетРеспондента() ТаблицаАнкет.Очистить(); - ПолученнаяТаблицаАнкет = Анкетирование.ПолучитьТаблицуДоступныхРеспондентуАнкет(Объект.Респондент); + ПолученнаяТаблицаАнкет = Анкетирование.ТаблицаДоступныхРеспондентуАнкет(Объект.Респондент); Если ПолученнаяТаблицаАнкет <> Неопределено Тогда diff --git a/SSL/src/DataProcessors/СписокРеспондента/Help/ru.html b/SSL/src/DataProcessors/ДоступныеАнкеты/Help/ru.html similarity index 85% rename from SSL/src/DataProcessors/СписокРеспондента/Help/ru.html rename to SSL/src/DataProcessors/ДоступныеАнкеты/Help/ru.html index 16a72037e..bc716897a 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/Help/ru.html +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Help/ru.html @@ -3,6 +3,6 @@

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

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

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

          -

          Ранее заполненные анкеты респондент может посмотреть по команде Архив анкет.

          +

          Ранее заполненные анкеты респондент может посмотреть по команде Архив анкет.

          См. также:

          \ No newline at end of file diff --git a/SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo b/SSL/src/DataProcessors/ДоступныеАнкеты/ДоступныеАнкеты.mdo similarity index 89% rename from SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo rename to SSL/src/DataProcessors/ДоступныеАнкеты/ДоступныеАнкеты.mdo index dc6503bbb..3df6d0014 100644 --- a/SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/ДоступныеАнкеты.mdo @@ -4,13 +4,13 @@ - СписокРеспондента + ДоступныеАнкеты ru - Список респондента + Доступные анкеты true - DataProcessor.СписокРеспондента.Form.Форма + DataProcessor.ДоступныеАнкеты.Form.Форма ru diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form index bc1e35138..6852005cf 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form @@ -238,12 +238,8 @@
          <key>ru</key> - <value>Группа отбора</value> + <value>Отбора</value> - - ru - Группа отбора - ГруппаОтбораExtendedTooltip 135 @@ -308,6 +304,10 @@ Журнал.Дата + + ru + Дата события в часовом поясе программы. + ДатаExtendedTooltip 146 @@ -576,6 +576,10 @@ true + + <key>ru</key> + <value>Приложение сеанс</value> + 15 ГруппаПриложениеСеансРасширеннаяПодсказка @@ -767,6 +771,10 @@ true + + <key>ru</key> + <value>Данные метаданные</value> + ГруппаДанныеМетаданныеРасширеннаяПодсказка 203 @@ -1141,6 +1149,10 @@ Журнал.ДатаНаСервере + + ru + Дата события в часовом поясе сервера. + ДатаНаСервереРасширеннаяПодсказка 208 @@ -1393,10 +1405,6 @@ ru Команды отбора - - ru - Команды отбора - КомандыОтбораExtendedTooltip 121 @@ -1473,10 +1481,6 @@ ru Команды поиска - - ru - Команды поиска - КомандыПоискаExtendedTooltip 130 @@ -1537,10 +1541,6 @@ ru Команда обновить - - ru - Команда обновить - КомандаОбновитьExtendedTooltip 128 @@ -1807,10 +1807,6 @@ ru Отбор группа контекст - - ru - Отбор группа контекст - ОтборГруппаКонтекстExtendedTooltip 140 @@ -1923,9 +1919,6 @@ Style.BorderColor - None - None - None true
          @@ -1938,10 +1931,6 @@ ru Журнал регистрации - - ru - Журнал регистрации - ЖурналРегистрацииExtendedTooltip 139 @@ -2020,10 +2009,6 @@ ru Индикатор длительных операций - - ru - Индикатор длительных операций - ИндикаторДлительныхОперацийExtendedTooltip 168 @@ -2050,10 +2035,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 138 diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl index b674a70f8..e75aa0a3b 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl @@ -10,8 +10,8 @@ УстановитьУсловноеОформление(); - МодельСервиса = ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + МодельСервиса = ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); ОтборЖурналаРегистрации = Новый Структура; ОтборЖурналаРегистрацииПоУмолчанию = Новый Структура; @@ -47,10 +47,14 @@ Иначе Если ЗначениеЗаполнено(Параметры.ДатаНачала) Тогда ОтборЖурналаРегистрации.Вставить("ДатаНачала", Параметры.ДатаНачала); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса())); КонецЕсли; Если ЗначениеЗаполнено(Параметры.ДатаОкончания) Тогда ОтборЖурналаРегистрации.Вставить("ДатаОкончания", Параметры.ДатаОкончания + 1); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса())); КонецЕсли; КонецЕсли; @@ -64,7 +68,17 @@ // Уровень - список значений. Если Параметры.Уровень <> Неопределено Тогда - ОтборЖурналаРегистрации.Вставить("Уровень", Параметры.Уровень); + ОтборПоУровню = Новый СписокЗначений; + Если ТипЗнч(Параметры.Уровень) = Тип("Массив") Тогда + Для Каждого ПредставлениеУровня Из Параметры.Уровень Цикл + ОтборПоУровню.Добавить(ПредставлениеУровня, ПредставлениеУровня); + КонецЦикла; + ИначеЕсли ТипЗнч(Параметры.Уровень) = Тип("Строка") Тогда + ОтборПоУровню.Добавить(Параметры.Уровень, Параметры.Уровень); + Иначе + ОтборПоУровню = Параметры.Уровень; + КонецЕсли; + ОтборЖурналаРегистрации.Вставить("Уровень", ОтборПоУровню); КонецЕсли; // ИмяПриложения - список значений. @@ -83,7 +97,7 @@ ОтборЖурналаРегистрации.Вставить("Событие", ОтборПоУмолчанию); КонецЕсли; ОтборЖурналаРегистрацииПоУмолчанию.Вставить("Событие", ОтборПоУмолчанию); - Элементы.ПредставлениеРазделенияДанныхСеанса.Видимость = Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + Элементы.ПредставлениеРазделенияДанныхСеанса.Видимость = Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); Критичность = "ВсеСобытия"; diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form index 37c92391d..bae3aaab9 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form @@ -208,12 +208,8 @@
          <key>ru</key> - <value>Группа даты</value> + <value>Даты</value> - - ru - Группа даты - ГруппаДатыExtendedTooltip 200 @@ -334,6 +330,10 @@ true + + <key>ru</key> + <value>Командная панель важность</value> + КоманднаяПанельВажностьРасширеннаяПодсказка 314 @@ -354,6 +354,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + ГруппаКоманднаяПанельРасширеннаяПодсказка 319 @@ -477,6 +481,10 @@ true + + <key>ru</key> + <value>Важность и значение</value> + ВажностьИЗначениеРасширеннаяПодсказка 264 @@ -608,9 +616,6 @@ Style.BorderColor - None - None - None true
          true @@ -618,6 +623,10 @@ true + + <key>ru</key> + <value>Важность</value> + false false Center @@ -897,7 +906,7 @@ <key>ru</key> - <value>Группа основные отборы</value> + <value>Основные отборы</value> Center @@ -930,10 +939,6 @@ ru Основное - - ru - Группа основное - ГруппаОсновноеРасширеннаяПодсказка 323 @@ -1104,6 +1109,10 @@ true + + <key>ru</key> + <value>Данные свойства</value> + ru Данные @@ -1262,6 +1271,10 @@ true + + <key>ru</key> + <value>Командная панель транзакция</value> + КоманднаяПанельТранзакцияРасширеннаяПодсказка 330 @@ -1282,6 +1295,10 @@ true + + <key>ru</key> + <value>Командная панель транзакция</value> + ГруппаКоманднаяПанельТранзакцияРасширеннаяПодсказка 325 @@ -1405,6 +1422,10 @@ true + + <key>ru</key> + <value>Пометка и значение</value> + ГруппаПометкаИЗначениеРасширеннаяПодсказка 266 @@ -1536,9 +1557,6 @@ Style.BorderColor - None - None - None true
          true @@ -1546,6 +1564,10 @@ true + + <key>ru</key> + <value>Левая колонка 4</value> + false false diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl index 459d3a086..9adbcd8b8 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl @@ -18,7 +18,7 @@ СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект, "ГруппаДанные, ГруппаТранзакции, ГруппаПрочее"); - Элементы.РазделениеДанныхСеанса.Видимость = Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + Элементы.РазделениеДанныхСеанса.Видимость = Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РазделениеДанныхСеанса/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РазделениеДанныхСеанса/Form.form index 3dc469cfa..cdd1afe11 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РазделениеДанныхСеанса/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РазделениеДанныхСеанса/Form.form @@ -7,6 +7,10 @@ РазделениеДанныхСеанса 1 + + <key>ru</key> + <value>Разделение данных сеанса</value> + true true @@ -105,7 +109,7 @@ <key>ru</key> - <value>Группа флажок представление</value> + <value>Флажок представление</value> ГруппаФлажокПредставлениеРасширеннаяПодсказка @@ -283,9 +287,6 @@ true true true - None - None - None true @@ -349,6 +350,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + ГруппаКоманднаяПанельРасширеннаяПодсказка 15 diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form index e26234036..f49339a0e 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form @@ -7,6 +7,10 @@ Список 1 + + <key>ru</key> + <value>Список</value> + true true @@ -302,9 +306,6 @@ Style.BorderColor - None - None - None true @@ -388,10 +389,6 @@ ru Кнопки формы - - ru - Кнопки формы - КнопкиФормыExtendedTooltip 20 @@ -415,14 +412,11 @@ Left true - - OnOpen - ПриОткрытии - OnCreateAtServer ПриСозданииНаСервере + CustomizeForm 50 35 LockOwner diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl index 2db882e29..824e0ff6d 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl @@ -11,11 +11,6 @@ РедактируемыйСписок = Параметры.РедактируемыйСписок; ОтбираемыеПараметры = Параметры.ОтбираемыеПараметры; -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - УстановитьПараметрыРедактора(РедактируемыйСписок, ОтбираемыеПараметры); КонецПроцедуры @@ -57,9 +52,9 @@ #Область СлужебныеПроцедурыИФункции -&НаКлиенте +&НаСервере Процедура УстановитьПараметрыРедактора(РедактируемыйСписок, ОтбираемыеПараметры) - СтруктураПараметровОтбора = ПолучитьЗначенияОтбораЖурналаРегистрацииПоКолонке(ОтбираемыеПараметры); + СтруктураПараметровОтбора = ПолучитьЗначенияОтбораЖурналаРегистрации(ОтбираемыеПараметры); ЗначенияОтбора = СтруктураПараметровОтбора[ОтбираемыеПараметры]; // Получение списка представлений событий. Если ОтбираемыеПараметры = "Событие" Или ОтбираемыеПараметры = "Event" Тогда @@ -172,9 +167,10 @@ КонецФункции -&НаКлиенте +&НаСервере Функция ПолучитьВетвьДерева(Представление, Рекурсия = Ложь) - СтрокиПути = РазложитьСтрокуПоТочкам(Представление); + СтрокиПути = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Представление, ".", Истина, Истина); + Если СтрокиПути.Количество() = 1 Тогда ЭлементыДерева = Список.ПолучитьЭлементы(); ИмяВетки = СтрокиПути[0]; @@ -206,30 +202,6 @@ Возврат ЭлементДерева; КонецФункции -// Функция раскладывает строку в массив строк, используя точку как разделитель. -&НаКлиенте -Функция РазложитьСтрокуПоТочкам(Знач Представление) - Фрагменты = Новый Массив; - Пока Истина Цикл - Представление = СокрЛП(Представление); - ПозицияТочки = СтрНайти(Представление, "."); - Если ПозицияТочки > 0 Тогда - Фрагмент = СокрЛП(Лев(Представление, ПозицияТочки - 1)); - Фрагменты.Добавить(Фрагмент); - Представление = Сред(Представление, ПозицияТочки + 1); - Иначе - Фрагменты.Добавить(СокрЛП(Представление)); - Прервать; - КонецЕсли; - КонецЦикла; - Возврат Фрагменты; -КонецФункции - -&НаСервере -Функция ПолучитьЗначенияОтбораЖурналаРегистрацииПоКолонке(ОтбираемыеПараметры) - Возврат ПолучитьЗначенияОтбораЖурналаРегистрации(ОтбираемыеПараметры); -КонецФункции - &НаКлиенте Процедура ЗаполнитьРедактируемыйСписок(РедактируемыйСписок, ЭлементыДерева, ЕстьНеотмеченные) Для Каждого ЭлементДерева Из ЭлементыДерева Цикл @@ -247,52 +219,44 @@ КонецЦикла; КонецПроцедуры -&НаКлиенте +&НаСервере Процедура ОтметитьВстречающиесяЭлементы(ЭлементыДерева, РедактируемыйСписок) Для Каждого ЭлементДерева Из ЭлементыДерева Цикл - - Если ЭлементДерева.ПолучитьЭлементы().Количество() <> 0 Тогда + Если ЭлементДерева.ПолучитьЭлементы().Количество() <> 0 Тогда ОтметитьВстречающиесяЭлементы(ЭлементДерева.ПолучитьЭлементы(), РедактируемыйСписок); Иначе - Для Каждого ЭлементСписка Из РедактируемыйСписок Цикл - Если ЭлементДерева.ПолноеПредставление = ЭлементСписка.Представление Тогда - ОтметитьЭлементДерева(ЭлементДерева, Истина); + ЭлементДерева.Пометка = Истина; + ПроверитьСостояниеПометкиВетви(ЭлементДерева.ПолучитьРодителя()); Прервать; КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЦикла; КонецПроцедуры &НаКлиенте -Процедура ОтметитьЭлементДерева(ЭлементДерева, Пометка, ПроверятьСостояниеРодителя = Истина) +Процедура ОтметитьЭлементДерева(ЭлементДерева, Пометка, ПроверитьСостояниеПометкиВетви = Истина) ЭлементДерева.Пометка = Пометка; // Отметить все подчиненные элементы дерева. Для Каждого ПодчиненныйЭлементДерева Из ЭлементДерева.ПолучитьЭлементы() Цикл ОтметитьЭлементДерева(ПодчиненныйЭлементДерева, Пометка, Ложь); КонецЦикла; // Проверить, не должно ли измениться состояние родителя. - Если ПроверятьСостояниеРодителя Тогда + Если ПроверитьСостояниеПометкиВетви Тогда ПроверитьСостояниеПометкиВетви(ЭлементДерева.ПолучитьРодителя()); КонецЕсли; КонецПроцедуры -&НаКлиенте +&НаКлиентеНаСервереБезКонтекста Процедура ПроверитьСостояниеПометкиВетви(Ветвь) Если Ветвь = Неопределено Тогда Возврат; КонецЕсли; ПодчиненныеВетви = Ветвь.ПолучитьЭлементы(); - Если ПодчиненныеВетви.Количество() = 0 Тогда - Возврат; - КонецЕсли; ЕстьИстина = Ложь; ЕстьЛожь = Ложь; @@ -333,22 +297,18 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Функция СобратьПредставление(ЭлементДерева) - Если ЭлементДерева = Неопределено Тогда - Возврат ""; +&НаСервере +Процедура УстановкаПометок(Значение, ВеткаДерева = Неопределено) + + Если ВеткаДерева = Неопределено Тогда + ВеткаДерева = Список; КонецЕсли; - Если ЭлементДерева.ПолучитьРодителя() = Неопределено Тогда - Возврат ЭлементДерева.Представление; - КонецЕсли; - Возврат СобратьПредставление(ЭлементДерева.ПолучитьРодителя()) + "." + ЭлементДерева.Представление; -КонецФункции - -&НаКлиенте -Процедура УстановкаПометок(Значение) - Для Каждого ЭлементДерева Из Список.ПолучитьЭлементы() Цикл - ОтметитьЭлементДерева(ЭлементДерева, Значение, Ложь); + + Для Каждого СтрокаСписка Из ВеткаДерева.ПолучитьЭлементы() Цикл + СтрокаСписка.Пометка = Значение; + УстановкаПометок(Значение, СтрокаСписка); КонецЦикла; + КонецПроцедуры &НаСервере @@ -360,7 +320,7 @@ КонецПроцедуры -&НаКлиенте +&НаСервере Функция ПолноеИмяНеУказанногоПользователя() Возврат НСтр("ru = '<Не указан>'"); @@ -370,13 +330,17 @@ &НаСервереБезКонтекста Функция ПолноеИмяСлужебногоПользователя(ИдентификаторПользователяИБ) + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Возврат ""; + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Возврат МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(ИдентификаторПользователяИБ); - КонецЕсли; + Возврат ""; + КонецФункции #КонецОбласти diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form index 9713a8e61..2bcd8a705 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form @@ -73,7 +73,7 @@ <key>ru</key> - <value>Группа кнопок</value> + <value>Кнопок</value> ГруппаКнопокExtendedTooltip @@ -189,7 +189,7 @@ <key>ru</key> - <value>Группа дата пользователь</value> + <value>Дата пользователь</value> ГруппаДатаПользовательExtendedTooltip @@ -355,7 +355,7 @@ <key>ru</key> - <value>Группа компьютер приложение разделение данных</value> + <value>Компьютер приложение разделение данных</value> ГруппаКомпьютерПриложениеРазделениеДанныхExtendedTooltip @@ -384,7 +384,7 @@ <key>ru</key> - <value>Группа основные</value> + <value>Основные</value> ГруппаОсновныеExtendedTooltip @@ -779,6 +779,10 @@ ТаблицаДанныхДоступа 56 + + <key>ru</key> + <value>Таблица данных доступа</value> + true true @@ -944,9 +948,6 @@ true true true - None - None - None true @@ -1199,6 +1200,10 @@ ТаблицаДанныхОтказаДействияДоступа 74 + + <key>ru</key> + <value>Таблица данных отказа действия доступа</value> + true true @@ -1364,9 +1369,6 @@ true true true - None - None - None true @@ -1729,9 +1731,6 @@ true true true - None - None - None true @@ -1906,9 +1905,6 @@ true true true - None - None - None true
          @@ -2369,10 +2365,6 @@ ru Транзакция - - ru - Транзакция - ГруппаТранзакцияExtendedTooltip 155 @@ -2398,6 +2390,10 @@ true + + <key>ru</key> + <value>Транзакция соединение</value> + ГруппаТранзакцияСоединениеExtendedTooltip 149 diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl index 45c0092e9..983a1e542 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl @@ -123,7 +123,7 @@ Элементы.ПростыеДанные.Видимость = Истина; КонецЕсли; - Элементы.РазделениеДанныхСеанса.Видимость = Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + Элементы.РазделениеДанныхСеанса.Видимость = Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект, "ГруппаДанные, ГруппаСобытие, ГруппаСоединение, ГруппаТранзакция"); diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form index b7cd62da7..094246d42 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form @@ -7,6 +7,10 @@ СписокКолонок 1 + + <key>ru</key> + <value>Список колонок</value> + true true @@ -115,10 +119,6 @@ ru Список колонок группа - - ru - Список колонок группа - СписокКолонокГруппаРасширеннаяПодсказка 18 @@ -335,9 +335,6 @@ СписокКолонок.Picture - None - None - None true diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form index 47a1eb24f..b74916bf3 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form @@ -51,6 +51,10 @@ ВидЗагрузкиДанных 17 + + <key>ru</key> + <value>Вид загрузки данных</value> + true true @@ -235,9 +239,6 @@ СписокВариантовЗагрузки.Picture - None - None - None true true @@ -543,6 +544,10 @@ true + + <key>ru</key> + <value>Страница вариант заполнение таблицы</value> + СтраницаВариантЗаполнениеТаблицыРасширеннаяПодсказка 656 @@ -694,6 +699,10 @@ true + + <key>ru</key> + <value>Страница вариант загрузка из файла</value> + СтраницаВариантЗагрузкаИзФайлаРасширеннаяПодсказка 495 @@ -819,6 +828,10 @@ true + + <key>ru</key> + <value>Страницы заполнения данных</value> + СтраницыЗаполненияДанныхРасширеннаяПодсказка 493 @@ -940,6 +953,10 @@ true + + <key>ru</key> + <value>Не найдено</value> + ГруппаНеНайденоРасширеннаяПодсказка 552 @@ -964,6 +981,10 @@ true + + <key>ru</key> + <value>Не найдено</value> + НеНайденоРасширеннаяПодсказка 544 @@ -1061,6 +1082,10 @@ true + + <key>ru</key> + <value>Результат сопоставления</value> + ГруппаРезультатСопоставленияРасширеннаяПодсказка 529 @@ -1087,6 +1112,10 @@ true + + <key>ru</key> + <value>Результаты сопоставления</value> + РезультатыСопоставленияРасширеннаяПодсказка 505 @@ -1525,7 +1554,7 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> ГруппаКоманднаяПанельРасширеннаяПодсказка @@ -1548,6 +1577,10 @@ true + + <key>ru</key> + <value>Сопоставления</value> + ГруппаСопоставленияРасширеннаяПодсказка 215 @@ -1574,6 +1607,10 @@ ТаблицаСопоставленияДанных 437 + + <key>ru</key> + <value>Таблица сопоставления данных</value> + true true @@ -1735,9 +1772,6 @@ Auto true true - None - None - None true @@ -1748,7 +1782,7 @@ <key>ru</key> - <value>Группа сопоставляемые данные</value> + <value>Сопоставляемые данные</value> ГруппаСопоставляемыеДанныеРасширеннаяПодсказка @@ -1953,6 +1987,10 @@ true + + <key>ru</key> + <value>Итого не сопоставленных</value> + ГруппаИтогоНеСопоставленныхРасширеннаяПодсказка 422 @@ -2111,7 +2149,7 @@ <key>ru</key> - <value>Группа отчет созданные и обновленные</value> + <value>Отчет созданные и обновленные</value> ГруппаОтчетСозданныеИОбновленныеРасширеннаяПодсказка @@ -2237,7 +2275,7 @@ <key>ru</key> - <value>Группа пропущенные</value> + <value>Пропущенные</value> ГруппаПропущенныеРасширеннаяПодсказка @@ -2766,12 +2804,8 @@ <key>ru</key> - <value>Группа прогресс</value> + <value>Прогресс</value> - - ru - Группа прогресс - 6 ГруппаПрогрессРасширеннаяПодсказка @@ -2802,10 +2836,6 @@ ru Длительные операции - - ru - Длительные операции - ДлительныеОперацииРасширеннаяПодсказка 554 @@ -2890,7 +2920,7 @@ <key>ru</key> - <value>Группа назад</value> + <value>Назад</value> ГруппаНазадРасширеннаяПодсказка @@ -3034,7 +3064,7 @@ <key>ru</key> - <value>Группа далее закрыть</value> + <value>Далее закрыть</value> ГруппаДалееЗакрытьРасширеннаяПодсказка diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl index 65c1eb61e..8c9d214da 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl @@ -41,12 +41,16 @@ ТаблицаИнформацияПоКолонкам = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЗагрузкаДанныхИзФайла", ИмяОбъектаСопоставления,, ИмяПользователя()); Если ТаблицаИнформацияПоКолонкам = Неопределено Тогда ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам"); + Иначе + Если ТаблицаИнформацияПоКолонкам.Колонки.Найти("Родитель") = Неопределено Тогда + ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам"); + КонецЕсли; КонецЕсли; ПараметрыЗагрузки = Новый Структура; ПараметрыЗагрузки.Вставить("ТипЗагрузки", ТипЗагрузки); ПараметрыЗагрузки.Вставить("ПолноеИмяОбъекта", ИмяОбъектаСопоставления); - ПараметрыЗагрузки.Вставить("Макет", Параметры.ИмяМакетаСШаблоном); + ПараметрыЗагрузки.Вставить("Макет", ?(ЗначениеЗаполнено(Параметры.ИмяМакетаСШаблоном), Параметры.ИмяМакетаСШаблоном, "ЗагрузкаИзФайла")); ПараметрыЗагрузки.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); Если Параметры.Свойство("КолонкиМакета") И Параметры.КолонкиМакета <> Неопределено Тогда @@ -273,29 +277,45 @@ &НаКлиенте Процедура Назад(Команда) + ШагНазад(); + +КонецПроцедуры + +&НаКлиенте +Процедура ШагНазад() + Если Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными Тогда + Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки; Элементы.Назад.Видимость = Ложь; ЭтотОбъект.Заголовок = НСтр("ru = 'Загрузка данных в справочник'"); ОчиститьТаблицу(); - ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено Тогда - Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными; + + ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных + ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено + ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации Тогда + + Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными; Элементы.ВставитьВСписок.Видимость = Ложь; Элементы.Далее.КнопкаПоУмолчанию = Истина; Элементы.Далее.Видимость = Истина; - Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда - Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'"); - Иначе - Элементы.Далее.Заголовок = НСтр("ru = 'Далее >'"); - КонецЕсли; + Элементы.Далее.Доступность = Истина; + Элементы.Далее.Заголовок = ?(ТипЗагрузки = "ВставкаИзБуфераОбмена", + НСтр("ru = 'Вставить в список'"), НСтр("ru = 'Далее >'")); + Если ТипЗагрузки = "ТабличнаяЧасть" ИЛИ ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда Элементы.Назад.Видимость = Ложь; + Иначе + Элементы.Назад.Доступность = Истина; КонецЕсли; + ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ОтчетОЗагрузкеДанных Тогда + Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Видимость = Ложь; Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных; + КонецЕсли; - + КонецПроцедуры &НаКлиенте @@ -428,27 +448,28 @@ &НаКлиенте Функция СтатисткаСопоставления() - Отбор = Новый Структура("РезультатСопоставленияСтроки", "СтрокаСопоставлена"); - Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); + + Отбор = Новый Структура("РезультатСопоставленияСтроки", "СтрокаСопоставлена"); + Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); КоличествоСопоставленных = Результат.Количество(); Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда - Отбор = Новый Структура("РезультатСопоставленияСтроки", "НеСопоставлен"); - Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); - КолоВоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных - Результат.Количество(); + Отбор = Новый Структура("РезультатСопоставленияСтроки", "НеСопоставлен"); + Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); + КоличествоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных - Результат.Количество(); Иначе - Отбор = Новый Структура("ОписаниеОшибки", ""); - Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); - КолоВоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - Результат.Количество(); + Отбор = Новый Структура("ОписаниеОшибки", ""); + Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор); + КоличествоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - Результат.Количество(); КонецЕсли; - КоличествоНеСопоставленных = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных; + КоличествоНеСопоставленных = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных; Результат = Новый Структура; - Результат.Вставить("Всего", ТаблицаСопоставленияДанных.Количество()); - Результат.Вставить("Сопоставленных", КоличествоСопоставленных); - Результат.Вставить("Неоднозначных", КолоВоНеоднозначных); + Результат.Вставить("Всего", ТаблицаСопоставленияДанных.Количество()); + Результат.Вставить("Сопоставленных", КоличествоСопоставленных); + Результат.Вставить("Неоднозначных", КоличествоНеоднозначных); Результат.Вставить("Несопоставленных", КоличествоНеСопоставленных); - Результат.Вставить("НеНайдено", КоличествоНеСопоставленных - КолоВоНеоднозначных); + Результат.Вставить("НеНайдено", КоличествоНеСопоставленных - КоличествоНеоднозначных); Возврат Результат; @@ -459,12 +480,10 @@ Статистика = СтатисткаСопоставления(); - ДанныеОСопоставление = СтатисткаСопоставления(); - ТекстВсе = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все (%1)'"), Статистика.Всего); Элементы.СоздаватьЕслиНеСопоставлено.Заголовок = НСтр("ru = 'Несопоставленные ('") + Статистика.НеСопоставленных + ")"; - Элементы.ОбновлятьСуществующие.Заголовок = НСтр("ru = 'Сопоставленные элементы ('") + Строка(Статистика.Сопоставленных) + ")"; + Элементы.ОбновлятьСуществующие.Заголовок = НСтр("ru = 'Сопоставленные элементы ('") + Строка(Статистика.Сопоставленных) + ")"; СписокВыбора = Элементы.ФильтрТаблицаСопоставления.СписокВыбора; СписокВыбора.Очистить(); @@ -476,12 +495,12 @@ СписокВыбора.Добавить("Неоднозначные", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неоднозначные (%1 из %2)'"), Статистика.Неоднозначных, Статистика.Всего)); - Если Статистика.Неоднозначных > 0 Тогда - Элементы.ОписаниеНеоднозначность.Видимость=Истина; + Если Статистика.Неоднозначных > 0 Тогда + Элементы.ОписаниеНеоднозначность.Видимость = Истина; Элементы.ОписаниеНеоднозначность.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '(неоднозначностей: %1)'"), Статистика.Неоднозначных); - Иначе - Элементы.ОписаниеНеоднозначность.Видимость=Ложь; + Иначе + Элементы.ОписаниеНеоднозначность.Видимость = Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(ФильтрТаблицаСопоставления) Тогда @@ -540,7 +559,7 @@ Элементы.ВставитьВСписок.Видимость = Ложь; Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'"); Иначе - Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаМногоКолонок; + Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗаполнениеТаблицы; КонецЕсли; КонецПроцедуры @@ -660,6 +679,12 @@ КонецЕсли; ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ЗагрузкаВСправочник." + ИмяОбъектаСопоставления,, ТипЗагрузки); + Если ТипЗнч(ОписаниеСтрокиВыбора) = Тип("Структура") И ОписаниеСтрокиВыбора.Свойство("Представление") Тогда + ЭтотОбъект.Заголовок = НСтр("ru='Загрузка данных в справочник'") + " """ +ОписаниеСтрокиВыбора.Представление + """"; + Иначе + ЭтотОбъект.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ПредставлениеСправочника(ИмяОбъектаСопоставления)); + КонецЕсли; + СформироватьМакетПоТипуЗагрузки(); СоздатьТаблицуСопоставленияПоИнформацииОКолонках(); ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки(); @@ -671,15 +696,12 @@ ПараметрыЗагрузки = Новый Структура; Если ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда - ЭтотОбъект.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ПредставлениеСправочника(ИмяОбъектаСопоставления)); ЭтотОбъект.АвтоЗаголовок = Ложь; ИначеЕсли ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда ОпределитьПараметрыЗагрузки(ПараметрыЗагрузки); ЭтотОбъект.АвтоЗаголовок = Ложь; Если ПараметрыЗагрузки.Свойство("Заголовок") Тогда ЭтотОбъект.Заголовок = ПараметрыЗагрузки.Заголовок; - Иначе - ЭтотОбъект.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ПредставлениеСправочника(ИмяОбъектаСопоставления)); КонецЕсли; ИначеЕсли ТипЗагрузки = "ВнешняяЗагрузка" Тогда ПараметрыЗагрузки.Вставить("ИмяМакетаСШаблоном", "ЗагрузкаДанныхИзФайла"); @@ -726,15 +748,6 @@ КонецЦикла; КонецПроцедуры -&НаСервере -Функция СоздатьТаблицуСоСпискомНеоднозначностей() - СписокНеоднозначностей = Новый ТаблицаЗначений; - СписокНеоднозначностей.Колонки.Добавить("Идентификатор"); - СписокНеоднозначностей.Колонки.Добавить("Колонка"); - - Возврат СписокНеоднозначностей; -КонецФункции - &НаСервере Процедура СопоставитьЗагружаемыеДанныеНаСервере() @@ -768,6 +781,15 @@ КонецПроцедуры +&НаСервере +Функция СоздатьТаблицуСоСпискомНеоднозначностей() + СписокНеоднозначностей = Новый ТаблицаЗначений; + СписокНеоднозначностей.Колонки.Добавить("Идентификатор"); + СписокНеоднозначностей.Колонки.Добавить("Колонка"); + + Возврат СписокНеоднозначностей; +КонецФункции + &НаСервере Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеСопоставленияНаСервере(АдресРезультата) @@ -827,6 +849,8 @@ Процедура ПослеВопросаОНезаполненныхСтроках(Результат, Параметр) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеПроверки(); + Иначе + ШагНазад(); КонецЕсли; КонецПроцедуры @@ -851,7 +875,6 @@ НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ПолучатьРезультат = Истина; НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; Обработчик = Новый ОписаниеОповещения("ПослеСопоставленияЗагружаемыхДанных", ЭтотОбъект); @@ -902,7 +925,6 @@ ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект); НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ПолучатьРезультат = Истина; НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; Обработчик = Новый ОписаниеОповещения("ПослеЗаписиЗагружаемыхДанныхОтчет", ЭтотОбъект); @@ -919,7 +941,6 @@ НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = НЕ НеВыводитьОкноОжидания; - НастройкиОжидания.ПолучатьРезультат = Истина; Обработчик = Новый ОписаниеОповещения("ПослеСозданияОтчета", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания); @@ -1364,7 +1385,7 @@ ТипКолонки = Колонка.ТипКолонки.Типы()[0]; Если ТипКолонки = Тип("Строка") Тогда Если Колонка.ТипКолонки.КвалификаторыСтроки.Длина = 0 Тогда - СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + Колонка.ИмяКолонки + " ПОДОБНО ТаблицаСопоставления." + Колонка.ИмяКолонки; + СтрокаУсловие = СтрокаУсловие + РазделительИ + "ВЫРАЗИТЬ(СправочникСопоставления." + Колонка.ИмяКолонки + " КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления." + Колонка.ИмяКолонки + " КАК Строка(500))"; сГДЕ = сГДЕ + " И СправочникСопоставления." + Колонка.ИмяКолонки + " <> """""; Иначе СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + Колонка.ИмяКолонки + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; @@ -1664,15 +1685,15 @@ ИнформацияОКолонке = КолонкиОтбор[0]; Иначе Отбор = Новый Структура("ИмяКолонки", ИмяКолонки); - КолонкиОтбор = ИнформацияПоКолонкам.НайтиСтроки(Отбор); + КолонкиОтбор = ИнформацияПоКолонкам.НайтиСтроки(Отбор); Если КолонкиОтбор.Количество() > 0 Тогда ИнформацияОКолонке = КолонкиОтбор[0]; КонецЕсли; КонецЕсли; Если ИнформацияОКолонке <> Неопределено Тогда - Если ИнформацияОКолонке.ОбязательнаДляЗаполнения Тогда - Для НомерСтроки = 2 По ШаблонСДанными.ВысотаТаблицы Цикл + Если ИнформацияОКолонке.ОбязательнаДляЗаполнения Тогда + Для НомерСтроки = 2 По ШаблонСДанными.ВысотаТаблицы Цикл Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки); Если НЕ ЗначениеЗаполнено(Ячейка.ТекущаяОбласть.Текст) Тогда НазванияКолонокБезДанных.Добавить(ИнформацияОКолонке.ПредставлениеКолонки); @@ -2245,17 +2266,15 @@ Если Результат <> Неопределено Тогда ДоступностьКнопокКомандойПанели(Ложь); - ИмяФайла = Результат[0].Имя; + Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации; + ИмяФайла = Результат[0].Имя; АдресВременногоХранилища = Результат[0].Хранение; Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла)); - Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации; - ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект); ФоновоеЗадание = ЗагрузитьФайлСДаннымиВТабличныйДокументНаСервере(АдресВременногоХранилища, Расширение); - НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); - НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ПолучатьРезультат = Истина; - НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; + НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + НастройкиОжидания.ВыводитьОкноОжидания = Ложь; + НастройкиОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект); Обработчик = Новый ОписаниеОповещения("ПослеЗагрузкиФайлаСДаннымиВТабличныйДокумент", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания); КонецЕсли; @@ -2289,7 +2308,9 @@ ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла); АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресВоВременномХранилище); - УдалитьФайлы(ИмяФайла); + + ЗагрузкаДанныхИзФайла.УдалитьВременныйФайл(ИмяФайла); + КонецПроцедуры &НаСервереБезКонтекста @@ -2394,7 +2415,6 @@ ПодтверждениеЗакрытияФормы = Ложь; КонецПроцедуры - #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыВидЗагрузкиДанных @@ -2436,7 +2456,7 @@ Элемент.ТекущиеДанные.РезультатСопоставленияСтроки = РезультатСопоставленияСтроки; КонецЕсли; - ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла(); + ПодключитьОбработчикОжидания("ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла", 0.2, Истина); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form index 06d203073..c73691f2f 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form @@ -165,6 +165,10 @@ ВариантыВыбора 40 + + <key>ru</key> + <value>Варианты выбора</value> + true true @@ -498,14 +502,15 @@ true true true - None - None - None true ЭлементыСправочника 6 + + <key>ru</key> + <value>Элементы справочника</value> + true true @@ -792,9 +797,6 @@ true true true - None - None - None true @@ -813,10 +815,6 @@ ru Основные загружаемые данные - - ru - Основные данные из файла - ОсновныеДанныеИзФайлаРасширеннаяПодсказка 17 @@ -849,10 +847,6 @@ ru Прочие загружаемые данные - - ru - Прочие данные из файла - ПрочиеДанныеИзФайлаРасширеннаяПодсказка 19 diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РедактированиеБланка/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РедактированиеБланка/Form.form index 3c8d24c2c..9ef065501 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РедактированиеБланка/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РедактированиеБланка/Form.form @@ -40,6 +40,10 @@ СписокКолонок 1 + + <key>ru</key> + <value>Список колонок</value> + true true @@ -147,10 +151,6 @@ ru Список колонок группа наименование - - ru - Список колонок группа наименование - СписокКолонокГруппаНаименованиеРасширеннаяПодсказка 21 @@ -459,9 +459,6 @@ true true true - None - None - None true @@ -574,7 +571,7 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> ГруппаКоманднаяПанельРасширеннаяПодсказка diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl index 0dec568eb..be7c1f092 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl @@ -1,26 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс - -// Создает таблицу значений со списком команд во внешней обработке для загрузки из файла. -// -// Параметры: -// ПараметрыРегистрации - Структура - Параметры внешнего объекта. -// -Процедура ЗадатьКомандыЗагрузки(ПараметрыРегистрации) Экспорт - - ТаблицаКоманд = Новый ТаблицаЗначений; - ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); - ТаблицаКоманд.Колонки.Добавить("МакетСШаблоном", Новый ОписаниеТипов("Строка")); - ТаблицаКоманд.Колонки.Добавить("ПолноеИмяОбъектаМетаданных", Новый ОписаниеТипов("Строка")); - - ПараметрыРегистрации.Вставить("КомандыЗагрузки", ТаблицаКоманд); - -КонецПроцедуры - -#КонецОбласти - #Область СлужебныйПрограммныйИнтерфейс // Сообщает все требуемые сведения о процедуре загрузки данных из файла. @@ -144,6 +123,7 @@ ИнформацияОТипеЗагрузки.Вставить("ПолноеИмяОбъектаМетаданных", СтрокаТаблицы.Модификатор); ИнформацияОТипеЗагрузки.Вставить("Ссылка", СтрокаТаблицы.Ссылка); ИнформацияОТипеЗагрузки.Вставить("Идентификатор", СтрокаТаблицы.Идентификатор); + ИнформацияОТипеЗагрузки.Вставить("Представление", СтрокаТаблицы.Представление); Строка = ИнформацияОСправочниках.Добавить(); Строка.ПолноеИмя = ОбъектМетаданныхДляВывода.ПолноеИмя(); @@ -645,7 +625,7 @@ Если ТипДанных = Тип("Строка") Тогда ПредставлениеТипа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Строка (не более %1 символов)'"), ОписаниеТипа.КвалификаторыСтроки.Длина); ШиринаКолонки = ?(ОписаниеТипа.КвалификаторыСтроки.Длина < 30, ОписаниеТипа.КвалификаторыСтроки.Длина + 1, 30); - ИначеЕсли ТипДанных = Тип("Число") Тогда + ИначеЕсли ТипДанных = Тип("Число") Тогда ПредставлениеТипа = НСтр("ru = 'Число'"); Иначе Если МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Тип.Типы().Количество() = 1 Тогда @@ -680,30 +660,47 @@ Процедура ОпределитьИнформацияПоКолонкам(ПараметрыЗагрузки, ИнформацияПоКолонкам, ИменаДобавляемыхКолонок = Неопределено) Экспорт Если ПараметрыЗагрузки.ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда + Если ПараметрыЗагрузки.Свойство("Макет") Тогда Макет = ПараметрыЗагрузки.Макет; Иначе Макет = МенеджерОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта).ПолучитьМакет("ЗагрузкаИзФайла"); КонецЕсли; + ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет); + Если ИнформацияПоКолонкам.Количество() = 0 Тогда СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузки, ИнформацияПоКолонкам, Неопределено); КонецЕсли; + ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда + ИнформацияПоКолонкамНаОснованиеРеквизитов = ИнформацияПоКолонкам.СкопироватьКолонки(); + Если ИнформацияПоКолонкам.Количество() = 0 Тогда ИнформациюПоКолонкамИзРеквизитовСправочника(ПараметрыЗагрузки, ИнформацияПоКолонкам); Иначе ИнформациюПоКолонкамИзРеквизитовСправочника(ПараметрыЗагрузки, ИнформацияПоКолонкамНаОснованиеРеквизитов); КонецЕсли; + ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "ВнешняяЗагрузка" И ИнформацияПоКолонкам.Количество() = 0 Тогда + ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(ПараметрыЗагрузки.Макет); ОбластьЗаголовокТаблицы.Защита = Истина; + Если ИнформацияПоКолонкам.Количество() = 0 Тогда СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузки, ИнформацияПоКолонкам); КонецЕсли; - ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "ТабличнаяЧасть" И ИнформацияПоКолонкам.Количество() = 0 Тогда - ОпределитьИнформацияПоКолонкамТабличнаяЧасть(ИнформацияПоКолонкам, Макет, ОбластьЗаголовокТаблицы, ПараметрыЗагрузки); + + ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "ТабличнаяЧасть" Тогда + + Если ИнформацияПоКолонкам.Количество() = 0 Тогда + ОпределитьИнформацияПоКолонкамТабличнаяЧасть(ИнформацияПоКолонкам, Макет, ОбластьЗаголовокТаблицы, ПараметрыЗагрузки); + Иначе + Макет = МенеджерОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта).ПолучитьМакет(ПараметрыЗагрузки.Макет); + ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет); + КонецЕсли; + КонецЕсли; ТребуетсяПересчетПозиций = Ложь; @@ -943,13 +940,11 @@ ТабличныйДокумент = Новый ТабличныйДокумент; КолонкиИмеютГруппировку = ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам); Если КолонкиИмеютГруппировку Тогда - ПростойШаблон = Обработки.ЗагрузкаДанныхИзФайла.ПолучитьМакет("ПростойШаблон"); - ОбластьЗаголовок = ПростойШаблон.ПолучитьОбласть("Шапка2Строки"); - НомерСтроки = 2; + ОбластьЗаголовок = ПолучитьМакет("ПростойШаблон").ПолучитьОбласть("Шапка2Строки"); Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + НомерСтроки = 2; Иначе - ПростойШаблон = Обработки.ЗагрузкаДанныхИзФайла.ПолучитьМакет("ПростойШаблон"); - ОбластьЗаголовок = ПростойШаблон.ПолучитьОбласть("Заголовок"); + ОбластьЗаголовок = ПолучитьМакет("ПростойШаблон").ПолучитьОбласть("Заголовок"); НомерСтроки = 1; КонецЕсли; ИнформацияПоКолонкам.Сортировать("Позиция"); @@ -1006,22 +1001,20 @@ // Процедура ТабличныйДокументВТаблицуЗначений(ШаблонСДанными, ИнформацияПоКолонкам, АдресЗагруженныхДанных) Экспорт + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка"); + ТаблицаИнформацияПоКолонкам = ИнформацияПоКолонкам.Скопировать(); ЗагружаемыеДанные = Новый ТаблицаЗначений; Для каждого Колонка Из ТаблицаИнформацияПоКолонкам Цикл - Если Колонка.ТипКолонки.Типы()[0] = Тип("Дата") Тогда - ТипКолонки = Колонка.ТипКолонки; - Иначе - ТипКолонки = Новый ОписаниеТипов("Строка") - КонецЕсли; + ТипКолонки = ?(Колонка.ТипКолонки.Типы()[0] = Тип("Дата"), Колонка.ТипКолонки, ОписаниеТипаСтрока); ЗагружаемыеДанные.Колонки.Добавить(Колонка.ИмяКолонки, ТипКолонки, Колонка.ПредставлениеКолонки); КонецЦикла; - ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); - ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка"); - ЗагружаемыеДанные.Колонки.Добавить("Идентификатор",ОписаниеТипаЧисло, "Идентификатор"); - ЗагружаемыеДанные.Колонки.Добавить("РезультатСопоставленияСтроки",ОписаниеТипаСтрока, "Результат"); - ЗагружаемыеДанные.Колонки.Добавить("ОписаниеОшибки",ОписаниеТипаСтрока, "Причина"); + + ЗагружаемыеДанные.Колонки.Добавить("Идентификатор", ОписаниеТипаЧисло, "Идентификатор"); + ЗагружаемыеДанные.Колонки.Добавить("РезультатСопоставленияСтроки", ОписаниеТипаСтрока, "Результат"); + ЗагружаемыеДанные.Колонки.Добавить("ОписаниеОшибки", ОписаниеТипаСтрока, "Причина"); КорректировкаИдентификатора = 0; ВысотаШапки = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ТаблицаИнформацияПоКолонкам), 2, 1); @@ -1030,8 +1023,8 @@ Для НомерСтроки = ВысотаШапки + 1 По ШаблонСДанными.ВысотаТаблицы Цикл СтрокаТаблицыПустая = Истина; - НоваяСтрока = ЗагружаемыеДанные.Добавить(); - НоваяСтрока.Идентификатор = НомерСтроки - 1 - КорректировкаИдентификатора; + НоваяСтрока = ЗагружаемыеДанные.Добавить(); + НоваяСтрока.Идентификатор = НомерСтроки - КорректировкаИдентификатора - 1; Для НомерКолонки = 1 По ШаблонСДанными.ШиринаТаблицы Цикл Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).ТекущаяОбласть; @@ -1053,12 +1046,13 @@ АдресЗагруженныхДанных = ПоместитьВоВременноеХранилище(ЗагружаемыеДанные); КонецПроцедуры -Функция ПриведениеЗначениеКТипу(Значение, ОписаниеТипов) +Функция ПриведениеЗначениеКТипу(Значение, ОписаниеТипов) Для каждого Тип Из ОписаниеТипов.Типы() Цикл Если Тип = Тип("Дата") Тогда Возврат СтроковыеФункцииКлиентСервер.СтрокаВДату(Значение); ИначеЕсли Тип = Тип("Число") Тогда - Возврат СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Значение); + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + Возврат ОписаниеТипаЧисло.ПривестиЗначение(Значение); КонецЕсли; КонецЦикла; @@ -1245,7 +1239,7 @@ КонецФункции Функция МенеджерОбъекта(ИмяОбъектаСопоставления) - МассивОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); + МассивОбъекта = РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); Если МассивОбъекта.ТипОбъекта = "Документ" Тогда МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда @@ -1325,9 +1319,10 @@ КонецЦикла; КонецЕсли; + АдресХранилища = ПоместитьВоВременноеХранилище(ШаблонСДанными, АдресХранилища); - УдалитьФайлы(ИмяВременногоФайла); + ЗагрузкаДанныхИзФайла.УдалитьВременныйФайл(ИмяВременногоФайла); КонецПроцедуры @@ -1700,17 +1695,25 @@ // Доступность объектов метаданных по функциональным опциям. // Функция ДоступностьОбъектовПоОпциям(ИмяОбъекта) - Параметры = ОбщегоНазначенияПовтИсп.ОпцииИнтерфейса(); - Если ТипЗнч(Параметры) = Тип("ФиксированнаяСтруктура") Тогда - Параметры = Новый Структура(Параметры); - КонецЕсли; + + ОпцииИнтерфейса = Новый Структура; + Попытка + ОбщегоНазначенияПереопределяемый.ПриОпределенииПараметровФункциональныхОпцийИнтерфейса(ОпцииИнтерфейса); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ИмяСобытия = НСтр("ru = 'Настройка интерфейса'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'При получении опций интерфейса произошла ошибка: + |%1'"), + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + КонецПопытки; ДоступностьОбъектов = Новый Соответствие; Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл Для Каждого Элемент Из ФункциональнаяОпция.Состав Цикл Если Элемент.Объект <> Неопределено Тогда Если СтрНайти(Элемент.Объект.ПолноеИмя(), ИмяОбъекта) > 0 Тогда - Значение = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, Параметры); + Значение = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, ОпцииИнтерфейса); Если Значение = Истина Тогда ДоступностьОбъектов.Вставить(Элемент.Объект, Истина); Иначе diff --git a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Commands/ЗагрузкаКлассификатораБанков/CommandModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Commands/ЗагрузкаКлассификатораБанков/CommandModule.bsl new file mode 100644 index 000000000..d1636932c --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Commands/ЗагрузкаКлассификатораБанков/CommandModule.bsl @@ -0,0 +1,9 @@ +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Обработка.ЗагрузкаКлассификатораБанков.Форма.ЗагрузкаКлассификатора", , + , ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Form.form similarity index 94% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form rename to SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Form.form index 7730920d7..ef6127b7a 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Form.form @@ -51,10 +51,10 @@ ru - Из Интернета + С сайта 1С - РБК + Интернет @@ -124,10 +124,6 @@ ru Страница выбор источника - - ru - Страница выбор источника - СтраницаВыборИсточникаExtendedTooltip 27 @@ -146,16 +142,15 @@ - ЗагрузкаССайтаРБК + ЗагрузкаССайта1С 12 - ПредупреждениеОЗагрузкаССайтаРБК + ПредупреждениеОЗагрузкаССайта1С 13 <key>ru</key> <value>Загрузка классификатора банков РФ будет выполнена с сайта 1С. - -Для продолжения нажмите "Загрузить".</value> +Для продолжения нажмите"Загрузить".</value> true true @@ -163,7 +158,7 @@ true - ПредупреждениеОЗагрузкаССайтаРБКExtendedTooltip + ПредупреждениеОЗагрузкаССайта1СРасширеннаяПодсказка 31 Label true @@ -173,7 +168,7 @@ - ПредупреждениеОЗагрузкаССайтаРБККонтекстноеМеню + ПредупреждениеОЗагрузкаССайта1СКонтекстноеМеню 14 true @@ -181,7 +176,6 @@ true Left - 4 true @@ -193,12 +187,8 @@ ru Загрузка с сайта 1С - - ru - Загрузка с сайта 1С - - ЗагрузкаССайтаРБКExtendedTooltip + ЗагрузкаССайта1СРасширеннаяПодсказка 30 Label true @@ -295,10 +285,6 @@ ru Выполняется загрузка - - ru - Выполняется загрузка - ВыполняетсяЗагрузкаExtendedTooltip 32 @@ -363,10 +349,6 @@ ru Страница результат - - ru - Страница результат - СтраницаРезультатExtendedTooltip 35 @@ -393,10 +375,6 @@ ru Страницы формы - - ru - Страницы формы - СтраницыФормыExtendedTooltip 26 @@ -451,12 +429,8 @@ <key>ru</key> - <value>Группа кнопок слева</value> + <value>Кнопок слева</value> - - ru - Группа кнопок слева - ГруппаКнопокСлеваРасширеннаяПодсказка 38 @@ -560,12 +534,8 @@ <key>ru</key> - <value>Группа кнопок справа</value> + <value>Кнопок справа</value> - - ru - Группа кнопок справа - ГруппаКнопокСправаРасширеннаяПодсказка 40 @@ -590,10 +560,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 44 diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Help/ru.html b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Help/ru.html similarity index 90% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Help/ru.html rename to SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Help/ru.html index 4ecc0f630..566ec45b6 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Help/ru.html +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Help/ru.html @@ -1,11 +1,11 @@ -

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

          +

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

          Загрузка классификатора банков РФ

          -

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

          +

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

          • С помощью переключателя выберите Вариант загрузки:
            • -

              Из Интернета (при работе в веб-клиенте возможна загрузка только с сайта 1С);

              +

              Из интернета (при работе в веб-клиенте возможна загрузка только с сайта 1С);

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

          • diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Module.bsl similarity index 95% rename from SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl rename to SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Module.bsl index 42e6a2629..d9c0d9a3b 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/Forms/ЗагрузкаКлассификатора/Module.bsl @@ -19,13 +19,13 @@ АвтоматическоеСохранениеДанныхВНастройках = АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; Элементы.ВариантЗагрузки.Доступность = Ложь; Элементы.ПутьКДискуИТС.Доступность = Ложь; - Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайтаРБК; + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайта1С; Иначе Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника; КонецЕсли; - ВыполнитьПроверкуПравДоступа("Изменение", Метаданные.Справочники.КлассификаторБанковРФ); - ВариантЗагрузки = "РБК"; + ВыполнитьПроверкуПравДоступа("Изменение", Метаданные.Справочники.КлассификаторБанков); + ВариантЗагрузки = "Интернет"; УстановитьИзмененияВИнтерфейсе(); КонецПроцедуры @@ -110,7 +110,7 @@ Если ТекущаяСтраница = Элементы.СтраницаРезультат Тогда #Если ВебКлиент Тогда - Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайтаРБК; + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайта1С; #Иначе Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника; #КонецЕсли @@ -165,7 +165,8 @@ &НаКлиенте Процедура ПослеПодключенияИнтернетПоддержки(Результат, ДополнительныеПараметры) Экспорт Если Не (ТипЗнч(Результат) = Тип("Структура") - И ЗначениеЗаполнено(Результат.Логин)) Тогда + И ЗначениеЗаполнено(Результат.Логин) + И ЗначениеЗаполнено(Результат.Пароль)) Тогда Возврат; КонецЕсли; ЗагрузитьКлассификатор(); @@ -180,9 +181,7 @@ Если Не ИспользоватьАльтернативныйСервер Тогда Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - УстановитьПривилегированныйРежим(Истина); ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); - УстановитьПривилегированныйРежим(Ложь); Возврат Не (ДанныеАутентификации <> Неопределено И ЗначениеЗаполнено(ДанныеАутентификации.Логин) И ЗначениеЗаполнено(ДанныеАутентификации.Пароль)); @@ -193,7 +192,7 @@ &НаКлиенте Процедура ЗагрузитьКлассификатор() - // Загружает классификатор банков с диска ИТС или с сайта РБК. + // Загружает классификатор банков с диска ИТС или с сайта 1С. ПараметрыЗагрузкиКлассификатора = Новый Соответствие; // (Число) Количество новых записей классификатора: @@ -210,8 +209,8 @@ АдресХранилища = ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, УникальныйИдентификатор); ЗагрузитьРезультат(АдресХранилища); Возврат; - ИначеЕсли ВариантЗагрузки = "РБК" Тогда - ДлительнаяОперация = ПолучитьДанныеРБКНаСервере(ПараметрыЗагрузкиКлассификатора); + ИначеЕсли ВариантЗагрузки = "Интернет" Тогда + ДлительнаяОперация = ПолучитьДанныеНаСервере(ПараметрыЗагрузкиКлассификатора); Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ВыполняетсяЗагрузка; УстановитьИзмененияВИнтерфейсе(); @@ -260,7 +259,7 @@ Если ВариантЗагрузки = "ИТС" Тогда Источник = НСтр("ru ='Диск ИТС'"); Иначе - Источник = НСтр("ru ='1С'"); + Источник = НСтр("ru ='Сайт 1С'"); КонецЕсли; ПараметрыЗагрузкиКлассификатора = ПолучитьИзВременногоХранилища(АдресХранилища); @@ -281,7 +280,7 @@ УстановитьИзмененияВИнтерфейсе(); Если (ПараметрыЗагрузкиКлассификатора["Обновлено"] > 0) Или (ПараметрыЗагрузкиКлассификатора["Загружено"] > 0) Тогда - ОповеститьОбИзменении(Тип("СправочникСсылка.КлассификаторБанковРФ")); + ОповеститьОбИзменении(Тип("СправочникСсылка.КлассификаторБанков")); КонецЕсли; КонецПроцедуры @@ -299,7 +298,7 @@ ПараметрыЗагрузкиФайловИТС.Вставить("ПодготовкаИТСАдресДвоичныхДанных", ""); // (Строка) Текст ошибки: ПараметрыЗагрузкиФайловИТС.Вставить("ТекстСообщения", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); - // Другие параметры - см. описание переменной ПараметрыЗагрузкиФайловРБК в ЗагрузитьКлассификатор(): + // Другие параметры - см. описание переменной ПараметрыЗагрузкиФайлов в ЗагрузитьКлассификатор(): ПараметрыЗагрузкиФайловИТС.Вставить("Загружено", ПараметрыЗагрузкиКлассификатора["Загружено"]); ПараметрыЗагрузкиФайловИТС.Вставить("Обновлено", ПараметрыЗагрузкиКлассификатора["Обновлено"]); @@ -400,7 +399,7 @@ Элементы.ПутьКДискуИТС.Доступность = (ВариантЗагрузки = "ИТС"); Если Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника - Или Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайтаРБК Тогда + Или Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайта1С Тогда Элементы.ФормаКнопкаНазад.Видимость = Ложь; Элементы.ФормаКнопкаДалее.Заголовок = НСтр("ru ='Загрузить'"); Элементы.ФормаКнопкаОтмена.Доступность = Истина; @@ -434,25 +433,25 @@ // ПараметрыЗагрузкиФайловИТС - см. описание переменной ПараметрыЗагрузкиКлассификатора в // ПолучитьДанныеБИКРФДискИТС(). - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение ТекстЗагрузкаЗапрещена(); КонецЕсли; - РаботаСБанками.ЗагрузитьДанныеДискИТС(ПараметрыЗагрузкиФайловИТС); + Обработки.ЗагрузкаКлассификатораБанков.ЗагрузитьДанныеДискИТС(ПараметрыЗагрузкиФайловИТС); КонецПроцедуры &НаСервере -Функция ПолучитьДанныеРБКНаСервере(ПараметрыЗагрузкиФайловРБК) +Функция ПолучитьДанныеНаСервере(ПараметрыЗагрузкиФайлов) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда ВызватьИсключение ТекстЗагрузкаЗапрещена(); КонецЕсли; ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка классификатора банков РФ'"); - Результат = ДлительныеОперации.ВыполнитьВФоне("РаботаСБанками.ПолучитьДанныеРБК", ПараметрыЗагрузкиФайловРБК, ПараметрыВыполнения); + Результат = ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаКлассификатораБанков.ПолучитьДанные", ПараметрыЗагрузкиФайлов, ПараметрыВыполнения); Возврат Результат; diff --git a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl new file mode 100644 index 000000000..1973e5f74 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl @@ -0,0 +1,1072 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанков; + Зависимость.ДоступноВМоделиСервиса = Ложь; + Зависимость.ДоступноВПодчиненномУзлеРИБ = Ложь; +КонецПроцедуры + +// Возвращает список разрешений для загрузки классификатора банков с сайта 1С. +// +// Параметры: +// Разрешения - Массив - коллекция разрешений. +// +Процедура ДобавитьРазрешения(Разрешения) Экспорт + + УстановитьПривилегированныйРежим(Истина); + ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКлассификатораБанков.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Если ИспользоватьАльтернативныйСервер Тогда + Протокол = "HTTP"; + Адрес = "cbrates.rbc.ru"; + Порт = Неопределено; + Описание = НСтр("ru = 'Загрузка классификатора банков с сайта РБК.'"); + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + Иначе + Протокол = "HTTPS"; + Адрес = "bankregister.1c.ru"; + Порт = Неопределено; + Описание = НСтр("ru = 'Загрузка классификатора банков с сайта 1С.'"); + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + КонецЕсли; + +КонецПроцедуры + +Процедура ПриПолученииДанныхКлассификатора(Параметры, СтандартнаяОбработка) Экспорт + СтандартнаяОбработка = Истина; +КонецПроцедуры + +// Формирует, дополняет текст сообщения пользователю в случае, если загрузка данных классификатора проведена успешно. +// +// Параметры: +// ПараметрыЗагрузкиКлассификатора - Соответствие: +// Загружено - Число - Количество новых записей классификатора. +// Обновлено - Число - Количество обновленных записей классификатора. +// ТекстСообщения - Строка - тест сообщения о результатах загрузки. +// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. +// +Процедура ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора) + + ТекстСообщения = ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]; + Загружено = ПараметрыЗагрузкиКлассификатора["Загружено"]; + Обновлено = ПараметрыЗагрузкиКлассификатора["Обновлено"]; + + Если ПустаяСтрока(ТекстСообщения) Тогда + Если Загружено = 0 И Обновлено = 0 Тогда + ТекстСообщения = НСтр("ru ='Загрузка завершена. Изменений в классификаторе нет.'"); + Иначе + ТекстСообщения = НСтр("ru ='Загрузка классификатора банков РФ выполнена успешно.'"); + КонецЕсли; + КонецЕсли; + + Если Загружено > 0 Тогда + ТекстСообщения = ТекстСообщения + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru ='Загружено новых: %1.'"), Загружено); + КонецЕсли; + + Если Обновлено > 0 Тогда + ТекстСообщения = ТекстСообщения + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru ='Обновлено записей: %1.'"), Обновлено); + КонецЕсли; + + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + +КонецПроцедуры + +// Получает, сортирует, записывает данные классификатора БИК РФ с сайта 1С. +// +// Параметры: +// ПараметрыЗагрузкиКлассификатора - Соответствие: +// Загружено - Число - Количество новых записей классификатора. +// Обновлено - Число - Количество обновленных записей классификатора. +// ТекстСообщения - Строка - тест сообщения о результатах загрузки. +// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. +// АдресХранилища - Строка - адрес внутреннего хранилища. +Процедура ПолучитьДанные(ПараметрыЗагрузкиКлассификатора, АдресХранилища = "") Экспорт + + УстановитьПривилегированныйРежим(Истина); + ТекущаяВерсияКлассификатора = Константы.ВерсияКлассификатораБанков.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ВременныйКаталог); + + ПараметрыПолученияФайлов = Новый Соответствие; + ПараметрыПолученияФайлов.Вставить("ПутьКФайлу", ""); + ПараметрыПолученияФайлов.Вставить("ТекстСообщения", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); + ПараметрыПолученияФайлов.Вставить("ВременныйКаталог", ВременныйКаталог); + ПараметрыПолученияФайлов.Вставить("ЕстьОбновлениеНаСервере", Истина); + ПараметрыПолученияФайлов.Вставить("ВерсияКлассификатора", ТекущаяВерсияКлассификатора); + + ПолучитьДанныеИзИнтернета(ПараметрыПолученияФайлов); + + Если Не ПустаяСтрока(ПараметрыПолученияФайлов["ТекстСообщения"]) Тогда + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ПараметрыПолученияФайлов["ТекстСообщения"]); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + Если ПараметрыПолученияФайлов["ЕстьОбновлениеНаСервере"] Тогда + Попытка + ZIPФайл = Новый ЧтениеZipФайла(ПараметрыПолученияФайлов["ПутьКФайлу"]); + Исключение + ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным с сайта 1С.'"); + ТекстСообщения = ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не ПустаяСтрока(ТекстСообщения) Тогда + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + Попытка + ZIPФайл.ИзвлечьВсе(ВременныйКаталог); + Исключение + ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным с сайта 1С.'"); + ТекстСообщения = ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не ПустаяСтрока(ТекстСообщения) Тогда + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + ПутьКФайлуБИК = ИмяФайлаБИКСВИФТ(ВременныйКаталог); + ФайлБИК = Новый Файл(ИмяФайлаБИКСВИФТ(ВременныйКаталог)); + Если Не ФайлБИК.Существует() Тогда + ПутьКФайлуБИК = ИмяФайлаБИК(ВременныйКаталог); + КонецЕсли; + + ФайлБИК = Новый Файл(ПутьКФайлуБИК); + Если Не ФайлБИК.Существует() Тогда + ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным с сайта 1С. + |Архив не содержит информацию - классификатор банков.'"); + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + ПутьКФайлуРегионов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог) + "reg.txt"; + ФайлРегионов = Новый Файл(ПутьКФайлуРегионов); + Если Не ФайлРегионов.Существует() Тогда + ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным с сайта 1С. + |Архив не содержит информацию о регионах.'"); + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + ПутьКФайлуНедействующихБанков = ИмяФайлаНедействующихБанков(ВременныйКаталог); + ФайлНедействующихБанков = Новый Файл(ПутьКФайлуНедействующихБанков); + Если Не ФайлНедействующихБанков.Существует() Тогда + ТекстСообщения = НСтр("ru ='Возникли проблемы с файлом классификатора банков, полученным с сайта 1С. + |Архив не содержит информацию о недействующих банках.'"); + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ТекстСообщения); + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + ПараметрыЗагрузкиФайлов = Новый Соответствие; + ПараметрыЗагрузкиФайлов.Вставить("ПутьКФайлуБИК", ПутьКФайлуБИК); + ПараметрыЗагрузкиФайлов.Вставить("ПутьКФайлуРегионов", ПутьКФайлуРегионов); + ПараметрыЗагрузкиФайлов.Вставить("ПутьКФайлуНедействующихБанков", ПутьКФайлуНедействующихБанков); + ПараметрыЗагрузкиФайлов.Вставить("ВременныйКаталог", ВременныйКаталог); + ПараметрыЗагрузкиФайлов.Вставить("Загружено", ПараметрыЗагрузкиКлассификатора["Загружено"]); + ПараметрыЗагрузкиФайлов.Вставить("Обновлено", ПараметрыЗагрузкиКлассификатора["Обновлено"]); + ПараметрыЗагрузкиФайлов.Вставить("ТекстСообщения", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); + + ЗагрузитьДанные(ПараметрыЗагрузкиФайлов); + + Если Не ПустаяСтрока(ПараметрыЗагрузкиФайлов["ТекстСообщения"]) Тогда + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + Возврат; + КонецЕсли; + + УдалитьФайлы(ВременныйКаталог); + + ПараметрыЗагрузкиКлассификатора.Вставить("Загружено", ПараметрыЗагрузкиФайлов["Загружено"]); + ПараметрыЗагрузкиКлассификатора.Вставить("Обновлено", ПараметрыЗагрузкиФайлов["Обновлено"]); + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ПараметрыЗагрузкиФайлов["ТекстСообщения"]); + + КонецЕсли; + + Если ПараметрыПолученияФайлов["ВерсияКлассификатора"] > ТекущаяВерсияКлассификатора Тогда + УстановитьВерсиюКлассификатораБанков(ПараметрыПолученияФайлов["ВерсияКлассификатора"]); + КонецЕсли; + + ПараметрыЗагрузкиКлассификатора.Вставить("ЗагрузкаВыполнена", Истина); + ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора); + + Если НЕ ПустаяСтрока(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ПараметрыЗагрузкиКлассификатора, АдресХранилища); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗагрузитьКлассификаторБанков() Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанков); + + УровеньСобытия = УровеньЖурналаРегистрации.Информация; + + Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда + ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньСобытия, , , НСтр("ru = 'Загрузка в подчиненном узле РИБ не предусмотрена'")); + Возврат; + КонецЕсли; + + ПараметрыЗагрузкиКлассификатора = Новый Соответствие; + ПараметрыЗагрузкиКлассификатора.Вставить("Загружено", 0); + ПараметрыЗагрузкиКлассификатора.Вставить("Обновлено", 0); + ПараметрыЗагрузкиКлассификатора.Вставить("ТекстСообщения", ""); + ПараметрыЗагрузкиКлассификатора.Вставить("ЗагрузкаВыполнена", Ложь); + + ПолучитьДанные(ПараметрыЗагрузкиКлассификатора); + + Если ПараметрыЗагрузкиКлассификатора["ЗагрузкаВыполнена"] Тогда + Если ПустаяСтрока(ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]) Тогда + ДополнитьТекстСообщения(ПараметрыЗагрузкиКлассификатора); + КонецЕсли; + Иначе + УровеньСобытия = УровеньЖурналаРегистрации.Ошибка; + КонецЕсли; + + ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньСобытия, , , ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]); + +КонецПроцедуры + +Процедура ЗагрузитьДанные(ПараметрыЗагрузкиФайлов) + + Регионы = Регионы(ПараметрыЗагрузкиФайлов["ПутьКФайлуРегионов"]); + + ТекстБИК = Новый ЧтениеТекста(ПараметрыЗагрузкиФайлов["ПутьКФайлуБИК"], "windows-1251"); + СтрокаТекстаБИК = ТекстБИК.ПрочитатьСтроку(); + + ДатаЗагрузки = ТекущаяУниверсальнаяДата(); + + ПараметрыЗагрузкиДанных = Новый Соответствие; + ПараметрыЗагрузкиДанных.Вставить("Загружено", ПараметрыЗагрузкиФайлов["Загружено"]); + ПараметрыЗагрузкиДанных.Вставить("Обновлено", ПараметрыЗагрузкиФайлов["Обновлено"]); + + Пока СтрокаТекстаБИК <> Неопределено Цикл + + Строка = СтрокаТекстаБИК; + + Если ПустаяСтрока(СокрЛП(Строка)) Тогда + Продолжить; + КонецЕсли; + + СтруктураБанк = СведенияОБанке(Строка, Регионы); + СтрокаТекстаБИК = ТекстБИК.ПрочитатьСтроку(); + + Если ПустаяСтрока(СтруктураБанк) Тогда + Продолжить; + КонецЕсли; + + ПараметрыЗагрузкиДанных.Вставить("СтруктураБанк", СтруктураБанк); + ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанных); + + КонецЦикла; + + // Пометка недействующих банков. + ДействующиеБанки = ДействующиеБанкиИзФайла(ПараметрыЗагрузкиФайлов["ПутьКФайлуБИК"]); + НедействующиеБанки = НедействующиеБанкиИзФайла(ПараметрыЗагрузкиФайлов["ПутьКФайлуНедействующихБанков"]); + КоличествоОтмеченных = ОтметитьНедействующиеБанки(ДействующиеБанки, НедействующиеБанки); + ПараметрыЗагрузкиДанных["Обновлено"] = ПараметрыЗагрузкиДанных["Обновлено"] + КоличествоОтмеченных; + + ПараметрыЗагрузкиФайлов.Вставить("Загружено", ПараметрыЗагрузкиДанных["Загружено"]); + ПараметрыЗагрузкиФайлов.Вставить("Обновлено", ПараметрыЗагрузкиДанных["Обновлено"]); +КонецПроцедуры + +Процедура ПолучитьДанныеИзИнтернета(ПараметрыПолученияФайлов) + + УстановитьПривилегированныйРежим(Истина); + ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКлассификатораБанков.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + Если ИспользоватьАльтернативныйСервер Тогда + ФайлНаВебСервере = "http://cbrates.rbc.ru/bnk/bnk.zip"; + Иначе + ФайлНаВебСервере = "https://bankregister.1c.ru/bankregister/v1/bnk.zip"; + КонецЕсли; + + ВременныйФайл = ПараметрыПолученияФайлов["ВременныйКаталог"]+ "\bnk.zip"; + + ПараметрыПолучения = ПараметрыАутентификацииНаСайте(); + ПараметрыПолучения.Вставить("ПутьДляСохранения", ВременныйФайл); + + ДатаПоследнегоОбновления = ПараметрыПолученияФайлов["ВерсияКлассификатора"]; + ПараметрыПолучения.Вставить("Заголовки", Новый Соответствие); + ПараметрыПолучения.Заголовки.Вставить("If-Modified-Since", ДатаHTTP(ДатаПоследнегоОбновления)); + + РезультатИзИнтернета = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере, ПараметрыПолучения); + + Если РезультатИзИнтернета.Статус Тогда + ПараметрыПолученияФайлов.Вставить("ПутьКФайлу", РезультатИзИнтернета.Путь); + ВерсияКлассификатора = РезультатИзИнтернета.Заголовки["Last-Modified"]; + Если ВерсияКлассификатора <> Неопределено Тогда + ВерсияКлассификатора = ПрочитатьДатуHTTP(ВерсияКлассификатора); + ПараметрыПолученияФайлов["ВерсияКлассификатора"] = ВерсияКлассификатора; + КонецЕсли; + Иначе + Если РезультатИзИнтернета.КодСостояния = 304 Тогда + ПараметрыПолученияФайлов["ЕстьОбновлениеНаСервере"] = Ложь; + Иначе + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ДополнительноеСообщение = Символы.ПС + + НСтр("ru ='Возможно неточные или неправильные настройки подключения к Интернету.'"); + Иначе + ДополнительноеСообщение = Символы.ПС + + НСтр("ru ='Возможно неточные или неправильные настройки подключения к Интернету на сервере 1С:Предприятие.'"); + КонецЕсли; + СообщениеОбОшибке = РезультатИзИнтернета.СообщениеОбОшибке + ДополнительноеСообщение; + ПараметрыПолученияФайлов.Вставить("ТекстСообщения", СообщениеОбОшибке); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Функция ПараметрыАутентификацииНаСайте() + Результат = Новый Структура; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); + Если ДанныеАутентификации <> Неопределено Тогда + Результат.Вставить("Пользователь", ДанныеАутентификации.Логин); + Результат.Вставить("Пароль", ДанныеАутентификации.Пароль); + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Преобразует дату формата rfc1123-date в обычную универсальную дату. +// См. https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html, п. 3.3.1. +Функция ПрочитатьДатуHTTP(ДатаHTTP) + Месяцы = СтрРазделить("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", ","); + ДатаВремя = СтрРазделить(ДатаHTTP, " ", Ложь); + + День = ДатаВремя[1]; + Месяц = Месяцы.Найти(ДатаВремя[2]) + 1; + Год = ДатаВремя[3]; + Время = СтрРазделить(ДатаВремя[4], ":", Истина); + Час = Время[0]; + Минута = Время[1]; + Секунда = Время[2]; + + УниверсальноеВремя = Дата(Год, Месяц, День, Час, Минута, Секунда); + Возврат УниверсальноеВремя; +КонецФункции + +// Преобразует универсальную дату в дату формата rfc1123-date. +// См. https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html, п. 3.3.1. +Функция ДатаHTTP(Знач Дата) + ДниНедели = СтрРазделить("Mon,Tue,Wed,Thu,Fri,Sat,Sun", ","); + Месяцы = СтрРазделить("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", ","); + + ШаблонДаты = "[ДеньНедели], [День] [Месяц] [Год] [Час]:[Минута]:[Секунда] GMT"; + + ПараметрыДаты = Новый Структура; + ПараметрыДаты.Вставить("ДеньНедели", ДниНедели[ДеньНедели(Дата)-1]); + ПараметрыДаты.Вставить("День", Формат(День(Дата), "ЧЦ=2; ЧВН=")); + ПараметрыДаты.Вставить("Месяц", Месяцы[Месяц(Дата)-1]); + ПараметрыДаты.Вставить("Год", Формат(Год(Дата), "ЧЦ=4; ЧВН=; ЧГ=0")); + ПараметрыДаты.Вставить("Час", Формат(Час(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); + ПараметрыДаты.Вставить("Минута", Формат(Минута(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); + ПараметрыДаты.Вставить("Секунда", Формат(Секунда(Дата), "ЧЦ=2; ЧН=00; ЧВН=")); + + ДатаHTTP = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(ШаблонДаты, ПараметрыДаты); + + Возврат ДатаHTTP; +КонецФункции + +Функция ОпределитьТипГородаПоКоду(КодТипа) + + Если КодТипа = "1" Тогда + Возврат "Г."; // ГОРОД + ИначеЕсли КодТипа = "2" Тогда + Возврат "П."; // ПОСЕЛОК + ИначеЕсли КодТипа = "3" Тогда + Возврат "С."; // СЕЛО + ИначеЕсли КодТипа = "4" Тогда + Возврат "ПГТ"; // ПОСЕЛОК ГОРОДСКОГО ТИПА + ИначеЕсли КодТипа = "5" Тогда + Возврат "СТ-ЦА"; // СТАНИЦА + ИначеЕсли КодТипа = "6" Тогда + Возврат "АУЛ"; // АУЛ + ИначеЕсли КодТипа = "7" Тогда + Возврат "РП"; // РАБОЧИЙ ПОСЕЛОК + Иначе + Возврат ""; + КонецЕсли; + +КонецФункции + +Функция Регионы(ПутьКФайлуРегионов) + + СоответствиеРегионов = Новый Соответствие; + РегионыТекстовыйДокумент = Новый ЧтениеТекста(ПутьКФайлуРегионов, "windows-1251"); + СтрокаРегионов = РегионыТекстовыйДокумент.ПрочитатьСтроку(); + + Пока СтрокаРегионов <> Неопределено Цикл + + Строка = СтрокаРегионов; + СтрокаРегионов = РегионыТекстовыйДокумент.ПрочитатьСтроку(); + + Если (Лев(Строка,2) = "//") Или (ПустаяСтрока(Строка)) Тогда + Продолжить; + КонецЕсли; + + МассивПодстрок = СтрРазделить(Строка, Символы.Таб); + + Если МассивПодстрок.Количество() < 2 Тогда + Продолжить; + КонецЕсли; + + Символ1 = СокрЛП(МассивПодстрок[0]); + Символ2 = СокрЛП(МассивПодстрок[1]); + + // Дополним код региона до двух знаков. + Если СтрДлина(Символ1) = 1 Тогда + Символ1 = "0" + Символ1; + КонецЕсли; + + СоответствиеРегионов.Вставить(Символ1, Символ2); + КонецЦикла; + + Возврат СоответствиеРегионов; + +КонецФункции + +// Формирует структуру полей для банка. +// Параметры: +// Строка - Строка - Строка из текстового файла классификатора. +// Регионы - Соответствие - Код региона и регион банка. +// Возвращаемое значение: +// Банк - Структура - Реквизиты банка. +// +Функция СведенияОБанке(Знач Строка, Регионы) + + Результат = Новый Структура; + + СписокПолей = Новый Массив; + СписокПолей.Добавить("ТипУчастникаРасчетов"); + СписокПолей.Добавить("ИмяНаселенногоПункта"); + СписокПолей.Добавить("ТипПункта"); + СписокПолей.Добавить("Наименование"); + СписокПолей.Добавить("ПризнакКода"); + СписокПолей.Добавить("БИК"); + СписокПолей.Добавить("КоррСчет"); + СписокПолей.Добавить("СВИФТБИК"); + СписокПолей.Добавить("ИНН"); + + КоллекцияЗначений = СтрРазделить(Строка, Символы.Таб, Истина); + Для Индекс = 0 По СписокПолей.Количество() - 1 Цикл; + Значение = ""; + Если Индекс <= КоллекцияЗначений.ВГраница() Тогда + Значение = СокрЛП(КоллекцияЗначений[Индекс]); + КонецЕсли; + Результат.Вставить(СписокПолей[Индекс], Значение); + КонецЦикла; + + Если СтрДлина(Результат.БИК) <> 9 Тогда + Возврат ""; + КонецЕсли; + + Результат.ТипПункта = ОпределитьТипГородаПоКоду(Результат.ТипПункта); + Результат.Вставить("Город", СокрЛП(Результат.ТипПункта + " " + Результат.ИмяНаселенногоПункта)); + Результат.Вставить("Телефоны", ""); + Результат.Вставить("Адрес", ""); + + КодРегиона = Сред(Результат.БИК, 3, 2); + Регион = Регионы[КодРегиона]; + Если Регион = Неопределено Тогда + Регион = НСтр("ru = 'Другие территории'"); + КодРегиона = ""; + КонецЕсли; + + Результат.Вставить("КодРегиона", КодРегиона); + Результат.Вставить("Регион", Регион); + + Возврат Результат; + +КонецФункции + +// Выполняет загрузку классификатора банков РФ из файла, полученного с сайта 1С. +Функция ЗагрузитьДанныеИзФайла(ИмяФайла) Экспорт + + ПапкаСИзвлеченнымиФайлами = ИзвлечьФайлыИзАрхива(ИмяФайла); + Если ФайлыКлассификатораПолучены(ПапкаСИзвлеченнымиФайлами) Тогда + Параметры = Новый Соответствие; + ФайлБИКСВИФТ = Новый Файл(ИмяФайлаБИКСВИФТ(ПапкаСИзвлеченнымиФайлами)); + Если ФайлБИКСВИФТ.Существует() Тогда + Параметры.Вставить("ПутьКФайлуБИК", ИмяФайлаБИКСВИФТ(ПапкаСИзвлеченнымиФайлами)); + Иначе + Параметры.Вставить("ПутьКФайлуБИК", ИмяФайлаБИК(ПапкаСИзвлеченнымиФайлами)); + КонецЕсли; + Параметры.Вставить("ПутьКФайлуРегионов", ИмяФайлаРегионов(ПапкаСИзвлеченнымиФайлами)); + Параметры.Вставить("ПутьКФайлуНедействующихБанков", ИмяФайлаНедействующихБанков(ПапкаСИзвлеченнымиФайлами)); + Параметры.Вставить("Загружено", 0); + Параметры.Вставить("Обновлено", 0); + Параметры.Вставить("ТекстСообщения", ""); + Параметры.Вставить("ЗагрузкаВыполнена", Неопределено); + + ЗагрузитьДанные(Параметры); + УстановитьВерсиюКлассификатораБанков(); + КонецЕсли; + +КонецФункции + +Функция ФайлыКлассификатораПолучены(ПапкаСФайлами) + + Результат = Истина; + + ИменаФайловДляПроверки = Новый Массив; + ИменаФайловДляПроверки.Добавить(ИмяФайлаБИК(ПапкаСФайлами)); + ИменаФайловДляПроверки.Добавить(ИмяФайлаРегионов(ПапкаСФайлами)); + ИменаФайловДляПроверки.Добавить(ИмяФайлаНедействующихБанков(ПапкаСФайлами)); + + Для Каждого ИмяФайла Из ИменаФайловДляПроверки Цикл + Файл = Новый Файл(ИмяФайла); + Если Не Файл.Существует() Тогда + ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден файл %1'"), ИмяФайла)); + Результат = Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ИзвлечьФайлыИзАрхива(ZipФайл) + + ВременнаяПапка = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ВременнаяПапка); + + Попытка + ЧтениеZipФайла = Новый ЧтениеZipФайла(ZipФайл); + ЧтениеZipФайла.ИзвлечьВсе(ВременнаяПапка); + Исключение + ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УдалитьФайлы(ВременнаяПапка); + КонецПопытки; + + Возврат ВременнаяПапка; + +КонецФункции + +Функция ИмяФайлаРегионов(ПапкаСФайламиКлассификатора) + + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "reg.txt"; + +КонецФункции + +Функция ИмяФайлаБИК(ПапкаСФайламиКлассификатора) + + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkseek.txt"; + +КонецФункции + +Функция ИмяФайлаБИКСВИФТ(ПапкаСФайламиКлассификатора) + + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkseek_swift.txt"; + +КонецФункции + +Функция ИмяФайлаНедействующихБанков(ПапкаСФайламиКлассификатора) + + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПапкаСФайламиКлассификатора) + "bnkdel.txt"; + +КонецФункции + +Процедура ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки) + + ЗаписьЖурналаРегистрации(ИмяСобытияВЖурналеРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + +КонецПроцедуры + +Функция ИмяСобытияВЖурналеРегистрации() + УстановитьПривилегированныйРежим(Истина); + ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКлассификатораБанков.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + Если ИспользоватьАльтернативныйСервер Тогда + Возврат НСтр("ru = 'Загрузка классификатора банков.РБК'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + КонецЕсли; + + Возврат НСтр("ru = 'Загрузка классификатора банков.1С'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + +КонецФункции + +Функция НедействующиеБанкиИзФайла(ПутьКФайлу) + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("БИК", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(9))); + Результат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100))); + Результат.Колонки.Добавить("ДатаЗакрытия", Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Дата))); + + ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251"); + + Строка = ЧтениеТекста.ПрочитатьСтроку(); + Пока Строка <> Неопределено Цикл + СведенияОБанке = СтрРазделить(Строка, Символы.Таб); + Если СведенияОБанке.Количество() <> 8 Тогда + Продолжить; + КонецЕсли; + Банк = Результат.Добавить(); + Банк.БИК = СведенияОБанке[6]; + Банк.Наименование = СведенияОБанке[4]; + Банк.ДатаЗакрытия = СведенияОБанке[1]; + + Строка = ЧтениеТекста.ПрочитатьСтроку(); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ДействующиеБанкиИзФайла(ПутьКФайлу) + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("БИК", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(9))); + Результат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100))); + + ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251"); + + Строка = ЧтениеТекста.ПрочитатьСтроку(); + Пока Строка <> Неопределено Цикл + СведенияОБанке = СтрРазделить(Строка, Символы.Таб); + Строка = ЧтениеТекста.ПрочитатьСтроку(); + + Если СведенияОБанке.Количество() < 7 Тогда + Продолжить; + КонецЕсли; + Банк = Результат.Добавить(); + Банк.БИК = СведенияОБанке[5]; + Банк.Наименование = СведенияОБанке[3]; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ОтметитьНедействующиеБанки(ДействующиеБанки, НедействующиеБанки) + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + Запрос.Текст = + "ВЫБРАТЬ + | НедействующиеБанки.БИК КАК БИК + |ПОМЕСТИТЬ НедействующиеБанки + |ИЗ + | &НедействующиеБанки КАК НедействующиеБанки + |ГДЕ + | НЕ НедействующиеБанки.БИК В (&БИК) + | + |ИНДЕКСИРОВАТЬ ПО + | БИК"; + Запрос.УстановитьПараметр("НедействующиеБанки", НедействующиеБанки); + Запрос.УстановитьПараметр("БИК", ДействующиеБанки.ВыгрузитьКолонку("БИК")); + Запрос.Выполнить(); + + Запрос.Текст = + "ВЫБРАТЬ + | КлассификаторБанков.Ссылка + |ИЗ + | НедействующиеБанки КАК НедействующиеБанки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КлассификаторБанков КАК КлассификаторБанков + | ПО НедействующиеБанки.БИК = КлассификаторБанков.Код + |ГДЕ + | КлассификаторБанков.ДеятельностьПрекращена = ЛОЖЬ + | + |СГРУППИРОВАТЬ ПО + | КлассификаторБанков.Ссылка"; + + ВыборкаБанков = Запрос.Выполнить().Выбрать(); + Пока ВыборкаБанков.Следующий() Цикл + БанкОбъект = ВыборкаБанков.Ссылка.ПолучитьОбъект(); + БанкОбъект.ДеятельностьПрекращена = Истина; + БанкОбъект.Записать(); + КонецЦикла; + + Возврат ВыборкаБанков.Количество(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Работа с данными диска ИТС + +// Сортирует, записывает данные классификатора БИК РФ с диска ИТС. +// +// Параметры: +// ПараметрыЗагрузкиФайловИТС - Соответствие: +// ПодготовкаИТСАдресДвоичныхДанных - ВременноеХранилище - Обработка подготовки данных БИК ИТС. +// ДанныеИТСАдресДвоичныхДанных - ВременноеХранилище - Файл данных БИК ИТС. +// Загружено - Число - Количество новых записей классификатора. +// Обновлено - Число - Количество обновленных записей классификатора. +// ТекстСообщения - Строка - тест сообщения о результатах загрузки. +// ЗагрузкаВыполнена - Булево - флаг успешного завершения загрузки данных классификатора. +// +Процедура ЗагрузитьДанныеДискИТС(ПараметрыЗагрузкиФайловИТС) Экспорт + + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(ВременныйКаталог); + + ПодготовкаИТСДвоичныеДанные = ПолучитьИзВременногоХранилища(ПараметрыЗагрузкиФайловИТС["ПодготовкаИТСАдресДвоичныхДанных"]); + ПодготовкаИТСПуть = ВременныйКаталог + "BIKr5v82_MA.epf"; + ПодготовкаИТСДвоичныеДанные.Записать(ПодготовкаИТСПуть); + ОбработкаПодготовкиДанныхИТС = Новый Файл(ПодготовкаИТСПуть); + + ДанныеИТСДвоичныеДанные = ПолучитьИзВременногоХранилища(ПараметрыЗагрузкиФайловИТС["ДанныеИТСАдресДвоичныхДанных"]); + ПутьКДаннымИТС = ВременныйКаталог + "Morph.dlc"; + ДанныеИТСДвоичныеДанные.Записать(ПутьКДаннымИТС); + ДанныеИТС = Новый ТекстовыйДокумент; + ДанныеИТС.Прочитать(ПутьКДаннымИТС); + + ТаблицаКлассификатора = Новый ТаблицаЗначений; + ТаблицаКлассификатора.Колонки.Добавить("БИК"); + ТаблицаКлассификатора.Колонки.Добавить("Наименование"); + ТаблицаКлассификатора.Колонки.Добавить("КоррСчет"); + ТаблицаКлассификатора.Колонки.Добавить("Город"); + ТаблицаКлассификатора.Колонки.Добавить("Адрес"); + ТаблицаКлассификатора.Колонки.Добавить("Телефоны"); + ТаблицаКлассификатора.Колонки.Добавить("КодРегиона"); + ТаблицаКлассификатора.Колонки.Добавить("Регион"); + + ВнешняяОбработкаПодготовкиДанныхИТС = ВнешниеОбработки.Создать(ОбработкаПодготовкиДанныхИТС.ПолноеИмя); + + КоличествоСтрок = ДанныеИТС.КоличествоСтрок(); + + СтрокаВерсии = ДанныеИТС.ПолучитьСтроку(1); + + КоличествоЧастей = Окр(КоличествоСтрок/1000); + СоответствиеРегионов = ""; + ТекстСообщения = ""; + ДатаВерсии = ""; + + Для НомерЧасти = 1 По КоличествоЧастей Цикл + ВнешняяОбработкаПодготовкиДанныхИТС.СортироватьДанныеКлассификатора(ДанныеИТС, ТаблицаКлассификатора, + СоответствиеРегионов, ДатаВерсии, + НомерЧасти, ТекстСообщения); + Если Не ПустаяСтрока(ТекстСообщения) Тогда + Возврат; + КонецЕсли; + + ПараметрыЗагрузкиДанныхИТС = Новый Соответствие; + ПараметрыЗагрузкиДанныхИТС.Вставить("ТаблицаКлассификатора", ТаблицаКлассификатора); + ПараметрыЗагрузкиДанныхИТС.Вставить("Загружено", ПараметрыЗагрузкиФайловИТС["Загружено"]); + ПараметрыЗагрузкиДанныхИТС.Вставить("Обновлено", ПараметрыЗагрузкиФайловИТС["Обновлено"]); + + ЗаписатьДанныеКлассификатора(ПараметрыЗагрузкиДанныхИТС); + + ПараметрыЗагрузкиФайловИТС.Вставить("Загружено", ПараметрыЗагрузкиДанныхИТС["Загружено"]); + ПараметрыЗагрузкиФайловИТС.Вставить("Обновлено", ПараметрыЗагрузкиДанныхИТС["Обновлено"]); + + КонецЦикла; + + УстановитьВерсиюКлассификатораБанков(ДатаВерсии); + УдалитьФайлы(ВременныйКаталог); + + Если ПустаяСтрока(ПараметрыЗагрузкиФайловИТС["ТекстСообщения"]) Тогда + ПараметрыЗагрузкиФайловИТС.Вставить("ЗагрузкаВыполнена", Истина); + ДополнитьТекстСообщения(ПараметрыЗагрузкиФайловИТС); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Запись обработанных данных + +/// Записывает/перезаписывает в справочник КлассификаторБанков данные банка. +// Параметры: +// ПараметрыЗагрузкиДанных - Соответствие: +// СтруктураБанк - Структура или СтрокаТаблицыЗначений - Данные банка. +// Загружено - Число - Количество новых записей классификатора. +// Обновлено - Число - Количество обновленных записей классификатора. +// +Процедура ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанных) + + ФлагНовый = Ложь; + ФлагОбновленный = Ложь; + Регион = ""; + + СтруктураБанк = ПараметрыЗагрузкиДанных["СтруктураБанк"]; + Загружено = ПараметрыЗагрузкиДанных["Загружено"]; + Обновлено = ПараметрыЗагрузкиДанных["Обновлено"]; + + ТекущийРегион = Справочники.КлассификаторБанков.НайтиПоКоду(СтруктураБанк.КодРегиона); + Если ТекущийРегион.Пустая() Тогда + Регион = Справочники.КлассификаторБанков.СоздатьГруппу(); + Иначе + Если ТекущийРегион.ЭтоГруппа Тогда + Регион = ТекущийРегион.ПолучитьОбъект(); + Иначе + Регион = Справочники.КлассификаторБанков.СоздатьГруппу(); + КонецЕсли; + КонецЕсли; + + Если СокрЛП(Регион.Код) <> СокрЛП(СтруктураБанк.КодРегиона) Тогда + Регион.Код = СокрЛП(СтруктураБанк.КодРегиона); + КонецЕсли; + + Если СокрЛП(Регион.Наименование) <> СокрЛП(СтруктураБанк.Регион) Тогда + Регион.Наименование = СокрЛП(СтруктураБанк.Регион); + КонецЕсли; + + Если Регион.Модифицированность() Тогда + Регион.Записать(); + КонецЕсли; + + ЗаписываемыйЭлементСправочникаКлассификаторБанков = + Справочники.КлассификаторБанков.НайтиПоКоду(СтруктураБанк.БИК); + + Если ЗаписываемыйЭлементСправочникаКлассификаторБанков.Пустая() Тогда + КлассификаторБанковОбъект = Справочники.КлассификаторБанков.СоздатьЭлемент(); + ФлагНовый = Истина; + Иначе + КлассификаторБанковОбъект = ЗаписываемыйЭлементСправочникаКлассификаторБанков.ПолучитьОбъект(); + КонецЕсли; + + Если КлассификаторБанковОбъект.ДеятельностьПрекращена Тогда + КлассификаторБанковОбъект.ДеятельностьПрекращена = Ложь; + КонецЕсли; + + Если КлассификаторБанковОбъект.Код <> СтруктураБанк.БИК Тогда + КлассификаторБанковОбъект.Код = СтруктураБанк.БИК; + КонецЕсли; + + Если СтруктураБанк.Свойство("СВИФТБИК") Тогда + Если КлассификаторБанковОбъект.СВИФТБИК <> СтруктураБанк.СВИФТБИК Тогда + Если Не ПустаяСтрока(СтруктураБанк.СВИФТБИК) Тогда + КлассификаторБанковОбъект.СВИФТБИК = СтруктураБанк.СВИФТБИК; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если СтруктураБанк.Свойство("ИНН") Тогда + Если КлассификаторБанковОбъект.ИНН <> СтруктураБанк.ИНН Тогда + Если Не ПустаяСтрока(СтруктураБанк.ИНН) Тогда + КлассификаторБанковОбъект.ИНН = СтруктураБанк.ИНН; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.Наименование <> СтруктураБанк.Наименование Тогда + Если Не ПустаяСтрока(СтруктураБанк.Наименование) Тогда + КлассификаторБанковОбъект.Наименование = СтруктураБанк.Наименование; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.КоррСчет <> СтруктураБанк.КоррСчет Тогда + Если Не ПустаяСтрока(СтруктураБанк.КоррСчет) Тогда + КлассификаторБанковОбъект.КоррСчет = СтруктураБанк.КоррСчет; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.Город <> СтруктураБанк.Город Тогда + Если Не ПустаяСтрока(СтруктураБанк.Город) Тогда + КлассификаторБанковОбъект.Город = СтруктураБанк.Город; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.Адрес <> СтруктураБанк.Адрес Тогда + Если Не ПустаяСтрока(СтруктураБанк.Адрес) Тогда + КлассификаторБанковОбъект.Адрес = СтруктураБанк.Адрес; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.Телефоны <> СтруктураБанк.Телефоны Тогда + Если Не ПустаяСтрока(СтруктураБанк.Телефоны) Тогда + КлассификаторБанковОбъект.Телефоны = СтруктураБанк.Телефоны; + КонецЕсли; + КонецЕсли; + + Если Не ПустаяСтрока(Регион) Тогда + Если КлассификаторБанковОбъект.Родитель <> Регион.Ссылка Тогда + КлассификаторБанковОбъект.Родитель = Регион.Ссылка; + КонецЕсли; + КонецЕсли; + + Если КлассификаторБанковОбъект.Модифицированность() Тогда + ФлагОбновленный = Истина; + КлассификаторБанковОбъект.Записать(); + КонецЕсли; + + Если ФлагНовый Тогда + Загружено = Загружено + 1; + ИначеЕсли ФлагОбновленный Тогда + Обновлено = Обновлено + 1; + КонецЕсли; + + ПараметрыЗагрузкиДанных.Вставить("Загружено", Загружено); + ПараметрыЗагрузкиДанных.Вставить("Обновлено", Обновлено); + +КонецПроцедуры + +// Записывает/перезаписывает в справочник КлассификаторБанков данные банков. +// Параметры: +// ПараметрыЗагрузкиДанныхИТС - Соответствие: +// ТаблицаКлассификатора - ТаблицаЗначений - Данные банков. +// Загружено - Число - Количество новых записей классификатора. +// Обновлено - Число - Количество обновленных записей классификатора. +// +Процедура ЗаписатьДанныеКлассификатора(ПараметрыЗагрузкиДанныхИТС) + + ТаблицаБанков = ПараметрыЗагрузкиДанныхИТС["ТаблицаКлассификатора"]; + + ПараметрыЗагрузкиДанных = Новый Соответствие; + ПараметрыЗагрузкиДанных.Вставить("Загружено", ПараметрыЗагрузкиДанныхИТС["Загружено"]); + ПараметрыЗагрузкиДанных.Вставить("Обновлено", ПараметрыЗагрузкиДанныхИТС["Обновлено"]); + + Для СчетчикБанков = 1 По ТаблицаБанков.Количество() Цикл + + СтрокаТаблицыБанков = ТаблицаБанков.Получить(СчетчикБанков - 1); + + ПараметрыЗагрузкиДанных.Вставить("СтруктураБанк", СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыБанков)); + ЗаписатьЭлементКлассификатораБанковРФ(ПараметрыЗагрузкиДанных); + + КонецЦикла; + + ПараметрыЗагрузкиДанныхИТС.Вставить("Загружено", ПараметрыЗагрузкиДанных["Загружено"]); + ПараметрыЗагрузкиДанныхИТС.Вставить("Обновлено", ПараметрыЗагрузкиДанных["Обновлено"]); + +КонецПроцедуры + +Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицы) + Результат = Новый Структура; + Для Каждого Колонка Из СтрокаТаблицы.Владелец().Колонки Цикл + Результат.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]); + КонецЦикла; + Возврат Результат; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Прочие процедуры и функции + +// Устанавливает значение даты загрузки данных классификатора. +// +// Параметры: +// ДатаВерсии - ДатаВремя - Дата загрузки данных классификатора. +Процедура УстановитьВерсиюКлассификатораБанков(ДатаВерсии = "") + УстановитьПривилегированныйРежим(Истина); + Если ТипЗнч(ДатаВерсии) <> Тип("Дата") Тогда + Константы.ВерсияКлассификатораБанков.Установить(ТекущаяУниверсальнаяДата()); + Иначе + Константы.ВерсияКлассификатораБанков.Установить(ДатаВерсии); + КонецЕсли; +КонецПроцедуры + +// Определяет нужно ли обновление данных классификатора. +// +Функция КлассификаторАктуален() Экспорт + УстановитьПривилегированныйРежим(Истина); + ПоследнееОбновление = Константы.ВерсияКлассификатораБанков.Получить(); + ДопустимаяПросрочка = 30*60*60*24; + + Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда + Возврат Ложь; // Пошла просрочка. + КонецЕсли; + + Возврат Истина; +КонецФункции + +Функция АктуальностьКлассификатораБанков() Экспорт + + УстановитьПривилегированныйРежим(Истина); + ПоследнееОбновление = Константы.ВерсияКлассификатораБанков.Получить(); + ДопустимаяПросрочка = 60*60*24; + + Результат = Новый Структура; + Результат.Вставить("КлассификаторУстарел", Ложь); + Результат.Вставить("КлассификаторПросрочен", Ложь); + Результат.Вставить("ВеличинаПросрочкиСтрокой", ""); + + Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда + Результат.ВеличинаПросрочкиСтрокой = ОбщегоНазначения.ИнтервалВремениСтрокой(ПоследнееОбновление, ТекущаяДатаСеанса()); + + ВеличинаПросрочки = (ТекущаяДатаСеанса() - ПоследнееОбновление); + ДнейПросрочено = Цел(ВеличинаПросрочки/60/60/24); + + Результат.КлассификаторУстарел = ДнейПросрочено >= 1; + Результат.КлассификаторПросрочен = ДнейПросрочено >= 7; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт + УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Истина)); +КонецПроцедуры + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт + УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Ложь)); +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "Обработки.ЗагрузкаКлассификатораБанков.УстановитьРасписаниеРегламентногоЗадания"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.НачальноеЗаполнение = Истина; + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьРасписаниеРегламентногоЗадания() Экспорт + + ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах()); + Задержка = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 21600); // С 0 до 6 часов утра. + + Расписание = Новый РасписаниеРегламентногоЗадания; + Расписание.ПериодПовтораДней = 1; + Расписание.ПериодНедель = 1; + Расписание.ВремяНачала = '00010101000000' + Задержка; + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Расписание", Расписание); + ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 600); + ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 10); + + УстановитьПараметрыРегламентногоЗадания(ПараметрыЗадания); + +КонецПроцедуры + +Процедура УстановитьПараметрыРегламентногоЗадания(ИзменяемыеПараметры) + РегламентныеЗаданияСервер.УстановитьПараметрыРегламентногоЗадания( + Метаданные.РегламентныеЗадания.ЗагрузкаКлассификатораБанков, ИзменяемыеПараметры); +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo new file mode 100644 index 000000000..74fcf8ee4 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo @@ -0,0 +1,37 @@ + + + + + + + ЗагрузкаКлассификатораБанков + + ru + Загрузка классификатора банков + + true + + ЗагрузкаКлассификатора + + ru + Загрузка классификатора + + + + ru + + + PersonalComputer + MobileDevice + + + ЗагрузкаКлассификатораБанков + + ru + Загрузка классификатора банков РФ + + Открывает помощник загрузки классификатора банков РФ + ActionsPanelTools + Auto + + diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Form.form new file mode 100644 index 000000000..2c31e6630 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Form.form @@ -0,0 +1,1254 @@ + + + + <key>ru</key> + <value>Параметры прописи валюты</value> + + + СклонениеЦелойЧасти + 9 + + ПолеПрописи4наРусском + 13 + + <key>ru</key> + <value>Род</value> + + true + true + + true + + + ПолеПрописи4наРусском + + + OnChange + ПолеПрописи4наРусскомПриИзменении + + + ПолеПрописи4наРусскомExtendedTooltip + 85 + Label + true + true + + Left + + + + ПолеПрописи4наРусскомКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ПолеПрописи4наРусскомАвтоПодбор + + + TextEditEnd + ПолеПрописи4наРусскомОкончаниеВводаТекста + + 10 + 15 + true + false + true + true + + + ru + Мужской + + + Мужской + + + + + ru + Женский + + + Женский + + + + + ru + Средний + + + Средний + + + + Style.BorderColor + + Normal + + + + ПолеПрописи1наРусском + 10 + + <key>ru</key> + <value>Один</value> + + true + true + + true + + + ПолеПрописи1наРусском + + + OnChange + ПолеПрописи1наРусскомПриИзменении + + + ПолеПрописи1наРусскомExtendedTooltip + 86 + Label + true + true + + Left + + + + ПолеПрописи1наРусскомКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи2наРусском + 11 + + <key>ru</key> + <value>Два</value> + + true + true + + true + + + ПолеПрописи2наРусском + + + OnChange + ПолеПрописи2наРусскомПриИзменении + + + ПолеПрописи2наРусскомExtendedTooltip + 87 + Label + true + true + + Left + + + + ПолеПрописи2наРусскомКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи3наРусском + 12 + + <key>ru</key> + <value>Пять</value> + + true + true + + true + + + ПолеПрописи3наРусском + + + OnChange + ПолеПрописи3наРусскомПриИзменении + + + ПолеПрописи3наРусскомExtendedTooltip + 88 + Label + true + true + + Left + + + + ПолеПрописи3наРусскомКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Целая часть</value> + + + СклонениеЦелойЧастиРасширеннаяПодсказка + 84 + 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наРусскомExtendedTooltip + 91 + Label + true + true + + Left + + + + ПолеПрописи8наРусскомКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ПолеПрописи8наРусскомАвтоПодбор + + + TextEditEnd + ПолеПрописи8наРусскомОкончаниеВводаТекста + + 10 + 15 + true + false + true + true + + + ru + Мужской + + + Мужской + + + + + ru + Женский + + + Женский + + + + + ru + Средний + + + Средний + + + + Style.BorderColor + + Normal + + + + ПолеПрописи5наРусском + 17 + + <key>ru</key> + <value>Один</value> + + true + true + + true + + + ПолеПрописи5наРусском + + + OnChange + ПолеПрописи5наРусскомПриИзменении + + + ПолеПрописи5наРусскомExtendedTooltip + 92 + Label + true + true + + Left + + + + ПолеПрописи5наРусскомКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи6наРусском + 16 + + <key>ru</key> + <value>Два</value> + + true + true + + true + + + ПолеПрописи6наРусском + + + OnChange + ПолеПрописи6наРусскомПриИзменении + + + ПолеПрописи6наРусскомExtendedTooltip + 93 + Label + true + true + + Left + + + + ПолеПрописи6наРусскомКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи7наРусском + 15 + + <key>ru</key> + <value>Пять</value> + + true + true + + true + + + ПолеПрописи7наРусском + + + OnChange + ПолеПрописи7наРусскомПриИзменении + + + ПолеПрописи7наРусскомExtendedTooltip + 94 + Label + true + true + + Left + + + + ПолеПрописи7наРусскомКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + Left + + 10 + 15 + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дробная часть</value> + + + СклонениеДробнойЧастиРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + + ru + Параметры прописи дробной части для русского языка + + Auto + Auto + + + + ГруппаЧислоРазрядовДробнойЧасти + 56 + + ДлинаДробнойЧасти + 20 + true + true + + true + + + ДлинаДробнойЧасти + + + OnChange + ДлинаДробнойЧастиПриИзменении + + + ДлинаДробнойЧастиExtendedTooltip + 96 + Label + true + true + + Left + + + + ДлинаДробнойЧастиКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ДлинаДробнойЧастиАвтоПодбор + + + TextEditEnd + ДлинаДробнойЧастиОкончаниеВводаТекста + + 15 + true + true + false + true + + + ru + 2 знака + + + 2 знака + + + + + ru + 1 знак + + + 1 знак + + + + + ru + 3 знака + + + 3 знака + + + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Число разрядов дробной части</value> + + + ГруппаЧислоРазрядовДробнойЧастиExtendedTooltip + 95 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПримерПрописи + 61 + + СуммаЧисло + 59 + + <key>ru</key> + <value>Сумма</value> + + true + true + + true + + + СуммаЧисло + + + OnChange + СуммаЧислоПриИзменении + + + СуммаЧислоExtendedTooltip + 98 + Label + true + true + + Left + + + + СуммаЧислоКонтекстноеМеню + 60 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СуммаПрописью + 62 + true + true + + true + + + СуммаПрописью + + + СуммаПрописьюExtendedTooltip + 99 + Label + true + true + + Left + + + + СуммаПрописьюКонтекстноеМеню + 63 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пример прописи суммы</value> + + + ГруппаПримерПрописиExtendedTooltip + 97 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дробная часть</value> + + + ГруппаПараметрыДробнойЧастиExtendedTooltip + 89 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаУстановить + 106 + true + true + + true + + + ФормаУстановитьРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + Form.Command.Установить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 104 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтмена1 + 108 + true + true + + true + + + ФормаОтмена1РасширеннаяПодсказка + 109 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + true + true + auto + true + + ПолеПрописи1наРусском + + <key>ru</key> + <value>Поле прописи1на русском</value> + + 2 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи2наРусском + + <key>ru</key> + <value>Поле прописи2на русском</value> + + 3 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи3наРусском + + <key>ru</key> + <value>Поле прописи3на русском</value> + + 4 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи4наРусском + + <key>ru</key> + <value>Поле прописи4на русском</value> + + 5 + + String + + + + true + + + true + + true + + + ПолеПрописи5наРусском + + <key>ru</key> + <value>Поле прописи5на русском</value> + + 6 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи6наРусском + + <key>ru</key> + <value>Поле прописи6на русском</value> + + 7 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи7наРусском + + <key>ru</key> + <value>Поле прописи7на русском</value> + + 8 + + String + + 25 + + + + true + + + true + + true + + + ПолеПрописи8наРусском + + <key>ru</key> + <value>Поле прописи8на русском</value> + + 9 + + String + + 25 + + + + true + + + true + + true + + + ДлинаДробнойЧасти + + <key>ru</key> + <value>Число разрядов дробной части</value> + + 11 + + String + + + + true + + + true + + true + + + ЗависимыйКурсВалют + + <key>ru</key> + <value>Курс валюты зависит от курса другой валюты</value> + + 10 + + Boolean + + + true + + + true + + true + + + СуммаЧисло + + <key>ru</key> + <value>Сумма число</value> + + 12 + + Number + + 10 + 2 + true + + + + true + + + true + + + + СуммаПрописью + + <key>ru</key> + <value>Сумма прописью</value> + + 13 + + String + + + + true + + + true + + + + Установить + + <key>ru</key> + <value>Установить</value> + + 1 + + ru + Установить + + + true + + + + Установить + + + DontUse + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + DontUse + 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..9788c9896 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Help/ru.html @@ -0,0 +1,10 @@ + +

            Параметры прописи валюты

            +

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

            +
            • Целая часть - укажите параметры склонения целой части валюты: Род и соответствующие шаблоны склонения в единственном и множественном числе. +
            • Дробная часть - укажите параметры склонения дробной части валюты: Род и соответствующие шаблоны склонения в единственном и множественном числе. +
            • Число разрядов дробной части - в случае если дробная часть в печатных формах отображается числом, то можно установить нужное количество разрядов при выводе печатных форм документов. Например, если установлено количество разрядов 1 знак, то сумма по документу будет отображена, как 150,2 евро, а если 2 знака, то – 150,20 евро. +
            • Пример прописи суммы - число, введенное в поле Сумма, будет написано по указанным параметрам прописи валюты. Используйте эту возможность для проверки параметров прописи валюты.

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

            +

            См. также:

            + \ 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..fa37538d1 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Module.bsl @@ -0,0 +1,275 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ЗаполнитьФормуПоОбъекту(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СуммаЧислоПриИзменении(Элемент) + + УстановитьСуммуПрописью(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи4наРусскомПриИзменении(Элемент) + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи4наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи4наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи8наРусскомПриИзменении(Элемент) + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи8наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи8наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи1наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи2наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи3наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи5наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи6наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи7наРусскомПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаДробнойЧастиПриИзменении(Элемент) + УстановитьСуммуПрописью(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаДробнойЧастиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаДробнойЧастиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Установить(Команда) + Закрыть(ПараметрыПрописиНаРусском(ЭтотОбъект)); +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + Закрыть(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ЗаполнитьФормуПоОбъекту() + + ПрочитатьПараметрыПрописи(); + + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПараметрыПрописиНаРусском(Форма) + + Возврат Форма.ПолеПрописи1наРусском + ", " + + Форма.ПолеПрописи2наРусском + ", " + + Форма.ПолеПрописи3наРусском + ", " + + НРег(Лев(Форма.ПолеПрописи4наРусском, 1)) + ", " + + Форма.ПолеПрописи5наРусском + ", " + + Форма.ПолеПрописи6наРусском + ", " + + Форма.ПолеПрописи7наРусском + ", " + + НРег(Лев(Форма.ПолеПрописи8наРусском, 1)) + ", " + + Форма.ДлинаДробнойЧасти; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьСуммуПрописью(Форма) + + Форма.СуммаПрописью = ЧислоПрописью(Форма.СуммаЧисло, , ПараметрыПрописиНаРусском(Форма)); + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьПараметрыПрописи() + + // Считывает параметры прописи и заполняет соответствующие поля диалога. + + СтрокаПараметров = СтрЗаменить(Параметры.ПараметрыПрописи, ",", Символы.ПС); + + ПолеПрописи1наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)); + ПолеПрописи2наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)); + ПолеПрописи3наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)); + + Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)); + + Если НРег(Род) = "м" Тогда + ПолеПрописи4наРусском = "Мужской"; + ИначеЕсли НРег(Род) = "ж" Тогда + ПолеПрописи4наРусском = "Женский"; + ИначеЕсли НРег(Род) = "с" Тогда + ПолеПрописи4наРусском = "Средний"; + КонецЕсли; + + ПолеПрописи5наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)); + ПолеПрописи6наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)); + ПолеПрописи7наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)); + + Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)); + + Если НРег(Род = "м") Тогда + ПолеПрописи8наРусском = "Мужской"; + ИначеЕсли НРег(Род = "ж") Тогда + ПолеПрописи8наРусском = "Женский"; + ИначеЕсли НРег(Род = "с") Тогда + ПолеПрописи8наРусском = "Средний"; + КонецЕсли; + + ДлинаДробнойЧасти = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьСклоненияПараметровПрописи(Форма) + + // Склонение заголовков параметров прописи. + + Элементы = Форма.Элементы; + + Если Форма.ПолеПрописи4наРусском = "Женский" Тогда + Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Одна'"); + Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Две'"); + ИначеЕсли Форма.ПолеПрописи4наРусском = "Мужской" Тогда + Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Один'"); + Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Два'"); + Иначе + Элементы.ПолеПрописи1наРусском.Заголовок = НСтр("ru = 'Одно'"); + Элементы.ПолеПрописи2наРусском.Заголовок = НСтр("ru = 'Два'"); + КонецЕсли; + + Если Форма.ПолеПрописи8наРусском = "Женский" Тогда + Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Одна'"); + Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Две'"); + ИначеЕсли Форма.ПолеПрописи8наРусском = "Мужской" Тогда + Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Один'"); + Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Два'"); + Иначе + Элементы.ПолеПрописи5наРусском.Заголовок = НСтр("ru = 'Одно'"); + Элементы.ПолеПрописи6наРусском.Заголовок = НСтр("ru = 'Два'"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) + + // Вспомогательная функция управлением вводом. + + Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл + Если ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда + Результат = Новый СписокЗначений; + Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); + СтандартнаяОбработка = Ложь; + Возврат Результат; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +&НаКлиенте +Функция ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) + + // Вспомогательная функция управлением вводом. + + СтандартнаяОбработка = Ложь; + + Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл + Если ВРег(Текст) = ВРег(ЭлементВыбора.Представление) Тогда + СтандартнаяОбработка = Истина; + ИначеЕсли ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда + СтандартнаяОбработка = Ложь; + Результат = Новый СписокЗначений; + Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); + Возврат Результат; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +#КонецОбласти + diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form similarity index 98% rename from SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form rename to SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form index f2f737510..f952babe1 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form @@ -3,6 +3,10 @@ СписокВалют 1 + + <key>ru</key> + <value>Список валют</value> + true true @@ -543,9 +547,6 @@ Auto true true - None - None - None true @@ -677,10 +678,10 @@ - ПараметрыПрописиНаРусском + ПараметрыПрописи <key>ru</key> - <value>Параметры прописи на русском</value> + <value>Параметры прописи</value> 6 diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Help/ru.html similarity index 91% rename from SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html rename to SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Help/ru.html index 8091c906a..d37eefea1 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Help/ru.html @@ -10,7 +10,7 @@
          • Страны и территории - указываются страны или территории, в которых данная валюта используется в качестве основной.
          • -
            Загружается из сети Интернет - если флажок включен, то валюта может загружаться с сайта 1С.

          Добавление валюты из классификатора в список валют

          +
          Загружается из сети Интернет - если флажок включен, то валюта может загружаться с сайта 1С.

        Добавление валюты из классификатора в список валют

        • Выделив одну или несколько валют, нажмите кнопку Выбрать.
        • diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl similarity index 90% rename from SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl rename to SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl index e2d327bb9..9458fe7e7 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl @@ -45,7 +45,7 @@ // Заполняет список валют из макета ОКВ. - КлассификаторXML = Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); + КлассификаторXML = Обработки.ЗагрузкаКурсовВалют.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; @@ -56,7 +56,7 @@ НоваяСтрока.Наименование = ЗаписьОКВ.Name; НоваяСтрока.СтраныИТерритории = ЗаписьОКВ.Description; НоваяСтрока.Загружается = ЗаписьОКВ.RBCLoading; - НоваяСтрока.ПараметрыПрописиНаРусском = ЗаписьОКВ.NumerationItemOptions; + НоваяСтрока.ПараметрыПрописи = ЗаписьОКВ.NumerationItemOptions; КонецЦикла; КонецПроцедуры @@ -87,7 +87,7 @@ Иначе НоваяСтрока.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; КонецЕсли; - НоваяСтрока.ПараметрыПрописиНаРусском = ТекущиеДанные.ПараметрыПрописиНаРусском; + НоваяСтрока.ПараметрыПрописи = ТекущиеДанные.ПараметрыПрописи; НоваяСтрока.Записать(); Если НомерСтроки = Элементы.СписокВалют.ТекущаяСтрока Или ТекущаяСсылка = Неопределено Тогда @@ -117,7 +117,7 @@ ПоказатьОповещениеПользователя( НСтр("ru = 'Валюты добавлены.'"), , - ?(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено И ЕстьКурсы, + ?(СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ЕстьКурсы, НСтр("ru = 'Курсы будут загружены автоматически через непродолжительное время.'"), ""), БиблиотекаКартинок.Информация32); Закрыть(); diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form index 8b8363b3a..e4f80d46d 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form @@ -37,6 +37,10 @@ true + + <key>ru</key> + <value>Командная панель левая</value> + КоманднаяПанельЛеваяExtendedTooltip 47 @@ -211,6 +215,10 @@ true + + <key>ru</key> + <value>Командная панель правая</value> + КоманднаяПанельПраваяExtendedTooltip 51 @@ -232,6 +240,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 46 @@ -260,6 +272,10 @@ СписокВалют 7 + + <key>ru</key> + <value>Список валют</value> + true true @@ -762,9 +778,6 @@ Style.BorderColor - None - None - None true @@ -777,10 +790,6 @@ ru Страница список валют - - ru - Страница список валют - СтраницаСписокВалютРасширеннаяПодсказка 66 @@ -878,10 +887,6 @@ ru Страница выполняется загрузка курсов - - ru - Страница выполняется загрузка курсов - СтраницаВыполняетсяЗагрузкаКурсовРасширеннаяПодсказка 68 @@ -908,10 +913,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 64 diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl index 82da9579e..f907d993a 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl @@ -220,9 +220,10 @@ УстановитьПривилегированныйРежим(Истина); - РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют); + РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют; - НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗадание.Метаданные.Синоним); + НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), + РегламентноеЗадание.Синоним); ПараметрыЗагрузки = Новый Структура; ПараметрыЗагрузки.Вставить("НачалоПериода", Объект.НачалоПериодаЗагрузки); @@ -233,8 +234,7 @@ ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеФоновогоЗадания; - Возврат ДлительныеОперации.ВыполнитьВФоне(РегламентноеЗадание.Метаданные.ИмяМетода, - ПараметрыЗагрузки, ПараметрыВыполнения); + Возврат ДлительныеОперации.ВыполнитьВФоне(РегламентноеЗадание.ИмяМетода, ПараметрыЗагрузки, ПараметрыВыполнения); КонецФункции @@ -249,7 +249,7 @@ КонецЕсли; Если Результат.Статус = "Ошибка" Тогда - ВызватьИсключение(Результат.КраткоеПредставлениеОшибки); + ВызватьИсключение Результат.КраткоеПредставлениеОшибки + Символы.ПС + НСтр("ru = 'Подробности см. в журнале регистрации.'"); КонецЕсли; ОбработатьРезультатЗагрузки(ПолучитьИзВременногоХранилища(Результат.АдресРезультата)); @@ -346,7 +346,8 @@ &НаКлиенте Процедура ПослеПодключенияИнтернетПоддержки(Результат, ДополнительныеПараметры) Экспорт Если Не (ТипЗнч(Результат) = Тип("Структура") - И ЗначениеЗаполнено(Результат.Логин)) Тогда + И ЗначениеЗаполнено(Результат.Логин) + И ЗначениеЗаполнено(Результат.Пароль)) Тогда Возврат; КонецЕсли; ПродолжитьЗагрузкуКурсовВалют(); @@ -361,9 +362,7 @@ Если Не ИспользоватьАльтернативныйСервер Тогда Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - УстановитьПривилегированныйРежим(Истина); ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); - УстановитьПривилегированныйРежим(Ложь); Возврат Не (ДанныеАутентификации <> Неопределено И ЗначениеЗаполнено(ДанныеАутентификации.Логин) И ЗначениеЗаполнено(ДанныеАутентификации.Пароль)); diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html index 1b261f612..35c10cc31 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html @@ -20,5 +20,5 @@
          Снять выбор всех валют можно с помощью кнопки .
        • Нажмите Загрузить и закрыть.

        См. также: 

        -
        • Общероссийский классификатор валют; + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl index e69de29bb..1054fa62a 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl @@ -0,0 +1,564 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Добавляет в справочник валют валюты из классификатора. +// +// Параметры: +// Коды - Массив - цифровые коды добавляемых валют. +// +// Возвращаемое значение: +// Массив, СправочникСсылка.Валюты - ссылки созданных валют. +// +Функция ДобавитьВалютыПоКоду(Знач Коды) Экспорт + Перем КлассификаторXML, КлассификаторТаблица, ЗаписьОКВ, НоваяСтрока, Результат; + КлассификаторXML = ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; + + Результат = Новый Массив(); + + Для каждого Код Из Коды Цикл + ЗаписьОКВ = КлассификаторТаблица.Найти(Код, "Code"); + Если ЗаписьОКВ = Неопределено Тогда + Продолжить; + КонецЕсли; + + ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(ЗаписьОКВ.Code); + Если ВалютаСсылка.Пустая() Тогда + НоваяСтрока = Справочники.Валюты.СоздатьЭлемент(); + НоваяСтрока.Код = ЗаписьОКВ.Code; + НоваяСтрока.Наименование = ЗаписьОКВ.CodeSymbol; + НоваяСтрока.НаименованиеПолное = ЗаписьОКВ.Name; + Если ЗаписьОКВ.RBCLoading Тогда + НоваяСтрока.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета; + Иначе + НоваяСтрока.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; + КонецЕсли; + НоваяСтрока.ПараметрыПрописи = ЗаписьОКВ.NumerationItemOptions; + НоваяСтрока.Записать(); + Результат.Добавить(НоваяСтрока.Ссылка); + Иначе + Результат.Добавить(ВалютаСсылка); + КонецЕсли + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Загружает курсы валют на текущую дату. +// +// Параметры: +// ПараметрыЗагрузки - Структура - детали загрузки: +// * НачалоПериода - Дата - начало периода загрузки; +// * КонецПериода - Дата - конец периода загрузки; +// * СписокВалют - ТаблицаЗначений - загружаемые валюты: +// ** Валюта - СправочникСсылка.Валюты; +// ** КодВалюты - Строка. +// АдресРезультата - Строка - адрес во временном хранилище для помещения результатов загрузки. +// +Процедура ЗагрузитьАктуальныйКурс(ПараметрыЗагрузки = Неопределено, АдресРезультата = Неопределено) Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют); + + ИмяСобытия = ИмяСобытияЖурналаРегистрации(); + + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начата регламентная загрузка курсов валют'")); + + ТекущаяДата = ТекущаяДатаСеанса(); + + СостояниеЗагрузки = Неопределено; + ПриЗагрузкеВозниклиОшибки = Ложь; + + Если ПараметрыЗагрузки = Неопределено Тогда + ТекстЗапроса = + "ВЫБРАТЬ + | КурсыВалют.Валюта КАК Валюта, + | КурсыВалют.Валюта.Код КАК КодВалюты, + | МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса + |ИЗ + | РегистрСведений.КурсыВалют КАК КурсыВалют + |ГДЕ + | КурсыВалют.Валюта.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета) + | И НЕ КурсыВалют.Валюта.ПометкаУдаления + | + |СГРУППИРОВАТЬ ПО + | КурсыВалют.Валюта, + | КурсыВалют.Валюта.Код"; + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + + КонецПериода = ТекущаяДата; + Пока Выборка.Следующий() Цикл + НачалоПериода = ?(Выборка.ДатаКурса = '198001010000', НачалоГода(ДобавитьМесяц(ТекущаяДата, -12)), Выборка.ДатаКурса + 60*60*24); + СписокВалют = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Выборка); + ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки); + КонецЦикла; + Иначе + Результат = ЗагрузитьКурсыВалютПоПараметрам(ПараметрыЗагрузки.СписокВалют, + ПараметрыЗагрузки.НачалоПериода, ПараметрыЗагрузки.КонецПериода, ПриЗагрузкеВозниклиОшибки); + КонецЕсли; + + Если АдресРезультата <> Неопределено Тогда + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + КонецЕсли; + + Если ПриЗагрузкеВозниклиОшибки Тогда + ЗаписьЖурналаРегистрации( + ИмяСобытия, + УровеньЖурналаРегистрации.Ошибка, + , + , + НСтр("ru = 'Во время регламентного задания загрузки курсов валют возникли ошибки'")); + ВызватьИсключение НСтр("ru = 'Загрузка курсов не выполнена.'"); + Иначе + ЗаписьЖурналаРегистрации( + ИмяСобытия, + УровеньЖурналаРегистрации.Информация, + , + , + НСтр("ru = 'Завершена регламентная загрузка курсов валют.'")); + КонецЕсли; + +КонецПроцедуры + +// Возвращает список разрешений для загрузки классификатора банков с сайта 1С. +// +// Параметры: +// Разрешения - Массив - коллекция разрешений. +// +Процедура ДобавитьРазрешения(Разрешения) Экспорт + + УстановитьПривилегированныйРежим(Истина); + ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКурсовВалют.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + + Если ИспользоватьАльтернативныйСервер Тогда + Протокол = "HTTP"; + Адрес = "cbrates.rbc.ru"; + Порт = Неопределено; + Описание = НСтр("ru = 'Загрузка курсов валют с сайта РБК.'"); + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + Иначе + Протокол = "HTTPS"; + Адрес = "bankregister.1c.ru"; + Порт = Неопределено; + Описание = НСтр("ru = 'Загрузка курсов валют с сайта 1С.'"); + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.9"; + Обработчик.Процедура = "Обработки.ЗагрузкаКурсовВалют.ОбновитьФорматХраненияПрописи"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "Обработки.ЗагрузкаКурсовВалют.ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("dc79c561-8657-4852-bbc5-38ced6996fff"); + Обработчик.Комментарий = НСтр("ru = 'Отключает ошибочно включенную загрузку курсов валюты ""Российский рубль (643)"" из интернета.'"); + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Обработки.ЗагрузкаКурсовВалют.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.Валюты"; + Обработчик.ИзменяемыеОбъекты = "Справочник.Валюты"; + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.4.1.1"; + Обработчик.Процедура = "Обработки.ЗагрузкаКурсовВалют.УстановитьРасписаниеРегламентногоЗадания"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.НачальноеЗаполнение = Истина; + КонецЕсли; + +КонецПроцедуры + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// которые необходимо обновить на новую версию. +// +// Параметры: +// Параметры - Структура - служебный параметр для передачи в процедуру ОбновлениеИнформационнойБазы.ОтметитьКОбработке. +// +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | Валюты.Ссылка + |ИЗ + | Справочник.Валюты КАК Валюты + |ГДЕ + | Валюты.Код = ""643"" + | И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)"; + + Запрос = Новый Запрос(ТекстЗапроса); + + Результат = Запрос.Выполнить().Выгрузить(); + МассивСсылок = Результат.ВыгрузитьКолонку("Ссылка"); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт + Зависимость = Зависимости.Добавить(); + Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют; + Зависимость.ДоступноВМоделиСервиса = Ложь; + Зависимость.ДоступноВАвтономномРабочемМесте = Ложь; +КонецПроцедуры + +// Устанавливает признак загрузки курсов из интернета по данным классификатора. +Процедура ПреобразованиеСвязейВалют() Экспорт + Перем Запрос, Выборка, НаборЗаписей, Запись; + Перем КлассификаторXML, КлассификаторТаблица, Валюта, НайденнаяСтрока; + + КлассификаторXML = Обработки["ЗагрузкаКурсовВалют"].ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; + КлассификаторТаблица.Индексы.Добавить("Code"); + + Выборка = Справочники.Валюты.Выбрать(); + Пока Выборка.Следующий() Цикл + Валюта = Выборка.ПолучитьОбъект(); + НайденнаяСтрока = КлассификаторТаблица.Найти(Валюта.Код, "Code"); + Если НайденнаяСтрока <> Неопределено И НайденнаяСтрока.RBCLoading = "истина" Тогда + Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура для загрузки курсов валют по определенному периоду. +// +// Параметры: +// Валюты - Любая коллекция - со следующими полями: +// КодВалюты - числовой код валюты. +// Валюта - ссылка на валюту. +// НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов. +// ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов. +// +// Возвращаемое значение: +// Массив состояния загрузки - каждый элемент - структура с полями. +// Валюта - загружаемая валюта. +// СтатусОперации - завершилась ли загрузка успешно. +// Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение). +// +Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, ПриЗагрузкеВозниклиОшибки = Ложь) + + СостояниеЗагрузки = Новый Массив; + + ПараметрыПолучения = Неопределено; + ИмяФайлаДневногоКурса = Формат(ОкончаниеПериодаЗагрузки, "ДФ=/yyyy/MM/dd"); + + УстановитьПривилегированныйРежим(Истина); + ИспользоватьАльтернативныйСервер = Константы.ИспользоватьАльтернативныйСерверДляЗагрузкиКурсовВалют.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + Если ИспользоватьАльтернативныйСервер Тогда + СерверИсточник = "http://cbrates.rbc.ru"; + Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда + ШаблонИмениФайла = СерверИсточник + "/tsv/%1" + ИмяФайлаДневногоКурса + ".tsv"; + Иначе + ШаблонИмениФайла = СерверИсточник + "/tsv/cb/%1.tsv"; + КонецЕсли; + Иначе + СерверИсточник = "https://currencyrates.1c.ru/exchangerate/v1"; + Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда + ШаблонИмениФайла = СерверИсточник + "/%1" + ИмяФайлаДневногоКурса + ".tsv"; + Иначе + ШаблонИмениФайла = СерверИсточник + "/%1.tsv"; + КонецЕсли; + + ПараметрыПолучения = ПараметрыАутентификацииНаСайте(); + КонецЕсли; + + ВалютыЗагружаемыеИзИнтернета = ВалютыЗагружаемыеИзИнтернета(); + + Для Каждого Валюта Из Валюты Цикл + Если ВалютыЗагружаемыеИзИнтернета.Найти(Валюта.Валюта) = Неопределено Тогда + ПриЗагрузкеВозниклиОшибки = Истина; + СтатусОперации = Ложь; + ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2): + |Курсы данной валюты не предоставляются.'"), + Валюта.КодВалюты, + Валюта.Валюта); + + ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ПоясняющееСообщение); + Иначе + ФайлНаВебСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, Валюта.КодВалюты); + Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере, ПараметрыПолучения); + + Если Результат.Статус Тогда + ПоясняющееСообщение = ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, Результат.Путь, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС; + УдалитьФайлы(Результат.Путь); + СтатусОперации = ПустаяСтрока(ПоясняющееСообщение); + Иначе + ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2): + |%3 + |Возможно, нет доступа к веб сайту с курсами валют, либо указана несуществующая валюта.'"), + Валюта.КодВалюты, + Валюта.Валюта, + Результат.СообщениеОбОшибке); + СтатусОперации = Ложь; + ПриЗагрузкеВозниклиОшибки = Истина; + КонецЕсли; + КонецЕсли; + СостояниеЗагрузки.Добавить(Новый Структура("Валюта,СтатусОперации,Сообщение", Валюта.Валюта, СтатусОперации, ПоясняющееСообщение)); + + КонецЦикла; + + Возврат СостояниеЗагрузки; + +КонецФункции + +// Загружает информацию о курсе валюты Валюта из файла ПутьКФайлу в регистр +// сведений курсов валют. При этом файл с курсами разбирается, и записываются +// только те данные, которые удовлетворяют периоду (НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки). +// +Функция ЗагрузитьКурсВалютыИзФайла(Знач Валюта, Знач ПутьКФайлу, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки) + + СтатусЗагрузки = 1; + + ЧислоЗагружаемыхДнейВсего = 1 + (ОкончаниеПериодаЗагрузки - НачалоПериодаЗагрузки) / ( 24 * 60 * 60); + + ЧислоЗагруженныхДней = 0; + + Если ЭтоАдресВременногоХранилища(ПутьКФайлу) Тогда + ИмяФайла = ПолучитьИмяВременногоФайла(); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПутьКФайлу); + ДвоичныеДанные.Записать(ИмяФайла); + Иначе + ИмяФайла = ПутьКФайлу; + КонецЕсли; + + Текст = Новый ТекстовыйДокумент(); + + + Текст.Прочитать(ИмяФайла, КодировкаТекста.ANSI); + + ДатаЗапрета = Неопределено; + Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл + + Стр = Текст.ПолучитьСтроку(НомерСтроки); + Если (Стр = "") ИЛИ (СтрНайти(Стр, Символы.Таб) = 0) Тогда + Продолжить; + КонецЕсли; + + ЧастиСтроки = СтрРазделить(Стр, Символы.Таб, Истина); + + Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда + ДатаКурса = ОкончаниеПериодаЗагрузки; + Кратность = Число(ЧастиСтроки[0]); + Курс = Число(ЧастиСтроки[1]); + Иначе + ДатаКурсаСтр = ЧастиСтроки[0]; + ДатаКурса = Дата(Лев(ДатаКурсаСтр,4), Сред(ДатаКурсаСтр,5,2), Сред(ДатаКурсаСтр,7,2)); + Кратность = Число(ЧастиСтроки[1]); + Курс = Число(ЧастиСтроки[2]); + КонецЕсли; + + Если ДатаКурса > ОкончаниеПериодаЗагрузки Тогда + Прервать; + КонецЕсли; + + Если ДатаКурса < НачалоПериодаЗагрузки Тогда + Продолжить; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Валюта.Установить(Валюта); + НаборЗаписей.Отбор.Период.Установить(ДатаКурса); + Запись = НаборЗаписей.Добавить(); + Запись.Валюта = Валюта; + Запись.Период = ДатаКурса; + Запись.Курс = Курс; + Запись.Кратность = Кратность; + + Записывать = Истина; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + Если МодульДатыЗапретаИзмененияСлужебный.ЗапретИзмененияПроверяется(Метаданные.РегистрыСведений.КурсыВалют) Тогда + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); + Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); + Если Не Записывать Тогда + Если ДатаЗапрета = Неопределено Тогда + ДатаЗапрета = ДатаКурса; + Иначе + ДатаЗапрета = Макс(ДатаЗапрета, ДатаКурса); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Записывать Тогда + НаборЗаписей.Записать(); + КонецЕсли; + + ЧислоЗагруженныхДней = ЧислоЗагруженныхДней + 1; + КонецЦикла; + + Если ЭтоАдресВременногоХранилища(ПутьКФайлу) Тогда + УдалитьФайлы(ИмяФайла); + УдалитьИзВременногоХранилища(ПутьКФайлу); + КонецЕсли; + + ПояснениеОЗагрузке = ""; + Если ЧислоЗагружаемыхДнейВсего <> ЧислоЗагруженныхДней Тогда + Если ЧислоЗагруженныхДней = 0 Тогда + ПояснениеОЗагрузке = НСтр("ru = 'Курсы валюты %1 (%2) не загружены. + |Нет сведение о курсе за указанный период.'"); + Иначе + ПояснениеОЗагрузке = НСтр("ru = 'Загружены не все курсы по валюте %1 (%2).'"); + КонецЕсли; + КонецЕсли; + + Если Не ПустаяСтрока(ПояснениеОЗагрузке) Тогда + ПояснениеОЗагрузке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПояснениеОЗагрузке, Валюта.Наименование, Валюта.Код); + КонецЕсли; + + Если ДатаЗапрета <> Неопределено Тогда + ПояснениеОЗагрузке = ПояснениеОЗагрузке + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка курсов валюты %1(%2) ограничена датой запрета изменений %3. + |Курсы запрещенного периода были пропущены при загрузке.'"), Валюта.Наименование, Валюта.Код, Формат(ДатаЗапрета, "ДЛФ=D")); + КонецЕсли; + + ПояснениеОЗагрузке = СокрЛП(ПояснениеОЗагрузке); + + СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); + СписокОшибок = Новый Массив; + Для Каждого СообщениеПользователю Из СообщенияПользователю Цикл + СписокОшибок.Добавить(СообщениеПользователю.Текст); + КонецЦикла; + СписокОшибок = ОбщегоНазначенияКлиентСервер.СвернутьМассив(СписокОшибок); + ПояснениеОЗагрузке = ПояснениеОЗагрузке + ?(ПустаяСтрока(ПояснениеОЗагрузке), "", Символы.ПС) + СтрСоединить(СписокОшибок, Символы.ПС); + + Возврат ПояснениеОЗагрузке; + +КонецФункции + +Процедура ОбновитьФорматХраненияПрописи() Экспорт + + ВыборкаВалют = Справочники.Валюты.Выбрать(); + + Пока ВыборкаВалют.Следующий() Цикл + Объект = ВыборкаВалют.ПолучитьОбъект(); + СтрокаПараметров = СтрЗаменить(Объект.ПараметрыПрописи, ",", Символы.ПС); + Род1 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)), 1)); + Род2 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)), 1)); + Объект.ПараметрыПрописи = + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)) + ", " + + Род1 + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)) + ", " + + Род2 + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + КонецЦикла; + +КонецПроцедуры + +// Отключает у валюты 643 загрузку из интернета. +Процедура ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета(Параметры) Экспорт + Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.Валюты"); + Пока Выборка.Следующий() Цикл + Валюта = Выборка.Ссылка.ПолучитьОбъект(); + Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Валюты"); +КонецПроцедуры + +Процедура УстановитьРасписаниеРегламентногоЗадания() Экспорт + + ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах()); + Задержка = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 21600); // С 0 до 6 часов утра. + + Расписание = Новый РасписаниеРегламентногоЗадания; + Расписание.ПериодПовтораДней = 1; + Расписание.ПериодНедель = 1; + Расписание.ВремяНачала = '00010101000000' + Задержка; + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Расписание", Расписание); + ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 600); + ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 10); + + УстановитьПараметрыРегламентногоЗадания(ПараметрыЗадания); + +КонецПроцедуры + +Процедура УстановитьПараметрыРегламентногоЗадания(ИзменяемыеПараметры) + РегламентныеЗаданияСервер.УстановитьПараметрыРегламентногоЗадания( + Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют, ИзменяемыеПараметры); +КонецПроцедуры + +Функция ПараметрыАутентификацииНаСайте() + Результат = Новый Структура; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); + Если ДанныеАутентификации <> Неопределено Тогда + Результат.Вставить("Пользователь", ДанныеАутентификации.Логин); + Результат.Вставить("Пароль", ДанныеАутентификации.Пароль); + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ВалютыЗагружаемыеИзИнтернета() + КлассификаторXML = ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; + + НайденныеСтроки = КлассификаторТаблица.НайтиСтроки(Новый Структура("RBCLoading", "истина")); + ЗагружаемыеПоКлассификатору = КлассификаторТаблица.Скопировать(НайденныеСтроки, "Code").ВыгрузитьКолонку("Code"); + + ТекстЗапроса = + "ВЫБРАТЬ + | Валюты.Ссылка КАК Ссылка + |ИЗ + | Справочник.Валюты КАК Валюты + |ГДЕ + | НЕ Валюты.ПометкаУдаления + | И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета) + | И Валюты.Код В(&ЗагружаемыеПоКлассификатору)"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ЗагружаемыеПоКлассификатору", ЗагружаемыеПоКлассификатору); + Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + Возврат Результат; +КонецФункции + +Функция ИмяСобытияЖурналаРегистрации() + Возврат НСтр("ru = 'Валюты.Загрузка курсов валют'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); +КонецФункции + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриСохраненииДанныхАутентификацииПользователяИнтернетПоддержки(ДанныеПользователя) Экспорт + УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Истина)); +КонецПроцедуры + +// См. ИнтернетПоддержкаПользователейПереопределяемый.ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки. +Процедура ПриУдаленииДанныхАутентификацииПользователяИнтернетПоддержки() Экспорт + УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", Ложь)); +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Templates/ОбщероссийскийКлассификаторВалют/Template.txt similarity index 99% rename from SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt rename to SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Templates/ОбщероссийскийКлассификаторВалют/Template.txt index 2584fa63b..59318a906 100644 --- a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Templates/ОбщероссийскийКлассификаторВалют/Template.txt @@ -45,7 +45,7 @@ - + diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo index ddebb5ce1..dc27634c0 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo @@ -261,4 +261,40 @@ PersonalComputer MobileDevice + + ПараметрыПрописиВалюты + + ru + Параметры прописи валюты + + + + ru + + + PersonalComputer + MobileDevice + + + ПодборВалютИзКлассификатора + + ru + Подбор валют из классификатора + + + + ru + + + PersonalComputer + MobileDevice + + + ОбщероссийскийКлассификаторВалют + + ru + Общероссийский классификатор валют + + TextDocument + diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl index 8b6afdaf8..3759ddaad 100644 --- a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl @@ -89,7 +89,7 @@ // Возвращаемое значение: // СтрокаИнформации - Строка - строка с информацией о правилах. // -Функция ПолучитьИнформациюОПравилах() Экспорт +Функция ИнформацияОПравилах() Экспорт // Возвращаемое значение функции. СтрокаИнформации = ""; diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form index 5d24ef6e7..4d5f8b71e 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form @@ -80,10 +80,6 @@ ru Командная панель выбора целевого элемента - - ru - Командная панель выбора целевого - КоманднаяПанельВыбораЦелевогоРасширеннаяПодсказка 67 @@ -112,10 +108,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 206 @@ -139,6 +131,10 @@ Список 182 + + <key>ru</key> + <value>Список</value> + true true @@ -244,10 +240,6 @@ ru Список элемент - - ru - Список элемент - СписокЭлементРасширеннаяПодсказка 196 @@ -424,9 +416,6 @@ Список.DefaultPicture - None - None - None true 60 @@ -807,6 +796,10 @@ true + + <key>ru</key> + <value>Все действия 2</value> + ru Все действия @@ -828,10 +821,10 @@ true - + <key>ru</key> <value>Командная панель неудачные замены</value> - </toolTip> + КоманднаяПанельНеудачныеЗаменыРасширеннаяПодсказка 126 @@ -850,6 +843,10 @@ НеудачныеЗамены 112 + + <key>ru</key> + <value>Неудачные замены</value> + true true @@ -957,6 +954,10 @@ true + + <key>ru</key> + <value>Неудачные замены группа 1</value> + НеудачныеЗаменыГруппа1РасширеннаяПодсказка 179 @@ -1205,9 +1206,6 @@ true true true - None - None - None true @@ -1403,10 +1401,6 @@ ru Возникла ошибка - - ru - Шаг возникла ошибка - ШагВозниклаОшибкаРасширеннаяПодсказка 231 @@ -1432,10 +1426,6 @@ ru Шаги мастера - - ru - Шаги мастера - ШагиМастераРасширеннаяПодсказка 71 @@ -1458,7 +1448,7 @@ ГруппаНазад 56 - Назад + ШагМастераНазад 43 true true @@ -1466,7 +1456,7 @@ true - НазадРасширеннаяПодсказка + ШагМастераНазадРасширеннаяПодсказка 44 Label true @@ -1490,12 +1480,8 @@ <key>ru</key> - <value>Группа назад</value> + <value>Назад</value> - - ru - Группа назад - ГруппаНазадРасширеннаяПодсказка 57 @@ -1515,7 +1501,7 @@ ГруппаВперед 54 - Далее + ШагМастераДалее 48 true true @@ -1523,7 +1509,7 @@ true - ДалееРасширеннаяПодсказка + ШагМастераДалееРасширеннаяПодсказка 49 Label true @@ -1541,7 +1527,7 @@ Auto - Отмена + ШагМастераОтмена 50 true true @@ -1549,7 +1535,7 @@ true - ОтменаРасширеннаяПодсказка + ШагМастераОтменаРасширеннаяПодсказка 51 Label true @@ -1599,12 +1585,8 @@ <key>ru</key> - <value>Группа вперед</value> + <value>Вперед</value> - - ru - Группа вперед - ГруппаВпередРасширеннаяПодсказка 55 @@ -1629,10 +1611,6 @@ ru Панель действий мастера - - ru - Панель действий мастера - ПанельДействийМастераРасширеннаяПодсказка 42 @@ -2067,10 +2045,10 @@ - НастройкиПошаговогоМастера + НастройкиМастера <key>ru</key> - <value>Настройки пошагового мастера</value> + <value>Настройки мастера</value> 11 @@ -2097,7 +2075,7 @@ - ШагМастераДалее + ОбработчикКнопкиМастера DontUse @@ -2119,7 +2097,7 @@ - ШагМастераНазад + ОбработчикКнопкиМастера DontUse @@ -2141,7 +2119,7 @@ - ШагМастераОтмена + ОбработчикКнопкиМастера DontUse diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl index 334afbe95..6fcde2d0b 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl @@ -5,11 +5,13 @@ // Может быть коллекцией элементов, обладающих полем "Ссылка". // +//////////////////////////////////////////////////////////////////////////////// +// ФОРМА + #Область ОбработчикиСобытийФормы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - УстановитьУсловноеОформление(); Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -20,10 +22,9 @@ // Перекладываем параметры в таблицу ЗаменяемыеСсылки. // Инициализируем реквизиты ЦелевойЭлемент, ОбщийВладелецЗаменяемыхСсылок, ТекстОшибкиПараметров. - ИнициализироватьЗаменяемыеСсылки( МассивСсылокИзСписка(Параметры.НаборСсылок) ); + ИнициализироватьЗаменяемыеСсылки(МассивСсылокИзСписка(Параметры.НаборСсылок)); Если Не ПустаяСтрока(ТекстОшибкиПараметров) Тогда - // Будет выдано предупреждение при открытии; - Возврат; + Возврат; // Будет выдано предупреждение при открытии. КонецЕсли; ЕстьПравоБезвозвратногоУдаления = ПравоДоступа("АдминистрированиеДанных", Метаданные); @@ -77,11 +78,43 @@ КонецЕсли; Элементы.ПодсказкаВыбораЦелевогоЭлемента.Заголовок = НСтр("ru = 'Элемент для замены не выбран.'"); - // Пошаговый мастер - НастройкиПошаговогоМастера = ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена); + // Инициализация шагов пошагового мастера. + ИнициализироватьНастройкиПошаговогоМастера(); + + // 1. Выбор основного элемента. + ШагВыбор = ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента); + ШагВыбор.КнопкаНазад.Видимость = Ложь; + ШагВыбор.КнопкаДалее.Заголовок = НСтр("ru = 'Заменить >'"); + ШагВыбор.КнопкаДалее.Подсказка = НСтр("ru = 'Начать замену элементов'"); + ШагВыбор.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + ШагВыбор.КнопкаОтмена.Подсказка = НСтр("ru = 'Отказаться от замены элементов'"); + + // 2. Ожидание процесса. + Шаг = ДобавитьШагМастера(Элементы.ШагЗамена); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Прервать'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Прервать замену элементов'"); + + // 3. Проблемы замены ссылок. + Шаг = ДобавитьШагМастера(Элементы.ШагПовторЗамены); + Шаг.КнопкаНазад.Заголовок = НСтр("ru = '< Назад'"); + Шаг.КнопкаНазад.Подсказка = НСтр("ru = 'Вернутся к выбору целевого элемента'"); + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Повторить замену >'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Повторить замену элементов'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Закрыть результаты замены элементов'"); + + // 4. Ошибки выполнения. + Шаг = ДобавитьШагМастера(Элементы.ШагВозниклаОшибка); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // Обновление элементов формы. + НастройкиМастера.ТекущийШаг = ШагВыбор; + ВидимостьДоступность(ЭтотОбъект); - // Добавляем шаги, зависящие от логики формы. - ИнициализироватьСценарийМастера(); КонецПроцедуры &НаКлиенте @@ -93,21 +126,15 @@ Возврат; КонецЕсли; - // По умолчанию все отключено - Элементы[НастройкиПошаговогоМастера.КнопкаДалее].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаНазад].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаОтмена].Видимость = Ложь; - - // Отложенный запуск - НастройкиПошаговогоМастера.НомерТекущегоШага = НомерШагаМастераПоИдентификатору(Элементы.ШагВыборЦелевогоЭлемента); - ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина); + // Запуск мастера. + ПриАктивацииШагаМастера(); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Если Элементы.ШагиМастера.ТекущаяСтраница <> Элементы.ШагЗамена - Или Не НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием Тогда + Или Не НастройкиМастера.ПоказатьДиалогПередЗакрытием Тогда Возврат; КонецЕсли; @@ -129,7 +156,10 @@ #КонецОбласти -#Область ОбработчикиСобытийШапкиФормы +//////////////////////////////////////////////////////////////////////////////// +// ЭЛЕМЕНТЫ + +#Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте Процедура ПодсказкаВыбораЦелевогоЭлементаОбработкаНавигационнойСсылки(Элемент, Ссылка, СтандартнаяОбработка) @@ -155,6 +185,9 @@ #КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// ТАБЛИЦА Список + #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок &НаКлиенте @@ -167,11 +200,14 @@ &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ШагМастера("Далее"); + ШагВыборЦелевогоЭлементаПриНажатииКнопкиДалее(); КонецПроцедуры #КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// ТАБЛИЦА НеудачныеЗамены + #Область ОбработчикиСобытийЭлементовТаблицыФормыНеудачныеЗамены &НаКлиенте @@ -197,21 +233,28 @@ #КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ + #Область ОбработчикиКомандФормы &НаКлиенте -Процедура ШагМастераНазад(Команда) - ШагМастера("Назад"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераДалее(Команда) - ШагМастера("Далее"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераОтмена(Команда) - ШагМастера("Отмена"); +Процедура ОбработчикКнопкиМастера(Команда) + + Если Команда.Имя = НастройкиМастера.КнопкаДалее Тогда + + ШагМастераДалее(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаНазад Тогда + + ШагМастераНазад(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаОтмена Тогда + + ШагМастераОтмена(); + + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -240,13 +283,357 @@ #КонецОбласти +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + #Область СлужебныеПроцедурыИФункции +//////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс мастера + +// Инициализирует структуры мастера. +// В реквизит формы НастройкиПошаговогоМастера записывается следующее значение: +// Структура - Описание настроек мастера. +// Общедоступные настройки мастера: +// * Шаги - Массив - Описание шагов мастера. Только для чтения. +// Для добавления шагов следует использовать функцию ДобавитьШагМастера. +// * ТекущийШаг - Структура - Текущий шаг мастера. Только для чтения. +// * ПоказатьДиалогПередЗакрытием - Булево - Если Истина, то перед закрытием формы будет показано предупреждение. +// Для изменения. +// Служебные настройки мастера: +// * ГруппаСтраниц - Строка - Имя элемента формы, переданного в параметре ГруппаСтраниц. +// * КнопкаДалее - Строка - Имя элемента формы, переданного в параметре КнопкаДалее. +// * КнопкаНазад - Строка - Имя элемента формы, переданного в параметре КнопкаНазад. +// * КнопкаОтмена - Строка - Имя элемента формы, переданного в параметре КнопкаОтмена. +// &НаСервере -Процедура УстановитьУсловноеОформление() +Процедура ИнициализироватьНастройкиПошаговогоМастера() + НастройкиМастера = Новый Структура; + НастройкиМастера.Вставить("Шаги", Новый Массив); + НастройкиМастера.Вставить("ТекущийШаг", Неопределено); + + // Идентификаторы частей интерфейса. + НастройкиМастера.Вставить("ГруппаСтраниц", Элементы.ШагиМастера.Имя); + НастройкиМастера.Вставить("КнопкаДалее", Элементы.ШагМастераДалее.Имя); + НастройкиМастера.Вставить("КнопкаНазад", Элементы.ШагМастераНазад.Имя); + НастройкиМастера.Вставить("КнопкаОтмена", Элементы.ШагМастераОтмена.Имя); + + // Для обработки длительных операций. + НастройкиМастера.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); + + // По умолчанию все отключено. + Элементы.ШагМастераДалее.Видимость = Ложь; + Элементы.ШагМастераНазад.Видимость = Ложь; + Элементы.ШагМастераОтмена.Видимость = Ложь; +КонецПроцедуры - УсловноеОформление.Элементы.Очистить(); +// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. +// +// Параметры: +// Страница - ГруппаФормы - Страница, содержащая элементы шага. +// +// Возвращаемое значение: +// Структура - Описание настроек страницы. +// * ИмяСтраницы - Строка - Имя страницы. +// * КнопкаДалее - Структура - Описание кнопки "Далее". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Далее >". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Истина. +// * КнопкаНазад - Структура - Описание кнопки "Назад". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "< Назад". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// * КнопкаОтмена - Структура - Описание кнопки "Отмена". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Отмена". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// +&НаСервере +Функция ДобавитьШагМастера(Знач Страница) + ОписаниеШага = Новый Структура("Индекс, ИмяСтраницы, КнопкаНазад, КнопкаДалее, КнопкаОтмена"); + ОписаниеШага.ИмяСтраницы = Страница.Имя; + ОписаниеШага.КнопкаНазад = КнопкаМастера(); + ОписаниеШага.КнопкаНазад.Заголовок = НСтр("ru='< Назад'"); + ОписаниеШага.КнопкаДалее = КнопкаМастера(); + ОписаниеШага.КнопкаДалее.КнопкаПоУмолчанию = Истина; + ОписаниеШага.КнопкаДалее.Заголовок = НСтр("ru = 'Далее >'"); + ОписаниеШага.КнопкаОтмена = КнопкаМастера(); + ОписаниеШага.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + + НастройкиМастера.Шаги.Добавить(ОписаниеШага); + + ОписаниеШага.Индекс = НастройкиМастера.Шаги.ВГраница(); + Возврат ОписаниеШага; +КонецФункции +// Обновляет видимость и доступность элементов формы в соответствии с текущим шагом мастера. +&НаКлиентеНаСервереБезКонтекста +Процедура ВидимостьДоступность(Форма) + + Элементы = Форма.Элементы; + НастройкиМастера = Форма.НастройкиМастера; + ТекущийШаг = НастройкиМастера.ТекущийШаг; + + // Переключение страницы. + Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ТекущийШаг.ИмяСтраницы]; + + // Обновление кнопок. + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаДалее], ТекущийШаг.КнопкаДалее); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаНазад], ТекущийШаг.КнопкаНазад); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаОтмена], ТекущийШаг.КнопкаОтмена); + +КонецПроцедуры + +// Выполняет переход мастера на указанную страницу. +// +// Параметры: +// ШагИлиИндексИлиГруппаФормы - Структура, Число, ГруппаФормы - Страницу, на которую необходимо перейти. +// +&НаКлиенте +Процедура ПерейтиНаШагМастера(Знач ШагИлиИндексИлиГруппаФормы) + + // Поиск шага. + Тип = ТипЗнч(ШагИлиИндексИлиГруппаФормы); + Если Тип = Тип("Структура") Тогда + ОписаниеШага = ШагИлиИндексИлиГруппаФормы; + ИначеЕсли Тип = Тип("Число") Тогда + ИндексШага = ШагИлиИндексИлиГруппаФормы; + Если ИндексШага < 0 Тогда + ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); + ИначеЕсли ИндексШага > НастройкиМастера.Шаги.ВГраница() Тогда + ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); + КонецЕсли; + ОписаниеШага = НастройкиМастера.Шаги[ИндексШага]; + Иначе + ШагНайден = Ложь; + ИмяИскомойСтраницы = ШагИлиИндексИлиГруппаФормы.Имя; + Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл + Если ОписаниеШага.ИмяСтраницы = ИмяИскомойСтраницы Тогда + ШагНайден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не ШагНайден Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден шаг ""%1"".'"), + ИмяИскомойСтраницы); + КонецЕсли; + КонецЕсли; + + // Переключение шага. + НастройкиМастера.ТекущийШаг = ОписаниеШага; + + // Обновление видимости. + ВидимостьДоступность(ЭтотОбъект); + ПриАктивацииШагаМастера(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// События мастера + +&НаКлиенте +Процедура ПриАктивацииШагаМастера() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагВыборЦелевогоЭлемента Тогда + + СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагЗамена Тогда + + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Истина; + ЦелевойЭлементРезультат = ЦелевойЭлемент; // Сохранение параметров запуска. + ЗапуститьФоновоеЗаданиеКлиент(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда + + // Обновление количества неудач. + Неудачные = Новый Соответствие; + Для Каждого Строка Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + Неудачные.Вставить(Строка.Ссылка, Истина); + КонецЦикла; + + КоличествоЗамен = ЗаменяемыеСсылки.Количество(); + Элементы.РезультатНеудачныеЗамены.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось заменить элементы (%1 из %2). В некоторых местах использования не может быть произведена + |автоматическая замена на ""%3""'"), + Неудачные.Количество(), + КоличествоЗамен, + ЦелевойЭлемент); + + // Формирование списка успешных замен и чистка списка заменяемых. + СписокОбновленного = Новый Массив; + СписокОбновленного.Добавить(ЦелевойЭлемент); + Для Номер = 1 По КоличествоЗамен Цикл + ОбратныйИндекс = КоличествоЗамен - Номер; + Ссылка = ЗаменяемыеСсылки[ОбратныйИндекс].Ссылка; + Если Ссылка <> ЦелевойЭлемент И Неудачные[Ссылка] = Неопределено Тогда + ЗаменяемыеСсылки.Удалить(ОбратныйИндекс); + СписокОбновленного.Добавить(Ссылка); + КонецЕсли; + КонецЦикла; + + // Оповещение о выполненных заменах. + ОповеститьОбУспешнойЗамене(СписокОбновленного); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераДалее() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагВыборЦелевогоЭлемента Тогда + + ШагВыборЦелевогоЭлементаПриНажатииКнопкиДалее(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда + + ПерейтиНаШагМастера(Элементы.ШагЗамена); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераНазад() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда + + ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс - 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераОтмена() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагЗамена Тогда + + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; + + КонецЕсли; + + Если Открыта() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры замены и объединения элементов + +&НаКлиенте +Процедура ШагВыборЦелевогоЭлементаПриНажатииКнопкиДалее() + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + ИначеЕсли ЗаменяемыеСсылки.Количество() = 1 И ТекущиеДанные.Ссылка = ЗаменяемыеСсылки.Получить(0).Ссылка Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Нельзя заменять элемент сам на себя.'")); + Возврат; + ИначеЕсли ЗначениеРеквизита(ТекущиеДанные, "ЭтоГруппа", Ложь) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Нельзя заменять элемент на группу.'")); + Возврат; + КонецЕсли; + + ТекущийВладелец = ЗначениеРеквизита(ТекущиеДанные, "Владелец"); + Если ТекущийВладелец <> ОбщийВладелецЗаменяемыхСсылок Тогда + Текст = НСтр("ru = 'Нельзя заменять на элемент, подчиненный другому владельцу. + |У выбранного элемента владелец ""%1"", а у заменяемого - ""%2"".'"); + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ТекущийВладелец, ОбщийВладелецЗаменяемыхСсылок)); + Возврат; + КонецЕсли; + + Если ЗначениеРеквизита(ТекущиеДанные, "ПометкаУдаления", Ложь) Тогда + // Попытка заменить на элемент, помеченный на удаление. + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элемент %1 помечен на удаление. Продолжить?'"), + ТекущиеДанные.Ссылка); + Описание = Новый ОписаниеОповещения("ПодтверждениеВыбораЦелевогоЭлемента", ЭтотОбъект); + ПоказатьВопрос(Описание, Текст, РежимДиалогаВопрос.ДаНет); + Иначе + // Нужна дополнительная проверка по прикладным данным. + ПроверкаДопустимостиЗаменыПрикладнойОбласти(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОповеститьОбУспешнойЗамене(Знач СписокДанных) + // Изменения объектов, в которых происходили замены. + СписокТипов = Новый Соответствие; + Для Каждого Элемент Из СписокДанных Цикл + Тип = ТипЗнч(Элемент); + Если СписокТипов[Тип] = Неопределено Тогда + ОповеститьОбИзменении(Тип); + СписокТипов.Вставить(Тип, Истина); + КонецЕсли; + КонецЦикла; + + // Общее оповещение + Если СписокТипов.Количество()>0 Тогда + Оповестить(СобытиеОповещенияОЗамене, , ЭтотОбъект); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьЦелевойЭлементИПодсказкуОтложенно() + СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПодтверждениеВыбораЦелевогоЭлемента(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + // Дополнительная проверка по прикладным данным. + ПроверкаДопустимостиЗаменыПрикладнойОбласти(); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаДопустимостиЗаменыПрикладнойОбласти() + // Проверка допустимости замен с прикладной точки зрения. + ТекстОшибки = ПроверитьВозможностьЗаменыСсылок(); + Если Не ПустаяСтрока(ТекстОшибки) Тогда + НастройкиДиалога = Новый Структура; + НастройкиДиалога.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Ложь); + НастройкиДиалога.Вставить("Картинка", БиблиотекаКартинок.Предупреждение32); + НастройкиДиалога.Вставить("КнопкаПоУмолчанию", 0); + НастройкиДиалога.Вставить("Заголовок", НСтр("ru = 'Невозможно заменить элементы'")); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(0, НСтр("ru = 'ОК'")); + + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстОшибки, Кнопки, НастройкиДиалога); + Возврат; + КонецЕсли; + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); КонецПроцедуры &НаКлиентеНаСервереБезКонтекста @@ -300,43 +687,27 @@ КонецПроцедуры -&НаКлиенте -Процедура СформироватьЦелевойЭлементИПодсказкуОтложенно() - СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Функция СообщениеОЗавершении() +&НаКлиентеНаСервереБезКонтекста +Функция ЗначениеРеквизита(Знач Данные, Знач ИмяРеквизита, Знач ЗначениеПриОтсутствии = Неопределено) + // Безопасное получение значения реквизита. + Проба = Новый Структура(ИмяРеквизита); - Количество = ЗаменяемыеСсылки.Количество(); - Если Количество = 1 Тогда - ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Элемент ""%1"" заменен на ""%2""'"), - ЗаменяемыеСсылки[0].Ссылка, - ЦелевойЭлементРезультат); - Иначе - ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Элементы (%1) заменены на ""%2""'"), - Количество, - ЦелевойЭлементРезультат); + ЗаполнитьЗначенияСвойств(Проба, Данные); + Если Проба[ИмяРеквизита] <> Неопределено Тогда + // Есть значение + Возврат Проба[ИмяРеквизита]; КонецЕсли; - Возврат ТекстРезультата; + // Возможно значение в данных равно Неопределено. + Проба[ИмяРеквизита] = Истина; + ЗаполнитьЗначенияСвойств(Проба, Данные); + Если Проба[ИмяРеквизита] <> Истина Тогда + Возврат Проба[ИмяРеквизита]; + КонецЕсли; + Возврат ЗначениеПриОтсутствии; КонецФункции -&НаКлиенте -Процедура СформироватьНадписьНеудачныеЗамены() - - Элементы.РезультатНеудачныеЗамены.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось заменить элементы (%1 из %2). В некоторых местах использования не может быть произведена - |автоматическая замена на ""%3""'"), - НеудачныеЗамены.ПолучитьЭлементы().Количество(), - ЗаменяемыеСсылки.Количество(), - ЦелевойЭлемент); - -КонецПроцедуры - &НаСервере Функция ПроверитьВозможностьЗаменыСсылок() @@ -351,31 +722,9 @@ КонецФункции -// Параметры: -// СписокДанных - Массив - содержит измененные данные, о типе которых будет оповещено. -// -&НаКлиенте -Процедура ОповеститьОбУспешнойЗамене(Знач СписокДанных) - // Изменения объектов, в которых происходили замены. - СписокТипов = Новый Соответствие; - Для Каждого Элемент Из СписокДанных Цикл - Тип = ТипЗнч(Элемент); - Если СписокТипов[Тип] = Неопределено Тогда - ОповеститьОбИзменении(Тип); - СписокТипов.Вставить(Тип, Истина); - КонецЕсли; - КонецЦикла; - - // Общее оповещение - Если СписокТипов.Количество()>0 Тогда - Оповестить(СобытиеОповещенияОЗамене, , ЭтотОбъект); - КонецЕсли; -КонецПроцедуры - -// Преобразует массив, список значений или коллекцию в массив. -// &НаСервереБезКонтекста Функция МассивСсылокИзСписка(Знач Ссылки) + // Преобразует массив, список значений или коллекцию в массив. ТипПараметра = ТипЗнч(Ссылки); Если Ссылки = Неопределено Тогда @@ -398,12 +747,11 @@ Возврат МассивСсылок; КонецФункции -// Возвращаемое значение: -// Произвольный - код справочника и т.п. если он есть по метаданным, -// Неопределено - если кода нет. -// &НаСервереБезКонтекста Функция ВозможныйКодСсылки(Знач Ссылка, КэшМетаданных) + // Возвращаемое значение: + // Произвольный - код справочника и т.п. если он есть по метаданным, + // Неопределено - если кода нет. Мета = Ссылка.Метаданные(); ЕстьКод = КэшМетаданных[Мета]; @@ -419,29 +767,6 @@ Возврат ?(ЕстьКод, Ссылка.Код, Неопределено); КонецФункции -// Безопасное получение значения реквизита. -// -&НаКлиентеНаСервереБезКонтекста -Функция ЗначениеРеквизита(Знач Данные, Знач ИмяРеквизита, Знач ЗначениеПриОтсутствии = Неопределено) - - Проба = Новый Структура(ИмяРеквизита); - - ЗаполнитьЗначенияСвойств(Проба, Данные); - Если Проба[ИмяРеквизита] <> Неопределено Тогда - // Есть значение - Возврат Проба[ИмяРеквизита]; - КонецЕсли; - - // Возможно значение в данных равно Неопределено. - Проба[ИмяРеквизита] = Истина; - ЗаполнитьЗначенияСвойств(Проба, Данные); - Если Проба[ИмяРеквизита] <> Истина Тогда - Возврат Проба[ИмяРеквизита]; - КонецЕсли; - - Возврат ЗначениеПриОтсутствии; -КонецФункции - &НаСервере Процедура ИнициализироватьЗаменяемыеСсылки(Знач МассивСсылок) @@ -551,558 +876,6 @@ КонецПроцедуры -&НаСервере -Процедура ИнициализироватьСценарийМастера() - // 0. Выбор основного элемента. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Заменить >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Начать замену элементов'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Отмена'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от замены элементов'"); - - ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента, - ДействиеШагаМастера("ПриАктивации", "ШагВыборЦелевогоЭлементаПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборЦелевогоЭлементаПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборЦелевогоЭлементаПередДействиемОтмена"))), - КнопкиМастера); - - // 1. Ожидание процесса. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Прервать замену элементов'"); - - ДобавитьШагМастера(Элементы.ШагЗамена, - ДействиеШагаМастера("ПриАктивации", "ШагЗаменаПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагЗаменаПередДействиемОтмена")), - КнопкиМастера); - - // 2. Проблемы замены ссылок. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Заголовок = НСтр("ru = '< Назад'"); - КнопкиМастера.Назад.Подсказка = НСтр("ru = 'Вернутся к выбору целевого элемента'"); - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Повторить замену >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Повторить замену элементов'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Закрыть результаты замены элементов'"); - - ДобавитьШагМастера(Элементы.ШагПовторЗамены, - ДействиеШагаМастера("ПриАктивации", "ШагПовторЗаменыПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагПовторЗаменыПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторЗаменыПередДействиемНазад", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторЗаменыПередДействиемОтмена")))), - КнопкиМастера); - - // 3. Ошибки выполнения. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагВозниклаОшибка, - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВозниклаОшибкаПередДействиемОтмена"), - КнопкиМастера); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборЦелевогоЭлементаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - - СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборЦелевогоЭлементаПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - // Проверяем на неправомерные замены. - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - - ИначеЕсли ЗаменяемыеСсылки.Количество() = 1 И ТекущиеДанные.Ссылка = ЗаменяемыеСсылки.Получить(0).Ссылка Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Нельзя заменять элемент сам на себя.'")); - Возврат; - - ИначеЕсли ЗначениеРеквизита(ТекущиеДанные, "ЭтоГруппа", Ложь) Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Нельзя заменять элемент на группу.'")); - Возврат; - КонецЕсли; - - ТекущийВладелец = ЗначениеРеквизита(ТекущиеДанные, "Владелец"); - Если ТекущийВладелец <> ОбщийВладелецЗаменяемыхСсылок Тогда - Текст = НСтр("ru = 'Нельзя заменять на элемент, подчиненный другому владельцу. - |У выбранного элемента владелец ""%1"", а у заменяемого - ""%2"".'"); - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ТекущийВладелец, ОбщийВладелецЗаменяемыхСсылок)); - Возврат; - - ИначеЕсли Не ЗначениеРеквизита(ТекущиеДанные, "ПометкаУдаления", Ложь) Тогда - // Нужна дополнительная проверка по прикладным данным. - ПроверкаДопустимостиЗаменыПрикладнойОбласти(ПараметрыШага); - Возврат; - - КонецЕсли; - - // Попытка заменить на элемент, помеченный на удаление. - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Элемент %1 помечен на удаление. Продолжить?'"), ТекущиеДанные.Ссылка); - - Описание = Новый ОписаниеОповещения("ПодтверждениеВыбораЦелевогоЭлемента", ЭтотОбъект, Новый Структура); - Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); - ПоказатьВопрос(Описание, Текст, РежимДиалогаВопрос.ДаНет); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборЦелевогоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагЗаменаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Истина; - ЦелевойЭлементРезультат = ЦелевойЭлемент; // Сохранение параметров запуска. - ЗапуститьФоновоеЗаданиеКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагЗаменаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторЗаменыПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - // Обновляем количества неудач. - СформироватьНадписьНеудачныеЗамены(); - - // Оповещаем об успешной частичной замене. - СписокОбновленного = УдалитьИзЗаменяемыхОбработанные(); // Заодно и удаляем из списка. - СписокОбновленного.Добавить(ЦелевойЭлемент); - ОповеститьОбУспешнойЗамене(СписокОбновленного); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторЗаменыПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - // Повтор замены - ПерейтиНаШагМастера(Элементы.ШагЗамена, Истина); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторЗаменыПередДействиемНазад(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента, Истина); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторЗаменыПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВозниклаОшибкаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// Возвращает список успешно замененных ссылок, тех которых нет в НеудачныеЗамены. -&НаКлиенте -Функция УдалитьИзЗаменяемыхОбработанные() - Результат = Новый Массив; - - Неудачные = Новый Соответствие; - Для Каждого Строка Из НеудачныеЗамены.ПолучитьЭлементы() Цикл - Неудачные.Вставить(Строка.Ссылка, Истина); - КонецЦикла; - - Индекс = ЗаменяемыеСсылки.Количество() - 1; - Пока Индекс > 0 Цикл - Ссылка = ЗаменяемыеСсылки[Индекс].Ссылка; - Если Ссылка<>ЦелевойЭлемент И Неудачные[Ссылка] = Неопределено Тогда - ЗаменяемыеСсылки.Удалить(Индекс); - Результат.Добавить(Ссылка); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - - Возврат Результат; -КонецФункции - -&НаКлиенте -Процедура ПодтверждениеВыбораЦелевогоЭлемента(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт - Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - // Дополнительная проверка по прикладным данным. - ПроверкаДопустимостиЗаменыПрикладнойОбласти(ДополнительныеПараметры.ПараметрыШага); -КонецПроцедуры - -&НаКлиенте -Процедура ПроверкаДопустимостиЗаменыПрикладнойОбласти(Знач ПараметрыШага) - // Проверка допустимости замен с прикладной точки зрения. - ТекстОшибки = ПроверитьВозможностьЗаменыСсылок(); - Если ПустаяСтрока(ТекстОшибки) Тогда // Все замены допустимы. - ЗавершитьШагМастера(ПараметрыШага); - Возврат; - КонецЕсли; - - НастройкиДиалога = Новый Структура; - НастройкиДиалога.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Ложь); - НастройкиДиалога.Вставить("Картинка", БиблиотекаКартинок.Предупреждение32); - НастройкиДиалога.Вставить("КнопкаПоУмолчанию", 0); - НастройкиДиалога.Вставить("Заголовок", НСтр("ru = 'Невозможно заменить элементы'")); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(0, НСтр("ru = 'ОК'")); - - СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстОшибки, Кнопки, НастройкиДиалога); -КонецПроцедуры - -&НаСервере -Функция ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена) - // Инициализирует структуры мастера. - // - // Параметры: - // ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера. - // КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее". - // КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад". - // КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена". - - Результат = Новый Структура; - - Результат.Вставить("Шаги", Новый Массив); - Результат.Вставить("НомерТекущегоШага", 0); - - // Идентификаторы частей интерфейса. - Результат.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя); - Результат.Вставить("КнопкаДалее", КнопкаДалее.Имя); - Результат.Вставить("КнопкаНазад", КнопкаНазад.Имя); - Результат.Вставить("КнопкаОтмена", КнопкаОтмена.Имя); - - // Для обработки длительных операций. - Результат.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); - - Возврат Результат; -КонецФункции - -// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. -// -// Параметры: -// -// Страница - ГруппаФормы - Группа-страница, содержащая элементы текущего шага страницы. -// -// Действия - Структура - Описание действий, возможных на текущем шаге. Поля структуры: -// -// * ПриАктивации - Строка - Необязательное имя процедуры, которая будет выполнена перед активацией -// страницы с двумя параметрами: -// <Страница> - ГруппаФормы - группа-страница, которая активизируется. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемДалее - Строка - Необязательное имя процедуры, которая будет выполнена при нажатии кнопки -// "Далее", перед переходом на следующую страницу. Процедура будет вызвана с -// двумя параметрами: -// <ПараметрыШага> - служебный реквизит. При успешном завершении цепочки -// немодальных вызовов последняя процедура-обработчик -// должна произвести вызов. -// ЗавершитьШагМастера(ПараметрыШага), подтверждая -// действие. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемНазад - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Назад". -// -// * ПередДействиемОтмена - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Отмена". -// -// Кнопки - Структура - описание кнопок на текущем шаге. Поля структуры: -// -// * Далее - Структура - Описание кнопки "Далее". поля: Заголовок, Подсказка, Доступность, Видимость, -// КнопкаПоУмолчанию. -// Пустая подсказка заменяется на заголовок. По умолчанию будут использованы значения: -// Заголовок = "Далее >", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Истина; -// -// * Назад - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "< Назад", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// * Отмена - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера", -// "ДействиеШагаМастера", "КнопкиМастера". -// -&НаСервере -Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки) - - // Умолчания - ОписаниеШага = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - ОписаниеШага.Вставить("Страница", Страница.Имя); - - // Устанавливаем действия - ЗаполнитьЗначенияСвойств(ОписаниеШага, Действия); - - // Регистрация описаний кнопок. - Для Каждого КлючИЗначение Из Кнопки Цикл - ИмяКнопки = КлючИЗначение.Ключ; - ОписаниеКнопки = КлючИЗначение.Значение; - // Заполнение вторичных свойств. - Если Не ОписаниеКнопки.Видимость Тогда - ОписаниеКнопки.Доступность = Ложь; - ОписаниеКнопки.КнопкаПоУмолчанию = Ложь; - Иначе - Если Не ЗначениеЗаполнено(ОписаниеКнопки.Подсказка) Тогда - ОписаниеКнопки.Подсказка = ОписаниеКнопки.Заголовок; - КонецЕсли; - КонецЕсли; - // Регистрация с префиксом "Кнопка". - ОписаниеШага.Вставить("Кнопка" + ИмяКнопки, ОписаниеКнопки); - КонецЦикла; - - НастройкиПошаговогоМастера.Шаги.Добавить(ОписаниеШага); -КонецПроцедуры - -// Вспомогательное формирование структуры, описывающей действие. -// -// Параметры: -// Идентификатор - Строка - Идентификатор действия, см описание метода "ДобавитьШагМастера". -// ИмяОбработчика - Строка - Имя процедуры, см описание метода "ДобавитьШагМастера". -// СлужебныеДанные - Структура - Накапливает значения. -// -// Возвращаемое значение: -// Структура - СлужебныеДанные с добавленными полями. -// -&НаСервере -Функция ДействиеШагаМастера(Знач Идентификатор, Знач ИмяОбработчика, СлужебныеДанные = Неопределено) - - Если СлужебныеДанные = Неопределено Тогда - СлужебныеДанные = Новый Структура; - КонецЕсли; - СлужебныеДанные.Вставить(Идентификатор, ИмяОбработчика);; - Возврат СлужебныеДанные; - -КонецФункции - -// Вспомогательное формирование структуры, описывающей кнопки мастера. -// -// Возвращаемое значение: -// Структура - Кнопки мастера. -// * Назад - Структура - Описание кнопки Назад, сформированное методом КнопкаМастера(). -// * Далее - Структура - Описание кнопки Далее, сформированное методом КнопкаМастера(). -// * Отмена - Структура - Описание кнопки Отмена, сформированное методом КнопкаМастера(). -// -&НаСервере -Функция КнопкиМастера() - - Результат = Новый Структура("Далее, Назад, Отмена", КнопкаМастера(), КнопкаМастера(), КнопкаМастера()); - Результат.Далее.КнопкаПоУмолчанию = Истина; - Результат.Далее.Заголовок = НСтр("ru = 'Далее >'"); - Результат.Назад.Заголовок = НСтр("ru='< Назад'"); - Результат.Отмена.Заголовок = НСтр("ru = 'Отмена'"); - Возврат Результат; - -КонецФункции - -// Описание настроек кнопки мастера. -// -// Возвращаемое значение: -// Структура - Настройки кнопки формы. -// * Заголовок - Строка - Заголовок кнопки. -// * Подсказка - Строка - Подсказка для кнопки. -// * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. -// * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. -// * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: -// Ложь. -// -// См. также: -// "КнопкаФормы" в синтакс-помощнике. -// -&НаСервере -Функция КнопкаМастера() - Результат = Новый Структура; - Результат.Вставить("Заголовок", ""); - Результат.Вставить("Подсказка", ""); - - Результат.Вставить("Доступность", Истина); - Результат.Вставить("Видимость", Истина); - Результат.Вставить("КнопкаПоУмолчанию", Ложь); - - Возврат Результат; -КонецФункции - -&НаКлиенте -Процедура ЗапуститьРаботуМастера() - // Разогрев. Проверяем наличие обработчиков действий у всех шагов. - ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - Для Каждого ОписаниеШага Из НастройкиПошаговогоМастера.Шаги Цикл - Для Каждого КлючЗначение Из ВозможныеДействия Цикл - ИмяДействия = КлючЗначение.Ключ; - ИмяОбработчика = ОписаниеШага[ИмяДействия]; - Если Не ПустаяСтрока(ИмяОбработчика) Тогда - Попытка - Тест = Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект); - Исключение - Текст = НСтр("ru = 'Ошибка создания обработчика события %1 для страницы %2, не определена процедура %3'"); - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяДействия, ОписаниеШага.Страница, ИмяОбработчика); - ВызватьИсключение Текст; - КонецПопытки; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - // Фактический запуск. - ПерейтиНаШагМастера(НастройкиПошаговогоМастера.НомерТекущегоШага, Истина); -КонецПроцедуры - -// Выполняет переключение мастера на следующую или предыдущую страницу. -// -// Параметры: -// КодКоманды - Строка - Идентификатор действия, может принимать значения "Далее", "Назад" или "Отмена". -// -&НаКлиенте -Процедура ШагМастера(Знач КодКоманды) - Если КодКоманды = "Далее" Тогда - Направление = 1; - ИначеЕсли КодКоманды = "Назад" Тогда - Направление = -1; - ИначеЕсли КодКоманды = "Отмена" Тогда - Направление = 0; - Иначе - ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'"); - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // Отрабатываем уход с текущей страницы. - Если Направление = 1 Тогда - Действие = ОписаниеШага.ПередДействиемДалее; - ИначеЕсли Направление = -1 Тогда - Действие = ОписаниеШага.ПередДействиемНазад; - Иначе - Действие = ОписаниеШага.ПередДействиемОтмена; - КонецЕсли; - - Если ПустаяСтрока(Действие) Тогда - ЗавершитьШагМастера(Направление); - Иначе - Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Направление); - КонецЕсли; -КонецПроцедуры - -// Выполняет безусловное позиционирование мастера на страницу. -// -// Параметры: -// ИдентификаторШага - Число, Строка, ГруппаФормы - Номер, группа-страница формы или ее имя для перехода. -// ИнициироватьСобытия - Булево - Флаг того, что необходимо вызывать события, связанные с активацией шага. -// -&НаКлиенте -Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь) - СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага); - Если СледующийШаг = Неопределено Тогда - Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг помощника %1'"), ИдентификаторШага); - ВызватьИсключение Ошибка; - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // И запускаем новую страницу - ШагМастераЗавершениеБезусловно(СледующийШаг, ИнициироватьСобытия); -КонецПроцедуры - -// Подтверждает действие шага мастера и вызывает переключение страницы. -// -// Параметры: -// ПараметрыШага - Служебный реквизит, полученный в обработчике перед началом действия. -// -&НаКлиенте -Процедура ЗавершитьШагМастера(Знач ПараметрыШага) - СледующийШаг = НастройкиПошаговогоМастера.НомерТекущегоШага + ПараметрыШага; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - Если ПараметрыШага = 0 Тогда - // Подтверждение отмены - ничего не делаем. - Возврат; - - ИначеЕсли ПараметрыШага = 1 И СледующийШаг > ПоследнийШаг Тогда - // Попытка сделать шаг за пределы вперед. - ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); - - ИначеЕсли ПараметрыШага = -1 И СледующийШаг < 0 Тогда - // Попытка сделать шаг за пределы назад. - ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); - - КонецЕсли; - - ШагМастераЗавершениеБезусловно(СледующийШаг); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина) - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[СледующийШаг]; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - // Переключаем на новую страницу. - Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница]; - // Обход особенности платформы. - ГруппаСтраницМастера = Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц]; - НоваяТекущаяСтраница = Элементы[ОписаниеШага.Страница]; - ВидГруппыСтраница = ВидГруппыФормы.Страница; - ТипГруппаФормы = Тип("ГруппаФормы"); - Для Каждого Страница Из ГруппаСтраницМастера.ПодчиненныеЭлементы Цикл - Если ТипЗнч(Страница) = ТипГруппаФормы И Страница.Вид = ВидГруппыСтраница Тогда - Страница.Видимость = (Страница = НоваяТекущаяСтраница); - КонецЕсли; - КонецЦикла; - - // Обновляем кнопки - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена); - - // Успешно перешли - НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг; - - Если ИнициироватьСобытия И Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - // Отрабатываем "ПриАктивации" новой страницы, он же запустит ожидание. - ПодключитьОбработчикОжидания("ОбработкаАктивацииСтраницыМастера", 0.1, Истина); - - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьСвойстваКнопкиМастера(Знач ИмяКнопки, Знач Описание) - - КнопкаМастера = Элементы[ИмяКнопки]; - ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); - КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаАктивацииСтраницыМастера() - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]); - КонецЕсли; -КонецПроцедуры - -// Может быть номер шага или группа-страница, или ее идентификатор. -&НаКлиенте -Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага) - ТипПараметра = ТипЗнч(ИдентификаторШага); - Если ТипПараметра = Тип("Число") Тогда - Возврат ИдентификаторШага; - КонецЕсли; - - ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага); - Для НомерШага = 0 По НастройкиПошаговогоМастера.Шаги.ВГраница() Цикл - Если НастройкиПошаговогоМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда - Возврат НомерШага; - КонецЕсли; - КонецЦикла; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг ""%1"".'"), ИмяПоиска); -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Работа с длительными операциями @@ -1141,28 +914,9 @@ &НаКлиенте Процедура ПослеЗавершенияФоновогоЗадания(Задание, ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Если Задание.Статус = "Выполнено" Тогда - ЕстьНеудачныеЗамены = ЗаполнитьНеудачныеЗамены(Задание.АдресРезультата); - Если ЕстьНеудачныеЗамены Тогда - // Частично успешно - вывести расшифровку. - ПерейтиНаШагМастера(Элементы.ШагПовторЗамены, Истина); - Активизировать(); - Иначе - // Полностью успешно - вывести оповещение и закрыть форму. - ПоказатьОповещениеПользователя( - , - ПолучитьНавигационнуюСсылку(ЦелевойЭлемент), - СообщениеОЗавершении(), - БиблиотекаКартинок.Информация32); - СписокОбновленного = Новый Массив; - Для Каждого Строка Из ЗаменяемыеСсылки Цикл - СписокОбновленного.Добавить(Строка.Ссылка); - КонецЦикла; - ОповеститьОбУспешнойЗамене(СписокОбновленного); - Закрыть(); - КонецЕсли - Иначе + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; + + Если Задание.Статус <> "Выполнено" Тогда // Фоновое задание завершено с ошибкой. Кратко = НСтр("ru = 'При замене элементов возникла ошибка:'") + Символы.ПС + Задание.КраткоеПредставлениеОшибки; Подробно = Кратко + Символы.ПС + Символы.ПС + Задание.ПодробноеПредставлениеОшибки; @@ -1170,7 +924,41 @@ Элементы.СсылкаПодробнее.Подсказка = Подробно; ПерейтиНаШагМастера(Элементы.ШагВозниклаОшибка); Активизировать(); + Возврат; КонецЕсли; + + ЕстьНеудачныеЗамены = ЗаполнитьНеудачныеЗамены(Задание.АдресРезультата); + Если ЕстьНеудачныеЗамены Тогда + // Частично успешно - вывести расшифровку. + ПерейтиНаШагМастера(Элементы.ШагПовторЗамены); + Активизировать(); + Иначе + // Полностью успешно - вывести оповещение и закрыть форму. + Количество = ЗаменяемыеСсылки.Количество(); + Если Количество = 1 Тогда + ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элемент ""%1"" заменен на ""%2""'"), + ЗаменяемыеСсылки[0].Ссылка, + ЦелевойЭлементРезультат); + Иначе + ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элементы (%1) заменены на ""%2""'"), + Количество, + ЦелевойЭлементРезультат); + КонецЕсли; + ПоказатьОповещениеПользователя( + , + ПолучитьНавигационнуюСсылку(ЦелевойЭлемент), + ТекстРезультата, + БиблиотекаКартинок.Информация32); + СписокОбновленного = Новый Массив; + Для Каждого Строка Из ЗаменяемыеСсылки Цикл + СписокОбновленного.Добавить(Строка.Ссылка); + КонецЦикла; + ОповеститьОбУспешнойЗамене(СписокОбновленного); + Закрыть(); + КонецЕсли + КонецПроцедуры &НаСервере @@ -1234,9 +1022,47 @@ Процедура ПослеПодтвержденияОтменыЗадания(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Прервать И Элементы.ШагиМастера.ТекущаяСтраница = Элементы.ШагЗамена Тогда - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции мастера + +&НаКлиентеНаСервереБезКонтекста +Функция КнопкаМастера() + // Описание настроек кнопки мастера. + // + // Возвращаемое значение: + // Структура - Настройки кнопки формы. + // * Заголовок - Строка - Заголовок кнопки. + // * Подсказка - Строка - Подсказка для кнопки. + // * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. + // * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. + // * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: + // Ложь. + // + // См. также: + // "КнопкаФормы" в синтакс-помощнике. + // + Результат = Новый Структура; + Результат.Вставить("Заголовок", ""); + Результат.Вставить("Подсказка", ""); + + Результат.Вставить("Доступность", Истина); + Результат.Вставить("Видимость", Истина); + Результат.Вставить("КнопкаПоУмолчанию", Ложь); + + Возврат Результат; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьСвойстваКнопкиМастера(КнопкаМастера, Описание) + + ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); + КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form index 38ea2ad55..95d88623c 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form @@ -92,10 +92,6 @@ ru Поиск мест использования - - ru - Шаг поиск мест использования - ШагПоискМестИспользованияРасширеннаяПодсказка 73 @@ -197,7 +193,7 @@ InAdditionalSubmenu - Группа1 + ГруппаДобавитьУдалить 228 Добавить @@ -256,8 +252,12 @@ true + + <key>ru</key> + <value>Добавить удалить</value> + - Группа1РасширеннаяПодсказка + ГруппаДобавитьУдалитьРасширеннаяПодсказка 229 Label true @@ -413,10 +413,6 @@ ru Все действия - - ru - Все действия - ВсеДействияРасширеннаяПодсказка 61 @@ -438,10 +434,6 @@ ru Командная панель выбора основного элемента - - ru - Командная панель выбора основного - КоманднаяПанельВыбораОсновногоРасширеннаяПодсказка 67 @@ -460,6 +452,10 @@ МестаИспользования 1 + + <key>ru</key> + <value>Места использования</value> + true true @@ -566,10 +562,10 @@ true - + <key>ru</key> <value>Места использования ссылка основной</value> - </toolTip> + МестаИспользованияСсылкаОсновнойРасширеннаяПодсказка 18 @@ -744,10 +740,6 @@ ru Места использования количество мест использования - - ru - Места использования количество мест использования - true 7 false @@ -958,6 +950,10 @@ true + + <key>ru</key> + <value>Места использования контекстное меню группа 1</value> + МестаИспользованияКонтекстноеМенюГруппа1РасширеннаяПодсказка 159 @@ -1108,6 +1104,10 @@ true + + <key>ru</key> + <value>Места использования контекстное меню группа 2</value> + МестаИспользованияКонтекстноеМенюГруппа2РасширеннаяПодсказка 223 @@ -1140,9 +1140,6 @@ true true true - None - None - None true @@ -1225,12 +1222,8 @@ <key>ru</key> - <value>Группа подсказка</value> + <value>Подсказка</value> - - ru - Группа подсказка - ГруппаПодсказкаРасширеннаяПодсказка 37 @@ -1259,10 +1252,6 @@ ru Выбор основного элемента - - ru - Шаг выбор основного элемента - ШагВыборОсновногоЭлементаРасширеннаяПодсказка 75 @@ -1651,6 +1640,10 @@ true + + <key>ru</key> + <value>Все действия 2</value> + ru Все действия @@ -1672,10 +1665,10 @@ true - + <key>ru</key> <value>Командная панель неудачные замены</value> - </toolTip> + КоманднаяПанельНеудачныеЗаменыРасширеннаяПодсказка 126 @@ -1694,6 +1687,10 @@ НеудачныеЗамены 112 + + <key>ru</key> + <value>Неудачные замены</value> + true true @@ -1801,6 +1798,10 @@ true + + <key>ru</key> + <value>Неудачные замены группа 1</value> + НеудачныеЗаменыГруппа1РасширеннаяПодсказка 179 @@ -2050,9 +2051,6 @@ true true true - None - None - None true @@ -2107,10 +2105,6 @@ ru Повтор объединения - - ru - Шаг повтор объединения - ШагПовторОбъединенияРасширеннаяПодсказка 108 @@ -2253,10 +2247,6 @@ ru Возникла ошибка - - ru - Шаг возникла ошибка - ШагВозниклаОшибкаРасширеннаяПодсказка 231 @@ -2282,10 +2272,6 @@ ru Шаги мастера - - ru - Шаги мастера - ШагиМастераРасширеннаяПодсказка 71 @@ -2308,7 +2294,7 @@ ГруппаНазад 56 - Назад + ШагМастераНазад 43 true true @@ -2316,7 +2302,7 @@ true - НазадРасширеннаяПодсказка + ШагМастераНазадРасширеннаяПодсказка 44 Label true @@ -2340,12 +2326,8 @@ <key>ru</key> - <value>Группа назад</value> + <value>Назад</value> - - ru - Группа назад - ГруппаНазадРасширеннаяПодсказка 57 @@ -2365,7 +2347,7 @@ ГруппаВперед 54 - Далее + ШагМастераДалее 48 true true @@ -2373,7 +2355,7 @@ true - ДалееРасширеннаяПодсказка + ШагМастераДалееРасширеннаяПодсказка 49 Label true @@ -2391,7 +2373,7 @@ Auto - Отмена + ШагМастераОтмена 50 true true @@ -2399,7 +2381,7 @@ true - ОтменаРасширеннаяПодсказка + ШагМастераОтменаРасширеннаяПодсказка 51 Label true @@ -2449,7 +2431,7 @@ <key>ru</key> - <value>Группа вперед</value> + <value>Вперед</value> ГруппаВпередРасширеннаяПодсказка @@ -2918,10 +2900,10 @@ - НастройкиПошаговогоМастера + НастройкиМастера <key>ru</key> - <value>Настройки пошагового мастера</value> + <value>Настройки мастера</value> 11 @@ -2996,7 +2978,7 @@ - ШагМастераДалее + ОбработчикКнопкиМастера DontUse @@ -3018,7 +3000,7 @@ - ШагМастераНазад + ОбработчикКнопкиМастера DontUse @@ -3040,7 +3022,7 @@ - ШагМастераОтмена + ОбработчикКнопкиМастера DontUse diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl index 427d0fe0b..2e602441c 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl @@ -28,10 +28,60 @@ СобытиеОповещенияОЗамене = Обработки.ЗаменаИОбъединениеЭлементов.СобытиеОповещенияОЗамене(); ТекущийВариантУдаления = "Пометка"; - НастройкиПошаговогоМастера = ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена); - // Добавляем шаги, зависящие от логики формы. - ИнициализироватьСценарийМастера(); + // Инициализация шагов пошагового мастера. + ИнициализироватьНастройкиПошаговогоМастера(); + + // 1. Поиск мест использования по параметрам. + ШагПоиск = ДобавитьШагМастера(Элементы.ШагПоискМестИспользования); + ШагПоиск.КнопкаНазад.Видимость = Ложь; + ШагПоиск.КнопкаДалее.Видимость = Ложь; + ШагПоиск.КнопкаОтмена.Заголовок = НСтр("ru = 'Прервать'"); + ШагПоиск.КнопкаОтмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'"); + + // 2. Выбор основного элемента. + Шаг = ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.КнопкаПоУмолчанию = Истина; + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Объединить >'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Начать объединение элементов'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'"); + + // 3. Ожидание процесса. + Шаг = ДобавитьШагМастера(Элементы.ШагОбъединение); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Прервать'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Прервать объединение элементов'"); + + // 4. Успешное объединение. + Шаг = ДобавитьШагМастера(Элементы.ШагУспешногоЗавершения); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.КнопкаПоУмолчанию = Истина; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'"); + + // 5. Проблемы замены ссылок. + Шаг = ДобавитьШагМастера(Элементы.ШагПовторОбъединения); + Шаг.КнопкаНазад.Заголовок = НСтр("ru = '< В начало'"); + Шаг.КнопкаНазад.Подсказка = НСтр("ru = 'Вернутся к выбору основного элемента'"); + Шаг.КнопкаДалее.КнопкаПоУмолчанию = Истина; + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Повторить'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Повторить объединение'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'"); + + // 6. Ошибки выполнения. + Шаг = ДобавитьШагМастера(Элементы.ШагВозниклаОшибка); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // Обновление элементов формы. + НастройкиМастера.ТекущийШаг = ШагПоиск; + ВидимостьДоступность(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -43,40 +93,33 @@ Возврат; КонецЕсли; - // По умолчанию все отключено - Элементы[НастройкиПошаговогоМастера.КнопкаДалее].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаНазад].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаОтмена].Видимость = Ложь; - - // Отложенный запуск - НастройкиПошаговогоМастера.НомерТекущегоШага = НомерШагаМастераПоИдентификатору(Элементы.ШагПоискМестИспользования); - ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина); + // Запуск мастера. + ПриАктивацииШагаМастера(); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) - // Поиск мест использования не является критичным шагом, для которого требуется подтверждение отмены. - Если НастройкиПошаговогоМастера.ИмяПроцедуры <> "ЗаменитьСсылки" - Или Элементы.ШагиМастера.ТекущаяСтраница <> Элементы.ШагОбъединение - Или Не НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием Тогда - Возврат; + // Замена ссылок является критичным шагом, для которого требуется подтверждение отмены. + Если НастройкиМастера.ПоказатьДиалогПередЗакрытием + И Элементы.ШагиМастера.ТекущаяСтраница = Элементы.ШагОбъединение Тогда + + Отказ = Истина; + Если ЗавершениеРаботы Тогда + Возврат; + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'Прервать объединение элементов и закрыть форму?'"); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не прерывать'")); + + Обработчик = Новый ОписаниеОповещения("ПослеПодтвержденияОтменыЗадания", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Нет); + КонецЕсли; - Отказ = Истина; - Если ЗавершениеРаботы Тогда - Возврат; - КонецЕсли; - - ТекстВопроса = НСтр("ru = 'Прервать объединение элементов и закрыть форму?'"); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'")); - Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не прерывать'")); - - Обработчик = Новый ОписаниеОповещения("ПослеПодтвержденияОтменыЗадания", ЭтотОбъект); - ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Нет); - КонецПроцедуры #КонецОбласти @@ -209,18 +252,22 @@ #Область ОбработчикиКомандФормы &НаКлиенте -Процедура ШагМастераНазад(Команда) - ШагМастера("Назад"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераДалее(Команда) - ШагМастера("Далее"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераОтмена(Команда) - ШагМастера("Отмена"); +Процедура ОбработчикКнопкиМастера(Команда) + + Если Команда.Имя = НастройкиМастера.КнопкаДалее Тогда + + ШагМастераДалее(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаНазад Тогда + + ШагМастераНазад(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаОтмена Тогда + + ШагМастераОтмена(); + + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -293,64 +340,375 @@ #Область СлужебныеПроцедурыИФункции +//////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс мастера + +// Инициализирует структуры мастера. +// В реквизит формы НастройкиПошаговогоМастера записывается следующее значение: +// Структура - Описание настроек мастера. +// Общедоступные настройки мастера: +// * Шаги - Массив - Описание шагов мастера. Только для чтения. +// Для добавления шагов следует использовать функцию ДобавитьШагМастера. +// * ТекущийШаг - Структура - Текущий шаг мастера. Только для чтения. +// * ПоказатьДиалогПередЗакрытием - Булево - Если Истина, то перед закрытием формы будет показано предупреждение. +// Для изменения. +// Служебные настройки мастера: +// * ГруппаСтраниц - Строка - Имя элемента формы, переданного в параметре ГруппаСтраниц. +// * КнопкаДалее - Строка - Имя элемента формы, переданного в параметре КнопкаДалее. +// * КнопкаНазад - Строка - Имя элемента формы, переданного в параметре КнопкаНазад. +// * КнопкаОтмена - Строка - Имя элемента формы, переданного в параметре КнопкаОтмена. +// &НаСервере -Процедура УстановитьУсловноеОформление() +Процедура ИнициализироватьНастройкиПошаговогоМастера() + НастройкиМастера = Новый Структура; + НастройкиМастера.Вставить("Шаги", Новый Массив); + НастройкиМастера.Вставить("ТекущийШаг", Неопределено); - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда - ШрифтВажнойНадписи = Новый Шрифт(, , Истина); - Иначе // Такси. - ШрифтВажнойНадписи = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь, 100); + // Идентификаторы частей интерфейса. + НастройкиМастера.Вставить("ГруппаСтраниц", Элементы.ШагиМастера.Имя); + НастройкиМастера.Вставить("КнопкаДалее", Элементы.ШагМастераДалее.Имя); + НастройкиМастера.Вставить("КнопкаНазад", Элементы.ШагМастераНазад.Имя); + НастройкиМастера.Вставить("КнопкаОтмена", Элементы.ШагМастераОтмена.Имя); + + // Для обработки длительных операций. + НастройкиМастера.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); + + // По умолчанию все отключено. + Элементы.ШагМастераДалее.Видимость = Ложь; + Элементы.ШагМастераНазад.Видимость = Ложь; + Элементы.ШагМастераОтмена.Видимость = Ложь; +КонецПроцедуры + +// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. +// +// Параметры: +// Страница - ГруппаФормы - Страница, содержащая элементы шага. +// +// Возвращаемое значение: +// Структура - Описание настроек страницы. +// * ИмяСтраницы - Строка - Имя страницы. +// * КнопкаДалее - Структура - Описание кнопки "Далее". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Далее >". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Истина. +// * КнопкаНазад - Структура - Описание кнопки "Назад". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "< Назад". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// * КнопкаОтмена - Структура - Описание кнопки "Отмена". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Отмена". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// +&НаСервере +Функция ДобавитьШагМастера(Знач Страница) + ОписаниеШага = Новый Структура("Индекс, ИмяСтраницы, КнопкаНазад, КнопкаДалее, КнопкаОтмена"); + ОписаниеШага.ИмяСтраницы = Страница.Имя; + ОписаниеШага.КнопкаНазад = КнопкаМастера(); + ОписаниеШага.КнопкаНазад.Заголовок = НСтр("ru='< Назад'"); + ОписаниеШага.КнопкаДалее = КнопкаМастера(); + ОписаниеШага.КнопкаДалее.КнопкаПоУмолчанию = Истина; + ОписаниеШага.КнопкаДалее.Заголовок = НСтр("ru = 'Далее >'"); + ОписаниеШага.КнопкаОтмена = КнопкаМастера(); + ОписаниеШага.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + + НастройкиМастера.Шаги.Добавить(ОписаниеШага); + + ОписаниеШага.Индекс = НастройкиМастера.Шаги.ВГраница(); + Возврат ОписаниеШага; +КонецФункции + +// Обновляет видимость и доступность элементов формы в соответствии с текущим шагом мастера. +&НаКлиентеНаСервереБезКонтекста +Процедура ВидимостьДоступность(Форма) + + Элементы = Форма.Элементы; + НастройкиМастера = Форма.НастройкиМастера; + ТекущийШаг = НастройкиМастера.ТекущийШаг; + + // Переключение страницы. + Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ТекущийШаг.ИмяСтраницы]; + + // Обновление кнопок. + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаДалее], ТекущийШаг.КнопкаДалее); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаНазад], ТекущийШаг.КнопкаНазад); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаОтмена], ТекущийШаг.КнопкаОтмена); + +КонецПроцедуры + +// Выполняет переход мастера на указанную страницу. +// +// Параметры: +// ШагИлиИндексИлиГруппаФормы - Структура, Число, ГруппаФормы - Страницу, на которую необходимо перейти. +// +&НаКлиенте +Процедура ПерейтиНаШагМастера(Знач ШагИлиИндексИлиГруппаФормы) + + // Поиск шага. + Тип = ТипЗнч(ШагИлиИндексИлиГруппаФормы); + Если Тип = Тип("Структура") Тогда + ОписаниеШага = ШагИлиИндексИлиГруппаФормы; + ИначеЕсли Тип = Тип("Число") Тогда + ИндексШага = ШагИлиИндексИлиГруппаФормы; + Если ИндексШага < 0 Тогда + ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); + ИначеЕсли ИндексШага > НастройкиМастера.Шаги.ВГраница() Тогда + ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); + КонецЕсли; + ОписаниеШага = НастройкиМастера.Шаги[ИндексШага]; + Иначе + ШагНайден = Ложь; + ИмяИскомойСтраницы = ШагИлиИндексИлиГруппаФормы.Имя; + Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл + Если ОписаниеШага.ИмяСтраницы = ИмяИскомойСтраницы Тогда + ШагНайден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не ШагНайден Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден шаг ""%1"".'"), + ИмяИскомойСтраницы); + КонецЕсли; КонецЕсли; - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Поле = Новый ПолеКомпоновкиДанных("ОсновнойЭлемент"); // Для стандартов (запрещается конструктор внутри конструктора). - Условие = Новый Структура("Вид, Значение", "НеРавно", Поле); - Инструкция.Отборы.Вставить("МестаИспользования.Ссылка", Условие); - Инструкция.Поля = "МестаИспользованияОсновной"; - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // Переключение шага. + НастройкиМастера.ТекущийШаг = ОписаниеШага; - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("МестаИспользования.Ссылка", Новый ПолеКомпоновкиДанных("ОсновнойЭлемент")); - Инструкция.Поля = "МестаИспользованияСсылка, МестаИспользованияКод, МестаИспользованияМестИспользования"; - Инструкция.Оформление.Вставить("Шрифт", ШрифтВажнойНадписи); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + // Обновление видимости. + ВидимостьДоступность(ЭтотОбъект); + ПриАктивацииШагаМастера(); - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "МеньшеИлиРавно", 0)); - Инструкция.Поля = "МестаИспользованияНеИспользуется"; - Инструкция.Оформление.Вставить("Видимость", Истина); - Инструкция.Оформление.Вставить("Отображать", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// События мастера + +&НаКлиенте +Процедура ПриАктивацииШагаМастера() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "Больше", 0)); - Инструкция.Поля = "МестаИспользованияНеИспользуется"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "МеньшеИлиРавно", 0)); - Инструкция.Поля = "МестаИспользованияМестИспользования"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + Если ТекущаяСтраница = Элементы.ШагПоискМестИспользования Тогда + + ЗапуститьФоновоеЗаданиеКлиент(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыборОсновногоЭлемента Тогда + + СформироватьПодсказкуОбъединения(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагОбъединение Тогда + + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Истина; + ЗапуститьФоновоеЗаданиеКлиент(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагУспешногоЗавершения Тогда + + Элементы.РезультатОбъединения.Заголовок = СообщениеОЗавершении() + " """ + Строка(ОсновнойЭлемент) + """"; + + СписокОбновленного = Новый Массив; + Для Каждого Строка Из МестаИспользования Цикл + СписокОбновленного.Добавить(Строка.Ссылка); + КонецЦикла; + ОповеститьОбУспешнойЗамене(СписокОбновленного); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторОбъединения Тогда + + // Обновляем количества неудач. + СформироватьНадписьНеудачныеЗамены(); + + // Оповещаем об успешной частичной замене. + СписокОбновленного = УдалитьИзМестИспользованияОбработанные(); // Заодно и удаляем из списка вариантов. + ОповеститьОбУспешнойЗамене(СписокОбновленного); + + КонецЕсли; - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("НеудачныеЗамены.Код", Новый Структура("Вид, Значение", "НеЗаполнено")); - Инструкция.Поля = "НеудачныеЗаменыКод"; - Инструкция.Оформление.Вставить("Видимость", Ложь); - Инструкция.Оформление.Вставить("Отображать", Ложь); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераДалее() - Инструкция = СтандартныеПодсистемыСервер.ИнструкцияУсловногоОформления(); - Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "Больше", 0)); - Инструкция.Поля = "МестаИспользованияМестИспользования"; - Инструкция.Оформление.Вставить("Видимость", Истина); - Инструкция.Оформление.Вставить("Отображать", Истина); - СтандартныеПодсистемыСервер.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция); + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + Если ТекущаяСтраница = Элементы.ШагВыборОсновногоЭлемента Тогда + + ТекстОшибки = ПроверитьВозможностьЗаменыСсылок(); + Если Не ПустаяСтрока(ТекстОшибки) Тогда + ПараметрыПредупреждения = Новый Структура("Заголовок, Текст"); + ПараметрыПредупреждения.Заголовок = НСтр("ru = 'Невозможно объединить элементы'"); + ПараметрыПредупреждения.Текст = ТекстОшибки; + СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, ПараметрыПредупреждения); + Возврат; + КонецЕсли; + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторОбъединения Тогда + + ПерейтиНаШагМастера(Элементы.ШагОбъединение); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераНазад() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПовторОбъединения Тогда + + ПерейтиНаШагМастера(Элементы.ШагПоискМестИспользования); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс - 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераОтмена() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагОбъединение Тогда + + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; + + КонецЕсли; + + Если Открыта() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры объединения элементов + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияОсновной.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.Ссылка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; + ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ОсновнойЭлемент"); + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияСсылка.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияКод.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.Ссылка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ОсновнойЭлемент"); + + Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(WindowsШрифты.ШрифтДиалоговИМеню, , , Истина, Ложь, Ложь, Ложь, )); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияНеИспользуется.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Истина); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияНеИспользуется.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НеудачныеЗаменыКод.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НеудачныеЗамены.Код"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Истина); + КонецПроцедуры &НаСервере @@ -675,551 +1033,6 @@ КонецФункции -&НаСервере -Процедура ИнициализироватьСценарийМастера() - - // 0. Поиск мест использования по параметрам. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'"); - - ДобавитьШагМастера(Элементы.ШагПоискМестИспользования, - ДействиеШагаМастера("ПриАктивации", "ШагПоискМестИспользованияПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагПоискМестИспользованияПередДействиемОтмена")), - КнопкиМастера); - - // 1. Выбор основного элемента. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.КнопкаПоУмолчанию = Истина; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Объединить >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Начать объединение элементов'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Отмена'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'"); - - ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента, - ДействиеШагаМастера("ПриАктивации", "ШагВыборОсновногоЭлементаПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборОсновногоЭлементаПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборОсновногоЭлементаПередДействиемОтмена"))), - КнопкиМастера); - - // 2. Ожидание процесса. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Прервать объединение элементов'"); - - ДобавитьШагМастера(Элементы.ШагОбъединение, - ДействиеШагаМастера("ПриАктивации", "ШагОбъединениеПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагОбъединениеПередДействиемОтмена")), - КнопкиМастера); - - // 3. Успешное объединение. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.КнопкаПоУмолчанию = Истина; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'"); - - ДобавитьШагМастера(Элементы.ШагУспешногоЗавершения, - ДействиеШагаМастера("ПриАктивации", "ШагУспешногоЗавершенияПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагУспешногоЗавершенияПередДействиемОтмена")), - КнопкиМастера); - - // 4. Проблемы замены ссылок. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Заголовок = НСтр("ru = '< В начало'"); - КнопкиМастера.Назад.Подсказка = НСтр("ru = 'Вернутся к выбору основного элемента'"); - КнопкиМастера.Далее.КнопкаПоУмолчанию = Истина; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Повторить'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Повторить объединение'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Отмена'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'"); - - ДобавитьШагМастера(Элементы.ШагПовторОбъединения, - ДействиеШагаМастера("ПриАктивации", "ШагПовторОбъединенияПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагПовторОбъединенияПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторОбъединенияПередДействиемНазад", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторОбъединенияПередДействиемОтмена")))), - КнопкиМастера); - - // 5. Ошибки выполнения. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагВозниклаОшибка, - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВозниклаОшибкаПередДействиемОтмена"), - КнопкиМастера); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагПоискМестИспользованияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования"; - ЗапуститьФоновоеЗаданиеКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПоискМестИспользованияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - - СформироватьПодсказкуОбъединения(); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - // Проверка допустимости объединения с прикладной точки зрения. - ТекстОшибки = ПроверитьВозможностьЗаменыСсылок(); - Если ПустаяСтрока(ТекстОшибки) Тогда // Все объединения допустимы. - ЗавершитьШагМастера(ПараметрыШага); - Возврат; - КонецЕсли; - - НастройкиДиалога = Новый Структура; - НастройкиДиалога.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Ложь); - НастройкиДиалога.Вставить("Картинка", БиблиотекаКартинок.Предупреждение32); - НастройкиДиалога.Вставить("КнопкаПоУмолчанию", 0); - НастройкиДиалога.Вставить("Заголовок", НСтр("ru = 'Невозможно объединить элементы'")); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(0, НСтр("ru = 'ОК'")); - - СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстОшибки, Кнопки, НастройкиДиалога); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагОбъединениеПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки"; - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Истина; - ЗапуститьФоновоеЗаданиеКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагОбъединениеПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагУспешногоЗавершенияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - - Элементы.РезультатОбъединения.Заголовок = СообщениеОЗавершении() + " """ + Строка(ОсновнойЭлемент) + """"; - - СписокОбновленного = Новый Массив; - Для Каждого Строка Из МестаИспользования Цикл - СписокОбновленного.Добавить(Строка.Ссылка); - КонецЦикла; - ОповеститьОбУспешнойЗамене(СписокОбновленного); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагУспешногоЗавершенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - ЗавершитьШагМастера(ПараметрыШага); - Если Открыта() Тогда - Закрыть(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторОбъединенияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт - // Обновляем количества неудач. - СформироватьНадписьНеудачныеЗамены(); - - // Оповещаем об успешной частичной замене. - СписокОбновленного = УдалитьИзМестИспользованияОбработанные(); // Заодно и удаляем из списка вариантов. - ОповеститьОбУспешнойЗамене(СписокОбновленного); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторОбъединенияПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - ПерейтиНаШагМастера(Элементы.ШагОбъединение, Истина); // Повтор замены -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторОбъединенияПередДействиемНазад(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - ПерейтиНаШагМастера(Элементы.ШагПоискМестИспользования, Истина); // Перезаполняем список обрабатываемых. -КонецПроцедуры - -&НаКлиенте -Процедура ШагПовторОбъединенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВозниклаОшибкаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ПРОЦЕДУРЫ И ФУНКЦИИ ПОШАГОВОГО ПОМОЩНИКА - -&НаСервере -Функция ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена) - // Инициализирует структуры мастера. - // - // Параметры: - // ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера. - // КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее". - // КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад". - // КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена". - - Результат = Новый Структура; - - Результат.Вставить("Шаги", Новый Массив); - Результат.Вставить("НомерТекущегоШага", 0); - - // Идентификаторы частей интерфейса. - Результат.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя); - Результат.Вставить("КнопкаДалее", КнопкаДалее.Имя); - Результат.Вставить("КнопкаНазад", КнопкаНазад.Имя); - Результат.Вставить("КнопкаОтмена", КнопкаОтмена.Имя); - - // Для обработки длительных операций. - Результат.Вставить("ИмяПроцедуры"); - Результат.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); - - Возврат Результат; -КонецФункции - -// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. -// -// Параметры: -// -// Страница - ГруппаФормы - Группа-страница, содержащая элементы текущего шага страницы. -// -// Действия - Структура - Описание действий, возможных на текущем шаге. Поля структуры: -// -// * ПриАктивации - Строка - Необязательное имя процедуры, которая будет выполнена перед активацией -// страницы с двумя параметрами: -// <Страница> - ГруппаФормы - группа-страница, которая активизируется. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемДалее - Строка - Необязательное имя процедуры, которая будет выполнена при нажатии кнопки -// "Далее", перед переходом на следующую страницу. Процедура будет вызвана с -// двумя параметрами: -// <ПараметрыШага> - служебный реквизит. При успешном завершении цепочки -// немодальных вызовов последняя процедура-обработчик -// должна произвести вызов. -// ЗавершитьШагМастера(ПараметрыШага), подтверждая -// действие. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемНазад - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Назад". -// -// * ПередДействиемОтмена - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Отмена". -// -// Кнопки - Структура - описание кнопок на текущем шаге. Поля структуры: -// -// * Далее - Структура - Описание кнопки "Далее". поля: Заголовок, Подсказка, Доступность, Видимость, -// КнопкаПоУмолчанию. -// Пустая подсказка заменяется на заголовок. По умолчанию будут использованы значения: -// Заголовок = "Далее >", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Истина; -// -// * Назад - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "< Назад", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// * Отмена - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера", -// "ДействиеШагаМастера", "КнопкиМастера". -// -&НаСервере -Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки) - - // Умолчания - ОписаниеШага = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - - ПоляКнопки = "Доступность, Видимость, КнопкаПоУмолчанию, Подсказка"; - - ОписаниеШага.Вставить("КнопкаДалее", Новый Структура(ПоляКнопки, Истина, Истина, Истина)); - ОписаниеШага.КнопкаДалее.Вставить("Заголовок", НСтр("ru='Далее >'")); - - ОписаниеШага.Вставить("КнопкаНазад", Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); - ОписаниеШага.КнопкаНазад.Вставить("Заголовок", НСтр("ru='< Назад'")); - - ОписаниеШага.Вставить("КнопкаОтмена",Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); - ОписаниеШага.КнопкаОтмена.Вставить("Заголовок", НСтр("ru='Отмена'")); - - ОписаниеШага.Вставить("Страница", Страница.Имя); - - // Устанавливаем действия - ЗаполнитьЗначенияСвойств(ОписаниеШага, Действия); - - Если Кнопки.Свойство("Далее") Тогда - ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаДалее, Кнопки.Далее); - КонецЕсли; - Если Кнопки.Свойство("Назад") Тогда - ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаНазад, Кнопки.Назад); - КонецЕсли; - Если Кнопки.Свойство("Отмена") Тогда - ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаОтмена, Кнопки.Отмена); - КонецЕсли; - - НастройкиПошаговогоМастера.Шаги.Добавить(ОписаниеШага); -КонецПроцедуры - -// Вспомогательное формирование структуры, описывающей действие. -// -// Параметры: -// Идентификатор - Строка - Идентификатор действия, см описание метода "ДобавитьШагМастера". -// ИмяОбработчика - Строка - Имя процедуры, см описание метода "ДобавитьШагМастера". -// СлужебныеДанные - Структура - Накапливает значения. -// -// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями. -&НаСервере -Функция ДействиеШагаМастера(Знач Идентификатор, Знач ИмяОбработчика, СлужебныеДанные = Неопределено) - Если СлужебныеДанные = Неопределено Тогда - СлужебныеДанные = Новый Структура; - КонецЕсли; - СлужебныеДанные.Вставить(Идентификатор, ИмяОбработчика);; - Возврат СлужебныеДанные; -КонецФункции - -// Вспомогательное формирование структуры, описывающей кнопки мастера. -// -// Возвращаемое значение: -// Структура - Кнопки мастера. -// * Назад - Структура - Описание кнопки Назад, сформированное методом КнопкаМастера(). -// * Далее - Структура - Описание кнопки Далее, сформированное методом КнопкаМастера(). -// * Отмена - Структура - Описание кнопки Отмена, сформированное методом КнопкаМастера(). -// -&НаСервере -Функция КнопкиМастера() - - Результат = Новый Структура("Далее, Назад, Отмена", КнопкаМастера(), КнопкаМастера(), КнопкаМастера()); - Результат.Далее.КнопкаПоУмолчанию = Истина; - Результат.Далее.Заголовок = НСтр("ru = 'Далее >'"); - Результат.Назад.Заголовок = НСтр("ru='< Назад'"); - Результат.Отмена.Заголовок = НСтр("ru = 'Отмена'"); - Возврат Результат; - -КонецФункции - -// Описание настроек кнопки мастера. -// -// Возвращаемое значение: -// Структура - Настройки кнопки формы. -// * Заголовок - Строка - Заголовок кнопки. -// * Подсказка - Строка - Подсказка для кнопки. -// * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. -// * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. -// * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: -// Ложь. -// -// См. также: -// "КнопкаФормы" в синтакс-помощнике. -// -&НаСервере -Функция КнопкаМастера() - Результат = Новый Структура; - Результат.Вставить("Заголовок", ""); - Результат.Вставить("Подсказка", ""); - - Результат.Вставить("Доступность", Истина); - Результат.Вставить("Видимость", Истина); - Результат.Вставить("КнопкаПоУмолчанию", Ложь); - - Возврат Результат; -КонецФункции - -&НаКлиенте -Процедура ЗапуститьРаботуМастера() - // Разогрев. Проверяем наличие обработчиков действий у всех шагов. - ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - Для Каждого ОписаниеШага Из НастройкиПошаговогоМастера.Шаги Цикл - Для Каждого КлючЗначение Из ВозможныеДействия Цикл - ИмяДействия = КлючЗначение.Ключ; - ИмяОбработчика = ОписаниеШага[ИмяДействия]; - Если Не ПустаяСтрока(ИмяОбработчика) Тогда - Попытка - Тест = Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект); - Исключение - Текст = НСтр("ru = 'Ошибка создания обработчика события %1 для страницы %2, не определена процедура %3'"); - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяДействия, ОписаниеШага.Страница, ИмяОбработчика); - ВызватьИсключение Текст; - КонецПопытки; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - // Фактический запуск. - ПерейтиНаШагМастера(НастройкиПошаговогоМастера.НомерТекущегоШага, Истина); -КонецПроцедуры - -// Выполняет переключение мастера на следующую или предыдущую страницу. -// -// Параметры: -// КодКоманды - Строка - Идентификатор действия, может принимать значения "Далее", "Назад" или "Отмена". -// -&НаКлиенте -Процедура ШагМастера(Знач КодКоманды) - Если КодКоманды = "Далее" Тогда - Направление = 1; - ИначеЕсли КодКоманды = "Назад" Тогда - Направление = -1; - ИначеЕсли КодКоманды = "Отмена" Тогда - Направление = 0; - Иначе - ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'"); - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // Отрабатываем уход с текущей страницы. - Если Направление = 1 Тогда - Действие = ОписаниеШага.ПередДействиемДалее; - - ИначеЕсли Направление = -1 Тогда - Действие = ОписаниеШага.ПередДействиемНазад; - - Иначе - Действие = ОписаниеШага.ПередДействиемОтмена; - - КонецЕсли; - - Если ПустаяСтрока(Действие) Тогда - ЗавершитьШагМастера(Направление); - Иначе - Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Направление); - КонецЕсли; -КонецПроцедуры - -// Выполняет безусловное позиционирование мастера на страницу. -// -// Параметры: -// ИдентификаторШага - Число, Строка, ГруппаФормы - Номер, группа-страница формы или ее имя для перехода. -// ИнициироватьСобытия - Булево - Флаг того, что необходимо вызывать события, связанные с активацией шага. -// -&НаКлиенте -Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь) - СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага); - Если СледующийШаг = Неопределено Тогда - Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг помощника %1'"), ИдентификаторШага); - ВызватьИсключение Ошибка; - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // И запускаем новую страницу - ШагМастераЗавершениеБезусловно(СледующийШаг, ИнициироватьСобытия); -КонецПроцедуры - -// Подтверждает действие шага мастера и вызывает переключение страницы. -// -// Параметры: -// ПараметрыШага - Служебный реквизит, полученный в обработчике перед началом действия. -// -&НаКлиенте -Процедура ЗавершитьШагМастера(Знач ПараметрыШага) - СледующийШаг = НастройкиПошаговогоМастера.НомерТекущегоШага + ПараметрыШага; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - Если ПараметрыШага = 0 Тогда - // Подтверждение отмены - ничего не делаем. - Возврат; - - ИначеЕсли ПараметрыШага = 1 И СледующийШаг > ПоследнийШаг Тогда - // Попытка сделать шаг за пределы вперед. - ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); - - ИначеЕсли ПараметрыШага = -1 И СледующийШаг < 0 Тогда - // Попытка сделать шаг за пределы назад. - ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); - - КонецЕсли; - - ШагМастераЗавершениеБезусловно(СледующийШаг); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина) - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[СледующийШаг]; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - // Переключаем на новую страницу. - Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница]; - // Обход особенности платформы. - ГруппаСтраницМастера = Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц]; - НоваяТекущаяСтраница = Элементы[ОписаниеШага.Страница]; - ВидГруппыСтраница = ВидГруппыФормы.Страница; - ТипГруппаФормы = Тип("ГруппаФормы"); - Для Каждого Страница Из ГруппаСтраницМастера.ПодчиненныеЭлементы Цикл - Если ТипЗнч(Страница) = ТипГруппаФормы И Страница.Вид = ВидГруппыСтраница Тогда - Страница.Видимость = (Страница = НоваяТекущаяСтраница); - КонецЕсли; - КонецЦикла; - - // Обновляем кнопки - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена); - - // Успешно перешли - НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг; - - Если ИнициироватьСобытия И Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - // Отрабатываем "ПриАктивации" новой страницы, он же запустит ожидание. - ПодключитьОбработчикОжидания("ОбработкаАктивацииСтраницыМастера", 0.1, Истина); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьСвойстваКнопкиМастера(Знач ИмяКнопки, Знач Описание) - - КнопкаМастера = Элементы[ИмяКнопки]; - ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); - КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаАктивацииСтраницыМастера() - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]); - КонецЕсли; -КонецПроцедуры - -// Может быть номер шага или группа-страница, или ее идентификатор. -&НаКлиенте -Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага) - ТипПараметра = ТипЗнч(ИдентификаторШага); - Если ТипПараметра = Тип("Число") Тогда - Возврат ИдентификаторШага; - КонецЕсли; - - ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага); - Для НомерШага=0 По НастройкиПошаговогоМастера.Шаги.ВГраница() Цикл - Если НастройкиПошаговогоМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда - Возврат НомерШага; - КонецЕсли; - КонецЦикла; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг ""%1"".'"), ИмяПоиска); -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Работа с длительными операциями @@ -1237,18 +1050,19 @@ &НаСервере Функция ЗапуститьФоновоеЗадание() - // Определение параметров запуска. - ИмяМетода = "ПоискИУдалениеДублей." + НастройкиПошаговогоМастера.ИмяПроцедуры; - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПоискМестИспользования Тогда + ИмяМетода = "ПоискИУдалениеДублей.ОпределитьМестаИспользования"; НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Определение мест использования'"); ПараметрыМетода = МассивСсылокИзНабора(МестаИспользования); - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" Тогда + ИначеЕсли ТекущаяСтраница = Элементы.ШагОбъединение Тогда + ИмяМетода = "ПоискИУдалениеДублей.ЗаменитьСсылки"; НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Объединение элементов'"); - ПараметрыМетода = Новый Структура("ПарыЗамен, Параметры"); ПараметрыМетода.ПарыЗамен = Новый Соответствие; Для Каждого Строка Из МестаИспользования Цикл @@ -1265,49 +1079,57 @@ КонецЕсли; НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Поиск и удаление дублей: Замена ссылок'"); + НастройкиЗапуска.НаименованиеФоновогоЗадания = НаименованиеМетода; Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяМетода, ПараметрыМетода, НастройкиЗапуска); КонецФункции &НаКлиенте Процедура ПослеЗавершенияФоновогоЗадания(Задание, ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Если Задание.Статус = "Выполнено" Тогда - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда - ЗаполнитьМестаИспользования(Задание.АдресРезультата); - Активизировать(); - ШагМастера("Далее"); - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" Тогда - ЕстьНеудачныеЗамены = ЗаполнитьНеудачныеЗамены(Задание.АдресРезультата); - Если ЕстьНеудачныеЗамены Тогда - // Частично успешно - вывести расшифровку. - ПерейтиНаШагМастера(Элементы.ШагПовторОбъединения, Истина); - Активизировать(); - Иначе - // Полностью успешно - вывести оповещение и закрыть форму. - ПоказатьОповещениеПользователя( - СообщениеОЗавершении(), - ПолучитьНавигационнуюСсылку(ОсновнойЭлемент), - Строка(ОсновнойЭлемент), - БиблиотекаКартинок.Информация32); - СписокОбновленного = Новый Массив; - Для Каждого Строка Из МестаИспользования Цикл - СписокОбновленного.Добавить(Строка.Ссылка); - КонецЦикла; - ОповеститьОбУспешнойЗамене(СписокОбновленного); - Закрыть(); - КонецЕсли - КонецЕсли; - Иначе - // Фоновое задание завершено с ошибкой. + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; + + Если Задание.Статус <> "Выполнено" Тогда Кратко = НСтр("ru = 'При замене элементов возникла ошибка:'") + Символы.ПС + Задание.КраткоеПредставлениеОшибки; Подробно = Кратко + Символы.ПС + Символы.ПС + Задание.ПодробноеПредставлениеОшибки; Элементы.НадписьТекстОшибки.Заголовок = Кратко; Элементы.СсылкаПодробнее.Подсказка = Подробно; ПерейтиНаШагМастера(Элементы.ШагВозниклаОшибка); Активизировать(); + Возврат; КонецЕсли; + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПоискМестИспользования Тогда + + ЗаполнитьМестаИспользования(Задание.АдресРезультата); + Активизировать(); + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагОбъединение Тогда + + ЕстьНеудачныеЗамены = ЗаполнитьНеудачныеЗамены(Задание.АдресРезультата); + Если ЕстьНеудачныеЗамены Тогда + // Частично успешно - вывести расшифровку. + ПерейтиНаШагМастера(Элементы.ШагПовторОбъединения); + Активизировать(); + Иначе + // Полностью успешно - вывести оповещение и закрыть форму. + ПоказатьОповещениеПользователя( + СообщениеОЗавершении(), + ПолучитьНавигационнуюСсылку(ОсновнойЭлемент), + Строка(ОсновнойЭлемент), + БиблиотекаКартинок.Информация32); + СписокОбновленного = Новый Массив; + Для Каждого Строка Из МестаИспользования Цикл + СписокОбновленного.Добавить(Строка.Ссылка); + КонецЦикла; + ОповеститьОбУспешнойЗамене(СписокОбновленного); + Закрыть(); + КонецЕсли + + КонецЕсли; + КонецПроцедуры &НаСервере @@ -1421,11 +1243,48 @@ &НаКлиенте Процедура ПослеПодтвержденияОтменыЗадания(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = КодВозвратаДиалога.Прервать - И Элементы.ШагиМастера.ТекущаяСтраница = Элементы.ШагОбъединение Тогда - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; + Если Ответ = КодВозвратаДиалога.Прервать Тогда + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции мастера + +&НаКлиентеНаСервереБезКонтекста +Функция КнопкаМастера() + // Описание настроек кнопки мастера. + // + // Возвращаемое значение: + // Структура - Настройки кнопки формы. + // * Заголовок - Строка - Заголовок кнопки. + // * Подсказка - Строка - Подсказка для кнопки. + // * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. + // * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. + // * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: + // Ложь. + // + // См. также: + // "КнопкаФормы" в синтакс-помощнике. + // + Результат = Новый Структура; + Результат.Вставить("Заголовок", ""); + Результат.Вставить("Подсказка", ""); + + Результат.Вставить("Доступность", Истина); + Результат.Вставить("Видимость", Истина); + Результат.Вставить("КнопкаПоУмолчанию", Ложь); + + Возврат Результат; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьСвойстваКнопкиМастера(КнопкаМастера, Описание) + + ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); + КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; + +КонецПроцедуры + #КонецОбласти \ 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..66a368c71 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаполнениеГрафиковРаботы/ManagerModule.bsl @@ -0,0 +1,49 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "1.0.0.2"; + Обработчик.Процедура = "Обработки.ЗаполнениеГрафиковРаботы.СоздатьКалендарьПятидневкаРоссийскойФедерации"; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + +// Создает график работы на основе производственного календаря Российской Федерации по шаблону "Пятидневка". +// +Процедура СоздатьКалендарьПятидневкаРоссийскойФедерации() Экспорт + + ПроизводственныйКалендарь = КалендарныеГрафики.ОсновнойПроизводственныйКалендарь(); + Если ПроизводственныйКалендарь = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не Справочники.Календари.НайтиПоРеквизиту("ПроизводственныйКалендарь", ПроизводственныйКалендарь).Пустая() Тогда + Возврат; + КонецЕсли; + + НовыйГрафикРаботы = Справочники.Календари.СоздатьЭлемент(); + НовыйГрафикРаботы.Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроизводственныйКалендарь, "Наименование"); + НовыйГрафикРаботы.ПроизводственныйКалендарь = ПроизводственныйКалендарь; + НовыйГрафикРаботы.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; + НовыйГрафикРаботы.ДатаНачала = НачалоГода(ТекущаяДатаСеанса()); + НовыйГрафикРаботы.УчитыватьПраздники = Истина; + + // Заполняем недельный цикл как пятидневку. + Для НомерДня = 1 По 7 Цикл + НовыйГрафикРаботы.ШаблонЗаполнения.Добавить().ДеньВключенВГрафик = НомерДня <= 5; + КонецЦикла; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыйГрафикРаботы, Истина, Истина); + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаполнениеГрафиковРаботы/ЗаполнениеГрафиковРаботы.mdo b/SSL/src/DataProcessors/ЗаполнениеГрафиковРаботы/ЗаполнениеГрафиковРаботы.mdo new file mode 100644 index 000000000..f427d3f00 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаполнениеГрафиковРаботы/ЗаполнениеГрафиковРаботы.mdo @@ -0,0 +1,13 @@ + + + + + + + ЗаполнениеГрафиковРаботы + + ru + Заполнение графиков работы + + true + diff --git a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl new file mode 100644 index 000000000..1c01a38ed --- /dev/null +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl @@ -0,0 +1,81 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Возвращает основной производственный календарь, используемый в учете. +// +// Возвращаемое значение: +// СправочникСсылка.ПроизводственныеКалендари, Неопределено - основной производственный календарь или +// Неопределено, в случае если он не обнаружен. +// +Функция ОсновнойПроизводственныйКалендарь() Экспорт + + // Производственный календарь, составленный в соответствии с ст. 112 ТК РФ. + ПроизводственныйКалендарь = Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ"); + Если ПроизводственныйКалендарь.Пустая() Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ПроизводственныйКалендарь; + +КонецФункции + +// Заполняет даты праздничных дней по производственному календарю для конкретного календарного года. +// +// Параметры: +// КодПроизводственногоКалендаря - Строка - код производственного календаря. +// НомерГода - Число - номер года, для которого требуется заполнить праздничные дни. +// ПраздничныеДни - ТаблицаЗначений - заполняет переданную таблицу с колонками: +// * Дата - Дата - календарная дата праздничного дня. +// * ПереноситьВыходной - Булево - Истина, если нужен перенос праздничного дня, если он приходится на выходной. +// +Процедура ЗаполнитьПраздничныеДни(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) Экспорт + + Если КодПроизводственногоКалендаря = "РФ" Тогда + + // 1, 2, 3, 4, 5, 6 и 8 января - Новогодние каникулы. + ДобавитьПраздничныйДень(ПраздничныеДни, "01.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "02.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "03.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "04.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "05.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "06.01", НомерГода, Ложь); + ДобавитьПраздничныйДень(ПраздничныеДни, "08.01", НомерГода, Ложь); + + // 7 января - Рождество Христово. + ДобавитьПраздничныйДень(ПраздничныеДни, "07.01", НомерГода, Ложь); + + // 23 февраля - День защитника Отечества. + ДобавитьПраздничныйДень(ПраздничныеДни, "23.02", НомерГода); + + // 8 марта - Международный женский день. + ДобавитьПраздничныйДень(ПраздничныеДни, "08.03", НомерГода); + + // 1 мая - Праздник Весны и Труда. + ДобавитьПраздничныйДень(ПраздничныеДни, "01.05", НомерГода); + + // 9 мая - День Победы + ДобавитьПраздничныйДень(ПраздничныеДни, "09.05", НомерГода); + + // 12 июня - День России + ДобавитьПраздничныйДень(ПраздничныеДни, "12.06", НомерГода); + + // 4 ноября - День народного единства. + ДобавитьПраздничныйДень(ПраздничныеДни, "04.11", НомерГода); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПраздничныйДень(ПраздничныеДни, ПраздничныйДень, НомерГода, ПереноситьВыходной = Истина) + + ДеньМесяц = СтрРазделить(ПраздничныйДень, "."); + + НоваяСтрока = ПраздничныеДни.Добавить(); + НоваяСтрока.Дата = Дата(НомерГода, ДеньМесяц[1], ДеньМесяц[0]); + НоваяСтрока.ПереноситьВыходной = ПереноситьВыходной; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ДанныеПроизводственногоКалендаря/Templates/ДанныеПроизводственныхКалендарей/Template.txt b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt similarity index 94% rename from SSL/src/InformationRegisters/ДанныеПроизводственногоКалендаря/Templates/ДанныеПроизводственныхКалендарей/Template.txt rename to SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt index 999ce99b9..f4a3f6f2e 100644 --- a/SSL/src/InformationRegisters/ДанныеПроизводственногоКалендаря/Templates/ДанныеПроизводственныхКалендарей/Template.txt +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt @@ -6208,369 +6208,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Templates/ОписаниеКалендарей/Template.txt b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ПроизводственныеКалендари/Template.txt similarity index 100% rename from SSL/src/Catalogs/ПроизводственныеКалендари/Templates/ОписаниеКалендарей/Template.txt rename to SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ПроизводственныеКалендари/Template.txt diff --git a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ЗаполнениеКалендарныхГрафиков.mdo b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ЗаполнениеКалендарныхГрафиков.mdo new file mode 100644 index 000000000..5f14f3983 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ЗаполнениеКалендарныхГрафиков.mdo @@ -0,0 +1,29 @@ + + + + + + + ЗаполнениеКалендарныхГрафиков + + ru + Заполнение календарных графиков + + true + + ПроизводственныеКалендари + + ru + Производственные календари + + TextDocument + + + ДанныеПроизводственныхКалендарей + + ru + Данные производственных календарей + + TextDocument + + diff --git a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form index cc809360c..64c1615b0 100644 --- a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form @@ -60,6 +60,7 @@ ru ЧГ=0 + true true 1 @@ -154,12 +155,8 @@ <key>ru</key> - <value>Группа отбора</value> + <value>Отбора</value> - - ru - Группа отбора - ГруппаОтбораExtendedTooltip 140 @@ -328,10 +325,6 @@ ru Команды отбора - - ru - Команды отбора - КомандыОтбораExtendedTooltip 144 @@ -492,10 +485,6 @@ ru Команда обновить - - ru - Команда обновить - КомандаОбновитьExtendedTooltip 152 @@ -572,10 +561,6 @@ ru Команды поиска - - ru - Команды поиска - КомандыПоискаExtendedTooltip 154 @@ -623,10 +608,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 143 @@ -820,6 +801,10 @@ true + + <key>ru</key> + <value>Событие</value> + ГруппаСобытиеExtendedTooltip 166 @@ -1030,6 +1015,10 @@ true + + <key>ru</key> + <value>Приложение</value> + ГруппаПриложениеExtendedTooltip 172 @@ -1051,6 +1040,10 @@ true + + <key>ru</key> + <value>Пользователь компьютер приложение</value> + ГруппаПользовательКомпьютерПриложениеExtendedTooltip 169 @@ -1208,12 +1201,8 @@ <key>ru</key> - <value>Группа сервер</value> + <value>Сервер</value> - - ru - Группа сервер - ГруппаСерверExtendedTooltip 175 @@ -1328,6 +1317,10 @@ true + + <key>ru</key> + <value>Транзакция</value> + ГруппаТранзакцияExtendedTooltip 179 @@ -1478,6 +1471,10 @@ true + + <key>ru</key> + <value>Данные</value> + ГруппаДанныеExtendedTooltip 182 @@ -1703,10 +1700,6 @@ ru Отбор группа контекст - - ru - Отбор группа контекст - ОтборГруппаКонтекстExtendedTooltip 160 @@ -1783,9 +1776,6 @@ Style.BorderColor - None - None - None true @@ -1798,10 +1788,6 @@ ru Журнал регистрации - - ru - Журнал регистрации - ЖурналРегистрацииExtendedTooltip 159 @@ -1880,10 +1866,6 @@ ru Индикатор длительных операций - - ru - Индикатор длительных операций - ИндикаторДлительныхОперацийExtendedTooltip 187 @@ -1910,10 +1892,6 @@ ru Страницы - - ru - Страницы - СтраницыExtendedTooltip 158 @@ -1938,10 +1916,6 @@ ru Журнал - - ru - Журнал - ГруппаЖурналExtendedTooltip 139 @@ -1971,10 +1945,6 @@ ru Просмотр зарегистрированных событий - - ru - Просмотр зарегистрированных событий - ГруппаПросмотрЗарегистрированныхСобытийExtendedTooltip 138 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form similarity index 93% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form index c25cc5e66..92d9a7710 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Form.form @@ -995,25 +995,144 @@ ГруппаОрганизация 128 - - Организация - 50 + + ГруппаОрганизацияИВид + 718 + + Организация + 50 + true + true + + true + + + Организация + + None + + OnChange + ОрганизацияПриИзменении + + + ОрганизацияРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ОрганизацияКонтекстноеМеню + 51 + true + + InputField + true + Enter + true + Left + true + + + Clearing + ОрганизацияОчистка + + 35 + true + true + false + true + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + ЭтоИндивидуальныйПредприниматель1 + 715 + + <key>ru</key> + <value>Вид</value> + + true + true + + true + + + ЭтоИндивидуальныйПредприниматель + + + OnChange + ЭтоИндивидуальныйПредпринимательПриИзменении + + + ЭтоИндивидуальныйПредприниматель1РасширеннаяПодсказка + 717 + Label + true + true + + Left + + + + ЭтоИндивидуальныйПредприниматель1КонтекстноеМеню + 716 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + Юридическое лицо + + + + + + ru + Индивидуальный предприниматель + + + true + + + Normal + + true true true - - Организация - - None - - OnChange - ОрганизацияПриИзменении - + + <key>ru</key> + <value>Организация и вид</value> + - ОрганизацияРасширеннаяПодсказка - 52 + ГруппаОрганизацияИВидРасширеннаяПодсказка + 719 Label true true @@ -1021,40 +1140,83 @@ Left - - ОрганизацияКонтекстноеМеню - 51 - true - - InputField - true - Enter - true - Left - true - - - Clearing - ОрганизацияОчистка - - 35 - true - true - false - true - true - true - true - true - - Style.ФонУправляющегоПоля - - Normal + UsualGroup + + Auto + true + true + Auto + Auto ВертикальнаяГруппа 253 + + ЭтоИндивидуальныйПредприниматель2 + 712 + + <key>ru</key> + <value>Вид</value> + + true + + true + + + ЭтоИндивидуальныйПредприниматель + + + OnChange + ЭтоИндивидуальныйПредпринимательПриИзменении + + + ЭтоИндивидуальныйПредприниматель2РасширеннаяПодсказка + 714 + Label + true + true + + Left + + + + ЭтоИндивидуальныйПредприниматель2КонтекстноеМеню + 713 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + Юридическое лицо + + + + + + ru + Индивидуальный предприниматель + + + true + + + Normal + + ГруппаОсновныеСведенияОрганизации 53 @@ -1544,7 +1706,7 @@ <key>ru</key> - <value>Группа номеров</value> + <value>Номеров</value> ГруппаНомеровРасширеннаяПодсказка @@ -1703,7 +1865,7 @@ <key>ru</key> - <value>Группа юридический адрес</value> + <value>Юридический адрес</value> ГруппаЮридическийАдресРасширеннаяПодсказка @@ -1830,7 +1992,7 @@ <key>ru</key> - <value>Группа фактический адрес</value> + <value>Фактический адрес</value> ГруппаФактическийАдресРасширеннаяПодсказка @@ -2155,7 +2317,7 @@ <key>ru</key> - <value>Группа владелец должность</value> + <value>Владелец должность</value> ГруппаВладелецДолжностьРасширеннаяПодсказка @@ -2236,7 +2398,7 @@ <key>ru</key> - <value>Группа владелец должность подразделение</value> + <value>Владелец должность подразделение</value> ГруппаВладелецДолжностьПодразделениеРасширеннаяПодсказка @@ -2555,7 +2717,7 @@ <key>ru</key> - <value>Группа дата рождения пол</value> + <value>Дата рождения пол</value> ГруппаДатаРожденияПолРасширеннаяПодсказка @@ -2668,6 +2830,9 @@ true true true + false + true + ShowInInputField false true true @@ -2731,7 +2896,7 @@ <key>ru</key> - <value>Группа гражданство СНИЛС</value> + <value>Гражданство СНИЛС</value> ГруппаГражданствоСНИЛСРасширеннаяПодсказка @@ -2893,7 +3058,7 @@ ГруппаКемВыданКодПодразделения - 714 + 704 ДокументКемВыдан 118 @@ -2943,7 +3108,7 @@ ДокументКодПодразделения - 711 + 709 true true @@ -2959,7 +3124,7 @@ ДокументКодПодразделенияРасширеннаяПодсказка - 713 + 711 Label true true @@ -2969,7 +3134,7 @@ ДокументКодПодразделенияКонтекстноеМеню - 712 + 710 true InputField @@ -2999,11 +3164,11 @@ <key>ru</key> - <value>Группа кем выдан код подразделения</value> + <value>Кем выдан код подразделения</value> ГруппаКемВыданКодПодразделенияРасширеннаяПодсказка - 715 + 705 Label true true @@ -3027,7 +3192,7 @@ <key>ru</key> - <value>Группа вид документа</value> + <value>Вид документа</value> 20 true @@ -3155,7 +3320,7 @@ <key>ru</key> - <value>Группа серия номер дата выдачи</value> + <value>Серия номер дата выдачи</value> ГруппаСерияНомерДатаВыдачиРасширеннаяПодсказка @@ -3561,9 +3726,6 @@ true true true - None - None - None true @@ -3662,7 +3824,7 @@ ChoiceProcessing ПрограммаОбработкаВыбора - 19 + 15 true true false @@ -3808,39 +3970,6 @@ ОтправкаЗаявления 168 - - ДекорацияЗаявлениеПодготовлено1 - 323 - - <key>ru</key> - <value>Заявление подготовлено.</value> - - true - true - - true - - - ДекорацияЗаявлениеПодготовлено1РасширеннаяПодсказка - 325 - Label - true - true - - Left - - - - ДекорацияЗаявлениеПодготовлено1КонтекстноеМеню - 324 - true - - Label - true - - Left - - ВертикальнаяГруппа4 356 @@ -4695,196 +4824,30 @@ - ГруппаВертикальныйОтступ - 542 + ГруппаПартнер + 328 - ГруппаПартнер - 328 - - ГоризонтальнаяГруппа2 - 333 - - ДокументыПартнер - 512 - true - true - - true - - - ДокументыПартнер - - None - - OnChange - ДокументыПартнерПриИзменении - - - ДокументыПартнерРасширеннаяПодсказка - 514 - Label - true - true - - Left - - - - ДокументыПартнерКонтекстноеМеню - 513 - true - - InputField - Enter - true - Left - true - - - StartChoice - ДокументыПартнерНачалоВыбора - - - Opening - ДокументыПартнерОткрытие - - - Clearing - ДокументыПартнерОчистка - - - ChoiceProcessing - ДокументыПартнерОбработкаВыбора - - true - true - true - true - true - true - true - true - Normal - - ru - Введите наименование партнера - - - - - ДокументыПартнерИНН - 335 - true - true - - true - - - ДокументыПартнерИНН - - - OnChange - РеквизитПриИзменении - - - ДокументыПартнерИННРасширеннаяПодсказка - 337 - Label - true - true - - Left - - - - ДокументыПартнерИННКонтекстноеМеню - 336 - true - - InputField - Enter - true - Left - true - - 14 - true - true - false - true - true - true - true - Normal - - ru - Введите ИНН партнера - - - - - ДокументыПартнерКПП - 338 - true - true - - true - - - ДокументыПартнерКПП - - - OnChange - РеквизитПриИзменении - - - ДокументыПартнерКППРасширеннаяПодсказка - 340 - Label - true - true - - Left - - - - ДокументыПартнерКППКонтекстноеМеню - 339 - true - - InputField - Enter - true - Left - true - - 14 - true - true - false - true - true - true - true - Normal - - ru - Введите КПП партнера - - - + ГруппаПартнерИВид + 333 + + ДокументыПартнер + 512 true true true - - <key>ru</key> - <value>Горизонтальная группа 2</value> - + + ДокументыПартнер + + None + + OnChange + ДокументыПартнерПриИзменении + - ГоризонтальнаяГруппа2РасширеннаяПодсказка - 334 + ДокументыПартнерРасширеннаяПодсказка + 514 Label true true @@ -4892,13 +4855,112 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + ДокументыПартнерКонтекстноеМеню + 513 + true + + InputField + Enter + true + Left + true + + + StartChoice + ДокументыПартнерНачалоВыбора + + + Opening + ДокументыПартнерОткрытие + + + Clearing + ДокументыПартнерОчистка + + + ChoiceProcessing + ДокументыПартнерОбработкаВыбора + + true + true + true + true + true + true + true + true + Normal + + ru + Введите наименование партнера + + + + + ДокументыПартнерЭтоИП + 720 + + <key>ru</key> + <value>Вид</value> + + true + true + + true + + + ДокументыПартнерЭтоИП + + + OnChange + ДокументыПартнерЭтоИППриИзменении + + + ДокументыПартнерЭтоИПРасширеннаяПодсказка + 722 + Label + true + true + + Left + + + + ДокументыПартнерЭтоИПКонтекстноеМеню + 721 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + Юридическое лицо + + + + + + ru + Индивидуальный предприниматель + + + true + + + Normal true @@ -4908,11 +4970,144 @@ <key>ru</key> - <value>Укажите вашу обслуживающую организацию (партнера фирмы 1С), которая будет обрабатывать заявление:</value> + <value>Партнер и вид</value> - ГруппаПартнерРасширеннаяПодсказка - 329 + ГруппаПартнерИВидРасширеннаяПодсказка + 334 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПартнерИНН + 723 + + ДокументыПартнерИНН + 335 + true + true + + true + + + ДокументыПартнерИНН + + + OnChange + РеквизитПриИзменении + + + ДокументыПартнерИННРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + + ДокументыПартнерИННКонтекстноеМеню + 336 + true + + InputField + Enter + true + Left + true + + 14 + true + true + false + true + true + true + true + Normal + + ru + Введите ИНН партнера + + + + + ДокументыПартнерКПП + 338 + true + true + + true + + + ДокументыПартнерКПП + + + OnChange + РеквизитПриИзменении + + + ДокументыПартнерКППРасширеннаяПодсказка + 340 + Label + true + true + + Left + + + + ДокументыПартнерКППКонтекстноеМеню + 339 + true + + InputField + Enter + true + Left + true + + 14 + true + true + false + true + true + true + true + Normal + + ru + Введите КПП партнера + + + + true + true + + true + + + <key>ru</key> + <value>Партнер ИНН</value> + + + ГруппаПартнерИННРасширеннаяПодсказка + 724 Label true true @@ -4922,11 +5117,9 @@ UsualGroup - Vertical Auto true true - auto Auto Auto @@ -4938,11 +5131,11 @@ <key>ru</key> - <value>Группа вертикальный отступ</value> + <value>Укажите вашу обслуживающую организацию (партнера фирмы 1С), которая будет обрабатывать заявление:</value> - ГруппаВертикальныйОтступРасширеннаяПодсказка - 543 + ГруппаПартнерРасширеннаяПодсказка + 329 Label true true @@ -4956,7 +5149,8 @@ Auto true true - Auto + auto + DontUse Auto @@ -5222,12 +5416,8 @@ <key>ru</key> - <value>Группа состояние последней проверки</value> + <value>Состояние последней проверки</value> - - ru - Группа состояние последней проверки - ГруппаСостояниеПоследнейПроверкиРасширеннаяПодсказка 379 @@ -5593,7 +5783,7 @@ <key>ru</key> - <value>Группа результат установки сертификата</value> + <value>Результат установки сертификата</value> ГруппаРезультатУстановкиСертификатаРасширеннаяПодсказка @@ -6265,9 +6455,6 @@ true true true - None - None - None true @@ -6369,7 +6556,7 @@ <key>ru</key> - <value>Группа служба поддержки</value> + <value>Служба поддержки</value> ГруппаСлужбаПоддержкиРасширеннаяПодсказка @@ -8423,21 +8610,6 @@ true - - ВариантАлгоритмов - - <key>ru</key> - <value>Вариант алгоритмов</value> - - 89 - - - true - - - true - - Далее diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help/ru.html b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help/ru.html rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Help/ru.html diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа1/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа1/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа1/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа1/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа2/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа2/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа2/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа2/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа3/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа3/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа3/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа3/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа4/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа4/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа4/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа4/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа5/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа5/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа5/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа5/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа6/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа6/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа6/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа6/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа7/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа7/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа7/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа7/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа8/Picture.png b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа8/Picture.png similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа8/Picture.png rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Items/ДекорацияЭтапа8/Picture.png diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl similarity index 90% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl index 9bdf0efc6..b07c188ef 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Module.bsl @@ -1,7 +1,7 @@ #Область ОписаниеПеременных &НаКлиенте -Перем Криптография, РаботаСДвоичнымиДанными; +Перем Криптография, РаботаСДвоичнымиДанными, РеквизитыПроверкиАдреса; #КонецОбласти @@ -19,6 +19,8 @@ ЕстьОрганизации = Не Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(Тип("Строка")); Если Не ЕстьОрганизации Тогда Элементы.Организация.Видимость = Ложь; + Элементы.ЭтоИндивидуальныйПредприниматель1.Видимость = Ложь; + Элементы.ЭтоИндивидуальныйПредприниматель2.Видимость = Истина; КонецЕсли; ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(); @@ -39,17 +41,16 @@ КонецЕсли; КонецЕсли; + ЗаполнитьСписокПрограмм(); + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - Если ЗначениеЗаполнено(Объект.Ссылка) - И ( Объект.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено") - Или Объект.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Подготовлено")) Тогда - - ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина); - КонецЕсли; + РеквизитыПроверкиАдреса = Новый Структура; + РеквизитыПроверкиАдреса.Вставить("ЮридическийАдрес", Ложь); + РеквизитыПроверкиАдреса.Вставить("ФактическийАдрес", Ложь); КонецПроцедуры @@ -57,9 +58,8 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) // При изменении состава или настроек программ. - Если ЗначениеЗаполнено(ВариантАлгоритмов) - И ( ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования") - Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")) Тогда + Если ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования") + Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux") Тогда ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина); КонецЕсли; @@ -155,6 +155,17 @@ КонецПроцедуры +&НаКлиенте +Процедура ЭтоИндивидуальныйПредпринимательПриИзменении(Элемент) + + Если ЭтоИндивидуальныйПредприниматель Тогда + ОчиститьРеквизитыОрганизацииВидаЮридическоеЛицо(); + КонецЕсли; + + ПриИзмененииОрганизацииНаСервере(Истина); + +КонецПроцедуры + &НаКлиенте Процедура ОрганизацияОчистка(Элемент, СтандартнаяОбработка) @@ -371,7 +382,7 @@ Объект.Программа = ВыбранноеЗначение; - ПослеВыбораПрограммы(Истина); + ПодключитьОбработчикОжидания("ПослеВыборкаПрограммыОбработчикОжидания", 0.1, Истина); КонецПроцедуры @@ -460,7 +471,7 @@ ЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); - ПриИзмененииРуководителяНаСервере(); + ПодключитьОбработчикОжидания("ПриИзмененииРуководителяОбработчикОжидания", 0.1, Истина); КонецПроцедуры @@ -539,7 +550,15 @@ ЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); - ПриИзмененииПартнераНаСервере(); + ПодключитьОбработчикОжидания("ПриИзмененииПартнераОбработчикОжидания", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ДокументыПартнерЭтоИППриИзменении(Элемент) + + ОчиститьРеквизитыПартнераВидаЮридическоеЛицо(); + ПриИзмененииПартнераНаСервере(Истина); КонецПроцедуры @@ -666,10 +685,6 @@ СтандартнаяОбработка = Ложь; ДанныеВыбора = Новый СписокЗначений; - Если СписокПрограмм.Количество() = 0 Тогда - ЗаполнитьСписокПрограмм(); - КонецЕсли; - Для каждого Строка Из СписокПрограмм Цикл Значение = ?(ЗначениеЗаполнено(Строка.Ссылка), Строка.Ссылка, Строка.Идентификатор); ДанныеВыбора.Добавить(Значение, Строка.Представление); @@ -752,12 +767,19 @@ &НаКлиенте Процедура ПерейтиНаСтраницуПодготовкаЗапросаНаСертификат() + ЗаполнитьПрограмму(Новый ОписаниеОповещения( + "ПерейтиНаСтраницуПодготовкаЗапросаНаСертификатЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +// Продолжение процедуры ПерейтиНаСтраницуПодготовкаЗапросаНаСертификат. +&НаКлиенте +Процедура ПерейтиНаСтраницуПодготовкаЗапросаНаСертификатЗавершение(Результат, Контекст) Экспорт + Если ПерейтиНаСтраницуПодготовкаЗапросаНаСертификатНаСервере() Тогда ПослеЗаписи(); КонецЕсли; - ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина); - КонецПроцедуры &НаСервере @@ -789,14 +811,14 @@ ЗаполнитьРеквизитыЗаявления(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); ДополнительныеПараметры = Новый Структура("НаименованиеВключаетСокращение", Истина); ФактическийАдресСтруктура = - МодульУправлениеКонтактнойИнформацией.СведенияОбАдресе(ФактическийАдресXML, ДополнительныеПараметры); + МодульРаботаСАдресами.СведенияОбАдресе(ФактическийАдресXML, ДополнительныеПараметры); ЮридическийАдресСтруктура = - МодульУправлениеКонтактнойИнформацией.СведенияОбАдресе(ЮридическийАдресXML, ДополнительныеПараметры); + МодульРаботаСАдресами.СведенияОбАдресе(ЮридическийАдресXML, ДополнительныеПараметры); КонецЕсли; Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПодготовкаЗапросаНаСертификат; @@ -814,6 +836,15 @@ Возврат; КонецЕсли; + Элементы.ФормаДалее.Доступность = Ложь; + + ПодключитьОбработчикОжидания("ПерейтиНаСтраницуОтправкаЗаявленияПродолжение", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиНаСтраницуОтправкаЗаявленияПродолжение() + ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения( "ПерейтиНаСтраницуОтправкаЗаявленияПослеСозданияМенеджераКриптографии", ЭтотОбъект), "", Неопределено); @@ -828,6 +859,7 @@ Объект.Программа = Неопределено; ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Создание ключа электронной подписи'"), "", Результат, Новый Структура); + Элементы.ФормаДалее.Доступность = Истина; Возврат; КонецЕсли; @@ -843,6 +875,7 @@ Процедура ПерейтиНаСтраницуОтправкаЗаявленияПослеСозданияКлючаИЗапросаНаСертификат(Результат, Контекст) Экспорт Если Результат <> Истина Тогда + Элементы.ФормаДалее.Доступность = Истина; Возврат; КонецЕсли; @@ -870,6 +903,7 @@ ПриИзмененииРуководителяНаСервере(Загрузка); ПриИзмененииПартнераНаСервере(Загрузка); + Элементы.ФормаДалее.Доступность = Истина; Элементы.ФормаНазад.Видимость = Ложь; Элементы.ФормаЗакрыть.Заголовок = НСтр("ru = 'Закрыть'"); Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаОтправкаЗаявления; @@ -882,13 +916,7 @@ ОбновитьДоступностьРеквизитовПартнера(); - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда - МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - УстановитьПривилегированныйРежим(Истина); - ИнтернетПоддержкаПользователейПодключена = - МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки() <> Неопределено; - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; + ИнтернетПоддержкаПользователейПодключена = ИнтернетПоддержкаПользователейПодключена(); КонецПроцедуры @@ -952,7 +980,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияПродолжение(Ответ, Неопределен) Экспорт +Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияПродолжение(Ответ, Контекст) Экспорт Если Ответ <> "Отправить" Тогда Возврат; @@ -978,7 +1006,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияЗавершение(Результат, Неопределен) Экспорт +Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияЗавершение(Результат, Контекст) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Тогда ИнтернетПоддержкаПользователейПодключена = Ложь; @@ -1004,7 +1032,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияПослеПредупреждения(Неопределен) Экспорт +Процедура ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияПослеПредупреждения(Контекст) Экспорт ПерейтиНаСтраницуОжиданиеОбработкиЗаявленияПродолжение("Отправить", Неопределено); @@ -1072,7 +1100,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПерейтиНаСтраницуУстановкаСертификатаПослеУстановки(Установлен, Неопределен) Экспорт +Процедура ПерейтиНаСтраницуУстановкаСертификатаПослеУстановки(Установлен, Контекст) Экспорт ОбновитьДатаУстановкиСертификатаВЗаголовке(ЭтотОбъект); @@ -1165,7 +1193,7 @@ КонецПроцедуры &НаКлиенте -Процедура ЗакрытьПомощникПослеУстановкиСертификатаЗавершение(Установлен, Неопределен) Экспорт +Процедура ЗакрытьПомощникПослеУстановкиСертификатаЗавершение(Установлен, Контекст) Экспорт ОбновитьДатаУстановкиСертификатаВЗаголовке(ЭтотОбъект); @@ -1230,12 +1258,19 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьРеквизитыОрганизацииВидаЮридическоеЛицо() + + ОчиститьРеквизит("КПП"); + +КонецПроцедуры + &НаСервере Процедура ПриИзмененииОрганизацииНаСервере(Загрузка = Ложь) Если Не Загрузка Тогда Реквизиты = Новый Структура; - Реквизиты.Вставить("ЭтоИндивидуальныйПредприниматель", Ложь); + Реквизиты.Вставить("ЭтоИндивидуальныйПредприниматель", ЭтоИндивидуальныйПредприниматель); Реквизиты.Вставить("НаименованиеСокращенное"); Реквизиты.Вставить("НаименованиеПолное"); Реквизиты.Вставить("ИНН"); @@ -1397,6 +1432,18 @@ КонецФункции +&НаКлиенте +Процедура ПроверитьАдресОбработчикОжидания() + + Для Каждого КлючИЗначение Из РеквизитыПроверкиАдреса Цикл + Если КлючИЗначение.Значение Тогда + ПроверитьАдрес(КлючИЗначение.Ключ); + РеквизитыПроверкиАдреса[КлючИЗначение.Ключ] = Ложь; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + &НаСервере Процедура ПроверитьАдрес(ИмяРеквизита) @@ -1404,11 +1451,11 @@ Возврат; КонецЕсли; - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); Сообщение = ""; Попытка - ПодробныйИтог = МодульУправлениеКонтактнойИнформацией.ПроверитьАдрес(ЭтотОбъект[ИмяРеквизита + "XML"]); + ПодробныйИтог = МодульРаботаСАдресами.ПроверитьАдрес(ЭтотОбъект[ИмяРеквизита + "XML"]); Если ПодробныйИтог.Результат <> "Корректный" Тогда Для каждого ЭлементСписка Из ПодробныйИтог.СписокОшибок Цикл @@ -1508,11 +1555,11 @@ Возврат Ложь; КонецЕсли; - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); ТекстСообщения = ""; ДополнительныеПараметры = Новый Структура("НаименованиеВключаетСокращение", Истина); - АдресСтруктура = МодульУправлениеКонтактнойИнформацией.СведенияОбАдресе(АдресXML, ДополнительныеПараметры); + АдресСтруктура = МодульРаботаСАдресами.СведенияОбАдресе(АдресXML, ДополнительныеПараметры); // Проверка, что адрес российский. Если Не АдресСтруктура.Свойство("КодРегиона") Тогда @@ -1561,11 +1608,11 @@ КонецЕсли; Возврат ПредставлениеЧастиАдреса(АдресСтруктура, СписокПолей + - "Округ, - |Район, - |Город, - |ВнутригородскойРайон, - |НаселенныйПункт"); + "Округ, ОкругСокращение, + |Район, РайонСокращение, + |Город, ГородСокращение, + |ВнутригородскойРайон, ВнутригородскойРайонСокращение, + |НаселенныйПункт, НаселенныйПунктСокращение"); КонецФункции @@ -1598,10 +1645,10 @@ Возврат Ложь; КонецЕсли; - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); ТекстСообщения = ""; - ТелефонСтруктура = МодульУправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML(ТелефонXML); + ТелефонСтруктура = МодульРаботаСАдресами.ПредыдущаяСтруктураКонтактнойИнформацииXML(ТелефонXML); // Проверка, что телефон российский. Если СтрЗаменить(ТелефонСтруктура.КодСтраны, "+", "") <> "7" Тогда @@ -1963,6 +2010,13 @@ КонецФункции +&НаКлиенте +Процедура ПриИзмененииРуководителяОбработчикОжидания() + + ПриИзмененииРуководителяНаСервере(); + +КонецПроцедуры + &НаСервере Процедура ПриИзмененииРуководителяНаСервере(Загрузка = Ложь) @@ -2028,12 +2082,19 @@ КонецФункции +&НаКлиенте +Процедура ПриИзмененииПартнераОбработчикОжидания() + + ПриИзмененииПартнераНаСервере(); + +КонецПроцедуры + &НаСервере Процедура ПриИзмененииПартнераНаСервере(Загрузка = Ложь) Реквизиты = Новый Структура; Реквизиты.Вставить("Представление"); - Реквизиты.Вставить("ЭтоИндивидуальныйПредприниматель", Ложь); + Реквизиты.Вставить("ЭтоИндивидуальныйПредприниматель", ДокументыПартнерЭтоИП); Реквизиты.Вставить("ИНН"); Реквизиты.Вставить("КПП"); @@ -2055,28 +2116,29 @@ ЗаполнитьТипыЗначения(ДокументыПартнерТип, Элементы.ДокументыПартнер, Реквизиты.ТипПартнера); Элементы.ДокументыПартнер.КнопкаВыбора = ДокументыПартнерТип <> Неопределено; - Если Загрузка Тогда - Элементы.ДокументыПартнер.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыПартнерСсылка); - Возврат; + Если Не Загрузка Тогда + ДокументыПартнерСсылка = ?(ДокументыПартнерТип <> Неопределено, Реквизиты.Партнер, Неопределено); + + ДокументыПартнер = СокрЛП(?(Реквизиты.Представление <> Неопределено, Реквизиты.Представление, Реквизиты.Партнер)); + + ДокументыПартнерЭтоИП = Реквизиты.ЭтоИндивидуальныйПредприниматель; + + РеквизитыФормы = Новый Структура; + РеквизитыФормы.Вставить("ДокументыПартнерИНН", Реквизиты.ИНН); + РеквизитыФормы.Вставить("ДокументыПартнерКПП", Реквизиты.КПП); + + УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерИНН", Истина); + + Если Не ДокументыПартнерЭтоИП Тогда + УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерКПП", Истина); + КонецЕсли; КонецЕсли; - ДокументыПартнерСсылка = ?(ДокументыПартнерТип <> Неопределено, Реквизиты.Партнер, Неопределено); Элементы.ДокументыПартнер.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыПартнерСсылка); - ДокументыПартнер = СокрЛП(?(Реквизиты.Представление <> Неопределено, Реквизиты.Представление, Реквизиты.Партнер)); - - ДокументыПартнерЭтоИП = Реквизиты.ЭтоИндивидуальныйПредприниматель; - - РеквизитыФормы = Новый Структура; - РеквизитыФормы.Вставить("ДокументыПартнерИНН", Реквизиты.ИНН); - РеквизитыФормы.Вставить("ДокументыПартнерКПП", Реквизиты.КПП); - - УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерИНН", Истина); - Если ДокументыПартнерЭтоИП Тогда Элементы.ДокументыПартнерКПП.Видимость = Ложь; Иначе - УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерКПП", Истина); Элементы.ДокументыПартнерКПП.Видимость = Истина; КонецЕсли; @@ -2097,6 +2159,13 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьРеквизитыПартнераВидаЮридическоеЛицо() + + ОчиститьРеквизит("ДокументыПартнерКПП"); + +КонецПроцедуры + &НаСервере Функция ПартнерЗаполнен() @@ -2352,7 +2421,7 @@ Возврат Неопределено; КонецЕсли; - Макет = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолучитьМакет( + Макет = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет( ?(ЭтоИндивидуальныйПредприниматель, "ЗаявлениеНаСертификатИндивидуальногоПредпринимателя", "ЗаявлениеНаСертификатЮридическогоЛица")); @@ -2409,9 +2478,7 @@ КонецЕсли; МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - УстановитьПривилегированныйРежим(Истина); Результат = МодульИнтернетПоддержкаПользователей.ТикетАутентификацииНаПорталеПоддержки("http://regservice.1c.ru"); - УстановитьПривилегированныйРежим(Ложь); ИнтернетПоддержкаПользователейПодключена = Истина; Если ЗначениеЗаполнено(Результат.КодОшибки) Тогда @@ -2490,6 +2557,24 @@ КонецФункции +&НаСервере +Функция ИнтернетПоддержкаПользователейПодключена() + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат Истина; + КонецЕсли; + + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); + + Возврат ДанныеАутентификации <> Неопределено; + +КонецФункции + &НаСервере Функция ЗаявлениеXML(Билет) @@ -2731,18 +2816,18 @@ Возврат; КонецЕсли; - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); ДополнительныеПараметры = Новый Структура("НаименованиеВключаетСокращение", Истина); - АдресСтруктура = МодульУправлениеКонтактнойИнформацией.СведенияОбАдресе(АдресXML, ДополнительныеПараметры); + АдресСтруктура = МодульРаботаСАдресами.СведенияОбАдресе(АдресXML, ДополнительныеПараметры); ПервыйКорпус = ?(АдресСтруктура.Корпуса.Количество() > 0, АдресСтруктура.Корпуса[0].Номер, ""); ПервоеПомещение = ?(АдресСтруктура.Помещения.Количество() > 0, АдресСтруктура.Помещения[0].Номер, ""); УлицаПолностью = ПредставлениеЧастиАдреса(АдресСтруктура, - "Улица, - |ДополнительнаяТерритория, - |ЭлементДополнительнойТерритории"); + "Улица, УлицаСокращение, + |ДополнительнаяТерритория, ДополнительнаяТерриторияСокращение, + |ЭлементДополнительнойТерритории, ЭлементДополнительнойТерриторииСокращение"); ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента); @@ -3066,10 +3151,6 @@ &НаКлиенте Процедура УстановитьСертификат(Оповещение) - Если СписокПрограмм.Количество() = 0 Тогда - ЗаполнитьСписокПрограмм(); - КонецЕсли; - ДатаУстановкиСертификата = ОбщегоНазначенияКлиент.ДатаСеанса(); Контекст = Новый Структура("Оповещение", Оповещение); @@ -3240,6 +3321,8 @@ |Путь к контейнеру: ""%2"".'"), КонтейнерКлючаИмя, КонтейнерКлючаПуть); + + Контекст.Вставить("ОшибкаПоискаКонтейнера", ОшибкаУстановкиСертификата); Иначе ОшибкаУстановкиСертификата = ""; КонецЕсли; @@ -3258,15 +3341,20 @@ Процедура УстановитьСертификатПослеОшибкиВызоваУстановитьСертификатВКонтейнерИХранилище(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; + Криптография = Неопределено; - ОшибкаУстановкиСертификата = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось установить личный сертификат в контейнер ключей и хранилище ОС по причине: - |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)) - + СокрП(Символы.ПС + Символы.ПС + ОшибкаУстановкиСертификата); + ОшибкаУстановкиСертификата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить личный сертификат в контейнер ключей и хранилище ОС по причине: + |%1'"), + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке)); - УстановитьСертификатПослеВызоваУстановитьСертификатВКонтейнерИХранилище( , , Контекст); + Если Контекст.Свойство("ОшибкаПоискаКонтейнера") Тогда + ОшибкаУстановкиСертификата = ОшибкаУстановкиСертификата + + Символы.ПС + Символы.ПС + Контекст.ОшибкаПоискаКонтейнера; + КонецЕсли; + + Контекст.Вставить("РезультатПослеВызоваУстановитьСертификатВКонтейнерИХранилище", Неопределено); + УстановитьСертификатПослеВызоваУстановитьСертификатВКонтейнерИХранилищеПослеПолученияСписокОшибок(Неопределено, Контекст); КонецПроцедуры @@ -3274,10 +3362,28 @@ &НаКлиенте Процедура УстановитьСертификатПослеВызоваУстановитьСертификатВКонтейнерИХранилище(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваУстановитьСертификатВКонтейнерИХранилище", Результат); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "УстановитьСертификатПослеВызоваУстановитьСертификатВКонтейнерИХранилищеПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +&НаКлиенте +Процедура УстановитьСертификатПослеВызоваУстановитьСертификатВКонтейнерИХранилищеПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + УстановитьСертификатПослеОшибкиВызоваУстановитьСертификатВКонтейнерИХранилище(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваУстановитьСертификатВКонтейнерИХранилище; + АктивноеОкно().Активизировать(); Если Результат <> Истина И Не ЗначениеЗаполнено(ОшибкаУстановкиСертификата) Тогда - ОшибкаУстановкиСертификата = НСтр("ru = 'Не удалось установить личный сертификат.'"); + ОшибкаУстановкиСертификата = НСтр("ru = 'Не удалось установить личный сертификат в контейнер ключей и хранилище ОС.'"); КонецЕсли; ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения( @@ -3313,6 +3419,28 @@ АктивноеОкно().Активизировать(); + Если Криптография <> Неопределено Тогда + УстановитьСертификатПослеПроверкиНаличияСертификат(Истина, Контекст); + Иначе + СоздатьОбъектКриптографии(Новый ОписаниеОповещения( + "УстановитьСертификатПослеПроверкиНаличияСертификат", ЭтотОбъект, Контекст), + НСтр("ru = 'Для установки сертификата на компьютер требуется + |установить расширение для веб-клиента 1С:Предприятия.'"), + НСтр("ru = 'Для установки сертификата на компьютер требуется + |установить дополнительную внешнюю компоненту.'")); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +&НаКлиенте +Процедура УстановитьСертификатПослеПроверкиНаличияСертификат(Результат, Контекст) Экспорт + + Если Результат <> Истина Тогда + УстановитьСертификатПослеВызоваИмпортироватьСертификатПослеПолученияСписокОшибок(Неопределено, Контекст); + Возврат; + КонецЕсли; + Криптография.НачатьВызовИмпортироватьСертификат(Новый ОписаниеОповещения( "УстановитьСертификатПослеВызоваИмпортироватьСертификат", ЭтотОбъект, Контекст, "УстановитьСертификатПослеОшибкиВызоваИмпортироватьСертификат", ЭтотОбъект), @@ -3325,9 +3453,15 @@ Процедура УстановитьСертификатПослеОшибкиВызоваИмпортироватьСертификат(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ОшибкаУстановкиСертификата = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Криптография = Неопределено; - УстановитьСертификатПослеВызоваИмпортироватьСертификат( , , Контекст); + ОшибкаУстановкиСертификата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить корневой сертификат в хранилище ОС по причине: + |%1'"), + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке)); + + Контекст.Вставить("РезультатПослеВызоваИмпортироватьСертификат", Неопределено); + УстановитьСертификатПослеВызоваИмпортироватьСертификатПослеПолученияСписокОшибок(Неопределено, Контекст); КонецПроцедуры @@ -3335,10 +3469,28 @@ &НаКлиенте Процедура УстановитьСертификатПослеВызоваИмпортироватьСертификат(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваИмпортироватьСертификат", Результат); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "УстановитьСертификатПослеВызоваИмпортироватьСертификатПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +&НаКлиенте +Процедура УстановитьСертификатПослеВызоваИмпортироватьСертификатПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + УстановитьСертификатПослеОшибкиВызоваИмпортироватьСертификат(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваИмпортироватьСертификат; + АктивноеОкно().Активизировать(); Если Результат <> Истина И Не ЗначениеЗаполнено(ОшибкаУстановкиСертификата) Тогда - ОшибкаУстановкиСертификата = НСтр("ru = 'Не удалось установить корневой сертификат.'"); + ОшибкаУстановкиСертификата = НСтр("ru = 'Не удалось установить корневой сертификат в хранилище ОС.'"); КонецЕсли; АктивноеОкно().Активизировать(); @@ -3428,7 +3580,7 @@ ВидКонтактнойИнформации = Новый Структура; ВидКонтактнойИнформации.Вставить("Тип", ПредопределенноеЗначение(ИмяТипаКонтактнойИнформации)); - ВидКонтактнойИнформации.Вставить("АдресТолькоРоссийский", Истина); + ВидКонтактнойИнформации.Вставить("ТолькоНациональныйАдрес", Истина); ВидКонтактнойИнформации.Вставить("ВключатьСтрануВПредставление", Ложь); ВидКонтактнойИнформации.Вставить("СкрыватьНеактуальныеАдреса", Ложь); @@ -3447,7 +3599,8 @@ Форма[ИмяРеквизита + "XML"] = ""; Форма[ИмяРеквизита] = ""; - ПроверитьАдрес(ИмяРеквизита); + РеквизитыПроверкиАдреса[ИмяРеквизита] = Истина; + ПодключитьОбработчикОжидания("ПроверитьАдресОбработчикОжидания", 0.1, Истина); КонецПроцедуры @@ -3463,7 +3616,8 @@ Форма[ИмяРеквизита + "XML"] = ВыбранноеЗначение.КонтактнаяИнформация; Форма[ИмяРеквизита] = ВыбранноеЗначение.Представление; - ПроверитьАдрес(ИмяРеквизита); + РеквизитыПроверкиАдреса[ИмяРеквизита] = Истина; + ПодключитьОбработчикОжидания("ПроверитьАдресОбработчикОжидания", 0.1, Истина); КонецПроцедуры @@ -3525,7 +3679,7 @@ // Приложение 2. Формат названия субъекта федерации. // Из раздела "Справочник кодов регионов". - ИменаВсехРегионовРФ = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолучитьМакет( + ИменаВсехРегионовРФ = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет( "ИменаРегионовРФПоРекомендациямДляСКПЭП"); Строка = ИменаВсехРегионовРФ.ПолучитьСтроку(Число(КодРегиона)); @@ -3658,6 +3812,12 @@ ЗаполнитьРеквизит("КПП"); КонецЕсли; + Если ЭтоИндивидуальныйПредприниматель Тогда + Элементы.ОГРН.Заголовок = НСтр("ru = 'ОГРНИП'"); + Иначе + Элементы.ОГРН.Заголовок = НСтр("ru = 'ОГРН'"); + КонецЕсли; + ЗаполнитьРеквизит("ОГРН"); ЗаполнитьРеквизит("РасчетныйСчет"); ЗаполнитьРеквизит("БИК"); @@ -3879,7 +4039,7 @@ &НаСервере Процедура УстановитьСоглашение() - ТекстHTML = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолучитьМакет( + ТекстHTML = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет( "Соглашение").ПолучитьТекст(); ТекстHTML = СтрЗаменить(ТекстHTML, "%1", @@ -3921,27 +4081,6 @@ Процедура ЗаполнитьСписокПрограмм() СписокПрограмм.Очистить(); - - Если Не ЗначениеЗаполнено(КонтейнерКлючаПуть) - И Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено Тогда - - ВариантАлгоритмов = ВариантАлгоритмов(); - КонецЕсли; - - Если Не ЗначениеЗаполнено(ВариантАлгоритмов) Тогда - ВариантАлгоритмов = "2001"; - КонецЕсли; - - ИдентификаторыНастроек = Новый Соответствие; - - Если ВариантАлгоритмов = "2001" Тогда - ИдентификаторыНастроек.Вставить("VipNet2001", Истина); - ИдентификаторыНастроек.Вставить("CryptoPro2001", Истина); - Иначе - ИдентификаторыНастроек.Вставить("VipNet2012", Истина); - ИдентификаторыНастроек.Вставить("CryptoPro2012", Истина); - КонецЕсли; - Настройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); Запрос = Новый Запрос; @@ -3955,62 +4094,23 @@ | И Программы.ТипПрограммы = &ТипПрограммы"; Для каждого Настройка Из Настройки Цикл - Если ИдентификаторыНастроек.Получить(Настройка.Идентификатор) = Неопределено Тогда - Продолжить; - КонецЕсли; - Строка = СписокПрограмм.Добавить(); - ЗаполнитьЗначенияСвойств(Строка, Настройка); - - Запрос.УстановитьПараметр("ИмяПрограммы", Настройка.ИмяПрограммы); - Запрос.УстановитьПараметр("ТипПрограммы", Настройка.ТипПрограммы); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Строка.Ссылка = Выборка.Ссылка; + Если Настройка.Идентификатор = "VipNet" + Или Настройка.Идентификатор = "CryptoPro" Тогда + + Строка = СписокПрограмм.Добавить(); + ЗаполнитьЗначенияСвойств(Строка, Настройка); + + Запрос.УстановитьПараметр("ИмяПрограммы", Настройка.ИмяПрограммы); + Запрос.УстановитьПараметр("ТипПрограммы", Настройка.ТипПрограммы); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Строка.Ссылка = Выборка.Ссылка; + КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры -&НаСервере -Функция ВариантАлгоритмов() - - Попытка - ВебСервис = ВебСервисУЦ(); - - Фабрика = ВебСервис.Определение.ФабрикаXDTO; - URIПространстваИмен = ВебСервис.ТочкаПодключения.Интерфейс.URIПространстваИмен; - ТипПустогоПараметра = Фабрика.Пакеты.Получить(URIПространстваИмен).КорневыеСвойства.Получить("GetCertificateSettings").Тип; - ЗначениеПустогоПараметра = Фабрика.Создать(ТипПустогоПараметра); - - Ответ = ВебСервис.GetCertificateSettings(ЗначениеПустогоПараметра).GetCertificateSettingsResult; - - ЧтениеXML = Новый ЧтениеXML; - ЧтениеXML.УстановитьСтроку(Ответ); - ПостроительDOM = Новый ПостроительDOM(); - ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML); - ЧтениеXML.Закрыть(); - - УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("algorithm"); - ВариантАлгоритмов = УзелDOM[0].ТекстовоеСодержимое; - - Если ВариантАлгоритмов <> "2001" И ВариантАлгоритмов <> "2012" Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ответ сервера не соответствует ожидаемому: - |%1'"), Ответ); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось получить требуемый вариант алгоритмов от сервера 1С:Подпись по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - ВызватьИсключение ТекстОшибки; - КонецПопытки; - - Возврат ВариантАлгоритмов; - -КонецФункции - &НаКлиенте Процедура ЗаполнитьПрограмму(Оповещение = Неопределено) @@ -4033,10 +4133,9 @@ Процедура ЗаполнитьПрограммуЦиклНачало(Контекст) Если СписокПрограмм.Количество() <= Контекст.Индекс + 1 Тогда - Если Контекст.ПерваяДобавленнаяПрограмма = Неопределено Тогда - Возврат; + Если Контекст.ПерваяДобавленнаяПрограмма <> Неопределено Тогда + Объект.Программа = Контекст.ПерваяДобавленнаяПрограмма; КонецЕсли; - Объект.Программа = Контекст.ПерваяДобавленнаяПрограмма; ПослеВыбораПрограммы(Ложь, Контекст.Оповещение); Возврат; КонецЕсли; @@ -4073,6 +4172,12 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеВыборкаПрограммыОбработчикОжидания() + + ПослеВыбораПрограммы(Истина); + +КонецПроцедуры &НаКлиенте Процедура ПослеВыбораПрограммы(ПоказатьОшибку, Оповещение = Неопределено) @@ -4174,7 +4279,6 @@ ОбновитьЗначение(Содержание, "ЭлектроннаяПочта"); ОбновитьЗначение(Содержание, "Подразделение"); // Сохранение заполненных значений, если есть. - ОбновитьЗначение(Содержание, "ВариантАлгоритмов"); ОбновитьЗначение(Содержание, "Программа", Объект.Программа); ОбновитьЗначение(Содержание, "ПредставлениеПрограммы"); ОбновитьЗначение(Содержание, "КонтейнерКлючаИмя"); @@ -4397,18 +4501,19 @@ КонецПроцедуры -// Продолжение процедуры СоздатьОбъектКриптографии. +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваСоздатьКонтейнер(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; + Криптография = Неопределено; Ошибка = Новый Структура; Ошибка.Вставить("ПоказатьИнструкцию", Истина); Ошибка.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось выполнить операцию по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке))); ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Создание ключа электронной подписи'"), "", Ошибка, Новый Структура); @@ -4421,11 +4526,29 @@ &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьКонтейнер(Путь, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("ПутьПослеВызоваСоздатьКонтейнер", Путь); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьКонтейнерПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. +&НаКлиенте +Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьКонтейнерПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваСоздатьКонтейнер(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Путь = Контекст.ПутьПослеВызоваСоздатьКонтейнер; + АктивноеОкно().Активизировать(); Если Не ЗначениеЗаполнено(Путь) Тогда Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); - Если СтрНачинаетсяС(Строки[0].Идентификатор, "CryptoPro") Тогда + Если Строки[0].Идентификатор = "CryptoPro" Тогда ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ключ электронной подписи не создан. | @@ -4501,11 +4624,12 @@ КонецПроцедуры -// Продолжение процедуры СоздатьОбъектКриптографии. +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваСоздатьЗапросНаСертификат(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; + Криптография = Неопределено; СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке, НСтр("ru = 'Не удалось выполнить операцию по причине:'")); @@ -4516,6 +4640,24 @@ &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьЗапросНаСертификат(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваСоздатьЗапросНаСертификат", Результат); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьЗапросНаСертификатПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. +&НаКлиенте +Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваСоздатьЗапросНаСертификатПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваСоздатьЗапросНаСертификат(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваСоздатьЗапросНаСертификат; + Если Результат <> Истина Тогда Контекст.ЗапросСоздан = Ложь; СоздатьКлючИЗапросНаСертификатЗавершение(Контекст); @@ -4573,11 +4715,12 @@ КонецПроцедуры -// Продолжение процедуры СоздатьОбъектКриптографии. +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваПолучитьОткрытыйКлюч(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; + Криптография = Неопределено; СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке, НСтр("ru = 'Не удалось получить открытую часть ключа по причине:'")); @@ -4588,6 +4731,24 @@ &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваПолучитьОткрытыйКлюч(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваПолучитьОткрытыйКлюч", Результат); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "СоздатьКлючИЗапросНаСертификатПослеВызоваПолучитьОткрытыйКлючПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. +&НаКлиенте +Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваПолучитьОткрытыйКлючПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваПолучитьОткрытыйКлюч(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваПолучитьОткрытыйКлюч; + Контекст.Вставить("ТекущаяОткрытаяЧастьКлючаЭП", Результат); Криптография.НачатьВызовВычислитьИдентификаторКлючаСубъекта(Новый ОписаниеОповещения( @@ -4597,11 +4758,12 @@ КонецПроцедуры -// Продолжение процедуры СоздатьОбъектКриптографии. +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваВычислитьИдентификаторКлючаСубъекта(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; + Криптография = Неопределено; СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке, НСтр("ru = 'Не удалось вычислить идентификатор ключа субъекта по причине:'")); @@ -4612,6 +4774,24 @@ &НаКлиенте Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваВычислитьИдентификаторКлючаСубъекта(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваВычислитьИдентификаторКлючаСубъекта", Результат); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "СоздатьКлючИЗапросНаСертификатПослеВызоваВычислитьИдентификаторКлючаСубъектаПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры СоздатьКлючИЗапросНаСертификат. +&НаКлиенте +Процедура СоздатьКлючИЗапросНаСертификатПослеВызоваВычислитьИдентификаторКлючаСубъектаПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваВычислитьИдентификаторКлючаСубъекта(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваВычислитьИдентификаторКлючаСубъекта; + Контекст.Вставить("ТекущийИКС", Результат); НачатьПомещениеФайлов(Новый ОписаниеОповещения( @@ -4649,7 +4829,7 @@ Ошибка = Новый Структура; Ошибка.Вставить("ПоказатьИнструкцию", Истина); Ошибка.Вставить("ОписаниеОшибки", ЗаголовокОшибки - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Символы.ПС + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке)); ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Создание запроса на сертификат'"), "", Ошибка, Новый Структура); @@ -4714,7 +4894,7 @@ Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); - Если СтрНачинаетсяС(Строки[0].Идентификатор, "CryptoPro") Тогда + Если Строки[0].Идентификатор = "CryptoPro" Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, НайтиБезУчетаРегистраИРазделителяПути( ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0); Возврат; @@ -4761,7 +4941,7 @@ // С<Фамилия Имя>, Индивидуальный предприниматель". Субъект = ПодготовитьСтрокуДляИмениКонтейнера(Фамилия) + " " + ПодготовитьСтрокуДляИмениКонтейнера(Имя) + ", " - + ПодготовитьСтрокуДляИмениКонтейнера(НСтр("ru = 'Индивидуальный предприниматель'")); + + НСтр("ru = 'Индивидуальный предприниматель'"); Иначе // С<Фамилия Имя>, <Сокращенное наименование организации>". Субъект = ПодготовитьСтрокуДляИмениКонтейнера(Фамилия) + " " @@ -4832,11 +5012,10 @@ СтрокаПодготовленная = ""; - СтрокаЛатиницей = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Строка); - КоличествоСимволов = СтрДлина(СтрокаЛатиницей); + КоличествоСимволов = СтрДлина(Строка); Для НомерСимвола = 1 По КоличествоСимволов Цикл - Символ = Сред(СтрокаЛатиницей, НомерСимвола, 1); + Символ = Сред(Строка, НомерСимвола, 1); Если ЗаменаСимволов[Символ] <> Неопределено Тогда Символ = ЗаменаСимволов[Символ]; КонецЕсли; @@ -4890,7 +5069,6 @@ Поля.Вставить("CN", Лев(ПолеОбщееИмя, 64)); СписокПараметров.Добавить("2.5.4.3", Поля.CN); - // Поле SN - фамилия должностного лица или индивидуального предпринимателя. ПолеФамилия = СтрЗаменить(Фамилия, " ", "_"); Поля.Вставить("SN", Лев(ПолеФамилия, 64)); @@ -4925,9 +5103,9 @@ // Поле Street - улица: // "<улица> и/или <дополнительная территория> и/или <элемент дополнительной территории>, дом, офис". ПолеУлица = ПредставлениеЧастиАдреса(Адрес, - "Улица, - |ДополнительнаяТерритория, - |ЭлементДополнительнойТерритории, + "Улица, УлицаСокращение, + |ДополнительнаяТерритория, ДополнительнаяТерриторияСокращение, + |ЭлементДополнительнойТерритории, ЭлементДополнительнойТерриторииСокращение, |Здание, Корпуса, Помещения"); Поля.Вставить("Street", Лев(ПолеУлица, 128)); СписокПараметров.Добавить("2.5.4.9", Поля.Street); @@ -5001,6 +5179,18 @@ КонецФункции +&НаКлиенте +Функция ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке) + + Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда + Возврат КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Иначе + Возврат Строка(ИнформацияОбОшибке); + КонецЕсли; + +КонецФункции + + &НаКлиенте Процедура ПолучитьИменаКонтейнеровКлючей(Оповещение) @@ -5021,15 +5211,51 @@ Контекст.Вставить("ТекущееИмя", ""); Криптография.НачатьВызовПолучитьСледующийКонтейнерКлючей(Новый ОписаниеОповещения( - "ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект, Контекст), + "ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект, Контекст, + "ПолучитьИменаКонтейнеровКлючейЦиклПослеОшибкиВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект), Контекст.ТекущееИмя, Контекст.ПервыйПроход); КонецПроцедуры +// Продолжение процедуры ПолучитьИменаКонтейнеровКлючей. +&НаКлиенте +Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеОшибкиВызоваПолучитьСледующийКонтейнерКлючей(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + Криптография = Неопределено; + + ПоказатьПредупреждение(, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить имя следующего контейнера ключей по причине: + |%1'"), + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке))); + +КонецПроцедуры + // Продолжение процедуры ПолучитьИменаКонтейнеровКлючей. &НаКлиенте Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючей(Результат, ПараметрыВызова, Контекст) Экспорт + Контекст.Вставить("РезультатПослеВызоваПолучитьСледующийКонтейнерКлючей", Результат); + Контекст.Вставить("ПараметрыВызоваПослеВызоваПолучитьСледующийКонтейнерКлючей", ПараметрыВызова); + + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючейПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьИменаКонтейнеровКлючей. +&НаКлиенте +Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючейПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + ПолучитьИменаКонтейнеровКлючейЦиклПослеОшибкиВызоваПолучитьСледующийКонтейнерКлючей(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + + Результат = Контекст.РезультатПослеВызоваПолучитьСледующийКонтейнерКлючей; + ПараметрыВызова = Контекст.ПараметрыВызоваПослеВызоваПолучитьСледующийКонтейнерКлючей; + Если Не Результат Тогда Если Контекст.ПервыйПроход Тогда Контекст.ПервыйПроход = Ложь; @@ -5095,7 +5321,7 @@ Возврат; КонецЕсли; - Контекст.Вставить("Путь", "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаОбмена"); + Контекст.Вставить("Путь", "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена"); Контекст.Вставить("Имя", "ЭДОNative"); НачатьПодключениеВнешнейКомпоненты(Новый ОписаниеОповещения( @@ -5200,6 +5426,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Криптография = Неопределено; + РаботаСДвоичнымиДанными = Неопределено; ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось создать объект внешней компоненты для работы с двоичными данными по причине: |%1'"), @@ -5246,7 +5473,7 @@ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Программа электронной подписи не доступна через внешнюю компоненту по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке))); КонецПроцедуры @@ -5254,6 +5481,20 @@ &НаКлиенте Процедура СоздатьОбъектКриптографииПослеВызоваСоздатьМенеджераКриптографии(Результат, ПараметрыВызова, Контекст) Экспорт + Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения( + "СоздатьОбъектКриптографииПослеВызоваСоздатьМенеджераКриптографииПослеПолученияСписокОшибок", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +// Продолжение процедуры СоздатьОбъектКриптографии. +&НаКлиенте +Процедура СоздатьОбъектКриптографииПослеВызоваСоздатьМенеджераКриптографииПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + СоздатьОбъектКриптографииПослеОшибкиВызоваСоздатьМенеджераКриптографии(СписокОшибок, Ложь, Контекст); + Возврат; + КонецЕсли; + ВыполнитьОбработкуОповещения(Контекст.ОбработкаПродолжения, Истина); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl new file mode 100644 index 000000000..8c6d42827 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl @@ -0,0 +1,77 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +Процедура ПриСозданииНаСервере(Объект, ОткрытьЗаявление) Экспорт + + Если ЗначениеЗаполнено(Объект.Ссылка) + И ЗначениеЗаполнено(Объект.СостояниеЗаявления) + И Объект.СостояниеЗаявления <> Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено Тогда + + ОткрытьЗаявление = Истина; + КонецЕсли; + +КонецПроцедуры + +Процедура ПриСозданииНаСервереПриЧтенииНаСервере(Объект, Элементы) Экспорт + + Если ЗначениеЗаполнено(Объект.СостояниеЗаявления) Тогда + Если Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено Тогда + + Элементы.ФормаПоказатьЗаявлениеПоКоторомуБылПолученСертификат.Доступность = Истина; + Элементы.ПоказатьЗаявлениеПоКоторомуБылПолученСертификат.Доступность = Истина; + Иначе + Возврат; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьУсловноеОформлениеСпискаСертификатов(ЭлементУсловногоОформления) Экспорт + + СписокСостояний = Новый СписокЗначений; + СписокСостояний.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка()); + СписокСостояний.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено); + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеЗаявления"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + ЭлементОтбораДанных.ПравоеЗначение = СписокСостояний; + ЭлементОтбораДанных.Использование = Истина; + +КонецПроцедуры + +Процедура ДополнитьЗапросПриДобавленииСертификатов(ТекстЗапроса) Экспорт + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, + "ЛОЖЬ КАК ЭтоЗаявление", + "ВЫБОР + | КОГДА Сертификаты.СостояниеЗаявления = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка) + | ТОГДА ЛОЖЬ + | КОГДА Сертификаты.СостояниеЗаявления = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено) + | ТОГДА ЛОЖЬ + | ИНАЧЕ ИСТИНА + | КОНЕЦ КАК ЭтоЗаявление"); + +КонецПроцедуры + +Процедура ДополнитьЗапросСпискаСертификатов(ТекстЗапроса) Экспорт + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, + "&ДополнительноеУсловие", + "Сертификаты.СостояниеЗаявления В ( + | ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.ПустаяСсылка), + | ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено) )"); + +КонецПроцедуры + +Процедура РеквизитыНеРедактируемыеВГрупповойОбработке(НеРедактируемыеРеквизиты) Экспорт + + НеРедактируемыеРеквизиты.Добавить("СостояниеЗаявления"); + НеРедактируемыеРеквизиты.Добавить("СодержаниеЗаявления"); + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ЗаявлениеНаСертификатИндивидуальногоПредпринимателя/Template.mxlx b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЗаявлениеНаСертификатИндивидуальногоПредпринимателя/Template.mxlx similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ЗаявлениеНаСертификатИндивидуальногоПредпринимателя/Template.mxlx rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЗаявлениеНаСертификатИндивидуальногоПредпринимателя/Template.mxlx diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ЗаявлениеНаСертификатЮридическогоЛица/Template.mxlx b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЗаявлениеНаСертификатЮридическогоЛица/Template.mxlx similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ЗаявлениеНаСертификатЮридическогоЛица/Template.mxlx rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЗаявлениеНаСертификатЮридическогоЛица/Template.mxlx diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.bin b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.bin new file mode 100644 index 000000000..6803a6a32 Binary files /dev/null and b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.bin differ diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Соглашение/Template.txt b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/Соглашение/Template.txt similarity index 100% rename from SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Соглашение/Template.txt rename to SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/Соглашение/Template.txt diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo new file mode 100644 index 000000000..59ff4861b --- /dev/null +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="54b5b44c-5f24-4b2a-982c-4489b18db7f0"> + <producedTypes> + <objectType typeId="4e8135c3-b673-47dc-810a-6cdf2a5b8eb9" valueTypeId="5e3baa3c-979c-46ea-aa30-e1e8639a06a8"/> + <managerType typeId="4f8691c9-53a8-409c-82be-f72a9ee5c5ef" valueTypeId="e74d7241-bba2-49a9-8e25-0abf1a5f4b7d"/> + </producedTypes> + <name>ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата</name> + <synonym> + <key>ru</key> + <value>Заявление на выпуск нового квалифицированного сертификата</value> + </synonym> + <useStandardCommands>true</useStandardCommands> + <forms uuid="5bc04a9a-6a0a-4607-b8eb-743b87143ae7"> + <name>ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата</name> + <synonym> + <key>ru</key> + <value>Заявление на выпуск нового квалифицированного сертификата</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <templates uuid="90420fe9-f75a-4bcc-8e1a-9d665a61ecef"> + <name>Соглашение</name> + <synonym> + <key>ru</key> + <value>Соглашение</value> + </synonym> + <templateType>TextDocument</templateType> + </templates> + <templates uuid="904d5bd0-3843-4aaa-86a3-f8e12282e5c0"> + <name>ИменаРегионовРФПоРекомендациямДляСКПЭП</name> + <synonym> + <key>ru</key> + <value>Имена регионов РФ по рекомендациям для СКПЭП</value> + </synonym> + <comment>Дата актуальности - 24.03.2014 (http://www.gnivc.ru/inf_provision/classifiers_reference/ssrf/)</comment> + <templateType>TextDocument</templateType> + </templates> + <templates uuid="e057e428-99c1-419d-a169-697c1e825e94"> + <name>ЗаявлениеНаСертификатИндивидуальногоПредпринимателя</name> + <synonym> + <key>ru</key> + <value>Заявление на сертификат индивидуального предпринимателя</value> + </synonym> + </templates> + <templates uuid="784a60bd-4070-476d-9b8b-f607c76dc52b"> + <name>ЗаявлениеНаСертификатЮридическогоЛица</name> + <synonym> + <key>ru</key> + <value>Заявление на сертификат юридического лица</value> + </synonym> + </templates> + <templates uuid="ce1ffc4e-56c2-45ce-80e8-8b96d00316bc"> + <name>КомпонентаОбмена</name> + <synonym> + <key>ru</key> + <value>Компонента обмена</value> + </synonym> + <templateType>BinaryData</templateType> + </templates> +</mdclass:DataProcessor> diff --git a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Commands/ИнструментыРазработчика/CommandModule.bsl b/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Commands/ИнструментыРазработчика/CommandModule.bsl deleted file mode 100644 index 7019e7d7d..000000000 --- a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Commands/ИнструментыРазработчика/CommandModule.bsl +++ /dev/null @@ -1,10 +0,0 @@ - -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ПараметрыФормы = Новый Структура("", ); - ОткрытьФорму("Обработка.ИнструментыРазработчикаПроверкаКонтрагентов.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); -КонецПроцедуры - -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Form.form deleted file mode 100644 index eaa97d669..000000000 --- a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Form.form +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> - <items xsi:type="form:Button"> - <name>СбросНастроек</name> - <id>1</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>СбросНастроекРасширеннаяПодсказка</name> - <id>2</id> - <title> - <key>ru</key> - <value>- Отключение проверки контрагентов -- Сброс даты последнего отображения предложения на использование сервиса -- Cброс факта отказа от подключения к сервису -- Очистка состояний проверки контрагентов в разрезе контрагентов -- Очистка состояний проверки контрагентов в разрезе документов</value> - - Label - - Style.ПоясняющийТекст - - - Left - - - UsualButton - Form.Command.СбросНастроек - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - - ГруппаПереходаКНастройкам - 3 - - ОткрытьНастройкиПроверкиКонтрагентов - 5 - - <key>ru</key> - <value>Открыть настройки проверки контрагентов</value> - - true - true - - true - - - ОткрытьНастройкиПроверкиКонтрагентовРасширеннаяПодсказка - 7 - Label - true - true - - Left - - - - ОткрытьНастройкиПроверкиКонтрагентовКонтекстноеМеню - 6 - true - - Label - true - true - - - Click - ОткрытьНастройкиПроверкиКонтрагентовНажатие - - true - Left - - - true - true - - true - - - ru - Группа перехода к настройкам - - - ГруппаПереходаКНастройкамРасширеннаяПодсказка - 4 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - auto - Auto - Auto - - - - ФормаКоманднаяПанель - -1 - Left - - DontBlock - true - true - true - Vertical - true - true - true - auto - true - - Объект - 1 - - DataProcessorObject.ИнструментыРазработчикаПроверкаКонтрагентов - - - true - - - true - -
          true
          -
          - - СбросНастроек - - <key>ru</key> - <value>Сброс настроек</value> - - 1 - - ru - Сброс настроек - - - true - - - - СбросНастроек - - - DontUse - Auto - - - - - - - diff --git a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Module.bsl deleted file mode 100644 index eafd607e0..000000000 --- a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/Forms/Форма/Module.bsl +++ /dev/null @@ -1,72 +0,0 @@ -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура СбросНастроек(Команда) - СбросНастроекНаСервере(); - ПоказатьОповещениеПользователя(НСтр("ru = 'Проверка контрагентов'"),,НСтр("ru = 'Настройки проверки контрагентов сброшены'")); -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьНастройкиПроверкиКонтрагентовНажатие(Элемент) - ОткрытьФорму("ОбщаяФорма.НастройкиПроверкиКонтрагентов"); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервереБезКонтекста -Процедура СбросНастроекНаСервере() - - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПроверкаКонтрагентов", - "ПроверкаКонтрагентов_ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса", Неопределено); - - УстановитьПривилегированныйРежим(Истина); - - ЭтоМодельСервисаВнутриОбласти = ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); - - НеМодельСервиса = НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено(); - - ПроверкаКонтрагентов.УдалитьРезультатПроверкиКонтрагентов(); - - // Очистка регистров. - Если ЭтоМодельСервисаВнутриОбласти ИЛИ НеМодельСервиса Тогда - - // Ветка для разделенной области в модели сервиса - // или для версии в "коробке". - ПроверкаКонтрагентов.УдалитьРезультатПроверкиКонтрагентовПоДокументам(); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = '1. Очищены состояния контрагентов в данной области. - |2. Очищены состояния документов. - |3. Проверка не отключена. Для отключения Запустите сброс настроек повторно из неразделенной области.'")); - - Иначе - ВыключитьПроверку(); - КонецЕсли; - - Иначе - - // Ветка для модели сервиса, неразделенной области. - ВыключитьПроверку(); - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = '1. Очищены состояния контрагентов. - |2. Проверка отключена. - |3. Состояния документов не очищены. Данные по документам необходимо очищать из области данных. - |Запустите сброс настроек повторно из нужной области данных.'")); - - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ВыключитьПроверку() - - Константы.ИспользоватьПроверкуКонтрагентов.Установить(0); - ОбновитьПовторноИспользуемыеЗначения(); - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/ИнструментыРазработчикаПроверкаКонтрагентов.mdo b/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/ИнструментыРазработчикаПроверкаКонтрагентов.mdo deleted file mode 100644 index 8ae304e36..000000000 --- a/SSL/src/DataProcessors/ИнструментыРазработчикаПроверкаКонтрагентов/ИнструментыРазработчикаПроверкаКонтрагентов.mdo +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - ИнструментыРазработчикаПроверкаКонтрагентов - - ru - Инструменты разработчика: проверка контрагентов - - DataProcessor.ИнструментыРазработчикаПроверкаКонтрагентов.Form.Форма - - Форма - - ru - Форма - - PersonalComputer - MobileDevice - - - ИнструментыРазработчика - - ru - Инструменты разработчика - - NavigationPanelOrdinary - Auto - - diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form index 0bd746614..eaae7f14b 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form @@ -7,6 +7,10 @@ ДоступныеВидыОбъектов 13 + + <key>ru</key> + <value>Доступные виды объектов</value> + true true @@ -179,9 +183,6 @@ CommonPicture.КоллекцияОбъектыМетаданных - None - None - None true Bottom diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form index 378fe8705..7407b37b9 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form @@ -70,10 +70,6 @@ ru Период - - ru - Группа период - ГруппаПериодExtendedTooltip 20 @@ -96,6 +92,10 @@ КомпоновщикНастроекОтбор 6 + + <key>ru</key> + <value>Компоновщик настроек отбор</value> + true true @@ -150,10 +150,6 @@ ru Компоновщик настроек отбор группа все действия - - ru - Компоновщик настроек отбор группа все действия - КомпоновщикНастроекОтборГруппаВсеДействияExtendedTooltip 23 @@ -279,9 +275,6 @@ true true true - None - None - None true All false diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form index 768e90579..99e46825d 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form @@ -196,9 +196,6 @@ ВариантыНастроек.Picture - None - None - None true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form index e2463dccb..4c8bc20bc 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form @@ -7,6 +7,10 @@ КомпоновщикНастроекПользовательскиеНастройки 15 + + <key>ru</key> + <value>Компоновщик настроек пользовательские настройки</value> + true true @@ -130,9 +134,6 @@ Auto true true - None - None - None true All Show diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form index fdc1ee9a4..2fced402b 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form @@ -75,10 +75,6 @@ ru Доп регистрация действия - - ru - Доп регистрация действия - ДопРегистрацияДействияExtendedTooltip 56 @@ -95,7 +91,7 @@
          - Группа1 + ГруппаКомандыНастройки 44 НастройкиОтборов @@ -130,8 +126,16 @@ true + + <key>ru</key> + <value>Команды настройки</value> + + + ru + Команда настройки + - Группа1ExtendedTooltip + ГруппаКомандыНастройкиРасширеннаяПодсказка 59 Label true @@ -159,10 +163,6 @@ ru Доп регистрация командная панель - - ru - Доп регистрация командная панель - ДопРегистрацияКоманднаяПанельExtendedTooltip 55 @@ -185,6 +185,10 @@ ДополнительнаяРегистрация 1 + + <key>ru</key> + <value>Дополнительная регистрация</value> + true true @@ -460,9 +464,6 @@ true true true - None - None - None true @@ -641,11 +642,11 @@ <key>ru</key> - <value>Группа состав выгрузки</value> + <value>Состав выгрузки</value> ru - Группа состав выгрузки + Состав данных выгрузки true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl index c3fd1e834..1b1c41c1f 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl @@ -1,36 +1,6 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс - -// Возвращает технический отчет в виде табличного документа. -// Опирается на значения реквизитов "УзелИнформационнойБазы", "ДополнительнаяРегистрация". -// -// Параметры: -// СписокИменМетаданных - Массив - содержит строки с полными именами метаданных для ограничения запроса. -// Может быть коллекцией элементов с полем "ПолноеИмяМетаданных". -// Возвращаемое значение: -// ТабличныйДокумент - отчет. -// -Функция СформироватьТабличныйДокумент(СписокИменМетаданных = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ДанныеКомпоновки = ИнициализироватьКомпоновщик(СписокИменМетаданных); - - КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; - Макет = КомпоновщикМакета.Выполнить(ДанныеКомпоновки.СхемаКомпоновки, - ДанныеКомпоновки.КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанных")); - ВнешниеНаборыДанных = Новый Структура("ТаблицаМетаданныхСоставаУзла", ДанныеКомпоновки.ТаблицаМетаданныхСоставаУзла); - - Процессор = Новый ПроцессорКомпоновкиДанных; - Процессор.Инициализировать(Макет, ВнешниеНаборыДанных,, Истина); - - Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; - Вывод.УстановитьДокумент(Новый ТабличныйДокумент); - - Возврат Вывод.Вывести(Процессор); - -КонецФункции +#Область СлужебныеПроцедурыИФункции // Возвращает пользовательский отчет в виде табличного документа. // Опирается на значения реквизитов "УзелИнформационнойБазы", "ДополнительнаяРегистрация". @@ -121,6 +91,8 @@ // Параметры: // СписокИменМетаданных - Массив - полные имена метаданных для ограничения запроса. // Может быть коллекцией элементов с полем "ПолноеИмяМетаданных". +// Возвращаемое значение: +// ДеревоЗначений - двухуровневое дерево, первый уровень-вид метаданных, второй-объекты. // Функция СформироватьДеревоЗначений(СписокИменМетаданных = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -300,35 +272,27 @@ // Период - СтандартныйПериод - период для описания отбора. // Отбор - ОтборКомпоновкиДанных - отбор компоновки данных для описания. // ОписаниеПустогоОтбора - Строка - значение, возвращаемое в случае пустого отбора. +// Возвращаемое значение: +// Строка - представление периода и отбора. // Функция ПредставлениеОтбора(Период, Отбор, Знач ОписаниеПустогоОтбора = Неопределено) Экспорт Возврат ОбменДаннымиСервер.ПредставлениеОтбораДополненияВыгрузки(Период, Отбор, ОписаниеПустогоОтбора); КонецФункции -// Возвращает описание периода и отбора по реквизитам "ПериодОтбораВсехДокументов" и "КомпоновщикОтбораВсехДокументов". -// -// Параметры: -// ОписаниеПустогоОтбора - Строка - значение, возвращаемое в случае пустого отбора. -// -Функция ПредставлениеОтбораВсехДокументов(Знач ОписаниеПустогоОтбора = Неопределено) Экспорт - - Если ОписаниеПустогоОтбора = Неопределено Тогда - ОписаниеПустогоОтбора = ЗаголовокГруппыОтбораВсехДокументов(); - КонецЕсли; - - Возврат ПредставлениеОтбора("", КомпоновщикОтбораВсехДокументов, ОписаниеПустогоОтбора); -КонецФункции - // Возвращает описание детального отбора по реквизиту "ДополнительнаяРегистрация". // // Параметры: // ОписаниеПустогоОтбора - Строка - значение, возвращаемое в случае пустого отбора. +// Возвращаемое значение: +// Строка - представление детального отбора по реквизиту "ДополнительнаяРегистрация". // -Функция ПредставлениеДетальногоОтбора(Знач ОписаниеПустогоОтбора=Неопределено) Экспорт +Функция ПредставлениеДетальногоОтбора(Знач ОписаниеПустогоОтбора=Неопределено) Возврат ОбменДаннымиСервер.ПредставлениеДетальногоДополненияВыгрузки(ДополнительнаяРегистрация, ОписаниеПустогоОтбора); КонецФункции // Идентификатор служебной группы объектов метаданных "Все документы". +// Возвращаемое значение: +// Строка - идентификатор служебной группы объектов метаданных "Все документы". // Функция ИдентификаторВсехДокументов() Экспорт // Не должно пересекаться с полным именем метаданных. @@ -348,10 +312,11 @@ // Параметры: // ЭлементыПриемника - КоллекцияЭлементовОтбораКомпоновкиДанных - приемник. // ЭлементыИсточника - КоллекцияЭлементовОтбораКомпоновкиДанных - источник. -// СоответствиеПолей - Коллекция объектов КлючИЗначение, у которых. -// Ключ - исходный путь к данным поля, Значение - путь -// для результата. Например для замены полей типа. -// "Ссылка.Наименование" -> "ОбъектРегистрации.Наименование" +// СоответствиеПолей - Соответствие - определяет состав заменяемых полей отбора. +// * Ключ - исходный путь к данным поля. +// * Значение - путь для результата. +// Например для замены полей типа. +// "Ссылка.Наименование" -> "ОбъектРегистрации.Наименование". // надо передать Новый Структура("Ссылка", "ОбъектРегистрации"). // Процедура ДобавитьЗначенияОтбораКомпоновки(ЭлементыПриемника, ЭлементыИсточника, СоответствиеПолей = Неопределено) Экспорт @@ -395,7 +360,7 @@ // ЭлементСписка - найденный элемент. // Неопределено - если элемент не найден. // -Функция НайтиПоПредставлениюЭлементСписка(СписокЗначений, Представление) Экспорт +Функция НайтиПоПредставлениюЭлементСписка(СписокЗначений, Представление) Для Каждого ЭлементСписка Из СписокЗначений Цикл Если ЭлементСписка.Представление=Представление Тогда Возврат ЭлементСписка; @@ -496,8 +461,7 @@ // Сохраняет значения реквизитов текущего объекта в настройки с указанным представлением. // // Параметры: -// АдресВариантовНастроек - Строка, УникальныйИдентификатор -адрес во временном хранилище списка значений настроек. -// Представление: - Строка - представление настроек. +// Представление - Строка - представление настроек. // Процедура СохранитьТекущееВНастройки(Представление) Экспорт СписокВариантов = ПрочитатьСписокНастроек(); @@ -528,8 +492,7 @@ // Удаляет вариант настроек из списка. // // Параметры: -// АдресВариантовНастроек - Строка, УникальныйИдентификатор -адрес во временном хранилище списка значений настроек. -// Представление: - Строка - представление настроек. +// Представление - Строка - представление настроек. // Процедура УдалитьВариантНастроек(Представление) Экспорт СписокВариантов = ПрочитатьСписокНастроек(); @@ -597,10 +560,6 @@ Возврат ТаблицыСостава; КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - // Конструктор таблиц значений. Генерирует таблицу с колонками произвольного типа. // // Параметры: diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form index 465f6bf81..ff1a8d378 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form @@ -97,10 +97,6 @@ ru Без подменю - - ru - Без подменю - БезПодменюExtendedTooltip 12 @@ -262,10 +258,6 @@ ru Верхняя панель - - ru - Верхняя панель - ВерхняяПанельExtendedTooltip 9 diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl index c4f73e50f..f8952721f 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl @@ -114,8 +114,10 @@ КонецЕсли; Если ИспользоватьКэшРегистра Тогда + УстановитьПривилегированныйРежим(Истина); ЗаписьРегистра = РегистрыСведений.ПакетыИнформацииПриЗапуске.Получить(Новый Структура("Номер", 0)); ПакетыСтраниц = ЗаписьРегистра.Состав.Получить(); + УстановитьПривилегированныйРежим(Ложь); Если ПакетыСтраниц = Неопределено Тогда ИспользоватьКэшРегистра = Ложь; КонецЕсли; @@ -207,8 +209,10 @@ // Чтение пакета из регистра. Если ИспользоватьКэшРегистра Тогда Фильтр = Новый Структура("Номер", СтартовыйПакетСтраниц.НомерВРегистре); + УстановитьПривилегированныйРежим(Истина); ЗаписьРегистра = РегистрыСведений.ПакетыИнформацииПриЗапуске.Получить(Фильтр); ФайлыПакета = ЗаписьРегистра.Состав.Получить(); + УстановитьПривилегированныйРежим(Ложь); Иначе ФайлыПакета = Неопределено; КонецЕсли; @@ -315,8 +319,8 @@ ТекущаяСтрокаИндекс = НоваяСтрокаИндекс; - // Видимость и доступность. - Элементы.ФормаНазад.Доступность = (ТекущаяСтрокаИндекс > 0); + // Видимость / Доступность + Элементы.ФормаНазад.Доступность = (ТекущаяСтрокаИндекс > 0); Элементы.ФормаВперед.Доступность = (ТекущаяСтрокаИндекс < ИсторияПросмотра.Количество() - 1); // Установка веб содержимого и заголовка формы. diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form index 236667558..03f318de4 100644 --- a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form @@ -362,6 +362,10 @@ true + + <key>ru</key> + <value>Общая группа</value> + ОбщаяГруппаРасширеннаяПодсказка 58 @@ -501,12 +505,8 @@ <key>ru</key> - <value>Группа карта маршрута</value> + <value>Карта маршрута</value> - - ru - Группа карта маршрута - ГруппаКартаМаршрутаРасширеннаяПодсказка 50 @@ -556,10 +556,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 44 diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl index 344eddaed..00193e3fc 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl @@ -11,8 +11,8 @@ #Область ЭкспортныеСвойства // Функция-свойство: результат выполнения обмена данными. -// -// Тип: ПеречислениеСсылка.РезультатыВыполненияОбмена +// Возвращаемое значение: +// ПеречислениеСсылка.РезультатыВыполненияОбмена - результат выполнения обмена данными. // Функция РезультатВыполненияОбмена() Экспорт @@ -31,7 +31,8 @@ // Функция-свойство: результат выполнения обмена данными. // -// Тип: Строка +// Возвращаемое значение: +// Строка - результат выполнения обмена данными. // Функция РезультатВыполненияОбменаСтрокой() Экспорт @@ -42,7 +43,8 @@ // Функция-свойство: количество объектов, которые были загружены. // -// Тип: Число +// Возвращаемое значение: +// Число - количество объектов, которые были загружены. // Функция СчетчикЗагруженныхОбъектов() Экспорт @@ -56,7 +58,8 @@ // Функция-свойство: количество объектов, которые были выгружены. // -// Тип: Число +// Возвращаемое значение: +// Число - количество объектов, которые были выгружены. // Функция СчетчикВыгруженныхОбъектов() Экспорт @@ -70,7 +73,8 @@ // Функция-свойство: строка, которая содержит сообщение об ошибке при обмене данными. // -// Тип: Строка +// Возвращаемое значение: +// Строка - сообщение об ошибке при обмене данными. // Функция СтрокаСообщенияОбОшибке() Экспорт @@ -80,7 +84,8 @@ // Функция-свойство: флаг ошибки выполнения обмена данными. // -// Тип: Булево +// Возвращаемое значение: +// Булево - флаг ошибки выполнения обмена данными. // Функция ФлагОшибки() Экспорт @@ -90,7 +95,8 @@ // Функция-свойство: номер сообщения обмена данными. // -// Тип: Число +// Возвращаемое значение: +// Число - номер сообщения обмена данными. // Функция НомерСообщения() Экспорт @@ -100,7 +106,8 @@ // Функция-свойство: таблица значений со статистической и дополнительной информацией о входящем сообщении обмена. // -// Тип: ТаблицаЗначений +// Возвращаемое значение: +// ТаблицаЗначений - содержит статистическую и дополнительную информацию о входящем сообщении обмена. // Функция ТаблицаДанныхЗаголовкаПакета() Экспорт @@ -114,7 +121,8 @@ // Функция-свойство: соответствие с таблицами данных входящего сообщения обмена. // -// Тип: Соответствие +// Возвращаемое значение: +// Соответствие - содержит таблицы данных входящего сообщения обмена. // Функция ТаблицыДанныхСообщенияОбмена() Экспорт @@ -134,7 +142,7 @@ // -- Все объекты выгружаются в один файл. // // Параметры: -// +// ОбработкаДляЗагрузкиДанных - ОбработкаОбъект.КонвертацияОбъектовXDTO - обработка для загрузки в COM-соединении. Процедура ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных = Неопределено) Экспорт ПолеОбработкаДляЗагрузкиДанных = ОбработкаДляЗагрузкиДанных; @@ -154,7 +162,7 @@ КомпонентыОбмена.XMLСхема = ФорматОбмена; КомпонентыОбмена.МенеджерОбмена = ОбменДаннымиXDTOСервер.МенеджерОбменаВерсииФормата( - УзелДляОбмена, КомпонентыОбмена.ВерсияФорматаОбмена); + КомпонентыОбмена.ВерсияФорматаОбмена, УзелДляОбмена); КомпонентыОбмена.ТаблицаПравилаРегистрацииОбъектов = ОбменДаннымиXDTOСервер.ПравилаРегистрацииОбъектов(УзелДляОбмена); КомпонентыОбмена.СвойстваУзлаПланаОбмена = ОбменДаннымиXDTOСервер.СвойстваУзлаПланаОбмена(УзелДляОбмена); @@ -200,6 +208,7 @@ Если ЭтоОбменЧерезВнешнееСоединение() Тогда ОбработкаДляЗагрузкиДанных().ИмяФайлаОбмена = ИмяВременногоФайла; ОбработкаДляЗагрузкиДанных().ВыполнитьЗагрузкуДанных(); + УдалитьФайлы(ИмяВременногоФайла); КонецЕсли; КонецПроцедуры @@ -210,8 +219,6 @@ // Выполняет загрузку данных из файла сообщения обмена. // Данные загружаются в информационную базу. -// -// Параметры: // Процедура ВыполнитьЗагрузкуДанных() Экспорт @@ -284,14 +291,13 @@ // Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов. // // Параметры: -// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - -// Строка. -// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: -// ТаблицыДляЗагрузки = Новый Массив; -// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); +// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - Строка +// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: +// ТаблицыДляЗагрузки = Новый Массив; +// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); // -// Список всех типов, которые содержаться в текущем сообщении обмена -// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена(). +// Список всех типов, которые содержаться в текущем сообщении обмена +// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена(). // Процедура ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки) Экспорт @@ -342,7 +348,7 @@ // - собирается информация о типах объектов и их количестве. // // Параметры: -// Нет. +// ПараметрыАнализа - Структура - Не используется, оставлен для целей совместимости. // Процедура ВыполнитьАнализСообщенияОбмена(ПараметрыАнализа = Неопределено) Экспорт @@ -421,14 +427,13 @@ // Выполняет загрузку данных из файла сообщения обмена в Таблицу значений только заданных типов объектов. // // Параметры: -// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - -// Строка. -// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: -// ТаблицыДляЗагрузки = Новый Массив; -// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); +// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - Строка +// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: +// ТаблицыДляЗагрузки = Новый Массив; +// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); // -// Список всех типов, которые содержаться в текущем сообщении обмена -// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена(). +// Список всех типов, которые содержаться в текущем сообщении обмена +// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена(). // Процедура ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки) Экспорт @@ -493,7 +498,7 @@ ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта); // Получаем описание всех полей объекта метаданного из конфигурации. - ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, "Имя, Тип"); + ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ОписаниеСвойствОбъекта(ОбъектМетаданных, "Имя, Тип"); Для Каждого ОписаниеСвойства Из ТаблицаОписанияСвойствОбъекта Цикл diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl index 4ec35d027..a185b6d36 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -206,10 +206,10 @@ // не является ошибкой проверки конфигурации. // // Параметры: -// Значение - значение перечисления. +// Значение - ПеречислениеСсылка - значение перечисления. // // Возвращаемое значение: -// Строка - имя переданного значения перечисления. +// Строка - Строка - имя переданного значения перечисления. // Функция одИмяЗначенияПеречисления(Значение) Экспорт @@ -242,17 +242,25 @@ // Производит выгрузку объекта в соответствии с указанным правилом конвертации. // // Параметры: -// Источник - произвольный источник данных. +// Источник - Произвольный -произвольный источник данных. // Приемник - xml-узел объекта приемника. -// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// ВходящиеДанные - Произвольный - вспомогательные данные, передаваемые правилу // для выполнения конвертации. -// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// ИсходящиеДанные - Произвольный - произвольные вспомогательные данные, передаваемые правилам // конвертации свойств. -// ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка. +// ИмяПКО - Строка - имя правила конвертации, согласно которому осуществляется выгрузка. // УзелСсылки - xml-узел ссылки объекта приемника. -// ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется +// ТолькоПолучитьУзелСсылки - Булево - Если Истина, то выгрузка объекта не производится, только формируется // xml-узел ссылки. -// ПКО - ссылка на правило конвертации. +// ПКО - СтрокаТаблицыЗначений - ссылка на правило конвертации. +// ВыгружатьСсылкиУПодчиненныхОбъектов - булево - если Истина то выгружаются ссылки у подчиненных объектов. +// ВыгрузкаСтрокиНабораЗаписейРегистра - булево - если Истина то происходит выгрузка строки набора записей. +// УзелПредка - xml-узел предка объекта приемника. +// ИмяКонстантыДляВыгрузки - строка - значение, которое следует записать в атрибут ИмяКонстанты. +// ЭтоВыгружаетсяОбъект - булево - признак того что выгружается объект. +// ЭтоПравилоСГлобальнойВыгрузкойОбъектов - булево - признак глобальной выгрузки объектов. +// НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные - булево - не используется. +// СтекВыгрузкиОбъекта - массив - содержит сведения о вышестоящих объектах выгрузки. // // Возвращаемое значение: // xml-узел ссылки или значение приемника. @@ -280,7 +288,7 @@ Если ПКО = Неопределено Тогда - ЗП = ПолучитьСтруктуруЗаписиПротокола(45); + ЗП = ЗаписьПротоколаОбмена(45); ЗП.Объект = Источник; ЗП.ТипОбъекта = ТипЗнч(Источник); @@ -362,23 +370,11 @@ КлючВыгружаемыхДанных = ИмяПКО; - Если ЗначениеЗаполнено(ИмяТипа) Тогда - - ЭтоНеСсылочныйТип = ИмяТипа = "Константы" - Или ИмяТипа = "РегистрСведений" - Или ИмяТипа = "РегистрНакопления" - Или ИмяТипа = "РегистрБухгалтерии" - Или ИмяТипа = "РегистрРасчета"; - - Иначе - - Если ТипЗнч(Источник) = Тип("Структура") Тогда - ЭтоНеСсылочныйТип = Не Источник.Свойство("Ссылка"); - Иначе - ЭтоНеСсылочныйТип = Истина; - КонецЕсли; - - КонецЕсли; + ЭтоНеСсылочныйТип = ИмяТипа = "Константы" + ИЛИ ИмяТипа = "РегистрСведений" + ИЛИ ИмяТипа = "РегистрНакопления" + ИЛИ ИмяТипа = "РегистрБухгалтерии" + ИЛИ ИмяТипа = "РегистрРасчета"; Если ЭтоНеСсылочныйТип ИЛИ ПустаяСтрока(ИмяТипа) Тогда @@ -620,7 +616,7 @@ И СтруктураСвойств.ВозможенПоискПоПредопределенным Тогда Попытка - ИмяПредопределенногоИсточник = ОбщегоНазначения.ИмяПредопределенного(СсылкаНаИсточник); + ИмяПредопределенногоИсточник = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаИсточник, "ИмяПредопределенныхДанных"); Исключение ИмяПредопределенногоИсточник = ""; КонецПопытки; @@ -660,7 +656,7 @@ И СтрНайти(ПКО.Приемник, "ПеречислениеСсылка.") > 0 Тогда // Записываем ошибку в протокол выполнения. - ЗП = ПолучитьСтруктуруЗаписиПротокола(); + ЗП = ЗаписьПротоколаОбмена(); ЗП.ИмяПКО = ИмяПКО; ЗП.Значение = Источник; ЗП.ТипЗначения = СтруктураСвойств.ТипСсылкиСтрокой; @@ -757,7 +753,7 @@ Если УзелСсылки = Неопределено Тогда // Записываем ошибку в протокол выполнения. - ЗП = ПолучитьСтруктуруЗаписиПротокола(); + ЗП = ЗаписьПротоколаОбмена(); ЗП.ИмяПКО = ИмяПКО; ЗП.Значение = Источник; ЗП.ТипЗначения = ТипЗнч(Источник); @@ -1056,6 +1052,16 @@ // Выгружает регистр, вызывая правила ПередВыгрузкой и ПослеВыгрузки. // +// Параметры: +// НаборЗаписейДляВыгрузки - НаборЗаписейРегистра - также может быть Структура, содержащая отбор. +// Правило - СтрокаТаблицыЗначений - таблицы правил конвертации объектов. +// ВходящиеДанные - Произвольный - входящие данные для правила конвертации. +// НеВыгружатьОбъектыСвойствПоСсылкам - Булево - признак для выгрузки свойств по ссылкам. +// ИмяПКО - Строка - имя правила конвертации. +// +// Возвращаемое значение: +// Булево - признак успешной выгрузки. +// Функция ВыгрузкаРегистра(НаборЗаписейДляВыгрузки, Правило = Неопределено, ВходящиеДанные = Неопределено, @@ -1090,7 +1096,17 @@ // Формирует результат запроса для выгрузки очистки данных. // -Функция ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, +// Параметры: +// Свойства - Структура - содержащая свойства объекта. +// ИмяТипа - Строка - имя типа объекта. +// ВыборкаДляОчисткиДанных - Булево - признак передачи выборки для очистки. +// УдалятьОбъектыНепосредственно - Булево - признак необходимости непосредственного удаления. +// ВыбиратьВсеПоля - Булево - признак необходимости выбора всех полей. +// +// Возвращаемое значение: +// РезультатЗапроса либо Неопределено - результат выполнения запроса для выгрузки очистки данных. +// +Функция РезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт СтрокаРазрешения = ?(ВыгружатьТолькоРазрешенные, " РАЗРЕШЕННЫЕ ", ""); @@ -1201,10 +1217,20 @@ // Формирует выборку для выгрузки очистки данных. // -Функция ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, +// Параметры: +// Свойства - Структура - содержащая свойства объекта. +// ИмяТипа - Строка - имя типа объекта. +// ВыборкаДляОчисткиДанных - Булево - признак передачи выборки для очистки. +// УдалятьОбъектыНепосредственно - Булево - признак необходимости непосредственного удаления. +// ВыбиратьВсеПоля - Булево - признак необходимости выбора всех полей. +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса либо Неопределено - сформированная выборка для очистки данных. +// +Функция ВыборкаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт - РезультатЗапроса = ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + РезультатЗапроса = РезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, ВыборкаДляОчисткиДанных, УдалятьОбъектыНепосредственно, ВыбиратьВсеПоля); Если РезультатЗапроса = Неопределено Тогда @@ -1221,7 +1247,7 @@ // Выгружает данные по указанному правилу. // // Параметры: -// Правило - ссылка на правило выгрузки данных. +// Правило - СтрокаТаблицыЗначений - ссылка на правило выгрузки данных. // Процедура ВыгрузитьДанныеПоПравилу(Правило) Экспорт @@ -1279,7 +1305,7 @@ // Стандартная выборка с отбором. Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" И Правило.ИспользоватьОтбор Тогда - Выборка = ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило); + Выборка = ВыборкаДляВыгрузкиСОграничениями(Правило); Пока Выборка.Следующий() Цикл ВыгрузкаОбъектаВыборки(Выборка.Ссылка, Правило, , ИсходящиеДанные); @@ -1313,7 +1339,7 @@ КонецЕсли; - Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, , , ВыбиратьВсеПоля); + Выборка = ВыборкаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, , , ВыбиратьВсеПоля); Если Выборка = Неопределено Тогда Возврат; @@ -1339,7 +1365,7 @@ Если ВыборкаДанных <> Неопределено Тогда - Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + Выборка = ВыборкаДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); Если Выборка <> Неопределено Тогда @@ -1393,7 +1419,12 @@ // Выгружает регистр по отбору. // // Параметры: -// НаборЗаписейДляВыгрузки - Структура или НаборЗаписей - Отбор. +// НаборЗаписейДляВыгрузки - Структура - содержащая отбор, или НаборЗаписей регистра. +// Правило - СтрокаТаблицыЗначений - из правил конвертации объектов. +// ВходящиеДанные - Произвольный - входящие данные для правила конвертации. +// НеВыгружатьОбъектыПоСсылкам - булево - признак для выгрузки свойств по ссылкам.. +// ИмяПКО - строка - имя правила конвертации. +// ПравилоВыгрузкиДанных - СтрокаТаблицыЗначений - из таблицы правил выгрузки данных. // Процедура ВыгрузитьРегистр(НаборЗаписейДляВыгрузки, Правило = Неопределено, @@ -1549,7 +1580,7 @@ // Создает в файле обмена запись об удалении объекта. // // Параметры: -// Ссылка - Ссылка на удаляемый объект. +// Ссылка - СправочникСсылка, ДокументСсылка и т.п.: удаляемый объект. // ТипПриемника - Строка - Содержит строковое представление типа приемника. // ТипИсточника - Строка - Содержит строковое представление типа источника. // @@ -1571,7 +1602,7 @@ // Регистрирует объект, созданный при выгрузке. // // Параметры: -// Ссылка - Ссылка на регистрируемый объект. +// Ссылка - СправочникСсылка, ДокументСсылка и т.п.: регистрируемый объект. // Процедура ЗарегистрироватьОбъектСозданныйПриВыгрузке(Ссылка) Экспорт @@ -1591,9 +1622,9 @@ // а также даты этих документов для предварительной сортировки. // // Возвращаемое значение: -// Таблица значений, колонки: -// ДокументСсылка - ссылка, ссылка на загруженный документ требующий отложенного проведения; -// ДатаДокумента - дата, дата загруженного документа для предварительной сортировки таблицы. +// ТаблицаЗначений - содержит ссылки на документы для отложенного проведения. Колонки: +// * ДокументСсылка - ДокументСсылка - ссылка на загруженный документ требующий отложенного проведения; +// * ДатаДокумента - Дата - дата загруженного документа для предварительной сортировки таблицы. // Функция ДокументыДляОтложенногоПроведения() Экспорт @@ -1625,9 +1656,9 @@ // который необходимо провести и дату документа для предварительной сортировки. // // Параметры: -// СсылкаНаОбъект - Ссылка, объект, который необходимо провести отложенно; -// ДатаОбъекта - Дата, дата объекта; -// ДополнительныеСвойства - Структура, дополнительные свойства записываемого объекта. +// СсылкаНаОбъект - ДокументСсылка - объект, который необходимо провести отложенно. +// ДатаОбъекта - Дата - дата документа; +// ДополнительныеСвойства - Структура - дополнительные свойства записываемого объекта. // Процедура ДобавитьОбъектДляОтложенногоПроведения(СсылкаНаОбъект, ДатаОбъекта, ДополнительныеСвойства) Экспорт @@ -1643,8 +1674,10 @@ // Записывает объект в информационную базу. // // Параметры: -// Объект - Записываемый объект. +// Объект - СправочникОбъект, ДокументОбъект и т.п.: записываемый объект. // Тип - Строка - Тип объекта строкой. +// ЗаписатьОбъект - булево, признак того что объект был записан. +// ОтправкаНазад - булево. // Процедура ЗаписатьОбъектВИБ(Объект, Тип, ЗаписатьОбъект = Ложь, Знач ОтправкаНазад = Ложь) Экспорт @@ -1653,17 +1686,26 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() - И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) - И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Попытка изменения неразделенных данных (%1) в разделенном сеансе.'"); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, Объект.Метаданные().ПолноеИмя()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя()); + Иначе + ЭтоРазделенныйОбъектМетаданных = Ложь; + КонецЕсли; - ЗаписатьВПротоколВыполнения(СтрокаСообщенияОбОшибке,, Ложь,,,, Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями); + Если Не ЭтоРазделенныйОбъектМетаданных Тогда - Возврат; + СтрокаСообщенияОбОшибке = НСтр("ru = 'Попытка изменения неразделенных данных (%1) в разделенном сеансе.'"); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, Объект.Метаданные().ПолноеИмя()); + + ЗаписатьВПротоколВыполнения(СтрокаСообщенияОбОшибке,, Ложь,,,, Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями); + + Возврат; + + КонецЕсли; КонецЕсли; @@ -1706,8 +1748,9 @@ // Отменяет проведение объекта в информационной базе. // // Параметры: -// Объект - Объект для отмены проведения. +// Объект - ДокументОбъект - документ для отмены проведения. // Тип - Строка - Тип объекта строкой. +// ЗаписатьОбъект - булево - признак того что объект был записан. // Процедура ОтменитьПроведениеОбъектаВИБ(Объект, Тип, ЗаписатьОбъект = Ложь) Экспорт @@ -1758,7 +1801,7 @@ // Устанавливает пометку удаления. // // Параметры: -// Объект - Объект для установки пометки. +// Объект - СправочникОбъект, ДокументОбъект и т.п.: объект для установки пометки. // ПометкаУдаления - Булево - Флаг пометки удаления. // ИмяТипаОбъекта - Строка - Тип объекта строкой. // @@ -1808,8 +1851,8 @@ // если не было ошибок. // // Параметры: -// Предупреждение - Строка. Текст предупреждения, который надо зарегистрировать. -// Информация, предупреждения и ошибки, возникающие в процессе обмена данными регистрируются в журнале регистрации. +// Предупреждение - Строка - Текст предупреждения, который надо зарегистрировать. +// Информация, предупреждения и ошибки, возникающие в процессе обмена данными регистрируются в журнале регистрации. // Процедура ЗарегистрироватьПредупреждение(Предупреждение) Экспорт @@ -1817,11 +1860,12 @@ КонецПроцедуры -// Устанавливает состояние пометки у подчиненных строк строки дерева значений -// в зависимости от пометки текущей строки. +// Устанавливает состояние пометки у подчиненных строк строки дерева значений. +// В зависимости от пометки текущей строки. // // Параметры: -// ТекСтрока - Строка дерева значений. +// ТекСтрока - СтрокаДереваЗначений - у элементов которой следует установить пометки. +// Реквизит - Строка - имя реквизита дерева который отвечает за пометку. // Процедура УстановитьПометкиПодчиненных(ТекСтрока, Реквизит) Экспорт @@ -1852,6 +1896,52 @@ #КонецОбласти +#Область УстаревшиеПроцедурыИФункции + +// Устарела: Следует использовать функцию РезультатЗапросаДляВыгрузкиОчисткиДанных +// Формирует результат запроса для выгрузки очистки данных. +// +// Параметры: +// Свойства - Структура - содержащая свойства объекта. +// ИмяТипа - Строка - имя типа объекта. +// ВыборкаДляОчисткиДанных - Булево - признак передачи выборки для очистки. +// УдалятьОбъектыНепосредственно - Булево - признак необходимости непосредственного удаления. +// ВыбиратьВсеПоля - Булево - признак необходимости выбора всех полей. +// +// Возвращаемое значение: +// РезультатЗапроса либо Неопределено - результат выполнения запроса для выгрузки очистки данных. +// +Функция ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + Возврат РезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных, УдалятьОбъектыНепосредственно, ВыбиратьВсеПоля); + +КонецФункции + +// Устарела: Следует использовать функцию ВыборкаДляВыгрузкиОчисткиДанных +// Формирует выборку для выгрузки очистки данных. +// +// Параметры: +// Свойства - Структура - содержащая свойства объекта. +// ИмяТипа - Строка - имя типа объекта. +// ВыборкаДляОчисткиДанных - Булево - признак передачи выборки для очистки. +// УдалятьОбъектыНепосредственно - Булево - признак необходимости непосредственного удаления. +// ВыбиратьВсеПоля - Булево - признак необходимости выбора всех полей. +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса либо Неопределено - сформированная выборка для очистки данных. +// +Функция ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + Возврат ВыборкаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных, УдалятьОбъектыНепосредственно, ВыбиратьВсеПоля); + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -2007,15 +2097,15 @@ #Область ВыгрузкаДанных -// Выполняет выгрузку данных +// Выполняет выгрузку данных. // -- Все объекты выгружаются в один файл. // -- В заголовок файла выгружаются: -// - правила обмена -// - информация о типах данных +// - правила обмена. +// - информация о типах данных. // - данные по обмену (имя плана обмена, коды узлов, номера сообщений (квитирование)). // // Параметры: -// +// ОбработкаДляЗагрузкиДанных - ОбработкаОбъект.КонвертацияОбъектовИнформационныхБаз в COM-соединении. Процедура ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных = Неопределено) Экспорт УстановитьФлагОшибки(Ложь); @@ -2781,7 +2871,7 @@ // Возвращаемое значение: // СтрокаИнформации - Строка - строка с информацией о правилах. // -Функция ПолучитьИнформациюОПравилах(ЭтоПравилаКорреспондента = Ложь) Экспорт +Функция ИнформацияОПравилах(ЭтоПравилаКорреспондента = Ложь) Экспорт // Возвращаемое значение функции. СтрокаИнформации = ""; @@ -2796,8 +2886,8 @@ СтрокаИнформации = НСтр("ru = 'Правила конвертации этой информационной базы (%1) от %2'"); КонецЕсли; - ПредставлениеКонфигурацииИсточника = ПолучитьПредставлениеКонфигурацииИзПравилОбмена("Источника"); - ПредставлениеКонфигурацииПриемника = ПолучитьПредставлениеКонфигурацииИзПравилОбмена("Приемника"); + ПредставлениеКонфигурацииИсточника = ПредставлениеКонфигурацииИзПравилОбмена("Источника"); + ПредставлениеКонфигурацииПриемника = ПредставлениеКонфигурацииИзПравилОбмена("Приемника"); Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаИнформации, ПредставлениеКонфигурацииИсточника, @@ -3116,7 +3206,7 @@ Если Результат = Неопределено Тогда - Результат = ОбщегоНазначения.ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, "Имя"); + Результат = ОбщегоНазначения.ОписаниеСвойствОбъекта(ОбъектМетаданных, "Имя"); ТаблицыОписанийСвойствОбъектов().Вставить(Результат); @@ -3129,12 +3219,9 @@ Если ТипЗнч(ПолеПравилаРегистрацииОбъектов) <> Тип("ТаблицаЗначений") Тогда - ПравилаРегистрацииОбъектов = ОбменДаннымиВызовСервера.ПараметрыСеансаПравилаРегистрацииОбъектов().Получить(); - - Отбор = Новый Структура; - Отбор.Вставить("ИмяПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); - - ПолеПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(Отбор, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага"); + ПравилаРегистрацииОбъектов = ОбменДаннымиСобытия.ПравилаРегистрацииОбъектовПланаОбмена( + ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); + ПолеПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага"); ПолеПравилаРегистрацииОбъектов.Индексы.Добавить("ОбъектМетаданныхИмя"); КонецЕсли; @@ -3199,7 +3286,7 @@ КонецФункции -Функция ПолучитьСтроковыйНомерБезПрефиксов(Номер) +Функция СтроковыйНомерБезПрефиксов(Номер) НомерБезПрефиксов = ""; Сч = СтрДлина(Номер); @@ -3236,14 +3323,14 @@ // Возвращаемое значение: // Префикс строки // -Функция ПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") +Функция ПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") ЧисловаяЧасть = 0; Префикс = ""; Стр = СокрЛП(Стр); Длина = СтрДлина(Стр); - СтроковыйНомерБезПрефикса = ПолучитьСтроковыйНомерБезПрефиксов(Стр); + СтроковыйНомерБезПрефикса = СтроковыйНомерБезПрефиксов(Стр); ДлинаСтроковойЧасти = СтрДлина(СтроковыйНомерБезПрефикса); Если ДлинаСтроковойЧасти > 0 Тогда ЧисловаяЧасть = Число(СтроковыйНомерБезПрефикса); @@ -3281,7 +3368,7 @@ ВходящаяДлинаНомера = СтрДлина(Стр); ЧисловаяЧасть = ""; - Результат = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); + Результат = ПрефиксЧислоНомера(Стр, ЧисловаяЧасть); Результат = ?(ПустаяСтрока(Префикс), Результат, Префикс); @@ -3964,7 +4051,7 @@ // Возвращаемое значение: // Объект типа структура // -Функция ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") +Функция ЗаписьПротоколаОбмена(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") СтруктураОшибки = Новый Структура("ИмяПКО,ИмяПОД,Нпп,ГНпп,Источник,ТипОбъекта,Свойство,Значение,ТипЗначения,ПКО,ПКС,ПКГС,ПВД,ПОД,Объект,СвойствоПриемника,КонвертируемоеЗначение,Обработчик,ОписаниеОшибки,ПозицияМодуля,Текст,КСообщенияОбОшибках,УзелПланаОбмена"); @@ -4168,7 +4255,7 @@ Функция ЗаписатьИнформациюОбОшибкеВПротокол(КСообщенияОбОшибках, СтрокаОшибки, Объект, ТипОбъекта = Неопределено) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.Объект = Объект; Если ТипОбъекта <> Неопределено Тогда @@ -4183,7 +4270,7 @@ Процедура ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравилаОчисткиДанных, Объект = "", ИмяОбработчика = "") - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.ПОД = ИмяПравилаОчисткиДанных; Если Объект <> "" Тогда @@ -4205,7 +4292,7 @@ Процедура ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравила, Источник = "", ТипОбъекта, Объект = Неопределено, ИмяОбработчика) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.ИмяПКО = ИмяПравила; ЗП.ТипОбъекта = ТипОбъекта; ЗП.Обработчик = ИмяОбработчика; @@ -4232,7 +4319,7 @@ Процедура ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(КСообщенияОбОшибках, СтрокаОшибки, ПКО, Источник, ИмяОбработчика) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; Попытка @@ -4254,7 +4341,7 @@ Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КСообщенияОбОшибках, СтрокаОшибки, ПКО, ПКС, Источник = "", ИмяОбработчика = "", Значение = Неопределено) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКС = ПКС.Имя + " (" + ПКС.Наименование + ")"; @@ -4284,7 +4371,7 @@ Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПВД(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравила, ИмяОбработчика, Объект = Неопределено) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.ПВД = ИмяПравила; Если Объект <> Неопределено Тогда @@ -4303,7 +4390,7 @@ Функция ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(КСообщенияОбОшибках, СтрокаОшибки, ИмяОбработчика) - ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки); ЗП.Обработчик = ИмяОбработчика; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); Возврат СтрокаСообщенияОбОшибке; @@ -5064,7 +5151,7 @@ СтрокаТаблицы.ИмяЭлемента = ТекущаяСтрока; СтрокаТаблицы.КлючевыеПоляПоиска = СтрокаПоиска; - СтрокаТаблицы.МассивКлючевыхПолейПоиска = ПолучитьМассивИзСтроки(СтрокаПоиска); + СтрокаТаблицы.МассивКлючевыхПолейПоиска = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаПоиска); СтрокаТаблицы.Валидное = СтрокаТаблицы.МассивКлючевыхПолейПоиска.Количество() <> 0; КонецЦикла; @@ -5284,6 +5371,8 @@ ЗаписьXML.ЗаписатьКонецЭлемента(); + ТаблицаПравилКонвертации.Индексы.Добавить("Приемник"); + КонецПроцедуры // Осуществляет загрузку группы правил очистки данных в соответствии с форматом правил обмена. @@ -6298,7 +6387,7 @@ НужныВсеПоля = Не ПустаяСтрока(Правило.ПередУдалением); - Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, Истина, Правило.Непосредственно, НужныВсеПоля); + Выборка = ВыборкаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, Истина, Правило.Непосредственно, НужныВсеПоля); Пока Выборка.Следующий() Цикл @@ -6321,7 +6410,7 @@ Если ВыборкаДанных <> Неопределено Тогда - Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + Выборка = ВыборкаДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); Если Выборка <> Неопределено Тогда @@ -6705,7 +6794,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(78, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(78, ОписаниеОшибки()); ЗП.Обработчик = "ПослеЗагрузкиПараметров"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(78, ЗП); @@ -6731,7 +6820,6 @@ Иначе - Объект.УстановитьСсылкуНового(Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор)); НоваяСсылка = Неопределено; КонецЕсли; @@ -6776,7 +6864,7 @@ Объект.ПометкаУдаления = Ложь; // фиксируем событие в ЖР - ЗП = ПолучитьСтруктуруЗаписиПротокола(80); + ЗП = ЗаписьПротоколаОбмена(80); ЗП.ТипОбъекта = ТипОбъекта; ЗП.Объект = Строка(Объект); @@ -6798,16 +6886,20 @@ // Параметры: // Тип - тип создаваемого объекта. // СвойстваПоиска - Структура, содержащая устанавливаемые реквизиты нового объекта. +// Объект - Объект информационной базы, созданный в результате выполнения. +// ЗаписыватьОбъектСразуПослеСоздания - булево. +// НоваяСсылка - ссылка на созданный объект. +// УстанавливатьУОбъектаВсеСвойстваПоиска - Булево. +// НаборЗаписейРегистра - РегистрСведенийНаборЗаписей, который создан. // // Возвращаемое значение: -// Новый объект информационной базы. +// Созданный объект, либо Неопределено (если не установлен ЗаписыватьОбъектСразуПослеСоздания). // -Функция СоздатьНовыйОбъект(Тип, СвойстваПоиска, Объект = Неопределено, - ЗаписыватьОбъектСразуПослеСоздания = Истина, НоваяСсылка = Неопределено, - НПП = 0, ГНПП = 0, Правило = Неопределено, - ПараметрыОбъекта = Неопределено, УстанавливатьУОбъектаВсеСвойстваПоиска = Истина, +Функция СоздатьНовыйОбъект(Тип, СвойстваПоиска, Объект, + ЗаписыватьОбъектСразуПослеСоздания, НоваяСсылка = Неопределено, + УстанавливатьУОбъектаВсеСвойстваПоиска = Истина, НаборЗаписейРегистра = Неопределено) - + СвойстваМД = Менеджеры[Тип]; ИмяТипа = СвойстваМД.ИмяТипа; Менеджер = СвойстваМД.Менеджер; @@ -6999,8 +7091,7 @@ ИначеЕсли ИмяУзла = "Выражение" Тогда - Значение = Вычислить(одЗначениеЭлемента(ФайлОбмена, ТипСтрока, , Ложь)); - НаличиеСвойств = Истина; + Продолжить; ИначеЕсли ИмяУзла = "Пусто" Тогда @@ -7104,8 +7195,7 @@ И СоздаватьНовыйЭлементЕслиНеНайден Тогда Объект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, НайденныйИлиСозданныйОбъект, - НЕ РежимПоискаОсновногоОбъекта, НоваяСсылкаУникальногоИдентификатора, НПП, ГНПП, НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств), - ПараметрыОбъекта); + НЕ РежимПоискаОсновногоОбъекта, НоваяСсылкаУникальногоИдентификатора); Возврат Объект; @@ -7137,7 +7227,7 @@ КонецФункции -Функция ПолучитьТипСвойства() +Функция ТипСвойства() СтроковыйТипСвойства = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); Если ПустаяСтрока(СтроковыйТипСвойства) Тогда @@ -7151,9 +7241,9 @@ КонецФункции -Функция ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, ИмяСвойства) +Функция ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, ИмяСвойства) - ТипСвойства = ПолучитьТипСвойства(); + ТипСвойства = ТипСвойства(); Если ТипСвойства = Неопределено И ИнформацияОТипах <> Неопределено Тогда @@ -7201,7 +7291,7 @@ Иначе - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); КонецЕсли; @@ -7618,30 +7708,6 @@ КонецПроцедуры -Функция НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств) - - Если СтруктураСвойств <> Неопределено Тогда - - СтрокаПриемника = СтруктураСвойств.ТипСсылкиСтрокой; - - Если ПустаяСтрока(СтрокаПриемника) Тогда - Возврат Неопределено; - КонецЕсли; - - Для Каждого СтрокаПравила Из Правила Цикл - - Если СтрокаПравила.Значение.Приемник = СтрокаПриемника Тогда - Возврат СтрокаПравила.Значение; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - // Производит поиск объекта в информационной базе, если не найден создает новый. // // Параметры: @@ -8017,14 +8083,13 @@ Если ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда - СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); СсылкаНаОбъектФиктивная = Истина; ИначеЕсли НЕ НеСоздаватьОбъектЕслиНеНайден Тогда СсылкаНаОбъект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, СозданныйОбъект, - НЕ РежимПоискаОсновногоОбъекта, ИзвестнаяСсылкаУникальногоИдентификатора, НППСсылки, НППГлобальнойСсылки, - НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств), ПараметрыОбъекта, УстанавливатьУОбъектаВсеСвойстваПоиска); + НЕ РежимПоискаОсновногоОбъекта, ИзвестнаяСсылкаУникальногоИдентификатора, УстанавливатьУОбъектаВсеСвойстваПоиска); КонецЕсли; @@ -8070,7 +8135,7 @@ Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); ИмяПКО = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПКО"); - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства,,, ИмяПКО); @@ -8086,7 +8151,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(26, ОписаниеОшибки()); ЗП.ИмяПКО = ИмяПКО; ЗП.Объект = Объект; ЗП.ТипОбъекта = ТипЗнч(Объект); @@ -8130,7 +8195,7 @@ Перем КлючевыеПоляПоиска; Перем МассивКлючевыхПолейПоиска; - Результат = ПолучитьКлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска); + Результат = КлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска); Если Не Результат Тогда @@ -8232,7 +8297,7 @@ Текст = НСтр("ru = 'Имя табличной части: %1'"); - ЗП = ПолучитьСтруктуруЗаписиПротокола(83, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(83, ОписаниеОшибки()); ЗП.Объект = Объект; ЗП.ТипОбъекта = ТипЗнч(Объект); ЗП.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяТабличнойЧасти); @@ -8275,32 +8340,6 @@ КонецПроцедуры -Функция ПолучитьМассивИзСтроки(Знач СтрокаЭлементов) - - Результат = Новый Массив; - - СтрокаЭлементов = СтрокаЭлементов + ","; - - Пока Истина Цикл - - Поз = СтрНайти(СтрокаЭлементов, ","); - - Если Поз = 0 Тогда - Прервать; // выход - КонецЕсли; - - Элемент = Лев(СтрокаЭлементов, Поз - 1); - - Результат.Добавить(СокрЛП(Элемент)); - - СтрокаЭлементов = Сред(СтрокаЭлементов, Поз + 1); - - КонецЦикла; - - Возврат Результат; - -КонецФункции - Процедура ЗаполнитьКоллекциюФайлаОбмена(Объект, КоллекцияФайлаОбмена, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, ПараметрыОбъекта, МассивКлючевыхПолейПоиска, ИмяПоляСортировки) ИмяВетки = ИмяТабличнойЧасти + "ТабличнаяЧасть"; @@ -8338,7 +8377,7 @@ КонецПроцедуры -Функция ПолучитьКлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска) +Функция КлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска) Если ПКО = Неопределено Тогда Возврат Ложь; @@ -8469,7 +8508,7 @@ Иначе - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); КонецЕсли; @@ -8487,7 +8526,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(26, ОписаниеОшибки()); ЗП.ИмяПКО = ИмяПКО; ЗП.Объект = Запись; ЗП.ТипОбъекта = ТипЗнч(Запись); @@ -8520,7 +8559,7 @@ Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); ИмяПКО = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПКО"); - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); Если Имя = "Ключ" Тогда @@ -8719,7 +8758,7 @@ КонецПроцедуры -Функция ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка) +Функция ОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка) // Если объект создали, то работаем с ним, если нашли - получаем объект. Если СозданныйОбъект <> Неопределено Тогда @@ -8751,7 +8790,7 @@ Номер = ?(НПП <> 0, НПП, ГНПП); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Номер); - ЗП = ПолучитьСтруктуруЗаписиПротокола(); + ЗП = ЗаписьПротоколаОбмена(); Если Не ПустаяСтрока(ИмяПравила) Тогда @@ -8982,7 +9021,7 @@ НПП = одАтрибут(ФайлОбмена, ТипЧисло, "Нпп"); ИмяПравила = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПравила"); ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); - ПриоритетОбъектаОбмена = ПолучитьПриоритетОбъектаОбмена(ФайлОбмена); + ПриоритетОбъектаОбмена = ПриоритетОбъектаОбмена(ФайлОбмена); ЭтоПустойНабор = одАтрибут(ФайлОбмена, ТипБулево, "ПустойНабор"); Если Не ЗначениеЗаполнено(ЭтоПустойНабор) Тогда @@ -9129,7 +9168,7 @@ ИмяПКО = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПКО"); // Читаем и устанавливаем значение свойства. - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); СвойствоНеНайденоПоСсылке = Ложь; // Создавать нужно всегда @@ -9157,7 +9196,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(26, ОписаниеОшибки()); ЗП.ИмяПКО = ИмяПравила; ЗП.Источник = Источник; ЗП.Объект = Объект; @@ -9366,7 +9405,7 @@ КонецПроцедуры -Функция ПолучитьПриоритетОбъектаОбмена(ФайлОбмена) +Функция ПриоритетОбъектаОбмена(ФайлОбмена) СтрокаПриоритета = одАтрибут(ФайлОбмена, ТипСтрока, "ПриоритетОбъектаОбмена"); Если ПустаяСтрока(СтрокаПриоритета) Тогда @@ -9396,7 +9435,7 @@ ИмяПравила = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПравила"); НеЗамещатьОбъект = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); ПрефиксАвтонумерации = одАтрибут(ФайлОбмена, ТипСтрока, "ПрефиксАвтонумерации"); - ПриоритетОбъектаОбмена = ПолучитьПриоритетОбъектаОбмена(ФайлОбмена); + ПриоритетОбъектаОбмена = ПриоритетОбъектаОбмена(ФайлОбмена); ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); ТипОбъекта = Тип(ТипОбъектаСтрокой); @@ -9578,7 +9617,7 @@ Иначе - СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, , НППСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта,,НаборЗаписей); + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, , ,НаборЗаписей); КонецЕсли; @@ -9610,7 +9649,7 @@ // Читаем и устанавливаем значение свойства. - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); Значение = ПрочитатьСвойство(ТипСвойства,,, ИмяПКО); Если ЭтоПараметрДляОбъекта Тогда @@ -9626,7 +9665,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(26, ОписаниеОшибки()); ЗП.ИмяПКО = ИмяПравила; ЗП.НПП = НПП; ЗП.ГНПП = ГНПП; @@ -9682,12 +9721,12 @@ Иначе - Объект = ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка); - + Объект = ОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка); + Если Объект = Неопределено Тогда одПропустить(ФайлОбмена, "Объект"); - Прервать; + Прервать; КонецЕсли; @@ -9799,7 +9838,7 @@ Если Объект = Неопределено Тогда - СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, , НППСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта); + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь); КонецЕсли; @@ -10012,7 +10051,7 @@ ЗаписатьДокументВБезопасномРежиме(Объект, ТипОбъекта); КонецЕсли; - ЗП = ПолучитьСтруктуруЗаписиПротокола(25, СтрокаОписанияОшибки); + ЗП = ЗаписьПротоколаОбмена(25, СтрокаОписанияОшибки); ЗП.ИмяПКО = ИмяПравила; Если Не ПустаяСтрока(Источник) Тогда @@ -10070,6 +10109,7 @@ Если ИмяТипаОбъекта <> "Константы" Тогда Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); КонецЕсли; + ЗаписатьОбъектВИБ(Объект, ТипОбъекта, ЗаписатьОбъект, ОтправкаНазад); Если НЕ (ИмяТипаОбъекта = "РегистрСведений" @@ -10106,7 +10146,7 @@ Если Объект = Неопределено Тогда ОбъектНайден = Ложь; - Ссылка = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, , , НППСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта); + Ссылка = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Истина); КонецЕсли; @@ -10154,7 +10194,7 @@ #Область ПроцедурыВыгрузкиДанных -Функция ПолучитьНаборДвиженийДокумента(СсылкаНаДокумент, ВидИсточника, ИмяРегистра) +Функция НаборДвиженийДокумента(СсылкаНаДокумент, ВидИсточника, ИмяРегистра) Если ВидИсточника = "НаборДвиженийРегистраНакопления" Тогда @@ -10227,7 +10267,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(48, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(48, ОписаниеОшибки()); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -10333,7 +10373,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(49, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(49, ОписаниеОшибки()); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -10380,7 +10420,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(66, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(66, ОписаниеОшибки()); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -10413,7 +10453,7 @@ ИначеЕсли СтрНайти(ВидИсточника, "НаборДвижений") > 0 Тогда - КоллекцияОбъектов = ПолучитьНаборДвиженийДокумента(Источник, ВидИсточника, ПКГС.Источник); + КоллекцияОбъектов = НаборДвиженийДокумента(Источник, ВидИсточника, ПКГС.Источник); ИначеЕсли ПустаяСтрока(ПКГС.Источник) Тогда @@ -10638,7 +10678,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(49, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(49, ОписаниеОшибки()); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -12141,7 +12181,7 @@ КонецФункции -Функция ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило) +Функция ВыборкаДляВыгрузкиСОграничениями(Правило) ИмяМетаданных = Правило.ИмяОбъектаДляЗапроса; @@ -12160,7 +12200,7 @@ КонецФункции -Функция ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных) +Функция ВыборкаДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных) Выборка = Неопределено; @@ -12185,7 +12225,7 @@ КонецФункции -Функция ПолучитьСтрокуНабораКонстантДляВыгрузки(ТаблицаДанныхКонстантДляВыгрузки) +Функция СтрокаНабораКонстантДляВыгрузки(ТаблицаДанныхКонстантДляВыгрузки) СтрокаНабораКонстант = ""; @@ -12212,7 +12252,7 @@ Функция ВыгрузитьНаборКонстант(Правило, Свойства, ИсходящиеДанные, СтрокаИменНабораКонстант = "") Если СтрокаИменНабораКонстант = "" Тогда - СтрокаИменНабораКонстант = ПолучитьСтрокуНабораКонстантДляВыгрузки(Свойства.ПКО.Свойства); + СтрокаИменНабораКонстант = СтрокаНабораКонстантДляВыгрузки(Свойства.ПКО.Свойства); КонецЕсли; НаборКонстант = Константы.СоздатьНабор(СтрокаИменНабораКонстант); @@ -12279,7 +12319,7 @@ Если Менеджер = Неопределено ИЛИ Менеджер.ПКО = Неопределено Тогда - ЗП = ПолучитьСтруктуруЗаписиПротокола(45); + ЗП = ЗаписьПротоколаОбмена(45); ЗП.Объект = Ссылка; ЗП.ТипОбъекта = ТипЗнч(Ссылка); @@ -12298,7 +12338,7 @@ #Область ПроцедурыИФункцииКомпиляцииПравилОбменаВСтруктуру // возвращает структуру правил обмена. -Функция ПолучитьСтруктуруПравилОбмена(Источник) Экспорт +Функция ПравилаОбмена(Источник) Экспорт ЗагрузитьПравилаОбмена(Источник, "XMLФайл"); @@ -12310,7 +12350,7 @@ ТаблицаРеквизитовРегистрацииОбъектов = Неопределено; Иначе // Получаем таблицу реквизитов регистрации для механизма выборочной регистрации объектов. - ТаблицаРеквизитовРегистрацииОбъектов = ПолучитьТаблицуРеквизитовРегистрацииОбъектов(); + ТаблицаРеквизитовРегистрацииОбъектов = РеквизитыРегистрацииОбъектов(); КонецЕсли; // сохраняем запросы @@ -12354,7 +12394,7 @@ КонецФункции -Функция ПолучитьТаблицуРеквизитовРегистрацииОбъектов() +Функция РеквизитыРегистрацииОбъектов() ТаблицаРеквизитовРегистрации = ИнициализацияТаблицыРеквизитовРегистрации(); ТаблицаРезультат = ИнициализацияТаблицыРеквизитовРегистрации(); @@ -12410,7 +12450,7 @@ КонецФункции -Функция ПолучитьСтруктуруРеквизитовРегистрации(ТаблицаПКС) +Функция РеквизитыРегистрацииСвойств(ТаблицаПКС) СтруктураРеквизитовРегистрации = Новый Структура; @@ -12438,7 +12478,7 @@ КонецФункции -Функция ПолучитьСтруктуруРеквизитовРегистрацииПоМассивуСтрок(МассивСтрок) +Функция РеквизитыРегистрацииПоМассивуСтрок(МассивСтрок) СтруктураРезультат = Новый Структура; @@ -12458,7 +12498,7 @@ КонецФункции -Функция ПолучитьРеквизитыРегистрации(СтруктураРеквизитовРегистрации) +Функция РеквизитыРегистрации(СтруктураРеквизитовРегистрации) РеквизитыРегистрации = ""; @@ -12655,7 +12695,7 @@ СтрокаТаблицыРезультат.ИмяОбъекта = ИмяОбъекта; СтрокаТаблицыРезультат.ТипОбъектаСтрокой = ТипОбъектаСтрокой; СтрокаТаблицыРезультат.ИмяТабличнойЧасти = ИмяТабличнойЧасти; - СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации = ПолучитьСтруктуруРеквизитовРегистрации(ТаблицаСвойств); + СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации = РеквизитыРегистрацииСвойств(ТаблицаСвойств); КонецПроцедуры @@ -12667,8 +12707,8 @@ СтрокаТаблицы.ИмяОбъекта = МассивСтрок[0].ИмяОбъекта; СтрокаТаблицы.ТипОбъектаСтрокой = МассивСтрок[0].ТипОбъектаСтрокой; СтрокаТаблицы.ИмяТабличнойЧасти = МассивСтрок[0].ИмяТабличнойЧасти; - СтрокаТаблицы.СтруктураРеквизитовРегистрации = ПолучитьСтруктуруРеквизитовРегистрацииПоМассивуСтрок(МассивСтрок); - СтрокаТаблицы.РеквизитыРегистрации = ПолучитьРеквизитыРегистрации(СтрокаТаблицы.СтруктураРеквизитовРегистрации); + СтрокаТаблицы.СтруктураРеквизитовРегистрации = РеквизитыРегистрацииПоМассивуСтрок(МассивСтрок); + СтрокаТаблицы.РеквизитыРегистрации = РеквизитыРегистрации(СтрокаТаблицы.СтруктураРеквизитовРегистрации); КонецПроцедуры @@ -13053,7 +13093,7 @@ ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта); // Получаем описание всех полей объекта метаданного из конфигурации. - ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, "Имя, Тип"); + ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ОписаниеСвойствОбъекта(ОбъектМетаданных, "Имя, Тип"); Для Каждого ОписаниеСвойства Из ТаблицаОписанияСвойствОбъекта Цикл ТипыКолонки = Новый ОписаниеТипов(ОписаниеСвойства.Тип, "NULL"); @@ -13144,7 +13184,7 @@ СообщенияОбОшибках.Вставить(5, НСтр("ru = 'Ошибка открытия файла обмена'")); СообщенияОбОшибках.Вставить(6, НСтр("ru = 'Ошибка при загрузке правил обмена'")); СообщенияОбОшибках.Вставить(7, НСтр("ru = 'Ошибка формата правил обмена'")); - СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Не корректно указано имя файла для выгрузки данных'")); // не используется + СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Некорректно указано имя файла для выгрузки данных'")); // не используется СообщенияОбОшибках.Вставить(9, НСтр("ru = 'Ошибка формата файла обмена'")); СообщенияОбОшибках.Вставить(10, НСтр("ru = 'Не указано имя файла для выгрузки данных (Имя файла данных)'")); СообщенияОбОшибках.Вставить(11, НСтр("ru = 'Ссылка на несуществующий объект метаданных в правилах обмена'")); @@ -13636,7 +13676,7 @@ Процедура ВыполнитьОбработчик_Конвертация_ПослеЗагрузкиПравилОбмена() - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПослеЗагрузкиПравилОбмена); КонецПроцедуры @@ -13647,7 +13687,7 @@ ПараметрыОбработчика.Добавить(ФайлОбмена); ПараметрыОбработчика.Добавить(Отказ); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПередВыгрузкойДанных, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13661,7 +13701,7 @@ ПараметрыОбработчика.Добавить(Получатель); ПараметрыОбработчика.Добавить(УзелДляФоновогоОбмена); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПередПолучениемИзмененныхОбъектов, ПараметрыОбработчика); Получатель = ПараметрыОбработчика[0]; @@ -13674,7 +13714,7 @@ ПараметрыОбработчика = Новый Массив(); ПараметрыОбработчика.Добавить(ФайлОбмена); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПослеВыгрузкиДанных, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13693,7 +13733,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(Объект); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПередВыгрузкойОбъекта, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13717,7 +13757,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(УзелСсылки); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПослеВыгрузкиОбъекта, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13731,7 +13771,7 @@ Процедура ВыполнитьОбработчик_Конвертация_ПередКонвертациейОбъекта(ПараметрыОбработчика) - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПередКонвертациейОбъекта, ПараметрыОбработчика); КонецПроцедуры @@ -13742,7 +13782,7 @@ ПараметрыОбработчика.Добавить(Ссылка); ПараметрыОбработчика.Добавить(Отказ); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Конвертация.ИмяОбработчикаПередОтправкойИнформацииОбУдалении, ПараметрыОбработчика); Ссылка = ПараметрыОбработчика[0]; @@ -13756,7 +13796,7 @@ ПараметрыОбработчика.Добавить(ФайлОбмена); ПараметрыОбработчика.Добавить(Отказ); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПередЗагрузкойДанных, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13766,7 +13806,7 @@ Процедура ВыполнитьОбработчик_Конвертация_ПослеЗагрузкиДанных() - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПослеЗагрузкиДанных); КонецПроцедуры @@ -13789,7 +13829,7 @@ ПараметрыОбработчика.Добавить(РежимЗаписи); ПараметрыОбработчика.Добавить(РежимПроведения); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПередЗагрузкойОбъекта, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13820,7 +13860,7 @@ ПараметрыОбработчика.Добавить(ИмяТипаОбъекта); ПараметрыОбработчика.Добавить(ОбъектНайден); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПослеЗагрузкиОбъекта, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13840,7 +13880,7 @@ ПараметрыОбработчика.Добавить(Объект); ПараметрыОбработчика.Добавить(Отказ); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПриПолученииИнформацииОбУдалении, ПараметрыОбработчика); Объект = ПараметрыОбработчика[0]; @@ -13855,7 +13895,7 @@ ПараметрыОбработчика.Добавить(Отказ); ПараметрыОбработчика.Добавить(ПричинаОтказа); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, "Конвертация_ПослеЗагрузкиПараметров", ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13869,7 +13909,7 @@ ПараметрыОбработчика = Новый Массив(); ПараметрыОбработчика.Добавить(УзелОбменаЗагрузкаДанных); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Конвертация.ИмяОбработчикаПослеПолученияИнформацииОбУзлахОбмена, ПараметрыОбработчика); УзелОбменаЗагрузкаДанных = ПараметрыОбработчика[0]; @@ -13904,7 +13944,7 @@ ПараметрыОбработчика.Добавить(РежимПроведения); ПараметрыОбработчика.Добавить(НеСоздаватьЕслиНеНайден); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКО.ИмяОбработчикаПередВыгрузкой, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13945,7 +13985,7 @@ ПараметрыОбработчика.Добавить(Приемник); ПараметрыОбработчика.Добавить(УзелСсылки); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКО.ИмяОбработчикаПриВыгрузке, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -13979,7 +14019,7 @@ ПараметрыОбработчика.Добавить(Приемник); ПараметрыОбработчика.Добавить(УзелСсылки); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКО.ИмяОбработчикаПослеВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14010,7 +14050,7 @@ ПараметрыОбработчика.Добавить(Приемник); ПараметрыОбработчика.Добавить(УзелСсылки); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКО.ИмяОбработчикаПослеВыгрузкиВФайл, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14043,7 +14083,7 @@ ПараметрыОбработчика.Добавить(РежимЗаписи); ПараметрыОбработчика.Добавить(РежимПроведения); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПередЗагрузкой, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14070,7 +14110,7 @@ ПараметрыОбработчика.Добавить(НеЗамещатьОбъект); ПараметрыОбработчика.Добавить(ОбъектМодифицирован); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПриЗагрузке, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14094,7 +14134,7 @@ ПараметрыОбработчика.Добавить(ИмяТипаОбъекта); ПараметрыОбработчика.Добавить(ОбъектНайден); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПослеЗагрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14121,7 +14161,7 @@ ПараметрыОбработчика.Добавить(УстанавливатьУОбъектаВсеСвойстваПоиска); ПараметрыОбработчика.Добавить(СтрокаИменСвойствПоиска); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, ИмяОбработчика, ПараметрыОбработчика); НомерВариантаПоиска = ПараметрыОбработчика[0]; @@ -14162,7 +14202,7 @@ ПараметрыОбработчика.Добавить(НеЗамещать); ПараметрыОбработчика.Добавить(ВыгрузитьОбъект); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКС.ИмяОбработчикаПередВыгрузкой, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14213,7 +14253,7 @@ ПараметрыОбработчика.Добавить(ИмяПКОВидСубконто); ПараметрыОбработчика.Добавить(ВыгрузитьОбъект); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКС.ИмяОбработчикаПриВыгрузке, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14266,7 +14306,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(УзелСубконто); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКС.ИмяОбработчикаПослеВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14312,7 +14352,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(НеОчищать); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКГС.ИмяОбработчикаПередОбработкойВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14346,7 +14386,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(УзелКоллекцииОбъектов); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКГС.ИмяОбработчикаПередВыгрузкой, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14381,7 +14421,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(СтандартнаяОбработка); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКГС.ИмяОбработчикаПриВыгрузке, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14417,7 +14457,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(УзелОбъектаКоллекции); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКГС.ИмяОбработчикаПослеВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14450,7 +14490,7 @@ ПараметрыОбработчика.Добавить(УзелКоллекцииСвойств); ПараметрыОбработчика.Добавить(УзелКоллекцииОбъектов); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, ПКГС.ИмяОбработчикаПослеОбработкиВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14478,7 +14518,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(ВыборкаДанных); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Правило.ИмяОбработчикаПередОбработкой, ПараметрыОбработчика); Отказ = ПараметрыОбработчика[0]; @@ -14496,7 +14536,7 @@ ПараметрыОбработчика.Добавить(Правило); ПараметрыОбработчика.Добавить(ИсходящиеДанные); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Правило.ИмяОбработчикаПослеОбработки, ПараметрыОбработчика); ИмяПКО = ПараметрыОбработчика[0]; @@ -14517,7 +14557,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(Объект); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Правило.ИмяОбработчикаПередВыгрузкой, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14541,7 +14581,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(УзелСсылки); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаВыгрузки, Правило.ИмяОбработчикаПослеВыгрузки, ПараметрыОбработчика); ФайлОбмена = ПараметрыОбработчика[0]; @@ -14564,7 +14604,7 @@ ПараметрыОбработчика.Добавить(ИсходящиеДанные); ПараметрыОбработчика.Добавить(ВыборкаДанных); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПередОбработкой, ПараметрыОбработчика); Правило = ПараметрыОбработчика[0]; @@ -14583,7 +14623,7 @@ ПараметрыОбработчика.Добавить(УдалитьНепосредственно); ПараметрыОбработчика.Добавить(ВходящиеДанные); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПередУдалением, ПараметрыОбработчика); Правило = ПараметрыОбработчика[0]; @@ -14599,7 +14639,7 @@ ПараметрыОбработчика = Новый Массив(); ПараметрыОбработчика.Добавить(Правило); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, Правило.ИмяОбработчикаПослеОбработки, ПараметрыОбработчика); Правило = ПараметрыОбработчика[0]; @@ -14618,7 +14658,7 @@ ИмяОбработчика = "Параметры_[ИмяПараметра]_ПослеЗагрузкиПараметра"; ИмяОбработчика = СтрЗаменить(ИмяОбработчика, "[ИмяПараметра]", Имя); - РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта( + ОбщегоНазначения.ВыполнитьМетодОбъекта( ОбработкаЗагрузки, ИмяОбработчика, ПараметрыОбработчика); Имя = ПараметрыОбработчика[0]; @@ -14664,7 +14704,7 @@ КонецПроцедуры -Функция ПолучитьПредставлениеКонфигурацииИзПравилОбмена(ИмяОпределения) +Функция ПредставлениеКонфигурацииИзПравилОбмена(ИмяОпределения) ИмяКонфигурации = ""; Конвертация.Свойство("СинонимКонфигурации" + ИмяОпределения, ИмяКонфигурации); @@ -14919,7 +14959,7 @@ Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); - ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(Неопределено, Имя); + ТипСвойства = ТипСвойстваПоДополнительнымДанным(Неопределено, Имя); Значение = ПрочитатьСвойство(ТипСвойства); @@ -15214,7 +15254,7 @@ ИначеЕсли ИмяУзла = "ПравилаРегистрацииОбъектов" Тогда одПропустить(ПравилаОбмена); - // Алгоритмы, Запросы, Обработки. + // Алгоритмы / Запросы / Обработки ИначеЕсли ИмяУзла = "Алгоритмы" Тогда ЗагрузитьАлгоритмы(ПравилаОбмена, ЗаписьXML); @@ -16007,7 +16047,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(78, ОписаниеОшибки()); + ЗП = ЗаписьПротоколаОбмена(78, ОписаниеОшибки()); ЗП.Обработчик = "ПослеЗагрузкиПараметров"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(78, ЗП, Истина); @@ -16755,6 +16795,7 @@ // Получаем типы объектов метаданных, которые будут участвовать в выгрузке. ТаблицаПравилВыгрузкиИспользуемые = ТаблицаПравилВыгрузки.Скопировать(Новый Структура("Включить", Истина)); + ТаблицаПравилВыгрузкиИспользуемые.Индексы.Добавить("ОбъектВыборкиМетаданные"); Для Каждого СтрокаТаблицы Из ТаблицаПравилВыгрузкиИспользуемые Цикл diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl index 7c85e6a51..d3fd84dd7 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl @@ -603,21 +603,21 @@ Если КоличествоДублей = 0 Тогда Возврат; КонецЕсли; - - ЗаписатьВЖурнал = Истина; - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбнаруженииНеУникальностиПредопределенного"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл + ЗаписатьВЖурнал = Истина; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + Описание = ""; - Обработчик.Модуль.ПриОбнаруженииНеУникальностиПредопределенного( - ЗаписанныйОбъект, ЗаписатьВЖурнал, Отказ, ОписаниеОтказа); + МодульУправлениеДоступомСлужебный.ПриОбнаруженииНеУникальностиПредопределенного( + ЗаписанныйОбъект, ЗаписатьВЖурнал, Отказ, Описание); Если ЗначениеЗаполнено(Описание) Тогда ОписаниеОтказа = ОписаниеОтказа + Символы.ПС + СокрЛП(Описание) + Символы.ПС; КонецЕсли; - КонецЦикла; - + КонецЕсли; + Если ЗаписатьВЖурнал Тогда Если КоличествоДублей = 1 Тогда Шаблон = НСтр("ru = '(загружаемая ссылка: %1, ссылка дубля: %2)'"); diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form index 4b3a77b5c..0f3680459 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form @@ -225,12 +225,8 @@ <key>ru</key> - <value>Группа отправка статистики пояснение</value> + <value>Отправка статистики пояснение</value> - - ru - Группа отправка статистики пояснение - ГруппаОтправкаСтатистикиПояснениеРасширеннаяПодсказка 22 @@ -257,7 +253,7 @@ <key>ru</key> - <value>Группа отправка статистики</value> + <value>Отправка статистики</value> ГруппаОтправкаСтатистикиРасширеннаяПодсказка diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl index bcf22c535..33df15a03 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl @@ -21,7 +21,6 @@ ТекстПредупреждения = МакетДокумента.ПолучитьТекст(); ПодтверждениеВыбора = 0; // Пользователю требуется явно выбрать один из вариантов. Элементы.Примечание.Видимость = Параметры.ПоказыватьПредупреждениеОПерезапуске; - ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); // СтандартныеПодсистемы.ЦентрМониторинга @@ -47,12 +46,16 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + Если ИнформационнаяБазаФайловая - И СтрНайти(ПараметрЗапуска, "ВыполнитьОбновлениеИЗавершитьРаботу") > 0 Тогда + И СтрНайти(ПараметрЗапуска, "ВыполнитьОбновлениеИЗавершитьРаботу") > 0 Тогда + ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); Отказ = Истина; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); ПодключитьОбработчикОжидания("ПодтвердитьЛегальностьПолученияОбновления", 0.1, Истина); КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -99,7 +102,11 @@ &НаКлиенте Процедура ПодтвердитьЛегальностьПолученияОбновления() + + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + ВыполнитьОбработкуОповещения(ЭтотОбъект.ОписаниеОповещенияОЗакрытии, Истина); + КонецПроцедуры &НаСервереБезКонтекста @@ -142,4 +149,4 @@ ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); КонецПроцедуры -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ЗавершениеЗапросаРазрешений/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ЗавершениеЗапросаРазрешений/Module.bsl index 628c15efb..b372321f7 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ЗавершениеЗапросаРазрешений/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ЗавершениеЗапросаРазрешений/Module.bsl @@ -2,6 +2,7 @@ &НаКлиенте Перем РазрешитьЗакрытие; + &НаКлиенте Перем ОжиданиеЗавершено; diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form index d1df3af65..c23dba067 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form @@ -87,12 +87,8 @@ <key>ru</key> - <value>Группа декорации</value> + <value>Декорации</value> - - ru - Группа декорации - ГруппаДекорацииРасширеннаяПодсказка 2 @@ -151,12 +147,8 @@ <key>ru</key> - <value>Группа команды</value> + <value>Команды</value> - - ru - Группа команды - ГруппаКомандыРасширеннаяПодсказка 10 diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl index 5e128131f..2d89f8e5e 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl @@ -100,7 +100,7 @@ КонецЕсли; - Задание = ФоновыеЗадания.Выполнить("РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации", + Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьМетодКонфигурации", ПараметрыВызоваМетода, , НСтр("ru = 'Обработка запросов на использование внешних ресурсов...'")); diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form index 932f57581..f73daa153 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form @@ -98,10 +98,6 @@ ru Страница шапка при включении будут установлены следующие настройки в кластере - - ru - Страница шапка при включении будут установлены следующие настройки в кластере - СтраницаШапкаПриВключенииБудутУстановленыСледующиеНастройкиВКластереРасширеннаяПодсказка 253 @@ -201,10 +197,6 @@ ru Страница шапка требуется внести изменения в кластере - - ru - Страница шапка требуется внести изменения в кластере - СтраницаШапкаТребуетсяВнестиИзмененияВКластереРасширеннаяПодсказка 247 @@ -301,10 +293,6 @@ ru Страница шапка при восстановлении будут установлены следующие настройки в кластере - - ru - Страница шапка при восстановлении будут установлены следующие настройки в кластере - СтраницаШапкаПриВосстановленииБудутУстановленыСледующиеНастройкиВКластереРасширеннаяПодсказка 249 @@ -402,10 +390,6 @@ ru Страница шапка требуется отменить неактуальные разрешения в кластере - - ru - Страница шапка требуется отменить неактуальные разрешения в кластере - СтраницаШапкаТребуетсяОтменитьНеактуальныеРазрешенияВКластереРасширеннаяПодсказка 251 @@ -454,7 +438,7 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> ГруппаШапкаРасширеннаяПодсказка @@ -747,12 +731,8 @@ <key>ru</key> - <value>Группа ошибка версии COMСоединителя</value> + <value>Ошибка версии COM соединителя</value> - - ru - Группа ошибка версии COMСоединителя - ГруппаОшибкаВерсииCOMСоединителяРасширеннаяПодсказка 191 @@ -779,12 +759,8 @@ <key>ru</key> - <value>Группа описание ошибки</value> + <value>Описание ошибки</value> - - ru - Группа описание ошибки - ГруппаОписаниеОшибкиРасширеннаяПодсказка 164 @@ -812,7 +788,7 @@ <key>ru</key> - <value>Группа ошибка</value> + <value>Ошибка</value> ГруппаОшибкаРасширеннаяПодсказка @@ -989,10 +965,6 @@ ru Основные параметры - - ru - Основные параметры - ОсновныеПараметрыРасширеннаяПодсказка 160 @@ -1124,7 +1096,7 @@ <key>ru</key> - <value>Группа параметры подключения к кластеру COM</value> + <value>Параметры подключения к кластеру COM</value> ГруппаПараметрыПодключенияККластеруCOMРасширеннаяПодсказка @@ -1154,10 +1126,6 @@ ru Страница параметры подключения к кластеру COM - - ru - Страница параметры подключения к кластеру COM - СтраницаПараметрыПодключенияККластеруCOMРасширеннаяПодсказка 134 @@ -1284,7 +1252,7 @@ <key>ru</key> - <value>Группа параметры подключения к кластеру RAS</value> + <value>Параметры подключения к кластеру RAS</value> Ctrl+S @@ -1363,12 +1331,8 @@ <key>ru</key> - <value>Группа параметры подключения к кластеру</value> + <value>Параметры подключения к кластеру</value> - - ru - Группа параметры подключения к кластеру - ГруппаПараметрыПодключенияККластеруРасширеннаяПодсказка 127 @@ -1668,12 +1632,8 @@ <key>ru</key> - <value>Группа авторизация</value> + <value>Авторизация</value> - - ru - Группа авторизация - ГруппаАвторизацияРасширеннаяПодсказка 181 @@ -1827,7 +1787,7 @@ <key>ru</key> - <value>Группа страницы</value> + <value>Страницы</value> ГруппаСтраницыРасширеннаяПодсказка @@ -1886,10 +1846,6 @@ ru Командная панель слева - - ru - Командная панель слева - КоманднаяПанельСлеваРасширеннаяПодсказка 111 @@ -2022,10 +1978,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельРасширеннаяПодсказка 109 @@ -2054,10 +2006,6 @@ ru Страница действия - - ru - Страница действия - СтраницаДействияРасширеннаяПодсказка 210 @@ -2305,10 +2253,6 @@ ru Команды операция не поддерживается в веб клиенте - - ru - Команды операция не поддерживается в веб клиенте - КомандыОперацияНеПоддерживаетсяВВебКлиентеРасширеннаяПодсказка 283 @@ -2331,12 +2275,8 @@ <key>ru</key> - <value>Группа операция не поддерживается в веб клиенте подробности</value> + <value>Операция не поддерживается в веб клиенте подробности</value> - - ru - Группа операция не поддерживается в веб клиенте подробности - ГруппаОперацияНеПоддерживаетсяВВебКлиентеПодробностиРасширеннаяПодсказка 291 @@ -2364,12 +2304,8 @@ <key>ru</key> - <value>Группа операция не поддерживается в веб клиенте</value> + <value>Операция не поддерживается в веб клиенте</value> - - ru - Группа операция не поддерживается в веб клиенте - ГруппаОперацияНеПоддерживаетсяВВебКлиентеРасширеннаяПодсказка 289 @@ -2398,10 +2334,6 @@ ru Страница операция не поддерживается в веб клиенте - - ru - Страница операция не поддерживается в веб клиенте - СтраницаОперацияНеПоддерживаетсяВВебКлиентеРасширеннаяПодсказка 267 @@ -2427,10 +2359,6 @@ ru Страницы глобальный - - ru - Страницы глобальный - СтраницыГлобальныйРасширеннаяПодсказка 206 diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl index fdce1ca28..ff21adb02 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl @@ -50,7 +50,7 @@ ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ПараметрыАдминистрирования.ИмяАдминистратораИнформационнойБазы); Если ПользовательИБ <> Неопределено Тогда diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form index a5c4d4c57..0e5f05105 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form @@ -75,6 +75,10 @@ true + + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 1603 @@ -95,6 +99,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 1600 @@ -200,6 +208,10 @@ true + + <key>ru</key> + <value>Режим использования профилей безопасности</value> + ГруппаРежимИспользованияПрофилейБезопасностиРасширеннаяПодсказка 1612 @@ -227,12 +239,8 @@ <key>ru</key> - <value>Группа профили безопасности колонки левая</value> + <value>Профили безопасности колонки левая</value> - - ru - Группа профили безопасности колонки левая - ГруппаПрофилиБезопасностиКолонкиЛеваяРасширеннаяПодсказка 1610 @@ -328,6 +336,10 @@ true + + <key>ru</key> + <value>Требуемые разрешения</value> + ГруппаТребуемыеРазрешенияРасширеннаяПодсказка 1622 @@ -439,6 +451,10 @@ true + + <key>ru</key> + <value>Профиль безопасности информационной базы</value> + ГруппаПрофильБезопасностиИнформационнойБазыРасширеннаяПодсказка 1629 @@ -466,12 +482,8 @@ <key>ru</key> - <value>Группа профили безопасности колонка правая</value> + <value>Профили безопасности колонка правая</value> - - ru - Группа профили безопасности колонка правая - ГруппаПрофилиБезопасностиКолонкаПраваяРасширеннаяПодсказка 1620 @@ -497,6 +509,10 @@ true + + <key>ru</key> + <value>Безопасность колонки</value> + ГруппаБезопасностьКолонкиРасширеннаяПодсказка 1608 @@ -596,6 +612,10 @@ true + + <key>ru</key> + <value>Пояснение о лицензии КОРП</value> + ГруппаПояснениеОЛицензииКОРПРасширеннаяПодсказка 1646 @@ -695,6 +715,10 @@ true + + <key>ru</key> + <value>Открыть внешнюю обработку</value> + ГруппаОткрытьВнешнююОбработкуРасширеннаяПодсказка 1691 @@ -724,10 +748,6 @@ ru Группа профили безопасности колонки левая - - ru - Группа профили безопасности колонки левая - ГруппаСервисныеФункцииКолонкиЛеваяРасширеннаяПодсказка 1665 @@ -823,6 +843,10 @@ true + + <key>ru</key> + <value>Восстановление профилей безопасности</value> + ГруппаВосстановлениеПрофилейБезопасностиРасширеннаяПодсказка 1684 @@ -852,10 +876,6 @@ ru Группа профили безопасности колонка правая - - ru - Группа профили безопасности колонка правая - ГруппаСервисныеФункцииКолонкаПраваяРасширеннаяПодсказка 1667 @@ -915,12 +935,8 @@ <key>ru</key> - <value>Группа профили безопасности</value> + <value>Профили безопасности</value> - - ru - Группа профили безопасности - ГруппаПрофилиБезопасностиРасширеннаяПодсказка 1606 @@ -990,21 +1006,6 @@
          true
          - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 15 - - - true - - - true - - РежимИспользованияПрофилейБезопасности diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Module.bsl index 15f07f2e2..f39483dd8 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Module.bsl @@ -14,20 +14,16 @@ Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - Если Не РаботаВБезопасномРежимеСлужебный.ВозможноИспользованиеПрофилейБезопасности() Тогда - ВызватьИсключение НСтр("ru = 'Использование профилей безопасности недоступно для данной конфигурации!'"); + ВызватьИсключение НСтр("ru = 'Внимание! Использование профилей безопасности недоступно для данной конфигурации'"); КонецЕсли; Если Не РаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности() Тогда - ВызватьИсключение НСтр("ru = 'Настройка профилей безопасности недоступна!'"); + ВызватьИсключение НСтр("ru = 'Внимание! Настройка профилей безопасности недоступна'"); КонецЕсли; - Если Не РежимРаботы.ЭтоАдминистраторСистемы Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа!'"); + Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа'"); КонецЕсли; // Настройки видимости при запуске. @@ -199,7 +195,7 @@ Процедура НачатьПрименениеНастроекПрофилейБезопасности(Знач УникальныйИдентификатор) Если Не РаботаВБезопасномРежимеСлужебный.ВозможноИспользованиеПрофилейБезопасности() Тогда - ВызватьИсключение НСтр("ru = 'Включение автоматического запроса разрешений недоступно!'"); + ВызватьИсключение НСтр("ru = 'Внимание! Включение автоматического запроса разрешений недоступно'"); КонецЕсли; УстановитьМонопольныйРежим(Истина); @@ -310,7 +306,7 @@ &НаСервере Процедура УстановитьДоступность(РеквизитПутьКДанным = "") - Если РежимРаботы.ЭтоАдминистраторСистемы Тогда + Если Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда Если РеквизитПутьКДанным = "РежимИспользованияПрофилейБезопасности" ИЛИ РеквизитПутьКДанным = "" Тогда diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ОткрытиеВнешнейОбработкиИлиОтчетаСВыборомБезопасногоРежима/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ОткрытиеВнешнейОбработкиИлиОтчетаСВыборомБезопасногоРежима/Form.form index d08527fde..58de673c2 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ОткрытиеВнешнейОбработкиИлиОтчетаСВыборомБезопасногоРежима/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ОткрытиеВнешнейОбработкиИлиОтчетаСВыборомБезопасногоРежима/Form.form @@ -159,12 +159,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа команды</value> + <value>Команды</value> - - ru - Группа команды - ГруппаКомандыРасширеннаяПодсказка 10 diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl index c6b498449..a8738e52a 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl @@ -206,7 +206,7 @@ // Процедура ЗафиксироватьПрименениеЗапросов(Знач Состояние) Экспорт - Менеджер = Обработки.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Создать(); + Менеджер = Создать(); Менеджер.ПрочитатьСостояниеИзСтрокиXML(Состояние); Менеджер.ЗавершитьПрименениеЗапросовНаИспользованиеВнешнихРесурсов(); @@ -231,7 +231,7 @@ Процедура ЗаблокироватьРегистрыПредоставленныхРазрешений(Знач ПрограммныйМодуль = Неопределено, Знач ЗаблокироватьРежимыПодключения = Истина) Экспорт Если Не ТранзакцияАктивна() Тогда - ВызватьИсключение НСтр("ru = 'Транзакция не активна!'"); + ВызватьИсключение НСтр("ru = 'Должна быть активная транзакция'"); КонецЕсли; Блокировка = Новый БлокировкаДанных(); diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl index 1c5723076..1103aed34 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl @@ -9,6 +9,8 @@ #Область ОписаниеПеременных +#Область ВнутреннееСостояние + // Массив(УникальныйИдентификатор) - массив идентификаторов запросов на использование внешних // ресурсов, для применения которых инициализирован объект. // @@ -202,6 +204,8 @@ #КонецОбласти +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс // Добавляет идентификатор запроса в перечень обрабатываемых. После успешного применения будет выполнена очистка @@ -690,10 +694,10 @@ РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.УдалитьЗапросы(ИдентификаторыЗапросов); РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ОчиститьНеактуальныеЗапросы(); - ЗафиксироватьТранзакцию(); - РазблокироватьДанныеДляРедактирования(Семафор()); + ЗафиксироватьТранзакцию(); + Исключение ОтменитьТранзакцию(); @@ -1251,7 +1255,7 @@ КонецЕсли; КонецЦикла; Если ПустаяСтрока(ИмяИБ) Тогда - ВызватьИсключение НСтр("ru = 'Строка соединения информационной базы не содержит имени информационной базы!'"); + ВызватьИсключение НСтр("ru = 'Строка соединения информационной базы должна содержать информационной базы'"); КонецЕсли; Если ТипПрограммногоМодуля = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form index 54417922a..b59beabde 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form @@ -57,7 +57,7 @@
          - ГруппаПриветствияПриНастройкеРасписанияРК + ВыборВариантаАвтоматическогоРезервногоКопирования 47 Декорация1 @@ -357,8 +357,12 @@ true + + <key>ru</key> + <value>Выбор варианта автоматического резервного копирования</value> + - ГруппаПриветствияПриНастройкеРасписанияРКExtendedTooltip + ВыборВариантаАвтоматическогоРезервногоКопированияРасширеннаяПодсказка 284 Label true @@ -716,6 +720,10 @@ true + + <key>ru</key> + <value>Авторизации</value> + ГруппаАвторизацииExtendedTooltip 294 @@ -1019,7 +1027,7 @@ <key>ru</key> - <value>Группа хранить последние за период</value> + <value>Хранить последние за период</value> ГруппаХранитьПоследниеЗаПериодРасширеннаяПодсказка @@ -1211,7 +1219,7 @@ <key>ru</key> - <value>Группа количество копий в каталоге</value> + <value>Количество копий в каталоге</value> ГруппаКоличествоКопийВКаталогеРасширеннаяПодсказка @@ -1314,6 +1322,10 @@ true + + <key>ru</key> + <value>Параметры</value> + ГруппаПараметрыРасширеннаяПодсказка 378 @@ -1505,6 +1517,10 @@ true + + <key>ru</key> + <value>Ошибки</value> + ГруппаОшибкиExtendedTooltip 334 @@ -1530,6 +1546,10 @@ true + + <key>ru</key> + <value>Горизонтальная группа ошибка подключения</value> + ГоризонтальнаяГруппаОшибкаПодключенияExtendedTooltip 332 @@ -1816,6 +1836,10 @@ true + + <key>ru</key> + <value>Командная панель</value> + КоманднаяПанельРасширеннаяПодсказка 371 diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form index ef44f6ada..e8fb437e4 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form @@ -1,7 +1,7 @@ - Группа1 + ГруппаНапоминаниеИКартинка 7 ДекорацияИнформация @@ -39,7 +39,7 @@ - Группа2 + ГруппаНапоминание 9 ДекорацияНапоминание @@ -120,8 +120,12 @@ true + + <key>ru</key> + <value>Напоминание</value> + - Группа2РасширеннаяПодсказка + ГруппаНапоминаниеРасширеннаяПодсказка 10 Label true @@ -145,8 +149,12 @@ true + + <key>ru</key> + <value>Напоминание и картинка</value> + - Группа1РасширеннаяПодсказка + ГруппаНапоминаниеИКартинкаРасширеннаяПодсказка 8 Label true @@ -164,9 +172,11 @@ Auto - - КоманднаяПанель - 16 + Bottom + true + + ФормаКоманднаяПанель + -1 ОК 20 @@ -193,30 +203,7 @@ UserCmds Auto - true - true - - true - - - КоманднаяПанельРасширеннаяПодсказка - 17 - Label - true - true - - Left - - - CommandBar - - Right - - - - ФормаКоманднаяПанель - -1 - Left + Right OnOpen diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form index ace213212..f6b0ec225 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form @@ -366,12 +366,8 @@ <key>ru</key> - <value>Группа ежемесячные копии</value> + <value>Ежемесячные копии</value> - - ru - Группа ежемесячные копии - ГруппаЕжемесячныеКопииExtendedTooltip 67 @@ -527,7 +523,7 @@ <key>ru</key> - <value>Группа ежегодные копии</value> + <value>Ежегодные копии</value> ГруппаЕжегодныеКопииExtendedTooltip @@ -555,7 +551,7 @@ <key>ru</key> - <value>Группа периодичность</value> + <value>Периодичность</value> ГруппаПериодичностьExtendedTooltip @@ -676,7 +672,7 @@ <key>ru</key> - <value>Группа количество ежедневных</value> + <value>Количество ежедневных</value> ГруппаКоличествоЕжедневныхExtendedTooltip @@ -793,7 +789,7 @@ <key>ru</key> - <value>Группа количество ежемесячных</value> + <value>Количество ежемесячных</value> ГруппаКоличествоЕжемесячныхExtendedTooltip @@ -910,12 +906,8 @@ <key>ru</key> - <value>Группа количество ежегодных</value> + <value>Количество ежегодных</value> - - ru - Группа количество ежегодных - ГруппаКоличествоЕжегодныхExtendedTooltip 81 @@ -942,7 +934,7 @@ <key>ru</key> - <value>Группа количество</value> + <value>Количество</value> ГруппаКоличествоExtendedTooltip @@ -971,7 +963,7 @@ <key>ru</key> - <value>Группа параметры формирования колонки</value> + <value>Параметры формирования колонки</value> ГруппаПараметрыФормированияКолонкиExtendedTooltip @@ -1037,7 +1029,7 @@ <key>ru</key> - <value>Группа параметры формирования</value> + <value>Параметры формирования</value> ГруппаПараметрыФормированияExtendedTooltip diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl index 0e871d212..310cd07b4 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl @@ -13,7 +13,7 @@ ВыбраннаяФорма = "НастройкаСИнтервалами"; - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); + ОбластьДанных = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ДополнительныеПараметры = РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс. ПолучитьПараметрыФормыНастроек(ОбластьДанных); diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form index 79bff4cc6..c2317237e 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form @@ -234,10 +234,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 107 @@ -331,6 +327,10 @@ true + + <key>ru</key> + <value>Страница длительная операция</value> + СтраницаДлительнаяОперацияРасширеннаяПодсказка 173 @@ -358,6 +358,10 @@ ВнешнийВид 29 + + <key>ru</key> + <value>Внешний вид</value> + true true @@ -514,10 +518,6 @@ ru Картинка и настройка - - ru - Внешний вид картинка настройка пометка - ВнешнийВидКартинкаНастройкаПометкаExtendedTooltip 119 @@ -755,9 +755,6 @@ true true true - None - None - None true true @@ -769,10 +766,6 @@ ru Внешний вид - - ru - Внешний вид страница - ВнешнийВидСтраницаExtendedTooltip 113 @@ -796,6 +789,10 @@ НастройкиОтчетовДерево 19 + + <key>ru</key> + <value>Настройки отчетов дерево</value> + true true @@ -951,10 +948,6 @@ ru Картинка и настройка - - ru - Настройки отчетов картинка настройка пометка - НастройкиОтчетовКартинкаНастройкаПометкаExtendedTooltip 129 @@ -1191,9 +1184,6 @@ true true true - None - None - None true true @@ -1205,10 +1195,6 @@ ru Настройки отчетов - - ru - Настройки отчетов страница - НастройкиОтчетовСтраницаExtendedTooltip 123 @@ -1232,6 +1218,10 @@ ПрочиеНастройки 86 + + <key>ru</key> + <value>Прочие настройки</value> + true true @@ -1389,10 +1379,6 @@ ru Прочие настройки картинка настройка пометка - - ru - Прочие настройки картинка настройка пометка - ПрочиеНастройкиКартинкаНастройкаПометкаExtendedTooltip 139 @@ -1627,9 +1613,6 @@ true true true - None - None - None true true @@ -1641,10 +1624,6 @@ ru Прочие настройки - - ru - Прочие настройки страница - ПрочиеНастройкиСтраницаExtendedTooltip 133 @@ -1671,10 +1650,6 @@ ru Виды настроек - - ru - Виды настроек - ВидыНастроекExtendedTooltip 112 @@ -1700,6 +1675,10 @@ true + + <key>ru</key> + <value>Страница настройки</value> + СтраницаНастройкиРасширеннаяПодсказка 175 @@ -1721,6 +1700,10 @@ true + + <key>ru</key> + <value>Страницы длительная операция</value> + СтраницыДлительнаяОперацияРасширеннаяПодсказка 171 @@ -1745,10 +1728,6 @@ ru Отображать отчет - - ru - Отображать отчет - ОтображатьОтчетExtendedTooltip 104 diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl index c02837b58..2532453c8 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl @@ -312,7 +312,7 @@ ЗначениеВРеквизитФормы(Результат.ПрочиеНастройкиДерево, "ПрочиеНастройки"); Если ПоискНастроек - Или Не НачальныеНастройкиЗагружены + Или Не НачальныеНастройкиЗагружены И ВсеВыбранныеНастройки <> Неопределено Тогда ЗагрузитьЗначенияПометок(НастройкиОтчетов, ВсеВыбранныеНастройки.ПомеченныеНастройкиОтчетов, "НастройкиОтчетов"); ЗагрузитьЗначенияПометок(ВнешнийВид, ВсеВыбранныеНастройки.ПомеченныеНастройкиВнешнегоВида, "ВнешнийВид"); @@ -486,7 +486,7 @@ МассивПерсональныхНастроек = Новый Массив; ПредставленияНастроек = Новый Массив; МассивВариантовОтчетов = Новый Массив; - ПрочиеПользовательскиеНастройки = Новый Структура; + ПрочиеПользовательскиеНастройки = Новый Массив; КоличествоНастроек = 0; Для Каждого Настройка Из ДеревоНастроек.ПолучитьЭлементы() Цикл @@ -496,8 +496,10 @@ Если Настройка.Тип = "ПерсональныеНастройки" Тогда МассивПерсональныхНастроек.Добавить(Настройка.Ключи); ИначеЕсли Настройка.Тип = "ПрочаяПользовательскаяНастройка" Тогда - ПрочиеПользовательскиеНастройки.Вставить("ИдентификаторНастройки", Настройка.ТипСтроки); - ПрочиеПользовательскиеНастройки.Вставить("ЗначениеНастройки", Настройка.Ключи); + ПользовательскиеНастройки = Новый Структура; + ПользовательскиеНастройки.Вставить("ИдентификаторНастройки", Настройка.ТипСтроки); + ПользовательскиеНастройки.Вставить("ЗначениеНастройки", Настройка.Ключи); + ПрочиеПользовательскиеНастройки.Добавить(ПользовательскиеНастройки); Иначе МассивНастроек.Добавить(Настройка.Ключи); diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form index c885eb11e..ffb28b6fa 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form @@ -174,10 +174,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 51 @@ -352,12 +348,8 @@ <key>ru</key> - <value>Группа и картинка</value> + <value>И картинка</value> - - ru - Группа и картинка - ГруппаИКартинкаExtendedTooltip 64 @@ -578,9 +570,6 @@ CommonPicture.СостоянияПользователей - None - None - None true @@ -693,12 +682,8 @@ <key>ru</key> - <value>Группа пользователи</value> + <value>Пользователи</value> - - ru - Группа пользователи - ГруппаПользователиExtendedTooltip 71 @@ -908,9 +893,6 @@ Auto true true - None - None - None true @@ -923,10 +905,6 @@ ru Выбор пользователей - - ru - Выбор пользователя - ВыборПользователяExtendedTooltip 59 @@ -1005,12 +983,8 @@ <key>ru</key> - <value>Группа установить свойство</value> + <value>Установить свойство</value> - - ru - Группа установить свойство - ГруппаУстановитьСвойствоExtendedTooltip 75 @@ -1035,12 +1009,8 @@ <key>ru</key> - <value>Группа показывать пользователей дочерних групп</value> + <value>Показывать пользователей дочерних групп</value> - - ru - Группа показывать пользователей дочерних групп - ГруппаПоказыватьПользователейДочернихГруппExtendedTooltip 74 @@ -1676,10 +1646,6 @@ CatalogRef.Пользователи - - ТипПользователя - - diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl index d2c765148..f9c981220 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl @@ -10,7 +10,9 @@ Возврат; КонецЕсли; - Если Параметры.ТипПользователя = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + ТипПользователя = ТипЗнч(Параметры.Пользователь); + + Если ТипПользователя = Тип("СправочникСсылка.ВнешниеПользователи") Тогда ГруппаВсеПользователи = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи; Иначе ГруппаВсеПользователи = Справочники.ГруппыПользователей.ВсеПользователи; @@ -19,14 +21,15 @@ РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; ИспользоватьГруппы = ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей"); ПользовательИсточник = Параметры.Пользователь; - ТипПользователя = Параметры.ТипПользователя; ЗаполнитьСписокПользователей(ТипПользователя, ИспользоватьГруппы); - КопироватьВсе = (Параметры.ТипДействия = "КопироватьВсе"); + КопироватьВсе = (Параметры.ТипДействия = "КопироватьВсе"); ОчисткаНастроек = (Параметры.ТипДействия = "Очистка"); Если ОчисткаНастроек Тогда - Заголовок = НСтр("ru='Выбор пользователей для очистки настроек'"); - Элементы.Надпись.Заголовок = НСтр("ru='Выберите пользователей, которым необходимо очистить настройки'"); + Заголовок = + НСтр("ru = 'Выбор пользователей для очистки настроек'"); + Элементы.Надпись.Заголовок = + НСтр("ru = 'Выберите пользователей, которым необходимо очистить настройки'"); КонецЕсли; Если Параметры.Свойство("ВыбранныеПользователи") Тогда diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form index c186db182..df964d951 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form @@ -177,7 +177,7 @@ <key>ru</key> - <value>Группа выбрать пользователей</value> + <value>Выбрать пользователей</value> ГруппаВыбратьПользователейExtendedTooltip @@ -341,7 +341,7 @@ <key>ru</key> - <value>Группа выбрать</value> + <value>Выбрать</value> true @@ -776,6 +776,10 @@ ИБФайловая + + <key>ru</key> + <value>ИБФайловая</value> + 17 Boolean diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl index 02eb62d31..10a0bf168 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl @@ -176,15 +176,12 @@ &НаКлиенте Процедура ВыбратьПользователей(Элемент) - ТипПользователя = ТипЗнч(ПользовательСсылка); - ВыбранныеПользователи = Неопределено; ПользователиПолучателиНастроек.Свойство("МассивПользователей", ВыбранныеПользователи); ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); - ПараметрыФормы.Вставить("ТипПользователя", ТипПользователя); - ПараметрыФормы.Вставить("ТипДействия", "Копирование"); + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "Копирование"); ПараметрыФормы.Вставить("ВыбранныеПользователи", ВыбранныеПользователи); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); @@ -255,8 +252,8 @@ ПараметрыФормы.Вставить("ЕстьАктивныеПользователиПолучатели", РезультатПроверки = "ЕстьАктивныеПользователиПолучатели"); ПараметрыФормы.Вставить("ИБФайловая", ИБФайловая); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ПредупреждениеОКопированииНастроек", ПараметрыФормы); - Возврат; + Возврат; КонецЕсли; КонецЕсли; @@ -308,27 +305,26 @@ &НаКлиенте Процедура СкопироватьНастройки(ИмяКоманды) - Состояние(НСтр("ru = 'Выполняется копирование настроек'")); - Если ПереключательКомуКопироватьНастройки = "ВыбраннымПользователям" Тогда ПояснениеКомуСкопированыНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи( КоличествоПользователей, ПользователиПолучателиНастроек.МассивПользователей[0]); - Иначе ПояснениеКомуСкопированыНастройки = НСтр("ru = 'всем пользователям'"); КонецЕсли; + ТекстОповещения = НСтр("ru = 'Копирование настроек'"); + КартинкаОповещения = БиблиотекаКартинок.Информация32; + Если ПереключательКопируемыеНастройки = "СкопироватьОтдельные" Тогда - Отчет = Неопределено; СкопироватьВыбранныеНастройки(Отчет); Если Отчет <> Неопределено Тогда ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); - КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + КнопкиВопроса.Добавить("Ок", НСтр("ru = 'ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru = 'Показать отчет'")); Оповещение = Новый ОписаниеОповещения("СкопироватьНастройкиПоказатьВопрос", ЭтотОбъект, Отчет); ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); @@ -336,29 +332,25 @@ КонецЕсли; Если Отчет = Неопределено Тогда - - ТекстПояснения = ПользователиСлужебныйКлиент.ФормированиеПоясненияПриКопировании( + ПояснениеОповещения = ПользователиСлужебныйКлиент.ФормированиеПоясненияПриКопировании( ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки); - ПоказатьОповещениеПользователя(НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения); КонецЕсли; - Иначе - НастройкиСкопированы = КопированиеВсехНастроек(); Если Не НастройкиСкопированы Тогда - ТекстПредупреждения = НСтр("ru = 'Настройки не были скопированы, так как у пользователя ""%1"" не было сохранено ни одной настройки.'"); - ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, Строка(ПользовательСсылка)); - ПоказатьПредупреждение(,ТекстПредупреждения); - + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Настройки не были скопированы, так как у пользователя ""%1"" не было сохранено ни одной настройки.'"), + Строка(ПользовательСсылка))); Возврат; КонецЕсли; - - ТекстПояснения = НСтр("ru = 'Скопированы все настройки %1'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПояснениеКомуСкопированыНастройки); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки); + + ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения); КонецЕсли; // Если копирование настроек от другого пользователя, оповещаем об этом форму НастройкиПользователей. @@ -434,20 +426,18 @@ Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки(ХранилищеОбщихНастроек, Пользователь, Приемники, ВыбранныеНастройки.ПерсональныеНастройки); КонецЕсли; - - Если ВыбранныеНастройки.ПрочиеПользовательскиеНастройки.Количество() > 0 Тогда - + + Для Каждого ПрочаяНастройкаПользователя Из ВыбранныеНастройки.ПрочиеПользовательскиеНастройки Цикл Для Каждого ПользовательСправочника Из Приемники Цикл СведенияОПользователе = Новый Структура; СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательСправочника); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСправочника)); - ПользователиСлужебный.ПриСохраненииПрочихНастроек( - СведенияОПользователе, ВыбранныеНастройки.ПрочиеПользовательскиеНастройки); + ПользователиСлужебный.ПриСохраненииПрочихНастроекПользователя( + СведенияОПользователе, ПрочаяНастройкаПользователя); КонецЦикла; - - КонецЕсли; - + КонецЦикла; + Если НеСкопированныеНастройкиОтчетов.Количество() <> 0 Тогда Отчет = Обработки.НастройкиПользователей.ФормированиеОтчетаОКопировании( НеСкопированныеНастройкиОтчетов); diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form index b58680573..912f15e0e 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form @@ -138,10 +138,6 @@ ru Быстрый поиск - - ru - Быстрый поиск - БыстрыйПоискExtendedTooltip 120 @@ -340,10 +336,6 @@ ru Скопировать другим выделенные - - ru - Скопировать другим выделенные - СкопироватьДругимВыделенныеExtendedTooltip 131 @@ -532,10 +524,6 @@ ru Очистить выделенные - - ru - Очистить выделенные - ОчиститьВыделенныеExtendedTooltip 136 @@ -639,10 +627,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 123 @@ -736,6 +720,10 @@ true + + <key>ru</key> + <value>Страница длительная операция</value> + СтраницаДлительнаяОперацияРасширеннаяПодсказка 214 @@ -763,6 +751,10 @@ ВнешнийВид 29 + + <key>ru</key> + <value>Внешний вид</value> + true true @@ -875,10 +867,6 @@ ru Картинка и настройка - - ru - Внешний вид картинка настройка пометка - ВнешнийВидКартинкаНастройкаПометкаExtendedTooltip 151 @@ -1169,6 +1157,10 @@ true + + <key>ru</key> + <value>Внешний вид контекстное меню прочее</value> + ВнешнийВидКонтекстноеМенюПрочееExtendedTooltip 146 @@ -1220,10 +1212,6 @@ ru Внешний вид - - ru - Внешний вид страница - ВнешнийВидСтраницаExtendedTooltip 142 @@ -1247,6 +1235,10 @@ НастройкиОтчетовДерево 19 + + <key>ru</key> + <value>Настройки отчетов дерево</value> + true true @@ -1358,10 +1350,6 @@ ru Картинка и настройка - - ru - Настройки отчетов картинка настройка пометка - НастройкиОтчетовКартинкаНастройкаПометкаExtendedTooltip 163 @@ -1652,6 +1640,10 @@ true + + <key>ru</key> + <value>Настройки отчетов дерево контекстное меню прочее</value> + НастройкиОтчетовДеревоКонтекстноеМенюПрочееExtendedTooltip 158 @@ -1702,10 +1694,6 @@ ru Настройки отчетов - - ru - Настройки отчетов страница - НастройкиОтчетовСтраницаExtendedTooltip 154 @@ -1729,6 +1717,10 @@ ПрочиеНастройки 78 + + <key>ru</key> + <value>Прочие настройки</value> + true true @@ -1839,10 +1831,6 @@ ru Прочие настройки картинка настройка пометка - - ru - Прочие настройки картинка настройка пометка - ПрочиеНастройкиКартинкаНастройкаПометкаExtendedTooltip 175 @@ -2132,6 +2120,10 @@ true + + <key>ru</key> + <value>Прочие настройки контекстное меню прочее</value> + ПрочиеНастройкиКонтекстноеМенюПрочееExtendedTooltip 170 @@ -2180,10 +2172,6 @@ ru Прочие настройки - - ru - Прочие настройки страница - ПрочиеНастройкиСтраницаExtendedTooltip 166 @@ -2210,10 +2198,6 @@ ru Виды настроек - - ru - Виды настроек - ВидыНастроекExtendedTooltip 141 @@ -2239,6 +2223,10 @@ true + + <key>ru</key> + <value>Страница настройки</value> + СтраницаНастройкиРасширеннаяПодсказка 216 @@ -2260,6 +2248,10 @@ true + + <key>ru</key> + <value>Страницы длительная операция</value> + СтраницыДлительнаяОперацияРасширеннаяПодсказка 212 @@ -2284,10 +2276,6 @@ ru Отображать отчет - - ru - Отображать отчет - ОтображатьОтчетExtendedTooltip 119 @@ -2387,10 +2375,10 @@ true - + <key>ru</key> - <value>Группа предупреждение и картинка</value> - </toolTip> + <value>Предупреждение и картинка</value> + ГруппаПредупреждениеИКартинкаExtendedTooltip 181 @@ -2419,10 +2407,6 @@ ru Отображать предупреждение - - ru - Отображать предупреждение - ОтображатьПредупреждениеExtendedTooltip 180 @@ -2440,6 +2424,136 @@ false + + НедостаточноПрав + 223 + + ГруппаНедостаточноПрав + 225 + + КартинкаИнформации1 + 227 + + <key>ru</key> + <value>Картинка информации</value> + + true + true + + true + + + КартинкаИнформации1РасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + КартинкаИнформации1КонтекстноеМеню + 228 + true + + true + true + + + CommonPicture.Информация32 + + + + + ТекстНедостаточноПрав + 230 + + <key>ru</key> + <value>Недостаточно прав для просмотра настроек.</value> + + true + true + + true + + + ТекстНедостаточноПравРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + + ТекстНедостаточноПравКонтекстноеМеню + 231 + true + + Label + true + true + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Недостаточно прав</value> + + + ГруппаНедостаточноПравРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Недостаточно прав</value> + + + НедостаточноПравРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + true true @@ -2449,10 +2563,6 @@ ru Отчет или предупреждение - - ru - Отчет или предупреждение - ОтчетИлиПредупреждениеExtendedTooltip 118 @@ -3117,6 +3227,23 @@ true + + НетПравНаПросмотр + + <key>ru</key> + <value>Нет прав на просмотр</value> + + 18 + + Boolean + + + true + + + true + + Обновить diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl index ab8c93f87..63dc3e249 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl @@ -1,4 +1,3 @@ - #Область ОписаниеПеременных &НаКлиенте @@ -16,14 +15,29 @@ КонецЕсли; ТекущийПользовательСсылка = Пользователи.ТекущийПользователь(); - ТекущийПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ТекущийПользовательСсылка); + + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда + НастроитьФормуДляНеполноправногоПользователя(); + КонецЕсли; + + Если НетПравНаПросмотр Тогда + Элементы.ОтчетИлиПредупреждение.ТекущаяСтраница = Элементы.НедостаточноПрав; + Возврат; + КонецЕсли; + + ТекущийПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ( + ТекущийПользовательСсылка); Если Параметры.Пользователь <> Неопределено Тогда - ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Пользователь, "ИдентификаторПользователяИБ"); + ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Пользователь, + "ИдентификаторПользователяИБ"); + УстановитьПривилегированныйРежим(Истина); - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ); + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ИдентификаторПользователяИБ); УстановитьПривилегированныйРежим(Ложь); + Если ПользовательИБ = Неопределено Тогда Элементы.ОтчетИлиПредупреждение.ТекущаяСтраница = Элементы.ОтображатьПредупреждение; Возврат; @@ -32,12 +46,12 @@ ПользовательСсылка = Параметры.Пользователь; Элементы.ПользовательСсылка.Видимость = Ложь; Заголовок = НСтр("ru = 'Настройки пользователя'"); - ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка); Иначе ПользовательСсылка = Пользователи.ТекущийПользователь(); - ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка); КонецЕсли; + ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка); + ИспользоватьВнешнихПользователей = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей"); ИмяФормыПерсональныхНастроек = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности().ИмяФормыПерсональныхНастроек; @@ -46,6 +60,21 @@ КонецПроцедуры +&НаСервере +Процедура НастроитьФормуДляНеполноправногоПользователя() + + Элементы.Скопировать.Видимость = Ложь; + Элементы.СкопироватьДругим.Видимость = Ложь; + Элементы.СкопироватьОт.Видимость = Ложь; + Элементы.ОчиститьВыделенные.Видимость = Ложь; + Элементы.ВнешнийВидКонтекстноеМенюСкопировать.Видимость = Ложь; + Элементы.НастройкиОтчетовДеревоКонтекстноеМенюСкопировать.Видимость = Ложь; + Элементы.ПрочиеНастройкиКонтекстноеМенюСкопировать.Видимость = Ложь; + + НетПравНаПросмотр = (ТекущийПользовательСсылка <> Параметры.Пользователь); + +КонецПроцедуры + &НаСервере Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) @@ -74,7 +103,13 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + + Если НетПравНаПросмотр Тогда + Возврат; + КонецЕсли; + ПодключитьОбработчикОжидания("ОбновитьСписокНастроек", 0.1, Истина); + КонецПроцедуры #КонецОбласти @@ -121,12 +156,13 @@ Если ИспользоватьВнешнихПользователей Тогда ВыборТипаПользователей = Новый СписокЗначений; ВыборТипаПользователей.Добавить("ВнешниеПользователи", НСтр("ru = 'Внешние пользователи'")); - ВыборТипаПользователей.Добавить("Пользователи", НСтр("ru = 'Пользователи'")); + ВыборТипаПользователей.Добавить("Пользователи", НСтр("ru = 'Пользователи'")); - Оповещение = Новый ОписаниеОповещения("ПользовательСсылкаНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОтбора); - ВыборТипаПользователей.ПоказатьВыборЭлемента(Оповещение); + ВыборТипаПользователей.ПоказатьВыборЭлемента(Новый ОписаниеОповещения( + "ПользовательСсылкаНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОтбора)); Иначе - ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", + ПараметрыОтбора, Элементы.ПользовательСсылка); КонецЕсли; КонецПроцедуры @@ -139,9 +175,12 @@ КонецЕсли; Если ВыбранныйВариант.Значение = "Пользователи" Тогда - ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", + ПараметрыОтбора, Элементы.ПользовательСсылка); + ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда - ОткрытьФорму("Справочник.ВнешниеПользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); + ОткрытьФорму("Справочник.ВнешниеПользователи.Форма.ФормаСписка", + ПараметрыОтбора, Элементы.ПользовательСсылка); КонецЕсли; КонецПроцедуры @@ -164,8 +203,10 @@ Процедура НастройкиПередУдалением(Элемент, Отказ) Отказ = Истина; + ТекстВопроса = НСтр("ru = 'Очистить выбранные настройки?'"); Оповещение = Новый ОписаниеОповещения("НастройкиПередУдалениемЗавершение", ЭтотОбъект, Элемент); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -174,26 +215,30 @@ Процедура ДеревоНастроекВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму( - ТекущийЭлемент, ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек); + + ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму(ТекущийЭлемент, + ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек); КонецПроцедуры &НаКлиенте Процедура ПользовательСсылкаПриИзменении(Элемент) + Элементы.КоманднаяПанель.Доступность = Не ПустаяСтрока(Элемент.ВыделенныйТекст); Если РезультатПолученияНастроек() = "НетПользователяИБ" Тогда - ТекстСообщения = НСтр("ru = 'У выбранного пользователя ""%1"" не указан - |пользователь информационной базы, просмотреть его настройки невозможно. - |Устранить проблему можно в карточке данного пользователя.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПользовательСсылка); - ПоказатьПредупреждение(, ТекстСообщения); ПользовательСсылка = ТекущийПользовательСсылка; + + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У выбранного пользователя ""%1"" не указан + |пользователь информационной базы, просмотреть его настройки невозможно. + |Устранить проблему можно в карточке данного пользователя.'"), + ПользовательСсылка)); Возврат; КонецЕсли; ОбновитьСписокНастроек(); + КонецПроцедуры #КонецОбласти @@ -217,19 +262,21 @@ &НаКлиенте Процедура СкопироватьВсеНастройки(Команда) - ТипПользователя = ТипЗнч(ПользовательСсылка); КопируемыеНастройки.Очистить(); - КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru='Настройки отчетов'")); - КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru='Настройки внешнего вида'")); - КопируемыеНастройки.Добавить("ДанныеФорм", НСтр("ru='Данные форм'")); - КопируемыеНастройки.Добавить("ПерсональныеНастройки", НСтр("ru='Персональные настройки'")); - КопируемыеНастройки.Добавить("Избранное", НСтр("ru='Избранное'")); - КопируемыеНастройки.Добавить("НастройкиПечати", НСтр("ru='Настройки печати'")); - КопируемыеНастройки.Добавить( - "ПрочиеПользовательскиеНастройки", НСтр("ru='Настройки дополнительных отчетов и обработок'")); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "КопироватьВсе"); + КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru = 'Настройки отчетов'")); + КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'")); + КопируемыеНастройки.Добавить("ДанныеФорм", НСтр("ru = 'Данные форм'")); + КопируемыеНастройки.Добавить("ПерсональныеНастройки", НСтр("ru = 'Персональные настройки'")); + КопируемыеНастройки.Добавить("Избранное", НСтр("ru = 'Избранное'")); + КопируемыеНастройки.Добавить("НастройкиПечати", НСтр("ru = 'Настройки печати'")); + КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки", + НСтр("ru = 'Настройки дополнительных отчетов и обработок'")); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "КопироватьВсе"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -237,12 +284,14 @@ &НаКлиенте Процедура СкопироватьНастройкиОтчетов(Команда) - ТипПользователя = ТипЗнч(ПользовательСсылка); КопируемыеНастройки.Очистить(); - КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru='Настройки отчетов'")); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "КопироватьВсе"); + КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru = 'Настройки отчетов'")); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "КопироватьВсе"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -250,12 +299,14 @@ &НаКлиенте Процедура СкопироватьНастройкиВнешнегоВида(Команда) - ТипПользователя = ТипЗнч(ПользовательСсылка); КопируемыеНастройки.Очистить(); - КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru='Настройки внешнего вида'")); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "КопироватьВсе"); + КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'")); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "КопироватьВсе"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -263,13 +314,14 @@ &НаКлиенте Процедура СкопироватьНастройкиОтчетовИВнешнегоВида(Команда) - ТипПользователя = ТипЗнч(ПользовательСсылка); КопируемыеНастройки.Очистить(); - КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru='Настройки отчетов'")); - КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru='Настройки внешнего вида'")); + КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru = 'Настройки отчетов'")); + КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'")); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "КопироватьВсе"); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "КопироватьВсе"); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -278,8 +330,8 @@ Процедура Очистить(Команда) ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки; - Если ВыделенныеСтроки.Количество() = 0 Тогда + + Если ДеревоНастроек.ВыделенныеСтроки.Количество() = 0 Тогда ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); Возврат; @@ -288,6 +340,7 @@ Оповещение = Новый ОписаниеОповещения("ОчиститьЗавершение", ЭтотОбъект, ДеревоНастроек); ТекстВопроса = НСтр("ru = 'Очистить выделенные настройки?'"); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -299,14 +352,17 @@ ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() = 0 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); Возврат; КонецЕсли; - ТекстВопроса = НСтр("ru = 'Очистить выделенные настройки? - |Откроется окно выбора пользователей, которым необходимо очистить настройки.'"); + ТекстВопроса = + НСтр("ru = 'Очистить выделенные настройки? + |Откроется окно выбора пользователей, которым необходимо очистить настройки.'"); + Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВыбраннымПользователямЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -314,13 +370,15 @@ &НаКлиенте Процедура ОчиститьВсеНастройки(Команда) - ТекстВопроса = НСтр("ru = 'Очистить все настройки у пользователя ""%1""?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Строка(ПользовательСсылка)); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очистить все настройки у пользователя ""%1""?'"), Строка(ПользовательСсылка)); + КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("Очистить", НСтр("ru='Очистить'")); - КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); + КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru = 'Отмена'")); Оповещение = Новый ОписаниеОповещения("ОчиститьВсеНастройкиЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); КонецПроцедуры @@ -328,13 +386,16 @@ &НаКлиенте Процедура ОчиститьНастройкиОтчетовИВнешнегоВида(Команда) - ТекстВопроса = НСтр("ru = 'Очистить все настройки отчетов и внешнего вида у пользователя ""%1""?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Строка(ПользовательСсылка)); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очистить все настройки отчетов и внешнего вида у пользователя ""%1""?'"), + Строка(ПользовательСсылка)); + КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("Очистить", НСтр("ru='Очистить'")); - КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); + КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru = 'Отмена'")); Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); КонецПроцедуры @@ -342,19 +403,21 @@ &НаКлиенте Процедура ОткрытьНастройку(Команда) - ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму( - ТекущийЭлемент, ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек); + ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму(ТекущийЭлемент, + ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек); КонецПроцедуры &НаКлиенте Процедура ОчиститьНастройкиВсехПользователей(Команда) - ТекстВопроса = НСтр("ru = 'Сейчас будут очищены все настройки всех пользователей. - |Продолжить?'"); + ТекстВопроса = + НСтр("ru = 'Сейчас будут очищены все настройки всех пользователей. + |Продолжить?'"); + КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru='Очистить все'")); - КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); + КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru = 'Очистить все'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru = 'Отмена'")); Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВсехПользователейЗавершение", ЭтотОбъект); ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); @@ -364,7 +427,10 @@ &НаКлиенте Процедура СкопироватьОт(Команда) - ПараметрыФормы = Новый Структура("Пользователь, РежимОткрытияФормы", ПользовательСсылка, "СкопироватьОт"); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("РежимОткрытияФормы", "СкопироватьОт"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.КопированиеНастроекПользователей", ПараметрыФормы); КонецПроцедуры @@ -382,10 +448,12 @@ Элементы.БыстрыйПоиск.Доступность = Ложь; Элементы.КоманднаяПанель.Доступность = Ложь; Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; + Результат = ОбновлениеСпискаНастроек(); ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбновитьСписокНастроекЗавершение", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания); @@ -396,14 +464,15 @@ Функция ОбновлениеСпискаНастроек() Если РезультатВыполнения <> Неопределено - И РезультатВыполнения.ИдентификаторЗадания <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда + И РезультатВыполнения.ИдентификаторЗадания <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда + ДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатВыполнения.ИдентификаторЗадания); КонецЕсли; ПараметрыДлительнойОперации = ПараметрыДлительнойОперации(); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - ПараметрыВыполнения.ОжидатьЗавершение = 0; // запускать сразу + ПараметрыВыполнения.ОжидатьЗавершение = 0; // Запускать сразу. ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление настроек пользователей'"); РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне("ПользователиСлужебный.ЗаполнитьСпискиНастроек", @@ -423,9 +492,11 @@ Если Результат.Статус = "Выполнено" Тогда ЗаполнитьНастройки(); РазвернутьДеревоЗначений(); + Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки; Элементы.БыстрыйПоиск.Доступность = Истина; Элементы.КоманднаяПанель.Доступность = Истина; + ИначеЕсли Результат.Статус = "Ошибка" Тогда Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки; ВызватьИсключение Результат.КраткоеПредставлениеОшибки; @@ -435,6 +506,7 @@ &НаСервере Процедура ЗаполнитьНастройки() + Результат = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата); ЗначениеВРеквизитФормы(Результат.НастройкиОтчетовДерево, "НастройкиОтчетов"); @@ -443,6 +515,7 @@ ЗначениеВРеквизитФормы(Результат.ПрочиеНастройкиДерево, "ПрочиеНастройки"); РассчитатьКоличествоНастроек(); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -456,9 +529,11 @@ КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек); Если КоличествоНастроек <> 0 Тогда - Элементы.НастройкиОтчетовСтраница.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Настройки отчетов (%1)'"), КоличествоНастроек); + Элементы.НастройкиОтчетовСтраница.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Настройки отчетов (%1)'"), КоличествоНастроек); Иначе - Элементы.НастройкиОтчетовСтраница.Заголовок = НСтр("ru='Настройки отчетов'"); + Элементы.НастройкиОтчетовСтраница.Заголовок = НСтр("ru = 'Настройки отчетов'"); КонецЕсли; КоличествоНастроекОтчетов = КоличествоНастроек; @@ -466,9 +541,11 @@ КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек); Если КоличествоНастроек <> 0 Тогда - Элементы.ВнешнийВидСтраница.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Внешний вид (%1)'"), КоличествоНастроек); + Элементы.ВнешнийВидСтраница.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внешний вид (%1)'"), КоличествоНастроек); Иначе - Элементы.ВнешнийВидСтраница.Заголовок = НСтр("ru='Внешний вид'"); + Элементы.ВнешнийВидСтраница.Заголовок = НСтр("ru = 'Внешний вид'"); КонецЕсли; КоличествоНастроекВнешнегоВида = КоличествоНастроек; @@ -476,9 +553,11 @@ КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек); Если КоличествоНастроек <> 0 Тогда - Элементы.ПрочиеНастройкиСтраница.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Прочие настройки (%1)'"), КоличествоНастроек); + Элементы.ПрочиеНастройкиСтраница.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Прочие настройки (%1)'"), КоличествоНастроек); Иначе - Элементы.ПрочиеНастройкиСтраница.Заголовок = НСтр("ru='Прочие настройки'"); + Элементы.ПрочиеНастройкиСтраница.Заголовок = НСтр("ru = 'Прочие настройки'"); КонецЕсли; КоличествоПрочихНастроек = КоличествоНастроек; @@ -524,8 +603,10 @@ Если Элемент.Пометка Тогда ЛичныхНастроекОтчетов = ЛичныхНастроекОтчетов + 1; КлючОтчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элемент.Значение, "/"); + ПараметрОтбора = Новый Структура("КлючОбъекта", КлючОтчета[0]); МассивСтрок = ТаблицаПользовательскихВариантовОтчетов.НайтиСтроки(ПараметрОтбора); + Если МассивСтрок.Количество() <> 0 Тогда СтрокаТаблицы = ТаблицаВыделенныхВариантовОтчетов.Добавить(); СтрокаТаблицы.Представление = МассивСтрок[0].Представление; @@ -542,36 +623,48 @@ НеСкопированныеНастройкиОтчетов.Колонки.Добавить("Пользователь"); НеСкопированныеНастройкиОтчетов.Колонки.Добавить("СписокОтчетов", Новый ОписаниеТипов("СписокЗначений")); - Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки(ХранилищеПользовательскихНастроекОтчетов, - ПользовательИнформационнойБазы, ПользователиПриемник, Результат.МассивНастроек, НеСкопированныеНастройкиОтчетов); + Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки( + ХранилищеПользовательскихНастроекОтчетов, + ПользовательИнформационнойБазы, + ПользователиПриемник, + Результат.МассивНастроек, + НеСкопированныеНастройкиОтчетов); + // Копирование вариантов отчетов. Обработки.НастройкиПользователей.СкопироватьВариантыОтчетов(Результат.МассивВариантовОтчетов, ТаблицаПользовательскихВариантовОтчетов, ПользовательИнформационнойБазы, ПользователиПриемник); Если НеСкопированныеНастройкиОтчетов.Количество() <> 0 - Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда + Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда + Отчет = Обработки.НастройкиПользователей.ФормированиеОтчетаОКопировании( НеСкопированныеНастройкиОтчетов, ТаблицаВыделенныхВариантовОтчетов); КонецЕсли; ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда - Обработки.НастройкиПользователей.СкопироватьНастройкиВнешнегоВида(ПользовательИнформационнойБазы, ПользователиПриемник, Результат.МассивНастроек); + Обработки.НастройкиПользователей.СкопироватьНастройкиВнешнегоВида(ПользовательИнформационнойБазы, + ПользователиПриемник, Результат.МассивНастроек); Иначе Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда - Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки(ХранилищеОбщихНастроек, - ПользовательИнформационнойБазы, ПользователиПриемник, Результат.МассивПерсональныхНастроек); + Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки( + ХранилищеОбщихНастроек, + ПользовательИнформационнойБазы, + ПользователиПриемник, + Результат.МассивПерсональныхНастроек); КонецЕсли; Если Результат.МассивПользовательскихНастроек.Количество() <> 0 Тогда + Для Каждого ПрочиеПользовательскиеНастройки Из Результат.МассивПользовательскихНастроек Цикл Для Каждого ПользовательПриемник Из ПользователиПриемник Цикл + СведенияОПользователе = Новый Структура; СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательПриемник); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательПриемник)); - ПользователиСлужебный.ПриСохраненииПрочихНастроек( + ПользователиСлужебный.ПриСохраненииПрочихНастроекПользователя( СведенияОПользователе, ПрочиеПользовательскиеНастройки); КонецЦикла; КонецЦикла; @@ -579,7 +672,6 @@ Обработки.НастройкиПользователей.СкопироватьНастройкиВнешнегоВида( ПользовательИнформационнойБазы, ПользователиПриемник, Результат.МассивНастроек); - КонецЕсли; КонецПроцедуры @@ -590,11 +682,13 @@ НеСкопированныеНастройкиОтчетов = Новый ТаблицаЗначений; НеСкопированныеНастройкиОтчетов.Колонки.Добавить("Пользователь"); НеСкопированныеНастройкиОтчетов.Колонки.Добавить("СписокОтчетов", Новый ОписаниеТипов("СписокЗначений")); + Обработки.НастройкиПользователей.КопированиеНастроекПользователей( ПользовательСсылка, ПользователиПриемник, МассивНастроек, НеСкопированныеНастройкиОтчетов); Если НеСкопированныеНастройкиОтчетов.Количество() <> 0 - Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда + Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда + Отчет = Обработки.НастройкиПользователей.ФормированиеОтчетаОКопировании( НеСкопированныеНастройкиОтчетов, ТаблицаПользовательскихВариантовОтчетов); КонецЕсли; @@ -609,7 +703,9 @@ Если ВыбраннымПользователям Тогда - Обработки.НастройкиПользователей.УдалитьНастройкиВыбраннымПользователям(Пользователи, Результат.МассивНастроек, НазваниеХранилища); + Обработки.НастройкиПользователей.УдалитьНастройкиВыбраннымПользователям(Пользователи, + Результат.МассивНастроек, НазваниеХранилища); + Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда Обработки.НастройкиПользователей.УдалитьНастройкиВыбраннымПользователям(Пользователи, Результат.МассивПерсональныхНастроек, "ХранилищеОбщихНастроек"); @@ -623,15 +719,18 @@ СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ПользовательИнформационнойБазы); СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательСсылка); - Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки(СведенияОПользователе, Результат.МассивНастроек, НазваниеХранилища); + Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки(СведенияОПользователе, + Результат.МассивНастроек, НазваниеХранилища); + Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда - Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки( - СведенияОПользователе, Результат.МассивПерсональныхНастроек, "ХранилищеОбщихНастроек"); + Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки(СведенияОПользователе, + Результат.МассивПерсональныхНастроек, "ХранилищеОбщихНастроек"); КонецЕсли; Если Результат.МассивПользовательскихНастроек.Количество() <> 0 Тогда + Для Каждого ПрочиеПользовательскиеНастройки Из Результат.МассивПользовательскихНастроек Цикл - ПользователиСлужебный.ПриУдаленииПрочихНастроек( + ПользователиСлужебный.ПриУдаленииПрочихНастроекПользователя( СведенияОПользователе, ПрочиеПользовательскиеНастройки); КонецЦикла; КонецЕсли; @@ -639,9 +738,8 @@ // Очистка вариантов отчетов Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда - Обработки.НастройкиПользователей.УдалитьВариантыОтчетов( - Результат.МассивВариантовОтчетов, ТаблицаПользовательскихВариантовОтчетов, ПользовательИнформационнойБазы); - + Обработки.НастройкиПользователей.УдалитьВариантыОтчетов(Результат.МассивВариантовОтчетов, + ТаблицаПользовательскихВариантовОтчетов, ПользовательИнформационнойБазы); КонецЕсли; КонецПроцедуры @@ -651,8 +749,9 @@ МассивПользователей = Новый Массив; МассивПользователей.Добавить(ПользовательСсылка); - Обработки.НастройкиПользователей.УдалитьНастройкиПользователей( - ОчищаемыеНастройки, МассивПользователей, ТаблицаПользовательскихВариантовОтчетов); + + Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки, + МассивПользователей, ТаблицаПользовательскихВариантовОтчетов); КонецПроцедуры @@ -670,7 +769,9 @@ МассивПользователей = Новый Массив; ТаблицаПользователей = Новый ТаблицаЗначений; ТаблицаПользователей.Колонки.Добавить("Пользователь"); - ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования("", ТаблицаПользователей, Ложь, Истина); + + ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования("", + ТаблицаПользователей, Ложь, Истина); Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл МассивПользователей.Добавить(СтрокаТаблицы.Пользователь); @@ -687,6 +788,7 @@ Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда УдалитьСтрокуНастроек(НастройкиОтчетов, ВыделеннаяСтрока); + ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда УдалитьСтрокуНастроек(ВнешнийВид, ВыделеннаяСтрока); Иначе @@ -735,111 +837,114 @@ ИмяСобытия = ПараметрыОбработкиОповещения.ИмяСобытия; Параметр = ПараметрыОбработкиОповещения.Параметр; - Если ВРег(ИмяСобытия) = ВРег("ВыборПользователя") Тогда + Если ВРег(ИмяСобытия) = ВРег("СкопированыНастройки") Тогда + ОбновитьСписокНастроек(); + ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + Возврат; + КонецЕсли; + + Если ВРег(ИмяСобытия) <> ВРег("ВыборПользователя") Тогда + Возврат; + КонецЕсли; + + ПользователиПриемник = Параметр.ПользователиПриемник; + КоличествоПользователей = ПользователиПриемник.Количество(); + + ПояснениеКомуСкопированыНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи( + КоличествоПользователей, ПользователиПриемник[0]); + + ТекстОповещения = НСтр("ru = 'Копирование настроек'"); + КартинкаОповещения = БиблиотекаКартинок.Информация32; + + Если Параметр.КопироватьВсе Тогда - ПользователиПриемник = Параметр.ПользователиПриемник; - КоличествоПользователей = ПользователиПриемник.Количество(); + МассивНастроек = Новый Массив; + ИменаНастроек = ""; + Для Каждого Настройка Из КопируемыеНастройки Цикл + + ИменаНастроек = ИменаНастроек + НРег(Настройка.Представление) + ", "; + МассивНастроек.Добавить(Настройка.Значение); + + КонецЦикла; - ПояснениеКомуСкопированыНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи( - КоличествоПользователей, ПользователиПриемник[0]); + ИменаНастроек = Лев(ИменаНастроек, СтрДлина(ИменаНастроек)-2); - Если Параметр.КопироватьВсе Тогда - - МассивНастроек = Новый Массив; - ИменаНастроек = ""; - Для Каждого Настройка Из КопируемыеНастройки Цикл - - ИменаНастроек = ИменаНастроек + НРег(Настройка.Представление) + ", "; - МассивНастроек.Добавить(Настройка.Значение); - - КонецЦикла; - - ИменаНастроек = Лев(ИменаНастроек, СтрДлина(ИменаНастроек)-2); - - Если МассивНастроек.Количество() = 7 Тогда - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки); - Иначе - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 скопированы %2'"), ИменаНастроек, ПояснениеКомуСкопированыНастройки); - КонецЕсли; - - Состояние(НСтр("ru = 'Выполняется копирование настроек'")); - - Отчет = Неопределено; - СкопироватьВсеНастройкиНаСервере(ПользовательИнформационнойБазы, ПользователиПриемник, МассивНастроек, Отчет); - - Если Отчет <> Неопределено Тогда - ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); - КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); - - Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет); - ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Возврат; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - - Возврат; + Если МассивНастроек.Количество() = 7 Тогда + ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки); + Иначе + ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 скопированы %2'"), ИменаНастроек, ПояснениеКомуСкопированыНастройки); КонецЕсли; - Если Параметр.ОчисткаНастроек Тогда - - ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); - - ОчиститьНаСервере(ПользователиПриемник, Истина); - - Если КоличествоНастроек = 1 Тогда - - НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; - Если СтрДлина(НазваниеНастройки) > 24 Тогда - НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; - КонецЕсли; - - КонецЕсли; - - КоличествоПользователей = Параметр.ПользователиПриемник.Количество(); - ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки, КоличествоПользователей); - - Возврат; - КонецЕсли; - - ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); - - ЛичныхНастроекОтчетов = 0; Отчет = Неопределено; - СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет); + СкопироватьВсеНастройкиНаСервере(ПользовательИнформационнойБазы, + ПользователиПриемник, МассивНастроек, Отчет); Если Отчет <> Неопределено Тогда ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); + КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); - КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + КнопкиВопроса.Добавить("Ок", НСтр("ru = 'ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru = 'Показать отчет'")); Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет); ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); Возврат; - Иначе + КонецЕсли; + + ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения); + Возврат; + КонецЕсли; + + Если Параметр.ОчисткаНастроек Тогда + + ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); + + ОчиститьНаСервере(ПользователиПриемник, Истина); + + Если КоличествоНастроек = 1 Тогда - Если КоличествоНастроек = 1 Тогда - ПредставлениеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + Если СтрДлина(НазваниеНастройки) > 24 Тогда + НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; КонецЕсли; - ТекстПояснения = ПользователиСлужебныйКлиент.ФормированиеПоясненияПриКопировании( - ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - КонецЕсли; - ИначеЕсли ВРег(ИмяСобытия) = ВРег("СкопированыНастройки") Тогда - ОбновитьСписокНастроек(); - ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + КоличествоПользователей = Параметр.ПользователиПриемник.Количество(); + ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки, КоличествоПользователей); + Возврат; + КонецЕсли; + + ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); + + ЛичныхНастроекОтчетов = 0; + Отчет = Неопределено; + СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет); + + Если Отчет <> Неопределено Тогда + ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("Ок", НСтр("ru = 'ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru = 'Показать отчет'")); + + Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); + Возврат; + Иначе + + Если КоличествоНастроек = 1 Тогда + ПредставлениеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + КонецЕсли; + + ПояснениеОповещения = ПользователиСлужебныйКлиент.ФормированиеПоясненияПриКопировании( + ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки); + + ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения); КонецЕсли; КонецПроцедуры @@ -851,9 +956,10 @@ Возврат; КонецЕсли; - ТипПользователя = ТипЗнч(ПользовательСсылка); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "Очистка"); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", "Очистка"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -869,7 +975,7 @@ ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , - НСтр("ru='Очищены все настройки всех пользователя'"), БиблиотекаКартинок.Информация32); + НСтр("ru = 'Очищены все настройки всех пользователя'"), БиблиотекаКартинок.Информация32); КонецПроцедуры @@ -1073,12 +1179,14 @@ "Л = ru_RU", НСтр("ru = 'настройка,настройки,настроек,,,,,,0'")); Если КоличествоНастроек = 1 - И КоличествоПользователей = Неопределено Тогда - ТекстПояснения = НСтр("ru = '""%1"" очищена пользователю ""%2""'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, НазваниеНастройки, Строка(ПользовательСсылка)); + И КоличествоПользователей = Неопределено Тогда + + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" очищена пользователю ""%2""'"), НазваниеНастройки, Строка(ПользовательСсылка)); + ИначеЕсли КоличествоПользователей = Неопределено Тогда - ТекстПояснения = НСтр("ru = 'Очищено %1 пользователю ""%2""'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПрописьПредмета, Строка(ПользовательСсылка)); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очищено %1 пользователю ""%2""'"), ПрописьПредмета, Строка(ПользовательСсылка)); КонецЕсли; ПояснениеКомуОчищатьНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи( @@ -1087,17 +1195,17 @@ Если КоличествоПользователей <> Неопределено Тогда Если КоличествоНастроек = 1 Тогда - ТекстПояснения = НСтр("ru = '""%1"" очищена %2'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, НазваниеНастройки, ПояснениеКомуОчищатьНастройки); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" очищена %2'"), НазваниеНастройки, ПояснениеКомуОчищатьНастройки); Иначе - ТекстПояснения = НСтр("ru = 'Очищено %1 %2'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПрописьПредмета, ПояснениеКомуОчищатьНастройки); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очищено %1 %2'"), ПрописьПредмета, ПояснениеКомуОчищатьНастройки); КонецЕсли; КонецЕсли; - ПоказатьОповещениеПользователя( - НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), + , ТекстПояснения, БиблиотекаКартинок.Информация32); КонецПроцедуры @@ -1106,26 +1214,30 @@ ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); Если ДеревоНастроек.ВыделенныеСтроки.Количество() = 0 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется скопировать.'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Необходимо выбрать настройки, которые требуется скопировать.'")); Возврат; ИначеЕсли ДеревоНастроек.ВыделенныеСтроки.Количество() = 1 Тогда Если ДеревоНастроек.ТекущиеДанные.Тип = "ВариантЛичный" Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Невозможно скопировать личный вариант отчета. - |Для того чтобы личный вариант отчета стал доступен другим пользователям, необходимо - |его пересохранить со снятой пометкой ""Только для автора"".'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Невозможно скопировать личный вариант отчета. + |Для того чтобы личный вариант отчета стал доступен другим пользователям, необходимо + |его пересохранить со снятой пометкой ""Только для автора"".'")); Возврат; ИначеЕсли ДеревоНастроек.ТекущиеДанные.Тип = "НастройкаЛичная" Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Невозможно скопировать настройку личного варианта отчета. - |Копирование настроек личных вариантов отчетов не предусмотрено.'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Невозможно скопировать настройку личного варианта отчета. + |Копирование настроек личных вариантов отчетов не предусмотрено.'")); Возврат; КонецЕсли; КонецЕсли; - ТипПользователя = ТипЗнч(ПользовательСсылка); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, ""); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка); + ПараметрыФормы.Вставить("ТипДействия", ""); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); КонецПроцедуры @@ -1137,7 +1249,8 @@ ПользовательСсылка = Справочники.Пользователи.ПустаяСсылка(); ПользовательИнформационнойБазы = Неопределено; Иначе - ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка); + ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ( + ПользовательСсылка); КонецЕсли; Если ПользовательИнформационнойБазы = Неопределено Тогда @@ -1211,7 +1324,7 @@ Если ВыделеннаяНастройка.Тип = "ПрочаяПользовательскаяНастройка" Тогда ПрочиеПользовательскиеНастройки = Новый Структура; ПрочиеПользовательскиеНастройки.Вставить("ИдентификаторНастройки", ВыделеннаяНастройка.ТипСтроки); - ПрочиеПользовательскиеНастройки.Вставить("ЗначениеНастройки", ВыделеннаяНастройка.Ключи); + ПрочиеПользовательскиеНастройки.Вставить("ЗначениеНастройки", ВыделеннаяНастройка.Ключи); МассивПользовательскихНастроек.Добавить(ПрочиеПользовательскиеНастройки); Продолжить; КонецЕсли; @@ -1233,7 +1346,8 @@ Если ВыделеннаяНастройка.Тип = "НастройкаЛичная" Тогда Если ТекущийВариантОтчета <> Неопределено - И ТекущийВариантОтчета.НайтиПоЗначению(ВыделеннаяНастройка.Ключи[0].Значение) <> Неопределено Тогда + И ТекущийВариантОтчета.НайтиПоЗначению(ВыделеннаяНастройка.Ключи[0].Значение) <> Неопределено Тогда + Продолжить; Иначе ВыделеннаяНастройка.Ключи[0].Пометка = Истина; @@ -1268,10 +1382,17 @@ ЗаполнитьЗначенияСвойств(ПараметрыДлительнойОперации, ЭтотОбъект); - ПараметрыДлительнойОперации.Вставить("НастройкиОтчетовДерево", РеквизитФормыВЗначение("НастройкиОтчетов")); - ПараметрыДлительнойОперации.Вставить("НастройкиВнешнегоВида", РеквизитФормыВЗначение("ВнешнийВид")); - ПараметрыДлительнойОперации.Вставить("ПрочиеНастройкиДерево", РеквизитФормыВЗначение("ПрочиеНастройки")); - ПараметрыДлительнойОперации.Вставить("ПользовательскиеВариантыОтчетов", РеквизитФормыВЗначение("ТаблицаПользовательскихВариантовОтчетов")); + ПараметрыДлительнойОперации.Вставить("НастройкиОтчетовДерево", + РеквизитФормыВЗначение("НастройкиОтчетов")); + + ПараметрыДлительнойОперации.Вставить("НастройкиВнешнегоВида", + РеквизитФормыВЗначение("ВнешнийВид")); + + ПараметрыДлительнойОперации.Вставить("ПрочиеНастройкиДерево", + РеквизитФормыВЗначение("ПрочиеНастройки")); + + ПараметрыДлительнойОперации.Вставить("ПользовательскиеВариантыОтчетов", + РеквизитФормыВЗначение("ТаблицаПользовательскихВариантовОтчетов")); Возврат ПараметрыДлительнойОперации; diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl index 987405d1f..c99da4259 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl @@ -92,16 +92,14 @@ Если ИспользоватьВнешнихПользователей Тогда ВыборТипаПользователей = Новый СписокЗначений; ВыборТипаПользователей.Добавить("ВнешниеПользователи", НСтр("ru = 'Внешние пользователи'")); - ВыборТипаПользователей.Добавить("Пользователи", НСтр("ru = 'Пользователи'")); + ВыборТипаПользователей.Добавить("Пользователи", НСтр("ru = 'Пользователи'")); Оповещение = Новый ОписаниеОповещения("ВыбратьПользователейНажатиеВыбратьЭлемент", ЭтотОбъект); ВыборТипаПользователей.ПоказатьВыборЭлемента(Оповещение); Возврат; - Иначе - ТипПользователя = Тип("СправочникСсылка.Пользователи"); КонецЕсли; - ОткрытьФормуВыбораПользователей(ТипПользователя); + ОткрытьФормуВыбораПользователей(ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка")); КонецПроцедуры @@ -154,25 +152,25 @@ КонецЕсли; Если ВыбранныйВариант.Значение = "Пользователи" Тогда - ТипПользователя = Тип("СправочникСсылка.Пользователи"); + Пользователь = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда - ТипПользователя = Тип("СправочникСсылка.ВнешниеПользователи"); + Пользователь = ПредопределенноеЗначение("Справочник.ВнешниеПользователи.ПустаяСсылка"); КонецЕсли; - ОткрытьФормуВыбораПользователей(ТипПользователя); + ОткрытьФормуВыбораПользователей(Пользователь); КонецПроцедуры &НаКлиенте -Процедура ОткрытьФормуВыбораПользователей(ТипПользователя) +Процедура ОткрытьФормуВыбораПользователей(Пользователь) ВыбранныеПользователи = Неопределено; ПользователиКоторымОчищаютсяНастройки.Свойство("МассивПользователей", ВыбранныеПользователи); ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Пользователь", ""); - ПараметрыФормы.Вставить("ТипПользователя", ТипПользователя); - ПараметрыФормы.Вставить("ТипДействия", "Очистка"); + ПараметрыФормы.Вставить("Пользователь", Пользователь); + ПараметрыФормы.Вставить("ТипДействия", "Очистка"); ПараметрыФормы.Вставить("ВыбранныеПользователи", ВыбранныеПользователи); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); @@ -316,10 +314,10 @@ СведенияОПользователе, ВыбранныеНастройки.ПерсональныеНастройки, "ХранилищеОбщихНастроек"); КонецЕсли; - Если ВыбранныеНастройки.ПрочиеПользовательскиеНастройки.Количество() > 0 Тогда - ПользователиСлужебный.ПриУдаленииПрочихНастроек( - СведенияОПользователе, ВыбранныеНастройки.ПрочиеПользовательскиеНастройки); - КонецЕсли; + Для Каждого ПрочиеПользовательскиеНастройки Из ВыбранныеНастройки.ПрочиеПользовательскиеНастройки Цикл + ПользователиСлужебный.ПриУдаленииПрочихНастроекПользователя( + СведенияОПользователе, ПрочиеПользовательскиеНастройки); + КонецЦикла; КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form index 55098c10f..d0f596cc2 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form @@ -6,10 +6,10 @@ ГруппаКлиентСервер - 20 + 26 ДекорацияКартинка - 22 + 28 true true @@ -17,7 +17,7 @@ ДекорацияКартинкаРасширеннаяПодсказка - 24 + 30 Label true true @@ -27,7 +27,7 @@ ДекорацияКартинкаКонтекстноеМеню - 23 + 29 true true @@ -40,7 +40,7 @@ СообщениеКлиентСервер - 25 + 23 <key>ru</key> <value>В некоторых случаях настройки применяются не сразу, задержка может составлять до 20 минут.</value> @@ -52,7 +52,7 @@ </userVisible> <extendedTooltip> <name>СообщениеКлиентСерверРасширеннаяПодсказка</name> - <id>27</id> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -62,7 +62,7 @@ </extendedTooltip> <contextMenu> <name>СообщениеКлиентСерверКонтекстноеМеню</name> - <id>26</id> + <id>24</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -79,7 +79,7 @@ </userVisible> <extendedTooltip> <name>ГруппаКлиентСерверРасширеннаяПодсказка</name> - <id>21</id> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -98,10 +98,10 @@ </items> <items xsi:type="form:FormGroup"> <name>ГруппаАктивныеПользователи</name> - <id>28</id> + <id>7</id> <items xsi:type="form:Decoration"> <name>Сообщение</name> - <id>30</id> + <id>1</id> <title> <key>ru</key> <value>Пользователи, которым копируются настройки внешнего вида программы, @@ -115,7 +115,7 @@ </userVisible> <extendedTooltip> <name>СообщениеExtendedTooltip</name> - <id>32</id> + <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -125,7 +125,7 @@ </extendedTooltip> <contextMenu> <name>СообщениеКонтекстноеМеню</name> - <id>31</id> + <id>2</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -135,7 +135,7 @@ </items> <items xsi:type="form:Decoration"> <name>СписокАктивныхПользователей</name> - <id>33</id> + <id>8</id> <title> <key>ru</key> <value>Список активных пользователей</value> @@ -147,7 +147,7 @@ </userVisible> <extendedTooltip> <name>СписокАктивныхПользователейExtendedTooltip</name> - <id>35</id> + <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -157,7 +157,7 @@ </extendedTooltip> <contextMenu> <name>СписокАктивныхПользователейКонтекстноеМеню</name> - <id>34</id> + <id>9</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -182,7 +182,7 @@ ГруппаАктивныеПользователиExtendedTooltip - 29 + 21 Label true true @@ -331,13 +331,13 @@ true - ЕстьАктивныеПользователиПолучатели + ИБФайловая Boolean - ИБФайловая + ЕстьАктивныеПользователиПолучатели Boolean diff --git a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl index d1d950edf..c1e3a6dba 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl @@ -237,6 +237,10 @@ Для Каждого Объект Из СписокОбъектовМетаданных Цикл + Если Не ПравоДоступа("Просмотр", Объект) Тогда + Продолжить; + КонецЕсли; + Если ТипОбъектаМетаданных = "ВнешнийИсточникДанных" Тогда ЗаполнитьФормыВнешнихИсточниковДанных(Объект, ТипОбъектаМетаданных, ПредставлениеОбъектаМетаданных, Картинка, СписокФорм); Продолжить; @@ -316,7 +320,7 @@ СведенияОПользователе.Вставить("ПользовательСсылка", Источник); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ИмяПользователяИБ(Источник)); ПрочиеНастройкиПользователей = Новый Структура; - ПользователиСлужебный.ПриПолученииПрочихНастроек(СведенияОПользователе, ПрочиеНастройкиПользователей); + ПользователиСлужебный.ПриПолученииПрочихНастроекПользователя(СведенияОПользователе, ПрочиеНастройкиПользователей); Ключи = Новый СписокЗначений; МассивПрочихНастроек = Новый Массив; Если ПрочиеНастройкиПользователей.Количество() <> 0 Тогда @@ -335,7 +339,7 @@ ПрочиеНастройкиСтруктура.Вставить("ЗначениеНастройки", ПрочаяНастройка.Значение.СписокНастроек); КонецЕсли; - ПользователиСлужебный.ПриУдаленииПрочихНастроек(СведенияОПользователе, ПрочиеНастройкиСтруктура); + ПользователиСлужебный.ПриУдаленииПрочихНастроекПользователя(СведенияОПользователе, ПрочиеНастройкиСтруктура); КонецЦикла; КонецЕсли; @@ -371,7 +375,8 @@ НастройкиИзХранилища = СписокНастроек(ПользовательИБ, МенеджерНастроек, ОчищаемаяНастройка); УдалитьНастройки(МенеджерНастроек, НастройкиИзХранилища, ПользовательИБ); - ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ, Источник); + ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ, + ТипЗнч(Источник) = Тип("СправочникСсылка.ВнешниеПользователи")); КонецЦикла; @@ -409,7 +414,7 @@ СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательИсточникСсылка); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ПользовательИсточник); ПрочиеНастройкиПользователей = Новый Структура; - ПользователиСлужебный.ПриПолученииПрочихНастроек(СведенияОПользователе, ПрочиеНастройкиПользователей); + ПользователиСлужебный.ПриПолученииПрочихНастроекПользователя(СведенияОПользователе, ПрочиеНастройкиПользователей); Ключи = Новый СписокЗначений; МассивПрочихНастроек = Новый Массив; Если ПрочиеНастройкиПользователей.Количество() <> 0 Тогда @@ -441,7 +446,7 @@ СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательПриемник); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ИмяПользователяИБ(ПользовательПриемник)); Для Каждого ЭлементМассива Из МассивПрочихНастроек Цикл - ПользователиСлужебный.ПриСохраненииПрочихНастроек(СведенияОПользователе, ЭлементМассива); + ПользователиСлужебный.ПриСохраненииПрочихНастроекПользователя(СведенияОПользователе, ЭлементМассива); КонецЦикла; КонецЦикла; Продолжить; @@ -650,7 +655,7 @@ Если Настройка <> Неопределено Тогда - ПользовательПриемникИБ = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательПриемник); + ПользовательПриемникИБ = ИмяПользователяИБ(ПользовательПриемник); Если МенеджерНастроек = ХранилищеПользовательскихНастроекОтчетов Тогда МассивДоступныхОтчетов = ОтчетыДоступныеПользователю(ПользовательПриемникИБ); @@ -711,7 +716,7 @@ Если Настройка <> Неопределено Тогда Для Каждого ПользовательПриемник Из ПользователиПриемник Цикл - ПользовательПриемникИБ = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательПриемник); + ПользовательПриемникИБ = ИмяПользователяИБ(ПользовательПриемник); ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройка, , ПользовательПриемникИБ); КонецЦикла; @@ -729,7 +734,7 @@ Если Настройка <> Неопределено Тогда Для Каждого ПользовательПриемник Из ПользователиПриемник Цикл - ПользовательПриемникИБ = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательПриемник); + ПользовательПриемникИБ = ИмяПользователяИБ(ПользовательПриемник); ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, "", Настройка, , ПользовательПриемникИБ); КонецЦикла; @@ -740,7 +745,7 @@ Процедура УдалитьНастройкиВыбраннымПользователям(Пользователи, МассивНастроекДляУдаления, НазваниеХранилища) Экспорт Для Каждого Пользователь Из Пользователи Цикл - ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(Пользователь); + ПользовательИнформационнойБазы = ИмяПользователяИБ(Пользователь); СведенияОПользователе = Новый Структура; СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ПользовательИнформационнойБазы); @@ -797,7 +802,8 @@ КонецЦикла; Если УстановитьНачальныеНастройки Тогда - ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ, ПользовательСсылка); + ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ, + ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи")); КонецЕсли; КонецЕсли; @@ -872,7 +878,7 @@ // Процедуры и функции для получения списка пользователей и групп пользователей. // Получает список пользователей из справочника Пользователи, отсеивая недействительных пользователей, неразделенных -// пользователей при включенном разделителе, а так же пользователей с пустым идентификатором. +// пользователей при включенном разделителе, а также пользователей с пустым идентификатором. // // Параметры: // ПользовательИсточник - СправочникСсылка - Пользователь, которого необходимо убрать из итоговой таблицы пользователей. @@ -942,7 +948,7 @@ ?(Очистка, "Истина", "НЕ Пользователи.Недействителен")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&КромеСлужебныхПользователей", - ?(Очистка И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или ПользовательВнешний, + ?(Очистка И Не ОбщегоНазначения.РазделениеВключено() Или ПользовательВнешний, "Истина", "НЕ Пользователи.Служебный")); Возврат ТекстЗапроса; @@ -1604,7 +1610,7 @@ ТаблицаПользовательскихВариантовОтчетов = Неопределено) Экспорт ТабДок = Новый ТабличныйДокумент; - ТабМакет = Обработки.НастройкиПользователей.ПолучитьМакет("МакетОтчета"); + ТабМакет = ПолучитьМакет("МакетОтчета"); ОтчетНеПустой = Ложь; Если ТаблицаПользовательскихВариантовОтчетов <> Неопределено @@ -1977,7 +1983,7 @@ И ВыводитьНастройку Тогда Настройка = НСтр("ru = 'Настройки печати табличных документов'"); Картинка = БиблиотекаКартинок.Печать; - ТипНастройки = "ПрочаяНастройка"; + ТипНастройки = "НастройкаПечати"; ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, ТипНастройки); КонецЕсли; @@ -1998,7 +2004,7 @@ Картинка = БиблиотекаКартинок.ДобавитьВИзбранное; Ключи.Очистить(); Ключи.Добавить("Общее/ИзбранноеРаботыПользователя", "Прочие"); - ТипНастройки = "ПрочаяНастройка"; + ТипНастройки = "НастройкаИзбранного"; ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, ТипНастройки); КонецЕсли; @@ -2009,7 +2015,7 @@ СведенияОПользователе.Вставить("ПользовательСсылка", Параметры.ПользовательСсылка); СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", Параметры.ПользовательИнформационнойБазы); - ПользователиСлужебный.ПриПолученииПрочихНастроек(СведенияОПользователе, ПрочиеНастройки); + ПользователиСлужебный.ПриПолученииПрочихНастроекПользователя(СведенияОПользователе, ПрочиеНастройки); Ключи = Новый СписокЗначений; Если ПрочиеНастройки <> Неопределено Тогда diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form index 793119714..f9fbf65ee 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form @@ -133,7 +133,7 @@ <key>ru</key> - <value>Группа версия</value> + <value>Версия</value> ГруппаВерсияExtendedTooltip @@ -269,7 +269,7 @@ <key>ru</key> - <value>Группа текст</value> + <value>Текст</value> ГруппаТекстExtendedTooltip @@ -298,7 +298,7 @@ <key>ru</key> - <value>Группа предупреждение</value> + <value>Предупреждение</value> ГруппаПредупреждениеExtendedTooltip @@ -516,13 +516,6 @@ - - ЗавершитьРаботу - - Boolean - - true - РекомендуемаяВерсияПлатформы @@ -536,6 +529,13 @@ Boolean + + МинимальнаяВерсияПлатформы + + String + + + diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl index 3f83f5cd1..576ff52fb 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl @@ -17,17 +17,28 @@ Элементы.ТекстСообщения.Заголовок = Параметры.ТекстСообщения; Элементы.РекомендуемаяВерсияПлатформы.Заголовок = Параметры.РекомендуемаяВерсияПлатформы; СистемнаяИнформация = Новый СистемнаяИнформация; + Текущая = СистемнаяИнформация.ВерсияПриложения; + Минимальная = Параметры.МинимальнаяВерсияПлатформы; + Рекомендуемая = Параметры.РекомендуемаяВерсияПлатформы; - ТекстУсловие = ?(Параметры.ЗавершитьРаботу, НСтр("ru = 'необходимо'"), НСтр("ru = 'рекомендуется'")); + ПродолжениеРаботыНевозможно = Ложь; + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Минимальная) < 0 Тогда + ТекстУсловие = НСтр("ru = 'необходимо'"); + ПродолжениеРаботыНевозможно = Истина; + Элементы.РекомендуемаяВерсияПлатформы.Заголовок = Минимальная; + Иначе + ТекстУсловие = НСтр("ru = 'рекомендуется'"); + Элементы.РекомендуемаяВерсияПлатформы.Заголовок = Рекомендуемая; + КонецЕсли; Элементы.Версия.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.Версия.Заголовок, ТекстУсловие, СистемнаяИнформация.ВерсияПриложения); - Если Параметры.ЗавершитьРаботу Тогда + Если ПродолжениеРаботыНевозможно Тогда Элементы.ТекстВопроса.Видимость = Ложь; Элементы.ФормаНет.Видимость = Ложь; Заголовок = НСтр("ru = 'Необходимо обновить версию платформы'"); КонецЕсли; - Если (ТекущийВариантИнтерфейсаКлиентскогоПриложения() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси) Тогда + Если (КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси) Тогда Элементы.РекомендуемаяВерсияПлатформы.Шрифт = Новый Шрифт(,, Истина); КонецЕсли; diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form index cb93aedd0..5067868fb 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form @@ -42,10 +42,6 @@ ru Панель сохранить и напечатать - - ru - Панель сохранить и напечатать - ПанельСохранитьИНапечататьРасширеннаяПодсказка 16 diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form index 403b086a5..1b0146d27 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form @@ -86,10 +86,6 @@ ru Настройки выполнения замеров флаги - - ru - Настройки выполнения замеров флаги - НастройкиВыполненияЗамеровФлагиРасширеннаяПодсказка 46 @@ -284,10 +280,6 @@ ru Настройки выполнения замеров инфо - - ru - Настройки выполнения замеров инфо - НастройкиВыполненияЗамеровИнфоРасширеннаяПодсказка 48 @@ -364,10 +356,6 @@ ru Настройки выполнения замеров - - ru - Настройки выполнения замеров - НастройкиВыполненияЗамеровРасширеннаяПодсказка 41 @@ -488,10 +476,6 @@ ru Настройки удаления замеров период - - ru - Настройки удаления замеров период - НастройкиУдаленияЗамеровПериодРасширеннаяПодсказка 73 @@ -520,10 +504,6 @@ ru Настройки удаления замеров - - ru - Настройки удаления замеров - НастройкиУдаленияЗамеровРасширеннаяПодсказка 68 @@ -649,10 +629,6 @@ ru Настройки экспорта в локальный каталог - - ru - Настройки экспорта в локальный каталог - НастройкиЭкспортаВЛокальныйКаталогExtendedTooltip 30 @@ -773,10 +749,6 @@ ru Настройки экспорта на FTP - - ru - Настройки экспорта на FTP - НастройкиЭкспортаНаFTPExtendedTooltip 33 @@ -1039,6 +1011,23 @@ true + + ЕстьПрофилиБезопасности + + <key>ru</key> + <value>Есть профили безопасности</value> + + 8 + + Boolean + + + true + + + true + + НастроитьРасписаниеЭкспорта diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl index 3384adde7..4442f02b3 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl @@ -11,10 +11,11 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если НЕ ОценкаПроизводительностиСлужебный.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда - ЭтаФорма.Элементы.ЛокальныйКаталогЭкспорта.КнопкаВыбора = Ложь; + ЭтотОбъект.Элементы.ЛокальныйКаталогЭкспорта.КнопкаВыбора = Ложь; ЕстьБСП = Ложь; Иначе ЕстьБСП = Истина; + ЕстьПрофилиБезопасности = ОценкаПроизводительностиСлужебный.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности"); КонецЕсли; Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. @@ -298,24 +299,25 @@ ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьВнешнийРесурсСохранить", ЭтотОбъект); КонецЕсли; - Каталоги = Новый Структура; - Каталоги.Вставить("ВыполнятьЭкспортНаFTP", ВыполнятьЭкспортНаFTP); + Если ЕстьПрофилиБезопасности Тогда + + Каталоги = Новый Структура; + Каталоги.Вставить("ВыполнятьЭкспортНаFTP", ВыполнятьЭкспортНаFTP); + + СтруктураURI = ОценкаПроизводительностиКлиентСервер.СтруктураURI(FTPКаталогЭкспорта); + Каталоги.Вставить("FTPКаталогЭкспорта", СтруктураURI.ИмяСервера); + Если ЗначениеЗаполнено(СтруктураURI.Порт) Тогда + Каталоги.Вставить("FTPКаталогЭкспортаПорт", СтруктураURI.Порт); + КонецЕсли; + + Каталоги.Вставить("ВыполнятьЭкспортВЛокальныйКаталог", ВыполнятьЭкспортВЛокальныйКаталог); + Каталоги.Вставить("ЛокальныйКаталогЭкспорта", ЛокальныйКаталогЭкспорта); + + Запрос = ЗапросНаИспользованиеВнешнихРесурсов(Каталоги); + + ЗапросВМассив = Новый Массив; + ЗапросВМассив.Добавить(Запрос); - СтруктураURI = ОценкаПроизводительностиКлиентСервер.СтруктураURI(FTPКаталогЭкспорта); - Каталоги.Вставить("FTPКаталогЭкспорта", СтруктураURI.ИмяСервера); - Если ЗначениеЗаполнено(СтруктураURI.Порт) Тогда - Каталоги.Вставить("FTPКаталогЭкспортаПорт", СтруктураURI.Порт); - КонецЕсли; - - Каталоги.Вставить("ВыполнятьЭкспортВЛокальныйКаталог", ВыполнятьЭкспортВЛокальныйКаталог); - Каталоги.Вставить("ЛокальныйКаталогЭкспорта", ЛокальныйКаталогЭкспорта); - - Запрос = ЗапросНаИспользованиеВнешнихРесурсов(Каталоги); - - ЗапросВМассив = Новый Массив; - ЗапросВМассив.Добавить(Запрос); - - Если ЕстьБСП Тогда МодульРаботаВБезопасномРежимеКлиент = Вычислить("РаботаВБезопасномРежимеКлиент"); МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросВМассив, ЭтотОбъект, ОповещениеОЗакрытии); Иначе @@ -338,7 +340,7 @@ КонецФункции &НаКлиенте -Процедура РазрешитьВнешнийРесурсСохранитьИЗакрыть(Результат, Неопределен) Экспорт +Процедура РазрешитьВнешнийРесурсСохранитьИЗакрыть(Результат, Контекст) Экспорт Если Результат = КодВозвратаДиалога.ОК Тогда ВнешниеРесурсыРазрешены = Истина; @@ -349,7 +351,7 @@ КонецПроцедуры &НаКлиенте -Процедура РазрешитьВнешнийРесурсСохранить(Результат, Неопределен) Экспорт +Процедура РазрешитьВнешнийРесурсСохранить(Результат, Контекст) Экспорт Если Результат = КодВозвратаДиалога.ОК Тогда ВнешниеРесурсыРазрешены = Истина; diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form index 80de9e6b3..01bc70b9f 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form @@ -107,10 +107,6 @@ <underline>false</underline> <strikeout>false</strikeout> </titleFont> - <toolTip> - <key>ru</key> - <value>Группа период</value> - </toolTip> <extendedTooltip> <name>ГруппаПериодExtendedTooltip</name> <id>25</id> @@ -275,12 +271,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа параметры</value> + <value>Параметры</value> - - ru - Группа параметры - ГруппаПараметрыExtendedTooltip 30 @@ -315,10 +307,6 @@ false false - - ru - Группа параметры ключевой операции - ГруппаПараметрыКлючевойОперацииExtendedTooltip 28 @@ -386,6 +374,10 @@ История 16 + + <key>ru</key> + <value>История</value> + true true @@ -630,9 +622,6 @@ true true true - None - None - None true diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl index eb531786d..b04276a7b 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl @@ -16,24 +16,24 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("КлючеваяОперация", КлючеваяОперация); - Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); - Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); + Запрос.УстановитьПараметр("ДатаНачала", (ДатаНачала - Дата(1,1,1)) * 1000); + Запрос.УстановитьПараметр("ДатаОкончания", (ДатаОкончания - Дата(1,1,1)) * 1000); Запрос.Текст = "ВЫБРАТЬ | ЗамерыВремени.Пользователь КАК Пользователь, | ЗамерыВремени.ВремяВыполнения КАК Длительность, - | ЗамерыВремени.ДатаНачалаЗамера КАК ВремяОкончания + | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1), СЕКУНДА, (ЗамерыВремени.ДатаНачалаЗамера/1000) - 63555667200) КАК ВремяОкончания |ИЗ | РегистрСведений.ЗамерыВремени КАК ЗамерыВремени |ГДЕ | ЗамерыВремени.КлючеваяОперация = &КлючеваяОперация | И ЗамерыВремени.ДатаНачалаЗамера МЕЖДУ &ДатаНачала И &ДатаОкончания - | |УПОРЯДОЧИТЬ ПО | ВремяОкончания"; - - Выборка = Запрос.Выполнить().Выбрать(); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); КоличествоЗамеровЧисло = Выборка.Количество(); КоличествоЗамеров = Строка(КоличествоЗамеровЧисло) + ?(КоличествоЗамеровЧисло < 100, " (недостаточно)", ""); diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form index 75ce4c6da..ff4eaa8bf 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form @@ -129,6 +129,7 @@ false true true + true true true true @@ -164,10 +165,10 @@ true - + <key>ru</key> <value>Настройка периода</value> - </toolTip> + НастройкаПериодаРасширеннаяПодсказка 100 @@ -320,10 +321,6 @@ ru Настройка комментарий - - ru - Настройка комментарий - НастройкаКомментарийРасширеннаяПодсказка 102 @@ -352,10 +349,6 @@ ru Настройки отбора замеров - - ru - Настройки - НастройкиExtendedTooltip 77 @@ -387,6 +380,10 @@ Производительность 23 + + <key>ru</key> + <value>Производительность</value> + true true @@ -840,9 +837,6 @@ Auto true true - None - None - None true @@ -855,10 +849,6 @@ ru Таблица - - ru - Страница таблица - СтраницаТаблицаExtendedTooltip 82 @@ -932,10 +922,6 @@ ru Диаграмма - - ru - Страница диаграмма - СтраницаДиаграммаExtendedTooltip 91 @@ -962,10 +948,6 @@ ru Форма - - ru - Форма - ФормаExtendedTooltip 81 diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl index e61c16057..7af092860 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl @@ -423,7 +423,8 @@ // Обрабатывает реквизиты табличной части "Производительность". // // Параметры: -// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а какие оставить. +// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а +// какие оставить. // &НаСервере Процедура ОбработатьРеквизитыОбъекта(КолонкиТаблицаКлючевыхОпераций) @@ -472,7 +473,8 @@ // Изменяются реквизиты формы ненужные удаляются нужные добавляются. // // Параметры: -// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а какие оставить. +// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а +// какие оставить. // УдаляемыеРеквизиты - Массив, список полных имен удаляемых реквизитов // имена в формате Объект.Производительность.ПроизводительностьN, где N номер. // @@ -787,7 +789,6 @@ БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить(Ссылка.Метаданные().ПолноеИмя()); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка); БлокировкаДанных.Заблокировать(); diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form index b921d3a25..deb3d2602 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form @@ -215,6 +215,10 @@ true + + <key>ru</key> + <value>Группа параметры</value> + Группа1ExtendedTooltip 26 diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form index 268f5dfaf..7f5d7811d 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form @@ -104,12 +104,8 @@ <key>ru</key> - <value>Группа период</value> + <value>Период</value> - - ru - Группа период - ГруппаПериодРасширеннаяПодсказка 2 diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Module.bsl index 6f3ebb3d2..b3fd97b27 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Module.bsl @@ -4,7 +4,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если НЕ ОценкаПроизводительностиСлужебный.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда - ЭтаФорма.Элементы.КаталогЭкспорта.КнопкаВыбора = Ложь; + ЭтотОбъект.Элементы.КаталогЭкспорта.КнопкаВыбора = Ложь; ЕстьБСП = Ложь; Иначе ЕстьБСП = Истина; @@ -25,7 +25,7 @@ ВыборФайла.Заголовок = НСтр("ru = 'Выбор каталога экспорта'"); Если ВыборФайла.Выбрать() Тогда - ЭтаФорма.КаталогЭкспорта = ВыборФайла.Каталог; + ЭтотОбъект.КаталогЭкспорта = ВыборФайла.Каталог; КонецЕсли; КонецЕсли; @@ -49,84 +49,34 @@ &НаКлиенте Процедура ВыполнитьЭкспорт(Команда) - - ЕстьОшибки = Ложь; - - Если НЕ ЗначениеЗаполнено(ДатаНачалаПериодаЭкспорта) Тогда - - СообщениеПользователю = Новый СообщениеПользователю; - СообщениеПользователю.Поле = "ДатаНачалаПериодаЭкспорта"; - СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Дата начала"" не заполнено. - |Экспорт невозможен.'"); - СообщениеПользователю.Сообщить(); - - ЕстьОшибки = Истина; - - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(ДатаОкончанияПериодаЭкспорта) Тогда - - СообщениеПользователю = Новый СообщениеПользователю; - СообщениеПользователю.Поле = "ДатаОкончанияПериодаЭкспорта"; - СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Дата окончания"" не заполнено. - |Экспорт невозможен.'"); - СообщениеПользователю.Сообщить(); - - ЕстьОшибки = Истина; - - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(КаталогЭкспорта) Тогда - - СообщениеПользователю = Новый СообщениеПользователю; - СообщениеПользователю.Поле = "КаталогЭкспорта"; - СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Каталог экспорта"" не заполнено. - |Экспорт невозможен.'"); - СообщениеПользователю.Сообщить(); - - ЕстьОшибки = Истина; - - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(ИмяАрхива) Тогда - - СообщениеПользователю = Новый СообщениеПользователю; - СообщениеПользователю.Поле = "ИмяАрхива"; - СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Имя архива"" не заполнено. - |Экспорт невозможен.'"); - СообщениеПользователю.Сообщить(); - - ЕстьОшибки = Истина; - - КонецЕсли; - - Если ЗначениеЗаполнено(ДатаНачалаПериодаЭкспорта) И ЗначениеЗаполнено(ДатаОкончанияПериодаЭкспорта) И ДатаНачалаПериодаЭкспорта >= ДатаОкончанияПериодаЭкспорта Тогда - - СообщениеПользователю = Новый СообщениеПользователю; - СообщениеПользователю.Поле = "ДатаНачалаПериодаЭкспорта"; - СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Дата начала"" больше или равно значения параметры ""Дата окончания"". - |Экспорт невозможен.'"); - СообщениеПользователю.Сообщить(); - - ЕстьОшибки = Истина; - - КонецЕсли; - - Если ЕстьОшибки Тогда - Возврат; - КонецЕсли; - - АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор); + + Если ДатаНачалаПериодаЭкспорта >= ДатаОкончанияПериодаЭкспорта Тогда + СообщениеПользователю = Новый СообщениеПользователю; + СообщениеПользователю.Поле = "ДатаНачалаПериодаЭкспорта"; + СообщениеПользователю.Текст = НСтр("ru = 'Значение параметра ""Дата начала"" больше или равно значения параметры ""Дата окончания"". + |Экспорт невозможен.'"); + СообщениеПользователю.Сообщить(); + Возврат; + КонецЕсли; + + АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ЭтотОбъект.УникальныйИдентификатор); ПараметрыЭкспорта = Новый Структура; - ПараметрыЭкспорта.Вставить("ДатаНачала", ЭтаФорма.ДатаНачалаПериодаЭкспорта); - ПараметрыЭкспорта.Вставить("ДатаОкончания", ЭтаФорма.ДатаОкончанияПериодаЭкспорта); + ПараметрыЭкспорта.Вставить("ДатаНачала", ЭтотОбъект.ДатаНачалаПериодаЭкспорта); + ПараметрыЭкспорта.Вставить("ДатаОкончания", ЭтотОбъект.ДатаОкончанияПериодаЭкспорта); ПараметрыЭкспорта.Вставить("АдресХранилища", АдресХранилища); ВыполнитьЭкспортНаСервере(ПараметрыЭкспорта); ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища); УдалитьИзВременногоХранилища(АдресХранилища); - ДвоичныеДанные.Записать(ЭтаФорма.КаталогЭкспорта + ПолучитьРазделительПутиКлиента() + ЭтаФорма.ИмяАрхива + ".zip"); - + + Если ДвоичныеДанные <> Неопределено Тогда + ДвоичныеДанные.Записать(ЭтотОбъект.КаталогЭкспорта + ПолучитьРазделительПутиКлиента() + ЭтотОбъект.ИмяАрхива + ".zip"); + Иначе + СообщениеПользователю = Новый СообщениеПользователю; + СообщениеПользователю.Текст = НСтр("ru = 'За указанный период нет замеров. Файл архива не сформирован.'") + Символы.ПС; + СообщениеПользователю.Сообщить(); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl index 9d6c5bb30..c15ca6399 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl @@ -1,6 +1,6 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Функция формирует таблицу значений которая будет выведена пользователю. // @@ -41,14 +41,22 @@ // Функция динамически формирует запрос и получает APDEX. // // Параметры: -// ПараметрыВычисления - Структура, см. СтруктураПараметровДляРасчетаАпдекса(). +// ПараметрыВычисления - Структура - структура со свойствами: +// * ШагЧисло - Число - размер шага в секундах. +// * КоличествоШагов - Число - количество шагов в периоде. +// * ДатаНачала - Дата - дата начала замеров. +// * ДатаОкончания - Дата - дата окончания замеров. +// * ТаблицаКлючевыхОпераций - ТаблицаЗначений - Содержит данные для выбора. Колонки: +// ** КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция. +// ** НомерСтроки - Число - приоритет ключевой операции. +// ** Целевое время - Число - целевое время ключевой операции. +// * ВыводитьИтоги - Булево // // Возвращаемое значение: // ТаблицаЗначений - в таблице возвращается ключевая операция и // показатель производительности за определенный период времени. // Функция ВычислитьAPDEX(ПараметрыВычисления) Экспорт - Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТаблицаКлючевыхОпераций", ПараметрыВычисления.ТаблицаКлючевыхОпераций); Запрос.УстановитьПараметр("НачалоПериода", (ПараметрыВычисления.ДатаНачала - Дата(1,1,1))* 1000); @@ -291,8 +299,8 @@ // Вычисляет размер и количество шагов на заданном интервале. // // Параметры: -// ШагЧисло [OUT] - Число, количество секунд, которое надо прибавить к дате начала чтобы выполнить следующий шаг. -// КоличествоШагов [OUT] - Число, количество шагов на заданном интервале. +// ШагЧисло - Число - количество секунд, которое надо прибавить к дате начала чтобы выполнить следующий шаг. +// КоличествоШагов - Число - количество шагов на заданном интервале. // // Возвращаемое значение: // Булево - @@ -300,7 +308,6 @@ // Ложь, параметры не рассчитаны. // Функция ПериодичностьДиаграммы(ШагЧисло, КоличествоШагов) Экспорт - РазницаВремени = ДатаОкончания - ДатаНачала + 1; Если РазницаВремени <= 0 Тогда diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl new file mode 100644 index 000000000..659bd8ef0 --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl @@ -0,0 +1,16 @@ + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы", + Новый Структура, + ПараметрыВыполненияКоманды.Источник, + "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы" + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""), + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ПоддержкаИОбслуживание/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/Обслуживание/CommandModule.bsl similarity index 69% rename from SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ПоддержкаИОбслуживание/CommandModule.bsl rename to SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/Обслуживание/CommandModule.bsl index a3dfa07d9..96d11b5c4 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ПоддержкаИОбслуживание/CommandModule.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/Обслуживание/CommandModule.bsl @@ -5,10 +5,10 @@ Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОткрытьФорму( - "Обработка.ПанельАдминистрированияБСП.Форма.ПоддержкаИОбслуживание", + "Обработка.ПанельАдминистрированияБСП.Форма.Обслуживание", Новый Структура, ПараметрыВыполненияКоманды.Источник, - "Обработка.ПанельАдминистрированияБСП.Форма.ПоддержкаИОбслуживание" + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""), + "Обработка.ПанельАдминистрированияБСП.Форма.Обслуживание" + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""), ПараметрыВыполненияКоманды.Окно); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl index 3b45a18fc..279934120 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl @@ -4,7 +4,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда + Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда ИмяОткрываемойФормы = "Обработка.ПанельАдминистрированияБСП.Форма.СинхронизацияДанных"; Иначе ИмяОткрываемойФормы = "Обработка.ПанельАдминистрированияБСПВМоделиСервиса.Форма.СинхронизацияДанныхДляАдминистратораСервиса"; diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/УправлениеПолнотекстовымПоиском/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/УправлениеПолнотекстовымПоиском/CommandModule.bsl new file mode 100644 index 000000000..196f3550c --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/УправлениеПолнотекстовымПоиском/CommandModule.bsl @@ -0,0 +1,14 @@ + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + ИмяОткрываемойФормы = "Обработка.ПанельАдминистрированияБСП.Форма.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов"; + ОткрытьФорму(ИмяОткрываемойФормы, , ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ 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..a80c69033 --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Form.form @@ -0,0 +1,3678 @@ + + + + ГруппаЗаголовок + 1580 + + ОписаниеРаздела + 1581 + + <key>ru</key> + <value>Интернет-сервисы и поддержка. Обновление версии программы. Загрузка классификаторов.</value> + + true + true + + true + + + ОписаниеРазделаРасширеннаяПодсказка + 1601 + Label + true + true + + Left + + + + ОписаниеРазделаКонтекстноеМеню + 1582 + true + + Label + true + + Left + Top + + + + ГруппаСправка + 1583 + + Справка + 1584 + true + true + + true + + + СправкаExtendedTooltip + 1604 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Справка</value> + + + ГруппаСправкаExtendedTooltip + 1603 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Заголовок</value> + + + ГруппаЗаголовокExtendedTooltip + 1600 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + БИПГруппаНастройки + 1722 + + ГруппаПодключениеИПП + 1724 + + ДекорацияЛогинИПП + 1726 + + <key>ru</key> + <value><Логин ИПП></value> + + true + true + + true + + + ДекорацияЛогинИППРасширеннаяПодсказка + 1728 + Label + true + true + + Left + + + + ДекорацияЛогинИППКонтекстноеМеню + 1727 + true + + Label + true + true + + + URLProcessing + ДекорацияЛогинИППОбработкаНавигационнойСсылки + + Left + + + + ВойтиИлиВыйтиИПП + 1729 + true + true + + true + + + ВойтиИлиВыйтиИППРасширеннаяПодсказка + 1730 + + <key>ru</key> + <value>При отключении Интернет-поддержки логин и пароль для подключения к сервисам Интернет-поддержки будут удалены из программы.</value> + + Label + 36 + true + false + + Left + + + UsualButton + Form.Command.БИПВойтиИлиВыйти + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Подключение ИПП</value> + + + ru + Подключение к Интернет-поддержке пользователей + + true + true + false + + ГруппаПодключениеИППРасширеннаяПодсказка + 1725 + Label + true + true + + Left + + + UsualGroup + + Vertical + Half + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаНастройкиИППКолонки + 1731 + + ГруппаНастройкиИППЛеваяКолонка + 1733 + + БИПСообщениеВСлужбуТехническойПоддержки + 1735 + true + true + + true + + + БИПСообщениеВСлужбуТехническойПоддержкиРасширеннаяПодсказка + 1736 + Label + true + true + + Left + + + Hyperlink + Form.Command.БИПСообщениеВСлужбуТехническойПоддержки + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройки Интернет-поддержки левая колонка</value> + + 43 + false + + ГруппаНастройкиИППЛеваяКолонкаРасширеннаяПодсказка + 1734 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаНастройкиИПППраваяКолонка + 1737 + + БИПМониторИнтернетПоддержки + 1739 + true + true + + true + + + БИПМониторИнтернетПоддержкиРасширеннаяПодсказка + 1740 + Label + true + true + + Left + + + Hyperlink + Form.Command.БИПМониторИнтернетПоддержки + Normal + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройки Интернет-поддержки правая колонка</value> + + 43 + false + + ГруппаНастройкиИПППраваяКолонкаРасширеннаяПодсказка + 1738 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки ИПП колонки</value> + + + ГруппаНастройкиИППКолонкиРасширеннаяПодсказка + 1732 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + БИППодключатьсяКСерверамВЗонеEu + 1741 + + <key>ru</key> + <value>Подключаться к серверам в зоне *.1c.eu</value> + + true + true + + true + + + БИППодключатьсяКСерверамВЗонеEu + + Right + ShowBottom + + OnChange + БИППодключатьсяКСерверамВЗонеEuИзменении + + + БИППодключатьсяКСерверамВЗонеEuРасширеннаяПодсказка + 1743 + + <key>ru</key> + <value>По умолчанию подключение устанавливается к *.1c.ru. Некоторые сервисы работают только в зоне *.1c.ru.</value> + + Label + 38 + true + true + + Left + + + + БИППодключатьсяКСерверамВЗонеEuКонтекстноеМеню + 1742 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройки Интернет-поддержки</value> + + + БИПГруппаНастройкиРасширеннаяПодсказка + 1723 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаАдресныйКлассификатор + 1605 + + ГруппаАдресныйКлассификаторНастройки + 1607 + + ГруппаАдресныйКлассификаторЛеваяКолонка + 1609 + + ГруппаИсточникДанных + 1611 + + ГруппаИсточникДанныхВарианты + 1613 + + ИсточникДанныхФИАССервис1С + 1615 + true + true + + true + + + НаборКонстант.ИсточникДанныхАдресногоКлассификатора + + None + ShowBottom + + OnChange + АдресныйКлассификаторПриИзменении + + + ИсточникДанныхФИАССервис1СРасширеннаяПодсказка + 1617 + + <key>ru</key> + <value>Использовать веб-сервис, предоставляемый фирмой 1С. Требуется постоянное подключение к Интернету.</value> + + Label + true + + Left + + + + ИсточникДанныхФИАССервис1СКонтекстноеМеню + 1616 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Использовать веб-сервис 1С для ввода и проверки адресов + + + Сервис1С + + + Vertical + + + + ИсточникДанныхФИАСЛокально + 1618 + true + true + + true + + + НаборКонстант.ИсточникДанныхАдресногоКлассификатора + + None + ShowBottom + + OnChange + АдресныйКлассификаторПриИзменении + + + ИсточникДанныхФИАСЛокальноРасширеннаяПодсказка + 1620 + + <key>ru</key> + <value>Использовать данные, загружаемые с сайта 1С или из папки на диске. Возможна работа без подключения к Интернету.</value> + + Label + true + + Left + + + + ИсточникДанныхФИАСЛокальноКонтекстноеМеню + 1619 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Загружать классификатор в программу + + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Источник данных варианты</value> + + + ГруппаИсточникДанныхВариантыРасширеннаяПодсказка + 1614 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Источник данных</value> + + + Style.FormTextColor + + + Style.NormalTextFont + + + ГруппаИсточникДанныхРасширеннаяПодсказка + 1612 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор левая колонка</value> + + 43 + false + + ГруппаАдресныйКлассификаторЛеваяКолонкаРасширеннаяПодсказка + 1610 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаАдресныйКлассификаторПраваяКолонка + 1621 + + РегистрСведенийАдресныеОбъектыАвторизацияНаСайтеПоддержкиПользователей + 1623 + true + true + + true + + + РегистрСведенийАдресныеОбъектыАвторизацияНаСайтеПоддержкиПользователейРасширеннаяПодсказка + 1624 + + <key>ru</key> + <value>Для использования веб-сервиса 1С и загрузки обновлений адресного классификатора необходимо выполнить подключение к интернет-поддержке пользователей. +</value> + + Label + true + + Left + + + Hyperlink + InformationRegister.АдресныеОбъекты.Command.ПодключитьИнтернетПоддержку + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор правая колонка</value> + + 43 + false + + ГруппаАдресныйКлассификаторПраваяКолонкаРасширеннаяПодсказка + 1622 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор настройки</value> + + + System.DefaultGUIFont + 11.0 + true + false + false + false + + + ГруппаАдресныйКлассификаторНастройкиРасширеннаяПодсказка + 1608 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаАдресныйКлассификаторКоманды + 1625 + + ГруппаКомандАдресныйКлассификатор + 1627 + + АдресныйКлассификаторЛеваяКолонка + 1629 + + РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификатор + 1631 + + <key>ru</key> + <value>Загрузить классификатор</value> + + true + true + + true + + + РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификаторРасширеннаяПодсказка + 1632 + + <key>ru</key> + <value>Загрузка и проверка обновления адресного классификатора с сайта 1С или из папки на диске.</value> + + Label + true + + Left + + + Hyperlink + InformationRegister.АдресныеОбъекты.Command.ЗагрузитьАдресныйКлассификатор + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор левая колонка</value> + + 43 + false + + АдресныйКлассификаторЛеваяКолонкаРасширеннаяПодсказка + 1630 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + АдресныйКлассификаторПраваяКолонка + 1633 + + РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификатор + 1635 + + <key>ru</key> + <value>Очистить адресные сведения</value> + + true + true + + true + + + РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификаторРасширеннаяПодсказка + 1636 + + <key>ru</key> + <value>Удаление загруженных адресных сведений по выбранным, неиспользуемым регионам для уменьшения размера базы.</value> + + Label + true + + Left + + + Hyperlink + InformationRegister.АдресныеОбъекты.Command.ОчиститьАдресныйКлассификатор + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор правая колонка</value> + + 43 + false + + АдресныйКлассификаторПраваяКолонкаРасширеннаяПодсказка + 1634 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Команд адресный классификатор</value> + + + ГруппаКомандАдресныйКлассификаторРасширеннаяПодсказка + 1628 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор</value> + + + System.DefaultGUIFont + MS Shell Dlg + 11.0 + true + false + false + false + + + ГруппаАдресныйКлассификаторКомандыРасширеннаяПодсказка + 1626 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресный классификатор</value> + + + ГруппаАдресныйКлассификаторРасширеннаяПодсказка + 1606 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + Button + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаКлассификаторы + 1637 + + ГруппаЗагрузитьКлассификаторБанков + 1639 + + СправочникКлассификаторБанковРФЗагрузкаКлассификатораБанковРФ + 1641 + true + true + + true + + + СправочникКлассификаторБанковРФЗагрузкаКлассификатораБанковРФРасширеннаяПодсказка + 1642 + + <key>ru</key> + <value>Загрузка классификатора банков РФ с сайта 1С или диска 1С:ИТС.</value> + + Label + true + + Left + + + Hyperlink + DataProcessor.ЗагрузкаКлассификатораБанков.Command.ЗагрузкаКлассификатораБанков + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Загрузить классификатор банков</value> + + 43 + false + + ГруппаЗагрузитьКлассификаторБанковExtendedTooltip + 1640 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОбработкаЗагрузкаКурсовВалют + 1643 + + ОбработкаЗагрузкаКурсовВалютОткрыть + 1645 + true + true + + true + + + ОбработкаЗагрузкаКурсовВалютОткрытьРасширеннаяПодсказка + 1646 + + <key>ru</key> + <value>Загрузка курсов выбранных валют за указанный период с сайта 1С.</value> + + Label + true + + Left + + + Hyperlink + DataProcessor.ЗагрузкаКурсовВалют.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Обработка загрузка курсов валют</value> + + 43 + false + + ГруппаОбработкаЗагрузкаКурсовВалютExtendedTooltip + 1644 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Классификатор банков, загрузка курсов валют</value> + + + ГруппаКлассификаторыExtendedTooltip + 1638 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + БИПГруппаНовости + 1744 + + ГруппаВключениеНовостей + 1746 + + БИПВключитьРаботуСНовостями + 1748 + + <key>ru</key> + <value>Включить работу с новостями</value> + + true + true + + true + + + БИПВключитьРаботуСНовостями + + Right + + ru + Автоматическое получение новостей с серверов 1С, +настройки новостей и лент новостей. + + ShowBottom + + OnChange + БИПВключитьРаботуСНовостямиПриИзменении + + + БИПВключитьРаботуСНовостямиРасширеннаяПодсказка + 1750 + Label + true + true + + Left + Top + + + + БИПВключитьРаботуСНовостямиКонтекстноеМеню + 1749 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Включение новостей</value> + + true + 43 + false + + ГруппаВключениеНовостейРасширеннаяПодсказка + 1747 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаНастройкиНовостей + 1751 + + БИПУправлениеНовостями + 1753 + true + true + + true + + + БИПУправлениеНовостямиРасширеннаяПодсказка + 1754 + Label + true + true + + Left + + + Hyperlink + Form.Command.БИПУправлениеНовостями + Normal + Auto + 35 + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройки новостей</value> + + false + + ГруппаНастройкиНовостейРасширеннаяПодсказка + 1752 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Новости</value> + + true + true + false + + БИПГруппаНовостиРасширеннаяПодсказка + 1745 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + auto + Auto + Auto + + + + БИПГруппаОбновлениеПрограммы + 1755 + + ГруппаОбновлениеКолонки + 1757 + + ГруппаОбновлениеЛеваяКолонка + 1759 + + БИПОбновлениеПрограммы + 1761 + true + true + + true + + + БИПОбновлениеПрограммыРасширеннаяПодсказка + 1762 + Label + true + true + + Left + + + Hyperlink + Form.Command.БИПОбновлениеПрограммы + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Обновление левая колонка</value> + + 43 + false + + ГруппаОбновлениеЛеваяКолонкаРасширеннаяПодсказка + 1760 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОбновлениеПраваяКолонка + 1763 + + ГруппаОткрытьОписаниеИзмененийСистемы + 1765 + + ОткрытьОписаниеИзмененийСистемы + 1767 + true + true + + true + + + ОткрытьОписаниеИзмененийСистемыExtendedTooltip + 1768 + Label + true + true + + Left + + + Hyperlink + CommonForm.ОписаниеИзмененийПрограммы.StandardCommand.Open + Normal + Auto + true + true + UserCmds + Auto + + + ПояснениеОткрытьОписаниеИзмененийСистемы + 1769 + + <key>ru</key> + <value>История изменений по версиям программы.</value> + + true + true + + true + + + ПояснениеОткрытьОписаниеИзмененийСистемыExtendedTooltip + 1771 + Label + true + true + + Left + + + + ПояснениеОткрытьОписаниеИзмененийСистемыКонтекстноеМеню + 1770 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Открыть описание изменений системы</value> + + false + + ГруппаОткрытьОписаниеИзмененийСистемыExtendedTooltip + 1766 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление правая колонка</value> + + false + + ГруппаОбновлениеПраваяКолонкаРасширеннаяПодсказка + 1764 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление колонки</value> + + + ГруппаОбновлениеКолонкиРасширеннаяПодсказка + 1758 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаОбновлениеПрограммы_Настройки + 1772 + + АвтоматическаяПроверкаОбновлений + 1774 + true + true + + true + + + БИПАвтоматическаяПроверкаОбновлений + + Top + + OnChange + АвтоматическаяПроверкаОбновленийПриИзменении + + + АвтоматическаяПроверкаОбновленийРасширеннаяПодсказка + 1776 + Label + true + true + + Left + + + + АвтоматическаяПроверкаОбновленийКонтекстноеМеню + 1775 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Отключена + + + 0 + + + + + ru + При запуске программы + + + 1 + + + + + ru + По заданному расписанию + + + 2 + + + Vertical + + + + ГруппаРасписаниеПроверкиОбновлений + 1777 + + Декорация1 + 1779 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 1781 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 1780 + true + + Label + 4 + true + false + false + + Left + + + + ДекорацияРасписаниеПроверкиОбновлений + 1782 + + <key>ru</key> + <value>Настроить расписание</value> + + true + true + + true + + + ДекорацияРасписаниеПроверкиОбновленийРасширеннаяПодсказка + 1784 + Label + true + true + + Left + + + + ДекорацияРасписаниеПроверкиОбновленийКонтекстноеМеню + 1783 + true + + Label + 2 + true + true + + + Click + ДекорацияРасписаниеПроверкиОбновленийНажатие + + true + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Расписание проверки обновлений</value> + + true + + ГруппаРасписаниеПроверкиОбновленийРасширеннаяПодсказка + 1778 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление программы настройки</value> + + + Style.FormTextColor + + + Style.NormalTextFont + + true + 80 + false + false + + ГруппаОбновлениеПрограммы_НастройкиРасширеннаяПодсказка + 1773 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОбновлениеИОписаниеИзмененийВтораяСтрока + 1785 + + ГруппаОтложеннаяОбработкаДанных + 1787 + + РезультатыОбновленияИДополнительнаяОбработкаДанных + 1789 + true + true + + true + + + РезультатыОбновленияИДополнительнаяОбработкаДанныхExtendedTooltip + 1790 + + <key>ru</key> + <value>Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.</value> + + Label + true + true + + Left + + + Hyperlink + Form.Command.РезультатыОбновленияИДополнительнаяОбработкаДанных + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Отложенная обработка данных</value> + + 43 + false + + ГруппаОтложеннаяОбработкаДанныхExtendedTooltip + 1788 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДетализироватьОбновлениеИБВЖурналеРегистрации + 1791 + + ДетализироватьОбновлениеИБВЖурналеРегистрации + 1793 + + <key>ru</key> + <value>Детализировать ход обновления в журнале регистрации</value> + + true + true + + true + + + НаборКонстант.ДетализироватьОбновлениеИБВЖурналеРегистрации + + Right + ShowBottom + + OnChange + ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении + + + ДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip + 1795 + + <key>ru</key> + <value>Записывать в журнал регистрации подробную информацию о ходе выполнения обновления.</value> + + Label + true + true + + Left + + + + ДетализироватьОбновлениеИБВЖурналеРегистрацииКонтекстноеМеню + 1794 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Детализировать обновление ИБ в журнале регистрации</value> + + false + + ГруппаДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip + 1792 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление и описание изменений вторая строка</value> + + + ГруппаОбновлениеИОписаниеИзмененийВтораяСтрокаРасширеннаяПодсказка + 1786 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КаталогДистрибутиваПлатформы + 1796 + true + true + + true + + + БИПКаталогДистрибутиваПлатформы + + Top + + КаталогДистрибутиваПлатформыРасширеннаяПодсказка + 1798 + Label + true + true + + Left + + + + КаталогДистрибутиваПлатформыКонтекстноеМеню + 1797 + true + + LabelField + Enter + true + Left + true + + + Click + КаталогДистрибутиваПлатформыНажатие + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Обновление версии программы</value> + + 86 + false + + БИПГруппаОбновлениеПрограммыРасширеннаяПодсказка + 1756 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаПроверкаКонтрагентов + 1647 + + ПерваяГруппаНастроек + 1649 + + ЛеваяКолонкаПервойГруппы + 1651 + + ИспользоватьАвтоматическуюПроверкуКонтрагентов + 1653 + + <key>ru</key> + <value>Автоматически проверять контрагентов по ЕГРН</value> + + true + true + + true + + + НаборКонстант.ИспользоватьПроверкуКонтрагентов + + Right + ShowBottom + + OnChange + ИспользоватьПроверкуКонтрагентовПриИзменении + + + ИспользоватьАвтоматическуюПроверкуКонтрагентовРасширеннаяПодсказка + 1655 + + <key>ru</key> + <value><color #807a59>Включение автоматической проверки может замедлить открытие документов на медленных компьютерах. Для таких компьютеров рекомендуется использовать </><color #807a59>ручную</><color #807a59> проверку</><color #807a59> по кнопке в подменю "Еще".</> +<link e1cib/app/Обработка.ИнструкцияПоИспользованиюПроверкиКонтрагента>Подробнее о сервисе</></value> + + true + Label + true + + Left + + + + ИспользоватьАвтоматическуюПроверкуКонтрагентовКонтекстноеМеню + 1654 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Левая колонка первой группы</value> + + 43 + false + + ЛеваяКолонкаПервойГруппыРасширеннаяПодсказка + 1652 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПраваяКолонкаПервойГруппы + 1656 + + ПроверитьДоступКСервису + 1658 + + <key>ru</key> + <value>Проверить доступ к веб-сервису</value> + + true + true + + true + + + ПроверитьДоступКСервисуРасширеннаяПодсказка + 1659 + Label + true + true + + Left + + + UsualButton + CommonCommand.ПроверитьДоступКСервису + Normal + Auto + true + true + UserCmds + Auto + + + ПредупреждениеПроТестовыйРежимПроверкиКонтрагента + 1660 + + <key>ru</key> + <value><Предупреждение про тестовый режим работы сервиса></value> + + true + true + + true + + + ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаРасширеннаяПодсказка + 1662 + Label + true + true + + Left + + + + ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаКонтекстноеМеню + 1661 + true + + Label + true + + Left + + Style.ЦветФонаТестовогоРежимаСервисаФНС + + + + true + true + + true + + + <key>ru</key> + <value>Правая колонка первой группы</value> + + 43 + false + + ПраваяКолонкаПервойГруппыРасширеннаяПодсказка + 1657 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Первая группа настроек</value> + + + ПерваяГруппаНастроекРасширеннаяПодсказка + 1650 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Проверка контрагентов</value> + + + ГруппаПроверкаКонтрагентовРасширеннаяПодсказка + 1648 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + БИПГруппаСПАРКРиски + 1799 + + БИПИспользоватьСервисСПАРКРиски + 1801 + + <key>ru</key> + <value>Сервис 1СПАРК Риски</value> + + true + true + + true + + + БИПИспользоватьСервисСПАРКРиски + + Right + ShowBottom + + OnChange + БИПИспользоватьСервисСПАРКРискиПриИзменении + + + БИПИспользоватьСервисСПАРКРискиРасширеннаяПодсказка + 1803 + + <key>ru</key> + <value>Оценка надежности и мониторинг контрагентов в программах 1С для принятия взвешенных решений о сотрудничестве и минимизации налоговых рисков. +<link https://portal.1c.ru/app/1spark-risks/>Подробнее о сервисе</></value> + + true + Label + 44 + true + true + + Left + + + + БИПИспользоватьСервисСПАРКРискиКонтекстноеМеню + 1802 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>1СПАРК Риски</value> + + true + + БИПГруппаСПАРКРискиРасширеннаяПодсказка + 1800 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаИнтеграцияВызовОнлайнПоддержки + 1694 + + ГруппаРазрешениеНаВызовОнлайнПоддержки + 1696 + + ВызовОнлайнПоддержки + 1698 + + <key>ru</key> + <value>Онлайн-поддержка</value> + + true + true + + true + + + НаборКонстант.ИспользоватьОнлайнПоддержку + + Right + ShowBottom + + OnChange + ИнтеграцияВызовОнлайнПоддержкиПриИзменении + + + ВызовОнлайнПоддержкиРасширеннаяПодсказка + 1700 + + <key>ru</key> + <value>Разрешить запуск приложения для соединения со специалистом онлайн-поддержки.</value> + + Label + true + + Left + + + + ВызовОнлайнПоддержкиКонтекстноеМеню + 1699 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Разрешение на вызов онлайн поддержки</value> + + 43 + false + + ГруппаРазрешениеНаВызовОнлайнПоддержкиРасширеннаяПодсказка + 1697 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаНастройкаОнлайнПоддержки + 1701 + + НастройкаОнлайнПоддержки + 1703 + true + true + + true + + + НастройкаОнлайнПоддержкиРасширеннаяПодсказка + 1704 + + <key>ru</key> + <value>Настройка запуска приложения на этом компьютере.</value> + + Label + true + + Left + + + Hyperlink + CommonForm.НастройкаОнлайнПоддержки.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка онлайн поддержки</value> + + 43 + false + + ГруппаНастройкаОнлайнПоддержкиРасширеннаяПодсказка + 1702 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Онлайн-поддержка</value> + + + ГруппаИнтеграцияВызовОнлайнПоддержкиРасширеннаяПодсказка + 1695 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаСклонения + 1705 + + ГруппаРазрешениеСклонения + 1707 + + ИспользоватьСервисСклоненияMorpher + 1709 + + <key>ru</key> + <value>Склонять с помощью сервиса morpher.ru</value> + + true + true + + true + + + НаборКонстант.ИспользоватьСервисСклоненияMorpher + + Right + ShowBottom + + OnChange + Подключаемый_ПриИзмененииРеквизита + + + ИспользоватьСервисСклоненияMorpherРасширеннаяПодсказка + 1711 + + <key>ru</key> + <value>Разрешить использование сервиса склонения <link http://www.morpher.ru>morpher.ru</> для получения представлений объектов в падежах (требуется подключение к Интернет).</value> + + true + Label + true + + Left + + + + ИспользоватьСервисСклоненияMorpherКонтекстноеМеню + 1710 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Разрешение склонения</value> + + 43 + false + + ГруппаРазрешениеСклоненияРасширеннаяПодсказка + 1708 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаНастройкаСклонения + 1712 + + НастройкаДоступаКСервисуСклонения + 1714 + true + true + + true + + + НастройкаДоступаКСервисуСклоненияРасширеннаяПодсказка + 1715 + + <key>ru</key> + <value>Ввод параметров авторизации на сервере склонения.</value> + + Label + true + + Left + + + Hyperlink + CommonForm.НастройкаДоступаКСервисуMorpher.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка склонения</value> + + 43 + false + + ГруппаНастройкаСклоненияРасширеннаяПодсказка + 1713 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Склонения представлений объектов</value> + + + ГруппаСклоненияРасширеннаяПодсказка + 1706 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаЦентрМониторинга + 1663 + + ГруппаРазрешитьОтправлятьДанные + 1665 + + ДекорацияПояснение + 1667 + + <key>ru</key> + <value>Отчеты об использовании программы помогают нам определить, над чем следует поработать в первую очередь. +Собранные сведения являются обезличенными и содержат только статистические показатели. Подготовка +и отправка отчетов не замедлит работу программы.</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 1669 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 1668 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + ГруппаПереключатель + 1670 + + ДекорацияПереключатель + 1672 + true + true + + true + + + ДекорацияПереключательРасширеннаяПодсказка + 1674 + Label + true + true + + Left + + + + ДекорацияПереключательКонтекстноеМеню + 1673 + true + + Label + 1 + true + true + + Left + + + + ЦентрМониторингаРазрешитьОтправлятьДанные + 1675 + true + true + + true + + + ЦентрМониторингаРазрешитьОтправлятьДанные + + None + + OnChange + РазрешитьОтправлятьДанныеПриИзменении + + + ЦентрМониторингаРазрешитьОтправлятьДанныеРасширеннаяПодсказка + 1677 + Label + true + true + + Left + + + + ЦентрМониторингаРазрешитьОтправлятьДанныеКонтекстноеМеню + 1676 + true + + RadioButtonField + Enter + true + Left + true + + RadioButtons + 1 + + + ru + Разрешить автоматическую отправку сведений об использовании программы в фирму "1С" + + + 0 + + + + + ru + Разрешить отправку сведений стороннему разработчику + + + 1 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Переключатель</value> + + + ГруппаПереключательРасширеннаяПодсказка + 1671 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройка автоматической отправки сведений об использовании программы</value> + + + System.DefaultGUIFont + 11.0 + true + false + false + false + + + ГруппаРазрешитьОтправлятьДанныеРасширеннаяПодсказка + 1666 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОтправкиДанныхНастройкаРесурсаОбщая + 1678 + + ДекорацияАдресСервиса + 1680 + true + true + + true + + + ДекорацияАдресСервисаРасширеннаяПодсказка + 1682 + Label + true + true + + Left + + + + ДекорацияАдресСервисаКонтекстноеМеню + 1681 + true + + Label + 3 + true + true + + Left + + + + ЦентрМониторингаАдресСервиса + 1683 + + <key>ru</key> + <value>Адрес сервиса</value> + + true + true + + true + + + ЦентрМониторингаАдресСервиса + + + OnChange + ЦентрМониторингаАдресСервисаПриИзменении + + + ЦентрМониторингаАдресСервисаРасширеннаяПодсказка + 1685 + Label + true + true + + Left + + + + ЦентрМониторингаАдресСервисаКонтекстноеМеню + 1684 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отправки данных настройка ресурса общая</value> + + + ГруппаОтправкиДанныхНастройкаРесурсаОбщаяРасширеннаяПодсказка + 1679 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаЗапретитьОтправлятьДанные + 1686 + + ДекорацияЗапретитьОтправлятьДанные + 1688 + true + true + + true + + + ДекорацияЗапретитьОтправлятьДанныеРасширеннаяПодсказка + 1690 + Label + true + true + + Left + + + + ДекорацияЗапретитьОтправлятьДанныеКонтекстноеМеню + 1689 + true + + Label + 1 + true + true + + Left + + + + ЦентрМониторингаЗапретитьОтправлятьДанные + 1691 + true + true + + true + + + ЦентрМониторингаРазрешитьОтправлятьДанные + + None + + OnChange + РазрешитьОтправлятьДанныеПриИзменении + + + ЦентрМониторингаЗапретитьОтправлятьДанныеРасширеннаяПодсказка + 1693 + Label + true + true + + Left + + + + ЦентрМониторингаЗапретитьОтправлятьДанныеКонтекстноеМеню + 1692 + true + + RadioButtonField + Enter + true + Left + true + + RadioButtons + + + ru + Запретить отправку сведений + + + 2 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Запретить отправлять данные</value> + + + ГруппаЗапретитьОтправлятьДанныеРасширеннаяПодсказка + 1687 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Центр мониторинга</value> + + + ru + Группа оценка производительности + + + ГруппаЦентрМониторингаРасширеннаяПодсказка + 1664 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаВнешниеКомпоненты + 1716 + + ГруппаУправлениеВнешнимиКомпонентами + 1718 + + ОбработкаУправлениеВнешнимиКомпонентами + 1720 + + <key>ru</key> + <value>Настройка внешних компонент</value> + + true + true + + true + + + ОбработкаУправлениеВнешнимиКомпонентамиРасширеннаяПодсказка + 1721 + + <key>ru</key> + <value>Настройка автообновления внешних компонент сторонних поставщиков, подключенных к программе.</value> + + Label + true + true + + Left + + + Hyperlink + Catalog.ВнешниеКомпоненты.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Управление внешними компонентами</value> + + 43 + false + + ГруппаУправлениеВнешнимиКомпонентамиРасширеннаяПодсказка + 1719 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Внешние компоненты</value> + + + ГруппаВнешниеКомпонентыРасширеннаяПодсказка + 1717 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Write + WriteAndClose + Yes + DontBlock + true + true + true + Vertical + true + true + auto + true + + НаборКонстант + 1 + + ConstantsSet + + + true + + + true + +
          true
          +
          + + ЦентрМониторингаАдресСервиса + + <key>ru</key> + <value>Центр мониторинга адрес сервиса</value> + + 16 + + String + + + + true + + + true + + + + ЦентрМониторингаРазрешитьОтправлятьДанные + + <key>ru</key> + <value>Центр мониторинга разрешить отправлять данные</value> + + 17 + + Number + + 1 + true + + + + true + + + true + + + + БИПАвтоматическаяПроверкаОбновлений + + <key>ru</key> + <value>Автоматическая проверка обновлений</value> + + 18 + + Number + + 1 + + + + true + + + true + + + + БИПВключитьРаботуСНовостями + + <key>ru</key> + <value>Включить работу с новостями</value> + + 19 + + Boolean + + + true + + + true + + + + БИПДанныеАутентификации + + <key>ru</key> + <value>Данные аутентификации</value> + + 20 + + + true + + + true + + + + БИПИспользоватьСервисСПАРКРиски + + <key>ru</key> + <value>Сервис 1СПАРК Риски</value> + + 21 + + Boolean + + + true + + + true + + + + БИПКаталогДистрибутиваПлатформы + + <key>ru</key> + <value>Последний полученный дистрибутив платформы сохранен в каталог</value> + + 22 + + String + + + + true + + + true + + + + БИППодключатьсяКСерверамВЗонеEu + + <key>ru</key> + <value>Автоматическая проверка обновлений</value> + + 23 + + Number + + 1 + + + + true + + + true + + + + БИПВойтиИлиВыйти + + <key>ru</key> + <value>Подключить</value> + + 1 + + true + + + + БИПВойтиИлиВыйти + + + DontUse + Auto + + + БИПМониторИнтернетПоддержки + + <key>ru</key> + <value>Монитор Интернет-поддержки</value> + + 2 + + ru + Информация о поддержке программного продукта, +версии программы и др. + + + true + + + + БИПМониторИнтернетПоддержки + + + DontUse + Auto + + + БИПОбновлениеПрограммы + + <key>ru</key> + <value>Обновление программы</value> + + 3 + + ru + Получение информации об обновлениях программы и автоматическая установка обновлений. + + + true + + + + БИПОбновлениеПрограммы + + + DontUse + Auto + + + БИПСообщениеВСлужбуТехническойПоддержки + + <key>ru</key> + <value>Сообщение в службу технической поддержки</value> + + 4 + + ru + Отправка сообщения в службу технической поддержки + + + true + + + + БИПСообщениеВСлужбуТехническойПоддержки + + + DontUse + Auto + + + БИПУправлениеНовостями + + <key>ru</key> + <value>Управление новостями</value> + + 5 + + ru + Управление настройками новостей, а также ручное обновление классификаторов и списка новостей. + + + true + + + + БИПУправлениеНовостями + + + DontUse + Auto + + + РезультатыОбновленияИДополнительнаяОбработкаДанных + + <key>ru</key> + <value>Результаты обновления и дополнительная обработка данных</value> + + 6 + + ru + Результаты обновления и дополнительная обработка данных + + + true + + + + ОтложеннаяОбработкаДанных + + + DontUse + Auto + + + + + + +
          diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html new file mode 100644 index 000000000..1deeeb914 --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html @@ -0,0 +1,90 @@ + +

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

          +
          • Логин - сохраненный в программе логин, используемый для входа в систему Интернет-поддержки пользователей. Для входа в систему Интернет-поддержки пользователей используется тот же логин и пароль, что и на сайтах portal.1c.ru и portal.1c.eu. Если у вас еще нет логина и пароля, то выполните регистрацию самостоятельно или обратитесь за помощью к партнеру фирмы "1С", с которым у Вас заключен договор ИТС. +
          • Подключить - ввести логин и пароль для подключения ко всем сервисам Интернет-поддержки. Введенные логин и пароль будут сохранены в программе. +
          • Отключить - удалить из программы логин и пароль для подключения к сервисам Интернет-поддержки. +
          • Сообщение в службу технической поддержки - перейти на Портал 1С:ИТС для отправки сообщения в службу технической поддержки. К данным сообщения будет автоматически добавлена техническая информация о программе. +
          • Монитор Интернет-поддержки - информация о поддержке программного продукта, версии программы и др. +
          • Подключаться к серверам в зоне *.1c.eu - если настройка включена тогда подключение будет устанавливаться к серверу в зоне *.1c.eu при наличии сервера в этой зоне. По умолчанию подключение устанавливается к *.1c.ru.

          +

          Новости

          +
          • Управление новостями - управление настройками новостей, а также ручное обновление классификаторов и списка новостей.

          Обновление версии программы

          +

          +

          +

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

          1СПАРК Риски

          +

          Адресный классификатор

          +

          + + + + + +
          Выберите с помощью переключателя способ работы с адресными сведениями:
          +
        • Использовать веб-сервис 1С для ввода и проверки адресов
        • +

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

          +
        • Загружать классификатор в программу
        • +

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

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

          Классификатор банков, загрузка курсов валют

          +

          + + + + +
          +
        • Загрузить классификатор банков
        • Загрузка и обновление классификатора банков РФ из сети Интернет или диска 1С:ИТС.
          +
        • Загрузить курсы валют
        • Загрузка курсов валют из сети Интернет.

          Работа с контрагентами

          +

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

          +

          +

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

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

          +

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

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

          +

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

          Центр мониторинга

          +

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

          +

          С помощью переключателя выберите:

          +

          +

          + + + +
          +
        • Разрешить автоматическую отправку сведений об использовании программы в фирму "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..ede83798d --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Module.bsl @@ -0,0 +1,635 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем ОбновитьИнтерфейс; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ЭтоАдминистраторСистемы = Пользователи.ЭтоПолноправныйПользователь(, Истина); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + ВидимостьГруппыНастройки = Не РазделениеВключено; + Если ВидимостьГруппыНастройки Тогда + ВидимостьГруппыКоманды = Истина; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = + МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки() = Неопределено; + Иначе + ВидимостьГруппыНастройки = Ложь; + КонецЕсли; + Иначе + ВидимостьГруппыКоманды = Ложь; + КонецЕсли; + Элементы.ГруппаАдресныйКлассификаторНастройки.Видимость = ВидимостьГруппыНастройки; + Элементы.ГруппаАдресныйКлассификаторКоманды.Видимость = ВидимостьГруппыКоманды; + Иначе + Элементы.ГруппаАдресныйКлассификаторНастройки.Видимость = Ложь; + Элементы.ГруппаАдресныйКлассификаторКоманды.Видимость = Ложь; + КонецЕсли; + + Элементы.ГруппаКлассификаторы.Видимость = Не РазделениеВключено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки")Тогда + ИмяОбработки = "ЗагрузкаКлассификатораБанков"; + Элементы.ГруппаЗагрузитьКлассификаторБанков.Видимость = + Не РазделениеВключено + И Не ЭтоАвтономноеРабочееМесто + И ЭтоАдминистраторСистемы + И Метаданные.Обработки.Найти(ИмяОбработки) <> Неопределено; + Иначе + Элементы.ГруппаЗагрузитьКлассификаторБанков.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = + Не РазделениеВключено + И Не ЭтоАвтономноеРабочееМесто; + Иначе + Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + Элементы.ГруппаПроверкаКонтрагентов.Видимость = ЭтоАдминистраторСистемы; + Если Элементы.ГруппаПроверкаКонтрагентов.Видимость Тогда + МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); + МодульПроверкаКонтрагентов.УстановитьВидимостьИЗаголовокПредупрежденияПроТестовыйРежим( + Элементы.ПредупреждениеПроТестовыйРежимПроверкиКонтрагента); + КонецЕсли; + Иначе + Элементы.ГруппаПроверкаКонтрагентов.Видимость = Ложь; + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + Элементы.ГруппаСклонения.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда + Элементы.ГруппаИнтеграцияВызовОнлайнПоддержки.Видимость = + ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент(); + Иначе + Элементы.ГруппаИнтеграцияВызовОнлайнПоддержки.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + Элементы.ГруппаЦентрМониторинга.Видимость = ЭтоАдминистраторСистемы; + Если ЭтоАдминистраторСистемы Тогда + ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); + ЦентрМониторингаРазрешитьОтправлятьДанные = ПолучитьПереключательОтправкиДанных(ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга, ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме); + + ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); + Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыСервиса = Неопределено; + КонецЕсли; + + Если ПараметрыСервиса <> Неопределено Тогда + Если ПараметрыСервиса.Порт = 80 Тогда + Схема = "http://"; + Порт = ""; + ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда + Схема = "https://"; + Порт = ""; + Иначе + Схема = "http://"; + Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); + КонецЕсли; + + ЦентрМониторингаАдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; + Иначе + ЦентрМониторингаАдресСервиса = ""; + КонецЕсли; + + Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); + КонецЕсли; + Иначе + Элементы.ГруппаЦентрМониторинга.Видимость = Ложь; + КонецЕсли; + + ВидимостьГруппыВнешниеКомпоненты = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + + МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); + ВидимостьГруппыВнешниеКомпоненты = МодульВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаССайта(); + + КонецЕсли; + + Элементы.ГруппаВнешниеКомпоненты.Видимость = ВидимостьГруппыВнешниеКомпоненты; + + // Обновление состояния элементов. + УстановитьДоступность(); + + ОбрабатыватьНастройкиБИП = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + МодульИнтернетПоддержкаПользователейКлиентСервер = + ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); + ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(); + ОбрабатыватьНастройкиБИП = (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.2.1.1") >= 0); + КонецЕсли; + + Если ОбрабатыватьНастройкиБИП Тогда + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + МодульИнтернетПоддержкаПользователей.ИнтернетПоддержкаИСервисы_ПриСозданииНаСервере(ЭтотОбъект); + Иначе + Элементы.БИПГруппаНастройки.Видимость = Ложь; + Элементы.БИПГруппаНовости.Видимость = Ложь; + Элементы.БИПГруппаОбновлениеПрограммы.Видимость = Ложь; + Элементы.БИПГруппаСПАРКРиски.Видимость = Ложь; + КонецЕсли; + + НастройкиПрограммыПереопределяемый.ИнтернетПоддержкаИСервисыПриСозданииНаСервере(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИнтернетПоддержкаПодключена" Тогда + Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = Ложь; + ИначеЕсли ИмяСобытия = "ИнтернетПоддержкаОтключена" Тогда + Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + Если ЗавершениеРаботы Тогда + Возврат; + КонецЕсли; + ОбновитьИнтерфейсПрограммы(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура АдресныйКлассификаторПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент, Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьОтправлятьДанныеПриИзменении(Элемент) + Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); + Если ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Ложь); + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Истина); + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Истина, Ложь); + КонецЕсли; + ЦентрМониторингаАдресСервиса = ПолучитьАдресСервиса(); + РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторингаЗапись); +КонецПроцедуры + +&НаКлиенте +Процедура ЦентрМониторингаАдресСервисаПриИзменении(Элемент) + Попытка + СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(ЦентрМониторингаАдресСервиса); + + Если СтруктураАдреса.Схема = "http" Тогда + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); + ИначеЕсли СтруктураАдреса.Схема = "https" Тогда + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Истина); + Иначе + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СтруктураАдреса.Порт) Тогда + Если СтруктураАдреса.Схема = "http" Тогда + СтруктураАдреса.Порт = 80; + ИначеЕсли СтруктураАдреса.Схема = "https" Тогда + СтруктураАдреса.Порт = 443; + Иначе + СтруктураАдреса.Порт = 80; + КонецЕсли; + КонецЕсли; + Исключение + // Внимание, формат адреса должен соответствовать RFC 3986 + // см. описание функции ОбщегоНазначенияКлиентСервер.СтруктураURI. + ОписаниеОшибки = НСтр("ru = 'Адрес сервиса'") + " " + + ЦентрМониторингаАдресСервиса + " " + + НСтр("ru = 'не является допустимым адресом веб-сервиса для отправки отчетов об использовании программы.'"); + ВызватьИсключение(ОписаниеОшибки); + КонецПопытки; + + ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса); +КонецПроцедуры + +&НаКлиенте +Процедура ИнтеграцияВызовОнлайнПоддержкиПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПроверкуКонтрагентовПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияЛогинИППОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + МодульИнтернетПоддержкаПользователейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); + МодульИнтернетПоддержкаПользователейКлиент.ИнтернетПоддержкаИСервисы_ДекорацияОбработкаНавигационнойСсылки( + ЭтотОбъект, + Элемент, + НавигационнаяСсылкаФорматированнойСтроки, + СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура БИППодключатьсяКСерверамВЗонеEuИзменении(Элемент) + + МодульИнтернетПоддержкаПользователейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); + МодульИнтернетПоддержкаПользователейКлиент.ИнтернетПоддержкаИСервисы_ПодключатьсяКСерверамВЗонеEuИзменении( + ЭтотОбъект, + Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПВключитьРаботуСНовостямиПриИзменении(Элемент) + + МодульОбработкаНовостейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбработкаНовостейКлиент"); + МодульОбработкаНовостейКлиент.ИнтернетПоддержкаИСервисы_ВключитьРаботуСНовостямиПриИзменении( + ЭтотОбъект, + Элемент); + ОбновитьИнтерфейс = Истина; + ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПИспользоватьСервисСПАРКРискиПриИзменении(Элемент) + + МодульСПАРКРискиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СПАРКРискиКлиент"); + МодульСПАРКРискиКлиент.ИнтернетПоддержкаИСервисы_ИспользоватьСервисСПАРКРискиПриИзменении( + ЭтотОбъект, + Элемент); + ОбновитьИнтерфейс = Истина; + ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура АвтоматическаяПроверкаОбновленийПриИзменении(Элемент) + + МодульПолучениеОбновленийПрограммыКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); + МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_АвтоматическаяПроверкаОбновленийПриИзменении( + ЭтотОбъект, + Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияРасписаниеПроверкиОбновленийНажатие(Элемент) + + МодульПолучениеОбновленийПрограммыКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); + МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ДекорацияРасписаниеПроверкиОбновленийНажатие( + ЭтотОбъект, + Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура КаталогДистрибутиваПлатформыНажатие(Элемент, СтандартнаяОбработка) + + МодульПолучениеОбновленийПрограммыКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); + МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_КаталогДистрибутиваПлатформыНажатие( + ЭтотОбъект, + Элемент, + СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +// СтандартныеПодсистемы.ОбновлениеВерсииИБ +&НаКлиенте +Процедура ОтложеннаяОбработкаДанных(Команда) + + ПараметрыФормы = Новый Структура("ОткрытиеИзПанелиАдминистрирования", Истина); + ОткрытьФорму( + "Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ", + ПараметрыФормы); + +КонецПроцедуры +// Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ + +&НаКлиенте +Процедура БИПВойтиИлиВыйти(Команда) + + МодульИнтернетПоддержкаПользователейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); + МодульИнтернетПоддержкаПользователейКлиент.ИнтернетПоддержкаИСервисы_БИПВойтиИлиВыйти( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПСообщениеВСлужбуТехническойПоддержки(Команда) + + МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); + МодульИнтернетПоддержкаПользователейКлиент.ИнтернетПоддержкаИСервисы_СообщениеВСлужбуТехническойПоддержки( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПМониторИнтернетПоддержки(Команда) + + МодульМониторИнтернетПоддержкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МониторИнтернетПоддержкиКлиент"); + МодульМониторИнтернетПоддержкиКлиент.ИнтернетПоддержкаИСервисы_МониторИнтернетПоддержки( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПУправлениеНовостями(Команда) + + МодульОбработкаНовостейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбработкаНовостейКлиент"); + МодульОбработкаНовостейКлиент.ИнтернетПоддержкаИСервисы_УправлениеНовостями( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура БИПОбновлениеПрограммы(Команда) + + МодульПолучениеОбновленийПрограммыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); + МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ОбновлениеПрограммы( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Клиент + +&НаКлиенте +Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, НеобходимоОбновлятьИнтерфейс = Истина) + + КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя); + + ОбновитьПовторноИспользуемыеЗначения(); + + Если НеобходимоОбновлятьИнтерфейс Тогда + ОбновитьИнтерфейс = Истина; + ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); + КонецЕсли; + + Если КонстантаИмя <> "" Тогда + Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнтерфейсПрограммы() + + Если ОбновитьИнтерфейс = Истина Тогда + ОбновитьИнтерфейс = Ложь; + ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьАдресСервиса() + + ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); + + ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); + + Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыСервиса = Неопределено; + КонецЕсли; + + Если ПараметрыСервиса <> Неопределено Тогда + Если ПараметрыСервиса.Порт = 80 Тогда + Схема = "http://"; + Порт = ""; + ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда + Схема = "https://"; + Порт = ""; + Иначе + Схема = "http://"; + Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); + КонецЕсли; + + АдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; + Иначе + АдресСервиса = ""; + КонецЕсли; + + Возврат АдресСервиса; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера + +&НаСервере +Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента) + + РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным; + + КонстантаИмя = СохранитьЗначениеРеквизита(РеквизитПутьКДанным); + + УстановитьДоступность(РеквизитПутьКДанным); + + Если ИмяЭлемента = "ИспользоватьСервисСклоненияMorpher" + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); + МодульСклонениеПредставленийОбъектов.УстановитьДоступностьСервисаСклонения(Истина); + КонецЕсли; + + ОбновитьПовторноИспользуемыеЗначения(); + + Возврат КонстантаИмя; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сервер + +&НаСервере +Процедура УстановитьДоступность(РеквизитПутьКДанным = "") + + Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") + И (РеквизитПутьКДанным = "НаборКонстант.ИсточникДанныхАдресногоКлассификатора" + Или РеквизитПутьКДанным = "") Тогда + + Элементы.ГруппаАдресныйКлассификаторКоманды.Доступность = ПустаяСтрока(НаборКонстант.ИсточникДанныхАдресногоКлассификатора); + КонецЕсли; + + Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьОнлайнПоддержку" Или РеквизитПутьКДанным = "") + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда + Элементы.ГруппаНастройкаОнлайнПоддержки.Доступность = НаборКонстант.ИспользоватьОнлайнПоддержку; + КонецЕсли; + + Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисСклоненияMorpher" Или РеквизитПутьКДанным = "") + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "ГруппаНастройкаСклонения", "Доступность", + НаборКонстант.ИспользоватьСервисСклоненияMorpher); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным) + + // Сохранение значений реквизитов, не связанных с константами напрямую. + Если РеквизитПутьКДанным = "" Тогда + Возврат ""; + КонецЕсли; + + // Определение имени константы. + КонстантаИмя = ""; + Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда + // Если путь к данным реквизита указан через "НаборКонстант". + КонстантаИмя = Сред(РеквизитПутьКДанным, 15); + Иначе + // Определение имени и запись значения реквизита в соответствующей константе из "НаборКонстант". + // Используется для тех реквизитов формы, которые связаны с константами напрямую (в отношении один-к-одному). + КонецЕсли; + + // Сохранения значения константы. + Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда + КонстантаМенеджер = Константы[КонстантаИмя]; + КонстантаЗначение = НаборКонстант[КонстантаИмя]; + + Если КонстантаИмя = "ИспользоватьПроверкуКонтрагентов" + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда + + ВключитьПроверку = КонстантаЗначение = 1; + МодульПроверкаКонтрагентовВызовСервера = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентовВызовСервера"); + МодульПроверкаКонтрагентовВызовСервера.ПриВключенииВыключенииПроверки(ВключитьПроверку); + Иначе + КонстантаМенеджер.Установить(КонстантаЗначение); + КонецЕсли; + + КонецЕсли; + + Возврат КонстантаИмя; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме) + Состояние = ?(ВключитьЦентрМониторинга, "1", "0") + ?(ЦентрОбработкиИнформацииОПрограмме, "1", "0"); + + Если Состояние = "00" Тогда + Результат = 2; + ИначеЕсли Состояние = "01" Тогда + Результат = 1; + ИначеЕсли Состояние = "10" Тогда + Результат = 0; + ИначеЕсли Состояние = "11" Тогда + // А такого быть не может... + КонецЕсли; + + Возврат Результат; +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьПараметрыЦентраМониторинга() + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + ПараметрыЦентраМониторинга = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторингаВнешнийВызов(); + + ПараметрыСервисаПоУмолчанию = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыПоУмолчаниюВнешнийВызов(); + ПараметрыЦентраМониторинга.Вставить("СерверПоУмолчанию", ПараметрыСервисаПоУмолчанию.Сервер); + ПараметрыЦентраМониторинга.Вставить("АдресРесурсаПоУмолчанию", ПараметрыСервисаПоУмолчанию.АдресРесурса); + ПараметрыЦентраМониторинга.Вставить("ПортПоУмолчанию", ПараметрыСервисаПоУмолчанию.Порт); + + Возврат ПараметрыЦентраМониторинга; +КонецФункции + +&НаСервереБезКонтекста +Процедура РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторинга) + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); + + ВключитьЦентрМониторинга = ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга; + ЦентрОбработкиИнформацииОПрограмме = ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме; + + Результат = ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме); + + Если Результат = 0 Тогда + РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); + МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); + ИначеЕсли Результат = 1 Тогда + РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); + МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); + ИначеЕсли Результат = 2 Тогда + МодульЦентрМониторингаСлужебный.УдалитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики"); + КонецЕсли; +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса) + ПараметрыЦентраМониторинга = Новый Структура(); + ПараметрыЦентраМониторинга.Вставить("Сервер", СтруктураАдреса.Хост); + ПараметрыЦентраМониторинга.Вставить("АдресРесурса", СтруктураАдреса.ПутьНаСервере); + ПараметрыЦентраМониторинга.Вставить("Порт", СтруктураАдреса.Порт); + ПараметрыЦентраМониторинга.Вставить("ЗащищенноеСоединение", СтруктураАдреса.ЗащищенноеСоединение); + + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form index 73225d874..1b0cb7de4 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form @@ -31,6 +31,7 @@ true Label + 78 true Left @@ -71,6 +72,10 @@ true + + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 2040 @@ -91,6 +96,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 2037 @@ -114,55 +123,23 @@ ГруппаПользователи 830 - ГруппыПользователейИНастройкиВхода + ГруппаПользователиИГруппы 1876 - - Пользователи - 2140 - - ОткрытьПользователи - 831 - true - true - - true - - - ОткрытьПользователиExtendedTooltip - 2044 - - <key>ru</key> - <value>Ведение списка пользователей, которые работают с программой.</value> - - Label - true - true - - Left - - - Hyperlink - Catalog.Пользователи.StandardCommand.OpenList - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - + + ОткрытьПользователи + 831 true true true - - <key>ru</key> - <value>Пользователи</value> - - ПользователиРасширеннаяПодсказка - 2141 + ОткрытьПользователиExtendedTooltip + 2044 + + <key>ru</key> + <value>Ведение списка пользователей, которые работают с программой.</value> + Label true true @@ -170,78 +147,44 @@ Left
          - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + Hyperlink + Catalog.Пользователи.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto
          - - ГруппыПользователей - 1877 - - ИспользоватьГруппыПользователей - 697 - - <key>ru</key> - <value>Группы пользователей</value> - - true - true - - true - - - НаборКонстант.ИспользоватьГруппыПользователей - - Right - - ru - Объединение пользователей в группы. - - ShowBottom - - OnChange - ИспользоватьГруппыПользователейПриИзменении - - - ИспользоватьГруппыПользователейExtendedTooltip - 2047 - Label - true - true - - Left - - - - ИспользоватьГруппыПользователейКонтекстноеМеню - 698 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - + + ИспользоватьГруппыПользователей + 697 <key>ru</key> <value>Группы пользователей</value> + true + true + + true + + + НаборКонстант.ИспользоватьГруппыПользователей + + Right + + ru + Объединение пользователей в группы. + + ShowBottom + + OnChange + ИспользоватьГруппыПользователейПриИзменении + - ГруппыПользователейРасширеннаяПодсказка - 2046 + ИспользоватьГруппыПользователейExtendedTooltip + 2047 Label true true @@ -249,15 +192,17 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + + ИспользоватьГруппыПользователейКонтекстноеМеню + 698 + true + + CheckBoxField + Enter + true + Left + true + true true @@ -266,12 +211,12 @@ <key>ru</key> - <value>Группы пользователей и настройки входа</value> + <value>Пользователи и группы</value> 43 false - ГруппыПользователейИНастройкиВходаРасширеннаяПодсказка + ГруппаПользователиИГруппыРасширеннаяПодсказка 2043 Label true @@ -291,11 +236,11 @@ - ГруппаНастройкиВхода + ГруппаНастройкиВходаПользователей 2142 НастройкиВхода - 2138 + 2196 <key>ru</key> <value>Настройки входа</value> @@ -307,7 +252,7 @@ </userVisible> <extendedTooltip> <name>НастройкиВходаРасширеннаяПодсказка</name> - <id>2139</id> + <id>2197</id> <title> <key>ru</key> <value>Сложность и смена паролей, ограничение работы неактивных пользователей.</value> @@ -320,7 +265,7 @@ </extInfo> </extendedTooltip> <type>Hyperlink</type> - <commandName>Form.Command.НастройкиВходаПользователей</commandName> + <commandName>CommonForm.НастройкиВходаПользователей.StandardCommand.Open</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -336,12 +281,12 @@ </userVisible> <title> <key>ru</key> - <value>Группа настройки входа</value> + <value>Настройки входа пользователей</value> 43 false - ГруппаНастройкиВходаРасширеннаяПодсказка + ГруппаНастройкиВходаПользователейРасширеннаяПодсказка 2143 Label true @@ -396,7 +341,7 @@ ГруппаВнешниеПользователи 852 - ИспользованиеВнешнихПользователей + ГруппаИспользоватьВнешнихПользователей 1883 ИспользоватьВнешнихПользователей @@ -452,12 +397,12 @@ <key>ru</key> - <value>Использование внешних пользователей</value> + <value>Использовать внешних пользователей</value> 43 false - ИспользованиеВнешнихПользователейРасширеннаяПодсказка + ГруппаИспользоватьВнешнихПользователейРасширеннаяПодсказка 2071 Label true @@ -477,21 +422,25 @@ - Группа10 + ГруппаВнешниеПользователиИНастройкиВхода 2192 - Группа7 + ГруппаВнешниеПользователиСОтступом 2186 - ГоризонтальныйОтступ2 + ГоризонтальныйОтступ1 2158 + + <key>ru</key> + <value>Горизонтальный отступ</value> + true true true - ГоризонтальныйОтступ2РасширеннаяПодсказка + ГоризонтальныйОтступ1РасширеннаяПодсказка 2160 Label true @@ -501,65 +450,31 @@ - ГоризонтальныйОтступ2КонтекстноеМеню + ГоризонтальныйОтступ1КонтекстноеМеню 2159 true - Label 1 true + 1 true - - Left - + - - ВнешниеПользователи - 855 - - ОткрытьВнешниеПользователи - 2031 - true - true - - true - - - ОткрытьВнешниеПользователиРасширеннаяПодсказка - 2075 - - <key>ru</key> - <value>Ведение списка внешних пользователей, которым предоставлен удаленный доступ к программе.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.ВнешниеПользователи - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - + + ОткрытьВнешниеПользователи + 2031 true true true - - <key>ru</key> - <value>Внешние пользователи</value> - - ВнешниеПользователиРасширеннаяПодсказка - 2074 + ОткрытьВнешниеПользователиРасширеннаяПодсказка + 2075 + + <key>ru</key> + <value>Ведение списка внешних пользователей, которым предоставлен удаленный доступ к программе.</value> + Label true true @@ -567,25 +482,29 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + Hyperlink + Form.Command.ВнешниеПользователи + Normal + Auto + true + true + UserCmds + ShowBottom + Auto true true true + + <key>ru</key> + <value>Внешние пользователи с отступом</value> + 43 false - Группа7РасширеннаяПодсказка + ГруппаВнешниеПользователиСОтступомРасширеннаяПодсказка 2187 Label true @@ -604,59 +523,27 @@ - Группа8 - 2188 - - ГруппаНастройкиВходаВнешнихПользователей - 2147 - - НастройкиВходаВнешнихПользователей - 2149 - - <key>ru</key> - <value>Настройки входа</value> - - true - true - - true - - - НастройкиВходаВнешнихПользователейРасширеннаяПодсказка - 2150 - - <key>ru</key> - <value>Сложность и смена паролей, ограничение работы неактивных внешних пользователей.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкиВходаВнешнихПользователей - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - + ГруппаНастройкиВходаВнешнихПользователей + 2147 + + НастройкиВходаВнешнихПользователей + 2149 + + <key>ru</key> + <value>Настройки входа</value> + true true true - - <key>ru</key> - <value>Группа настройки входа внешних пользователей</value> - - ГруппаНастройкиВходаВнешнихПользователейРасширеннаяПодсказка - 2148 + НастройкиВходаВнешнихПользователейРасширеннаяПодсказка + 2150 + + <key>ru</key> + <value>Сложность и смена паролей, ограничение работы неактивных внешних пользователей.</value> + Label true true @@ -664,26 +551,30 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + Hyperlink + Form.Command.НастройкиВходаВнешнихПользователей + Normal + Auto + true + true + UserCmds + ShowBottom + Auto true true true + + <key>ru</key> + <value>Настройки входа внешних пользователей</value> + 43 false - Группа8РасширеннаяПодсказка - 2189 + ГруппаНастройкиВходаВнешнихПользователейРасширеннаяПодсказка + 2148 Label true true @@ -706,9 +597,13 @@ true + + <key>ru</key> + <value>Внешние пользователи и настройки входа</value> + false - Группа10РасширеннаяПодсказка + ГруппаВнешниеПользователиИНастройкиВходаРасширеннаяПодсказка 2193 Label true @@ -763,140 +658,26 @@ ГруппаГруппыДоступа 2174 - ПрофилиИГруппыДоступа + ГруппаГруппыДоступаПрофилиИОграничениеНаУровнеЗаписей 838 - Группа2 + ГруппаГруппыДоступаИОграничениеНаУровнеЗаписей 2176 - - ГруппыДоступа - 848 - - ОткрытьГруппыДоступа - 849 - true - true - - true - - - ОткрытьГруппыДоступаExtendedTooltip - 2052 - - <key>ru</key> - <value>Групповая настройка прав доступа.</value> - - Label - true - true - - Left - - - Hyperlink - Catalog.ГруппыДоступа.StandardCommand.OpenList - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - + + ОткрытьГруппыДоступа + 849 true true true - - <key>ru</key> - <value>Группы доступа</value> - - - ru - Группы доступа - - ГруппыДоступаРасширеннаяПодсказка - 2051 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОграничиватьДоступНаУровнеЗаписей - 1881 - - ОграничиватьДоступНаУровнеЗаписей - 701 - true - true - - true - - - НаборКонстант.ОграничиватьДоступНаУровнеЗаписей - - Right - + ОткрытьГруппыДоступаExtendedTooltip + 2052 + <key>ru</key> - <value>Расширенная настройка, позволяющая максимально гибко настраивать права доступа к справочникам, документам и другим данным программы в предусмотренных разрезах.</value> - </toolTip> - <toolTipRepresentation>ShowBottom</toolTipRepresentation> - <handlers> - <event>OnChange</event> - <name>ОграничиватьДоступНаУровнеЗаписейПриИзменении</name> - </handlers> - <extendedTooltip> - <name>ОграничиватьДоступНаУровнеЗаписейExtendedTooltip</name> - <id>2058</id> - <type>Label</type> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ОграничиватьДоступНаУровнеЗаписейКонтекстноеМеню</name> - <id>702</id> - <autoFill>true</autoFill> - </contextMenu> - <type>CheckBoxField</type> - <editMode>Auto</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:CheckBoxFieldExtInfo"/> - </items> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>Группа ограничивать доступ на уровне записей</value> - - - ru - Группа ограничивать доступ на уровне записей - - - ГруппаОграничиватьДоступНаУровнеЗаписейExtendedTooltip - 2057 + Групповая настройка прав доступа. + Label true true @@ -904,25 +685,71 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + Hyperlink + Catalog.ГруппыДоступа.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + + ОграничиватьДоступНаУровнеЗаписей + 701 + true + true + + true + + + НаборКонстант.ОграничиватьДоступНаУровнеЗаписей + + Right + + ru + Расширенная настройка, позволяющая максимально гибко настраивать права доступа к справочникам, документам и другим данным программы в предусмотренных разрезах. + + ShowBottom + + OnChange + ОграничиватьДоступНаУровнеЗаписейПриИзменении + + + ОграничиватьДоступНаУровнеЗаписейExtendedTooltip + 2058 + Label + true + + Left + + + + ОграничиватьДоступНаУровнеЗаписейКонтекстноеМеню + 702 + true + + CheckBoxField + Auto + true + Left + true + true true true + + <key>ru</key> + <value>Группы доступа и ограничение на уровне записей</value> + 43 false - Группа2РасширеннаяПодсказка + ГруппаГруппыДоступаИОграничениеНаУровнеЗаписейРасширеннаяПодсказка 2177 Label true @@ -942,7 +769,7 @@ - ПрофилиГруппДоступа + ГруппаПрофилиГруппДоступа 844 ОткрытьПрофилиГруппДоступа @@ -985,14 +812,10 @@ ru Профили групп доступа - - ru - Профили групп доступа - 43 false - ПрофилиГруппДоступаРасширеннаяПодсказка + ГруппаПрофилиГруппДоступаРасширеннаяПодсказка 2054 Label true @@ -1016,8 +839,12 @@ true + + <key>ru</key> + <value>Группы доступа, профили и ограничение на уровне записей</value> + - ПрофилиИГруппыДоступаРасширеннаяПодсказка + ГруппаГруппыДоступаПрофилиИОграничениеНаУровнеЗаписейРасширеннаяПодсказка 2049 Label true @@ -1116,12 +943,8 @@ <key>ru</key> - <value>Группа копирование настроек пользователей</value> + <value>Копирование настроек пользователей</value> - - ru - Группа копирование настроек пользователей - 43 false @@ -1185,12 +1008,8 @@ <key>ru</key> - <value>Группа настройки пользователей</value> + <value>Настройки пользователей</value> - - ru - Группа настройки пользователей - 43 false @@ -1220,12 +1039,8 @@ <key>ru</key> - <value>Группа работа с настройками пользователей</value> + <value>Работа с настройками пользователей</value> - - ru - Группа работа с настройками пользователей - ГруппаРаботаСНастройкамиПользователейРасширеннаяПодсказка 2060 @@ -1285,6 +1100,10 @@ true + + <key>ru</key> + <value>Очистка настроек пользователей</value> + 43 false @@ -1316,10 +1135,6 @@ ru Персональные настройки пользователей - - ru - Группа персональные настройки пользователей - ГруппаПерсональныеНастройкиПользователейРасширеннаяПодсказка 2195 @@ -1344,11 +1159,366 @@ Auto + + ГруппаДатыЗапретаИзменения + 2198 + + ГруппаДатыЗапретаИзмененияИспользование + 2200 + + ИспользоватьДатыЗапретаИзменения + 2202 + + <key>ru</key> + <value>Даты запрета изменения</value> + + true + true + + true + + + НаборКонстант.ИспользоватьДатыЗапретаИзменения + + Right + + ru + Запрет изменения данных прошлых периодов. + + ShowBottom + + OnChange + Подключаемый_ПриИзмененииРеквизита + + + ИспользоватьДатыЗапретаИзмененияРасширеннаяПодсказка + 2204 + Label + true + true + + Left + + + + ИспользоватьДатыЗапретаИзмененияКонтекстноеМеню + 2203 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Даты запрета изменения использование</value> + + 43 + false + + ГруппаДатыЗапретаИзмененияИспользованиеРасширеннаяПодсказка + 2201 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДатыЗапретаИзмененияНастройка + 2205 + + РегистрСведенийДатыЗапретаИзмененияДатыЗапретаИзмененияДанных + 2207 + + <key>ru</key> + <value>Настроить</value> + + true + true + + true + + + РегистрСведенийДатыЗапретаИзмененияДатыЗапретаИзмененияДанныхРасширеннаяПодсказка + 2208 + + <key>ru</key> + <value>Настроить даты запрета изменения</value> + + Label + true + true + + Left + + + Hyperlink + InformationRegister.ДатыЗапретаИзменения.Command.ДатыЗапретаИзмененияДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Даты запрета изменения настройка</value> + + + ГруппаДатыЗапретаИзмененияНастройкаРасширеннаяПодсказка + 2206 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Даты запрета изменения</value> + + 43 + false + + ГруппаДатыЗапретаИзмененияРасширеннаяПодсказка + 2199 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаЗащитаПерсональныхДанных + 2209 + + ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным + 2211 + + ОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным + 2213 + true + true + + true + + + ОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДаннымExtendedTooltip + 2214 + + <key>ru</key> + <value>Регистрация событий доступа в соответствии с требованиями Федерального закона от 27.07.2006 N152-ФЗ "О персональных данных".</value> + + Label + true + + Left + + + Hyperlink + CommonForm.НастройкиРегистрацииСобытийДоступаКПерсональнымДанным.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Открыть настройки регистрации событий доступа к персональным данным</value> + + 43 + false + + ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДаннымExtendedTooltip + 2212 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОбработкаЗащитаПерсональныхДанных + 2215 + + ОбработкаЗащитаПерсональныхДанных + 2217 + true + true + + true + + + ОбработкаЗащитаПерсональныхДанныхExtendedTooltip + 2218 + + <key>ru</key> + <value>Просмотр обращений к персональным данным выбранных объектов программы.</value> + + Label + true + + Left + + + Hyperlink + DataProcessor.ЗащитаПерсональныхДанных.Command.ЗащитаПерсональныхДанных + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Обработка защита персональных данных</value> + + 43 + false + + ГруппаОбработкаЗащитаПерсональныхДанныхExtendedTooltip + 2216 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Защита персональных данных</value> + + + ГруппаЗащитаПерсональныхДанныхExtendedTooltip + 2210 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + ФормаКоманднаяПанель -1 Left + + NotificationProcessing + ОбработкаОповещения + OnCreateAtServer ПриСозданииНаСервере @@ -1401,6 +1571,9 @@ НаборКонстант.ИзменятьЗаданияЗаднимЧислом + + НаборКонстант.ИспользоватьАнкетирование + НаборКонстант.ИспользоватьБизнесПроцессыИЗадачи @@ -1475,21 +1648,6 @@
          true
          - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 15 - - - true - - - true - - ВнешниеПользователи @@ -1512,24 +1670,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>НастройкиВходаПользователей</name> - <title> - <key>ru</key> - <value>Настройки входа пользователей</value> - - 2 - - true - - - - НастройкиВходаПользователей - - - DontUse - Auto - НастройкиВходаВнешнихПользователей diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html index dc274a8eb..0cccef90b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html @@ -11,17 +11,23 @@ TD { <ul><a name="СтандартныеПодсистемы.Пользователи"> <li><a href="Catalog.Пользователи/Help">Пользователи</a> - администрирование пользователей, которые работают с программой. </li><li><a href="CommonForm.НастройкиВходаПользователей/Help">Настройки входа</a> - переход к настройкам сложности и смены паролей пользователей. Можно установить сроки действия паролей, а также ограничение работы неактивных пользователей. -</li><li><strong>Группы пользователей - </strong>включите флажок, для того чтобы можно было использовать группы для пользователей и внешних пользователей. Один пользователь может быть участником нескольких групп. Права доступа, указанные для группы, назначаются всем ее участникам. Использование групп имеет смысл, если пользователей программы много. </li></a></ul><h3>Внешние пользователи</h3><a name="СтандартныеПодсистемы.Пользователи"> -<p>В данном подразделе сгруппированы команды для настройки внешних пользователей программы и настроек входа внешних пользователей.</p> +</li><li><strong>Группы пользователей - </strong>включите флажок, для того чтобы можно было использовать группы для пользователей и внешних пользователей. Один пользователь может быть участником нескольких групп. Права доступа, указанные для группы, назначаются всем ее участникам. Использование групп имеет смысл, если пользователей программы много. </li></a></ul><h3>Внешние пользователи</h3> +<p>В данном подразделе сгруппированы команды для настройки внешних пользователей программы и настроек входа внешних пользователей.<a name="СтандартныеПодсистемы.Пользователи"></a></p> <ul><li><strong>Разрешить доступ внешним пользователям</strong> - включите флажок, для того чтобы настраивать доступ внешних пользователей и использовать их в программе. </li><li><a href="Catalog.ВнешниеПользователи/Help">Внешние пользователи</a> - учет пользователей, которые работают с программой "извне". В качестве внешних пользователей программы могут выступать партнеры, респонденты различных опросов, клиенты интернет-магазина и др. Администрирование внешних пользователей выполняется аналогично пользователям программы. </li><li> -<p><a href="CommonForm.НастройкиВходаПользователей/Help">Настройка входа</a> - настройки сложности и смены паролей, ограничение работы неактивных внешних пользователей.</p></li></ul></a> -<h3>Группы доступа</h3> +<p><a href="CommonForm.НастройкиВходаПользователей/Help">Настройка входа</a> - настройки сложности и смены паролей, ограничение работы неактивных внешних пользователей.</p></li></ul><h3>Группы доступа</h3> <ul><li><a name="СтандартныеПодсистемы.УправлениеДоступом"></a><a href="Catalog.ГруппыДоступа/Help">Группы доступа</a> - настройка прав доступа и ограничений для пользователей и групп пользователей. Группа доступа определяет совокупность действий с данными программы, которые могут выполнять участники этой группы. </li><li><strong>Ограничивать доступ на уровне записей - </strong>включите этот флажок, для того чтобы максимально гибко настраивать прав доступа пользователей к справочникам, документам и другим данным программы. </li><li><a href="Catalog.ПрофилиГруппДоступа/Help">Профили групп доступа</a> - настройка предустановленных шаблонов групп доступа пользователей. Профили групп доступа, как правило, объединяют в себе несколько ролей. При включении пользователя в группу доступа ему назначаются все роли, заданные в профиле группы доступа. </li></ul><h3>Персональные настройки пользователей<a name="СтандартныеПодсистемы.Пользователи"></a></h3> <ul><li><a href="DataProcessor.НастройкиПользователей.Form.КопированиеНастроекПользователей/Help">Копирование настроек</a> - копирование настроек контекста работы программы от одного пользователя другим. Это бывает полезно при вводе нового пользователя. </li><li><a href="DataProcessor.НастройкиПользователей.Form.ОчисткаНастроекПользователей/Help">Очистка настроек</a> - очистка настроек пользователя, группы пользователей или всех пользователей. Это восстанавливает целостность настроек и в некоторых случаях помогает нормализовать работу сеансов этого пользователя в программе. -</li><li><a href="DataProcessor.НастройкиПользователей.Form.НастройкиПользователей/Help">Настройки пользователей</a> - просмотр и управление настройками выбранного пользователя. </li></ul><h3>См. также: </h3> +</li><li><a href="DataProcessor.НастройкиПользователей.Form.НастройкиПользователей/Help">Настройки пользователей</a> - просмотр и управление настройками выбранного пользователя. </li></ul><h3>Даты запрета изменения</h3> +<ul><a name="СтандартныеПодсистемы.ДатыЗапретаИзменения"> +<li><a href="InformationRegister.ДатыЗапретаИзменения/Help">Даты запрета изменения</a> - Включите флажок, для того чтобы использовать даты запрета изменения данных программы. После этого становится активной команда: +</li><li><strong>Настроить - </strong>Переход к установке запрета редактирования данных программы до определенной даты (данных прошлых периодов.</li></a> +<li>См. также <strong>Даты запрета загрузки данных</strong> в панели <strong>Администрирование -</strong> <a href="DataProcessor.ПанельАдминистрированияБСП.Form.СинхронизацияДанных/Help">Синхронизация данных</a>.</li></ul><h3>Защита персональных данных <a name="СтандартныеПодсистемы.ЗащитаПерсональныхДанных"></a></h3> +<p></p> +<ul><li><a href="CommonForm.НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Help">Настройки регистрации событий доступа к персональным данным</a> - настройки регистрации событий доступа в соответствии с требованиями Федерального закона от 27.07.2006 N152-ФЗ "О персональных данных"; +</li><li><a href="DataProcessor.ЗащитаПерсональныхДанных/Help">Защита персональных данных</a> - Просмотр обращений к персональным данным выбранных объектов программы.</li></ul><h3>См. также: </h3> <ul><li><a href="DataProcessor.ПанельАдминистрированияБСП/Help">Настройки программы</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl index 3c9eac849..643b16243 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl @@ -15,16 +15,16 @@ КонецЕсли; Если Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда - Элементы.ГруппаНастройкиВхода.Видимость = Ложь; + Элементы.ГруппаНастройкиВходаПользователей.Видимость = Ложь; Элементы.ГоризонтальныйОтступ2.Видимость = Ложь; Элементы.ГруппаНастройкиВходаВнешнихПользователей.Видимость = Ложь; Элементы.ГруппаВнешниеПользователи.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; КонецЕсли; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() Или СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ГруппаВнешниеПользователи.Видимость = Ложь; Элементы.ОписаниеРаздела.Заголовок = @@ -32,7 +32,7 @@ КонецЕсли; Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ИспользоватьГруппыПользователей.Доступность = Ложь; КонецЕсли; @@ -40,17 +40,31 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); УпрощенныйИнтерфейс = МодульУправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа(); - Элементы.ГруппыДоступа.Видимость = НЕ УпрощенныйИнтерфейс; - Элементы.ГруппыПользователей.Видимость = НЕ УпрощенныйИнтерфейс; + Элементы.ОткрытьГруппыДоступа.Видимость = НЕ УпрощенныйИнтерфейс; + Элементы.ИспользоватьГруппыПользователей.Видимость = НЕ УпрощенныйИнтерфейс; - Если ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда + Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Элементы.ОграничиватьДоступНаУровнеЗаписей.Доступность = Ложь; КонецЕсли; КонецЕсли; + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + Элементы.ГруппаДатыЗапретаИзменения.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + Элементы.ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным.Видимость = + Не ОбщегоНазначения.РазделениеВключено() + И Пользователи.ЭтоПолноправныйПользователь(, Истина); + Иначе + Элементы.ГруппаЗащитаПерсональныхДанных.Видимость = Ложь; + КонецЕсли; + // Обновление состояния элементов. УстановитьДоступность(); + НастройкиПрограммыПереопределяемый.НастройкиПользователейИПравПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -61,6 +75,23 @@ ОбновитьИнтерфейсПрограммы(); КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия <> "Запись_НаборКонстант" Тогда + Возврат; + КонецЕсли; + + Если Источник = "ИспользоватьАнкетирование" + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда + + Прочитать(); + УстановитьДоступность(); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -143,13 +174,6 @@ ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаСписка", , ЭтотОбъект); КонецПроцедуры -&НаКлиенте -Процедура НастройкиВходаПользователей(Команда) - - ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", , ЭтотОбъект); - -КонецПроцедуры - &НаКлиенте Процедура НастройкиВходаВнешнихПользователей(Команда) @@ -212,7 +236,7 @@ Процедура ИспользоватьВнешнихПользователейПриИзмененииЗавершение(Ответ, Элемент) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда - НаборКонстант.ИспользоватьВнешнихПользователей = Ложь; + НаборКонстант.ИспользоватьВнешнихПользователей = Не НаборКонстант.ИспользоватьВнешнихПользователей; Иначе Подключаемый_ПриИзмененииРеквизита(Элемент); КонецЕсли; @@ -292,9 +316,22 @@ &НаСервере Процедура УстановитьДоступность(РеквизитПутьКДанным = "") - Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьВнешнихПользователей" ИЛИ РеквизитПутьКДанным = "" Тогда - Элементы.ОткрытьВнешниеПользователи.Доступность = НаборКонстант.ИспользоватьВнешнихПользователей; - Элементы.НастройкиВходаВнешнихПользователей.Доступность = НаборКонстант.ИспользоватьВнешнихПользователей; + Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьВнешнихПользователей" + Или РеквизитПутьКДанным = "" Тогда + + ИспользоватьВнешнихПользователей = НаборКонстант.ИспользоватьВнешнихПользователей; + + Элементы.ОткрытьВнешниеПользователи.Доступность = ИспользоватьВнешнихПользователей; + Элементы.НастройкиВходаВнешнихПользователей.Доступность = ИспользоватьВнешнихПользователей; + + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") + И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьДатыЗапретаИзменения" + Или РеквизитПутьКДанным = "") Тогда + + Элементы.ГруппаДатыЗапретаИзмененияНастройка.Доступность = + НаборКонстант.ИспользоватьДатыЗапретаИзменения; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form index 8acfb7b26..3dab9fa50 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form @@ -70,6 +70,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 2047 @@ -90,6 +94,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 2044 @@ -165,12 +173,8 @@ <key>ru</key> - <value>Группа хранить файлы в томах на диске</value> + <value>Хранить файлы в томах на диске</value> - - ru - Группа хранить файлы в томах на диске - 43 false @@ -235,12 +239,8 @@ <key>ru</key> - <value>Группа справочник тома хранения файлов</value> + <value>Справочник тома хранения файлов</value> - - ru - Группа справочник тома хранения файлов - ГруппаСправочникТомаХраненияФайловExtendedTooltip 2053 @@ -268,12 +268,8 @@ <key>ru</key> - <value>Группа управление томами файлов</value> + <value>Управление томами файлов</value> - - ru - Группа управление томами файлов - ГруппаУправлениеТомамиФайловExtendedTooltip 2049 @@ -400,7 +396,7 @@ <key>ru</key> - <value>Группа расширение</value> + <value>Расширение</value> ShowBottom @@ -410,8 +406,7 @@ ru Расширения файлов, для которых будет запрещена загрузка в программы, чтобы предотвратить возможность нанесения вреда компьютеру и данным в программе. Указываются через "пробел". -См. также: <link http://1c.ru/news/info.jsp?id=21537>Пример проблемы с вирусом во внешней обработке</>. - +См. также: <link http://1c.ru/news/info.jsp?id=21537/>Пример проблемы с вирусом во внешней обработке</>. true @@ -437,12 +432,8 @@ <key>ru</key> - <value>Группа управление загрузкой файлов</value> + <value>Управление загрузкой файлов</value> - - ru - Группа управление загрузкой файлов - ГруппаУправлениеЗагрузкойФайловExtendedTooltip 2056 @@ -561,12 +552,8 @@ <key>ru</key> - <value>Группа размер</value> + <value>Размер</value> - - ru - Группа размер - ShowBottom ГруппаРазмерExtendedTooltip @@ -597,12 +584,8 @@ <key>ru</key> - <value>Группа максимальный размер файла области данных</value> + <value>Максимальный размер файла области данных</value> - - ru - Группа максимальный размер файла области данных - 42 ГруппаМаксимальныйРазмерФайлаОбластиДанныхExtendedTooltip @@ -630,7 +613,11 @@ 2105 НастройкаОчисткиФайлов - 2103 + 2133 + + <key>ru</key> + <value>Настройка очистки файлов</value> + true true @@ -638,7 +625,7 @@ НастройкаОчисткиФайловРасширеннаяПодсказка - 2104 + 2134 <key>ru</key> <value>Настройка правил очистки файлов.</value> @@ -651,7 +638,7 @@ </extInfo> </extendedTooltip> <type>Hyperlink</type> - <commandName>Form.Command.НастройкаОчисткиФайлов</commandName> + <commandName>InformationRegister.НастройкиОчисткиФайлов.StandardCommand.OpenList</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -667,12 +654,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа настройка очистки файлов</value> + <value>Настройка очистки файлов</value> - - ru - Группа настройка очистки файлов - ГруппаНастройкаОчисткиФайловРасширеннаяПодсказка 2106 @@ -700,12 +683,8 @@ <key>ru</key> - <value>Группа управление файлами</value> + <value>Управление файлами</value> - - ru - Группа управление файлами - false ГруппаУправлениеФайламиРасширеннаяПодсказка @@ -826,12 +805,8 @@ <key>ru</key> - <value>Группа список расширений файлов open document области данных</value> + <value>Список расширений файлов open document области данных</value> - - ru - Группа список расширений файлов open document области данных - ShowBottom ГруппаСписокРасширенийФайловOpenDocumentОбластиДанныхExtendedTooltip @@ -946,6 +921,10 @@ true + + <key>ru</key> + <value>Список расширений текстовых файлов</value> + ГруппаСписокРасширенийТекстовыхФайловExtendedTooltip 2069 @@ -972,12 +951,8 @@ <key>ru</key> - <value>Группа список расширений файлов</value> + <value>Список расширений файлов</value> - - ru - Группа список расширений файлов - ГруппаСписокРасширенийФайловРасширеннаяПодсказка 2130 @@ -1002,7 +977,7 @@ ГруппаСинхронизацияФайловСОблачнымиСервисами 2110 - Группа1 + ГруппаСинхронизацияФайлов 2115 СинхронизироватьФайлы @@ -1052,9 +1027,13 @@ true + + <key>ru</key> + <value>Синхронизация файлов</value> + 43 - Группа1РасширеннаяПодсказка + ГруппаСинхронизацияФайловРасширеннаяПодсказка 2116 Label true @@ -1074,7 +1053,7 @@ - Группа2 + ГруппаНастройкиСинхронизацииФайлов 2117 НастройкиСинхронизацииФайлов @@ -1117,8 +1096,12 @@ true + + <key>ru</key> + <value>Настройки синхронизации файлов</value> + - Группа2РасширеннаяПодсказка + ГруппаНастройкиСинхронизацииФайловРасширеннаяПодсказка 2118 Label true @@ -1144,12 +1127,8 @@ <key>ru</key> - <value>Группа синхронизация файлов с облачными сервисами</value> + <value>Синхронизация файлов с облачными сервисами</value> - - ru - Группа синхронизация файлов с облачными сервисами - false ГруппаСинхронизацияФайловСОблачнымиСервисамиРасширеннаяПодсказка @@ -1307,10 +1286,6 @@ ru Группа размер - - ru - Группа размер - ShowBottom ГруппаРазмер1ExtendedTooltip @@ -1339,6 +1314,10 @@ true + + <key>ru</key> + <value>Максимальный размер файла</value> + ГруппаМаксимальныйРазмерФайлаExtendedTooltip 2085 @@ -1459,12 +1438,8 @@ <key>ru</key> - <value>Группа список запрещенных расширений</value> + <value>Список запрещенных расширений</value> - - ru - Группа список запрещенных расширений - ShowBottom ГруппаСписокЗапрещенныхРасширенийExtendedTooltip @@ -1579,6 +1554,10 @@ true + + <key>ru</key> + <value>Список расширений файлов open document</value> + ГруппаСписокРасширенийФайловOpenDocumentExtendedTooltip 2093 @@ -1606,12 +1585,8 @@ <key>ru</key> - <value>Группа список расширений</value> + <value>Список расширений</value> - - ru - Группа список расширений - ГруппаСписокРасширенийРасширеннаяПодсказка 2132 @@ -1649,10 +1624,6 @@ false false - - ru - Общие параметры для всех областей данных - ОбщиеПараметрыДляВсехОбластейДанныхExtendedTooltip 2083 @@ -1679,6 +1650,10 @@ true + + <key>ru</key> + <value>Отступ 1</value> + ГруппаОтступ1ExtendedTooltip 2082 @@ -1856,21 +1831,6 @@ ShowError - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 15 - - - true - - - true - - МаксимальныйРазмерФайла @@ -1932,28 +1892,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>НастройкаОчисткиФайлов</name> - <title> - <key>ru</key> - <value>Настройка очистки файлов</value> - - 1 - - ru - Настройка очистки файлов - - - true - - - - НастройкаОчисткиФайлов - - - DontUse - Auto - НастройкаСинхронизацииФайлов diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html index 85b6bf422..92f772c10 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html @@ -6,14 +6,25 @@ TD { } </style><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> <p>В данной панели осуществляется настройка параметров загрузки, хранения и обработки файлов. Доступны команды:</p> -<ul><a name="СтандартныеПодсистемы.ФайловыеФункции"> -<li><strong>Хранить файлы в томах на диске</strong> - выбор между хранением файлов в информационной базе или в томах на диске. В последнем случае файлы не будут храниться в программе. -<ul><li>Если флажок включен, становится доступной команда <a href="Catalog.ТомаХраненияФайлов/Help">Тома хранения файлов</a> - переход к настройке подключения к томам (папкам) хранения файлов на файловом сервере. </li></ul></li></a> -<li><strong>Запретить загрузку файлов с расширениями</strong> - включите флажок, для того чтобы запретить загрузку в программу файлов с указанными расширениями и укажите запрещенные к загрузке расширения файлов в поле ввода через пробел. +<ul><li><strong>Хранить файлы в томах на диске</strong> - выбор между хранением файлов в информационной базе или в томах на диске. В последнем случае файлы не будут храниться в программе. +<ul><li>Если флажок включен, становится доступной команда <a name="СтандартныеПодсистемы.РаботаСФайлами"></a><a href="Catalog.ТомаХраненияФайлов/Help">Тома хранения файлов</a> - переход к настройке подключения к томам (папкам) хранения файлов на файловом сервере. </li></ul></li><li><strong>Запретить загрузку файлов с расширениями</strong> - включите флажок, для того чтобы запретить загрузку в программу файлов с указанными расширениями и укажите запрещенные к загрузке расширения файлов в поле ввода через пробел. </li><li><strong>Максимальный размер файла - </strong>введите ограничение загрузки в программу файлов, превышающих указанный размер. По умолчанию указан размер 50 Мб. Файлы большего размера не будут загружаться в программу. Если максимальный размер равен нулю, то объем файлов не ограничен. </li><li><strong>Расширения файлов ODF</strong> - можно указать расширения файлов открытого формата документов для офисных приложений, текст из которых также будет извлекаться для построения индекса полнотекстового поиска. Расширения указываются через пробел. По умолчанию список заполнен основными расширениями файлов. Указывать или уточнять список расширений файлов открытого формата документов нужно при использовании операционных систем фирмы Microsoft, если для программы OpenOffice не установлено расширение IFilter. -</li><li><strong>Расширения текстовых файлов - </strong>введите расширения файлов, содержащих текстовые данные. Расширения указываются через пробел. <a name="СтандартныеПодсистемы.ФайловыеФункции"> +</li><li><strong>Расширения текстовых файлов - </strong>введите расширения файлов, содержащих текстовые данные. Расширения указываются через пробел. <a name="СтандартныеПодсистемы.РаботаСФайлами"> <li><a href="InformationRegister.НастройкиОчисткиФайлов/Help">Настройка очистки файлов</a> - выполните команду, для того чтобы настроить очистку ненужных файлов. </li><li><strong>Синхронизировать файлы с облачными сервисами</strong> - включите флажок для синхронизации с Яндекс.Диск, Box и другими облачными сервисами для упрощения редактирования файлов. -</li><li><a href="InformationRegister.НастройкиСинхронизацииФайлов/Help">Настройки синхронизации</a> - перейдите по ссылке для настройки синхронизации файлов с облачными сервисами.</li></a></li></ul><h3>См. также: </h3> +</li><li><a href="InformationRegister.НастройкиСинхронизацииФайлов/Help">Настройки синхронизации</a> - перейдите по ссылке для настройки синхронизации файлов с облачными сервисами.</li></a></li></ul><h3>Преимущества хранения файлов в томах на диске</h3> +<ul><li> +<div>Нет излишней нагрузки на информационную базу. Файлы могут занимать существенный объем, значительно превышающий объем всех остальных данных информационной базы. В таком случае работа программы существенно замедляется;</div> +</li><li> +<div>Объем тома ограничен только объемом жесткого диска;</div> +</li><li> +<div>Можно организовать проверку файлов на наличие вирусов;</div> +</li><li> +<div>Простой способ организации резервного копирования файлов.</div></li></ul><h3>Преимущества хранения файлов в информационной базе</h3> +<ul><li> +<div>Все данные находятся в одном месте - в информационной базе;</div> +</li><li> +<div>Для резервного копирования достаточно стандартных средств платформы 1С:Предприятия или СУБД.</div></li></ul><p>Необходимо помнить, что хранение файлов в информационной базе подходит только для баз с небольшим количеством (объемом) файлов.</p> +<h3>См. также: </h3> <ul><li><a href="DataProcessor.ПанельАдминистрированияБСП/Help">Настройки программы</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl index 5999bac73..0a4caeaa4 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl @@ -9,33 +9,37 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - ВызватьИсключение НСтр("ru = 'Не внедрена подсистема Файловые функции. + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + ВызватьИсключение НСтр("ru = 'Не внедрена подсистема Работа с файлами. |Рекомендуется отключить видимость этой панели.'"); КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); + ЭтоАдминистраторСистемы = Пользователи.ЭтоПолноправныйПользователь(, Истина); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); - МодульФайловыеФункции = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункции"); - ЗапрещатьЗагрузкуФайловПоРасширению = НаборКонстант.ЗапрещатьЗагрузкуФайловПоРасширению; - МаксимальныйРазмерФайла = МодульФайловыеФункции.МаксимальныйРазмерФайлаОбщий() / (1024*1024); - МаксимальныйРазмерФайлаОбластиДанных = МодульФайловыеФункции.МаксимальныйРазмерФайла() / (1024*1024); - Если РежимРаботы.МодельСервиса Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + ЗапрещатьЗагрузкуФайловПоРасширению = НаборКонстант.ЗапрещатьЗагрузкуФайловПоРасширению; + МаксимальныйРазмерФайла = МодульРаботаСФайлами.МаксимальныйРазмерФайлаОбщий() / (1024*1024); + МаксимальныйРазмерФайлаОбластиДанных = МодульРаботаСФайлами.МаксимальныйРазмерФайла() / (1024*1024); + Если РазделениеВключено Тогда Элементы.МаксимальныйРазмерФайла.МаксимальноеЗначение = МаксимальныйРазмерФайла; КонецЕсли; - Элементы.ГруппаХранитьФайлыВТомахНаДиске.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Элементы.ГруппаСправочникТомаХраненияФайлов.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Элементы.ОбщиеПараметрыДляВсехОбластейДанных.Видимость = РежимРаботы.МодельСервиса И РежимРаботы.ЭтоАдминистраторСистемы; + Элементы.ГруппаХранитьФайлыВТомахНаДиске.Видимость = ЭтоАдминистраторСистемы; + Элементы.ГруппаСправочникТомаХраненияФайлов.Видимость = ЭтоАдминистраторСистемы; + Элементы.ОбщиеПараметрыДляВсехОбластейДанных.Видимость = ЭтоАдминистраторСистемы И РазделениеВключено; + Элементы.ГруппаСписокРасширенийТекстовыхФайлов.Видимость = Не РазделениеВключено; // Обновление состояния элементов. УстановитьДоступность(); + + НастройкиПрограммыПереопределяемый.НастройкиРаботыСФайламиПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -60,10 +64,15 @@ ЗапросыНаИспользованиеВнешнихРесурсовТомовХраненияФайлов( НаборКонстант.ХранитьФайлыВТомахНаДиске); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - ЗапросыНаИспользованиеВнешнихРесурсов, ЭтотОбъект, Новый ОписаниеОповещения( - "ХранитьФайлыВТомахНаДискеПриИзмененииЗавершение", ЭтотОбъект, Элемент)); - + ОбработкаОповещения = Новый ОписаниеОповещения("ХранитьФайлыВТомахНаДискеПриИзмененииЗавершение", ЭтотОбъект, Элемент); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + ЗапросыНаИспользованиеВнешнихРесурсов, ЭтотОбъект, ОбработкаОповещения); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаОповещения, КодВозвратаДиалога.ОК); + КонецЕсли; + Если Не ЕстьТомаХраненияФайлов() И НаборКонстант.ХранитьФайлыВТомахНаДиске Тогда ПоказатьПредупреждение(, НСтр("ru = 'Включено хранение файлов в томах на диске, но тома еще не настроены. |Добавляемые файлы будут сохраняться в информационной базе до тех пор, пока не будет настроен хотя бы один том хранения файлов.'")); @@ -153,12 +162,6 @@ ОткрытьФорму(ИмяОткрываемойФормы, , ЭтотОбъект); КонецПроцедуры -&НаКлиенте -Процедура НастройкаОчисткиФайлов(Команда) - ИмяОткрываемойФормы = "РегистрСведений.НастройкиОчисткиФайлов.ФормаСписка"; - ОткрытьФорму(ИмяОткрываемойФормы, , ЭтотОбъект); -КонецПроцедуры - &НаКлиенте Процедура НастройкаСинхронизацииФайлов(Команда) ИмяОткрываемойФормы = "РегистрСведений.НастройкиСинхронизацииФайлов.ФормаСписка"; @@ -270,8 +273,10 @@ Если РеквизитПутьКДанным = "МаксимальныйРазмерФайла" Тогда НаборКонстант.МаксимальныйРазмерФайла = МаксимальныйРазмерФайла * (1024*1024); КонстантаИмя = "МаксимальныйРазмерФайла"; + ИначеЕсли РеквизитПутьКДанным = "МаксимальныйРазмерФайлаОбластиДанных" Тогда - Если РежимРаботы.Локальный Или РежимРаботы.Автономный Тогда + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда НаборКонстант.МаксимальныйРазмерФайла = МаксимальныйРазмерФайлаОбластиДанных * (1024*1024); КонстантаИмя = "МаксимальныйРазмерФайла"; Иначе @@ -318,7 +323,8 @@ &НаСервереБезКонтекста Функция ЕстьТомаХраненияФайлов() - Возврат ФайловыеФункции.ЕстьТомаХраненияФайлов(); + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + Возврат МодульРаботаСФайлами.ЕстьТомаХраненияФайлов(); КонецФункции diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form similarity index 54% rename from SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Form.form rename to SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form index 9d04544ee..bb8dfd88e 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form @@ -71,6 +71,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 1635 @@ -91,6 +95,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 1632 @@ -228,12 +236,8 @@ <key>ru</key> - <value>Группа частотный сервис</value> + <value>Частотный сервис</value> - - ru - Группа частотный сервис - ГруппаЧастотныйСервисExtendedTooltip 1637 @@ -295,6 +299,10 @@ true + + <key>ru</key> + <value>Отчеты администратора</value> + 43 false @@ -364,6 +372,10 @@ true + + <key>ru</key> + <value>Дополнительные отчеты по администрированию</value> + 43 false @@ -429,6 +441,10 @@ true + + <key>ru</key> + <value>Дополнительные обработки по администрированию</value> + 43 false @@ -456,6 +472,10 @@ true + + <key>ru</key> + <value>Дополнительные отчеты и обработки</value> + ГруппаДополнительныеОтчетыИОбработкиРасширеннаяПодсказка 1731 @@ -498,7 +518,6 @@ Vertical Collapsible - true Button NormalSeparation true @@ -513,7 +532,7 @@ ГруппаРегламентныеОперации 1527 - Группа5 + ГруппаРегламентныеЗадания 1586 ГруппаОбработкаРегламентныеИФоновыеЗадания @@ -555,6 +574,10 @@ true + + <key>ru</key> + <value>Обработка регламентные и фоновые задания</value> + 43 false @@ -618,12 +641,8 @@ <key>ru</key> - <value>Группа блокировка работы с внешними ресурсами</value> + <value>Блокировка работы с внешними ресурсами</value> - - ru - Группа блокировка работы с внешними ресурсами - 43 false @@ -651,8 +670,12 @@ true + + <key>ru</key> + <value>Регламентные задания</value> + - Группа5ExtendedTooltip + ГруппаРегламентныеЗаданияРасширеннаяПодсказка 1643 Label true @@ -671,62 +694,24 @@
          - Группа6 - 1587 - - ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть - 1506 - - ОбработкаУправлениеИтогамиИАгрегатамиОткрыть - 1501 - true - true - - true - - - ОбработкаУправлениеИтогамиИАгрегатамиОткрытьExtendedTooltip - 1652 - - <key>ru</key> - <value>Установка периода рассчитанных итогов. + <name>ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть</name> + <id>1506</id> + <items xsi:type="form:Button"> + <name>ОбработкаУправлениеИтогамиИАгрегатамиОткрыть</name> + <id>1501</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ОбработкаУправлениеИтогамиИАгрегатамиОткрытьExtendedTooltip</name> + <id>1652</id> + <title> + <key>ru</key> + <value>Установка периода рассчитанных итогов. Перестройка, заполнение и оптимизация агрегатов.</value> - - Label - true - true - - Left - - - Hyperlink - DataProcessor.УправлениеИтогамиИАгрегатами.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа обработка управление итогами и агрегатами открыть</value> - - - ru - Группа обработка управление итогами и агрегатами открыть - - 43 - false - - ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрытьExtendedTooltip - 1651 + Label true true @@ -734,368 +719,15 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа6ExtendedTooltip - 1650 - Label + Hyperlink + DataProcessor.УправлениеИтогамиИАгрегатами.StandardCommand.Open + Normal + Auto true true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов - 1512 - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовИспользование - 2109 - - ИспользоватьПолнотекстовыйПоиск - 2111 - true - true - - true - - - ИспользоватьПолнотекстовыйПоиск - - Right - - ru - Управление поиском и извлечением текстов из файлов. - - ShowBottom - - OnChange - ИспользоватьПолнотекстовыйПоискПриИзменении - - - ИспользоватьПолнотекстовыйПоискРасширеннаяПодсказка - 2113 - Label - true - true - - Left - - - - ИспользоватьПолнотекстовыйПоискКонтекстноеМеню - 2112 - true - - CheckBoxField - Enter - true - Left - true - - true - - - true - true - - true - - - <key>ru</key> - <value>Группа управление полнотекстовым поиском и извлечением текстов использование</value> - - - ru - Группа управление полнотекстовым поиском и извлечением текстов использование - - 43 - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовИспользованиеРасширеннаяПодсказка - 2110 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройка - 2107 - - УправлениеПолнотекстовымПоискомИИзвлечениемТекстов - 1503 - - <key>ru</key> - <value>Настроить</value> - - true - true - - true - - - УправлениеПолнотекстовымПоискомИИзвлечениемТекстовExtendedTooltip - 1655 - Label - true - true - - Left - - - Hyperlink - Form.Command.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа управление полнотекстовым поиском и извлечением текстов настройка</value> - - - ru - Группа управление полнотекстовым поиском и извлечением текстов настройка - - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройкаРасширеннаяПодсказка - 2108 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - 43 - false - - ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовExtendedTooltip - 1654 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаДатыЗапретаИзменения - 2005 - - ГруппаДатыЗапретаИзмененияИспользование - 2007 - - ИспользоватьДатыЗапретаИзменения - 2009 - - <key>ru</key> - <value>Даты запрета изменения</value> - - true - true - - true - - - НаборКонстант.ИспользоватьДатыЗапретаИзменения - - Right - - ru - Запрет изменения данных прошлых периодов. - - ShowBottom - - OnChange - Подключаемый_ПриИзмененииРеквизита - - - ИспользоватьДатыЗапретаИзмененияРасширеннаяПодсказка - 2011 - Label - true - true - - Left - - - - ИспользоватьДатыЗапретаИзмененияКонтекстноеМеню - 2010 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа даты запрета изменения использование</value> - - 43 - false - - ГруппаДатыЗапретаИзмененияИспользованиеРасширеннаяПодсказка - 2008 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаДатыЗапретаИзмененияНастройка - 2015 - - РегистрСведенийДатыЗапретаИзмененияДатыЗапретаИзмененияДанных - 2087 - - <key>ru</key> - <value>Настроить</value> - - true - true - - true - - - РегистрСведенийДатыЗапретаИзмененияДатыЗапретаИзмененияДанныхРасширеннаяПодсказка - 2088 - - <key>ru</key> - <value>Настроить даты запрета изменения</value> - - Label - true - true - - Left - - - Hyperlink - InformationRegister.ДатыЗапретаИзменения.Command.ДатыЗапретаИзмененияДанных - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа даты запрета изменения настройка</value> - - - ГруппаДатыЗапретаИзмененияНастройкаРасширеннаяПодсказка - 2016 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + UserCmds + ShowBottom + Auto true true @@ -1104,204 +736,13 @@ <key>ru</key> - <value>Группа даты запрета изменения</value> + <value>Обработка управление итогами и агрегатами открыть</value> 43 false - ГруппаДатыЗапретаИзмененияРасширеннаяПодсказка - 2006 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаУдалениеПомеченныхОбъектовПоРасписанию - 1766 - - Группа8 - 1768 - - ГруппаУдалениеПомеченныхИспользование - 2021 - - УдалениеПомеченныхИспользование - 1770 - - <key>ru</key> - <value>Автоматически удалять помеченные объекты по расписанию</value> - - true - true - - true - - - УдалениеПомеченныхИспользование - - Right - - OnChange - УдалениеПомеченныхИспользованиеПриИзменении - - - УдалениеПомеченныхИспользованиеРасширеннаяПодсказка - 1772 - Label - true - true - - Left - - - - УдалениеПомеченныхИспользованиеКонтекстноеМеню - 1771 - true - - CheckBoxField - Enter - true - Left - true - - - - УдалениеПомеченныхПредставлениеРасписания - 2217 - - <key>ru</key> - <value>Удаление помеченных представление расписания</value> - - true - true - - true - - - УдалениеПомеченныхПредставлениеРасписанияРасширеннаяПодсказка - 2219 - Label - true - true - - Left - - - - УдалениеПомеченныхПредставлениеРасписанияКонтекстноеМеню - 2218 - true - - Label - true - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - 43 - false - - ГруппаУдалениеПомеченныхИспользованиеРасширеннаяПодсказка - 2022 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - УдалениеПомеченныхНастроитьРасписание - 1773 - true - true - - true - - - УдалениеПомеченныхНастроитьРасписаниеРасширеннаяПодсказка - 1774 - Label - true - true - - Left - - - Hyperlink - Form.Command.УдалениеПомеченныхНастроитьРасписание - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - Группа8РасширеннаяПодсказка - 1769 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - ГруппаУдалениеПомеченныхОбъектовПоРасписаниюРасширеннаяПодсказка - 1767 + ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрытьExtendedTooltip + 1651 Label true true @@ -1313,9 +754,6 @@ Vertical Auto - true - Button - NormalSeparation true true Auto @@ -1331,10 +769,6 @@ ru Регламентные операции - - ru - Регламентные операции - ГруппаРегламентныеОперацииExtendedTooltip 1642 @@ -1433,10 +867,6 @@ ru Выбор способа резервного копирования - - ru - Выбор способа резервного копирования - true true @@ -1546,6 +976,10 @@ true + + <key>ru</key> + <value>Резервного копирования</value> + 43 false @@ -1609,12 +1043,8 @@ <key>ru</key> - <value>Группа настройка резервного копирования</value> + <value>Настройка резервного копирования</value> - - ru - Группа настройка резервного копирования - 43 false @@ -1646,10 +1076,6 @@ ru На локальном компьютере - - ru - Группа на локальном компьютере - ГруппаНаЛокальномКомпьютереРасширеннаяПодсказка 2124 @@ -1752,12 +1178,8 @@ <key>ru</key> - <value>Группа необходимо отключить облачный архив</value> + <value>Необходимо отключить облачный архив</value> - - ru - Группа необходимо отключить облачный архив - 86 false @@ -1789,10 +1211,6 @@ ru На локальном компьютере - - ru - На локальном компьютере - СтраницаНаЛокальномКомпьютереРасширеннаяПодсказка 2122 @@ -1932,6 +1350,10 @@ true + + <key>ru</key> + <value>Прогресс проверки облачного архива</value> + true ГруппаПрогрессПроверкиОблачногоАрхиваРасширеннаяПодсказка @@ -1962,10 +1384,6 @@ ru Страница облачный архив ожидание - - ru - Страница облачный архив ожидание - true СтраницаОблачныйАрхивОжиданиеРасширеннаяПодсказка @@ -2063,12 +1481,8 @@ <key>ru</key> - <value>Группа сервис ОАНе подключен</value> + <value>Сервис ОА не подключен</value> - - ru - Группа сервис ОАНе подключен - ГруппаСервисОАНеПодключенРасширеннаяПодсказка 2163 @@ -2122,12 +1536,8 @@ <key>ru</key> - <value>Страница облачный архив Не подключено</value> + <value>Страница облачный архив не подключено</value> - - ru - Страница облачный архив Не подключено - true СтраницаОблачныйАрхивНеПодключеноРасширеннаяПодсказка @@ -2231,12 +1641,8 @@ <key>ru</key> - <value>Страница облачный архив Подключено на другом компьютере</value> + <value>Страница облачный архив подключено на другом компьютере</value> - - ru - Страница облачный архив Подключено на другом компьютере - true СтраницаОблачныйАрхивПодключеноНаДругомКомпьютереРасширеннаяПодсказка @@ -2340,10 +1746,6 @@ ru Группа резервное копирование программы - - ru - Группа резервное копирование программы - 43 false @@ -2454,10 +1856,6 @@ ru Группа восстановление резервной копии - - ru - Группа восстановление резервной копии - 43 false @@ -2485,6 +1883,10 @@ true + + <key>ru</key> + <value>Облачный архив сохранение восстановление</value> + ГруппаОблачныйАрхивСохранениеВосстановлениеРасширеннаяПодсказка 2183 @@ -2594,10 +1996,6 @@ ru Группа настройка резервного копирования - - ru - Группа настройка резервного копирования - 43 false @@ -2627,12 +2025,8 @@ <key>ru</key> - <value>Страница облачный архив Работает</value> + <value>Страница облачный архив работает</value> - - ru - Страница облачный архив Работает - true СтраницаОблачныйАрхивРаботаетРасширеннаяПодсказка @@ -2729,12 +2123,8 @@ <key>ru</key> - <value>Страница облачный архив Ошибки</value> + <value>Страница облачный архив ошибки</value> - - ru - Страница облачный архив Ошибки - true СтраницаОблачныйАрхивОшибкиРасширеннаяПодсказка @@ -2761,10 +2151,6 @@ ru Страницы состояний облачный архив - - ru - Страницы состояний облачный архив - true СтраницыСостоянийОблачныйАрхивРасширеннаяПодсказка @@ -2790,10 +2176,6 @@ ru Облачный архив - - ru - Облачный архив - СтраницаОблачныйАрхивРасширеннаяПодсказка 2144 @@ -2820,10 +2202,6 @@ ru Резервное копирование и восстановление - - ru - Резервное копирование и восстановление - СтраницыРезервноеКопированиеИВосстановлениеРасширеннаяПодсказка 2120 @@ -2848,10 +2226,6 @@ ru Резервное копирование и восстановление - - ru - Резервное копирование и восстановление - ГруппаРезервноеКопированиеИВосстановлениеExtendedTooltip 1657 @@ -2878,38 +2252,25 @@ - ГруппаВерсионирование - 1801 + ГруппаКорректировкаДанных + 1755 - ГруппаИспользоватьВерсионированиеОбъектов - 1803 - - ИспользоватьВерсионированиеОбъектов - 1805 - - <key>ru</key> - <value>Хранить историю изменений</value> - + ГруппаОбработкаГрупповоеИзменениеОбъектов + 1757 + + ОбработкаГрупповоеИзменениеОбъектовГрупповоеИзменениеРеквизитов + 1778 true true true - - НаборКонстант.ИспользоватьВерсионированиеОбъектов - - Right - ShowBottom - - OnChange - ИспользоватьВерсионированиеОбъектовПриИзменении - - ИспользоватьВерсионированиеОбъектовExtendedTooltip - 1807 + ОбработкаГрупповоеИзменениеОбъектовГрупповоеИзменениеРеквизитовРасширеннаяПодсказка + 1779 <key>ru</key> - <value>Хранение и просмотр версий документов и справочников программы.</value> + <value>Изменение реквизитов и табличных частей в выбранных элементах.</value> Label true @@ -2917,28 +2278,30 @@ Left - - ИспользоватьВерсионированиеОбъектовКонтекстноеМеню - 1806 - true - - CheckBoxField - Enter - true - Left - true - + Hyperlink + DataProcessor.ГрупповоеИзменениеРеквизитов.Command.ГрупповоеИзменениеРеквизитов + Normal + Auto + true + true + UserCmds + ShowBottom + Auto true true true + + <key>ru</key> + <value>Обработка групповое изменение объектов</value> + 43 false - ГруппаИспользоватьВерсионированиеОбъектовExtendedTooltip - 1804 + ГруппаОбработкаГрупповоеИзменениеОбъектовРасширеннаяПодсказка + 1758 Label true true @@ -2957,26 +2320,22 @@ - ГруппаРегистрСведенийНастройкиВерсионированияОбъектов - 1811 + ГруппаПоискИУдалениеДублей + 1788 - РегистрСведенийНастройкиВерсионированияОбъектов - 2091 - - <key>ru</key> - <value>Настройки хранения</value> - + ОбработкаПоискИУдалениеДублейПоискИУдалениеДублей + 2093 true true true - РегистрСведенийНастройкиВерсионированияОбъектовРасширеннаяПодсказка - 2092 + ОбработкаПоискИУдалениеДублейПоискИУдалениеДублейРасширеннаяПодсказка + 2094 <key>ru</key> - <value>Настройка хранения и очистка версий документов и справочников.</value> + <value>Поиск похожих элементов по заданным условиям сравнения.</value> Label true @@ -2985,7 +2344,7 @@ Hyperlink - InformationRegister.НастройкиВерсионированияОбъектов.StandardCommand.OpenList + DataProcessor.ПоискИУдалениеДублей.Command.ПоискИУдалениеДублей Normal Auto true @@ -3001,17 +2360,13 @@ <key>ru</key> - <value>Группа регистр сведений настройки версионирования объектов</value> + <value>Поиск и удаление дублей</value> - - ru - Группа регистр сведений настройки версионирования объектов - 43 false - ГруппаРегистрСведенийНастройкиВерсионированияОбъектовExtendedTooltip - 1812 + ГруппаПоискИУдалениеДублейРасширеннаяПодсказка + 1789 Label true true @@ -3036,11 +2391,11 @@ <key>ru</key> - <value>История изменений</value> + <value>Корректировка данных</value> - ГруппаВерсионированиеРасширеннаяПодсказка - 1802 + ГруппаКорректировкаДанныхРасширеннаяПодсказка + 1756 Label true true @@ -3062,6 +2417,384 @@ Auto + + ГруппаРезультатыОбновленияПрограммы + 2041 + + ГруппаОбновлениеИОписаниеИзмененийПерваяСтрока + 2043 + + ГруппаУстановкаОбновлений + 2105 + + УстановкаОбновлений + 2103 + + <key>ru</key> + <value>Установка обновлений</value> + + true + true + + true + + + УстановкаОбновленийРасширеннаяПодсказка + 2104 + + <key>ru</key> + <value>Обновление программы из файла на локальном диске или в сетевом каталоге.</value> + + Label + true + + Left + + + Hyperlink + DataProcessor.УстановкаОбновлений.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Установка обновлений</value> + + 43 + false + + ГруппаУстановкаОбновленийРасширеннаяПодсказка + 2106 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОткрытьОписаниеИзмененийСистемы + 2045 + + ОткрытьОписаниеИзмененийСистемы + 2047 + true + true + + true + + + ОткрытьОписаниеИзмененийСистемыExtendedTooltip + 2048 + + <key>ru</key> + <value>История изменений по версиям программы.</value> + + Label + true + true + + Left + + + Hyperlink + CommonForm.ОписаниеИзмененийПрограммы.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Открыть описание изменений системы</value> + + 43 + false + + ГруппаОткрытьОписаниеИзмененийСистемыExtendedTooltip + 2046 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление и описание изменений первая строка</value> + + + ГруппаОбновлениеИОписаниеИзмененийПерваяСтрокаРасширеннаяПодсказка + 2044 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОбновлениеИОписаниеИзмененийВтораяСтрока + 2059 + + ГруппаОтложеннаяОбработкаДанных + 2052 + + РезультатыОбновленияИДополнительнаяОбработкаДанных + 2054 + true + true + + true + + + РезультатыОбновленияИДополнительнаяОбработкаДанныхРасширеннаяПодсказка + 2055 + + <key>ru</key> + <value>Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.</value> + + Label + true + + Left + + + Hyperlink + Form.Command.РезультатыОбновленияИДополнительнаяОбработкаДанных + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Отложенная обработка данных</value> + + 43 + false + + ГруппаОтложеннаяОбработкаДанныхРасширеннаяПодсказка + 2053 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДетализироватьОбновлениеИБВЖурналеРегистрации + 2061 + + ДетализироватьОбновлениеИБВЖурналеРегистрации + 2063 + + <key>ru</key> + <value>Детализировать ход обновления в журнале регистрации</value> + + true + true + + true + + + НаборКонстант.ДетализироватьОбновлениеИБВЖурналеРегистрации + + Right + ShowBottom + + OnChange + ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении + + + ДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip + 2065 + + <key>ru</key> + <value>Записывать в журнал регистрации подробную информацию о ходе выполнения обновления.</value> + + Label + true + + Left + + + + ДетализироватьОбновлениеИБВЖурналеРегистрацииКонтекстноеМеню + 2064 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Детализировать обновление ИБВ журнале регистрации</value> + + 43 + false + + ГруппаДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip + 2062 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление и описание изменений вторая строка</value> + + + ГруппаОбновлениеИОписаниеИзмененийВтораяСтрокаРасширеннаяПодсказка + 2060 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Результаты обновления программы</value> + + + ГруппаРезультатыОбновленияПрограммыРасширеннаяПодсказка + 2042 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + ГруппаОценкаПроизводительности 1598 @@ -3121,12 +2854,8 @@ <key>ru</key> - <value>Группа выполнять замеры производительности</value> + <value>Выполнять замеры производительности</value> - - ru - Группа выполнять замеры производительности - 43 false @@ -3259,12 +2988,8 @@ <key>ru</key> - <value>Группа обработка оценка производительности</value> + <value>Обработка оценка производительности</value> - - ru - Группа обработка оценка производительности - 43 false @@ -3296,10 +3021,6 @@ ru Оценка производительности - - ru - Группа оценка производительности - ГруппаОценкаПроизводительностиExtendedTooltip 1672 @@ -3324,2312 +3045,6 @@ Auto - - ГруппаАдресныйКлассификатор - 2101 - - ГруппаАдресныйКлассификаторНастройки - 1861 - - ГруппаАдресныйКлассификаторЛеваяКолонка - 1863 - - ГруппаИсточникДанных - 1865 - - ГруппаИсточникДанныхВарианты - 1867 - - ИсточникДанныхФИАССервис1С - 1869 - true - true - - true - - - НаборКонстант.ИсточникДанныхАдресногоКлассификатора - - None - ShowBottom - - OnChange - АдресныйКлассификаторПриИзменении - - - ИсточникДанныхФИАССервис1СРасширеннаяПодсказка - 1871 - - <key>ru</key> - <value>Использовать веб-сервис, предоставляемый фирмой 1С. Требуется постоянное подключение к Интернету.</value> - - Label - true - - Left - - - - ИсточникДанныхФИАССервис1СКонтекстноеМеню - 1870 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Использовать веб-сервис 1С для ввода и проверки адресов - - - Сервис1С - - - Vertical - - - - ИсточникДанныхФИАСЛокально - 1875 - true - true - - true - - - НаборКонстант.ИсточникДанныхАдресногоКлассификатора - - None - ShowBottom - - OnChange - АдресныйКлассификаторПриИзменении - - - ИсточникДанныхФИАСЛокальноРасширеннаяПодсказка - 1877 - - <key>ru</key> - <value>Использовать данные, загружаемые с сайта 1С или из папки на диске. Возможна работа без подключения к Интернету.</value> - - Label - true - - Left - - - - ИсточникДанныхФИАСЛокальноКонтекстноеМеню - 1876 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Загружать классификатор в программу - - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа источник данных варианты</value> - - - ru - Группа источник данных варианты - - - ГруппаИсточникДанныхВариантыРасширеннаяПодсказка - 1868 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Style.FormTextColor - - - Style.NormalTextFont - - - ru - Группа источник данных - - - ГруппаИсточникДанныхРасширеннаяПодсказка - 1866 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - ru - Группа адресный классификатор левая колонка - - 43 - false - - ГруппаАдресныйКлассификаторЛеваяКолонкаРасширеннаяПодсказка - 1864 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаАдресныйКлассификаторПраваяКолонка - 1881 - - РегистрСведенийАдресныеОбъектыАвторизацияНаСайтеПоддержкиПользователей - 1906 - true - true - - true - - - РегистрСведенийАдресныеОбъектыАвторизацияНаСайтеПоддержкиПользователейРасширеннаяПодсказка - 1907 - - <key>ru</key> - <value>Для использования веб-сервиса 1С и загрузки обновлений адресного классификатора необходимо выполнить подключение к интернет-поддержке пользователей. -</value> - - Label - true - - Left - - - Hyperlink - InformationRegister.АдресныеОбъекты.Command.ПодключитьИнтернетПоддержку - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа адресный классификатор правая колонка</value> - - - ru - Группа адресный классификатор правая колонка - - 43 - false - - ГруппаАдресныйКлассификаторПраваяКолонкаРасширеннаяПодсказка - 1882 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - System.DefaultGUIFont - 11.0 - true - false - false - false - - - ГруппаАдресныйКлассификаторНастройкиРасширеннаяПодсказка - 1862 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаАдресныйКлассификаторКоманды - 1583 - - ГруппаКомандАдресныйКлассификатор - 1830 - - АдресныйКлассификаторЛеваяКолонка - 1842 - - РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификатор - 1826 - - <key>ru</key> - <value>Загрузить классификатор</value> - - true - true - - true - - - РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификаторРасширеннаяПодсказка - 1827 - - <key>ru</key> - <value>Загрузка и проверка обновления адресного классификатора с сайта 1С или из папки на диске.</value> - - Label - true - - Left - - - Hyperlink - InformationRegister.АдресныеОбъекты.Command.ЗагрузитьАдресныйКлассификатор - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Адресный классификатор левая колонка</value> - - - ru - Адресный классификатор левая колонка - - 43 - false - - АдресныйКлассификаторЛеваяКолонкаРасширеннаяПодсказка - 1843 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - АдресныйКлассификаторПраваяКолонка - 1844 - - РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификатор - 1828 - - <key>ru</key> - <value>Очистить адресные сведения</value> - - true - true - - true - - - РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификаторРасширеннаяПодсказка - 1829 - - <key>ru</key> - <value>Удаление загруженных адресных сведений по выбранным, неиспользуемым регионам для уменьшения размера базы.</value> - - Label - true - - Left - - - Hyperlink - InformationRegister.АдресныеОбъекты.Command.ОчиститьАдресныйКлассификатор - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Адресный классификатор правая колонка</value> - - - ru - Адресный классификатор правая колонка - - 43 - false - - АдресныйКлассификаторПраваяКолонкаРасширеннаяПодсказка - 1845 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа команд адресный классификатор</value> - - - ru - Группа команд адресный классификатор - - - ГруппаКомандАдресныйКлассификаторРасширеннаяПодсказка - 1831 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Адресный классификатор</value> - - - System.DefaultGUIFont - MS Shell Dlg - 11.0 - true - false - false - false - - - ГруппаАдресныйКлассификаторКомандыРасширеннаяПодсказка - 1684 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Адресный классификатор</value> - - - ГруппаАдресныйКлассификаторРасширеннаяПодсказка - 2102 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаКлассификаторы - 1556 - - ГруппаЗагрузитьКлассификаторБанков - 1579 - - СправочникКлассификаторБанковРФЗагрузкаКлассификатораБанковРФ - 2085 - true - true - - true - - - СправочникКлассификаторБанковРФЗагрузкаКлассификатораБанковРФРасширеннаяПодсказка - 2086 - - <key>ru</key> - <value>Загрузка классификатора банков РФ с диска 1С:ИТС -или сайта 1С.</value> - - Label - true - - Left - - - Hyperlink - Catalog.КлассификаторБанковРФ.Command.ЗагрузкаКлассификатораБанковРФ - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа загрузить классификатор банков</value> - - - ru - Группа загрузить классификатор банков - - 43 - false - - ГруппаЗагрузитьКлассификаторБанковExtendedTooltip - 1681 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОбработкаЗагрузкаКурсовВалют - 1564 - - ОбработкаЗагрузкаКурсовВалютОткрыть - 2089 - true - true - - true - - - ОбработкаЗагрузкаКурсовВалютОткрытьРасширеннаяПодсказка - 2090 - - <key>ru</key> - <value>Загрузка курсов выбранных валют за указанный период с сайта 1С.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.ЗагрузкаКурсовВалют.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - 43 - false - - ГруппаОбработкаЗагрузкаКурсовВалютExtendedTooltip - 1687 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Другие классификаторы</value> - - - ru - Классификаторы - - - ГруппаКлассификаторыExtendedTooltip - 1679 - Label - true - true - - Left - - - UsualGroup - - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаЗащитаПерсональныхДанных - 1608 - - ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным - 1600 - - ОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным - 1601 - true - true - - true - - - ОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДаннымExtendedTooltip - 1692 - - <key>ru</key> - <value>Регистрация событий доступа в соответствии с требованиями Федерального закона от 27.07.2006 N152-ФЗ "О персональных данных".</value> - - Label - true - - Left - - - Hyperlink - CommonForm.НастройкиРегистрацииСобытийДоступаКПерсональнымДанным.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - 43 - false - - ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДаннымExtendedTooltip - 1691 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОбработкаЗащитаПерсональныхДанных - 1604 - - ОбработкаЗащитаПерсональныхДанных - 1605 - true - true - - true - - - ОбработкаЗащитаПерсональныхДанныхExtendedTooltip - 1695 - - <key>ru</key> - <value>Просмотр обращений к персональным данным выбранных объектов программы.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.ЗащитаПерсональныхДанных.Command.ЗащитаПерсональныхДанных - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа обработка защита персональных данных</value> - - - ru - Группа обработка защита персональных данных - - 43 - false - - ГруппаОбработкаЗащитаПерсональныхДанныхExtendedTooltip - 1694 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Защита персональных данных</value> - - - ГруппаЗащитаПерсональныхДанныхExtendedTooltip - 1690 - Label - true - true - - Left - - - UsualGroup - - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаКорректировкаДанных - 1755 - - ГруппаОбработкаГрупповоеИзменениеОбъектов - 1757 - - ОбработкаГрупповоеИзменениеОбъектовГрупповоеИзменениеРеквизитов - 1778 - true - true - - true - - - ОбработкаГрупповоеИзменениеОбъектовГрупповоеИзменениеРеквизитовРасширеннаяПодсказка - 1779 - - <key>ru</key> - <value>Изменение реквизитов и табличных частей в выбранных элементах.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.ГрупповоеИзменениеРеквизитов.Command.ГрупповоеИзменениеРеквизитов - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа обработка групповое изменение объектов</value> - - - ru - Группа обработка групповое изменение объектов - - 43 - false - - ГруппаОбработкаГрупповоеИзменениеОбъектовРасширеннаяПодсказка - 1758 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаПоискИУдалениеДублей - 1788 - - ОбработкаПоискИУдалениеДублейПоискИУдалениеДублей - 2093 - true - true - - true - - - ОбработкаПоискИУдалениеДублейПоискИУдалениеДублейРасширеннаяПодсказка - 2094 - - <key>ru</key> - <value>Поиск похожих элементов по заданным условиям сравнения.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.ПоискИУдалениеДублей.Command.ПоискИУдалениеДублей - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа поиск и удаление дублей</value> - - - ru - Группа поиск и удаление дублей - - 43 - false - - ГруппаПоискИУдалениеДублейРасширеннаяПодсказка - 1789 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Корректировка данных</value> - - - ГруппаКорректировкаДанныхРасширеннаяПодсказка - 1756 - Label - true - true - - Left - - - UsualGroup - - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаПроверкаКонтрагентов - 1908 - - ПерваяГруппаНастроек - 1910 - - ЛеваяКолонкаПервойГруппы - 1912 - - ИспользоватьАвтоматическуюПроверкуКонтрагентов - 1914 - - <key>ru</key> - <value>Автоматически проверять контрагентов по ЕГРН</value> - - true - true - - true - - - НаборКонстант.ИспользоватьПроверкуКонтрагентов - - Right - ShowBottom - - OnChange - ИспользоватьПроверкуКонтрагентовПриИзменении - - - ИспользоватьАвтоматическуюПроверкуКонтрагентовРасширеннаяПодсказка - 1916 - - <key>ru</key> - <value><color #807a59>Включение автоматической проверки может замедлить открытие документов на медленных компьютерах. Для таких компьютеров рекомендуется использовать </><color #807a59>ручную</><color #807a59> проверку</><color #807a59> по кнопке в подменю "Еще".</> -<link e1cib/app/Обработка.ИнструкцияПоИспользованиюПроверкиКонтрагента>Подробнее о сервисе</></value> - - true - Label - true - - Left - - - - ИспользоватьАвтоматическуюПроверкуКонтрагентовКонтекстноеМеню - 1915 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Левая колонка первой группы</value> - - - ru - Левая колонка первой группы - - 43 - false - - ЛеваяКолонкаПервойГруппыРасширеннаяПодсказка - 1913 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ПраваяКолонкаПервойГруппы - 1920 - - ПроверитьДоступКСервису - 1924 - true - true - - true - - - ПроверитьДоступКСервисуРасширеннаяПодсказка - 1925 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьДоступКСервису - Normal - Auto - true - true - UserCmds - Auto - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагента - 1917 - - <key>ru</key> - <value><Предупреждение про тестовый режим работы сервиса></value> - - true - true - - true - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаРасширеннаяПодсказка - 1919 - Label - true - true - - Left - - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаКонтекстноеМеню - 1918 - true - - Label - true - - Left - - Style.ЦветФонаТестовогоРежимаСервисаФНС - - - - true - true - - true - - - <key>ru</key> - <value>Правая колонка первой группы</value> - - - ru - Правая колонка первой группы - - 43 - false - - ПраваяКолонкаПервойГруппыРасширеннаяПодсказка - 1921 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - ПерваяГруппаНастроекРасширеннаяПодсказка - 1911 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Проверка контрагентов</value> - - - ГруппаПроверкаКонтрагентовРасширеннаяПодсказка - 1909 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаРезультатыОбновленияПрограммы - 2041 - - ГруппаОбновлениеИОписаниеИзмененийПерваяСтрока - 2043 - - ГруппаУстановкаОбновлений - 2105 - - УстановкаОбновлений - 2103 - - <key>ru</key> - <value>Установка обновлений</value> - - true - true - - true - - - УстановкаОбновленийРасширеннаяПодсказка - 2104 - - <key>ru</key> - <value>Обновление программы из файла на локальном диске или в сетевом каталоге.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.УстановкаОбновлений.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - 43 - false - - ГруппаУстановкаОбновленийРасширеннаяПодсказка - 2106 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаОткрытьОписаниеИзмененийСистемы - 2045 - - ОткрытьОписаниеИзмененийСистемы - 2047 - true - true - - true - - - ОткрытьОписаниеИзмененийСистемыExtendedTooltip - 2048 - - <key>ru</key> - <value>История изменений по версиям программы.</value> - - Label - true - true - - Left - - - Hyperlink - CommonForm.ОписаниеИзмененийПрограммы.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа открыть описание изменений системы</value> - - 43 - false - - ГруппаОткрытьОписаниеИзмененийСистемыExtendedTooltip - 2046 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа обновление и описание изменений первая строка</value> - - - ru - Группа обновление и описание изменений первая строка - - - ГруппаОбновлениеИОписаниеИзмененийПерваяСтрокаРасширеннаяПодсказка - 2044 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаОбновлениеИОписаниеИзмененийВтораяСтрока - 2059 - - ГруппаОтложеннаяОбработкаДанных - 2052 - - РезультатыОбновленияИДополнительнаяОбработкаДанных - 2054 - true - true - - true - - - РезультатыОбновленияИДополнительнаяОбработкаДанныхРасширеннаяПодсказка - 2055 - - <key>ru</key> - <value>Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.</value> - - Label - true - - Left - - - Hyperlink - Form.Command.РезультатыОбновленияИДополнительнаяОбработкаДанных - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа отложенная обработка данных</value> - - - ru - Группа отложенная обработка данных - - 43 - false - - ГруппаОтложеннаяОбработкаДанныхРасширеннаяПодсказка - 2053 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаДетализироватьОбновлениеИБВЖурналеРегистрации - 2061 - - ДетализироватьОбновлениеИБВЖурналеРегистрации - 2063 - - <key>ru</key> - <value>Детализировать ход обновления в журнале регистрации</value> - - true - true - - true - - - НаборКонстант.ДетализироватьОбновлениеИБВЖурналеРегистрации - - Right - ShowBottom - - OnChange - ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении - - - ДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip - 2065 - - <key>ru</key> - <value>Записывать в журнал регистрации подробную информацию о ходе выполнения обновления.</value> - - Label - true - - Left - - - - ДетализироватьОбновлениеИБВЖурналеРегистрацииКонтекстноеМеню - 2064 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - 43 - false - - ГруппаДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip - 2062 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа обновление и описание изменений вторая строка</value> - - - ru - Группа обновление и описание изменений вторая строка - - - ГруппаОбновлениеИОписаниеИзмененийВтораяСтрокаРасширеннаяПодсказка - 2060 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Результаты обновления программы</value> - - - ГруппаРезультатыОбновленияПрограммыРасширеннаяПодсказка - 2042 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаЦентрМониторинга - 1951 - - ГруппаРазрешитьОтправлятьДанные - 1953 - - ДекорацияПояснение - 1955 - - <key>ru</key> - <value>Отчеты об использовании программы помогают нам определить, над чем следует поработать в первую очередь. -Собранные сведения являются обезличенными и содержат только статистические показатели. Подготовка -и отправка отчетов не замедлит работу программы.</value> - - true - true - - true - - - ДекорацияПояснениеРасширеннаяПодсказка - 1957 - Label - true - true - - Left - - - - ДекорацияПояснениеКонтекстноеМеню - 1956 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - ГруппаПереключатель - 1958 - - ДекорацияПереключатель - 1960 - true - true - - true - - - ДекорацияПереключательРасширеннаяПодсказка - 1962 - Label - true - true - - Left - - - - ДекорацияПереключательКонтекстноеМеню - 1961 - true - - Label - 1 - true - true - - Left - - - - ЦентрМониторингаРазрешитьОтправлятьДанные - 1985 - true - true - - true - - - ЦентрМониторингаРазрешитьОтправлятьДанные - - None - - OnChange - РазрешитьОтправлятьДанныеПриИзменении - - - ЦентрМониторингаРазрешитьОтправлятьДанныеРасширеннаяПодсказка - 1987 - Label - true - true - - Left - - - - ЦентрМониторингаРазрешитьОтправлятьДанныеКонтекстноеМеню - 1986 - true - - RadioButtonField - Enter - true - Left - true - - RadioButtons - 1 - - - ru - Разрешить автоматическую отправку сведений об использовании программы в фирму "1С" - - - 0 - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа переключатель</value> - - - ru - Группа переключатель - - - ГруппаПереключательРасширеннаяПодсказка - 1959 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаСтороннему - 2227 - - ДекорацияСтороннему - 2229 - true - true - - true - - - ДекорацияСтороннемуРасширеннаяПодсказка - 2231 - Label - true - true - - Left - - - - ДекорацияСтороннемуКонтекстноеМеню - 2230 - true - - Label - 1 - true - 1 - true - - Left - - - - ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннему - 2232 - true - true - - true - - - ЦентрМониторингаРазрешитьОтправлятьДанные - - None - - OnChange - РазрешитьОтправлятьДанныеПриИзменении - - - ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннемуРасширеннаяПодсказка - 2234 - Label - true - true - - Left - - - - ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннемуКонтекстноеМеню - 2233 - true - - RadioButtonField - Enter - true - Left - true - - RadioButtons - 1 - - - ru - Разрешить отправку сведений стороннему разработчику - - - 1 - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Переключатель</value> - - - ГруппаСтороннемуРасширеннаяПодсказка - 2228 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройка автоматической отправки сведений об использовании программы</value> - - - System.DefaultGUIFont - 11.0 - true - false - false - false - - - ru - Группа разрешить отправлять данные - - - ГруппаРазрешитьОтправлятьДанныеРасширеннаяПодсказка - 1954 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОтправкиДанныхНастройкаРесурсаОбщая - 1983 - - ДекорацияАдресСервиса - 1991 - true - true - - true - - - ДекорацияАдресСервисаРасширеннаяПодсказка - 1993 - Label - true - true - - Left - - - - ДекорацияАдресСервисаКонтекстноеМеню - 1992 - true - - Label - 2 - true - true - - Left - - - - ЦентрМониторингаАдресСервиса - 1988 - - <key>ru</key> - <value>Адрес сервиса</value> - - true - true - - true - - - ЦентрМониторингаАдресСервиса - - - OnChange - ЦентрМониторингаАдресСервисаПриИзменении - - - ЦентрМониторингаАдресСервисаРасширеннаяПодсказка - 1990 - Label - true - true - - Left - - - - ЦентрМониторингаАдресСервисаКонтекстноеМеню - 1989 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа отправки данных настройка ресурса общая</value> - - - ru - Группа отправки данных настройка ресурса общая - - - ГруппаОтправкиДанныхНастройкаРесурсаОбщаяРасширеннаяПодсказка - 1984 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаЗапретитьОтправлятьДанные - 1997 - - ДекорацияЗапретитьОтправлятьДанные - 1999 - true - true - - true - - - ДекорацияЗапретитьОтправлятьДанныеРасширеннаяПодсказка - 2001 - Label - true - true - - Left - - - - ДекорацияЗапретитьОтправлятьДанныеКонтекстноеМеню - 2000 - true - - Label - 1 - true - true - - Left - - - - ЦентрМониторингаЗапретитьОтправлятьДанные - 1994 - true - true - - true - - - ЦентрМониторингаРазрешитьОтправлятьДанные - - None - - OnChange - РазрешитьОтправлятьДанныеПриИзменении - - - ЦентрМониторингаЗапретитьОтправлятьДанныеРасширеннаяПодсказка - 1996 - Label - true - true - - Left - - - - ЦентрМониторингаЗапретитьОтправлятьДанныеКонтекстноеМеню - 1995 - true - - RadioButtonField - Enter - true - Left - true - - RadioButtons - - - ru - Запретить отправку сведений - - - 2 - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа запретить отправлять данные</value> - - - ru - Группа запретить отправлять данные - - - ГруппаЗапретитьОтправлятьДанныеРасширеннаяПодсказка - 1998 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Центр мониторинга</value> - - - ru - Группа оценка производительности - - - ГруппаЦентрМониторингаРасширеннаяПодсказка - 1952 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - ФормаКоманднаяПанель -1 @@ -5688,35 +3103,14 @@ true - - НаборКонстант.ИзвлекатьТекстыФайловНаСервере - НаборКонстант.ИспользоватьДополнительныеОтчетыИОбработки - - НаборКонстант.ИспользоватьПолнотекстовыйПоиск - НаборКонстант.ИспользоватьРазделениеПоОбластямДанных
          true
          - - РежимРаботы - - <key>ru</key> - <value>Режим работы (фиксированная структура)</value> - - 3 - - - true - - - true - - УдалениеПомеченныхИдентификатор @@ -5818,26 +3212,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ИспользоватьПолнотекстовыйПоиск</name> - <title> - <key>ru</key> - <value>Полнотекстовый поиск данных</value> - - 16 - - Number - - 1 - - - - true - - - true - - ПараметрыОблачногоАрхива @@ -5894,72 +3268,6 @@ <common>true</common> </edit> </attributes> - <formCommands> - <name>УправлениеПолнотекстовымПоискомИИзвлечениемТекстов</name> - <title> - <key>ru</key> - <value>Управление полнотекстовым поиском</value> - - 4 - - ru - Управление полнотекстовым поиском и извлечением текстов - - - true - - - - ОбработкаУправлениеПолнотекстовымПоиском - - - DontUse - Auto -
          - - УдалениеПомеченныхНастроитьРасписание - - <key>ru</key> - <value>Настроить расписание</value> - - 11 - - ru - Настроить расписание для автоматического удаления помеченных объектов в регламентном задании. - - - true - - - - УдалениеПомеченныхНастроитьРасписание - - - DontUse - Auto - - - ПроверитьДоступКСервису - - <key>ru</key> - <value>Проверить доступ к веб-сервису</value> - - 1 - - ru - Проверить доступ к сервису - - - true - - - - ПроверитьДоступКСервису - - - DontUse - 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..fea91a069 --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Help/ru.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><style>TABLE { + BORDER-TOP: 0px; BORDER-RIGHT: 0px; WIDTH: 98%; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; cellSpacing: 4; cellPadding: 0 +} +TD { + VERTICAL-ALIGN: top +} +</style><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> +<p>В данной панели осуществляется контроль состояния программы, резервное копирование и восстановление, обновление версии, оптимизация быстродействия.</p> +<table><tbody><a name="СтандартныеПодсистемы.БазоваяФункциональность"> +<tr><td> +<li><a href="DataProcessor.ЖурналРегистрации/Help">Журнал регистрации</a></li></td> +<td>Просмотр событий и действий, которые происходили в регламентных заданиях или в процессе работы пользователей в программе.</td></tr></a><a name="СтандартныеПодсистемы.ЗавершениеРаботыПользователей"> +<tr><td> +<li><a href="DataProcessor.АктивныеПользователи/Help">Активные пользователи</a></li></td> +<td>Список пользователей, которые сейчас работают в программе.</td></tr><tr><td> +<li><a href="DataProcessor.БлокировкаРаботыПользователей/Help">Блокировка работы пользователей</a></li></td> +<td>Установка и снятие запрета работы пользователей с программой. При установке запрета завершается работа всех активных пользователей (включая текущего).</td></tr></a><a name="СтандартныеПодсистемы.УдалениеПомеченныхОбъектов"> +<tr><td> +<li><a href="DataProcessor.УдалениеПомеченныхОбъектов/Help">Удаление помеченных объектов</a></li></td> +<td>Окончательное удаление тех объектов программы, которым ранее была присвоена пометка на удаление.</td></tr></a></tbody></table><h3>Отчеты и обработки</h3> +<p>В данном подразделе администратору предоставляются возможности по получению отчетов о работе программы, а также внешних дополнительных отчетов и обработок по администрированию программы. </p> +<table><tbody><tr><td> +<li><strong>Отчеты администратора</strong></li></td> +<td><a name="СтандартныеПодсистемы.АнализЖурналаРегистрации"> +<p><a href="Report.АнализЖурналаРегистрации/Help">Отчеты по журналу регистрации</a>. </p></a> +<p>Отчеты для администрирования программы.</p></td></tr><a name="СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки"> +<tr><td> +<li><strong>Дополнительные </strong><strong>    отчеты по администрированию</strong></li></td> +<td>Команды <a href="Catalog.ДополнительныеОтчетыИОбработки/Help">дополнительных отчетов</a>, подключенных к программе.</td></tr><tr><td> +<li><strong>Дополнительные </strong><strong>обработки по администрированию</strong></li></td> +<td>Команды <a href="Catalog.ДополнительныеОтчетыИОбработки/Help">дополнительных обработок</a>, подключенных к программе.</td></tr></a></tbody></table><h3>Регламентные операции</h3> +<p>В подразделе доступны команды по управлению регламентными операциями:</p> +<table><tbody><a name="СтандартныеПодсистемы.РегламентныеЗадания"> +<tr><td> +<li><a href="DataProcessor.РегламентныеИФоновыеЗадания/Help">Регламентные и фоновые задания</a></li></td> +<td>Настройка, выполнение и отслеживание состояний регламентных и фоновых заданий. Регламентные задания автоматически выполняют регламентные операции по расписанию.</td></tr></a> +<tr><td> +<li><strong>Разблокировать работу с внешними ресурсами</strong></li></td> +<td>С помощью кнопки можно снять блокировку регламентных заданий по работе с внешними ресурсами. Она автоматически устанавливается, если изменилось местоположение ИБ в связи с копированием или восстановлением из резервной копии.</td></tr><tr><td><a name="СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами"> +<li><a href="DataProcessor.УправлениеИтогамиИАгрегатами/Help">Управление итогами и агрегатами</a></li></a></td> +<td>Управление итогами регистров накопления и бухгалтерии и агрегатами оборотных регистров. Правильная настройка итогов и агрегатов может повысить производительность программы.</td></tr></tbody></table><a name="СтандартныеПодсистемы.РезервноеКопированиеИБ"> +<h3>Резервное копирование и восстановление</h3> +<p>С целью уменьшения риска потери данных необходимо регулярно выполнять резервное копирование программы. Частота создания резервных копий зависит от интенсивности ввода новых данных.</p></a> +<table><tbody><tr><td> +<li><a href="DataProcessor.РезервноеКопированиеИБ.Form.РезервноеКопированиеДанных/Help">Создание резервной  копии</a></li></td> +<td>Выполнение резервного копирования программы: прямо сейчас, через некоторое время или при завершении работы.</td></tr><tr><td> +<li><a href="DataProcessor.НастройкаРезервногоКопированияИБ/Help">Настройка резервного копирования</a></li></td> +<td>Настройка автоматического резервного копирования по расписанию, или отключение контроля резервного копирования, если оно выполняется сторонними средствами.</td></tr><tr><td> +<li><a href="DataProcessor.РезервноеКопированиеИБ.Form.ВосстановлениеДанныхИзРезервнойКопии/Help">Восстановление из резервной копии</a></li></td> +<td>Восстановление программы из резервной копии.</td></tr></tbody></table><h3>Корректировка данных</h3> +<p>В программе предусмотрены различные возможности поддерживать списки в порядке: изменять данные, отобранные по определенным признакам; устранять повторяющиеся элементы автоматически, при этом программа также исправляет ссылки на удаленные элементы.</p> +<p></p> +<table><tbody><a name="СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов"> +<tr><td> +<li><a href="DataProcessor.ГрупповоеИзменениеРеквизитов/Help">Групповое изменение реквизитов</a></li></td> +<td>Изменение реквизитов и табличных частей в выбранных элементах.</td></tr></a><a name="СтандартныеПодсистемы.ПоискИУдалениеДублей"> +<tr><td> +<li><a href="DataProcessor.ПоискИУдалениеДублей/Help">Поиск и удаление дублей</a></li></td> +<td>Поиск похожих элементов по заданным условиям сравнения.</td></tr></a></tbody></table><h3>Результаты обновления программы</h3> +<p>В подразделе производится установка обновлений программы, также можно просмотреть информацию о предыдущих обновлениях.</p> +<table><tbody><a name="СтандартныеПодсистемы.ОбновлениеКонфигурации"> +<tr><td> +<li><a href="DataProcessor.УстановкаОбновлений/Help">Установка обновлений</a></li></td> +<td>Переход к установке обновлений программы.</td> +<p></p></tr></a><a name="СтандартныеПодсистемы.ОбновлениеВерсииИБ"> +<tr><td> +<li><a href="CommonForm.ОписаниеИзмененийПрограммы/Help">Описание изменений программы</a></li></td> +<td>Просмотр списка изменений в установленной версии программы и рекомендаций по обновлению программы.</td></tr><tr><td> +<li><a href="DataProcessor.РезультатыОбновленияПрограммы.Form.ИндикацияХодаОтложенногоОбновленияИБ/Help">Результаты обновления и дополнительная обработка данных</a></li></td> +<td>Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.</td></tr><tr><td> +<li><strong>Детализировать ход обновления в журнале регистрации</strong></li></td> +<td>При включенном флажке в <a href="DataProcessor.ЖурналРегистрации/Help">журнал регистрации</a> записываются выполняемые обработчики обновления с указанием времени выполнения.</td></tr></a></tbody></table><a name="СтандартныеПодсистемы.ОценкаПроизводительности"> +<h3>Оценка производительности</h3> +<p>В программе предусмотрены встроенные средства для сбора и анализа данных о производительности ее работы по APDEX. В подразделе можно настроить параметры:</p></a> +<table><tbody><tr><td> +<li><strong>Оценка производительности</strong></li></td> +<td>Флажок замеров интегральной производительности программы по методике APDEX.</td></tr><tr><td> +<li><a href="DataProcessor.ОценкаПроизводительности.Form.АвтоматическийЭкспортЗамеровПроизводительности/Help">Настройки оценки производительности</a></li></td> +<td>Настройки параметров оценки производительности.</td></tr><tr><td> +<li><a href="DataProcessor.ОценкаПроизводительности/Help">Показатели производительности</a></li></td> +<td>Просмотр и оценка результатов замеров производительности.</td></tr><tr><td> +<li><a href="DataProcessor.ОценкаПроизводительности.Form.ЭкспортЗамеровПроизводительности/Help">Экспорт замеров производительности</a></li></td> +<td>Экспорт замеров производительности за произвольный период.</td></tr></tbody></table><h3>См. также: </h3> +<ul><li><a href="DataProcessor.ПанельАдминистрированияБСП/Help">Настройки программы</a>.</li></ul></body></html> \ 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..de8376b73 --- /dev/null +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Module.bsl @@ -0,0 +1,365 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем ОбновитьИнтерфейс; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = + РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована(); + + Элементы.ГруппаОбработкаРегламентныеИФоновыеЗадания.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина); + Иначе + Элементы.ГруппаОбработкаРегламентныеИФоновыеЗадания.Видимость = Ложь; + Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + Элементы.ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть.Видимость = + Пользователи.ЭтоПолноправныйПользователь() + И Не ОбщегоНазначения.РазделениеВключено(); + Иначе + Элементы.ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина) + И Не ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначенияКлиентСервер.КлиентПодключенЧерезВебСервер() + И ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент(); + + ОбновитьНастройкиРезервногоКопирования(); + Иначе + Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + Элементы.ГруппаОценкаПроизводительности.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина); + Иначе + Элементы.ГруппаОценкаПроизводительности.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = + Пользователи.ЭтоПолноправныйПользователь(); + Иначе + Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = Ложь; + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда + Элементы.ГруппаПоискИУдалениеДублей.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + Элементы.ГруппаДополнительныеОтчетыИОбработки.Видимость = + НаборКонстант.ИспользоватьДополнительныеОтчетыИОбработки; + Иначе + Элементы.ГруппаДополнительныеОтчетыИОбработки.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + Элементы.ГруппаУстановкаОбновлений.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина) + И Не ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() + И Не ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначенияКлиентСервер.КлиентПодключенЧерезВебСервер() + И ОбщегоНазначенияКлиентСервер.ЭтоWindowsКлиент(); + Иначе + Элементы.ГруппаУстановкаОбновлений.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхив = ОбщегоНазначения.ОбщийМодуль("ОблачныйАрхив"); + МодульОблачныйАрхив.ПанельАдминистрированияБСП_ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + + // Обновление состояния элементов. + УстановитьДоступность(); + + НастройкиПрограммыПереопределяемый.ОбслуживаниеПриСозданииНаСервере(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ПриОткрытии(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗакрытаФормаНастройкиРезервногоКопирования" + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + ОбновитьНастройкиРезервногоКопирования(); + ИначеЕсли ИмяСобытия = "РазрешенаРаботаСВнешнимиРесурсами" Тогда + Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + Если ЗавершениеРаботы Тогда + Возврат; + КонецЕсли; + ОбновитьИнтерфейсПрограммы(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВыполнятьЗамерыПроизводительностиПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + +&НаКлиенте +Процедура ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + +#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив + +&НаКлиенте +Процедура ОблачныйАрхивОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Истина; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ОбработкаНавигационнойСсылки( + ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, + СтандартнаяОбработка, Новый Структура); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СпособРезервногоКопированияПриИзменении(Элемент) + + // В зависимости от состояния, вывести правильную страницу. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_СпособРезервногоКопированияПриИзменении(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура РазблокироватьРаботуСВнешнимиРесурсами(Команда) + РазблокироватьРаботуСВнешнимиРесурсамиНаСервере(); + Оповестить("РазрешенаРаботаСВнешнимиРесурсами"); +КонецПроцедуры + +&НаКлиенте +Процедура ОтложеннаяОбработкаДанных(Команда) + ПараметрыФормы = Новый Структура("ОткрытиеИзПанелиАдминистрирования", Истина); + ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ", ПараметрыФормы); +КонецПроцедуры + +#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив + +&НаКлиенте +Процедура ПодключитьСервисОблачныйАрхив(Команда) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ПодключитьСервисОблачныйАрхив(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОблачныйАрхивВосстановлениеИзРезервнойКопииНажатие(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ВосстановлениеИзРезервнойКопии(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОблачныйАрхивНастройкаРезервногоКопированияНажатие(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.НастройкаРезервногоКопирования(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Клиент + +&НаКлиенте +Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, НеобходимоОбновлятьИнтерфейс = Истина) + + КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя); + + ОбновитьПовторноИспользуемыеЗначения(); + + Если НеобходимоОбновлятьИнтерфейс Тогда + ОбновитьИнтерфейс = Истина; + ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); + КонецЕсли; + + Если КонстантаИмя <> "" Тогда + Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнтерфейсПрограммы() + + Если ОбновитьИнтерфейс = Истина Тогда + ОбновитьИнтерфейс = Ложь; + ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера + +&НаСервере +Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента) + + РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным; + + КонстантаИмя = СохранитьЗначениеРеквизита(РеквизитПутьКДанным); + + УстановитьДоступность(РеквизитПутьКДанным); + + ОбновитьПовторноИспользуемыеЗначения(); + + Возврат КонстантаИмя; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сервер + +&НаСервере +Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным) + + // Сохранение значений реквизитов, не связанных с константами напрямую. + Если РеквизитПутьКДанным = "" Тогда + Возврат ""; + КонецЕсли; + + // Определение имени константы. + КонстантаИмя = ""; + Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда + // Если путь к данным реквизита указан через "НаборКонстант". + КонстантаИмя = Сред(РеквизитПутьКДанным, 15); + Иначе + // Определение имени и запись значения реквизита в соответствующей константе из "НаборКонстант". + // Используется для тех реквизитов формы, которые связаны с константами напрямую (в отношении один-к-одному). + КонецЕсли; + + // Сохранения значения константы. + Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда + КонстантаМенеджер = Константы[КонстантаИмя]; + КонстантаЗначение = НаборКонстант[КонстантаИмя]; + + Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда + КонстантаМенеджер.Установить(КонстантаЗначение); + КонецЕсли; + КонецЕсли; + + Возврат КонстантаИмя; + +КонецФункции + +&НаСервере +Процедура УстановитьДоступность(РеквизитПутьКДанным = "") + + Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") + И (РеквизитПутьКДанным = "НаборКонстант.ВыполнятьЗамерыПроизводительности" + Или РеквизитПутьКДанным = "") Тогда + ЭлементОбработкаОценкаПроизводительности = Элементы.Найти("ОбработкаОценкаПроизводительности"); + ЭлементОбработкаНастройкиОценкиПроизводительности = Элементы.Найти("ОбработкаНастройкиОценкиПроизводительности"); + Если (ЭлементОбработкаОценкаПроизводительности <> Неопределено И ЭлементОбработкаНастройкиОценкиПроизводительности <> Неопределено И НаборКонстант.Свойство("ВыполнятьЗамерыПроизводительности")) Тогда + ЭлементОбработкаОценкаПроизводительности.Доступность = НаборКонстант.ВыполнятьЗамерыПроизводительности; + ЭлементОбработкаНастройкиОценкиПроизводительности.Доступность = НаборКонстант.ВыполнятьЗамерыПроизводительности; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьНастройкиРезервногоКопирования() + + Если Не ОбщегоНазначения.РазделениеВключено() + И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда + + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); + Элементы.НастройкаРезервногоКопированияИБ.РасширеннаяПодсказка.Заголовок = МодульРезервноеКопированиеИБСервер.ТекущаяНастройкаРезервногоКопирования(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура РазблокироватьРаботуСВнешнимиРесурсамиНаСервере() + Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + МодульРегламентныеЗаданияСлужебный.РазрешитьРаботуСВнешнимиРесурсами(); +КонецПроцедуры + +#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив + +&НаКлиенте +Процедура Подключаемый_ПроверитьСостояниеОблачногоАрхива() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда + МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); + МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ПроверитьСостояниеОблачногоАрхива(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form index 473bfbf90..c79dbe8a0 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form @@ -71,6 +71,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Справка</value> + Right ГруппаСправкаExtendedTooltip @@ -92,6 +96,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 1829 @@ -203,10 +211,6 @@ Left true - - StartChoice - ЧасовойПоясПрограммыНачалоВыбора - true true false @@ -220,15 +224,15 @@
          ВремяТекущегоСеанса - 1695 + 2061 true true true - ВремяТекущегоСеансаExtendedTooltip - 1838 + ВремяТекущегоСеансаРасширеннаяПодсказка + 2062 Label true true @@ -237,7 +241,7 @@ Hyperlink - Form.Command.ВремяТекущегоСеанса + CommonCommand.ВремяТекущегоСеанса Normal Auto true @@ -252,7 +256,7 @@ <key>ru</key> - <value>Группа часовой пояс программы</value> + <value>Часовой пояс программы</value> ShowBottom @@ -283,6 +287,10 @@ true + + <key>ru</key> + <value>Настройки программы</value> + ГруппаНастройкиПрограммыРасширеннаяПодсказка 1834 @@ -303,6 +311,515 @@ Auto + + ГруппаПубликацияИнформационнойБазы + 2038 + + ПояснениеПоПубликации + 2040 + + <key>ru</key> + <value>Адреса публикации предназначены для формирования ссылок на объекты информационной базы для пользователей, имеющих доступ к базе через публикацию в сети Интернет, либо в локальной сети.</value> + + true + true + + true + + + ПояснениеПоПубликацииРасширеннаяПодсказка + 2042 + Label + true + true + + Left + + + + ПояснениеПоПубликацииКонтекстноеМеню + 2041 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + 2 + + + + АдресПубликацииИнформационнойБазыВИнтернете + 2043 + + <key>ru</key> + <value>Адрес в Интернете</value> + + true + true + + true + + + НаборКонстант.АдресПубликацииИнформационнойБазыВИнтернете + + + ru + Используется для формирования ссылок на объекты информационной базы, доступных через публикацию в сети Интернет. + + + OnChange + АдресПубликацииИнформационнойБазыПриИзменении + + + АдресПубликацииИнформационнойБазыВИнтернетеРасширеннаяПодсказка + 2045 + Label + true + true + + Left + + + + АдресПубликацииИнформационнойБазыВИнтернетеКонтекстноеМеню + 2044 + true + + InputField + Enter + true + Left + true + + + StartChoice + АдресПубликацииИнформационнойБазыВИнтернетеНачалоВыбора + + true + true + true + true + + StdPicture.MoveLeft + + true + true + true + Normal + + ru + Например: http://myserver.com + + + + + АдресПубликацииИнформационнойБазыВЛокальнойСети + 2046 + + <key>ru</key> + <value>Локальный адрес</value> + + true + true + + true + + + НаборКонстант.АдресПубликацииИнформационнойБазыВЛокальнойСети + + + ru + Используется для формирования ссылок на объекты информационной базы, доступных через публикацию в локальной сети. + + + OnChange + АдресПубликацииИнформационнойБазыПриИзменении + + + АдресПубликацииИнформационнойБазыВЛокальнойСетиРасширеннаяПодсказка + 2048 + Label + true + true + + Left + + + + АдресПубликацииИнформационнойБазыВЛокальнойСетиКонтекстноеМеню + 2047 + true + + InputField + Enter + true + Left + true + + + StartChoice + АдресПубликацииИнформационнойБазыВЛокальнойСетиНачалоВыбора + + true + true + true + true + + StdPicture.MoveLeft + + true + true + true + Normal + + ru + Например: http://localnet/mydatabase + + + + true + true + + true + + + <key>ru</key> + <value>Публикация информационной базы</value> + + + ГруппаПубликацияИнформационнойБазыРасширеннаяПодсказка + 2039 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаПараметрыКлиентСервернойИБ + 1532 + + Группа1 + 2059 + + ГруппаОткрытьПараметрыПроксиСервера + 1524 + + ОткрытьПараметрыПроксиСервера + 1686 + + <key>ru</key> + <value>Параметры доступа в Интернет</value> + + true + true + + true + + + ОткрытьПараметрыПроксиСервераExtendedTooltip + 1870 + + <key>ru</key> + <value>Настройки параметров прокси-сервера на сервере 1С:Предприятие.</value> + + Label + true + + Left + + + Hyperlink + CommonForm.ПараметрыПроксиСервера.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Открыть параметры прокси сервера</value> + + 43 + false + + ГруппаОткрытьПараметрыПроксиСервераExtendedTooltip + 1869 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаНастройкаИспользованияПрофилейБезопасности + 1934 + + ОткрытьНастройкиИспользованияПрофилейБезопасности + 1936 + + <key>ru</key> + <value>Использование профилей безопасности</value> + + true + true + + true + + + ОткрытьНастройкиИспользованияПрофилейБезопасностиРасширеннаяПодсказка + 1937 + Label + true + + Left + + + Hyperlink + Form.Command.ИспользованиеПрофилейБезопасности + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка использования профилей безопасности</value> + + + ru + Группа открыть параметры прокси сервера + + 43 + false + + ГруппаНастройкаИспользованияПрофилейБезопасностиРасширеннаяПодсказка + 1935 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 2060 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности + 1941 + + ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности + 1943 + + <key>ru</key> + <value>Декорация настройка прокси сервера на сервере недоступна при использовании профилей безопасности</value> + + true + true + + true + + + ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка + 1945 + Label + true + true + + Left + + + + ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиКонтекстноеМеню + 1944 + true + + true + true + + + CommonPicture.ИнформацияПоНедоступнымПолям + + + + + ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности + 1946 + + <key>ru</key> + <value>Настройка параметров доступа в Интернет на сервере 1С:Предприятия недоступна, т.к. для информационной базы включено использование профилей безопасности. При включенных профилях безопасности настройка параметров доступа в Интернет на сервере 1С:Предприятия может быть выполнена только путем редактирования служебного файла inetcfg.xml (подробнее см. в руководстве администратора платформы 1С:Предприятие).</value> + + true + true + + true + + + ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка + 1948 + Label + true + true + + Left + + + + ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиКонтекстноеМеню + 1947 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + 4 + + + true + true + + true + + + <key>ru</key> + <value>Настройка прокси сервера на сервере недоступна при использовании профилей безопасности</value> + + + ГруппаНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка + 1942 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Параметры серверной информационной базы</value> + + + ГруппаПараметрыКлиентСервернойИБРасширеннаяПодсказка + 1868 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + ГруппаОткрытьВидыКонтактнойИнформации 1642 @@ -347,10 +864,6 @@ ru Контактная информация - - ru - Группа открыть виды контактной информации - 43 false @@ -593,12 +1106,8 @@ <key>ru</key> - <value>Группа дополнительные реквизиты и сведения прочие настройки</value> + <value>Дополнительные реквизиты и сведения прочие настройки</value> - - ru - Группа дополнительные реквизиты и сведения прочие настройки - ГруппаДополнительныеРеквизитыИСведенияПрочиеНастройкиExtendedTooltip 1850 @@ -625,12 +1134,8 @@ <key>ru</key> - <value>Группа использовать дополнительные реквизиты и сведения</value> + <value>Использовать дополнительные реквизиты и сведения</value> - - ru - Группа использовать дополнительные реквизиты и сведения - 43 false @@ -698,7 +1203,7 @@ <key>ru</key> - <value>Группа дополнительные реквизиты</value> + <value>Дополнительные реквизиты</value> ГруппаДополнительныеРеквизитыExtendedTooltip @@ -762,7 +1267,7 @@ <key>ru</key> - <value>Группа дополнительные сведения</value> + <value>Дополнительные сведения</value> ГруппаДополнительныеСведенияExtendedTooltip @@ -791,12 +1296,8 @@ <key>ru</key> - <value>Группа дополнительные реквизиты или сведения</value> + <value>Дополнительные реквизиты или сведения</value> - - ru - Группа дополнительные реквизиты или сведения - 43 false @@ -829,10 +1330,6 @@ ru Дополнительные реквизиты и сведения - - ru - Дополнительные реквизиты и сведения - ГруппаДополнительныеРеквизитыИСведенияExtendedTooltip 1846 @@ -857,6 +1354,369 @@ Auto + + ГруппаВерсионирование + 2063 + + ГруппаИспользоватьВерсионированиеОбъектов + 2065 + + ИспользоватьВерсионированиеОбъектов + 2067 + + <key>ru</key> + <value>Хранить историю изменений</value> + + true + true + + true + + + НаборКонстант.ИспользоватьВерсионированиеОбъектов + + Right + ShowBottom + + OnChange + ИспользоватьВерсионированиеОбъектовПриИзменении + + + ИспользоватьВерсионированиеОбъектовExtendedTooltip + 2069 + + <key>ru</key> + <value>Хранение и просмотр версий документов и справочников программы.</value> + + Label + true + + Left + + + + ИспользоватьВерсионированиеОбъектовКонтекстноеМеню + 2068 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Использовать версионирование объектов</value> + + 43 + false + + ГруппаИспользоватьВерсионированиеОбъектовExtendedTooltip + 2066 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаРегистрСведенийНастройкиВерсионированияОбъектов + 2070 + + РегистрСведенийНастройкиВерсионированияОбъектов + 2072 + + <key>ru</key> + <value>Настройки хранения</value> + + true + true + + true + + + РегистрСведенийНастройкиВерсионированияОбъектовРасширеннаяПодсказка + 2073 + + <key>ru</key> + <value>Настройка хранения и очистка версий документов и справочников.</value> + + Label + true + + Left + + + Hyperlink + InformationRegister.НастройкиВерсионированияОбъектов.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Регистр сведений настройки версионирования объектов</value> + + 43 + false + + ГруппаРегистрСведенийНастройкиВерсионированияОбъектовExtendedTooltip + 2071 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>История изменений</value> + + + ГруппаВерсионированиеРасширеннаяПодсказка + 2064 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов + 2074 + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовИспользование + 2076 + + ИспользоватьПолнотекстовыйПоиск + 2078 + true + true + + true + + + ИспользоватьПолнотекстовыйПоиск + + Right + + ru + Управление поиском и извлечением текстов из файлов. + + ShowBottom + + OnChange + ИспользоватьПолнотекстовыйПоискПриИзменении + + + ИспользоватьПолнотекстовыйПоискРасширеннаяПодсказка + 2080 + Label + true + true + + Left + + + + ИспользоватьПолнотекстовыйПоискКонтекстноеМеню + 2079 + true + + CheckBoxField + Enter + true + Left + true + + true + + + true + true + + true + + + <key>ru</key> + <value>Управление полнотекстовым поиском и извлечением текстов использование</value> + + 43 + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовИспользованиеРасширеннаяПодсказка + 2077 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройка + 2081 + + УправлениеПолнотекстовымПоискомИИзвлечениемТекстов + 2083 + + <key>ru</key> + <value>Настроить</value> + + true + true + + true + + + УправлениеПолнотекстовымПоискомИИзвлечениемТекстовРасширеннаяПодсказка + 2084 + Label + true + true + + Left + + + Hyperlink + DataProcessor.ПанельАдминистрированияБСП.Command.УправлениеПолнотекстовымПоиском + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Управление полнотекстовым поиском и извлечением текстов настройка</value> + + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройкаРасширеннаяПодсказка + 2082 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Полнотекстовый поиск данных</value> + + 43 + false + + ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовExtendedTooltip + 2075 + Label + true + true + + Left + + + UsualGroup + + Collapsible + true + Button + NormalSeparation + true + true + auto + Auto + Auto + + ГруппаЭлектроннаяПодписьИШифрование 1949 @@ -990,7 +1850,7 @@ <key>ru</key> - <value>Группа использовать электронную подпись и шифрование</value> + <value>Использовать электронную подпись и шифрование</value> 43 false @@ -1055,7 +1915,7 @@ <key>ru</key> - <value>Группа настройки электронной подписи и шифрования</value> + <value>Настройки электронной подписи и шифрования</value> 43 false @@ -1112,888 +1972,6 @@ Auto - - ГруппаПараметрыКлиентСервернойИБ - 1532 - - Группа1 - 2059 - - ГруппаОткрытьПараметрыПроксиСервера - 1524 - - ОткрытьПараметрыПроксиСервера - 1686 - - <key>ru</key> - <value>Параметры доступа в Интернет</value> - - true - true - - true - - - ОткрытьПараметрыПроксиСервераExtendedTooltip - 1870 - - <key>ru</key> - <value>Настройки параметров прокси-сервера на сервере 1С:Предприятие.</value> - - Label - true - - Left - - - Hyperlink - CommonForm.ПараметрыПроксиСервера.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа открыть параметры прокси сервера</value> - - - ru - Группа открыть параметры прокси сервера - - 43 - false - - ГруппаОткрытьПараметрыПроксиСервераExtendedTooltip - 1869 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкаИспользованияПрофилейБезопасности - 1934 - - ОткрытьНастройкиИспользованияПрофилейБезопасности - 1936 - - <key>ru</key> - <value>Использование профилей безопасности</value> - - true - true - - true - - - ОткрытьНастройкиИспользованияПрофилейБезопасностиРасширеннаяПодсказка - 1937 - Label - true - - Left - - - Hyperlink - Form.Command.ИспользованиеПрофилейБезопасности - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройка использования профилей безопасности</value> - - - ru - Группа открыть параметры прокси сервера - - 43 - false - - ГруппаНастройкаИспользованияПрофилейБезопасностиРасширеннаяПодсказка - 1935 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа1РасширеннаяПодсказка - 2060 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности - 1941 - - ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности - 1943 - - <key>ru</key> - <value>Декорация настройка прокси сервера на сервере недоступна при использовании профилей безопасности</value> - - true - true - - true - - - ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка - 1945 - Label - true - true - - Left - - - - ДекорацияНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиКонтекстноеМеню - 1944 - true - - true - true - - - CommonPicture.ИнформацияПоНедоступнымПолям - - - - - ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасности - 1946 - - <key>ru</key> - <value>Настройка параметров доступа в Интернет на сервере 1С:Предприятия недоступна, т.к. для информационной базы включено использование профилей безопасности. При включенных профилях безопасности настройка параметров доступа в Интернет на сервере 1С:Предприятия может быть выполнена только путем редактирования служебного файла inetcfg.xml (подробнее см. в руководстве администратора платформы 1С:Предприятие).</value> - - true - true - - true - - - ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка - 1948 - Label - true - true - - Left - - - - ПояснениеНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиКонтекстноеМеню - 1947 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа настройка прокси сервера на сервере недоступна при использовании профилей безопасности</value> - - - ГруппаНастройкаПроксиСервераНаСервереНедоступнаПриИспользованииПрофилейБезопасностиРасширеннаяПодсказка - 1942 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Параметры серверной информационной базы</value> - - - ГруппаПараметрыКлиентСервернойИБРасширеннаяПодсказка - 1868 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаИнтеграция1СБухфон - 1976 - - ГруппаРазрешениеНа1СБухфон - 1978 - - Интеграция1СБухфон - 1980 - - <key>ru</key> - <value>Связаться со специалистом онлайн-поддержки</value> - - true - true - - true - - - НаборКонстант.ИспользоватьИнтеграцию1СБухфон - - Right - ShowBottom - - OnChange - Интеграция1СБухфонПриИзменении - - - Интеграция1СБухфонРасширеннаяПодсказка - 1982 - - <key>ru</key> - <value>Разрешить запуск приложения для соединения со специалистом онлайн-поддержки.</value> - - Label - true - - Left - - - - Интеграция1СБухфонКонтекстноеМеню - 1981 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа разрешение на1 с бухфон</value> - - - ru - Группа разрешение на1 с бухфон - - 43 - false - - ГруппаРазрешениеНа1СБухфонРасширеннаяПодсказка - 1979 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройка1СБухфон - 1986 - - Настройка1СБухфон - 2057 - true - true - - true - - - Настройка1СБухфонРасширеннаяПодсказка - 2058 - - <key>ru</key> - <value>Настройка запуска приложения на этом компьютере.</value> - - Label - true - - Left - - - Hyperlink - CommonForm.Настройка1СБухфон.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа настройка 1С-Бухфон</value> - - 43 - false - - ГруппаНастройка1СБухфонРасширеннаяПодсказка - 1987 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Онлайн-поддержка</value> - - - ru - Настройка использования кнопки 1С-Бухфон - - - ГруппаИнтеграция1СБухфонРасширеннаяПодсказка - 1977 - Label - true - true - - Left - - - UsualGroup - - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаСклонения - 1995 - - ГруппаРазрешениеСклонения - 2012 - - ИспользоватьСервисСклоненияMorpher - 1997 - - <key>ru</key> - <value>Склонять с помощью сервиса morpher.ru</value> - - true - true - - true - - - НаборКонстант.ИспользоватьСервисСклоненияMorpher - - Right - ShowBottom - - OnChange - Подключаемый_ПриИзмененииРеквизита - - - ИспользоватьСервисСклоненияMorpherРасширеннаяПодсказка - 1999 - - <key>ru</key> - <value>Разрешить использование сервиса склонения <link http://www.morpher.ru>morpher.ru</> для получения представлений объектов в падежах (требуется подключение к Интернет).</value> - - true - Label - true - - Left - - - - ИспользоватьСервисСклоненияMorpherКонтекстноеМеню - 1998 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа разрешение склонения</value> - - 43 - false - - ГруппаРазрешениеСклоненияРасширеннаяПодсказка - 2013 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкаСклонения - 2014 - - НастройкаДоступаКСервисуСклонения - 2055 - true - true - - true - - - НастройкаДоступаКСервисуСклоненияРасширеннаяПодсказка - 2056 - - <key>ru</key> - <value>Ввод параметров авторизации на сервере склонения.</value> - - Label - true - - Left - - - Hyperlink - CommonForm.НастройкаДоступаКСервисуMorpher.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа настройка склонения</value> - - 43 - false - - ГруппаНастройкаСклоненияРасширеннаяПодсказка - 2015 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Склонения представлений объектов</value> - - - ГруппаСклоненияРасширеннаяПодсказка - 1996 - Label - true - true - - Left - - - UsualGroup - - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - ГруппаПубликацияИнформационнойБазы - 2038 - - ПояснениеПоПубликации - 2040 - - <key>ru</key> - <value>Адреса публикации предназначены для формирования ссылок на объекты информационной базы для пользователей, имеющих доступ к базе через публикацию в сети Интернет, либо в локальной сети.</value> - - true - true - - true - - - ПояснениеПоПубликацииРасширеннаяПодсказка - 2042 - Label - true - true - - Left - - - - ПояснениеПоПубликацииКонтекстноеМеню - 2041 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - АдресПубликацииИнформационнойБазыВИнтернете - 2043 - - <key>ru</key> - <value>Адрес в Интернете</value> - - true - true - - true - - - НаборКонстант.АдресПубликацииИнформационнойБазыВИнтернете - - - ru - Используется для формирования ссылок на объекты информационной базы, доступных через публикацию в сети Интернет. - - - OnChange - АдресПубликацииИнформационнойБазыПриИзменении - - - АдресПубликацииИнформационнойБазыВИнтернетеРасширеннаяПодсказка - 2045 - Label - true - true - - Left - - - - АдресПубликацииИнформационнойБазыВИнтернетеКонтекстноеМеню - 2044 - true - - InputField - Enter - true - Left - true - - - StartChoice - АдресПубликацииИнформационнойБазыВИнтернетеНачалоВыбора - - true - true - true - true - - StdPicture.MoveLeft - - true - true - true - Normal - - ru - Например: http://myserver.com - - - - - АдресПубликацииИнформационнойБазыВЛокальнойСети - 2046 - - <key>ru</key> - <value>Локальный адрес</value> - - true - true - - true - - - НаборКонстант.АдресПубликацииИнформационнойБазыВЛокальнойСети - - - ru - Используется для формирования ссылок на объекты информационной базы, доступных через публикацию в локальной сети. - - - OnChange - АдресПубликацииИнформационнойБазыПриИзменении - - - АдресПубликацииИнформационнойБазыВЛокальнойСетиРасширеннаяПодсказка - 2048 - Label - true - true - - Left - - - - АдресПубликацииИнформационнойБазыВЛокальнойСетиКонтекстноеМеню - 2047 - true - - InputField - Enter - true - Left - true - - - StartChoice - АдресПубликацииИнформационнойБазыВЛокальнойСетиНачалоВыбора - - true - true - true - true - - StdPicture.MoveLeft - - true - true - true - Normal - - ru - Например: http://localnet/mydatabase - - - - true - true - - true - - - <key>ru</key> - <value>Публикация информационной базы</value> - - - ГруппаПубликацияИнформационнойБазыРасширеннаяПодсказка - 2039 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - ФормаКоманднаяПанель -1 @@ -2039,6 +2017,12 @@ true + + НаборКонстант.ИзвлекатьТекстыФайловНаСервере + + + НаборКонстант.ИспользоватьПолнотекстовыйПоиск + НаборКонстант.ИспользоватьРазделениеПоОбластямДанных @@ -2063,13 +2047,18 @@ - РежимРаботы + ИспользоватьПолнотекстовыйПоиск <key>ru</key> - <value>Режим работы</value> + <value>Полнотекстовый поиск данных</value> - 5 - + 6 + + Number + + 1 + + true @@ -2077,28 +2066,6 @@ true - - ВремяТекущегоСеанса - - <key>ru</key> - <value>Время текущего сеанса</value> - - 1 - - ru - Время текущего сеанса - - - true - - - - ПоказатьВремяТекущегоСеанса - - - DontUse - Auto - ИспользованиеПрофилейБезопасности diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html index e75f64c85..3c5548290 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html @@ -8,35 +8,31 @@ TD { <p>В данной панели осуществляется настройка основных параметров программы.</p> <ul><li><strong>Заголовок программы</strong> - введите текст, который будет отображаться в заголовке окна программы. </li><li><strong>Часовой пояс</strong> - часовой пояс, в котором ведется учет в программе. Все даты документов и других данных в программе хранятся в этом часовом поясе. -</li><li><strong>Время текущего сеанса</strong> - с помощью этой команды можно узнать, насколько время клиента отличается от времени сервера с поправкой на часовой пояс.</li></ul><a name="СтандартныеПодсистемы.КонтактнаяИнформация"> -<h3>Контактная информация</h3></a><a name="СтандартныеПодсистемы.КонтактнаяИнформация"> -<ul><li><a href="Catalog.ВидыКонтактнойИнформации/Help">Виды контактной информации</a> - добавление и настройка видов контактной информации различных объектов программы, например, партнеров, контрагентов, сотрудников и т.д.</li></ul><p></p></a><a name="СтандартныеПодсистемы.Свойства"> -<h3>Дополнительные реквизиты и сведения</h3></a><a name="СтандартныеПодсистемы.Свойства"> +</li><li><strong>Время текущего сеанса</strong> - с помощью этой команды можно узнать, насколько время клиента отличается от времени сервера с поправкой на часовой пояс.</li></ul><h3>Публикация информационной базы</h3> +<ul><li> +<div>Настройки программы <strong>Адрес в интернете</strong> и <strong>Локальный адрес</strong> предназначены для формирования ссылок на объекты информационной базы в зависимости от вида подключения пользователей к информационной базе. </div> +</li><li> +<div>Например, если такой адрес включить в рассылку писем, то из письма за одно нажатие можно перейти к форме объекта в самой программе.</div></li></ul><h3>Параметры серверной информационной базы</h3> +<ul><a name="СтандартныеПодсистемы.ПолучениеФайловИзИнтернета"> +<li><a href="CommonForm.ПараметрыПроксиСервера/Help">Параметры доступа в Интернет</a> - настройки параметров прокси-сервера на сервере 1С:Предприятие. +</li><li><a href="DataProcessor.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Help">Использование профилей безопасности</a> - использование профилей безопасности для контроля за использованием программой внешних (относительно кластера серверов 1С:Предприятия) ресурсов.</li></a></ul><a name="СтандартныеПодсистемы.КонтактнаяИнформация"> +<h3>Контактная информация</h3> +<ul><li><a href="Catalog.ВидыКонтактнойИнформации/Help">Виды контактной информации</a> - добавление и настройка видов контактной информации различных объектов программы, например, партнеров, контрагентов, сотрудников и т.д.</li></ul></a> +<h3>Дополнительные реквизиты и сведения</h3> <ul><li><strong>Дополнительные реквизиты и сведения</strong> - включите флажок, для того чтобы использовать дополнительные свойства для справочников и документов. </li><li><strong>Реквизиты и сведения с общим списком значений</strong> - включите флажок, для того чтобы разрешить добавление реквизитов, у которых общий список значений с другими реквизитами (команда <strong>Добавить - Из другого набора - Сделать копию по образцу</strong>). -</li><li><strong>Общие реквизиты и сведения</strong> - включите флажок, для того чтобы разрешить добавление реквизитов сразу к нескольким объектам программы одновременно (команда <strong>Добавить - Из другого набора - Сделать реквизит общим и добавить в набор</strong>). -</li><li><a href="Catalog.НаборыДополнительныхРеквизитовИСведений/Help">Дополнительные реквизиты</a> - настройка состава дополнительных реквизитов для справочников и документов. -</li><li><a href="Catalog.НаборыДополнительныхРеквизитовИСведений/Help">Дополнительные сведения</a> - настройка состава дополнительных сведений для справочников и документов.</li></ul></a><a name="СтандартныеПодсистемы.ЭлектроннаяПодпись"> +</li><li><strong>Общие реквизиты и сведения</strong> - включите флажок, для того чтобы разрешить добавление реквизитов сразу к нескольким объектам программы одновременно (команда <strong>Добавить - Из другого набора - Сделать реквизит общим и добавить в набор</strong>). <a name="СтандартныеПодсистемы.Свойства"> +<li><a href="Catalog.НаборыДополнительныхРеквизитовИСведений/Help">Дополнительные реквизиты</a> - настройка состава дополнительных реквизитов для справочников и документов. +</li><li><a href="Catalog.НаборыДополнительныхРеквизитовИСведений/Help">Дополнительные сведения</a> - настройка состава дополнительных сведений для справочников и документов.</li></a></li></ul><a name="СтандартныеПодсистемы.ВерсионированиеОбъектов"> +<h3>История изменений</h3> +<p>Программа позволяет вести историю изменения списков, просматривать любую версию объекта или сравнивать любые версии объекта между собой.</p> +<ul><li><strong>Хранить историю изменений - </strong>Включите флажок для ведения истории изменения объектов программы. После этого становится доступной команда: +</li><li><a href="InformationRegister.НастройкиВерсионированияОбъектов/Help">Настройки хранения</a> - Настройка хранения и очистка версий документов и справочников.</li></ul></a><a name="СтандартныеПодсистемы.ПолнотекстовыйПоиск"> +<h3>Полнотекстовый поиск данных</h3> +<ul><li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Help">Полнотекстовый поиск данных</a> - Включите флажок, после этого становится доступной команда: +</li><li><strong>Настроить </strong>- Настройка полнотекстового поиска и поддержка индекса полнотекстового поиска в актуальном состоянии.</li></ul></a><a name="СтандартныеПодсистемы.ЭлектроннаяПодпись"></a> <h3>Электронная подпись и шифрование</h3> <ul><li><strong>Электронная подпись - </strong>включите флажок, для того чтобы разрешить использовать электронные подписи и проверять отсутствие изменений файла с момента формирования электронной подписи. </li><li><strong>Шифрование</strong> - включите флажок, для того чтобы разрешить шифрование файлов. -</li><li><a href="CommonForm.НастройкиЭлектроннойПодписиИШифрования/Help">Настройки электронной подписи и шифрования</a> - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. </li></ul></a><a name="СтандартныеПодсистемы.Интеграция1СБухфон"> -<h3>Онлайн-поддержка</h3></a><a name="СтандартныеПодсистемы.Интеграция1СБухфон"> -<ul><li> -<div><strong>Связаться со специалистом онлайн-поддержки</strong> - включите флажок, для того чтобы разрешить запуск приложения 1С-Коннект для соединения со специалистом поддержки, а также получить доступ к команде настройки.</div> -</li><li> -<div><a href="CommonForm.Настройка1СБухфон/Help">Настройка онлайн-поддержки</a> - настройка приложения 1С-Коннект на этом компьютере: можно расположить соответствующую ссылку для запуска на <strong>Начальной странице</strong> программы, а также скачать приложение и настроить его.</div></li></ul></a> -<h3>Склонения представлений объектов</h3> -<ul><a name="СтандартныеПодсистемы.СклонениеПредставленийОбъектов"> -<li> -<div><strong>Склонять с помощью сервиса morpher.ru</strong> - включите флажок, для того чтобы разрешить использование сервиса склонения для получения представлений объектов в падежах (требуется подключение к Интернету).</div> -</li><li> -<div><a href="CommonForm.НастройкаДоступаКСервисуMorpher/Help">Настройка доступа к сервису склонения</a> - выполните команду для перехода к вводу регистрационных данных на сервисе склонения.</div></li></a></ul><h3>Параметры серверной информационной базы</h3> -<ul><a name="СтандартныеПодсистемы.ПолучениеФайловИзИнтернета"> -<li><a href="CommonForm.ПараметрыПроксиСервера/Help">Параметры доступа в Интернет</a> - настройки параметров прокси-сервера на сервере 1С:Предприятие. -</li><li><a href="DataProcessor.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Help">Использование профилей безопасности</a> - использование профилей безопасности для контроля за использованием программой внешних (относительно кластера серверов 1С:Предприятия) ресурсов.</li></a></ul><h3>Публикация информационной базы</h3> -<ul><li> -<div>Настройки программы <strong>Адрес в интернете</strong> и <strong>Локальный адрес</strong> предназначены для сценариев, связанных с формированием ссылок на объекты информационной базы в зависимости от вида подключения пользователей к информационной базе. </div> -</li><li> -<div>Например, если такой адрес включить в рассылку писем, то из письма за одно нажатие можно перейти к форме объекта в самой программе.</div></li></ul><h3>См. также: </h3> +</li><li><a href="CommonForm.НастройкиЭлектроннойПодписиИШифрования/Help">Настройки электронной подписи и шифрования</a> - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. </li></ul><h3>См. также: </h3> <ul><li><a href="DataProcessor.ПанельАдминистрированияБСП/Help">Настройки программы</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl index 7ede5dbb6..d371c0e5b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl @@ -9,32 +9,33 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - ЧасовойПоясПрограммы = ПолучитьЧасовойПоясИнформационнойБазы(); Если ПустаяСтрока(ЧасовойПоясПрограммы) Тогда ЧасовойПоясПрограммы = ЧасовойПояс(); КонецЕсли; - Элементы.ЧасовойПоясПрограммы.СписокВыбора.Добавить(ЧасовойПоясПрограммы); + Элементы.ЧасовойПоясПрограммы.СписокВыбора.ЗагрузитьЗначения(ПолучитьДопустимыеЧасовыеПояса()); - Элементы.ГруппаНастройкаИспользованияПрофилейБезопасности.Видимость = РаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности() И РежимРаботы.ЭтоАдминистраторСистемы; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - Элементы.ГруппаОткрытьПараметрыПроксиСервера.Видимость = РежимРаботы.КлиентСерверный И РежимРаботы.ЭтоАдминистраторСистемы; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); + + Элементы.ГруппаНастройкаИспользованияПрофилейБезопасности.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина) + И МодульРаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности(); Иначе - Элементы.ГруппаОткрытьПараметрыПроксиСервера.Видимость = Ложь; + Элементы.ГруппаНастройкаИспользованияПрофилейБезопасности.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Интеграция1СБухфон") Тогда - Элементы.ГруппаИнтеграция1СБухфон.Видимость = РежимРаботы.ЭтоWindowsКлиент; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Элементы.ГруппаОткрытьПараметрыПроксиСервера.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина) + И Не ОбщегоНазначения.ИнформационнаяБазаФайловая(); Иначе - Элементы.ГруппаИнтеграция1СБухфон.Видимость = Ложь; + Элементы.ГруппаОткрытьПараметрыПроксиСервера.Видимость = Ложь; КонецЕсли; Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда @@ -45,11 +46,24 @@ Элементы.ГруппаДополнительныеРеквизитыИСведения.Видимость = Ложь; КонецЕсли; - Элементы.ГруппаПубликацияИнформационнойБазы.Видимость = Не (ОбщегоНазначенияПовтИсп.РазделениеВключено() - Или ОбщегоНазначенияПовтИсп.ЭтоАвтономноеРабочееМесто()); + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + Элементы.ГруппаВерсионирование.Видимость = Ложь; + КонецЕсли; + + Элементы.ГруппаПубликацияИнформационнойБазы.Видимость = Не (ОбщегоНазначения.РазделениеВключено() + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто()); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина); + Иначе + Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов.Видимость = Ложь; + КонецЕсли; УстановитьДоступность(); + НастройкиПрограммыПереопределяемый.ОбщиеНастройкиПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -75,21 +89,22 @@ Подключаемый_ПриИзмененииРеквизита(Элемент); КонецПроцедуры -&НаКлиенте -Процедура ЧасовойПоясПрограммыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Если Элемент.СписокВыбора.Количество() < 2 Тогда - ЗагрузитьЧасовыеПояса(); - КонецЕсли; -КонецПроцедуры - &НаКлиенте Процедура ИспользоватьДополнительныеРеквизитыИСведенияПриИзменении(Элемент) Подключаемый_ПриИзмененииРеквизита(Элемент); КонецПроцедуры &НаКлиенте -Процедура Интеграция1СБухфонПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); +Процедура ИспользоватьПолнотекстовыйПоискПриИзменении(Элемент) + + Если ИспользоватьПолнотекстовыйПоиск = 0 Тогда // Предыдущее значение - 2 (3й режим). + ИспользоватьПолнотекстовыйПоиск = 1; + ИначеЕсли ИспользоватьПолнотекстовыйПоиск = 2 Тогда // Предыдущее значение - 1 (Истина). + ИспользоватьПолнотекстовыйПоиск = 0; + КонецЕсли; + + ПриИзмененииРежимаПолнотекстовогоПоиска(Элемент, Истина); + КонецПроцедуры &НаКлиенте @@ -115,31 +130,22 @@ КонецПроцедуры +&НаКлиенте +Процедура ИспользоватьВерсионированиеОбъектовПриИзменении(Элемент) + Подключаемый_ПриИзмененииРеквизита(Элемент); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы -&НаКлиенте -Процедура ПоказатьВремяТекущегоСеанса(Команда) - - ПоказатьПредупреждение(, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Время сеанса: %1 - |На сервере: %2 - |На клиенте: %3 - | - |Время сеанса - это время сервера, - |приведенное к часовому поясу клиента.'"), - Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДЛФ=T"), - Формат(ДатаСервера(), "ДЛФ=T"), - Формат(ТекущаяДата(), "ДЛФ=T"))); - -КонецПроцедуры - &НаКлиенте Процедура ИспользованиеПрофилейБезопасности(Команда) - РаботаВБезопасномРежимеКлиент.ОткрытьДиалогНастройкиИспользованияПрофилейБезопасности(); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ОткрытьДиалогНастройкиИспользованияПрофилейБезопасности(); + КонецЕсли; КонецПроцедуры @@ -176,7 +182,7 @@ &НаСервере Процедура АдресПубликацииИнформационнойБазыНачалоВыбораНаСервере(ИмяРеквизита, СтрокаСоединения) - ПараметрыСоединения = СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединения); + ПараметрыСоединения = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения); Если ПараметрыСоединения.Свойство("WS") Тогда НаборКонстант[ИмяРеквизита] = ПараметрыСоединения.WS; КонецЕсли; @@ -186,6 +192,13 @@ //////////////////////////////////////////////////////////////////////////////// // Клиент +&НаКлиенте +Процедура ПриИзмененииРеквизитаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = "АктивныеПользователи" Тогда + СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей(); + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, ОбновлятьИнтерфейс = Истина) @@ -214,6 +227,35 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриИзмененииРежимаПолнотекстовогоПоиска(Элемент, ОбновлятьИнтерфейс = Истина) + + КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя); + + Если КонстантаИмя = "НеУдалосьУстановитьРежимПолнотекстовогоПоиска" Тогда + // Выдача предупреждающего сообщения. + ТекстВопроса = НСтр("ru = 'Для изменения режима полнотекстового поиска требуется завершение сеансов всех пользователей, кроме текущего.'"); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("АктивныеПользователи", НСтр("ru = 'Активные пользователи'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + + Обработчик = Новый ОписаниеОповещения("ПриИзмененииРеквизитаПослеОтветаНаВопрос", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , "АктивныеПользователи"); + Возврат; + КонецЕсли; + + Если ОбновлятьИнтерфейс Тогда + ОбновитьИнтерфейс = Истина; + ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); + КонецЕсли; + + Если КонстантаИмя <> "" Тогда + Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вызов сервера @@ -226,32 +268,12 @@ УстановитьДоступность(РеквизитПутьКДанным); - Если ИмяЭлемента = "ИспользоватьСервисСклоненияMorpher" - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда - МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); - МодульСклонениеПредставленийОбъектов.УстановитьДоступностьСервисаСклонения(Истина); - КонецЕсли; - ОбновитьПовторноИспользуемыеЗначения(); Возврат КонстантаИмя; КонецФункции -&НаСервере -Процедура ЗагрузитьЧасовыеПояса() - - Элементы.ЧасовойПоясПрограммы.СписокВыбора.ЗагрузитьЗначения(ПолучитьДопустимыеЧасовыеПояса()); - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ДатаСервера() - - Возврат ТекущаяДата(); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Сервер @@ -263,11 +285,11 @@ Если ЧасовойПоясПрограммы <> ПолучитьЧасовойПоясИнформационнойБазы() Тогда УстановитьПривилегированныйРежим(Истина); Попытка - ОбщегоНазначения.ЗаблокироватьИБ(); + УстановитьМонопольныйРежим(Истина); УстановитьЧасовойПоясИнформационнойБазы(ЧасовойПоясПрограммы); - ОбщегоНазначения.РазблокироватьИБ(); + УстановитьМонопольныйРежим(Ложь); Исключение - ОбщегоНазначения.РазблокироватьИБ(); + УстановитьМонопольныйРежим(Ложь); ВызватьИсключение; КонецПопытки; УстановитьПривилегированныйРежим(Ложь); @@ -284,10 +306,46 @@ Иначе // Определение имени и запись значения реквизита в соответствующей константе из "НаборКонстант". // Используется для тех реквизитов формы, которые связаны с константами напрямую (в отношении один-к-одному). + Если РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда + Попытка + Если ИспользоватьПолнотекстовыйПоиск Тогда + ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить); + Иначе + ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Запретить); + КонецЕсли; + Исключение + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Полнотекстовый поиск'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат "НеУдалосьУстановитьРежимПолнотекстовогоПоиска"; + КонецПопытки; + КонстантаИмя = "ИспользоватьПолнотекстовыйПоиск"; + НаборКонстант.ИспользоватьПолнотекстовыйПоиск = ИспользоватьПолнотекстовыйПоиск; + // Включение/отключение зависимых регламентных заданий. + Изменения = Новый Структура("Использование", НаборКонстант.ИспользоватьПолнотекстовыйПоиск); + Задание = РегламентныеЗаданияНайтиПредопределенное("ОбновлениеИндексаППД"); + Если Задание <> Неопределено Тогда + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); + КонецЕсли; + Задание = РегламентныеЗаданияНайтиПредопределенное("СлияниеИндексаППД"); + Если Задание <> Неопределено Тогда + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Изменения.Использование = Изменения.Использование И НаборКонстант.ИзвлекатьТекстыФайловНаСервере; + Задание = РегламентныеЗаданияНайтиПредопределенное("ИзвлечениеТекста"); + Если Задание <> Неопределено Тогда + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); + КонецЕсли; + КонецЕсли; + КонецЕсли; КонецЕсли; // Сохранения значения константы. - Если КонстантаИмя <> "" Тогда + Если КонстантаИмя <> "" Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда КонстантаМенеджер = Константы[КонстантаИмя]; КонстантаЗначение = НаборКонстант[КонстантаИмя]; @@ -327,8 +385,15 @@ НаборКонстант.ИспользоватьЭлектронныеПодписи Или НаборКонстант.ИспользоватьШифрование; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + Если РеквизитПутьКДанным = "" Тогда - ДоступностьНастройкиПроксиНаСервере = Не ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности"); + ДоступностьНастройкиПроксиНаСервере = Не ИспользуютсяПрофилиБезопасности; ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "ГруппаОткрытьПараметрыПроксиСервера", @@ -338,20 +403,37 @@ "Видимость", Не ДоступностьНастройкиПроксиНаСервере); КонецЕсли; - Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьИнтеграцию1СБухфон" Или РеквизитПутьКДанным = "") - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Интеграция1СБухфон") Тогда - Элементы.ГруппаНастройка1СБухфон.Доступность = НаборКонстант.ИспользоватьИнтеграцию1СБухфон; - КонецЕсли; - - Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисСклоненияMorpher" Или РеквизитПутьКДанным = "") - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") + И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьВерсионированиеОбъектов" + Или РеквизитПутьКДанным = "") Тогда ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "ГруппаНастройкаСклонения", "Доступность", - НаборКонстант.ИспользоватьСервисСклоненияMorpher); - + Элементы, + "РегистрСведенийНастройкиВерсионированияОбъектов", + "Доступность", + НаборКонстант.ИспользоватьВерсионированиеОбъектов); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + Если РеквизитПутьКДанным = "" Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда + МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); + Если НаборКонстант.ИспользоватьПолнотекстовыйПоиск <> МодульПолнотекстовыйПоискСервер.ОперацииРазрешены() Тогда + ИспользоватьПолнотекстовыйПоиск = 2; + Иначе + ИспользоватьПолнотекстовыйПоиск = НаборКонстант.ИспользоватьПолнотекстовыйПоиск; + КонецЕсли; + Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройка.Доступность = (ИспользоватьПолнотекстовыйПоиск = 1); + КонецЕсли; КонецЕсли; КонецПроцедуры +&НаСервере +Функция РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного) + Фильтр = Новый Структура("Метаданные", ИмяПредопределенного); + Найденные = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); + Задание = ?(Найденные.Количество() = 0, Неопределено, Найденные[0]); + Возврат Задание; +КонецФункции + #КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form index 5c9397e44..febe155c3 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form @@ -71,6 +71,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 1641 @@ -91,6 +95,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 1638 @@ -175,12 +183,8 @@ <key>ru</key> - <value>Группа использовать почтовый клиент</value> + <value>Использовать почтовый клиент</value> - - ru - Группа использовать почтовый клиент - 43 false @@ -259,12 +263,8 @@ <key>ru</key> - <value>Группа отправлять письма в формате HTML</value> + <value>Отправлять письма в формате HTML</value> - - ru - Группа отправлять письма в формате HTML - 43 false @@ -371,12 +371,8 @@ <key>ru</key> - <value>Группа использовать прочие взаимодействия</value> + <value>Использовать прочие взаимодействия</value> - - ru - Группа использовать прочие взаимодействия - 43 false @@ -456,12 +452,8 @@ <key>ru</key> - <value>Группа использовать признак рассмотрено</value> + <value>Использовать признак рассмотрено</value> - - ru - Группа использовать признак рассмотрено - 43 false @@ -587,12 +579,8 @@ <key>ru</key> - <value>Группа открыть настройки системной учетной записи ЭП</value> + <value>Открыть настройки системной учетной записи ЭП</value> - - ru - Группа открыть настройки системной учетной записи ЭП - 43 false @@ -656,12 +644,8 @@ <key>ru</key> - <value>Группа открыть учетные записи электронной почты</value> + <value>Открыть учетные записи электронной почты</value> - - ru - Группа открыть учетные записи электронной почты - 43 false @@ -820,7 +804,7 @@
          - ГруппаЗаметкиНапоминанияАнкетирование + ГруппаЗаметкиНапоминанияАнкетированиеШаблоны 1790 ГруппаЗаметкиНапоминания @@ -881,12 +865,8 @@ <key>ru</key> - <value>Группа использовать заметки</value> + <value>Использовать заметки</value> - - ru - Группа использовать заметки - 43 false @@ -965,12 +945,8 @@ <key>ru</key> - <value>Группа использовать напоминания пользователя</value> + <value>Использовать напоминания пользователя</value> - - ru - Группа использовать напоминания пользователя - 43 false @@ -998,6 +974,10 @@ true + + <key>ru</key> + <value>Заметки напоминания</value> + ГруппаЗаметкиНапоминанияРасширеннаяПодсказка 1667 @@ -1073,6 +1053,10 @@ true + + <key>ru</key> + <value>Использовать анкетирование</value> + 43 false @@ -1154,6 +1138,10 @@ true + + <key>ru</key> + <value>Использовать шаблоны сообщений</value> + 43 false @@ -1211,10 +1199,10 @@ true - + <key>ru</key> - <value>Группа настройка шаблоны сообщений</value> - </toolTip> + <value>Настройка шаблоны сообщений</value> + 43 false @@ -1244,12 +1232,8 @@ <key>ru</key> - <value>Группа шаблоны сообщений</value> + <value>Шаблоны сообщений</value> - - ru - Группа шаблоны сообщений - ГруппаШаблоныСообщенийРасширеннаяПодсказка 1795 @@ -1278,12 +1262,8 @@ ru Заметки, напоминания, анкетирование, шаблоны сообщений - - ru - Группа заметки напоминания анкетирование - - ГруппаЗаметкиНапоминанияАнкетированиеРасширеннаяПодсказка + ГруппаЗаметкиНапоминанияАнкетированиеШаблоныРасширеннаяПодсказка 1791 Label true @@ -1369,7 +1349,7 @@ <key>ru</key> - <value>Группа использовать бизнес процессы и задачи</value> + <value>Использовать бизнес процессы и задачи</value> 43 false @@ -1434,12 +1414,8 @@ <key>ru</key> - <value>Группа открыть роли и исполнители бизнес процессов</value> + <value>Открыть роли и исполнители бизнес процессов</value> - - ru - Группа открыть роли и исполнители бизнес процессов - 43 false @@ -1575,6 +1551,10 @@ true + + <key>ru</key> + <value>Использовать подчиненные бизнес процессы</value> + 43 false @@ -1653,12 +1633,8 @@ <key>ru</key> - <value>Группа изменять задания задним числом</value> + <value>Изменять задания задним числом</value> - - ru - Группа изменять задания задним числом - 43 false @@ -1797,12 +1773,8 @@ <key>ru</key> - <value>Группа использовать дату начала задач</value> + <value>Использовать дату начала задач</value> - - ru - Группа использовать дату начала задач - 43 false @@ -1881,12 +1853,8 @@ <key>ru</key> - <value>Группа использовать дату и время в сроках задач</value> + <value>Использовать дату и время в сроках задач</value> - - ru - Группа использовать дату и время в сроках задач - 43 false @@ -2076,6 +2044,10 @@ true + + <key>ru</key> + <value>Мониторинг задач использование</value> + 43 false @@ -2129,6 +2101,10 @@ true + + <key>ru</key> + <value>Мониторинг задач</value> + ГруппаМониторингЗадачРасширеннаяПодсказка 1712 @@ -2291,6 +2267,10 @@ true + + <key>ru</key> + <value>Уведомление исполнителей о новых задачах использование</value> + 43 false @@ -2344,6 +2324,10 @@ true + + <key>ru</key> + <value>Уведомление исполнителей о новых задачах</value> + ГруппаУведомлениеИсполнителейОНовыхЗадачахРасширеннаяПодсказка 1737 @@ -2402,6 +2386,10 @@ -1 Left + + NotificationProcessing + ОбработкаОповещения + OnCreateAtServer ПриСозданииНаСервере @@ -2448,6 +2436,12 @@ НаборКонстант.ЗаголовокСистемы + + НаборКонстант.ИспользоватьАнкетирование + + + НаборКонстант.ИспользоватьВнешнихПользователей +
          true
          @@ -2490,21 +2484,6 @@ true - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 15 - - - true - - - true - - МониторингЗадачИспользование diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html index 5fdc974a6..2f84f7d06 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html @@ -13,12 +13,14 @@ TD { <ul><li><strong>Исходящие письма в формате HTML</strong> - включите флажок, для того чтобы редактировать исходящие письма в формате HTML. </li><li><strong>Звонки, SMS, встречи и запланированные взаимодействия</strong> - включите флажок, для того чтобы регистрировать в программе звонки, встречи, сообщения SMS и запланированные взаимодействия. </li><li><strong>Признаки "Рассмотрено"</strong> и <strong>"На контроле"</strong> - включите флажок, для того чтобы можно было ставить отметки о рассмотрении <a href="Document.ЭлектронноеПисьмоВходящее.Form.ФормаДокумента/Help">входящих писем</a>, <a href="Document.Встреча.Form.ФормаДокумента/Help">встреч</a>, <a href="Document.ТелефонныйЗвонок.Form.ФормаДокумента/Help">телефонных звонков</a> и <a href="Document.ЗапланированноеВзаимодействие.Form.ФормаДокумента/Help">запланированных взаимодействий</a>, а также  для постановки на контроль <a href="Document.ЭлектронноеПисьмоИсходящее.Form.ФормаДокумента/Help">исходящего письма</a> и <a href="Document.СообщениеSMS.Form.ФормаДокумента/Help">сообщения SMS</a>. Этот флажок полезно использовать для организации совместной работы в программе.</li></ul></li></a><a name="СтандартныеПодсистемы.РаботаСПочтовымиСообщениями"> -<li><a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">Настройка системной учетной записи электронной почты</a> - переход к настройке основной учетной записи электронной почты для отправки уведомлений из программы. +<li><a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">Настройка системной учетной записи</a> - переход к настройке основной учетной записи электронной почты для отправки уведомлений из программы. </li><li><a href="Catalog.УчетныеЗаписиЭлектроннойПочты/Help">Учетные записи электронной почты</a> - администрирование всех учетных записей электронной почты.</li></a> </ul><h3>Отправка SMS<a name="СтандартныеПодсистемы.ОтправкаSMS"></a></h3> -<ul><li><a href="CommonForm.НастройкаОтправкиSMS/Help">Настройка отправки SMS</a> - переход к настройке параметров отправки SMS-сообщений из программы.  </li></ul><h3>Заметки, напоминания, анкетирование<a name="СтандартныеПодсистемы.ЗаметкиПользователя"></a></h3> -<ul><li><strong>Заметки</strong> - включите этот флажок, для того чтобы можно было использовать <a href="Catalog.Заметки/Help">заметки</a> - произвольную текстовую информацию, для которой не получается подобрать какого-либо более подходящего справочника или документа, и которая больше никому не должна быть доступна. Заметки могут быть произвольными или по предмету, ссылаясь, например, на элемент справочника, документ, или другой объект программы. <a name="СтандартныеПодсистемы.НапоминанияПользователя"> -<li><strong>Напоминания</strong> - включите этот флажок, для того чтобы можно было вводить <a href="InformationRegister.НапоминанияПользователя/Help">напоминания</a>, которые срабатывают в назначенное время. Укажите время и предмет, по поводу которого в программе в указанное время будет выведен список напоминаний. Напоминания могут быть произвольными или по предмету, ссылаясь, например, на элемент справочника, документ, или другой объект программы.</li></a> <a name="СтандартныеПодсистемы.Анкетирование"> -<li><strong>Анкетирование</strong> - включите этот флажок, для того чтобы стал доступным соответствующий раздел программы, в котором можно готовить опросы, составлять <a href="Catalog.ШаблоныАнкет.Form.ФормаЭлемента/Help">анкеты</a>, проводить опросы среди респондентов, а также и анализировать результаты опросов.</li></a> </li></ul><h3>Бизнес-процессы и задачи</h3> +<ul><li><a href="CommonForm.НастройкаОтправкиSMS/Help">Настройка отправки SMS</a> - переход к настройке параметров отправки SMS-сообщений из программы.  </li></ul><h3>Заметки, напоминания, анкетирование, шаблоны сообщений</h3> +<ul><li><strong>Заметки</strong> - включите этот флажок, для того чтобы можно было использовать <a name="СтандартныеПодсистемы.ЗаметкиПользователя"></a><a href="Catalog.Заметки/Help">заметки</a> - произвольную текстовую информацию, для которой не получается подобрать какого-либо более подходящего справочника или документа, и которая больше никому не должна быть доступна. Заметки могут быть произвольными или по предмету, ссылаясь, например, на элемент справочника, документ, или другой объект программы. +</li><li><strong>Напоминания</strong> - включите этот флажок, для того чтобы можно было вводить <a name="СтандартныеПодсистемы.НапоминанияПользователя"></a><a href="InformationRegister.НапоминанияПользователя/Help">напоминания</a>, которые срабатывают в назначенное время. Укажите время и предмет, по поводу которого в программе в указанное время будет выведен список напоминаний. Напоминания могут быть произвольными или по предмету, ссылаясь, например, на элемент справочника, документ, или другой объект программы. +</li><li><strong>Анкетирование</strong> - включите этот флажок, для того чтобы стал доступным соответствующий раздел программы, в котором можно готовить опросы, составлять <a name="СтандартныеПодсистемы.Анкетирование"></a><a href="Catalog.ШаблоныАнкет.Form.ФормаЭлемента/Help">анкеты</a>, проводить опросы среди респондентов, а также и анализировать результаты опросов. +</li><li><strong>Шаблоны сообщений</strong> - включите флажок, для того чтобы стала доступной команда: <a name="СтандартныеПодсистемы.ШаблоныСообщений"> +<li><a href="Catalog.ШаблоныСообщений/Help">Шаблоны сообщений</a> - перейдите по ссылке для перехода к работе со списком шаблонов сообщений. В программе предусмотрена возможность разработки шаблонов сообщений для почтовых сообщений и сообщений SMS, их хранение и управление ими в списке шаблонов. Возможна отправка писем и сообщений SMS, сформированных на основании списков или документов и по заранее подготовленным шаблонам сообщений.</li></a></li></ul><h3>Бизнес-процессы и задачи</h3> <p>Программа предоставляет возможности для решения задач автоматизации управления предприятием или компанией. Процесс управления предприятием можно представить в программе как совокупность бизнес-процессов, состоящих из задач, каждая из которых адресована определенному исполнителю.</p> <ul><li><strong>Бизнес-процессы и задачи</strong> - включите флажок, для того чтобы стал доступным раздел программы <strong>Бизнес-процессы и задачи</strong>, который предполагает использование запускаемых бизнес-процессов и позволяет работу с задачами. Также становится доступным ряд других команд, с помощью которых можно запустить бизнес-процессы и использовать задачи: <ul><a name="СтандартныеПодсистемы.БизнесПроцессыИЗадачи"> diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Module.bsl index 41dfa2586..f6cf8de0c 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Module.bsl @@ -13,12 +13,8 @@ Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - Если РежимРаботы.ЭтоАдминистраторПрограммы Тогда + Если Пользователи.ЭтоПолноправныйПользователь() Тогда ЕстьПочта = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями"); РегламентноеЗадание = НайтиРегламентноеЗадание("МониторингЗадач"); Если ЕстьПочта И РегламентноеЗадание <> Неопределено Тогда @@ -39,7 +35,7 @@ Элементы.ГруппаУведомлениеИсполнителейОНовыхЗадачах.Видимость = Ложь; КонецЕсли; - Если РежимРаботы.МодельСервиса Тогда + Если ОбщегоНазначения.РазделениеВключено() Тогда Элементы.МониторингЗадачНастроитьРасписание.Видимость = Ложь; Элементы.УведомлениеИсполнителейОНовыхЗадачахНастроитьРасписание.Видимость = Ложь; КонецЕсли; @@ -49,6 +45,9 @@ // Обновление состояния элементов. УстановитьДоступность(); + + НастройкиПрограммыПереопределяемый.ОрганайзерПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -59,6 +58,22 @@ ОбновитьИнтерфейсПрограммы(); КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия <> "Запись_НаборКонстант" Тогда + Возврат; + КонецЕсли; + + Если Источник = "ИспользоватьВнешнихПользователей" Тогда + + ЭтотОбъект.Прочитать(); + УстановитьДоступность(); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form index 1afc3082e..c112fdee0 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form @@ -71,6 +71,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 1603 @@ -91,6 +95,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 1600 @@ -156,6 +164,10 @@ true + + <key>ru</key> + <value>Макеты печатных форм</value> + 43 false @@ -220,6 +232,10 @@ true + + <key>ru</key> + <value>Подменю печать</value> + 43 false @@ -246,6 +262,10 @@ true + + <key>ru</key> + <value>Печать</value> + ГруппаПечатьРасширеннаяПодсказка 1628 @@ -310,6 +330,10 @@ true + + <key>ru</key> + <value>Отчеты</value> + 43 false @@ -371,6 +395,10 @@ true + + <key>ru</key> + <value>Рассылки отчетов</value> + 43 false @@ -397,6 +425,10 @@ true + + <key>ru</key> + <value>Варианты рассылки</value> + ГруппаВариантыРассылкиРасширеннаяПодсказка 1608 @@ -437,7 +469,7 @@ 1679 <key>ru</key> - <value>Универсальный отчет по справочникам, документам, регистрам и т.д.</value> + <value>Просмотр произвольных справочников, документов, регистров и т.д.</value> Label true @@ -460,6 +492,10 @@ true + + <key>ru</key> + <value>Универсальный отчет</value> + 43 false @@ -486,7 +522,7 @@ 1672 Расширения - 1645 + 1684 true true @@ -494,7 +530,7 @@ РасширенияРасширеннаяПодсказка - 1646 + 1685 <key>ru</key> <value>Установка расширений: разделов, отчетов и обработок в дополнение к предусмотренным в программе.</value> @@ -507,7 +543,7 @@ </extInfo> </extendedTooltip> <type>Hyperlink</type> - <commandName>Form.Command.Расширения</commandName> + <commandName>CommonForm.Расширения.StandardCommand.Open</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -521,6 +557,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Расширения</value> + 43 false @@ -547,6 +587,10 @@ true + + <key>ru</key> + <value>Универсальный отчет расширения</value> + ГруппаУниверсальныйОтчетРасширенияРасширеннаяПодсказка 1642 @@ -568,6 +612,72 @@ Auto + + ГруппаУправлениеВнешнимиКомпонентами + 1686 + + ОбработкаУправлениеВнешнимиКомпонентами + 1688 + true + true + + true + + + ОбработкаУправлениеВнешнимиКомпонентамиРасширеннаяПодсказка + 1689 + + <key>ru</key> + <value>Подключение внешних компонент сторонних поставщиков к программе.</value> + + Label + true + true + + Left + + + Hyperlink + Catalog.ВнешниеКомпоненты.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Управление внешними компонентами</value> + + 43 + false + + ГруппаУправлениеВнешнимиКомпонентамиРасширеннаяПодсказка + 1687 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + ГруппаДополнительныеОтчетыИОбработки 1593 @@ -626,6 +736,10 @@ true + + <key>ru</key> + <value>Дополнительные отчеты и обработки использование</value> + 43 false @@ -686,6 +800,10 @@ true + + <key>ru</key> + <value>Дополнительные отчеты и обработки настройка</value> + 43 false @@ -712,6 +830,10 @@ true + + <key>ru</key> + <value>Дополнительные отчеты и обработки</value> + ГруппаДополнительныеОтчетыИОбработкиРасширеннаяПодсказка 1615 @@ -738,6 +860,10 @@ true + + <key>ru</key> + <value>Колонки</value> + ГруппаКолонкиРасширеннаяПодсказка 1659 @@ -823,28 +949,6 @@ true - - Расширения - - <key>ru</key> - <value>Расширения</value> - - 3 - - ru - Расширения - - - true - - - - Расширения - - - DontUse - Auto - diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html index b33973516..51e202c9a 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html @@ -9,10 +9,10 @@ TD {

          См. также:

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

        См. также:

        \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl index c44cec531..34026f4ba 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl @@ -13,16 +13,13 @@ Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - // Настройки видимости при запуске. Элементы.Расширения.Видимость = Не СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - Элементы.ИспользоватьДополнительныеОтчетыИОбработки.Видимость = РежимРаботы.Локальный Или РежимРаботы.Автономный; - Элементы.ОткрытьДополнительныеОтчетыИОбработки.Видимость = РежимРаботы.Локальный Или РежимРаботы.Автономный + РазделениеВключено = Не ОбщегоНазначения.РазделениеВключено(); + Элементы.ИспользоватьДополнительныеОтчетыИОбработки.Видимость = Не РазделениеВключено; + Элементы.ОткрытьДополнительныеОтчетыИОбработки.Видимость = Не РазделениеВключено // При работе в модели сервиса, если включено администратором сервиса. Или НаборКонстант.ИспользоватьДополнительныеОтчетыИОбработки; Иначе @@ -38,6 +35,9 @@ // Обновление состояния элементов. УстановитьДоступность(); + + НастройкиПрограммыПереопределяемый.ПечатныеФормыОтчетыИОбработкиПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -59,10 +59,14 @@ Попытка - ЗапросыНаИспользованиеВнешнихРесурсов = ЗапросыНаИспользованиеВнешнихРесурсовДополнительныхОтчетовИОбработок(СтароеЗначение); - Обработчик = Новый ОписаниеОповещения("ИспользоватьДополнительныеОтчетыИОбработкиПриИзмененииЗавершение", ЭтотОбъект, Элемент); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыНаИспользованиеВнешнихРесурсов, ЭтотОбъект, Обработчик); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + ЗапросыНаИспользованиеВнешнихРесурсов = ЗапросыНаИспользованиеВнешнихРесурсовДополнительныхОтчетовИОбработок(СтароеЗначение); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыНаИспользованиеВнешнихРесурсов, ЭтотОбъект, Обработчик); + Иначе + ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК); + КонецЕсли; Исключение @@ -75,17 +79,6 @@ #КонецОбласти -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Расширения(Команда) - - ОткрытьФорму("ОбщаяФорма.Расширения"); - -КонецПроцедуры - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Help/ru.html deleted file mode 100644 index d84bd9fed..000000000 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Help/ru.html +++ /dev/null @@ -1,150 +0,0 @@ -В данной панели осуществляется контроль состояния программы, резервное копирование и восстановление, обновление версии, оптимизация быстродействия.

        - - - - - - -
        -
      • Журнал регистрации
      • Просмотр событий и действий, которые происходили в регламентных заданиях или в процессе работы пользователей в программе.
        -
      • Активные пользователи
      • Список пользователей, которые сейчас работают в программе.
        -
      • Блокировка работы пользователей
      • Установка и снятие запрета работы пользователей с программой. При установке запрета завершается работа всех активных пользователей (включая текущего).
        -
      • Удаление помеченных объектов
      • Окончательное удаление тех объектов программы, которым ранее была присвоена пометка на удаление.

        Отчеты и обработки

        - - - - -
        -
      • Отчеты администратора
      • -

        Отчеты по журналу регистрации.

        -

        Отчеты для администрирования программы.

        -
      • Дополнительные     отчеты по администрированию
      • Команды дополнительных отчетов, подключенных к программе.
        -
      • Дополнительные обработки по администрированию
      • Команды дополнительных обработок, подключенных к программе.

        Регламентные операции

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

        См. также: Даты запрета загрузки данных в разделе Синхронизация данных. После этого становится активной команда:

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

        Резервное копирование и восстановление

        - - - - -
        -

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

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

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

        -

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

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

        Оценка производительности

        -

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

        - - - - -
        -
      • Оценка производительности
      • Флажок замеров интегральной производительности программы по методике APDEX.
        -
      • Настройки оценки производительности
      • Настройки параметров оценки производительности.
        -
      • Показатели производительности
      • Просмотр и оценка результатов замеров производительности.
        -
      • Экспорт замеров производительности
      • Экспорт замеров производительности за произвольный период.

        -

        Адресный классификатор

        - - - - - -
        Выберите с помощью переключателя способ работы с адресными сведениями:
        -
      • Использовать веб-сервис 1С для ввода и проверки адресов
      • -

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

        -
      • Загружать классификатор в программу
      • -

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

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

        Другие классификаторы

        - - - - -
        -
      • Загрузить классификатор банков
      • Загрузка и обновление классификатора банков РФ из сети Интернет или диска 1С:ИТС.
        -
      • Загрузить курсы валют
      • Загрузка курсов валют из сети Интернет.
        -

        Защита персональных данных

        - - - -
        -
      • Настройки регистрации событий доступа к персональным данным
      • Настройки регистрации событий доступа в соответствии с требованиями Федерального закона от 27.07.2006 N152-ФЗ "О персональных данных"
        -
      • Защита персональных данных
      • Просмотр обращений к персональным данным выбранных объектов программы.

        Корректировка данных

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

        Работа с контрагентами

        -

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

        -

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

        Результаты обновления программы

        -

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

        -

        - - - -

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

        Центр мониторинга

        -

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

        -

        С помощью переключателя выберите:

        -

        - - - -
        -
      • Разрешить автоматическую отправку сведений об использовании программы в фирму "1С"
      • выбрано по умолчанию, рекомендуется.
        -
      • Разрешить отправку сведений стороннему разработчику
      • в этом случае необходимо заполнить Адрес сервиса.
        -
      • Запретить отправку сведений
      • не рекомендуется, т.к. статистика необходима разработчикам для анализа работы программы, при этом передача статистики не замедляет ее работу.

        См. также:

        - \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Module.bsl deleted file mode 100644 index 3de1a5097..000000000 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПоддержкаИОбслуживание/Module.bsl +++ /dev/null @@ -1,967 +0,0 @@ -#Область ОписаниеПеременных - -&НаКлиенте -Перем ОбновитьИнтерфейс; - -#КонецОбласти - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда - Возврат; - КонецЕсли; - - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - РегламентноеЗадание = РегламентныеЗаданияНайтиПредопределенное("УдалениеПомеченных"); - ВидимостьФлажка = (РегламентноеЗадание <> Неопределено); - Если ВидимостьФлажка Тогда - УдалениеПомеченныхИдентификатор = РегламентноеЗадание.УникальныйИдентификатор; - УдалениеПомеченныхИспользование = РегламентноеЗадание.Использование; - УдалениеПомеченныхРасписание = РегламентноеЗадание.Расписание; - КонецЕсли; - ВидимостьРасписания = ВидимостьФлажка И Не РежимРаботы.МодельСервиса И РежимРаботы.ЭтоАдминистраторСистемы; - Элементы.УдалениеПомеченныхИспользование.Видимость = ВидимостьФлажка; - Элементы.УдалениеПомеченныхНастроитьРасписание.Видимость = ВидимостьРасписания; - Элементы.УдалениеПомеченныхПредставлениеРасписания.Видимость = ВидимостьРасписания; - Иначе - Элементы.ГруппаУдалениеПомеченныхОбъектовПоРасписанию.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована(); - Элементы.ГруппаОбработкаРегламентныеИФоновыеЗадания.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаОбработкаРегламентныеИФоновыеЗадания.Видимость = Ложь; - Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - Элементы.ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть.Видимость = РежимРаботы.ЭтоАдминистраторПрограммы - И (РежимРаботы.Локальный Или РежимРаботы.Автономный); - Иначе - Элементы.ГруппаОбработкаУправлениеИтогамиИАгрегатамиОткрыть.Видимость = Ложь; - КонецЕсли; - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - Элементы.ГруппаДатыЗапретаИзменения.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстов.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = ((РежимРаботы.Локальный - Или РежимРаботы.Автономный) И РежимРаботы.ЭтоАдминистраторСистемы - И Не РежимРаботы.ЭтоВебКлиент И РежимРаботы.ЭтоWindowsКлиент); - ОбновитьНастройкиРезервногоКопирования(); - Иначе - Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = Ложь; - КонецЕсли; - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - Элементы.ГруппаВерсионирование.Видимость = Ложь; - КонецЕсли; - - Элементы.ГруппаКлассификаторы.Видимость = РежимРаботы.Локальный Или РежимРаботы.Автономный; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - Элементы.ГруппаОценкаПроизводительности.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаОценкаПроизводительности.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда - Элементы.ГруппаЗагрузитьКлассификаторБанков.Видимость = РежимРаботы.Локальный И РежимРаботы.ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаЗагрузитьКлассификаторБанков.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = РежимРаботы.Локальный; - Иначе - Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда - Элементы.ГруппаОткрытьНастройкиРегистрацииСобытийДоступаКПерсональнымДанным.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаЗащитаПерсональныхДанных.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда - Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = РежимРаботы.ЭтоАдминистраторПрограммы; - Иначе - Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = Ложь; - КонецЕсли; - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда - Элементы.ГруппаПоискИУдалениеДублей.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - Элементы.ГруппаДополнительныеОтчетыИОбработки.Видимость = НаборКонстант.ИспользоватьДополнительныеОтчетыИОбработки; - Иначе - Элементы.ГруппаДополнительныеОтчетыИОбработки.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ВидимостьГруппыНастройки = РежимРаботы.Локальный Или РежимРаботы.Автономный; - Если ВидимостьГруппыНастройки Тогда - ВидимостьГруппыКоманды = Истина; - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда - МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); - Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = - МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки() = Неопределено; - Иначе - ВидимостьГруппыНастройки = Ложь; - КонецЕсли; - Иначе - ВидимостьГруппыКоманды = Ложь; - КонецЕсли; - Элементы.ГруппаАдресныйКлассификаторНастройки.Видимость = ВидимостьГруппыНастройки; - Элементы.ГруппаАдресныйКлассификаторКоманды.Видимость = ВидимостьГруппыКоманды; - Иначе - Элементы.ГруппаАдресныйКлассификаторНастройки.Видимость = Ложь; - Элементы.ГруппаАдресныйКлассификаторКоманды.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда - Элементы.ГруппаУстановкаОбновлений.Видимость = РежимРаботы.Локальный И РежимРаботы.ЭтоАдминистраторСистемы И Не РежимРаботы.ЭтоLinuxКлиент; - Иначе - Элементы.ГруппаУстановкаОбновлений.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда - Элементы.ГруппаПроверкаКонтрагентов.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Если Элементы.ГруппаПроверкаКонтрагентов.Видимость Тогда - МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов"); - МодульПроверкаКонтрагентов.УстановитьВидимостьИЗаголовокПредупрежденияПроТестовыйРежим( - Элементы.ПредупреждениеПроТестовыйРежимПроверкиКонтрагента); - КонецЕсли; - Иначе - Элементы.ГруппаПроверкаКонтрагентов.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - Элементы.ГруппаЦентрМониторинга.Видимость = РежимРаботы.ЭтоАдминистраторСистемы; - Если РежимРаботы.ЭтоАдминистраторСистемы Тогда - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); - ЦентрМониторингаРазрешитьОтправлятьДанные = ПолучитьПереключательОтправкиДанных(ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга, ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме); - - ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыСервиса = Неопределено; - КонецЕсли; - - Если ПараметрыСервиса <> Неопределено Тогда - Если ПараметрыСервиса.Порт = 80 Тогда - Схема = "http://"; - Порт = ""; - ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда - Схема = "https://"; - Порт = ""; - Иначе - Схема = "http://"; - Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); - КонецЕсли; - - ЦентрМониторингаАдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; - Иначе - ЦентрМониторингаАдресСервиса = ""; - КонецЕсли; - - Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); - КонецЕсли; - Иначе - Элементы.ГруппаЦентрМониторинга.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхив = ОбщегоНазначения.ОбщийМодуль("ОблачныйАрхив"); - МодульОблачныйАрхив.ПанельАдминистрированияБСП_ПриСозданииНаСервере(ЭтотОбъект); - КонецЕсли; - - // Обновление состояния элементов. - УстановитьДоступность(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ПриОткрытии(ЭтотОбъект); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - - Если ИмяСобытия = "ЗакрытаФормаНастройкиРезервногоКопирования" - И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - ОбновитьНастройкиРезервногоКопирования(); - ИначеЕсли ИмяСобытия = "ИнтернетПоддержкаПодключена" Тогда - Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = Ложь; - ИначеЕсли ИмяСобытия = "ИнтернетПоддержкаОтключена" Тогда - Элементы.ГруппаАдресныйКлассификаторПраваяКолонка.Видимость = Истина; - ИначеЕсли ИмяСобытия = "РазрешенаРаботаСВнешнимиРесурсами" Тогда - Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии(ЗавершениеРаботы) - Если ЗавершениеРаботы Тогда - Возврат; - КонецЕсли; - ОбновитьИнтерфейсПрограммы(); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ИспользоватьПолнотекстовыйПоискПриИзменении(Элемент) - - Если ИспользоватьПолнотекстовыйПоиск = 0 Тогда // Предыдущее значение - 2 (3й режим). - ИспользоватьПолнотекстовыйПоиск = 1; - ИначеЕсли ИспользоватьПолнотекстовыйПоиск = 2 Тогда // Предыдущее значение - 1 (Истина). - ИспользоватьПолнотекстовыйПоиск = 0; - КонецЕсли; - - Подключаемый_ПриИзмененииРежимаПолнотекстовогоПоиска(Элемент, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура УдалениеПомеченныхИспользованиеПриИзменении(Элемент) - РегламентныеЗаданияИспользованиеПриИзменении("УдалениеПомеченных"); -КонецПроцедуры - -&НаКлиенте -Процедура ИспользоватьВерсионированиеОбъектовПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -&НаКлиенте -Процедура ВыполнятьЗамерыПроизводительностиПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -&НаКлиенте -Процедура ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -&НаКлиенте -Процедура АдресныйКлассификаторПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент, Ложь); -КонецПроцедуры - -&НаКлиенте -Процедура ИспользоватьПроверкуКонтрагентовПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -&НаКлиенте -Процедура РазрешитьОтправлятьДанныеПриИзменении(Элемент) - Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Ложь); - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Истина); - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Истина, Ложь); - КонецЕсли; - ЦентрМониторингаАдресСервиса = ПолучитьАдресСервиса(); - РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторингаЗапись); -КонецПроцедуры - -&НаКлиенте -Процедура ЦентрМониторингаАдресСервисаПриИзменении(Элемент) - Попытка - СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(ЦентрМониторингаАдресСервиса); - - Если СтруктураАдреса.Схема = "http" Тогда - СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); - ИначеЕсли СтруктураАдреса.Схема = "https" Тогда - СтруктураАдреса.Вставить("ЗащищенноеСоединение", Истина); - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(СтруктураАдреса.Порт) Тогда - Если СтруктураАдреса.Схема = "http" Тогда - СтруктураАдреса.Порт = 80; - ИначеЕсли СтруктураАдреса.Схема = "https" Тогда - СтруктураАдреса.Порт = 443; - КонецЕсли; - КонецЕсли; - Исключение - // Внимание, формат адреса должен соответствовать RFC 3986 - // см. описание функции ОбщегоНазначенияКлиентСервер.СтруктураURI. - ОписаниеОшибки = НСтр("ru = 'Адрес сервиса'") + " " - + ЦентрМониторингаАдресСервиса + " " - + НСтр("ru = 'не является допустимым адресом веб-сервиса для отправки отчетов об использовании программы.'"); - ВызватьИсключение(ОписаниеОшибки); - КонецПопытки; - - ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса); -КонецПроцедуры - -#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив - -&НаКлиенте -Процедура ОблачныйАрхивОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) - - СтандартнаяОбработка = Истина; - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ОбработкаНавигационнойСсылки( - ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, - СтандартнаяОбработка, Новый Структура); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СпособРезервногоКопированияПриИзменении(Элемент) - - // В зависимости от состояния, вывести правильную страницу. - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_СпособРезервногоКопированияПриИзменении(ЭтотОбъект); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура УдалениеПомеченныхНастроитьРасписание(Команда) - РегламентныеЗаданияГиперссылкаНажатие("УдалениеПомеченных"); -КонецПроцедуры - -&НаКлиенте -Процедура РазблокироватьРаботуСВнешнимиРесурсами(Команда) - РазблокироватьРаботуСВнешнимиРесурсамиНаСервере(); - Оповестить("РазрешенаРаботаСВнешнимиРесурсами"); -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаУправлениеПолнотекстовымПоиском(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - ИмяОткрываемойФормы = "Обработка.ПанельАдминистрированияБСП.Форма.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов"; - ОткрытьФорму(ИмяОткрываемойФормы, , ЭтотОбъект); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьДоступКСервису(Команда) - - МодульПроверкаКонтрагентовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаКонтрагентовКлиент"); - МодульПроверкаКонтрагентовКлиент.ПроверитьДоступКСервису(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОтложеннаяОбработкаДанных(Команда) - ПараметрыФормы = Новый Структура("ОткрытиеИзПанелиАдминистрирования", Истина); - ОткрытьФорму("Обработка.РезультатыОбновленияПрограммы.Форма.ИндикацияХодаОтложенногоОбновленияИБ", ПараметрыФормы); -КонецПроцедуры - -#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив - -&НаКлиенте -Процедура ПодключитьСервисОблачныйАрхив(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ПодключитьСервисОблачныйАрхив(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОблачныйАрхивВосстановлениеИзРезервнойКопииНажатие(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ВосстановлениеИзРезервнойКопии(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОблачныйАрхивНастройкаРезервногоКопированияНажатие(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.НастройкаРезервногоКопирования(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -//////////////////////////////////////////////////////////////////////////////// -// Клиент - -&НаКлиенте -Процедура ПриИзмененииРеквизитаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = "АктивныеПользователи" Тогда - СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, НеобходимоОбновлятьИнтерфейс = Истина) - - КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя); - - ОбновитьПовторноИспользуемыеЗначения(); - - Если НеобходимоОбновлятьИнтерфейс Тогда - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - - Если КонстантаИмя <> "" Тогда - Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_ПриИзмененииРежимаПолнотекстовогоПоиска(Элемент, ОбновлятьИнтерфейс = Истина) - - КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя); - - Если КонстантаИмя = "НеУдалосьУстановитьРежимПолнотекстовогоПоиска" Тогда - // Выдача предупреждающего сообщения. - ТекстВопроса = НСтр("ru = 'Для изменения режима полнотекстового поиска требуется завершение сеансов всех пользователей, кроме текущего.'"); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("АктивныеПользователи", НСтр("ru = 'Активные пользователи'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Обработчик = Новый ОписаниеОповещения("ПриИзмененииРеквизитаПослеОтветаНаВопрос", ЭтотОбъект); - ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , "АктивныеПользователи"); - Возврат; - КонецЕсли; - - Если ОбновлятьИнтерфейс Тогда - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - - Если КонстантаИмя <> "" Тогда - Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьИнтерфейсПрограммы() - - Если ОбновитьИнтерфейс = Истина Тогда - ОбновитьИнтерфейс = Ложь; - ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура РегламентныеЗаданияИспользованиеПриИзменении(ПрефиксРеквизитов) - ИмяРеквизитаИспользование = ПрефиксРеквизитов + "Использование"; - Идентификатор = ЭтотОбъект[ПрефиксРеквизитов + "Идентификатор"]; - Если ЭтотОбъект[ИмяРеквизитаИспользование] Тогда - ЭлементПредставление = Элементы.Найти(ПрефиксРеквизитов + "ПредставлениеРасписания"); - Если ЭлементПредставление = Неопределено Или ЭлементПредставление.Видимость Тогда - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("Идентификатор", Идентификатор); - ПараметрыВыполнения.Вставить("ИмяРеквизитаРасписание", ПрефиксРеквизитов + "Расписание"); - ПараметрыВыполнения.Вставить("ИмяРеквизитаИспользование", ИмяРеквизитаИспользование); - РегламентныеЗаданияИзменитьРасписание(ПараметрыВыполнения); - Возврат; - КонецЕсли; - КонецЕсли; - Изменения = Новый Структура("Использование", ЭтотОбъект[ИмяРеквизитаИспользование]); - РегламентныеЗаданияСохранить(Идентификатор, Изменения, ИмяРеквизитаИспользование); -КонецПроцедуры - -&НаКлиенте -Процедура РегламентныеЗаданияГиперссылкаНажатие(ПрефиксРеквизитов) - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("Идентификатор", ЭтотОбъект[ПрефиксРеквизитов + "Идентификатор"]); - ПараметрыВыполнения.Вставить("ИмяРеквизитаРасписание", ПрефиксРеквизитов + "Расписание"); - - РегламентныеЗаданияИзменитьРасписание(ПараметрыВыполнения); -КонецПроцедуры - -&НаКлиенте -Процедура РегламентныеЗаданияИзменитьРасписание(ПараметрыВыполнения) - Обработчик = Новый ОписаниеОповещения("РегламентныеЗаданияПослеИзмененияРасписания", ЭтотОбъект, ПараметрыВыполнения); - Диалог = Новый ДиалогРасписанияРегламентногоЗадания(ЭтотОбъект[ПараметрыВыполнения.ИмяРеквизитаРасписание]); - Диалог.Показать(Обработчик); -КонецПроцедуры - -&НаКлиенте -Процедура РегламентныеЗаданияПослеИзмененияРасписания(Расписание, ПараметрыВыполнения) Экспорт - Если Расписание = Неопределено Тогда - Если ПараметрыВыполнения.Свойство("ИмяРеквизитаИспользование") Тогда - ЭтотОбъект[ПараметрыВыполнения.ИмяРеквизитаИспользование] = Ложь; - КонецЕсли; - Возврат; - КонецЕсли; - - ЭтотОбъект[ПараметрыВыполнения.ИмяРеквизитаРасписание] = Расписание; - - Изменения = Новый Структура("Расписание", Расписание); - Если ПараметрыВыполнения.Свойство("ИмяРеквизитаИспользование") Тогда - ЭтотОбъект[ПараметрыВыполнения.ИмяРеквизитаИспользование] = Истина; - Изменения.Вставить("Использование", Истина); - КонецЕсли; - РегламентныеЗаданияСохранить(ПараметрыВыполнения.Идентификатор, Изменения, ПараметрыВыполнения.ИмяРеквизитаРасписание); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Вызов сервера - -&НаСервере -Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента) - - РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным; - - КонстантаИмя = СохранитьЗначениеРеквизита(РеквизитПутьКДанным); - - УстановитьДоступность(РеквизитПутьКДанным); - - ОбновитьПовторноИспользуемыеЗначения(); - - Возврат КонстантаИмя; - -КонецФункции - -&НаСервере -Процедура РегламентныеЗаданияСохранить(УникальныйИдентификатор, Изменения, РеквизитПутьКДанным) - РегламентныеЗаданияСервер.ИзменитьЗадание(УникальныйИдентификатор, Изменения); - Если РеквизитПутьКДанным <> Неопределено Тогда - УстановитьДоступность(РеквизитПутьКДанным); - КонецЕсли; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Сервер - -&НаСервере -Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным) - - // Сохранение значений реквизитов, не связанных с константами напрямую. - Если РеквизитПутьКДанным = "" Тогда - Возврат ""; - КонецЕсли; - - // Определение имени константы. - КонстантаИмя = ""; - Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда - // Если путь к данным реквизита указан через "НаборКонстант". - КонстантаИмя = Сред(РеквизитПутьКДанным, 15); - Иначе - // Определение имени и запись значения реквизита в соответствующей константе из "НаборКонстант". - // Используется для тех реквизитов формы, которые связаны с константами напрямую (в отношении один-к-одному). - Если РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда - Попытка - Если ИспользоватьПолнотекстовыйПоиск Тогда - ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить); - Иначе - ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Запретить); - КонецЕсли; - Исключение - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Полнотекстовый поиск'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Возврат "НеУдалосьУстановитьРежимПолнотекстовогоПоиска"; - КонецПопытки; - КонстантаИмя = "ИспользоватьПолнотекстовыйПоиск"; - НаборКонстант.ИспользоватьПолнотекстовыйПоиск = ИспользоватьПолнотекстовыйПоиск; - // Включение/отключение зависимых регламентных заданий. - Изменения = Новый Структура("Использование", НаборКонстант.ИспользоватьПолнотекстовыйПоиск); - Задание = РегламентныеЗаданияНайтиПредопределенное("ОбновлениеИндексаППД"); - Если Задание <> Неопределено Тогда - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); - КонецЕсли; - Задание = РегламентныеЗаданияНайтиПредопределенное("СлияниеИндексаППД"); - Если Задание <> Неопределено Тогда - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); - КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - Изменения.Использование = Изменения.Использование И НаборКонстант.ИзвлекатьТекстыФайловНаСервере; - Задание = РегламентныеЗаданияНайтиПредопределенное("ИзвлечениеТекста"); - Если Задание <> Неопределено Тогда - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Изменения); - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - // Сохранения значения константы. - Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда - КонстантаМенеджер = Константы[КонстантаИмя]; - КонстантаЗначение = НаборКонстант[КонстантаИмя]; - - Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда - - Если КонстантаИмя = "ИспользоватьПроверкуКонтрагентов" - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда - - ВключитьПроверку = КонстантаЗначение = 1; - МодульПроверкаКонтрагентовВызовСервера = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентовВызовСервера"); - МодульПроверкаКонтрагентовВызовСервера.ПриВключенииВыключенииПроверки(ВключитьПроверку); - Иначе - КонстантаМенеджер.Установить(КонстантаЗначение); - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - Возврат КонстантаИмя; - -КонецФункции - -&НаСервере -Процедура УстановитьДоступность(РеквизитПутьКДанным = "") - - Если Не РежимРаботы.ЭтоАдминистраторСистемы Тогда - Возврат; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") - И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьДатыЗапретаИзменения" - Или РеквизитПутьКДанным = "") Тогда - - Элементы.ГруппаДатыЗапретаИзмененияНастройка.Доступность = - НаборКонстант.ИспользоватьДатыЗапретаИзменения; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") - И (РеквизитПутьКДанным = "НаборКонстант.ВыполнятьЗамерыПроизводительности" - Или РеквизитПутьКДанным = "") Тогда - ЭлементОбработкаОценкаПроизводительности = Элементы.Найти("ОбработкаОценкаПроизводительности"); - ЭлементОбработкаНастройкиОценкиПроизводительности = Элементы.Найти("ОбработкаНастройкиОценкиПроизводительности"); - Если (ЭлементОбработкаОценкаПроизводительности <> Неопределено И ЭлементОбработкаНастройкиОценкиПроизводительности <> Неопределено И НаборКонстант.Свойство("ВыполнятьЗамерыПроизводительности")) Тогда - ЭлементОбработкаОценкаПроизводительности.Доступность = НаборКонстант.ВыполнятьЗамерыПроизводительности; - ЭлементОбработкаНастройкиОценкиПроизводительности.Доступность = НаборКонстант.ВыполнятьЗамерыПроизводительности; - КонецЕсли; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - Если РеквизитПутьКДанным = "" Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда - МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); - Если НаборКонстант.ИспользоватьПолнотекстовыйПоиск <> МодульПолнотекстовыйПоискСервер.ОперацииРазрешены() Тогда - ИспользоватьПолнотекстовыйПоиск = 2; - Иначе - ИспользоватьПолнотекстовыйПоиск = НаборКонстант.ИспользоватьПолнотекстовыйПоиск; - КонецЕсли; - Элементы.ГруппаУправлениеПолнотекстовымПоискомИИзвлечениемТекстовНастройка.Доступность = (ИспользоватьПолнотекстовыйПоиск = 1); - КонецЕсли; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") - И Элементы.УдалениеПомеченныхНастроитьРасписание.Видимость - И (РеквизитПутьКДанным = "УдалениеПомеченныхРасписание" - Или РеквизитПутьКДанным = "УдалениеПомеченныхИспользование" - Или РеквизитПутьКДанным = "") Тогда - Элементы.УдалениеПомеченныхНастроитьРасписание.Доступность = УдалениеПомеченныхИспользование; - Элементы.УдалениеПомеченныхПредставлениеРасписания.Видимость = УдалениеПомеченныхИспользование; - Если УдалениеПомеченныхИспользование Тогда - РасписаниеПредставление = Строка(УдалениеПомеченныхРасписание); - Представление = ВРег(Лев(РасписаниеПредставление, 1)) + Сред(РасписаниеПредставление, 2); - Иначе - Представление = НСтр("ru = '<Отключено>'"); - КонецЕсли; - Элементы.УдалениеПомеченныхПредставлениеРасписания.Заголовок = Представление; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") - И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьВерсионированиеОбъектов" - Или РеквизитПутьКДанным = "") Тогда - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, - "РегистрСведенийНастройкиВерсионированияОбъектов", - "Доступность", - НаборКонстант.ИспользоватьВерсионированиеОбъектов); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") - И (РеквизитПутьКДанным = "НаборКонстант.ИсточникДанныхАдресногоКлассификатора" - Или РеквизитПутьКДанным = "") Тогда - - Элементы.ГруппаАдресныйКлассификаторКоманды.Доступность = ПустаяСтрока(НаборКонстант.ИсточникДанныхАдресногоКлассификатора); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьНастройкиРезервногоКопирования() - - Если (РежимРаботы.Локальный Или РежимРаботы.Автономный) И РежимРаботы.ЭтоАдминистраторСистемы Тогда - МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); - Элементы.НастройкаРезервногоКопированияИБ.РасширеннаяПодсказка.Заголовок = МодульРезервноеКопированиеИБСервер.ТекущаяНастройкаРезервногоКопирования(); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного) - Фильтр = Новый Структура("Метаданные", ИмяПредопределенного); - Найденные = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); - Задание = ?(Найденные.Количество() = 0, Неопределено, Найденные[0]); - Если ТипЗнч(Задание) = Тип("СтрокаТаблицыЗначений") Тогда - Задание.Владелец().Колонки.Идентификатор.Имя = "УникальныйИдентификатор"; - КонецЕсли; - Возврат Задание; -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме) - Состояние = ?(ВключитьЦентрМониторинга, "1", "0") + ?(ЦентрОбработкиИнформацииОПрограмме, "1", "0"); - - Если Состояние = "00" Тогда - Результат = 2; - ИначеЕсли Состояние = "01" Тогда - Результат = 1; - ИначеЕсли Состояние = "10" Тогда - Результат = 0; - ИначеЕсли Состояние = "11" Тогда - // А такого быть не может... - КонецЕсли; - - Возврат Результат; -КонецФункции - -&НаКлиенте -Функция ПолучитьАдресСервиса() - - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); - - ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); - - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыСервиса = Неопределено; - КонецЕсли; - - Если ПараметрыСервиса <> Неопределено Тогда - Если ПараметрыСервиса.Порт = 80 Тогда - Схема = "http://"; - Порт = ""; - ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда - Схема = "https://"; - Порт = ""; - Иначе - Схема = "http://"; - Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); - КонецЕсли; - - АдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; - Иначе - АдресСервиса = ""; - КонецЕсли; - - Возврат АдресСервиса; -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьПараметрыЦентраМониторинга() - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - ПараметрыЦентраМониторинга = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторингаВнешнийВызов(); - - ПараметрыСервисаПоУмолчанию = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыПоУмолчаниюВнешнийВызов(); - ПараметрыЦентраМониторинга.Вставить("СерверПоУмолчанию", ПараметрыСервисаПоУмолчанию.Сервер); - ПараметрыЦентраМониторинга.Вставить("АдресРесурсаПоУмолчанию", ПараметрыСервисаПоУмолчанию.АдресРесурса); - ПараметрыЦентраМониторинга.Вставить("ПортПоУмолчанию", ПараметрыСервисаПоУмолчанию.Порт); - - Возврат ПараметрыЦентраМониторинга; -КонецФункции - -&НаСервереБезКонтекста -Процедура РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторинга) - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); - - ВключитьЦентрМониторинга = ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга; - ЦентрОбработкиИнформацииОПрограмме = ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме; - - Результат = ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме); - - Если Результат = 0 Тогда - РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); - МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); - ИначеЕсли Результат = 1 Тогда - РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); - МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); - ИначеЕсли Результат = 2 Тогда - МодульЦентрМониторингаСлужебный.УдалитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики"); - КонецЕсли; -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса) - ПараметрыЦентраМониторинга = Новый Структура(); - ПараметрыЦентраМониторинга.Вставить("Сервер", СтруктураАдреса.Хост); - ПараметрыЦентраМониторинга.Вставить("АдресРесурса", СтруктураАдреса.ПутьНаСервере); - ПараметрыЦентраМониторинга.Вставить("Порт", СтруктураАдреса.Порт); - ПараметрыЦентраМониторинга.Вставить("ЗащищенноеСоединение", СтруктураАдреса.ЗащищенноеСоединение); - - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); -КонецПроцедуры - -&НаСервере -Процедура РазблокироватьРаботуСВнешнимиРесурсамиНаСервере() - Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; - МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); - МодульРегламентныеЗаданияСлужебный.РазрешитьРаботуСВнешнимиРесурсами(); -КонецПроцедуры - -#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив - -&НаКлиенте -Процедура ПроверитьСостояниеОблачногоАрхива() - - #Если НЕ ВебКлиент Тогда - - ТипСтруктура = Тип("Структура"); - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив") Тогда - ЭтотОбъект.ПараметрыОблачногоАрхива.ТекущийСчетчикПроверкиФоновогоЗадания = ЭтотОбъект.ПараметрыОблачногоАрхива.ТекущийСчетчикПроверкиФоновогоЗадания + 1; - Если ЭтотОбъект.ПараметрыОблачногоАрхива.ТекущийСчетчикПроверкиФоновогоЗадания > 12 Тогда // Прошла 2 минуты - прервать - // Завершить фоновое задание и отключить обработчики ожидания - ЗавершитьФоновоеЗаданиеОблачногоАрхиваНаСервере(ЭтотОбъект.ПараметрыОблачногоАрхива.ИдентификаторФоновогоЗадания); - ОтключитьОбработчикОжидания("ПроверитьСостояниеОблачногоАрхива"); - ТекстСообщения = НСтр("ru='Произошли ошибки при подключении к подсистеме Облачный архив: - |Сбор данных превысил допустимое время.'"); - ЭтотОбъект.ПараметрыОблачногоАрхива.Вставить("ОшибкиПодключения", ТекстСообщения); - Элементы.ДекорацияОблачныйАрхивОшибки.Заголовок = ЭтотОбъект.ПараметрыОблачногоАрхива.ОшибкиПодключения; - Элементы.СтраницыСостоянийОблачныйАрхив.ТекущаяСтраница = Элементы.СтраницаОблачныйАрхивОшибки; - Иначе - Если ЭтотОбъект.ПараметрыОблачногоАрхива.ИдентификаторФоновогоЗадания <> Неопределено Тогда - Прогресс = ПроверитьСостояниеОблачногоАрхиваНаСервере(ЭтотОбъект.ПараметрыОблачногоАрхива.ИдентификаторФоновогоЗадания); - // Ключи переменной Прогресс: - // * Процент; - // * Текст; - // * ДополнительныеПараметры - Структура с ключами: - // ** КодСостояния - Число (код ошибки) или Строка ("Завершено без ошибок", "Завершено с ошибками"); - // ** ОписаниеРезультата - Неопределено (если "Завершено без ошибок") или текст ошибки; - Если ТипЗнч(Прогресс) = ТипСтруктура Тогда - Если Прогресс.Свойство("Процент") И Прогресс.Свойство("Текст") Тогда - ЭтотОбъект.ПрогрессПроверкиОблачногоАрхива = Прогресс.Процент; - Элементы.ДекорацияПрогрессПроверкиОблачногоАрхиваОписание.Заголовок = Прогресс.Текст; - КонецЕсли; - Если Прогресс.Свойство("ДополнительныеПараметры") - И (ТипЗнч(Прогресс.ДополнительныеПараметры) = ТипСтруктура) Тогда - Если Прогресс.ДополнительныеПараметры.Свойство("КодСостояния") Тогда - Если Прогресс.ДополнительныеПараметры.КодСостояния = "Завершено без ошибок" Тогда // Идентификатор. - МодульОблачныйАрхивВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивВызовСервера"); - ПараметрыОкруженияСервер = МодульОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("ПараметрыОкруженияСервер"); - ИнформацияОКлиенте = МодульОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("ИнформацияОКлиенте", ИмяКомпьютера()); - АктивацииАгентовКопирования = МодульОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("АктивацииАгентовКопирования", ИмяКомпьютера()); - МодульОблачныйАрхивКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхивКлиент"); - МодульОблачныйАрхивКлиент.ПанельАдминистрированияБСП_ПереключитьНаПравильнуюСтраницу( - ЭтотОбъект, - Новый Структура("ПараметрыОкруженияСервер, ИнформацияОКлиенте, АктивацииАгентовКопирования", - ПараметрыОкруженияСервер, - ИнформацияОКлиенте, - АктивацииАгентовКопирования)); - ИначеЕсли Прогресс.ДополнительныеПараметры.КодСостояния = "Завершено с ошибками" Тогда // Идентификатор. - Элементы.ДекорацияОблачныйАрхивОшибки.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Произошли ошибки при подключении к подсистеме Облачный архив: - |%1'"), - Прогресс.ДополнительныеПараметры.ОписаниеРезультата); - Элементы.СтраницыСостоянийОблачныйАрхив.ТекущаяСтраница = Элементы.СтраницаОблачныйАрхивОшибки; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - ПодключитьОбработчикОжидания("ПроверитьСостояниеОблачногоАрхива", 10, Истина); - КонецЕсли; - КонецЕсли; - - #КонецЕсли - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ПроверитьСостояниеОблачногоАрхиваНаСервере(ИдентификаторФоновогоЗадания) - - Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторФоновогоЗадания); - -КонецФункции - -// Завершает фоновое задание по его идентификатору. -// -// Параметры: -// Нет. -// -&НаСервереБезКонтекста -Процедура ЗавершитьФоновоеЗаданиеОблачногоАрхиваНаСервере(ИдентификаторФоновогоЗадания) - - ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторФоновогоЗадания); - Если ФоновоеЗадание <> Неопределено Тогда - ФоновоеЗадание.Отменить(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form index 9245be0b5..9426a5dc0 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form @@ -1,5 +1,5 @@ - + ГруппаЗаголовок 2001 @@ -8,7 +8,7 @@ 1567 <key>ru</key> - <value>Настройка синхронизации данных с другими программами и организация совместной работы в распределенной информационной базе.</value> + <value>Синхронизация данных с другими программами и организация совместной работы в распределенной информационной базе.</value> true true @@ -71,6 +71,10 @@ true + + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 2016 @@ -91,6 +95,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 2013 @@ -111,7 +119,7 @@ - ГруппаОсновныеНастройки + Группа4 1217 ГруппаИспользоватьСинхронизациюДанных @@ -169,7 +177,7 @@ <key>ru</key> - <value>Группа использовать синхронизацию данных</value> + <value>Использовать синхронизацию данных</value> 43 false @@ -219,7 +227,7 @@
        Hyperlink - Form.Command.НастройкиСинхронизацииДанных + CommonCommand.НастройкиСинхронизацииДанных Normal Auto true @@ -235,7 +243,7 @@ <key>ru</key> - <value>Группа настройки синхронизации данных</value> + <value>Настройки синхронизации данных</value> 43 false @@ -264,12 +272,8 @@ true - - <key>ru</key> - <value>Группа основные настройки</value> - - ГруппаОсновныеНастройкиРасширеннаяПодсказка + Группа4ExtendedTooltip 2018 Label true @@ -348,7 +352,7 @@ <key>ru</key> - <value>Группа даты запрета загрузки использование</value> + <value>Даты запрета загрузки использование</value> 43 false @@ -413,7 +417,7 @@ <key>ru</key> - <value>Группа даты запрета загрузки настройка</value> + <value>Даты запрета загрузки настройка</value> 43 false @@ -444,7 +448,7 @@ <key>ru</key> - <value>Группа даты запрета загрузки</value> + <value>Даты запрета загрузки</value> ГруппаДатыЗапретаЗагрузкиРасширеннаяПодсказка @@ -468,7 +472,7 @@
        - ГруппаРезультатов + Группа5 2000 ГруппаРезультатовСинхронизацииДанных @@ -511,7 +515,7 @@ <key>ru</key> - <value>Группа результатов синхронизации данных</value> + <value>Результатов синхронизации данных</value> 43 false @@ -558,6 +562,7 @@ Загрузка данных, представленных в формате EnterpriseData. Label + true true Left @@ -609,12 +614,8 @@ true - - <key>ru</key> - <value>Группа результатов</value> - - ГруппаРезультатовРасширеннаяПодсказка + Группа5ExtendedTooltip 2025 Label true @@ -685,6 +686,43 @@ Normal + + ДекорацияОжиданиеИзмененияПрефикса + 2073 + + <key>ru</key> + <value>Декорация ожидание изменения префикса</value> + + true + true + + true + + + ДекорацияОжиданиеИзмененияПрефиксаРасширеннаяПодсказка + 2075 + Label + true + true + + Left + + + + ДекорацияОжиданиеИзмененияПрефиксаКонтекстноеМеню + 2074 + true + + 2 + true + 1 + true + + + CommonPicture.НезавершившаясяПроверка + + + true true @@ -692,17 +730,15 @@ <key>ru</key> - <value>Группа префикс узла распределенной информационной базы</value> + <value>Префикс узла распределенной информационной базы</value> ShowBottom + 43 ГруппаПрефиксУзлаРаспределеннойИнформационнойБазыExtendedTooltip 2033 - - <key>ru</key> - <value>Префикс добавляется автоматически к кодам элементов справочников и номерам документов для того, чтобы различать программы, в которых они были введены, и избежать дублирования данных.</value> - Label + 43 true Left @@ -710,7 +746,6 @@ UsualGroup - Vertical Auto true true @@ -989,43 +1024,6 @@
        true
        - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 15 - - - true - - - true - - - - НастройкиСинхронизацииДанных - - <key>ru</key> - <value>Настройки синхронизации данных</value> - - 1 - - ru - Настройки синхронизации данных - - - true - - - - НастройкиСинхронизацииДанных - - - DontUse - Auto - diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html index e53e8a93e..2ada9eae7 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html @@ -1,18 +1,22 @@ - -

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

        +

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

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

        Каталог временных файлов кластера серверов 1С:Предприятие

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

        • Путь к единому сетевому каталогу для общих временных файлов серверов 1С:Предприятие, работающих в одном кластере:
          • Под управлением ОС Windows - укажите путь к единому каталогу временных файлов всех серверов кластера, который будет использоваться для серверов, работающих под управлением ОС Windows.
          • Под управлением ОС Linux - укажите путь к единому каталогу временных файлов всех серверов кластера, который будет использоваться для серверов, работающих под управлением ОС Linux.
        • Каталоги временных файлов можно не заполнять, когда в кластере 1С:Предприятия работает только один сервер или программа работает в файловом режиме. diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Module.bsl index 03e9273de..d2930216a 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Module.bsl @@ -13,14 +13,15 @@ Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - // Настройки видимости при запуске. - Элементы.ГруппаВременныеКаталогиКластераСерверов.Видимость = РежимРаботы.КлиентСерверный И РежимРаботы.ЭтоАдминистраторСистемы; + Элементы.ГруппаВременныеКаталогиКластераСерверов.Видимость = + Не ОбщегоНазначения.ИнформационнаяБазаФайловая() + И Пользователи.ЭтоПолноправныйПользователь(, Истина); - Если РежимРаботы.МодельСервиса Тогда + Элементы.ГруппаПрефиксУзлаРаспределеннойИнформационнойБазы.РасширеннаяПодсказка.Заголовок = + Метаданные.Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Подсказка; + + Если ОбщегоНазначения.РазделениеВключено() Тогда Элементы.ОписаниеРаздела.Заголовок = НСтр("ru = 'Синхронизация данных с моими приложениями.'"); Элементы.ИспользоватьДатыЗапретаЗагрузки.РасширеннаяПодсказка.Заголовок = @@ -53,9 +54,13 @@ Элементы.ГруппаДатыЗапретаЗагрузки.Видимость = Ложь; КонецЕсли; + Элементы.ДекорацияОжиданиеИзмененияПрефикса.Видимость = Ложь; + // Обновление состояния элементов. УстановитьДоступность(); + НастройкиПрограммыПереопределяемый.СинхронизацияДанныхПриСозданииНаСервере(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -86,9 +91,76 @@ &НаКлиенте Процедура ПрефиксУзлаРаспределеннойИнформационнойБазыПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); + + ФоновоеЗадание = ЗапуститьИзменениеПрефиксаИБВФоновомЗадании(); + + Если ФоновоеЗадание <> Неопределено + И ФоновоеЗадание.Статус = "Выполняется" Тогда + + Элементы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Доступность = Ложь; + Элементы.ДекорацияОжиданиеИзмененияПрефикса.Видимость = Истина; + + КонецЕсли; + + НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + НастройкиОжидания.ВыводитьОкноОжидания = Ложь;; + + Обработчик = Новый ОписаниеОповещения("ПослеИзмененияПрефикса", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания); + КонецПроцедуры +&НаСервере +Функция ЗапуститьИзменениеПрефиксаИБВФоновомЗадании() + + ПараметрыПроцедуры = Новый Структура("НовыйПрефиксИБ, ПродолжитьНумерацию", + НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы, Истина); + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Изменение префикса'"); + ПараметрыВыполнения.ОжидатьЗавершение = 0; + + Возврат ДлительныеОперации.ВыполнитьВФоне("ПрефиксацияОбъектовСлужебный.ИзменитьПрефиксИБ", ПараметрыПроцедуры, ПараметрыВыполнения); + +КонецФункции + +&НаКлиенте +Процедура ПослеИзмененияПрефикса(ФоновоеЗадание, ДополнительныеПараметры) Экспорт + + Если Не Элементы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Доступность Тогда + Элементы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Доступность = Истина; + КонецЕсли; + Если Элементы.ДекорацияОжиданиеИзмененияПрефикса.Видимость Тогда + Элементы.ДекорацияОжиданиеИзмененияПрефикса.Видимость = Ложь; + КонецЕсли; + + Если ФоновоеЗадание <> Неопределено + И ФоновоеЗадание.Статус = "Выполнено" Тогда + + ПоказатьОповещениеПользователя(НСтр("ru = 'Префикс изменен.'")); + + Иначе + + НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы = ПрефиксЗачитанныйИзИнформационнойБазы(); + Элементы.ПрефиксУзлаРаспределеннойИнформационнойБазы.ОбновитьТекстРедактирования(); + + Если ФоновоеЗадание <> Неопределено Тогда + ТекстОшибки = НСтр("ru='Не удалось изменить префикс. + |См. подробности в журнале регистрации.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПрефиксЗачитанныйИзИнформационнойБазы() + + Возврат Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить(); + +КонецФункции + &НаКлиенте Процедура КаталогСообщенийОбменаДаннымиДляWindowsПриИзменении(Элемент) @@ -124,18 +196,6 @@ -КонецПроцедуры - -&НаКлиенте -Процедура НастройкиСинхронизацииДанных(Команда) - - Если РежимРаботы.МодельСервиса Тогда - ИмяОткрываемойФормы = "ОбщаяФорма.СинхронизацияДанныхВМоделиСервиса"; - Иначе - ИмяОткрываемойФормы = "ОбщаяФорма.СинхронизацияДанных"; - КонецЕсли; - ОткрытьФорму(ИмяОткрываемойФормы); - КонецПроцедуры #КонецОбласти @@ -177,16 +237,21 @@ Процедура ОбновитьРазрешенияПрофилейБезопасности(Элемент) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ОбновитьРазрешенияПрофилейБезопасностиЗавершение", ЭтотОбъект, Элемент); - - МассивЗапросов = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Элемент.Имя); - - Если МассивЗапросов = Неопределено Тогда - Возврат; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + + МассивЗапросов = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Элемент.Имя); + + Если МассивЗапросов = Неопределено Тогда + Возврат; + КонецЕсли; + + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( + МассивЗапросов, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); КонецЕсли; - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов( - МассивЗапросов, ЭтотОбъект, ОповещениеОЗакрытии); - КонецПроцедуры &НаСервере @@ -214,15 +279,16 @@ МенеджерЗначения = КонстантаМенеджер.СоздатьМенеджерЗначения(); ИдентификаторКонстанты = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МенеджерЗначения.Метаданные()); + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); Если ПустаяСтрока(КонстантаЗначение) Тогда - Запрос = РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(ИдентификаторКонстанты); + Запрос = МодульРаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(ИдентификаторКонстанты); Иначе Разрешения = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве( - РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(КонстантаЗначение, Истина, Истина)); - Запрос = РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ИдентификаторКонстанты); + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(КонстантаЗначение, Истина, Истина)); + Запрос = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ИдентификаторКонстанты); КонецЕсли; @@ -312,7 +378,6 @@ Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСинхронизациюДанных" Или РеквизитПутьКДанным = "") И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - Элементы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Доступность = НаборКонстант.ИспользоватьСинхронизациюДанных; Элементы.НастройкиСинхронизацииДанных.Доступность = НаборКонстант.ИспользоватьСинхронизациюДанных; Элементы.ГруппаДатыЗапретаЗагрузки.Доступность = НаборКонстант.ИспользоватьСинхронизациюДанных; Элементы.РезультатыСинхронизацииДанных.Доступность = НаборКонстант.ИспользоватьСинхронизациюДанных; diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form index ff1250d0f..68af33fcb 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form @@ -70,6 +70,10 @@ true + + <key>ru</key> + <value>Справка</value> + ГруппаСправкаExtendedTooltip 143 @@ -90,6 +94,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ГруппаЗаголовокExtendedTooltip 135 @@ -148,7 +156,7 @@ <key>ru</key> - <value>Группа использовать полнотекстовый поиск</value> + <value>Использовать полнотекстовый поиск</value> ГруппаИспользоватьПолнотекстовыйПоискРасширеннаяПодсказка @@ -335,6 +343,10 @@ true + + <key>ru</key> + <value>Кнопки 1</value> + ГруппаКнопки1ExtendedTooltip 120 @@ -524,12 +536,8 @@ <key>ru</key> - <value>Группа максимальный размер индексируемых данных значение</value> + <value>Максимальный размер индексируемых данных значение</value> - - ru - Группа максимальный размер индексируемых данных значение - ГруппаМаксимальныйРазмерИндексируемыхДанныхЗначениеРасширеннаяПодсказка 196 @@ -592,12 +600,8 @@ <key>ru</key> - <value>Группа максимальный размер индексируемых данных</value> + <value>Максимальный размер индексируемых данных</value> - - ru - Группа максимальный размер индексируемых данных - ГруппаМаксимальныйРазмерИндексируемыхДанныхРасширеннаяПодсказка 194 @@ -783,12 +787,8 @@ <key>ru</key> - <value>Группа колонки</value> + <value>Колонки</value> - - ru - Группа колонки - ГруппаКолонкиРасширеннаяПодсказка 158 @@ -1107,21 +1107,6 @@ true - - РежимРаботы - - <key>ru</key> - <value>Режим работы</value> - - 2 - - - true - - - true - - ИспользоватьПолнотекстовыйПоиск diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Help/ru.html index ddeb571e6..1f88382e3 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Help/ru.html @@ -6,7 +6,7 @@ TD { } </style><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> <p>Предназначена для включения и отключения полнотекстового поиска, обновления индекса полнотекстового поиска, а также настройки извлечения текстов из файлов для использования при поиске.</p> -<p>Открывается по команде <strong>Управление полнотекстовым поиском</strong> раздела <strong>Администрирование </strong>- <a href="DataProcessor.ПанельАдминистрированияБСП.Form.ПоддержкаИОбслуживание/Help">Поддержка и обслуживание</a> - <strong>Регламентные операции</strong>.</p><a name="СтандартныеПодсистемы.ПолнотекстовыйПоиск"> +<p>Открывается по команде <strong>Управление полнотекстовым поиском</strong> раздела <strong>Администрирование - Общие настройки - Полнотекстовый поиск</strong>.</p><a name="СтандартныеПодсистемы.ПолнотекстовыйПоиск"> <p>Программа позволяет производить <a href="DataProcessor.ПолнотекстовыйПоискВДанных/Help">полнотекстовый поиск</a> в любых справочниках, документах и других объектах, отыскивая заданную строку во всех полях объектов. При наличии присоединенных файлов, содержащих текстовую информацию, поиск осуществляется также и по ним. Полнотекстовый поиск используется при поиске данных в программе по содержимому справочников, документов и других объектов программы. </p> <p>Также полнотекстовый поиск предоставляет такие возможности как: поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ); поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами); нечеткий поиск (буквы в найденных словах могут отличаться).</p> <p>Для начала работы с полнотекстовым поиском необходимо включить флажок <strong>Полнотекстовый поиск данных</strong>. В этом случае становятся доступными команды, которые позволяют настроить полнотекстовый поиск данных в программе, управлять индексом полнотекстового поиска, обновлять и очищать его.  По умолчанию флажок включен.</p> diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl index a5a50c115..a56506246 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl @@ -13,18 +13,18 @@ Возврат; КонецЕсли; - // Значения реквизитов формы - РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); - РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы); - // Значения реквизитов формы ИзвлекатьТекстыФайловНаСервере = НаборКонстант.ИзвлекатьТекстыФайловНаСервере; // Настройки видимости при запуске. - Элементы.ГруппаАвтоматическоеИзвлечениеТекстов.Видимость = РежимРаботы.ЭтоАдминистраторСистемы И Не РежимРаботы.МодельСервиса; + Элементы.ГруппаАвтоматическоеИзвлечениеТекстов.Видимость = + Пользователи.ЭтоПолноправныйПользователь(, Истина) + И Не ОбщегоНазначения.РазделениеВключено(); - Если РежимРаботы.ЭтоАдминистраторПрограммы И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - Если РежимРаботы.Файловый Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") + И Пользователи.ЭтоПолноправныйПользователь() Тогда + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда СписокВыбора = Элементы.ИзвлекатьТекстыФайловНаСервереWindows.СписокВыбора; СписокВыбора[0].Представление = НСтр("ru = 'Все рабочие станции работают под управлением ОС Windows'"); @@ -90,32 +90,18 @@ &НаКлиенте Процедура ОбновитьИндекс(Команда) - Состояние( - НСтр("ru = 'Идет обновление полнотекстового индекса... - |Пожалуйста, подождите.'")); - ОбновитьИндексСервер(); - - Состояние(НСтр("ru = 'Обновление полнотекстового индекса завершено.'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс успешно обновлен'")); КонецПроцедуры &НаКлиенте Процедура ОчиститьИндекс(Команда) - Состояние( - НСтр("ru = 'Идет очистка полнотекстового индекса... - |Пожалуйста, подождите.'")); - ОчиститьИндексСервер(); - - Состояние(НСтр("ru = 'Очистка полнотекстового индекса завершена.'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс успешно очищен'")); КонецПроцедуры &НаКлиенте Процедура ПроверитьИндекс(Команда) - Состояние( - НСтр("ru = 'Идет проверка полнотекстового индекса... - |Пожалуйста, подождите.'")); - Попытка ПроверитьИндексСервер(); Исключение @@ -124,7 +110,7 @@ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке); КонецПопытки; - Состояние(НСтр("ru = 'Проверка полнотекстового индекса завершена.'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс содержит корректные данные'")); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Help/ru.html index 122e3447a..70d5a2b1f 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Help/ru.html @@ -3,7 +3,7 @@ <p>Для эффективной работы программы ее необходимо правильно настроить.</p> <p>При необходимости, часто используемые настройки можно вынести в командный интерфейс раздела <strong>Администрирование</strong> в настройках панели навигации или панели действий, в зависимости от типа настройки.</p> <h3>См. также: </h3> -<li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.ПоддержкаИОбслуживание/Help">Поддержка и обслуживание</a> - в данном подразделе администратору предоставляются возможности по поддержанию программы в работоспособном состоянии; +<li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.Обслуживание/Help">Поддержка и обслуживание</a> - в данном подразделе администратору предоставляются возможности по поддержанию программы в работоспособном состоянии; </li><li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.ОбщиеНастройки/Help">Общие настройки</a> - в данном подразделе производятся основные настройки программы; </li><li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.НастройкиПользователейИПрав/Help">Настройки пользователей и прав</a> - в данном подразделе предусмотрены команды, связанные с управлением доступом и настройкой прав пользователей; </li><li><a href="DataProcessor.ПанельАдминистрированияБСП.Form.Органайзер/Help">Органайзер</a> - в данном подразделе предусмотрены команды настройки электронной почты, заметок, напоминаний и бизнес-процессов; diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ManagerModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ManagerModule.bsl index 4b565feee..8bf3cb87c 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ManagerModule.bsl @@ -3,14 +3,9 @@ #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// -// Обработчики служебных событий базовой функциональности. +// Обработчики событий подсистем конфигурации. -// Заполняет переименования тех объектов метаданных, которые невозможно -// автоматически найти по типу, но ссылки на которые требуется сохранять -// в базе данных (например: подсистемы, роли). -// -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт Библиотека = "СтандартныеПодсистемы"; @@ -23,9 +18,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов. - // Определяет разделы, в которых доступна панель отчетов. // Подробнее - см. описание процедуры ИспользуемыеРазделы // общего модуля ВариантыОтчетов. @@ -36,20 +28,14 @@ КонецПроцедуры -// Определяет разделы, в которых доступна команда вызова дополнительных отчетов. -// Подробнее - см. описание функции РазделыДополнительныхОтчетов -// общего модуля ДополнительныеОтчетыИОбработки. -// +// См. ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами. Процедура ПриОпределенииРазделовСДополнительнымиОтчетами(Разделы) Экспорт Разделы.Добавить(Метаданные.Подсистемы.Администрирование); КонецПроцедуры -// Определяет разделы, в которых доступна команда вызова дополнительных обработок. -// Подробнее - см. описание функции РазделыДополнительныхОбработок -// общего модуля ДополнительныеОтчетыИОбработки. -// +// См. ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками. Процедура ПриОпределенииРазделовСДополнительнымиОбработками(Разделы) Экспорт Разделы.Добавить(Метаданные.Подсистемы.Администрирование); diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo index d805ed12f..8391e0e88 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo @@ -16,25 +16,11 @@ <lang>ru</lang> </pages> </help> - <forms uuid="7cfa5a37-b9f8-43e4-ae33-e3a7251dd052"> - <name>ПоддержкаИОбслуживание</name> + <forms uuid="aa6444a8-6c17-4207-a623-9b734e08e30e"> + <name>ИнтернетПоддержкаИСервисы</name> <synonym> <key>ru</key> - <value>Поддержка и обслуживание</value> - </synonym> - <help> - <pages> - <lang>ru</lang> - </pages> - </help> - <usePurposes>PersonalComputer</usePurposes> - <usePurposes>MobileDevice</usePurposes> - </forms> - <forms uuid="2f8a5b9d-ab86-492b-85d1-5a28535b2ebc"> - <name>ОбщиеНастройки</name> - <synonym> - <key>ru</key> - <value>Общие настройки</value> + <value>Интернет-поддержка и сервисы</value> </synonym> <help> <pages> @@ -58,34 +44,6 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> - <forms uuid="737f6f1b-9ffc-4916-b378-7321eab1f886"> - <name>Органайзер</name> - <synonym> - <key>ru</key> - <value>Органайзер</value> - </synonym> - <help> - <pages> - <lang>ru</lang> - </pages> - </help> - <usePurposes>PersonalComputer</usePurposes> - <usePurposes>MobileDevice</usePurposes> - </forms> - <forms uuid="01dedf5b-2cce-4d24-81ea-2e3af82f5794"> - <name>СинхронизацияДанных</name> - <synonym> - <key>ru</key> - <value>Синхронизация данных</value> - </synonym> - <help> - <pages> - <lang>ru</lang> - </pages> - </help> - <usePurposes>PersonalComputer</usePurposes> - <usePurposes>MobileDevice</usePurposes> - </forms> <forms uuid="385e209d-65aa-43b1-8591-f92544882740"> <name>НастройкиРаботыСФайлами</name> <synonym> @@ -100,6 +58,48 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="7cfa5a37-b9f8-43e4-ae33-e3a7251dd052"> + <name>Обслуживание</name> + <synonym> + <key>ru</key> + <value>Обслуживание</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="2f8a5b9d-ab86-492b-85d1-5a28535b2ebc"> + <name>ОбщиеНастройки</name> + <synonym> + <key>ru</key> + <value>Общие настройки</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="737f6f1b-9ffc-4916-b378-7321eab1f886"> + <name>Органайзер</name> + <synonym> + <key>ru</key> + <value>Органайзер</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <forms uuid="8381bc76-0e0f-4196-9911-ec05730cb1c9"> <name>ПечатныеФормыОтчетыИОбработки</name> <synonym> @@ -114,6 +114,20 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="01dedf5b-2cce-4d24-81ea-2e3af82f5794"> + <name>СинхронизацияДанных</name> + <synonym> + <key>ru</key> + <value>Синхронизация данных</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <forms uuid="c224e520-7204-4f4a-aac9-b6221ea9ce44"> <name>УправлениеПолнотекстовымПоискомИИзвлечениемТекстов</name> <synonym> @@ -138,10 +152,10 @@ <usePurposes>MobileDevice</usePurposes> </forms> <commands uuid="f81b1f2d-6fde-4861-8fee-1dbe6acf3985"> - <name>ПоддержкаИОбслуживание</name> + <name>Обслуживание</name> <synonym> <key>ru</key> - <value>Поддержка и обслуживание</value> + <value>Обслуживание</value> </synonym> <group>NavigationPanelImportant</group> <representation>Auto</representation> @@ -199,7 +213,7 @@ <representation>Auto</representation> <toolTip> <key>ru</key> - <value>Настройка синхронизации данных с другими программами + <value>Синхронизация данных с другими программами и организация совместной работы в распределенной информационной базе.</value> </toolTip> </commands> @@ -229,4 +243,26 @@ <value>Настройка печатных форм, вариантов отчетов, рассылок отчетов, дополнительных отчетов и обработок.</value> </toolTip> </commands> + <commands uuid="acd30e63-68dc-4ab2-a6fe-16eb69d09271"> + <name>ИнтернетПоддержкаИСервисы</name> + <synonym> + <key>ru</key> + <value>Интернет-поддержка и сервисы</value> + </synonym> + <group>NavigationPanelOrdinary</group> + <representation>Auto</representation> + <toolTip> + <key>ru</key> + <value>Интернет-сервисы и поддержка. Обновление версии программы. Загрузка классификаторов.</value> + </toolTip> + </commands> + <commands uuid="7b15bfe8-c4a9-4de8-8386-0d17268380d0"> + <name>УправлениеПолнотекстовымПоиском</name> + <synonym> + <key>ru</key> + <value>Управление полнотекстовым поиском</value> + </synonym> + <group>NavigationPanelSeeAlso</group> + <representation>Auto</representation> + </commands> </mdclass:DataProcessor> diff --git a/SSL/src/DataProcessors/ПереносФайловВТома/Commands/ПереносФайловВТома/CommandModule.bsl b/SSL/src/DataProcessors/ПереносФайловВТома/Commands/ПереносФайловВТома/CommandModule.bsl index 1aba8ea38..642603262 100644 --- a/SSL/src/DataProcessors/ПереносФайловВТома/Commands/ПереносФайловВТома/CommandModule.bsl +++ b/SSL/src/DataProcessors/ПереносФайловВТома/Commands/ПереносФайловВТома/CommandModule.bsl @@ -3,7 +3,10 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("Обработка.ПереносФайловВТома.Форма", Новый Структура, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + ОткрытьФорму("Обработка.ПереносФайловВТома.Форма", + Новый Структура, ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Form.form index 8f1180c06..6f8b87a8b 100644 --- a/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Form.form @@ -86,12 +86,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа комментарий</value> + <value>Комментарий</value> - - ru - Группа комментарий - ГруппаКомментарийExtendedTooltip 21 @@ -243,12 +239,8 @@ <key>ru</key> - <value>Группа размер</value> + <value>Размер</value> - - ru - Группа размер - ГруппаРазмерExtendedTooltip 18 diff --git a/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Module.bsl index 471cf3296..fd7be7130 100644 --- a/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПереносФайловВТома/Forms/Форма/Module.bsl @@ -18,11 +18,11 @@ ДополнительныеПараметры.Вставить( "ПриОткрытииХранитьФайлыВТомахНаДиске", - ФайловыеФункцииСлужебный.ХранениеФайловВТомахНаДиске()); + РаботаСФайламиСлужебный.ХранениеФайловВТомахНаДиске()); ДополнительныеПараметры.Вставить( "ПриОткрытииЕстьТомаХраненияФайлов", - ФайловыеФункции.ЕстьТомаХраненияФайлов()); + РаботаСФайлами.ЕстьТомаХраненияФайлов()); КонецПроцедуры @@ -84,8 +84,6 @@ Возврат; КонецЕсли; - Состояние(НСтр("ru = 'Выполняется получение списка файлов...'")); - МассивВерсий = ВерсииВБазе(); НомерЦикла = 1; ЧислоПеренесенных = 0; @@ -103,8 +101,6 @@ Прогресс = Окр(НомерЦикла * 100 / ЧислоВерсийВБазе, 2); КонецЕсли; - Состояние(НСтр("ru = 'Выполняется перенос файла в том...'"), Прогресс, ВерсияСтруктура.Текст, БиблиотекаКартинок.УстановитьВремя); - ПакетВерсий.Добавить(ВерсияСтруктура); Если ПакетВерсий.Количество() >= ЧислоВерсийВПакете Тогда @@ -176,18 +172,33 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | ЕСТЬNULL(СУММА(ВерсииФайлов.Размер), 0) КАК Размер - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.ТипХраненияФайла = &ТипХраненияФайла"; - Запрос.УстановитьПараметр("ТипХраненияФайла", Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе); + "ВЫБРАТЬ + | ЕСТЬNULL(СУММА(ВерсииФайлов.Размер), 0) КАК Размер + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.ТипХраненияФайла = Значение(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе)"; + + Для Каждого ТипСправочника Из Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы() Цикл + ПолноеИмяСправочника = Метаданные.НайтиПоТипу(ТипСправочника).ПолноеИмя(); + Если ПолноеИмяСправочника <> "Справочник.Файлы" И ПолноеИмяСправочника <> "Справочник.ВерсииФайлов" Тогда + Запрос.Текст = Запрос.Текст + + " + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ЕСТЬNULL(СУММА(ВерсииФайлов.Размер), 0) КАК Размер + |ИЗ + | " + ПолноеИмяСправочника + " КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе)"; + КонецЕсли; + КонецЦикла; Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат 0; - КонецЕсли; + КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); @@ -205,15 +216,13 @@ "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Количество |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.ТипХраненияФайла = &ТипХраненияФайла"; + | РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов"; Запрос.УстановитьПараметр("ТипХраненияФайла", Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат 0; - КонецЕсли; + КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); @@ -232,13 +241,39 @@ Запрос.Текст = "ВЫБРАТЬ | ВерсииФайлов.Ссылка КАК Ссылка, - | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.Наименование КАК ПолноеНаименование, | ВерсииФайлов.Размер КАК Размер |ИЗ | Справочник.ВерсииФайлов КАК ВерсииФайлов |ГДЕ - | ВерсииФайлов.ТипХраненияФайла = &ТипХраненияФайла"; - Запрос.УстановитьПараметр("ТипХраненияФайла", Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе); + | ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе) + |; + |ВЫБРАТЬ + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВерсииФайлов.Наименование КАК ПолноеНаименование, + | ВерсииФайлов.Размер КАК Размер + |ИЗ + | Справочник.Файлы КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе)"; + + Для Каждого ТипСправочника Из Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы() Цикл + ПолноеИмяСправочника = Метаданные.НайтиПоТипу(ТипСправочника).ПолноеИмя(); + Если ПолноеИмяСправочника <> "Справочник.Файлы" И ПолноеИмяСправочника <> "Справочник.ВерсииФайлов" Тогда + Запрос.Текст = Запрос.Текст + + " + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВерсииФайлов.Наименование КАК ПолноеНаименование, + | ВерсииФайлов.Размер КАК Размер + |ИЗ + | " + ПолноеИмяСправочника + " КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе)"; + КонецЕсли; + КонецЦикла; Результат = Запрос.Выполнить(); ТаблицаВыгрузки = Результат.Выгрузить(); @@ -259,10 +294,10 @@ СвойстваХраненияФайлов = Новый Структура; СвойстваХраненияФайлов.Вставить( - "ТипХраненияФайлов", ФайловыеФункцииСлужебный.ТипХраненияФайлов()); + "ТипХраненияФайлов", РаботаСФайламиСлужебный.ТипХраненияФайлов()); СвойстваХраненияФайлов.Вставить( - "ЕстьТомаХраненияФайлов", ФайловыеФункции.ЕстьТомаХраненияФайлов()); + "ЕстьТомаХраненияФайлов", РаботаСФайлами.ЕстьТомаХраненияФайлов()); Возврат СвойстваХраненияФайлов; @@ -274,7 +309,7 @@ УстановитьПривилегированныйРежим(Истина); ЧислоОбработанных = 0; - МаксимальныйРазмерФайла = ФайловыеФункции.МаксимальныйРазмерФайла(); + МаксимальныйРазмерФайла = РаботаСФайлами.МаксимальныйРазмерФайла(); Для Каждого ВерсияСтруктура Из ПакетВерсий Цикл @@ -294,7 +329,11 @@ КодВозврата = Истина; ВерсияСсылка = ВерсияСтруктура.Ссылка; - ФайлСсылка = ВерсияСсылка.Владелец; + Если ТипЗнч(ВерсияСсылка) = Тип("СправочникСсылка.ВерсииФайлов") Тогда + ФайлСсылка = ВерсияСсылка.Владелец; + Иначе + ФайлСсылка = ВерсияСсылка; + КонецЕсли; Размер = ВерсияСтруктура.Размер; ИмяДляЖурнала = ""; @@ -346,12 +385,25 @@ Попытка + БлокировкаВерсии = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаВерсии.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ВерсияСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ВерсияСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаВерсии.Заблокировать(); + ВерсияОбъект = ВерсияСсылка.ПолучитьОбъект(); ХранилищеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ВерсияСсылка); - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ХранилищеФайла.Получить(), ВерсияОбъект.ДатаМодификацииУниверсальная, - ВерсияОбъект.ПолноеНаименование, ВерсияОбъект.Расширение, ВерсияОбъект.НомерВерсии, ФайлСсылка.Зашифрован, - // Чтобы все файлы не попали в одну папку за сегодняшний день - подставляем дату создания файла. - ВерсияОбъект.ДатаМодификацииУниверсальная); + Если ТипЗнч(ВерсияОбъект) = Тип("СправочникОбъект.ВерсииФайлов") Тогда + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ХранилищеФайла.Получить(), ВерсияОбъект.ДатаМодификацииУниверсальная, + ВерсияОбъект.ПолноеНаименование, ВерсияОбъект.Расширение, ВерсияОбъект.НомерВерсии, ФайлСсылка.Зашифрован, + // Чтобы все файлы не попали в одну папку за сегодняшний день - подставляем дату создания файла. + ВерсияОбъект.ДатаМодификацииУниверсальная); + Иначе + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ХранилищеФайла.Получить(), ВерсияОбъект.ДатаМодификацииУниверсальная, + ВерсияОбъект.Наименование, ВерсияОбъект.Расширение, , ФайлСсылка.Зашифрован, + // Чтобы все файлы не попали в одну папку за сегодняшний день - подставляем дату создания файла. + ВерсияОбъект.ДатаМодификацииУниверсальная); + КонецЕсли; ВерсияОбъект.Том = СведенияОФайле.Том; ВерсияОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; @@ -361,12 +413,18 @@ ВерсияОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); ВерсияОбъект.Записать(); + БлокировкаОбъекта = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаОбъекта.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + БлокировкаОбъекта.Заблокировать(); + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); // Чтобы прошла запись ранее подписанного объекта. ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); ФайлОбъект.Записать(); // Для переноса полей версии в файл. - РаботаСФайламиСлужебныйВызовСервера.УдалитьЗаписьИзРегистраХранимыеФайлыВерсий(ВерсияСсылка); + РаботаСФайламиСлужебныйВызовСервера.УдалитьЗаписьИзРегистраДвоичныеДанныеФайлов(ВерсияСсылка); ЗаписьЖурналаРегистрации( НСтр("ru = 'Файлы.Завершен перенос файла в том'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form index 33d026953..3a5400fe6 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form @@ -7,6 +7,10 @@ ОбластиПоискаДублей 1 + + <key>ru</key> + <value>Области поиска дублей</value> + true true @@ -176,9 +180,6 @@ ОбластиПоискаДублей.Picture - None - None - None true diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form index 1440c695f..fab0b06a6 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form @@ -47,10 +47,6 @@ StartChoice ОбластьПоискаДублейНачалоВыбора - - StartListChoice - ОбластьПоискаДублейНачалоВыбораИзСписка - Clearing ОбластьПоискаДублейОчистка @@ -168,10 +164,6 @@ ru Шапка - - ru - Шапка - ШапкаРасширеннаяПодсказка 407 @@ -254,10 +246,6 @@ ru Шаг поиск не выполнялся - - ru - Шаг поиск не выполнялся - ШагПоискНеВыполнялсяРасширеннаяПодсказка 63 @@ -334,10 +322,6 @@ ru Шаг поиск не выполнялся - - ru - Шаг поиск не выполнялся - ШагВыполнениеПоискаРасширеннаяПодсказка 187 @@ -500,10 +484,6 @@ ru Команды работы с основным элементов - - ru - Команды работы с основным элементов - КомандыРаботыСОсновнымЭлементовРасширеннаяПодсказка 97 @@ -528,6 +508,10 @@ НайденныеДубли 67 + + <key>ru</key> + <value>Найденные дубли</value> + true true @@ -680,10 +664,6 @@ ru Использовать наименование - - ru - Использовать наименование - ИспользоватьНаименованиеРасширеннаяПодсказка 110 @@ -953,6 +933,10 @@ true + + <key>ru</key> + <value>Найденные дубли контекстное меню группа изменить</value> + НайденныеДублиКонтекстноеМенюГруппаИзменитьРасширеннаяПодсказка 423 @@ -1051,6 +1035,10 @@ true + + <key>ru</key> + <value>Найденные дубли контекстное меню группа изменить форму</value> + НайденныеДублиКонтекстноеМенюГруппаИзменитьФормуРасширеннаяПодсказка 427 @@ -1086,9 +1074,6 @@ true true true - None - None - None true @@ -1100,6 +1085,10 @@ МестаИспользованияКандидата 137 + + <key>ru</key> + <value>Места использования кандидата</value> + true true @@ -1298,9 +1287,6 @@ true true true - None - None - None true @@ -1313,10 +1299,6 @@ ru Места использования - - ru - Места использования - МестаИспользованияРасширеннаяПодсказка 150 @@ -1412,10 +1394,6 @@ ru Страницы места использования - - ru - Страницы места использования - СтраницыМестаИспользованияРасширеннаяПодсказка 148 @@ -1438,12 +1416,8 @@ <key>ru</key> - <value>Группа горизонтальная найденные дубли</value> + <value>Горизонтальная найденные дубли</value> - - ru - Группа горизонтальная найденные дубли - ГруппаГоризонтальнаяНайденныеДублиРасширеннаяПодсказка 156 @@ -1550,7 +1524,7 @@ <key>ru</key> - <value>Группа горизонтальная состояние найденного</value> + <value>Горизонтальная состояние найденного</value> 2 @@ -1579,12 +1553,8 @@ <key>ru</key> - <value>Группа вертикальная основного элемента</value> + <value>Вертикальная основного элемента</value> - - ru - Группа вертикальная основного элемента - ГруппаВертикальнаяОсновногоЭлементаРасширеннаяПодсказка 154 @@ -1614,10 +1584,6 @@ ru Шаг выбор основного элемента - - ru - Шаг выбор основного элемента - ШагВыборОсновногоЭлементаРасширеннаяПодсказка 99 @@ -1694,10 +1660,6 @@ ru Шаг выполнение удаления - - ru - Шаг выполнение удаления - ШагВыполнениеУдаленияРасширеннаяПодсказка 206 @@ -1801,10 +1763,6 @@ ru Шаг успешное удаление - - ru - Шаг успешное удаление - ШагУспешноеУдалениеРасширеннаяПодсказка 213 @@ -1873,6 +1831,10 @@ НеобработанныеДубли 242 + + <key>ru</key> + <value>Необработанные дубли</value> + true true @@ -1981,6 +1943,10 @@ true + + <key>ru</key> + <value>Основной наименование</value> + ru Использовать наименование @@ -2227,6 +2193,10 @@ true + + <key>ru</key> + <value>Необработанные дубли контекстное меню группа открыть</value> + НеобработанныеДублиКонтекстноеМенюГруппаОткрытьРасширеннаяПодсказка 443 @@ -2325,6 +2295,10 @@ true + + <key>ru</key> + <value>Необработанные дубли контекстное меню группа изменить форму</value> + НеобработанныеДублиКонтекстноеМенюГруппаИзменитьФормуРасширеннаяПодсказка 441 @@ -2360,9 +2334,6 @@ true true true - None - None - None true @@ -2374,6 +2345,10 @@ МестаИспользованияНеобработанных 269 + + <key>ru</key> + <value>Места использования необработанных</value> + true true @@ -2617,9 +2592,6 @@ true true true - None - None - None true @@ -2804,7 +2776,7 @@ <key>ru</key> - <value>Группа горизонтальная необработанные дубли</value> + <value>Горизонтальная необработанные дубли</value> ru @@ -2914,7 +2886,7 @@ <key>ru</key> - <value>Группа пояснение к необработанным</value> + <value>Пояснение к необработанным</value> Ctrl+S @@ -2943,7 +2915,7 @@ <key>ru</key> - <value>Группа вертикальная необработанные дубли</value> + <value>Вертикальная необработанные дубли</value> ru @@ -2978,10 +2950,6 @@ ru Шаг неудачные замены - - ru - Шаг неудачные замены - ШагНеудачныеЗаменыРасширеннаяПодсказка 211 @@ -3058,10 +3026,6 @@ ru Шаг дублей не найдено - - ru - Шаг дублей не найдено - ШагДублейНеНайденоРасширеннаяПодсказка 228 @@ -3204,10 +3168,6 @@ ru Возникла ошибка - - ru - Шаг возникла ошибка - ШагВозниклаОшибкаРасширеннаяПодсказка 449 @@ -3233,10 +3193,6 @@ ru Шаги мастера - - ru - Шаги мастера - true ШагиМастераРасширеннаяПодсказка @@ -3260,7 +3216,7 @@ ГруппаНазад 169 - Назад + ШагМастераНазад 171 true true @@ -3268,7 +3224,7 @@ true - НазадРасширеннаяПодсказка + ШагМастераНазадРасширеннаяПодсказка 172 Label true @@ -3292,12 +3248,8 @@ <key>ru</key> - <value>Группа назад</value> + <value>Назад</value> - - ru - Группа назад - ГруппаНазадРасширеннаяПодсказка 170 @@ -3317,7 +3269,7 @@ ГруппаВперед 173 - Далее + ШагМастераДалее 175 <key>ru</key> @@ -3329,7 +3281,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДалееРасширеннаяПодсказка</name> + <name>ШагМастераДалееРасширеннаяПодсказка</name> <id>176</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -3347,7 +3299,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>Отмена</name> + <name>ШагМастераОтмена</name> <id>177</id> <visible>true</visible> <enabled>true</enabled> @@ -3355,7 +3307,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОтменаРасширеннаяПодсказка</name> + <name>ШагМастераОтменаРасширеннаяПодсказка</name> <id>178</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -3408,12 +3360,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа справка формы</value> + <value>Справка формы</value> - - ru - Группа справка формы - ГруппаСправкаФормыРасширеннаяПодсказка 185 @@ -3433,12 +3381,8 @@ <key>ru</key> - <value>Группа вперед</value> + <value>Вперед</value> - - ru - Группа вперед - ГруппаВпередРасширеннаяПодсказка 174 @@ -3463,10 +3407,6 @@ ru Панель действий мастера - - ru - Панель действий мастера - ПанельДействийМастераРасширеннаяПодсказка 168 @@ -3663,12 +3603,8 @@ <key>ru</key> - <value>Группа картинок</value> + <value>Картинок</value> - - ru - Группа картинок - ГруппаКартинокРасширеннаяПодсказка 76 @@ -4477,10 +4413,10 @@ - НастройкиПошаговогоМастера + НастройкиМастера <key>ru</key> - <value>Настройки пошагового мастера</value> + <value>Настройки мастера</value> 27 @@ -4732,7 +4668,7 @@ - ШагМастераДалее + ОбработчикКнопкиМастера DontUse @@ -4754,7 +4690,7 @@ - ШагМастераНазад + ОбработчикКнопкиМастера DontUse @@ -4776,7 +4712,7 @@ - ШагМастераОтмена + ОбработчикКнопкиМастера DontUse diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl index 085db8e9f..29bedeb6d 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl @@ -50,29 +50,87 @@ |Измените условия отбора и сравнения, нажмите ""Найти дубли""'"); ОтображениеСостояния.Картинка = Элементы.Предупреждение32.Картинка; - // Пошаговый мастер - НастройкиПошаговогоМастера = ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена); - - // Добавляем шаги, зависящие от логики формы. - ИнициализироватьСценарийМастера(); - // Автосохранение настроек СохраняемыеВНастройкахДанныеМодифицированы = Истина; + // Инициализация шагов пошагового мастера. + ИнициализироватьНастройкиПошаговогоМастера(); + + // 1. Поиск не выполнялся. + ШагПоиск = ДобавитьШагМастера(Элементы.ШагПоискНеВыполнялся); + ШагПоиск.КнопкаНазад.Видимость = Ложь; + ШагПоиск.КнопкаДалее.Заголовок = НСтр("ru = 'Найти дубли >'"); + ШагПоиск.КнопкаДалее.Подсказка = НСтр("ru = 'Найти дубли по указанным критериям'"); + ШагПоиск.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + ШагПоиск.КнопкаОтмена.Подсказка = НСтр("ru = 'Отказаться от поиска и замены дублей'"); + + // 2. Длительный поиск. + Шаг = ДобавитьШагМастера(Элементы.ШагВыполнениеПоиска); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Прервать'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Прервать поиск дублей'"); + + // 3. Обработка результатов поиска, выбор основных элементов. + Шаг = ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Удалить дубли >'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Удалить дубли'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Отказаться от поиска и замены дублей'"); + + // 4. Длительное удаление дублей. + Шаг = ДобавитьШагМастера(Элементы.ШагВыполнениеУдаления); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Прервать'"); + Шаг.КнопкаОтмена.Подсказка = НСтр("ru = 'Прервать удаление дублей'"); + + // 5. Успешное удаление. + Шаг = ДобавитьШагМастера(Элементы.ШагУспешноеУдаление); + Шаг.КнопкаНазад.Заголовок = НСтр("ru = '< Новый поиск'"); + Шаг.КнопкаНазад.Подсказка = НСтр("ru = 'Начать новый поиск с другими параметрами'"); + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.КнопкаПоУмолчанию = Истина; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // 6. Неполное удаление. + Шаг = ДобавитьШагМастера(Элементы.ШагНеудачныеЗамены); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Повторить удаление >'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Удалить дубли'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // 7. Дублей не найдено. + Шаг = ДобавитьШагМастера(Элементы.ШагДублейНеНайдено); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Заголовок = НСтр("ru = 'Найти дубли >'"); + Шаг.КнопкаДалее.Подсказка = НСтр("ru = 'Найти дубли по указанным критериям'"); + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // 8. Ошибки выполнения. + Шаг = ДобавитьШагМастера(Элементы.ШагВозниклаОшибка); + Шаг.КнопкаНазад.Видимость = Ложь; + Шаг.КнопкаДалее.Видимость = Ложь; + Шаг.КнопкаОтмена.Заголовок = НСтр("ru = 'Закрыть'"); + + // Обновление элементов формы. + НастройкиМастера.ТекущийШаг = ШагПоиск; + ВидимостьДоступность(ЭтотОбъект); + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - // Указываем стартовую страницу. - УстановитьНачальнуюСтраницуМастера(Элементы.ШагПоискНеВыполнялся); - ЗапуститьРаботуМастера(); + // Запуск мастера. + ПриАктивацииШагаМастера(); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) - Если Не НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием Тогда + Если Не НастройкиМастера.ПоказатьДиалогПередЗакрытием Тогда Возврат; КонецЕсли; Если ЗавершениеРаботы Тогда @@ -80,9 +138,10 @@ КонецЕсли; Отказ = Истина; - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + Если ТекущаяСтраница = Элементы.ШагВыполнениеПоиска Тогда ТекстВопроса = НСтр("ru = 'Прервать поиск дублей и закрыть форму?'"); - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда ТекстВопроса = НСтр("ru = 'Прервать удаление дублей и закрыть форму?'"); КонецЕсли; @@ -99,11 +158,6 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы -&НаКлиенте -Процедура ОбластьПоискаДублейНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; -КонецПроцедуры - &НаКлиенте Процедура ОбластьПоискаДублейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; @@ -161,6 +215,12 @@ Процедура ПредставлениеПравилОтбораНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; + ПодключитьОбработчикОжидания("ПриНачалеВыбораПравилОтбора", 0.1, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеВыбораПравилОтбора() + Имя = ПолноеИмяФормы("ПравилаОтбора"); ЭлементСписка = Элементы.ОбластьПоискаДублей.СписокВыбора.НайтиПоЗначению(ОбластьПоискаДублей); @@ -179,6 +239,7 @@ Обработчик = Новый ОписаниеОповещения("ПравилаОтбораЗавершениеВыбора", ЭтотОбъект); ОткрытьФорму(Имя, ПараметрыФормы, ЭтотОбъект, , , , Обработчик); + КонецПроцедуры &НаКлиенте @@ -434,6 +495,25 @@ #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура ОбработчикКнопкиМастера(Команда) + + Если Команда.Имя = НастройкиМастера.КнопкаДалее Тогда + + ШагМастераДалее(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаНазад Тогда + + ШагМастераНазад(); + + ИначеЕсли Команда.Имя = НастройкиМастера.КнопкаОтмена Тогда + + ШагМастераОтмена(); + + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ВыбратьОсновнойЭлемент(Команда) @@ -485,25 +565,317 @@ КонецПроцедуры -&НаКлиенте -Процедура ШагМастераНазад(Команда) - ШагМастера("Назад"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераДалее(Команда) - ШагМастера("Далее"); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераОтмена(Команда) - ШагМастера("Отмена"); -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции +//////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс мастера + +// Инициализирует структуры мастера. +// В реквизит формы НастройкиПошаговогоМастера записывается следующее значение: +// Структура - Описание настроек мастера. +// Общедоступные настройки мастера: +// * Шаги - Массив - Описание шагов мастера. Только для чтения. +// Для добавления шагов следует использовать функцию ДобавитьШагМастера. +// * ТекущийШаг - Структура - Текущий шаг мастера. Только для чтения. +// * ПоказатьДиалогПередЗакрытием - Булево - Если Истина, то перед закрытием формы будет показано предупреждение. +// Для изменения. +// Служебные настройки мастера: +// * ГруппаСтраниц - Строка - Имя элемента формы, переданного в параметре ГруппаСтраниц. +// * КнопкаДалее - Строка - Имя элемента формы, переданного в параметре КнопкаДалее. +// * КнопкаНазад - Строка - Имя элемента формы, переданного в параметре КнопкаНазад. +// * КнопкаОтмена - Строка - Имя элемента формы, переданного в параметре КнопкаОтмена. +// +&НаСервере +Процедура ИнициализироватьНастройкиПошаговогоМастера() + НастройкиМастера = Новый Структура; + НастройкиМастера.Вставить("Шаги", Новый Массив); + НастройкиМастера.Вставить("ТекущийШаг", Неопределено); + + // Идентификаторы частей интерфейса. + НастройкиМастера.Вставить("ГруппаСтраниц", Элементы.ШагиМастера.Имя); + НастройкиМастера.Вставить("КнопкаДалее", Элементы.ШагМастераДалее.Имя); + НастройкиМастера.Вставить("КнопкаНазад", Элементы.ШагМастераНазад.Имя); + НастройкиМастера.Вставить("КнопкаОтмена", Элементы.ШагМастераОтмена.Имя); + + // Для обработки длительных операций. + НастройкиМастера.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); + + // По умолчанию все отключено. + Элементы.ШагМастераДалее.Видимость = Ложь; + Элементы.ШагМастераНазад.Видимость = Ложь; + Элементы.ШагМастераОтмена.Видимость = Ложь; +КонецПроцедуры + +// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. +// +// Параметры: +// Страница - ГруппаФормы - Страница, содержащая элементы шага. +// +// Возвращаемое значение: +// Структура - Описание настроек страницы. +// * ИмяСтраницы - Строка - Имя страницы. +// * КнопкаДалее - Структура - Описание кнопки "Далее". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Далее >". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Истина. +// * КнопкаНазад - Структура - Описание кнопки "Назад". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "< Назад". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// * КнопкаОтмена - Структура - Описание кнопки "Отмена". +// ** Заголовок - Строка - Заголовок кнопки. По умолчанию: "Отмена". +// ** Подсказка - Строка - Подсказка для кнопки. По умолчанию соответствует заголовку кнопки. +// ** Видимость - Булево - Когда Истина то кнопка видна. По умолчанию: Истина. +// ** Доступность - Булево - Когда Истина то кнопку можно нажимать. По умолчанию: Истина. +// ** КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. По умолчанию: Ложь. +// +&НаСервере +Функция ДобавитьШагМастера(Знач Страница) + ОписаниеШага = Новый Структура("Индекс, ИмяСтраницы, КнопкаНазад, КнопкаДалее, КнопкаОтмена"); + ОписаниеШага.ИмяСтраницы = Страница.Имя; + ОписаниеШага.КнопкаНазад = КнопкаМастера(); + ОписаниеШага.КнопкаНазад.Заголовок = НСтр("ru='< Назад'"); + ОписаниеШага.КнопкаДалее = КнопкаМастера(); + ОписаниеШага.КнопкаДалее.КнопкаПоУмолчанию = Истина; + ОписаниеШага.КнопкаДалее.Заголовок = НСтр("ru = 'Далее >'"); + ОписаниеШага.КнопкаОтмена = КнопкаМастера(); + ОписаниеШага.КнопкаОтмена.Заголовок = НСтр("ru = 'Отмена'"); + + НастройкиМастера.Шаги.Добавить(ОписаниеШага); + + ОписаниеШага.Индекс = НастройкиМастера.Шаги.ВГраница(); + Возврат ОписаниеШага; +КонецФункции + +// Обновляет видимость и доступность элементов формы в соответствии с текущим шагом мастера. +&НаКлиентеНаСервереБезКонтекста +Процедура ВидимостьДоступность(Форма) + + Элементы = Форма.Элементы; + НастройкиМастера = Форма.НастройкиМастера; + ТекущийШаг = НастройкиМастера.ТекущийШаг; + + // Переключение страницы. + Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ТекущийШаг.ИмяСтраницы]; + + // Обновление кнопок. + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаДалее], ТекущийШаг.КнопкаДалее); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаНазад], ТекущийШаг.КнопкаНазад); + ОбновитьСвойстваКнопкиМастера(Элементы[НастройкиМастера.КнопкаОтмена], ТекущийШаг.КнопкаОтмена); + +КонецПроцедуры + +// Выполняет переход мастера на указанную страницу. +// +// Параметры: +// ШагИлиИндексИлиГруппаФормы - Структура, Число, ГруппаФормы - Страницу, на которую необходимо перейти. +// +&НаКлиенте +Процедура ПерейтиНаШагМастера(Знач ШагИлиИндексИлиГруппаФормы) + + // Поиск шага. + Тип = ТипЗнч(ШагИлиИндексИлиГруппаФормы); + Если Тип = Тип("Структура") Тогда + ОписаниеШага = ШагИлиИндексИлиГруппаФормы; + ИначеЕсли Тип = Тип("Число") Тогда + ИндексШага = ШагИлиИндексИлиГруппаФормы; + Если ИндексШага < 0 Тогда + ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); + ИначеЕсли ИндексШага > НастройкиМастера.Шаги.ВГраница() Тогда + ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); + КонецЕсли; + ОписаниеШага = НастройкиМастера.Шаги[ИндексШага]; + Иначе + ШагНайден = Ложь; + ИмяИскомойСтраницы = ШагИлиИндексИлиГруппаФормы.Имя; + Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл + Если ОписаниеШага.ИмяСтраницы = ИмяИскомойСтраницы Тогда + ШагНайден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не ШагНайден Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден шаг ""%1"".'"), + ИмяИскомойСтраницы); + КонецЕсли; + КонецЕсли; + + // Переключение шага. + НастройкиМастера.ТекущийШаг = ОписаниеШага; + + // Обновление видимости. + ВидимостьДоступность(ЭтотОбъект); + ПриАктивацииШагаМастера(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// События мастера + +&НаКлиенте +Процедура ПриАктивацииШагаМастера() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПоискНеВыполнялся Тогда + + Элементы.Шапка.Доступность = Истина; + + // Представление правил отбора. + ПредставлениеПравилОтбора = Строка(КомпоновщикПредварительногоОтбора.Настройки.Отбор); + Если ПустаяСтрока(ПредставлениеПравилОтбора) Тогда + ПредставлениеПравилОтбора = НСтр("ru = 'Все элементы'"); + КонецЕсли; + + // Представление правил поиска. + Союз = " " + НСтр("ru = 'И'") + " "; + ТекстПравил = ""; + Для Каждого Правило Из ПравилаПоиска Цикл + Если Правило.Правило = "Равно" Тогда + Сравнение = Правило.ПредставлениеРеквизита + " " + НСтр("ru = 'совпадает'"); + ИначеЕсли Правило.Правило = "Подобно" Тогда + Сравнение = Правило.ПредставлениеРеквизита + " " + НСтр("ru = 'совпадает по похожим словам'"); + Иначе + Продолжить; + КонецЕсли; + ТекстПравил = ?(ТекстПравил = "", "", ТекстПравил + Союз) + Сравнение; + КонецЦикла; + Если УчитыватьПрикладныеПравила Тогда + Для Позиция = 1 По СтрЧислоСтрок(ОписаниеПрикладныхПравил) Цикл + СтрокаПравила = СокрЛП(СтрПолучитьСтроку(ОписаниеПрикладныхПравил, Позиция)); + Если Не ПустаяСтрока(СтрокаПравила) Тогда + ТекстПравил = ?(ТекстПравил = "", "", ТекстПравил + Союз) + СтрокаПравила; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если ПустаяСтрока(ТекстПравил) Тогда + ТекстПравил = НСтр("ru = 'Правила не заданы'"); + КонецЕсли; + ПредставлениеПравилПоиска = ТекстПравил; + + // Доступность. + Элементы.ПредставлениеПравилОтбора.Доступность = Не ПустаяСтрока(ОбластьПоискаДублей); + Элементы.ПредставлениеПравилПоиска.Доступность = Не ПустаяСтрока(ОбластьПоискаДублей); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеПоиска Тогда + + Если Не ЭтоАдресВременногоХранилища(АдресСхемыКомпоновки) Тогда + Возврат; // Не инициализировано. + КонецЕсли; + Элементы.Шапка.Доступность = Ложь; + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Истина; + ЗапуститьФоновоеЗаданиеКлиент(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыборОсновногоЭлемента Тогда + + Элементы.Шапка.Доступность = Истина; + Элементы.ПовторитьПоиск.Видимость = Истина; + РазвернутьГруппуДублейИерархически(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда + + Элементы.Шапка.Доступность = Ложь; + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Истина; + ЗапуститьФоновоеЗаданиеКлиент(); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагУспешноеУдаление Тогда + + Элементы.Шапка.Доступность = Ложь; + + ИначеЕсли ТекущаяСтраница = Элементы.ШагНеудачныеЗамены Тогда + + Элементы.Шапка.Доступность = Ложь; + + ИначеЕсли ТекущаяСтраница = Элементы.ШагДублейНеНайдено Тогда + + Элементы.Шапка.Доступность = Истина; + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВозниклаОшибка Тогда + + Элементы.Шапка.Доступность = Истина; + Элементы.СсылкаПодробнее.Видимость = ЗначениеЗаполнено(Элементы.СсылкаПодробнее.Подсказка); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераДалее() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагПоискНеВыполнялся Тогда + + Если ПустаяСтрока(ОбластьПоискаДублей) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать область поиска дублей'")); + Возврат; + КонецЕсли; + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыборОсновногоЭлемента Тогда + + Элементы.ПовторитьПоиск.Видимость = Ложь; + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагНеудачныеЗамены Тогда + + ПерейтиНаШагМастера(Элементы.ШагВыполнениеУдаления); + + ИначеЕсли ТекущаяСтраница = Элементы.ШагДублейНеНайдено Тогда + + ПерейтиНаШагМастера(Элементы.ШагВыполнениеПоиска); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераНазад() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагУспешноеУдаление Тогда + + ПерейтиНаШагМастера(Элементы.ШагПоискНеВыполнялся); + + Иначе + + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс - 1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераОтмена() + + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагВыполнениеПоиска + Или ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда + + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; + + КонецЕсли; + + Если Открыта() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент @@ -513,6 +885,287 @@ Возврат Имена[0] + "." + Имена[1] + ".Форма." + КраткоеИмяФормы; КонецФункции +&НаКлиенте +Процедура ОткрытьФормуДубля(Знач ТекущиеДанные) + Если ТекущиеДанные = Неопределено Или Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + Возврат; + КонецЕсли; + + ПоказатьЗначение(,ТекущиеДанные.Ссылка); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьМестаИспользования(ДеревоИсточник) + МассивСсылок = Новый Массив; + Для Каждого ГруппаДублей Из ДеревоИсточник.ПолучитьЭлементы() Цикл + Для Каждого СтрокаДерева Из ГруппаДублей.ПолучитьЭлементы() Цикл + МассивСсылок.Добавить(СтрокаДерева.Ссылка); + КонецЦикла; + КонецЦикла; + + ПараметрыОтчета = Новый Структура; + ПараметрыОтчета.Вставить("Отбор", Новый Структура("НаборСсылок", МассивСсылок)); + РежимОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; + ОткрытьФорму("Отчет.МестаИспользованияСсылок.Форма", ПараметрыОтчета, ЭтотОбъект, , , , , РежимОкна); +КонецПроцедуры + +&НаКлиенте +Процедура РазвернутьГруппуДублейИерархически(Знач СтрокаДанных = Неопределено) + Если СтрокаДанных <> Неопределено Тогда + Элементы.НайденныеДубли.Развернуть(СтрокаДанных, Истина); + КонецЕсли; + + // Все первого уровня + ВсеСтроки = Элементы.НайденныеДубли; + Для Каждого ДанныеСтроки Из НайденныеДубли.ПолучитьЭлементы() Цикл + ВсеСтроки.Развернуть(ДанныеСтроки.ПолучитьИдентификатор(), Истина); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура СвернутьГруппуДублейИерархически(Знач СтрокаДанных = Неопределено) + Если СтрокаДанных <> Неопределено Тогда + Элементы.НайденныеДубли.Свернуть(СтрокаДанных); + Возврат; + КонецЕсли; + + // Все первого уровня + ВсеСтроки = Элементы.НайденныеДубли; + Для Каждого ДанныеСтроки Из НайденныеДубли.ПолучитьЭлементы() Цикл + ВсеСтроки.Свернуть(ДанныеСтроки.ПолучитьИдентификатор()); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьПометкиКандидатовИерархически(Знач ДанныеСтроки) + ПроставитьПометкиВниз(ДанныеСтроки); + ПроставитьПометкиВверх(ДанныеСтроки); +КонецПроцедуры + +&НаКлиенте +Процедура ПроставитьПометкиВниз(Знач ДанныеСтроки) + Значение = ДанныеСтроки.Пометка; + Для Каждого Потомок Из ДанныеСтроки.ПолучитьЭлементы() Цикл + Потомок.Пометка = Значение; + ПроставитьПометкиВниз(Потомок); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ПроставитьПометкиВверх(Знач ДанныеСтроки) + РодительСтроки = ДанныеСтроки.ПолучитьРодителя(); + + Если РодительСтроки <> Неопределено Тогда + ВсеИстина = Истина; + НеВсеЛожь = Ложь; + + Для Каждого Потомок Из РодительСтроки.ПолучитьЭлементы() Цикл + ВсеИстина = ВсеИстина И (Потомок.Пометка = 1); + НеВсеЛожь = НеВсеЛожь Или (Потомок.Пометка > 0); + КонецЦикла; + + Если ВсеИстина Тогда + РодительСтроки.Пометка = 1; + + ИначеЕсли НеВсеЛожь Тогда + РодительСтроки.Пометка = 2; + + Иначе + РодительСтроки.Пометка = 0; + + КонецЕсли; + + ПроставитьПометкиВверх(РодительСтроки); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПересчитатьКоличествоНайденныхДублей() + ВсегоНайденоДублей = 0; + Для Каждого Дубль Из НайденныеДубли.ПолучитьЭлементы() Цикл + Для Каждого Потомок Из Дубль.ПолучитьЭлементы() Цикл + Если Не Потомок.Основной И Потомок.Пометка Тогда + ВсегоНайденоДублей = ВсегоНайденоДублей + 1; + КонецЕсли; + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьОсновнойЭлементИерархически(Знач ДанныеСтроки, Знач Родитель) + Для Каждого Потомок Из Родитель.ПолучитьЭлементы() Цикл + Потомок.Основной = Ложь; + КонецЦикла; + ДанныеСтроки.Основной = Истина; + + // Выбранный всегда используем. + ДанныеСтроки.Пометка = 1; + ИзменитьПометкиКандидатовИерархически(ДанныеСтроки); + + // И изменяем название группы + Родитель.Наименование = ДанныеСтроки.Наименование + " (" + Родитель.Количество + ")"; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Клиент, Сервер + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьОписаниеСостоянияНайденныхДублей(Форма) + + Форма.ОписаниеСостоянияНайденныхДублей = Новый ФорматированнаяСтрока( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Найдено дублей: %2 (среди элементов: %1). Все отмеченные элементы будут помечены на удаление и заменены во всех местах использования на оригиналы (отмечены стрелкой).'"), + Форма.ВсегоЭлементов, + Форма.ВсегоНайденоДублей), + , + Форма.ЦветПоясняющийТекст); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера, Сервер + +&НаСервере +Функция АдресНастроекКомпоновщикаОтбора() + Возврат ПоместитьВоВременноеХранилище(КомпоновщикПредварительногоОтбора.Настройки, УникальныйИдентификатор); +КонецФункции + +&НаСервере +Функция АдресНастроекПравилПоиска() + Настройки = Новый Структура; + Настройки.Вставить("УчитыватьПрикладныеПравила", УчитыватьПрикладныеПравила); + Настройки.Вставить("ВсеВариантыСравнения", ВсеВариантыСравнения); + Настройки.Вставить("ПравилаПоиска", РеквизитФормыВЗначение("ПравилаПоиска")); + Возврат ПоместитьВоВременноеХранилище(Настройки); +КонецФункции + +&НаСервере +Процедура ОбновитьКомпоновщикОтбора(АдресРезультата) + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + УдалитьИзВременногоХранилища(АдресРезультата); + КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(Результат); + КомпоновщикПредварительногоОтбора.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное); + СохранитьПользовательскиеНастройки(); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьПравилаПоиска(АдресРезультата) + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + УдалитьИзВременногоХранилища(АдресРезультата); + УчитыватьПрикладныеПравила = Результат.УчитыватьПрикладныеПравила; + ЗначениеВРеквизитФормы(Результат.ПравилаПоиска, "ПравилаПоиска"); + СохранитьПользовательскиеНастройки(); +КонецПроцедуры + +&НаСервере +Процедура ИнициализироватьКомпоновщикОтбораИПравила(НастройкиФормы) + // 1. Очистка и инициализация сведений об объекте метаданных. + ПредставлениеПравилОтбора = ""; + ПредставлениеПравилПоиска = ""; + + ТаблицаНастроек = ПолучитьИзВременногоХранилища(АдресНастроек); + СтрокаТаблицыНастроек = ТаблицаНастроек.Найти(ОбластьПоискаДублей, "ПолноеИмя"); + Если СтрокаТаблицыНастроек = Неопределено Тогда + ОбластьПоискаДублей = ""; + Возврат; + КонецЕсли; + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбластьПоискаДублей); + + // 2. Инициализация СКД, которая используется для отборов. + СхемаКомпоновки = Новый СхемаКомпоновкиДанных; + ИсточникДанных = СхемаКомпоновки.ИсточникиДанных.Добавить(); + ИсточникДанных.ТипИсточникаДанных = "Local"; + + НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.Запрос = "ВЫБРАТЬ " + ДоступныеРеквизитыОтбора(ОбъектМетаданных) + " ИЗ " + ОбластьПоискаДублей; + НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; + + АдресСхемыКомпоновки = ПоместитьВоВременноеХранилище(СхемаКомпоновки, УникальныйИдентификатор); + + КомпоновщикПредварительногоОтбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); + + // 3. Заполнение таблицы ПравилаПоиска. + ТаблицаПравил = РеквизитФормыВЗначение("ПравилаПоиска"); + ТаблицаПравил.Очистить(); + + ИгнорируемыеРеквизиты = Новый Структура("ПометкаУдаления, Ссылка, Предопределенный, ИмяПредопределенныхДанных, ЭтоГруппа"); + ДобавитьПравилаМетаРеквизитов(ТаблицаПравил, ИгнорируемыеРеквизиты, ВсеВариантыСравнения, ОбъектМетаданных.СтандартныеРеквизиты, НечеткийПоиск); + ДобавитьПравилаМетаРеквизитов(ТаблицаПравил, ИгнорируемыеРеквизиты, ВсеВариантыСравнения, ОбъектМетаданных.Реквизиты, НечеткийПоиск); + + // 4. Загрузка сохраненных значений. + ОтборыЗагружены = Ложь; + НастройкиКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиФормы, "НастройкиКД"); + Если ТипЗнч(НастройкиКД) = Тип("НастройкиКомпоновкиДанных") Тогда + КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(НастройкиКД); + ОтборыЗагружены = Истина; + КонецЕсли; + + ПравилаЗагружены = Ложь; + СохраненныеПравила = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиФормы, "ПравилаПоиска"); + Если ТипЗнч(СохраненныеПравила) = Тип("ТаблицаЗначений") Тогда + ПравилаЗагружены = Истина; + Для Каждого СохраненноеПравило Из СохраненныеПравила Цикл + Правило = ТаблицаПравил.Найти(СохраненноеПравило.Реквизит, "Реквизит"); + Если Правило <> Неопределено + И Правило.ВариантыСравнения.НайтиПоЗначению(СохраненноеПравило.Правило) <> Неопределено Тогда + Правило.Правило = СохраненноеПравило.Правило; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // 5. Установка умолчаний. + // Отбор по пометке удаления. + Если Не ОтборыЗагружены Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + КомпоновщикПредварительногоОтбора.Настройки.Отбор, + "ПометкаУдаления", + Ложь, + ВидСравненияКомпоновкиДанных.Равно, + , + Ложь); + КонецЕсли; + // Сравнение по наименованию. + Если Не ПравилаЗагружены Тогда + Правило = ТаблицаПравил.Найти("Наименование", "Реквизит"); + Если Правило <> Неопределено Тогда + ЗначениеДляСравнения = ?(НечеткийПоиск, "Подобно", "Равно"); + Если Правило.ВариантыСравнения.НайтиПоЗначению(ЗначениеДляСравнения) <> Неопределено Тогда + Правило.Правило = ЗначениеДляСравнения; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + // 6. Механизмы расширения в части прикладных правил. + ОписаниеПрикладныхПравил = Неопределено; + Если СтрокаТаблицыНастроек.СобытиеПараметрыПоискаДублей Тогда + ПараметрыПоУмолчанию = Новый Структура; + ПараметрыПоУмолчанию.Вставить("ПравилаПоиска", ТаблицаПравил); + ПараметрыПоУмолчанию.Вставить("ОграниченияСравнения", Новый Массив); + ПараметрыПоУмолчанию.Вставить("КомпоновщикОтбора", КомпоновщикПредварительногоОтбора); + ПараметрыПоУмолчанию.Вставить("КоличествоЭлементовДляСравнения", 1000); + МенеджерОбъектаМетаданных = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + МенеджерОбъектаМетаданных.ПараметрыПоискаДублей(ПараметрыПоУмолчанию); + + // Представление прикладных правил. + ОписаниеПрикладныхПравил = ""; + Для Каждого Описание Из ПараметрыПоУмолчанию.ОграниченияСравнения Цикл + ОписаниеПрикладныхПравил = ОписаниеПрикладныхПравил + Символы.ПС + Описание.Представление; + КонецЦикла; + ОписаниеПрикладныхПравил = СокрЛП(ОписаниеПрикладныхПравил); + КонецЕсли; + + КомпоновщикПредварительногоОтбора.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное); + + ТаблицаПравил.Сортировать("ПредставлениеРеквизита"); + ЗначениеВРеквизитФормы(ТаблицаПравил, "ПравилаПоиска"); + + Если НастройкиФормы = Неопределено Тогда + СохранитьПользовательскиеНастройки(); + КонецЕсли; +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Сервер @@ -543,18 +1196,6 @@ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ИмяФормы, "", НастройкиФормы); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Прочее - -&НаКлиенте -Процедура ОткрытьФормуДубля(Знач ТекущиеДанные) - Если ТекущиеДанные = Неопределено Или Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда - Возврат; - КонецЕсли; - - ПоказатьЗначение(,ТекущиеДанные.Ссылка); -КонецПроцедуры - &НаСервере Процедура УстановитьЦветаИУсловноеОформление() ЦветПоясняющийТекст = ЦветСтиляИлиАвто("ПоясняющийТекст", 69, 81, 133); @@ -700,272 +1341,6 @@ Возврат ПарыЗамен; КонецФункции -&НаКлиенте -Процедура ПоказатьМестаИспользования(ДеревоИсточник) - МассивСсылок = Новый Массив; - Для Каждого ГруппаДублей Из ДеревоИсточник.ПолучитьЭлементы() Цикл - Для Каждого СтрокаДерева Из ГруппаДублей.ПолучитьЭлементы() Цикл - МассивСсылок.Добавить(СтрокаДерева.Ссылка); - КонецЦикла; - КонецЦикла; - - ПараметрыОтчета = Новый Структура; - ПараметрыОтчета.Вставить("Отбор", Новый Структура("НаборСсылок", МассивСсылок)); - РежимОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - ОткрытьФорму("Отчет.МестаИспользованияСсылок.Форма", ПараметрыОтчета, ЭтотОбъект, , , , , РежимОкна); -КонецПроцедуры - -&НаКлиенте -Процедура РазвернутьГруппуДублейИерархически(Знач СтрокаДанных = Неопределено) - Если СтрокаДанных <> Неопределено Тогда - Элементы.НайденныеДубли.Развернуть(СтрокаДанных, Истина); - КонецЕсли; - - // Все первого уровня - ВсеСтроки = Элементы.НайденныеДубли; - Для Каждого ДанныеСтроки Из НайденныеДубли.ПолучитьЭлементы() Цикл - ВсеСтроки.Развернуть(ДанныеСтроки.ПолучитьИдентификатор(), Истина); - КонецЦикла; -КонецПроцедуры - -&НаКлиенте -Процедура СвернутьГруппуДублейИерархически(Знач СтрокаДанных = Неопределено) - Если СтрокаДанных <> Неопределено Тогда - Элементы.НайденныеДубли.Свернуть(СтрокаДанных); - Возврат; - КонецЕсли; - - // Все первого уровня - ВсеСтроки = Элементы.НайденныеДубли; - Для Каждого ДанныеСтроки Из НайденныеДубли.ПолучитьЭлементы() Цикл - ВсеСтроки.Свернуть(ДанныеСтроки.ПолучитьИдентификатор()); - КонецЦикла; -КонецПроцедуры - -&НаКлиенте -Процедура ИзменитьПометкиКандидатовИерархически(Знач ДанныеСтроки) - ПроставитьПометкиВниз(ДанныеСтроки); - ПроставитьПометкиВверх(ДанныеСтроки); -КонецПроцедуры - -&НаКлиенте -Процедура ПроставитьПометкиВниз(Знач ДанныеСтроки) - Значение = ДанныеСтроки.Пометка; - Для Каждого Потомок Из ДанныеСтроки.ПолучитьЭлементы() Цикл - Потомок.Пометка = Значение; - ПроставитьПометкиВниз(Потомок); - КонецЦикла; -КонецПроцедуры - -&НаКлиенте -Процедура ПроставитьПометкиВверх(Знач ДанныеСтроки) - РодительСтроки = ДанныеСтроки.ПолучитьРодителя(); - - Если РодительСтроки <> Неопределено Тогда - ВсеИстина = Истина; - НеВсеЛожь = Ложь; - - Для Каждого Потомок Из РодительСтроки.ПолучитьЭлементы() Цикл - ВсеИстина = ВсеИстина И (Потомок.Пометка = 1); - НеВсеЛожь = НеВсеЛожь Или (Потомок.Пометка > 0); - КонецЦикла; - - Если ВсеИстина Тогда - РодительСтроки.Пометка = 1; - - ИначеЕсли НеВсеЛожь Тогда - РодительСтроки.Пометка = 2; - - Иначе - РодительСтроки.Пометка = 0; - - КонецЕсли; - - ПроставитьПометкиВверх(РодительСтроки); - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьОписаниеСостоянияНайденныхДублей(Форма) - - Форма.ОписаниеСостоянияНайденныхДублей = Новый ФорматированнаяСтрока( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Найдено дублей: %2 (среди элементов: %1). Все отмеченные элементы будут помечены на удаление и заменены во всех местах использования на оригиналы (отмечены стрелкой).'"), - Форма.ВсегоЭлементов, - Форма.ВсегоНайденоДублей), - , - Форма.ЦветПоясняющийТекст); - -КонецПроцедуры - -&НаКлиенте -Процедура ПересчитатьКоличествоНайденныхДублей() - ВсегоНайденоДублей = 0; - Для Каждого Дубль Из НайденныеДубли.ПолучитьЭлементы() Цикл - Для Каждого Потомок Из Дубль.ПолучитьЭлементы() Цикл - Если Не Потомок.Основной И Потомок.Пометка Тогда - ВсегоНайденоДублей = ВсегоНайденоДублей + 1; - КонецЕсли; - КонецЦикла; - КонецЦикла; -КонецПроцедуры - -&НаКлиенте -Процедура ИзменитьОсновнойЭлементИерархически(Знач ДанныеСтроки, Знач Родитель) - Для Каждого Потомок Из Родитель.ПолучитьЭлементы() Цикл - Потомок.Основной = Ложь; - КонецЦикла; - ДанныеСтроки.Основной = Истина; - - // Выбранный всегда используем. - ДанныеСтроки.Пометка = 1; - ИзменитьПометкиКандидатовИерархически(ДанныеСтроки); - - // И изменяем название группы - Родитель.Наименование = ДанныеСтроки.Наименование + " (" + Родитель.Количество + ")"; -КонецПроцедуры - -&НаСервере -Функция АдресНастроекКомпоновщикаОтбора() - Возврат ПоместитьВоВременноеХранилище(КомпоновщикПредварительногоОтбора.Настройки, УникальныйИдентификатор); -КонецФункции - -&НаСервере -Функция АдресНастроекПравилПоиска() - Настройки = Новый Структура; - Настройки.Вставить("УчитыватьПрикладныеПравила", УчитыватьПрикладныеПравила); - Настройки.Вставить("ВсеВариантыСравнения", ВсеВариантыСравнения); - Настройки.Вставить("ПравилаПоиска", РеквизитФормыВЗначение("ПравилаПоиска")); - Возврат ПоместитьВоВременноеХранилище(Настройки); -КонецФункции - -&НаСервере -Процедура ОбновитьКомпоновщикОтбора(АдресРезультата) - Результат = ПолучитьИзВременногоХранилища(АдресРезультата); - УдалитьИзВременногоХранилища(АдресРезультата); - КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(Результат); - КомпоновщикПредварительногоОтбора.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное); - СохранитьПользовательскиеНастройки(); -КонецПроцедуры - -&НаСервере -Процедура ОбновитьПравилаПоиска(АдресРезультата) - Результат = ПолучитьИзВременногоХранилища(АдресРезультата); - УдалитьИзВременногоХранилища(АдресРезультата); - УчитыватьПрикладныеПравила = Результат.УчитыватьПрикладныеПравила; - ЗначениеВРеквизитФормы(Результат.ПравилаПоиска, "ПравилаПоиска"); - СохранитьПользовательскиеНастройки(); -КонецПроцедуры - -&НаСервере -Процедура ИнициализироватьКомпоновщикОтбораИПравила(НастройкиФормы) - // 1. Очистка и инициализация сведений об объекте метаданных. - ПредставлениеПравилОтбора = ""; - ПредставлениеПравилПоиска = ""; - - ТаблицаНастроек = ПолучитьИзВременногоХранилища(АдресНастроек); - СтрокаТаблицыНастроек = ТаблицаНастроек.Найти(ОбластьПоискаДублей, "ПолноеИмя"); - Если СтрокаТаблицыНастроек = Неопределено Тогда - ОбластьПоискаДублей = ""; - Возврат; - КонецЕсли; - - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбластьПоискаДублей); - - // 2. Инициализация СКД, которая используется для отборов. - СхемаКомпоновки = Новый СхемаКомпоновкиДанных; - ИсточникДанных = СхемаКомпоновки.ИсточникиДанных.Добавить(); - ИсточникДанных.ТипИсточникаДанных = "Local"; - - НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - НаборДанных.Запрос = "ВЫБРАТЬ " + ДоступныеРеквизитыОтбора(ОбъектМетаданных) + " ИЗ " + ОбластьПоискаДублей; - НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; - - АдресСхемыКомпоновки = ПоместитьВоВременноеХранилище(СхемаКомпоновки, УникальныйИдентификатор); - - КомпоновщикПредварительногоОтбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); - - // 3. Заполнение таблицы ПравилаПоиска. - ТаблицаПравил = РеквизитФормыВЗначение("ПравилаПоиска"); - ТаблицаПравил.Очистить(); - - ИгнорируемыеРеквизиты = Новый Структура("ПометкаУдаления, Ссылка, Предопределенный, ИмяПредопределенныхДанных, ЭтоГруппа"); - ДобавитьПравилаМетаРеквизитов(ТаблицаПравил, ИгнорируемыеРеквизиты, ВсеВариантыСравнения, ОбъектМетаданных.СтандартныеРеквизиты, НечеткийПоиск); - ДобавитьПравилаМетаРеквизитов(ТаблицаПравил, ИгнорируемыеРеквизиты, ВсеВариантыСравнения, ОбъектМетаданных.Реквизиты, НечеткийПоиск); - - // 4. Загрузка сохраненных значений. - ОтборыЗагружены = Ложь; - НастройкиКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиФормы, "НастройкиКД"); - Если ТипЗнч(НастройкиКД) = Тип("НастройкиКомпоновкиДанных") Тогда - КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(НастройкиКД); - ОтборыЗагружены = Истина; - КонецЕсли; - - ПравилаЗагружены = Ложь; - СохраненныеПравила = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиФормы, "ПравилаПоиска"); - Если ТипЗнч(СохраненныеПравила) = Тип("ТаблицаЗначений") Тогда - ПравилаЗагружены = Истина; - Для Каждого СохраненноеПравило Из СохраненныеПравила Цикл - Правило = ТаблицаПравил.Найти(СохраненноеПравило.Реквизит, "Реквизит"); - Если Правило <> Неопределено - И Правило.ВариантыСравнения.НайтиПоЗначению(СохраненноеПравило.Правило) <> Неопределено Тогда - Правило.Правило = СохраненноеПравило.Правило; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // 5. Установка умолчаний. - // Отбор по пометке удаления. - Если Не ОтборыЗагружены Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( - КомпоновщикПредварительногоОтбора.Настройки.Отбор, - "ПометкаУдаления", - Ложь, - ВидСравненияКомпоновкиДанных.Равно, - , - Ложь); - КонецЕсли; - // Сравнение по наименованию. - Если Не ПравилаЗагружены Тогда - Правило = ТаблицаПравил.Найти("Наименование", "Реквизит"); - Если Правило <> Неопределено Тогда - ЗначениеДляСравнения = ?(НечеткийПоиск, "Подобно", "Равно"); - Если Правило.ВариантыСравнения.НайтиПоЗначению(ЗначениеДляСравнения) <> Неопределено Тогда - Правило.Правило = ЗначениеДляСравнения; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - // 6. Механизмы расширения в части прикладных правил. - ОписаниеПрикладныхПравил = Неопределено; - Если СтрокаТаблицыНастроек.СобытиеПараметрыПоискаДублей Тогда - ПараметрыПоУмолчанию = Новый Структура; - ПараметрыПоУмолчанию.Вставить("ПравилаПоиска", ТаблицаПравил); - ПараметрыПоУмолчанию.Вставить("ОграниченияСравнения", Новый Массив); - ПараметрыПоУмолчанию.Вставить("КомпоновщикОтбора", КомпоновщикПредварительногоОтбора); - ПараметрыПоУмолчанию.Вставить("КоличествоЭлементовДляСравнения", 1000); - МенеджерОбъектаМетаданных = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); - МенеджерОбъектаМетаданных.ПараметрыПоискаДублей(ПараметрыПоУмолчанию); - - // Представление прикладных правил. - ОписаниеПрикладныхПравил = ""; - Для Каждого Описание Из ПараметрыПоУмолчанию.ОграниченияСравнения Цикл - ОписаниеПрикладныхПравил = ОписаниеПрикладныхПравил + Символы.ПС + Описание.Представление; - КонецЦикла; - ОписаниеПрикладныхПравил = СокрЛП(ОписаниеПрикладныхПравил); - КонецЕсли; - - КомпоновщикПредварительногоОтбора.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное); - - ТаблицаПравил.Сортировать("ПредставлениеРеквизита"); - ЗначениеВРеквизитФормы(ТаблицаПравил, "ПравилаПоиска"); - - Если НастройкиФормы = Неопределено Тогда - СохранитьПользовательскиеНастройки(); - КонецЕсли; -КонецПроцедуры - &НаСервереБезКонтекста Функция ДоступныеРеквизитыОтбора(ОбъектМетаданных) МассивРеквизитов = Новый Массив; @@ -1030,725 +1405,6 @@ Возврат Результат; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Пошаговый помощник - -&НаСервере -Процедура ИнициализироватьСценарийМастера() - - // 0. Поиск не выполнялся. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Найти дубли >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Найти дубли по указанным критериям'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от поиска и замены дублей'"); - - ДобавитьШагМастера(Элементы.ШагПоискНеВыполнялся, - ДействиеШагаМастера("ПриАктивации", "ШагПоискНеВыполнялсяПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагПоискНеВыполнялсяПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагПоискНеВыполнялсяПередДействиемОтмена",))), - КнопкиМастера); - - // 1. Длительный поиск. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Прервать поиск дублей'"); - - ДобавитьШагМастера(Элементы.ШагВыполнениеПоиска, - ДействиеШагаМастера("ПриАктивации", "ШагВыполнениеПоискаПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыполнениеПоискаПередДействиемОтмена")), - КнопкиМастера); - - // 2. Обработка результатов поиска, выбор основных элементов. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Удалить дубли >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Удалить дубли'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от поиска и замены дублей'"); - - ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента, - ДействиеШагаМастера("ПриАктивации", "ШагВыборОсновногоЭлементаПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборОсновногоЭлементаПередДействиемОтмена", - ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборОсновногоЭлементаПередДействиемДалее",))), - КнопкиМастера); - - // 3. Длительное удаление дублей. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'"); - КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Прервать удаление дублей'"); - - ДобавитьШагМастера(Элементы.ШагВыполнениеУдаления, - ДействиеШагаМастера("ПриАктивации", "ШагВыполнениеУдаленияПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыполнениеУдаленияПередДействиемОтмена")), - КнопкиМастера); - - // 4. Успешное удаление. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Заголовок = НСтр("ru = '< Новый поиск'"); - КнопкиМастера.Назад.Подсказка = НСтр("ru = 'Начать новый поиск с другими параметрами'"); - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.КнопкаПоУмолчанию = Истина; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагУспешноеУдаление, - ДействиеШагаМастера("ПриАктивации", "ШагУспешноеУдалениеПриАктивации", - ДействиеШагаМастера("ПередДействиемНазад", "ШагУспешноеУдалениеПередДействиемНазад", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагУспешноеУдалениеПередДействиемОтмена",))), - КнопкиМастера); - - // 5. Неполное удаление. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Повторить удаление >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Удалить дубли'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагНеудачныеЗамены, - ДействиеШагаМастера("ПриАктивации", "ШагНеудачныеЗаменыПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагНеудачныеЗаменыПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагНеудачныеЗаменыПередДействиемОтмена",))), - КнопкиМастера); - - // 6. Дублей не найдено. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Найти дубли >'"); - КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Найти дубли по указанным критериям'"); - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагДублейНеНайдено, - ДействиеШагаМастера("ПриАктивации", "ШагДублейНеНайденоПриАктивации", - ДействиеШагаМастера("ПередДействиемДалее", "ШагДублейНеНайденоПередДействиемДалее", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагДублейНеНайденоПередДействиемОтмена",))), - КнопкиМастера); - - // 7. Ошибки выполнения. - КнопкиМастера = КнопкиМастера(); - КнопкиМастера.Назад.Видимость = Ложь; - КнопкиМастера.Далее.Видимость = Ложь; - КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'"); - - ДобавитьШагМастера(Элементы.ШагВозниклаОшибка, - ДействиеШагаМастера("ПриАктивации", "ШагВозниклаОшибкаПриАктивации", - ДействиеШагаМастера("ПередДействиемОтмена", "ШагВозниклаОшибкаПередДействиемОтмена")), - КнопкиМастера); - -КонецПроцедуры - -// 0. Поиск не выполнялся - -&НаКлиенте -Процедура ШагПоискНеВыполнялсяПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - Элементы.Шапка.Доступность = Истина; - - // Представление правил отбора. - ПредставлениеПравилОтбора = Строка(КомпоновщикПредварительногоОтбора.Настройки.Отбор); - Если ПустаяСтрока(ПредставлениеПравилОтбора) Тогда - ПредставлениеПравилОтбора = НСтр("ru = 'Все элементы'"); - КонецЕсли; - - // Представление правил поиска. - Союз = " " + НСтр("ru = 'И'") + " "; - ТекстПравил = ""; - Для Каждого Правило Из ПравилаПоиска Цикл - Если Правило.Правило = "Равно" Тогда - Сравнение = Правило.ПредставлениеРеквизита + " " + НСтр("ru = 'совпадает'"); - ИначеЕсли Правило.Правило = "Подобно" Тогда - Сравнение = Правило.ПредставлениеРеквизита + " " + НСтр("ru = 'совпадает по похожим словам'"); - Иначе - Продолжить; - КонецЕсли; - ТекстПравил = ?(ТекстПравил = "", "", ТекстПравил + Союз) + Сравнение; - КонецЦикла; - Если УчитыватьПрикладныеПравила Тогда - Для Позиция = 1 По СтрЧислоСтрок(ОписаниеПрикладныхПравил) Цикл - СтрокаПравила = СокрЛП(СтрПолучитьСтроку(ОписаниеПрикладныхПравил, Позиция)); - Если Не ПустаяСтрока(СтрокаПравила) Тогда - ТекстПравил = ?(ТекстПравил = "", "", ТекстПравил + Союз) + СтрокаПравила; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Если ПустаяСтрока(ТекстПравил) Тогда - ТекстПравил = НСтр("ru = 'Правила не заданы'"); - КонецЕсли; - ПредставлениеПравилПоиска = ТекстПравил; - - // Доступность. - Элементы.ПредставлениеПравилОтбора.Доступность = Не ПустаяСтрока(ОбластьПоискаДублей); - Элементы.ПредставлениеПравилПоиска.Доступность = Не ПустаяСтрока(ОбластьПоискаДублей); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагПоискНеВыполнялсяПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - // Возможность поиска - Если Не ПустаяСтрока(ОбластьПоискаДублей) Тогда - ЗавершитьШагМастера(ПараметрыШага); - Возврат; - КонецЕсли; - - ТекстПредупреждения = НСтр("ru = 'Необходимо выбрать область поиска дублей'"); - ПоказатьПредупреждение(, ТекстПредупреждения); -КонецПроцедуры - -&НаКлиенте -Процедура ШагПоискНеВыполнялсяПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// 1. Длительный поиск - -&НаКлиенте -Процедура ШагВыполнениеПоискаПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Если Не ЭтоАдресВременногоХранилища(АдресСхемыКомпоновки) Тогда - Возврат; // Не инициализировано. - КонецЕсли; - Элементы.Шапка.Доступность = Ложь; - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Истина; - НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновыйПоискДублей"; - ЗапуститьФоновоеЗаданиеКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыполнениеПоискаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Закрыть(); -КонецПроцедуры - -// 2. Обработка результатов поиска, выбор основных элементов. - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Элементы.Шапка.Доступность = Истина; - Элементы.ПовторитьПоиск.Видимость = Истина; - РазвернутьГруппуДублейИерархически(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Элементы.ПовторитьПоиск.Видимость = Ложь; - ЗавершитьШагМастера(ПараметрыШага); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыборОсновногоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// 3. Длительное удаление - -&НаКлиенте -Процедура ШагВыполнениеУдаленияПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Элементы.Шапка.Доступность = Ложь; - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Истина; - НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновоеУдалениеДублей"; - ЗапуститьФоновоеЗаданиеКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ШагВыполнениеУдаленияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; - Закрыть(); -КонецПроцедуры - -// 4. Успешное удаление - -&НаКлиенте -Процедура ШагУспешноеУдалениеПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - Элементы.Шапка.Доступность = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ШагУспешноеУдалениеПередДействиемНазад(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - // Переход на начало для работы с новыми параметрами. - ПерейтиНаШагМастера(Элементы.ШагПоискНеВыполнялся); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагУспешноеУдалениеПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// 5. Неполное удаление - -&НаКлиенте -Процедура ШагНеудачныеЗаменыПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - Элементы.Шапка.Доступность = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ШагНеудачныеЗаменыПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - // Повторяем удаление - ПерейтиНаШагМастера(Элементы.ШагВыполнениеУдаления); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагНеудачныеЗаменыПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// 6. Дублей не найдено - -&НаКлиенте -Процедура ШагДублейНеНайденоПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - Элементы.Шапка.Доступность = Истина; - -КонецПроцедуры - -&НаКлиенте -Процедура ШагДублейНеНайденоПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - ПерейтиНаШагМастера(Элементы.ШагВыполнениеПоиска); // Повторный поиск. - -КонецПроцедуры - -&НаКлиенте -Процедура ШагДублейНеНайденоПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -// 7. Ошибки выполнения. - -&НаКлиенте -Процедура ШагВозниклаОшибкаПриАктивации(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - - Элементы.Шапка.Доступность = Истина; - Элементы.СсылкаПодробнее.Видимость = ЗначениеЗаполнено(Элементы.СсылкаПодробнее.Подсказка); - -КонецПроцедуры - -&НаКлиенте -Процедура ШагВозниклаОшибкаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт - Закрыть(); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Блок мастера - -// Для встраивания функционала мастера необходимо: -// -// 1) Нарисовать на форме группу, содержащую страницы помощника. -// 2) Определить на форме три команды для действий "Далее", "Назад", "Отмена". Определить им обработчики как: -// -// &НаКлиенте -// Процедура ШагМастераНазад(Команда) -// ШагМастера("Назад"); -// КонецПроцедуры -// -// &НаКлиенте -// Процедура ШагМастераДалее(Команда) -// ШагМастера("Далее"); -// КонецПроцедуры -// -// &НаКлиенте -// Процедура ШагМастераОтмена(Команда) -// ШагМастера("Отмена"); -// КонецПроцедуры -// -// 3) Добавить блок методов пошагового помощника. -// -// 4) В коде на сервере: -// - Инициализировать структуры помощника вызовом "ИнициализироватьМастер", передав туда соответствующие -// элементы формы. -// -// - Создать сценарий работы последовательным вызовами "ДобавитьШагМастера". Рекомендуется использовать -// вспомогательные функции "ДействиеШагаМастера" и "КнопкаШагаМастера". Например: -// -// ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента, -// ДействиеШагаМастера("ПриАктивации", "ШагВыборЦелевогоЭлементаПриАктивации", -// ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборЦелевогоЭлементаПередДействиемДалее", -// ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборЦелевогоЭлементаПередДействиемОтмена", -// ))), -// КнопкиМастера() -// ); -// -// 5) В коде на клиенте (обычно при открытии): -// - Указать начальную страницу мастера при помощи вызова "УстановитьНачальнуюСтраницуМастера". -// - Запустить начальную страницу вызовом "ЗапуститьРаботуМастера". -// - -&НаСервере -Функция ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена) - // Инициализирует структуры мастера. - // - // Параметры: - // ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера. - // КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее". - // КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад". - // КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена". - Результат = Новый Структура; - - Результат.Вставить("Шаги", Новый Массив); - Результат.Вставить("НомерТекущегоШага", 0); - Результат.Вставить("СтраницаСтарта", Неопределено); - - // Идентификаторы частей интерфейса. - Результат.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя); - Результат.Вставить("КнопкаДалее", КнопкаДалее.Имя); - Результат.Вставить("КнопкаНазад", КнопкаНазад.Имя); - Результат.Вставить("КнопкаОтмена", КнопкаОтмена.Имя); - - // Для обработки длительных операций. - Результат.Вставить("ИмяПроцедуры"); - Результат.Вставить("ПоказатьДиалогПередЗакрытием", Ложь); - - Возврат Результат; -КонецФункции - -// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. -// -// Параметры: -// -// Страница - ГруппаФормы - Группа-страница, содержащая элементы текущего шага страницы. -// -// Действия - Структура - Описание действий, возможных на текущем шаге. Поля структуры: -// -// * ПриАктивации - Строка - Необязательное имя процедуры, которая будет выполнена перед активацией -// страницы с двумя параметрами: -// <Страница> - ГруппаФормы - группа-страница, которая активизируется. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемДалее - Строка - Необязательное имя процедуры, которая будет выполнена при нажатии кнопки -// "Далее", перед переходом на следующую страницу. Процедура будет вызвана с -// двумя параметрами: -// <ПараметрыШага> - служебный реквизит. При успешном завершении цепочки -// немодальных вызовов последняя процедура-обработчик -// должна произвести вызов. -// ЗавершитьШагМастера(ПараметрыШага), подтверждая -// действие. -// <ДополнительныеПараметры> - Неопределено -// -// * ПередДействиемНазад - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Назад". -// -// * ПередДействиемОтмена - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки -// "Отмена". -// -// Кнопки - Структура - описание кнопок на текущем шаге. Поля структуры: -// -// * Далее - Структура - Описание кнопки "Далее". поля: Заголовок, Подсказка, Доступность, Видимость, -// КнопкаПоУмолчанию. -// Пустая подсказка заменяется на заголовок. По умолчанию будут использованы значения: -// Заголовок = "Далее >", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Истина; -// -// * Назад - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "< Назад", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// * Отмена - Структура - Аналогично кнопке "Далее", значения по умолчанию: -// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; -// -// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера", -// "ДействиеШагаМастера", "КнопкаШагаМастера". -// -&НаСервере -Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки) - - // Умолчания - ОписаниеШага = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - - ОписаниеШага.Вставить("Страница", Страница.Имя); - - // Устанавливаем действия - ЗаполнитьЗначенияСвойств(ОписаниеШага, Действия); - - // Регистрация описаний кнопок. - Для Каждого КлючИЗначение Из Кнопки Цикл - ИмяКнопки = КлючИЗначение.Ключ; - ОписаниеКнопки = КлючИЗначение.Значение; - // Дозаполнение вторичных свойств. - Если Не ОписаниеКнопки.Видимость Тогда - ОписаниеКнопки.Доступность = Ложь; - ОписаниеКнопки.КнопкаПоУмолчанию = Ложь; - Иначе - Если Не ЗначениеЗаполнено(ОписаниеКнопки.Подсказка) Тогда - ОписаниеКнопки.Подсказка = ОписаниеКнопки.Заголовок; - КонецЕсли; - КонецЕсли; - // Регистрация с префиксом "Кнопка". - ОписаниеШага.Вставить("Кнопка" + ИмяКнопки, ОписаниеКнопки); - КонецЦикла; - - НастройкиПошаговогоМастера.Шаги.Добавить(ОписаниеШага); -КонецПроцедуры - -// Вспомогательное формирование структуры, описывающей действие. -// -// Параметры: -// Идентификатор - Строка - Идентификатор действия, см описание метода "ДобавитьШагМастера". -// ИмяОбработчика - Строка - Имя процедуры, см описание метода "ДобавитьШагМастера". -// СлужебныеДанные - Структура - Накапливает значения. -// -// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями. -&НаСервере -Функция ДействиеШагаМастера(Знач Идентификатор, Знач ИмяОбработчика, СлужебныеДанные = Неопределено) - Если СлужебныеДанные = Неопределено Тогда - СлужебныеДанные = Новый Структура; - КонецЕсли; - СлужебныеДанные.Вставить(Идентификатор, ИмяОбработчика);; - Возврат СлужебныеДанные; -КонецФункции - -// Вспомогательное формирование структуры, описывающей кнопки мастера. -// -// Возвращаемое значение: -// Структура - Кнопки мастера. -// * Назад - Структура - Описание кнопки Назад, сформированное методом КнопкаМастера(). -// * Далее - Структура - Описание кнопки Далее, сформированное методом КнопкаМастера(). -// * Отмена - Структура - Описание кнопки Отмена, сформированное методом КнопкаМастера(). -// -&НаСервере -Функция КнопкиМастера() - Результат = Новый Структура("Далее, Назад, Отмена", КнопкаМастера(), КнопкаМастера(), КнопкаМастера()); - Результат.Далее.КнопкаПоУмолчанию = Истина; - Результат.Далее.Заголовок = НСтр("ru='Далее >'"); - Результат.Назад.Заголовок = НСтр("ru='< Назад'"); - Результат.Отмена.Заголовок = НСтр("ru='Отмена'"); - Возврат Результат; -КонецФункции - -// Описание настроек кнопки мастера. -// -// Возвращаемое значение: -// Структура - Настройки кнопки формы. -// * Заголовок - Строка - Заголовок кнопки. -// * Подсказка - Строка - Подсказка для кнопки. -// * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. -// * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. -// * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: -// Ложь. -// -// См. также: -// "КнопкаФормы" в синтакс-помощнике. -// -&НаСервере -Функция КнопкаМастера() - Результат = Новый Структура; - Результат.Вставить("Заголовок", ""); - Результат.Вставить("Подсказка", ""); - - Результат.Вставить("Доступность", Истина); - Результат.Вставить("Видимость", Истина); - Результат.Вставить("КнопкаПоУмолчанию", Ложь); - - Возврат Результат; -КонецФункции - -// Устанавливает начальную страницу для первого запуска мастера. -// -// Параметры: -// СтартоваяСтраница - Число, Строка, ГруппаФормы - Номер шага, группа-страница, или ее идентификатор. -// -&НаКлиенте -Процедура УстановитьНачальнуюСтраницуМастера(Знач Страница) - - НастройкиПошаговогоМастера.СтраницаСтарта = НомерШагаМастераПоИдентификатору(Страница); - -КонецПроцедуры - -// Запускает начальную работу мастера с шага, установленного предварительно при помощи -// "УстановитьНачальнуюСтраницуМастера". -&НаКлиенте -Процедура ЗапуститьРаботуМастера() - - Если НастройкиПошаговогоМастера.СтраницаСтарта = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Перед запуском мастера должна быть установлена начальная страница.'"); - - ИначеЕсли НастройкиПошаговогоМастера.СтраницаСтарта = -1 Тогда - // Разогрев. Проверяем наличие обработчиков действий у всех шагов. - ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена"); - Для Каждого ОписаниеШага Из НастройкиПошаговогоМастера.Шаги Цикл - Для Каждого КлючЗначение Из ВозможныеДействия Цикл - ИмяДействия = КлючЗначение.Ключ; - ИмяОбработчика = ОписаниеШага[ИмяДействия]; - Если Не ПустаяСтрока(ИмяОбработчика) Тогда - Попытка - Тест = Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект); - Исключение - Текст = НСтр("ru = 'Ошибка создания обработчика события %1 для страницы %2, не определена процедура %3'"); - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяДействия, ОписаниеШага.Страница, ИмяОбработчика); - ВызватьИсключение Текст; - КонецПопытки; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - // Фактический запуск - ПерейтиНаШагМастера(НастройкиПошаговогоМастера.НомерТекущегоШага); - Иначе - // По умолчанию все отключено - Элементы[НастройкиПошаговогоМастера.КнопкаДалее].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаНазад].Видимость = Ложь; - Элементы[НастройкиПошаговогоМастера.КнопкаОтмена].Видимость = Ложь; - - // Отложенный запуск - НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиПошаговогоМастера.СтраницаСтарта; - НастройкиПошаговогоМастера.СтраницаСтарта = -1; - ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина); - КонецЕсли; -КонецПроцедуры - -// Выполняет переключение мастера на следующую или предыдущую страницу. -// -// Параметры: -// КодКоманды - Строка - Идентификатор действия, может принимать значения "Далее", "Назад" или "Отмена". -// -&НаКлиенте -Процедура ШагМастера(Знач КодКоманды) - - Если КодКоманды = "Далее" Тогда - Направление = 1; - ИначеЕсли КодКоманды = "Назад" Тогда - Направление = -1; - ИначеЕсли КодКоманды = "Отмена" Тогда - Направление = 0; - Иначе - ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'"); - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // Отрабатываем уход с текущей страницы. - Если Направление = 1 Тогда - Действие = ОписаниеШага.ПередДействиемДалее; - - ИначеЕсли Направление = -1 Тогда - Действие = ОписаниеШага.ПередДействиемНазад; - - Иначе - Действие = ОписаниеШага.ПередДействиемОтмена; - - КонецЕсли; - - Если ПустаяСтрока(Действие) Тогда - ЗавершитьШагМастера(Направление); - Иначе - Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Направление); - КонецЕсли; -КонецПроцедуры - -// Выполняет безусловное позиционирование мастера на страницу. -// -// Параметры: -// ИдентификаторШага - Число, Строка, ГруппаФормы - Номер, группа-страница формы или ее имя для перехода. -// ИнициироватьСобытия - Булево - Флаг того, что необходимо вызывать события, связанные с активацией шага. -// -&НаКлиенте -Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Истина) - СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага); - Если СледующийШаг = Неопределено Тогда - Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг помощника %1'"), ИдентификаторШага); - ВызватьИсключение Ошибка; - КонецЕсли; - - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - - // И запускаем новую страницу - ШагМастераЗавершениеБезусловно(СледующийШаг, ИнициироватьСобытия); -КонецПроцедуры - -// Подтверждает действие шага мастера и вызывает переключение страницы. -// -// Параметры: -// ПараметрыШага - Служебный реквизит, полученный в обработчике перед началом действия. -// -&НаКлиенте -Процедура ЗавершитьШагМастера(Знач ПараметрыШага) - СледующийШаг = НастройкиПошаговогоМастера.НомерТекущегоШага + ПараметрыШага; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - Если ПараметрыШага = 0 Тогда - // Подтверждение отмены - ничего не делаем. - Возврат; - - ИначеЕсли ПараметрыШага = 1 И СледующийШаг > ПоследнийШаг Тогда - // Попытка сделать шаг за пределы вперед. - ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); - - ИначеЕсли ПараметрыШага = -1 И СледующийШаг < 0 Тогда - // Попытка сделать шаг за пределы назад. - ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); - - КонецЕсли; - - ШагМастераЗавершениеБезусловно(СледующийШаг); -КонецПроцедуры - -&НаКлиенте -Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина) - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[СледующийШаг]; - ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница(); - - // Переключаем на новую страницу. - Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница]; - - // Обновляем кнопки - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад); - ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена); - - // Успешно перешли - НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг; - - Если ИнициироватьСобытия И Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - // Отрабатываем "ПриАктивации" новой страницы, он же запустит ожидание. - ПодключитьОбработчикОжидания("ОбработкаАктивацииСтраницыМастера", 0.1, Истина); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьСвойстваКнопкиМастера(Знач ИмяКнопки, Знач Описание) - - КнопкаМастера = Элементы[ИмяКнопки]; - ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); - КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаАктивацииСтраницыМастера() - ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага]; - Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда - Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект); - ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]); - КонецЕсли; -КонецПроцедуры - -// Может быть номер шага или группа-страница, или ее идентификатор. -&НаКлиенте -Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага) - ТипПараметра = ТипЗнч(ИдентификаторШага); - Если ТипПараметра = Тип("Число") Тогда - Возврат ИдентификаторШага; - КонецЕсли; - - ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага); - Для НомерШага=0 По НастройкиПошаговогоМастера.Шаги.ВГраница() Цикл - Если НастройкиПошаговогоМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда - Возврат НомерШага; - КонецЕсли; - КонецЦикла; - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден шаг ""%1"".'"), ИмяПоиска); -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Работа с длительными операциями @@ -1766,88 +1422,54 @@ &НаСервере Функция ЗапуститьФоновоеЗадание() - // Определение параметров запуска. - ИмяМетода = "ДлительныеОперации.ВыполнитьКомандуОтчетаИлиОбработки"; - ПараметрыМетода = Новый Структура; - ПараметрыМетода.Вставить("ПолноеИмяОбъекта", "Обработка.ПоискИУдалениеДублей"); - ПараметрыМетода.Вставить("ИмяПроцедуры", НастройкиПошаговогоМастера.ИмяПроцедуры); + ПараметрыПроцедуры = Новый Структура; + ПараметрыПроцедуры.Вставить("УчитыватьПрикладныеПравила", УчитыватьПрикладныеПравила); - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ШагВыполнениеПоиска Тогда + ИмяПроцедуры = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя() + ".МодульОбъекта.ФоновыйПоискДублей"; НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Поиск дублей'"); - - ПараметрыМетода.Вставить("ОбластьПоискаДублей", ОбластьПоискаДублей); - ПараметрыМетода.Вставить("МаксимальноеЧислоДублей", 1500); - - Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда - ПараметрыМетода.МаксимальноеЧислоДублей = 50; - КонецЕсли; - + ПараметрыПроцедуры.Вставить("ОбластьПоискаДублей", ОбластьПоискаДублей); + ПараметрыПроцедуры.Вставить("МаксимальноеЧислоДублей", 1500); МассивПравилПоиска = Новый Массив; Для Каждого Правило Из ПравилаПоиска Цикл МассивПравилПоиска.Добавить(Новый Структура("Реквизит, Правило", Правило.Реквизит, Правило.Правило)); КонецЦикла; - ПараметрыМетода.Вставить("ПравилаПоиска", МассивПравилПоиска); + ПараметрыПроцедуры.Вставить("ПравилаПоиска", МассивПравилПоиска); + ПараметрыПроцедуры.Вставить("СхемаКомпоновки", ПолучитьИзВременногоХранилища(АдресСхемыКомпоновки)); + ПараметрыПроцедуры.Вставить("НастройкиКомпоновщикаПредварительногоОтбора", КомпоновщикПредварительногоОтбора.Настройки); - ПараметрыМетода.Вставить("УчитыватьПрикладныеПравила", УчитыватьПрикладныеПравила); - - // В качестве схемы компоновки передаем схему, будет использован отдельный фоновый сеанс. - ПараметрыМетода.Вставить("СхемаКомпоновки", ПолучитьИзВременногоХранилища(АдресСхемыКомпоновки)); - ПараметрыМетода.Вставить("НастройкиКомпоновщикаПредварительногоОтбора", КомпоновщикПредварительногоОтбора.Настройки); - - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда + ИмяПроцедуры = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя() + ".МодульОбъекта.ФоновоеУдалениеДублей"; НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Удаление дублей'"); - - ПараметрыМетода.Вставить("СпособУдаления", "Пометка"); - ПараметрыМетода.Вставить("ПарыЗамен", ПарыЗаменДублей()); - ПараметрыМетода.Вставить("УчитыватьПрикладныеПравила", УчитыватьПрикладныеПравила); + ПараметрыПроцедуры.Вставить("СпособУдаления", "Пометка"); + ПараметрыПроцедуры.Вставить("ПарыЗамен", ПарыЗаменДублей()); Иначе - - Возврат Ложь; - + ВызватьИсключение НСтр("ru = 'Некорректное имя процедуры.'"); КонецЕсли; НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); НастройкиЗапуска.НаименованиеФоновогоЗадания = НаименованиеМетода; - Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяМетода, ПараметрыМетода, НастройкиЗапуска); + Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска); КонецФункции &НаКлиенте Процедура ПослеЗавершенияФоновогоЗадания(Задание, ДополнительныеПараметры) Экспорт - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; Активизировать(); - Если Задание.Статус = "Выполнено" Тогда - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда - ВсегоНайденоДублей = ЗаполнитьРезультатыПоискаДублей(Задание.АдресРезультата); - Если ВсегоНайденоДублей > 0 Тогда - // Найдены дубли. - ШагМастера("Далее"); - ИначеЕсли ВсегоНайденоДублей < 0 Тогда - // Возникла ошибка (вероятно, найдено слишком много дублей). - ПерейтиНаШагМастера(Элементы.ШагВозниклаОшибка); - Иначе - // Дублей по текущим установкам не найдено. - ПерейтиНаШагМастера(Элементы.ШагДублейНеНайдено); - КонецЕсли; - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда - Успех = ЗаполнитьРезультатыУдаленияДублей(Задание.АдресРезультата); - Если Успех = Истина Тогда - // Заменены все группы дублей. - ШагМастера("Далее"); - Иначе - // Не все места использования удалось заменить. - ПерейтиНаШагМастера(Элементы.ШагНеудачныеЗамены); - КонецЕсли; - КонецЕсли; - Иначе + ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница; + + Если Задание.Статус <> "Выполнено" Тогда // Фоновое задание завершено с ошибкой. - Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда + Если ТекущаяСтраница = Элементы.ШагВыполнениеПоиска Тогда Кратко = НСтр("ru = 'При поиске дублей возникла ошибка:'"); - ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда Кратко = НСтр("ru = 'При удалении дублей возникла ошибка:'"); КонецЕсли; Кратко = Кратко + Символы.ПС + Задание.КраткоеПредставлениеОшибки; @@ -1855,7 +1477,32 @@ Элементы.НадписьТекстОшибки.Заголовок = Кратко; Элементы.СсылкаПодробнее.Подсказка = Подробно; ПерейтиНаШагМастера(Элементы.ШагВозниклаОшибка); + Возврат; КонецЕсли; + + Если ТекущаяСтраница = Элементы.ШагВыполнениеПоиска Тогда + ВсегоНайденоДублей = ЗаполнитьРезультатыПоискаДублей(Задание.АдресРезультата); + Если ВсегоНайденоДублей > 0 Тогда + // Найдены дубли. + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + ИначеЕсли ВсегоНайденоДублей < 0 Тогда + // Возникла ошибка (вероятно, найдено слишком много дублей). + ПерейтиНаШагМастера(Элементы.ШагВозниклаОшибка); + Иначе + // Дублей по текущим установкам не найдено. + ПерейтиНаШагМастера(Элементы.ШагДублейНеНайдено); + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Элементы.ШагВыполнениеУдаления Тогда + Успех = ЗаполнитьРезультатыУдаленияДублей(Задание.АдресРезультата); + Если Успех = Истина Тогда + // Заменены все группы дублей. + ПерейтиНаШагМастера(НастройкиМастера.ТекущийШаг.Индекс + 1); + Иначе + // Не все места использования удалось заменить. + ПерейтиНаШагМастера(Элементы.ШагНеудачныеЗамены); + КонецЕсли; + КонецЕсли; + КонецПроцедуры &НаСервере @@ -2053,11 +1700,48 @@ &НаКлиенте Процедура ПослеПодтвержденияОтменыЗадания(Ответ, ПараметрыВыполнения) Экспорт - Если Ответ = КодВозвратаДиалога.Прервать - И НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием Тогда - НастройкиПошаговогоМастера.ПоказатьДиалогПередЗакрытием = Ложь; + Если Ответ = КодВозвратаДиалога.Прервать Тогда + НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции мастера + +&НаКлиентеНаСервереБезКонтекста +Функция КнопкаМастера() + // Описание настроек кнопки мастера. + // + // Возвращаемое значение: + // Структура - Настройки кнопки формы. + // * Заголовок - Строка - Заголовок кнопки. + // * Подсказка - Строка - Подсказка для кнопки. + // * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина. + // * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина. + // * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию: + // Ложь. + // + // См. также: + // "КнопкаФормы" в синтакс-помощнике. + // + Результат = Новый Структура; + Результат.Вставить("Заголовок", ""); + Результат.Вставить("Подсказка", ""); + + Результат.Вставить("Доступность", Истина); + Результат.Вставить("Видимость", Истина); + Результат.Вставить("КнопкаПоУмолчанию", Ложь); + + Возврат Результат; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьСвойстваКнопкиМастера(КнопкаМастера, Описание) + + ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); + КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form index 4b06da789..5c42c54ad 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form @@ -7,6 +7,10 @@ КомпоновщикПредварительногоОтбораНастройкиОтбор 1 + + <key>ru</key> + <value>Компоновщик предварительного отбора настройки отбор</value> + true true @@ -131,9 +135,6 @@ true true true - None - None - None true All false @@ -233,10 +234,6 @@ ru Форма группа справки - - ru - Форма группа справки - ФормаГруппаСправкиРасширеннаяПодсказка 12 diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form index a5a88227e..86ea12eb8 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form @@ -3,6 +3,10 @@ ПравилаПоиска 20 + + <key>ru</key> + <value>Правила поиска</value> + true true @@ -99,6 +103,10 @@ true + + <key>ru</key> + <value>Правила поиска группа 1</value> + ПравилаПоискаГруппа1РасширеннаяПодсказка 47 @@ -290,9 +298,6 @@ true true true - None - None - None true @@ -391,12 +396,8 @@ <key>ru</key> - <value>Группа прикладных ограничений</value> + <value>Прикладных ограничений</value> - - ru - Группа прикладных ограничений - ГруппаПрикладныхОграниченийРасширеннаяПодсказка 36 @@ -512,10 +513,6 @@ ru Форма группа справка - - ru - Форма группа справка - ФормаГруппаСправкаРасширеннаяПодсказка 15 diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl index 7ca321748..7d91a6983 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl @@ -31,56 +31,6 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ИмяОбластиПоискаДанных); КонецФункции -// Обработчик фонового поиска дублей. -// -// Параметры: -// Параметры - Структура - Данные для анализа. -// АдресРезультата - Строка - Адрес во временном хранилище для сохранения результата. -// -Процедура ФоновыйПоискДублей(Знач Параметры, Знач АдресРезультата) Экспорт - - // Собираем компоновщик повторно через схему и настройки. - КомпоновщикПредварительногоОтбора = Новый КомпоновщикНастроекКомпоновкиДанных; - - КомпоновщикПредварительногоОтбора.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(Параметры.СхемаКомпоновки) ); - КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(Параметры.НастройкиКомпоновщикаПредварительногоОтбора); - - Параметры.Вставить("КомпоновщикПредварительногоОтбора", КомпоновщикПредварительногоОтбора); - - // Преобразуем правила поиска в таблицу значений с индексом. - ПравилаПоиска = Новый ТаблицаЗначений; - ПравилаПоиска.Колонки.Добавить("Реквизит", Новый ОписаниеТипов("Строка") ); - ПравилаПоиска.Колонки.Добавить("Правило", Новый ОписаниеТипов("Строка") ); - ПравилаПоиска.Индексы.Добавить("Реквизит"); - - Для Каждого Правило Из Параметры.ПравилаПоиска Цикл - ЗаполнитьЗначенияСвойств(ПравилаПоиска.Добавить(), Правило); - КонецЦикла; - Параметры.Вставить("ПравилаПоиска", ПравилаПоиска); - - Параметры.Вставить("РассчитыватьМестаИспользования", Истина); - - // Запускаем поиск - ПоместитьВоВременноеХранилище(ГруппыДублей(Параметры), АдресРезультата); -КонецПроцедуры - -// Обработчик фонового удаления дублей. -// -// Параметры: -// Параметры - Структура - Данные для анализа. -// АдресРезультата - Строка - Адрес во временном хранилище для сохранения результата. -// -Процедура ФоновоеУдалениеДублей(Знач Параметры, Знач АдресРезультата) Экспорт - - ПараметрыЗамены = Новый Структура; - ПараметрыЗамены.Вставить("СпособУдаления", Параметры.СпособУдаления); - ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина); - ПараметрыЗамены.Вставить("УчитыватьПрикладныеПравила", Параметры.УчитыватьПрикладныеПравила); - - ЗаменитьСсылки(Параметры.ПарыЗамен, ПараметрыЗамены, АдресРезультата); - -КонецПроцедуры - // Непосредственный поиск дублей. // // Параметры: @@ -93,7 +43,8 @@ // ** Ссылка - Произвольный - Ссылка элемента. // ** Код - Произвольный - Код элемента. // ** Наименование - Произвольный - Наименование элемента. -// ** Родитель - Произвольный - Родитель группы дублей. Если Родитель пустой, то элемент является родителем группы дублей. +// ** Родитель - Произвольный - Родитель группы дублей. Если Родитель пустой, то элемент является +// родителем группы дублей. // ** <Другие поля> - Произвольный - Значение соответствующего полей отборов и критериев сравнения дублей. // * ОписаниеОшибки - Неопределено - Ошибки не возникло. // - Строка - Описание ошибки, возникшей в процессе поиска дублей. @@ -270,6 +221,13 @@ ЭлементОтбораКД.ПравоеЗначение = Ложь; КонецЕсли; + Если ОбъектМетаданных = Метаданные.Справочники.Пользователи Тогда + ЭлементОтбораКД = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораКД.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Служебный"); + ЭлементОтбораКД.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораКД.ПравоеЗначение = Ложь; + КонецЕсли; + // Структура. НастройкиКД.Структура.Очистить(); ГруппировкаКД = НастройкиКД.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); @@ -281,7 +239,7 @@ Выборка1 = ИнициализироватьВыборкуКД(СхемаКД, КомпоновщикНастроекКД.ПолучитьНастройки()); Иначе ТаблицаЗначений = ОбъектВТаблицуЗначений(ЭталонныйОбъект, РасшифровкаДополнительныхПолей); - Если Не ЕстьКод Тогда + Если Не ЕстьКод И Не ЕстьНомер Тогда ТаблицаЗначений.Колонки.Добавить("Код", Новый ОписаниеТипов("Неопределено")); КонецЕсли; Выборка1 = ИнициализироватьВыборкуТЗ(ТаблицаЗначений); @@ -374,10 +332,6 @@ Продолжить; КонецЕсли; СтрокаТаблицы2 = Таблица2.Получить(ИндексСтроки); - Если ТаблицаДублей.Найти(СтрокаТаблицы2.Ссылка, "Ссылка") <> Неопределено Тогда - Продолжить; - КонецЕсли; - Если ИспользоватьПрикладныеПравила Тогда // Наполняем таблицу для прикладных правил, вызываем их, если пора. ДобавитьСтрокуКандидатов(ТаблицаКандидатов, СтрокаТаблицы1, СтрокаТаблицы2, СтруктураПолей); @@ -386,6 +340,7 @@ ТаблицаКандидатов.Очистить(); КонецЕсли; Иначе + // Это дубли. ДобавитьДубльВРезультат(ТаблицаДублей, СтрокаТаблицы1, СтрокаТаблицы2, СтруктураПолей); КонецЕсли; КонецЦикла; @@ -393,12 +348,6 @@ КонецЦикла; Иначе Для Каждого СтрокаТаблицы2 Из Таблица2 Цикл - // Если мы его уже посчитали дублем в какой-то группе, то не трогаем. - Если ТаблицаДублей.Найти(СтрокаТаблицы2.Ссылка, "Ссылка") <> Неопределено Тогда - Продолжить; - КонецЕсли; - - // Проигрываем правила подобия для строк. Если ИспользоватьПрикладныеПравила Тогда // Наполняем таблицу для прикладных правил, вызываем их, если пора. ДобавитьСтрокуКандидатов(ТаблицаКандидатов, СтрокаТаблицы1, СтрокаТаблицы2, СтруктураПолей); @@ -407,6 +356,7 @@ ТаблицаКандидатов.Очистить(); КонецЕсли; Иначе + // Это дубли. ДобавитьДубльВРезультат(ТаблицаДублей, СтрокаТаблицы1, СтрокаТаблицы2, СтруктураПолей); КонецЕсли; КонецЦикла; @@ -479,29 +429,60 @@ КонецФункции -// Интерфейс для выполнения команд обработки. -Процедура ВыполнитьКоманду(ПараметрыВыполнения, АдресРезультата) Экспорт +// Обработчик фонового поиска дублей. +// +// Параметры: +// Параметры - Структура - Данные для анализа. +// АдресРезультата - Строка - Адрес во временном хранилище для сохранения результата. +// +Процедура ФоновыйПоискДублей(Знач Параметры, Знач АдресРезультата) Экспорт - Если ПараметрыВыполнения.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда - - ФоновыйПоискДублей(ПараметрыВыполнения, АдресРезультата); - - ИначеЕсли ПараметрыВыполнения.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда - - ФоновоеУдалениеДублей(ПараметрыВыполнения, АдресРезультата); - - Иначе - - ВызватьИсключение НСтр("ru = 'Поиск и удаление дублей: Команда ""%1"" не поддерживается.'"); - - КонецЕсли; + // Собираем компоновщик повторно через схему и настройки. + КомпоновщикПредварительногоОтбора = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикПредварительногоОтбора.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(Параметры.СхемаКомпоновки) ); + КомпоновщикПредварительногоОтбора.ЗагрузитьНастройки(Параметры.НастройкиКомпоновщикаПредварительногоОтбора); + + Параметры.Вставить("КомпоновщикПредварительногоОтбора", КомпоновщикПредварительногоОтбора); + + // Преобразуем правила поиска в таблицу значений с индексом. + ПравилаПоиска = Новый ТаблицаЗначений; + ПравилаПоиска.Колонки.Добавить("Реквизит", Новый ОписаниеТипов("Строка") ); + ПравилаПоиска.Колонки.Добавить("Правило", Новый ОписаниеТипов("Строка") ); + ПравилаПоиска.Индексы.Добавить("Реквизит"); + + Для Каждого Правило Из Параметры.ПравилаПоиска Цикл + ЗаполнитьЗначенияСвойств(ПравилаПоиска.Добавить(), Правило); + КонецЦикла; + Параметры.Вставить("ПравилаПоиска", ПравилаПоиска); + + Параметры.Вставить("РассчитыватьМестаИспользования", Истина); + + // Запускаем поиск + ПоместитьВоВременноеХранилище(ГруппыДублей(Параметры), АдресРезультата); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Обработчик фонового удаления дублей. +// +// Параметры: +// Параметры - Структура - Данные для анализа. +// АдресРезультата - Строка - Адрес во временном хранилище для сохранения результата. +// +Процедура ФоновоеУдалениеДублей(Знач Параметры, Знач АдресРезультата) Экспорт + + ПараметрыЗамены = Новый Структура; + ПараметрыЗамены.Вставить("СпособУдаления", Параметры.СпособУдаления); + ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина); + ПараметрыЗамены.Вставить("УчитыватьПрикладныеПравила", Параметры.УчитыватьПрикладныеПравила); + + ЗаменитьСсылки(Параметры.ПарыЗамен, ПараметрыЗамены, АдресРезультата); + +КонецПроцедуры + // Преобразуем объект в таблицу для помещения в запрос. Функция ОбъектВТаблицуЗначений(Знач ОбъектДанных, Знач РасшифровкаДополнительныхПолей) Результат = Новый ТаблицаЗначений; @@ -543,7 +524,8 @@ Данные1 = Новый Структура; Данные2 = Новый Структура; - Для Каждого ПараКандидатов Из ТаблицаКандидатов.НайтиСтроки(Новый Структура("ЭтоДубли", Истина)) Цикл + Найденные = ТаблицаКандидатов.НайтиСтроки(Новый Структура("ЭтоДубли", Истина)); + Для Каждого ПараКандидатов Из Найденные Цикл Данные1.Вставить("Ссылка", ПараКандидатов.Ссылка1); Данные1.Вставить("Код", ПараКандидатов.Поля1.Код); Данные1.Вставить("Наименование", ПараКандидатов.Поля1.Наименование); @@ -604,29 +586,42 @@ // Добавляем в дерево результатов найденный вариант. // -Процедура ДобавитьДубльВРезультат(Результат, Знач ДанныеОсновногоЭлемента, Знач ДанныеКандидата, Знач СтруктураПолей) +Процедура ДобавитьДубльВРезультат(ТаблицаДублей, Знач СтрокаТаблицы1, Знач СтрокаТаблицы2, Знач СтруктураПолей) + // Определить какой элемент уже добавлен в дубли. + СтрокаДублей1 = ТаблицаДублей.Найти(СтрокаТаблицы1.Ссылка, "Ссылка"); + СтрокаДублей2 = ТаблицаДублей.Найти(СтрокаТаблицы2.Ссылка, "Ссылка"); + Дубль1Зарегистрирован = (СтрокаДублей1 <> Неопределено); + Дубль2Зарегистрирован = (СтрокаДублей2 <> Неопределено); - ФильтрГруппы = Новый Структура("Ссылка, Родитель", ДанныеОсновногоЭлемента.Ссылка); - ГруппаДублей = Результат.НайтиСтроки(ФильтрГруппы); - - Если ГруппаДублей.Количество() = 0 Тогда - ГруппаДублей = Результат.Добавить(); - ЗаполнитьЗначенияСвойств(ГруппаДублей, ФильтрГруппы); - - СтрокаДублей = Результат.Добавить(); - СписокСвойств = "Ссылка, Код, Наименование," + СтруктураПолей.СписокПолейИдентичности + "," + СтруктураПолей.СписокПолейПодобия; - ЗаполнитьЗначенияСвойств(СтрокаДублей, ДанныеОсновногоЭлемента, СписокСвойств); - - СтрокаДублей.Родитель = ГруппаДублей.Ссылка; - Иначе - ГруппаДублей = ГруппаДублей[0]; + // Если оба элемента добавлены в дубли, то ничего делать не надо. + Если Дубль1Зарегистрирован И Дубль2Зарегистрирован Тогда + Возврат; КонецЕсли; - СтрокаДублей = Результат.Добавить(); - СписокСвойств = "Ссылка, Код, Наименование," + СтруктураПолей.СписокПолейИдентичности + "," + СтруктураПолей.СписокПолейПодобия; - ЗаполнитьЗначенияСвойств(СтрокаДублей, ДанныеКандидата, СписокСвойств); + // Перед регистрацией дубля надо определить ссылку группы дублей. + Если Дубль1Зарегистрирован Тогда + СсылкаГруппыДублей = ?(ЗначениеЗаполнено(СтрокаДублей1.Родитель), СтрокаДублей1.Родитель, СтрокаДублей1.Ссылка); + ИначеЕсли Дубль2Зарегистрирован Тогда + СсылкаГруппыДублей = ?(ЗначениеЗаполнено(СтрокаДублей2.Родитель), СтрокаДублей2.Родитель, СтрокаДублей2.Ссылка); + Иначе // Регистрация группы дублей. + ГруппаДублей = ТаблицаДублей.Добавить(); + ГруппаДублей.Ссылка = СтрокаТаблицы1.Ссылка; + СсылкаГруппыДублей = ГруппаДублей.Ссылка; + КонецЕсли; - СтрокаДублей.Родитель = ГруппаДублей.Ссылка; + СписокСвойств = "Ссылка, Код, Наименование," + СтруктураПолей.СписокПолейИдентичности + "," + СтруктураПолей.СписокПолейПодобия; + + Если Не Дубль1Зарегистрирован Тогда + СтрокаДублей1 = ТаблицаДублей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаДублей1, СтрокаТаблицы1, СписокСвойств); + СтрокаДублей1.Родитель = СсылкаГруппыДублей; + КонецЕсли; + + Если Не Дубль2Зарегистрирован Тогда + СтрокаДублей2 = ТаблицаДублей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаДублей2, СтрокаТаблицы2, СписокСвойств); + СтрокаДублей2.Родитель = СсылкаГруппыДублей; + КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Настройки/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Настройки/Form.form index 17e9ba93d..516886447 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Настройки/Form.form +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Настройки/Form.form @@ -184,10 +184,6 @@ ru Еще - - ru - Команды дерева разделов - КомандыДереваРазделовРасширеннаяПодсказка 34 @@ -213,10 +209,6 @@ ru Командная панель дерева разделов - - ru - Командная панель дерева разделов - КоманднаяПанельДереваРазделовРасширеннаяПодсказка 32 @@ -239,12 +231,8 @@ <key>ru</key> - <value>Группа область поиска</value> + <value>Область поиска</value> - - ru - Группа область поиска - ГруппаОбластьПоискаРасширеннаяПодсказка 30 @@ -267,6 +255,10 @@ ДеревоРазделовПоиска 4 + + <key>ru</key> + <value>Дерево разделов поиска</value> + true true @@ -382,10 +374,6 @@ ru Дерево разделов поиска группа - - ru - Дерево разделов поиска группа - ДеревоРазделовПоискаГруппаРасширеннаяПодсказка 24 diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form index e194e2361..1775452bd 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form @@ -51,7 +51,7 @@ - Группа16 + ГруппаВариантПодключения 608 ВидТранспортаСообщенияОбменаСтрокой @@ -136,9 +136,17 @@ true + + <key>ru</key> + <value>Вариант подключения</value> + + + ru + Используемый вариант подключения + false - Группа16ExtendedTooltip + ГруппаВариантПодключенияРасширеннаяПодсказка 734 Label true @@ -201,10 +209,6 @@ ru Группа выбора вида транспорта из доступных - - ru - Группа выбор вида транспорта из доступных - true ГруппаВыборВидаТранспортаИзДоступныхExtendedTooltip @@ -226,7 +230,7 @@ - Группа2 + ГруппаПараметрыТранспорта 537 НадписьWSПароль @@ -264,7 +268,7 @@ - ГруппаПараметровТранспорта + ГруппаПараметрыТранспортаВертикальная 519 WSПароль @@ -315,122 +319,26 @@ Normal - - Группа4 - 531 - - Группа5 - 534 - - WSЗапомнитьПароль - 523 - - <key>ru</key> - <value>Запомнить</value> - - true - true - - true - - - WSЗапомнитьПароль - - Right - 1 - - WSЗапомнитьПарольExtendedTooltip - 746 - Label - true - true - - Left - - - - WSЗапомнитьПарольКонтекстноеМеню - 524 - true - - CheckBoxField - Enter - true - Left - true - - - - КаталогОбменаИнформацией - 906 - - <key>ru</key> - <value>Каталог обмена информацией</value> - - true - true - - true - - - КаталогОбменаИнформациейРасширеннаяПодсказка - 908 - Label - true - true - - Left - - - - КаталогОбменаИнформациейКонтекстноеМеню - 907 - true - - Label - true - - - Click - КаталогОбменаИнформациейНажатие - - true - Left - - - true - true - - true - - - Группа5ExtendedTooltip - 745 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - + + WSЗапомнитьПароль + 523 + + <key>ru</key> + <value>Запомнить</value> + true true true + + WSЗапомнитьПароль + + Right + 1 - Группа4ExtendedTooltip - 743 + WSЗапомнитьПарольExtendedTooltip + 746 Label true true @@ -438,13 +346,54 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + WSЗапомнитьПарольКонтекстноеМеню + 524 + true + + CheckBoxField + Enter + true + Left + true + + + + КаталогОбменаИнформацией + 906 + + <key>ru</key> + <value>Каталог обмена информацией</value> + + true + true + + true + + + КаталогОбменаИнформациейРасширеннаяПодсказка + 908 + Label + true + true + + Left + + + + КаталогОбменаИнформациейКонтекстноеМеню + 907 + true + + Label + true + + + Click + КаталогОбменаИнформациейНажатие + + true + Left true @@ -454,14 +403,10 @@ <key>ru</key> - <value>Группа параметров транспорта</value> + <value>Параметров транспорта вертикальная</value> - - ru - Группа параметров транспорта - - ГруппаПараметровТранспортаExtendedTooltip + ГруппаПараметрыТранспортаВертикальнаяРасширеннаяПодсказка 741 Label true @@ -485,9 +430,17 @@ true + + <key>ru</key> + <value>Параметры транспорта</value> + + + ru + Параметры транспорта общая группа + true - Группа2ExtendedTooltip + ГруппаПараметрыТранспортаРасширеннаяПодсказка 739 Label true @@ -514,10 +467,6 @@ ru Выбор варианта подключения - - ru - Заголовок страницы - ЗаголовокСтраницыРасширеннаяПодсказка 731 @@ -585,10 +534,6 @@ ru Страница начала - - ru - Страница начала - СтраницаНачалаExtendedTooltip 729 @@ -668,10 +613,6 @@ ru Статус сопоставления есть несопоставленные данные - - ru - Статус сопоставления есть несопоставленные данные - СтатусСопоставленияЕстьНесопоставленныеДанныеExtendedTooltip 752 @@ -769,10 +710,6 @@ ru Статус сопоставления все данные сопоставлены - - ru - Статус сопоставления все данные сопоставлены - СтатусСопоставленияВсеДанныеСопоставленыExtendedTooltip 754 @@ -798,10 +735,6 @@ ru Страницы статуса сопоставления данных - - ru - Страницы статуса сопоставления данных - СтраницыСтатусаСопоставленияДанныхРасширеннаяПодсказка 751 @@ -826,10 +759,6 @@ ru Сопоставление данных - - ru - Заголовок страницы информации статистики - ЗаголовокСтраницыИнформацииСтатистикиРасширеннаяПодсказка 910 @@ -883,7 +812,7 @@ Auto - Группа19 + ГруппаКомандаЗагрузки 727 ВыполнитьЗагрузкуДанныхДляСтроки @@ -917,8 +846,12 @@ true + + <key>ru</key> + <value>Команда загрузки</value> + - Группа19ExtendedTooltip + ГруппаКомандаЗагрузкиРасширеннаяПодсказка 759 Label true @@ -930,7 +863,7 @@ - Группа17 + ГруппаКомандыСписка 711 ВывестиСписок @@ -991,8 +924,12 @@ true + + <key>ru</key> + <value>Команды списка</value> + - Группа17ExtendedTooltip + ГруппаКомандыСпискаРасширеннаяПодсказка 761 Label true @@ -1004,7 +941,7 @@ - Группа18 + ГруппаКомандаОбновления 714 ОбновитьИнформациюСопоставленияПолностью @@ -1038,8 +975,12 @@ true + + <key>ru</key> + <value>Команда обновления</value> + - Группа18ExtendedTooltip + ГруппаКомандаОбновленияРасширеннаяПодсказка 764 Label true @@ -1059,10 +1000,6 @@ ru Командная панель таблицы статистики - - ru - Командная панель таблицы статистики - КоманднаяПанельТаблицыСтатистикиExtendedTooltip 757 @@ -1081,6 +1018,10 @@ ДеревоИнформацииСтатистики 405 + + <key>ru</key> + <value>Дерево информации статистики</value> + true true @@ -1240,10 +1181,6 @@ ru Дерево информации статистики группа - - ru - Дерево информации статистики группа - ДеревоИнформацииСтатистикиГруппаExtendedTooltip 773 @@ -1472,6 +1409,10 @@ true + + <key>ru</key> + <value>Дерево информации статистики группа число сопоставленных</value> + ru Число сопоставленных @@ -1650,6 +1591,10 @@ true + + <key>ru</key> + <value>Дерево информации статистики контекстное меню группа 1</value> + ДеревоИнформацииСтатистикиКонтекстноеМенюГруппа1ExtendedTooltip 767 @@ -1722,6 +1667,10 @@ true + + <key>ru</key> + <value>Информация статистики группа 2</value> + ИнформацияСтатистикиГруппа2ExtendedTooltip 769 @@ -1757,9 +1706,6 @@ ExpandAllLevels true true - None - None - None true @@ -1807,10 +1753,6 @@ ru Страница информации статистики - - ru - Страница информации статистики - СтраницаИнформацииСтатистикиExtendedTooltip 749 @@ -1889,10 +1831,6 @@ ru Статус загрузки неопределено - - ru - Статус загрузки неопределено - 2 1 false @@ -2138,10 +2076,6 @@ ru Страницы статуса загрузки данных - - ru - Страницы статуса загрузки данных - СтраницыСтатусаЗагрузкиДанныхExtendedTooltip 788 @@ -2233,12 +2167,8 @@ <key>ru</key> - <value>Группа загрузки данных</value> + <value>Загрузки данных</value> - - ru - Группа загрузки данных - ГруппаЗагрузкиДанныхExtendedTooltip 787 @@ -2375,10 +2305,6 @@ ru Статус выгрузки успех - - ru - Статус выгрузки успех - 2 1 @@ -2545,10 +2471,6 @@ ru Страницы статуса выгрузки данных - - ru - Страницы статуса выгрузки данных - СтраницыСтатусаВыгрузкиДанныхExtendedTooltip 799 @@ -2637,7 +2559,7 @@ <key>ru</key> - <value>Группа выгрузки данных</value> + <value>Выгрузки данных</value> ru @@ -2669,12 +2591,8 @@ <key>ru</key> - <value>Группа результата выполнения обмена данными</value> + <value>Результата выполнения обмена данными</value> - - ru - Группа результата выполнения обмена данными - ГруппаРезультатаВыполненияОбменаДаннымиExtendedTooltip 786 @@ -2704,10 +2622,6 @@ ru Синхронизация завершена - - ru - Заголовок страницы окончания сопоставления - ЗаголовокСтраницыОкончанияСопоставленияРасширеннаяПодсказка 785 @@ -2736,7 +2650,7 @@ Группировка 370 - Группа3 + ГруппаКартинкаНастройкиРасписания 913 Декорация14 @@ -2775,8 +2689,16 @@ true + + <key>ru</key> + <value>Картинка настройки расписания</value> + + + ru + Картинка настройка расписания + - Группа3РасширеннаяПодсказка + ГруппаКартинкаНастройкиРасписанияРасширеннаяПодсказка 914 Label true @@ -2796,7 +2718,7 @@ - Группа1 + ГруппаТекстНастройкиРасписания 478 Декорация15 @@ -2873,8 +2795,16 @@ true + + <key>ru</key> + <value>Текст настройки расписания</value> + + + ru + Текст настройка расписания + - Группа1ExtendedTooltip + ГруппаТекстНастройкиРасписанияРасширеннаяПодсказка 815 Label true @@ -2902,10 +2832,6 @@ ru Группировка - - ru - Группировка - ГруппировкаExtendedTooltip 813 @@ -3005,10 +2931,6 @@ ru Страница окончания сопоставления - - ru - Страница окончания сопоставления - СтраницаОкончанияСопоставленияExtendedTooltip 783 @@ -3090,7 +3012,7 @@ - Группа12 + ГруппаТиповойВариантДополненияНетГоризонтальный 662 Декорация20 @@ -3164,8 +3086,16 @@ true + + <key>ru</key> + <value>Типовой вариант дополнения нет горизонтальный</value> + + + ru + Типовой вариант дополнения нет + - Группа12ExtendedTooltip + ГруппаТиповойВариантДополненияНетГоризонтальныйРасширеннаяПодсказка 825 Label true @@ -3192,10 +3122,6 @@ ru Типовой вариант дополнения "Не добавлять" - - ru - Типовой вариант дополнения "Не добавлять" - ТиповойВариантДополненияНетExtendedTooltip 823 @@ -3305,7 +3231,7 @@ - Группа9 + ГруппаОтборВсеДокументыВертикальная 589 ТиповойВариантДополненияДокументыПояснение @@ -3343,70 +3269,25 @@ Left - - Группа7 - 600 - - ДополнениеВыгрузкиОбщийПериодДокументов - 550 - - <key>ru</key> - <value>За период</value> - - true - true - - true - - - ДополнениеВыгрузки.ПериодОтбораВсехДокументов - - Left - - ДополнениеВыгрузкиОбщийПериодДокументовExtendedTooltip - 836 - Label - true - true - - Left - - - - ДополнениеВыгрузкиОбщийПериодДокументовКонтекстноеМеню - 551 - true - - InputField - Enter - true - Left - true - - - Clearing - ДополнениеВыгрузкиОбщийПериодДокументовОчистка - - 29 - true - true - false - true - false - true - true - true - Normal - - + + ДополнениеВыгрузкиОбщийПериодДокументов + 550 + + <key>ru</key> + <value>За период</value> + true true true + + ДополнениеВыгрузки.ПериодОтбораВсехДокументов + + Left - Группа7ExtendedTooltip - 834 + ДополнениеВыгрузкиОбщийПериодДокументовExtendedTooltip + 836 Label true true @@ -3414,17 +3295,35 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + ДополнениеВыгрузкиОбщийПериодДокументовКонтекстноеМеню + 551 + true + + InputField + Enter + true + Left + true + + + Clearing + ДополнениеВыгрузкиОбщийПериодДокументовОчистка + + 29 + true + true + false + true + false + true + true + true + Normal - Группа8 + ГруппаОтборВсеДокументыГоризонтальная 552 Декорация13 @@ -3524,8 +3423,12 @@ true + + <key>ru</key> + <value>Отбор все документы горизонтальная</value> + - Группа8ExtendedTooltip + ГруппаОтборВсеДокументыГоризонтальнаяРасширеннаяПодсказка 837 Label true @@ -3548,8 +3451,12 @@ true + + <key>ru</key> + <value>Отбор все документы вертикальная</value> + - Группа9ExtendedTooltip + ГруппаОтборВсеДокументыВертикальнаяРасширеннаяПодсказка 832 Label true @@ -3575,12 +3482,8 @@ <key>ru</key> - <value>Группа отбор все документы</value> + <value>Отбор все документы</value> - - ru - Группа отбор все документы - ГруппаОтборВсеДокументыExtendedTooltip 830 @@ -3606,13 +3509,9 @@ true - <key>ru</key> - <value>Типовой вариант дополнения "Документы"</value> - - ru Типовой вариант дополнения документы - + ТиповойВариантДополненияДокументыExtendedTooltip 828 @@ -3688,7 +3587,7 @@ - Группа13 + ГруппаПроизвольныйВариантГоризонтальный 669 Декорация26 @@ -3762,8 +3661,12 @@ true + + <key>ru</key> + <value>Произвольный вариант горизонтальный</value> + - Группа13ExtendedTooltip + ГруппаПроизвольныйВариантГоризонтальныйРасширеннаяПодсказка 843 Label true @@ -3849,7 +3752,7 @@ - Группа10 + ГруппаКомандыПроизвольногоОтбора 558 ДополнениеВыгрузкиДетальныйОтбор @@ -3912,8 +3815,12 @@ true + + <key>ru</key> + <value>Команды произвольного отбора</value> + - Группа10ExtendedTooltip + ГруппаКомандыПроизвольногоОтбораРасширеннаяПодсказка 849 Label true @@ -3938,12 +3845,8 @@ <key>ru</key> - <value>Группа отбор детальный</value> + <value>Отбор детальный</value> - - ru - Группа отбор детальный - ГруппаОтборДетальныйExtendedTooltip 846 @@ -3972,10 +3875,6 @@ ru Типовой вариант дополнения произвольный - - ru - Типовой вариант дополнения произвольный - ТиповойВариантДополненияПроизвольныйExtendedTooltip 841 @@ -4117,7 +4016,7 @@ - Группа15 + ГруппаОтборНастраиваемыйВертикальный 643 НастраиваемыйВариантДополненияПояснение @@ -4156,80 +4055,31 @@ - Группа6 - 646 - - ГруппаПериодВыгрузкиСценарийУзла - 634 - - ДополнениеВыгрузкиПериодОтбораСценарияУзла - 648 - - <key>ru</key> - <value>За период</value> - - true - true - - true - - - ДополнениеВыгрузки.ПериодОтбораСценарияУзла - - Left - - OnChange - ДополнениеВыгрузкиПериодОтбораСценарияУзлаПриИзменении - - - ДополнениеВыгрузкиПериодОтбораСценарияУзлаExtendedTooltip - 862 - Label - true - true - - Left - - - - ДополнениеВыгрузкиПериодОтбораСценарияУзлаКонтекстноеМеню - 649 - true - - InputField - Enter - true - Left - true - - - Clearing - ДополнениеВыгрузкиПериодОтбораСценарияУзлаОчистка - - 29 - true - true - false - true - false - true - true - true - Normal - - + ГруппаПериодВыгрузкиСценарийУзла + 634 + + ДополнениеВыгрузкиПериодОтбораСценарияУзла + 648 + + <key>ru</key> + <value>За период</value> + true true true - - <key>ru</key> - <value>Группа период выгрузки сценарий узла</value> - + + ДополнениеВыгрузки.ПериодОтбораСценарияУзла + + Left + + OnChange + ДополнениеВыгрузкиПериодОтбораСценарияУзлаПриИзменении + - ГруппаПериодВыгрузкиСценарийУзлаExtendedTooltip - 860 + ДополнениеВыгрузкиПериодОтбораСценарияУзлаExtendedTooltip + 862 Label true true @@ -4237,13 +4087,106 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + ДополнениеВыгрузкиПериодОтбораСценарияУзлаКонтекстноеМеню + 649 + true + + InputField + Enter + true + Left + true + + + Clearing + ДополнениеВыгрузкиПериодОтбораСценарияУзлаОчистка + + 29 + true + true + false + true + false + true + true + true + Normal + + + + ДополнениеВыгрузкиОтборПоСценариюУзла + 642 + true + true + + true + + + ДополнениеВыгрузкиОтборПоСценариюУзлаExtendedTooltip + 863 + Label + true + true + + Left + + + Hyperlink + Form.Command.ДополнениеВыгрузкиОтборПоСценариюУзла + Normal + Auto + true + true + UserCmds + Auto + + + ДополнениеВыгрузкиПредставлениеОтбораСценарияУзла + 655 + true + true + + true + + + ДополнениеВыгрузки.ПредставлениеОтбораСценарияУзла + + None + + ДополнениеВыгрузкиПредставлениеОтбораСценарияУзлаExtendedTooltip + 864 + Label + true + true + + Left + + + + ДополнениеВыгрузкиПредставлениеОтбораСценарияУзлаКонтекстноеМеню + 656 + true + + InputField + Enter + true + Left + true + + 50 + true + 5 + true + false + true + true + true + true + + Style.FormBackColor + + Normal true @@ -4251,9 +4194,13 @@ true + + <key>ru</key> + <value>Период выгрузки сценарий узла</value> + - Группа6ExtendedTooltip - 859 + ГруппаПериодВыгрузкиСценарийУзлаExtendedTooltip + 860 Label true true @@ -4263,6 +4210,7 @@ UsualGroup + Vertical Auto true true @@ -4270,88 +4218,17 @@ Auto - - ДополнениеВыгрузкиОтборПоСценариюУзла - 642 - true - true - - true - - - ДополнениеВыгрузкиОтборПоСценариюУзлаExtendedTooltip - 863 - Label - true - true - - Left - - - Hyperlink - Form.Command.ДополнениеВыгрузкиОтборПоСценариюУзла - Normal - Auto - true - true - UserCmds - Auto - - - ДополнениеВыгрузкиПредставлениеОтбораСценарияУзла - 655 - true - true - - true - - - ДополнениеВыгрузки.ПредставлениеОтбораСценарияУзла - - None - - ДополнениеВыгрузкиПредставлениеОтбораСценарияУзлаExtendedTooltip - 864 - Label - true - true - - Left - - - - ДополнениеВыгрузкиПредставлениеОтбораСценарияУзлаКонтекстноеМеню - 656 - true - - InputField - Enter - true - Left - true - - 50 - true - 5 - true - false - true - true - true - true - - Style.FormBackColor - - Normal - - true true true + + <key>ru</key> + <value>Отбор настраиваемый вертикальный</value> + - Группа15ExtendedTooltip + ГруппаОтборНастраиваемыйВертикальныйРасширеннаяПодсказка 857 Label true @@ -4377,12 +4254,8 @@ <key>ru</key> - <value>Группа отбор настраиваемый</value> + <value>Отбор настраиваемый</value> - - ru - Группа отбор настраиваемый - ГруппаОтборНастраиваемыйExtendedTooltip 855 @@ -4410,10 +4283,6 @@ ru Настраиваемый вариант дополнения - - ru - Настраиваемый вариант дополнения - НастраиваемыйВариантДополненияExtendedTooltip 852 @@ -4444,10 +4313,6 @@ ru Варианты дополнения выгрузки - - ru - Варианты дополнения выгрузки - ВариантыДополненияВыгрузкиExtendedTooltip 822 @@ -4477,10 +4342,6 @@ ru Данные для отправки - - ru - Заголовок страницы дополнения выгрузки - ЗаголовокСтраницыДополненияВыгрузкиРасширеннаяПодсказка 916 @@ -4538,7 +4399,7 @@ Auto - Группа11 + ГруппаЗагрузкаТиповыхВариантовНастроекГоризонтальная 657 ДополнениеВыгрузкиИсторияОтборов @@ -4605,8 +4466,12 @@ true + + <key>ru</key> + <value>Загрузка типовых вариантов настроек горизонтальная</value> + - Группа11ExtendedTooltip + ГруппаЗагрузкаТиповыхВариантовНастроекГоризонтальнаяРасширеннаяПодсказка 868 Label true @@ -4631,12 +4496,8 @@ <key>ru</key> - <value>Группа загрузка типовых вариантов настроек</value> + <value>Загрузка типовых вариантов настроек</value> - - ru - Группа загрузка типовых вариантов настроек - ГруппаЗагрузкаТиповыхВариантовНастроекExtendedTooltip 866 @@ -4703,10 +4564,6 @@ ru Страница вопрос о составе выгрузки - - ru - Страница вопрос о составе выгрузки - СтраницаВопросОСоставеВыгрузкиExtendedTooltip 820 @@ -4774,10 +4631,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки2ExtendedTooltip 875 @@ -4851,10 +4704,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения2ExtendedTooltip 877 @@ -4989,10 +4838,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки3ExtendedTooltip 882 @@ -5066,10 +4911,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения3ExtendedTooltip 884 @@ -5222,6 +5063,10 @@ true + + <key>ru</key> + <value>Страница ошибка расхождения версий</value> + СтраницаОшибкаРасхожденияВерсийРасширеннаяПодсказка 918 @@ -5623,10 +5468,6 @@ ru Панель основная - - ru - Панель основная - ПанельОсновнаяExtendedTooltip 728 @@ -5738,6 +5579,10 @@ true + + <key>ru</key> + <value>Командная панель 1</value> + true КоманднаяПанель1ExtendedTooltip @@ -5763,10 +5608,6 @@ ru Страница навигации начало - - ru - Страница навигации начало - СтраницаНавигацииНачалоExtendedTooltip 888 @@ -5873,6 +5714,10 @@ true + + <key>ru</key> + <value>Командная панель 2</value> + true КоманднаяПанель2ExtendedTooltip @@ -5977,6 +5822,10 @@ true + + <key>ru</key> + <value>Командная панель 3</value> + true КоманднаяПанель3ExtendedTooltip @@ -6081,6 +5930,10 @@ true + + <key>ru</key> + <value>Командная панель 4</value> + true КоманднаяПанель4ExtendedTooltip @@ -6185,6 +6038,10 @@ true + + <key>ru</key> + <value>Командная панель 5</value> + КоманднаяПанель5РасширеннаяПодсказка 928 @@ -6209,10 +6066,6 @@ ru Страница навигации ошибка расхождения версий - - ru - Страница навигации ошибка расхождения версий - СтраницаНавигацииОшибкаРасхожденияВерсийРасширеннаяПодсказка 926 @@ -6262,12 +6115,8 @@ <key>ru</key> - <value>Группа кнопок мастера</value> + <value>Кнопок мастера</value> - - ru - Группа кнопок мастера - ГруппаКнопокМастераExtendedTooltip 886 @@ -7622,6 +7471,23 @@ true + + ЕстьНеСопоставленнаяНСИ + + <key>ru</key> + <value>Есть не сопоставленная НСИ</value> + + 50 + + Boolean + + + true + + + true + + ОбновитьИнформациюСопоставленияПолностью diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl index 9be82fc01..2b91f26b3 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl @@ -74,7 +74,7 @@ КонецЕсли; - МассивУзлов = ОбменДаннымиПовтИсп.УзлыПланаОбмена(Объект.ИмяПланаОбмена); + МассивУзлов = ОбменДаннымиСобытия.ВсеУзлыПланаОбмена(Объект.ИмяПланаОбмена); // Проверяем настройку обмена на соответствие фильтру. Если МассивУзлов.Найти(Объект.УзелИнформационнойБазы) = Неопределено Тогда @@ -124,7 +124,7 @@ ОбновитьСтраницыНастроекТранспорта(); // Различие интерфейсов - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда УстановитьШрифтЗаголовкаГруппы(Элементы.ЗаголовокСтраницы); УстановитьШрифтЗаголовкаГруппы(Элементы.ЗаголовокСтраницыИнформацииСтатистики); УстановитьШрифтЗаголовкаГруппы(Элементы.ЗаголовокСтраницыОкончанияСопоставления); @@ -235,8 +235,6 @@ Отказ = Ложь; - Состояние(НСтр("ru = 'Выполняется сбор информации сопоставления...'")); - ОбновитьДанныеСтатистикиСопоставленияНаСервере(Отказ, Параметр); Если Отказ Тогда @@ -245,7 +243,7 @@ РазвернутьДеревоИнформацииСтатистики(Параметр.КлючУникальности); - Состояние(НСтр("ru = 'Сбор информации завершен'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Сбор информации завершен'")); КонецЕсли; КонецЕсли; @@ -394,8 +392,6 @@ Если КлючиСтрок.Количество() > 0 Тогда - Состояние(НСтр("ru = 'Выполняется сбор информации сопоставления...'")); - ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ, КлючиСтрок); КонецЕсли; @@ -406,7 +402,7 @@ РазвернутьДеревоИнформацииСтатистики(КлючТекущейСтроки); - Состояние(НСтр("ru = 'Сбор информации завершен'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Сбор информации завершен'")); КонецЕсли; КонецПроцедуры @@ -985,8 +981,6 @@ Возврат; КонецЕсли; - Состояние(НСтр("ru = 'Выполняется загрузка данных...'")); - Отказ = Ложь; ВыполнитьЗагрузкуДанныхНаСервере(Отказ, КлючиСтрок); @@ -1000,7 +994,7 @@ КонецЕсли; РазвернутьДеревоИнформацииСтатистики(КлючиСтрок[КлючиСтрок.ВГраница()]); - Состояние(НСтр("ru = 'Загрузка данных завершена.'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Загрузка данных завершена.'")); КонецПроцедуры &НаКлиенте @@ -1138,7 +1132,8 @@ ИнформацияСтатистики(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); - ВсеДанныеСопоставлены = Обработки.ПомощникИнтерактивногоОбменаДанными.ВсеДанныеСопоставлены(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); + ВсеДанныеСопоставлены = Обработки.ПомощникИнтерактивногоОбменаДанными.ВсеДанныеСопоставлены(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); + ЕстьНеСопоставленнаяНСИ = НЕ ВсеДанныеСопоставлены И Обработки.ПомощникИнтерактивногоОбменаДанными.ЕстьНеСопоставленнаяНСИ(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); УстановитьВидимостьГруппыДополнительнойИнформации(); @@ -1161,7 +1156,8 @@ ИнформацияСтатистики(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); - ВсеДанныеСопоставлены = Обработки.ПомощникИнтерактивногоОбменаДанными.ВсеДанныеСопоставлены(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); + ВсеДанныеСопоставлены = Обработки.ПомощникИнтерактивногоОбменаДанными.ВсеДанныеСопоставлены(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); + ЕстьНеСопоставленнаяНСИ = НЕ ВсеДанныеСопоставлены И Обработки.ПомощникИнтерактивногоОбменаДанными.ЕстьНеСопоставленнаяНСИ(ОбработкаОбъект.ТаблицаИнформацииСтатистики()); УстановитьВидимостьГруппыДополнительнойИнформации(); @@ -1172,14 +1168,12 @@ СтрокиТаблицы = Объект.ИнформацияСтатистики.НайтиСтроки(Новый Структура("Ключ", ПараметрыОповещения.КлючУникальности)); - Если СтрокиТаблицы.Количество() > 0 Тогда - ЗаполнитьЗначенияСвойств(СтрокиТаблицы[0], ПараметрыОповещения, "ДанныеУспешноЗагружены"); - - КлючиСтрок = Новый Массив; - КлючиСтрок.Добавить(ПараметрыОповещения.КлючУникальности); - - ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ, КлючиСтрок); - КонецЕсли; + ЗаполнитьЗначенияСвойств(СтрокиТаблицы[0], ПараметрыОповещения, "ДанныеУспешноЗагружены"); + + КлючиСтрок = Новый Массив; + КлючиСтрок.Добавить(ПараметрыОповещения.КлючУникальности); + + ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ, КлючиСтрок); КонецПроцедуры @@ -1190,7 +1184,7 @@ КоллекцияЭлементовДерева.Очистить(); ОбщегоНазначения.ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, - ОбменДаннымиСервер.ПолучитьДеревоИнформацииСтатистики(ИнформацияСтатистики)); + ОбменДаннымиСервер.ИнформацияСтатистики(ИнформацияСтатистики)); КонецПроцедуры @@ -2308,7 +2302,7 @@ СтруктураНастроекОбмена.Вставить("ДатаНачала", ДатаНачалаОперации); СтруктураНастроекОбмена.Вставить("ДатаОкончания", ТекущаяДатаСеанса()); СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", - ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(Объект.УзелИнформационнойБазы, "ЗагрузкаДанных")); + ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(Объект.УзелИнформационнойБазы, "ЗагрузкаДанных")); СтруктураНастроекОбмена.Вставить("ЭтоОбменВРИБ", ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Объект.УзелИнформационнойБазы)); @@ -2318,8 +2312,9 @@ Иначе - ВсеДанныеСопоставлены = РезультатАнализа.ВсеДанныеСопоставлены; - СтатистикаПустая = РезультатАнализа.СтатистикаПустая; + ВсеДанныеСопоставлены = РезультатАнализа.ВсеДанныеСопоставлены; + ЕстьНеСопоставленнаяНСИ = РезультатАнализа.ЕстьНеСопоставленнаяНСИ; + СтатистикаПустая = РезультатАнализа.СтатистикаПустая; Объект.ИнформацияСтатистики.Загрузить(РезультатАнализа.ИнформацияСтатистики); Объект.ИнформацияСтатистики.Сортировать("Представление"); @@ -2366,7 +2361,7 @@ &НаКлиенте Функция Подключаемый_СтраницаИнформацииСтатистики_ПриПереходеДалее(Отказ) - Если СтатистикаПустая Или ПропуститьПолучениеДанных Или ВсеДанныеСопоставлены Тогда + Если СтатистикаПустая Или ПропуститьПолучениеДанных Или ВсеДанныеСопоставлены Или НЕ ЕстьНеСопоставленнаяНСИ Тогда Возврат Неопределено; КонецЕсли; @@ -2383,7 +2378,7 @@ Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); Сообщение = НСтр("ru = 'Не все данные сопоставлены. Наличие несопоставленных данных - |может привести к появлению одинаковых элементов справочников (дублей). + |может привести к появлению одинаковых элементов в списках (дублей). |Продолжить?'"); Оповещение = Новый ОписаниеОповещения("СтраницаИнформацииСтатистики_ПриПереходеДалееЗавершениеВопроса", ЭтотОбъект); @@ -2599,9 +2594,13 @@ РезультатВыполненияМетода = ПолучитьИзВременногоХранилища(РезультатВыполненияФоновогоЗадания.АдресРезультата); - ЗаполнитьЗначенияСвойств(ЭтотОбъект, РезультатВыполненияМетода, - "ДлительнаяОперация, ИдентификаторОперации, ИдентификаторФайла, WSПароль"); - + Если РезультатВыполненияМетода = Неопределено Тогда + РезультатВыполненияМетода = Новый Структура("Отказ", Истина); + Иначе + ЗаполнитьЗначенияСвойств(ЭтотОбъект, РезультатВыполненияМетода, + "ДлительнаяОперация, ИдентификаторОперации, ИдентификаторФайла, WSПароль"); + КонецЕсли; + Если РезультатВыполненияМетода.Отказ И Не ЗначениеЗаполнено(СообщениеОбОшибке) Тогда СообщениеОбОшибке = НСтр("ru = 'Не удалось выполнить отправку данных. Подробности см. в журнале регистрации'"); diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl index bfd289504..8aa15e086 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl @@ -12,65 +12,6 @@ КонецПроцедуры -// Для внутреннего использования. -// -Функция РезультатАвтоматическогоСопоставленияДанных(Знач Корреспондент, Знач ИмяФайлаСообщенияОбмена, Знач ИмяВременногоКаталогаСообщенийОбмена, ПроверятьРасхождениеВерсий) - - // Выполняем автоматическое сопоставление данных, полученных от корреспондента. - // Получаем статистику сопоставления. - УстановитьПривилегированныйРежим(Истина); - - ОбменДаннымиСервер.ИнициализироватьПараметрыПроверкиРасхожденияВерсий(ПроверятьРасхождениеВерсий); - - ПомощникИнтерактивногоОбменаДанными = Обработки.ПомощникИнтерактивногоОбменаДанными.Создать(); - ПомощникИнтерактивногоОбменаДанными.УзелИнформационнойБазы = Корреспондент; - ПомощникИнтерактивногоОбменаДанными.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; - ПомощникИнтерактивногоОбменаДанными.ИмяВременногоКаталогаСообщенийОбмена = ИмяВременногоКаталогаСообщенийОбмена; - ПомощникИнтерактивногоОбменаДанными.ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Корреспондент); - ПомощникИнтерактивногоОбменаДанными.ВидТранспортаСообщенийОбмена = Неопределено; - - // Выполняем анализ сообщения обмена. - Отказ = Ложь; - РезультатВыполненияОбмена = Неопределено; - ПомощникИнтерактивногоОбменаДанными.ВыполнитьАнализСообщенияОбмена(Отказ, РезультатВыполненияОбмена); - Если Отказ Тогда - Если ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных.ЕстьОшибка Тогда - Возврат ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных; - ИначеЕсли РезультатВыполненияОбмена <> Неопределено Тогда - Результат = Новый Структура; - Результат.Вставить("ИнформацияСтатистики", Неопределено); - Результат.Вставить("ВсеДанныеСопоставлены", Истина); - Результат.Вставить("СтатистикаПустая", Истина); - Результат.Вставить("Отказ", Истина); - Результат.Вставить("РезультатВыполненияОбмена", РезультатВыполненияОбмена); - Возврат Результат; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось загрузить данные из ""%1"" (этап анализа данных).'"), - Строка(Корреспондент)); - КонецЕсли; - КонецЕсли; - - // Выполняем автоматическое сопоставление и получаем статистику сопоставления. - Отказ = Ложь; - ПомощникИнтерактивногоОбменаДанными.ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюИПолучитьСтатистикуСопоставления(Отказ); - Если Отказ Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось загрузить данные из ""%1"" (этап автоматического сопоставления данных).'"), - Строка(Корреспондент)); - КонецЕсли; - - ТаблицаИнформацииСтатистики = ПомощникИнтерактивногоОбменаДанными.ТаблицаИнформацииСтатистики(); - - Результат = Новый Структура; - Результат.Вставить("ИнформацияСтатистики", ТаблицаИнформацииСтатистики); - Результат.Вставить("ВсеДанныеСопоставлены", ВсеДанныеСопоставлены(ТаблицаИнформацииСтатистики)); - Результат.Вставить("СтатистикаПустая", ТаблицаИнформацииСтатистики.Количество() = 0); - - Возврат Результат; - -КонецФункции - // Для внутреннего использования. // Выполняет загрузку сообщения обмена из внешнего источника // (ftp, e-mail, сетевой каталог) во временный каталог пользователя операционной системы. @@ -184,6 +125,75 @@ КонецФункции +// Для внутреннего использования. +// +Функция ЕстьНеСопоставленнаяНСИ(ИнформацияСтатистики) Экспорт + Возврат (ИнформацияСтатистики.НайтиСтроки(Новый Структура("ИндексКартинки, ЭтоНСИ", 1, Истина)).Количество() > 0); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции +// Для внутреннего использования. +// +Функция РезультатАвтоматическогоСопоставленияДанных(Знач Корреспондент, Знач ИмяФайлаСообщенияОбмена, Знач ИмяВременногоКаталогаСообщенийОбмена, ПроверятьРасхождениеВерсий) + + // Выполняем автоматическое сопоставление данных, полученных от корреспондента. + // Получаем статистику сопоставления. + УстановитьПривилегированныйРежим(Истина); + + ОбменДаннымиСервер.ИнициализироватьПараметрыПроверкиРасхожденияВерсий(ПроверятьРасхождениеВерсий); + + ПомощникИнтерактивногоОбменаДанными = Создать(); + ПомощникИнтерактивногоОбменаДанными.УзелИнформационнойБазы = Корреспондент; + ПомощникИнтерактивногоОбменаДанными.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + ПомощникИнтерактивногоОбменаДанными.ИмяВременногоКаталогаСообщенийОбмена = ИмяВременногоКаталогаСообщенийОбмена; + ПомощникИнтерактивногоОбменаДанными.ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Корреспондент); + ПомощникИнтерактивногоОбменаДанными.ВидТранспортаСообщенийОбмена = Неопределено; + + // Выполняем анализ сообщения обмена. + Отказ = Ложь; + РезультатВыполненияОбмена = Неопределено; + ПомощникИнтерактивногоОбменаДанными.ВыполнитьАнализСообщенияОбмена(Отказ, РезультатВыполненияОбмена); + Если Отказ Тогда + Если ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных.ЕстьОшибка Тогда + Возврат ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных; + ИначеЕсли РезультатВыполненияОбмена <> Неопределено Тогда + Результат = Новый Структура; + Результат.Вставить("ИнформацияСтатистики", Неопределено); + Результат.Вставить("ВсеДанныеСопоставлены", Истина); + Результат.Вставить("СтатистикаПустая", Истина); + Результат.Вставить("Отказ", Истина); + Результат.Вставить("РезультатВыполненияОбмена", РезультатВыполненияОбмена); + Возврат Результат; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить данные из ""%1"" (этап анализа данных).'"), + Строка(Корреспондент)); + КонецЕсли; + КонецЕсли; + + // Выполняем автоматическое сопоставление и получаем статистику сопоставления. + Отказ = Ложь; + ПомощникИнтерактивногоОбменаДанными.ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюИПолучитьСтатистикуСопоставления(Отказ); + Если Отказ Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить данные из ""%1"" (этап автоматического сопоставления данных).'"), + Строка(Корреспондент)); + КонецЕсли; + + ТаблицаИнформацииСтатистики = ПомощникИнтерактивногоОбменаДанными.ТаблицаИнформацииСтатистики(); + + Результат = Новый Структура; + Результат.Вставить("ИнформацияСтатистики", ТаблицаИнформацииСтатистики); + Результат.Вставить("ВсеДанныеСопоставлены", ВсеДанныеСопоставлены(ТаблицаИнформацииСтатистики)); + Результат.Вставить("СтатистикаПустая", ТаблицаИнформацииСтатистики.Количество() = 0); + Результат.Вставить("ЕстьНеСопоставленнаяНСИ", ЕстьНеСопоставленнаяНСИ(ТаблицаИнформацииСтатистики)); + + Возврат Результат; + +КонецФункции + #КонецОбласти #КонецЕсли diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl index 9e6b5a44b..eff89aaa6 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl @@ -69,7 +69,8 @@ СтрокаТаблицы.КоличествоОбъектовНесопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовНесопоставленных(); СтрокаТаблицы.ПроцентСопоставленияОбъектов = СопоставлениеОбъектовИнформационныхБаз.ПроцентСопоставленияОбъектов(); СтрокаТаблицы.ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(СтрокаТаблицы.КоличествоОбъектовНесопоставленных, СтрокаТаблицы.ДанныеУспешноЗагружены); - + СтрокаТаблицы.ЭтоНСИ = ЭтоИмяТипаНСИ(СтрокаТаблицы.ТипПриемникаСтрокой); + КонецЦикла; КонецПроцедуры @@ -147,7 +148,7 @@ СтрокаТаблицы.КоличествоОбъектовНесопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовНесопоставленных(); СтрокаТаблицы.ПроцентСопоставленияОбъектов = СопоставлениеОбъектовИнформационныхБаз.ПроцентСопоставленияОбъектов(); СтрокаТаблицы.ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(СтрокаТаблицы.КоличествоОбъектовНесопоставленных, СтрокаТаблицы.ДанныеУспешноЗагружены); - + СтрокаТаблицы.ЭтоНСИ = ЭтоИмяТипаНСИ(СтрокаТаблицы.ТипПриемникаСтрокой); КонецЦикла; КонецПроцедуры @@ -330,7 +331,7 @@ ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки); Если ОбработкаОбменаДанными.ФлагОшибки() Тогда - Отказ = Истина; + НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки: %1'"); НСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке()); ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбменаСОшибкой(СтруктураНастроекОбмена.УзелИнформационнойБазы, @@ -378,6 +379,12 @@ КонецПроцедуры +Функция ЭтоИмяТипаНСИ(ТипПриемникаСтрокой) + Если Документы.ТипВсеСсылки().СодержитТип(Тип(ТипПриемникаСтрокой)) Тогда + Возврат Ложь; + КонецЕсли; + Возврат Истина; +КонецФункции //////////////////////////////////////////////////////////////////////////////// // Функции-свойства diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ПомощникИнтерактивногоОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ПомощникИнтерактивногоОбменаДанными.mdo index 8eedb5fe3..a894b2231 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ПомощникИнтерактивногоОбменаДанными.mdo +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ПомощникИнтерактивногоОбменаДанными.mdo @@ -487,6 +487,23 @@ <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> </attributes> + <attributes uuid="aef03c0b-2846-43b7-b382-9a51ec783e85"> + <name>ЭтоНСИ</name> + <synonym> + <key>ru</key> + <value>Это НСИ</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Флаг того, что текущий объект является НСИ</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> </tabularSections> <forms uuid="e7100f2b-d169-4635-ab87-7a2225ff12ee"> <name>Форма</name> diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form index b0c739528..3e8d8639d 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form @@ -86,10 +86,10 @@ <userVisible> <common>true</common> </userVisible> - <toolTip> + <title> <key>ru</key> - <value>Группа описание синхронизации данных</value> - </toolTip> + <value>Описание синхронизации данных</value> + ГруппаОписаниеСинхронизацииДанныхРасширеннаяПодсказка 2511 @@ -187,10 +187,10 @@ true - + <key>ru</key> - <value>Группа резервное копирование</value> - </toolTip> + <value>Резервное копирование</value> + ГруппаРезервноеКопированиеРасширеннаяПодсказка 2447 @@ -392,12 +392,8 @@ <key>ru</key> - <value>Группа выбор из файла</value> + <value>Выбор из файла</value> - - ru - Группа выбор из файла - ГруппаВыборИзФайлаРасширеннаяПодсказка 2516 @@ -559,10 +555,6 @@ ru Страница мастера начало - - ru - Страница мастера начало - СтраницаМастераНачалоExtendedTooltip 1929 @@ -580,6 +572,754 @@ false + + СтраницаМастераНастройкаПараметров + 6 + + НастройкаПараметровСинхронизации + 1800 + + ПараметрыПервойБазы + 1802 + + НаименованиеЭтойБазы + 67 + + <key>ru</key> + <value>Наименование этой информационной базы</value> + + true + true + + true + + + Объект.НаименованиеЭтойБазы + + Top + + НаименованиеЭтойБазыExtendedTooltip + 2168 + Label + true + true + + Left + + + + НаименованиеЭтойБазыКонтекстноеМеню + 68 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПрефиксИнформационнойБазыИсточника + 117 + + <key>ru</key> + <value>Префикс</value> + + true + true + + true + + + Объект.ПрефиксИнформационнойБазыИсточника + + Top + + ПрефиксИнформационнойБазыИсточникаExtendedTooltip + 2172 + Label + true + true + + Left + + + + ПрефиксИнформационнойБазыИсточникаКонтекстноеМеню + 118 + true + + InputField + true + true + Enter + true + Left + true + + 3 + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Параметры первой базы</value> + + + ПараметрыПервойБазыРасширеннаяПодсказка + 2167 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПараметрыВторойБазы + 1879 + + НаименованиеВторойБазы + 978 + + <key>ru</key> + <value>Наименование другой информационной базы</value> + + true + true + + true + + + Объект.НаименованиеВторойБазы + + Top + + НаименованиеВторойБазыExtendedTooltip + 2169 + Label + true + true + + Left + + + + НаименованиеВторойБазыКонтекстноеМеню + 979 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПрефиксИнформационнойБазыПриемника + 1033 + + <key>ru</key> + <value>Префикс</value> + + true + true + + true + + + Объект.ПрефиксИнформационнойБазыПриемника + + Top + Button + + ПрефиксИнформационнойБазыПриемникаРасширеннаяПодсказка + 2175 + + <key>ru</key> + <value>Для того чтобы узнать префикс второй информационной базы следует выполнить запуск программы и перейти в форму синхронизации данных. Если во второй информационной базе префикс не задан, то следует указать любой желаемый префикс. Этот префикс будет установлен во второй базе при настройке синхронизации данных.</value> + + Label + true + true + + Left + + + + ПрефиксИнформационнойБазыПриемникаКонтекстноеМеню + 1034 + true + + InputField + true + Enter + true + Left + true + + 3 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Параметры второй базы</value> + + + ПараметрыВторойБазыРасширеннаяПодсказка + 2174 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаСпособПодключения + 1875 + + ВидТранспортаСообщенийОбмена + 715 + true + true + + true + + + Объект.ВидТранспортаСообщенийОбмена + + Top + + ВидТранспортаСообщенийОбменаExtendedTooltip + 2178 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбменаКонтекстноеМеню + 716 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + true + + + ru + Локальный или сетевой каталог + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FILE + + + + + ru + FTP-ресурс + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FTP + + + + + ru + Почтовые сообщения + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.EMAIL + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Способ подключения</value> + + + ГруппаСпособПодключенияРасширеннаяПодсказка + 2177 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройка параметров синхронизации данных</value> + + + НастройкаПараметровСинхронизацииРасширеннаяПодсказка + 2165 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + НастройкиУзла + 539 + + РамкаГруппыОграничений + 111 + + ОписаниеОграниченийПередачиДанных + 387 + + <key>ru</key> + <value>Правила отправки данных в +%Программа%</value> + + true + true + + true + + + ОписаниеОграниченийПередачиДанных + + Top + + ОписаниеОграниченийПередачиДанныхExtendedTooltip + 2184 + Label + true + true + + Left + + + + ОписаниеОграниченийПередачиДанныхКонтекстноеМеню + 388 + true + + InputField + true + Enter + true + Left + true + + 8 + true + true + true + true + true + true + Normal + + + + НастройкаОграниченийРегистрацииДанных + 110 + true + true + + true + + false + + НастройкаОграниченийРегистрацииДанныхExtendedTooltip + 2185 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаОграниченийРегистрацииДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Ограничения передачи данных:</value> + + true + false + + РамкаГруппыОграниченийExtendedTooltip + 2182 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + РамкаГруппыЗначенийПоУмолчанию + 532 + + ОписаниеЗначенийПоУмолчанию + 533 + + <key>ru</key> + <value>Правила получения данных из +%Программа%</value> + + true + true + + true + + + ОписаниеЗначенийПоУмолчанию + + Top + + ОписаниеЗначенийПоУмолчаниюExtendedTooltip + 2188 + Label + true + true + + Left + + + + ОписаниеЗначенийПоУмолчаниюКонтекстноеМеню + 534 + true + + InputField + true + Enter + true + Left + true + + 8 + true + true + true + true + true + true + Normal + + + + НастройкаЗначенийПоУмолчанию + 538 + true + true + + true + + false + + НастройкаЗначенийПоУмолчаниюExtendedTooltip + 2189 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаЗначенийПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Значения по умолчанию:</value> + + true + false + + РамкаГруппыЗначенийПоУмолчаниюExtendedTooltip + 2186 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки узла</value> + + + НастройкиУзлаExtendedTooltip + 2181 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Equal + Auto + Auto + + + + Декорация5 + 194 + true + true + + true + + + Декорация5ExtendedTooltip + 2190 + Label + true + true + + Left + + + + Декорация5КонтекстноеМеню + 195 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееПодтверждениеНастроек + 131 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для проверки параметров и завершения настройки синхронизации данных.</value> + + true + true + + true + + + НадписьДалееПодтверждениеНастроекExtendedTooltip + 2191 + Label + true + true + + Left + + + + НадписьДалееПодтверждениеНастроекКонтекстноеМеню + 132 + true + + Label + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера настройка параметров</value> + + + СтраницаМастераНастройкаПараметровExtendedTooltip + 2163 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + СтраницаМастераНачалоНастройкиОбменаССервисом 1190 @@ -678,7 +1418,7 @@ - Группа3 + ГруппаПаролиСервиса 1252 WSИмяПользователя1 @@ -778,7 +1518,7 @@ - Группа8 + ГруппаПаролиСервисаГоризонтальная 1924 WSЗапомнитьПароль @@ -846,8 +1586,12 @@ true + + <key>ru</key> + <value>Пароли сервиса горизонтальная</value> + - Группа8ExtendedTooltip + ГруппаПаролиСервисаГоризонтальнаяРасширеннаяПодсказка 1963 Label true @@ -870,8 +1614,12 @@ true + + <key>ru</key> + <value>Пароли сервиса</value> + - Группа3ExtendedTooltip + ГруппаПаролиСервисаРасширеннаяПодсказка 1960 Label true @@ -1061,10 +1809,6 @@ ru Группа резервное копирование - - ru - Группа резервное копирование - ГруппаРезервноеКопирование1РасширеннаяПодсказка 2455 @@ -1155,6 +1899,10 @@ true + + <key>ru</key> + <value>Страница мастера начало настройки обмена с сервисом</value> + ru Страница мастера выбор режима работы помощника @@ -1236,7 +1984,8 @@ ru Префикс этой информационной базы - false + true + true true @@ -1259,6 +2008,8 @@ true InputField + true + true Enter true Left @@ -1267,6 +2018,7 @@ true true true + true true true true @@ -1274,7 +2026,7 @@ - Группа9 + ГруппаВтораяБаза 1290 НаименованиеВторойБазы1 @@ -1330,6 +2082,7 @@ ru Префикс приложения в Интернете + true true true @@ -1373,8 +2126,12 @@ true + + <key>ru</key> + <value>Вторая база</value> + - Группа9ExtendedTooltip + ГруппаВтораяБазаРасширеннаяПодсказка 1973 Label true @@ -1395,7 +2152,7 @@ - Группа7 + ГруппаОписаниеНастроек 1285 ОписаниеНастроекВыгрузкиДанных @@ -1475,8 +2232,12 @@ true + + <key>ru</key> + <value>Описание настроек</value> + - Группа7ExtendedTooltip + ГруппаОписаниеНастроекРасширеннаяПодсказка 1976 Label true @@ -1541,10 +2302,6 @@ ru Настройка параметров синхронизации данных - - ru - Группа страница мастера настройка параметров обмена данными - ГруппаСтраницаМастераНастройкаПараметровОбменаДаннымиРасширеннаяПодсказка 2486 @@ -1604,7 +2361,7 @@ ГруппаСтраницаМастераНастройкаПараметровОбменаДаннымиЧерезВебСервис 2481 - Группа18 + ГруппаЭтаБазаВеб 2483 НаименованиеЭтойБазы5 @@ -1685,6 +2442,8 @@ true InputField + true + true Enter true Left @@ -1693,6 +2452,7 @@ true true true + true true true true @@ -1704,8 +2464,12 @@ true + + <key>ru</key> + <value>Эта база веб</value> + - Группа18РасширеннаяПодсказка + ГруппаЭтаБазаВебРасширеннаяПодсказка 2484 Label true @@ -1724,7 +2488,7 @@ - Группа14 + ГруппаВтораяБазаВеб 1773 НаименованиеВторойБазы3 @@ -1789,6 +2553,7 @@ Объект.ПрефиксИнформационнойБазыПриемника Top + Button ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервисExtendedTooltip 1986 @@ -1805,6 +2570,7 @@ true InputField + true Enter true Left @@ -1813,6 +2579,7 @@ true true true + true true true true @@ -1824,8 +2591,12 @@ true + + <key>ru</key> + <value>Вторая база веб</value> + - Группа14ExtendedTooltip + ГруппаВтораяБазаВебРасширеннаяПодсказка 1984 Label true @@ -1845,7 +2616,7 @@ - Группа16 + ГруппаОписаниеНастроекВеб 1776 ОписаниеНастроекВыгрузкиДанных1 @@ -1929,8 +2700,12 @@ true + + <key>ru</key> + <value>Описание настроек веб</value> + - Группа16ExtendedTooltip + ГруппаОписаниеНастроекВебРасширеннаяПодсказка 1987 Label true @@ -2026,10 +2801,6 @@ ru Страница мастера настройка параметров обмена данными - - ru - Страница мастера настройка параметров - СтраницаМастераНастройкаПараметровОбменаДаннымиЧерезВебСервисExtendedTooltip 1980 @@ -2047,7542 +2818,6 @@ false - - СтраницаМастераСопоставлениеДанных - 1331 - - ГруппаСтраницаМастераСопоставлениеДанных - 2479 - - СтраницыСтатусаСопоставленияДанных - 1674 - - СтатусСопоставленияЕстьНесопоставленныеДанные - 1675 - - ПояснениеОНаличииНесопоставленныхОбъектов1 - 1717 - - <key>ru</key> - <value>Учет ведется в обеих программах, поэтому следует выполнить сопоставление данных. -Это позволит избежать появления дублирующихся элементов справочников, которые независимо друг от друга -были введены в обеих программах, например, с одинаковыми наименованиями. -С помощью сопоставления можно указать, какие данные являются одинаковыми в двух программах.</value> - - true - true - - true - - - ПояснениеОНаличииНесопоставленныхОбъектов1ExtendedTooltip - 1995 - Label - true - true - - Left - - - - ПояснениеОНаличииНесопоставленныхОбъектов1КонтекстноеМеню - 1718 - true - - Label - true - false - - Style.ПоясняющийТекст - - - Left - Top - - - - ДеревоИнформацииСтатистики - 1651 - true - true - - true - - - ДеревоИнформацииСтатистики - - None - Add - Change - Copy - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - ДеревоИнформацииСтатистикиГруппа - 1668 - - ДеревоИнформацииСтатистикиКартинка - 1658 - true - true - - true - - - ДеревоИнформацииСтатистики.Картинка - - None - - ДеревоИнформацииСтатистикиКартинкаExtendedTooltip - 2000 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиКартинкаКонтекстноеМеню - 1659 - true - - PictureField - true - Auto - true - Left - true - - true - true - true - - - 1 - - - - - ДеревоИнформацииСтатистикиСиноним - 1654 - true - true - - true - - - ДеревоИнформацииСтатистики.Синоним - - - ДеревоИнформацииСтатистикиСинонимExtendedTooltip - 2001 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиСинонимКонтекстноеМеню - 1655 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - true - - ДеревоИнформацииСтатистикиГруппаExtendedTooltip - 1999 - Label - true - true - - Left - - - ColumnGroup - - InCell - auto - true - - - - ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектов - 1656 - true - true - - true - - - ДеревоИнформацииСтатистики.ПроцентСопоставленияОбъектов - - - ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектовExtendedTooltip - 2002 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектовКонтекстноеМеню - 1657 - true - - InputField - true - Auto - true - Right - true - - 10 - true - true - false - true - - ru - ЧН= - - - ru - ЧН= - - true - true - true - Normal - - - - ДеревоИнформацииСтатистикиКоманднаяПанель - 1653 - - ДеревоИнформацииСтатистикиВыполнитьСопоставлениеДанных - 1681 - true - true - - true - - - ДеревоИнформацииСтатистикиВыполнитьСопоставлениеДанныхExtendedTooltip - 1997 - Label - true - true - - Left - - - Form.Command.ВыполнитьСопоставлениеДанных - Normal - Auto - true - true - UserCmds - Auto - - Left - - - Selection - ДеревоИнформацииСтатистикиВыбор - - - ДеревоИнформацииСтатистикиSearchString - 2495 - - ДеревоИнформацииСтатистикиSearchStringExtendedTooltip - 2497 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиSearchStringContextMenu - 2496 - true - - ДеревоИнформацииСтатистики - - true - - - - ДеревоИнформацииСтатистикиViewStatus - 2498 - - ДеревоИнформацииСтатистикиViewStatusExtendedTooltip - 2500 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиViewStatusContextMenu - 2499 - true - - ViewStatusAddition - ДеревоИнформацииСтатистики - - true - - - - ДеревоИнформацииСтатистикиSearchControl - 2501 - - ДеревоИнформацииСтатистикиSearchControlExtendedTooltip - 2503 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиSearchControlContextMenu - 2502 - true - - SearchControlAddition - ДеревоИнформацииСтатистики - - true - - - - ДеревоИнформацииСтатистикиExtendedTooltip - 1998 - Label - true - true - - Left - - - - ДеревоИнформацииСтатистикиКонтекстноеМеню - 1652 - - ДеревоИнформацииСтатистикиКонтекстноеМенюВыполнитьСопоставлениеДанных - 1682 - true - true - - true - - - ДеревоИнформацииСтатистикиКонтекстноеМенюВыполнитьСопоставлениеДанныхExtendedTooltip - 1996 - Label - true - true - - Left - - - Form.Command.ВыполнитьСопоставлениеДанных - Normal - Auto - true - true - UserCmds - Auto - - - Tree - true - true - true - true - Row -
          true
          - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - ExpandAllLevels - true - true - None - None - None - true -
          - true - true - - true - - - <key>ru</key> - <value>Статус сопоставления есть несопоставленные данные</value> - - - ru - Статус сопоставления есть несопоставленные данные - - - СтатусСопоставленияЕстьНесопоставленныеДанныеExtendedTooltip - 1994 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
          - - СтатусСопоставленияВсеДанныеСопоставлены - 1676 - - ГруппировкаСообщения8 - 1743 - - Декорация35 - 1745 - true - true - - true - - - Декорация35ExtendedTooltip - 2005 - Label - true - true - - Left - - - - Декорация35КонтекстноеМеню - 1746 - true - - true - true - false - - - CommonPicture.Информация32 - - - - - Декорация36 - 1748 - - <key>ru</key> - <value>Все данные сопоставлены. -Перейдите далее для продолжения настройки.</value> - - true - true - - true - - - Декорация36ExtendedTooltip - 2006 - Label - true - true - - Left - - - - Декорация36КонтекстноеМеню - 1749 - true - - Label - 3 - true - false - - System.DefaultGUIFont - 10.0 - - - Left - Center - - - true - true - - true - - - ru - Группировка сообщения - - - ГруппировкаСообщения8ExtendedTooltip - 2004 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Статус сопоставления все данные сопоставлены</value> - - - ru - Статус сопоставления все данные сопоставлены - - - СтатусСопоставленияВсеДанныеСопоставленыExtendedTooltip - 2003 - Label - true - true - - Left - - - Page - - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Сопоставление одинаковых данных</value> - - - СтраницыСтатусаСопоставленияДанныхExtendedTooltip - 1993 - Label - true - true - - Left - - - Pages - - Auto - -
          - - НадписьДалееНаСтраницеСопоставленияДанных - 1334 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для синхронизации данных.</value> - - true - true - - true - - - НадписьДалееНаСтраницеСопоставленияДанныхExtendedTooltip - 2007 - Label - true - true - - Left - - - - НадписьДалееНаСтраницеСопоставленияДанныхКонтекстноеМеню - 1335 - true - - Label - 3 - true - false - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Сопоставление одинаковых данных</value> - - - ru - Группа страница мастера сопоставление данных - - - ГруппаСтраницаМастераСопоставлениеДанныхРасширеннаяПодсказка - 2480 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - -
          - true - true - - true - - - <key>ru</key> - <value>Страница мастера сопоставление данных</value> - - - ru - Страница мастера сопоставление данных - - - СтраницаМастераСопоставлениеДанныхExtendedTooltip - 1991 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
          - - СтраницаМастераСозданиеОбменаДаннымиУспешноЗавершено - 1345 - - ГруппаРасписания - 1685 - - КартинкаЧасы - 1686 - - <key>ru</key> - <value>Картинка часы</value> - - true - true - - true - - - КартинкаЧасыExtendedTooltip - 2011 - Label - true - true - - Left - - - - КартинкаЧасыКонтекстноеМеню - 1687 - true - - true - true - - - - - - ГруппаРасписания1 - 1688 - - ВыполнятьОбменДаннымиАвтоматически - 1683 - true - true - - true - - - ВыполнятьОбменДаннымиАвтоматически - - Right - - OnChange - ВыполнятьОбменДаннымиАвтоматическиПриИзменении - - - ВыполнятьОбменДаннымиАвтоматическиExtendedTooltip - 2013 - Label - true - true - - Left - - - - ВыполнятьОбменДаннымиАвтоматическиКонтекстноеМеню - 1684 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаПредопределенногоРасписания - 1691 - - СтраницыПредопределенногоРасписания - 1710 - - СтраницаПредопределенногоРасписания - 1711 - - ПредопределенноеРасписаниеОбменаДанными - 1699 - true - true - - true - - - ПредопределенноеРасписаниеОбменаДанными - - None - - OnChange - ПредопределенноеРасписаниеОбменаДаннымиПриИзменении - - - ПредопределенноеРасписаниеОбменаДаннымиExtendedTooltip - 2017 - Label - true - true - - Left - - - - ПредопределенноеРасписаниеОбменаДаннымиКонтекстноеМеню - 1700 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Каждые 15 минут - - - Каждые15Минут - - - - - ru - Каждые 30 минут - - - Каждые30Минут - - - - - ru - Каждый час - - - КаждыйЧас - - - - - ru - Каждый день, в 8:00 - - - КаждыйДеньВ_8_00 - - - - - ru - Другое расписание - - - ДругоеРасписание - - - Vertical - - - - СтраницыПользовательскогоРасписания - 1705 - - СтраницаПользовательскогоРасписания - 1706 - - ИзменитьПользовательскоеРасписание - 1704 - true - true - - true - - - ИзменитьПользовательскоеРасписаниеExtendedTooltip - 2020 - Label - true - true - - Left - - - UsualButton - Form.Command.ИзменитьПользовательскоеРасписание - Normal - Auto - 15 - true - true - UserCmds - Auto - - - ПредставлениеПользовательскогоОписания - 1701 - true - true - - true - - - ПредставлениеПользовательскогоОписания - - None - - ПредставлениеПользовательскогоОписанияExtendedTooltip - 2021 - Label - true - true - - Left - - - - ПредставлениеПользовательскогоОписанияКонтекстноеМеню - 1702 - true - - LabelField - Enter - true - Left - true - - 2 - true - false - - Style.ПоясняющийТекст - - - - true - true - - true - - - <key>ru</key> - <value>Страница пользовательского расписания</value> - - - ru - Страница пользовательского расписания - - - СтраницаПользовательскогоРасписанияExtendedTooltip - 2019 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - ПустаяСтраницаПользовательскогоРасписания - 1707 - - Декорация10 - 1708 - true - true - - true - - - Декорация10ExtendedTooltip - 2023 - Label - true - true - - Left - - - - Декорация10КонтекстноеМеню - 1709 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Пустая страница пользовательского расписания</value> - - - ru - Пустая страница пользовательского расписания - - - ПустаяСтраницаПользовательскогоРасписанияExtendedTooltip - 2022 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - true - - СтраницыПользовательскогоРасписанияExtendedTooltip - 2018 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - СтраницаПредопределенногоРасписанияExtendedTooltip - 2016 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - НедоступнаяСтраницаПредопределенногоРасписания - 1712 - - ПредопределенноеРасписаниеОбменаДанными1 - 1715 - true - true - - true - - - ПредопределенноеРасписаниеОбменаДанными - - None - - OnChange - ПредопределенноеРасписаниеОбменаДаннымиПриИзменении - - - ПредопределенноеРасписаниеОбменаДанными1ExtendedTooltip - 2025 - Label - true - true - - Left - - - - ПредопределенноеРасписаниеОбменаДанными1КонтекстноеМеню - 1716 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Каждые 15 минут - - - Каждые15Минут - - - - - ru - Каждые 30 минут - - - Каждые30Минут - - - - - ru - Каждый час - - - КаждыйЧас - - - - - ru - Каждый день, в 8:00 - - - КаждыйДеньВ_8_00 - - - - - ru - Другое расписание - - - ДругоеРасписание - - - Vertical - - - true - false - - true - - - ru - Недоступная страница предопределенного расписания - - true - - НедоступнаяСтраницаПредопределенногоРасписанияExtendedTooltip - 2024 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - СтраницыПредопределенногоРасписанияExtendedTooltip - 2015 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - ru - Группа предопределенного расписания - - - ГруппаПредопределенногоРасписанияExtendedTooltip - 2014 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - ГруппаРасписания1ExtendedTooltip - 2012 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройка синхронизации данных успешно завершена</value> - - - ГруппаРасписанияExtendedTooltip - 2010 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - Декорация32 - 1348 - true - true - - true - - - Декорация32ExtendedTooltip - 2026 - Label - true - true - - Left - - - - Декорация32КонтекстноеМеню - 1349 - true - - Label - true - true - true - - Left - - - - НадписьГотово12 - 1350 - - <key>ru</key> - <value>Нажмите кнопку "Готово" для завершения работы с помощником.</value> - - true - true - - true - - - НадписьГотово12ExtendedTooltip - 2030 - Label - true - true - - Left - - - - НадписьГотово12КонтекстноеМеню - 1351 - true - - Label - 3 - true - false - - Left - Bottom - - - true - true - - true - - - ru - Страница мастера сопоставление данных - - - СтраницаМастераСозданиеОбменаДаннымиУспешноЗавершеноExtendedTooltip - 2008 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераНастройкиОтраженияДокументовВУчете - 1338 - - Группа40 - 1618 - - НастройкиПараметровУчета - 1619 - - НаименованиеЭтойБазы4 - 1614 - true - true - - true - - - Объект.НаименованиеЭтойБазы - - None - - НаименованиеЭтойБазы4ExtendedTooltip - 2035 - Label - true - true - - Left - - - - НаименованиеЭтойБазы4КонтекстноеМеню - 1615 - true - - LabelField - Enter - true - Left - true - - true - - System.DefaultGUIFont - true - false - false - false - - - - - Группа43 - 1640 - - Декорация99 - 1641 - true - true - - true - - - Декорация99ExtendedTooltip - 2037 - Label - true - true - - Left - - - - Декорация99КонтекстноеМеню - 1642 - true - - true - true - - - CommonPicture.Предупреждение32 - - - - - НастройкиПараметровУчетаПоясняющаяНадпись - 1643 - true - true - - true - - - НастройкиПараметровУчетаПоясняющаяНадпись - - None - - НастройкиПараметровУчетаПоясняющаяНадписьExtendedTooltip - 2038 - Label - true - true - - Left - - - - НастройкиПараметровУчетаПоясняющаяНадписьКонтекстноеМеню - 1644 - true - - LabelField - Center - Enter - true - Left - true - - 2 - true - false - - - true - true - - true - - - Группа43РасширеннаяПодсказка - 2036 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - НадписьНастройкиПараметровУчета - 2437 - true - true - - true - - - НадписьНастройкиПараметровУчета - - None - - НадписьНастройкиПараметровУчетаРасширеннаяПодсказка - 2439 - Label - true - true - - Left - - - - НадписьНастройкиПараметровУчетаКонтекстноеМеню - 2438 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - true - true - - true - - - System.DefaultGUIFont - true - false - false - false - - - ru - Настройки параметров учета - - - НастройкиПараметровУчетаРасширеннаяПодсказка - 2034 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - НастройкиПараметровУчетаКорреспондента - 1626 - - НаименованиеВторойБазы4 - 1616 - true - true - - true - - - Объект.НаименованиеВторойБазы - - None - - НаименованиеВторойБазы4ExtendedTooltip - 2043 - Label - true - true - - Left - - - - НаименованиеВторойБазы4КонтекстноеМеню - 1617 - true - - LabelField - Enter - true - Left - true - - true - - System.DefaultGUIFont - true - false - false - false - - - - - Группа45 - 1627 - - Декорация98 - 1628 - true - true - - true - - - Декорация98ExtendedTooltip - 2045 - Label - true - true - - Left - - - - Декорация98КонтекстноеМеню - 1629 - true - - true - true - - - CommonPicture.Предупреждение32 - - - - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись - 1649 - true - true - - true - - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись - - None - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадписьExtendedTooltip - 2046 - Label - true - true - - Left - - - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадписьКонтекстноеМеню - 1650 - true - - LabelField - Center - Enter - true - Left - true - - 2 - true - false - - - true - true - - true - - - Группа45РасширеннаяПодсказка - 2044 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - НадписьНастройкиПараметровУчетаКорреспондента - 2440 - true - true - - true - - - НадписьНастройкиПараметровУчетаКорреспондента - - None - - НадписьНастройкиПараметровУчетаКорреспондентаРасширеннаяПодсказка - 2442 - Label - true - true - - Left - - - - НадписьНастройкиПараметровУчетаКорреспондентаКонтекстноеМеню - 2441 - 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 - - - ru - Настройки параметров учета корреспондента - - - НастройкиПараметровУчетаКорреспондентаРасширеннаяПодсказка - 2042 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки для отражения документов в учете</value> - - - Группа40ExtendedTooltip - 2033 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - НадписьДалее3 - 1343 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для выполнения синхронизации данных.</value> - - true - true - - true - - - НадписьДалее3ExtendedTooltip - 2050 - Label - true - true - - Left - - - - НадписьДалее3КонтекстноеМеню - 1344 - true - - Label - 3 - true - false - - Left - Bottom - - - true - true - - true - - - ru - Страница мастера сопоставление данных - - - СтраницаМастераНастройкиОтраженияДокументовВУчетеExtendedTooltip - 2031 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераПараметрыПолученияДанных - 2407 - - Группа12 - 2412 - - Группа13 - 2414 - - НаименованиеЭтойБазы6 - 2418 - true - true - - true - - - Объект.НаименованиеЭтойБазы - - None - - НаименованиеЭтойБазы6РасширеннаяПодсказка - 2420 - Label - true - true - - Left - - - - НаименованиеЭтойБазы6КонтекстноеМеню - 2419 - true - - LabelField - Enter - true - Left - true - - true - - System.DefaultGUIFont - true - false - false - false - - - - - РамкаГруппыЗначенийПоУмолчанию6 - 1647 - - ОписаниеЗначенийПоУмолчанию6 - 1624 - - <key>ru</key> - <value>Значения для заполнения реквизитов при получении данных в этой программе</value> - - true - true - - true - - - ОписаниеЗначенийПоУмолчанию - - - ОписаниеЗначенийПоУмолчанию6ExtendedTooltip - 2040 - Label - true - true - - Left - - - - ОписаниеЗначенийПоУмолчанию6КонтекстноеМеню - 1625 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - - НастройкаЗначенийПоУмолчанию6 - 1645 - - <key>ru</key> - <value>Изменить правила получения данных для этой программы</value> - - true - true - - true - - - НастройкаЗначенийПоУмолчанию6ExtendedTooltip - 2041 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаЗначенийПоУмолчанию - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - РамкаГруппыЗначенийПоУмолчанию6ExtendedTooltip - 2039 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа13РасширеннаяПодсказка - 2415 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - Группа15 - 2416 - - НаименованиеВторойБазы5 - 2421 - true - true - - true - - - Объект.НаименованиеВторойБазы - - None - - НаименованиеВторойБазы5РасширеннаяПодсказка - 2423 - Label - true - true - - Left - - - - НаименованиеВторойБазы5КонтекстноеМеню - 2422 - true - - LabelField - Enter - true - Left - true - - true - - System.DefaultGUIFont - true - false - false - false - - - - - РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондента - 1648 - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондента - 1636 - - <key>ru</key> - <value>Значения для заполнения реквизитов при получении данных в приложении, расположенном в Интернете</value> - - true - true - - true - - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондента - - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондентаExtendedTooltip - 2048 - Label - true - true - - Left - - - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондентаКонтекстноеМеню - 1637 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - - НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервис - 1646 - - <key>ru</key> - <value>Изменить правила получения данных для другой программы</value> - - true - true - - true - - - НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервисExtendedTooltip - 2049 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервис - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондентаExtendedTooltip - 2047 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа15РасширеннаяПодсказка - 2417 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Правила получения данных</value> - - - Группа12РасширеннаяПодсказка - 2413 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - НадписьДалее4 - 2443 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для выполнения синхронизации данных.</value> - - true - true - - true - - - НадписьДалее4РасширеннаяПодсказка - 2445 - Label - true - true - - Left - - - - НадписьДалее4КонтекстноеМеню - 2444 - true - - Label - 3 - true - false - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера параметры получения данных</value> - - - ru - Страница мастера параметры получения данных - - - СтраницаМастераПараметрыПолученияДанныхРасширеннаяПодсказка - 2408 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераВыборРежимаРаботыПомощника - 774 - - Группа23 - 1811 - - РежимРаботыМастера - 837 - true - true - - true - - - РежимРаботыМастера - - None - - OnChange - РежимРаботыМастераПриИзменении - - - РежимРаботыМастераExtendedTooltip - 2055 - Label - true - true - - Left - - - - РежимРаботыМастераКонтекстноеМеню - 838 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Прямое подключение к программе на этом компьютере или в локальной сети - - - ОбменЧерезВнешнееСоединение - - - - - ru - Прямое подключение к программе через Интернет - - - ОбменЧерезВебСервис - - - - - ru - Другие каналы связи (сетевой каталог, FTP, электронная почта) - - - ОбменЧерезОбычныеКаналыСвязи - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Выбор варианта подключения к другой программе</value> - - - Группа23ExtendedTooltip - 2054 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаОтступ - 839 - - СтраницыПараметровТранспорта - 830 - - СтраницаПараметровТранспортаCOM - 831 - - Декорация59 - 1904 - - <key>ru</key> - <value>Данный вариант подключения рекомендуется в том случае, если другая программа находится на том же -компьютере, что и эта программа, или обе программы расположены в одной локальной сети (в одном офисе).</value> - - true - true - - true - - - Декорация59ExtendedTooltip - 2067 - Label - true - true - - Left - - - - Декорация59КонтекстноеМеню - 1905 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - Группа24 - 1814 - - Группа26 - 1818 - - COMВариантРаботыИнформационнойБазы - 782 - - <key>ru</key> - <value>Укажите параметры подключения к другой программе</value> - - true - true - - true - - - Объект.COMВариантРаботыИнформационнойБазы - - Top - - OnChange - COMВариантРаботыИнформационнойБазыПриИзменении - - - COMВариантРаботыИнформационнойБазыExtendedTooltip - 2070 - Label - true - true - - Left - - - - COMВариантРаботыИнформационнойБазыКонтекстноеМеню - 783 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - На данном компьютере или на компьютере в локальной сети - - - 0 - - - - - ru - На сервере 1С:Предприятия - - - 1 - - - Vertical - - - true - true - - true - - Button - - Группа26ExtendedTooltip - 2069 - - <key>ru</key> - <value>Для настройки синхронизации данных необходимо знать где находится программа, с которой нужно настроить синхронизацию (другая программа). Для этого достаточно открыть программу. В главном меню выбрать пункт "Справка\О программе...". -Обратите внимание на следующие параметры (все они могут быть скопированы из формы "О программе..."): -• Режим - либо файловый либо серверный. Если режим файловый, то информационная база находится в каталоге на данном компьютере или в локальной сети. Если режим серверный, то для подключения нужно знать имя сервера и имя информационной базы на сервере. -• Каталог - для файлового режима указывается каталог, в котором располагается информационная база. -• Сервер - для серверного режима указывается имя сервера 1С:Предприятия, на котором расположена информационная база. -• База - для серверного режима указывается имя информационной базы на сервере 1С:Предприятия. -• Пользователь - имя пользователя, который вошел в информационную базу. Если в имени пользователя присутствует ";", то в качестве имени пользователя для подключения нужно использовать имя от начала строки до ";".</value> - - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа25 - 1815 - - Декорация37 - 1816 - true - true - - true - - - Декорация37ExtendedTooltip - 2074 - Label - true - true - - Left - - - - Декорация37КонтекстноеМеню - 1817 - true - - Label - 1 - true - true - - Left - - - - ВариантыРаботыИнформационнойБазы - 794 - - СтраницаВариантРаботыФайловый - 795 - - COMКаталогИнформационнойБазы - 790 - true - true - - true - - - Объект.COMКаталогИнформационнойБазы - - - COMКаталогИнформационнойБазыExtendedTooltip - 2077 - Label - true - true - - Left - - - - COMКаталогИнформационнойБазыКонтекстноеМеню - 791 - true - - InputField - true - Enter - true - Left - true - - - StartChoice - COMКаталогИнформационнойБазыНачалоВыбора - - - Opening - COMКаталогИнформационнойБазыОткрытие - - true - true - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Страница вариант работы файловый</value> - - - ru - Страница вариант работы файловый - - - СтраницаВариантРаботыФайловыйExtendedTooltip - 2076 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаВариантРаботыКлиентСерверный - 796 - - COMИмяСервера1СПредприятия - 788 - - <key>ru</key> - <value>Кластер серверов</value> - - true - true - - true - - - Объект.COMИмяСервера1СПредприятия - - - COMИмяСервера1СПредприятияExtendedTooltip - 2079 - Label - true - true - - Left - - - - COMИмяСервера1СПредприятияКонтекстноеМеню - 789 - true - - InputField - true - Enter - true - Left - true - - 20 - true - true - false - true - true - true - true - true - Normal - - - - COMИмяИнформационнойБазыНаСервере1СПредприятия - 784 - - <key>ru</key> - <value>Имя информационной базы</value> - - true - true - - true - - - Объект.COMИмяИнформационнойБазыНаСервере1СПредприятия - - - COMИмяИнформационнойБазыНаСервере1СПредприятияExtendedTooltip - 2080 - Label - true - true - - Left - - - - COMИмяИнформационнойБазыНаСервере1СПредприятияКонтекстноеМеню - 785 - true - - InputField - true - Enter - true - Left - true - - 20 - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Страница вариант работы клиент серверный</value> - - - ru - Страница вариант работы клиент серверный - - - СтраницаВариантРаботыКлиентСерверныйExtendedTooltip - 2078 - Label - true - true - - Left - - - Page - - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Варианты работы информационной базы</value> - - - ru - Варианты работы информационной базы - - - ВариантыРаботыИнформационнойБазыExtendedTooltip - 2075 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - Группа25ExtendedTooltip - 2073 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа4 - 2533 - - Группа27 - 1821 - - COMГруппаПользовательПароль - 797 - - ТипАутентификации1С - 1819 - true - true - - true - - - ТипАутентификации - - None - - OnChange - ТипАутентификацииПриИзменении - - - ТипАутентификации1СРасширеннаяПодсказка - 2082 - Label - true - true - - Left - - - - ТипАутентификации1СКонтекстноеМеню - 1820 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Аутентификация 1С Предприятия - - - 0 - - - Vertical - - - - Группа21 - 2537 - - Декорация2 - 2539 - true - true - - true - - - Декорация2РасширеннаяПодсказка - 2541 - Label - true - true - - Left - - - - Декорация2КонтекстноеМеню - 2540 - true - - Label - 2 - true - true - - Left - - - - Группа20 - 2535 - - COMИмяПользователя - 786 - true - true - - true - - - Объект.COMИмяПользователя - - - COMИмяПользователяExtendedTooltip - 2084 - Label - true - true - - Left - - - - COMИмяПользователяКонтекстноеМеню - 787 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - COMПарольПользователя - 792 - true - true - - true - - - Объект.COMПарольПользователя - - - COMПарольПользователяExtendedTooltip - 2085 - Label - true - true - - Left - - - - COMПарольПользователяКонтекстноеМеню - 793 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - Группа20РасширеннаяПодсказка - 2536 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа21РасширеннаяПодсказка - 2538 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Аутентификация 1С Предприятия</value> - - - COMГруппаПользовательПарольExtendedTooltip - 2083 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа27ExtendedTooltip - 2081 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ТипАутентификацииОС - 2530 - true - true - - true - - - ТипАутентификации - - None - - OnChange - ТипАутентификацииПриИзменении - - - ТипАутентификацииОСРасширеннаяПодсказка - 2532 - Label - true - true - - Left - - - - ТипАутентификацииОСКонтекстноеМеню - 2531 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Аутентификация операционной системы - - - 1 - - - Vertical - - - true - true - - true - - - Группа4РасширеннаяПодсказка - 2534 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаКнопокПроверкиПодключенияCOM - 1075 - - ПроверитьПодключениеCOM - 798 - true - true - - true - - - ПроверитьПодключениеCOMExtendedTooltip - 2087 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьПодключениеCOM - Normal - Auto - 20 - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа кнопок проверки подключения COM</value> - - - ru - Группа кнопок проверки подключения COM - - - ГруппаКнопокПроверкиПодключенияCOMExtendedTooltip - 2086 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаОшибкиПодключения - 2557 - - КартинкаПредупреждениеПодключения - 2559 - - <key>ru</key> - <value>Картинка предупреждение подключения</value> - - true - true - - true - - - КартинкаПредупреждениеПодключенияРасширеннаяПодсказка - 2561 - Label - true - true - - Left - - - - КартинкаПредупреждениеПодключенияКонтекстноеМеню - 2560 - true - - false - false - Left - Top - - - CommonPicture.Предупреждение32 - - - - - ТекстОшибкиПроверкиПодключения - 2562 - true - true - - true - - - ТекстОшибкиПроверкиПодключенияРасширеннаяПодсказка - 2564 - Label - true - true - - Left - - - - ТекстОшибкиПроверкиПодключенияКонтекстноеМеню - 2563 - true - - Label - true - true - Left - Top - - Left - Top - - - true - true - - true - - - <key>ru</key> - <value>Группа ошибки подключения</value> - - - ru - Группа ошибки подключения - - true - - ГруппаОшибкиПодключенияРасширеннаяПодсказка - 2558 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа24ExtendedTooltip - 2068 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - НадписьДалее - 847 - - <key>ru</key> - <value>Нажмите "Далее" для настройки параметров синхронизации данных.</value> - - true - true - - true - - - НадписьДалееExtendedTooltip - 2091 - Label - true - true - - Left - - - - НадписьДалееКонтекстноеМеню - 848 - true - - Label - true - true - false - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница параметров транспорта COM</value> - - - ru - Страница параметров транспорта COM - - - СтраницаПараметровТранспортаCOMExtendedTooltip - 2066 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаПараметровТранспортаWS - 1076 - - Декорация60 - 1908 - - <key>ru</key> - <value>Этот вариант подключения рекомендуется выбрать, если программа находится -в другой сети (офисе) и при этом доступна для подключения через Интернет.</value> - - true - true - - true - - - Декорация60ExtendedTooltip - 2093 - Label - true - true - - Left - - - - Декорация60КонтекстноеМеню - 1909 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - Группа28 - 1822 - - Группа2 - 1750 - - WSИмяПользователя - 1079 - true - true - - true - - - Объект.WSИмяПользователя - - - WSИмяПользователяExtendedTooltip - 2102 - Label - true - true - - Left - - - - WSИмяПользователяКонтекстноеМеню - 1080 - true - - InputField - true - Enter - true - Left - true - - 30 - true - true - true - true - true - true - true - Normal - - - - WSПароль - 1081 - true - true - - true - - - Объект.WSПароль - - - WSПарольExtendedTooltip - 2103 - Label - true - true - - Left - - - - WSПарольКонтекстноеМеню - 1082 - true - - InputField - true - Enter - true - Left - true - - 30 - true - true - true - true - true - true - true - Normal - - - - Группа10 - 1926 - - WSЗапомнитьПароль1 - 1795 - true - true - - true - - - Объект.WSЗапомнитьПароль - - Right - - WSЗапомнитьПароль1ExtendedTooltip - 2105 - Label - true - true - - Left - - - - WSЗапомнитьПароль1КонтекстноеМеню - 1796 - true - - CheckBoxField - Enter - true - Left - true - - - - ПараметрыДоступаВИнтернет1 - 1925 - true - true - - true - - - ПараметрыДоступаВИнтернет1ExtendedTooltip - 2106 - Label - true - true - - Left - - - Hyperlink - Form.Command.ПараметрыДоступаВИнтернет - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - Группа10ExtendedTooltip - 2104 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа2ExtendedTooltip - 2101 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ПроверитьПодключениеWS - 1083 - true - true - - true - - - ПроверитьПодключениеWSExtendedTooltip - 2107 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьПодключениеWS - Normal - Auto - 20 - true - true - UserCmds - Auto - - - Группа29 - 1823 - - ДекорацияПараметрыПодключенияWS - 1824 - - <key>ru</key> - <value>Укажите параметры подключения к другой программе:</value> - - true - true - - true - - Button - - ДекорацияПараметрыПодключенияWSРасширеннаяПодсказка - 2097 - - <key>ru</key> - <value>Для настройки синхронизации данных нужно знать где находится программа, с которой нужно настроить синхронизацию (другая программа). Для этого достаточно открыть программу в режиме веб-клиента. В главном меню выбрать пункт "Справка\О программе...". -Обратите внимание на следующие параметры (все они могут быть скопированы из формы "О программе..."): -• Адрес - адрес информационной базы в Интернете. -• Пользователь - имя пользователя, который вошел в информационную базу. Если в имени пользователя присутствует ";", то в качестве имени пользователя для подключения нужно использовать имя от начала строки до ";". -Важно! Имя пользователя не должно содержать служебных символов "[НедопустимыеСимволы]". В противном случае во второй информационной базе необходимо создать пользователя, в имени которого не будут содержаться служебные символы. Этот пользователь должен быть администратором.</value> - - Label - true - true - - Left - - - - ДекорацияПараметрыПодключенияWSКонтекстноеМеню - 1825 - true - - Label - 1 - true - - Left - Top - - - - Группа31 - 1827 - - WSURLВебСервиса - 1077 - - <key>ru</key> - <value>Адрес программы</value> - - true - true - - true - - - Объект.WSURLВебСервиса - - - WSURLВебСервисаExtendedTooltip - 2100 - Label - true - true - - Left - - - - WSURLВебСервисаКонтекстноеМеню - 1078 - true - - InputField - true - Enter - true - Left - true - - 50 - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - Группа31ExtendedTooltip - 2099 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Укажите параметры подключения к другой программе</value> - - - Группа29ExtendedTooltip - 2095 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа28ExtendedTooltip - 2094 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервис - 1751 - - <key>ru</key> - <value>Нажмите "Далее" для настройки параметров синхронизации данных.</value> - - true - true - - true - - - НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервисExtendedTooltip - 2108 - Label - true - true - - Left - - - - НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервисКонтекстноеМеню - 1752 - true - - Label - true - true - false - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница параметров транспорта WS</value> - - - ru - Страница параметров транспорта WS - - - СтраницаПараметровТранспортаWSExtendedTooltip - 2092 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаПараметровТранспорта - 832 - - Декорация61 - 1910 - - <key>ru</key> - <value>В случае если к другой программе нет возможности прямого подключения по локальной сети -или через Интернет (веб-сервисы), рекомендуется использовать другие каналы связи: сетевой -каталог, FTP-ресурс или электронную почту. При этом программы, между которыми настроена -синхронизация данных, могут работать полностью автономно друг от друга и в разное время. - -Такой вариант подключения подходит не только для синхронизации данных с программами, -расположенными в других сетях (офисах), но и для программ в одной сети.</value> - - true - true - - true - - - Декорация61ExtendedTooltip - 2110 - Label - true - true - - Left - - - - Декорация61КонтекстноеМеню - 1911 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - Top - - - - НадписьДалее1 - 853 - - <key>ru</key> - <value>Нажмите "Далее" для настройки параметров подключения.</value> - - true - true - - true - - - НадписьДалее1ExtendedTooltip - 2111 - Label - true - true - - Left - - - - НадписьДалее1КонтекстноеМеню - 854 - true - - Label - true - true - false - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница параметров транспорта</value> - - - ru - Страница параметров транспорта - - - СтраницаПараметровТранспортаExtendedTooltip - 2109 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Страницы параметров транспорта</value> - - - ru - Страницы параметров транспорта - - - СтраницыПараметровТранспортаExtendedTooltip - 2065 - Label - true - true - - Left - - - Pages - - Auto - - - true - true - - true - - - ru - Группа отступ - - - ГруппаОтступExtendedTooltip - 2064 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера выбор режима работы помощника</value> - - - ru - Страница мастера выбор режима работы помощника - - - СтраницаМастераВыборРежимаРаботыПомощникаExtendedTooltip - 2051 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераЗаданиеПараметровТранспортаFILE - 694 - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаFILE - 2477 - - ИспользоватьПараметрыТранспортаFILE - 717 - true - true - - true - - - Объект.ИспользоватьПараметрыТранспортаFILE - - Right - - OnChange - ИспользоватьПараметрыТранспортаFILEПриИзменении - - - ИспользоватьПараметрыТранспортаFILEExtendedTooltip - 2114 - Label - true - true - - Left - - - - ИспользоватьПараметрыТранспортаFILEКонтекстноеМеню - 718 - true - - CheckBoxField - Enter - true - Left - true - - - - НастройкиТранспортаFILE - 620 - - ПояснениеВыбораКаталогаОбменаИнформациейНаСервере - 755 - - <key>ru</key> - <value>Укажите каталог на сервере 1С:Предприятия или сетевой каталог, доступный с сервера.</value> - - true - true - - true - - - ПояснениеВыбораКаталогаОбменаИнформациейНаСервереExtendedTooltip - 2116 - Label - true - true - - Left - - - - ПояснениеВыбораКаталогаОбменаИнформациейНаСервереКонтекстноеМеню - 756 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - FILEКаталогОбменаИнформацией - 621 - true - true - - true - - - Объект.FILEКаталогОбменаИнформацией - - - FILEКаталогОбменаИнформациейExtendedTooltip - 2117 - Label - true - true - - Left - - - - FILEКаталогОбменаИнформациейКонтекстноеМеню - 622 - true - - InputField - true - Enter - true - Left - true - - - StartChoice - FILEКаталогОбменаИнформациейНачалоВыбора - - - Opening - FILEКаталогОбменаИнформациейОткрытие - - true - true - true - true - true - true - Normal - - - - Группа32 - 1836 - - FILEСжиматьФайлИсходящегоСообщения - 623 - true - true - - true - - - Объект.FILEСжиматьФайлИсходящегоСообщения - - Right - - FILEСжиматьФайлИсходящегоСообщенияExtendedTooltip - 2119 - Label - true - true - - Left - - - - FILEСжиматьФайлИсходящегоСообщенияКонтекстноеМеню - 624 - true - - CheckBoxField - Enter - true - Left - true - - - - Группа22 - 2542 - - Декорация6 - 2544 - true - true - - true - - - Декорация6РасширеннаяПодсказка - 2546 - Label - true - true - - Left - - - - Декорация6КонтекстноеМеню - 2545 - true - - Label - 2 - true - true - - Left - - - - ПарольАрхиваСообщенияОбмена - 639 - true - true - - true - - - Объект.ПарольАрхиваСообщенияОбмена - - - ПарольАрхиваСообщенияОбменаExtendedTooltip - 2120 - Label - true - true - - Left - - - - ПарольАрхиваСообщенияОбменаКонтекстноеМеню - 640 - true - - InputField - Enter - true - Left - true - - 20 - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - Группа22РасширеннаяПодсказка - 2543 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа32ExtendedTooltip - 2118 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ОтступКнопкиПроверкиПодключенияFILE - 664 - - ПроверитьПодключениеFILE - 654 - true - true - - true - - false - - ПроверитьПодключениеFILEExtendedTooltip - 2122 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьПодключениеFILE - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - ОтступКнопкиПроверкиПодключенияFILEExtendedTooltip - 2121 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки транспорта FILE</value> - - - ru - Настройки транспорта FILE - - - НастройкиТранспортаFILEExtendedTooltip - 2115 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - Декорация4 - 697 - true - true - - true - - - Декорация4ExtendedTooltip - 2123 - Label - true - true - - Left - - - - Декорация4КонтекстноеМеню - 698 - true - - Label - true - true - true - false - - Left - - - - НадписьДалееFILE - 699 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для настройки подключения через FTP-ресурс.</value> - - true - true - - true - - - НадписьДалееFILEExtendedTooltip - 2124 - Label - true - true - - Left - - - - НадписьДалееFILEКонтекстноеМеню - 700 - true - - Label - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Выбор каталога для файлов синхронизации данных</value> - - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаFILEРасширеннаяПодсказка - 2478 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера задание параметров транспорта FILE</value> - - - ru - Страница мастера задание параметров транспорта FILE - - - СтраницаМастераЗаданиеПараметровТранспортаFILEExtendedTooltip - 2112 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераЗаданиеПараметровТранспортаFTP - 708 - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаFTP - 2475 - - ИспользоватьПараметрыТранспортаFTP - 719 - true - true - - true - - - Объект.ИспользоватьПараметрыТранспортаFTP - - Right - - OnChange - ИспользоватьПараметрыТранспортаFTPПриИзменении - - - ИспользоватьПараметрыТранспортаFTPExtendedTooltip - 2127 - Label - true - true - - Left - - - - ИспользоватьПараметрыТранспортаFTPКонтекстноеМеню - 720 - true - - CheckBoxField - Enter - true - Left - true - - - - НастройкиТранспортаFTP - 617 - - Декорация54 - 1858 - - <key>ru</key> - <value>Укажите путь к FTP каталогу, например, "ftp://SyncServer/Accounting/"</value> - - true - true - - true - - - Декорация54ExtendedTooltip - 2129 - Label - true - true - - Left - - - - Декорация54КонтекстноеМеню - 1859 - true - - Label - true - - Style.ПоясняющийТекст - - - Left - - - - ГруппаСерверПорт - 650 - - FTPСоединениеПуть - 637 - true - true - - true - - - Объект.FTPСоединениеПуть - - - FTPСоединениеПутьExtendedTooltip - 2131 - Label - true - true - - Left - - - - FTPСоединениеПутьКонтекстноеМеню - 638 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - FTPСоединениеПорт - 635 - true - true - - true - - - Объект.FTPСоединениеПорт - - - FTPСоединениеПортExtendedTooltip - 2132 - 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 - Группа сервер порт - - - ГруппаСерверПортExtendedTooltip - 2130 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаПользовательПароль - 651 - - FTPСоединениеПользователь - 633 - true - true - - true - - - Объект.FTPСоединениеПользователь - - - FTPСоединениеПользовательExtendedTooltip - 2134 - Label - true - true - - Left - - - - FTPСоединениеПользовательКонтекстноеМеню - 634 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - Normal - - - - FTPСоединениеПароль - 629 - true - true - - true - - - Объект.FTPСоединениеПароль - - - FTPСоединениеПарольExtendedTooltip - 2135 - 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 - Группа пользователь пароль - - - ГруппаПользовательПарольExtendedTooltip - 2133 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа34 - 1850 - - FTPСоединениеМаксимальныйДопустимыйРазмерСообщения - 627 - true - true - - true - - - Объект.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения - - - FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияExtendedTooltip - 2137 - Label - true - true - - Left - - - - FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню - 628 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - - Декорация51 - 1851 - - <key>ru</key> - <value>КБ (0 – нет ограничений)</value> - - true - true - - true - - - Декорация51ExtendedTooltip - 2138 - Label - true - true - - Left - - - - Декорация51КонтекстноеМеню - 1852 - true - - Label - true - - Left - - - true - true - - true - - - Группа34ExtendedTooltip - 2136 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - FTPСоединениеПассивноеСоединение - 631 - true - true - - true - - - Объект.FTPСоединениеПассивноеСоединение - - Right - - FTPСоединениеПассивноеСоединениеExtendedTooltip - 2139 - Label - true - true - - Left - - - - FTPСоединениеПассивноеСоединениеКонтекстноеМеню - 632 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаЗаданияПароляСообщенияОбменаFTP - 661 - - FTPСжиматьФайлИсходящегоСообщения - 625 - true - true - - true - - - Объект.FTPСжиматьФайлИсходящегоСообщения - - Right - - FTPСжиматьФайлИсходящегоСообщенияExtendedTooltip - 2141 - Label - true - true - - Left - - - - FTPСжиматьФайлИсходящегоСообщенияКонтекстноеМеню - 626 - true - - CheckBoxField - Enter - true - Left - true - - - - Группа30 - 2547 - - Декорация11 - 2549 - true - true - - true - - - Декорация11РасширеннаяПодсказка - 2551 - Label - true - true - - Left - - - - Декорация11КонтекстноеМеню - 2550 - true - - Label - 2 - true - true - - Left - - - - ПарольАрхиваСообщенияОбмена1 - 657 - true - true - - true - - - Объект.ПарольАрхиваСообщенияОбмена - - - ПарольАрхиваСообщенияОбмена1ExtendedTooltip - 2142 - 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 - - - Группа30РасширеннаяПодсказка - 2548 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа задания пароля сообщения обмена FTP</value> - - - ru - Группа задания пароля сообщения обмена FTP - - - ГруппаЗаданияПароляСообщенияОбменаFTPExtendedTooltip - 2140 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ПараметрыДоступаВИнтернет2 - 1927 - true - true - - true - - - ПараметрыДоступаВИнтернет2ExtendedTooltip - 2143 - Label - true - true - - Left - - - Hyperlink - Form.Command.ПараметрыДоступаВИнтернет - Normal - Auto - true - true - UserCmds - Auto - - - ОтступКнопкиПроверкиПодключенияFTP - 665 - - ПроверитьПодключениеFTP - 655 - true - true - - true - - false - - ПроверитьПодключениеFTPExtendedTooltip - 2145 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьПодключениеFTP - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - ru - Отступ кнопки проверки подключения FTP - - - ОтступКнопкиПроверкиПодключенияFTPExtendedTooltip - 2144 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки транспорта FTP</value> - - - ru - Настройки транспорта FTP - - - НастройкиТранспортаFTPExtendedTooltip - 2128 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - Декорация8 - 711 - true - true - - true - - - Декорация8ExtendedTooltip - 2146 - Label - true - true - - Left - - - - Декорация8КонтекстноеМеню - 712 - true - - Label - true - true - true - false - - Left - - - - НадписьДалееFTP - 713 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для настройки подключения по почте.</value> - - true - true - - true - - - НадписьДалееFTPExtendedTooltip - 2147 - Label - true - true - - Left - - - - НадписьДалееFTPКонтекстноеМеню - 714 - true - - Label - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Настройка параметров подключения через FTP-ресурс</value> - - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаFTPРасширеннаяПодсказка - 2476 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера задание параметров транспорта FTP</value> - - - ru - Страница мастера задание параметров транспорта FTP - - - СтраницаМастераЗаданиеПараметровТранспортаFTPExtendedTooltip - 2125 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераЗаданиеПараметровТранспортаEMAIL - 701 - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаEMAIL - 2473 - - ИспользоватьПараметрыТранспортаEMAIL - 721 - true - true - - true - - - Объект.ИспользоватьПараметрыТранспортаEMAIL - - Right - - OnChange - ИспользоватьПараметрыТранспортаEMAILПриИзменении - - - ИспользоватьПараметрыТранспортаEMAILExtendedTooltip - 2150 - Label - true - true - - Left - - - - ИспользоватьПараметрыТранспортаEMAILКонтекстноеМеню - 722 - true - - CheckBoxField - Enter - true - Left - true - - - - НастройкиТранспортаEMAIL - 619 - - EMAILУчетнаяЗапись - 652 - true - true - - true - - - Объект.EMAILУчетнаяЗапись - - - EMAILУчетнаяЗаписьExtendedTooltip - 2152 - Label - true - true - - Left - - - - EMAILУчетнаяЗаписьКонтекстноеМеню - 653 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - Группа35 - 1853 - - EMAILМаксимальныйДопустимыйРазмерСообщения - 643 - true - true - - true - - - Объект.EMAILМаксимальныйДопустимыйРазмерСообщения - - - EMAILМаксимальныйДопустимыйРазмерСообщенияExtendedTooltip - 2154 - Label - true - true - - Left - - - - EMAILМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню - 644 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - - Декорация52 - 1854 - - <key>ru</key> - <value>КБ (0 – нет ограничений)</value> - - true - true - - true - - - Декорация52ExtendedTooltip - 2155 - Label - true - true - - Left - - - - Декорация52КонтекстноеМеню - 1855 - true - - Label - true - - Left - - - true - true - - true - - - Группа35ExtendedTooltip - 2153 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа33 - 1849 - - EMAILСжиматьФайлИсходящегоСообщения - 645 - true - true - - true - - - Объект.EMAILСжиматьФайлИсходящегоСообщения - - Right - - EMAILСжиматьФайлИсходящегоСообщенияExtendedTooltip - 2157 - Label - true - true - - Left - - - - EMAILСжиматьФайлИсходящегоСообщенияКонтекстноеМеню - 646 - true - - CheckBoxField - Enter - true - Left - true - - - - Группа36 - 2552 - - Декорация18 - 2554 - true - true - - true - - - Декорация18РасширеннаяПодсказка - 2556 - Label - true - true - - Left - - - - Декорация18КонтекстноеМеню - 2555 - true - - Label - 2 - true - true - - Left - - - - ПарольАрхиваСообщенияОбмена2 - 659 - true - true - - true - - - Объект.ПарольАрхиваСообщенияОбмена - - - ПарольАрхиваСообщенияОбмена2ExtendedTooltip - 2158 - Label - true - true - - Left - - - - ПарольАрхиваСообщенияОбмена2КонтекстноеМеню - 660 - true - - InputField - Enter - true - Left - true - - 20 - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - Группа36РасширеннаяПодсказка - 2553 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - Группа33ExtendedTooltip - 2156 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ОтступКнопкиПроверкиПодключенияEMAIL - 666 - - ПроверитьПодключениеEMAIL - 656 - true - true - - true - - false - - ПроверитьПодключениеEMAILExtendedTooltip - 2160 - Label - true - true - - Left - - - UsualButton - Form.Command.ПроверитьПодключениеEMAIL - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - ОтступКнопкиПроверкиПодключенияEMAILExtendedTooltip - 2159 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки транспорта EMAIL</value> - - - ru - Настройки транспорта EMAIL - - - НастройкиТранспортаEMAILExtendedTooltip - 2151 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - Декорация7 - 704 - true - true - - true - - - Декорация7ExtendedTooltip - 2161 - Label - true - true - - Left - - - - Декорация7КонтекстноеМеню - 705 - true - - Label - true - true - true - false - - Left - - - - НадписьДалееEMAIL - 706 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для настройки дополнительных параметров обмена данными.</value> - - true - true - - true - - - НадписьДалееEMAILExtendedTooltip - 2162 - Label - true - true - - Left - - - - НадписьДалееEMAILКонтекстноеМеню - 707 - true - - Label - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Настройка параметров подключения по электронной почте</value> - - - ru - Группа страница мастера задание параметров транспорта EMAIL - - - ГруппаСтраницаМастераЗаданиеПараметровТранспортаEMAILРасширеннаяПодсказка - 2474 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера задание параметров транспорта EMAIL</value> - - - ru - Страница мастера задание параметров транспорта EMAIL - - - СтраницаМастераЗаданиеПараметровТранспортаEMAILExtendedTooltip - 2148 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераНастройкаПараметров - 6 - - Группа6 - 1800 - - Группа19 - 1802 - - НаименованиеЭтойБазы - 67 - - <key>ru</key> - <value>Наименование этой информационной базы</value> - - true - true - - true - - - Объект.НаименованиеЭтойБазы - - Top - - НаименованиеЭтойБазыExtendedTooltip - 2168 - Label - true - true - - Left - - - - НаименованиеЭтойБазыКонтекстноеМеню - 68 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПрефиксИнформационнойБазыИсточника - 117 - - <key>ru</key> - <value>Префикс</value> - - true - true - - true - - - Объект.ПрефиксИнформационнойБазыИсточника - - Top - - ПрефиксИнформационнойБазыИсточникаExtendedTooltip - 2172 - Label - true - true - - Left - - - - ПрефиксИнформационнойБазыИсточникаКонтекстноеМеню - 118 - true - - InputField - true - Enter - true - Left - true - - 3 - true - true - true - true - true - true - true - Normal - - - - ЗаглушкаПрефикс - 2470 - true - true - - true - - - ЗаглушкаПрефиксРасширеннаяПодсказка - 2472 - Label - true - true - - Left - - - - ЗаглушкаПрефиксКонтекстноеМеню - 2471 - true - - Label - true - true - - Left - - - true - true - - true - - - Группа19ExtendedTooltip - 2167 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа41 - 1879 - - НаименованиеВторойБазы - 978 - - <key>ru</key> - <value>Наименование другой информационной базы</value> - - true - true - - true - - - Объект.НаименованиеВторойБазы - - Top - - НаименованиеВторойБазыExtendedTooltip - 2169 - Label - true - true - - Left - - - - НаименованиеВторойБазыКонтекстноеМеню - 979 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПрефиксИнформационнойБазыПриемника1 - 1033 - - <key>ru</key> - <value>Префикс</value> - - true - true - - true - - - Объект.ПрефиксИнформационнойБазыПриемника - - Top - Button - - ПрефиксИнформационнойБазыПриемника1ExtendedTooltip - 2175 - - <key>ru</key> - <value>Для того чтобы узнать префикс второй информационной базы следует выполнить запуск программы и перейти в форму синхронизации данных. Если во второй информационной базе префикс не задан, то следует указать любой желаемый префикс. Этот префикс будет установлен во второй базе при настройке синхронизации данных.</value> - - Label - true - true - - Left - - - - ПрефиксИнформационнойБазыПриемника1КонтекстноеМеню - 1034 - true - - InputField - true - Enter - true - Left - true - - 3 - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - Группа41ExtendedTooltip - 2174 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаСпособПодключения - 1875 - - ВидТранспортаСообщенийОбмена - 715 - true - true - - true - - - Объект.ВидТранспортаСообщенийОбмена - - Top - - ВидТранспортаСообщенийОбменаExtendedTooltip - 2178 - Label - true - true - - Left - - - - ВидТранспортаСообщенийОбменаКонтекстноеМеню - 716 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - true - - - ru - Локальный или сетевой каталог - - - Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FILE - - - - - ru - FTP-ресурс - - - Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FTP - - - - - ru - Почтовые сообщения - - - Enum.ВидыТранспортаСообщенийОбмена.EnumValue.EMAIL - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа способ подключения</value> - - - ru - Группа способ подключения - - - ГруппаСпособПодключенияРасширеннаяПодсказка - 2177 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройка параметров синхронизации данных</value> - - - Группа6ExtendedTooltip - 2165 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - НастройкиУзла - 539 - - РамкаГруппыОграничений - 111 - - ОписаниеОграниченийПередачиДанных - 387 - - <key>ru</key> - <value>Правила отправки данных в -%Программа%</value> - - true - true - - true - - - ОписаниеОграниченийПередачиДанных - - Top - - ОписаниеОграниченийПередачиДанныхExtendedTooltip - 2184 - Label - true - true - - Left - - - - ОписаниеОграниченийПередачиДанныхКонтекстноеМеню - 388 - true - - InputField - true - Enter - true - Left - true - - 8 - true - true - true - true - true - true - Normal - - - - НастройкаОграниченийРегистрацииДанных - 110 - true - true - - true - - false - - НастройкаОграниченийРегистрацииДанныхExtendedTooltip - 2185 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаОграниченийРегистрацииДанных - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Ограничения передачи данных:</value> - - - ru - Рамка группы ограничений - - true - false - - РамкаГруппыОграниченийExtendedTooltip - 2182 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - РамкаГруппыЗначенийПоУмолчанию - 532 - - ОписаниеЗначенийПоУмолчанию - 533 - - <key>ru</key> - <value>Правила получения данных из -%Программа%</value> - - true - true - - true - - - ОписаниеЗначенийПоУмолчанию - - Top - - ОписаниеЗначенийПоУмолчаниюExtendedTooltip - 2188 - Label - true - true - - Left - - - - ОписаниеЗначенийПоУмолчаниюКонтекстноеМеню - 534 - true - - InputField - true - Enter - true - Left - true - - 8 - true - true - true - true - true - true - Normal - - - - НастройкаЗначенийПоУмолчанию - 538 - true - true - - true - - false - - НастройкаЗначенийПоУмолчаниюExtendedTooltip - 2189 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаЗначенийПоУмолчанию - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Значения по умолчанию:</value> - - true - false - - РамкаГруппыЗначенийПоУмолчаниюExtendedTooltip - 2186 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки узла</value> - - - ru - Настройки узла - - - НастройкиУзлаExtendedTooltip - 2181 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Equal - Auto - Auto - - - - Декорация5 - 194 - true - true - - true - - - Декорация5ExtendedTooltip - 2190 - Label - true - true - - Left - - - - Декорация5КонтекстноеМеню - 195 - true - - Label - true - true - true - false - - Left - - - - НадписьДалееПодтверждениеНастроек - 131 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для проверки параметров и завершения настройки синхронизации данных.</value> - - true - true - - true - - - НадписьДалееПодтверждениеНастроекExtendedTooltip - 2191 - Label - true - true - - Left - - - - НадписьДалееПодтверждениеНастроекКонтекстноеМеню - 132 - true - - Label - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера настройка параметров</value> - - - ru - Страница мастера настройка параметров - - - СтраницаМастераНастройкаПараметровExtendedTooltip - 2163 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаМастераНастройкаПараметровВторогоЭтапаНастройки - 1038 - - ГруппаСтраницаМастераНастройкаПараметровВторогоЭтапаНастройки - 2468 - - ВидТранспортаСообщенийОбмена1 - 1045 - true - true - - true - - - Объект.ВидТранспортаСообщенийОбмена - - Top - - ВидТранспортаСообщенийОбмена1ExtendedTooltip - 2194 - Label - true - true - - Left - - - - ВидТранспортаСообщенийОбмена1КонтекстноеМеню - 1046 - 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 - - - - НастройкиУзла2 - 1054 - - РамкаГруппыОграничений2 - 1055 - - ОписаниеОграниченийПередачиДанных2 - 1056 - - <key>ru</key> - <value>Правила отправки данных в -%Программа%</value> - - true - true - - true - - - ОписаниеОграниченийПередачиДанных - - Top - - ОписаниеОграниченийПередачиДанных2ExtendedTooltip - 2198 - Label - true - true - - Left - - - - ОписаниеОграниченийПередачиДанных2КонтекстноеМеню - 1057 - true - - InputField - true - Enter - true - Left - true - - 8 - true - true - true - true - true - true - Normal - - - - НастройкаОграниченийРегистрацииДанных2 - 1059 - true - true - - true - - false - - НастройкаОграниченийРегистрацииДанных2ExtendedTooltip - 2199 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаОграниченийРегистрацииДанных - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Ограничения передачи данных:</value> - - - ru - Рамка группы ограничений - - true - false - - РамкаГруппыОграничений2ExtendedTooltip - 2196 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - РамкаГруппыЗначенийПоУмолчанию2 - 1060 - - ОписаниеЗначенийПоУмолчанию2 - 1061 - - <key>ru</key> - <value>Правила получения данных из -%Программа%</value> - - true - true - - true - - - ОписаниеЗначенийПоУмолчанию - - Top - - ОписаниеЗначенийПоУмолчанию2ExtendedTooltip - 2202 - Label - true - true - - Left - - - - ОписаниеЗначенийПоУмолчанию2КонтекстноеМеню - 1062 - true - - InputField - true - Enter - true - Left - true - - 8 - true - true - true - true - true - true - Normal - - - - НастройкаЗначенийПоУмолчанию2 - 1064 - true - true - - true - - false - - НастройкаЗначенийПоУмолчанию2ExtendedTooltip - 2203 - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкаЗначенийПоУмолчанию - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Значения по умолчанию:</value> - - true - false - - РамкаГруппыЗначенийПоУмолчанию2ExtendedTooltip - 2200 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки узла</value> - - - ru - Настройки узла - - - НастройкиУзла2ExtendedTooltip - 2195 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Equal - Auto - Auto - - - - Декорация23 - 1065 - true - true - - true - - - Декорация23ExtendedTooltip - 2204 - Label - true - true - - Left - - - - Декорация23КонтекстноеМеню - 1066 - true - - Label - true - true - true - false - - Left - - - - НадписьДалееПодтверждениеНастроек3 - 1067 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для проверки параметров и завершения настройки синхронизации данных.</value> - - true - true - - true - - - НадписьДалееПодтверждениеНастроек3ExtendedTooltip - 2205 - Label - true - true - - Left - - - - НадписьДалееПодтверждениеНастроек3КонтекстноеМеню - 1068 - true - - Label - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Настройка параметров синхронизации данных</value> - - - ГруппаСтраницаМастераНастройкаПараметровВторогоЭтапаНастройкиРасширеннаяПодсказка - 2469 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница мастера настройка параметров второго этапа настройки</value> - - - ru - Страница мастера настройка параметров - - - СтраницаМастераНастройкаПараметровВторогоЭтапаНастройкиExtendedTooltip - 2192 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - СтраницаМастераНастройкаПараметровДляВнешнегоСоединенияПервойБазы 910 @@ -9637,7 +2872,7 @@ - ПрефиксИнформационнойБазыИсточника1 + ПрефиксИнформационнойБазыИсточникаОбменЧерезВнешнееСоединение 918 true true @@ -9649,7 +2884,7 @@ Top - ПрефиксИнформационнойБазыИсточника1ExtendedTooltip + ПрефиксИнформационнойБазыИсточникаОбменЧерезВнешнееСоединениеРасширеннаяПодсказка 2210 Label true @@ -9659,11 +2894,12 @@ - ПрефиксИнформационнойБазыИсточника1КонтекстноеМеню + ПрефиксИнформационнойБазыИсточникаОбменЧерезВнешнееСоединениеКонтекстноеМеню 919 true InputField + true true Enter true @@ -9948,10 +3184,6 @@ ru Настройки узла - - ru - Настройки узла - НастройкиУзла1ExtendedTooltip 2211 @@ -10123,7 +3355,7 @@ - ПрефиксИнформационнойБазыПриемника + ПрефиксИнформационнойБазыПриемникаОбменЧерезВнешнееСоединение 1005 true true @@ -10135,7 +3367,7 @@ Top - ПрефиксИнформационнойБазыПриемникаExtendedTooltip + ПрефиксИнформационнойБазыПриемникаОбменЧерезВнешнееСоединениеРасширеннаяПодсказка 2226 Label true @@ -10145,11 +3377,12 @@ - ПрефиксИнформационнойБазыПриемникаКонтекстноеМеню + ПрефиксИнформационнойБазыПриемникаОбменЧерезВнешнееСоединениеКонтекстноеМеню 1006 true InputField + true Enter true Left @@ -10158,6 +3391,7 @@ true true true + true true true true @@ -10432,10 +3666,6 @@ ru Настройки узла - - ru - Настройки узла - НастройкиУзлаБазыКорреспондента1ExtendedTooltip 2227 @@ -10553,6 +3783,6899 @@ false + + СтраницаМастераСопоставлениеДанных + 1331 + + ГруппаСтраницаМастераСопоставлениеДанных + 2479 + + СтраницыСтатусаСопоставленияДанных + 1674 + + СтатусСопоставленияЕстьНесопоставленныеДанные + 1675 + + ПояснениеОНаличииНесопоставленныхОбъектов1 + 1717 + + <key>ru</key> + <value>Учет ведется в обеих программах, поэтому следует выполнить сопоставление данных. +Это позволит избежать появления дублирующихся элементов справочников, которые независимо друг от друга +были введены в обеих программах, например, с одинаковыми наименованиями. +С помощью сопоставления можно указать, какие данные являются одинаковыми в двух программах.</value> + + true + true + + true + + + ПояснениеОНаличииНесопоставленныхОбъектов1ExtendedTooltip + 1995 + Label + true + true + + Left + + + + ПояснениеОНаличииНесопоставленныхОбъектов1КонтекстноеМеню + 1718 + true + + Label + true + false + + Style.ПоясняющийТекст + + + Left + Top + + + + ДеревоИнформацииСтатистики + 1651 + + <key>ru</key> + <value>Дерево информации статистики</value> + + true + true + + true + + + ДеревоИнформацииСтатистики + + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ДеревоИнформацииСтатистикиГруппа + 1668 + + ДеревоИнформацииСтатистикиКартинка + 1658 + true + true + + true + + + ДеревоИнформацииСтатистики.Картинка + + None + + ДеревоИнформацииСтатистикиКартинкаExtendedTooltip + 2000 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиКартинкаКонтекстноеМеню + 1659 + true + + PictureField + true + Auto + true + Left + true + + true + true + true + + + 1 + + + + + ДеревоИнформацииСтатистикиСиноним + 1654 + true + true + + true + + + ДеревоИнформацииСтатистики.Синоним + + + ДеревоИнформацииСтатистикиСинонимExtendedTooltip + 2001 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиСинонимКонтекстноеМеню + 1655 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дерево информации статистики группа</value> + + true + + ДеревоИнформацииСтатистикиГруппаExtendedTooltip + 1999 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектов + 1656 + true + true + + true + + + ДеревоИнформацииСтатистики.ПроцентСопоставленияОбъектов + + + ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектовExtendedTooltip + 2002 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиПроцентСопоставленияОбъектовКонтекстноеМеню + 1657 + true + + InputField + true + Auto + true + Right + true + + 10 + true + true + false + true + + ru + ЧН= + + + ru + ЧН= + + true + true + true + Normal + + + + ДеревоИнформацииСтатистикиКоманднаяПанель + 1653 + + ДеревоИнформацииСтатистикиВыполнитьСопоставлениеДанных + 1681 + true + true + + true + + + ДеревоИнформацииСтатистикиВыполнитьСопоставлениеДанныхExtendedTooltip + 1997 + Label + true + true + + Left + + + Form.Command.ВыполнитьСопоставлениеДанных + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ДеревоИнформацииСтатистикиВыбор + + + ДеревоИнформацииСтатистикиSearchString + 2495 + + ДеревоИнформацииСтатистикиSearchStringExtendedTooltip + 2497 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиSearchStringContextMenu + 2496 + true + + ДеревоИнформацииСтатистики + + true + + + + ДеревоИнформацииСтатистикиViewStatus + 2498 + + ДеревоИнформацииСтатистикиViewStatusExtendedTooltip + 2500 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиViewStatusContextMenu + 2499 + true + + ViewStatusAddition + ДеревоИнформацииСтатистики + + true + + + + ДеревоИнформацииСтатистикиSearchControl + 2501 + + ДеревоИнформацииСтатистикиSearchControlExtendedTooltip + 2503 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиSearchControlContextMenu + 2502 + true + + SearchControlAddition + ДеревоИнформацииСтатистики + + true + + + + ДеревоИнформацииСтатистикиExtendedTooltip + 1998 + Label + true + true + + Left + + + + ДеревоИнформацииСтатистикиКонтекстноеМеню + 1652 + + ДеревоИнформацииСтатистикиКонтекстноеМенюВыполнитьСопоставлениеДанных + 1682 + true + true + + true + + + ДеревоИнформацииСтатистикиКонтекстноеМенюВыполнитьСопоставлениеДанныхExtendedTooltip + 1996 + Label + true + true + + Left + + + Form.Command.ВыполнитьСопоставлениеДанных + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + true + Row +
          true
          + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true +
          + true + true + + true + + + <key>ru</key> + <value>Статус сопоставления есть несопоставленные данные</value> + + + СтатусСопоставленияЕстьНесопоставленныеДанныеExtendedTooltip + 1994 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
          + + СтатусСопоставленияВсеДанныеСопоставлены + 1676 + + ГруппировкаСообщения8 + 1743 + + Декорация35 + 1745 + true + true + + true + + + Декорация35ExtendedTooltip + 2005 + Label + true + true + + Left + + + + Декорация35КонтекстноеМеню + 1746 + true + + true + true + false + + + CommonPicture.Информация32 + + + + + Декорация36 + 1748 + + <key>ru</key> + <value>Все данные сопоставлены. +Перейдите далее для продолжения настройки.</value> + + true + true + + true + + + Декорация36ExtendedTooltip + 2006 + Label + true + true + + Left + + + + Декорация36КонтекстноеМеню + 1749 + true + + Label + 3 + true + false + + System.DefaultGUIFont + 10.0 + + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Группировка сообщения 8</value> + + + ru + Группировка сообщения + + + ГруппировкаСообщения8ExtendedTooltip + 2004 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Статус сопоставления все данные сопоставлены</value> + + + СтатусСопоставленияВсеДанныеСопоставленыExtendedTooltip + 2003 + Label + true + true + + Left + + + Page + + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Сопоставление одинаковых данных</value> + + + СтраницыСтатусаСопоставленияДанныхExtendedTooltip + 1993 + Label + true + true + + Left + + + Pages + + Auto + +
          + + НадписьДалееНаСтраницеСопоставленияДанных + 1334 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для синхронизации данных.</value> + + true + true + + true + + + НадписьДалееНаСтраницеСопоставленияДанныхExtendedTooltip + 2007 + Label + true + true + + Left + + + + НадписьДалееНаСтраницеСопоставленияДанныхКонтекстноеМеню + 1335 + true + + Label + 3 + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Сопоставление одинаковых данных</value> + + + ГруппаСтраницаМастераСопоставлениеДанныхРасширеннаяПодсказка + 2480 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + +
          + true + true + + true + + + <key>ru</key> + <value>Страница мастера сопоставление данных</value> + + + СтраницаМастераСопоставлениеДанныхExtendedTooltip + 1991 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
          + + СтраницаМастераСозданиеОбменаДаннымиУспешноЗавершено + 1345 + + ГруппаРасписания + 1685 + + КартинкаЧасы + 1686 + + <key>ru</key> + <value>Картинка часы</value> + + true + true + + true + + + КартинкаЧасыExtendedTooltip + 2011 + Label + true + true + + Left + + + + КартинкаЧасыКонтекстноеМеню + 1687 + true + + true + true + + + + + + ГруппаРасписания1 + 1688 + + ВыполнятьОбменДаннымиАвтоматически + 1683 + true + true + + true + + + ВыполнятьОбменДаннымиАвтоматически + + Right + + OnChange + ВыполнятьОбменДаннымиАвтоматическиПриИзменении + + + ВыполнятьОбменДаннымиАвтоматическиExtendedTooltip + 2013 + Label + true + true + + Left + + + + ВыполнятьОбменДаннымиАвтоматическиКонтекстноеМеню + 1684 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаПредопределенногоРасписания + 1691 + + СтраницыПредопределенногоРасписания + 1710 + + СтраницаПредопределенногоРасписания + 1711 + + ПредопределенноеРасписаниеОбменаДанными + 1699 + true + true + + true + + + ПредопределенноеРасписаниеОбменаДанными + + None + + OnChange + ПредопределенноеРасписаниеОбменаДаннымиПриИзменении + + + ПредопределенноеРасписаниеОбменаДаннымиExtendedTooltip + 2017 + Label + true + true + + Left + + + + ПредопределенноеРасписаниеОбменаДаннымиКонтекстноеМеню + 1700 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Каждые 15 минут + + + Каждые15Минут + + + + + ru + Каждые 30 минут + + + Каждые30Минут + + + + + ru + Каждый час + + + КаждыйЧас + + + + + ru + Каждый день, в 8:00 + + + КаждыйДеньВ_8_00 + + + + + ru + Другое расписание + + + ДругоеРасписание + + + Vertical + + + + СтраницыПользовательскогоРасписания + 1705 + + СтраницаПользовательскогоРасписания + 1706 + + ИзменитьПользовательскоеРасписание + 1704 + true + true + + true + + + ИзменитьПользовательскоеРасписаниеExtendedTooltip + 2020 + Label + true + true + + Left + + + UsualButton + Form.Command.ИзменитьПользовательскоеРасписание + Normal + Auto + 15 + true + true + UserCmds + Auto + + + ПредставлениеПользовательскогоОписания + 1701 + true + true + + true + + + ПредставлениеПользовательскогоОписания + + None + + ПредставлениеПользовательскогоОписанияExtendedTooltip + 2021 + Label + true + true + + Left + + + + ПредставлениеПользовательскогоОписанияКонтекстноеМеню + 1702 + true + + LabelField + Enter + true + Left + true + + 2 + true + false + + Style.ПоясняющийТекст + + + + true + true + + true + + + <key>ru</key> + <value>Страница пользовательского расписания</value> + + + СтраницаПользовательскогоРасписанияExtendedTooltip + 2019 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ПустаяСтраницаПользовательскогоРасписания + 1707 + + Декорация10 + 1708 + true + true + + true + + + Декорация10ExtendedTooltip + 2023 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 1709 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Пустая страница пользовательского расписания</value> + + + ПустаяСтраницаПользовательскогоРасписанияExtendedTooltip + 2022 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы пользовательского расписания</value> + + true + + СтраницыПользовательскогоРасписанияExtendedTooltip + 2018 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница предопределенного расписания</value> + + + СтраницаПредопределенногоРасписанияExtendedTooltip + 2016 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + НедоступнаяСтраницаПредопределенногоРасписания + 1712 + + ПредопределенноеРасписаниеОбменаДанными1 + 1715 + true + true + + true + + + ПредопределенноеРасписаниеОбменаДанными + + None + + OnChange + ПредопределенноеРасписаниеОбменаДаннымиПриИзменении + + + ПредопределенноеРасписаниеОбменаДанными1ExtendedTooltip + 2025 + Label + true + true + + Left + + + + ПредопределенноеРасписаниеОбменаДанными1КонтекстноеМеню + 1716 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Каждые 15 минут + + + Каждые15Минут + + + + + ru + Каждые 30 минут + + + Каждые30Минут + + + + + ru + Каждый час + + + КаждыйЧас + + + + + ru + Каждый день, в 8:00 + + + КаждыйДеньВ_8_00 + + + + + ru + Другое расписание + + + ДругоеРасписание + + + Vertical + + + true + false + + true + + + <key>ru</key> + <value>Недоступная страница предопределенного расписания</value> + + true + + НедоступнаяСтраницаПредопределенногоРасписанияExtendedTooltip + 2024 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы предопределенного расписания</value> + + + СтраницыПредопределенногоРасписанияExtendedTooltip + 2015 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Предопределенного расписания</value> + + + ГруппаПредопределенногоРасписанияExtendedTooltip + 2014 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Расписания 1</value> + + + ГруппаРасписания1ExtendedTooltip + 2012 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройка синхронизации данных успешно завершена</value> + + + ГруппаРасписанияExtendedTooltip + 2010 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + Декорация32 + 1348 + true + true + + true + + + Декорация32ExtendedTooltip + 2026 + Label + true + true + + Left + + + + Декорация32КонтекстноеМеню + 1349 + true + + Label + true + true + true + + Left + + + + НадписьГотово12 + 1350 + + <key>ru</key> + <value>Нажмите кнопку "Готово" для завершения работы с помощником.</value> + + true + true + + true + + + НадписьГотово12ExtendedTooltip + 2030 + Label + true + true + + Left + + + + НадписьГотово12КонтекстноеМеню + 1351 + true + + Label + 3 + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера создание обмена данными успешно завершено</value> + + + ru + Страница мастера сопоставление данных + + + СтраницаМастераСозданиеОбменаДаннымиУспешноЗавершеноExtendedTooltip + 2008 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераНастройкиОтраженияДокументовВУчете + 1338 + + ГруппаОтражениеВУчете + 1618 + + НастройкиПараметровУчета + 1619 + + НаименованиеЭтойБазы4 + 1614 + true + true + + true + + + Объект.НаименованиеЭтойБазы + + None + + НаименованиеЭтойБазы4ExtendedTooltip + 2035 + Label + true + true + + Left + + + + НаименованиеЭтойБазы4КонтекстноеМеню + 1615 + true + + LabelField + Enter + true + Left + true + + true + + System.DefaultGUIFont + true + false + false + false + + + + + НастройкиПараметровУчетаГоризонтальная + 1640 + + Декорация99 + 1641 + true + true + + true + + + Декорация99ExtendedTooltip + 2037 + Label + true + true + + Left + + + + Декорация99КонтекстноеМеню + 1642 + true + + true + true + + + CommonPicture.Предупреждение32 + + + + + НастройкиПараметровУчетаПоясняющаяНадпись + 1643 + true + true + + true + + + НастройкиПараметровУчетаПоясняющаяНадпись + + None + + НастройкиПараметровУчетаПоясняющаяНадписьExtendedTooltip + 2038 + Label + true + true + + Left + + + + НастройкиПараметровУчетаПоясняющаяНадписьКонтекстноеМеню + 1644 + true + + LabelField + Center + Enter + true + Left + true + + 2 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Настройки параметров учета горизонтальная</value> + + + НастройкиПараметровУчетаГоризонтальнаяРасширеннаяПодсказка + 2036 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + НадписьНастройкиПараметровУчета + 2437 + true + true + + true + + + НадписьНастройкиПараметровУчета + + None + + НадписьНастройкиПараметровУчетаРасширеннаяПодсказка + 2439 + Label + true + true + + Left + + + + НадписьНастройкиПараметровУчетаКонтекстноеМеню + 2438 + 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 + + + НастройкиПараметровУчетаРасширеннаяПодсказка + 2034 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + НастройкиПараметровУчетаКорреспондента + 1626 + + НаименованиеВторойБазы4 + 1616 + true + true + + true + + + Объект.НаименованиеВторойБазы + + None + + НаименованиеВторойБазы4ExtendedTooltip + 2043 + Label + true + true + + Left + + + + НаименованиеВторойБазы4КонтекстноеМеню + 1617 + true + + LabelField + Enter + true + Left + true + + true + + System.DefaultGUIFont + true + false + false + false + + + + + НастройкиПараметровУчетаКорреспондентаГоризонтальная + 1627 + + Декорация98 + 1628 + true + true + + true + + + Декорация98ExtendedTooltip + 2045 + Label + true + true + + Left + + + + Декорация98КонтекстноеМеню + 1629 + true + + true + true + + + CommonPicture.Предупреждение32 + + + + + НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись + 1649 + true + true + + true + + + НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись + + None + + НастройкиПараметровУчетаКорреспондентаПоясняющаяНадписьExtendedTooltip + 2046 + Label + true + true + + Left + + + + НастройкиПараметровУчетаКорреспондентаПоясняющаяНадписьКонтекстноеМеню + 1650 + true + + LabelField + Center + Enter + true + Left + true + + 2 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Настройки параметров учета корреспондента горизонтальная</value> + + + НастройкиПараметровУчетаКорреспондентаГоризонтальнаяРасширеннаяПодсказка + 2044 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + НадписьНастройкиПараметровУчетаКорреспондента + 2440 + true + true + + true + + + НадписьНастройкиПараметровУчетаКорреспондента + + None + + НадписьНастройкиПараметровУчетаКорреспондентаРасширеннаяПодсказка + 2442 + Label + true + true + + Left + + + + НадписьНастройкиПараметровУчетаКорреспондентаКонтекстноеМеню + 2441 + 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 + + + НастройкиПараметровУчетаКорреспондентаРасширеннаяПодсказка + 2042 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки для отражения документов в учете</value> + + + ГруппаОтражениеВУчетеРасширеннаяПодсказка + 2033 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + НадписьДалее3 + 1343 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для выполнения синхронизации данных.</value> + + true + true + + true + + + НадписьДалее3ExtendedTooltip + 2050 + Label + true + true + + Left + + + + НадписьДалее3КонтекстноеМеню + 1344 + true + + Label + 3 + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера настройки отражения документов в учете</value> + + + ru + Страница мастера сопоставление данных + + + СтраницаМастераНастройкиОтраженияДокументовВУчетеExtendedTooltip + 2031 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераПараметрыПолученияДанных + 2407 + + ПравилаПолученияДанных + 2412 + + ПравилаПолученияДанныхЭтойБазы + 2414 + + НаименованиеЭтойБазы6 + 2418 + true + true + + true + + + Объект.НаименованиеЭтойБазы + + None + + НаименованиеЭтойБазы6РасширеннаяПодсказка + 2420 + Label + true + true + + Left + + + + НаименованиеЭтойБазы6КонтекстноеМеню + 2419 + true + + LabelField + Enter + true + Left + true + + true + + System.DefaultGUIFont + true + false + false + false + + + + + РамкаГруппыЗначенийПоУмолчанию6 + 1647 + + ОписаниеЗначенийПоУмолчанию6 + 1624 + + <key>ru</key> + <value>Значения для заполнения реквизитов при получении данных в этой программе</value> + + true + true + + true + + + ОписаниеЗначенийПоУмолчанию + + + ОписаниеЗначенийПоУмолчанию6ExtendedTooltip + 2040 + Label + true + true + + Left + + + + ОписаниеЗначенийПоУмолчанию6КонтекстноеМеню + 1625 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + НастройкаЗначенийПоУмолчанию6 + 1645 + + <key>ru</key> + <value>Изменить правила получения данных для этой программы</value> + + true + true + + true + + + НастройкаЗначенийПоУмолчанию6ExtendedTooltip + 2041 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаЗначенийПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Рамка группы значений по умолчанию 6</value> + + + РамкаГруппыЗначенийПоУмолчанию6ExtendedTooltip + 2039 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Правила получения данных этой базы</value> + + + ПравилаПолученияДанныхЭтойБазыРасширеннаяПодсказка + 2415 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПравилаПолученияДанныхВторойБазы + 2416 + + НаименованиеВторойБазы5 + 2421 + true + true + + true + + + Объект.НаименованиеВторойБазы + + None + + НаименованиеВторойБазы5РасширеннаяПодсказка + 2423 + Label + true + true + + Left + + + + НаименованиеВторойБазы5КонтекстноеМеню + 2422 + true + + LabelField + Enter + true + Left + true + + true + + System.DefaultGUIFont + true + false + false + false + + + + + РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондента + 1648 + + ОписаниеЗначенийПоУмолчаниюБазыКорреспондента + 1636 + + <key>ru</key> + <value>Значения для заполнения реквизитов при получении данных в приложении, расположенном в Интернете</value> + + true + true + + true + + + ОписаниеЗначенийПоУмолчаниюБазыКорреспондента + + + ОписаниеЗначенийПоУмолчаниюБазыКорреспондентаExtendedTooltip + 2048 + Label + true + true + + Left + + + + ОписаниеЗначенийПоУмолчаниюБазыКорреспондентаКонтекстноеМеню + 1637 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервис + 1646 + + <key>ru</key> + <value>Изменить правила получения данных для другой программы</value> + + true + true + + true + + + НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервисExtendedTooltip + 2049 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаЗначенийПоУмолчаниюБазыКорреспондентаЧерезВебСервис + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Рамка группы значений по умолчанию базы корреспондента</value> + + + РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондентаExtendedTooltip + 2047 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Правила получения данных второй базы</value> + + + ПравилаПолученияДанныхВторойБазыРасширеннаяПодсказка + 2417 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Правила получения данных</value> + + + ПравилаПолученияДанныхРасширеннаяПодсказка + 2413 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + НадписьДалее4 + 2443 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для выполнения синхронизации данных.</value> + + true + true + + true + + + НадписьДалее4РасширеннаяПодсказка + 2445 + Label + true + true + + Left + + + + НадписьДалее4КонтекстноеМеню + 2444 + true + + Label + 3 + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера параметры получения данных</value> + + + СтраницаМастераПараметрыПолученияДанныхРасширеннаяПодсказка + 2408 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераВыборРежимаРаботыПомощника + 774 + + ВыборВариантаПодключения + 1811 + + РежимРаботыМастера + 837 + true + true + + true + + + РежимРаботыМастера + + None + + OnChange + РежимРаботыМастераПриИзменении + + + РежимРаботыМастераExtendedTooltip + 2055 + Label + true + true + + Left + + + + РежимРаботыМастераКонтекстноеМеню + 838 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Прямое подключение к программе на этом компьютере или в локальной сети + + + ОбменЧерезВнешнееСоединение + + + + + ru + Прямое подключение к программе через Интернет + + + ОбменЧерезВебСервис + + + + + ru + Другие каналы связи (сетевой каталог, FTP, электронная почта) + + + ОбменЧерезОбычныеКаналыСвязи + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Выбор варианта подключения к другой программе</value> + + + ВыборВариантаПодключенияРасширеннаяПодсказка + 2054 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаОтступ + 839 + + СтраницыПараметровТранспорта + 830 + + СтраницаПараметровТранспортаCOM + 831 + + Декорация59 + 1904 + + <key>ru</key> + <value>Данный вариант подключения рекомендуется в том случае, если другая программа находится на том же +компьютере, что и эта программа, или обе программы расположены в одной локальной сети (в одном офисе).</value> + + true + true + + true + + + Декорация59ExtendedTooltip + 2067 + Label + true + true + + Left + + + + Декорация59КонтекстноеМеню + 1905 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + ПараметрыТранспортаCOM + 1814 + + ВидБазы + 1818 + + COMВариантРаботыИнформационнойБазы + 782 + + <key>ru</key> + <value>Укажите параметры подключения к другой программе</value> + + true + true + + true + + + Объект.COMВариантРаботыИнформационнойБазы + + Top + + OnChange + COMВариантРаботыИнформационнойБазыПриИзменении + + + COMВариантРаботыИнформационнойБазыExtendedTooltip + 2070 + Label + true + true + + Left + + + + COMВариантРаботыИнформационнойБазыКонтекстноеМеню + 783 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + На данном компьютере или на компьютере в локальной сети + + + 0 + + + + + ru + На сервере 1С:Предприятия + + + 1 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Вид базы</value> + + Button + + ВидБазыРасширеннаяПодсказка + 2069 + + <key>ru</key> + <value>Для настройки синхронизации данных необходимо знать где находится программа, с которой нужно настроить синхронизацию (другая программа). Для этого достаточно открыть программу. В главном меню выбрать пункт "Справка\О программе...". +Обратите внимание на следующие параметры (все они могут быть скопированы из формы "О программе..."): +• Режим - либо файловый либо серверный. Если режим файловый, то информационная база находится в каталоге на данном компьютере или в локальной сети. Если режим серверный, то для подключения нужно знать имя сервера и имя информационной базы на сервере. +• Каталог - для файлового режима указывается каталог, в котором располагается информационная база. +• Сервер - для серверного режима указывается имя сервера 1С:Предприятия, на котором расположена информационная база. +• База - для серверного режима указывается имя информационной базы на сервере 1С:Предприятия. +• Пользователь - имя пользователя, который вошел в информационную базу. Если в имени пользователя присутствует ";", то в качестве имени пользователя для подключения нужно использовать имя от начала строки до ";".</value> + + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + МестонахождениеБазы + 1815 + + Декорация37 + 1816 + true + true + + true + + + Декорация37ExtendedTooltip + 2074 + Label + true + true + + Left + + + + Декорация37КонтекстноеМеню + 1817 + true + + Label + 1 + true + true + + Left + + + + ВариантыРаботыИнформационнойБазы + 794 + + СтраницаВариантРаботыФайловый + 795 + + COMКаталогИнформационнойБазы + 790 + true + true + + true + + + Объект.COMКаталогИнформационнойБазы + + + COMКаталогИнформационнойБазыExtendedTooltip + 2077 + Label + true + true + + Left + + + + COMКаталогИнформационнойБазыКонтекстноеМеню + 791 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + COMКаталогИнформационнойБазыНачалоВыбора + + + Opening + COMКаталогИнформационнойБазыОткрытие + + true + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Страница вариант работы файловый</value> + + + СтраницаВариантРаботыФайловыйExtendedTooltip + 2076 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаВариантРаботыКлиентСерверный + 796 + + COMИмяСервера1СПредприятия + 788 + + <key>ru</key> + <value>Кластер серверов</value> + + true + true + + true + + + Объект.COMИмяСервера1СПредприятия + + + COMИмяСервера1СПредприятияExtendedTooltip + 2079 + Label + true + true + + Left + + + + COMИмяСервера1СПредприятияКонтекстноеМеню + 789 + true + + InputField + true + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + + COMИмяИнформационнойБазыНаСервере1СПредприятия + 784 + + <key>ru</key> + <value>Имя информационной базы</value> + + true + true + + true + + + Объект.COMИмяИнформационнойБазыНаСервере1СПредприятия + + + COMИмяИнформационнойБазыНаСервере1СПредприятияExtendedTooltip + 2080 + Label + true + true + + Left + + + + COMИмяИнформационнойБазыНаСервере1СПредприятияКонтекстноеМеню + 785 + true + + InputField + true + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Страница вариант работы клиент серверный</value> + + + СтраницаВариантРаботыКлиентСерверныйExtendedTooltip + 2078 + Label + true + true + + Left + + + Page + + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Варианты работы информационной базы</value> + + + ВариантыРаботыИнформационнойБазыExtendedTooltip + 2075 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Местонахождение базы</value> + + + МестонахождениеБазыРасширеннаяПодсказка + 2073 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Авторизация + 2533 + + АвторизацияВертикальная + 1821 + + COMГруппаПользовательПароль + 797 + + ТипАутентификации1С + 1819 + true + true + + true + + + ТипАутентификации + + None + + OnChange + ТипАутентификацииПриИзменении + + + ТипАутентификации1СРасширеннаяПодсказка + 2082 + Label + true + true + + Left + + + + ТипАутентификации1СКонтекстноеМеню + 1820 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Аутентификация 1С Предприятия + + + 0 + + + Vertical + + + + ПользовательИПароль + 2537 + + Декорация2 + 2539 + true + true + + true + + + Декорация2РасширеннаяПодсказка + 2541 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 2540 + true + + Label + 2 + true + true + + Left + + + + ПользовательИПарольВертикальная + 2535 + + COMИмяПользователя + 786 + true + true + + true + + + Объект.COMИмяПользователя + + + COMИмяПользователяExtendedTooltip + 2084 + Label + true + true + + Left + + + + COMИмяПользователяКонтекстноеМеню + 787 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + COMПарольПользователя + 792 + true + true + + true + + + Объект.COMПарольПользователя + + + COMПарольПользователяExtendedTooltip + 2085 + Label + true + true + + Left + + + + COMПарольПользователяКонтекстноеМеню + 793 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пользователь и пароль вертикальная</value> + + + ПользовательИПарольВертикальнаяРасширеннаяПодсказка + 2536 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Пользователь и пароль</value> + + + ПользовательИПарольРасширеннаяПодсказка + 2538 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация 1С Предприятия</value> + + + COMГруппаПользовательПарольExtendedTooltip + 2083 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Авторизация вертикальная</value> + + + АвторизацияВертикальнаяРасширеннаяПодсказка + 2081 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ТипАутентификацииОС + 2530 + true + true + + true + + + ТипАутентификации + + None + + OnChange + ТипАутентификацииПриИзменении + + + ТипАутентификацииОСРасширеннаяПодсказка + 2532 + Label + true + true + + Left + + + + ТипАутентификацииОСКонтекстноеМеню + 2531 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Аутентификация операционной системы + + + 1 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Авторизация</value> + + + АвторизацияРасширеннаяПодсказка + 2534 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКнопокПроверкиПодключенияCOM + 1075 + + ПроверитьПодключениеCOM + 798 + true + true + + true + + + ПроверитьПодключениеCOMExtendedTooltip + 2087 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеCOM + Normal + Auto + 20 + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопок проверки подключения COM</value> + + + ГруппаКнопокПроверкиПодключенияCOMExtendedTooltip + 2086 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОшибкиПодключения + 2557 + + КартинкаПредупреждениеПодключения + 2559 + + <key>ru</key> + <value>Картинка предупреждение подключения</value> + + true + true + + true + + + КартинкаПредупреждениеПодключенияРасширеннаяПодсказка + 2561 + Label + true + true + + Left + + + + КартинкаПредупреждениеПодключенияКонтекстноеМеню + 2560 + true + + false + false + Left + Top + + + CommonPicture.Предупреждение32 + + + + + ТекстОшибкиПроверкиПодключения + 2562 + true + true + + true + + + ТекстОшибкиПроверкиПодключенияРасширеннаяПодсказка + 2564 + Label + true + true + + Left + + + + ТекстОшибкиПроверкиПодключенияКонтекстноеМеню + 2563 + true + + Label + true + true + Left + Top + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Ошибки подключения</value> + + true + + ГруппаОшибкиПодключенияРасширеннаяПодсказка + 2558 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Параметры транспорта COM</value> + + + ПараметрыТранспортаCOMРасширеннаяПодсказка + 2068 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + НадписьДалее + 847 + + <key>ru</key> + <value>Нажмите "Далее" для настройки параметров синхронизации данных.</value> + + true + true + + true + + + НадписьДалееExtendedTooltip + 2091 + Label + true + true + + Left + + + + НадписьДалееКонтекстноеМеню + 848 + true + + Label + true + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница параметров транспорта COM</value> + + + СтраницаПараметровТранспортаCOMExtendedTooltip + 2066 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПараметровТранспортаWS + 1076 + + Декорация60 + 1908 + + <key>ru</key> + <value>Этот вариант подключения рекомендуется выбрать, если программа находится +в другой сети (офисе) и при этом доступна для подключения через Интернет.</value> + + true + true + + true + + + Декорация60ExtendedTooltip + 2093 + Label + true + true + + Left + + + + Декорация60КонтекстноеМеню + 1909 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + ПараметрыТранспортаВеб + 1822 + + ПользовательИПарольВеб + 1750 + + WSИмяПользователя + 1079 + true + true + + true + + + Объект.WSИмяПользователя + + + WSИмяПользователяExtendedTooltip + 2102 + Label + true + true + + Left + + + + WSИмяПользователяКонтекстноеМеню + 1080 + true + + InputField + true + Enter + true + Left + true + + 30 + true + true + true + true + true + true + true + Normal + + + + WSПароль + 1081 + true + true + + true + + + Объект.WSПароль + + + WSПарольExtendedTooltip + 2103 + Label + true + true + + Left + + + + WSПарольКонтекстноеМеню + 1082 + true + + InputField + true + Enter + true + Left + true + + 30 + true + true + true + true + true + true + true + Normal + + + + ПараметрыДоступаВеб + 1926 + + WSЗапомнитьПароль1 + 1795 + true + true + + true + + + Объект.WSЗапомнитьПароль + + Right + + WSЗапомнитьПароль1ExtendedTooltip + 2105 + Label + true + true + + Left + + + + WSЗапомнитьПароль1КонтекстноеМеню + 1796 + true + + CheckBoxField + Enter + true + Left + true + + + + ПараметрыДоступаВИнтернет1 + 1925 + true + true + + true + + + ПараметрыДоступаВИнтернет1ExtendedTooltip + 2106 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПараметрыДоступаВИнтернет + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Параметры доступа в интернет</value> + + + ПараметрыДоступаВебРасширеннаяПодсказка + 2104 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Пользователь и пароль WS</value> + + + ПользовательИПарольВебРасширеннаяПодсказка + 2101 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПроверитьПодключениеWS + 1083 + true + true + + true + + + ПроверитьПодключениеWSExtendedTooltip + 2107 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеWS + Normal + Auto + 20 + true + true + UserCmds + Auto + + + АдресВеб + 1823 + + ДекорацияПараметрыПодключенияWS + 1824 + + <key>ru</key> + <value>Укажите параметры подключения к другой программе:</value> + + true + true + + true + + Button + + ДекорацияПараметрыПодключенияWSРасширеннаяПодсказка + 2097 + + <key>ru</key> + <value>Для настройки синхронизации данных нужно знать где находится программа, с которой нужно настроить синхронизацию (другая программа). Для этого достаточно открыть программу в режиме веб-клиента. В главном меню выбрать пункт "Справка\О программе...". +Обратите внимание на следующие параметры (все они могут быть скопированы из формы "О программе..."): +• Адрес - адрес информационной базы в Интернете. +• Пользователь - имя пользователя, который вошел в информационную базу. Если в имени пользователя присутствует ";", то в качестве имени пользователя для подключения нужно использовать имя от начала строки до ";". +Важно! Имя пользователя не должно содержать служебных символов "[НедопустимыеСимволы]". В противном случае во второй информационной базе необходимо создать пользователя, в имени которого не будут содержаться служебные символы. Этот пользователь должен быть администратором.</value> + + Label + true + true + + Left + + + + ДекорацияПараметрыПодключенияWSКонтекстноеМеню + 1825 + true + + Label + 1 + true + + Left + Top + + + + АдресВеб2 + 1827 + + WSURLВебСервиса + 1077 + + <key>ru</key> + <value>Адрес программы</value> + + true + true + + true + + + Объект.WSURLВебСервиса + + + WSURLВебСервисаExtendedTooltip + 2100 + Label + true + true + + Left + + + + WSURLВебСервисаКонтекстноеМеню + 1078 + true + + InputField + true + Enter + true + Left + true + + 50 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Адрес WS</value> + + + АдресВеб2РасширеннаяПодсказка + 2099 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Укажите параметры подключения к другой программе</value> + + + АдресВебРасширеннаяПодсказка + 2095 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Параметры транспорта WS</value> + + + ПараметрыТранспортаВебРасширеннаяПодсказка + 2094 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервис + 1751 + + <key>ru</key> + <value>Нажмите "Далее" для настройки параметров синхронизации данных.</value> + + true + true + + true + + + НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервисExtendedTooltip + 2108 + Label + true + true + + Left + + + + НадписьДалееСтраницаМастераНачалоНастройкиОбменаЧерезВебСервисКонтекстноеМеню + 1752 + true + + Label + true + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница параметров транспорта WS</value> + + + СтраницаПараметровТранспортаWSExtendedTooltip + 2092 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПараметровТранспорта + 832 + + Декорация61 + 1910 + + <key>ru</key> + <value>В случае если к другой программе нет возможности прямого подключения по локальной сети +или через Интернет (веб-сервисы), рекомендуется использовать другие каналы связи: сетевой +каталог, FTP-ресурс или электронную почту. При этом программы, между которыми настроена +синхронизация данных, могут работать полностью автономно друг от друга и в разное время. + +Такой вариант подключения подходит не только для синхронизации данных с программами, +расположенными в других сетях (офисах), но и для программ в одной сети.</value> + + true + true + + true + + + Декорация61ExtendedTooltip + 2110 + Label + true + true + + Left + + + + Декорация61КонтекстноеМеню + 1911 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + Top + + + + НадписьДалее1 + 853 + + <key>ru</key> + <value>Нажмите "Далее" для настройки параметров подключения.</value> + + true + true + + true + + + НадписьДалее1ExtendedTooltip + 2111 + Label + true + true + + Left + + + + НадписьДалее1КонтекстноеМеню + 854 + true + + Label + true + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница параметров транспорта</value> + + + СтраницаПараметровТранспортаExtendedTooltip + 2109 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы параметров транспорта</value> + + + СтраницыПараметровТранспортаExtendedTooltip + 2065 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отступ</value> + + + ГруппаОтступExtendedTooltip + 2064 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера выбор режима работы помощника</value> + + + СтраницаМастераВыборРежимаРаботыПомощникаExtendedTooltip + 2051 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераЗаданиеПараметровТранспортаFILE + 694 + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаFILE + 2477 + + ИспользоватьПараметрыТранспортаFILE + 717 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаFILE + + Right + + OnChange + ИспользоватьПараметрыТранспортаFILEПриИзменении + + + ИспользоватьПараметрыТранспортаFILEExtendedTooltip + 2114 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаFILEКонтекстноеМеню + 718 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаFILE + 620 + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервере + 755 + + <key>ru</key> + <value>Укажите каталог на сервере 1С:Предприятия или сетевой каталог, доступный с сервера.</value> + + true + true + + true + + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервереExtendedTooltip + 2116 + Label + true + true + + Left + + + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервереКонтекстноеМеню + 756 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + FILEКаталогОбменаИнформацией + 621 + true + true + + true + + + Объект.FILEКаталогОбменаИнформацией + + + FILEКаталогОбменаИнформациейExtendedTooltip + 2117 + Label + true + true + + Left + + + + FILEКаталогОбменаИнформациейКонтекстноеМеню + 622 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + FILEКаталогОбменаИнформациейНачалоВыбора + + + Opening + FILEКаталогОбменаИнформациейОткрытие + + true + true + true + true + true + true + Normal + + + + ГруппаАрхив + 1836 + + FILEСжиматьФайлИсходящегоСообщения + 623 + true + true + + true + + + Объект.FILEСжиматьФайлИсходящегоСообщения + + Right + + FILEСжиматьФайлИсходящегоСообщенияExtendedTooltip + 2119 + Label + true + true + + Left + + + + FILEСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 624 + true + + CheckBoxField + Enter + true + Left + true + + + + ПарольАрхива + 2542 + + Декорация6 + 2544 + true + true + + true + + + Декорация6РасширеннаяПодсказка + 2546 + Label + true + true + + Left + + + + Декорация6КонтекстноеМеню + 2545 + true + + Label + 2 + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена + 639 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбменаExtendedTooltip + 2120 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбменаКонтекстноеМеню + 640 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пароль архива</value> + + + ПарольАрхиваРасширеннаяПодсказка + 2543 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Архив</value> + + + ГруппаАрхивРасширеннаяПодсказка + 2118 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + FILEТранслитерироватьИменаФайловСообщенийОбмена + 2565 + true + true + + true + + + Объект.FILEТранслитерироватьИменаФайловСообщенийОбмена + + Right + Button + + FILEТранслитерироватьИменаФайловСообщенийОбменаРасширеннаяПодсказка + 2567 + + <key>ru</key> + <value>Рекомендуется применять в случае, если при обмене возникают ошибки, связанные с различными кодировками файлов. +Настройку не следует использовать, в случае, если такая же настройка не поддерживается на стороне корреспондента.</value> + + Label + true + true + + Left + + + + FILEТранслитерироватьИменаФайловСообщенийОбменаКонтекстноеМеню + 2566 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтступКнопкиПроверкиПодключенияFILE + 664 + + ПроверитьПодключениеFILE + 654 + true + true + + true + + false + + ПроверитьПодключениеFILEExtendedTooltip + 2122 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFILE + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Отступ кнопки проверки подключения FILE</value> + + + ОтступКнопкиПроверкиПодключенияFILEExtendedTooltip + 2121 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта FILE</value> + + + НастройкиТранспортаFILEExtendedTooltip + 2115 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация4 + 697 + true + true + + true + + + Декорация4ExtendedTooltip + 2123 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 698 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееFILE + 699 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для настройки подключения через FTP-ресурс.</value> + + true + true + + true + + + НадписьДалееFILEExtendedTooltip + 2124 + Label + true + true + + Left + + + + НадписьДалееFILEКонтекстноеМеню + 700 + true + + Label + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Выбор каталога для файлов синхронизации данных</value> + + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаFILEРасширеннаяПодсказка + 2478 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта FILE</value> + + + СтраницаМастераЗаданиеПараметровТранспортаFILEExtendedTooltip + 2112 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераЗаданиеПараметровТранспортаFTP + 708 + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаFTP + 2475 + + ИспользоватьПараметрыТранспортаFTP + 719 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаFTP + + Right + + OnChange + ИспользоватьПараметрыТранспортаFTPПриИзменении + + + ИспользоватьПараметрыТранспортаFTPExtendedTooltip + 2127 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаFTPКонтекстноеМеню + 720 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаFTP + 617 + + Декорация54 + 1858 + + <key>ru</key> + <value>Укажите путь к FTP каталогу, например, "ftp://SyncServer/Accounting/"</value> + + true + true + + true + + + Декорация54ExtendedTooltip + 2129 + Label + true + true + + Left + + + + Декорация54КонтекстноеМеню + 1859 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + ГруппаСерверПорт + 650 + + FTPСоединениеПуть + 637 + true + true + + true + + + Объект.FTPСоединениеПуть + + + FTPСоединениеПутьExtendedTooltip + 2131 + Label + true + true + + Left + + + + FTPСоединениеПутьКонтекстноеМеню + 638 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + FTPСоединениеПорт + 635 + true + true + + true + + + Объект.FTPСоединениеПорт + + + FTPСоединениеПортExtendedTooltip + 2132 + 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> + + + ГруппаСерверПортExtendedTooltip + 2130 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПользовательПароль + 651 + + FTPСоединениеПользователь + 633 + true + true + + true + + + Объект.FTPСоединениеПользователь + + + FTPСоединениеПользовательExtendedTooltip + 2134 + Label + true + true + + Left + + + + FTPСоединениеПользовательКонтекстноеМеню + 634 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + FTPСоединениеПароль + 629 + true + true + + true + + + Объект.FTPСоединениеПароль + + + FTPСоединениеПарольExtendedTooltip + 2135 + 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> + + + ГруппаПользовательПарольExtendedTooltip + 2133 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаРазмерФайла + 1850 + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + 627 + true + true + + true + + + Объект.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияExtendedTooltip + 2137 + Label + true + true + + Left + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 628 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + Декорация51 + 1851 + + <key>ru</key> + <value>КБ (0 – нет ограничений)</value> + + true + true + + true + + + Декорация51ExtendedTooltip + 2138 + Label + true + true + + Left + + + + Декорация51КонтекстноеМеню + 1852 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Размер файла</value> + + + ГруппаРазмерФайлаРасширеннаяПодсказка + 2136 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + FTPСоединениеПассивноеСоединение + 631 + true + true + + true + + + Объект.FTPСоединениеПассивноеСоединение + + Right + + FTPСоединениеПассивноеСоединениеExtendedTooltip + 2139 + Label + true + true + + Left + + + + FTPСоединениеПассивноеСоединениеКонтекстноеМеню + 632 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаЗаданияПароляСообщенияОбменаFTP + 661 + + FTPСжиматьФайлИсходящегоСообщения + 625 + true + true + + true + + + Объект.FTPСжиматьФайлИсходящегоСообщения + + Right + + FTPСжиматьФайлИсходящегоСообщенияExtendedTooltip + 2141 + Label + true + true + + Left + + + + FTPСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 626 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаПарольАрхива + 2547 + + Декорация11 + 2549 + true + true + + true + + + Декорация11РасширеннаяПодсказка + 2551 + Label + true + true + + Left + + + + Декорация11КонтекстноеМеню + 2550 + true + + Label + 2 + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена1 + 657 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбмена1ExtendedTooltip + 2142 + 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>Пароль архива</value> + + + ГруппаПарольАрхиваРасширеннаяПодсказка + 2548 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Задания пароля сообщения обмена FTP</value> + + + ГруппаЗаданияПароляСообщенияОбменаFTPExtendedTooltip + 2140 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПараметрыДоступаВИнтернет2 + 1927 + true + true + + true + + + ПараметрыДоступаВИнтернет2ExtendedTooltip + 2143 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПараметрыДоступаВИнтернет + Normal + Auto + true + true + UserCmds + Auto + + + FTPТранслитерироватьИменаФайловСообщенийОбмена + 2568 + true + true + + true + + + Объект.FTPТранслитерироватьИменаФайловСообщенийОбмена + + Right + Button + + FTPТранслитерироватьИменаФайловСообщенийОбменаРасширеннаяПодсказка + 2570 + + <key>ru</key> + <value>Рекомендуется применять в случае, если при обмене возникают ошибки, связанные с различными кодировками файлов. +Настройку не следует использовать, в случае, если такая же настройка не поддерживается на стороне корреспондента.</value> + + Label + true + true + + Left + + + + FTPТранслитерироватьИменаФайловСообщенийОбменаКонтекстноеМеню + 2569 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтступКнопкиПроверкиПодключенияFTP + 665 + + ПроверитьПодключениеFTP + 655 + true + true + + true + + false + + ПроверитьПодключениеFTPExtendedTooltip + 2145 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFTP + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Отступ кнопки проверки подключения FTP</value> + + + ОтступКнопкиПроверкиПодключенияFTPExtendedTooltip + 2144 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта FTP</value> + + + НастройкиТранспортаFTPExtendedTooltip + 2128 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация8 + 711 + true + true + + true + + + Декорация8ExtendedTooltip + 2146 + Label + true + true + + Left + + + + Декорация8КонтекстноеМеню + 712 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееFTP + 713 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для настройки подключения по почте.</value> + + true + true + + true + + + НадписьДалееFTPExtendedTooltip + 2147 + Label + true + true + + Left + + + + НадписьДалееFTPКонтекстноеМеню + 714 + true + + Label + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка параметров подключения через FTP-ресурс</value> + + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаFTPРасширеннаяПодсказка + 2476 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта FTP</value> + + + СтраницаМастераЗаданиеПараметровТранспортаFTPExtendedTooltip + 2125 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераЗаданиеПараметровТранспортаEMAIL + 701 + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаEMAIL + 2473 + + ИспользоватьПараметрыТранспортаEMAIL + 721 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаEMAIL + + Right + + OnChange + ИспользоватьПараметрыТранспортаEMAILПриИзменении + + + ИспользоватьПараметрыТранспортаEMAILExtendedTooltip + 2150 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаEMAILКонтекстноеМеню + 722 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаEMAIL + 619 + + EMAILУчетнаяЗапись + 652 + true + true + + true + + + Объект.EMAILУчетнаяЗапись + + + EMAILУчетнаяЗаписьExtendedTooltip + 2152 + Label + true + true + + Left + + + + EMAILУчетнаяЗаписьКонтекстноеМеню + 653 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РазмерВложения + 1853 + + EMAILМаксимальныйДопустимыйРазмерСообщения + 643 + true + true + + true + + + Объект.EMAILМаксимальныйДопустимыйРазмерСообщения + + + EMAILМаксимальныйДопустимыйРазмерСообщенияExtendedTooltip + 2154 + Label + true + true + + Left + + + + EMAILМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 644 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + Декорация52 + 1854 + + <key>ru</key> + <value>КБ (0 – нет ограничений)</value> + + true + true + + true + + + Декорация52ExtendedTooltip + 2155 + Label + true + true + + Left + + + + Декорация52КонтекстноеМеню + 1855 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Размер вложения</value> + + + РазмерВложенияРасширеннаяПодсказка + 2153 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + АрхивироватьФайлСообщения + 1849 + + EMAILСжиматьФайлИсходящегоСообщения + 645 + true + true + + true + + + Объект.EMAILСжиматьФайлИсходящегоСообщения + + Right + + EMAILСжиматьФайлИсходящегоСообщенияExtendedTooltip + 2157 + Label + true + true + + Left + + + + EMAILСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 646 + true + + CheckBoxField + Enter + true + Left + true + + + + ПарольАрхиваСообщения + 2552 + + Декорация18 + 2554 + true + true + + true + + + Декорация18РасширеннаяПодсказка + 2556 + Label + true + true + + Left + + + + Декорация18КонтекстноеМеню + 2555 + true + + Label + 2 + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена2 + 659 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбмена2ExtendedTooltip + 2158 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена2КонтекстноеМеню + 660 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пароль архива сообщения</value> + + + ПарольАрхиваСообщенияРасширеннаяПодсказка + 2553 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Архивировать файл сообщения</value> + + + АрхивироватьФайлСообщенияРасширеннаяПодсказка + 2156 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + EMAILТранслитерироватьИменаФайловСообщенийОбмена + 2571 + true + true + + true + + + Объект.EMAILТранслитерироватьИменаФайловСообщенийОбмена + + Right + Button + + EMAILТранслитерироватьИменаФайловСообщенийОбменаРасширеннаяПодсказка + 2573 + + <key>ru</key> + <value>Рекомендуется применять в случае, если при обмене возникают ошибки, связанные с различными кодировками файлов. +Настройку не следует использовать, в случае, если такая же настройка не поддерживается на стороне корреспондента.</value> + + Label + true + true + + Left + + + + EMAILТранслитерироватьИменаФайловСообщенийОбменаКонтекстноеМеню + 2572 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтступКнопкиПроверкиПодключенияEMAIL + 666 + + ПроверитьПодключениеEMAIL + 656 + true + true + + true + + false + + ПроверитьПодключениеEMAILExtendedTooltip + 2160 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеEMAIL + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Отступ кнопки проверки подключения EMAIL</value> + + + ОтступКнопкиПроверкиПодключенияEMAILExtendedTooltip + 2159 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта EMAIL</value> + + + НастройкиТранспортаEMAILExtendedTooltip + 2151 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация7 + 704 + true + true + + true + + + Декорация7ExtendedTooltip + 2161 + Label + true + true + + Left + + + + Декорация7КонтекстноеМеню + 705 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееEMAIL + 706 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для настройки дополнительных параметров обмена данными.</value> + + true + true + + true + + + НадписьДалееEMAILExtendedTooltip + 2162 + Label + true + true + + Left + + + + НадписьДалееEMAILКонтекстноеМеню + 707 + true + + Label + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка параметров подключения по электронной почте</value> + + + ГруппаСтраницаМастераЗаданиеПараметровТранспортаEMAILРасширеннаяПодсказка + 2474 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта EMAIL</value> + + + СтраницаМастераЗаданиеПараметровТранспортаEMAILExtendedTooltip + 2148 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаМастераНастройкаПараметровВторогоЭтапаНастройки + 1038 + + ГруппаСтраницаМастераНастройкаПараметровВторогоЭтапаНастройки + 2468 + + ВидТранспортаСообщенийОбмена1 + 1045 + true + true + + true + + + Объект.ВидТранспортаСообщенийОбмена + + Top + + ВидТранспортаСообщенийОбмена1ExtendedTooltip + 2194 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбмена1КонтекстноеМеню + 1046 + true + + InputField + true + Enter + true + Left + true + + 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 + + + + НастройкиУзла2 + 1054 + + РамкаГруппыОграничений2 + 1055 + + ОписаниеОграниченийПередачиДанных2 + 1056 + + <key>ru</key> + <value>Правила отправки данных в +%Программа%</value> + + true + true + + true + + + ОписаниеОграниченийПередачиДанных + + Top + + ОписаниеОграниченийПередачиДанных2ExtendedTooltip + 2198 + Label + true + true + + Left + + + + ОписаниеОграниченийПередачиДанных2КонтекстноеМеню + 1057 + true + + InputField + true + Enter + true + Left + true + + 8 + true + true + true + true + true + true + Normal + + + + НастройкаОграниченийРегистрацииДанных2 + 1059 + true + true + + true + + false + + НастройкаОграниченийРегистрацииДанных2ExtendedTooltip + 2199 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаОграниченийРегистрацииДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Ограничения передачи данных:</value> + + + ru + Рамка группы ограничений + + true + false + + РамкаГруппыОграничений2ExtendedTooltip + 2196 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + РамкаГруппыЗначенийПоУмолчанию2 + 1060 + + ОписаниеЗначенийПоУмолчанию2 + 1061 + + <key>ru</key> + <value>Правила получения данных из +%Программа%</value> + + true + true + + true + + + ОписаниеЗначенийПоУмолчанию + + Top + + ОписаниеЗначенийПоУмолчанию2ExtendedTooltip + 2202 + Label + true + true + + Left + + + + ОписаниеЗначенийПоУмолчанию2КонтекстноеМеню + 1062 + true + + InputField + true + Enter + true + Left + true + + 8 + true + true + true + true + true + true + Normal + + + + НастройкаЗначенийПоУмолчанию2 + 1064 + true + true + + true + + false + + НастройкаЗначенийПоУмолчанию2ExtendedTooltip + 2203 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастройкаЗначенийПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Значения по умолчанию:</value> + + true + false + + РамкаГруппыЗначенийПоУмолчанию2ExtendedTooltip + 2200 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки узла</value> + + + НастройкиУзла2ExtendedTooltip + 2195 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Equal + Auto + Auto + + + + Декорация23 + 1065 + true + true + + true + + + Декорация23ExtendedTooltip + 2204 + Label + true + true + + Left + + + + Декорация23КонтекстноеМеню + 1066 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееПодтверждениеНастроек3 + 1067 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для проверки параметров и завершения настройки синхронизации данных.</value> + + true + true + + true + + + НадписьДалееПодтверждениеНастроек3ExtendedTooltip + 2205 + Label + true + true + + Left + + + + НадписьДалееПодтверждениеНастроек3КонтекстноеМеню + 1068 + true + + Label + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка параметров синхронизации данных</value> + + + ГруппаСтраницаМастераНастройкаПараметровВторогоЭтапаНастройкиРасширеннаяПодсказка + 2469 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера настройка параметров второго этапа настройки</value> + + + ru + Страница мастера настройка параметров + + + СтраницаМастераНастройкаПараметровВторогоЭтапаНастройкиExtendedTooltip + 2192 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + СтраницаМастераИтогНастройкиОбмена 7 @@ -10690,12 +10813,8 @@ <key>ru</key> - <value>Группа надписи информации об открытии помощника сопоставления</value> + <value>Надписи информации об открытии помощника сопоставления</value> - - ru - Группа надписи информации об открытии помощника сопоставления - ГруппаНадписиИнформацииОбОткрытииПомощникаСопоставленияExtendedTooltip 2241 @@ -10755,10 +10874,6 @@ ru Страница мастера итог настройки обмена - - ru - Страница мастера итог настройки обмена - СтраницаМастераИтогНастройкиОбменаExtendedTooltip 2238 @@ -10792,7 +10907,7 @@ ГруппаФайлаНастроекОбмена1 338 - Группа91 + ФайлНастроекКартинка 339 Декорация111 @@ -10831,8 +10946,12 @@ true + + <key>ru</key> + <value>Файл настроек картинка</value> + - Группа91ExtendedTooltip + ФайлНастроекКартинкаРасширеннаяПодсказка 2247 Label true @@ -10852,7 +10971,7 @@ - Группа101 + ФайлНастроекИнформация 342 Декорация141 @@ -10891,7 +11010,7 @@ - Группа11 + ФайлНастроекИнформацияГоризонтальная 414 ИмяФайлаНастроекОбменаДанными @@ -10973,8 +11092,12 @@ true + + <key>ru</key> + <value>Файл настроек информация горизонтальная</value> + - Группа11ExtendedTooltip + ФайлНастроекИнформацияГоризонтальнаяРасширеннаяПодсказка 2251 Label true @@ -10997,8 +11120,12 @@ true + + <key>ru</key> + <value>Файл настроек информация</value> + - Группа101ExtendedTooltip + ФайлНастроекИнформацияРасширеннаяПодсказка 2249 Label true @@ -11026,10 +11153,6 @@ ru Группа файла настроек обмена - - ru - Группа файла настроек обмена - ГруппаФайлаНастроекОбмена1ExtendedTooltip 2246 @@ -11050,7 +11173,7 @@ - Группа17 + ФайлНастроекВыгрузка 2464 Декорация181 @@ -11085,7 +11208,7 @@ - Группа261 + ФайлНастроекВыгрузкаВертикальная 446 ВыполнитьОбменДаннымиСейчас21 @@ -11175,8 +11298,12 @@ true + + <key>ru</key> + <value>Файл настроек выгрузка вертикальная</value> + - Группа261ExtendedTooltip + ФайлНастроекВыгрузкаВертикальнаяРасширеннаяПодсказка 2258 Label true @@ -11201,8 +11328,12 @@ true + + <key>ru</key> + <value>Файл настроек выгрузка</value> + - Группа17РасширеннаяПодсказка + ФайлНастроекВыгрузкаРасширеннаяПодсказка 2465 Label true @@ -11342,12 +11473,8 @@ <key>ru</key> - <value>Группа прогресс бар выгрузка вертикальная</value> + <value>Прогресс бар выгрузка вертикальная</value> - - ru - Группа прогресс бар выгрузка вертикальная - ГруппаПрогрессБарВыгрузкаВертикальнаяРасширеннаяПодсказка 2523 @@ -11375,12 +11502,8 @@ <key>ru</key> - <value>Группа прогресс бар выгрузка</value> + <value>Прогресс бар выгрузка</value> - - ru - Группа прогресс бар выгрузка - ГруппаПрогрессБарВыгрузкаРасширеннаяПодсказка 2518 @@ -11409,10 +11532,6 @@ ru Страница выполнить выгрузку данных для сопоставления - - ru - Страница выполнить выгрузку данных для сопоставления - СтраницаВыполнитьВыгрузкуДанныхДляСопоставленияExtendedTooltip 2256 @@ -11434,7 +11553,7 @@ СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзла 589 - Группа1 + ВыполнитьСозданиеНачальногоОбраза 595 ВыполнитьСозданиеНачальногоОбразаСейчас @@ -11517,8 +11636,12 @@ true + + <key>ru</key> + <value>Выполнить создание начального образа</value> + - Группа1ExtendedTooltip + ВыполнитьСозданиеНачальногоОбразаРасширеннаяПодсказка 2263 Label true @@ -11548,10 +11671,6 @@ ru Страница выполнить создание начального образа подчиненного узла - - ru - Страница выполнить создание начального образа подчиненного узла - СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзлаExtendedTooltip 2261 @@ -11577,10 +11696,6 @@ ru Страницы отображения финального действия - - ru - Страницы отображения финального действия - СтраницыОтображенияФинальногоДействияExtendedTooltip 2255 @@ -11702,10 +11817,6 @@ ru Страница мастера окончание с выгрузкой настройки - - ru - Страница 14 - СтраницаМастераОкончаниеСВыгрузкойНастройкиExtendedTooltip 2244 @@ -11727,7 +11838,7 @@ СтраницаМастераОкончаниеСОбменомПоВнешнемуСоединению 865 - Группа5 + ОкончаниеОбменаВнешнееСоединение 901 Декорация183 @@ -11762,7 +11873,7 @@ - Группа + ВыполнитьИнтерактивныйОбмен 884 ВыполнитьИнтерактивныйОбменДаннымиСейчас @@ -11849,14 +11960,10 @@ <key>ru</key> - <value>Группа</value> + <value>Выполнить интерактивный обмен</value> - - ru - Группа - - ГруппаExtendedTooltip + ВыполнитьИнтерактивныйОбменРасширеннаяПодсказка 2275 Label true @@ -11885,7 +11992,7 @@ Настройка синхронизации данных успешно завершена - Группа5ExtendedTooltip + ОкончаниеОбменаВнешнееСоединениеРасширеннаяПодсказка 2273 Label true @@ -11980,10 +12087,6 @@ ru Страница мастера окончание с обменом по внешнему соединению - - ru - Страница 14 - СтраницаМастераОкончаниеСОбменомПоВнешнемуСоединениюExtendedTooltip 2271 @@ -12049,12 +12152,8 @@ <key>ru</key> - <value>Группа картинки</value> + <value>Картинки</value> - - ru - Группа картинки - ГруппаКартинкиExtendedTooltip 2286 @@ -12125,12 +12224,8 @@ <key>ru</key> - <value>Группа сообщения</value> + <value>Сообщения</value> - - ru - Группа сообщения - ГруппаСообщенияExtendedTooltip 2288 @@ -12190,10 +12285,6 @@ ru Страница мастера ожидание создания настройки обмена данными - - ru - Страница 14 - СтраницаМастераОжиданиеСозданияНастройкиОбменаДаннымиExtendedTooltip 2283 @@ -12261,10 +12352,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки4ExtendedTooltip 2293 @@ -12338,10 +12425,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения4ExtendedTooltip 2295 @@ -12401,10 +12484,6 @@ ru Страница мастера ожидание анализа данных создание настройки обмена - - ru - Страница 14 - СтраницаМастераОжиданиеАнализаДанныхСозданиеНастройкиОбменаExtendedTooltip 2290 @@ -12472,10 +12551,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки3ExtendedTooltip 2300 @@ -12549,10 +12624,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения3ExtendedTooltip 2302 @@ -12612,10 +12683,6 @@ ru Страница мастера ожидание анализа данных получение сообщения - - ru - Страница 14 - СтраницаМастераОжиданиеАнализаДанныхПолучениеСообщенияExtendedTooltip 2297 @@ -12683,10 +12750,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки16ExtendedTooltip 2307 @@ -12760,10 +12823,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения16ExtendedTooltip 2309 @@ -12823,10 +12882,6 @@ ru Страница мастера ожидание анализа данных автоматическое сопоставление - - ru - Страница 14 - СтраницаМастераОжиданиеАнализаДанныхАвтоматическоеСопоставлениеExtendedTooltip 2304 @@ -12894,10 +12949,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки13ExtendedTooltip 2314 @@ -12971,10 +13022,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения13ExtendedTooltip 2316 @@ -13034,10 +13081,6 @@ ru Ожидание синхронизации данных - - ru - Страница 14 - ОжиданиеСинхронизацииДанныхExtendedTooltip 2311 @@ -13105,10 +13148,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки6ExtendedTooltip 2321 @@ -13182,10 +13221,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения6ExtendedTooltip 2323 @@ -13241,6 +13276,10 @@ true + + <key>ru</key> + <value>Страница мастера ожидание сохранения настроек</value> + ru Страница 14 @@ -13312,10 +13351,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки7ExtendedTooltip 2328 @@ -13389,10 +13424,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения7ExtendedTooltip 2330 @@ -13448,10 +13479,10 @@ true - + <key>ru</key> - <value>Страница 14</value> - </toolTip> + <value>Страница мастера ожидание проверки подключения к сервису</value> + СтраницаМастераОжиданиеПроверкиПодключенияКСервисуExtendedTooltip 2325 @@ -13519,10 +13550,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки1ExtendedTooltip 2335 @@ -13595,10 +13622,6 @@ ru Группа сообщения - - ru - Группа сообщения - ГруппаСообщения1ExtendedTooltip 2337 @@ -13658,10 +13681,6 @@ ru Страница мастера ожидание проверки подключения внешнего соединения - - ru - Страница 14 - СтраницаМастераОжиданиеПроверкиПодключенияВнешнегоСоединенияExtendedTooltip 2332 @@ -13745,6 +13764,10 @@ true + + <key>ru</key> + <value>Командная панель слева 1</value> + КоманднаяПанельСлева1РасширеннаяПодсказка 2378 @@ -13847,6 +13870,10 @@ true + + <key>ru</key> + <value>Командная панель справа 1</value> + true КоманднаяПанельСправа1РасширеннаяПодсказка @@ -13872,10 +13899,6 @@ ru Страница навигации начало - - ru - Страница навигации начало - СтраницаНавигацииНачалоExtendedTooltip 2341 @@ -13929,6 +13952,10 @@ true + + <key>ru</key> + <value>Командная панель слева 2</value> + КоманднаяПанельСлева2РасширеннаяПодсказка 2386 @@ -14031,6 +14058,10 @@ true + + <key>ru</key> + <value>Командная панель справа 2</value> + true КоманднаяПанельСправа2РасширеннаяПодсказка @@ -14052,6 +14083,10 @@ true + + <key>ru</key> + <value>Страница навигации продолжение</value> + СтраницаНавигацииПродолжениеExtendedTooltip 2347 @@ -14105,6 +14140,10 @@ true + + <key>ru</key> + <value>Командная панель слева 3</value> + КоманднаяПанельСлева3РасширеннаяПодсказка 2391 @@ -14207,6 +14246,10 @@ true + + <key>ru</key> + <value>Командная панель справа 3</value> + true КоманднаяПанельСправа3РасширеннаяПодсказка @@ -14228,6 +14271,10 @@ true + + <key>ru</key> + <value>Страница навигации продолжение только далее</value> + СтраницаНавигацииПродолжениеТолькоДалееExtendedTooltip 2353 @@ -14281,6 +14328,10 @@ true + + <key>ru</key> + <value>Командная панель слева 4</value> + КоманднаяПанельСлева4РасширеннаяПодсказка 2396 @@ -14387,6 +14438,10 @@ true + + <key>ru</key> + <value>Командная панель справа 4</value> + true КоманднаяПанельСправа4РасширеннаяПодсказка @@ -14408,6 +14463,10 @@ true + + <key>ru</key> + <value>Страница навигации ожидание</value> + СтраницаНавигацииОжиданиеExtendedTooltip 2359 @@ -14461,6 +14520,10 @@ true + + <key>ru</key> + <value>Командная панель слева 7</value> + КоманднаяПанельСлева7РасширеннаяПодсказка 2401 @@ -14562,6 +14625,10 @@ true + + <key>ru</key> + <value>Командная панель справа 7</value> + true КоманднаяПанельСправа7РасширеннаяПодсказка @@ -14583,6 +14650,10 @@ true + + <key>ru</key> + <value>Страница навигации окончание</value> + СтраницаНавигацииОкончаниеExtendedTooltip 2365 @@ -14636,6 +14707,10 @@ true + + <key>ru</key> + <value>Командная панель слева 8</value> + КоманднаяПанельСлева8РасширеннаяПодсказка 2406 @@ -14737,6 +14812,10 @@ true + + <key>ru</key> + <value>Командная панель справа 8</value> + true КоманднаяПанельСправа8РасширеннаяПодсказка @@ -14762,10 +14841,6 @@ ru Страница навигации окончание и назад - - ru - Страница навигации окончание и назад - СтраницаНавигацииОкончаниеИНазадExtendedTooltip 2371 @@ -14816,10 +14891,6 @@ ru Рамка панели навигации - - ru - Рамка панели навигации - РамкаПанелиНавигацииExtendedTooltip 2339 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl index cb804e655..c8ade59d7 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl @@ -31,7 +31,14 @@ НастройкаОбменаССервисом = Параметры.Свойство("НастройкаОбменаССервисом"); - Если ПолучитьФункциональнуюОпцию("ИспользуютсяПрофилиБезопасности") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности(); + Иначе + ИспользуютсяПрофилиБезопасности = Ложь; + КонецЕсли; + + Если ИспользуютсяПрофилиБезопасности Тогда Объект.СсылкаНового = ПланыОбмена[Объект.ИмяПланаОбмена].ПолучитьСсылку(); КонецЕсли; @@ -57,39 +64,17 @@ // Получаем значения по умолчанию для плана обмена. МенеджерПланаОбмена = ПланыОбмена[Объект.ИмяПланаОбмена]; - КраткоеОписание = МенеджерПланаОбмена.КраткаяИнформацияПоОбмену(Объект.ВариантНастройкиОбмена); СсылкаНаПодробноеОписание = МенеджерПланаОбмена.ПодробнаяИнформацияПоОбмену(Объект.ВариантНастройкиОбмена); ИмяФайлаНастроекДляПриемника = МенеджерПланаОбмена.ИмяФайлаНастроекДляПриемника() + ".xml"; - ФормаНастройкиУзла = ""; - ФормаНастройкиЗначенийПоУмолчанию = ""; + ОбновитьНастройкиИИхОписанияЗначениямиПоУмолчанию(); - НастройкаОтборовНаУзле = ОбменДаннымиСервер.НастройкаОтборовНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзла, Объект.ВариантНастройкиОбмена); - ЗначенияПоУмолчаниюНаУзле = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиЗначенийПоУмолчанию, Объект.ВариантНастройкиОбмена); ЭтоПланОбменаXDTO = ОбменДаннымиСервер.ЭтоПланОбменаXDTO(Объект.ИмяПланаОбмена); - НастройкиПараметровУчетаПоясняющаяНадпись = МенеджерПланаОбмена.ПояснениеДляНастройкиПараметровУчета(); - КонтекстФормыНастройкиУзлов = Новый Структура; - ПредусмотреныНастройкиОтборовНаУзле = НастройкаОтборовНаУзле.Количество() > 0 - И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьНастройкуОтборовНаУзле", Объект.ВариантНастройкиОбмена); - ПредусмотреныЗначенияПоУмолчаниюНаУзле = ЗначенияПоУмолчаниюНаУзле.Количество() > 0 - И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьЗначенияПоУмолчаниюНаУзле", Объект.ВариантНастройкиОбмена); - - Элементы.РамкаГруппыОграничений.Видимость = ПредусмотреныНастройкиОтборовНаУзле; - Элементы.РамкаГруппыОграничений1.Видимость = ПредусмотреныНастройкиОтборовНаУзле; - Элементы.РамкаГруппыОграничений2.Видимость = ПредусмотреныНастройкиОтборовНаУзле; - Элементы.РамкаГруппыЗначенийПоУмолчанию.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; - Элементы.РамкаГруппыЗначенийПоУмолчанию1.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; - Элементы.РамкаГруппыЗначенийПоУмолчанию2.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; - Элементы.РамкаГруппыЗначенийПоУмолчанию6.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; - - ОписаниеОграниченийПередачиДанных = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанных(Объект.ИмяПланаОбмена, НастройкаОтборовНаУзле, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - ОписаниеЗначенийПоУмолчанию = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчанию(Объект.ИмяПланаОбмена, ЗначенияПоУмолчаниюНаУзле, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); ИмяФормыСозданияНачальногоОбраза = МенеджерПланаОбмена.ИмяФормыСозданияНачальногоОбраза(); @@ -171,7 +156,7 @@ Элементы.ДекорацияПараметрыПодключенияКСервису.РасширеннаяПодсказка.Заголовок = СтрЗаменить( Элементы.ДекорацияПараметрыПодключенияКСервису.РасширеннаяПодсказка.Заголовок, "[НедопустимыеСимволы]", ОбменДаннымиКлиентСервер.НедопустимыеСимволыВИмениПользователяWSПрокси()); - + УстановитьВидимостьНаСервере(); // Назначаем значения поясняющим надписям внизу страницы для перехода по кнопке "Далее". @@ -379,8 +364,6 @@ Отказ = Ложь; - Состояние(НСтр("ru = 'Выполняется сбор информации сопоставления...'")); - ОбновитьДанныеСтатистикиСопоставленияНаСервере(Отказ, Параметр); Если Отказ Тогда @@ -389,7 +372,7 @@ РазвернутьДеревоИнформацииСтатистики(Параметр.КлючУникальности); - Состояние(НСтр("ru = 'Сбор информации завершен'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Сбор информации завершен'")); КонецЕсли; КонецЕсли; @@ -667,7 +650,7 @@ КонецЦикла; // вызов сервера - ПолучитьОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле); + ОбновитьОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле); КонецЕсли; @@ -717,7 +700,7 @@ КонецЦикла; // вызов сервера - ПолучитьОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле); + ОбновитьОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле); КонецЕсли; @@ -812,8 +795,13 @@ Процедура ПроверитьПодключениеFILE(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПроверитьПодключениеFILEЗавершение", ЭтотОбъект); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Истина, Ложь, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Истина, Ложь, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецПроцедуры @@ -821,8 +809,13 @@ Процедура ПроверитьПодключениеFTP(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПроверитьПодключениеFTPЗавершение", ЭтотОбъект); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Ложь, Истина); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Ложь, Истина); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецПроцедуры @@ -837,8 +830,13 @@ Процедура ПроверитьПодключениеCOM(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПроверитьПодключениеCOMЗавершение", ЭтотОбъект); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Истина, Ложь, Ложь, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Истина, Ложь, Ложь, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецПроцедуры @@ -850,8 +848,13 @@ Если Не Отказ Тогда ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПроверитьПодключениеWSЗавершение", ЭтотОбъект); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -896,6 +899,134 @@ #Область СлужебныеПроцедурыИФункции +#Область НастройкиПоУмолчаниюИВыводОписаний + +&НаСервере +Процедура ОбновитьНастройкиИИхОписанияЗначениямиПоУмолчанию(ДляОбменаЧерезПрямоеПодключение = Ложь) + + // 1. Для этой базы. + ФормаНастройкиУзла = ""; + ФормаНастройкиЗначенийПоУмолчанию = ""; + + НастройкаОтборовНаУзле = ОбменДаннымиСервер.НастройкаОтборовНаУзле( + Объект.ИмяПланаОбмена, + ВерсияКонфигурацииКорреспондента, + ФормаНастройкиУзла, + Объект.ВариантНастройкиОбмена); + + ЗначенияПоУмолчаниюНаУзле = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзле( + Объект.ИмяПланаОбмена, + ВерсияКонфигурацииКорреспондента, + ФормаНастройкиЗначенийПоУмолчанию, + Объект.ВариантНастройкиОбмена); + + ОбновитьОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле); + ОбновитьОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле); + + НастройкиПараметровУчетаПоясняющаяНадпись = ПланыОбмена[Объект.ИмяПланаОбмена].ПояснениеДляНастройкиПараметровУчета(); + + // Управление видимостью связанных элементов. + ПредусмотреныНастройкиОтборовНаУзле = НастройкаОтборовНаУзле.Количество() > 0 + И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьНастройкуОтборовНаУзле", Объект.ВариантНастройкиОбмена); + ПредусмотреныЗначенияПоУмолчаниюНаУзле = ЗначенияПоУмолчаниюНаУзле.Количество() > 0 + И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьЗначенияПоУмолчаниюНаУзле", Объект.ВариантНастройкиОбмена); + + Элементы.РамкаГруппыОграничений.Видимость = ПредусмотреныНастройкиОтборовНаУзле; + Элементы.РамкаГруппыОграничений1.Видимость = ПредусмотреныНастройкиОтборовНаУзле; + Элементы.РамкаГруппыОграничений2.Видимость = ПредусмотреныНастройкиОтборовНаУзле; + Элементы.РамкаГруппыЗначенийПоУмолчанию.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; + Элементы.РамкаГруппыЗначенийПоУмолчанию1.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; + Элементы.РамкаГруппыЗначенийПоУмолчанию2.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; + Элементы.РамкаГруппыЗначенийПоУмолчанию6.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзле; + + // 2. Для корреспондента - опционально. + Если Не ДляОбменаЧерезПрямоеПодключение Тогда + Возврат; + КонецЕсли; + + ФормаНастройкиУзлаБазыКорреспондента = ""; + ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента = ""; + ФормаНастройкиУзлов = ""; + + НастройкаОтборовНаУзлеБазыКорреспондента = ОбменДаннымиСервер.НастройкаОтборовНаУзлеБазыКорреспондента( + Объект.ИмяПланаОбмена, + ВерсияКонфигурацииКорреспондента, + ФормаНастройкиУзлаБазыКорреспондента, + Объект.ВариантНастройкиОбмена); + + ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента( + Объект.ИмяПланаОбмена, + ВерсияКонфигурацииКорреспондента, + ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента, + Объект.ВариантНастройкиОбмена); + + ОбновитьОписаниеОграниченийПередачиДанныхБазыКорреспондента(НастройкаОтборовНаУзлеБазыКорреспондента); + ОбновитьОписаниеЗначенийПоУмолчаниюБазыКорреспондента(ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента); + + НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись = ОбменДаннымиСервер.ПояснениеДляНастройкиПараметровУчетаБазыКорреспондента( + Объект.ИмяПланаОбмена, + ВерсияКонфигурацииКорреспондента); + + // Управление видимостью связанных элементов. + ПредусмотреныНастройкиОтборовНаУзлеБазыКорреспондента = НастройкаОтборовНаУзлеБазыКорреспондента.Количество() > 0 + И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента", Объект.ВариантНастройкиОбмена); + ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента.Количество() > 0 + И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", Объект.ВариантНастройкиОбмена); + + Элементы.РамкаГруппыОграничений4.Видимость = ПредусмотреныНастройкиОтборовНаУзлеБазыКорреспондента; + Элементы.РамкаГруппыЗначенийПоУмолчанию4.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; + Элементы.РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондента.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле) + + ОписаниеОграниченийПередачиДанных = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанных( + Объект.ИмяПланаОбмена, + НастройкаОтборовНаУзле, + ВерсияКонфигурацииКорреспондента, + Объект.ВариантНастройкиОбмена); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьОписаниеОграниченийПередачиДанныхБазыКорреспондента(НастройкаОтборовНаУзлеБазыКорреспондента) + + ОписаниеОграниченийПередачиДанныхБазыКорреспондента = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанныхБазыКорреспондента( + Объект.ИмяПланаОбмена, + НастройкаОтборовНаУзлеБазыКорреспондента, + ВерсияКонфигурацииКорреспондента, + Объект.ВариантНастройкиОбмена); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле) + + ОписаниеЗначенийПоУмолчанию = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчанию( + Объект.ИмяПланаОбмена, + ЗначенияПоУмолчаниюНаУзле, + ВерсияКонфигурацииКорреспондента, + Объект.ВариантНастройкиОбмена); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьОписаниеЗначенийПоУмолчаниюБазыКорреспондента(ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента) + + ОписаниеЗначенийПоУмолчаниюБазыКорреспондента = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчаниюБазыКорреспондента( + Объект.ИмяПланаОбмена, + ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента, + ВерсияКонфигурацииКорреспондента, + Объект.ВариантНастройкиОбмена); + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + &НаКлиенте Процедура ВыполнитьПереходДалее() @@ -1288,15 +1419,8 @@ ЗапросыРазрешений = Новый Массив; - ПараметрыЗапроса = РегистрыСведений.НастройкиТранспортаОбмена.ПараметрыЗапросаНаИспользованиеВнешнихРесурсов(); - ПараметрыЗапроса.ЗапрашиватьCOM = ЗапрашиватьCOM; - ПараметрыЗапроса.ЗапрашиватьFILE = ЗапрашиватьFILE; - ПараметрыЗапроса.ЗапрашиватьWS = ЗапрашиватьWS; - ПараметрыЗапроса.ЗапрашиватьFTP = ЗапрашиватьFTP; - РегистрыСведений.НастройкиТранспортаОбмена.ЗапросНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений, - Запись, ПараметрыЗапроса); - + Запись, ЗапрашиватьCOM, ЗапрашиватьFILE, ЗапрашиватьWS, ЗапрашиватьFTP); Возврат ЗапросыРазрешений; КонецФункции @@ -1308,7 +1432,7 @@ Элементы.ГруппаОшибкиПодключения.Видимость = Ложь; ОчиститьСообщения(); - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Ложь); @@ -1320,10 +1444,10 @@ ПоказатьПредупреждение(,ТекстСообщения); Иначе Элементы.ГруппаОшибкиПодключения.Видимость = Истина; - ЭтоОшибкаРегистрацииКомпоненты = Найти(ТекстСообщения, "2147221164") > 0; + ЭтоОшибкаРегистрацииКомпоненты = СтрНайти(ТекстСообщения, "2147221164") > 0; ТекстРегистрацияКомпоненты = ""; Если ЭтоОшибкаРегистрацииКомпоненты Тогда - ЭтоФайловаяИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + ЭтоФайловаяИБ = ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая(); ТекстРегистрацияКомпоненты = Символы.ПС + НСтр("ru = 'Возможно, необходимо зарегистрировать COM-компоненту comcntr.dll'") + ?(ЭтоФайловаяИБ, ".", НСтр("ru = ', после чего выполнить перезапуск сервера 1С:Предприятие.'")) @@ -1409,8 +1533,9 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики ожидания +#КонецОбласти + +#Область ОбработчикиОжидания &НаКлиенте Процедура ОбработчикОжиданияДлительнойОперации() @@ -1482,8 +1607,9 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Прикладные служебные процедуры и функции. +#КонецОбласти + +#Область ДругиеСлужебныеПроцедурыИФункции &НаСервере Процедура НастроитьНовыйОбменДаннымиНаСервере(Отказ, НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле) @@ -1520,6 +1646,9 @@ ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + КонтекстФормыНастройкиУзлов.Вставить("ЗначенияПоУмолчаниюНаУзле", ЗначенияПоУмолчаниюНаУзле); + КонтекстФормыНастройкиУзлов.Вставить("ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента); + ОбработкаОбъект.ВыполнитьДействияПоНастройкеНовогоОбменаДаннымиЧерезВебСервисВДвухБазах(Отказ, КонтекстФормыНастройкиУзлов, ДлительнаяОперация, @@ -1550,15 +1679,36 @@ Элементы.ПояснениеВыбораКаталогаОбменаИнформациейНаСервере.Видимость = Не ИнформационнаяБазаФайловая; Элементы.FILEКаталогОбменаИнформацией.КнопкаВыбора = ИнформационнаяБазаФайловая; - Элементы.ПрефиксИнформационнойБазыИсточника.Видимость = Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; - Элементы.ПрефиксИнформационнойБазыИсточника1.Видимость = Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; - Элементы.ПрефиксИнформационнойБазыПриемника.Видимость = Ложь; + // Префикс источника. - Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВебСервис.Видимость = Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; - Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВебСервис.ТолькоПросмотр = Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; + ПрефиксИсточникаКоллекцияЭлементов = Новый Массив; + ПрефиксИсточникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыИсточника); + ПрефиксИсточникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыИсточникаОбменССервисом); + ПрефиксИсточникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВебСервис); + ПрефиксИсточникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВнешнееСоединение); - Элементы.ПрефиксИнформационнойБазыИсточникаОбменССервисом.ТолькоПросмотр = Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; - Элементы.ПрефиксИнформационнойБазыПриемникаОбменССервисом.ТолькоПросмотр = Истина; + // В основном префикс нужен только для просмотра. + ПодсказкаДляИзменяемогоПрефикса = Метаданные.Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Подсказка; + Если Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен Тогда + Для Каждого ПрефиксИсточникаЭлемент Из ПрефиксИсточникаКоллекцияЭлементов Цикл + ПрефиксИсточникаЭлемент.ТолькоПросмотр = Ложь; + ПрефиксИсточникаЭлемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + ПрефиксИсточникаЭлемент.РасширеннаяПодсказка.Заголовок = ПодсказкаДляИзменяемогоПрефикса; + КонецЦикла; + КонецЕсли; + + // Префикс приемника для онлайн обменов с возможностью установки префикса в корреспонденте. + + ПрефиксПриемникаКоллекцияЭлементов = Новый Массив; + ПрефиксПриемникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВнешнееСоединение); + ПрефиксПриемникаКоллекцияЭлементов.Добавить(Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервис); + Для Каждого ПрефиксИсточникаЭлемент Из ПрефиксИсточникаКоллекцияЭлементов Цикл + ПрефиксИсточникаЭлемент.РасширеннаяПодсказка.Заголовок = ПодсказкаДляИзменяемогоПрефикса; + КонецЦикла; + + Если Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда + Элементы.ПрефиксИнформационнойБазыПриемника.РасширеннаяПодсказка.Заголовок = ПодсказкаДляИзменяемогоПрефикса; + КонецЕсли; Если Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда Элементы.СтраницыОтображенияФинальногоДействия.ТекущаяСтраница = Элементы.СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзла; @@ -1566,14 +1716,11 @@ Элементы.СтраницыОтображенияФинальногоДействия.ТекущаяСтраница = Элементы.СтраницаВыполнитьВыгрузкуДанныхДляСопоставления; Элементы.ГруппаПрогрессБарВыгрузка.Видимость = Ложь; КонецЕсли; - // + Если Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда Элементы.ГруппаПереключателяВыбораРежимаРаботыПомощника.Видимость = Ложь; - Элементы.ЗаглушкаПрефикс.Видимость = Ложь; - Элементы.ПрефиксИнформационнойБазыПриемника1.ОтображениеПодсказки = ОтображениеПодсказки.Нет; - Элементы.ГруппаПереключателяВыбораРежимаРаботыПомощника.Заголовок = НСтр("ru = 'Создание начального образа подчиненного узла РИБ'"); КонецЕсли; @@ -1657,34 +1804,6 @@ КонецПроцедуры -&НаСервере -Процедура ПолучитьОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле) - - ОписаниеОграниченийПередачиДанных = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанных(Объект.ИмяПланаОбмена, НастройкаОтборовНаУзле, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - -КонецПроцедуры - -&НаСервере -Процедура ПолучитьОписаниеОграниченийПередачиДанныхБазыКорреспондента(НастройкаОтборовНаУзлеБазыКорреспондента) - - ОписаниеОграниченийПередачиДанныхБазыКорреспондента = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанныхБазыКорреспондента(Объект.ИмяПланаОбмена, НастройкаОтборовНаУзлеБазыКорреспондента, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - -КонецПроцедуры - -&НаСервере -Процедура ПолучитьОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле) - - ОписаниеЗначенийПоУмолчанию = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчанию(Объект.ИмяПланаОбмена, ЗначенияПоУмолчаниюНаУзле, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - -КонецПроцедуры - -&НаСервере -Процедура ПолучитьОписаниеЗначенийПоУмолчаниюБазыКорреспондента(ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента) - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондента = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчаниюБазыКорреспондента(Объект.ИмяПланаОбмена, ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - -КонецПроцедуры - &НаСервере Функция ПолучитьОписаниеНастроекТранспортаОбмена() @@ -1975,36 +2094,10 @@ КонецЕсли; - ФормаНастройкиУзла = ""; - ФормаНастройкиУзлаБазыКорреспондента = ""; - ФормаНастройкиЗначенийПоУмолчанию = ""; - ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента = ""; - ФормаНастройкиУзлов = ""; - - НастройкаОтборовНаУзле = ОбменДаннымиСервер.НастройкаОтборовНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзла, Объект.ВариантНастройкиОбмена); - ЗначенияПоУмолчаниюНаУзле = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиЗначенийПоУмолчанию, Объект.ВариантНастройкиОбмена); + ОбновитьНастройкиИИхОписанияЗначениямиПоУмолчанию(Истина); ОбменДаннымиСервер.ОбщиеДанныеУзлов(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзлов); - ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента( - Объект.ИмяПланаОбмена, - ВерсияКонфигурацииКорреспондента, - ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента, - Объект.ВариантНастройкиОбмена); - - ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента.Количество() > 0; - - Элементы.РамкаГруппыЗначенийПоУмолчанию4.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; - Элементы.РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондента.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; - - ОписаниеЗначенийПоУмолчаниюБазыКорреспондента = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчаниюБазыКорреспондента( - Объект.ИмяПланаОбмена, - ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента, - ВерсияКонфигурацииКорреспондента, - Объект.ВариантНастройкиОбмена); - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись = ОбменДаннымиСервер.ПояснениеДляНастройкиПараметровУчетаБазыКорреспондента(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента); - КонецЕсли; КонецПроцедуры @@ -2270,7 +2363,7 @@ КонецЦикла; // вызов сервера - ПолучитьОписаниеОграниченийПередачиДанныхБазыКорреспондента(НастройкаОтборовНаУзлеБазыКорреспондента); + ОбновитьОписаниеОграниченийПередачиДанныхБазыКорреспондента(НастройкаОтборовНаУзлеБазыКорреспондента); КонецЕсли; @@ -2307,7 +2400,7 @@ КонецЦикла; // вызов сервера - ПолучитьОписаниеЗначенийПоУмолчаниюБазыКорреспондента(ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента); + ОбновитьОписаниеЗначенийПоУмолчаниюБазыКорреспондента(ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента); КонецЕсли; @@ -2415,7 +2508,6 @@ Если ВыполнитьОбменДаннымиСейчас Тогда - Состояние(НСтр("ru = 'Выполняется отправка данных...'")); // Видимость прогресс-бара Если РежимРаботыМастера <> "ОбменЧерезВебСервис" ИЛИ РежимРаботыМастера = "ОбменЧерезВнешнееСоединение" @@ -2469,10 +2561,9 @@ КонецЕсли; - ПроцентВыполнения = 100; ДопИнформацияВыполнение = ""; ДлительнаяОперация = Ложь; - Состояние(НСтр("ru = 'Отправка данных завершена'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Отправка данных завершена'")); Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда @@ -2484,7 +2575,15 @@ ПоказатьПредупреждение(, СообщениеОбОшибке); + ПроцентВыполнения = 0; + ВыполнитьОбменДаннымиСейчас = Ложь; + + ЭтотОбъект.ТолькоПросмотр = Ложь; + Элементы.КомандаГотово6.Доступность = Истина; + Элементы.КомандаГотово7.Доступность = Истина; + Иначе + ПроцентВыполнения = 100; ПодключитьОбработчикОжидания("ЗакрытьФормуОтложенно", 1, Истина); КонецЕсли; @@ -2511,8 +2610,6 @@ &НаКлиенте Процедура ЗавершениеВторогоЭтапаНастройкиОбменаЧерезОбычныеКаналыСвязи(Отказ, Знач ОткрыватьПослеЗакрытияТекущей) - Состояние(НСтр("ru = 'Выполняется создание настройки синхронизации данных'")); - НастроитьНовыйОбменДаннымиНаСервере(Отказ, НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле); Если Отказ Тогда @@ -2672,7 +2769,7 @@ КоллекцияЭлементовДерева.Очистить(); ОбщегоНазначения.ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, - ОбменДаннымиСервер.ПолучитьДеревоИнформацииСтатистики(ИнформацияСтатистики)); + ОбменДаннымиСервер.ИнформацияСтатистики(ИнформацияСтатистики)); КонецПроцедуры @@ -2721,9 +2818,10 @@ ВыполнитьКомандуГотово(Ложь); КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Значения констант + +#КонецОбласти + +#Область ЗначенияКонстант &НаКлиентеНаСервереБезКонтекста Функция НадписьДалееFTP() @@ -2886,8 +2984,9 @@ Возврат Расписание; КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Переопределяемая часть - обработчики фоновых заданий. +#КонецОбласти + +#Область ОбработчикиФоновыхЗаданий &НаКлиенте Функция ПараметрыФоновогоЗадания() @@ -2987,9 +3086,9 @@ КонецПроцедуры +#КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// Переопределяемая часть - Обработчики событий переходов. +#Область ОбработчикиСобытийПереходов &НаКлиенте Процедура ПерейтиНаШагВпередОтложеннойОбработкой() @@ -3016,8 +3115,13 @@ СтраницаМастераЗаданиеПараметровТранспортаFILE_ПриПереходеДалееНаСервере(Отказ); Иначе ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьРесурсЗавершение", ЭтотОбъект, "РазрешенFile"); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Истина, Ложь, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Истина, Ложь, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; КонецЕсли; @@ -3034,8 +3138,13 @@ СтраницаМастераЗаданиеПараметровТранспортаFTP_ПриПереходеДалееНаСервере(Отказ); Иначе ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьРесурсЗавершение", ЭтотОбъект, "РазрешенFTP"); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Ложь, Истина); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Ложь, Истина); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; КонецЕсли; КонецЕсли; @@ -3070,8 +3179,13 @@ И Не ВнешниеРесурсыРазрешены.РазрешенCom) Тогда ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьРесурсЗавершение", ЭтотОбъект, "РазрешенCom"); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Истина, Ложь, Ложь, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Истина, Ложь, Ложь, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; ИначеЕсли РежимРаботыМастера = "ОбменЧерезВебСервис" И Не ВнешниеРесурсыРазрешены.РазрешенWS Тогда @@ -3080,8 +3194,13 @@ Если Не Отказ Тогда ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьРесурсЗавершение", ЭтотОбъект, "РазрешенWS"); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; КонецЕсли; @@ -3149,6 +3268,13 @@ КонецЕсли; + Если ПустаяСтрока(Объект.ПрефиксИнформационнойБазыИсточника) Тогда + + НСтрока = НСтр("ru = 'Укажите префикс этой информационной базы.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ПрефиксИнформационнойБазыИсточника",, Отказ); + + КонецЕсли; + Если ПустаяСтрока(Объект.ПрефиксИнформационнойБазыПриемника) Тогда НСтрока = НСтр("ru = 'Укажите существующий или желаемый префикс второй информационной базы.'"); @@ -3201,6 +3327,13 @@ Возврат Неопределено; КонецЕсли; + Если ПустаяСтрока(Объект.ПрефиксИнформационнойБазыИсточника) Тогда + + НСтрока = НСтр("ru = 'Укажите префикс информационной базы.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ПрефиксИнформационнойБазыИсточника",, Отказ); + + КонецЕсли; + Если ПредусмотреныНастройкиОтборовНаУзле Тогда // Проверяем заполнение реквизитов в форме настроек ограничения миграции данных. @@ -3526,8 +3659,13 @@ Если Не Отказ Тогда ОповещениеОЗакрытии = Новый ОписаниеОповещения("РазрешитьРесурсЗавершение", ЭтотОбъект, "РазрешенWS"); - Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); - РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = СоздатьЗапросНаИспользованиеВнешнихРесурсов(Объект, Ложь, Ложь, Истина, Ложь); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, ОповещениеОЗакрытии); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК); + КонецЕсли; Отказ = Истина; КонецЕсли; @@ -4331,21 +4469,22 @@ КонецЕсли; + Если ПустаяСтрока(Объект.ПрефиксИнформационнойБазыИсточника) Тогда + + НСтрока = НСтр("ru = 'Укажите префикс этой программы.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ПрефиксИнформационнойБазыИсточника",, Отказ); + + КонецЕсли; + Если СокрЛП(Объект.ПрефиксИнформационнойБазыИсточника) = СокрЛП(Объект.ПрефиксИнформационнойБазыПриемника) Тогда НСтрока = НСтр("ru = 'Префиксы информационных баз должны быть различными.'"); ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ПрефиксИнформационнойБазыИсточника",, Отказ); ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ПрефиксИнформационнойБазыПриемника",, Отказ); - Элементы.ПрефиксИнформационнойБазыИсточникаОбменССервисом.Видимость = Истина; - Элементы.ПрефиксИнформационнойБазыИсточникаОбменССервисом.Доступность = Истина; - Элементы.ПрефиксИнформационнойБазыПриемникаОбменССервисом.Видимость = Истина; - - Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВебСервис.Видимость = Истина; - Элементы.ПрефиксИнформационнойБазыИсточникаОбменЧерезВебСервис.Доступность = Истина; - Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервис.Видимость = Истина; - Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервис.Доступность = Истина; - + Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервис.ТолькоПросмотр = Ложь; + Иначе + Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВебСервис.ТолькоПросмотр = Истина; КонецЕсли; Если Отказ Тогда @@ -4414,7 +4553,9 @@ &НаСервере Процедура СтраницаМастераЗаданиеПараметровТранспортаFILE_ПриПереходеДалееНаСервере(Отказ) - ОбменДаннымиСервер.ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ, Объект, Перечисления.ВидыТранспортаСообщенийОбмена.FILE); + Если Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда + ОбменДаннымиСервер.ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ, Объект, Перечисления.ВидыТранспортаСообщенийОбмена.FILE); + КонецЕсли; КонецПроцедуры @@ -4641,11 +4782,16 @@ Возврат; КонецЕсли; - Если Не Объект.ПрефиксИнформационнойБазыПриемникаУстановлен Тогда + ПрефиксПриемникаЭлемент = Элементы.ПрефиксИнформационнойБазыПриемникаОбменЧерезВнешнееСоединение; + Если Объект.ПрефиксИнформационнойБазыПриемникаУстановлен Тогда + ПрефиксПриемникаЭлемент.ТолькоПросмотр = Истина; + ПрефиксПриемникаЭлемент.ОтображениеПодсказки = ОтображениеПодсказки.Нет; + Иначе Объект.ПрефиксИнформационнойБазыПриемника = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПрефиксИнформационнойБазыПоУмолчанию(); + ПрефиксПриемникаЭлемент.ТолькоПросмотр = Ложь; + ПрефиксПриемникаЭлемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; КонецЕсли; - Элементы.ПрефиксИнформационнойБазыПриемника.Видимость = Не Объект.ПрефиксИнформационнойБазыПриемникаУстановлен; Объект.НаименованиеВторойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.НаименованиеПредопределенногоУзлаПланаОбмена(Объект.ИмяПланаОбмена); ЗаданоНаименованиеВторойБазы = Не ПустаяСтрока(Объект.НаименованиеВторойБазы); @@ -4658,31 +4804,7 @@ КонецЕсли; - ФормаНастройкиУзла = ""; - ФормаНастройкиУзлаБазыКорреспондента = ""; - ФормаНастройкиЗначенийПоУмолчанию = ""; - ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента = ""; - ФормаНастройкиУзлов = ""; - - НастройкаОтборовНаУзле = ОбменДаннымиСервер.НастройкаОтборовНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзла, Объект.ВариантНастройкиОбмена); - ЗначенияПоУмолчаниюНаУзле = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиЗначенийПоУмолчанию, Объект.ВариантНастройкиОбмена); - - НастройкаОтборовНаУзлеБазыКорреспондента = ОбменДаннымиСервер.НастройкаОтборовНаУзлеБазыКорреспондента(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзлаБазыКорреспондента, Объект.ВариантНастройкиОбмена); - ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиЗначенийПоУмолчаниюБазыКорреспондента, Объект.ВариантНастройкиОбмена); - - ПредусмотреныНастройкиОтборовНаУзлеБазыКорреспондента = НастройкаОтборовНаУзлеБазыКорреспондента.Количество() > 0 - И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента", Объект.ВариантНастройкиОбмена); - ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента = ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента.Количество() > 0 - И ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(Объект.ИмяПланаОбмена, "ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", Объект.ВариантНастройкиОбмена); - - Элементы.РамкаГруппыОграничений4.Видимость = ПредусмотреныНастройкиОтборовНаУзлеБазыКорреспондента; - Элементы.РамкаГруппыЗначенийПоУмолчанию4.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; - Элементы.РамкаГруппыЗначенийПоУмолчаниюБазыКорреспондента.Видимость = ПредусмотреныЗначенияПоУмолчаниюНаУзлеБазыКорреспондента; - - ОписаниеОграниченийПередачиДанныхБазыКорреспондента = ОбменДаннымиСервер.ОписаниеОграниченийПередачиДанныхБазыКорреспондента(Объект.ИмяПланаОбмена, НастройкаОтборовНаУзлеБазыКорреспондента, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - ОписаниеЗначенийПоУмолчаниюБазыКорреспондента = ОбменДаннымиСервер.ОписаниеЗначенийПоУмолчаниюБазыКорреспондента(Объект.ИмяПланаОбмена, ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента, ВерсияКонфигурацииКорреспондента, Объект.ВариантНастройкиОбмена); - - НастройкиПараметровУчетаКорреспондентаПоясняющаяНадпись = ОбменДаннымиСервер.ПояснениеДляНастройкиПараметровУчетаБазыКорреспондента(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента); + ОбновитьНастройкиИИхОписанияЗначениямиПоУмолчанию(Истина); КонецПроцедуры @@ -4712,8 +4834,9 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Переопределяемая часть - Инициализация переходов помощника. +#КонецОбласти + +#Область ИнициализацияПереходов &НаСервере Процедура ТаблицаПереходовПервогоЭтапаНастройкиОбмена() @@ -5306,3 +5429,5 @@ КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl index 80a6b2313..a0b6f00a6 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl @@ -44,7 +44,7 @@ УстановитьПривилегированныйРежим(Истина); - ЗначенияПоУмолчаниюНаУзле = Новый Структура; + ЗначенияПоУмолчаниюНаУзле = НастройкаОтборовНаУзле.ЗначенияПоУмолчаниюНаУзле; ПолеСтрокаСообщенияОбОшибке = Неопределено; ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS; @@ -110,7 +110,7 @@ WSПрокси.CreateExchange(ИмяПланаОбмена, СтрокаПараметровМастераXML, Сериализатор.ЗаписатьXDTO(ЭкранироватьПеречисления(НастройкаОтборовНаУзле.НастройкаОтборовНаУзлеБазыКорреспондента)), - Сериализатор.ЗаписатьXDTO(ЭкранироватьПеречисления(ЗначенияПоУмолчаниюНаУзле))); + Сериализатор.ЗаписатьXDTO(НастройкаОтборовНаУзле.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента)); ИначеЕсли ВерсияКорреспондента_2_0_1_6 Тогда @@ -119,14 +119,14 @@ WSПрокси.CreateExchange(ИмяПланаОбмена, СтрокаПараметровМастераXML, Сериализатор.ЗаписатьXDTO(НастройкаОтборовНаУзле.НастройкаОтборовНаУзлеБазыКорреспондента), - Сериализатор.ЗаписатьXDTO(ЗначенияПоУмолчаниюНаУзле)); + Сериализатор.ЗаписатьXDTO(НастройкаОтборовНаУзле.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента)); Иначе WSПрокси.CreateExchange(ИмяПланаОбмена, СтрокаПараметровМастераXML, ЗначениеВСтрокуВнутр(НастройкаОтборовНаУзле.НастройкаОтборовНаУзлеБазыКорреспондента), - ЗначениеВСтрокуВнутр(ЗначенияПоУмолчаниюНаУзле)); + ЗначениеВСтрокуВнутр(НастройкаОтборовНаУзле.ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента)); КонецЕсли; @@ -194,6 +194,10 @@ // создаем новый узел СоздатьОбновитьУзлыПланаОбмена(НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле, КодЭтогоУзла, КодНовогоУзла); + // Записываем версию корреспондента. + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьВерсиюКорреспондента( + УзелИнформационнойБазы, ВнешнееСоединение.Метаданные.Версия); + // Загружаем настройки транспорта сообщений. ОбновитьНастройкиТранспортаСообщенийОбменаCOM(); @@ -401,7 +405,7 @@ Если ЗначениеДоОбновления <> ПрефиксИнформационнойБазы Тогда - Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(ПрефиксИнформационнойБазы)); + ОбменДаннымиСервер.УстановитьПрефиксИнформационнойБазы(СокрЛП(ПрефиксИнформационнойБазы)); КонецЕсли; @@ -456,7 +460,7 @@ Если ЗначениеДоОбновления <> ПрефиксИнформационнойБазы Тогда - Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(ПрефиксИнформационнойБазы)); + ОбменДаннымиСервер.УстановитьПрефиксИнформационнойБазы(СокрЛП(ПрефиксИнформационнойБазы)); КонецЕсли; @@ -540,6 +544,22 @@ Ложь, Ложь); + Если Отказ Тогда + УдалитьНастройкуОбменаДанными(); + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьНастройкуОбменаДанными() + + УстановитьПривилегированныйРежим(Истина); + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + УдаляемыйУзел = МенеджерПланаОбмена.НайтиПоКоду(КодНовогоУзлаВторойБазы); + Если Не УдаляемыйУзел.Пустая() Тогда + УдаляемыйУзелОбъект = УдаляемыйУзел.ПолучитьОбъект(); + УдаляемыйУзелОбъект.Удалить(); + КонецЕсли; + КонецПроцедуры // Выполняет выгрузку параметров помощника во временное хранилище для продолжения настройки обмена во второй базе. @@ -768,13 +788,20 @@ // Обновляем повторно используемые значения МРО. ОбменДаннымиВызовСервера.ПроверитьКэшМеханизмаРегистрацииОбъектов(); - Если РегистрироватьДанныеДляВыгрузки - И Не ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда + Попытка - // Выполняем регистрацию изменений на узле плана обмена. - ЗарегистрироватьИзмененияДляОбмена(Отказ); + Если РегистрироватьДанныеДляВыгрузки + И Не ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда + + // Выполняем регистрацию изменений на узле плана обмена. + ЗарегистрироватьИзмененияДляОбмена(Отказ); + + КонецЕсли; - КонецЕсли; + Исключение + СообщитьИнформациюОбОшибке(ИнформацияОбОшибке(), Отказ); + Возврат; + КонецПопытки; КонецПроцедуры @@ -843,8 +870,8 @@ НовыйУзел.НомерОтправленного = 0; НовыйУзел.НомерПринятого = 0; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() И ОбменДаннымиСервер.ЭтоРазделенныйПланОбменаБСП(ИмяПланаОбмена) Тогда НовыйУзел.РегистрироватьИзменения = Истина; @@ -861,7 +888,7 @@ УзелИнформационнойБазы = НовыйУзел.Ссылка; Если СоздаватьНовыйУзел - И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + И Не ОбщегоНазначения.РазделениеВключено() Тогда ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными(); КонецЕсли; @@ -878,8 +905,10 @@ ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILМаксимальныйДопустимыйРазмерСообщения"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILСжиматьФайлИсходящегоСообщения"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILУчетнаяЗапись"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILТранслитерироватьИменаФайловСообщенийОбмена"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FILEКаталогОбменаИнформацией"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FILEСжиматьФайлИсходящегоСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FILEТранслитерироватьИменаФайловСообщенийОбмена"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСжиматьФайлИсходящегоСообщения"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПароль"); @@ -887,6 +916,7 @@ ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПользователь"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПорт"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПуть"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPТранслитерироватьИменаФайловСообщенийОбмена"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "WSURLВебСервиса"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "WSИмяПользователя"); ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "WSПароль"); @@ -930,7 +960,7 @@ Если ПустаяСтрока(ЗначениеДоОбновления) И ЗначениеДоОбновления <> ПрефиксИнформационнойБазыИсточника Тогда - Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(ПрефиксИнформационнойБазыИсточника)); + ОбменДаннымиСервер.УстановитьПрефиксИнформационнойБазы(СокрЛП(ПрефиксИнформационнойБазыИсточника)); КонецЕсли; @@ -1073,7 +1103,7 @@ Перем СтруктураНастроек; // Проверка возможности использования плана обмена в модели сервиса. - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + Если ОбщегоНазначения.РазделениеВключено() И Не ОбменДаннымиПовтИсп.ПланОбменаИспользуетсяВМоделиСервиса(ИмяПланаОбмена) Тогда ПолеСтрокаСообщенияОбОшибке = НСтр("ru = 'Синхронизация данных с этой программой в режиме сервиса не предусмотрена.'"); ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщенияОбОшибке(), Отказ); @@ -1102,33 +1132,13 @@ УчетнаяЗаписьЭлектроннойПочты = Неопределено; - Если СтруктураНастроек.Свойство("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") + И СтруктураНастроек.Свойство("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты) И УчетнаяЗаписьЭлектроннойПочты <> Неопределено Тогда - УчетнаяЗаписьЭтойБазы = Неопределено; - // Для предопределенной записи - перезаписываем предопределенный элемент текущей ИБ. - Если УчетнаяЗаписьЭлектроннойПочты.Предопределенный Тогда - УчетнаяЗаписьЭтойБазы = Справочники.УчетныеЗаписиЭлектроннойПочты[УчетнаяЗаписьЭлектроннойПочты.ИмяПредопределенныхДанных].ПолучитьОбъект(); - Иначе - // Для обычной записи ищем существующую запись с тем же адресом. - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | Ссылка - |ИЗ Справочник.УчетныеЗаписиЭлектроннойПочты - |ГДЕ АдресЭлектроннойПочты = &АдресЭлектроннойПочты"; - Запрос.УстановитьПараметр("АдресЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты.АдресЭлектроннойПочты); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - УчетнаяЗаписьЭтойБазы = Выборка.Ссылка.ПолучитьОбъект(); - КонецЕсли; - КонецЕсли; - Если УчетнаяЗаписьЭтойБазы <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(УчетнаяЗаписьЭтойБазы, УчетнаяЗаписьЭлектроннойПочты,,"ИмяПредопределенныхДанных, Родитель, Владелец, Ссылка"); - УчетнаяЗаписьЭтойБазы.Записать(); - ЭтотОбъект.EMAILУчетнаяЗапись = УчетнаяЗаписьЭтойБазы.Ссылка; - Иначе - УчетнаяЗаписьЭлектроннойПочты.Записать(); - КонецЕсли; + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + УчетнаяЗаписьЭтойБазы = МодульРаботаСПочтовымиСообщениямиСлужебный.УчетнаяЗаписьЭтойБазыПоДаннымУчетнойЗаписиКорреспондента(УчетнаяЗаписьЭлектроннойПочты); + ЭтотОбъект.EMAILУчетнаяЗапись = УчетнаяЗаписьЭтойБазы.Ссылка; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo index 6ef85544d..1d411382a 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo @@ -185,6 +185,22 @@ + + EMAILТранслитерироватьИменаФайловСообщенийОбмена + + ru + Транслитерировать имена файлов сообщений обмена + + + Boolean + + + ru + Признак того, что имена файлов сообщений обмена будут содержать только латинские символы. + + + + FILEКаталогОбменаИнформацией @@ -210,6 +226,22 @@ + + FILEТранслитерироватьИменаФайловСообщенийОбмена + + ru + Транслитерировать имена файлов сообщений обмена + + + Boolean + + + ru + Признак того, что имена файлов сообщений обмена будут содержать только латинские символы. + + + + FTPСжиматьФайлИсходящегоСообщения @@ -308,6 +340,22 @@ + + FTPТранслитерироватьИменаФайловСообщенийОбмена + + ru + Транслитерировать имена файлов сообщений обмена + + + Boolean + + + ru + Признак того, что имена файлов сообщений обмена будут содержать только латинские символы. + + + + WSURLВебСервиса diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form new file mode 100644 index 000000000..5904dae5f --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаВОблачномСервисе/Form.form @@ -0,0 +1,171 @@ + + + + <key>ru</key> + <value>Электронная подпись в облачном сервисе</value> + + + ГруппаИнформацияОПрограмме + 7 + + ДекорацияИнформация + 4 + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 5 + true + + true + true + + + CommonPicture.Информация32 + + + + + ИнформацияОПрограмме + 1 + + <key>ru</key> + <value>Программа предназначена для электронной подписи и шифрования в облачном сервисе. +Алгоритмы подписи, шифрования и хеширования определяются автоматически.</value> + + true + true + + true + + + ИнформацияОПрограммеРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ИнформацияОПрограммеКонтекстноеМеню + 2 + true + + true + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Информация о программе</value> + + + ГруппаИнформацияОПрограммеРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 9 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Right + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + CatalogObject.ПрограммыЭлектроннойПодписиИШифрования + + + true + + + true + + + + + + + diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl new file mode 100644 index 000000000..a5362bdd7 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -0,0 +1,126 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + +Процедура ЗаполнитьНачальныеНастройки() Экспорт + + ОписаниеПрограмм = Новый Массив; + + ОписаниеПрограмм.Добавить(ЭлектроннаяПодпись.НовоеОписаниеПрограммы( + "Infotecs Cryptographic Service Provider", 2)); + + ОписаниеПрограмм.Добавить(ЭлектроннаяПодпись.НовоеОписаниеПрограммы( + "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", 75)); + + ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм(ОписаниеПрограмм); + +КонецПроцедуры + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// для которых необходимо обновить записи в регистре. +// +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПрограммыЭлектроннойПодписиИШифрования.Ссылка + |ИЗ + | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования + |ГДЕ + | ПрограммыЭлектроннойПодписиИШифрования.ЭтоПрограммаОблачногоСервиса"; + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, ВыборкаДетальныеЗаписи.Ссылка); + КонецЦикла; + +КонецПроцедуры + +// При включении сервиса криптографии создается программа электронной подписи и шифрования. +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + ОбработкаЗавершена = Истина; + + ВыборкаДетальныеЗаписи = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.ПрограммыЭлектроннойПодписиИШифрования"); + + ОбъектовОбработано = 0; + ПроблемныхОбъектов = 0; + + Программа = Неопределено; + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + Если ВыборкаДетальныеЗаписи.Ссылка.ПометкаУдаления Тогда + Программа = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + Иначе + // Есть программа уже создана и не помечена на удаление, не создаем новую. + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ВыборкаДетальныеЗаписи.Ссылка); + ОбъектовОбработано = ОбъектовОбработано + 1; + КонецЕсли; + КонецЦикла; + + Если ОбъектовОбработано = 0 Тогда + НачатьТранзакцию(); + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); + + Блокировка.Заблокировать(); + + Если Программа = Неопределено Тогда + Программа = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент(); + Программа.Наименование = НСтр("ru = 'Облачный сервис'"); + Программа.ЭтоПрограммаОблачногоСервиса = Истина; + Программа.Записать(); + Иначе + // Если программа уже создана, снимаем пометку удаления. + Программа.УстановитьПометкуУдаления(Ложь); + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Программа.Ссылка); + КонецЕсли; + + ОбъектовОбработано = ОбъектовОбработано + 1; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + // Если не удалось обработать какой-либо документ, повторяем попытку снова. + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось добавить программу Облачный сервис по причине: + |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + , , ТекстСообщения); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + + Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.ПрограммыЭлектроннойПодписиИШифрования") Тогда + ОбработкаЗавершена = Ложь; + КонецЕсли; + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре Обработки.ОбработатьДанныеДляПереходаНаНовуюВерсию.ОбработатьДанныеДляПереходаНаНовуюВерсию не удалось обработать некоторые программы электронной подписи (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, + Метаданные.НайтиПоПолномуИмени("Справочник.ПрограммыЭлектроннойПодписиИШифрования"),, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедура Обработки.ОбработатьДанныеДляПереходаНаНовуюВерсию.ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию программ электронной подписи: %1'"), + ОбъектовОбработано)); + КонецЕсли; + + Параметры.ОбработкаЗавершена = ОбработкаЗавершена; + +КонецПроцедуры + +#КонецОбласти +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo new file mode 100644 index 000000000..a6f5563de --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo @@ -0,0 +1,22 @@ + + + + + + + ПрограммыЭлектроннойПодписиИШифрования + + ru + Программы электронной подписи и шифрования + + true + + ПрограммаВОблачномСервисе + + ru + Программа в облачном сервисе + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Form.form similarity index 98% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Form.form index 3b4f4b2fc..0507494ac 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Form.form @@ -3,6 +3,10 @@ Список 2 + + <key>ru</key> + <value>Список</value> + true true @@ -21,6 +25,10 @@ СписокИндексКартинкиТекущий 68 + + <key>ru</key> + <value>Индекс картинки</value> + true true @@ -699,7 +707,6 @@ Auto - Tree true true true @@ -917,10 +924,6 @@ ru Форма стандартные команды - - ru - Форма стандартные команды - ФормаСтандартныеКомандыExtendedTooltip 80 @@ -1050,8 +1053,8 @@ ВерсииФайлов.РодительскаяВерсия КАК РодительскаяВерсия, ВерсииФайлов.ИндексКартинки, ВЫБОР - КОГДА ВерсииФайлов.ПометкаУдаления = ИСТИНА - ТОГДА 1 + КОГДА ВерсииФайлов.ПометкаУдаления + ТОГДА ВерсииФайлов.ИндексКартинки + 1 ИНАЧЕ ВерсииФайлов.ИндексКартинки КОНЕЦ КАК ИндексКартинкиТекущий, ВерсииФайлов.ПометкаУдаления КАК ПометкаУдаления, @@ -1093,6 +1096,23 @@ true + + ВладелецВерсии + + <key>ru</key> + <value>Владелец версии</value> + + 1 + + CatalogRef + + + true + + + true + + СделатьАктивной @@ -1242,7 +1262,7 @@ <parameters> <name>Файл</name> <valueType> - <types>CatalogRef.Файлы</types> + <types>AnyRef</types> </valueType> <keyParameter>true</keyParameter> </parameters> diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Help/ru.html new file mode 100644 index 000000000..85ca7bcf3 --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Help/ru.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> +<p>Предназначен для хранения сведений о версиях файлов.</p> +<p>Открывается командой <strong>Версии файла</strong> на панели навигации <a href="Catalog.Файлы.Form.ФормаЭлемента/Help">карточки файла</a>.</p> +<p>В списке с помощью соответствующих кнопок можно:</p> +<ul><li><strong>Просмотреть</strong> - открыть версию файла соответствующим приложением для просмотра (также это можно сделать двойным щелчком мыши); +</li><li><strong>Открыть карточку</strong> - просмотреть данные о версии файла; +</li><li><strong>Сделать активной</strong> - установить выбранную версию файла текущей. Команда доступна только для незанятых файлов; +</li><li><strong>Показать отличия</strong> - сравнить две любые версии файла, предварительно выделив их. Сравнение версий поддерживается для файлов формата HTML, TXT, RTF, DOC, DOCX, ODT. +</li><li>Записать версию файла на компьютер с помощью команды <strong>Сохранить как</strong> меню <strong>Еще</strong>. Укажите путь на компьютере для сохранения версии файла.</li></ul><h3>См. также:</h3> +<ul><li><a href="Catalog.Файлы/Help">Общие сведения о файлах</a>; +</li><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ 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..2c457952e --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсииФайла/Module.bsl @@ -0,0 +1,369 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем Ссылка1; + +&НаКлиенте +Перем Ссылка2; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке динамического списка присоединенных файлов.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка динамического списка невозможна.'"); + + ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов( + Параметры.Файл.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); + + Если Не ПустаяСтрока(ИмяСправочникаХранилищаВерсийФайлов) Тогда + НастроитьДинамическийСписок(ИмяСправочникаХранилищаВерсийФайлов); + КонецЕсли; + + ВидимостьКомандыСравнить = + Не ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() И Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент(); + Элементы.ФормаСравнить.Видимость = ВидимостьКомандыСравнить; + Элементы.КонтекстноеМенюСписокСравнить.Видимость = ВидимостьКомандыСравнить; + + УникальныйИдентификаторКарточкиФайла = Параметры.УникальныйИдентификаторКарточкиФайла; + + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Параметры.Файл); + ВладелецВерсии = Параметры.Файл; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СделатьАктивнойВыполнить() + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + НоваяАктивнаяВерсия = ТекущиеДанные.Ссылка; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ТекущиеДанные.Владелец, ТекущиеДанные.Ссылка); + + Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Смена активной версии разрешена только для незанятых файлов.'")); + ИначеЕсли ДанныеФайла.ПодписанЭП Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Смена активной версии разрешена только для неподписанных файлов.'")); + Иначе + СменитьАктивнуюВерсиюФайла(НоваяАктивнаяВерсия); + Оповестить("Запись_Файл", Новый Структура("Событие", "АктивнаяВерсияИзменена"), Параметры.Файл); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_Файл" + И Параметр.Свойство("Событие") + И ( Параметр.Событие = "ЗаконченоРедактирование" + Или Параметр.Событие = "ВерсияСохранена") Тогда + + Если Параметры.Файл = Источник Тогда + + Элементы.Список.Обновить(); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Владелец, ТекущиеДанные.Ссылка, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКарточку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + + Версия = ТекущиеДанные.Ссылка; + + ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВерсияПрисоединенногоФайла", ПараметрыОткрытияФормы); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередУдалением(Элемент, Отказ) + + Отказ = Истина; + ПометитьНаУдалениеСнятьПометку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдаление(Команда) + + ПометитьНаУдалениеСнятьПометку(); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + + Версия = ТекущиеДанные.Ссылка; + + ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВерсияПрисоединенногоФайла", ПараметрыОткрытияФормы); + + КонецЕсли; + +КонецПроцедуры + +// Сравнить 2 выбранные версии. +&НаКлиенте +Процедура Сравнить(Команда) + + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); + + Если ЧислоВыделенныхСтрок = 2 ИЛИ ЧислоВыделенныхСтрок = 1 Тогда + Если ЧислоВыделенныхСтрок = 2 Тогда + Ссылка1 = Элементы.Список.ВыделенныеСтроки[0]; + Ссылка2 = Элементы.Список.ВыделенныеСтроки[1]; + ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда + Ссылка1 = Элементы.Список.ТекущиеДанные.Ссылка; + Ссылка2 = Элементы.Список.ТекущиеДанные.РодительскаяВерсия; + КонецЕсли; + + Расширение = НРег(Элементы.Список.ТекущиеДанные.Расширение); + + РаботаСФайламиСлужебныйКлиент.СравнитьФайлы(УникальныйИдентификатор, Ссылка1, Ссылка2, Расширение, ВладелецВерсии); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); + + КомандаСравненияДоступна = Ложь; + + Если ЧислоВыделенныхСтрок = 2 Тогда + КомандаСравненияДоступна = Истина; + ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда + + Если Не Элементы.Список.ТекущиеДанные.РодительскаяВерсия.Пустая() Тогда + КомандаСравненияДоступна = Истина; + Иначе + КомандаСравненияДоступна = Ложь; + КонецЕсли; + + Иначе + КомандаСравненияДоступна = Ложь; + КонецЕсли; + + Если КомандаСравненияДоступна = Истина Тогда + Элементы.ФормаСравнить.Доступность = Истина; + Элементы.КонтекстноеМенюСписокСравнить.Доступность = Истина; + Иначе + Элементы.ФормаСравнить.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокСравнить.Доступность = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсию(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Владелец, ТекущиеДанные.Ссылка ,УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ТекущиеДанные.Владелец, ТекущиеДанные.Ссылка , УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура СменитьАктивнуюВерсиюФайла(Версия) + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + + ЭлементБлокировкиДанных = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Версия.Владелец)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Версия.Владелец); + + ЭлементБлокировкиДанных = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Версия)).ПолноеИмя()); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Версия); + + Блокировка.Заблокировать(); + + ЗаблокироватьДанныеДляРедактирования(Версия.Владелец, , УникальныйИдентификаторКарточкиФайла); + ЗаблокироватьДанныеДляРедактирования(Версия, , УникальныйИдентификаторКарточкиФайла); + + ФайлОбъект = Версия.Владелец.ПолучитьОбъект(); + Если ФайлОбъект.ПодписанЭП Тогда + ВызватьИсключение НСтр("ru = 'У подписанного файла нельзя изменять активную версию.'"); + КонецЕсли; + ФайлОбъект.ТекущаяВерсия = Версия; + ФайлОбъект.ТекстХранилище = Версия.ТекстХранилище; + ФайлОбъект.Записать(); + + ВерсияОбъект = Версия.ПолучитьОбъект(); + ВерсияОбъект.Записать(); + + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификаторКарточкиФайла); + РазблокироватьДанныеДляРедактирования(Версия, УникальныйИдентификаторКарточкиФайла); + + ЗафиксироватьТранзакцию(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОтменитьТранзакцию(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПометкуУдаления(Версия, Пометка) + ВерсияОбъект = Версия.ПолучитьОбъект(); + ВерсияОбъект.Заблокировать(); + ВерсияОбъект.УстановитьПометкуУдаления(Пометка); +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдалениеСнятьПометку() + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ПометкаУдаления Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Снять с ""%1"" пометку на удаление?'"), + Строка(ТекущиеДанные.Ссылка)); + Иначе + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пометить ""%1"" на удаление?'"), + Строка(ТекущиеДанные.Ссылка)); + КонецЕсли; + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ТекущиеДанные", ТекущиеДанные); + Обработчик = Новый ОписаниеОповещения("ПометитьНаУдалениеСнятьПометкуЗавершение", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдалениеСнятьПометкуЗавершение(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + ЗначениеПометкиУдаления = Не ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления; + УстановитьПометкуУдаления(ПараметрыВыполнения.ТекущиеДанные.Ссылка, ЗначениеПометкиУдаления); + + Если ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления Тогда + ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = 1; + Иначе + ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = ПараметрыВыполнения.ТекущиеДанные.ИндексКартинки; + КонецЕсли; + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаСервере +Процедура НастроитьДинамическийСписок(ИмяСправочникаХранилищаВерсийФайлов) + + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВерсииФайлов.Код КАК Код, + | ВерсииФайлов.Размер КАК Размер, + | ВерсииФайлов.Комментарий КАК Комментарий, + | ВерсииФайлов.Автор КАК Автор, + | ВерсииФайлов.ДатаСоздания КАК ДатаСоздания, + | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.РодительскаяВерсия КАК РодительскаяВерсия, + | ВерсииФайлов.ИндексКартинки, + | ВЫБОР + | КОГДА ВерсииФайлов.ПометкаУдаления + | ТОГДА ВерсииФайлов.ИндексКартинки + 1 + | ИНАЧЕ ВерсииФайлов.ИндексКартинки + | КОНЕЦ КАК ИндексКартинкиТекущий, + | ВерсииФайлов.ПометкаУдаления КАК ПометкаУдаления, + | ВерсииФайлов.Владелец КАК Владелец, + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВЫБОР + | КОГДА ВерсииФайлов.Владелец.ТекущаяВерсия = ВерсииФайлов.Ссылка + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ЭтоТекущая, + | ВерсииФайлов.Расширение КАК Расширение, + | ВерсииФайлов.НомерВерсии КАК НомерВерсии + |ИЗ + | Справочник." + ИмяСправочникаХранилищаВерсийФайлов + " КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Владелец = &Владелец"; + + ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаВерсийФайлов; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); + + СвойстваСписка.ОсновнаяТаблица = ПолноеИмяСправочника; + СвойстваСписка.ДинамическоеСчитываниеДанных = Истина; + СвойстваСписка.ТекстЗапроса = ТекстЗапроса; + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form similarity index 70% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form index 81e135e64..65065a234 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form @@ -1,21 +1,25 @@ <?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>Группа3</name> + <name>ГруппаОбщаяИнформация</name> <id>85</id> <items xsi:type="form:FormField"> - <name>Владелец</name> + <name>Владелец0</name> <id>6</id> + <title> + <key>ru</key> + <value>Файл</value> + true true true - Объект.Owner + ОбъектПрототип[0].Владелец - ВладелецExtendedTooltip + Владелец0РасширеннаяПодсказка 59 Label true @@ -25,7 +29,7 @@ - ВладелецКонтекстноеМеню + Владелец0КонтекстноеМеню 7 true @@ -64,7 +68,7 @@ true - Объект.ПолноеНаименование + ОбъектПрототип[0].ПолноеНаименование OnChange @@ -110,9 +114,6 @@ true - - Объект.Code - КодExtendedTooltip 62 @@ -152,10 +153,10 @@ true - + <key>ru</key> <value>Наименование код</value> - </toolTip> + НаименованиеКодExtendedTooltip 60 @@ -175,60 +176,17 @@ Auto - - РодительскаяВерсия - 33 - true - true - - true - - - Объект.РодительскаяВерсия - - - РодительскаяВерсияExtendedTooltip - 63 - Label - true - true - - Left - - - - РодительскаяВерсияКонтекстноеМеню - 34 - true - - InputField - true - Enter - true - Left - true - - 46 - true - true - true - true - - Отбор.Владелец - - Объект.Owner - - - Normal - - true true true + + <key>ru</key> + <value>Общая информация</value> + - Группа3РасширеннаяПодсказка + ГруппаОбщаяИнформацияРасширеннаяПодсказка 86 Label true @@ -250,7 +208,7 @@ РасширениеКартинка 32 - Размер + Размер0 8 true true @@ -258,10 +216,10 @@ true - Объект.Размер + ОбъектПрототип[0].Размер - РазмерExtendedTooltip + Размер0РасширеннаяПодсказка 65 Label true @@ -271,7 +229,7 @@ - РазмерКонтекстноеМеню + Размер0КонтекстноеМеню 9 true @@ -295,7 +253,7 @@ - Расширение + Расширение0 10 true true @@ -303,10 +261,10 @@ true - Объект.Расширение + ОбъектПрототип[0].Расширение - РасширениеExtendedTooltip + Расширение0РасширеннаяПодсказка 66 Label true @@ -316,7 +274,7 @@ - РасширениеКонтекстноеМеню + Расширение0КонтекстноеМеню 11 true @@ -341,7 +299,7 @@ - Картинка + Картинка0 20 true true @@ -349,11 +307,11 @@ true - Объект.ИндексКартинки + ОбъектПрототип[0].ИндексКартинки None - КартинкаExtendedTooltip + Картинка0РасширеннаяПодсказка 67 Label true @@ -363,7 +321,7 @@ - КартинкаКонтекстноеМеню + Картинка0КонтекстноеМеню 21 true @@ -391,10 +349,10 @@ true - + <key>ru</key> <value>Расширение картинка</value> - </toolTip> + РасширениеКартинкаExtendedTooltip 64 @@ -416,11 +374,11 @@ - Комментарий + Комментарий0 12 <key>ru</key> - <value>Комментарий к версии</value> + <value>Комментарий</value> true true @@ -428,10 +386,10 @@ true - Объект.Комментарий + ОбъектПрототип[0].Комментарий - КомментарийExtendedTooltip + Комментарий0РасширеннаяПодсказка 68 Label true @@ -441,7 +399,7 @@ - КомментарийКонтекстноеМеню + Комментарий0КонтекстноеМеню 13 true @@ -465,7 +423,7 @@ - Автор + Автор0 14 <key>ru</key> @@ -477,10 +435,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.Автор</segments> + <segments>ОбъектПрототип[0].Автор</segments> </dataPath> <extendedTooltip> - <name>АвторExtendedTooltip</name> + <name>Автор0РасширеннаяПодсказка</name> <id>69</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -490,7 +448,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>АвторКонтекстноеМеню</name> + <name>Автор0КонтекстноеМеню</name> <id>15</id> <autoFill>true</autoFill> </contextMenu> @@ -517,7 +475,7 @@ <name>ДатаИНомер</name> <id>35</id> <items xsi:type="form:FormField"> - <name>ДатаСоздания</name> + <name>ДатаСоздания0</name> <id>16</id> <visible>true</visible> <enabled>true</enabled> @@ -525,10 +483,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.ДатаСоздания</segments> + <segments>ОбъектПрототип[0].ДатаСоздания</segments> </dataPath> <extendedTooltip> - <name>ДатаСозданияExtendedTooltip</name> + <name>ДатаСоздания0РасширеннаяПодсказка</name> <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -538,7 +496,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ДатаСозданияКонтекстноеМеню</name> + <name>ДатаСоздания0КонтекстноеМеню</name> <id>17</id> <autoFill>true</autoFill> </contextMenu> @@ -562,7 +520,7 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>НомерВерсии</name> + <name>НомерВерсии0</name> <id>36</id> <visible>true</visible> <enabled>true</enabled> @@ -570,10 +528,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.НомерВерсии</segments> + <segments>ОбъектПрототип[0].НомерВерсии</segments> </dataPath> <extendedTooltip> - <name>НомерВерсииExtendedTooltip</name> + <name>НомерВерсии0РасширеннаяПодсказка</name> <id>72</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -583,7 +541,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>НомерВерсииКонтекстноеМеню</name> + <name>НомерВерсии0КонтекстноеМеню</name> <id>37</id> <autoFill>true</autoFill> </contextMenu> @@ -608,10 +566,10 @@ <userVisible> <common>true</common> </userVisible> - <toolTip> + <title> <key>ru</key> <value>Дата и номер</value> - </toolTip> + ДатаИНомерExtendedTooltip 70 @@ -632,7 +590,7 @@ - ДатаМодификацииФайла + ДатаМодификацииФайла0 48 <key>ru</key> @@ -644,14 +602,14 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.ДатаМодификацииФайла</segments> + <segments>ОбъектПрототип[0].ДатаМодификацииФайла</segments> </dataPath> <toolTip> <key>ru</key> <value>Дата изменения данных версии файла (местное время)</value> </toolTip> <extendedTooltip> - <name>ДатаМодификацииФайлаРасширеннаяПодсказка</name> + <name>ДатаМодификацииФайла0РасширеннаяПодсказка</name> <id>73</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -661,7 +619,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ДатаМодификацииФайлаКонтекстноеМеню</name> + <name>ДатаМодификацииФайла0КонтекстноеМеню</name> <id>49</id> <autoFill>true</autoFill> </contextMenu> @@ -722,7 +680,7 @@ <name>ГруппаХранение</name> <id>38</id> <items xsi:type="form:FormField"> - <name>ТипХраненияФайла</name> + <name>ТипХраненияФайла0</name> <id>39</id> <visible>true</visible> <enabled>true</enabled> @@ -730,10 +688,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.ТипХраненияФайла</segments> + <segments>ОбъектПрототип[0].ТипХраненияФайла</segments> </dataPath> <extendedTooltip> - <name>ТипХраненияФайлаExtendedTooltip</name> + <name>ТипХраненияФайла0РасширеннаяПодсказка</name> <id>76</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -743,7 +701,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ТипХраненияФайлаКонтекстноеМеню</name> + <name>ТипХраненияФайла0КонтекстноеМеню</name> <id>40</id> <autoFill>true</autoFill> </contextMenu> @@ -766,7 +724,7 @@ <name>ГруппаТом</name> <id>47</id> <items xsi:type="form:FormField"> - <name>Том</name> + <name>Том0</name> <id>51</id> <visible>true</visible> <enabled>true</enabled> @@ -774,10 +732,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Объект.Том</segments> + <segments>ОбъектПрототип[0].Том</segments> </dataPath> <extendedTooltip> - <name>ТомExtendedTooltip</name> + <name>Том0РасширеннаяПодсказка</name> <id>78</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -787,7 +745,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ТомКонтекстноеМеню</name> + <name>Том0КонтекстноеМеню</name> <id>52</id> <autoFill>true</autoFill> </contextMenu> @@ -856,12 +814,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа том</value> + <value>Том</value> - - ru - Группа том - ГруппаТомExtendedTooltip 77 @@ -883,7 +837,7 @@ - ПутьКФайлу + ПутьКФайлу0 43 true true @@ -891,10 +845,10 @@ true - Объект.ПутьКФайлу + ОбъектПрототип[0].ПутьКФайлу - ПутьКФайлуExtendedTooltip + ПутьКФайлу0РасширеннаяПодсказка 80 Label true @@ -904,7 +858,7 @@ - ПутьКФайлуКонтекстноеМеню + ПутьКФайлу0КонтекстноеМеню 44 true @@ -928,12 +882,8 @@ <key>ru</key> - <value>Группа хранение</value> + <value>Хранение</value> - - ru - Группа хранение - ГруппаХранениеExtendedTooltip 75 @@ -960,6 +910,83 @@ ФормаКоманднаяПанель -1 + + СтандартнаяЗаписатьИЗакрыть + 89 + true + true + + true + + + СтандартнаяЗаписатьИЗакрытьРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Form.Command.СтандартнаяЗаписатьИЗакрыть + true + true + true + UserCmds + Auto + + + СтандартнаяЗаписать + 87 + true + true + + true + + + СтандартнаяЗаписатьРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Form.Command.СтандартнаяЗаписать + Normal + true + true + UserCmds + Auto + + + СтандартнаяПеречитать + 91 + true + true + + true + + + СтандартнаяПеречитатьРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + Form.Command.СтандартнаяПеречитать + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + Открыть 26 @@ -1032,34 +1059,12 @@ DontBlock true true - true Vertical true true true auto true - - Объект - 1 - - CatalogObject.ВерсииФайлов - - - true - - - true - - - Объект.ТекстХранилище - - - Объект.ФайлХранилище - -
          true
          - true -
          ТомПолныйПуть @@ -1096,6 +1101,265 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ОбъектПрототип</name> + <title> + <key>ru</key> + <value>Объект прототип</value> + + 4 + + ValueTable + + + true + + + true + + + Владелец + + <key>ru</key> + <value>Владелец</value> + + 1 + + DefinedType.ПрисоединенныйФайл + + + true + + + true + + + + ПолноеНаименование + + <key>ru</key> + <value>Полное наименование</value> + + 2 + + String + + 256 + + + + true + + + true + + + + Размер + + <key>ru</key> + <value>Размер</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + Расширение + + <key>ru</key> + <value>Расширение</value> + + 4 + + String + + 10 + + + + 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 + + CatalogRef.УчетныеЗаписиСинхронизацииФайлов + CatalogRef.Пользователи + + + true + + + true + + + + ДатаСоздания + + <key>ru</key> + <value>Дата создания</value> + + 8 + + Date + + + + true + + + true + + + + НомерВерсии + + <key>ru</key> + <value>Номер версии</value> + + 9 + + Number + + 5 + true + + + + true + + + true + + + + ДатаМодификацииФайла + + <key>ru</key> + <value>Дата модификации файла</value> + + 10 + + Date + + + + true + + + true + + + + ТипХраненияФайла + + <key>ru</key> + <value>Тип хранения версии файла</value> + + 11 + + EnumRef.ТипыХраненияФайлов + + + true + + + true + + + + Том + + <key>ru</key> + <value>Том</value> + + 12 + + CatalogRef.ТомаХраненияФайлов + + + true + + + true + + + + ПутьКФайлу + + <key>ru</key> + <value>Путь к файлу</value> + + 13 + + String + + + + true + + + true + + + Открыть @@ -1148,6 +1412,88 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СтандартнаяЗаписать</name> + <title> + <key>ru</key> + <value>Записать</value> + + 3 + + ru + Стандартная записать + + + true + + + StdPicture.Write + + + + СтандартнаяЗаписать + + + DontUse + Auto + + + СтандартнаяЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 4 + + ru + Стандартная записать и закрыть + + + true + + + StdPicture.WriteAndClose + + + + СтандартнаяЗаписатьИЗакрыть + + + DontUse + Auto + + + СтандартнаяПеречитать + + <key>ru</key> + <value>Перечитать</value> + + 5 + + ru + Стандартная перечитать + + + true + + + StdPicture.Reread + + + + СтандартнаяПеречитать + + + DontUse + Auto + + + Ключ + + AnyRef + + true + @@ -1157,10 +1503,4 @@ - - - AfterWrite - ПослеЗаписи - - diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Help/ru.html diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl new file mode 100644 index 000000000..bf48e72b6 --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl @@ -0,0 +1,265 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ОбъектЗначение = Параметры.Ключ.ПолучитьОбъект(); + ОбъектЗначение.Заполнить(Неопределено); + + ИмяСправочника = ОбъектЗначение.Метаданные().Имя; + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке формы элемента присоединенных файлов.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка формы элемента невозможна.'"); + + ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов( + ТипЗнч(ОбъектЗначение.Владелец.ВладелецФайла), "", ЗаголовокОшибки, ОкончаниеОшибки); + + НастроитьОбъектФормы(ОбъектЗначение); + + Если ТипЗнч(ЭтотОбъект.Объект.Владелец) = Тип("СправочникСсылка.Файлы") Тогда + Элементы.ПолноеНаименование.ТолькоПросмотр = Истина; + КонецЕсли; + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + Элементы.Автор0.ТолькоПросмотр = Ложь; + Элементы.ДатаСоздания0.ТолькоПросмотр = Ложь; + Иначе + Элементы.ГруппаХранение.Видимость = Ложь; + КонецЕсли; + + ТомПолныйПуть = РаботаСФайламиСлужебный.ПолныйПутьТома(ЭтотОбъект.Объект.Том); + + ОбщиеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + + РасширениеФайлаВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ОбщиеНастройки.СписокРасширенийТекстовыхФайлов, ЭтотОбъект.Объект.Расширение); + + Если РасширениеФайлаВСписке Тогда + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + + КодировкаЗначение = РаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла(ЭтотОбъект.Объект.Ссылка); + + СписокКодировок = РаботаСФайламиСлужебный.Кодировки(); + ЭлементСписка = СписокКодировок.НайтиПоЗначению(КодировкаЗначение); + Если ЭлементСписка = Неопределено Тогда + Кодировка = КодировкаЗначение; + Иначе + Кодировка = ЭлементСписка.Представление; + КонецЕсли; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(Кодировка) Тогда + Кодировка = НСтр("ru='По умолчанию'"); + КонецЕсли; + Иначе + Элементы.Кодировка.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ОткрытьВыполнить() + + ВерсияСсылка = ЭтотОбъект.Объект.Ссылка; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Владелец, ВерсияСсылка, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолноеНаименованиеПриИзменении(Элемент) + ЭтотОбъект.Объект.Наименование = ЭтотОбъект.Объект.ПолноеНаименование; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура СохранитьКак(Команда) + + ВерсияСсылка = ЭтотОбъект.Объект.Ссылка; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ЭтотОбъект.Объект.Владелец, ВерсияСсылка, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяЗаписать(Команда) + ОбработатьКомандуЗаписиВерсииФайла(); +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяЗаписатьИЗакрыть(Команда) + + Если ОбработатьКомандуЗаписиВерсииФайла() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяПеречитать(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + Если НЕ Модифицированность Тогда + ПеречитатьДанныеССервера(); + Возврат; + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'Данные изменены. Перечитать данные?'"); + + ОписаниеОповещения = Новый ОписаниеОповещения("СтандартнаяПеречитатьОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура НастроитьОбъектФормы(Знач НовыйОбъект) + + ТипНовогоОбъекта = Новый Массив; + ТипНовогоОбъекта.Добавить(ТипЗнч(НовыйОбъект)); + НовыйРеквизит = Новый РеквизитФормы("Объект", Новый ОписаниеТипов(ТипНовогоОбъекта)); + НовыйРеквизит.СохраняемыеДанные = Истина; + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); + + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + ЗначениеВРеквизитФормы(НовыйОбъект, "Объект"); + Для каждого Элемент Из Элементы Цикл + Если ТипЗнч(Элемент) = Тип("ПолеФормы") + И СтрНачинаетсяС(Элемент.ПутьКДанным, "ОбъектПрототип[0].") + И СтрЗаканчиваетсяНа(Элемент.Имя, "0") Тогда + + ИмяЭлемента = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) -1); + + Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + НовыйЭлемент = Элементы.Вставить(ИмяЭлемента, ТипЗнч(Элемент), Элемент.Родитель, Элемент); + НовыйЭлемент.ПутьКДанным = "Объект." + Сред(Элемент.ПутьКДанным, СтрДлина("ОбъектПрототип[0].") + 1); + + Если Элемент.Вид = ВидПоляФормы.ПолеФлажка Или Элемент.Вид = ВидПоляФормы.ПолеКартинки Тогда + ИсключаемыеСвойства = "Имя, ПутьКДанным"; + Иначе + ИсключаемыеСвойства = "Имя, ПутьКДанным, ВыделенныйТекст, СвязьПоТипу"; + КонецЕсли; + ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, , ИсключаемыеСвойства); + Элемент.Видимость = Ложь; + КонецЕсли; + КонецЦикла; + + Если Не НовыйОбъект.ЭтоНовый() Тогда + ЭтотОбъект.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(НовыйОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ОбработатьКомандуЗаписиВерсииФайла() + + Если ПустаяСтрока(ЭтотОбъект.Объект.ПолноеНаименование) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Для продолжения укажите имя версии файла.'"), , "Наименование", "Объект"); + Возврат Ложь; + КонецЕсли; + + Попытка + РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.ПолноеНаименование); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + Возврат Ложь; + КонецПопытки; + + Если НЕ ЗаписатьВерсиюФайла() Тогда + Возврат Ложь; + КонецЕсли; + + Модифицированность = Ложь; + ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ЭтотОбъект.Объект.Владелец); + Оповестить("Запись_ВерсияФайла", + Новый Структура("ЭтоНовый", Ложь), + ЭтотОбъект.Объект.Ссылка); + + Возврат Истина; + +КонецФункции + +&НаСервере +Функция ЗаписатьВерсиюФайла(Знач ПараметрОбъект = Неопределено) + + Если ПараметрОбъект = Неопределено Тогда + ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); + Иначе + ЗаписываемыйОбъект = ПараметрОбъект; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + ЗаписываемыйОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка записи версии присоединенного файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + КонецПопытки; + + Если ПараметрОбъект = Неопределено Тогда + ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаСервере +Процедура ПеречитатьДанныеССервера() + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяПеречитатьОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ПеречитатьДанныеССервера(); + Модифицированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ЭтоНовый() + + Возврат ЭтотОбъект.Объект.Ссылка.Пустая(); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form similarity index 98% rename from SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form index 2bfb3b85e..f80b66aaf 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form @@ -45,6 +45,10 @@ ФайлыБольшие 4 + + <key>ru</key> + <value>Файлы большие</value> + true true @@ -220,6 +224,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 27 diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Help/ru.html similarity index 73% rename from SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Help/ru.html index de2302736..5d86154e0 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Help/ru.html @@ -1,7 +1,7 @@ -

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

          +

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

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

          -

          Нажмите Продолжить, для того чтобы:

          +

          Нажмите Продолжить импорт, для того чтобы:

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

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

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

          \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Module.bsl similarity index 86% rename from SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Module.bsl index 1a4a35f99..fa6f9fc24 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Module.bsl @@ -10,7 +10,7 @@ ФайлыБольшие = Параметры.ФайлыБольшие; - МаксимальныйРазмерФайла = Цел(ФайловыеФункции.МаксимальныйРазмерФайла() / (1024 * 1024)); + МаксимальныйРазмерФайла = Цел(РаботаСФайлами.МаксимальныйРазмерФайла() / (1024 * 1024)); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Некоторые файлы превышают предельный размер (%1 Мб) и не будут добавлены в хранилище. diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form similarity index 84% rename from SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form index e97e824c3..43f0d156a 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form @@ -62,13 +62,14 @@ Left
          - Form.StandardCommand.Change + Form.Command.ОткрытьСвойстваФайла Normal Auto true true UserCmds Auto + InAdditionalSubmenu
          ФормаГруппаКомандОсновные @@ -197,7 +198,7 @@ Left
          - Form.StandardCommand.Change + Form.Command.ОткрытьСвойстваФайла Normal Auto true @@ -223,13 +224,14 @@ Left
          - Form.StandardCommand.SetDeletionMark + Form.Command.ПометитьНаУдаление Normal Auto true true UserCmds Auto + InAdditionalSubmenu
          ФормаСохранитьКак @@ -287,6 +289,32 @@ ФормаСтандартныеКоманды 68 + + Обновить + 151 + true + true + + true + + + ОбновитьРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + true true @@ -363,6 +391,10 @@ Список 10 + + <key>ru</key> + <value>Список</value> + true true @@ -373,6 +405,7 @@ false None + Change Copy Create Delete @@ -436,6 +469,10 @@ СписокИндексКартинки 25 + + <key>ru</key> + <value>Индекс картинки</value> + true true @@ -495,7 +532,7 @@ true - Список.Description + Список.Наименование СписокНаименованиеРасширеннаяПодсказка @@ -716,7 +753,7 @@ - СписокТекущаяВерсияРазмер + СписокРазмер 39 <key>ru</key> @@ -728,14 +765,14 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ТекущаяВерсияРазмер</segments> + <segments>Список.Размер</segments> </dataPath> <toolTip> <key>ru</key> <value>Размер файла в килобайтах</value> </toolTip> <extendedTooltip> - <name>СписокТекущаяВерсияРазмерРасширеннаяПодсказка</name> + <name>СписокРазмерРасширеннаяПодсказка</name> <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -745,7 +782,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокТекущаяВерсияРазмерКонтекстноеМеню</name> + <name>СписокРазмерКонтекстноеМеню</name> <id>40</id> <autoFill>true</autoFill> </contextMenu> @@ -774,7 +811,7 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>СписокТекущаяВерсияРасширение</name> + <name>СписокРасширение</name> <id>72</id> <title> <key>ru</key> @@ -784,10 +821,10 @@ <enabled>true</enabled> <userVisible/> <dataPath xsi:type="form:DataPath"> - <segments>Список.ТекущаяВерсияРасширение</segments> + <segments>Список.Расширение</segments> </dataPath> <extendedTooltip> - <name>СписокТекущаяВерсияРасширениеРасширеннаяПодсказка</name> + <name>СписокРасширениеРасширеннаяПодсказка</name> <id>109</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -797,7 +834,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокТекущаяВерсияРасширениеКонтекстноеМеню</name> + <name>СписокРасширениеКонтекстноеМеню</name> <id>73</id> <autoFill>true</autoFill> </contextMenu> @@ -836,6 +873,7 @@ <autoFill>true</autoFill> </contextMenu> <type>InputField</type> + <horizontalAlign>Center</horizontalAlign> <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerHorizontalAlign>Left</headerHorizontalAlign> @@ -849,163 +887,6 @@ <textSize>Normal</textSize> </extInfo> </items> - <items xsi:type="form:FormField"> - <name>СписокТекущаяВерсияНомерВерсии</name> - <id>78</id> - <title> - <key>ru</key> - <value>Версия</value> - - true - true - - - Список.ТекущаяВерсияНомерВерсии - - - СписокТекущаяВерсияНомерВерсииРасширеннаяПодсказка - 113 - Label - true - true - - Left - - - - СписокТекущаяВерсияНомерВерсииКонтекстноеМеню - 79 - true - - LabelField - Enter - true - Left - true - - 7 - true - true - - - - СписокТекущаяВерсияАвтор - 35 - - <key>ru</key> - <value>Отредактировал</value> - - true - true - - - Список.ТекущаяВерсияАвтор - - - СписокТекущаяВерсияАвторРасширеннаяПодсказка - 114 - 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 - - - Список.ТекущаяВерсияТом - - - СписокТекущаяВерсияТомРасширеннаяПодсказка - 115 - Label - true - true - - Left - - - - СписокТекущаяВерсияТомКонтекстноеМеню - 75 - true - - LabelField - Enter - true - Left - true - - true - true - - - - СписокТекущаяВерсияПутьКФайлу - 76 - - <key>ru</key> - <value>Путь к файлу на томе</value> - - true - true - - - Список.ТекущаяВерсияПутьКФайлу - - - СписокТекущаяВерсияПутьКФайлуРасширеннаяПодсказка - 116 - Label - true - true - - Left - - - - СписокТекущаяВерсияПутьКФайлуКонтекстноеМеню - 77 - true - - LabelField - Enter - true - Left - true - - true - true - - СписокСсылка 84 @@ -1013,7 +894,7 @@ true - Список.Ref + Список.Ссылка СписокСсылкаРасширеннаяПодсказка @@ -1046,7 +927,6 @@ СписокКоманднаяПанель 12 Left - true Selection @@ -1056,10 +936,18 @@ BeforeAddRow СписокПередНачаломДобавления + + BeforeDeleteRow + СписокПередУдалением + OnActivateRow СписокПриАктивизацииСтроки + + BeforeRowChange + СписокПередНачаломИзменения + СписокСтрокаПоиска 142 @@ -1166,7 +1054,7 @@ Left - Form.Item.Список.StandardCommand.Change + 0 Normal Auto true @@ -1231,6 +1119,32 @@ UserCmds Auto + + СписокОткрытьСвойстваФайла + 153 + true + true + + true + + + СписокОткрытьСвойстваФайлаРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Form.Command.ОткрытьСвойстваФайла + Normal + Auto + true + true + UserCmds + Auto + true true @@ -1240,10 +1154,6 @@ ru Список контекстное меню группа команд основные - - ru - Список контекстное меню группа команд основные - СписокКонтекстноеМенюГруппаКомандОсновныеРасширеннаяПодсказка 135 @@ -1277,7 +1187,7 @@ Left - Form.Item.Список.StandardCommand.SetDeletionMark + Form.Command.ПометитьНаУдаление Normal Auto true @@ -1362,7 +1272,6 @@ HierarchicalList true - true true 10 true @@ -1408,12 +1317,13 @@ OnCreateAtServer ПриСозданииНаСервере + Change Copy Create + Delete Refresh DontBlock true - true Vertical true true @@ -1432,12 +1342,6 @@ true - - Список.Ref - - - Список.ПодписанЭП - Список.Редактирует @@ -1445,7 +1349,7 @@ Список.РедактируетТекущийПользователь - Список.ТекущаяВерсияРасширение + Список.Ссылка Список.ХранитьВерсии @@ -1453,48 +1357,33 @@
          true
          ВЫБРАТЬ - Файлы.Код, - Файлы.Редактирует, - Файлы.ДатаСоздания, - Файлы.ТекущаяВерсияРазмер / 1024 КАК ТекущаяВерсияРазмер, - Файлы.Автор, - Файлы.ТекущаяВерсияДатаСоздания, + СведенияОФайлах.Редактирует КАК Редактирует, + СведенияОФайлах.Размер / 1024 КАК Размер, + СведенияОФайлах.Автор КАК Автор, + СведенияОФайлах.ДатаСоздания КАК ДатаСоздания, ВЫБОР - КОГДА Файлы.ПометкаУдаления = ИСТИНА - ТОГДА Файлы.ИндексКартинки + 1 - ИНАЧЕ Файлы.ИндексКартинки + КОГДА СведенияОФайлах.ПометкаУдаления + ТОГДА СведенияОФайлах.ИндексКартинки + 1 + ИНАЧЕ СведенияОФайлах.ИндексКартинки КОНЕЦ КАК ИндексКартинки, - Файлы.Наименование, - Файлы.Описание, - Файлы.Ссылка, - Файлы.ТекущаяВерсияАвтор, - Файлы.ПометкаУдаления, - Файлы.ХранитьВерсии, + СведенияОФайлах.Наименование КАК Наименование, + СведенияОФайлах.Описание КАК Описание, + СведенияОФайлах.Файл КАК Ссылка, + СведенияОФайлах.ПометкаУдаления КАК ПометкаУдаления, ВЫБОР - КОГДА Файлы.Редактирует = &ТекущийПользователь + КОГДА СведенияОФайлах.Редактирует = &ТекущийПользователь ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК РедактируетТекущийПользователь, - Файлы.ВладелецФайла, - Файлы.ТекущаяВерсияРасширение, - Файлы.ТекущаяВерсияНомерВерсии, - Файлы.ТекущаяВерсияТом, - Файлы.ТекущаяВерсияПутьКФайлу, - Файлы.ПодписанЭП, - Файлы.Зашифрован, - ВЫБОР - КОГДА Файлы.ПодписанЭП - И Файлы.Зашифрован - ТОГДА 2 - КОГДА Файлы.Зашифрован - ТОГДА 1 - КОГДА Файлы.ПодписанЭП - ТОГДА 0 - ИНАЧЕ -1 - КОНЕЦ КАК НомерКартинкиПодписанЗашифрован + СведенияОФайлах.ВладелецФайла КАК ВладелецФайла, + СведенияОФайлах.Расширение КАК Расширение, + СведенияОФайлах.ХранитьВерсии КАК ХранитьВерсии, + СведенияОФайлах.НомерКартинкиПодписанЗашифрован КАК НомерКартинкиПодписанЗашифрован ИЗ - Справочник.Файлы КАК Файлы - Catalog.Файлы + РегистрСведений.СведенияОФайлах КАК СведенияОФайлах +ГДЕ + НЕ СведенияОФайлах.Файл.Ссылка ЕСТЬ NULL + InformationRegister.СведенияОФайлах true true true @@ -1502,26 +1391,6 @@ true - - ЗапрещенныеРасширения - - <key>ru</key> - <value>Запрещенные расширения</value> - - 2 - - ValueList - - - true - - - true - - - - - Просмотреть @@ -1626,6 +1495,53 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОткрытьСвойстваФайла</name> + <title> + <key>ru</key> + <value>Открыть свойства файла</value> + + 5 + + ru + Открыть свойства файла + + + true + + F2 + + StdPicture.Change + + + + ОткрытьСвойстваФайла + + + DontUse + Auto + + + ПометитьНаУдаление + + <key>ru</key> + <value>Пометить на удаление / Снять пометку</value> + + 6 + + true + + + StdPicture.MarkToDelete + + + + УстановитьПометкуУдаления + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Help/ru.html similarity index 89% rename from SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Help/ru.html index 4defe34a3..6ecc2621c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Help/ru.html @@ -3,7 +3,7 @@

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

          •  - наличие электронной подписи и шифрования;
          • Наименование - полное наименование и описание файла. Значок рядом с наименованием указывает тип файла; -
          • Размещение - папка списка файлов или объект программы, к которому присоединен файл; +
          • Размещение - папка списка файлов или объект программы, к которому присоединен файл;
          • Автор - пользователь, который добавил файл;
          • Дата создания - время и дата добавления файла в базу;
          • Размер (Кб) - размер файла; @@ -20,9 +20,7 @@
          • Открыть карточку файла можно с помощью соответствующей команды меню Еще; 
          • -
            Сохранить файл в указанный каталог на жестком или сетевом диске можно с помощью команды Еще - Сохранить как;
            -
          • -
            Удалить файл окончательно можно с помощью команды Еще - Удалить (Shift + Del).

          См. также:

          +
          Сохранить файл в указанный каталог на жестком или сетевом диске можно с помощью команды Еще - Сохранить как.

        См. также:

        • diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl similarity index 63% rename from SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl index 9c139858c..6fa0c14a5 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl @@ -15,13 +15,12 @@ ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.ФормаИзменить.Видимость = Ложь; Элементы.ФормаИзменить82.Видимость = Истина; КонецЕсли; - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); - + НавигационнаяСсылка = "e1cib/app/" + ЭтотОбъект.ИмяФормы; КонецПроцедуры &НаКлиенте @@ -39,7 +38,10 @@ Элементы.Список.Обновить(); КонецЕсли; - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда + Если ИмяСобытия = "Запись_Файл" + И Параметр.Свойство("Событие") + И Параметр.Событие = "СозданФайл" Тогда + Элементы.Список.Обновить(); Если Параметр <> Неопределено И Параметр.Файл <> Неопределено Тогда Элементы.Список.ТекущаяСтрока = Параметр.Файл; @@ -63,17 +65,7 @@ Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.ТекущаяВерсияРасширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.ТекущаяВерсияРасширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры @@ -99,17 +91,8 @@ Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.ТекущаяВерсияРасширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.ТекущаяВерсияРасширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла); КонецПроцедуры @@ -120,7 +103,7 @@ Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Элементы.Список.ТекущиеДанные.Ссылка, , УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры @@ -134,11 +117,12 @@ Обработчик = Новый ОписаниеОповещения("ОсвободитьЗавершение", ЭтотОбъект); ТекущиеДанные = Элементы.Список.ТекущиеДанные; - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, Элементы.Список.ТекущаяСтрока); + ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, Элементы.Список.ТекущиеДанные.Ссылка); ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = ТекущиеДанные.РедактируетТекущийПользователь; + ПараметрыОсвобожденияФайла.ФайлРедактируетТекущийПользователь = ТекущиеДанные.РедактируетТекущийПользователь; ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); + Элементы.Список.Обновить(); КонецПроцедуры @@ -150,32 +134,39 @@ КонецПроцедуры +&НаКлиенте +Процедура ОткрытьСвойстваФайла(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ТекущиеДанные.Ссылка); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПометкуУдаления(Команда) + УстановитьСнятьПометкуУдаления(Элементы.Список.ВыделенныеСтроки); + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередУдалением(Элемент, Отказ) + Отказ = Истина; + УстановитьСнятьПометкуУдаления(Элементы.Список.ВыделенныеСтроки); + Элементы.Список.Обновить(); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВыбратьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Процедура ОсвободитьЗавершение(Результат, ПараметрыВыполнения) Экспорт УстановитьДоступностьФайловыхКоманд(); @@ -185,13 +176,13 @@ &НаКлиенте Функция ФайловыеКомандыДоступны() - Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Если Элементы.Список.ТекущиеДанные = Неопределено Тогда Возврат Ложь; КонецЕсли; - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Если ТипЗнч(Элементы.Список.ТекущиеДанные.Ссылка) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат Ложь; - КонецЕсли; + КонецЕсли; Возврат Истина; @@ -202,7 +193,7 @@ Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Если ТипЗнч(Элементы.Список.ТекущиеДанные.Ссылка) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда УстановитьДоступностьКоманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, Элементы.Список.ТекущиеДанные.Редактирует); @@ -211,6 +202,18 @@ КонецПроцедуры +&НаСервереБезКонтекста +Процедура УстановитьСнятьПометкуУдаления(Знач ВыделенныеСтроки) + + Если ТипЗнч(ВыделенныеСтроки) = Тип("Массив") Тогда + Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Файл = ВыделеннаяСтрока.Файл.ПолучитьОбъект(); + Файл.УстановитьПометкуУдаления(НЕ Файл.ПометкаУдаления); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует) @@ -229,7 +232,25 @@ &НаСервере Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект,, Истина); + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект,, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ТекущиеДанные.Ссылка); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form similarity index 99% rename from SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form index 9a7aac145..1ccc8c0a1 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form @@ -3,6 +3,10 @@ СписокКодировок 1 + + <key>ru</key> + <value>Список кодировок</value> + true true diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Help/ru.html similarity index 77% rename from SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Help/ru.html index dd9debe40..6a6fd01fd 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Help/ru.html @@ -24,8 +24,8 @@ UL {

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

          -

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

          -

          Также можно Изменить кодировку уже существующего файла во встроенном текстовом редакторе программы по соответствующей команде меню Еще.

          +

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

          +

          Также можно Изменить кодировку уже существующего файла во встроенном текстовом редакторе программы по соответствующей команде меню Еще.

          Выбор кодировки текстового файла

          • Выберите кодировку из списка;
          • Если нужная кодировка отсутствует, снимите флажок Показывать только основные кодировки; diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Module.bsl similarity index 99% rename from SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Module.bsl index 970316ee5..28006313e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Module.bsl @@ -3,6 +3,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Form.form similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Form.form diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html similarity index 57% rename from SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html index caa3c97e0..5e5ae9866 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html @@ -1,8 +1,7 @@ -

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

            +

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

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

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

            -

             

            -

            См. также:

            -
            -

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

            \ No newline at end of file +

            См. также:

            + \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Form.form similarity index 100% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Form.form diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Help/ru.html diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Module.bsl similarity index 90% rename from SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Module.bsl index 3dd4dafe4..91488ce4b 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборСпособаСравненияВерсий/Module.bsl @@ -17,8 +17,7 @@ Элемент.Вставить("Значение", СпособСравненияВерсийФайлов); МассивСтруктур.Добавить(Элемент); - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения( - МассивСтруктур); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); РезультатВыбора = КодВозвратаДиалога.ОК; ОповеститьОВыборе(РезультатВыбора); diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form new file mode 100644 index 000000000..fef1527db --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form @@ -0,0 +1,927 @@ + + + + ГруппаОбщиеДанные + 11 + + Наименование0 + 5 + true + true + + true + + + ОбъектПрототип[0].Наименование + + + Наименование0РасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + Наименование0КонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Описание0 + 8 + true + true + + true + + + ОбъектПрототип[0].Описание + + Left + + Описание0РасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + Описание0КонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + 2 + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Общие данные</value> + + + ГруппаОбщиеДанныеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСоздана + 43 + + ДатаСоздания0 + 45 + + <key>ru</key> + <value>Создана</value> + + true + true + + true + + + ОбъектПрототип[0].ДатаСоздания + + + ДатаСоздания0РасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ДатаСоздания0КонтекстноеМеню + 46 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СтатусСоздана + 37 + true + true + + true + + + СтатусСоздана + + None + + СтатусСозданаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СтатусСозданаКонтекстноеМеню + 38 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Создана</value> + + + ГруппаСозданаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИзменена + 48 + + ДатаМодификацииУниверсальная0 + 50 + + <key>ru</key> + <value>Изменена</value> + + true + true + + true + + + ОбъектПрототип[0].ДатаМодификацииУниверсальная + + + ДатаМодификацииУниверсальная0РасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ДатаМодификацииУниверсальная0КонтекстноеМеню + 51 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СтатусИзменена + 40 + true + true + + true + + + СтатусИзменена + + None + + СтатусИзмененаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СтатусИзмененаКонтекстноеМеню + 41 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Изменена</value> + + + ГруппаИзмененаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаСтандартнаяЗаписатьИЗакрыть + 3 + true + true + + true + + + ФормаСтандартнаяЗаписатьИЗакрытьРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Form.Command.СтандартнаяЗаписатьИЗакрыть + true + true + true + UserCmds + Auto + + + ФормаСтандартнаяЗаписать + 1 + true + true + + true + + + ФормаСтандартнаяЗаписатьРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Form.Command.СтандартнаяЗаписать + Normal + true + true + UserCmds + Auto + + + ФормаСтандартнаяПеречитать + 19 + true + true + + true + + + ФормаСтандартнаяПеречитатьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.СтандартнаяПеречитать + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаСтандартнаяПоказатьВСписке + 21 + true + true + + true + + + ФормаСтандартнаяПоказатьВСпискеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Command.СтандартнаяПоказатьВСписке + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаСтандартнаяСкопировать + 23 + true + true + + true + + + ФормаСтандартнаяСкопироватьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.СтандартнаяСкопировать + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаСтандартнаяУстановитьПометкуУдаления + 25 + true + true + + true + + + ФормаСтандартнаяУстановитьПометкуУдаленияРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.СтандартнаяУстановитьПометкуУдаления + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + Vertical + true + true + true + auto + true + + ОбъектПрототип + + <key>ru</key> + <value>Объект прототип</value> + + 2 + + ValueTable + + + 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> + + 3 + + CatalogRef.Пользователи + + + true + + + true + + + + Изменил + 4 + + CatalogRef.Пользователи + + + true + + + true + + + + ВладелецФайла + + <key>ru</key> + <value>Владелец файла</value> + + 8 + + AnyRef + + + 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> + + 1 + + Boolean + + + true + + + true + + + + ИмяСправочника + + <key>ru</key> + <value>Имя справочника</value> + + 3 + + String + + + + true + + + true + + + + СтатусСоздана + + <key>ru</key> + <value>Статус создана</value> + + 4 + + FormattedString + + + true + + + true + + + + СтатусИзменена + + <key>ru</key> + <value>Статус изменена</value> + + 5 + + FormattedString + + + true + + + true + + + + СтандартнаяЗаписать + + <key>ru</key> + <value>Записать</value> + + 1 + + ru + Записать группу файлов + + + true + + Ctrl+S + + StdPicture.Write + + + + СтандартнаяЗаписать + + + DontUse + Auto + + + СтандартнаяЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 2 + + ru + Записать объект и закрыть форму + + + true + + + StdPicture.WriteAndClose + + + + СтандартнаяЗаписатьИЗакрыть + + + DontUse + Auto + + + СтандартнаяПеречитать + + <key>ru</key> + <value>Перечитать</value> + + 3 + + ru + Стандартная перечитать + + + true + + + StdPicture.Reread + + + + СтандартнаяПеречитать + + + DontUse + Auto + + + СтандартнаяСкопировать + + <key>ru</key> + <value>Скопировать</value> + + 4 + + ru + Стандартная скопировать + + + true + + + StdPicture.CloneObject + + + + СтандартнаяСкопировать + + + DontUse + Auto + + + СтандартнаяУстановитьПометкуУдаления + + <key>ru</key> + <value>Пометить на удаление / Снять пометку</value> + + 5 + + ru + Стандартная установить пометку удаления + + + true + + + StdPicture.MarkToDelete + + DontUse + Auto + + + СтандартнаяПоказатьВСписке + + <key>ru</key> + <value>Показать в списке</value> + + 6 + + ru + Стандартная показать в списке + + + true + + + StdPicture.ShowInList + + + + СтандартнаяПоказатьВСписке + + + DontUse + Auto + + + ПрисоединенныйФайл + + AnyRef + + true + + + ЭтоНоваяГруппа + + Boolean + + + + Ключ + + AnyRef + + true + + + ЗначениеКопирования + + AnyRef + + true + + + Родитель + + AnyRef + + + + ИмяСправочникаХранилищаФайлов + + String + + + + + ВладелецФайла + + AnyRef + + + + + + + diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl new file mode 100644 index 000000000..97a8deed9 --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl @@ -0,0 +1,302 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ЭтоНоваяГруппа = Параметры.ЭтоНоваяГруппа; + + Если ЭтоНоваяГруппа Тогда + ОбъектЗначение = Справочники[Параметры.ИмяСправочникаХранилищаФайлов].СоздатьГруппу(); + ОбъектЗначение.Родитель = Параметры.Родитель; + ОбъектЗначение.ВладелецФайла = Параметры.ВладелецФайла; + ОбъектЗначение.ДатаСоздания = ТекущаяУниверсальнаяДата(); + ОбъектЗначение.Автор = Пользователи.АвторизованныйПользователь(); + ИначеЕсли ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + КопируемыйОбъект = Параметры.ЗначениеКопирования.ПолучитьОбъект(); + ЗначениеКопирования = Параметры.ЗначениеКопирования; + + ОбъектЗначение = Справочники[КопируемыйОбъект.Метаданные().Имя].СоздатьГруппу(); + ОбъектЗначение.Родитель = Параметры.Родитель; + ЗаполнитьЗначенияСвойств(ОбъектЗначение, КопируемыйОбъект, + "ВладелецФайла, ДатаСоздания, Описание, Наименование, ДатаМодификацииУниверсальная, Изменил"); + ОбъектЗначение.Автор = Пользователи.АвторизованныйПользователь(); + Иначе + Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда + ОбъектЗначение = Параметры.ПрисоединенныйФайл.ПолучитьОбъект(); + Иначе + ОбъектЗначение = Параметры.Ключ.ПолучитьОбъект(); + КонецЕсли; + КонецЕсли; + ОбъектЗначение.Заполнить(Неопределено); + + ИмяСправочника = ОбъектЗначение.Метаданные().Имя; + + НастроитьОбъектФормы(ОбъектЗначение); + + Если ТолькоПросмотр + ИЛИ НЕ ПравоДоступа("Изменение", ЭтотОбъект.Объект.ВладелецФайла.Метаданные()) Тогда + Элементы.ФормаСтандартнаяЗаписать.Доступность = Ложь; + Элементы.ФормаСтандартнаяЗаписатьИЗакрыть.Доступность = Ложь; + Элементы.ФормаСтандартнаяУстановитьПометкуУдаления.Доступность = Ложь; + КонецЕсли; + + Если НЕ ТолькоПросмотр + И НЕ ЭтотОбъект.Объект.Ссылка.Пустая() Тогда + ЗаблокироватьДанныеДляРедактирования(ЭтотОбъект.Объект.Ссылка, , УникальныйИдентификатор); + КонецЕсли; + + ОбновитьЗаголовок(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура СтандартнаяЗаписать(Команда) + ОбработатьКомандуЗаписиФайла(); +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяЗаписатьИЗакрыть(Команда) + + Если ОбработатьКомандуЗаписиФайла() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяПеречитать(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + Если НЕ Модифицированность Тогда + ПеречитатьДанныеССервера(); + Возврат; + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'Данные изменены. Перечитать данные?'"); + + ОписаниеОповещения = Новый ОписаниеОповещения("СтандартнаяПеречитатьОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяСкопировать(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура("ЗначениеКопирования", ЭтотОбъект.Объект.Ссылка); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяПоказатьВСписке(Команда) + + СтандартныеПодсистемыКлиент.ПоказатьВСписке(ЭтотОбъект["Объект"].Ссылка, Неопределено); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура НастроитьОбъектФормы(Знач НовыйОбъект) + + ТипНовогоОбъекта = Новый Массив; + ТипНовогоОбъекта.Добавить(ТипЗнч(НовыйОбъект)); + + НовыйРеквизит = Новый РеквизитФормы("Объект", Новый ОписаниеТипов(ТипНовогоОбъекта)); + НовыйРеквизит.СохраняемыеДанные = Истина; + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); + + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + ЗначениеВРеквизитФормы(НовыйОбъект, "Объект"); + + Для каждого Элемент Из Элементы Цикл + Если ТипЗнч(Элемент) = Тип("ПолеФормы") + И СтрНачинаетсяС(Элемент.ПутьКДанным, "ОбъектПрототип[0].") + И СтрЗаканчиваетсяНа(Элемент.Имя, "0") Тогда + + ИмяЭлемента = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) -1); + Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + НовыйЭлемент = Элементы.Вставить(ИмяЭлемента, ТипЗнч(Элемент), Элемент.Родитель, Элемент); + НовыйЭлемент.ПутьКДанным = "Объект." + Сред(Элемент.ПутьКДанным, СтрДлина("ОбъектПрототип[0].") + 1); + + Если Элемент.Вид = ВидПоляФормы.ПолеНадписи Тогда + ИсключаемыеСвойства = "Имя, ПутьКДанным"; + Иначе + ИсключаемыеСвойства = "Имя, ПутьКДанным, ВыделенныйТекст, СвязьПоТипу"; + КонецЕсли; + ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, , ИсключаемыеСвойства); + + Элемент.Видимость = Ложь; + КонецЕсли; + КонецЦикла; + + ЧастиСтроки = Новый Массив; + ЧастиСтроки.Добавить(Новый ФорматированнаяСтрока( + Строка(ЭтотОбъект["Объект"].Автор), + , + , + , + ПолучитьНавигационнуюСсылку(ЭтотОбъект["Объект"].Автор))); + + СтатусСоздана = Новый ФорматированнаяСтрока(ЧастиСтроки); + + ОбновитьИнформациюОбИзменении(); + + Если Параметры.Свойство("Родитель") Тогда + НовыйОбъект.Родитель = Параметры.Родитель; + КонецЕсли; + + Если Не НовыйОбъект.ЭтоНовый() Тогда + НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(НовыйОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьЗаголовок() + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (Группа файлов)'"), Строка(ЭтотОбъект.Объект.Ссылка)); + Иначе + Заголовок = НСтр("ru = 'Группа файлов (Создание)'") + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ОбработатьКомандуЗаписиФайла() + + Если ПустаяСтрока(ЭтотОбъект.Объект.Наименование) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Для продолжения укажите имя файла.'"), , "Наименование", "Объект"); + Возврат Ложь; + КонецЕсли; + + Попытка + РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + Возврат Ложь; + КонецПопытки; + + Если НЕ ЗаписатьФайл() Тогда + Возврат Ложь; + КонецЕсли; + + Модифицированность = Ложь; + ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + + Оповестить("Запись_Файл", + Новый Структура("ЭтоНовый", ФайлБылСоздан), + ЭтотОбъект.Объект.Ссылка); + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Функция ЭтоНовый() + + Возврат ЭтотОбъект.Объект.Ссылка.Пустая(); + +КонецФункции + +&НаСервере +Функция ЗаписатьФайл(Знач ПараметрОбъект = Неопределено) + + Если ПараметрОбъект = Неопределено Тогда + ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); + Иначе + ЗаписываемыйОбъект = ПараметрОбъект; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + ЗаписываемыйОбъект.Изменил = Пользователи.АвторизованныйПользователь(); + ЗаписываемыйОбъект.ДатаМодификацииУниверсальная = ТекущаяУниверсальнаяДата(); + ЗаписываемыйОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка записи группы присоединенных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); + ВызватьИсключение; + КонецПопытки; + + Если ПараметрОбъект = Неопределено Тогда + ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); + КонецЕсли; + + ЗначениеКопирования = Справочники[ИмяСправочника].ПустаяСсылка(); + + ОбновитьЗаголовок(); + ОбновитьИнформациюОбИзменении(); + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура СтандартнаяПеречитатьОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ПеречитатьДанныеССервера(); + Модифицированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПеречитатьДанныеССервера() + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + + ОбновитьИнформациюОбИзменении(); + +КонецПроцедуры + +Процедура ОбновитьИнформациюОбИзменении() + + ЧастиСтроки = Новый Массив; + ЧастиСтроки.Добавить(Новый ФорматированнаяСтрока( + Строка(ЭтотОбъект["Объект"].Изменил), + , + , + , + ПолучитьНавигационнуюСсылку(ЭтотОбъект["Объект"].Изменил))); + + СтатусИзменена = Новый ФорматированнаяСтрока(ЧастиСтроки); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form similarity index 82% rename from SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form index 39746fd5e..86ce3d8f8 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form @@ -122,9 +122,8 @@ 261 <key>ru</key> - <value>Добавить</value> + <value>Добавить файл с диска...</value> - true true true @@ -155,7 +154,7 @@ 1 <key>ru</key> - <value>Из файла на диске ...</value> + <value>Файл с диска...</value> true true @@ -179,6 +178,32 @@ UserCmds Auto + + ДобавитьФайлПоШаблону + 328 + true + true + + true + + + ДобавитьФайлПоШаблонуРасширеннаяПодсказка + 329 + Label + true + true + + Left + + + Form.Command.ДобавитьФайлПоШаблону + Normal + Auto + true + true + UserCmds + Auto + ДобавитьФайлСоСканера 259 @@ -214,10 +239,6 @@ ru Добавить - - ru - Подменю добавить - ПодменюДобавитьРасширеннаяПодсказка 258 @@ -237,6 +258,32 @@ Normal + + СоздатьГруппу + 298 + true + true + + true + + + СоздатьГруппуРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + Form.Command.СоздатьГруппу + Normal + Auto + true + true + UserCmds + Auto + ФормаИзменить 102 @@ -292,6 +339,33 @@ UserCmds Auto + + Занять + 332 + true + true + + true + + + ЗанятьРасширеннаяПодсказка + 333 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ФормаРедактировать 34 @@ -317,6 +391,86 @@ UserCmds Auto + + ПодменюПечать + 334 + + Печать + 265 + true + true + + true + + + ПечатьРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + Form.Command.Печать + Normal + Auto + true + true + UserCmds + Auto + + + ПечатьСоШтампом + 336 + true + true + + true + + + ПечатьСоШтампомРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + Form.Command.ПечатьСоШтампом + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Печать</value> + + + ПодменюПечатьРасширеннаяПодсказка + 335 + Label + true + true + + Left + + + Popup + + Auto + Normal + + ФормаЗакончитьРедактирование 43 @@ -343,32 +497,6 @@ UserCmds Auto - - Печать - 265 - true - true - - true - - - ПечатьРасширеннаяПодсказка - 266 - Label - true - true - - Left - - - Form.Command.Печать - Normal - Auto - true - true - UserCmds - Auto - Отправить 263 @@ -427,10 +555,6 @@ ru Форма глобальные команды - - ru - Форма глобальные команды - None ФормаГлобальныеКомандыРасширеннаяПодсказка @@ -636,10 +760,6 @@ ru Электронная подпись и шифрование - - ru - Электронная подпись и шифрование - ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка 110 @@ -768,6 +888,142 @@ Auto InAdditionalSubmenu + + ГруппаРежимПросмотра + 311 + + РежимПросмотраСписок + 313 + true + true + + true + + + РежимПросмотраСписокРасширеннаяПодсказка + 314 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.List + Normal + Auto + true + true + UserCmds + Auto + + + ИерархическийСписок + 315 + true + true + + true + + + ИерархическийСписокРасширеннаяПодсказка + 316 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.HierarchicalList + Normal + Auto + true + true + UserCmds + Auto + + + Дерево + 317 + true + true + + true + + + ДеревоРасширеннаяПодсказка + 318 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Tree + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Режим просмотра</value> + + + ГруппаРежимПросмотраРасширеннаяПодсказка + 312 + Label + true + true + + Left + + + Popup + + + StdPicture.ListViewMode + + Auto + Normal + + + + ПеренестиЭлемент + 305 + true + true + + true + + + ПеренестиЭлементРасширеннаяПодсказка + 306 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.MoveItem + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ФормаОсвободить 49 @@ -936,10 +1192,6 @@ ru Форма группа команд поиска - - ru - Форма группа команд поиска - ФормаГруппаКомандПоискаРасширеннаяПодсказка 124 @@ -952,6 +1204,33 @@ + + ЗагрузитьФайлы + 300 + true + true + + true + + + ЗагрузитьФайлыРасширеннаяПодсказка + 301 + Label + true + true + + Left + + + Form.Command.ЗагрузитьФайлы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + Предпросмотр 272 @@ -1152,10 +1431,6 @@ ru Форма группа настройка списка - - ru - Форма группа настройка списка - ФормаГруппаНастройкаСпискаРасширеннаяПодсказка 237 @@ -1272,6 +1547,87 @@ UserCmds Auto + + СохранитьПапку + 319 + true + true + + true + + + СохранитьПапкуРасширеннаяПодсказка + 320 + Label + true + true + + Left + + + Form.Command.СохранитьПапку + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗагрузитьПапку + 321 + true + true + + true + + + ЗагрузитьПапкуРасширеннаяПодсказка + 322 + Label + true + true + + Left + + + Form.Command.ЗагрузитьПапку + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СравнитьФайлы + 323 + true + true + + true + + + СравнитьФайлыРасширеннаяПодсказка + 324 + Label + true + true + + Left + + + Form.Command.СравнитьФайлы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true @@ -1297,7 +1653,7 @@ - Группа1 + ГруппаОблачныйСервис 285 ГруппаПояснениеОблачногоСервиса @@ -1379,7 +1735,7 @@ <key>ru</key> - <value>Группа пояснение облачного сервиса</value> + <value>Пояснение облачного сервиса</value> true @@ -1408,6 +1764,10 @@ Список 6 + + <key>ru</key> + <value>Список</value> + true true @@ -1437,6 +1797,10 @@ СписокНомерКартинкиПодписанЗашифрован 206 + + <key>ru</key> + <value>Номер картинки</value> + true true @@ -1596,10 +1960,6 @@ ru Список группа имя описание - - ru - Список группа имя описание - None СписокГруппаИмяОписаниеРасширеннаяПодсказка @@ -1621,53 +1981,6 @@ СписокВажныеРеквизиты 214 - - СписокАвтор - 182 - - <key>ru</key> - <value>Автор</value> - - true - true - - true - - - Список.Автор - - - ru - Пользователь, который добавил файл в список - - - СписокАвторРасширеннаяПодсказка - 184 - Label - true - true - - Left - - - - СписокАвторКонтекстноеМеню - 183 - true - - LabelField - true - Enter - true - Left - true - - 15 - true - true - false - - СписокДатаИзменения 100 @@ -1715,6 +2028,51 @@ false + + СписокОтредактировал + 191 + + <key>ru</key> + <value>Изменил</value> + + true + true + + true + + + Список.Отредактировал + + + ru + Последний пользователь, который отредактировал файл + + + СписокОтредактировалРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + СписокОтредактировалКонтекстноеМеню + 192 + true + + LabelField + true + Enter + true + Left + true + + true + true + + true true @@ -1724,10 +2082,6 @@ ru Список важные реквизиты - - ru - Список важные реквизиты - None СписокВажныеРеквизитыРасширеннаяПодсказка @@ -1754,7 +2108,9 @@ true true - + + true + Список.Размер @@ -1796,6 +2152,10 @@ СписокРедактирует 199 + + <key>ru</key> + <value>Редактирует</value> + true true @@ -1878,21 +2238,25 @@ - СписокОтредактировал - 191 + СписокАвтор + 182 + + <key>ru</key> + <value>Автор</value> + true true - Список.Отредактировал + Список.Автор ru - Последний пользователь, который отредактировал файл + Пользователь, который добавил файл в список - СписокОтредактировалРасширеннаяПодсказка - 193 + СписокАвторРасширеннаяПодсказка + 184 Label true true @@ -1901,8 +2265,8 @@ - СписокОтредактировалКонтекстноеМеню - 192 + СписокАвторКонтекстноеМеню + 183 true LabelField @@ -1912,13 +2276,19 @@ Left true + 15 true true + false СписокСсылка 165 + + <key>ru</key> + <value>Ссылка</value> + true true @@ -1982,6 +2352,10 @@ BeforeRowChange СписокПередНачаломИзменения + + OnChange + СписокПриИзменении + СписокСтрокаПоиска 248 @@ -2069,7 +2443,6 @@ СписокКонтекстноеМенюДобавить 54 - true true true @@ -2125,6 +2498,32 @@ UserCmds Auto + + СписокКонтекстноеМенюДобавитьФайлПоШаблону + 330 + true + true + + true + + + СписокКонтекстноеМенюДобавитьФайлПоШаблонуРасширеннаяПодсказка + 331 + Label + true + true + + Left + + + Form.Command.ДобавитьФайлПоШаблону + Normal + Auto + true + true + UserCmds + Auto + СписокКонтекстноеМенюДобавитьФайлСоСканера 278 @@ -2151,6 +2550,32 @@ UserCmds Auto + + СписокКонтекстноеМенюСоздатьГруппу + 309 + true + true + + true + + + СписокКонтекстноеМенюСоздатьГруппуРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + Form.Command.СоздатьГруппу + Normal + Auto + true + true + UserCmds + Auto + true true @@ -2160,10 +2585,6 @@ ru Добавить - - ru - Список контекстное меню группа команд добавить - СписокКонтекстноеМенюГруппаКомандДобавитьРасширеннаяПодсказка 275 @@ -2299,10 +2720,6 @@ ru Список контекстное меню группа команд основные - - ru - Список контекстное меню группа команд основные - СписокКонтекстноеМенюГруппаКомандОсновныеРасширеннаяПодсказка 133 @@ -2484,10 +2901,6 @@ ru Список контекстное меню группа команд шифрование - - ru - Список контекстное меню группа команд шифрование - СписокКонтекстноеМенюГруппаКомандШифрованиеРасширеннаяПодсказка 153 @@ -2509,10 +2922,6 @@ ru Электронная подпись и шифрование - - ru - Электронная подпись и шифрование - СписокКонтекстноеМенюГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка 149 @@ -2613,6 +3022,32 @@ UserCmds Auto + + СписокКонтекстноеМенюПеренестиЭлемент + 307 + true + true + + true + + + СписокКонтекстноеМенюПеренестиЭлементРасширеннаяПодсказка + 308 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.MoveItem + Normal + Auto + true + true + UserCmds + Auto + СписокКонтекстноеМенюОсвободить 60 @@ -2776,10 +3211,6 @@ ru Список контекстное меню группа команд от списка - - ru - Список контекстное меню группа команд от списка - СписокКонтекстноеМенюГруппаКомандОтСпискаExtendedTooltip 146 @@ -2831,8 +3262,8 @@ 0001-01-01T00:00:00 0001-01-01T00:00:00 + true - true true ГруппаПользовательскихНастроек @@ -2891,12 +3322,8 @@ <key>ru</key> - <value>Группа файлы</value> + <value>Файлы</value> - - ru - Группа файлы - ГруппаФайлыРасширеннаяПодсказка 271 @@ -2921,8 +3348,12 @@ true + + <key>ru</key> + <value>Облачный сервис</value> + - Группа1РасширеннаяПодсказка + ГруппаОблачныйСервисРасширеннаяПодсказка 286 Label true @@ -2984,9 +3415,18 @@ true + + Список.Автор + + + Список.ВладелецФайла + Список.Зашифрован + + Список.Отредактировал + Список.ПодписанЭП @@ -2996,6 +3436,12 @@ Список.Расширение + + Список.Редактирует + + + Список.РедактируетПользователь + Список.Ссылка @@ -3008,6 +3454,12 @@ Список.ФайлРедактируется + + Список.ХранитьВерсии + + + Список.ЭтоГруппа +
            true
            ВЫБРАТЬ @@ -3029,7 +3481,11 @@ ЛОЖЬ КАК ФайлРедактируется, ЛОЖЬ КАК ФайлРедактируетТекущийПользователь, ЛОЖЬ КАК ФайлРедактируетДругойПользователь, - НЕОПРЕДЕЛЕНО КАК Редактирует + ЛОЖЬ КАК ХранитьВерсии, + ЛОЖЬ КАК ЭтоГруппа, + &ВладелецФайла КАК ВладелецФайла, + НЕОПРЕДЕЛЕНО КАК Редактирует, + НЕОПРЕДЕЛЕНО КАК РедактируетПользователь ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных Catalog.ИдентификаторыОбъектовМетаданных @@ -3204,13 +3660,118 @@ true + + ВозможностьСоздаватьГруппыФайлов + + <key>ru</key> + <value>Возможность создавать группы файлов</value> + + 12 + + Boolean + + + 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 + + String + + + + true + + + true + + + + ИмяСправочникаХранилищаВерсийФайлов + + <key>ru</key> + <value>Имя справочника хранилища версий файлов</value> + + 16 + + String + + + + true + + + true + + + + ЕстьЭлектроннаяПодпись + + <key>ru</key> + <value>Есть электронная подпись</value> + + 17 + + Boolean + + + true + + + true + + ЗапрещенныеРасширения <key>ru</key> <value>Запрещенные расширения</value> - 12 + 18 ValueList @@ -3224,6 +3785,23 @@ + + ЭтоВладелецЭлементовСправочникаФайлы + + <key>ru</key> + <value>Это владелец элементов справочника файлы</value> + + 19 + + Boolean + + + true + + + true + + ОткрытьФайлДляПросмотра @@ -3670,7 +4248,7 @@ <name>Печать</name> <title> <key>ru</key> - <value>Печать</value> + <value>Сразу на принтер</value> 20 @@ -3733,6 +4311,191 @@ DontUse Auto + + СоздатьГруппу + + <key>ru</key> + <value>Создать группу</value> + + 8 + + ru + Создать группу + + + true + + + StdPicture.CreateFolder + + + + СоздатьГруппу + + + DontUse + Auto + + + ЗагрузитьФайлы + + <key>ru</key> + <value>Загрузить файлы</value> + + 23 + + ru + Загрузить файлы + + + true + + + + ЗагрузитьФайлы + + + DontUse + Auto + + + СохранитьПапку + + <key>ru</key> + <value>Сохранить папку</value> + + 24 + + ru + Сохранить папку + + + true + + + StdPicture.Write + + + + СохранитьПапку + + + DontUse + Auto + + + ЗагрузитьПапку + + <key>ru</key> + <value>Загрузить папку...</value> + + 25 + + ru + Загрузить папку + + + true + + + + ЗагрузитьПапку + + + DontUse + Auto + + + СравнитьФайлы + + <key>ru</key> + <value>Сравнить файлы...</value> + + 26 + + ru + Сравнить файлы + + + true + + + + СравнитьФайлы + + + DontUse + Auto + + + ДобавитьФайлПоШаблону + + <key>ru</key> + <value>По шаблону...</value> + + 27 + + ru + Добавить файл по шаблону + + + true + + + + ДобавитьФайлПоШаблону + + + DontUse + Auto + + + Занять + + <key>ru</key> + <value>Занять</value> + + 28 + + ru + Занять + + + true + + + CommonPicture.ЗанятьФайл + + + + Занять + + + DontUse + Auto + + + ПечатьСоШтампом + + <key>ru</key> + <value>Со штампом электронной подписи...</value> + + 29 + + ru + Печать со штампом электронной подписи + + + true + + + + ПечатьСоШтампом + + + DontUse + Auto + ВладелецФайла diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Help/ru.html similarity index 93% rename from SSL/src/CommonForms/ПрисоединенныеФайлы/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Help/ru.html index 338073634..fcf07d5dd 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Help/ru.html @@ -9,11 +9,14 @@
            • Дата создания - дата и время ввода файла в программу;
            • Редактирует - пользователь, который занял файл для редактирования и т.д. 

            Добавление нового файла

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

            Просмотр изображений в списке

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

            Просмотр карточки файла

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

            Редактирование присоединенных файлов

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

            Редактирование присоединенных файлов

            • В тонком клиенте редактирование файлов табличных документов (формата .mxl) осуществляется во встроенной форме редактора табличных документов. В веб-клиенте необходимо загрузить приложение для редактирования этих файлов. Подробнее об особенностях редактирования табличных документов в веб-клиенте см. здесь.
              diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl similarity index 51% rename from SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl index 7803bc647..cc5f742d3 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl @@ -4,13 +4,12 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - УстановитьУсловноеОформление(); - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; ВладелецФайла = Параметры.ВладелецФайла; + ТекущаяСсылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ТекущаяСтрока"); СписокОткрытИзКарточкиФайла = ЗначениеЗаполнено(ТекущаяСсылка); Элементы.ВладелецФайла.Видимость = СписокОткрытИзКарточкиФайла; @@ -23,12 +22,25 @@ |только в форме объекта-владельца.'"); КонецЕсли; + ТипВладельца = ТипЗнч(Параметры.ВладелецФайла); + Если Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельца) Тогда + ПолноеИмяВладельца = Метаданные.НайтиПоТипу(ТипВладельца).ПолноеИмя(); + Если Метаданные.НайтиПоПолномуИмени(ПолноеИмяВладельца + "ПрисоединенныеФайлы") = Неопределено Тогда + ЭтоВладелецЭлементовСправочникаФайлы = Истина; + КонецЕсли; + КонецЕсли; + Элементы.ФормаРедактировать.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; Элементы.ФормаОткрыть.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; Элементы.ФормаЗакончитьРедактирование.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; Элементы.СписокВажныеРеквизиты.Видимость = Не Параметры.ПростаяФорма; Предпросмотр = Параметры.ПростаяФорма; + ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); + Если Не ПоказыватьКолонкуРазмер Тогда + Элементы.СписокРазмер.Видимость = Ложь; + КонецЕсли; + Если Не ПустаяСтрока(Параметры.ЗаголовокФормы) Тогда Заголовок = Параметры.ЗаголовокФормы; ИначеЕсли СписокОткрытИзКарточкиФайла Тогда @@ -38,26 +50,52 @@ Если ЗначениеЗаполнено(Параметры.ПараметрыОтправки) Тогда ПараметрыОтправки = Параметры.ПараметрыОтправки; Иначе - ПараметрыОтправки = ФайловыеФункцииСлужебный.ПодготовитьСтруктуруПараметровОтправки(); + ПараметрыОтправки = РаботаСФайламиСлужебный.ПодготовитьСтруктуруПараметровОтправки(); КонецЕсли; Если Параметры.РежимВыбора Тогда СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ВыборПодбор"); РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - Заголовок = НСтр("ru = 'Выбор присоединенного файла'"); - Иначе Элементы.Список.РежимВыбора = Ложь; КонецЕсли; - ИмяСправочникаХранилищаФайлов = Неопределено; - НастроитьДинамическийСписок(ИмяСправочникаХранилищаФайлов); + НастройкиФайлов = РаботаСФайламиСлужебный.НастройкиФайлов(); + РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(НастройкиФайлов); + + ИмяСправочникаХранилищаФайлов = Неопределено; + + ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке динамического списка присоединенных файлов.'"); + ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка динамического списка невозможна.'"); + + ИмяСправочникаХранилищаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( + Параметры.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); + ТипСправочникаСФайлами = Тип("СправочникСсылка." + ИмяСправочникаХранилищаФайлов); + МассивИсключенийСозданияФайловПоШаблону = Новый Массив; + МетаданныеСправочникаСФайлами = Метаданные.НайтиПоТипу(ТипСправочникаСФайлами); + ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов( + Параметры.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); + + ВозможностьСоздаватьГруппыФайлов = МетаданныеСправочникаСФайлами.Иерархический; + Если НастройкиФайлов.НеСоздаватьФайлыПоШаблону.Найти(Метаданные.НайтиПоТипу(ТипЗнч(ВладелецФайла))) <> Неопределено Тогда + Элементы.ДобавитьФайлПоШаблону.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюДобавитьФайлПоШаблону.Видимость = Ложь; + КонецЕсли; + + ВозможностьСоздаватьВерсииФайлов = (ТипЗнч(Параметры.ВладелецФайла)= Тип("СправочникСсылка.Файлы")); + + НастроитьДинамическийСписок(ИмяСправочникаХранилищаФайлов); + + Если Не ВозможностьСоздаватьГруппыФайлов Тогда + СкрытьКнопкиСозданияГруппы(); + КонецЕсли; + ЕстьПравоДобавления = Истина; Если НЕ ПравоДоступа("ИнтерактивноеДобавление", МетаданныеСправочникаСФайлами) Тогда @@ -90,14 +128,14 @@ Или ИменаВсехКомандФормы.Найти(ЭлементФормы.Имя) <> Неопределено Тогда ИменаЭлементов.Добавить(ЭлементФормы.Имя); КонецЕсли; - + КонецЦикла; ИменаЭлементовКнопокФормы = Новый ФиксированныйМассив(ИменаЭлементов); ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда Элементы.ФормаИзменить.Видимость = Ложь; Элементы.ФормаИзменить82.Видимость = Истина; Элементы.ФормаСкопировать.ТолькоВоВсехДействиях = Ложь; @@ -115,7 +153,7 @@ Элементы.АдресДанныхФайла.Видимость = Предпросмотр; Элементы.Предпросмотр.Пометка = Предпросмотр; - РасширенияПоддерживающиеПредпросмотр = ФайловыеФункцииСлужебный.СписокРасширенийДляПредпросмотра(); + РасширенияПоддерживающиеПредпросмотр = РаботаСФайламиСлужебный.СписокРасширенийДляПредпросмотра(); ОбновитьПояснениеОблачногоСервиса(); @@ -129,7 +167,12 @@ КонецЕсли; - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); + ЕстьЭлектроннаяПодпись = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись"); + Элементы.ПечатьСоШтампом.Видимость = ЕстьЭлектроннаяПодпись; + + ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений(); + + УстановитьУсловноеОформление(); КонецПроцедуры @@ -137,18 +180,12 @@ Процедура ПриОткрытии(Отказ) Если ЕстьПравоДобавления Тогда - ДоступнаКомандаСканировать = ФайловыеФункцииСлужебныйКлиент.ДоступнаКомандаСканировать(); - Элементы.ПодменюДобавить.Видимость = ДоступнаКомандаСканировать; - Элементы.Добавить.Видимость = Не ДоступнаКомандаСканировать; - Элементы.СписокКонтекстноеМенюГруппаКомандДобавить.Видимость = ДоступнаКомандаСканировать; - Элементы.СписокКонтекстноеМенюДобавить.Видимость = Не ДоступнаКомандаСканировать; + ДоступнаКомандаСканировать = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); + Элементы.ДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать; + Элементы.СписокКонтекстноеМенюДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать; КонецЕсли; - #Если ВебКлиент Тогда - Элементы.Печать.Видимость = Ложь; - #КонецЕсли - - УстановитьДоступностьКнопок(); + УстановитьДоступностьФайловыхКоманд(); КонецПроцедуры @@ -156,13 +193,13 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - + И (ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") + Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда + ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); КонецЕсли; - Если ИмяСобытия <> "Запись_ПрисоединенныйФайл" Тогда + Если ИмяСобытия <> "Запись_Файл" Тогда Возврат; КонецЕсли; @@ -175,14 +212,15 @@ Если Параметр.Свойство("ЭтоНовый") И Параметр.ЭтоНовый Тогда Элементы.Список.ТекущаяСтрока = СсылкаНаФайл; - УстановитьДоступностьКнопок(); + УстановитьДоступностьФайловыхКоманд(); Иначе - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; - Если СсылкаНаФайл = Элементы.Список.ТекущиеДанные.Ссылка Тогда - УстановитьДоступностьКнопок(); + Если Элементы.Список.ТекущиеДанные <> Неопределено + И СсылкаНаФайл = Элементы.Список.ТекущиеДанные.Ссылка Тогда + УстановитьДоступностьФайловыхКоманд(); КонецЕсли; КонецЕсли; @@ -192,6 +230,14 @@ #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок +&НаКлиенте +Процедура СписокПриИзменении(Элемент) + Если Элемент.ВыделенныеСтроки.Количество() > 0 Тогда + Оповестить("Запись_Файл", + Новый Структура("Событие", "ДанныеФайлаИзменены"), Элемент.ВыделенныеСтроки); + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) @@ -201,14 +247,39 @@ СтандартнаяОбработка = Ложь; - ОткрытьФайл(); + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если Элементы.Список.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ЭтоГруппа Тогда + ПоказатьЗначение(, ВыбраннаяСтрока); + Возврат; + КонецЕсли; + + КакОткрывать = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + + Если КакОткрывать = "ОткрыватьКарточку" Тогда + ПоказатьЗначение(, ВыбраннаяСтрока); + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, + Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаРедактирования", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Истина); КонецПроцедуры &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) - ПодключитьОбработчикОжидания("УстановитьДоступностьКнопок", 0.1, Истина); + ПодключитьОбработчикОжидания("ОбновитьДоступностьФайловыхКоманд", 0.1, Истина); КонецПроцедуры @@ -219,16 +290,36 @@ Если Копирование Тогда - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; + ПараметрыФормы = Новый Структура; ПараметрыФормы = Новый Структура("ЗначениеКопирования", Элемент.ТекущиеДанные.Ссылка); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы); - + Если Элемент.ТекущиеДанные.ЭтоГруппа Тогда + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); + Иначе + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); + КонецЕсли; Иначе - ПрисоединенныеФайлыКлиент.ДобавитьФайлы(Параметры.ВладелецФайла, УникальныйИдентификатор); + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + ГруппаФайлов = Неопределено; + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда + ГруппаФайлов = ТекущиеДанные.Ссылка; + КонецЕсли; + Если ЭтоВладелецЭлементовСправочникаФайлы Тогда + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыВыполнения.Вставить("ВладелецФайла", Параметры.ВладелецФайла); + ПараметрыВыполнения.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); + ПараметрыВыполнения.Вставить("ЭтоФайл", Истина); + + РаботаСФайламиСлужебныйКлиент.ДобавитьПослеВыбораРежимаСоздания(2, ПараметрыВыполнения); + Иначе + РаботаСФайламиКлиент.ДобавитьФайлы(Параметры.ВладелецФайла, УникальныйИдентификатор, , ГруппаФайлов); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -238,17 +329,22 @@ Отказ = Истина; - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Ключ", ТекущиеДанные.Ссылка); - ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); + ПараметрыФормы.Вставить("Ключ", ТекущиеДанные.Ссылка); + ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); + ПараметрыФормы.Вставить("ПараметрыОтправки", ПараметрыОтправки); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , Ложь); + Если ТекущиеДанные.ЭтоГруппа Тогда + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); + Иначе + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); + КонецЕсли; КонецПроцедуры @@ -265,32 +361,47 @@ СтандартнаяОбработка = Ложь; МассивИменФайлов = Новый Массив; + МассивЭлементовСписка = Новый Массив; Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") - И ПараметрыПеретаскивания.Значение.ЭтоФайл() Тогда + И ПараметрыПеретаскивания.Значение.ЭтоФайл() Тогда МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя); ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 - И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда - Для каждого Значение Из ПараметрыПеретаскивания.Значение Цикл - - Если ТипЗнч(Значение) = Тип("Файл") И Значение.ЭтоФайл() Тогда - МассивИменФайлов.Добавить(Значение.ПолноеИмя); - КонецЕсли; - КонецЦикла; + ТипПеретаскиваемого = ТипЗнч(ПараметрыПеретаскивания.Значение[0]); + Если ТипПеретаскиваемого = Тип("СправочникСсылка.Файлы") Тогда + РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПриложенныеФайлы( + ПараметрыПеретаскивания.Значение, + ВладелецФайла); + Возврат; + КонецЕсли; + Если ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + Для каждого Значение Из ПараметрыПеретаскивания.Значение Цикл + Если ТипЗнч(Значение) = Тип("Файл") И Значение.ЭтоФайл() Тогда + МассивИменФайлов.Добавить(Значение.ПолноеИмя); + КонецЕсли; + КонецЦикла; + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = ТипСправочникаСФайлами Тогда + Для Каждого Значение Из ПараметрыПеретаскивания.Значение Цикл + МассивЭлементовСписка.Добавить(Значение); + КонецЦикла; + КонецЕсли; КонецЕсли; - + КонецЕсли; Если МассивИменФайлов.Количество() > 0 Тогда - - ПрисоединенныеФайлыСлужебныйКлиент.ДобавитьФайлыПеретаскиванием( + РаботаСФайламиСлужебныйКлиент.ДобавитьФайлыПеретаскиванием( Параметры.ВладелецФайла, УникальныйИдентификатор, МассивИменФайлов); КонецЕсли; + + Если МассивЭлементовСписка.Количество() > 0 И ВозможностьСоздаватьГруппыФайлов Тогда + СтандартнаяОбработка = Истина; + КонецЕсли; КонецПроцедуры @@ -308,6 +419,18 @@ КонецПроцедуры +&НаКлиенте +Процедура ДобавитьФайлПоШаблону(Команда) + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов); + РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления); + +КонецПроцедуры + &НаКлиенте Процедура ДобавитьФайлСоСканера(Команда) @@ -324,7 +447,7 @@ ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); ПараметрыДобавления.Вставить("ЭтоФайл", Ложь); - ФайловыеФункцииСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); + РаботаСФайламиСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); КонецПроцедуры @@ -338,25 +461,23 @@ &НаКлиенте Процедура ОткрытьКаталогФайла(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные.Зашифрован Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - Если ТекущиеДанные.Зашифрован Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; + ФайлСсылка = Элементы.Список.ТекущиеДанные.Ссылка; - ПрисоединенныеФайлыСлужебныйКлиент.ОткрытьКаталогСФайлом(ДанныеФайла); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, + Неопределено, УникальныйИдентификатор, Неопределено, Неопределено); + РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); + КонецПроцедуры @@ -365,14 +486,14 @@ Элементы.Список.Обновить(); - ПодключитьОбработчикОжидания("УстановитьДоступностьКнопок", 0.1, Истина); + ПодключитьОбработчикОжидания("ОбновитьДоступностьФайловыхКоманд", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура ОбновитьИзФайлаНаДиске(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; @@ -381,41 +502,27 @@ Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, , Ложь); - Если ДанныеФайла.Зашифрован Или ДанныеФайла.ПодписанЭП Или ДанныеФайла.ФайлРедактируется Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыСлужебныйКлиент.ОбновитьПрисоединенныйФайл(ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура СохранитьКак(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные.Зашифрован - ИЛИ (ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь) Тогда + ИЛИ (ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь) Тогда Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - - Если ДанныеФайла.Зашифрован - ИЛИ (ДанныеФайла.ФайлРедактируется И ДанныеФайла.ФайлРедактируетТекущийПользователь) Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыКлиент.СохранитьФайлКак(ДанныеФайла); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ТекущиеДанные.Ссылка, , УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры @@ -429,21 +536,27 @@ &НаКлиенте Процедура ОткрытьСвойстваФайла(Команда) - Если Элементы.Список.ТекущиеДанные = Неопределено Тогда + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда Возврат КонецЕсли; ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПрисоединенныйФайл", Элементы.Список.ТекущиеДанные.Ссылка); + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ТекущиеДанные.Ссылка); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы); + Если ТекущиеДанные.ЭтоГруппа Тогда + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); + Иначе + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); + КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Отправить(Команда) - ФайловыеФункцииСлужебныйКлиент.ОтправитьФайлыПоПочте( + РаботаСФайламиСлужебныйКлиент.ОтправитьФайлыПоПочте( Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ПараметрыОтправки); КонецПроцедуры @@ -460,11 +573,24 @@ ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() > 0 Тогда - ПрисоединенныеФайлыКлиент.НапечататьФайлы(ВыделенныеСтроки, ЭтотОбъект.УникальныйИдентификатор); + РаботаСФайламиКлиент.НапечататьФайлы(ВыделенныеСтроки, ЭтотОбъект.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПечатьСоШтампом(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ТабличныйДокументСоШтампом(ТекущиеДанные.Ссылка, ТекущиеДанные.Ссылка); + РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом); + +КонецПроцедуры + &НаКлиенте Процедура Предпросмотр(Команда) @@ -501,36 +627,149 @@ КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////////// +&НаКлиенте +Процедура СоздатьГруппу(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + ТекущиеДанные = ТекущиеДанные.Ссылка; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Родитель", Неопределено); + ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыФормы.Вставить("ЭтоНоваяГруппа", Истина); + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьФайлы(Команда) + #Если ВебКлиент Тогда + ТекстПредупреждения = НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. + |Используйте команду ""Создать"" в списке файлов.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + #КонецЕсли + + МассивИменФайлов = РаботаСФайламиСлужебныйКлиент.ИмпортируемыеФайлы(); + + Если МассивИменФайлов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВладелецФайлов")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", ВладелецФайла); + ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + ГруппаФайлов = Неопределено; + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда + ГруппаФайлов = ТекущиеДанные.Ссылка; + КонецЕсли; + ПараметрыФормы.Вставить("ГруппаФайлов", ГруппаФайлов); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаФайлов", ПараметрыФормы); +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьПапку(Команда) + + #Если ВебКлиент Тогда + ТекстПредупреждения = НСтр("ru = 'В веб-клиенте импорт папок недоступен. + |Используйте команду ""Создать"" в списке файлов.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + #КонецЕсли + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если Не ДиалогОткрытияФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", ВладелецФайла); + ПараметрыФормы.Вставить("КаталогНаДиске", ДиалогОткрытияФайла.Каталог); + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов); + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + ГруппаФайлов = Неопределено; + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда + ГруппаФайлов = ТекущиеДанные.Ссылка; + КонецЕсли; + ПараметрыФормы.Вставить("ГруппаФайлов", ГруппаФайлов); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаПапки", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьПапку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Или Не ТекущиеДанные.ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаЭкспорта", ТекущиеДанные.Ссылка); + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов); + ПараметрыФормы.Вставить("ИмяСправочникаХранилищаВерсийФайлов", ИмяСправочникаХранилищаВерсийФайлов); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЭкспортаПапки", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура СравнитьФайлы(Команда) + + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); + + Если ЧислоВыделенныхСтрок = 2 Тогда + + Ссылка1 = Элементы.Список.ВыделенныеСтроки[0]; + Ссылка2 = Элементы.Список.ВыделенныеСтроки[1]; + + Расширение = НРег(Элементы.Список.ТекущиеДанные.Расширение); + + РаботаСФайламиСлужебныйКлиент.СравнитьФайлы(УникальныйИдентификатор, Ссылка1, Ссылка2, Расширение); + + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////////// // Обработчики команд для поддержки ЭП и шифрования. &НаКлиенте Процедура Подписать(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные.ФайлРедактируется - ИЛИ ТекущиеДанные.Зашифрован Тогда + ИЛИ ТекущиеДанные.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + МассивФайлов = Новый Массив; + МассивФайлов.Добавить(ТекущиеДанные.Ссылка); - Если ДанныеФайла.ФайлРедактируется - ИЛИ ДанныеФайла.Зашифрован Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - ПрисоединенныйФайл = ТекущиеДанные.Ссылка; - ДанныеФайла = ДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор); - - ПрисоединенныеФайлыСлужебныйКлиент.ПодписатьФайл(ПрисоединенныйФайл, ДанныеФайла, УникальныйИдентификатор, + РаботаСФайламиСлужебныйКлиент.ПодписатьФайлы(МассивФайлов, УникальныйИдентификатор, Новый ОписаниеОповещения("ДобавлениеПодписейЗавершить", ЭтотОбъект)); КонецПроцедуры @@ -538,7 +777,7 @@ &НаКлиенте Процедура СохранитьВместеСЭП(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; @@ -548,36 +787,30 @@ Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - - Если ДанныеФайла.Зашифрован Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП(ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьФайлВместеСПодписью( + ТекущиеДанные.Ссылка, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура ДобавитьЭПИзФайла(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные.ФайлРедактируется - ИЛИ ТекущиеДанные.Зашифрован Тогда + ИЛИ ТекущиеДанные.Зашифрован Тогда Возврат; КонецЕсли; ПрисоединенныйФайл = ТекущиеДанные.Ссылка; - ДанныеФайла = ДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор); - ПрисоединенныеФайлыСлужебныйКлиент.ДобавитьПодписьИзФайла(ПрисоединенныйФайл, ДанныеФайла, УникальныйИдентификатор, + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла( + ПрисоединенныйФайл, + УникальныйИдентификатор, Новый ОписаниеОповещения("ДобавлениеПодписейЗавершить", ЭтотОбъект)); КонецПроцедуры @@ -585,37 +818,82 @@ &НаКлиенте Процедура Зашифровать(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные.ФайлРедактируется - ИЛИ ТекущиеДанные.Зашифрован Тогда + ИЛИ ТекущиеДанные.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ТекущиеДанные.Ссылка); - Если ДанныеФайла.ФайлРедактируется - ИЛИ ДанныеФайла.Зашифрован Тогда + Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) + ИЛИ ДанныеФайла.Зашифрован Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; - ПрисоединенныеФайлыСлужебныйКлиент.Зашифровать( - ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ТекущиеДанные.Ссылка); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); - УстановитьДоступностьКнопок(); + РаботаСФайламиСлужебныйКлиент.Зашифровать(Обработчик, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + Результат.МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, + ПараметрыВыполнения.ОбъектСсылка); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ОбъектСсылка); + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +&НаСервере +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Истина; + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ОбъектСсылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); КонецПроцедуры &НаКлиенте Процедура Расшифровать(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; @@ -625,18 +903,60 @@ Возврат; КонецЕсли; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + ОбъектСсылка = ТекущиеДанные.Ссылка; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); - Если НЕ ДанныеФайла.Зашифрован Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеРасшифровкиНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Расшифровать( + Обработчик, + ДанныеФайла.Ссылка, + УникальныйИдентификатор, + ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Ложь Или Не Результат.Успех Тогда Возврат; КонецЕсли; - ПрисоединенныеФайлыСлужебныйКлиент.Расшифровать( - ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); - УстановитьДоступностьКнопок(); + РасшифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога, + ПараметрыВыполнения.ОбъектСсылка); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ОбъектСсылка); + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +&НаСервере +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ОбъектСсылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); КонецПроцедуры @@ -646,7 +966,7 @@ &НаКлиенте Процедура Редактировать(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; @@ -658,75 +978,44 @@ Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ТекущиеДанные", ТекущиеДанные); - Оповещение = Новый ОписаниеОповещения("РедактироватьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ТекущиеДанные.Наименование, ТекущиеДанные.Расширение)); - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ТекущиеДанные.Наименование, ТекущиеДанные.Расширение); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - - Если ( ДанныеФайла.ФайлРедактируется - И НЕ ДанныеФайла.ФайлРедактируетТекущийПользователь) - ИЛИ ДанныеФайла.Зашифрован - ИЛИ ДанныеФайла.ПодписанЭП Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - Если НЕ ТекущиеДанные.ФайлРедактируется Тогда - - ЗанятьФайлДляРедактированияСервер(ТекущиеДанные.Ссылка); - - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - УстановитьДоступностьКнопок(); - КонецЕсли; - - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); + РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Неопределено, ТекущиеДанные.Ссылка); КонецПроцедуры &НаКлиенте Процедура ЗакончитьРедактирование(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда - Возврат; - КонецЕсли; + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + + Если НЕ ДанныеСтроки.ФайлРедактируется + ИЛИ НЕ ДанныеСтроки.ФайлРедактируетТекущийПользователь Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - - Если НЕ ТекущиеДанные.ФайлРедактируется - ИЛИ НЕ ТекущиеДанные.ФайлРедактируетТекущийПользователь Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, , Ложь); - - Если НЕ ДанныеФайла.ФайлРедактируется - ИЛИ НЕ ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда - Возврат; - КонецЕсли; - - ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьРедактированиеВыполненоПомещение", ЭтотОбъект, ТекущиеДанные); - ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище(ОписаниеОповещения, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗакончитьРедактированиеВыполненоПомещение(ИнформацияОФайле, ТекущиеДанные) Экспорт - - Если ИнформацияОФайле <> Неопределено - И ИнформацияОФайле.ФайлПомещенВХранилище Тогда - ПоместитьФайлВХранилищеИОсвободить(ТекущиеДанные.Ссылка, ИнформацияОФайле); - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - УстановитьДоступностьКнопок(); + Если МассивФайлов.Количество() > 1 Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивФайлов", МассивФайлов); + ПараметрыФормы.Вставить("ВозможностьСоздаватьВерсииФайлов", ВозможностьСоздаватьВерсииФайлов); + ПараметрыФормы.Вставить("Редактирует", ДанныеСтроки.РедактируетПользователь); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЗавершениеРедактирования", ПараметрыФормы, ЭтотОбъект); + ИначеЕсли МассивФайлов.Количество() = 1 Тогда + ПараметрыОбновленияФайлов = Новый Структура; + ПараметрыОбновленияФайлов.Вставить("МассивФайлов", МассивФайлов); + ПараметрыОбновленияФайлов.Вставить("ВозможностьСоздаватьВерсииФайлов", ВозможностьСоздаватьВерсииФайлов); + ПараметрыОбновленияФайлов.Вставить("ХранитьВерсии", ДанныеСтроки.ХранитьВерсии); + Если Не ВозможностьСоздаватьВерсииФайлов Тогда + ПараметрыОбновленияФайлов.Вставить("СоздатьНовуюВерсию", Ложь); + КонецЕсли; + ПараметрыОбновленияФайлов.Вставить("ФайлРедактируетТекущийПользователь", Истина); + ПараметрыОбновленияФайлов.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыОбновленияФайлов.Вставить("ИдентификаторФормы", УникальныйИдентификатор); + ПараметрыОбновленияФайлов.Вставить("Редактирует", ДанныеСтроки.РедактируетПользователь); + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеПоСсылкамСОповещением(ПараметрыОбновленияФайлов); КонецЕсли; КонецПроцедуры @@ -734,23 +1023,59 @@ &НаКлиенте Процедура Освободить(Команда) - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; - ТекущиеДанные = Элементы.Список.ТекущиеДанные; + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + Если Не РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл( + ДанныеСтроки.Ссылка, + ДанныеСтроки.ФайлРедактируетТекущийПользователь, + ДанныеСтроки.РедактируетПользователь) Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; - Если НЕ ТекущиеДанные.ФайлРедактируется - ИЛИ НЕ ТекущиеДанные.ФайлРедактируетТекущийПользователь Тогда - Возврат; - КонецЕсли; - - ОсвободитьФайл(ТекущиеДанные.Ссылка); - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - УстановитьДоступностьКнопок(); + ОсвободитьФайлы(МассивФайлов); + Для Каждого ПрисоединенныйФайл Из МассивФайлов Цикл + ОповеститьОбИзменении(ПрисоединенныйФайл); + КонецЦикла; + УстановитьДоступностьФайловыхКоманд(); КонецПроцедуры +&НаКлиенте +Процедура Занять(Команда) + + Если НЕ ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + КоличествоФайлов = Элементы.Список.ВыделенныеСтроки.Количество(); + + Если КоличествоФайлов = 1 Тогда + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + ИначеЕсли КоличествоФайлов > 1 Тогда + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ЭлементСписка); + + Если ЗначениеЗаполнено(ДанныеСтроки.РедактируетПользователь) Тогда + Продолжить; + КонецЕсли; + МассивФайлов.Добавить(ДанныеСтроки.Ссылка); + КонецЦикла; + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект, МассивФайлов); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, МассивФайлов); + КонецЕсли; + +КонецПроцедуры + + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -759,16 +1084,14 @@ Процедура УстановитьУсловноеОформление() УсловноеОформление.Элементы.Очистить(); + Список.УсловноеОформление.Элементы.Очистить(); // Оформление файла, занятого для редактирования другим пользователем. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ФайлРедактируетДругойПользователь"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФайлРедактируетДругойПользователь"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; @@ -776,24 +1099,36 @@ // Оформление файла, занятого для редактирования текущим пользователем. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ФайлРедактируетТекущийПользователь"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФайлРедактируетТекущийПользователь"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ФайлЗанятыйТекущимПользователем); + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВладелецФайла"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; + ОтборЭлемента.ПравоеЗначение = ВладелецФайла; + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + КонецПроцедуры &НаКлиенте Процедура ОткрытьФайл() - Если НЕ ПроверитьДействиеРазрешено() Тогда + Если НЕ ФайловыеКомандыДоступны() Тогда Возврат; КонецЕсли; @@ -816,15 +1151,14 @@ ФайлРедактируется = ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); Если ДанныеФайла.Зашифрован Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); КонецПроцедуры @@ -834,78 +1168,72 @@ Если Результат <> Неопределено И Результат = "Продолжить" Тогда ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные; - + ФайлРедактируется = ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь; - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); Если ДанныеФайла.Зашифрован Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура РедактироватьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт +Процедура СписокВыборПослеВыбораРежимаРедактирования(Результат, ПараметрыВыполнения) Экспорт + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные; - - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - - Если (ДанныеФайла.ФайлРедактируется - И НЕ ДанныеФайла.ФайлРедактируетТекущийПользователь) - ИЛИ ДанныеФайла.Зашифрован - ИЛИ ДанныеФайла.ПодписанЭП Тогда - // Файл может быть изменен в другом сеансе. - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - Возврат; - КонецЕсли; - - Если НЕ ТекущиеДанные.ФайлРедактируется Тогда - - ЗанятьФайлДляРедактированияСервер(ТекущиеДанные.Ссылка); - - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - УстановитьДоступностьКнопок(); - КонецЕсли; - - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); - + Если Результат = РезультатРедактировать Тогда + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеРедактированияФайла", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла); + ИначеЕсли Результат = РезультатОткрыть Тогда + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборПослеРедактированияФайла(Результат, ПараметрыВыполнения) Экспорт + + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + УстановитьДоступностьФайловыхКоманд(); КонецПроцедуры &НаКлиенте -Функция ПроверитьДействиеРазрешено(Знач ТекущееДействие = "") +Функция ФайловыеКомандыДоступны() - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Возврат ТипЗнч(Элементы.Список.ТекущаяСтрока) = ТипСправочникаСФайлами; + Возврат РаботаСФайламиСлужебныйКлиент.ФайловыеКомандыДоступны(Элементы); КонецФункции +&НаСервере +Процедура СкрытьКнопкиСозданияГруппы() + Элементы.СоздатьГруппу.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость = Ложь; + Элементы.ЗагрузитьПапку.Видимость = Ложь; + Элементы.СохранитьПапку.Видимость = Ложь; +КонецПроцедуры + &НаСервере Процедура СкрытьКнопкиДобавления() - Элементы.Добавить.Видимость = Ложь; - Элементы.ДобавитьИзФайлаНаДиске.Видимость = Ложь; - Элементы.ДобавитьФайлСоСканера.Видимость = Ложь; - Элементы.СписокКонтекстноеМенюДобавить.Видимость = Ложь; - Элементы.СписокКонтекстноеМенюГруппаКомандДобавить.Видимость = Ложь; - - Элементы.ФормаСкопировать.Видимость = Ложь; - Элементы.СписокКонтекстноеМенюСкопировать.Видимость = Ложь; + Элементы.Добавить.Видимость = Ложь; + Элементы.ДобавитьИзФайлаНаДиске.Видимость = Ложь; + Элементы.ДобавитьФайлПоШаблону.Видимость = Ложь; + Элементы.ДобавитьФайлСоСканера.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюДобавить.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость = Ложь; + Элементы.СоздатьГруппу.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость = Ложь; + Элементы.ФормаСкопировать.Видимость = Ложь; + Элементы.СписокКонтекстноеМенюСкопировать.Видимость = Ложь; КонецПроцедуры @@ -923,12 +1251,13 @@ Если ИменаКоманд.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено Тогда ЭлементФормы.Видимость = Ложь; КонецЕсли; + КонецЦикла; КонецПроцедуры &НаКлиенте -Процедура УстановитьДоступностьКнопок() +Процедура УстановитьДоступностьФайловыхКоманд(Результат = Неопределено, ПараметрыВыполнения = Неопределено) Экспорт ТекущиеДанные = Элементы.Список.ТекущиеДанные; @@ -936,15 +1265,22 @@ ИменаКоманд = Новый Массив; ИменаКоманд.Добавить("Добавить"); ИменаКоманд.Добавить("ДобавитьФайлСоСканера"); + ИменаКоманд.Добавить("ДобавитьФайлПоШаблону"); ИначеЕсли ТипЗнч(Элементы.Список.ТекущаяСтрока) <> ТипСправочникаСФайлами Тогда ИменаКоманд = Новый Массив; Иначе - ИменаКоманд = ПолучитьДоступныеКоманды( - ТекущиеДанные.ФайлРедактируется, + ВозможностьОсвободитьФайл = РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл( + ТекущиеДанные.Ссылка, ТекущиеДанные.ФайлРедактируетТекущийПользователь, - ТекущиеДанные.ПодписанЭП, - ТекущиеДанные.Зашифрован, - ФайлыРедактируютсяВОблачномСервисе); + ТекущиеДанные.РедактируетПользователь); + + ИменаКоманд = ПолучитьДоступныеКоманды(ТекущиеДанные, ФайлыРедактируютсяВОблачномСервисе, ВозможностьОсвободитьФайл); + КонецЕсли; + + Если ТекущиеДанные <> Неопределено Тогда + Элементы.ПечатьСоШтампом.Видимость = ЕстьЭлектроннаяПодпись + И (ТекущиеДанные.Расширение = "mxl") + И ТекущиеДанные.ПодписанЭП; КонецЕсли; Для каждого ИмяЭлементаФормы Из ИменаЭлементовКнопокФормы Цикл @@ -968,47 +1304,27 @@ КонецПроцедуры &НаСервереБезКонтекста -Функция ДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, - Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) +Процедура ОсвободитьФайлы(Знач МассивФайлов) - Возврат ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные); - -КонецФункции - -&НаСервереБезКонтекста -Процедура ЗанятьФайлДляРедактированияСервер(Знач ПрисоединенныйФайл) - - ПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(ПрисоединенныйФайл); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ОсвободитьФайл(Знач ПрисоединенныйФайл) - - ПрисоединенныеФайлыСлужебный.ОсвободитьФайл(ПрисоединенныйФайл); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПоместитьФайлВХранилищеИОсвободить(Знач ПрисоединенныйФайл, - Знач ИнформацияОФайле) - - ПрисоединенныеФайлыСлужебный.ПоместитьФайлВХранилищеИОсвободить( - ПрисоединенныйФайл, ИнформацияОФайле); + Для Каждого ПрисоединенныйФайл Из МассивФайлов Цикл + РаботаСФайламиСлужебный.ОсвободитьФайл(ПрисоединенныйФайл); + КонецЦикла; КонецПроцедуры &НаСервере Процедура НастроитьДинамическийСписок(ИмяСправочникаХранилищаФайлов) + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); + ТекстЗапроса = "ВЫБРАТЬ | Файлы.Ссылка КАК Ссылка, | Файлы.ПометкаУдаления, | ВЫБОР | КОГДА Файлы.ПометкаУдаления = ИСТИНА - | ТОГДА Файлы.ИндексКартинки + 1 - | ИНАЧЕ Файлы.ИндексКартинки + | ТОГДА ЕСТЬNULL(Файлы.ИндексКартинки, 2) + 1 + | ИНАЧЕ ЕСТЬNULL(Файлы.ИндексКартинки, 2) | КОНЕЦ КАК ИндексКартинки, | Файлы.Наименование КАК Наименование, | ВЫРАЗИТЬ(Файлы.Описание КАК СТРОКА(500)) КАК Описание, @@ -1031,7 +1347,6 @@ | КОНЕЦ КАК НомерКартинкиПодписанЗашифрован, | ВЫБОР | КОГДА НЕ Файлы.Редактирует В (&ПустыеПользователи) - | ИЛИ СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись <> НЕОПРЕДЕЛЕНО | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ФайлРедактируется, @@ -1041,8 +1356,7 @@ | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ФайлРедактируетТекущийПользователь, | ВЫБОР - | КОГДА (НЕ Файлы.Редактирует В (&ПустыеПользователи) - | ИЛИ СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись <> НЕОПРЕДЕЛЕНО) + | КОГДА НЕ Файлы.Редактирует В (&ПустыеПользователи) | И Файлы.Редактирует <> &ТекущийПользователь | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ @@ -1053,7 +1367,11 @@ | И Файлы.Редактирует = НЕОПРЕДЕЛЕНО | ТОГДА СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись | ИНАЧЕ Файлы.Редактирует - | КОНЕЦ КАК Редактирует + | КОНЕЦ КАК Редактирует, + | Файлы.Редактирует КАК РедактируетПользователь, + | &ЭтоГруппа КАК ЭтоГруппа, + | Файлы.ВладелецФайла КАК ВладелецФайла, + | Файлы.ХранитьВерсии КАК ХранитьВерсии |ИЗ | &ИмяСправочника КАК Файлы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом @@ -1061,20 +1379,20 @@ |ГДЕ | Файлы.ВладелецФайла = &ВладелецФайлов"; - ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке динамического списка присоединенных файлов.'"); - ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка динамического списка невозможна.'"); - - ИмяСправочникаХранилищаФайлов = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов( - Параметры.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); - - ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаФайлов; - Список.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); - Список.ОсновнаяТаблица = ПолноеИмяСправочника; + ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаФайлов; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); + СвойстваСписка.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоГруппа", + ?(ВозможностьСоздаватьГруппыФайлов, "Файлы.ЭтоГруппа", "ЛОЖЬ")); + + СвойстваСписка.ОсновнаяТаблица = ПолноеИмяСправочника; + СвойстваСписка.ДинамическоеСчитываниеДанных = Истина; + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка); ПустыеПользователи = Новый Массив; ПустыеПользователи.Добавить(Неопределено); ПустыеПользователи.Добавить(Справочники.Пользователи.ПустаяСсылка()); ПустыеПользователи.Добавить(Справочники.ВнешниеПользователи.ПустаяСсылка()); + ПустыеПользователи.Добавить(Справочники.УчетныеЗаписиСинхронизацииФайлов.ПустаяСсылка()); Список.Параметры.УстановитьЗначениеПараметра("ВладелецФайлов", Параметры.ВладелецФайла); Список.Параметры.УстановитьЗначениеПараметра("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); @@ -1084,8 +1402,6 @@ Список.Параметры.УстановитьЗначениеПараметра("СекундДоМестногоВремени", МестноеВремя(ДатаУниверсальная, ЧасовойПоясСеанса()) - ДатаУниверсальная); - Список.ДинамическоеСчитываниеДанных = Истина; - КонецПроцедуры &НаКлиентеНаСервереБезКонтекста @@ -1107,6 +1423,7 @@ // Команды зависимые от состояния объектов. ИменаКоманд.Добавить("ЗакончитьРедактирование"); + ИменаКоманд.Добавить("Занять"); ИменаКоманд.Добавить("Освободить"); ИменаКоманд.Добавить("Редактировать"); ИменаКоманд.Добавить("УстановитьПометкуУдаления"); @@ -1119,14 +1436,25 @@ ИменаКоманд.Добавить("Зашифровать"); ИменаКоманд.Добавить("Расшифровать"); + ИменаКоманд.Добавить("Печать"); + ИменаКоманд.Добавить("ПечатьСоШтампом"); + + ИменаКоманд.Добавить("Отправить"); + ИменаКоманд.Добавить("ОбновитьИзФайлаНаДиске"); // Команды независимые от состояния объектов. ИменаКоманд.Добавить("Добавить"); + ИменаКоманд.Добавить("СоздатьГруппу"); ИменаКоманд.Добавить("ДобавитьИзФайлаНаДиске"); + ИменаКоманд.Добавить("ДобавитьФайлПоШаблону"); ИменаКоманд.Добавить("ДобавитьФайлСоСканера"); ИменаКоманд.Добавить("ОткрытьСвойстваФайла"); ИменаКоманд.Добавить("Скопировать"); + ИменаКоманд.Добавить("ЗагрузитьФайлы"); + + + Возврат ИменаКоманд; @@ -1147,20 +1475,24 @@ КонецФункции &НаКлиентеНаСервереБезКонтекста -Функция ПолучитьДоступныеКоманды(ФайлРедактируется, - ФайлРедактируетТекущийПользователь, - ФайлПодписан, - ФайлЗашифрован, - ФайлыРедактируютсяВОблачномСервисе) +Функция ПолучитьДоступныеКоманды(ТекущиеДанныеФайла, ФайлыРедактируютсяВОблачномСервисе, ВозможностьОсвободитьФайл) ИменаКоманд = ПолучитьИменаКомандФормы(); + ФайлРедактируетТекущийПользователь = ТекущиеДанныеФайла.ФайлРедактируетТекущийПользователь; + ФайлРедактируется = ТекущиеДанныеФайла.ФайлРедактируется; + ФайлПодписан = ТекущиеДанныеФайла.ПодписанЭП; + ФайлЗашифрован = ТекущиеДанныеФайла.Зашифрован; + ФайлСсылка = ТекущиеДанныеФайла.Ссылка; + Если ФайлРедактируется Тогда Если ФайлРедактируетТекущийПользователь Тогда УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); Иначе УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); - УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + Если Не ВозможностьОсвободитьФайл Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + КонецЕсли; УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); КонецЕсли; УдалитьКомандуИзМассива(ИменаКоманд, "УстановитьПометкуУдаления"); @@ -1177,6 +1509,25 @@ УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); КонецЕсли; + Если ТекущиеДанныеФайла.ЭтоГруппа Тогда + УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); + УдалитьКомандуИзМассива(ИменаКоманд, "Подписать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭПИзФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "Зашифровать"); + УдалитьКомандуИзМассива(ИменаКоманд, "Расшифровать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьСвойстваФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "Скопировать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьКаталогФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьФайлДляПросмотра"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьКак"); + УдалитьКомандуИзМассива(ИменаКоманд, "Занять"); + УдалитьКомандуИзМассива(ИменаКоманд, "Отправить"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПечатьСоШтампом"); + УдалитьКомандуИзМассива(ИменаКоманд, "Печать"); + КонецЕсли; + Если ФайлПодписан Тогда УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); @@ -1204,6 +1555,7 @@ Если ФайлыРедактируютсяВОблачномСервисе Тогда УдалитьКомандуИзМассива(ИменаКоманд, "Добавить"); УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьИзФайлаНаДиске"); + УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьФайлПоШаблону"); УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьФайлСоСканера"); УдалитьКомандуИзМассива(ИменаКоманд, "Скопировать"); КонецЕсли; @@ -1244,16 +1596,16 @@ &НаСервере Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект); + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект); КонецПроцедуры // Продолжение процедуры Подписать, ДобавитьЭПИзФайла. &НаКлиенте -Процедура ДобавлениеПодписейЗавершить(Успех, Неопределен) Экспорт +Процедура ДобавлениеПодписейЗавершить(Успех, Контекст) Экспорт Если Успех = Истина Тогда - УстановитьДоступностьКнопок(); + УстановитьДоступностьФайловыхКоманд(); КонецЕсли; КонецПроцедуры @@ -1268,7 +1620,7 @@ Элементы.АдресДанныхФайла.Видимость = ИспользоватьПредпросмотр; Элементы.Предпросмотр.Пометка = ИспользоватьПредпросмотр; - + КонецПроцедуры &НаКлиенте @@ -1280,8 +1632,8 @@ ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные <> Неопределено И РасширенияПоддерживающиеПредпросмотр.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда - ДанныеФайла = ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); - АдресДанныхФайла = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); + АдресДанныхФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; Иначе АдресДанныхФайла = Неопределено; Элементы.АдресДанныхФайла.ТекстНевыбраннойКартинки = НСтр("ru = 'Нет данных для предварительного просмотра'"); @@ -1319,7 +1671,7 @@ ФайлыРедактируютсяВОблачномСервисе = Истина; ВидимостьПояснения = Истина; - АдресПапкиВОблачномСервисе = ФайловыеФункцииСлужебныйКлиентСервер.АдресВОблачномСервисе( + АдресПапкиВОблачномСервисе = РаботаСФайламиСлужебныйКлиентСервер.АдресВОблачномСервисе( ВыборкаДетальныеЗаписи.Сервис, ВыборкаДетальныеЗаписи.Href); ЧастиСтроки = Новый Массив; @@ -1375,4 +1727,11 @@ КонецФункции +&НаКлиенте +Процедура ОбновитьДоступностьФайловыхКоманд() + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form similarity index 73% rename from SSL/src/CommonForms/ПрисоединенныйФайл/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form index 81f9f42e7..237afdcac 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form @@ -3,24 +3,111 @@ ГруппаОбщаяИнформация 29 - - Наименование0 - 102 + + ГруппаОбщиеДанные + 156 + + Наименование0 + 102 + true + true + + true + + + ОбъектПрототип[0].Наименование + + + ru + Имя файла (без расширения) + + + Наименование0РасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + Наименование0КонтекстноеМеню + 103 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Описание0 + 105 + true + true + + true + + + ОбъектПрототип[0].Описание + + Left + + ru + Краткое описание файла + + + Описание0РасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + Описание0КонтекстноеМеню + 106 + true + + InputField + Enter + true + Left + true + + 2 + true + true + true + true + true + Normal + + true true true - - ОбъектПрототип[0].Наименование - - + <key>ru</key> - <value>Имя файла (без расширения)</value> - </toolTip> + <value>Общие данные</value> + - Наименование0РасширеннаяПодсказка - 104 + ГруппаОбщиеДанныеРасширеннаяПодсказка + 157 Label true true @@ -28,44 +115,166 @@ Left - - Наименование0КонтекстноеМеню - 103 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - Normal + UsualGroup + + Vertical + Auto + true + true + Auto + Auto - - Описание0 - 105 + + ГруппаКоманды + 158 + + ФормаОткрытьФайлДляПросмотра + 11 + true + true + + true + + + ФормаОткрытьФайлДляПросмотраExtendedTooltip + 63 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьФайлДляПросмотра + Normal + Auto + true + true + UserCmds + Auto + + + Редактировать + 160 + true + true + + true + + + РедактироватьРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + UsualButton + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 162 + true + true + + true + + + ЗакончитьРедактированиеРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьИзменения + 164 + true + true + + true + + + ФормаСохранитьИзмененияРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + UsualButton + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + СохранитьКак + 166 + true + true + + true + + + СохранитьКакРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + UsualButton + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + true true true - - ОбъектПрототип[0].Описание - - Left - + <key>ru</key> - <value>Краткое описание файла</value> - </toolTip> + <value>Команды</value> + - Описание0РасширеннаяПодсказка - 107 + ГруппаКомандыРасширеннаяПодсказка + 159 Label true true @@ -73,24 +282,14 @@ Left - - Описание0КонтекстноеМеню - 106 - true - - InputField - Enter - true - Left - true - - 2 - true - true - true - true - true - Normal + UsualGroup + + Vertical + Auto + true + true + Auto + Auto true @@ -100,12 +299,8 @@ <key>ru</key> - <value>Группа общая информация</value> + <value>Общая информация о файле</value> - - ru - Группа общая информация - ГруппаОбщаяИнформацияExtendedTooltip 77 @@ -118,7 +313,6 @@ UsualGroup - Vertical Auto true true @@ -166,7 +360,6 @@ true InputField - true Enter true Left @@ -231,9 +424,130 @@ Normal + + ГруппаРедактирует + 197 + + Редактирует0 + 199 + true + true + + true + + + ОбъектПрототип[0].Редактирует + + + Редактирует0РасширеннаяПодсказка + 201 + Label + true + true + + Left + + + + Редактирует0КонтекстноеМеню + 200 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ДатаЗаема0 + 202 + + <key>ru</key> + <value>с</value> + + true + true + + true + + + ОбъектПрототип[0].ДатаЗаема + + + ДатаЗаема0РасширеннаяПодсказка + 204 + Label + true + true + + Left + + + + ДатаЗаема0КонтекстноеМеню + 203 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Редактирует</value> + + + ГруппаРедактируетРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + ВладелецФайла0 - 117 + 173 <key>ru</key> <value>Размещение</value> @@ -246,13 +560,9 @@ <dataPath xsi:type="form:DataPath"> <segments>ОбъектПрототип[0].ВладелецФайла</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Место размещения файла (объект)</value> - </toolTip> <extendedTooltip> <name>ВладелецФайла0РасширеннаяПодсказка</name> - <id>119</id> + <id>175</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -262,7 +572,7 @@ </extendedTooltip> <contextMenu> <name>ВладелецФайла0КонтекстноеМеню</name> - <id>118</id> + <id>174</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -281,11 +591,79 @@ <textSize>Normal</textSize> </extInfo> </items> + <items xsi:type="form:FormGroup"> + <name>ГруппаХранитьВерсии</name> + <id>213</id> + <items xsi:type="form:FormField"> + <name>ХранитьВерсии0</name> + <id>168</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ОбъектПрототип[0].ХранитьВерсии</segments> + </dataPath> + <titleLocation>Right</titleLocation> + <extendedTooltip> + <name>ХранитьВерсии0РасширеннаяПодсказка</name> + <id>170</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ХранитьВерсии0КонтекстноеМеню</name> + <id>169</id> + <autoFill>true</autoFill> + </contextMenu> + <type>CheckBoxField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:CheckBoxFieldExtInfo"/> + </items> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Хранить версии</value> + + + ГруппаХранитьВерсииРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + true true true + + <key>ru</key> + <value>Основные сведения</value> + ГруппаСведенияЧасть1ExtendedTooltip 80 @@ -409,24 +787,105 @@ Normal - - Размер0 - 120 + + ГруппаРазмерСДекорацией + 192 + + Размер0 + 120 + + <key>ru</key> + <value>Размер</value> + + true + true + + true + + + ОбъектПрототип[0].Размер + + + ru + Размер файла + + + Размер0РасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + Размер0КонтекстноеМеню + 121 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДекорацияБайт + 194 + + <key>ru</key> + <value>байт</value> + + true + true + + true + + + ДекорацияБайтРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + + ДекорацияБайтКонтекстноеМеню + 195 + true + + Label + true + true + + Left + + true true true - - ОбъектПрототип[0].Размер - - + <key>ru</key> - <value>Размер файла</value> - </toolTip> + <value>Размер с декорацией</value> + - Размер0РасширеннаяПодсказка - 122 + ГруппаРазмерСДекорациейРасширеннаяПодсказка + 193 Label true true @@ -434,45 +893,152 @@ Left - - Размер0КонтекстноеМеню - 121 - true - - InputField - true - Enter - true - Left - true - + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаРасширение + 178 + + Расширение0 + 114 + true + true + + true + + + ОбъектПрототип[0].Расширение + + + ru + Расширение файла + + + Расширение0РасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + Расширение0КонтекстноеМеню + 115 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИндексКартинки0 + 180 + true + true + + true + + + ОбъектПрототип[0].ИндексКартинки + + None + + ИндексКартинки0РасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + ИндексКартинки0КонтекстноеМеню + 181 + true + + PictureField + Enter + true + Left + true + + 2 + true + 1 + true + + CommonPicture.КоллекцияПиктограммФайлов + + + 1 + + + + true + true + + true + + + <key>ru</key> + <value>Расширение файла</value> + + + ГруппаРасширениеРасширеннаяПодсказка + 179 + Label true true - true - true - true - true - Normal + + Left + + + UsualGroup + + Center + Auto + true + true + Auto + Auto - Расширение0 - 114 + Кодировка + 183 true true true - ОбъектПрототип[0].Расширение + Кодировка - - ru - Расширение файла - - Расширение0РасширеннаяПодсказка - 116 + КодировкаРасширеннаяПодсказка + 185 Label true true @@ -481,24 +1047,18 @@ - Расширение0КонтекстноеМеню - 115 + КодировкаКонтекстноеМеню + 184 true - InputField - true + LabelField Enter true Left true - + true true - true - true - true - true - Normal true @@ -506,6 +1066,10 @@ true + + <key>ru</key> + <value>Дополнительные сведения</value> + ГруппаСведенияЧасть2ExtendedTooltip 81 @@ -535,10 +1099,6 @@ ru Сведения о файле - - ru - Сведения о файле - ГруппаСведенияОФайлеExtendedTooltip 79 @@ -561,6 +1121,10 @@ ЭлектронныеПодписи 32 + + <key>ru</key> + <value>Электронные подписи</value> + true true @@ -750,7 +1314,7 @@ ЭлектронныеПодписиОписаниеОшибки - 159 + 189 true true @@ -762,7 +1326,7 @@ None ЭлектронныеПодписиОписаниеОшибкиРасширеннаяПодсказка - 161 + 191 Label true true @@ -772,7 +1336,7 @@ ЭлектронныеПодписиОписаниеОшибкиКонтекстноеМеню - 160 + 190 true InputField @@ -879,7 +1443,7 @@ Left - Form.Command.ПодписатьФайлЭП + Form.Command.Подписать Normal Auto true @@ -1140,7 +1704,7 @@ Инструкция - 156 + 186 <key>ru</key> <value>Типичные проблемы при работе с программами электронной подписи и их решение</value> @@ -1152,7 +1716,7 @@ </userVisible> <extendedTooltip> <name>ИнструкцияРасширеннаяПодсказка</name> - <id>158</id> + <id>188</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1162,7 +1726,7 @@ </extendedTooltip> <contextMenu> <name>ИнструкцияКонтекстноеМеню</name> - <id>157</id> + <id>187</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -1209,6 +1773,10 @@ <items xsi:type="form:Table"> <name>СертификатыШифрования</name> <id>49</id> + <title> + <key>ru</key> + <value>Сертификаты</value> + true true @@ -1434,6 +2002,35 @@ false + + ГруппаДополнительныеРеквизиты + 171 + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ГруппаДополнительныеРеквизитыРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + true true @@ -1441,12 +2038,8 @@ <key>ru</key> - <value>Группа дополнительные данные страницы</value> + <value>Дополнительные данные</value> - - ru - Группа дополнительные данные страницы - ГруппаДополнительныеДанныеСтраницыExtendedTooltip 78 @@ -1459,6 +2052,10 @@ Pages + + OnCurrentPageChange + ГруппаДополнительныеДанныеСтраницыПриСменеСтраницы + TabsOnTop Auto @@ -1571,19 +2168,19 @@ InAdditionalSubmenu - ГруппаФайловыеФункции - 10 + ПодменюПечать + 205 - ФормаОткрытьФайлДляПросмотра - 11 + Печать + 207 true true true - ФормаОткрытьФайлДляПросмотраExtendedTooltip - 63 + ПечатьРасширеннаяПодсказка + 208 Label true true @@ -1591,13 +2188,68 @@ Left - Form.Command.ОткрытьФайлДляПросмотра + Form.Command.Печать Normal + Auto true true UserCmds Auto + + ПечатьСоШтампом + 209 + true + true + + true + + + ПечатьСоШтампомРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + Form.Command.ПечатьСоШтампом + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Печать</value> + + + ПодменюПечатьРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаФайловыеФункции + 10 ФормаРедактировать 14 @@ -1644,7 +2296,7 @@ Form.Command.ЗакончитьРедактирование Normal - Auto + Picture true true UserCmds @@ -1660,10 +2312,6 @@ ru Файловые функции - - ru - Файловые функции - ГруппаФайловыеФункцииExtendedTooltip 62 @@ -1688,10 +2336,6 @@ ru Форма глобальные команды - - ru - Форма глобальные команды - None ФормаГлобальныеКомандыРасширеннаяПодсказка @@ -1707,224 +2351,6 @@ FormCommandPanelGlobalCommands - - ФормаГруппаКомандЭлектроннаяПодписьИШифрование - 17 - - ФормаГруппаКомандЭлектроннаяПодпись - 129 - - ФормаПодписатьФайлЭП - 19 - true - true - - true - - - ФормаПодписатьФайлЭПРасширеннаяПодсказка - 71 - Label - true - true - - Left - - - Form.Command.ПодписатьФайлЭП - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаДобавитьЭПИзФайла - 20 - true - true - - true - - - ФормаДобавитьЭПИзФайлаРасширеннаяПодсказка - 72 - Label - true - true - - Left - - - Form.Command.ДобавитьЭПИзФайла - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаСохранитьВместеСЭП - 21 - true - true - - true - - - ФормаСохранитьВместеСЭПРасширеннаяПодсказка - 73 - Label - true - true - - Left - - - Form.Command.СохранитьВместеСЭП - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Форма группа команд электронная подпись</value> - - - ФормаГруппаКомандЭлектроннаяПодписьРасширеннаяПодсказка - 130 - Label - true - true - - Left - - - - - - ФормаГруппаКомандШифрование - 18 - - ФормаЗашифровать - 22 - true - true - - true - - - ФормаЗашифроватьExtendedTooltip - 75 - Label - true - true - - Left - - - Form.Command.Зашифровать - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаРасшифровать - 23 - true - true - - true - - - ФормаРасшифроватьExtendedTooltip - 76 - Label - true - true - - Left - - - Form.Command.Расшифровать - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Форма группа команд шифрование</value> - - - ФормаГруппаКомандШифрованиеРасширеннаяПодсказка - 74 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Электронная подпись и шифрование</value> - - - ru - Электронная подпись и шифрование - - - ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка - 70 - Label - true - true - - Left - - - Popup - - - CommonPicture.ПодписанЗашифрованЗаголовок - - Picture - Normal - - ФормаСтандартныеСкопировать 4 @@ -2099,10 +2525,6 @@ ru Форма группа дополнительные команды - - ru - Форма группа дополнительные команды - None ФормаГруппаДополнительныеКомандыРасширеннаяПодсказка @@ -2116,6 +2538,240 @@ + + ФормаОтправить + 211 + true + true + + true + + + ФормаОтправитьРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + Form.Command.Отправить + Normal + true + true + UserCmds + Auto + + + ФормаГруппаКомандЭлектроннаяПодписьИШифрование + 17 + + ФормаГруппаКомандЭлектроннаяПодпись + 129 + + ФормаПодписатьФайлЭП + 19 + true + true + + true + + + ФормаПодписатьФайлЭПРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭПИзФайла + 20 + true + true + + true + + + ФормаДобавитьЭПИзФайлаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.ДобавитьЭПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭП + 21 + true + true + + true + + + ФормаСохранитьВместеСЭПРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Форма группа команд электронная подпись</value> + + + ФормаГруппаКомандЭлектроннаяПодписьРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + + + + ФормаГруппаКомандШифрование + 18 + + ФормаЗашифровать + 22 + true + true + + true + + + ФормаЗашифроватьExtendedTooltip + 75 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифровать + 23 + true + true + + true + + + ФормаРасшифроватьExtendedTooltip + 76 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Форма группа команд шифрование</value> + + + ФормаГруппаКомандШифрованиеРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Электронная подпись и шифрование</value> + + + ФормаГруппаКомандЭлектроннаяПодписьИШифрованиеРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Popup + + + CommonPicture.ПодписанЗашифрованЗаголовок + + Picture + Normal + + Left true @@ -2426,13 +3082,31 @@ true + + ПорядковыйНомер + + <key>ru</key> + <value>Порядковый номер</value> + + 12 + + Number + + + + true + + + true + + ОписаниеОшибки <key>ru</key> <value>Описание ошибки</value> - 12 + 13 String @@ -2515,6 +3189,26 @@ true + + ПорядковыйНомер + + <key>ru</key> + <value>Порядковый номер</value> + + 4 + + Number + + 10 + + + + true + + + true + + ОписаниеКолонокТаблицыПодписей @@ -2720,6 +3414,76 @@ 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 + + + true + + + true + + + + ДатаЗаема + + <key>ru</key> + <value>Дата заема</value> + + 13 + + Date + + + + true + + + true + + ФайлРедактируетсяВОблаке @@ -2738,13 +3502,48 @@ true + + ВозможностьСоздаватьВерсииФайлов + + <key>ru</key> + <value>Возможность создавать версии файлов</value> + + 13 + + Boolean + + + true + + + true + + + + Кодировка + + <key>ru</key> + <value>Кодировка</value> + + 14 + + String + + + + true + + + true + + ЗапрещенныеРасширения <key>ru</key> <value>Запрещенные расширения</value> - 13 + 15 ValueList @@ -2758,6 +3557,73 @@ + + НаименованиеДоЗаписи + + <key>ru</key> + <value>Наименование до записи</value> + + 16 + + String + + + + true + + + true + + + + ПараметрыОтправки + + <key>ru</key> + <value>Параметры отправки</value> + + 17 + + + true + + + true + + + + ОткрытьФормуЭлементаСправочникаФайлы + + <key>ru</key> + <value>Открыть форму элемента справочника файлы</value> + + 18 + + Boolean + + + true + + + true + + + + ДоступнаЭлектроннаяПодпись + + <key>ru</key> + <value>Доступна электронная подпись</value> + + 19 + + Boolean + + + true + + + true + + СтандартнаяЗаписатьИЗакрыть @@ -2886,7 +3752,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ПодписатьФайлЭП</name> + <name>Подписать</name> <title> <key>ru</key> <value>Подписать...</value> @@ -2901,7 +3767,7 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ПодписатьФайлЭП</name> + <name>Подписать</name> </handler> </action> <representation>TextPicture</representation> @@ -2956,7 +3822,7 @@ <name>СохранитьКак</name> </handler> </action> - <representation>Picture</representation> + <representation>TextPicture</representation> <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -3334,6 +4200,103 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СохранитьИзменения</name> + <title> + <key>ru</key> + <value>Сохранить изменения</value> + + 25 + + ru + Сохранить измененный файл в информационной базе + + + true + + + CommonPicture.ОпубликоватьФайл + + + + СохранитьИзменения + + + TextPicture + true + DontUse + Auto + + + Печать + + <key>ru</key> + <value>Сразу на принтер</value> + + 26 + + ru + Печать + + + true + + + + Печать + + + DontUse + Auto + + + ПечатьСоШтампом + + <key>ru</key> + <value>Со штампом электронной подписи...</value> + + 27 + + ru + Печать со штампом электронной подписи + + + true + + + + ПечатьСоШтампом + + + DontUse + Auto + + + Отправить + + <key>ru</key> + <value>Отправить</value> + + 28 + + ru + Отправить + + + true + + + CommonPicture.ОтправитьЭлектронноеПисьмо + + + + Отправить + + + TextPicture + DontUse + Auto + Ключ @@ -3346,6 +4309,7 @@ AnyRef + true ЭтоНовый @@ -3358,9 +4322,62 @@ AnyRef + true + + + ИмяСправочникаХранилищаФайлов + + String + + + + + ВладелецФайла + + AnyRef + + + + РежимСоздания + + String + + + + + ПараметрыОтправки + - + + + 0 + Added + FormNavigationPanelGoTo + 0 + + true + + + + 0 + Added + FormNavigationPanelGoTo + 1 + + true + + + + CommonCommand.ВерсииФайла + Added + FormNavigationPanelGoTo + 2 + + true + + + diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Help/ru.html similarity index 97% rename from SSL/src/CommonForms/ПрисоединенныйФайл/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Help/ru.html index ab6e47b88..1898d778c 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Help/ru.html @@ -1,6 +1,6 @@

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

              -

              Открывается из списка присоединенных файлов с помощью команды Еще - Открыть карточку (клавиши F2).

              +

              Открывается из списка присоединенных файлов с помощью команды Еще - Открыть карточку (клавиши F2).

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

              • Наименование - полное имя файла. Автоматически заполняется программой во время присоединения файла и создания карточки файла, можно изменить;
              • Описание - напишите подробные сведения о файле; diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl similarity index 60% rename from SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl index 003c20e96..30c302d21 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl @@ -1,3 +1,9 @@ +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПараметрыФормыЭлементаСправочникаФайлы; + +#КонецОбласти #Область ОбработчикиСобытийФормы @@ -8,90 +14,74 @@ Возврат; КонецЕсли; - ФайлБылСоздан = Параметры.ЭтоНовый; + ТипВладельца = ТипЗнч(Параметры.ВладелецФайла); - КолонкиМассив = Новый Массив; - Для Каждого ОписаниеКолонки Из РеквизитФормыВЗначение("ЭлектронныеПодписи").Колонки Цикл - КолонкиМассив.Добавить(ОписаниеКолонки.Имя); - КонецЦикла; - ОписаниеКолонокТаблицыПодписей = Новый ФиксированныйМассив(КолонкиМассив); + Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда + ПрисоединенныйФайл = Параметры.ПрисоединенныйФайл; + Иначе + ПрисоединенныйФайл = Параметры.Ключ; + КонецЕсли; + Если ТипЗнч(ПрисоединенныйФайл) = Тип("СправочникСсылка.Файлы") Тогда + ОткрытьФормуЭлементаСправочникаФайлы = Истина; + Возврат; + КонецЕсли; + + ДоступнаЭлектроннаяПодпись = РаботаСФайламиСлужебный.ДоступнаЭлектроннаяПодпись(ТипЗнч(ПрисоединенныйФайл)); ТекущийПользователь = Пользователи.АвторизованныйПользователь(); - Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда - КопируемыйОбъект = Параметры.ЗначениеКопирования.ПолучитьОбъект(); - ЗначениеКопирования = Параметры.ЗначениеКопирования; + Элементы.ВладелецФайла0.Заголовок = ТипВладельца; + + ПараметрыОтправки = ?(ЗначениеЗаполнено(Параметры.ПараметрыОтправки), + Параметры.ПараметрыОтправки, РаботаСФайламиСлужебный.ПодготовитьСтруктуруПараметровОтправки()); + + РаботаСФайламиСлужебный.ФормаЭлементаПриСозданииНаСервере( + ЭтотОбъект, Отказ, СтандартнаяОбработка, Параметры, ТолькоПросмотр, Истина); - ОбъектЗначение = Справочники[КопируемыйОбъект.Метаданные().Имя].СоздатьЭлемент(); - ЗаполнитьЗначенияСвойств( - ОбъектЗначение, - КопируемыйОбъект, - "ДатаМодификацииУниверсальная, - |ДатаСоздания, - |Зашифрован, - |Описание, - |ПодписанЭП, - |Размер, - |Расширение, - |ТекстХранилище, - |ВладелецФайла, - |ПометкаУдаления"); - - Для Каждого ЭлементЭП Из КопируемыйОбъект.ЭлектронныеПодписи Цикл - НоваяСтрока = ОбъектЗначение.ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементЭП); - КонецЦикла; - - Для Каждого ЭлементШифрования Из КопируемыйОбъект.СертификатыШифрования Цикл - НоваяСтрока = ОбъектЗначение.СертификатыШифрования.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементШифрования); - КонецЦикла; - - ОбъектЗначение.Автор = Пользователи.АвторизованныйПользователь(); - Иначе - Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда - ОбъектЗначение = Параметры.ПрисоединенныйФайл.ПолучитьОбъект(); - Иначе - ОбъектЗначение = Параметры.Ключ.ПолучитьОбъект(); - КонецЕсли; - КонецЕсли; - ОбъектЗначение.Заполнить(Неопределено); - - ИмяСправочника = ОбъектЗначение.Метаданные().Имя; - - НастроитьОбъектФормы(ОбъектЗначение); - - ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере(); - ЗаполнитьСписокПодписей(); - ЗаполнитьСписокШифрования(); - - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда - ФайлРедактируетсяВОблаке = ФайловыеФункцииСлужебный.ФайлРедактируетсяВОблаке(ЭтотОбъект.Объект.Ссылка); - КонецЕсли; - - Если ТолькоПросмотр - ИЛИ НЕ ПравоДоступа("Изменение", ЭтотОбъект.Объект.ВладелецФайла.Метаданные()) Тогда - - УстановитьКнопкиИзмененияНевидимыми(Элементы); - КонецЕсли; - - Если НЕ ТолькоПросмотр - И НЕ ЭтотОбъект.Объект.Ссылка.Пустая() Тогда - - ЗаблокироватьДанныеДляРедактирования(ЭтотОбъект.Объект.Ссылка, , УникальныйИдентификатор); - КонецЕсли; - УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); + ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений(); ОбновитьЗаголовок(); + ДоступнаПечатьСоШтампом = ДоступнаЭлектроннаяПодпись + И (ЭтотОбъект.Объект.Расширение = "mxl") + И ЭтотОбъект.Объект.ПодписанЭП; + + Элементы.ПечатьСоШтампом.Видимость = ДоступнаПечатьСоШтампом; + + Если Не ДоступнаПечатьСоШтампом Тогда + Элементы.ПодменюПечать.Вид = ВидГруппыФормы.ГруппаКнопок; + Элементы.Печать.Заголовок = НСтр("ru='Печать'"); + КонецЕсли; + + Элементы.ФормаГруппаКомандЭлектроннаяПодписьИШифрование.Видимость = ДоступнаЭлектроннаяПодпись; + Элементы.ГруппаЭлектронныеПодписи.Видимость = ДоступнаЭлектроннаяПодпись; + Элементы.ГруппаСертификатыШифрования.Видимость = ДоступнаЭлектроннаяПодпись; + + Если НЕ ДоступнаЭлектроннаяПодпись Тогда + Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) + Если ОткрытьФормуЭлементаСправочникаФайлы Тогда + Отказ = Истина; + ПараметрыФормыЭлементаСправочникаФайлы = Новый Структура( + "ЗначениеКопирования, Ключ, ТолькоПросмотр, ПрисоединенныйФайл, + |ВладелецФайла, ПараметрыОтправки, РежимСоздания, ЭтоНовый"); + + ЗаполнитьЗначенияСвойств(ПараметрыФормыЭлементаСправочникаФайлы, Параметры); + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина); + ПодключитьОбработчикОжидания("ОткрытьФормуЭлементаСправочникаФайлаОбработчикОжидания", 0.1, Истина); + Возврат; + КонецЕсли; + + НаименованиеДоЗаписи = ЭтотОбъект.Объект.Наименование; + ДатаМодификации = МестноеВремя(ЭтотОбъект.Объект.ДатаМодификацииУниверсальная); УстановитьДоступностьКомандСпискаЭП(); @@ -114,13 +104,27 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ( ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") - Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда - + Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") И (ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи") + Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.3, Истина); КонецЕсли; + Если ИмяСобытия = "Запись_Файл" + И Источник = ЭтотОбъект.Объект.Ссылка + И Параметр <> Неопределено + И ТипЗнч(Параметр) = Тип("Структура") + И Параметр.Свойство("Событие") + И (Параметр.Событие = "ЗаконченоРедактирование" + Или Параметр.Событие = "РедактированиеОтменено") Тогда + ОбновитьОбъект(); + КонецЕсли; + + // СтандартныеПодсистемы.Свойства + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + КонецЕсли; + // Конец СтандартныеПодсистемы.Свойства + КонецПроцедуры #КонецОбласти @@ -180,19 +184,15 @@ Перем НовоеРасширение; Если ЭтоНовый() - ИЛИ ЭтотОбъект.Объект.Зашифрован - ИЛИ ЭтотОбъект.Объект.ПодписанЭП - ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован + ИЛИ ЭтотОбъект.Объект.ПодписанЭП + ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, , Ложь); - - ИнформацияОФайле = Новый Структура; - - ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеЗавершение", ЭтотОбъект); - ПрисоединенныеФайлыСлужебныйКлиент.ВыбратьФайлНаДискеИПоместитьВХранилище( - ОписаниеОповещения, ДанныеФайла, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ЭтотОбъект.Объект.Ссылка); + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Обработчик, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -296,28 +296,83 @@ ПараметрыФормы = Новый Структура("ЗначениеКопирования", ЭтотОбъект.Объект.Ссылка); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); КонецПроцедуры +&НаКлиенте +Процедура Печать(Команда) + + СистемнаяИнфо = Новый СистемнаяИнформация; + Если СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86 + И СистемнаяИнфо.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиКлиент.НапечататьФайлы(Файлы, ЭтотОбъект.УникальныйИдентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатьСоШтампом(Команда) + + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Тогда + ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ТабличныйДокументСоШтампом(ЭтотОбъект.Объект.Ссылка, ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Отправить(Команда) + + Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтотОбъект.Объект.Ссылка); + РаботаСФайламиСлужебныйКлиент.ОтправитьФайлыПоПочте(Файлы, УникальныйИдентификатор, ПараметрыОтправки); + +КонецПроцедуры + + +// СтандартныеПодсистемы.Свойства + +&НаКлиенте +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Свойства + /////////////////////////////////////////////////////////////////////////////////// // Обработчики команд ЭП и шифрования. &НаКлиенте -Процедура ПодписатьФайлЭП(Команда) +Процедура Подписать(Команда) Если ЭтоНовый() - Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) - Или ЭтотОбъект.Объект.Зашифрован Тогда - + Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ПрисоединенныйФайл = ЭтотОбъект.Объект.Ссылка; - ДанныеФайла = ПолучитьДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор); + Если Модифицированность Тогда + Если Не ЗаписатьФайл() Тогда + Возврат; + КонецЕсли; + КонецЕсли; - ПрисоединенныеФайлыСлужебныйКлиент.ПодписатьФайл(ПрисоединенныйФайл, ДанныеФайла, УникальныйИдентификатор, - , Новый ОписаниеОповещения("ПриПолученииПодписи", ЭтотОбъект)); + МассивФайлов = Новый Массив; + МассивФайлов.Добавить(ЭтотОбъект.Объект.Ссылка); + + РаботаСФайламиСлужебныйКлиент.ПодписатьФайлы(МассивФайлов, УникальныйИдентификатор, + Новый ОписаниеОповещения("ПриПолученииПодписи", ЭтотОбъект)); КонецПроцедуры @@ -325,17 +380,16 @@ Процедура ДобавитьЭПИзФайла(Команда) Если ЭтоНовый() - Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) - Или ЭтотОбъект.Объект.Зашифрован Тогда - + Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; ПрисоединенныйФайл = ЭтотОбъект.Объект.Ссылка; - ДанныеФайла = ПолучитьДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор); - - ПрисоединенныеФайлыСлужебныйКлиент.ДобавитьПодписьИзФайла(ПрисоединенныйФайл, ДанныеФайла, УникальныйИдентификатор, - , Новый ОписаниеОповещения("ПриПолученииПодписей", ЭтотОбъект)); + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла( + ПрисоединенныйФайл, + УникальныйИдентификатор, + Новый ОписаниеОповещения("ПриПолученииПодписей", ЭтотОбъект)); КонецПроцедуры @@ -343,16 +397,13 @@ Процедура СохранитьВместеСЭП(Команда) Если ЭтоНовый() - ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) - ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда + ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - - ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП( + РаботаСФайламиКлиент.СохранитьВместеСЭП( ЭтотОбъект.Объект.Ссылка, - ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -364,30 +415,48 @@ Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + Если Модифицированность Тогда + Если Не ЗаписатьФайл() Тогда + Возврат; + КонецЕсли; + КонецЕсли; - ОписаниеОповещения = Новый ОписаниеОповещения("ЗашифроватьДанныеПолучены", ЭтотОбъект, ДанныеФайла); - ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьЗашифрованныеДанные(ОписаниеОповещения, ЭтотОбъект.Объект.Ссылка, ДанныеФайла, УникальныйИдентификатор); - + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ЭтотОбъект.Объект.Ссылка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Зашифровать( + Обработчик, + ДанныеФайла, + УникальныйИдентификатор); + КонецПроцедуры &НаКлиенте -Процедура ЗашифроватьДанныеПолучены(РезультатПолучения, ДанныеФайла) Экспорт - Если РезультатПолучения = Неопределено Тогда +Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда Возврат; КонецЕсли; - ЗашифрованныеДанные = РезультатПолучения.ЗашифрованныеДанные; - МассивОтпечатков = РезультатПолучения.МассивОтпечатков; + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); - ЗашифроватьСервер(ЗашифрованныеДанные, МассивОтпечатков); + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге( - ЭтотОбъект.Объект.Ссылка, ДанныеФайла); + ЗашифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + Результат.МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога); - ЗаполнитьСписокШифрования(); + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + ЭтотОбъект.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКомандСпискаШифрования(); @@ -400,29 +469,44 @@ Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ОписаниеОповещения = Новый ОписаниеОповещения("РасшифроватьДанныеПолучены", ЭтотОбъект); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ЭтотОбъект.Объект.Ссылка); - ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьРасшифрованныеДанные(ОписаниеОповещения, - ЭтотОбъект.Объект.Ссылка, ДанныеФайла, УникальныйИдентификатор); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеРасшифровкиНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Расшифровать( + Обработчик, + ДанныеФайла.Ссылка, + УникальныйИдентификатор, + ДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура РасшифроватьДанныеПолучены(РасшифрованныеДанные, ДополнительныеПараметры) Экспорт +Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт - Если РасшифрованныеДанные = Неопределено Тогда + Если Не Результат.Успех Тогда Возврат; КонецЕсли; + ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); - РасшифроватьСервер(РасшифрованныеДанные); - ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОРасшифровкеФайла(ЭтотОбъект.Объект.Ссылка); - ЗаполнитьСписокШифрования(); + РасшифроватьСервер(Результат.МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога); + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ЭтотОбъект.Объект.Ссылка); + + ЗаполнитьСписокШифрованияНаСервере(); УстановитьДоступностьКомандСпискаШифрования(); КонецПроцедуры +&НаСервере +Процедура ЗаполнитьСписокШифрованияНаСервере() + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); +КонецПроцедуры + &НаКлиенте Процедура КомандаЭПСписокОткрытьПодпись(Команда) @@ -442,9 +526,9 @@ Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ФайловыеФункцииСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, + РаботаСФайламиСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, Элементы.ЭлектронныеПодписи.ВыделенныеСтроки); @@ -453,9 +537,9 @@ &НаКлиенте Процедура ПроверитьВсе(Команда) - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ФайловыеФункцииСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + РаботаСФайламиСлужебныйКлиент.ПроверитьПодписи(ЭтотОбъект, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); КонецПроцедуры @@ -498,7 +582,7 @@ УдалитьИзСпискаПодписейИЗаписатьФайл(); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКомандСпискаЭП(); КонецПроцедуры @@ -528,14 +612,14 @@ &НаКлиенте Процедура УстановитьДоступностьКомандСпискаЭП() - ФайловыеФункцииСлужебныйКлиент.УстановитьДоступностьКомандСпискаЭлектронныхПодписей(ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаЭлектронныхПодписей(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура УстановитьДоступностьКомандСпискаШифрования() - ФайловыеФункцииСлужебныйКлиент.УстановитьДоступностьКомандСпискаСертификатовШифрования(ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаСертификатовШифрования(ЭтотОбъект); КонецПроцедуры @@ -552,26 +636,27 @@ КонецЕсли; Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) - И ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда + И ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(ЭтотОбъект.Объект.Расширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("РедактироватьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; + Если Модифицированность И Не ОбработатьКомандуЗаписиФайла() Тогда + Возврат КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Неопределено, + ДанныеФайла, УникальныйИдентификатор); Иначе - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); - ЗанятьФайлДляРедактированияСервер(); + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Неопределено, + ДанныеФайла, УникальныйИдентификатор); + + ОбновитьОбъект(); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецЕсли; КонецПроцедуры @@ -585,22 +670,26 @@ Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, , Ложь); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ЭтотОбъект.Объект.Ссылка); ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьРедактированиеВыполненоПомещение", ЭтотОбъект); - ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище(ОписаниеОповещения,ДанныеФайла, УникальныйИдентификатор); + ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(ОписаниеОповещения, ДанныеФайла.Ссылка, УникальныйИдентификатор); + ПараметрыОбновленияФайла.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + Если Не ВозможностьСоздаватьВерсииФайлов Тогда + ПараметрыОбновленияФайла.Вставить("СоздатьНовуюВерсию", Ложь); + КонецЕсли; + ПараметрыОбновленияФайла.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; + ПараметрыОбновленияФайла.Редактирует = ДанныеФайла.Редактирует; + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); + ОбновитьОбъект(); КонецПроцедуры &НаКлиенте Процедура ЗакончитьРедактированиеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт - Если ИнформацияОФайле <> Неопределено Тогда - ПоместитьФайлВХранилищеИОсвободить(ИнформацияОФайле); - ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); - КонецЕсли; - + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); КонецПроцедуры @@ -616,43 +705,66 @@ ОсвободитьФайл(); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "РедактированиеОтменено"), ЭтотОбъект.Объект.Ссылка); КонецПроцедуры +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + Если Модифицированность Тогда + ЗаписатьФайл(); + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением(Обработчик, + ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + +КонецПроцедуры + +&НаСервере +Процедура СвойстваВыполнитьОтложеннуюИнициализацию() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьЗависимостиДополнительныхРеквизитов() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Свойства + #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Продолжение обработчика события ПриОткрытии. &НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт +Процедура ОткрытьФормуЭлементаСправочникаФайлаОбработчикОжидания() - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - - ФайлРедактируется = ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) - И ЭтотОбъект.Объект.Редактирует = ТекущийПользователь; - - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура РедактироватьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - - Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); - Иначе - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); - ЗанятьФайлДляРедактированияСервер(); - ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); - КонецЕсли; - КонецЕсли; + СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаЭлемента", ПараметрыФормыЭлементаСправочникаФайлы); КонецПроцедуры @@ -669,11 +781,11 @@ КонецПроцедуры &НаСервереБезКонтекста -Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл, +Функция ДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) - Возврат ПрисоединенныеФайлы.ПолучитьДанныеФайла( + Возврат РаботаСФайлами.ДанныеФайла( ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные); КонецФункции @@ -693,12 +805,26 @@ Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ФайлРедактируется = ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) И ЭтотОбъект.Объект.Редактирует = ТекущийПользователь; - ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт + + Если Результат <> Неопределено И Результат = "Продолжить" Тогда + ФайлРедактируется = ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + И ЭтотОбъект.Объект.Редактирует = ТекущийПользователь; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); + КонецЕсли; КонецПроцедуры @@ -706,123 +832,24 @@ Процедура ОткрытьКаталогФайла() Если ЭтоНовый() - ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - - ПрисоединенныеФайлыСлужебныйКлиент.ОткрытьКаталогСФайлом(ДанныеФайла); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ЭтотОбъект.Объект.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); КонецПроцедуры &НаКлиенте Процедура СохранитьКак() - Если ЭтоНовый() - ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда + Если ЭтоНовый() Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - - ПрисоединенныеФайлыКлиент.СохранитьФайлКак(ДанныеФайла); - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьДвоичныеДанныеФайлаНаСервере(ИнформацияОФайле) - - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ПрисоединенныеФайлыСлужебный.ОбновитьПрисоединенныйФайлОбъект(ЗаписываемыйОбъект, ИнформацияОФайле); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьКнопкиИзмененияНевидимыми(Элементы) - - ИменаКоманд = ПолучитьИменаКомандИзмененияОбъекта(); - - Для каждого ЭлементФормы Из Элементы Цикл - - Если ТипЗнч(ЭлементФормы) <> Тип("КнопкаФормы") Тогда - Продолжить; - КонецЕсли; - - Если ИменаКоманд.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено Тогда - ЭлементФормы.Видимость = Ложь; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСписокШифрования() - - СертификатыШифрования.Очистить(); - - Если ЭтотОбъект.Объект.Зашифрован Тогда - Для Каждого СтруктураСертификата Из РеквизитФормыВЗначение("Объект").СертификатыШифрования Цикл - - НоваяСтрока = СертификатыШифрования.Добавить(); - НоваяСтрока.Представление = СтруктураСертификата.Представление; - НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; - - ДвоичныеДанныеСертификата = СтруктураСертификата.Сертификат.Получить(); - Если ДвоичныеДанныеСертификата <> Неопределено Тогда - - НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( - ДвоичныеДанныеСертификата, УникальныйИдентификатор); - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - ТекстЗаголовка = НСтр("ru = 'Разрешено расшифровывать'"); - - Если СертификатыШифрования.Количество() <> 0 Тогда - ТекстЗаголовка =ТекстЗаголовка + " (" + Формат(СертификатыШифрования.Количество(), "ЧГ=") + ")"; - КонецЕсли; - - Элементы.ГруппаСертификатыШифрования.Заголовок = ТекстЗаголовка; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСписокПодписей() - - ЭлектронныеПодписи.Очистить(); - - Если ЭтотОбъект.Объект.ПодписанЭП Тогда - - Для Каждого ЭлементЭП Из РеквизитФормыВЗначение("Объект").ЭлектронныеПодписи Цикл - - НоваяСтрока = ЭлектронныеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементЭП); - НоваяСтрока.Объект = ЭтотОбъект.Объект.Ссылка; - НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище( - ЭлементЭП.Подпись.Получить(), УникальныйИдентификатор); - - ФайловыеФункцииСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(НоваяСтрока); - - ДвоичныеДанныеСертификата = ЭлементЭП.Сертификат.Получить(); - Если ДвоичныеДанныеСертификата <> Неопределено Тогда - - НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( - ДвоичныеДанныеСертификата, УникальныйИдентификатор); - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - ТекстЗаголовка = НСтр("ru = 'Электронные подписи'"); - - Если ЭлектронныеПодписи.Количество() <> 0 Тогда - ТекстЗаголовка = ТекстЗаголовка + " (" + Строка(ЭлектронныеПодписи.Количество()) + ")"; - КонецЕсли; - - Элементы.ГруппаЭлектронныеПодписи.Заголовок = ТекстЗаголовка; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ЭтотОбъект.Объект.Ссылка,, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры @@ -838,7 +865,7 @@ Для Каждого НомерВыделеннойСтроки Из Элементы.ЭлектронныеПодписи.ВыделенныеСтроки Цикл УдаляемаяСтрока = ЭлектронныеПодписи.НайтиПоИдентификатору(НомерВыделеннойСтроки); - ИндексыСтрок.Добавить(ЭлектронныеПодписи.Индекс(УдаляемаяСтрока)); + ИндексыСтрок.Добавить(УдаляемаяСтрока.ПорядковыйНомер); КонецЦикла; ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); @@ -846,18 +873,7 @@ ЗаписатьФайл(ЗаписываемыйОбъект); ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - ЗаполнитьСписокПодписей(); - - УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); - -КонецПроцедуры - -&НаСервере -Процедура РасшифроватьСервер(РасшифрованныеДанные) - - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ПрисоединенныеФайлыСлужебный.Расшифровать(ЗаписываемыйОбъект, РасшифрованныеДанные); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); + РаботаСФайламиСлужебный.ЗаполнитьСписокПодписей(ЭтотОбъект); УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); @@ -866,16 +882,16 @@ &НаКлиентеНаСервереБезКонтекста Процедура УстановитьДоступностьКнопок(Форма, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке) - ФайлРедактируется = ЗначениеЗаполнено(Форма.Объект.Редактирует) Или ФайлРедактируетсяВОблаке; - ФайлРедактируетТекущийПользователь = Форма.Объект.Редактирует = ТекущийПользователь; + ФайлРедактируется = ЗначениеЗаполнено(Форма["Объект"].Редактирует) Или ФайлРедактируетсяВОблаке; + ФайлРедактируетТекущийПользователь = Форма["Объект"].Редактирует = ТекущийПользователь; ИменаВсехКоманд = ПолучитьИменаКомандФормы(); ИменаКоманд = ПолучитьДоступныеКоманды( ФайлРедактируется, ФайлРедактируетТекущийПользователь, - Форма.Объект.ПодписанЭП, - Форма.Объект.Зашифрован, - Форма.Объект.Ссылка.Пустая(), + Форма["Объект"].ПодписанЭП, + Форма["Объект"].Зашифрован, + Форма["Объект"].Ссылка.Пустая(), ФайлРедактируетсяВОблаке); Если Форма.ЭлектронныеПодписи.Количество() = 0 Тогда @@ -942,7 +958,7 @@ ИменаКоманд = Новый Массив; - ИменаКоманд.Добавить("ПодписатьФайлЭП"); + ИменаКоманд.Добавить("Подписать"); ИменаКоманд.Добавить("ДобавитьЭПИзФайла"); ИменаКоманд.Добавить("УдалитьЭП"); @@ -950,6 +966,7 @@ ИменаКоманд.Добавить("Редактировать"); ИменаКоманд.Добавить("ЗакончитьРедактирование"); ИменаКоманд.Добавить("Освободить"); + ИменаКоманд.Добавить("СохранитьИзменения"); ИменаКоманд.Добавить("Зашифровать"); ИменаКоманд.Добавить("Расшифровать"); @@ -1000,6 +1017,7 @@ Иначе УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьИзменения"); КонецЕсли; Если ФайлПодписан Тогда @@ -1031,7 +1049,7 @@ УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьФайлДляПросмотра"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьКак"); - УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "Подписать"); Иначе УдалитьКомандуИзМассива(ИменаКоманд, "Расшифровать"); КонецЕсли; @@ -1048,7 +1066,7 @@ &НаКлиентеНаСервереБезКонтекста Процедура УдалитьКомандыЭП(Знач ИменаКоманд) - УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "Подписать"); УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭПИзФайла"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); @@ -1068,45 +1086,60 @@ КонецПроцедуры &НаСервере -Процедура ЗашифроватьСервер(ЗашифрованныеДанные, МассивОтпечатков) +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, + МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога) - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); + Зашифровать = Истина; - ПрисоединенныеФайлыСлужебный.Зашифровать(ЗаписываемыйОбъект, ЗашифрованныеДанные, МассивОтпечатков); + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ЭтотОбъект.Объект.Ссылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + + ОбновитьИнформациюОСертификатахОбъекта(); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); +КонецПроцедуры + +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога) - УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ЭтотОбъект.Объект.Ссылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + + ОбновитьИнформациюОСертификатахОбъекта(); КонецПроцедуры &НаСервере -Процедура ЗанятьФайлДляРедактированияСервер() +Процедура ОбновитьОбъект() - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(ЗаписываемыйОбъект); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); + ЗначениеВРеквизитФормы(ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(), "Объект"); УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); КонецПроцедуры -&НаСервере -Процедура ПоместитьФайлВХранилищеИОсвободить(Знач ИнформацияОФайле) - - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - - ИнформацияОФайле.Вставить("Редактирует", Справочники.Пользователи.ПустаяСсылка()); - ПрисоединенныеФайлыСлужебный.ОбновитьПрисоединенныйФайлОбъект(ЗаписываемыйОбъект, ИнформацияОФайле); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - -КонецПроцедуры - &НаСервере Процедура ОсвободитьФайл() ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ПрисоединенныеФайлыСлужебный.ОсвободитьФайл(ЗаписываемыйОбъект); + РаботаСФайламиСлужебный.ОсвободитьФайл(ЗаписываемыйОбъект); ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); КонецПроцедуры @@ -1121,7 +1154,7 @@ КонецЕсли; Попытка - ФайловыеФункцииСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); + РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю( КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); @@ -1136,13 +1169,21 @@ ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", - Новый Структура("ЭтоНовый", ФайлБылСоздан), + Оповестить("Запись_Файл", + Новый Структура("ЭтоНовый, Событие", ФайлБылСоздан, "Запись"), ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКомандСпискаЭП(); УстановитьДоступностьКомандСпискаШифрования(); + Если НаименованиеДоЗаписи <> ЭтотОбъект.Объект.Наименование Тогда + // в кэше обновить файл + РаботаСФайламиСлужебныйКлиент.ОбновитьИнформациюВРабочемКаталоге( + ЭтотОбъект.Объект.Ссылка, ЭтотОбъект.Объект.Наименование); + + НаименованиеДоЗаписи = ЭтотОбъект.Объект.Наименование; + КонецЕсли; + Возврат Истина; КонецФункции @@ -1152,8 +1193,8 @@ ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); - ЗаполнитьСписокПодписей(); - ЗаполнитьСписокШифрования(); + РаботаСФайламиСлужебный.ЗаполнитьСписокПодписей(ЭтотОбъект); + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); КонецПроцедуры @@ -1166,45 +1207,59 @@ ЗаписываемыйОбъект = ПараметрОбъект; КонецЕсли; - ТранзакцияАктивна = Ложь; - Попытка - Если ЗначениеЗаполнено(ЗначениеКопирования) Тогда - ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(ЗначениеКопирования); + Если ЗначениеЗаполнено(ЗначениеКопирования) Тогда + НачатьТранзакцию(); + Попытка + ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ЗначениеКопирования); - Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - - НачатьТранзакцию(); - ТранзакцияАктивна = Истина; + Если РаботаСФайламиСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда СсылкаНового = Справочники[ИмяСправочника].ПолучитьСсылку(); ЗаписываемыйОбъект.УстановитьСсылкуНового(СсылкаНового); - ПрисоединенныеФайлыСлужебный.ЗаписатьФайлВИнформационнуюБазу(СсылкаНового, ДвоичныеДанные); + РаботаСФайламиСлужебный.ЗаписатьФайлВИнформационнуюБазу(СсылкаНового, ДвоичныеДанные); ЗаписываемыйОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; Иначе - СведенияОФайле = ФайловыеФункцииСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ЗаписываемыйОбъект.ДатаМодификацииУниверсальная, - ЗаписываемыйОбъект.Наименование, ЗаписываемыйОбъект.Расширение); - ЗаписываемыйОбъект.Том = СведенияОФайле.Том; - ЗаписываемыйОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; + СведенияОФайле = РаботаСФайламиСлужебный.ДобавитьФайлВТом(ДвоичныеДанные, ЗаписываемыйОбъект.ДатаМодификацииУниверсальная, + ЗаписываемыйОбъект.Наименование, ЗаписываемыйОбъект.Расширение); + ЗаписываемыйОбъект.Том = СведенияОФайле.Том; + ЗаписываемыйОбъект.ПутьКФайлу = СведенияОФайле.ПутьКФайлу; ЗаписываемыйОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; КонецЕсли; - КонецЕсли; - - ФайловыеФункцииСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, - ЗаписываемыйОбъект.ЭлектронныеПодписи); - - ЗаписываемыйОбъект.Записать(); - - Если ТранзакцияАктивна Тогда + + Если ДоступнаЭлектроннаяПодпись Тогда + РаботаСФайламиСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, ЗначениеКопирования); + КонецЕсли; + + ЗаписываемыйОбъект.Записать(); + + Если ДоступнаЭлектроннаяПодпись И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + + СертификатыИсточника = МодульЭлектроннаяПодпись.СертификатыШифрования(ЗначениеКопирования); + МодульЭлектроннаяПодпись.ЗаписатьСертификатыШифрования(ЗаписываемыйОбъект, СертификатыИсточника); + + УстановленныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(ЗначениеКопирования); + МодульЭлектроннаяПодпись.ДобавитьПодпись(ЗаписываемыйОбъект, УстановленныеПодписи); + КонецЕсли; + ЗафиксироватьТранзакцию(); - КонецЕсли; - Исключение - Если ТранзакцияАктивна Тогда + Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка записи присоединенного файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - + ВызватьИсключение; + КонецПопытки; + Иначе + НачатьТранзакцию(); + Попытка + Если ДоступнаЭлектроннаяПодпись Тогда + РаботаСФайламиСлужебный.ПеренестиРезультатыПроверкиПодписей(ЭлектронныеПодписи, ЗаписываемыйОбъект.Ссылка); + КонецЕсли; + ЗаписываемыйОбъект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + Если ПараметрОбъект = Неопределено Тогда ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); КонецЕсли; @@ -1218,47 +1273,6 @@ КонецФункции -&НаСервере -Процедура НастроитьОбъектФормы(Знач НовыйОбъект) - - ТипНовогоОбъекта = Новый Массив; - ТипНовогоОбъекта.Добавить(ТипЗнч(НовыйОбъект)); - - НовыйРеквизит = Новый РеквизитФормы("Объект", Новый ОписаниеТипов(ТипНовогоОбъекта)); - НовыйРеквизит.СохраняемыеДанные = Истина; - - ДобавляемыеРеквизиты = Новый Массив; - ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); - - ИзменитьРеквизиты(ДобавляемыеРеквизиты); - - ЗначениеВРеквизитФормы(НовыйОбъект, "Объект"); - - Для каждого Элемент Из Элементы Цикл - Если ТипЗнч(Элемент) = Тип("ПолеФормы") - И СтрНачинаетсяС(Элемент.ПутьКДанным, "ОбъектПрототип[0].") - И СтрЗаканчиваетсяНа(Элемент.Имя, "0") Тогда - - ИмяЭлемента = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) -1); - Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда - Продолжить; - КонецЕсли; - - НовыйЭлемент = Элементы.Вставить(ИмяЭлемента, ТипЗнч(Элемент), Элемент.Родитель, Элемент); - НовыйЭлемент.ПутьКДанным = "Объект." + Сред(Элемент.ПутьКДанным, СтрДлина("ОбъектПрототип[0].") + 1); - ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, , - "Имя, ПутьКДанным, ВыделенныйТекст, СвязьПоТипу"); - - Элемент.Видимость = Ложь; - КонецЕсли; - КонецЦикла; - - Если Не НовыйОбъект.ЭтоНовый() Тогда - НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(НовыйОбъект); - КонецЕсли; - -КонецПроцедуры - &НаСервереБезКонтекста Процедура РазблокироватьОбъект(Знач Ссылка, Знач УникальныйИдентификатор) @@ -1273,11 +1287,9 @@ &НаКлиенте Процедура ПриПолученииПодписи(ПараметрыВыполнения, Контекст) Экспорт - ДобавитьПодписьКФайлуНаСервере(ПараметрыВыполнения.ОписаниеДанных.СвойстваПодписи); + ОбновитьИнформациюОПодписиОбъекта(); УстановитьДоступностьКомандСпискаЭП(); - ВыполнитьОбработкуОповещения(ПараметрыВыполнения.Оповещение, Новый Структура); - КонецПроцедуры // Продолжение процедуры ПодписатьФайлЭП. @@ -1287,22 +1299,36 @@ &НаКлиенте Процедура ПриПолученииПодписей(ПараметрыВыполнения, Контекст) Экспорт - ДобавитьПодписьКФайлуНаСервере(ПараметрыВыполнения.ОписаниеДанных.Подписи); + ОбновитьИнформациюОПодписиОбъекта(); УстановитьДоступностьКомандСпискаЭП(); - ВыполнитьОбработкуОповещения(ПараметрыВыполнения.Оповещение, Новый Структура); - КонецПроцедуры &НаСервере -Процедура ДобавитьПодписьКФайлуНаСервере(СвойстваПодписи) +Процедура ОбновитьИнформациюОПодписиОбъекта() - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ПрисоединенныеФайлы.ДобавитьПодписьКФайлу(ЗаписываемыйОбъект, СвойстваПодписи, УникальныйИдентификатор); - ЗаписатьФайл(ЗаписываемыйОбъект); - ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - ЗаполнитьСписокПодписей(); + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + РаботаСФайламиСлужебный.ЗаполнитьСписокПодписей(ЭтотОбъект); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИнформациюОСертификатахОбъекта() + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); + РаботаСФайламиСлужебный.ЗаполнитьСписокШифрования(ЭтотОбъект); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьИУстановитьДоступностьЭлементовФормы(Результат, ДополнительныеПараметры) Экспорт + + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь, ФайлРедактируетсяВОблаке); КонецПроцедуры @@ -1443,7 +1469,6 @@ КонецПроцедуры - &НаКлиенте Функция ЭтоНовый() @@ -1452,15 +1477,17 @@ КонецФункции &НаКлиенте -Процедура ОбновитьИзФайлаНаДискеЗавершение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт - - Если ИнформацияОФайле = Неопределено Тогда - Возврат; - КонецЕсли; - - ОбновитьДвоичныеДанныеФайлаНаСервере(ИнформацияОФайле); +Процедура ОбновитьИзФайлаНаДискеЗавершение(Результат, ПараметрыВыполнения) Экспорт + ОбновитьДанныеОбъектаНаСервере(); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура, ЭтотОбъект.Объект.Ссылка); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьДанныеОбъектаНаСервере() + + ЗначениеВРеквизитФормы(ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(), "Объект"); + ДатаМодификации = МестноеВремя(ЭтотОбъект.Объект.ДатаМодификацииУниверсальная); КонецПроцедуры @@ -1474,7 +1501,21 @@ &НаСервере Процедура ПриИзмененияИспользованияПодписанияИлиШифрованияНаСервере() - ФайловыеФункцииСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект, Ложь); + РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект, Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппаДополнительныеДанныеСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") + И ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты" + И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда + + СвойстваВыполнитьОтложеннуюИнициализацию(); + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form similarity index 97% rename from SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form index 575088d2c..c3e214f1c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form @@ -51,12 +51,8 @@ <key>ru</key> - <value>Группа текст и команды</value> + <value>Текст и команды</value> - - ru - Группа текст и команды - ГруппаТекстИКомандыExtendedTooltip 74 @@ -439,7 +435,7 @@ 2 - CatalogRef.Файлы + DefinedType.ПрисоединенныйФайл true @@ -498,24 +494,6 @@ true - - КодФайла - - <key>ru</key> - <value>Код файла</value> - - 7 - - String - - - - true - - - true - - КодировкаТекстаФайла diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Help/ru.html similarity index 78% rename from SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Help/ru.html index bd2ca70bc..bf9e00e22 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Help/ru.html @@ -1,19 +1,19 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.9600.18427"></meta></head><body> <p> <style>A:link { - TEXT-DECORATION: none; COLOR: #006699 + COLOR: #006699; TEXT-DECORATION: none } A:visited { - TEXT-DECORATION: none; COLOR: #006699 + COLOR: #006699; TEXT-DECORATION: none } A:hover { - TEXT-DECORATION: underline; COLOR: #006699 + COLOR: #006699; TEXT-DECORATION: underline } H2 { - FONT-SIZE: 130%; FONT-FAMILY: Verdana; BORDER-BOTTOM: sienna 1px solid; FONT-WEIGHT: normal; COLOR: #a3611f; PADDING-BOTTOM: 2px + BORDER-BOTTOM: sienna 1px solid; PADDING-BOTTOM: 2px; FONT-FAMILY: Verdana; COLOR: #a3611f; FONT-SIZE: 130%; FONT-WEIGHT: normal } H3 { - FONT-SIZE: 120%; MARGIN-TOP: 5px + MARGIN-TOP: 5px; FONT-SIZE: 120% } P.Usual { MARGIN-TOP: 10px @@ -37,11 +37,10 @@ UL { </li><li> <div> <div>Принцип работы встроенного редактора текстовых файлов такой же, как и у внешнего приложения. Файл копируется на локальный компьютер и помечается как занятый в информационной базе. До тех пор пока вы не нажмете <strong>Еще - Закончить редактирование</strong>,<strong> </strong>созданная версия файла не будет доступна другим пользователям.<strong> </strong></div></div> -</li><li>После окончания редактирования файла нажмите <strong>Еще - Закончить редактирование</strong>, для того чтобы снять с него пометку занятости для редактирования. В зависимости от настроек команда также сохраняет версию файла или обновляет файл в хранилище. По умолчанию создается новая <a href="Catalog.ВерсииФайлов.Form.ФормаЭлемента/Help"><u><font color="#0000ff">версия файла</font></u></a>. Для изменения настройки при <a href="Catalog.Файлы.Form.ФормаВозвратаФайла/Help"><u><font color="#0000ff">создании версии</font></u></a> снимите соответствующий флажок. </li></ul><h3>Просмотр задач</h3> +</li><li>После окончания редактирования файла нажмите <strong>Еще - Закончить редактирование</strong>, для того чтобы снять с него пометку занятости для редактирования. В зависимости от настроек команда также сохраняет версию файла или обновляет файл в хранилище. По умолчанию создается новая <a href="DataProcessor.РаботаСФайлами.Form.ВерсияПрисоединенногоФайла/Help"><u><font color="#0000ff">версия файла</font></u></a>. Для изменения настройки при <a href="DataProcessor.РаботаСФайлами.Form.ФормаВозвратаФайла/Help"><u><font color="#0000ff">создании версии</font></u></a> снимите соответствующий флажок. </li></ul><h3>Просмотр задач</h3> <ul><li>С помощью команды <strong>Еще - Задачи</strong> можно просмотреть <a href="Task.ЗадачаИсполнителя.Form.ЗадачиПоПредмету/Help"><u><font color="#0000ff">список задач</font></u></a>, которые были созданы на основании данного файла.</li></ul><h3>Просмотр карточки файла</h3> -<p>Нажмите <strong>Еще - Открыть карточку</strong>, для того чтобы просмотреть <a href="Catalog.Файлы.Form.ФормаЭлемента/Help"><u><font color="#0000ff">сведения о файле</font></u></a>.</p> -<h3>Сравнение версий</h3> -<ul><li>Нажмите <strong>Еще - Показать отличия</strong>, для того чтобы произвести <a href="Catalog.ВерсииФайлов.Form.ВыборСпособаСравненияВерсий/Help"><u><font color="#0000ff">сравнение версий файлов</font></u></a>. Если программа для сравнения версий не была выбрана заранее в персональных настройках программы (вкладка <strong>Работа с файлами</strong>), предлагается ее выбрать. Доступны Microsoft Word или OpenOffice.org Writer.</li></ul><h3>Сохранение файла</h3> +<ul><li>Нажмите <strong>Еще - Открыть карточку</strong>, для того чтобы просмотреть <a href="Catalog.Файлы.Form.ФормаЭлемента/Help"><u><font color="#0000ff">сведения о файле</font></u></a>.</li></ul><h3>Сравнение версий</h3> +<ul><li>Нажмите <strong>Еще - Показать отличия</strong>, для того чтобы произвести <a href="DataProcessor.РаботаСФайлами.Form.ВыборСпособаСравненияВерсий/Help"><u><font color="#0000ff">сравнение версий файлов</font></u></a>. Если программа для сравнения версий не была выбрана заранее в персональных настройках программы (вкладка <strong>Работа с файлами</strong>), предлагается ее выбрать. Доступны Microsoft Word или OpenOffice.org Writer.</li></ul><h3>Сохранение файла</h3> <ul><li>Нажмите <strong>Еще - Сохранить как</strong>, для того чтобы сохранить файл в указанный каталог на жестком или сетевом диске. </li></ul><h3>Открытие файла в стандартной программе</h3> <ul><li>Нажмите <strong>Еще -</strong> <strong>Открыть стандартным приложением</strong>, для того чтобы перейти во внешнее приложение (<strong>Блокнот Windows</strong>) для редактирования файла. </li><li>Если необходимо, чтобы текстовые файлы c определенными расширениями по умолчанию открывались во внешнем приложении, внесите изменения в персональные настройки программы. Для этого: @@ -53,6 +52,6 @@ UL { </li><li> <div>KOI8-R (Кириллица KOI8-R), </div> </li><li> -<div>Windows-1251 (Кириллица Windows. </div></li></ul></li><li>Если после открытия текстового файла вместо текста виден набор бессмысленных знаков, выполните команду <strong>Еще - Изменить кодировку</strong>, выберите другую кодировку из <a href="Catalog.Файлы.Form.ВыборКодировки/Help"><u><font color="#0000ff">списка</font></u></a>.</li></ul><h3>См. также: </h3> +<div>Windows-1251 (Кириллица Windows. </div></li></ul></li><li>Если после открытия текстового файла вместо текста виден набор бессмысленных знаков, выполните команду <strong>Еще - Изменить кодировку</strong>, выберите другую кодировку из <a href="DataProcessor.РаботаСФайлами.Form.ВыборКодировки/Help"><u><font color="#0000ff">списка</font></u></a>.</li></ul><h3>См. также: </h3> <ul><li> <div><a href="Catalog.Файлы/Help"><u><font color="#0000ff">Общие</font><font color="#0000ff"> сведения о файлах</font></u></a>. </div></li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Module.bsl similarity index 85% rename from SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Module.bsl index 1e2f353ab..f2c3b80eb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Module.bsl @@ -12,9 +12,7 @@ ДанныеФайла = Параметры.ДанныеФайла; ИмяОткрываемогоФайла = Параметры.ИмяОткрываемогоФайла; - КодФайла = Файл.Код; - - Если ДанныеФайла.РедактируетТекущийПользователь Тогда + Если ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда РежимРедактирования = Истина; КонецЕсли; @@ -65,8 +63,6 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - КлючУникальности = КодФайла; - КодировкаТекстаДляЧтения = КодировкаТекстаФайла; Если Не ЗначениеЗаполнено(КодировкаТекстаДляЧтения) Тогда КодировкаТекстаДляЧтения = Неопределено; @@ -79,18 +75,25 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ФайлРедактировался" И Источник = Файл Тогда + Если ИмяСобытия = "Запись_Файл" + И Параметр.Свойство("Событие") + И Параметр.Событие = "ФайлРедактировался" + И Источник = Файл Тогда + РежимРедактирования = Истина; УстановитьДоступностьКоманд(); КонецЕсли; - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ДанныеФайлаИзменены" И Источник = Файл Тогда + Если ИмяСобытия = "Запись_Файл" + И Параметр.Свойство("Событие") + И Параметр.Событие = "ДанныеФайлаИзменены" + И Источник = Файл Тогда ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(Файл); РежимРедактирования = Ложь; - Если ДанныеФайла.РедактируетТекущийПользователь Тогда + Если ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда РежимРедактирования = Истина; КонецЕсли; @@ -123,12 +126,21 @@ Возврат; КонецЕсли; - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru ='Файл ""%1"" был изменен.'"), + ОбработчикРезультата = Новый ОписаниеОповещения("ПередЗакрытиемПослеОтветаНаВопросПриВыходеИзТекстовогоРедактора", ЭтотОбъект); + ТекстНапоминания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru ='Файл ""%1"" был изменен. + |Сохранить изменения?'"), ИмяИРасширение); - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТекстВопроса", ТекстВопроса); - Обработчик = Новый ОписаниеОповещения("ПередЗакрытиемПослеОтветаНаВопросПриВыходеИзТекстовогоРедактора", ЭтотОбъект); - ОткрытьФорму("Справочник.Файлы.Форма.ВопросПриВыходеИзТекстовогоРедактора", ПараметрыФормы, ЭтотОбъект, , , , Обработчик); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Сохранить", НСтр("ru = 'Сохранить'")); + Кнопки.Добавить("НеСохранять", НСтр("ru = 'Не сохранять'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + ПараметрыНапоминания = Новый Структура; + ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); + ПараметрыНапоминания.Вставить("Заголовок", НСтр("ru = 'Внимание'")); + ПараметрыНапоминания.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Ложь); + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( + ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); КонецПроцедуры @@ -162,7 +174,7 @@ Текст.Записать(ВыбранноеПолноеИмяФайла, КодировкаТекстаДляЗаписи); - Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыбранноеПолноеИмяФайла); + ПоказатьОповещениеПользователя(НСтр("ru = 'Файл успешно сохранен'"), , ВыбранноеПолноеИмяФайла); КонецЕсли; @@ -252,7 +264,7 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); Обработчик = Новый ОписаниеОповещения("ВыбратьКодировкуЗавершение", ЭтотОбъект); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект, , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект, , , , Обработчик); КонецПроцедуры #КонецОбласти @@ -262,7 +274,7 @@ &НаКлиенте Процедура ПередЗакрытиемПослеОтветаНаВопросПриВыходеИзТекстовогоРедактора(Результат, ПараметрыВыполнения) Экспорт - Если Результат = "СохранитьИЗакончитьРедактирование" Тогда + Если Результат.Значение = "Сохранить" Тогда ЗаписатьТекст(); ПараметрыОбработчика = Новый Структура; @@ -272,13 +284,7 @@ ПараметрыОбновленияФайла.Кодировка = КодировкаТекстаФайла; РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); - ИначеЕсли Результат = "СохранитьИзменения" Тогда - - ЗаписатьТекст(); - Модифицированность = Ложь; - Закрыть(); - - ИначеЕсли Результат = "НеСохранять" Тогда + ИначеЕсли Результат.Значение = "НеСохранять" Тогда Модифицированность = Ложь; Закрыть(); @@ -366,12 +372,12 @@ &НаКлиенте Процедура СравнениеВерсийАвтомат(Результат, ПараметрыВыполнения) Экспорт Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; // Первый вызов - еще не инициализирована настройка. Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.ВерсииФайлов.Форма.ВыборСпособаСравненияВерсий", , ЭтотОбъект, , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСпособаСравненияВерсий", , ЭтотОбъект, , , , Обработчик); ПараметрыВыполнения.ТекущийШаг = 1.1; Возврат; КонецЕсли; @@ -380,7 +386,7 @@ Если Результат <> КодВозвратаДиалога.ОК Тогда Возврат; КонецЕсли; - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда Возврат; @@ -394,7 +400,7 @@ // Сохранение файла для левой части. Если ДанныеФайла.ТекущаяВерсия = ДанныеФайла.Версия Тогда - ДанныеФайлаСлева = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Файл, УникальныйИдентификатор); + ДанныеФайлаСлева = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Файл, , УникальныйИдентификатор); АдресФайлаСлева = ДанныеФайлаСлева.НавигационнаяСсылкаТекущейВерсии; Иначе АдресФайлаСлева = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( @@ -408,7 +414,7 @@ КонецЕсли; // Сравнение. - РаботаСФайламиСлужебныйКлиент.СравнитьФайлы( + РаботаСФайламиСлужебныйКлиент.ВыполнитьСравнениеФайлов( ПараметрыВыполнения.ПолноеИмяФайлаСлева, ИмяОткрываемогоФайла, ПараметрыВыполнения.СпособСравненияВерсийФайлов); diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form similarity index 91% rename from SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form index f802a3a22..78807d9e6 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form @@ -41,7 +41,7 @@ <name>КоманднаяПанель</name> <id>127</id> <items xsi:type="form:Button"> - <name>ФормаОткрыть</name> + <name>ФормаОткрытьФайл</name> <id>53</id> <visible>true</visible> <enabled>true</enabled> @@ -50,7 +50,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ФормаОткрытьРасширеннаяПодсказка</name> + <name>ФормаОткрытьФайлРасширеннаяПодсказка</name> <id>74</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -94,7 +94,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ФормаИзменить</name> + <name>ФормаОткрытьСвойстваФайла</name> <id>20</id> <title> <key>ru</key> @@ -107,7 +107,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ФормаИзменитьРасширеннаяПодсказка</name> + <name>ФормаОткрытьСвойстваФайлаРасширеннаяПодсказка</name> <id>76</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -116,7 +116,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Item.Список.StandardCommand.Change</commandName> + <commandName>Form.Command.ОткрытьСвойстваФайла</commandName> <buttonImportance>Normal</buttonImportance> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -160,6 +160,10 @@ <items xsi:type="form:Table"> <name>Список</name> <id>6</id> + <title> + <key>ru</key> + <value>Список</value> + true true @@ -173,7 +177,7 @@ None Refresh - Группа + ГруппаНаименованиеИОписание 26 СписокИндексКартинки @@ -314,8 +318,12 @@ true + + <key>ru</key> + <value>Наименование и описание</value> + - ГруппаExtendedTooltip + ГруппаНаименованиеИОписаниеРасширеннаяПодсказка 88 Label true @@ -420,6 +428,10 @@ СписокСсылка 98 + + <key>ru</key> + <value>Ссылка</value> + true true @@ -472,6 +484,10 @@ OnActivateRow СписокПриАктивизацииСтроки + + BeforeRowChange + СписокПередНачаломИзменения + СписокСтрокаПоиска 129 @@ -557,7 +573,7 @@ СписокКонтекстноеМеню 2 - СписокКонтекстноеМенюИзменить + СписокКонтекстноеМенюОткрытьСвойстваФайла 109 <key>ru</key> @@ -570,7 +586,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюОткрытьСвойстваФайлаРасширеннаяПодсказка</name> <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -579,7 +595,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Item.Список.StandardCommand.Change</commandName> + <commandName>Form.Command.ОткрытьСвойстваФайла</commandName> <buttonImportance>Normal</buttonImportance> <representation>PictureAndText</representation> <autoMaxWidth>true</autoMaxWidth> @@ -824,10 +840,6 @@ <key>ru</key> <value>Список контекстное меню группа команд дополнительные</value> - - ru - Список контекстное меню группа команд дополнительные - СписокКонтекстноеМенюГруппаКомандДополнительныеРасширеннаяПодсказка 122 @@ -997,43 +1009,6 @@ - - СписокКонтекстноеМенюВывестиСписок - 24 - true - true - - true - - false - - СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 85 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - InAdditionalSubmenu - СписокКонтекстноеМенюИзменитьФорму 103 @@ -1086,19 +1061,17 @@ - СписокКонтекстноеМенюОбщаяКомандаДополнительныеСведенияКоманднаяПанель - 123 + СписокКонтекстноеМенюВывестиСписок + 24 true true true - - Items.Список.CurrentData.ВладелецФайла - + false - СписокКонтекстноеМенюОбщаяКомандаДополнительныеСведенияКоманднаяПанельРасширеннаяПодсказка - 124 + СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 85 Label true true @@ -1106,39 +1079,23 @@ Left - CommonCommand.ДополнительныеСведенияКоманднаяПанель - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюКопироватьВБуферОбмена - 107 - true - true - - true - - - СписокКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 108 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.CopyToClipboard + Form.Item.Список.StandardCommand.OutputList Normal Auto true true UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + Auto + InAdditionalSubmenu true @@ -1283,12 +1240,8 @@ <key>ru</key> - <value>Группа командной панели</value> + <value>Командной панели</value> - - ru - Группа командной панели - ГруппаКоманднойПанелиExtendedTooltip 95 @@ -1346,14 +1299,11 @@ true - - Список.Code - Список.Ref - Список.Расширение + Список.ИспользуютсяДополнительныеСведения Список.Редактирует @@ -1367,7 +1317,6 @@
                true
                ВЫБРАТЬ РАЗРЕШЕННЫЕ - Файлы.Код, Файлы.Редактирует, Файлы.ИндексКартинки, Файлы.Наименование, @@ -1375,15 +1324,13 @@ Файлы.Ссылка, Файлы.ХранитьВерсии, Файлы.ВладелецФайла, - Файлы.ТекущаяВерсияРазмер / 1024 КАК ТекущаяВерсияРазмер, - Файлы.ТекущаяВерсияАвтор КАК ТекущаяВерсияАвтор, - Файлы.ТекущаяВерсияРасширение КАК Расширение + Файлы.Размер / 1024 КАК ТекущаяВерсияРазмер, + Файлы.Автор КАК ТекущаяВерсияАвтор, + ИСТИНА КАК ИспользуютсяДополнительныеСведения ИЗ Справочник.Файлы КАК Файлы ГДЕ Файлы.Редактирует = &Редактирует - Catalog.Файлы - true true true true @@ -1445,26 +1392,6 @@ true
                - - ЗапрещенныеРасширения - - <key>ru</key> - <value>Запрещенные расширения</value> - - 5 - - ValueList - - - true - - - true - - - - - ОткрытьФайл @@ -1474,7 +1401,7 @@ <id>1</id> <toolTip> <key>ru</key> - <value>Открыть файл для просмотра</value> + <value>Открыть файл</value> </toolTip> <use> <common>true</common> @@ -1691,6 +1618,32 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОткрытьСвойстваФайла</name> + <title> + <key>ru</key> + <value>Открыть свойства файла</value> + + 10 + + ru + Открыть свойства файла + + + true + + F2 + + StdPicture.Change + + + + ОткрытьСвойстваФайла + + + DontUse + Auto + diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Help/ru.html similarity index 88% rename from SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Help/ru.html index be7f2a5cc..d9396f89b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Help/ru.html @@ -1,11 +1,12 @@ -

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

                +

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

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

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

                -
                • Файл - наименование файла -
                • Размещение - папка, в которой находится файл или объект, к которому присоединен файл.

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

                +
                • Файл - наименование файла; +
                • Размещение - папка, в которой находится файл или объект, к которому присоединен файл; +
                • Размер (КБ).

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

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

                См. также:

                • diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl similarity index 60% rename from SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl index 387e39d74..9804343a5 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl @@ -8,7 +8,10 @@ Возврат; КонецЕсли; + НастроитьДинамическийСписок(); + Пользователь = Пользователи.ТекущийПользователь(); + Список.Параметры.УстановитьЗначениеПараметра("Редактирует", Пользователь); ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); @@ -28,8 +31,6 @@ ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( "НастройкиПрограммы", "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", Истина); - - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); КонецПроцедуры @@ -62,20 +63,13 @@ &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ВыбраннаяСтрока", ВыбраннаяСтрока); - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); + Если Элемент.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, УникальныйИдентификатор); + СтандартнаяОбработка = Ложь; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элемент.ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры @@ -88,7 +82,22 @@ &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) - УстановитьДоступностьКоманд(); + ПодключитьОбработчикОжидания("УстановитьДоступностьКоманд", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + РаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка, Истина); КонецПроцедуры @@ -96,127 +105,6 @@ #Область ОбработчикиКомандФормы -&НаКлиенте -Процедура ЗакончитьРедактирование(Команда) - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор); - ПараметрыОбновленияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; - ПараметрыОбновленияФайла.РедактируетТекущийПользователь = Истина; - ПараметрыОбновленияФайла.Редактирует = ТекущиеДанные.Редактирует; - ПараметрыОбновленияФайла.АвторТекущейВерсии = ТекущиеДанные.ТекущаяВерсияАвтор; - РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФайл(Команда) - - Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура Освободить(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Неопределено, СтрокаТаблицы); - ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = Истина; - ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением( - Неопределено, - СтрокаТаблицы, - УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьКаталогФайла(Команда) - - Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(СтрокаТаблицы, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьИзФайлаНаДиске(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(СтрокаТаблицы); - РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьИЗакрыть(Команда) - МассивСтруктур = Новый Массив; - - МассивСтруктур.Добавить(ОписаниеНастройки( - "НастройкиПрограммы", - "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", - ПоказыватьЗанятыеФайлыПриЗавершенииРаботы)); - - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур); - Закрыть(); -КонецПроцедуры - &НаКлиенте Процедура Обновить(Команда) @@ -226,33 +114,141 @@ КонецПроцедуры +&НаКлиенте +Процедура ОткрытьФайл(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСвойстваФайла(Команда) + + СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + РаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( + ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДиске(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ТекущиеДанные.Ссылка); + РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Новый ОписаниеОповещения("ОбновитьСписокРедактируемыхФайлов", ЭтотОбъект), ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла( + Новый ОписаниеОповещения("ОбновитьСписокРедактируемыхФайлов", ЭтотОбъект), ТекущиеДанные.Ссылка); + ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; + ПараметрыОсвобожденияФайла.ФайлРедактируетТекущийПользователь = Истина; + ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением( + Неопределено, + ТекущиеДанные.Ссылка, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения( + ТекущиеДанные.Ссылка, , УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла( + Новый ОписаниеОповещения("ОбновитьСписокРедактируемыхФайлов", ЭтотОбъект), ТекущиеДанные.Ссылка, УникальныйИдентификатор); + ПараметрыОбновленияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; + ПараметрыОбновленияФайла.ФайлРедактируетТекущийПользователь = Истина; + ПараметрыОбновленияФайла.Редактирует = ТекущиеДанные.Редактирует; + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + МассивСтруктур = Новый Массив; + МассивСтруктур.Добавить(ОписаниеНастройки( + "НастройкиПрограммы", + "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", + ПоказыватьЗанятыеФайлыПриЗавершенииРаботы)); + + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, Истина); + Закрыть(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВыбратьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ВыбраннаяСтрока = ДополнительныеПараметры.ВыбраннаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Процедура УстановитьДоступностьКоманд() @@ -261,10 +257,10 @@ Элементы.ФормаЗакончитьРедактирование.Доступность = Доступность; Элементы.СписокКонтекстноеМенюЗакончитьРедактирование.Доступность = Доступность; - Элементы.ФормаОткрыть.Доступность = Доступность; + Элементы.ФормаОткрытьФайл.Доступность = Доступность; Элементы.СписокКонтекстноеМенюОткрыть.Доступность = Доступность; - Элементы.ФормаИзменить.Доступность = Доступность; + Элементы.ФормаОткрытьСвойстваФайла.Доступность = Доступность; Элементы.СписокКонтекстноеМенюСохранитьИзменения.Доступность = Доступность; Элементы.СписокКонтекстноеМенюОткрытьКаталогФайла.Доступность = Доступность; @@ -274,6 +270,7 @@ КонецПроцедуры +&НаКлиенте Функция ОписаниеНастройки(Объект, Настойка, Значение) Элемент = Новый Структура; @@ -285,4 +282,68 @@ КонецФункции +&НаСервере +Процедура НастроитьДинамическийСписок() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТИПЗНАЧЕНИЯ(СведенияОФайлах.Файл) КАК ТипФайла + |ИЗ + | РегистрСведений.СведенияОФайлах КАК СведенияОФайлах + |ГДЕ + | СведенияОФайлах.Редактирует = &Редактирует"; + + Запрос.УстановитьПараметр("Редактирует", Пользователи.ТекущийПользователь()); + + УстановитьПривилегированныйРежим(Истина); + РезультатЗапроса = Запрос.Выполнить(); + МассивТипов = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("ТипФайла"); + УстановитьПривилегированныйРежим(Ложь); + + ТекстЗапроса = ""; + Для Каждого ТипСправочника Из МассивТипов Цикл + МетаданныеСправочника = Метаданные.НайтиПоТипу(ТипСправочника); + Если Не ПравоДоступа("Изменение", МетаданныеСправочника) Тогда + Продолжить; + КонецЕсли; + Если Не СтрЗаканчиваетсяНа(МетаданныеСправочника.Имя, "ВерсииПрисоединенныхФайлов") И МетаданныеСправочника.Имя <> "ВерсииФайлов" Тогда + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | ВЫБРАТЬ РАЗРЕШЕННЫЕ"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + | Файлы.Редактирует, + | Файлы.ИндексКартинки, + | Файлы.Наименование, + | Файлы.Описание, + | Файлы.Ссылка, + | Файлы.ВладелецФайла, + | Файлы.ХранитьВерсии КАК ХранитьВерсии, + | Файлы.Размер / 1024 + |ИЗ + | " + МетаданныеСправочника.ПолноеИмя() + " КАК Файлы + |ГДЕ + | Файлы.Редактирует = &Редактирует" + КонецЕсли; + КонецЦикла; + + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + Список.ТекстЗапроса = ТекстЗапроса; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСписокРедактируемыхФайлов(Результат, ДополнительныеПараметры) Экспорт + Элементы.Список.Обновить(); +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form similarity index 97% rename from SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form index f9298b29f..c41dccf66 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form @@ -90,12 +90,8 @@ <key>ru</key> - <value>Группа сообщение</value> + <value>Сообщение</value> - - ru - Группа сообщение - ГруппаСообщениеExtendedTooltip 23 @@ -203,12 +199,8 @@ <key>ru</key> - <value>Группа файл и кнопка</value> + <value>Файл и кнопка</value> - - ru - Группа файл и кнопка - ГруппаФайлИКнопкаExtendedTooltip 28 @@ -235,12 +227,8 @@ <key>ru</key> - <value>Группа файл</value> + <value>Файл</value> - - ru - Группа файл - ГруппаФайлExtendedTooltip 26 diff --git a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Help/ru.html diff --git a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl similarity index 89% rename from SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl index 65e949eb8..e5e247e28 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl @@ -29,7 +29,7 @@ &НаКлиенте Процедура ОткрытьКаталог(Команда) - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Файл); + РаботаСФайламиСлужебныйКлиент.ОткрытьПроводникСФайлом(Файл); КонецПроцедуры diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 100% rename from SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form similarity index 92% rename from SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form index f880cdff0..5447b42ac 100644 --- a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form @@ -112,7 +112,7 @@ Left - Form.Item.Список.StandardCommand.Change + Form.Command.ОткрытьСвойстваФайла Normal PictureAndText true @@ -192,6 +192,10 @@ Список 6 + + <key>ru</key> + <value>Список</value> + true true @@ -204,7 +208,7 @@ false None - Группа + ГруппаНаименованиеИОписание 26 СписокИндексКартинки @@ -361,8 +365,12 @@ true + + <key>ru</key> + <value>Наименование и описание</value> + - ГруппаExtendedTooltip + ГруппаНаименованиеИОписаниеРасширеннаяПодсказка 90 Label true @@ -384,9 +392,6 @@ true true - - Список.Ref - СписокСсылкаРасширеннаяПодсказка 102 @@ -428,6 +433,10 @@ BeforeAddRow СписокПередНачаломДобавления + + BeforeRowChange + СписокПередНачаломИзменения + СписокСтрокаПоиска 115 @@ -754,43 +763,6 @@ СписокКонтекстноеМенюГруппаКомандДополнительно 60 - - СписокКонтекстноеМенюВывестиСписок - 24 - true - true - - true - - false - - СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 87 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - InAdditionalSubmenu - СписокКонтекстноеМенюИзменитьФорму 107 @@ -839,20 +811,17 @@ - СписокКонтекстноеМенюОбщаяКомандаДополнительныеСведенияКоманднаяПанель - 41 + СписокКонтекстноеМенюВывестиСписок + 24 true true true - - Items.Список.CurrentData.Ref - false - СписокКонтекстноеМенюОбщаяКомандаДополнительныеСведенияКоманднаяПанельРасширеннаяПодсказка - 88 + СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 87 Label true true @@ -860,39 +829,23 @@ Left - CommonCommand.ДополнительныеСведенияКоманднаяПанель - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюКопироватьВБуферОбмена - 109 - true - true - - true - - - СписокКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 110 - Label - true - true - - Left - - - Form.Item.Список.StandardCommand.CopyToClipboard + Form.Item.Список.StandardCommand.OutputList Normal Auto true true UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + Auto + InAdditionalSubmenu true @@ -1106,10 +1059,6 @@ ru Основная командная панель - - ru - Основная командная панель - ОсновнаяКоманднаяПанельExtendedTooltip 96 @@ -1170,7 +1119,7 @@ Список.Ref - Список.Расширение + Список.ИспользуютсяДополнительныеСведения Список.Редактирует @@ -1181,7 +1130,6 @@
                  true
                  ВЫБРАТЬ РАЗРЕШЕННЫЕ - Файлы.Код, Файлы.Редактирует, Файлы.ИндексКартинки, Файлы.Наименование, @@ -1189,13 +1137,11 @@ Файлы.Ссылка, Файлы.ХранитьВерсии, Файлы.ВладелецФайла, - Файлы.ТекущаяВерсияРасширение КАК Расширение + ИСТИНА КАК ИспользуютсяДополнительныеСведения ИЗ Справочник.Файлы КАК Файлы ГДЕ Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) - Catalog.Файлы - true true true true @@ -1255,26 +1201,6 @@ true - - ЗапрещенныеРасширения - - <key>ru</key> - <value>Запрещенные расширения</value> - - 5 - - ValueList - - - true - - - true - - - - - ОткрытьФайл @@ -1471,6 +1397,32 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОткрытьСвойстваФайла</name> + <title> + <key>ru</key> + <value>Открыть свойства файла</value> + + 9 + + ru + Открыть свойства файла + + + true + + F2 + + StdPicture.Change + + + + ОткрытьСвойстваФайла + + + DontUse + Auto + Заголовок diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Help/ru.html similarity index 86% rename from SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Help/ru.html index e163fcc39..bb0c7117a 100644 --- a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Help/ru.html @@ -7,6 +7,6 @@
                • описание - подробные сведения о файле (из карточки файла).

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

                • Просмотреть - открывает файл внешним приложением для редактирования. Также можно открыть файл двойным щелчком мыши или с помощью клавиши Enter.
                • Закончить редактирование - сохраняет версию файла и освобождает файл для других пользователей. -
                • Открыть для просмотра сведения о файле с помощью команды Еще - Открыть карточку (клавиши F2).

                См. также:

                +
              • Открыть карточку - открыть для просмотра сведения о файле.

              См. также:

              \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl similarity index 53% rename from SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl index 71d7fd559..95956f75e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl @@ -12,6 +12,13 @@ СообщениеЗаголовок = Параметры.СообщениеЗаголовок; Заголовок = Параметры.Заголовок; + НастроитьДинамическийСписок(); + + Список.Параметры.УстановитьЗначениеПараметра("Редактирует", Параметры.Редактирует); + Если ЗначениеЗаполнено(Параметры.ВладелецФайла) Тогда + Список.Параметры.УстановитьЗначениеПараметра("ВладелецФайла", Параметры.ВладелецФайла); + КонецЕсли; + Если Не ПустаяСтрока(Параметры.ЗаголовокКнопкиДа) Тогда Элементы.Да.Заголовок = Параметры.ЗаголовокКнопкиДа; КонецЕсли; @@ -20,16 +27,6 @@ Элементы.Нет.Заголовок = Параметры.ЗаголовокКнопкиНет; КонецЕсли; - Если ЗначениеЗаполнено(Параметры.ВладелецФайла) Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "ВладелецФайла", Параметры.ВладелецФайла); - КонецЕсли; - - Если ЗначениеЗаполнено(Параметры.Редактирует) Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "Редактирует", Параметры.Редактирует); - КонецЕсли; - Если Параметры.ЗавершениеРаботыПрограммы Тогда Ответ = Параметры.ЗавершениеРаботыПрограммы; Если Ответ = Истина Тогда @@ -41,9 +38,6 @@ ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( "НастройкиПрограммы", "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", Истина); - - ЗапрещенныеРасширения = ФайловыеФункцииСлужебный.СписокЗапрещенныхРасширений(); - КонецПроцедуры &НаКлиенте @@ -62,20 +56,12 @@ &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ВыбраннаяСтрока", ВыбраннаяСтрока); - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); + Если Элементы.Список.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, УникальныйИдентификатор); + + СтандартнаяОбработка = Ложь; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры @@ -85,6 +71,24 @@ Отказ = Истина; КонецПроцедуры +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ТекущиеДанные.Ссылка); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -92,104 +96,97 @@ &НаКлиенте Процедура ОткрытьФайл(Команда) - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - Если ЗапрещенныеРасширения.НайтиПоЗначению(Элементы.Список.ТекущиеДанные.Расширение) <> Неопределено Тогда - Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект); - ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла"); - ПараметрыФормы.Вставить("ИмяФайла", - ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Элементы.Список.ТекущиеДанные.Наименование, Элементы.Список.ТекущиеДанные.Расширение)); - ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(СтрокаТаблицы, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура Освободить(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Неопределено, СтрокаТаблицы); - ПараметрыОсвобожденияФайла.ХранитьВерсии = СтрокаТаблицы.ХранитьВерсии; - ПараметрыОсвобожденияФайла.РедактируетТекущийПользователь = Истина; - ПараметрыОсвобожденияФайла.Редактирует = СтрокаТаблицы.Редактирует; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением( - Неопределено, - СтрокаТаблицы, - УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла); КонецПроцедуры &НаКлиенте Процедура ОткрытьКаталогФайла(Команда) - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(СтрокаТаблицы, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор); РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); КонецПроцедуры -&НаКлиенте -Процедура СохранитьКак(Команда) - - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(СтрокаТаблицы, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); - -КонецПроцедуры - &НаКлиенте Процедура ОбновитьИзФайлаНаДиске(Команда) - СтрокаТаблицы = Элементы.Список.ТекущаяСтрока; - Если СтрокаТаблицы = Неопределено Тогда + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(СтрокаТаблицы); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ТекущиеДанные.Ссылка); РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры +&НаКлиенте +Процедура Освободить(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Неопределено, ТекущиеДанные.Ссылка); + ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; + ПараметрыОсвобожденияФайла.ФайлРедактируетТекущийПользователь = Истина; + ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением( + Неопределено, + ТекущиеДанные.Ссылка, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения( + ТекущиеДанные.Ссылка, , УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); + +КонецПроцедуры + &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) МассивСтруктур = Новый Массив; МассивСтруктур.Добавить(ОписаниеНастройки( - "НастройкиПрограммы", - "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", - ПоказыватьЗанятыеФайлыПриЗавершенииРаботы)); - + "НастройкиПрограммы", + "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", + ПоказыватьЗанятыеФайлыПриЗавершенииРаботы)); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); Закрыть(КодВозвратаДиалога.Да); @@ -203,11 +200,28 @@ Возврат; КонецЕсли; - ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Неопределено, СтрокаТаблицы.Ссылка, УникальныйИдентификатор); + ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла( + Неопределено, СтрокаТаблицы.Ссылка, УникальныйИдентификатор); ПараметрыОбновленияФайла.ХранитьВерсии = СтрокаТаблицы.ХранитьВерсии; - ПараметрыОбновленияФайла.РедактируетТекущийПользователь = Истина; + ПараметрыОбновленияФайла.ФайлРедактируетТекущийПользователь = Истина; ПараметрыОбновленияФайла.Редактирует = СтрокаТаблицы.Редактирует; РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла); + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСвойстваФайла(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрисоединенныйФайл", ТекущиеДанные.Ссылка); + + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы); КонецПроцедуры @@ -215,29 +229,6 @@ #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура ВыбратьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - ВыбраннаяСтрока = ДополнительныеПараметры.ВыбраннаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока, УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено И Результат = "Продолжить" Тогда - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Функция ОписаниеНастройки(Объект, Настойка, Значение) @@ -250,4 +241,65 @@ КонецФункции +&НаСервере +Процедура НастроитьДинамическийСписок() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ТИПЗНАЧЕНИЯ(СведенияОФайлах.Файл) КАК ТипФайла + |ИЗ + | РегистрСведений.СведенияОФайлах КАК СведенияОФайлах + |ГДЕ + | СведенияОФайлах.Редактирует = &Редактирует"; + + Запрос.УстановитьПараметр("Редактирует", Параметры.Редактирует); + + УстановитьПривилегированныйРежим(Истина); + РезультатЗапроса = Запрос.Выполнить(); + МассивТипов = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("ТипФайла"); + УстановитьПривилегированныйРежим(Ложь); + + ТекстЗапроса = ""; + Для Каждого ТипСправочника Из МассивТипов Цикл + МетаданныеСправочника = Метаданные.НайтиПоТипу(ТипСправочника); + Если Не ПравоДоступа("Изменение", МетаданныеСправочника) Тогда + Продолжить; + КонецЕсли; + Если Не СтрЗаканчиваетсяНа(МетаданныеСправочника.Имя, "ВерсииПрисоединенныхФайлов") И МетаданныеСправочника.Имя <> "ВерсииФайлов" Тогда + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | ВЫБРАТЬ РАЗРЕШЕННЫЕ"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + | Файлы.Редактирует, + | Файлы.ИндексКартинки, + | Файлы.Наименование, + | Файлы.Описание, + | Файлы.Ссылка, + | Файлы.ХранитьВерсии, + | Файлы.ВладелецФайла, + | Файлы.Размер / 1024, + | Файлы.Автор + |ИЗ + | " + МетаданныеСправочника.ПолноеИмя() + " КАК Файлы + |ГДЕ + | Файлы.Редактирует = &Редактирует"; + Если ЗначениеЗаполнено(Параметры.ВладелецФайла) Тогда + ТекстЗапроса = ТекстЗапроса + " + | И Файлы.ВладелецФайла = &Редактирует"; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Список.ТекстЗапроса = ТекстЗапроса; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлСуществует/Form.form similarity index 98% rename from SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлСуществует/Form.form index acf554c6d..ece796ac1 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлСуществует/Form.form @@ -89,6 +89,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + true ОсновнаяКоманднаяПанельExtendedTooltip diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлСуществует/Module.bsl similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлСуществует/Module.bsl diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Form.form similarity index 99% rename from SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Form.form index 4ce73bb38..39ae57738 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Form.form @@ -259,6 +259,10 @@ Список 2 + + <key>ru</key> + <value>Список</value> + true true @@ -1130,7 +1134,7 @@ 5 - CatalogRef.ВерсииФайлов + DefinedType.ПрисоединенныйФайл true @@ -1181,7 +1185,7 @@ 8 - CatalogRef.Файлы + DefinedType.ПрисоединенныйФайл true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl similarity index 85% rename from SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl index fa12bb775..30b9c60a4 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl @@ -92,7 +92,7 @@ Процедура ОсвободитьВыполнить() Обработчик = Новый ОписаниеОповещения("ОсвободитьПослеУстановкиРасширения", ЭтотОбъект); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -147,14 +147,14 @@ ПараметрыВыполнения, ЭтотОбъект, "ОсвободитьВЦиклеПродолжить"); ПараметрыВызова = Новый Структура; - ПараметрыВызова.Вставить("ОбработчикРезультата", ПараметрыВыполнения); - ПараметрыВызова.Вставить("ОбъектСсылка", Неопределено); - ПараметрыВызова.Вставить("Версия", Неопределено); - ПараметрыВызова.Вставить("ХранитьВерсии", Неопределено); - ПараметрыВызова.Вставить("РедактируетТекущийПользователь", Неопределено); - ПараметрыВызова.Вставить("Редактирует", Неопределено); - ПараметрыВызова.Вставить("УникальныйИдентификатор", Неопределено); - ПараметрыВызова.Вставить("НеЗадаватьВопрос", Ложь); + ПараметрыВызова.Вставить("ОбработчикРезультата", ПараметрыВыполнения); + ПараметрыВызова.Вставить("ОбъектСсылка", Неопределено); + ПараметрыВызова.Вставить("Версия", Неопределено); + ПараметрыВызова.Вставить("ХранитьВерсии", Неопределено); + ПараметрыВызова.Вставить("ФайлРедактируетТекущийПользователь", Неопределено); + ПараметрыВызова.Вставить("Редактирует", Неопределено); + ПараметрыВызова.Вставить("УникальныйИдентификатор", Неопределено); + ПараметрыВызова.Вставить("НеЗадаватьВопрос", Ложь); Для Индекс = ПараметрыВыполнения.Индекс По ПараметрыВыполнения.ВГраница Цикл ПараметрыВыполнения.Индекс = Индекс; @@ -185,7 +185,7 @@ &НаКлиенте Процедура ЗаполнитьСписокВФорме() - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + РабочийКаталогПользователя = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя(); Список.Очистить(); @@ -202,6 +202,7 @@ НоваяСтрока.Версия = Строка.Значение.Ссылка; НоваяСтрока.Редактирует = Строка.Значение.Редактирует; НоваяСтрока.НаРедактирование = ЗначениеЗаполнено(Строка.Значение.Редактирует); + НоваяСтрока.Файл = Строка.Значение.Файл; КонецЕсли; КонецЦикла; @@ -262,7 +263,7 @@ ПараметрыВыполнения.Вставить("ВГраница", ПараметрыВыполнения.МассивСсылок.ВГраница()); ПараметрыВыполнения.Вставить("Ссылка", Неопределено); ПараметрыВыполнения.Вставить("ЕстьЗанятыеФайлы", Ложь); - ПараметрыВыполнения.Вставить("ИмяКаталога", ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + ПараметрыВыполнения.Вставить("ИмяКаталога", РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя()); УдалитьИзЛокальногоКэшаФайловВЦикле(ПараметрыВыполнения); @@ -345,8 +346,7 @@ Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(СтрокаТаблицы.Версия); - ПоказатьЗначение(, ДанныеФайла.Ссылка); + ПоказатьЗначение(, СтрокаТаблицы.Файл); КонецПроцедуры @@ -363,15 +363,15 @@ ЗапросВРегистр.УстановитьПараметр("Пользователь", ТекущийПользователь); ЗапросВРегистр.Текст = "ВЫБРАТЬ - | ФайлыВРабочемКаталоге.Версия КАК Ссылка, + | ФайлыВРабочемКаталоге.Файл КАК Ссылка, | ФайлыВРабочемКаталоге.НаЧтение КАК НаЧтение, | ФайлыВРабочемКаталоге.Размер КАК Размер, | ФайлыВРабочемКаталоге.Путь КАК Путь, - | ФайлыВРабочемКаталоге.Версия.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, - | ФайлыВРабочемКаталоге.Версия.ПолноеНаименование КАК ПолноеНаименование, - | ФайлыВРабочемКаталоге.Версия.ИндексКартинки КАК ИндексКартинки, - | ФайлыВРабочемКаталоге.Версия.Владелец.Редактирует КАК Редактирует, - | ФайлыВРабочемКаталоге.Версия.Владелец КАК Файл + | ФайлыВРабочемКаталоге.Файл.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | ФайлыВРабочемКаталоге.Файл.Наименование КАК ПолноеНаименование, + | ФайлыВРабочемКаталоге.Файл.ИндексКартинки КАК ИндексКартинки, + | ФайлыВРабочемКаталоге.Файл.Редактирует КАК Редактирует, + | ФайлыВРабочемКаталоге.Файл КАК Файл |ИЗ | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге |ГДЕ @@ -393,7 +393,12 @@ Запись.Вставить("Редактирует", Выборка.Редактирует); Запись.Вставить("НаЧтение", Выборка.НаЧтение); Запись.Вставить("ЧастичныйПуть", Выборка.Путь); - + // Это справочник версий файлов. + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("РодительскаяВерсия", Метаданные.НайтиПоТипу(ТипЗнч(Выборка.Ссылка))) Тогда + Запись.Вставить("Файл", Выборка.Ссылка.Владелец); + Иначе + Запись.Вставить("Файл", Выборка.Ссылка); + КонецЕсли; СписокЗначений.Добавить(Запись); КонецЦикла; КонецЕсли; @@ -404,18 +409,31 @@ &НаСервереБезКонтекста Функция ФайлЗанят(Ссылка) - + Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.Ссылка = &Ссылка - | И ВерсииФайлов.Владелец.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + ИмяСправочникаХранения = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя; + + Если ИмяСправочникаХранения = "ВерсииФайлов" Или СтрЗаканчиваетсяНа(ИмяСправочникаХранения, "ВерсииПрисоединенныхФайлов") Тогда + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник." + ИмяСправочникаХранения + " КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Ссылка = &Ссылка + | И ВерсииФайлов.Владелец.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник." + ИмяСправочникаХранения + " КАК Файлы + |ГДЕ + | Файлы.Ссылка = &Ссылка + | И Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + КонецЕсли; Возврат НЕ Запрос.Выполнить().Пустой(); diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Form.form similarity index 98% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Form.form index aee10d433..f81c02158 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Form.form @@ -247,6 +247,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 15 @@ -326,7 +330,7 @@ 3 - CatalogRef.Файлы + DefinedType.ПрисоединенныйФайл true @@ -382,7 +386,7 @@ ФайлСсылка - CatalogRef.Файлы + AnyRef true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Help/ru.html similarity index 70% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Help/ru.html index bd399819a..7603dbef7 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Help/ru.html @@ -1,13 +1,13 @@ -

              Предназначена для сохранения версии файла.

              -

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

              +

              Предназначена для сохранения версии файла.

              +

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

              Сохранение версии

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

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

              См. также:

              diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Module.bsl similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВозвратаФайла/Module.bsl diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form similarity index 99% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form index 9e7b070ee..0644f1f4c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form @@ -40,6 +40,10 @@ Файлы 4 + + <key>ru</key> + <value>Файлы</value> + true true @@ -351,10 +355,10 @@ true - + <key>ru</key> <value>Основная командная панель</value> - </toolTip> + ОсновнаяКоманднаяПанельExtendedTooltip 21 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Module.bsl similarity index 86% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Module.bsl index 28e91e5e7..229d60d4d 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Module.bsl @@ -24,7 +24,7 @@ СтандартнаяОбработка = Ложь; ФайлСсылка = Файлы[ВыбраннаяСтрока].Значение; - ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПерсональныеНастройки = РаботаСФайламиСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); КакОткрывать = ПерсональныеНастройки.ДействиеПоДвойномуЩелчкуМыши; Если КакОткрывать = "ОткрыватьКарточку" Тогда ПараметрыФормы = Новый Структура; @@ -33,7 +33,7 @@ Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, УникальныйИдентификатор); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, Неопределено,УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form similarity index 97% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form index 01ad45b4d..c05313c31 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form @@ -5,7 +5,7 @@ Как открыть файл? - Группа + ГруппаРежимОткрытия 8 КакОткрывать @@ -71,8 +71,12 @@ true + + <key>ru</key> + <value>Режим открытия</value> + - ГруппаExtendedTooltip + ГруппаРежимОткрытияРасширеннаяПодсказка 19 Label true @@ -167,10 +171,10 @@ true - + <key>ru</key> - <value>Группа информация</value> - </toolTip> + <value>Информация</value> + ГруппаИнформацияExtendedTooltip 21 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Module.bsl similarity index 81% rename from SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Module.bsl index b4e365458..061327418 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Module.bsl @@ -17,17 +17,17 @@ &НаКлиенте Процедура ОткрытьФайл(Команда) + Если БольшеНеСпрашивать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиОткрытияФайлов", - "СпрашиватьРежимРедактированияПриОткрытииФайла", - Ложь); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", Ложь,,, Истина); КонецЕсли; РезультатВыбора = Новый Структура; РезультатВыбора.Вставить("БольшеНеСпрашивать", БольшеНеСпрашивать); РезультатВыбора.Вставить("КакОткрывать", КакОткрывать); ОповеститьОВыборе(РезультатВыбора); + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form new file mode 100644 index 000000000..332981d36 --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form @@ -0,0 +1,766 @@ + + + + <key>ru</key> + <value>Завершение редактирования</value> + + + ГруппаВыбранныеФайлы + 19 + + ВыбранныеФайлы + 16 + + <key>ru</key> + <value>Выбранные файлы</value> + + true + true + + true + + + ВыбранныеФайлы + + false + None + Add + Change + Copy + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + КартинкаИНаименование + 29 + + ВыбранныеФайлыИндексКартинки + 30 + true + true + + true + + + ВыбранныеФайлы.ИндексКартинки + + + ВыбранныеФайлыИндексКартинкиExtendedTooltip + 44 + Label + true + true + + Left + + + + ВыбранныеФайлыИндексКартинкиКонтекстноеМеню + 31 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.КоллекцияПиктограммФайлов + + + + 1 + + + + + ВыбранныеСсылка + 32 + true + true + + true + + + ВыбранныеФайлы.Ссылка + + + ВыбранныеСсылкаРасширеннаяПодсказка + 45 + 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> + + + КартинкаИНаименованиеExtendedTooltip + 43 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ВыбранныеФайлыКоманднаяПанель + 18 + Left + true + + + BeforeAddRow + ВыбранныеФайлыПередНачаломДобавления + + + ВыбранныеФайлыСтрокаПоиска + 56 + + ВыбранныеФайлыСтрокаПоискаРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ВыбранныеФайлыСтрокаПоискаКонтекстноеМеню + 57 + true + + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыСостояниеПросмотра + 59 + + ВыбранныеФайлыСостояниеПросмотраРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ВыбранныеФайлыСостояниеПросмотраКонтекстноеМеню + 60 + true + + ViewStatusAddition + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыУправлениеПоиском + 62 + + ВыбранныеФайлыУправлениеПоискомРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ВыбранныеФайлыУправлениеПоискомКонтекстноеМеню + 63 + true + + SearchControlAddition + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыExtendedTooltip + 42 + Label + true + true + + Left + + + + ВыбранныеФайлыКонтекстноеМеню + 17 + true + + true + true + true + 50 + true + true + 6 + 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> + + + ГруппаВыбранныеФайлыРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Описание + 2 + + <key>ru</key> + <value>Описание</value> + + true + true + + true + + + Комментарий + + + ОписаниеExtendedTooltip + 48 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + 2 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ХранитьВерсии + 21 + true + true + + true + + + ХранитьВерсии + + Right + + ХранитьВерсииExtendedTooltip + 49 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ОсновнаяКоманднаяПанель + 1 + + ЗакончитьРедактирование + 4 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 20 + true + true + + true + + false + + ОтменаExtendedTooltip + 55 + 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> + + + ОсновнаяКоманднаяПанельExtendedTooltip + 53 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
              true
              + true +
              + + ВыбранныеФайлы + + <key>ru</key> + <value>Выбранные файлы</value> + + 2 + + ValueTable + + + true + + + true + + ShowError + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 1 + + CatalogRef + + + 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> + + 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> + + 9 + + + true + + + true + + + + ГруппаФайлов + + <key>ru</key> + <value>Группа файлов</value> + + 12 + + CatalogRef + + + true + + + true + + + + ВозможностьСоздаватьВерсииФайлов + + <key>ru</key> + <value>Возможность создавать версии файлов</value> + + 13 + + Boolean + + + true + + + true + + + + Редактирует + + <key>ru</key> + <value>Редактирует</value> + + 14 + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + true + + + true + + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 1 + + ru + Закончить редактирование + + + true + + + + ЗакончитьРедактирование + + + DontUse + Auto + + + МассивФайлов + + + + ВозможностьСоздаватьВерсииФайлов + + Boolean + + + + Редактирует + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + + + + +
              diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Module.bsl new file mode 100644 index 000000000..b843657ac --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Module.bsl @@ -0,0 +1,66 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Для Каждого ФайлСсылка Из Параметры.МассивФайлов Цикл + НовыйЭлемент = ВыбранныеФайлы.Добавить(); + НовыйЭлемент.Ссылка = ФайлСсылка; + НовыйЭлемент.ИндексКартинки = ФайлСсылка.ИндексКартинки; + КонецЦикла; + + ВозможностьСоздаватьВерсииФайлов = Параметры.ВозможностьСоздаватьВерсииФайлов; + Редактирует = Параметры.Редактирует; + + Элементы.ХранитьВерсии.Видимость = ВозможностьСоздаватьВерсииФайлов; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ХранитьВерсии = Истина; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеФайлы + +&НаКлиенте +Процедура ВыбранныеФайлыПередНачаломДобавления(Элемент, Отказ, Копирование) + Отказ = Истина; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗакончитьРедактирование() + + МассивФайлов = Новый Массив; + Для Каждого ЭлементСписка Из ВыбранныеФайлы Цикл + МассивФайлов.Добавить(ЭлементСписка.Ссылка); + КонецЦикла; + + ПараметрыОбновленияФайлов = Новый Структура; + ПараметрыОбновленияФайлов.Вставить("МассивФайлов", МассивФайлов); + ПараметрыОбновленияФайлов.Вставить("ВозможностьСоздаватьВерсииФайлов", ВозможностьСоздаватьВерсииФайлов); + ПараметрыОбновленияФайлов.Вставить("ХранитьВерсии", ХранитьВерсии); + Если Не ВозможностьСоздаватьВерсииФайлов Тогда + ПараметрыОбновленияФайлов.Вставить("СоздатьНовуюВерсию", Ложь); + КонецЕсли; + ПараметрыОбновленияФайлов.Вставить("ФайлРедактируетТекущийПользователь", Истина); + ПараметрыОбновленияФайлов.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыОбновленияФайлов.Вставить("ИдентификаторФормы", УникальныйИдентификатор); + ПараметрыОбновленияФайлов.Вставить("Редактирует", Редактирует); + ПараметрыОбновленияФайлов.Вставить("КомментарийКВерсии", Комментарий); + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеПоСсылкамСОповещением(ПараметрыОбновленияФайлов); + Закрыть(); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form similarity index 93% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form index 9b9cd7ca2..0ada3f90d 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form @@ -65,7 +65,7 @@ 14 <key>ru</key> - <value>Папка</value> + <value>Размещение</value> true true @@ -242,12 +242,8 @@
              <key>ru</key> - <value>Группа свойств файлов</value> + <value>Свойств файлов</value> - - ru - Группа свойств файлов - ГруппаСвойствФайловExtendedTooltip 34 @@ -339,12 +335,8 @@
              <key>ru</key> - <value>Группа кодировка</value> + <value>Кодировка</value> - - ru - Группа кодировка - ГруппаКодировкаExtendedTooltip 37 @@ -446,6 +438,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 40 @@ -601,7 +597,7 @@ 2 - CatalogRef.ПапкиФайлов + CatalogRef true @@ -646,6 +642,41 @@ true + + ГруппаФайлов + + <key>ru</key> + <value>Группа файлов</value> + + 10 + + CatalogRef + + + true + + + true + + + + ИмяСправочникаХранилищаФайлов + + <key>ru</key> + <value>Имя справочника хранилища файлов</value> + + 11 + + String + + + + true + + + true + + ЗагрузитьПапку @@ -690,6 +721,25 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <parameters> + <name>ГруппаФайлов</name> + <valueType> + <types>CatalogRef</types> + </valueType> + </parameters> + <parameters> + <name>ИмяСправочникаХранилищаФайлов</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + </parameters> + <parameters> + <name>ПапкаДляДобавления</name> + <valueType> + <types>CatalogRef</types> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Help/ru.html similarity index 78% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Help/ru.html index 2d1ad2ace..314def681 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Help/ru.html @@ -4,7 +4,7 @@ <p>Заполните необходимые для загрузки папки сведения:</p> <ul><li> <div>Поле <strong>Каталог на диске</strong> заполняется автоматически, при необходимости можно <img src="StdPicture.InputFieldSelect"></img> выбрать другую папку.</div></li></ul><ul><li> -<div>В поле <strong>Папка</strong> автоматически проставляется выбранная <a href="Catalog.ПапкиФайлов.Form.ФормаЭлемента/Help">папка</a> в списке файлов, в которую будет загружена папка с диска на компьютере. При необходимости можно <img src="StdPicture.InputFieldSelect" width="12" height="12"></img> выбрать другую папку;</div> +<div>В поле <strong>Размещение</strong> автоматически проставляется выбранная <a href="Catalog.ПапкиФайлов.Form.ФормаЭлемента/Help">папка</a> в списке файлов, в которую будет загружена папка с диска на компьютере. При необходимости можно <img src="StdPicture.InputFieldSelect" width="12" height="12"></img> выбрать другую папку;</div> </li><li> <div>Для экономии места на диске включите флажок <strong>Удалять файлы после добавления</strong> (по умолчанию выключен);</div> </li><li> @@ -12,12 +12,12 @@ </li><li> <div>Включите флажок, для того чтобы <strong>Хранить версии</strong> (рекомендуется, по умолчанию флажок включен);</div> </li><li> -<div>Для текстовых файлов можно <strong>Выбрать кодировку</strong> из <a href="Catalog.Файлы.Form.ВыборКодировки/Help">списка</a>.</div> +<div>Для текстовых файлов можно <strong>Выбрать кодировку</strong> из <a href="DataProcessor.РаботаСФайлами.Form.ВыборКодировки/Help">списка</a>.</div> </li><li> <div>Для подтверждения нажмите <strong>Загрузить папку</strong>. Если выбранная для загрузки папка пуста, то программа выводит сообщение "Нет файлов для добавления".</div></li></ul><div>Также можно использовать <a href="Catalog.Файлы.Form.ФормаПеретаскивания/Help">перетаскивание мышью</a> для загрузки папки с жесткого или сетевого диска - просто перетащите папку мышкой из <strong>Проводника Windows</strong> в нужную папку списка файлов программы.</div> <h3>См. также:</h3> <ul><li> <div><a href="Catalog.Файлы/Help">Общие сведения о файлах</a>;</div> </li><li> -<div><a href="Catalog.Файлы.Form.ФормаИмпортаФайлов/Help">Загрузка файлов</a>;</div> +<div><a href="DataProcessor.РаботаСФайлами.Form.ФормаИмпортаФайлов/Help">Загрузка файлов</a>;</div> </li><li> <a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Module.bsl similarity index 79% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Module.bsl index db08dbb0a..7ffb330b2 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Module.bsl @@ -8,6 +8,8 @@ Возврат; КонецЕсли; + ГруппаФайлов = Параметры.ГруппаФайлов; + ИмяСправочникаХранилищаФайлов = Параметры.ИмяСправочникаХранилищаФайлов; Если НЕ Параметры.Свойство("КаталогНаДиске") Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Данная обработка вызывается из других процедур конфигурации. @@ -20,7 +22,7 @@ Каталог = Параметры.КаталогНаДиске; КонецЕсли; - Если Параметры.ПапкаДляДобавления <> Неопределено Тогда + Если ЗначениеЗаполнено(Параметры.ПапкаДляДобавления) Тогда ПапкаДляДобавления = Параметры.ПапкаДляДобавления; КонецЕсли; КонецПроцедуры @@ -35,7 +37,7 @@ &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.Файлы.Форма.ВыборКодировки") Тогда + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.РаботаСФайлами.Форма.ВыборКодировки") Тогда Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда Возврат; КонецЕсли; @@ -103,16 +105,17 @@ Обработчик = Новый ОписаниеОповещения("ИмпортЗавершение", ЭтотОбъект); ПараметрыВыполнения = РаботаСФайламиСлужебныйКлиент.ПараметрыИмпортаФайлов(); - ПараметрыВыполнения.ОбработчикРезультата = Обработчик; - ПараметрыВыполнения.Владелец = ПапкаДляДобавления; - ПараметрыВыполнения.ВыбранныеФайлы = ВыбранныеФайлы; - ПараметрыВыполнения.Комментарий = Описание; - ПараметрыВыполнения.ХранитьВерсии = ХранитьВерсии; - ПараметрыВыполнения.УдалятьФайлыПослеДобавления = УдалятьФайлыПослеДобавления; - ПараметрыВыполнения.Рекурсивно = Истина; - ПараметрыВыполнения.ИдентификаторФормы = УникальныйИдентификатор; - ПараметрыВыполнения.Кодировка = КодировкаТекстаФайла; - + ПараметрыВыполнения.ОбработчикРезультата = Обработчик; + ПараметрыВыполнения.Владелец = ПапкаДляДобавления; + ПараметрыВыполнения.ВыбранныеФайлы = ВыбранныеФайлы; + ПараметрыВыполнения.Комментарий = Описание; + ПараметрыВыполнения.ХранитьВерсии = ХранитьВерсии; + ПараметрыВыполнения.УдалятьФайлыПослеДобавления = УдалятьФайлыПослеДобавления; + ПараметрыВыполнения.Рекурсивно = Истина; + ПараметрыВыполнения.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыВыполнения.Кодировка = КодировкаТекстаФайла; + ПараметрыВыполнения.ГруппаФайлов = ГруппаФайлов; + ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов = ИмяСправочникаХранилищаФайлов; РаботаСФайламиСлужебныйКлиент.ВыполнитьИмпортФайлов(ПараметрыВыполнения); КонецПроцедуры @@ -131,7 +134,7 @@ Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form similarity index 96% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form index 04bce92ea..d0eb89d27 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form @@ -5,7 +5,7 @@ <value>Загрузка файлов</value> - Группа + ГруппаВыбранныеФайлы 19 Заголовок @@ -97,6 +97,10 @@ true + + <key>ru</key> + <value>Заголовок</value> + ЗаголовокExtendedTooltip 39 @@ -119,6 +123,10 @@ ВыбранныеФайлы 16 + + <key>ru</key> + <value>Выбранные файлы</value> + true true @@ -235,10 +243,6 @@ ru Картинка и наименование - - ru - Картинка и наименование - КартинкаИНаименованиеExtendedTooltip 43 @@ -388,8 +392,12 @@ true + + <key>ru</key> + <value>Выбранные файлы</value> + - ГруппаExtendedTooltip + ГруппаВыбранныеФайлыРасширеннаяПодсказка 38 Label true @@ -648,12 +656,8 @@ <key>ru</key> - <value>Группа кодировка</value> + <value>Кодировка</value> - - ru - Группа кодировка - ГруппаКодировкаExtendedTooltip 50 @@ -753,6 +757,10 @@ true + + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 53 @@ -1024,6 +1032,23 @@ true + + ГруппаФайлов + + <key>ru</key> + <value>Группа файлов</value> + + 12 + + CatalogRef + + + true + + + true + + ЗагрузитьФайлы @@ -1090,6 +1115,16 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <parameters> + <name>ГруппаФайлов</name> + <valueType> + <types>CatalogRef</types> + </valueType> + </parameters> + <parameters> + <name>МассивИменФайлов</name> + <valueType/> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Help/ru.html similarity index 77% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Help/ru.html index d456f8402..94bb26fe2 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Help/ru.html @@ -11,11 +11,11 @@ </li><li> <div>Включите флажок, для того чтобы <strong>Хранить версии</strong> (рекомендуется, по умолчанию флажок включен);</div> </li><li> -<div>Для текстовых файлов можно <strong>Выбрать кодировку</strong> из <a href="Catalog.Файлы.Form.ВыборКодировки/Help">списка</a>.</div> +<div>Для текстовых файлов можно <strong>Выбрать кодировку</strong> из <a href="DataProcessor.РаботаСФайлами.Form.ВыборКодировки/Help">списка</a>.</div> </li><li> -<div>Для подтверждения нажмите <strong>Загрузить файл</strong>. </div></li></ul><div>Также можно использовать <a href="Catalog.Файлы.Form.ФормаПеретаскивания/Help">перетаскивание мышью</a> для загрузки файлов с жесткого или сетевого диска - просто перетащите файлы мышью из <strong>Проводника Windows</strong> в нужную папку списка файлов программы.</div> +<div>Для подтверждения нажмите <strong>Загрузить файлы</strong>. </div></li></ul><div>Также можно использовать <a href="Catalog.Файлы.Form.ФормаПеретаскивания/Help">перетаскивание мышью</a> для загрузки файлов с жесткого или сетевого диска - просто перетащите файлы мышью из <strong>Проводника Windows</strong> в нужную папку списка файлов программы.</div> <h3>См. также:</h3> <ul><li> <div><a href="Catalog.Файлы/Help">Общие сведения о файлах</a>;</div> -</li><li><a href="Catalog.Файлы.Form.ФормаИмпортаПапки/Help">Загрузка папки</a>; +</li><li><a href="DataProcessor.РаботаСФайлами.Form.ФормаИмпортаПапки/Help">Загрузка папки</a>; </li><li><a href="v8help://frame/form_common">Работа с формами</a>. </li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Module.bsl similarity index 81% rename from SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Module.bsl index 885346326..61027ca71 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Module.bsl @@ -8,6 +8,8 @@ Возврат; КонецЕсли; + ГруппаФайлов = Параметры.ГруппаФайлов; + Если НЕ Параметры.Свойство("ПапкаДляДобавления") Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Данная обработка вызывается из других процедур конфигурации. @@ -22,17 +24,18 @@ ПапкаДляДобавления = ВладелецФайлов; Иначе Элементы.ПапкаДляДобавления.Видимость = Ложь; - КонецЕсли; + КонецЕсли; КонецЕсли; - Если Параметры.МассивИменФайлов <> Неопределено Тогда + Если ТипЗнч(Параметры.МассивИменФайлов) = Тип("Массив") Тогда Для Каждого ПутьФайла Из Параметры.МассивИменФайлов Цикл ФайлПеренесенный = Новый Файл(ПутьФайла); НовыйЭлемент = ВыбранныеФайлы.Добавить(); НовыйЭлемент.Путь = ПутьФайла; - НовыйЭлемент.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + НовыйЭлемент.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); КонецЦикла; КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -42,7 +45,7 @@ &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.Файлы.Форма.ВыборКодировки") Тогда + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.РаботаСФайлами.Форма.ВыборКодировки") Тогда Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда Возврат; КонецЕсли; @@ -111,9 +114,9 @@ ПомещаемыеФайлы.Добавить(Описание); ОписаниеВызова.Добавить(ПомещаемыеФайлы); - ОписаниеВызова.Добавить(Неопределено); // не используется - ОписаниеВызова.Добавить(Неопределено); // не используется - ОписаниеВызова.Добавить(Ложь); // Интерактивно = Ложь + ОписаниеВызова.Добавить(Неопределено); // не используется + ОписаниеВызова.Добавить(Неопределено); // не используется + ОписаниеВызова.Добавить(Ложь); // Интерактивно = Ложь МассивОпераций.Добавить(ОписаниеВызова); КонецЦикла; @@ -132,16 +135,17 @@ Обработчик = Новый ОписаниеОповещения("ДобавитьВыполнитьЗавершение", ЭтотОбъект, ПараметрыОбработчика); ПараметрыВыполнения = РаботаСФайламиСлужебныйКлиент.ПараметрыИмпортаФайлов(); - ПараметрыВыполнения.ОбработчикРезультата = Обработчик; - ПараметрыВыполнения.Владелец = ВладелецФайловДляДобавления; - ПараметрыВыполнения.ВыбранныеФайлы = ВыбранныеФайлыСписокЗначений; - ПараметрыВыполнения.Комментарий = Комментарий; - ПараметрыВыполнения.ХранитьВерсии = ХранитьВерсии; - ПараметрыВыполнения.УдалятьФайлыПослеДобавления = УдалятьФайлыПослеДобавления; - ПараметрыВыполнения.Рекурсивно = Ложь; - ПараметрыВыполнения.ИдентификаторФормы = УникальныйИдентификатор; - ПараметрыВыполнения.ДобавленныеФайлы = ДобавленныеФайлы; - ПараметрыВыполнения.Кодировка = КодировкаТекстаФайла; + ПараметрыВыполнения.ОбработчикРезультата = Обработчик; + ПараметрыВыполнения.Владелец = ВладелецФайловДляДобавления; + ПараметрыВыполнения.ВыбранныеФайлы = ВыбранныеФайлыСписокЗначений; + ПараметрыВыполнения.Комментарий = Комментарий; + ПараметрыВыполнения.ХранитьВерсии = ХранитьВерсии; + ПараметрыВыполнения.УдалятьФайлыПослеДобавления = УдалятьФайлыПослеДобавления; + ПараметрыВыполнения.Рекурсивно = Ложь; + ПараметрыВыполнения.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыВыполнения.ДобавленныеФайлы = ДобавленныеФайлы; + ПараметрыВыполнения.Кодировка = КодировкаТекстаФайла; + ПараметрыВыполнения.ГруппаФайлов = ГруппаФайлов; РаботаСФайламиСлужебныйКлиент.ВыполнитьИмпортФайлов(ПараметрыВыполнения); КонецПроцедуры @@ -150,7 +154,7 @@ Процедура ВыбратьФайлыВыполнить() Обработчик = Новый ОписаниеОповещения("ВыбратьФайлыВыполнитьПослеУстановкиРасширения", ЭтотОбъект); - ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + РаботаСФайламиСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры @@ -158,7 +162,7 @@ Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры #КонецОбласти @@ -206,7 +210,7 @@ ФайлПеренесенный = Новый Файл(ИмяФайла); НовыйЭлемент = ВыбранныеФайлы.Добавить(); НовыйЭлемент.Путь = ИмяФайла; - НовыйЭлемент.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + НовыйЭлемент.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); КонецЦикла; КонецЕсли; diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Form.form similarity index 98% rename from SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Form.form index 933761ad2..5158d487c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Form.form @@ -63,6 +63,10 @@ <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Основная командная панель</value> + ОсновнаяКоманднаяПанельExtendedTooltip 4 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Help/ru.html similarity index 64% rename from SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Help/ru.html index fdd7b5992..ebd0ef294 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Help/ru.html +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Help/ru.html @@ -1,5 +1,5 @@ -

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

              +

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

              В отчете выводится список файлов, который включает:

              • Полный путь к файлам, которые не удалось загрузить.
              • Суть ошибки, например, "Размер файла <"Наименование">(2 Мб) превышает максимально допустимый размер файла (1Мб)".

              См. также:

              diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Module.bsl similarity index 90% rename from SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Module.bsl index 144e5cff7..1fe0dd30b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаОтчета/Module.bsl @@ -27,7 +27,7 @@ #Если Не ВебКлиент Тогда // Путь к файлу. Если СтрНайти(Область.Текст, ":\") > 0 ИЛИ СтрНайти(Область.Текст, ":/") > 0 Тогда - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Область.Текст); + РаботаСФайламиСлужебныйКлиент.ОткрытьПроводникСФайлом(Область.Текст); КонецЕсли; #КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Form.form similarity index 66% rename from SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Form.form index 8870085d0..2fdcf4e81 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Form.form @@ -4,76 +4,25 @@ ru Сохранение папки - - Группа - 34 - - ПапкаДляЭкспорта - 2 - - <key>ru</key> - <value>Укажите папку, в которую будет производиться сохранение</value> - - true - true - - true - - - ПапкаДляЭкспорта - - Top - - ПапкаДляЭкспортаExtendedTooltip - 36 - Label - true - true - - Left - - - - ПапкаДляЭкспортаКонтекстноеМеню - 3 - true - - InputField - Enter - true - Left - true - Left - - - StartChoice - ПапкаДляЭкспортаНачалоВыбора - - - Opening - ПапкаДляЭкспортаОткрытие - - 50 - true - true - true - true - true - true - - Style.BorderColor - - Normal - - + + ПапкаДляЭкспорта + 2 + + <key>ru</key> + <value>Укажите папку, в которую будет производиться сохранение</value> + true true true + + ПапкаДляЭкспорта + + Top - ГруппаExtendedTooltip - 35 + ПапкаДляЭкспортаExtendedTooltip + 36 Label true true @@ -81,16 +30,82 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + ПапкаДляЭкспортаКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПапкаДляЭкспортаНачалоВыбора + + + Opening + ПапкаДляЭкспортаОткрытие + + 50 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + ТранслитерироватьИменаПапокИФайлов + 41 + + <key>ru</key> + <value>Транслитерировать имена папок и файлов</value> + + true + true + + true + + + ТранслитерироватьИменаПапокИФайлов + + Right + + ru + Сохраненные файлы и папки будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл "Документ.txt" будет сохранен с именем "Dokument.txt". + + Button + + ТранслитерироватьИменаПапокИФайловРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ТранслитерироватьИменаПапокИФайловКонтекстноеМеню + 42 + true + + CheckBoxField + Enter + true + Left + true + + КоманднаяПанель 30 @@ -184,10 +199,6 @@ ru Командная панель - - ru - Командная панель - КоманднаяПанельExtendedTooltip 37 @@ -269,7 +280,7 @@ 2 - CatalogRef.ВерсииФайлов + CatalogRef true @@ -360,7 +371,7 @@ 6 - CatalogRef.ПапкиФайлов + CatalogRef true @@ -413,7 +424,7 @@ 5 - CatalogRef.ПапкиФайлов + CatalogRef true @@ -440,6 +451,59 @@ true + + ИмяСправочникаХранилищаФайлов + + <key>ru</key> + <value>Имя справочника хранилища файлов</value> + + 1 + + String + + + + true + + + true + + + + ТранслитерироватьИменаПапокИФайлов + + <key>ru</key> + <value>Транслитерировать имена папок и файлов</value> + + 7 + + Boolean + + + true + + + true + + + + ИмяСправочникаХранилищаВерсийФайлов + + <key>ru</key> + <value>Имя справочника хранилища версий файлов</value> + + 8 + + String + + + + true + + + true + + СохранитьПапку @@ -465,7 +529,21 @@ <parameters> <name>ПапкаЭкспорта</name> <valueType> - <types>CatalogRef.ПапкиФайлов</types> + <types>CatalogRef</types> + </valueType> + </parameters> + <parameters> + <name>ИмяСправочникаХранилищаФайлов</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + </parameters> + <parameters> + <name>ИмяСправочникаХранилищаВерсийФайлов</name> + <valueType> + <types>String</types> + <stringQualifiers/> </valueType> </parameters> <commandInterface> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Help/ru.html similarity index 100% rename from SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Help/ru.html diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl similarity index 86% rename from SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl rename to SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl index e9a49ca1a..faf3993a2 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl @@ -21,20 +21,17 @@ РасширениеДляЗашифрованныхФайлов = "p7m"; КонецЕсли; + ИмяСправочникаХранилищаФайлов = Параметры.ИмяСправочникаХранилищаФайлов; + ИмяСправочникаХранилищаВерсийФайлов = Параметры.ИмяСправочникаХранилищаВерсийФайлов; + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - #Если ВебКлиент Тогда - ПоказатьПредупреждение(, НСтр("ru = 'В Веб-клиенте экспорт папок не поддерживается.'")); - Отказ = Истина; - Возврат; - #КонецЕсли - // Установка в качестве папки выгрузки "Мои Документы" // папку, используемую для выгрузки последний раз. - ПапкаДляЭкспорта = ФайловыеФункцииСлужебныйКлиент.КаталогВыгрузки(); + ПапкаДляЭкспорта = РаботаСФайламиСлужебныйКлиент.КаталогВыгрузки(); КонецПроцедуры @@ -91,6 +88,9 @@ КонецЕсли; ПапкаДляЭкспортаПолная = ПапкаДляЭкспорта + Строка(ЧтоСохраняем) + ПолучитьРазделительПути(); + Если ТранслитерироватьИменаПапокИФайлов Тогда + ПапкаДляЭкспортаПолная = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ПапкаДляЭкспортаПолная); + КонецЕсли; // Если выгружаемая папка не существует, ее следует создать. КаталогВыгрузки = Новый Файл(ПапкаДляЭкспортаПолная); @@ -116,11 +116,6 @@ КонецЕсли; КонецЕсли; - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется экспорт папки ""%1""... - |Пожалуйста, подождите.'"), - Строка(ЧтоСохраняем) )); - // Получим список выгружаемых файлов. СформироватьДеревоФайлов(ЧтоСохраняем); @@ -135,10 +130,11 @@ СохраняемыйПуть = ПапкаДляЭкспорта; ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", СохраняемыйПуть); - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Успешно завершен экспорт папки ""%1"" - |в папку на диске ""%2"".'"), - Строка(ЧтоСохраняем), Строка(ПапкаДляЭкспорта) ) ); + ПоказатьОповещениеПользователя(НСтр("ru = 'Экспорт папки'"),, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Успешно завершен экспорт папки ""%1"" + |в папку на диске ""%2"".'"), + Строка(ЧтоСохраняем), Строка(ПапкаДляЭкспорта) ) ); Закрыть(); КонецЕсли; @@ -151,15 +147,19 @@ &НаСервере Процедура СформироватьДеревоФайлов(ПапкаРодитель) Запрос = Новый Запрос; - Запрос.Текст = + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Файлы.ВладелецФайла КАК Папка, | Файлы.ВладелецФайла.Наименование КАК НаименованиеПапки, - | Файлы.ТекущаяВерсия, - | Файлы.ПолноеНаименование КАК ПолноеНаименование, - | Файлы.ТекущаяВерсия.Расширение КАК Расширение, - | Файлы.ТекущаяВерсия.Размер КАК Размер, - | Файлы.ТекущаяВерсия.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | ВЫБОР + | КОГДА Файлы.ТекущаяВерсия = ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка) + | ТОГДА Файлы.Ссылка + | ИНАЧЕ ЕстьNull(Файлы.ТекущаяВерсия, ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)) + | КОНЕЦ КАК ТекущаяВерсия, + | Файлы.Наименование КАК ПолноеНаименование, + | Файлы.Расширение КАК Расширение, + | Файлы.Размер КАК Размер, + | Файлы.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, | Файлы.Ссылка, | Файлы.ПометкаУдаления, | Файлы.Зашифрован @@ -167,13 +167,26 @@ | Справочник.Файлы КАК Файлы |ГДЕ | Файлы.ВладелецФайла В ИЕРАРХИИ(&Ссылка) - | И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка) | И Файлы.ПометкаУдаления = ЛОЖЬ |ИТОГИ ПО | Папка ИЕРАРХИЯ"; Запрос.Параметры.Вставить("Ссылка", ПапкаРодитель); + Если Не ПустаяСтрока(ИмяСправочникаХранилищаФайлов) Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВерсииФайлов", ИмяСправочникаХранилищаВерсийФайлов); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Файлы", ИмяСправочникаХранилищаФайлов); + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "ВладелецФайла", "Родитель"); + Иначе + Запрос.Текст = ТекстЗапроса; + КонецЕсли; Результат = Запрос.Выполнить(); ТаблицаВыгрузки = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + Если ТранслитерироватьИменаПапокИФайлов И ТаблицаВыгрузки.Строки.Количество() > 0 Тогда + КорневаяПапкаДляВыгрузки = ТаблицаВыгрузки.Строки[0]; + КорневаяПапкаДляВыгрузки.НаименованиеПапки = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(КорневаяПапкаДляВыгрузки.НаименованиеПапки); + КорневаяПапкаДляВыгрузки.ПолноеНаименование = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(КорневаяПапкаДляВыгрузки.ПолноеНаименование); + КорневаяПапкаДляВыгрузки.Расширение = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(КорневаяПапкаДляВыгрузки.Расширение); + ИзменитьИменаФайловИПапок(КорневаяПапкаДляВыгрузки); + КонецЕсли; ЗначениеВРеквизитФормы(ТаблицаВыгрузки, "ДеревоФайлов"); КонецПроцедуры @@ -322,8 +335,8 @@ Процедура ОбойтиДеревоФайлов3(ПараметрыВыполнения) // Сформируем путь к каталогу и пойдем дальше. Создавать каталоги будем. ПараметрыВыполнения.Вставить("БазовыйКаталогСохраненияФайла", ПараметрыВыполнения.БазовыйКаталогСохранения); - Если ПараметрыВыполнения.ЗаписьФайла.Папка <> ЧтоСохраняем - И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия.Пустая() + Если ПараметрыВыполнения.ЗаписьФайла.Папка <> ЧтоСохраняем + И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия = Неопределено И ПараметрыВыполнения.ЗаписьФайла.Папка <> ПараметрыВыполнения.РодительскаяПапка Тогда ПараметрыВыполнения.БазовыйКаталогСохраненияФайла = ( ПараметрыВыполнения.БазовыйКаталогСохраненияФайла @@ -439,8 +452,8 @@ &НаКлиенте Процедура ОбойтиДеревоФайлов8(ПараметрыВыполнения) - Если ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия <> NULL - И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда + Если (ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия <> Неопределено + И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия.Пустая()) Или ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия = Неопределено Тогда // Это элемент справочника Файлы без файла - пропустим. Возврат; КонецЕсли; @@ -543,7 +556,7 @@ РаботаСФайламиСлужебныйКлиент.ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов12", ЭтотОбъект, ПараметрыВыполнения); - ОткрытьФорму("Справочник.Файлы.Форма.ФайлСуществует", СтруктураПараметров, , , , , Обработчик); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФайлСуществует", СтруктураПараметров, , , , , Обработчик); Возврат; КонецЕсли; @@ -603,40 +616,38 @@ Если ПараметрыВыполнения.ФайлНаДиске.Существует() Тогда // Снимем флаг R|O для возможности удаления. ПараметрыВыполнения.ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - КонецЕсли; - - // Всегда удалим и потом создадим заново. - ИнформацияОбОшибке = Неопределено; - Попытка - УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - КонецПопытки; - Если ИнформацияОбОшибке <> Неопределено Тогда - ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); - Возврат; + + // Всегда удаляем и потом создадим заново. + ИнформацияОбОшибке = Неопределено; + Попытка + УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КонецПопытки; + + Если ИнформацияОбОшибке <> Неопределено Тогда + ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); + Возврат; + КонецЕсли; КонецЕсли; РазмерВМб = ПараметрыВыполнения.ЗаписьФайла.Размер / (1024 * 1024); - // Обновим индикатор прогресса. - СостояниеЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Экспорт папки ""%1""'"), - ПараметрыВыполнения.ЗаписьФайла.НаименованиеПапки); - СостояниеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется на диск файл - |""%1"" (%2 Мб)...'"), - ПараметрыВыполнения.ФайлНаДиске.Имя, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - Состояние(СостояниеЗаголовок, , СостояниеТекст, БиблиотекаКартинок.Информация32); - // Запишем файл заново АдресФайлаДляОткрытия = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия, УникальныйИдентификатор); Попытка - ПолучитьФайл(АдресФайлаДляОткрытия, ПараметрыВыполнения.ПолноеИмяФайла, Ложь); + ПолучаемыеФайлы = Новый Массив; + ПередаваемыйФайл = Новый ОписаниеПередаваемогоФайла(); + ПолученныеФайлы = Новый Массив; + + ПередаваемыйФайл.Хранение = АдресФайлаДляОткрытия; + ПередаваемыйФайл.Имя = ПараметрыВыполнения.ПолноеИмяФайла; + ПолучаемыеФайлы.Добавить(ПередаваемыйФайл); + + ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, ПараметрыВыполнения.БазовыйКаталогСохраненияФайла, Ложь); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; @@ -644,6 +655,12 @@ ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); Возврат; КонецЕсли; + + Если ПолученныеФайлы.Количество() = 0 + Или ПустаяСтрока(ПолученныеФайлы[0].Имя) Тогда + // Файл не был получен. + Возврат; + КонецЕсли; // Для варианта с хранением файлов на диске (на сервере) удаляем файл из временного хранилища после получения. Если ЭтоАдресВременногоХранилища(АдресФайлаДляОткрытия) Тогда @@ -661,10 +678,12 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; + Если ИнформацияОбОшибке <> Неопределено Тогда ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); Возврат; КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -703,4 +722,16 @@ ОбойтиДеревоФайлов14(ПараметрыВыполнения); КонецПроцедуры +&НаСервере +Процедура ИзменитьИменаФайловИПапок(ЭлементДерева) + + Для Каждого ФайлИлиПапка Из ЭлементДерева.Строки Цикл + ФайлИлиПапка.НаименованиеПапки = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ФайлИлиПапка.НаименованиеПапки); + ФайлИлиПапка.ПолноеНаименование = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ФайлИлиПапка.ПолноеНаименование); + ФайлИлиПапка.Расширение = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(ФайлИлиПапка.Расширение); + ИзменитьИменаФайловИПапок(ФайлИлиПапка); + КонецЦикла; + +КонецПроцедуры; + #КонецОбласти diff --git a/SSL/src/DataProcessors/РаботаСФайлами/РаботаСФайлами.mdo b/SSL/src/DataProcessors/РаботаСФайлами/РаботаСФайлами.mdo new file mode 100644 index 000000000..286d638ea --- /dev/null +++ b/SSL/src/DataProcessors/РаботаСФайлами/РаботаСФайлами.mdo @@ -0,0 +1,335 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="20feb794-eb05-46a6-90e7-ca4e2376d7b2"> + <producedTypes> + <objectType typeId="d7a20ae3-1306-4b68-a2ae-e9c163cdb411" valueTypeId="c366b4de-f66f-4384-a010-6698162ff478"/> + <managerType typeId="f9f77ea2-e488-44f0-98b7-c1cd0eaff5b2" valueTypeId="8f0737d0-630f-44dd-b505-621514efdd83"/> + </producedTypes> + <name>РаботаСФайлами</name> + <synonym> + <key>ru</key> + <value>Работа с файлами</value> + </synonym> + <useStandardCommands>true</useStandardCommands> + <forms uuid="c73da415-6fc3-449a-a784-b25aed54eccd"> + <name>ВерсииФайла</name> + <synonym> + <key>ru</key> + <value>Версии файла</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="8deb4f57-18fc-4db0-ad0f-82d60af3d80b"> + <name>ВерсияПрисоединенногоФайла</name> + <synonym> + <key>ru</key> + <value>Версия присоединенного файла</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="2f484aa4-452a-46af-a707-a5a6917bc0db"> + <name>ВсеФайлы</name> + <synonym> + <key>ru</key> + <value>Все файлы</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="fd6ff934-6f11-4182-b0cb-6926902d33c0"> + <name>ВопросПриИмпортеФайлов</name> + <synonym> + <key>ru</key> + <value>Сообщение о файлах, чей размер превышает допустимый</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="315af891-2075-4833-a404-6c0f2004ee53"> + <name>ВыборКодировки</name> + <synonym> + <key>ru</key> + <value>Выбор кодировки</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="5725db77-bfbf-4d85-9565-163b309a53ee"> + <name>ВыборСпособаСравненияВерсий</name> + <synonym> + <key>ru</key> + <value>Выбор способа сравнения версий</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="99a7142c-b3c7-4221-abf8-6831a3cbc16e"> + <name>ВыборСохраненияШифрованногоФайла</name> + <synonym> + <key>ru</key> + <value>Выбор сохранения шифрованного файла</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="d367a1a1-5a54-4bf9-96c7-d55667e2fb16"> + <name>ГруппаФайлов</name> + <synonym> + <key>ru</key> + <value>Группа файлов</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="2e09abe1-0934-42ae-970f-5e001c35c31a"> + <name>ПрисоединенныйФайл</name> + <synonym> + <key>ru</key> + <value>Присоединенный файл</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="587d48a3-5627-4481-b13e-c22740b57d8a"> + <name>ПрисоединенныеФайлы</name> + <synonym> + <key>ru</key> + <value>Присоединенные файлы</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="1f3e3089-1e04-4147-8ece-aa96a76467dd"> + <name>РедактированиеТекстовогоФайла</name> + <synonym> + <key>ru</key> + <value>Редактор текстовых файлов</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="22a213b5-ed72-4181-8ff8-89f860c87aa1"> + <name>РедактируемыеФайлы</name> + <synonym> + <key>ru</key> + <value>Редактируемые файлы</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="4c56cbff-653e-4f16-b702-c77190d7eb7f"> + <name>РежимСозданияФайлаДляСохранитьКак</name> + <synonym> + <key>ru</key> + <value>Режим создания файла для сохранить как</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="172ff335-c7ae-4905-b705-2a1475b95713"> + <name>СписокЗанятыхСВопросом</name> + <synonym> + <key>ru</key> + <value>Список занятых с вопросом</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="db4c311d-ee62-4d47-ac31-5a20cadb7ed1"> + <name>ФайлСуществует</name> + <synonym> + <key>ru</key> + <value>Файл существует</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="cf896f41-7cea-4083-a9f8-96ad881ce641"> + <name>ФайлыВОсновномРабочемКаталоге</name> + <synonym> + <key>ru</key> + <value>Файлы в основном рабочем каталоге</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="1d852dc0-90c9-4568-84f9-b1d822573b6b"> + <name>ФормаВыбораРежимаОткрытия</name> + <synonym> + <key>ru</key> + <value>Форма выбора режима открытия</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="24f85dbd-59be-4b8d-bea8-7ff8ddb7486a"> + <name>ФормаВозвратаФайла</name> + <synonym> + <key>ru</key> + <value>Комментарий к версии</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="c997f56c-ef9c-434e-bc4e-7fc5f885aaba"> + <name>ФормаВопроса</name> + <synonym> + <key>ru</key> + <value>Форма вопроса</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="37c8f5e1-3513-47f8-896d-a54d11b83dcd"> + <name>ФормаИмпортаФайлов</name> + <synonym> + <key>ru</key> + <value>Импорт файлов</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="9e07733c-39f0-491b-91e1-bf2782d957dd"> + <name>ФормаЗавершениеРедактирования</name> + <synonym> + <key>ru</key> + <value>Завершение редактирования</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="cc584a1d-dc91-4693-a5c9-6e8c6607e9d8"> + <name>ФормаИмпортаПапки</name> + <synonym> + <key>ru</key> + <value>Импорт каталога</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="5902d979-1235-4d5a-ace7-93261bdeb725"> + <name>ФормаЭкспортаПапки</name> + <synonym> + <key>ru</key> + <value>Форма экспорта папки</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> + <forms uuid="5a090286-7969-44c9-815b-fc58aeb5d8d3"> + <name>ФормаОтчета</name> + <synonym> + <key>ru</key> + <value>Форма отчета</value> + </synonym> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> +</mdclass:DataProcessor> diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form similarity index 97% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form index e89e453da..7b61b5d42 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form @@ -94,7 +94,7 @@ </items> <items xsi:type="form:Decoration"> <name>ТекстПроДатуДействия</name> - <id>369</id> + <id>366</id> <title> <key>ru</key> <value>действует по настоящие время.</value> @@ -106,7 +106,7 @@ </userVisible> <extendedTooltip> <name>ТекстПроДатуДействияРасширеннаяПодсказка</name> - <id>371</id> + <id>368</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -116,7 +116,7 @@ </extendedTooltip> <contextMenu> <name>ТекстПроДатуДействияКонтекстноеМеню</name> - <id>370</id> + <id>367</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -128,7 +128,7 @@ </items> <items xsi:type="form:Button"> <name>ИсторияИзмененийГиперссылка</name> - <id>372</id> + <id>369</id> <title> <key>ru</key> <value>История изменений</value> @@ -140,7 +140,7 @@ </userVisible> <extendedTooltip> <name>ИсторияИзмененийГиперссылкаРасширеннаяПодсказка</name> - <id>373</id> + <id>370</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -163,12 +163,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа исторический адрес</value> + <value>Дата действия адреса</value> - - ru - Группа исторический адрес - ГруппаИсторическийАдресРасширеннаяПодсказка 359 @@ -342,10 +338,6 @@ ru Страна - - ru - Страна - ГруппаСтраныExtendedTooltip 106 @@ -383,10 +375,6 @@ ru Почтовый индекс российского адреса - - OnChange - ИндексПриИзменении - ИндексExtendedTooltip 110 @@ -416,10 +404,6 @@ TextEditEnd ИндексОкончаниеВводаТекста - - ChoiceProcessing - ИндексОбработкаВыбора - 6 true true @@ -431,7 +415,6 @@ ru ЧЦ=6; ЧРГ=' '; ЧН=; ЧГ=0 - true true true Normal @@ -488,10 +471,6 @@ ru Индекс - - ru - Индекс - ГруппаИндексаExtendedTooltip 109 @@ -516,6 +495,10 @@ true + + <key>ru</key> + <value>Страна адреса</value> + СтранаАдресаExtendedTooltip 105 @@ -546,7 +529,7 @@ ТипАдреса 1 - РоссийскийАдрес + НациональныйАдрес 2 НаселенныйПункт @@ -831,7 +814,7 @@ <key>ru</key> - <value>Группа дом</value> + <value>Дом</value> ГруппаДомExtendedTooltip @@ -983,7 +966,7 @@ <key>ru</key> - <value>Группа строение начальное</value> + <value>Строение начальное</value> ГруппаСтроениеНачальноеExtendedTooltip @@ -1014,7 +997,7 @@ <key>ru</key> - <value>Группа строения дополнительно</value> + <value>Строения дополнительно</value> ГруппаСтроенияДополнительноExtendedTooltip @@ -1043,7 +1026,7 @@ <key>ru</key> - <value>Группа строения</value> + <value>Строения</value> true @@ -1183,7 +1166,7 @@ <key>ru</key> - <value>Группа помещение начальное</value> + <value>Помещение начальное</value> ГруппаПомещениеНачальноеExtendedTooltip @@ -1303,12 +1286,8 @@ <key>ru</key> - <value>Группа команда добавить</value> + <value>Команда добавить</value> - - ru - Группа команда добавить - ГруппаКомандаДобавитьРасширеннаяПодсказка 168 @@ -1335,12 +1314,8 @@ <key>ru</key> - <value>Группа дома и строения</value> + <value>Дома и строения</value> - - ru - Группа дома и строения - false ГруппаДомаИСтроенияРасширеннаяПодсказка @@ -1407,10 +1382,6 @@ ru Сервис доступен - - ru - Сервис доступен - СервисДоступенРасширеннаяПодсказка 275 @@ -1554,6 +1525,10 @@ true + + <key>ru</key> + <value>Сообщения сервиса</value> + ГруппаСообщенияСервисаРасширеннаяПодсказка 259 @@ -1683,10 +1658,6 @@ ru Сообщение об ошибке - - ru - Сообщение об ошибке - СообщениеОбОшибкеРасширеннаяПодсказка 349 @@ -1711,7 +1682,7 @@ <key>ru</key> - <value>Группа описание недоступности сервера</value> + <value>Описание недоступности сервера</value> ГруппаОписаниеНедоступностиСервераРасширеннаяПодсказка @@ -1735,12 +1706,8 @@ <key>ru</key> - <value>Группа общая дома и строения</value> + <value>Общая дома и строения</value> - - ru - Группа общая дома и строения - ГруппаОбщаяДомаИСтроенияРасширеннаяПодсказка 252 @@ -1828,6 +1795,10 @@ true + + <key>ru</key> + <value>Представление адреса контекстное меню группа 1</value> + ПредставлениеАдресаКонтекстноеМенюГруппа1РасширеннаяПодсказка 157 @@ -1867,14 +1838,10 @@ <key>ru</key> - <value>Российский адрес</value> + <value>Национальный адрес</value> - - ru - Российский адрес - - РоссийскийАдресExtendedTooltip + НациональныйАдресРасширеннаяПодсказка 112 Label true @@ -2588,10 +2555,6 @@ ru Иностранный адрес - - ru - Иностранный адрес - ИностранныйАдресExtendedTooltip 131 @@ -2641,10 +2604,6 @@ ru Адрес - - ru - Адрес страница представление - АдресСтраницаПредставлениеРасширеннаяПодсказка 228 @@ -2724,10 +2683,6 @@ ru Комментарий - - ru - Адрес страница комментарий - АдресСтраницаКомментарийРасширеннаяПодсказка 230 @@ -2754,10 +2709,6 @@ ru Адрес представление комментарий - - ru - Адрес представление комментарий - АдресПредставлениеКомментарийРасширеннаяПодсказка 226 @@ -2840,12 +2791,8 @@ <key>ru</key> - <value>Группа проверить заполнения</value> + <value>Проверить заполнения</value> - - ru - Группа проверить заполнения - true ГруппаПроверитьЗаполненияРасширеннаяПодсказка @@ -3013,10 +2960,6 @@ ru Показать адрес на - - ru - Показать адрес на все действия - ПоказатьАдресНаВсеДействияРасширеннаяПодсказка 335 @@ -3042,10 +2985,6 @@ ru Форма ввод адреса в свободной форме - - ru - Форма ввод адреса в свободной форме - ФормаВводАдресаВСвободнойФормеВсеДействияРасширеннаяПодсказка 234 @@ -3151,10 +3090,6 @@ ru Форма изменения адреса все действия - - ru - Форма изменения адреса все действия - ФормаИзмененияАдресаВсеДействияРасширеннаяПодсказка 238 @@ -3260,10 +3195,6 @@ ru Форма стандартные действия - - ru - Форма стандартные действия - ФормаСтандартныеДействияExtendedTooltip 244 @@ -3285,10 +3216,6 @@ ru Все действия - - ru - Все действия - ФормаВсеДействияExtendedTooltip 232 @@ -3397,6 +3324,10 @@ true + + <key>ru</key> + <value>Форма ввод адреса показать</value> + ФормаВводАдресаПоказатьРасширеннаяПодсказка 144 @@ -3498,6 +3429,10 @@ true + + <key>ru</key> + <value>Форма все действия изменения адреса</value> + ФормаВсеДействияИзмененияАдресаРасширеннаяПодсказка 153 @@ -3546,7 +3481,7 @@ true - ИзменитьФормуExtendedTooltip + ИзменитьФормуРасширеннаяПодсказка 147 Label true @@ -3595,6 +3530,10 @@ true + + <key>ru</key> + <value>Панель команд формы</value> + ПанельКомандФормыExtendedTooltip 139 @@ -3619,10 +3558,6 @@ ru Панель команд - - ru - Панель команд - ПанельКомандExtendedTooltip 136 @@ -3799,7 +3734,7 @@ 7 - DataProcessorObject.ВводКонтактнойИнформации + DataProcessorObject.РасширенныйВводКонтактнойИнформации true @@ -3941,10 +3876,10 @@ true - СтранаРоссия + ОсновнаяСтрана <key>ru</key> - <value>Страна россия</value> + <value>Основная страна</value> 18 @@ -4759,17 +4694,14 @@ - АдресДействуетС + ВводНовогоАдреса <key>ru</key> - <value>Адрес действует С</value> + <value>Ввод нового адреса</value> 50 - Date - - Date - + Boolean true @@ -4779,14 +4711,17 @@ - ВводНовогоАдреса + АдресДействуетС <key>ru</key> - <value>Ввод нового адреса</value> + <value>Адрес действует С</value> 51 - Boolean + Date + + Date + true @@ -5016,16 +4951,9 @@ История изменений... 10 - - ru - История изменений - true - - CommonPicture.ИсторияИзменений - ИсторияИзменений diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html similarity index 94% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html index dad65c6f0..d4c8c5e79 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html @@ -6,7 +6,7 @@

              Открывается по кнопке  Выбрать из поля Адрес в элементах списков.

              • В поле Страна выберите страну адреса. Редактирование адресов за пределами Евразийского экономического союза (ЕАЭС) производится в общем поле, без учета частей адреса. Страна "Россия" выбрана программой по умолчанию, при этом поле может быть недоступным в зависимости от настроек. Для того чтобы изменить страну, нажмите  Выбрать. Выбор осуществляется из списка Классификатор стран мира (ОКСМ).
              • Поле Индекс предназначено для ввода почтового индекса, соответствующего данному адресу. Если адрес найден в адресном классификаторе, то индекс может быть проставлен автоматически. Также по индексу, если адресный классификатор по соответствующему региону загружен, можно заполнить адрес. -
              • Поле Город, населенный пункт предназначено для ввода региона, города и т.п. При необходимости можно ввести части адреса детально, нажав  Выбрать. В открывшемся шаблоне введите данные населенного пункта. +
              • Поле Город, населенный пункт предназначено для ввода региона, города и т.п. При необходимости можно ввести части адреса детально, нажав  Выбрать. В открывшемся шаблоне введите данные населенного пункта.
              • Поле Улица предназначено для выбора (нажмите кнопку  Выбрать, в списке улиц найдите нужную) или ввода улицы адреса.
              • Поля Дом, Корпус, Квартира позволяют ввести соответствующие части адреса. Можно изменить эти варианты, выбрав дополнительные значения из выпадающего списка.
              • Также можно  Добавить дополнительные поля для ввода других предопределенных частей адреса, таких как Строение, Литера, Сооружение, Участок, Офис, Бокс, Помещение, Комната.  @@ -41,10 +41,10 @@
              • После выбора команды программой выводится сообщение с предупреждением: "Адреса, введенные в свободной форме, могут не пройти проверку по адресному классификатору". Для подтверждения выбора нажмите кнопку Да, для возврата к вводу адреса по шаблону нажмите Нет.
              • Выводится шаблон для ввода адреса, но все его поля, кроме полей Представление адреса и Комментарий, становятся неактивными. Заполните поле Представление адреса. При переходе к полю Комментарий или нажатии кнопки ОК заполняются те поля шаблона, которые программе удалось распознать в строке адреса (т.е. в этих полях нет ошибок). Проверка заполнения адреса в данном случае отключена.
              • Для подтверждения адреса нажмите ОК. Программой будет зафиксировано, что адрес заполнен в свободной форме и на просмотр адрес будет выводиться  в таком виде.

              Заполнение адреса по почтовому индексу

              -
              • Если известен индекс адреса и адресный классификатор по соответствующему региону загружен, то с помощью команды Еще - Заполнить по почтовому индексу имеется возможность по индексу найти адрес. Для выбора выводятся только те адреса, которые соответствуют введенному индексу. Выберите нужную часть адреса, дозаполните оставшиеся поля. +
                • Если известен индекс адреса и адресный классификатор по соответствующему региону загружен, то с помощью команды Еще - Заполнить по почтовому индексу имеется возможность по индексу найти адрес. Для выбора выводятся только те адреса, которые соответствуют введенному индексу. Выберите нужную часть адреса, дозаполните оставшиеся поля.
                • Если указан почтовый индекс, сведения о котором отсутствует в программе, то в сообщении будет предложено загрузить адресные сведения для соответствующего региона с сайта фирмы "1С". Нажмите кнопку Обновить классификатор. Будет произведена загрузка классификатора по соответствующему региону. Регион будет выбран по умолчанию.

                Очистка адреса

                • С помощью команды меню Еще - Очистить адрес  можно стереть неправильно введенный адрес.

                Загрузка классификатора

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

                См. также:

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl similarity index 84% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl index b3d6a2173..28f5f25f5 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl @@ -33,10 +33,10 @@ КонецЕсли; // Настройки формы - ЭтоВебСервис = УправлениеКонтактнойИнформациейСлужебный.КлассификаторДоступенЧерезВебСервис(); - ЕстьПравоЗагружатьКлассификатор = УправлениеКонтактнойИнформациейСлужебный.ЕстьВозможностьИзмененияАдресногоКлассификатора() И Не ЭтоВебСервис; + ЭтоВебСервис = Обработки.РасширенныйВводКонтактнойИнформации.КлассификаторДоступенЧерезВебСервис(); + ЕстьПравоЗагружатьКлассификатор = Обработки.РасширенныйВводКонтактнойИнформации.ЕстьВозможностьИзмененияАдресногоКлассификатора() И Не ЭтоВебСервис; ЕстьКлассификатор = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.АдресныйКлассификаторДоступен(); - ЭтоТакси = ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Такси; // Группа команд "все действия" зависит от интерфейса. + ЭтоТакси = КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Такси; // Группа команд "все действия" зависит от интерфейса. УстановитьВозможностьПодбораИндексаИНомеровДомов(ЭтоВебСервис); @@ -45,7 +45,7 @@ ЦветФонаУправляющегоПоля = ЦветаСтиля.ФонУправляющегоПоля; ЦветФонаФормы = ЦветаСтиля.ЦветФонаФормы; АвтоЦвет = Новый Цвет; - СтранаРоссия = Справочники.СтраныМира.Россия; + ОсновнаяСтрана = РаботаСАдресами.ОсновнаяСтрана(); ВидКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Параметры.ВидКонтактнойИнформации); @@ -83,13 +83,13 @@ Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), ВидКонтактнойИнформации.Наименование, Параметры.Заголовок); СкрыватьНеактуальныеАдреса = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса; - АдресТолькоРоссийский = ВидКонтактнойИнформации.АдресТолькоРоссийский; + ТолькоНациональныйАдрес = ВидКонтактнойИнформации.ТолькоНациональныйАдрес; ТипКонтактнойИнформации = ВидКонтактнойИнформации.Тип; - ЗаполнитьВариантыДомовСтроенийКвартир(); + ЗаполнитьПредопределенныеВариантыАдреса(Параметры); // Пытаемся заполнить из параметров. - Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Параметры.ЗначенияПолей) + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Параметры.ЗначенияПолей) И ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда РезультатыЧтения = Новый Структура; XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(Параметры.ЗначенияПолей, ТипКонтактнойИнформации, РезультатыЧтения); @@ -97,18 +97,18 @@ // Распознали с ошибками, сообщим при открытии. ТекстПредупрежденияПриОткрытии = РезультатыЧтения.ТекстОшибки; XDTOКонтактная.Представление = Параметры.Представление; - XDTOКонтактная.Состав.Страна = Строка(СтранаРоссия); + XDTOКонтактная.Состав.Страна = Строка(ОсновнаяСтрана); КонецЕсли; Иначе XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.АдресXMLВXDTO(Параметры.ЗначенияПолей, Параметры.Представление, ); - Если Параметры.Свойство("Страна") И ЗначениеЗаполнено(Параметры.Страна) Тогда + Если Параметры.Свойство("Страна") И ЗначениеЗаполнено(Параметры.Страна) Тогда Если ТипЗнч(Параметры.Страна) = ТипЗнч(Справочники.СтраныМира.ПустаяСсылка()) Тогда XDTOКонтактная.Состав.Страна = Параметры.Страна.Наименование; Иначе XDTOКонтактная.Состав.Страна = Строка(Параметры.Страна); КонецЕсли; Иначе - XDTOКонтактная.Состав.Страна = СтранаРоссия.Наименование; + XDTOКонтактная.Состав.Страна = ОсновнаяСтрана.Наименование; КонецЕсли; КонецЕсли; @@ -122,28 +122,30 @@ Если ЗначениеЗаполнено(Страна) Тогда КодСтраны = Страна.Код; Иначе - Страна = СтранаРоссия; - КодСтраны = СтранаРоссия.Код; + Страна = ОсновнаяСтрана; + КодСтраны = ОсновнаяСтрана.Код; КонецЕсли; ОтобразитьДополнительныеЗданияИПомещения(); - Если АдресТолькоРоссийский Тогда + Если ТолькоНациональныйАдрес Тогда Элементы.Страна.Доступность = Ложь; Элементы.Страна.ЦветФона = АвтоЦвет; // Проверяем на корректность - Если Страна <> СтранаРоссия Тогда + Если Страна <> ОсновнаяСтрана Тогда // Считаем адрес российским ПредставлениеАдресаИзменено = Истина; - ТекстПредупрежденияПриОткрытии = НСтр("ru = 'Адрес введен некорректно: допускается ввод только российских адресов. Значение поля ""Страна"" было изменено на ""Россия"", необходимо проверить остальные поля.'"); + ТекстПредупрежденияПриОткрытии = НСтр("ru = 'Адрес введен некорректно: допускается ввод только национальных адресов. + |Значение поля ""Страна"" было изменено на %1, необходимо проверить остальные поля.'"); + ТекстПредупрежденияПриОткрытии = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупрежденияПриОткрытии, ОсновнаяСтрана.Наименование); ПолеПредупрежденияПриОткрытии = "Страна"; Модифицированность = Истина; КонецЕсли; - Страна = СтранаРоссия; + Страна = ОсновнаяСтрана; КонецЕсли; // Проверка какой адрес - Если Страна = СтранаРоссия Тогда + Если Страна = ОсновнаяСтрана Тогда Элементы.ОКТМО.Видимость = ВидКонтактнойИнформации.УказыватьОКТМО; Если Не ЭтоВебСервис Тогда @@ -278,79 +280,93 @@ &НаКлиенте Процедура ИндексИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) - ФормаВыбораУлицПоИндексу(Текст, СтандартнаяОбработка); + + Если СтрДлина(СокрЛП(Текст)) = 6 И СтрСравнить(Индекс, Текст) <> 0 И Страна = ОсновнаяСтрана Тогда + СтандартнаяОбработка = Ложь; + ФормаВыбораУлицПоИндексу(Текст); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ИндексОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка) - ФормаВыбораУлицПоИндексу(Текст, СтандартнаяОбработка); -КонецПроцедуры - -&НаКлиенте -Процедура ИндексПриИзменении(Элемент) - ОбновитьПредставлениеАдреса(); + + Если СтрДлина(СокрЛП(Текст)) = 6 И СтрСравнить(Индекс, Текст) <> 0 И Страна = ОсновнаяСтрана Тогда + СтандартнаяОбработка = Ложь; + ФормаВыбораУлицПоИндексу(Текст); + Иначе + Индекс = Текст; + ОбновитьПредставлениеАдреса(); + КонецЕсли; + КонецПроцедуры &НаКлиенте Функция ОткрытьФормуВыборАдресаПоПочтовомуИндексу(Результат, ПараметрыФормы) Экспорт - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); + Если Результат <> Неопределено Тогда + Оповещение = Новый ОписаниеОповещения("ПослеВыбораАдресаПоИндексу", ЭтотОбъект); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс,,,, Оповещение); + Иначе + ОбновитьПредставлениеАдреса(); + КонецЕсли; КонецФункции &НаКлиенте -Процедура ФормаВыбораУлицПоИндексу(Знач Текст, СтандартнаяОбработка) +Процедура ФормаВыбораУлицПоИндексу(Знач Текст) - Если СтрДлина(СокрЛП(Текст)) = 6 И Индекс <> Текст И Страна = СтранаРоссия Тогда - Индекс = Текст; - Если ЕстьКлассификатор Тогда - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Индекс", СокрЛП(Текст)); - ПараметрыФормы.Вставить("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); - ПараметрыФормы.Вставить("ФорматАдреса", ВидКонтактнойИнформации.ФорматАдреса); - ПараметрыФормы.Вставить("ВыборАдресаПоПочтовомуИндексу", Истина); - ПараметрыВыполнения = Новый Структура("Уникальность, Окно, НавигационнаяСсылка, Источник", Ложь); - - Если ЭтоВебСервис ИЛИ НаличиеИндексаВКлассификаторе(Число(Текст)) Тогда - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); - ИначеЕсли ЕстьПравоЗагружатьКлассификатор Тогда - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ОповещениеОЗакрытие = Новый ОписаниеОповещения("ОткрытьФормуВыборАдресаПоПочтовомуИндексу", ЭтотОбъект, ПараметрыФормы); - МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); - МодульАдресныйКлассификаторКлиент.ОткрытьФормуЗагрузкиАдресногоКлассификатора(ПараметрыВыполнения, ПараметрыФормы, ОповещениеОЗакрытие); - КонецЕсли; + Модифицированность = Истина; + Индекс = Текст; + Если ЕстьКлассификатор Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Индекс", СокрЛП(Текст)); + ПараметрыФормы.Вставить("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); + ПараметрыФормы.Вставить("ФорматАдреса", ВидКонтактнойИнформации.ФорматАдреса); + ПараметрыФормы.Вставить("ВыборАдресаПоПочтовомуИндексу", Истина); + + Если ЭтоВебСервис ИЛИ НаличиеИндексаВКлассификаторе(Число(Текст)) Тогда + Оповещение = Новый ОписаниеОповещения("ПослеВыбораАдресаПоИндексу", ЭтотОбъект); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс,,,, Оповещение); + ИначеЕсли ЕстьПравоЗагружатьКлассификатор Тогда + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + ОповещениеОЗакрытие = Новый ОписаниеОповещения("ОткрытьФормуВыборАдресаПоПочтовомуИндексу", ЭтотОбъект, ПараметрыФормы); + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + МодульАдресныйКлассификаторКлиент.ПоказатьФормуЗагрузкиАдресногоКлассификатора(ОповещениеОЗакрытие, ПараметрыФормы); КонецЕсли; - Иначе - ОбновитьПредставлениеАдреса(); КонецЕсли; + Иначе + ОбновитьПредставлениеАдреса(); КонецЕсли; + КонецПроцедуры &НаКлиенте -Процедура ИндексОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) +Процедура ПослеВыбораАдресаПоИндексу(Результат, ДополнительныеПараметры) Экспорт - СтандартнаяОбработка = Ложь; - Если ВыбранноеЗначение = Неопределено Тогда - Возврат; - ИначеЕсли ВыбранноеЗначение.Отказ Тогда - Если ВыбранноеЗначение.Свойство("Индекс") И НЕ ПустаяСтрока(ВыбранноеЗначение.Индекс) Тогда - ОбновитьПредставлениеАдреса(); - Возврат; - Иначе - Если НЕ ПодборПоИндексуДоступен Тогда - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Индекс %1 не найден в адресном классификаторе'"), - Формат(ВыбранноеЗначение.Индекс, "ЧРГ=' '; ЧГ=0")); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,, "Объект.Индекс"); + Если Результат <> Неопределено Тогда + + Если Результат.Отказ Тогда + Если Результат.Свойство("Индекс") И НЕ ПустаяСтрока(Результат.Индекс) Тогда + ОбновитьПредставлениеАдреса(); + Возврат; Иначе - ПроверитьДоступностьКлассификатора(); + Если НЕ ПодборПоИндексуДоступен Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Индекс %1 не найден в адресном классификаторе'"), + Формат(Результат.Индекс, "ЧРГ=' '; ЧГ=0")); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,, "Объект.Индекс"); + Иначе + ПроверитьДоступностьКлассификатора(); + КонецЕсли; КонецЕсли; + Возврат; КонецЕсли; - Возврат; - КонецЕсли; + + Контекст = КонтекстФормыКлиент(); + ЗаполнитьАдресПоДаннымИндекса(Контекст, Результат); + КонтекстФормыКлиент(Контекст); + Модифицированность = Истина; + ТекущийЭлемент = Элементы.Дом; - Контекст = КонтекстФормыКлиент(); - ЗаполнитьАдресПоДаннымИндекса(Контекст, ВыбранноеЗначение); - КонтекстФормыКлиент(Контекст); - Модифицированность = Истина; - ТекущийЭлемент = Элементы.Дом; + КонецЕсли; КонецПроцедуры @@ -364,9 +380,9 @@ // Предполагаем, что адрес все еще российский. XDTOАдрес = XDTOКонтактнаяИнфо.Состав.Состав; - УправлениеКонтактнойИнформациейСлужебный.ПочтовыйИндексАдреса(XDTOАдрес, ДанныеИндекса.Индекс); - УправлениеКонтактнойИнформациейСлужебный.УстановитьНаселенныйПунктАдресаПоИдентификатору(XDTOАдрес, ДанныеИндекса.Идентификатор); - УправлениеКонтактнойИнформациейСлужебный.УстановитьУлицуАдресаПоИдентификатору(XDTOАдрес, ДанныеИндекса.Идентификатор); + Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(XDTOАдрес, ДанныеИндекса.Индекс); + Обработки.РасширенныйВводКонтактнойИнформации.УстановитьНаселенныйПунктАдресаПоИдентификатору(XDTOАдрес, ДанныеИндекса.Идентификатор); + Обработки.РасширенныйВводКонтактнойИнформации.УстановитьУлицуАдресаПоИдентификатору(XDTOАдрес, ДанныеИндекса.Идентификатор); ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, XDTOКонтактнаяИнфо); ЗаполнитьПредставлениеАдреса(Контекст); @@ -438,6 +454,7 @@ КонецЕсли; КонецПроцедуры + &НаКлиенте Процедура ТипПомещенияПриИзменении(Элемент) @@ -493,7 +510,7 @@ ПараметрыФормы.Вставить("ФорматАдреса", ВидКонтактнойИнформации.ФорматАдреса); ПараметрыФормы.Вставить("СервисКлассификатораНедоступен", НЕ ЕстьКлассификатор); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.НаселенныйПунктАдреса", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.НаселенныйПунктАдреса", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры @@ -538,7 +555,7 @@ РегионНеЗагружен = ВыбранноеЗначение.Свойство("РегионЗагружен") И (Не ВыбранноеЗначение.РегионЗагружен); Если ЕстьПравоЗагружатьКлассификатор И РегионНеЗагружен Тогда // Предлагаем загрузить классификатор. - УправлениеКонтактнойИнформациейКлиент.ПредложениеЗагрузкиКлассификатора( + ПредложениеЗагрузкиКлассификатора( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Данные для ""%1"" не загружены.'"), ВыбранноеЗначение.Представление), ВыбранноеЗначение.Представление); КонецЕсли; @@ -555,6 +572,7 @@ ОбработкаИзмененияУлицыСервер(Контекст); КонтекстФормыКлиент(Контекст); + КонецПроцедуры &НаКлиенте @@ -641,7 +659,7 @@ ПараметрыФормы.Вставить("Заголовок", НаселенныйПункт + " " + НСтр("ru = '(не найден)'")); КонецЕсли; - УправлениеКонтактнойИнформациейКлиент.НачалоВыбораУлицы(Элемент, ИдентификаторНаселенногоПункта, Улица, ПараметрыФормы); + НачалоВыбораУлицы(Элемент, ИдентификаторНаселенногоПункта, Улица, ПараметрыФормы); КонецПроцедуры &НаКлиенте @@ -669,10 +687,9 @@ Иначе НаселенныйПунктДетально.Улица.Представление = ВыбранноеЗначение.Улица; НаселенныйПунктДетально.ДополнительныйЭлемент.Представление = ВыбранноеЗначение.ДополнительныйЭлемент; - Если ЗначениеЗаполнено(ВыбранноеЗначение.ДополнительныйЭлемент) Тогда НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ВыбранноеЗначение.ДополнительныйЭлемент); - НаселенныйПунктДетально.ДополнительныйЭлемент.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, НаименованиеСокращение.Сокращение); + НаселенныйПунктДетально.ДополнительныйЭлемент.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, НаименованиеСокращение.Сокращение); КонецЕсли; НаселенныйПунктДетально.ПодчиненныйЭлемент.Представление = ВыбранноеЗначение.ПодчиненныйЭлемент; НаселенныйПунктДетально.Улица.Идентификатор = ВыбранноеЗначение.Идентификатор; @@ -766,6 +783,7 @@ КонецПроцедуры + &НаКлиенте Процедура ПредставлениеАдресаПриИзменении(Элемент) ПредставлениеАдресаИзменено = Истина; @@ -806,7 +824,7 @@ ПараметрыФормы.Вставить("НаселенныйПунктДетально", НаселенныйПунктДетально); ПараметрыФормы.Вставить("ФорматАдреса","КЛАДР"); ПараметрыФормы.Вставить("СервисКлассификатораНедоступен", Истина); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.НаселенныйПунктАдреса", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.НаселенныйПунктАдреса", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаКлиенте @@ -846,7 +864,7 @@ РегионНеЗагружен = ВыбранноеЗначение.Свойство("РегионЗагружен") И (Не ВыбранноеЗначение.РегионЗагружен); Если ЕстьПравоЗагружатьКлассификатор И РегионНеЗагружен Тогда // Предлагаем загрузить классификатор. - УправлениеКонтактнойИнформациейКлиент.ПредложениеЗагрузкиКлассификатора( + ПредложениеЗагрузкиКлассификатора( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Данные для ""%1"" не загружены.'"), ВыбранноеЗначение.Представление), ВыбранноеЗначение.Представление); КонецЕсли; @@ -895,7 +913,7 @@ &НаКлиенте Процедура АдресНаДатуАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - Если СтрСравнить(Текст, НСтр("ru='начала учета'")) = 0 Или ПустаяСтрока(Текст) Тогда + Если СтрСравнить(Текст, НСтр("ru='начало учета'")) = 0 Или ПустаяСтрока(Текст) Тогда Элементы.АдресНаДату.ФорматРедактирования = ""; КонецЕсли; КонецПроцедуры @@ -920,10 +938,10 @@ АдресДействуетС = АдресНаДату; КонецЕсли; - ПерезаполнитьФормуВводаАдреса(Контекст, ЗначенияПолей, Тип, СтранаРоссия); + ПерезаполнитьФормуВводаАдреса(Контекст, ЗначенияПолей, Тип, ОсновнаяСтрана); КонтекстФормыКлиент(Контекст); ОтобразитьДополнительныеЗданияИПомещения(); - + Если ЗначениеЗаполнено(Результат.ДействуетПо) Тогда ТекстИсторическийАдрес = " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'действует по %1'"), Формат(Результат.ДействуетПо - 10, "ДЛФ=DD")); Иначе @@ -934,7 +952,8 @@ АдресДействуетС = АдресНаДату; КонецЕсли; - Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""начала учета""'"); + ТекстНачалаУчета = НСтр("ru = 'начало учета'"); + Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + ТекстНачалаУчета + """'"); КонецПроцедуры @@ -982,7 +1001,7 @@ Если ЕстьКлассификатор И Не ПустаяСтрока(Индекс) Тогда ПараметрыФормы = Новый Структура("Индекс, СкрыватьНеактуальныеАдреса", СокрЛП(Индекс), СкрыватьНеактуальныеАдреса); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); КонецЕсли; КонецПроцедуры @@ -993,7 +1012,7 @@ СведенияОРегионе = СведенияОРегионе(НаселенныйПунктДетально.Регион.Представление); ДополнительныеПараметры = Новый Структура("КодРегионаДляЗагрузки", СведенияОРегионе.КодСубъектаРФ); - УправлениеКонтактнойИнформациейКлиент.ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); + ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); КонецПроцедуры &НаКлиенте @@ -1106,7 +1125,7 @@ ПараметрыФормы.Вставить("ТипСтроения", ТипСтроения); ПараметрыФормы.Вставить("Отбор", ВключитьОтбор); ОповещениеОЗакрытие = Новый ОписаниеОповещения("ВыбранДома", ЭтотОбъект); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборДома", ПараметрыФормы,,,,, ОповещениеОЗакрытие, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборДома", ПараметрыФормы,,,,, ОповещениеОЗакрытие, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); Иначе Если ЗначениеЗаполнено(ПредставлениеАдреса) Тогда ТекстПредупреждения = НСтр("ru = 'Выбор из списка недоступен, т.к в адресном классификаторе отсутствует информация о нумерации домов для введенного адреса.'"); @@ -1173,70 +1192,7 @@ Результат = Результат.ДанныеВыбора; Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда - Результат.Вставить("ДействуетС", ?(ВводНовогоАдреса, АдресНаДату, АдресДействуетС)); - ИмяРеквизита = ""; - Отбор = Новый Структура("Вид", Результат.Вид); - - СтрокаДействующегоАдреса = Неопределено; - ДатаБылаИзменена = Истина; - ТекущаяДатаАдреса = ОбщегоНазначенияКлиент.ДатаСеанса(); - Дельта = АдресНаДату - ТекущаяДатаАдреса; - МинимальнаяДельта = ?(Дельта > 0, Дельта, -Дельта); - НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); - - Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл - Если ЗначениеЗаполнено(НайденнаяСтрока.ИмяРеквизита) Тогда - ИмяРеквизита = НайденнаяСтрока.ИмяРеквизита; - КонецЕсли; - Если НайденнаяСтрока.ДействуетС = АдресНаДату Тогда - ДатаБылаИзменена = Ложь; - СтрокаДействующегоАдреса = НайденнаяСтрока; - Прервать; - КонецЕсли; - - Дельта = ТекущаяДатаАдреса - НайденнаяСтрока.ДействуетС; - Дельта = ?(Дельта > 0, Дельта, -Дельта); - Если Дельта <= МинимальнаяДельта Тогда - МинимальнаяДельта = Дельта; - СтрокаДействующегоАдреса = НайденнаяСтрока; - КонецЕсли; - КонецЦикла; - - Если ДатаБылаИзменена Тогда - - Отбор = Новый Структура("ДействуетС, Вид", АдресДействуетС, Результат.Вид); - СтрокиСАдресом = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); - - ПредставлениеРедактируемогоАдреса = ?(СтрокиСАдресом.Количество() > 0, СтрокиСАдресом[0].Представление, ""); - Если СтрСравнить(Результат.Представление, ПредставлениеРедактируемогоАдреса) <> 0 Тогда - НоваяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяКонтактнаяИнформация, Результат); - НоваяКонтактнаяИнформация.ЗначенияПолей = Результат.КонтактнаяИнформация; - НоваяКонтактнаяИнформация.ДействуетС = АдресНаДату; - НоваяКонтактнаяИнформация.ХранитьИсториюИзменений = Истина; - Если СтрокаДействующегоАдреса = Неопределено Тогда - Отбор = Новый Структура("ЭтоИсторическаяКонтактнаяИнформация, Вид", Ложь, Результат.Вид); - НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); - Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл - НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина; - НайденнаяСтрока.ИмяРеквизита = ""; - КонецЦикла; - НоваяКонтактнаяИнформация.ИмяРеквизита = ИмяРеквизита; - НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Ложь; - Иначе - НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина; - Результат.Представление = СтрокаДействующегоАдреса.Представление; - Результат.КонтактнаяИнформация = СтрокаДействующегоАдреса.ЗначенияПолей; - КонецЕсли; - КонецЕсли; - Иначе - Если СтрСравнить(Результат.Представление, СтрокаДействующегоАдреса.Представление) <> 0 Тогда - ЗаполнитьЗначенияСвойств(СтрокаДействующегоАдреса, Результат); - СтрокаДействующегоАдреса.ЗначенияПолей = Результат.КонтактнаяИнформация; - СтрокаДействующегоАдреса.ИмяРеквизита = ИмяРеквизита; - СтрокаДействующегоАдреса.ЭтоИсторическаяКонтактнаяИнформация = Ложь; - КонецЕсли; - КонецЕсли; + ОбработатьКонтактнуюИнформациюСИсторией(Результат); КонецЕсли; Если ТипЗнч(Результат) = Тип("Структура") Тогда @@ -1282,6 +1238,75 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбработатьКонтактнуюИнформациюСИсторией(Результат) + + Результат.Вставить("ДействуетС", ?(ВводНовогоАдреса, АдресНаДату, АдресДействуетС)); + ИмяРеквизита = ""; + Отбор = Новый Структура("Вид", Результат.Вид); + + СтрокаДействующегоАдреса = Неопределено; + ДатаБылаИзменена = Истина; + ТекущаяДатаАдреса = ОбщегоНазначенияКлиент.ДатаСеанса(); + Дельта = АдресНаДату - ТекущаяДатаАдреса; + МинимальнаяДельта = ?(Дельта > 0, Дельта, -Дельта); + НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если ЗначениеЗаполнено(НайденнаяСтрока.ИмяРеквизита) Тогда + ИмяРеквизита = НайденнаяСтрока.ИмяРеквизита; + КонецЕсли; + Если НайденнаяСтрока.ДействуетС = АдресНаДату Тогда + ДатаБылаИзменена = Ложь; + СтрокаДействующегоАдреса = НайденнаяСтрока; + Прервать; + КонецЕсли; + + Дельта = ТекущаяДатаАдреса - НайденнаяСтрока.ДействуетС; + Дельта = ?(Дельта > 0, Дельта, -Дельта); + Если Дельта <= МинимальнаяДельта Тогда + МинимальнаяДельта = Дельта; + СтрокаДействующегоАдреса = НайденнаяСтрока; + КонецЕсли; + КонецЦикла; + + Если ДатаБылаИзменена Тогда + + Отбор = Новый Структура("ДействуетС, Вид", АдресДействуетС, Результат.Вид); + СтрокиСАдресом = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + + ПредставлениеРедактируемогоАдреса = ?(СтрокиСАдресом.Количество() > 0, СтрокиСАдресом[0].Представление, ""); + Если СтрСравнить(Результат.Представление, ПредставлениеРедактируемогоАдреса) <> 0 Тогда + НоваяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяКонтактнаяИнформация, Результат); + НоваяКонтактнаяИнформация.ЗначенияПолей = Результат.КонтактнаяИнформация; + НоваяКонтактнаяИнформация.ДействуетС = АдресНаДату; + НоваяКонтактнаяИнформация.ХранитьИсториюИзменений = Истина; + Если СтрокаДействующегоАдреса = Неопределено Тогда + Отбор = Новый Структура("ЭтоИсторическаяКонтактнаяИнформация, Вид", Ложь, Результат.Вид); + НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина; + НайденнаяСтрока.ИмяРеквизита = ""; + КонецЦикла; + НоваяКонтактнаяИнформация.ИмяРеквизита = ИмяРеквизита; + НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Ложь; + Иначе + НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина; + Результат.Представление = СтрокаДействующегоАдреса.Представление; + Результат.КонтактнаяИнформация = СтрокаДействующегоАдреса.ЗначенияПолей; + КонецЕсли; + КонецЕсли; + Иначе + Если СтрСравнить(Результат.Представление, СтрокаДействующегоАдреса.Представление) <> 0 Тогда + ЗаполнитьЗначенияСвойств(СтрокаДействующегоАдреса, Результат); + СтрокаДействующегоАдреса.ЗначенияПолей = Результат.КонтактнаяИнформация; + СтрокаДействующегоАдреса.ИмяРеквизита = ИмяРеквизита; + СтрокаДействующегоАдреса.ЭтоИсторическаяКонтактнаяИнформация = Ложь; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ПослеЗакрытияФормыИстории(Результат, ДополнительныеПараметры) Экспорт @@ -1294,7 +1319,7 @@ Контекст = ДополнительныеПараметры.Контекст; Контекст.АдресНаДату = Результат.ТекущийАдрес; АдресДействуетС = Контекст.АдресНаДату; - ПерезаполнитьФормуВводаАдреса(Контекст, "", ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес"), СтранаРоссия); + ПерезаполнитьФормуВводаАдреса(Контекст, "", ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес"), ОсновнаяСтрана); КонтекстФормыКлиент(Контекст); ОтобразитьДополнительныеЗданияИПомещения(); Иначе @@ -1320,7 +1345,7 @@ Если НачалоДня(Результат.ТекущийАдрес) = НачалоДня(СтрокаКонтактнойИнформации.ДействуетС) Тогда Контекст = ДополнительныеПараметры.Контекст; Контекст.АдресНаДату = Результат.ТекущийАдрес; - ПерезаполнитьФормуВводаАдреса(Контекст, СтрокаКонтактнойИнформации.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип, СтранаРоссия); + ПерезаполнитьФормуВводаАдреса(Контекст, СтрокаКонтактнойИнформации.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип, ОсновнаяСтрана); КонтекстФормыКлиент(Контекст); ОтобразитьДополнительныеЗданияИПомещения(); КонецЕсли; @@ -1352,13 +1377,13 @@ Строка = ДополнительныеЗдания.Добавить(); Строка.Тип = ВыбранныйЭлемент.Представление; - Строка.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); + Строка.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); ИмяТекущего = ОтобразитьДополнительныеЗдания(); Иначе Строка = ДополнительныеПомещения.Добавить(); Строка.Тип = ВыбранныйЭлемент.Представление; - Строка.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); + Строка.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); ИмяТекущего = ОтобразитьДополнительныеПомещения(); КонецЕсли; @@ -1385,7 +1410,7 @@ КонецЕсли; РазрешитьВводАдресаВСвободнойФорме = Не РазрешитьВводАдресаВСвободнойФорме; - СписокСтран = УправлениеКонтактнойИнформациейКлиент.СтраныПоддерживающиеСтруктурированныйВвод(); + СписокСтран = СтраныПоддерживающиеСтруктурированныйВвод(); Если ЗначениеЗаполнено(СписокСтран[ВРег(Страна)]) Тогда // ЕАЭС Контекст = КонтекстФормыКлиент(); @@ -1409,8 +1434,8 @@ // Обновляем некоторые флаги ЗначениеФлагов = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Контекст.ВидКонтактнойИнформации.Ссылка); - Контекст.ВидКонтактнойИнформации.АдресТолькоРоссийский = ЗначениеФлагов.АдресТолькоРоссийский; - Контекст.ВидКонтактнойИнформации.ПроверятьКорректность = ЗначениеФлагов.ПроверятьКорректность; + Контекст.ВидКонтактнойИнформации.ТолькоНациональныйАдрес = ЗначениеФлагов.ТолькоНациональныйАдрес; + Контекст.ВидКонтактнойИнформации.ПроверятьКорректность = ЗначениеФлагов.ПроверятьКорректность; Возврат РезультатВыбора(Контекст, ВозвращатьСписокЗначений); КонецФункции @@ -1421,9 +1446,9 @@ Результат = Новый Структура("ДанныеВыбора, ОшибкиЗаполнения"); Если ВозвращатьСписокЗначений Тогда - ДанныеВыбора = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтаруюСтруктуру(XDTOИнформация); + ДанныеВыбора = Обработки.РасширенныйВводКонтактнойИнформации.КонтактнаяИнформацияВСтаруюСтруктуру(XDTOИнформация); ДанныеВыбора = ДанныеВыбора.ЗначенияПолей; - ИначеЕсли Контекст.Страна = Контекст.СтранаРоссия И ПустаяСтрока(XDTOИнформация.Представление) Тогда + ИначеЕсли Контекст.Страна = Контекст.ОсновнаяСтрана И ПустаяСтрока(XDTOИнформация.Представление) Тогда ДанныеВыбора = ""; Иначе ДанныеВыбора = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(XDTOИнформация); @@ -1436,7 +1461,7 @@ Результат.ДанныеВыбора.Вставить("ВведеноВСвободнойФорме", УправлениеКонтактнойИнформациейСлужебный.АдресВведенВСвободнойФорме(XDTOИнформация)); - Результат.ОшибкиЗаполнения = УправлениеКонтактнойИнформациейСлужебный.ОшибкиЗаполненияАдресаXDTO( + Результат.ОшибкиЗаполнения = Обработки.РасширенныйВводКонтактнойИнформации.ОшибкиЗаполненияАдресаXDTO( XDTOИнформация.Состав, Контекст.ВидКонтактнойИнформации); Если Контекст.ВидКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес @@ -1466,7 +1491,7 @@ КонецЕсли; // Получаем список значений: XPath - текст ошибки. - Результат = УправлениеКонтактнойИнформациейСлужебный.ОшибкиЗаполненияАдресаXDTO( + Результат = Обработки.РасширенныйВводКонтактнойИнформации.ОшибкиЗаполненияАдресаXDTO( XDTOИнформация.Состав, ПараметрыПроверки); Если Результат.Количество() = 0 // Нет ошибок @@ -1500,13 +1525,14 @@ XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(ЗначенияПолей, ТипКонтактнойИнформации, РезультатыЧтения); Если ПустаяСтрока(ЗначенияПолей) Тогда ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + ПространствоИменРФ = РаботаСАдресами.ПространствоИмен(); XDTOКонтактная.Состав.Страна = СтранаРоссия.Наименование; - XDTOКонтактная.Состав.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ")); + XDTOКонтактная.Состав.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменРФ, "АдресРФ")); КонецЕсли; ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, XDTOКонтактная); Возврат РезультатыЧтения; - + КонецФункции &НаСервереБезКонтекста @@ -1626,14 +1652,14 @@ Если Улица <> Неопределено Тогда Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Представление = Улица.Значение; Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Идентификатор = Улица.Идентификатор; - ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Сокращение); + ПутьXPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Сокращение); Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.ПутьXPath = ПутьXPath; ИдентификаторУлицы = Новый УникальныйИдентификатор(Улица.Идентификатор); Улица = АнализКлассификатора.Найти(91, "Уровень"); Если Улица <> Неопределено Тогда Контекст.НаселенныйПунктДетально.ПодчиненныйЭлемент.Представление = Улица.Значение; Контекст.НаселенныйПунктДетально.ПодчиненныйЭлемент.Идентификатор = Улица.Идентификатор; - ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91, Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Сокращение); + ПутьXPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91, Контекст.НаселенныйПунктДетально.ДополнительныйЭлемент.Сокращение); Контекст.НаселенныйПунктДетально.ПодчиненныйЭлемент.ПутьXPath = ПутьXPath; ИдентификаторУлицы = Новый УникальныйИдентификатор(Улица.Идентификатор); КонецЕсли; @@ -1663,13 +1689,13 @@ &НаКлиенте Процедура ОбработкаИзмененияСтраныКлиент() - ЭтоРоссийскийАдрес = (Страна = СтранаРоссия); - Элементы.ТипАдреса.ТекущаяСтраница = ?(ЭтоРоссийскийАдрес, Элементы.РоссийскийАдрес, Элементы.ИностранныйАдрес); + ЭтоНациональныйАдрес = (Страна = ОсновнаяСтрана); + Элементы.ТипАдреса.ТекущаяСтраница = ?(ЭтоНациональныйАдрес, Элементы.НациональныйАдрес, Элементы.ИностранныйАдрес); // Проверять, вводить в свободной форме и искать по индексу можем только российские адреса. - Элементы.ПроверитьЗаполнениеАдреса.Доступность = ЭтоРоссийскийАдрес; - Элементы.ЗаполнитьПоПочтовомуИндексу.Доступность = ЭтоРоссийскийАдрес; - Элементы.ЗаполнитьПоПочтовомуИндексуВсеДействия.Доступность = ЭтоРоссийскийАдрес; + Элементы.ПроверитьЗаполнениеАдреса.Доступность = ЭтоНациональныйАдрес; + Элементы.ЗаполнитьПоПочтовомуИндексу.Доступность = ЭтоНациональныйАдрес; + Элементы.ЗаполнитьПоПочтовомуИндексуВсеДействия.Доступность = ЭтоНациональныйАдрес; ОпределениеРежимаВводаАдреса(); @@ -1678,8 +1704,8 @@ &НаКлиенте Процедура ОпределениеРежимаВводаАдреса() - Если Страна = СтранаРоссия Тогда - // РОССИЯ. Загружать можем только российские адреса. + Если Страна = ОсновнаяСтрана Тогда + // Загружать можем только национальные адреса. Элементы.ВвестиАдресВСвободнойФорме.Доступность = Истина; Элементы.ВвестиАдресВСвободнойФормеВсеДействия.Доступность = Истина; Если ЕстьПравоЗагружатьКлассификатор Тогда @@ -1689,7 +1715,7 @@ КонецЕсли; КонецЕсли; Иначе - СписокСтран = УправлениеКонтактнойИнформациейКлиент.СтраныПоддерживающиеСтруктурированныйВвод(); + СписокСтран = СтраныПоддерживающиеСтруктурированныйВвод(); Если СписокСтран[ВРег(Страна)] <> Истина Тогда // Прочие страны Элементы.ВвестиАдресВСвободнойФорме.Доступность = Ложь; @@ -1744,8 +1770,8 @@ Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость = Ложь; Элементы.ФормаОчиститьАдрес.Видимость = Ложь; Элементы.ЗагрузитьКлассификатор.Видимость = Ложь; - Элементы.ИзменитьФорму.Видимость = Ложь; Элементы.ФормаВводАдресаПоказать.Видимость = Ложь; + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ИзменитьФорму", "Видимость", Ложь); КонецЕсли; КонецПроцедуры @@ -1766,7 +1792,7 @@ Инфо = ?(XDTOКонтактная = Неопределено, КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст), XDTOКонтактная); - Если Контекст.Страна = Контекст.СтранаРоссия Тогда + Если Контекст.Страна = Контекст.ОсновнаяСтрана Тогда УстановитьЗначениеИндекса(Контекст, Инфо); КонецЕсли; ЗаполнитьПредставлениеАдреса(Контекст, Инфо); @@ -1781,15 +1807,15 @@ Адрес = Инфо.Состав; Идентификатор = НайтиИдентификаторАдресаПоИерархии(Контекст.НаселенныйПунктДетально); - ИндексИОКМТОПоКлассификатору = УправлениеКонтактнойИнформациейСлужебный.ОпределитьПочтовыйИндексИОКТМОАдреса(Адрес, Идентификатор); + ИндексИОКМТОПоКлассификатору = Обработки.РасширенныйВводКонтактнойИнформации.ОпределитьПочтовыйИндексИОКТМОАдреса(Адрес, Идентификатор); Если ЗначениеЗаполнено(ИндексИОКМТОПоКлассификатору.Индекс) Тогда Контекст.Индекс = Формат(ИндексИОКМТОПоКлассификатору.Индекс, "ЧЦ=6; ЧРГ=; ЧГ=0"); КонецЕсли; Если ЗначениеЗаполнено(ИндексИОКМТОПоКлассификатору.ОКТМО) Тогда - Контекст.ОКТМО = УправлениеКонтактнойИнформациейСлужебный.ОКТМО(ИндексИОКМТОПоКлассификатору.ОКТМО); + Контекст.ОКТМО = Обработки.РасширенныйВводКонтактнойИнформации.ОКТМО(ИндексИОКМТОПоКлассификатору.ОКТМО); КонецЕсли; - УправлениеКонтактнойИнформациейСлужебный.ПочтовыйИндексАдреса(Адрес, Контекст.Индекс); + Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(Адрес, Контекст.Индекс); XDTOКонтактная.Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеАдреса(Адрес, Контекст.ВидКонтактнойИнформации); КонецПроцедуры @@ -1844,10 +1870,10 @@ Если ПустаяСтрока(НаименованиеСтраны) Тогда Контекст.Страна = Справочники.СтраныМира.ПустаяСсылка(); Иначе - СсылкаНаРоссию = Справочники.СтраныМира.Россия; - Если ВРЕГ(НаименованиеСтраны) = ВРЕГ(СокрЛП(СсылкаНаРоссию.Наименование)) Тогда - Контекст.Страна = СсылкаНаРоссию; - Контекст.КодСтраны = СсылкаНаРоссию.Код; + СсылкаНаОсновнуюСтрану = РаботаСАдресами.ОсновнаяСтрана(); + Если ВРЕГ(НаименованиеСтраны) = ВРЕГ(СокрЛП(СсылкаНаОсновнуюСтрану.Наименование)) Тогда + Контекст.Страна = СсылкаНаОсновнуюСтрану; + Контекст.КодСтраны = СсылкаНаОсновнуюСтрану.Код; Иначе ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, НаименованиеСтраны); Если ДанныеСтраны = Неопределено Тогда @@ -1864,7 +1890,7 @@ ВычисленноеПредставление = УправлениеКонтактнойИнформациейСлужебный.СформироватьПредставлениеКонтактнойИнформации( РедактируемаяИнформация, Контекст.ВидКонтактнойИнформации); - Если УправлениеКонтактнойИнформациейСлужебный.ЭтоРоссийскийАдрес(ДанныеАдреса) Тогда + Если УправлениеКонтактнойИнформациейСлужебный.ЭтоНациональныйАдрес(ДанныеАдреса) Тогда Контекст.РазрешитьВводАдресаВСвободнойФорме = Не ПустаяСтрока(ДанныеАдреса.Состав.Адрес_по_документу); // Дополнительно проверяем случай, когда представление по документу равно вычисленному. @@ -1880,11 +1906,11 @@ Контекст.ПредставлениеАдреса = ДанныеАдреса.Состав.Адрес_по_документу; КонецЕсли; - Контекст.ОКТМО = УправлениеКонтактнойИнформациейСлужебный.ОКТМО(ДанныеАдреса.Состав.ОКТМО); + Контекст.ОКТМО = Обработки.РасширенныйВводКонтактнойИнформации.ОКТМО(ДанныеАдреса.Состав.ОКТМО); ЗначениеРеквизитовПоКонтактнойИнформацииАдресРФ(ДанныеАдреса, Контекст); Иначе Адрес = Строка(ДанныеАдреса.Состав); - Контекст.НаселенныйПунктДетально = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта("ФИАС"); + Контекст.НаселенныйПунктДетально = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта("ФИАС"); Если СтрЧислоВхождений(Адрес, ",") = 9 Тогда Адрес = Сред(Адрес, СтрНайти(Адрес, ",") + 1); // удаляем страну КонецЕсли; @@ -1907,7 +1933,7 @@ Адрес = ВРег(Контекст.Страна) + "," + Адрес; КонецЕсли; - СтруктураАдрес = УправлениеКонтактнойИнформациейСлужебный.РазложитьАдресВСтруктуру(Адрес); + СтруктураАдрес = Обработки.РасширенныйВводКонтактнойИнформации.РазложитьАдресВСтруктуру(Адрес); Контекст.НаселенныйПунктДетально.Регион.Представление = СтруктураАдрес.Регион; Контекст.НаселенныйПунктДетально.Район.Представление = СтруктураАдрес.Район; @@ -1971,16 +1997,16 @@ Процедура ЗначениеРеквизитовПоКонтактнойИнформацииАдресРФ(ДанныеАдреса, Контекст) // Индекс просто ставим - Контекст.Индекс = Формат(УправлениеКонтактнойИнформациейСлужебный.ПочтовыйИндексАдреса(ДанныеАдреса), "ЧГ="); + Контекст.Индекс = Формат(Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(ДанныеАдреса), "ЧГ="); // Синтетический "Населенный пункт" получаем как представление. - Контекст.НаселенныйПункт = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеНаселенногоПункта(ДанныеАдреса); - Контекст.Улица = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеУлицы(ДанныеАдреса); + Контекст.НаселенныйПункт = Обработки.РасширенныйВводКонтактнойИнформации.ПредставлениеНаселенногоПункта(ДанныеАдреса); + Контекст.Улица = Обработки.РасширенныйВводКонтактнойИнформации.ПредставлениеУлицы(ДанныеАдреса); СформироватьДетальныйНаселенныйПункт(Контекст, ДанныеАдреса); // Дом, строение, помещение - ЗданияИПомещения = УправлениеКонтактнойИнформациейСлужебный.ЗданияИПомещенияАдреса(ДанныеАдреса); + ЗданияИПомещения = Обработки.РасширенныйВводКонтактнойИнформации.ЗданияИПомещенияАдреса(ДанныеАдреса); // Первые два здания выделяем отдельно, остальное в списке. ТаблицаДанных = ЗданияИПомещения.Здания; @@ -2046,7 +2072,7 @@ Адрес = Результат.Состав; Адрес.Страна = Строка(Контекст.Страна); - Если ВРег(Контекст.Страна) <> ВРег(Контекст.СтранаРоссия.Наименование) Тогда + Если ВРег(Контекст.Страна) <> ВРег(Контекст.ОсновнаяСтрана.Наименование) Тогда Если Контекст.РазрешитьВводАдресаВСвободнойФорме Тогда Результат.Представление = Контекст.ПредставлениеАдреса; Если Контекст.ВидКонтактнойИнформации.ВключатьСтрануВПредставление @@ -2068,7 +2094,7 @@ Возврат Результат; КонецЕсли; - Адрес.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ")); + Адрес.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ")); АдресРФ = Адрес.Состав; ЗаполненныеЧастиАдреса = Новый СписокЗначений; Если Контекст.НаселенныйПунктДетально <> Неопределено Тогда @@ -2077,9 +2103,9 @@ Если Не ПустаяСтрока(ЧастьПункта.Представление) Тогда НетДетальныхДанных = Ложь; ЗаполненныеЧастиАдреса.Добавить(ЧастьПункта.Уровень, ЧастьПункта.Представление); + ПутьXPath = ЧастьПункта.ПутьXPath; + Обработки.РасширенныйВводКонтактнойИнформации.УстановитьXDTOРеквизитОбъекта(АдресРФ, ПутьXPath, ЧастьПункта.Представление); КонецЕсли; - ПутьXPath = ЧастьПункта.ПутьXPath; - УправлениеКонтактнойИнформациейСлужебный.УстановитьXDTOРеквизитОбъекта(АдресРФ, ПутьXPath, ЧастьПункта.Представление); КонецЦикла; КонецЕсли; @@ -2110,22 +2136,22 @@ СтрокаЗдания.Значение = Контекст.Помещение; КонецЕсли; - УправлениеКонтактнойИнформациейСлужебный.ЗданияИПомещенияАдреса(АдресРФ, + Обработки.РасширенныйВводКонтактнойИнформации.ЗданияИПомещенияАдреса(АдресРФ, Новый Структура("Здания, Помещения", ТаблицаЗданий, ТаблицаПомещений)); // Индекс - УправлениеКонтактнойИнформациейСлужебный.ПочтовыйИндексАдреса(АдресРФ, Контекст.Индекс); + Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(АдресРФ, Контекст.Индекс); // ОКТМО ОписаниеЧисло = Новый ОписаниеТипов("Число"); - УправлениеКонтактнойИнформациейСлужебный.УстановитьXDTOРеквизитОбъекта(АдресРФ, "ОКТМО", ОписаниеЧисло.ПривестиЗначение(Контекст.ОКТМО)); + Обработки.РасширенныйВводКонтактнойИнформации.УстановитьXDTOРеквизитОбъекта(АдресРФ, "ОКТМО", ОписаниеЧисло.ПривестиЗначение(Контекст.ОКТМО)); // Если НЕ ПустаяСтрока( Контекст.ДополнительныйЭлемент) Тогда - УправлениеКонтактнойИнформациейСлужебный.ДобавитьДополнительныеЭлементыАдреса(АдресРФ, Контекст.ДополнительныйЭлемент, 90); + Обработки.РасширенныйВводКонтактнойИнформации.ДобавитьДополнительныеЭлементыАдреса(АдресРФ, Контекст.ДополнительныйЭлемент, 90); КонецЕсли; Если НЕ ПустаяСтрока(Контекст.ПодчиненныйЭлемент) Тогда - УправлениеКонтактнойИнформациейСлужебный.ДобавитьДополнительныеЭлементыАдреса(АдресРФ, Контекст.ПодчиненныйЭлемент, 91); + Обработки.РасширенныйВводКонтактнойИнформации.ДобавитьДополнительныеЭлементыАдреса(АдресРФ, Контекст.ПодчиненныйЭлемент, 91); КонецЕсли; // Представление и свободный ввод адреса. @@ -2154,7 +2180,7 @@ Если XDTOДанныеАдреса = Неопределено И ЗначениеЗаполнено(Контекст.ИдентификаторНаселенногоПункта) Тогда // Перезаполняем - Контекст.НаселенныйПунктДетально = УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт( + Контекст.НаселенныйПунктДетально = Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт( Контекст.ИдентификаторНаселенногоПункта, Контекст.ВидКонтактнойИнформации.ФорматАдреса); Возврат; @@ -2164,15 +2190,14 @@ АнализКлассификатора = НаселенныеПунктыПоПредставлению(XDTOДанныеАдреса); Если АнализКлассификатора.ДанныеВыбора.Количество()=1 Тогда Вариант = АнализКлассификатора.ДанныеВыбора[0].Значение.Значение; - Контекст.НаселенныйПунктДетально = УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт( - Вариант.Код, - Контекст.ВидКонтактнойИнформации.ФорматАдреса); + Контекст.НаселенныйПунктДетально = Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт( + Вариант.Код, Контекст.ВидКонтактнойИнформации.ФорматАдреса); Возврат; КонецЕсли; КонецЕсли; Если НЕ ЗначениеЗаполнено(Контекст.НаселенныйПунктДетально) Тогда - Контекст.НаселенныйПунктДетально = УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт(, + Контекст.НаселенныйПунктДетально = Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт(, Контекст.ВидКонтактнойИнформации.ФорматАдреса); КонецЕсли; @@ -2198,7 +2223,7 @@ Процедура ЗаполнитьКонтекстПоXDTOАдреса(XDTOДанныеАдреса, Контекст, Уровни = Неопределено) // Из переданного XDTO - АдресРФ = УправлениеКонтактнойИнформациейСлужебный.РоссийскийАдрес(XDTOДанныеАдреса); + АдресРФ = Обработки.РасширенныйВводКонтактнойИнформации.НациональныйАдрес(XDTOДанныеАдреса); Если АдресРФ <> Неопределено Тогда Для Каждого КлючЗначение Из Контекст.НаселенныйПунктДетально Цикл @@ -2206,9 +2231,9 @@ Если Уровни = Неопределено ИЛИ Уровни.Найти(Значение.Уровень) <> Неопределено Тогда Если Значение.Уровень <> 90 Тогда - Представление = УправлениеКонтактнойИнформациейСлужебный.ПолучитьXDTOРеквизитОбъекта(АдресРФ, Значение.ПутьXPath); + Представление = Обработки.РасширенныйВводКонтактнойИнформации.ПолучитьXDTOРеквизитОбъекта(АдресРФ, Значение.ПутьXPath); Иначе - ДополнительныйЭлементАдреса = УправлениеКонтактнойИнформациейСлужебный.НайтиДополнительныйЭлементАдреса(АдресРФ); + ДополнительныйЭлементАдреса = Обработки.РасширенныйВводКонтактнойИнформации.НайтиДополнительныйЭлементАдреса(АдресРФ); Представление = ДополнительныйЭлементАдреса.Значение; Значение.ПутьXPath = ДополнительныйЭлементАдреса.XPath; КонецЕсли; @@ -2220,7 +2245,7 @@ КонецЕсли; КонецЦикла; - УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьИдентификаторыНаселенногоПункта(Контекст.НаселенныйПунктДетально); + Обработки.РасширенныйВводКонтактнойИнформации.ЗаполнитьИдентификаторыНаселенногоПункта(Контекст.НаселенныйПунктДетально); УровеньНаселенногоПункта = 0; УровеньУлицы = 0; @@ -2370,7 +2395,7 @@ КонецЕсли; Элементы.ТекстПроДатуДействия.Заголовок = ТекстИсторическийАдрес; - Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""начала учета""'"); + Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НСтр("ru='начало учета'") + """'"); КонецПроцедуры @@ -2399,15 +2424,14 @@ Возврат Результат; КонецЕсли; - ТекущаяСтрока = Неопределено; - ДействуетПо = Неопределено; - Минимум = -1; + ТекущаяСтрока = Неопределено; + ДействуетПо = Неопределено; + Минимум = -1; МинимумСравнительный = Неопределено; + Для каждого СтрокаИстория Из История Цикл - Дельта = СтрокаИстория.ДействуетС - ДействуетС; - Если Дельта <= 0 - И (МинимумСравнительный = Неопределено ИЛИ Дельта > МинимумСравнительный) Тогда + Если Дельта <= 0 И (МинимумСравнительный = Неопределено ИЛИ Дельта > МинимумСравнительный) Тогда ТекущаяСтрока = СтрокаИстория; МинимумСравнительный = Дельта; КонецЕсли; @@ -2416,12 +2440,10 @@ Минимум = Дельта + 1; ТекущаяСтрока = СтрокаИстория; КонецЕсли; - - Если Дельта > 0 И МодульЧисла(Дельта) < МодульЧисла(Минимум) Тогда + Если Дельта > 0 И Дельта < Минимум Тогда ДействуетПо = СтрокаИстория.ДействуетС; Минимум = Дельта; КонецЕсли; - КонецЦикла; Результат.ДействуетПо = ДействуетПо; @@ -2431,17 +2453,12 @@ Возврат Результат; КонецФункции -&НаКлиентеНаСервереБезКонтекста -Функция МодульЧисла(Число) - Возврат Макс(Число, -Число); -КонецФункции - &НаКлиенте Процедура Подключаемый_ТипСтроенияПриИзменении(Элемент) НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("ТипСтроения")); СтрокаЗданий = ДополнительныеЗдания.Получить(НомерСтроки); СтрокаЗданий.Тип = ЭтотОбъект[Элемент.Имя]; - СтрокаЗданий.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(СтрокаЗданий.Тип); + СтрокаЗданий.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(СтрокаЗданий.Тип); ОбновитьИндексИПредставление(); Модифицированность = Истина; @@ -2526,7 +2543,7 @@ НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("ТипПомещения")); СтрокаПомещений = ДополнительныеПомещения.Получить(НомерСтроки); СтрокаПомещений.Тип = ЭтотОбъект[Элемент.Имя]; - СтрокаПомещений.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(СтрокаПомещений.Тип); + СтрокаПомещений.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(СтрокаПомещений.Тип); Контекст = КонтекстФормыКлиент(); ЗаполнитьПредставлениеАдреса(Контекст); @@ -2579,7 +2596,7 @@ МестоОшибки = СписокОшибок[0].Значение; Если СписокОшибок[0].Пометка = Ложь И НЕ ЭтоВебСервис Тогда ТекстВопроса = НСтр("ru = 'Адрес не может быть проверен.'") + Символы.ПС + СписокОшибок[0].Представление + Символы.ПС + НСтр("ru = 'Загрузить классификатор для проверки адреса?'"); - УправлениеКонтактнойИнформациейКлиент.ПредложениеЗагрузкиКлассификатора(ТекстВопроса); + ПредложениеЗагрузкиКлассификатора(ТекстВопроса); Возврат; ИначеЕсли ПустаяСтрока(МестоОшибки) Или МестоОшибки = "/" Тогда // Одна ошибка на весь адрес, не привязанная к полю. @@ -2605,7 +2622,7 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПослеЗагрузкиАдресногоКлассификатора", ЭтотОбъект); МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); - МодульАдресныйКлассификаторКлиент.ОткрытьФормуЗагрузкиАдресногоКлассификатора(Неопределено, Неопределено, ОповещениеОЗакрытие); + МодульАдресныйКлассификаторКлиент.ПоказатьФормуЗагрузкиАдресногоКлассификатора(ОповещениеОЗакрытие); КонецЕсли; КонецЕсли; КонецПроцедуры @@ -2619,7 +2636,7 @@ ИначеЕсли ПутьXPath = "Округ" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathРайона() Тогда + ИначеЕсли ПутьXPath = РаботаСАдресамиКлиентСервер.XPathРайона() Тогда Возврат "НаселенныйПункт"; ИначеЕсли ПутьXPath = "Город" Тогда @@ -2634,7 +2651,7 @@ ИначеЕсли ПутьXPath = "Улица" Тогда Возврат "Улица"; - ИначеЕсли ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathПочтовогоИндекса() Тогда + ИначеЕсли ПутьXPath = РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса() Тогда Возврат "Индекс"; КонецЕсли; @@ -2666,21 +2683,21 @@ // Варианты дома Для Каждого ЭлементСписка Из Элементы.ТипДома.СписокВыбора Цикл - Если ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Если ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда Возврат "Дом"; КонецЕсли; КонецЦикла; // Варианты корпуса Для Каждого ЭлементСписка Из Элементы.ТипСтроения.СписокВыбора Цикл - Если ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Если ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда Возврат "Строение"; КонецЕсли; КонецЦикла; // Варианты помещения Для Каждого ЭлементСписка Из Элементы.ТипПомещения.СписокВыбора Цикл - Если ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Если ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда Возврат "Помещение"; КонецЕсли; КонецЦикла; @@ -2702,24 +2719,24 @@ &НаСервере Процедура ОчиститьАдресСервер(Контекст) - Контекст.ПредставлениеАдреса = ""; - Контекст.Комментарий = ""; - Контекст.Индекс = Неопределено; - Контекст.ОКТМО = Неопределено; + Контекст.ПредставлениеАдреса = ""; + Контекст.Комментарий = ""; + Контекст.Индекс = Неопределено; + Контекст.ОКТМО = Неопределено; Контекст.ИдентификаторНаселенногоПункта = Неопределено; Контекст.НаселенныйПункт = ""; - Контекст.НаселенныйПунктДетально = УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт(Неопределено, "ФИАС"); + Контекст.НаселенныйПунктДетально = Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт(Неопределено, "ФИАС"); Контекст.ИдентификаторУлицы = Неопределено; - Контекст.Улица = ""; + Контекст.Улица = ""; Контекст.ТипДома = УправлениеКонтактнойИнформациейКлиентСервер.ПервыйИлиПустой(Элементы.ТипДома.СписокВыбора); Контекст.ТипСтроения = УправлениеКонтактнойИнформациейКлиентСервер.ПервыйИлиПустой(Элементы.ТипСтроения.СписокВыбора); Контекст.ТипПомещения = УправлениеКонтактнойИнформациейКлиентСервер.ПервыйИлиПустой(Элементы.ТипПомещения.СписокВыбора); - Контекст.Дом = ""; - Контекст.Строение = ""; - Контекст.Помещение = ""; + Контекст.Дом = ""; + Контекст.Строение = ""; + Контекст.Помещение = ""; Контекст.ДополнительныеЗдания.Очистить(); Контекст.ДополнительныеПомещения.Очистить(); @@ -2729,8 +2746,8 @@ ЗаполнитьПредставлениеАдреса(Контекст, XDTOКонтактнаяИнфо); // Очищаем непосредственно на форме, в контексте уже очищено. - ДополнительныеЗдания.Очистить(); - ДополнительныеПомещения.Очистить(); + Контекст.ДополнительныеЗдания.Очистить(); + Контекст.ДополнительныеПомещения.Очистить(); ОтобразитьДополнительныеЗданияИПомещения(); КонецПроцедуры @@ -2790,7 +2807,7 @@ СписокРеквизитов = " |ВидКонтактнойИнформации, - |Страна, КодСтраны, СтранаРоссия, СкрыватьНеактуальныеАдреса, + |Страна, КодСтраны, ОсновнаяСтрана, СкрыватьНеактуальныеАдреса, |Индекс, ПредставлениеАдреса, Комментарий, КопияКомментария, |НаселенныйПункт, ИдентификаторНаселенногоПункта, НаселенныйПунктДетально, |Улица, ИдентификаторУлицы, ОКТМО, ИдентификаторУлицы, @@ -2835,7 +2852,7 @@ &НаКлиенте Процедура СостояниеВводаПредставленияАдреса(РедактироватьПредставлениеАдреса, ФормироватьПредставление = Истина) - Если Страна = СтранаРоссия Тогда + Если Страна = ОсновнаяСтрана Тогда Элемент = Элементы.ПредставлениеАдреса; // Проверять адрес, введенный вручную нельзя. Элементы.ПроверитьЗаполнениеАдреса.Доступность = Не РедактироватьПредставлениеАдреса; @@ -2875,7 +2892,7 @@ Элементы.ПредставлениеАдреса.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; Элементы.ПредставлениеАдреса.Заголовок = НСтр("ru='Адрес в свободной форме'"); Элементы.СтранаАдреса.Отображение = ОтображениеОбычнойГруппы.Нет; - Если Страна <> СтранаРоссия Тогда + Если Страна <> ОсновнаяСтрана Тогда ТекущийЭлемент = Элементы.ПредставлениеИностранногоАдреса; Иначе ТекущийЭлемент = Элементы.ПредставлениеАдреса; @@ -2884,7 +2901,7 @@ Элементы.ПредставлениеАдреса.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; Элементы.ПредставлениеАдреса.Заголовок = ""; Элементы.СтранаАдреса.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; - Если Страна = СтранаРоссия Тогда + Если Страна = ОсновнаяСтрана Тогда ТекущийЭлемент = Элементы.НаселенныйПункт; Иначе ТекущийЭлемент = Элементы.НаселенныйПунктИностранныйАдреса; @@ -2941,7 +2958,6 @@ НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ПолучатьРезультат = Истина; Обработчик = Новый ОписаниеОповещения("ПослеПроверкиДоступностиКлассификатораВФоне", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); @@ -3073,7 +3089,7 @@ Строка = ДополнительныеЗдания.Добавить(); Строка.Тип = ТРег(ИнформацияОСтроение.ВидСтроения); - Строка.ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); + Строка.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); Строка.Значение = ИнформацияОСтроение.НомерСтроения; ИмяТекущего = ОтобразитьДополнительныеЗдания(); НеобходимоПерерисоватьПоляДомов = Ложь; @@ -3118,7 +3134,7 @@ &НаСервере Процедура ПредставлениеАдресаПриИзмененииСервер() - Если Страна = СтранаРоссия Тогда + Если Страна = ОсновнаяСтрана Тогда // Пытаемся разобрать заново XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(ПредставлениеАдреса, ВидКонтактнойИнформации); XDTOКонтактная.Представление = ПредставлениеАдреса; @@ -3144,23 +3160,24 @@ КонецПроцедуры &НаСервере -Процедура ЗаполнитьВариантыДомовСтроенийКвартир() +Процедура ЗаполнитьПредопределенныеВариантыАдреса(Параметры) - Перем ВариантыДанныхДом, ВариантыДанныхПомещение, ВариантыДанныхСтроение; + Если Параметры.Свойство("Индекс") Тогда + Индекс = Параметры.Индекс; + КонецЕсли; // Возможные варианты дома, строения, квартиры. - ВариантыДанныхДом = УправлениеКонтактнойИнформациейСлужебный.ВариантыДанныхДом(); + ВариантыДанныхДом = Обработки.РасширенныйВводКонтактнойИнформации.ВариантыДанныхДом(); УстановитьСписокВыбораЭлемента(Элементы.ТипДома, Элементы.Дом, ВариантыДанныхДом); УстановитьСписокВыбораЭлемента(Элементы.ТипДомаИностранныйАдреса, Элементы.ДомИностранныйАдреса, ВариантыДанныхДом); - ВариантыДанныхСтроение = УправлениеКонтактнойИнформациейСлужебный.ВариантыДанныхСтроение(); - УстановитьСписокВыбораЭлемента(Элементы.ТипСтроения, Элементы.Строение, ВариантыДанныхСтроение); + ВариантыДанныхСтроение = Обработки.РасширенныйВводКонтактнойИнформации.ВариантыДанныхСтроение(); + УстановитьСписокВыбораЭлемента(Элементы.ТипСтроения, Элементы.Строение, ВариантыДанныхСтроение); УстановитьСписокВыбораЭлемента(Элементы.ТипСтроенияИностранныйАдреса, Элементы.СтроениеИностранныйАдреса, ВариантыДанныхСтроение); - ВариантыДанныхПомещение = УправлениеКонтактнойИнформациейСлужебный.ВариантыДанныхПомещение(); + ВариантыДанныхПомещение = Обработки.РасширенныйВводКонтактнойИнформации.ВариантыДанныхПомещение(); УстановитьСписокВыбораЭлемента(Элементы.ТипПомещения, Элементы.Помещение, ВариантыДанныхПомещение); УстановитьСписокВыбораЭлемента(Элементы.ТипПомещенияИностранныйАдреса, Элементы.ПомещениеИностранныйАдреса, ВариантыДанныхПомещение); - // // Возможно пустые значения, чтобы не смущали. Если ПустаяСтрока(Дом) И ПустаяСтрока(ТипДома) Тогда @@ -3169,6 +3186,12 @@ Если ПустаяСтрока(Строение) И ПустаяСтрока(ТипСтроения) Тогда ТипСтроения = УправлениеКонтактнойИнформациейКлиентСервер.ПервыйИлиПустой(Элементы.ТипСтроения); КонецЕсли; + + Если Параметры.Свойство("ТипПомещения") + И ВариантыДанныхПомещение.ВариантыТипа.Найти(Параметры.ТипПомещения) <> Неопределено Тогда + ТипПомещения = Параметры.ТипПомещения; + КонецЕсли; + Если ПустаяСтрока(Помещение) И ПустаяСтрока(ТипПомещения) Тогда ТипПомещения = УправлениеКонтактнойИнформациейКлиентСервер.ПервыйИлиПустой(Элементы.ТипПомещения); КонецЕсли; @@ -3249,7 +3272,7 @@ &НаСервереБезКонтекста Функция ПроверитьДоступностьКлассификатораВФоне(Знач УникальныйИдентификатор) - ИмяМетода = "УправлениеКонтактнойИнформациейСлужебный.ПроверитьДоступностьКлассификатора"; + ИмяМетода = "Обработки.РасширенныйВводКонтактнойИнформации.ПроверитьДоступностьКлассификатора"; НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка доступности сервиса адресного классификатора'"); @@ -3259,13 +3282,13 @@ &НаСервереБезКонтекста Функция НаселенныйПунктДетальноПоИдентификатору(ИдентификаторНаселенногоПункта, ФорматАдреса) - Возврат УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт(ИдентификаторНаселенногоПункта, ФорматАдреса); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт(ИдентификаторНаселенногоПункта, ФорматАдреса); КонецФункции &НаСервереБезКонтекста Функция СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры) - Возврат УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры); КонецФункции @@ -3285,25 +3308,131 @@ &НаСервереБезКонтекста Функция СписокАвтоподбораУлицы(ИдентификаторНаселенногоПункта, Текст, ДополнительныеПараметры) - Возврат УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораУлицы(ИдентификаторНаселенногоПункта, Текст, ДополнительныеПараметры); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораУлицы(ИдентификаторНаселенногоПункта, Текст, ДополнительныеПараметры); КонецФункции &НаСервереБезКонтекста Функция СписокАвтоподбораВариантовДомов(Идентификатор, Текст) - Возврат УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораНомераДомов(Идентификатор, Текст); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораНомераДомов(Идентификатор, Текст); КонецФункции &НаСервереБезКонтекста Функция НаселенныеПунктыПоПредставлению(Текст) - Возврат УправлениеКонтактнойИнформациейСлужебный.НаселенныеПунктыПоПредставлению(Текст); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.НаселенныеПунктыПоПредставлению(Текст); КонецФункции &НаСервереБезКонтекста Функция УлицыПоПредставлению(Родитель, Текст, СкрыватьНеактуальныеАдреса = Ложь, ВыбиратьСтрок = 50) - Возврат УправлениеКонтактнойИнформациейСлужебный.УлицыПоПредставлению(Родитель, Текст, СкрыватьНеактуальныеАдреса, ВыбиратьСтрок); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.УлицыПоПредставлению(Родитель, Текст, СкрыватьНеактуальныеАдреса, ВыбиратьСтрок); КонецФункции -#КонецОбласти +// УправлениеКонтактнойИнформациейКлиент + +// Обработчик события НачалоВыбора для улицы. +// +// Параметры: +// Владелец - Произвольный - вызывающий элемент формы. +// ИдентификаторНаселенногоПункта - УникальныйИдентификатор - ограничение по населенному пункту. +// ТекущееЗначение - УникальныйИдентификатор, Строка - текущее значение - или код классификатора, +// или текст. +// ДополнительныеПараметры - Структура - дополнительная структура параметров. +// +&НаКлиенте +Процедура НачалоВыбораУлицы(Владелец, ИдентификаторНаселенногоПункта, ТекущееПредставлениеУлицы, ДополнительныеПараметры) + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат; + КонецЕсли; + + СкрыватьНеактуальныеАдреса = Неопределено; + ДополнительныеПараметры.Свойство("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); + Если СкрыватьНеактуальныеАдреса = Неопределено Тогда + СкрыватьНеактуальныеАдреса = Ложь; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Родитель", ИдентификаторНаселенногоПункта); + ПараметрыФормы.Вставить("ПредставлениеУлицы", ТекущееПредставлениеУлицы); + ПараметрыФормы.Вставить("Уровень", 7); + ПараметрыФормы.Вставить("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); + ПараметрыФормы.Вставить("НаселенныйПунктДетально", ДополнительныеПараметры.НаселенныйПунктДетально); + + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборУлицы", ПараметрыФормы, Владелец, + ,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); +КонецПроцедуры + +// Предлагает загрузить адресный классификатор. +// +// Параметры: +// Текст - Строка - Дополнительный текст предложения. +// Регион - Число, Строка - Код или название региона для загрузки. +// +&НаКлиенте +Процедура ПредложениеЗагрузкиКлассификатора(Знач Текст = "", Знач Регион = Неопределено) + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат; + КонецЕсли; + + НеЗагружатьАдресныйКлассификатор = ПараметрыПриложения.Получить("АдресныйКлассификатор.НеЗагружатьКлассификатор"); + Если НеЗагружатьАдресныйКлассификатор = Неопределено ИЛИ НеЗагружатьАдресныйКлассификатор = Ложь Тогда + ТипПараметраРегиона = ТипЗнч(Регион); + ПараметрыФормы = Новый Структура; + ПараметрыЗагрузки = Новый Структура; + ПараметрыФормы.Вставить("ТекстПредупреждения", Текст); + + Если ТипПараметраРегиона = Тип("Число") Тогда + ПараметрыЗагрузки.Вставить("КодРегионаДляЗагрузки", Регион); + + ИначеЕсли ТипПараметраРегиона = Тип("Строка") Тогда + ПараметрыЗагрузки.Вставить("НазваниеРегиона", Регион); + ПараметрыФормы.Вставить("НазваниеРегиона", Регион); + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ПредложениеЗагрузкиКлассификатораЗавершение", ЭтотОбъект, ПараметрыЗагрузки); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ЗагрузкаАдресногоКлассификатора", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредложениеЗагрузкиКлассификатораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); +КонецПроцедуры + +// Загружает адресный классификатор. +// +&НаКлиенте +Процедура ЗагрузитьАдресныйКлассификатор(Знач ДополнительныеПараметры = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Страны ЕАЭС поддерживающие структурированный ввод. +// +// Возвращаемое значение: +// Соответствие - Список стран. +// +&НаКлиенте +Функция СтраныПоддерживающиеСтруктурированныйВвод() + СписокСтран = Новый Соответствие; + СписокСтран.Вставить("БЕЛАРУСЬ", Истина); + СписокСтран.Вставить("КАЗАХСТАН", Истина); + СписокСтран.Вставить("АРМЕНИЯ", Истина); + СписокСтран.Вставить("КИРГИЗИЯ", Истина); + Возврат СписокСтран; +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form similarity index 98% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form index bef7705f6..4be910010 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form @@ -50,6 +50,10 @@ ВариантыАдреса 8 + + <key>ru</key> + <value>Варианты адреса</value> + true true @@ -193,6 +197,10 @@ true + + <key>ru</key> + <value>Варианты адреса группа кнопок поиска</value> + ВариантыАдресаГруппаКнопокПоискаРасширеннаяПодсказка 38 @@ -488,6 +496,10 @@ true + + <key>ru</key> + <value>Варианты адреса контекстное меню группа найти</value> + ВариантыАдресаКонтекстноеМенюГруппаНайтиРасширеннаяПодсказка 50 @@ -547,9 +559,6 @@ true true true - None - None - None true diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html similarity index 82% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html index 7bb061afa..1005d29ba 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Help/ru.html @@ -2,11 +2,11 @@

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

                Почтовое деление России следует административному делению страны. Введенная в 1971 году система 6-значных почтовых индексов была унаследована от СССР и не претерпела существенных изменений. Первые три цифры индекса соответствуют определенному субъекту федерации. Следующие три - номеру почтового отделения в нем.

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

                -

                Открывается из окна ввода адреса автоматически или по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

                +

                Открывается из окна ввода адреса автоматически или по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

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

                См. также:

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl similarity index 96% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl index cbcb32d4f..cd5d0cd98 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl @@ -34,7 +34,7 @@ КонецЕсли; Параметры.Свойство("Индекс", Индекс); - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаКлассификатораПоПочтовомуИндексу(Индекс, ПараметрыПоиска); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.АдресаКлассификатораПоПочтовомуИндексу(Индекс, ПараметрыПоиска); Если ДанныеКлассификатора.Отказ Тогда // Сервис на обслуживании @@ -131,7 +131,8 @@ ЗаполнитьЗначенияСвойств(Результат, Данные); КонецЕсли; - ОповеститьОВыборе(Результат); + Закрыть(Результат); + КонецПроцедуры &НаСервере diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form similarity index 98% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form index b172c6700..2c95b6b3c 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form @@ -7,6 +7,10 @@ ВариантыАдреса 8 + + <key>ru</key> + <value>Варианты адреса</value> + true true @@ -148,6 +152,10 @@ true + + <key>ru</key> + <value>Варианты адреса группа кнопок поиска</value> + ВариантыАдресаГруппаКнопокПоискаРасширеннаяПодсказка 38 @@ -443,6 +451,10 @@ true + + <key>ru</key> + <value>Варианты адреса контекстное меню группа найти</value> + ВариантыАдресаКонтекстноеМенюГруппаНайтиРасширеннаяПодсказка 50 @@ -501,9 +513,6 @@ true true true - None - None - None true diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html similarity index 78% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html index a88bd82e4..5fb2fa51a 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Help/ru.html @@ -1,9 +1,9 @@

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

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

                -

                Открывается из окна ввода адреса по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

                +

                Открывается из окна ввода адреса по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

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

                См. также:

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl similarity index 97% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl index ffea76c15..85c67ce15 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl @@ -48,7 +48,7 @@ Возврат; КонецЕсли; - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); Если ДанныеКлассификатора.Отказ Тогда // Сервис на обслуживании diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form similarity index 97% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form index 11006577e..0058bc085 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form @@ -43,7 +43,7 @@ <key>ru</key> - <value>Группа кнопка выбрать</value> + <value>Кнопка выбрать</value> ГруппаКнопкаВыбратьРасширеннаяПодсказка @@ -129,12 +129,8 @@ <key>ru</key> - <value>Группа список домов</value> + <value>Список домов</value> - - ru - Группа список домов - ГруппаСписокДомовРасширеннаяПодсказка 36 @@ -162,12 +158,8 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> - - ru - Группа командная панель - ГруппаКоманднаяПанельРасширеннаяПодсказка 60 @@ -396,7 +388,7 @@ Объект 1 - DataProcessorObject.ВводКонтактнойИнформации + DataProcessorObject.РасширенныйВводКонтактнойИнформации true @@ -586,6 +578,24 @@ true + + ТекстПоиска + + <key>ru</key> + <value>Текст поиска</value> + + 10 + + String + + + + true + + + true + + Выбрать diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl similarity index 85% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl index f348cfefb..ac42192c7 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl @@ -44,11 +44,10 @@ &НаКлиенте Процедура НомерДомаСтроенияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - Если ПустаяСтрока(Текст) Тогда - Текст = Найти; - КонецЕсли; - ЗаполнитьСписокДомов(Текст + "%"); + ТекстПоиска = ?(ПустаяСтрока(Текст), Найти, Текст); + ПодключитьОбработчикОжидания("НайтиИЗаполнитьСписокДомов", 0.2, Истина); + КонецПроцедуры &НаКлиенте @@ -71,12 +70,17 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура НайтиИЗаполнитьСписокДомов() + ЗаполнитьСписокДомов(ТекстПоиска + "%"); +КонецПроцедуры + &НаСервере Процедура ЗаполнитьСписокДомов(Текст) СписокДомов.Очистить(); СтрокаПоиска = ?(ЗначениеЗаполнено(Текст), Текст, ""); - ПолныйСписокДомов = УправлениеКонтактнойИнформациейСлужебный.СписокДомов(АдресныйОбъект, СтрокаПоиска); + ПолныйСписокДомов = Обработки.РасширенныйВводКонтактнойИнформации.СписокДомов(АдресныйОбъект, СтрокаПоиска); Если ПолныйСписокДомов = Неопределено ИЛИ ПолныйСписокДомов.Количество() = 0 Тогда Элементы.ФормаВыбрать.Доступность = Ложь; Иначе diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form similarity index 97% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form index adcf3df27..743157fba 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form @@ -14,12 +14,8 @@ </userVisible> <title> <key>ru</key> - <value>Группа командная панель выбора</value> + <value>Командная панель выбора</value> - - ru - Группа командная панель выбора - ГруппаКоманднаяПанельВыбораРасширеннаяПодсказка 98 @@ -95,6 +91,10 @@ true + + <key>ru</key> + <value>Контактная информация выбрать</value> + 11 ГруппаКонтактнаяИнформацияВыбратьРасширеннаяПодсказка @@ -171,7 +171,7 @@ <key>ru</key> - <value>Группа найти веб сервис</value> + <value>Найти веб сервис</value> ГруппаНайтиВебСервисРасширеннаяПодсказка @@ -260,12 +260,8 @@ <key>ru</key> - <value>Группа найти</value> + <value>Найти</value> - - ru - Группа найти - ГруппаНайтиРасширеннаяПодсказка 172 @@ -283,6 +279,10 @@ true + + <key>ru</key> + <value>Командная панель еще</value> + true ГруппаКоманднаяПанельЕщеРасширеннаяПодсказка @@ -307,12 +307,8 @@ <key>ru</key> - <value>Группа командная панель</value> + <value>Командная панель</value> - - ru - Группа командная панель - ГруппаКоманднаяПанельРасширеннаяПодсказка 149 @@ -335,6 +331,10 @@ ВариантыАдреса 8 + + <key>ru</key> + <value>Варианты адреса</value> + true true @@ -553,6 +553,10 @@ true + + <key>ru</key> + <value>Варианты адреса контекстное меню группа найти</value> + ВариантыАдресаКонтекстноеМенюГруппаНайтиРасширеннаяПодсказка 50 @@ -608,9 +612,6 @@ Auto true true - None - None - None true @@ -719,10 +720,6 @@ ru Командная панель навигация по порциям - - ru - Командная панель навигация по порциям - КоманднаяПанельНавигацияПоПорциямРасширеннаяПодсказка 85 @@ -747,10 +744,6 @@ ru Порционная навигация - - ru - Порционная навигация - ПорционнаяНавигацияРасширеннаяПодсказка 64 @@ -891,7 +884,7 @@ <key>ru</key> - <value>Группа дополнительные элементы</value> + <value>Дополнительные элементы</value> ГруппаДополнительныеЭлементыРасширеннаяПодсказка @@ -922,10 +915,6 @@ ru Улицы и населенные пункты - - ru - Улицы и населенные пункты - УлицыИНаселенныеПунктыРасширеннаяПодсказка 91 @@ -949,6 +938,10 @@ ВариантыДополнительныхТерриторий 99 + + <key>ru</key> + <value>Варианты дополнительных территорий</value> + true true @@ -1207,9 +1200,6 @@ true true true - None - None - None true @@ -1272,10 +1262,6 @@ ru Дополнительные территории - - ru - Дополнительные территории - ДополнительныеТерриторииРасширеннаяПодсказка 93 @@ -1302,10 +1288,6 @@ ru Страницы - - ru - Страницы - СтраницыРасширеннаяПодсказка 89 @@ -1331,6 +1313,10 @@ true + + <key>ru</key> + <value>Общая группа</value> + ОбщаяГруппаРасширеннаяПодсказка 179 diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html similarity index 78% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html index a88bd82e4..5fb2fa51a 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html @@ -1,9 +1,9 @@

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

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

                -

                Открывается из окна ввода адреса по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

                +

                Открывается из окна ввода адреса по команде Еще - Заполнить по почтовому индексу после ввода почтового индекса.

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

                См. также:

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl similarity index 93% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl index fe80685c5..40844b8c7 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl @@ -47,7 +47,7 @@ ПараметрыПоиска.Вставить("ПерваяЗапись", НомерПорции); // Порционный режим, если необходимо. - ПолучениеДанныхСИспользованиемВебСервиса = УправлениеКонтактнойИнформациейСлужебный.КлассификаторДоступенЧерезВебСервис(); + ПолучениеДанныхСИспользованиемВебСервиса = Обработки.РасширенныйВводКонтактнойИнформации.КлассификаторДоступенЧерезВебСервис(); Элементы.ПорционнаяНавигация.Видимость = ПолучениеДанныхСИспользованиемВебСервиса; @@ -63,9 +63,9 @@ КонецЕсли; ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции); - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); - ДанныеКлассификатораДополнительныеТерритории = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, 90, ПараметрыПоиска); + ДанныеКлассификатораДополнительныеТерритории = Обработки.РасширенныйВводКонтактнойИнформации.АдресаДляИнтерактивногоВыбора(Родитель, 90, ПараметрыПоиска); Если ДанныеКлассификатораДополнительныеТерритории.Данные.Количество() = 0 Тогда Элементы.ДополнительныеТерритории.Видимость = Ложь; Элементы.Страницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; @@ -159,7 +159,7 @@ ПараметрыОткрытия.Вставить("Родитель", ТекущийРодитель); ПараметрыОткрытия.Вставить("Идентификатор", ИдентификаторДополнительного); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); КонецПроцедуры @@ -185,7 +185,7 @@ ПараметрыОткрытия.Вставить("Идентификатор", ИдентификаторПодчиненного); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); КонецПроцедуры &НаКлиенте @@ -207,7 +207,7 @@ ПараметрыОткрытия.Вставить("Идентификатор", ИдентификаторПодчиненногоДляТерритории); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); КонецПроцедуры @@ -250,6 +250,7 @@ &НаКлиенте Процедура ВариантыАдресаПриАктивизацииСтроки(Элемент) + Элементы.ВыбратьУлицу.Доступность = (Элемент.ТекущиеДанные <> Неопределено); Если Элемент.ТекущиеДанные <> Неопределено И ЕстьПодчиненныеЭлементы(Элемент.ТекущиеДанные.Идентификатор) Тогда Элементы.ДополнительныйЭлемент.Доступность = Истина; Элементы.ПодчиненныйЭлемент.Доступность = Истина; @@ -442,9 +443,9 @@ НаселенныйПунктДетально[НаименованиеЧастиАдреса].Сокращение = НаименованиеСокращение.Сокращение; Если НаименованиеЧастиАдреса = "ДополнительныйЭлемент" Тогда - НаселенныйПунктДетально[НаименованиеЧастиАдреса].ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(90, НаименованиеСокращение.Сокращение); + НаселенныйПунктДетально[НаименованиеЧастиАдреса].ПутьXPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, НаименованиеСокращение.Сокращение); ИначеЕсли НаименованиеЧастиАдреса = "ПодчиненныйЭлемент" Тогда - НаселенныйПунктДетально[НаименованиеЧастиАдреса].ПутьXPath = УправлениеКонтактнойИнформациейКлиентСервер.XPathДополнительногоОбъектаАдресации(91); + НаселенныйПунктДетально[НаименованиеЧастиАдреса].ПутьXPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91); Иначе НаселенныйПунктДетально[НаименованиеЧастиАдреса].ПутьXPath = НаименованиеЧастиАдреса; КонецЕсли; @@ -492,7 +493,7 @@ &НаСервере Процедура ЗаполнитьПорциюВариантов(ПараметрыПоиска) - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска); Если ДанныеКлассификатора.Отказ Тогда // Сервис на обслуживании Возврат; @@ -517,7 +518,7 @@ ДополнительныеПараметры.Вставить("ФорматАдреса", "ФИАС"); ДополнительныеПараметры.Вставить("СкрыватьНеактуальные", Ложь); - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораУлицы(Родитель, Текст, ДополнительныеПараметры); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораУлицы(Родитель, Текст, ДополнительныеПараметры); Если ДанныеКлассификатора.Отказ Тогда Возврат; КонецЕсли; @@ -557,7 +558,7 @@ КонецЦикла; Иначе // адрес был введен вручную - АнализКлассификатора =УправлениеКонтактнойИнформациейСлужебный.УлицыПоПредставлению(ИдентификаторРодителя, Представление); + АнализКлассификатора =Обработки.РасширенныйВводКонтактнойИнформации.УлицыПоПредставлению(ИдентификаторРодителя, Представление); Если АнализКлассификатора <> Неопределено Тогда ДанныеУлицы = АнализКлассификатора.Найти(7, "Уровень"); Если ДанныеУлицы <> Неопределено Тогда @@ -657,7 +658,7 @@ ПараметрыПоиска.Свойство("ФорматАдреса", "ФИАС"); ПараметрыПоиска.Свойство("СкрыватьНеактуальные", Истина); - ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Идентификатор, Уровень, ПараметрыПоиска); + ДанныеКлассификатора = Обработки.РасширенныйВводКонтактнойИнформации.АдресаДляИнтерактивногоВыбора(Идентификатор, Уровень, ПараметрыПоиска); Если ДанныеКлассификатора.Данные.Количество() > 0 Тогда Возврат Истина; КонецЕсли; diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form similarity index 98% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form index 9aabfd130..4a101976c 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Form.form @@ -149,7 +149,7 @@ Объект 1 - DataProcessorObject.ВводКонтактнойИнформации + DataProcessorObject.РасширенныйВводКонтактнойИнформации true diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl similarity index 100% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form similarity index 97% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form index d2439d2e7..ca23e4a0a 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form @@ -12,6 +12,10 @@ true + + <key>ru</key> + <value>Частей адреса</value> + ГруппаЧастейАдресаРасширеннаяПодсказка 8 @@ -134,7 +138,7 @@ Объект 1 - DataProcessorObject.ВводКонтактнойИнформации + DataProcessorObject.РасширенныйВводКонтактнойИнформации true diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html similarity index 87% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html index 2a1e984f3..e9dfd8d1e 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html @@ -1,10 +1,10 @@

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

                -

                Открывается из шаблона ввода адреса в поле Город, населенный пункт по кнопке  Выбрать.

                +

                Открывается из шаблона ввода адреса в поле Город, населенный пункт по кнопке  Выбрать.

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

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

                После окончания ввода города или населенного пункта нажмите ОК для продолжения ввода адреса.

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

                См. также:

                -
                • Ввод контактной информации; + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl similarity index 80% rename from SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl index 92a50f781..90cbd1bd6 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl @@ -35,15 +35,15 @@ ФорматАдреса = "ФИАС"; КонецЕсли; - МожноЗагружатьКлассификатор = УправлениеКонтактнойИнформациейСлужебный.ЕстьВозможностьИзмененияАдресногоКлассификатора(); + МожноЗагружатьКлассификатор = Обработки.РасширенныйВводКонтактнойИнформации.ЕстьВозможностьИзмененияАдресногоКлассификатора(); ПрефиксИмениЧастиАдреса = "Часть"; ЧастиАдреса = Параметры.НаселенныйПунктДетально; Если ЧастиАдреса = Неопределено Или ЧастиАдреса.Количество() = 0 Тогда - ЧастиАдреса = УправлениеКонтактнойИнформациейСлужебный.СписокРеквизитовНаселенныйПункт( , ФорматАдреса); + ЧастиАдреса = Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт( , ФорматАдреса); КонецЕсли; Если СервисКлассификатораНедоступен Тогда - УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); + Обработки.РасширенныйВводКонтактнойИнформации.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); КонецЕсли; ПостроитьФормуПоЧастямАдреса(); @@ -198,7 +198,7 @@ Представление = ?(ПустаяСтрока(ЧастьАдреса.Представление),ЧастьАдреса.Заголовок, ЧастьАдреса.Представление); ПараметрыОткрытия.Вставить("Представление", Представление); - ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент); КонецПроцедуры &НаКлиенте @@ -229,8 +229,7 @@ РегионНеЗагружен = ВыбранноеЗначение.Свойство("РегионЗагружен") И ВыбранноеЗначение.РегионЗагружен = Ложь; Если МожноЗагружатьКлассификатор И РегионНеЗагружен Тогда // Предлагаем загрузить классификатор. - УправлениеКонтактнойИнформациейКлиент.ПредложениеЗагрузкиКлассификатора( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Данные для ""%1"" не загружены.'"), ВыбранноеЗначение.Представление), + ПредложениеЗагрузкиКлассификатора(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Данные для ""%1"" не загружены.'"), ВыбранноеЗначение.Представление), ВыбранноеЗначение.Представление); КонецЕсли; КонецЕсли; @@ -365,7 +364,7 @@ Идентификатор = Неопределено; Для каждого ЧастьАдреса Из ЧастиАдреса Цикл Если ЗначениеЗаполнено(ЧастьАдреса.Значение.Представление) И ПустаяСтрока(ЧастьАдреса.Значение.Идентификатор) Тогда - УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); + Обработки.РасширенныйВводКонтактнойИнформации.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); Прервать; КонецЕсли; КонецЦикла; @@ -373,7 +372,7 @@ Идентификатор = УправлениеКонтактнойИнформациейКлиентСервер.ИдентификаторЭлементаПоЧастямАдреса(ЧастиАдреса, Ложь); Результат.Вставить("Идентификатор", Идентификатор); - Результат.Вставить("Представление", УправлениеКонтактнойИнформациейКлиентСервер.ПредставлениеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса)); + Результат.Вставить("Представление", РаботаСАдресамиКлиентСервер.ПредставлениеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса)); Результат.Вставить("НаселенныйПунктДетально", ЧастиАдреса); Возврат Результат; @@ -382,7 +381,7 @@ &НаСервереБезКонтекста Функция СписокАвтоподбораЧастиАдреса(Текст, ИмяЧастиАдреса, ЧастиАдреса, ДополнительныеПараметры) - Возврат УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораЧастиАдреса(Текст, ИмяЧастиАдреса, ЧастиАдреса, ДополнительныеПараметры); + Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораЧастиАдреса(Текст, ИмяЧастиАдреса, ЧастиАдреса, ДополнительныеПараметры); КонецФункции @@ -394,14 +393,14 @@ КонецПроцедуры -&НаСервере +&НаСервереБезКонтекста Функция ИдентификаторРодителяЧастиАдресаЭлемента(ЧастьАдреса, ЧастиАдреса) Идентификатор = Неопределено; ЕстьЧастьАдресаБезИдентификатора = ЕстьЛиИдентификаторРодителяЧастиАдресаЭлемента(ЧастиАдреса, ЧастьАдреса, Идентификатор); Если ЕстьЧастьАдресаБезИдентификатора Тогда - УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); + Обработки.РасширенныйВводКонтактнойИнформации.ЗаполнитьИдентификаторыНаселенногоПункта(ЧастиАдреса); ЕстьЧастьАдресаБезИдентификатора = ЕстьЛиИдентификаторРодителяЧастиАдресаЭлемента(ЧастиАдреса, ЧастьАдреса, Идентификатор); Если ЕстьЧастьАдресаБезИдентификатора Тогда Возврат Неопределено; @@ -412,7 +411,7 @@ КонецФункции -&НаСервере +&НаСервереБезКонтекста Функция ЕстьЛиИдентификаторРодителяЧастиАдресаЭлемента(ЧастиАдреса, ЧастьАдреса, Идентификатор) ЕстьЧастьАдресаБезИдентификатора = Ложь; @@ -436,4 +435,60 @@ Возврат ЕстьЧастьАдресаБезИдентификатора; КонецФункции +// Предлагает загрузить адресный классификатор. +// +// Параметры: +// Текст - Строка - Дополнительный текст предложения. +// Регион - Число, Строка - Код или название региона для загрузки. +// +&НаКлиенте +Процедура ПредложениеЗагрузкиКлассификатора(Знач Текст = "", Знач Регион = Неопределено) + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат; + КонецЕсли; + + НеЗагружатьАдресныйКлассификатор = ПараметрыПриложения.Получить("АдресныйКлассификатор.НеЗагружатьКлассификатор"); + Если НеЗагружатьАдресныйКлассификатор = Неопределено ИЛИ НеЗагружатьАдресныйКлассификатор = Ложь Тогда + ТипПараметраРегиона = ТипЗнч(Регион); + ПараметрыФормы = Новый Структура; + ПараметрыЗагрузки = Новый Структура; + ПараметрыФормы.Вставить("ТекстПредупреждения", Текст); + + Если ТипПараметраРегиона = Тип("Число") Тогда + ПараметрыЗагрузки.Вставить("КодРегионаДляЗагрузки", Регион); + + ИначеЕсли ТипПараметраРегиона = Тип("Строка") Тогда + ПараметрыЗагрузки.Вставить("НазваниеРегиона", Регион); + ПараметрыФормы.Вставить("НазваниеРегиона", Регион); + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ПредложениеЗагрузкиКлассификатораЗавершение", ЭтотОбъект, ПараметрыЗагрузки); + ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ЗагрузкаАдресногоКлассификатора", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредложениеЗагрузкиКлассификатораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); +КонецПроцедуры + +// Загружает адресный классификатор. +// +&НаКлиенте +Процедура ЗагрузитьАдресныйКлассификатор(Знач ДополнительныеПараметры = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form new file mode 100644 index 000000000..afc0c2fa1 --- /dev/null +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form @@ -0,0 +1,579 @@ + + + + <key>ru</key> + <value>Дополнительные настройки адреса РФ</value> + + + Адрес + 1 + + ТолькоРоссийскийАдрес + 5 + true + true + + true + + + ТолькоНациональныйАдрес + + Right + + OnChange + АдресТолькоНациональныйПриИзменении + + + ТолькоРоссийскийАдресРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТолькоРоссийскийАдресКонтекстноеМеню + 6 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаПроверкаАдреса + 8 + + ДекорацияОтступ + 10 + true + true + + true + + + ДекорацияОтступРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 11 + true + + Label + 1 + true + true + + Left + + + + ГруппаНастройкиПроверкаАдреса + 13 + + ПроверятьКорректностьАдреса + 15 + true + true + + true + + + ПроверятьКорректность + + Right + + OnChange + ПроверятьКорректностьАдресаПриИзменении + + + ПроверятьКорректностьАдресаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ПроверятьКорректностьАдресаКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + + ПроверятьПоКлассификатору + 27 + + <key>ru</key> + <value>Проверять по</value> + + true + true + + true + + + ПроверятьПоКлассификатору + + Left + Button + + ПроверятьПоКлассификаторуРасширеннаяПодсказка + 29 + + <key>ru</key> + <value>При проверке адреса по классификатору ФИАС выполняются дополнительные проверки: +- "Округ" (между уровнями "Регион" и "Район"). +- "Внутригородской район" (между уровнями "Город" и "Населенный пункт") +- Уровни дополнительных территорий (между "Улица", и номером дома или владения) +- Дома, владения, корпуса, строения и т.п.</value> + + Label + true + true + + Left + + + + ПроверятьПоКлассификаторуКонтекстноеМеню + 28 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + ФИАС + + + 0 + + + + + ru + КЛАДР + + + 1 + + + Vertical + + + + СкрыватьНеактуальныеАдреса + 21 + true + true + + true + + + СкрыватьНеактуальныеАдреса + + Right + + СкрыватьНеактуальныеАдресаExtendedTooltip + 23 + Label + true + true + + Left + + + + СкрыватьНеактуальныеАдресаКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + + + + УказыватьОКТМОВручную + 24 + true + true + + true + + + УказыватьОКТМО + + Right + + УказыватьОКТМОВручнуюРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + УказыватьОКТМОВручнуюКонтекстноеМеню + 25 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройки проверка адреса</value> + + + ГруппаНастройкиПроверкаАдресаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Проверка адреса</value> + + + ГруппаПроверкаАдресаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адрес</value> + + + АдресExtendedTooltip + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКоманднаяПанель + 30 + + ОК + 32 + true + true + + true + + true + + ОКРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 34 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 35 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.РасширенныйВводКонтактнойИнформации + + + true + + + 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 + + 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 + + + + ОК + + + DontUse + Auto + + + Объект + + + + + + + +
                  diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Module.bsl new file mode 100644 index 000000000..4beafbd65 --- /dev/null +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Module.bsl @@ -0,0 +1,98 @@ +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Параметры.Объект) = Тип("ДанныеФормыСтруктура") Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.Объект); + ПроверятьПоКлассификатору = ?(Параметры.Объект.ПроверятьПоФИАС, 0, 1); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ОтобразитьДоступностьВариантовПроверкиПоКлассификатору(); + ИзменитьОтображениеПриИзмененииТолькоНациональный(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура АдресТолькоНациональныйПриИзменении(Элемент) + + ИзменитьРеквизитыПриИзмененииТолькоНациональный(); + ИзменитьОтображениеПриИзмененииТолькоНациональный(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверятьКорректностьАдресаПриИзменении(Элемент) + ОтобразитьДоступностьВариантовПроверкиПоКлассификатору(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + Результат = ОписаниеНастроекАдреса(); + ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект); + Результат.ПроверятьПоФИАС = ?(ПроверятьПоКлассификатору = 0, Истина, Ложь); + Закрыть(Результат); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция ОписаниеНастроекАдреса() + Результат = Новый Структура(); + Результат.Вставить("ТолькоНациональныйАдрес"); + Результат.Вставить("ПроверятьКорректность"); + Результат.Вставить("ПроверятьПоФИАС"); + Результат.Вставить("СкрыватьНеактуальныеАдреса"); + Результат.Вставить("УказыватьОКТМО"); + + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ОтобразитьДоступностьВариантовПроверкиПоКлассификатору() + Если ПроверятьКорректность Тогда + Элементы.ПроверятьПоКлассификатору.Доступность = Истина; + Иначе + Элементы.ПроверятьПоКлассификатору.Доступность = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьОтображениеПриИзмененииТолькоНациональный() + + Элементы.ПроверятьПоКлассификатору.Доступность = ПроверятьКорректность; + Элементы.ПроверятьКорректностьАдреса.Доступность = ТолькоНациональныйАдрес; + Элементы.СкрыватьНеактуальныеАдреса.Доступность = ТолькоНациональныйАдрес; + Элементы.УказыватьОКТМОВручную.Доступность = ТолькоНациональныйАдрес; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРеквизитыПриИзмененииТолькоНациональный() + + Если Не ТолькоНациональныйАдрес Тогда + ПроверятьКорректность = Ложь; + СкрыватьНеактуальныеАдреса = Ложь; + УказыватьОКТМО = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Help/ru.html b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Help/ru.html new file mode 100644 index 000000000..95347e0e4 --- /dev/null +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Help/ru.html @@ -0,0 +1,20 @@ + +

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

                  +

                  Контактную информацию можно вводить:

                  +
                  • в виде произвольной строки, +
                  • с помощью шаблонов.

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

                  +

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

                  +

                  Использование шаблона при вводе телефонов и факсов облегчает ввод информации, сокращает количество ошибок при вводе.

                  +

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

                  +

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

                  +

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

                  +
                  • Выбрать (клавиша F4) - ввести контактную информацию по шаблону, аналогично кнопке  Выбрать. По шаблону можно ввести адрес, телефон или факс. +
                  • Открыть (сочетание клавиш Ctrl+Shift+F4) - просмотр введенной контактной информации (например, слишком длинный адрес можно увидеть целиком с помощью этой команды); +
                  • Вырезать (сочетание клавиш Ctrl+X); +
                  • Копировать (сочетание клавиш Ctrl+C); +
                  • Вставить (сочетание клавиш Ctrl+V); +
                  • Очистить (сочетание клавиш Shift+F4) - также очищаются поля для ввода по шаблону адреса и телефона. В поле Страна адреса автоматически вводится значение Россия. +
                  • Выделить все (сочетание клавиш Ctrl+A). +
                  • Ввести комментарий - с помощью этой команды можно ввести или изменить комментарий, не открывая окно редактирования поля. Комментарии предусмотрены для всех видов контактной информации, кроме текстового поля Другое, т.к. в это поле можно ввести всю нужную информацию. Воспользуйтесь командой, затем введите текст комментария, нажмите кнопку ОК для продолжения работы в программе. Если комментарий не пуст, то он выводится под полем контактной информации. +
                  • Адрес на Яндекс.Картах; Адрес на Google Maps - команды, которые позволяют увидеть адрес объекта на картах соответственно Яндекс или Google. Также можно эти команды найти в меню Еще в карточке ввода адреса. +
                  • История изменений - с помощью этой команды можно просмотреть изменения контактной информации.
                  \ 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..579f601af --- /dev/null +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl @@ -0,0 +1,3072 @@ + + +#Область ОбработчикиПодписокНаСобытия + +Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) + + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + + Если Параметры <> Неопределено И Параметры.Свойство("ОткрытаПоСценарию") Тогда + СтандартнаяОбработка = Ложь; + ВидИнформации = Параметры.ВидКонтактнойИнформации; + ВыбраннаяФорма = ИмяФормыВводаКонтактнойИнформации(ВидИнформации); + + Если ВыбраннаяФорма = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не обрабатываемый тип адреса: """ + ВидИнформации + """'"); + КонецЕсли; + + КонецЕсли; + + #КонецЕсли + +КонецПроцедуры + +#КонецОбласти + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Возвращает имя формы для редактирования типа контактной информации. +// +// Параметры: +// ВидИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации, СправочникСсылка.ВидыКонтактнойИнформации - +// запрашиваемый тип. +// +// Возвращаемое значение: +// Строка - полное имя формы. +// +Функция ИмяФормыВводаКонтактнойИнформации(Знач ВидИнформации) + + ТипИнформации = ТипВидаКонтактнойИнформации(ВидИнформации); + + ВсеТипы = "Перечисление.ТипыКонтактнойИнформации."; + Если ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Адрес") Тогда + Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводАдреса"; + + ИначеЕсли ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Телефон") Тогда + Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона"; + + ИначеЕсли ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Факс") Тогда + Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона"; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Функция ТипВидаКонтактнойИнформации(Знач ВидИнформации) + Результат = Неопределено; + + Тип = ТипЗнч(ВидИнформации); + Если Тип = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + Результат = ВидИнформации; + ИначеЕсли Тип = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + Результат = ВидИнформации.Тип; + ИначеЕсли ВидИнформации <> Неопределено Тогда + Данные = Новый Структура("Тип"); + ЗаполнитьЗначенияСвойств(Данные, ВидИнформации); + Результат = Данные.Тип; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает сведения об адресах в виде структуру частей адреса и кодов КЛАДР. +// +Функция СведенияОбАдресахВВидеСтруктуры(Адреса, ДополнительныеПараметры) Экспорт + Результат = Новый Массив; + Для каждого Адрес Из Адреса Цикл + Результат.Добавить(СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры)); + КонецЦикла; + Возврат Результат; +КонецФункции + +// Возвращает сведения об адресе в виде структуру частей адреса и кодов КЛАДР. +// +Функция СведенияОбАдресеВВидеСтруктуры(Адрес, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + ПолноеНаименованиеСокращений = ?(ДополнительныеПараметры.Свойство("ПолноеНаименованиеСокращений"), ДополнительныеПараметры.ПолноеНаименованиеСокращений, Ложь); + НаименованиеВключаетСокращение = ?(ДополнительныеПараметры.Свойство("НаименованиеВключаетСокращение"), ДополнительныеПараметры.НаименованиеВключаетСокращение, Ложь); + ЗаполнятьКоды = ?(ДополнительныеПараметры.Свойство("КодыКЛАДР"), ДополнительныеПараметры.КодыКЛАДР, Ложь); + Иначе + НаименованиеВключаетСокращение = Ложь; + ПолноеНаименованиеСокращений = Ложь; + ЗаполнятьКоды = Ложь; + КонецЕсли; + + НаименованиеСтраны = ""; + Результат = Новый Структура; + Формат9Запятых = Ложь; + + ЭлементыАдреса = Новый Соответствие; + + Если ТипЗнч(Адрес) = Тип("Строка") Тогда + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда + XDTOАдрес = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(Адрес); + Иначе + Если СтрЧислоВхождений(Адрес, ",") = 9 Тогда + Формат9Запятых = Истина; + АдресРФ = Адрес; + Иначе + XDTOАдрес = ДесериализацияАдресаОбщая(Адрес, ""); + КонецЕсли; + КонецЕсли; + Иначе + XDTOАдрес = Адрес + КонецЕсли; + + Если НЕ Формат9Запятых Тогда + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Состав = XDTOАдрес.Состав; + + Если Состав = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + XDTOТип = Состав.Тип(); + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + + Результат.Вставить("Страна", Состав.Страна); + Если ПустаяСтрока(Состав.Страна) Тогда + Страна = РаботаСАдресами.ОсновнаяСтрана(); + НаименованиеСтраны = Страна.Наименование; + КодСтраны = СокрЛП(Страна.Код); + Иначе + Страна = Справочники.СтраныМира.НайтиПоНаименованию(Состав.Страна, Истина); + НаименованиеСтраны = Страна.Наименование; + КодСтраны = СокрЛП(Страна.Код); + КонецЕсли; + Результат.Вставить("КодСтраны", КодСтраны); + + АдресРФ = Состав.Состав; + + ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ") Тогда + АдресРФ = Состав; + Иначе + Возврат Результат; + КонецЕсли; + + Если ТипЗнч(АдресРФ) = Тип("Строка") Тогда + Если СтрЧислоВхождений(АдресРФ, ",") = 9 Тогда + ЭлементыАдреса = СтруктураАдресаПоФормату9Запятых(АдресРФ); + Формат9Запятых = Истина; + Иначе + // адрес в свободной форме (РФ или Иностранный) + ЭлементыАдреса.Вставить("Страна", НаименованиеСтраны); + ЭлементыАдреса.Вставить("Индекс", ""); + ЭлементыАдреса.Вставить("Регион", ""); + ЭлементыАдреса.Вставить("Район", ""); + ЭлементыАдреса.Вставить("Город", ""); + ЭлементыАдреса.Вставить("НаселенныйПункт", ""); + ЭлементыАдреса.Вставить("Улица", ""); + ЭлементыАдреса.Вставить("Округ", ""); + ЭлементыАдреса.Вставить("ВнутригРайон", ""); + ЭлементыАдреса.Вставить("Дом",""); + ЭлементыАдреса.Вставить("Корпус", ""); + ЭлементыАдреса.Вставить("Квартира", ""); + ЭлементыАдреса.Вставить("ДополнительнаяТерритория", ""); + ЭлементыАдреса.Вставить("ЭлементДополнительнойТерритории", ""); + КонецЕсли; + Иначе + ЭлементыАдреса.Вставить("Страна", НаименованиеСтраны); + ЭлементыАдреса.Вставить("Индекс", ПочтовыйИндексАдреса(АдресРФ)); + ЭлементыАдреса.Вставить("Регион", АдресРФ.СубъектРФ); + ЭлементыАдреса.Вставить("Район", РайонАдреса(АдресРФ)); + ЭлементыАдреса.Вставить("Город", АдресРФ.Город); + ЭлементыАдреса.Вставить("НаселенныйПункт", АдресРФ.НаселПункт); + ЭлементыАдреса.Вставить("Улица", АдресРФ.Улица); + ЭлементыАдреса.Вставить("Округ", АдресРФ.Округ); + ЭлементыАдреса.Вставить("ВнутригРайон", АдресРФ.ВнутригРайон); + ЭлементыАдреса.Вставить("Дом",""); + ЭлементыАдреса.Вставить("Корпус", ""); + ЭлементыАдреса.Вставить("Квартира", ""); + ЭлементыАдреса.Вставить("ДополнительнаяТерритория", НайтиДополнительныйЭлементАдреса(АдресРФ).Значение); + ЭлементыАдреса.Вставить("ЭлементДополнительнойТерритории", + ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); + КонецЕсли; + КонецЕсли; + + СоответствиеСокращений = Новый Соответствие; + + ЭтоНациональныйАдрес = ?(СтрСравнить(НаименованиеСтраны, РаботаСАдресами.ОсновнаяСтрана().Наименование) = 0, Истина, Ложь); + Если ЭтоНациональныйАдрес Тогда + Результат.Вставить("КодРегиона", КодРегиона(ЭлементыАдреса["Регион"])); + КонецЕсли; + + Результат.Вставить("Индекс", ЭлементыАдреса.Получить("Индекс")); + + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Регион"], "Регион", СоответствиеСокращений, НаименованиеВключаетСокращение, 1); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Округ"], "Округ", СоответствиеСокращений, НаименованиеВключаетСокращение, 2); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Район"], "Район", СоответствиеСокращений, НаименованиеВключаетСокращение, 3); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Город"], "Город", СоответствиеСокращений, НаименованиеВключаетСокращение, 4); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ВнутригРайон"], "ВнутригородскойРайон", СоответствиеСокращений, НаименованиеВключаетСокращение, 5); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["НаселенныйПункт"], "НаселенныйПункт", СоответствиеСокращений, НаименованиеВключаетСокращение, 6); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["Улица"], "Улица", СоответствиеСокращений, НаименованиеВключаетСокращение, 7); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ДополнительнаяТерритория"], "ДополнительнаяТерритория", СоответствиеСокращений, НаименованиеВключаетСокращение, 90); + ОпределитьСоответствиеСокращений(Результат, ЭлементыАдреса["ЭлементДополнительнойТерритории"], "ЭлементДополнительнойТерритории", СоответствиеСокращений, НаименованиеВключаетСокращение, 91); + + Если ПолноеНаименованиеСокращений = Истина Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.ПолныеНаименованияСокращений(СоответствиеСокращений); + КонецЕсли; + КонецЕсли; + + Результат.Вставить("РегионСокращение", СоответствиеСокращений[1]); + Результат.Вставить("ОкругСокращение", СоответствиеСокращений[2]); + Результат.Вставить("РайонСокращение", СоответствиеСокращений[3]); + Результат.Вставить("ГородСокращение", СоответствиеСокращений[4]); + Результат.Вставить("ВнутригородскойРайонСокращение", СоответствиеСокращений[5]); + Результат.Вставить("НаселенныйПунктСокращение", СоответствиеСокращений[6]); + Результат.Вставить("УлицаСокращение", СоответствиеСокращений[7]); + Результат.Вставить("ДополнительнаяТерриторияСокращение", СоответствиеСокращений[90]); + Результат.Вставить("ЭлементДополнительнойТерриторииСокращение", СоответствиеСокращений[91]); + Результат.Вставить("Здание", Новый Структура("ТипЗдания, Номер")); + Результат.Вставить("Корпуса", Новый Массив); + Результат.Вставить("Помещения", Новый Массив); + + Если НЕ Формат9Запятых Тогда + + ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ); + Для каждого Здание Из ЗданияИПомещения.Здания Цикл + Если Здание.Вид = 1 Тогда + Результат.Здание.ТипЗдания = Здание.Тип; + Результат.Здание.Номер = Здание.Значение; + Иначе + Результат.Корпуса.Добавить(Новый Структура("ТипКорпуса, Номер", Здание.Тип, Здание.Значение)); + КонецЕсли; + КонецЦикла; + + Для каждого Помещение Из ЗданияИПомещения.Помещения Цикл + Результат.Помещения.Добавить(Новый Структура("ТипПомещения, Номер", Помещение.Тип, Помещение.Значение)); + КонецЦикла; + + Иначе + Здание = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Дом"]); + Результат.Здание.ТипЗдания = Здание.Наименование; + Результат.Здание.Номер = Здание.Сокращение; + + Корпус = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Корпус"]); + Результат.Корпуса.Добавить(Новый Структура("ТипКорпуса, Номер", Корпус.Наименование, Корпус.Сокращение)); + + Квартира = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементыАдреса["Квартира"]); + Результат.Помещения.Добавить(Новый Структура("ТипПомещения, Номер", Квартира.Наименование, Квартира.Сокращение)); + КонецЕсли; + + Если ЗаполнятьКоды И ЭтоНациональныйАдрес Тогда + ЗаполнитьКодыАдреса(Результат, Адрес); + ОпределитьФорматКодов(Результат, АдресРФ); + КонецЕсли; + + // Из XDTO пустые значение приходят как Неопределено + УправлениеКонтактнойИнформациейСлужебный.ЗаменитьВСтруктуреНеопределеноНаПустуюСтроку(Результат); + + Возврат Результат; +КонецФункции + +#Область ВзаимодействиеСАдреснымКлассификатором + +// Определение режима работы форм ввода. +// +// Возвращаемое значение: +// Булево - Истина, если работа с классификатором ведется через веб-сервис. +// +Функция КлассификаторДоступенЧерезВебСервис() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат Ложь; + КонецЕсли; + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Источник = МодульАдресныйКлассификаторСлужебный.ИсточникДанныхАдресногоКлассификатора(); + + Возврат Не ПустаяСтрока(Источник); +КонецФункции + +// Возвращает флаг того, что текущий пользователь может загружать или очищать адресный классификатор. +// +// Возвращаемое значение: +// Булево- результат проверки. +// +Функция ЕстьВозможностьИзмененияАдресногоКлассификатора() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + ОбъектКонтроля = Метаданные.РегистрыСведений.Найти("АдресныеОбъекты"); + Возврат ОбъектКонтроля <> Неопределено И ПравоДоступа("Изменение", ОбъектКонтроля) И НЕ ОбщегоНазначения.РазделениеВключено(); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Проверка доступности поставщика - локальной базы или сервиса. Запрос версии. +// +// Возвращаемое значение: +// Структура - описание состояния. +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * Данные - Строка - Описание версии поставщика. +// +Функция ВерсияПоставщикаДанныхКлассификатора() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Возврат МодульАдресныйКлассификаторСлужебный.ВерсияПоставщикаДанных(); + КонецЕсли; + + Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); + Результат.Вставить("Версия"); + Возврат Результат; + +КонецФункции + +// Проверяет доступность классификатора и помещает результат в хранилище +// +Процедура ПроверитьДоступностьКлассификатора(ДоступностьКлассификатораАдрес, АдресРезультата) Экспорт + + ПоместитьВоВременноеХранилище(ВерсияПоставщикаДанныхКлассификатора(), АдресРезультата); + +КонецПроцедуры + +// Возвращает наименование региона по его коду. +// +// Параметры: +// Код - Строка, Число - код региона. +// +// Возвращаемое значение: +// Строка - полное наименование региона с сокращением. +// Неопределено - если нет ни одной подсистемы адресного классификатора. +// +Функция РегионКода(Знач Код) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); + Возврат МодульАдресныйКлассификатор.НаименованиеРегионаПоКоду(Код); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Возвращает код региона по его полному наименованию. +// +// Параметры: +// НаименованиеРегиона - Строка - полное наименование региона с сокращением. +// +// Возвращаемое значение: +// Строка - код региона из двух цифр. Пустая строка, если наименование определить не удалось. +// Неопределено - если нет ни одной подсистемы адресного классификатора. +// +Функция КодРегиона(Знач ПолноеНаименование) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); + Код = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(ПолноеНаименование); + Возврат Формат(Код, "ЧЦ=2; ЧН=; ЧВН="); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Возвращает адрес по представлению. +// +// Параметры: +// Текст - Строка - текст автоподбора. +Функция НаселенныеПунктыПоПредставлению(Знач Текст) Экспорт + + Результат = Новый СписокЗначений; + + ДанныеАнализа = ЧастиАдресаТаблицей(Текст); + Если ДанныеАнализа.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + АдресРФ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ")); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + АдресПоУровням = МодульАдресныйКлассификаторСлужебный.УстановитьСоответствиеЧастейАдресаИхУровнюДляНаселенногоПункта(ДанныеАнализа, УровниАдресныхОбъектов("НаселенныйПункт")); + Если АдресПоУровням <> Неопределено Тогда + ПоместитьАдресВXDTO(АдресРФ, АдресПоУровням); + + // Что-то осталось, добавляем это на уровень населенного пункта. + Фильтр = Новый Структура("Уровень", 0); + СтрокиСУровнем0 = АдресПоУровням.НайтиСтроки(Фильтр); + Разделитель = ""; + НаселПункт = ""; + Для каждого ЭлементАдреса Из СтрокиСУровнем0 Цикл + НаселПункт = НаселПункт + Разделитель + ЭлементАдреса.Значение; + Разделитель = ", "; + КонецЦикла; + Иначе + НаселПункт = Текст; + КонецЕсли; + Иначе + ПозицияСубъектРФ = СтрНайти(Текст, ",", НаправлениеПоиска.СКонца); + Если ПозицияСубъектРФ > 0 Тогда + Регион = СокрЛП(Сред(Текст, ПозицияСубъектРФ + 1)); + УстановитьСвойствоПоXPath(АдресРФ, "СубъектРФ", Регион); + НаселПункт = СокрЛП(Лев(Текст, ПозицияСубъектРФ - 1)); + Иначе + НаселПункт = Текст; + КонецЕсли; + КонецЕсли; + + Если НЕ ПустаяСтрока(НаселПункт) Тогда + Если ЗначениеЗаполнено(АдресРФ.НаселПункт) Тогда + НаселПункт = НаселПункт + ", " + АдресРФ.НаселПункт; + КонецЕсли; + УстановитьСвойствоПоXPath(АдресРФ, "НаселПункт", НаселПункт); + КонецЕсли; + + Возврат АдресРФ; + +КонецФункции + +// Возвращает структуру с полем "ДанныеВыбора", содержащую список вариантов населенных пунктов +// по иерархическому представлению младший-старший. +// +// Параметры: +// ИдентификаторНаселенногоПункта - УникальныйИдентификатор - код классификатора для ограничения подбора. +// Текст - Текст - строка автоподбора. +// СкрыватьНеактуальныеАдреса - Булево - флаг того, что неактуальные адреса не должны попадать в автоподбор. +// ВыбиратьСтрок - Число - ограничение на количество результатов. +// +// Возвращаемое значение: +// Структура - результат поиска данных. Содержит поля: +// * СлишкомМногоДанных - Булево - признак того, что результирующий список не полон. +// * ДанныеВыбора - СписокЗначений - данные для автоподбора. +// +Функция УлицыПоПредставлению(ИдентификаторНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса = Ложь, ВыбиратьСтрок = 50) Экспорт + + Если ЗначениеЗаполнено(ИдентификаторНаселенногоПункта) + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + ЧастиАдреса = ЧастиАдресаТаблицей(Текст); + Если ЧастиАдреса.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.УстановитьУровниУлицыПоЧастямАдреса(ИдентификаторНаселенногоПункта, ЧастиАдреса); + Возврат ЧастиАдреса; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Возвращает структуру, описывающую населенный пункт в иерархии младший-старший +// для текущего адресного классификатора. Имена ключей структуры зависят от +// классификатора. +// +// Параметры: +// Идентификатор - УникальныйИдентификатор - Идентификатор объекта. Если указан, то структура +// заполняется данными для этого объекта. +// ВариантКлассификатора - Строка - Требуемый вид классификатора. +// +// Возвращаемое значение: +// Структура - описание населенного пункта. +// +Функция СписокРеквизитовНаселенныйПункт(Идентификатор = Неопределено, ВариантКлассификатора = "КЛАДР") Экспорт + + Результат = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ВариантКлассификатора); + + Если Идентификатор = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат Неопределено; + КонецЕсли; + + // Заполняем данные по идентификатору. + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + СтруктураДанных = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); + + Если Не СтруктураДанных.Отказ Тогда + Адрес = СтруктураДанных.Данные; + Для Каждого КлючЗначение Из Результат Цикл + Часть = КлючЗначение.Значение; + Часть.Представление = СокрЛП(ПолучитьXDTOРеквизитОбъекта(Адрес, Часть.ПутьXPath)); + НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(Часть.Представление); + Часть.Наименование = НаименованиеСокращение.Наименование; + Часть.Сокращение = НаименованиеСокращение.Сокращение; + КонецЦикла; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Устанавливает значения полей населенного пункта в XDTO адресе. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - адрес РФ. +// Идентификатор - УникальныйИдентификатор - Источник данных для заполнения. +// +Процедура УстановитьНаселенныйПунктАдресаПоИдентификатору(XDTOАдрес, Идентификатор) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат; + КонецЕсли; + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + ДанныеАдреса = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); + Если ДанныеАдреса.Отказ Тогда + // Классификатор поломан + Возврат; + КонецЕсли; + + Эталон = ДанныеАдреса.Данные; + + ЧастиАдреса = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(); + Для Каждого КлючЗначение Из ЧастиАдреса Цикл + Если КлючЗначение.Значение.Уровень < 7 Тогда + Путь = КлючЗначение.Значение.ПутьXPath; + УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Устанавливает значения полей улицы. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - адрес РФ. +// Идентификатор - УникальныйИдентификатор - Источник данных для заполнения. +// +Процедура УстановитьУлицуАдресаПоИдентификатору(XDTOАдрес, Идентификатор) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат; + КонецЕсли; + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + ДанныеАдреса = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(Идентификатор); + Если ДанныеАдреса.Отказ Тогда + // Классификатор поломан + Возврат; + КонецЕсли; + + Эталон = ДанныеАдреса.Данные; + КодСериализацииПочтовогоИндекса = РаботаСАдресамиКлиентСервер.КодСериализацииПочтовогоИндекса(); + КодСериализацииДополнительногоОбъектаАдресации = РаботаСАдресамиКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(91); + + ЧастиАдреса = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(); + Для Каждого КлючЗначение Из ЧастиАдреса Цикл + Если КлючЗначение.Значение.Уровень = 90 Тогда + Для каждого ДопАдрЭл Из Эталон.ДопАдрЭл Цикл + Если ДопАдрЭл.ТипАдрЭл <> КодСериализацииДополнительногоОбъектаАдресации + И ДопАдрЭл.ТипАдрЭл <> КодСериализацииПочтовогоИндекса Тогда + Путь = "ДопАдрЭл[ТипАдрЭл='" + ДопАдрЭл.ТипАдрЭл + "']"; + УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); + КонецЕсли; + КонецЦикла; + ИначеЕсли КлючЗначение.Значение.Уровень = 91 Тогда + Для каждого ДопАдрЭл Из Эталон.ДопАдрЭл Цикл + Если ДопАдрЭл.ТипАдрЭл = КодСериализацииДополнительногоОбъектаАдресации Тогда + Путь = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91, ДопАдрЭл.ТипАдрЭл); + УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); + КонецЕсли; + КонецЦикла; + ИначеЕсли КлючЗначение.Значение.Уровень = 7 Тогда + Путь = КлючЗначение.Значение.ПутьXPath; + УстановитьXDTOРеквизитОбъекта(XDTOАдрес, Путь, ПолучитьXDTOРеквизитОбъекта(Эталон, Путь)); + КонецЕсли; + КонецЦикла; + + + +КонецПроцедуры + +// Устанавливает значения идентификаторов для частей адреса. +// +// Параметры: +// НаселенныйПунктДетально - Структура - части адреса. +// ИдентификаторАдреса - УникальныйИдентификатор - Источник данных для заполнения. +// +Процедура ЗаполнитьИдентификаторыНаселенногоПункта(НаселенныйПунктДетально) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + МодульАдресныйКлассификаторСлужебный.УстановитьИдентификаторыНаселенногоПункта(НаселенныйПунктДетально); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьАдресВXML(АдресВXML, РезультатПроверки, ПараметрыПроверкиАдреса = Неопределено) Экспорт + + Источник = АдресXMLВXDTO(АдресВXML,, Перечисления.ТипыКонтактнойИнформации.Адрес); + ЕстьОшибки = Ложь; + + ФорматАдреса = "КЛАДР"; + ТолькоНациональныйАдрес = Истина; + Если ТипЗнч(ПараметрыПроверкиАдреса) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ПараметрыПроверки = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(ПараметрыПроверкиАдреса); + ФорматАдреса = ?(ПараметрыПроверки.ПроверятьПоФИАС, "ФИАС", "КЛАДР"); + ТолькоНациональныйАдрес = ПараметрыПроверки.ТолькоНациональныйАдрес; + Иначе + ПараметрыПроверки = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(); + Если ПараметрыПроверкиАдреса <> Неопределено Тогда + Если ПараметрыПроверкиАдреса.Свойство("ФорматАдреса") И ЗначениеЗаполнено(ПараметрыПроверкиАдреса.ФорматАдреса) Тогда + ФорматАдреса = ПараметрыПроверкиАдреса.ФорматАдреса; + КонецЕсли; + Если ПараметрыПроверкиАдреса.Свойство("ТолькоНациональныйАдрес") И ЗначениеЗаполнено(ПараметрыПроверкиАдреса.ТолькоНациональныйАдрес) Тогда + ТолькоНациональныйАдрес = ПараметрыПроверкиАдреса.ТолькоНациональныйАдрес; + КонецЕсли; + КонецЕсли; + ПараметрыПроверки.ПроверятьКорректность = Истина; + КонецЕсли; + + Если ВРег(ФорматАдреса) = "ФИАС" Тогда + ПараметрыПроверки.Вставить("ПроверятьПоФИАС", Истина); + КонецЕсли; + + ПараметрыПроверки.Вставить("ФорматАдреса", ФорматАдреса); + ПараметрыПроверки.Вставить("ТолькоНациональныйАдрес ", ТолькоНациональныйАдрес); + + Адрес = Источник.Состав; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Если Адрес <> Неопределено И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + СписокОшибок = ОшибкиЗаполненияАдресаXDTO(Адрес, ПараметрыПроверки); + КонецЕсли; + + Если СписокОшибок.Количество() = 0 Тогда + РезультатПроверки.Результат = "Корректный"; + Иначе + Если НЕ СписокОшибок[0].Пометка Тогда + РезультатПроверки.Результат = "НеПроверен"; + Иначе + РезультатПроверки.Результат = "СодержитОшибки"; + КонецЕсли; + КонецЕсли; + + РезультатПроверки.СписокОшибок = СписокОшибок; + + +КонецПроцедуры + +// Возвращает данные классификатора по почтовому индексу. +// +// Параметры: +// Индекс - Строка, Число - почтовый индекс, для которого необходимо получать данные. +// +// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: +// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию Ложь. +// * ФорматАдреса - Строка - тип используемого классификатора. +// +// Возвращаемое значение: +// Структура - найденные варианты. Содержит поля: +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. +// * Данные - ТаблицаЗначений - Содержит данные для выбора. Колонки: +// ** Неактуален - Булево - Флаг неактуальности строки данных. +// ** Идентификатор - УникальныйИдентификатор - Код классификатора для поиска +// вариантов по индексу. +// ** Представление - Строка - Представление варианта. +// +Функция АдресаКлассификатораПоПочтовомуИндексу(Знач Индекс, Знач ДополнительныеПараметры) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + + ТипЧисло = Новый ОписаниеТипов("Число"); + ИндексЧислом = ТипЧисло.ПривестиЗначение(Индекс); + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Возврат МодульАдресныйКлассификаторСлужебный.АдресаПоПочтовомуИндексуКлассификатора(ИндексЧислом, ДополнительныеПараметры); + + КонецЕсли; + + Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); + Результат.Вставить("Данные", Новый ТаблицаЗначений); + Возврат Результат; + +КонецФункции + +// Возвращает данные классификатора поля выбора по уровню. +// +// Параметры: +// Родитель - УникальныйИдентификатор - Родительский объект. +// Уровень - Число - Требуемый уровень данных. 1-7, 90, 91 - адресные объекты, -1 +// - ориентиры. +// ДополнительныеПараметры - Структура - Описание настройке поиска. Поля: +// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию +// Ложь. +// * ФорматАдреса - Строка - тип используемого классификатора. +// +// * РазмерПорции - Число - Необязательный размер порции возвращаемых данных. Если не указано +// или 0, то возвращает все элементы. +// * ПерваяЗапись - УникальныйИдентификатор - Элемент, с которого начинается порция данных. Сам элемент не +// входит в выборку. +// * Сортировка - Строка - Направление сортировки для порции. +// +// Возвращаемое значение: +// Структура - найденные варианты. Содержит поля: +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * Заголовок - Строка - Строка с предложением выбора. +// * Данные - ТаблицаЗначений - Содержит данные для выбора. Колонки: +// ** Неактуален - Булево - Флаг неактуальности строки данных. +// ** Идентификатор - УникальныйИдентификатор - Код классификатора для поиска вариантов по индексу. +// ** Представление - Строка - Представление варианта. +// +Функция АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ДополнительныеПараметры) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Возврат МодульАдресныйКлассификаторСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ДополнительныеПараметры); + КонецЕсли; + + Результат = СтруктураОшибкиПоставщикаАдресногоКлассификатора(); + Результат.Вставить("Заголовок"); + Результат.Вставить("Данные", Новый ТаблицаЗначений); + Возврат Результат; + +КонецФункции + +// Возвращает список для автоподбора населенного пункта, поиск по подобию. Список ограничен 20 записями. +// +// Параметры: +// Текст - Строка - Текст, введенный в поле. +// ИмяЧастиАдреса - Строка - Идентификатор обрабатываемой части адреса. +// ЧастиАдреса - Структура - Значения для других частей адреса. +// ДополнительныеПараметры - Структура - Описание настройке поиска. Поля: +// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По +// умолчанию Ложь. +// * ФорматАдреса - Строка - Тип используемого классификатора. +// +// Возвращаемое значение: +// Структура - найденные варианты. Содержит поля: +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * Данные - СписокЗначений - результат для автоподбора. +// +Функция СписокАвтоподбораЧастиАдреса(Текст, ИмяЧастиАдреса, ЧастиАдреса, ДополнительныеПараметры) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Результат = Новый Структура("Данные", Новый СписокЗначений); + Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); + КонецЕсли; + + ЧастьАдреса = ЧастиАдреса[ИмяЧастиАдреса]; + Родитель = УправлениеКонтактнойИнформациейКлиентСервер.ИдентификаторРодителяЧастиАдресаЭлемента(ЧастьАдреса, ЧастиАдреса); + + Уровни = Новый Массив; + Уровни.Добавить(ЧастьАдреса.Уровень); + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, Родитель, Уровни, ДополнительныеПараметры); + + ТабличныеДанные = Результат.Данные; + + Результат.Данные = Новый СписокЗначений; + Если Не Результат.Отказ Тогда + ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Ложь); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Процедура ЗаполнитьСписокАвтоподбораИзТаблицы(Результат, ТабличныеДанные, ЭтоПодборУлицы) + + Для Каждого Строка Из ТабличныеДанные Цикл + + Если Строка.Неактуален Тогда + Пометка = Истина; + Представление = Новый ФорматированнаяСтрока(Строка.Представление,, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + Предупреждение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес ""%1"" неактуален.'"), Строка.Представление); + Иначе + Предупреждение = Неопределено; + Пометка = Ложь; + Представление = Строка.Представление; + КонецЕсли; + + ЗначениеЭлемента = Новый Структура; + ЗначениеЭлемента.Вставить("Идентификатор", Строка.Идентификатор); + ЗначениеЭлемента.Вставить("Представление", Строка.Представление); + ЗначениеЭлемента.Вставить("Автоподбор", Истина); + ЗначениеЭлемента.Вставить("РегионЗагружен", Строка.РегионЗагружен); + Если ЭтоПодборУлицы Тогда + Если Строка.Уровень = 90 Тогда + ЗначениеЭлемента.Вставить("Улица", ""); + ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", Строка.Представление); + ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", ""); + ИначеЕсли Строка.Уровень = 91 Тогда + ЗначениеЭлемента.Вставить("Улица", ""); + ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", ""); + ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", Строка.Представление); + Иначе + ЗначениеЭлемента.Вставить("Улица", Строка.Представление); + ЗначениеЭлемента.Вставить("ДополнительныйЭлемент", ""); + ЗначениеЭлемента.Вставить("ПодчиненныйЭлемент", ""); + КонецЕсли; + ЗначениеЭлемента.Вставить("ТипАдресногоЭлемента", Строка.ТипАдресногоЭлемента); + + КонецЕсли; + + Результат.Добавить( + Новый Структура("Предупреждение, Значение", Предупреждение, ЗначениеЭлемента), + Представление, Пометка); + КонецЦикла; + +КонецПроцедуры + + +// Возвращает структуру с полем "Данные", содержащую список для автоподбора населенного пункта +// по иерархическому представлению младший-старший. +// +// Параметры: +// Текст - Строка - текст автоподбора. +// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: +// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию +// Ложь. +// * ФорматАдреса - Строка - тип используемого классификатора. +// +// Возвращаемое значение: +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. +// * Данные - СписокЗначений - результат для автоподбора. +// +Функция СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Результат = Новый Структура("Данные", Новый СписокЗначений); + Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); + КонецЕсли; + + ЧастиАдреса = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ДополнительныеПараметры.ФорматАдреса); + + Родитель = Неопределено; + Уровни = Новый Массив; + Для Каждого КлючЗначение Из ЧастиАдреса Цикл + Если КлючЗначение.Значение.Уровень < 7 Тогда + Уровни.Добавить(КлючЗначение.Значение.Уровень); + КонецЕсли; + КонецЦикла; + + ПреобразоватьВводАдреса(Текст); + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, Родитель, Уровни, ДополнительныеПараметры); + + ТабличныеДанные = Результат.Данные; + + Результат.Данные = Новый СписокЗначений; + Если Не Результат.Отказ Тогда + ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Ложь); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Преобразует введенные английские буквы к русской раскладке при подборе адреса +// +Процедура ПреобразоватьВводАдреса(Текст) + РусскиеКлавиши = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ"; + АнглийскиеКлавиши = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.`"; + Текст = ВРег(Текст); + Для Позиция = 0 По СтрДлина(Текст) Цикл + Символ = Сред(Текст, Позиция, 1); + ПозицияСимвола = СтрНайти(АнглийскиеКлавиши, Символ); + Если ПозицияСимвола > 0 Тогда + Текст = СтрЗаменить(Текст, Символ, Сред(РусскиеКлавиши, ПозицияСимвола, 1)); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Возвращает структуру с полем "Данные", содержащую список для автоподбора улицы +// по иерархическому представлению младший-старший. +// +// Параметры: +// НаселенныйПункт - УникальныйИдентификатор - Населенный пункт. +// Текст - Строка - Текст автоподбора. +// ДополнительныеПараметры - Структура - Описывает настройки поиска. Состоит из необязательных полей: +// * СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию +// Ложь. +// * ФорматАдреса - Строка - Тип используемого классификатора. +// * РазмерПорции - Число - Количество возвращаемых данных. +// +// Возвращаемое значение: +// * Отказ - Булево - Поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * КраткоеПредставлениеОшибки - Строка - Описание ошибки, если поставщик недоступен. Неопределено, если Отказ +// = Ложь. +// * ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. +// * Данные - СписокЗначений - результат для автоподбора. +// +Функция СписокАвтоподбораУлицы(НаселенныйПункт, Текст, ДополнительныеПараметры) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Результат = Новый Структура("Данные", Новый СписокЗначений); + Возврат СтруктураОшибкиПоставщикаАдресногоКлассификатора(Результат); + КонецЕсли; + + ЧастиАдреса = РаботаСАдресамиКлиентСервер.СтруктураЧастейАдресаНаселенногоПункта(ДополнительныеПараметры.ФорматАдреса); + + Уровни = Новый Массив; + Для Каждого КлючЗначение Из ЧастиАдреса Цикл + Если КлючЗначение.Значение.Уровень > 6 Тогда + Уровни.Добавить(КлючЗначение.Значение.Уровень); + КонецЕсли; + КонецЦикла; + + ПреобразоватьВводАдреса(Текст); + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Результат = МодульАдресныйКлассификаторСлужебный.ВариантыАвтоподбора(Текст, НаселенныйПункт, Уровни, ДополнительныеПараметры); + + ТабличныеДанные = Результат.Данные; + + Результат.Данные = Новый СписокЗначений; + Если Не Результат.Отказ Тогда + ЗаполнитьСписокАвтоподбораИзТаблицы(Результат.Данные, ТабличныеДанные, Истина); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает список значение содержащий номера домов для автоподбора. +// +// Параметры: +// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Населенный пункт или улица. +// СтрокаПоиска - Строка - Текст автоподбора. +// Возвращаемое значение: +// СписокЗначений - результат для автоподбора. +// +Функция СписокАвтоподбораНомераДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска) Экспорт + + ВариантыДомов = Новый СписокЗначений; + + СписокДомов = СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска); + Если СписокДомов <> Неопределено Тогда + ВариантыДомов = Новый СписокЗначений; + Для каждого Строка Из СписокДомов Цикл + ВариантыДомов.Добавить(Строка.Значение, Строка.Представление); + КонецЦикла; + КонецЕсли; + + Возврат ВариантыДомов; +КонецФункции + +// Возвращает список домов по идентификатору адресного объекта, поиск по подобию. +// +// Параметры: +// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - Родительский объект. +// СтрокаПоиска - Строка - Текст, отбора в списке домов. +// +// Возвращаемое значение: +// ТаблицаЗначений - найденные варианты. +// +Функция СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска = "") Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + СписокДомов = МодульАдресныйКлассификаторСлужебный.СписокДомов(ИдентификаторАдресногоОбъекта, СтрокаПоиска); + Возврат СписокДомов; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Заполняет коды по структуре адреса. +// +Процедура ЗаполнитьКодыАдреса(Результат, Адрес) + + КодыКЛАДР = Новый Структура("Регион, Округ, Город, ВнутригородскойРайон, НаселенныйПункт, Улица"); + ДополнительныеКоды = Новый Структура("ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ"); + Результат.Вставить("КодыКЛАДР", КодыКЛАДР); + Результат.Вставить("ДополнительныеКоды", ДополнительныеКоды); + + Если ПустаяСтрока(Результат.Регион) Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + АдресныеКоды = МодульАдресныйКлассификаторСлужебный.КодыАдресаИКодыКЛАДР(Адрес); + Результат.ДополнительныеКоды = АдресныеКоды.КодыАдреса; + Результат.КодыКЛАДР = АдресныеКоды.КодыКЛАДР; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +//====================================================================================================================== +// Служебные + +// Внутреннее для сериализации. +Функция ДесериализацияАдресаОбщая(Знач ЗначенияПолей, Знач Представление, Знач ОжидаемыйТип = Неопределено) + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей) Тогда + // Общий формат контактной информации. + Возврат УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(ЗначенияПолей, ОжидаемыйТип); + КонецЕсли; + + Если ОжидаемыйТип <> Неопределено Тогда + Если ОжидаемыйТип <> Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ВызватьИсключение НСтр("ru = 'Ошибка десериализации контактной информации, ожидается адрес'"); + КонецЕсли; + КонецЕсли; + + // Старый формат через разделитель строк и равенство. + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + + Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + + Результат.Комментарий = ""; + Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); + + НазваниеОсновнойСтраны = ВРег(РаботаСАдресами.ОсновнаяСтрана().Наименование); + ЭлементКвартира = Неопределено; + ЭлементКорпус = Неопределено; + ЭлементДом = Неопределено; + + // Национальный + НациональныйАдрес = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ")); + + // Общий состав + Адрес = Результат.Состав; + Адрес.Страна = НазваниеОсновнойСтраны; // Страна по умолчанию + АдресРоссийский = Истина; + + ТипЗначенийПолей = ТипЗнч(ЗначенияПолей); + Если ТипЗначенийПолей = Тип("СписокЗначений") Тогда + СписокПолей = ЗначенияПолей; + ИначеЕсли ТипЗначенийПолей = Тип("Структура") Тогда + СписокПолей = УправлениеКонтактнойИнформациейКлиентСервер.ПреобразоватьСтрокуВСписокПолей( + РаботаСАдресамиКлиентСервер.СтрокаПолей(ЗначенияПолей, Ложь)); + Иначе + // Уже преобразовано в строку + СписокПолей = УправлениеКонтактнойИнформациейКлиентСервер.ПреобразоватьСтрокуВСписокПолей(ЗначенияПолей); + КонецЕсли; + + ТипКвартирыНеопределен = Истина; + ТипКорпусаНеопределен = Истина; + ТипДомаНеопределен = Истина; + ПолеПредставления = ""; + + Для Каждого ЭлементСписка Из СписокПолей Цикл + ИмяПоля = ВРег(ЭлементСписка.Представление); + + Если ИмяПоля="ИНДЕКС" Тогда + ЭлементИндекс = СоздатьДопАдрЭлемента(НациональныйАдрес); + ЭлементИндекс.ТипАдрЭл = РаботаСАдресамиКлиентСервер.КодСериализацииПочтовогоИндекса(); + ЭлементИндекс.Значение = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "СТРАНА" Тогда + Адрес.Страна = ЭлементСписка.Значение; + Если ВРег(ЭлементСписка.Значение) <> НазваниеОсновнойСтраны Тогда + АдресРоссийский = Ложь; + КонецЕсли; + + ИначеЕсли ИмяПоля = "КОДСТРАНЫ" Тогда + // действия не требуется + + ИначеЕсли ИмяПоля = "КОДРЕГИОНА" Тогда + НациональныйАдрес.СубъектРФ = РегионКода(ЭлементСписка.Значение); + + ИначеЕсли ИмяПоля = "РЕГИОН" Тогда + НациональныйАдрес.СубъектРФ = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "РАЙОН" Тогда + Если НациональныйАдрес.СвРайМО = Неопределено Тогда + НациональныйАдрес.СвРайМО = ФабрикаXDTO.Создать( НациональныйАдрес.Тип().Свойства.Получить("СвРайМО").Тип ) + КонецЕсли; + НациональныйАдрес.СвРайМО.Район = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "ГОРОД" Тогда + НациональныйАдрес.Город = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "НАСЕЛЕННЫЙПУНКТ" Тогда + НациональныйАдрес.НаселПункт = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "УЛИЦА" Тогда + НациональныйАдрес.Улица = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "ТИПДОМА" Тогда + Если ЭлементДом = Неопределено Тогда + ЭлементДом = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементДом.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); + ТипДомаНеопределен = Ложь; + + ИначеЕсли ИмяПоля = "ДОМ" Тогда + Если ЭлементДом = Неопределено Тогда + ЭлементДом = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементДом.Значение = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "ТИПКОРПУСА" Тогда + Если ЭлементКорпус = Неопределено Тогда + ЭлементКорпус = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементКорпус.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); + ТипКорпусаНеопределен = Ложь; + + ИначеЕсли ИмяПоля = "КОРПУС" Тогда + Если ЭлементКорпус = Неопределено Тогда + ЭлементКорпус = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементКорпус.Значение = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "ТИПКВАРТИРЫ" Тогда + Если ЭлементКвартира = Неопределено Тогда + ЭлементКвартира = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементКвартира.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации(ЭлементСписка.Значение); + ТипКвартирыНеопределен = Ложь; + + ИначеЕсли ИмяПоля = "КВАРТИРА" Тогда + Если ЭлементКвартира = Неопределено Тогда + ЭлементКвартира = СоздатьНомерДопАдрЭлемента(НациональныйАдрес); + КонецЕсли; + ЭлементКвартира.Значение = ЭлементСписка.Значение; + + ИначеЕсли ИмяПоля = "ПРЕДСТАВЛЕНИЕ" Тогда + ПолеПредставления = СокрЛП(ЭлементСписка.Значение); + + КонецЕсли; + + КонецЦикла; + + // Умолчания + Если ТипДомаНеопределен И ЭлементДом <> Неопределено Тогда + ЭлементДом.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации("Дом"); + КонецЕсли; + + Если ТипКорпусаНеопределен И ЭлементКорпус <> Неопределено Тогда + ЭлементКорпус.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации("Корпус"); + КонецЕсли; + + Если ТипКвартирыНеопределен И ЭлементКвартира <> Неопределено Тогда + ЭлементКвартира.Тип = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации("Квартира"); + КонецЕсли; + + // Представление с приоритетами. + Если Не ПустаяСтрока(Представление) Тогда + Результат.Представление = Представление; + Иначе + Результат.Представление = ПолеПредставления; + КонецЕсли; + + Адрес.Состав = ?(АдресРоссийский, НациональныйАдрес, Результат.Представление); + + Возврат Результат; +КонецФункции + +// Преобразует строку в XDTO контактную информацию адреса. +// +// Параметры: +// ЗначенияПолей - Строка - сериализованная информация, значения полей. +// Представление - Строка - представление старший-младший, используется для попытки разбора, если ЗначенияПолей +// пусто. +// ОжидаемыйТип - ПеречислениеСсылка.ТипыКонтактнойИнформации - необязательный тип для контроля. +// +// Возвращаемое значение: +// ОбъектXDTO - контактной информации. +// +Функция АдресXMLВXDTO(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйТип = Неопределено) Экспорт + + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + + ТипЗначения = ТипЗнч(ЗначенияПолей); + РазбиратьПоПолям = (ТипЗначения = Тип("СписокЗначений") Или ТипЗначения = Тип("Структура") + Или (ТипЗначения = Тип("Строка") И Не ПустаяСтрока(ЗначенияПолей))); + Если РазбиратьПоПолям Тогда + // Разбираем из значений полей. + Возврат ДесериализацияАдресаОбщая(ЗначенияПолей, Представление, ОжидаемыйТип); + КонецЕсли; + + // Разбираем адрес из его представления по классификатору. + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Возврат СформироватьАдресПоПредставлению(Представление); + КонецЕсли; + + КонецЕсли; + + // Пустой объект с представлением. + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); + Результат.Состав.Состав = Представление; + Результат.Представление = Представление; + Возврат Результат; + +КонецФункции + + +Функция СтруктураАдресаПоФормату9Запятых(АдресВФормате9Запятых) + Результат = Новый Соответствие; + АдресМассив = СтрРазделить(АдресВФормате9Запятых, ",", Истина); + Результат.Вставить("Страна", АдресМассив[0]); + Результат.Вставить("Индекс", АдресМассив[1]); + Результат.Вставить("Регион", АдресМассив[2]); + Результат.Вставить("Район", АдресМассив[3]); + Результат.Вставить("Город", АдресМассив[4]); + Результат.Вставить("НаселенныйПункт", АдресМассив[5]); + Результат.Вставить("Улица", АдресМассив[6]); + Результат.Вставить("Дом", АдресМассив[7]); + Результат.Вставить("Корпус", АдресМассив[8]); + Результат.Вставить("Квартира", АдресМассив[9]); + + Результат.Вставить("Округ", Неопределено); + Результат.Вставить("ВнутригРайон", Неопределено); + Возврат Результат; + +КонецФункции + +// Функция раскладывает строку с данными об адресе (в формате 9 запятых) на элементы структуры. +Функция РазложитьАдресВСтруктуру(Знач СтрокаАдрес) Экспорт + + Страна = ""; + Индекс = ""; + Регион = ""; + Район = ""; + Город = ""; + НаселенныйПункт = ""; + Улица =""; + Дом =""; + Корпус =""; + Квартира =""; + + МассивАдрес = СтрРазделить(СтрокаАдрес, ",", Истина); + ЭлементовВМассиве = МассивАдрес.Количество(); + + Если ЭлементовВМассиве > 0 Тогда + Страна = СокрЛП(МассивАдрес[0]); + КонецЕсли; + Если ЭлементовВМассиве > 1 Тогда + Индекс = СокрЛП(МассивАдрес[1]); + КонецЕсли; + Если ЭлементовВМассиве > 2 Тогда + Регион = СокрЛП(МассивАдрес[2]); + КонецЕсли; + Если ЭлементовВМассиве > 3 Тогда + Район = СокрЛП(МассивАдрес[3]); + КонецЕсли; + Если ЭлементовВМассиве > 4 Тогда + Город = СокрЛП(МассивАдрес[4]); + КонецЕсли; + Если ЭлементовВМассиве > 5 Тогда + НаселенныйПункт = СокрЛП(МассивАдрес[5]); + КонецЕсли; + Если ЭлементовВМассиве > 6 Тогда + Улица = СокрЛП(МассивАдрес[6]); + КонецЕсли; + Если ЭлементовВМассиве > 7 Тогда + Дом = СокрЛП(МассивАдрес[7]); + КонецЕсли; + Если ЭлементовВМассиве > 8 Тогда + Корпус = СокрЛП(МассивАдрес[8]); + КонецЕсли; + Если ЭлементовВМассиве> 9 Тогда + Квартира = СокрЛП(МассивАдрес[9]); + КонецЕсли; + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Страна",Страна); + СтруктураВозврата.Вставить("Индекс",Индекс); + СтруктураВозврата.Вставить("Регион",Регион); + СтруктураВозврата.Вставить("Район",Район); + СтруктураВозврата.Вставить("Город",Город); + СтруктураВозврата.Вставить("НаселенныйПункт",НаселенныйПункт); + СтруктураВозврата.Вставить("Улица",Улица); + СтруктураВозврата.Вставить("Дом",Дом); + СтруктураВозврата.Вставить("Корпус",Корпус); + СтруктураВозврата.Вставить("Квартира",Квартира); + + Возврат СтруктураВозврата; + +КонецФункции + +Функция СформироватьАдресПоПредставлению(Представление) + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + + Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); + Результат.Представление = Представление; + + Адрес = Результат.Состав; + + НаименованиеОсновнаяСтрана = СокрЛП(РаботаСАдресами.ОсновнаяСтрана().Наименование); + ДанныеАнализа = ЧастиАдресаТаблицей(Представление); + Если ДанныеАнализа.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + ОпределитьСтрануИИндекс(ДанныеАнализа); + СтрокаСтраны = ДанныеАнализа.Найти(-2, "Уровень"); + Если СтрокаСтраны = Неопределено Тогда + Адрес.Страна = НаименованиеОсновнаяСтрана; + Иначе + Адрес.Страна = СокрЛП(ВРег(СтрокаСтраны.Значение)); + // Проверка наличия страны в справочнике Страны мира и неявное добавление ее в случае отсутствия. + СтранаМира = УправлениеКонтактнойИнформацией.СтранаМираПоКодуИлиНаименованию(Адрес.Страна); + КонецЕсли; + + Если Адрес.Страна = НаименованиеОсновнаяСтрана Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + НациональныйАдрес = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ")); + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + АдресПоУровням = МодульАдресныйКлассификаторСлужебный.УстановитьСоответствиеЧастейАдресаИхУровню(ДанныеАнализа, УровниАдресныхОбъектов()); + Если АдресПоУровням <> Неопределено Тогда + ПоместитьАдресВXDTO(НациональныйАдрес, АдресПоУровням); + КонецЕсли; + + Если АдресПоУровням.Найти(0, "Уровень") <> Неопределено Тогда + // Что-то осталось, считаем адресом в свободной форме. + НациональныйАдрес.Адрес_По_Документу = Представление; + КонецЕсли; + Адрес.Состав = НациональныйАдрес; + КонецЕсли; + Иначе + // Состав без страны, она остается в представлении. + Позиция = СтрокаСтраны.Начало + СтрокаСтраны.Длина; + Длина = СтрДлина(Представление); + Разделители = "," + Символы.ПС; + Пока Позиция <= Длина И СтрНайти(Разделители, Сред(Представление, Позиция, 1)) <= 0 Цикл + Позиция = Позиция + 1; + КонецЦикла; + Пока Позиция <= Длина И СтрНайти(Разделители, Сред(Представление, Позиция, 1)) > 0 Цикл + Позиция = Позиция + 1; + КонецЦикла; + Адрес.Состав = СокрЛП(Лев(Представление, СтрокаСтраны.Начало - 1) + " " + СокрЛП(Сред(Представление, Позиция))); + + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ПредставлениеАдреса(Знач ВидИнформации, НациональныйАдрес, Страна) Экспорт + + // Значимые части + Адрес = Новый Массив; + Адрес.Добавить(ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса())); + Адрес.Добавить(НациональныйАдрес.СубъектРФ); + Если ВидИнформации.ФорматАдреса = "ФИАС" Тогда + Адрес.Добавить(НациональныйАдрес.Округ); + КонецЕсли; + Адрес.Добавить(РайонАдреса(НациональныйАдрес)); + Адрес.Добавить(НациональныйАдрес.Город); + Если ВидИнформации.ФорматАдреса = "ФИАС" Тогда + Адрес.Добавить(НациональныйАдрес.ВнутригРайон); + КонецЕсли; + Адрес.Добавить(НациональныйАдрес.НаселПункт); + Адрес.Добавить(НациональныйАдрес.Улица); + + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "СНТ")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ГСК")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ТЕР")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90)); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Адрес.Добавить(ДополнительныйЭлементАдреса); + Адрес.Добавить(ДополнительныйЭлементАдреса(НациональныйАдрес, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); + + Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); + + // Строения и помещения + НомерНеВыведен = Истина; + Данные = ЗданияИПомещенияАдреса(НациональныйАдрес); + Для Каждого Строка Из Данные.Здания Цикл + Здания = Новый Массив; + Здания.Добавить(Представление); + Здания.Добавить(СокрЛП(Строка.Сокращение + ?(НомерНеВыведен, " № ", " ") + Строка.Значение)); + Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Здания); + НомерНеВыведен = Ложь; + КонецЦикла; + + Для Каждого Строка Из Данные.Помещения Цикл + Помещения = Новый Массив; + Помещения.Добавить(Представление); + Помещения.Добавить(СокрЛП(Строка.Сокращение + " " + Строка.Значение)); + Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Помещения); + КонецЦикла; + + // При пустом представлении страну нет смысла выводить. + Если ПустаяСтрока(Представление) Тогда + Страна = ""; + КонецЕсли; + + Возврат Представление; +КонецФункции + +// Возвращает представление младший-старший для населенного пункта. +// +// Параметры: +// ОбъектАдреса - ОбъектXDTO - адрес РФ. +// +// Возвращаемое значение: +// Строка - представление. +// +Функция ПредставлениеНаселенногоПункта(ОбъектАдреса) Экспорт + + АдресРФ = НациональныйАдрес(ОбъектАдреса); + Если АдресРФ = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Если АдресРФ.СвРайМО = Неопределено Тогда + Район = ""; + ИначеЕсли АдресРФ.СвРайМО.Район <> Неопределено Тогда + Район = АдресРФ.СвРайМО.Район; + ИначеЕсли АдресРФ.СвРайМО.СвМО <> Неопределено Тогда + Районы = Новый Массив(АдресРФ.СвРайМО.СвМО.МунОбр2, АдресРФ.СвРайМО.СвМО.МунОбр1); + Район = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Районы); + Иначе + Район = ""; + КонецЕсли; + + Адрес = Новый Массив; + Адрес.Добавить(АдресРФ.НаселПункт); + Адрес.Добавить(АдресРФ.ВнутригРайон); + Адрес.Добавить(АдресРФ.Город); + Адрес.Добавить(Район); + Адрес.Добавить(АдресРФ.Округ); + Адрес.Добавить(АдресРФ.СубъектРФ); + + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); + +КонецФункции + +// Возвращает представление младший-старший для населенного пункта. +// +// Параметры: +// ОбъектАдреса - ОбъектXDTO - адрес РФ. +// +// Возвращаемое значение: +// Строка - представление. +// +Функция ПредставлениеУлицы(ОбъектАдреса) Экспорт + + АдресРФ = НациональныйАдрес(ОбъектАдреса); + Если АдресРФ = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Адрес = Новый Массив; + Адрес.Добавить(АдресРФ.Улица); + + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "СНТ")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ГСК")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, "ТЕР")); + Если ДополнительныйЭлементАдреса = Неопределено Тогда + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90)); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Адрес.Добавить(ДополнительныйЭлементАдреса); + Адрес.Добавить(ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91))); + + Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(Адрес); + +КонецФункции + + +//====================================================================================================================== +// Структура и поля адреса. + +// Возвращает флаг того, что переданный адрес - российский. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// +// Возвращаемое значение: +// Булево - результат проверки. +// +Функция ЭтоНациональныйАдрес(XDTOАдрес) Экспорт + Возврат НациональныйАдрес(XDTOАдрес) <> Неопределено; +КонецФункции + +// Возвращает извлеченный XDTO российского адреса или Неопределено для адреса иностранного. +// +// Параметры: +// ОбъектИнформации - ОбъектXDTO - Контактная информация или XDTO адреса. +// +// Возвращаемое значение: +// ОбъектXDTO - российский адрес. +// Неопределено - нет российского адреса. +// +Функция НациональныйАдрес(ОбъектИнформации) Экспорт + Результат = Неопределено; + ТипXDTO = Тип("ОбъектXDTO"); + + Если ТипЗнч(ОбъектИнформации) = ТипXDTO Тогда + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + + Если ОбъектИнформации.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") Тогда + Адрес = ОбъектИнформации.Состав; + Иначе + Адрес = ОбъектИнформации; + КонецЕсли; + + Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Адрес = Адрес.Состав; + КонецЕсли; + + Если ТипЗнч(Адрес) = ТипXDTO Тогда + Результат = Адрес; + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает почтовый индекс и ОКТМО для адреса по данным классификатора. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// +// Возвращаемое значение: +// Структура - почтовый индекс и ОКТМО. +// * Индекс - почтовый индекс. +// * ОКТМО - ОКТМО +// Неопределено - индекс не найден или адрес иностранный. +// +Функция ОпределитьПочтовыйИндексИОКТМОАдреса(XDTOАдрес, Идентификатор = Неопределено) Экспорт + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + + Если XDTOАдрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + XDTOАдресРФ = XDTOАдрес.Состав; + Иначе + XDTOАдресРФ = XDTOАдрес; + КонецЕсли; + + Если XDTOАдресРФ = Неопределено Или XDTOАдресРФ.Тип() <> ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ") Тогда + Возврат Неопределено;// Иностранный или пустой адрес. + КонецЕсли; + + ИндексИОКМТО = Новый Структура("Индекс, ОКТМО"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + // Вызов анализа и возврат индекса варианта. + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + ИндексИОКМТО = МодульАдресныйКлассификаторСлужебный.ИндексИОКТМОАдресаПоЧастямАдреса(XDTOАдресРФ, Идентификатор); + КонецЕсли; + + Возврат ИндексИОКМТО; +КонецФункции + +Процедура ОпределитьСтрануИИндекс(ДанныеАдреса) + + Классификатор = УправлениеКонтактнойИнформацией.ТаблицаКлассификатора(); + Для каждого ЭлементАдреса Из ДанныеАдреса Цикл + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + Индекс = ОписаниеТипаЧисло.ПривестиЗначение(ЭлементАдреса.Наименование); + Если Индекс >= 100000 И Индекс < 1000000 Тогда + ЭлементАдреса.Уровень = -1; + Иначе + Если Классификатор.Найти(ВРег(ЭлементАдреса.Наименование), "Наименование") <> Неопределено Тогда + ЭлементАдреса.Уровень = -2; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Читает и устанавливает почтовый индекс адреса. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// НовоеЗначение - Строка - устанавливаемое значение. +// +// Возвращаемое значение: +// Строка - почтовый индекс. +// +Функция ПочтовыйИндексАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт + + АдресРФ = НациональныйАдрес(XDTOАдрес); + Если АдресРФ = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если НовоеЗначение = Неопределено Тогда + // Чтение + Результат = АдресРФ.Получить( РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса() ); + Если Результат <> Неопределено Тогда + Результат = Результат.Значение; + КонецЕсли; + Возврат Результат; + КонецЕсли; + + // Запись + КодИндекса = РаботаСАдресамиКлиентСервер.КодСериализацииПочтовогоИндекса(); + + ЗаписьИндекса = АдресРФ.Получить(РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса()); + Если ЗаписьИндекса = Неопределено Тогда + ЗаписьИндекса = АдресРФ.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип)); + ЗаписьИндекса.ТипАдрЭл = КодИндекса; + КонецЕсли; + + ЗаписьИндекса.Значение = СокрЛП(НовоеЗначение); + Возврат НовоеЗначение; +КонецФункции + +// Читает и устанавливает район адреса. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// НовоеЗначение - Строка - устанавливаемое значение. +// +// Возвращаемое значение: +// Строка - новое значение. +// +Функция РайонАдреса(XDTOАдрес, НовоеЗначение = Неопределено) + + Если НовоеЗначение = Неопределено Тогда + // Чтение + + Результат = Неопределено; + + XDTOТип = XDTOАдрес.Тип(); + Если XDTOТип = ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ") Тогда + АдресРФ = XDTOАдрес; + Иначе + АдресРФ = XDTOАдрес.Состав; + КонецЕсли; + + Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда + Возврат ПолучитьXDTOРеквизитОбъекта(АдресРФ, РаботаСАдресамиКлиентСервер.XPathРайона()); + КонецЕсли; + + Возврат Неопределено; + КонецЕсли; + + // Запись + Запись = СвРайМО(XDTOАдрес); + Запись.Район = НовоеЗначение; + Возврат НовоеЗначение; +КонецФункции + +Функция СвРайМО(АдресРФ) + Если АдресРФ.СвРайМО <> Неопределено Тогда + Возврат АдресРФ.СвРайМО; + КонецЕсли; + + АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Свойства().Получить("СвРайМО").Тип ); + Возврат АдресРФ.СвРайМО; +КонецФункции + +// Возвращает значения уровней 90(дополнительный элемент) и 91(подчиненный) из адреса. +// +Функция ЗначениеДополнительныхЭлементов(Знач XDTOАдрес) + + Результат = Новый Структура("ДополнительныйЭлемент, ПодчиненныйЭлемент"); + + АдресРФ = НациональныйАдрес(XDTOАдрес); + Если АдресРФ = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + + ДополнительныйЭлементАдреса = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; + + Результат.ДополнительныйЭлемент = ДополнительныйЭлементАдреса; + Результат.ПодчиненныйЭлемент = ДополнительныйЭлементАдреса(АдресРФ, РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91)); + + Возврат Результат; + +КонецФункции + +// Читает дополнительные элемент адреса по его пути. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// XPathЭлемента - Строка - Путь к элементу. +// +// Возвращаемое значение: +// Строка - значение элемента. +Функция ДополнительныйЭлементАдреса(XDTOАдрес, XPathЭлемента) + + АдресРФ = НациональныйАдрес(XDTOАдрес); + Если АдресРФ = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = АдресРФ.Получить(XPathЭлемента); + Если Результат <> Неопределено Тогда + Возврат Результат.Значение; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает дополнительный адреса. +// +Функция НайтиДополнительныйЭлементАдреса(АдресРФ) Экспорт + + ВариантыДополнительногоЭлементаАдреса = ВариантыДополнительногоЭлементаАдреса(); + + XPath = ""; + ДополнительныйЭлементАдреса = Неопределено; + Для каждого ВариантДополнительныйЭлементАдреса Из ВариантыДополнительногоЭлементаАдреса Цикл + XPath = РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(90, ВариантДополнительныйЭлементАдреса); + ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, XPath); + Если ДополнительныйЭлементАдреса <> Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Новый Структура("Значение, XPath", ДополнительныйЭлементАдреса, XPath); + +КонецФункции + +Функция ВариантыДополнительногоЭлементаАдреса() + + ВариантыДополнительногоЭлементаАдреса = Новый Массив; + ВариантыДополнительногоЭлементаАдреса.Добавить("СНТ"); + ВариантыДополнительногоЭлементаАдреса.Добавить("ГСК"); + ВариантыДополнительногоЭлементаАдреса.Добавить("ТЕР"); + ВариантыДополнительногоЭлементаАдреса.Добавить(""); + Возврат ВариантыДополнительногоЭлементаАдреса; + +КонецФункции + +Функция СоздатьНомерДопАдрЭлемента(АдресРФ) + ДопАдрЭл = СоздатьДопАдрЭлемента(АдресРФ); + ДопАдрЭл.Номер = ФабрикаXDTO.Создать(ДопАдрЭл.Тип().Свойства.Получить("Номер").Тип); + Возврат ДопАдрЭл.Номер; +КонецФункции + +Функция СоздатьДопАдрЭлемента(АдресРФ) + СвойствоДопАдрЭлемента = АдресРФ.ДопАдрЭл.ВладеющееСвойство; + ДопАдрЭлемента = ФабрикаXDTO.Создать(СвойствоДопАдрЭлемента.Тип); + АдресРФ.ДопАдрЭл.Добавить(ДопАдрЭлемента); + Возврат ДопАдрЭлемента; +КонецФункции + +// Добавляет дополнительные элемент адреса по его пути. +// +Процедура ДобавитьДополнительныеЭлементыАдреса(XDTOАдрес, НовоеЗначение, Уровень) Экспорт + + АдресРФ = НациональныйАдрес(XDTOАдрес); + Если АдресРФ = Неопределено Тогда + Возврат; + КонецЕсли; + + + Если Уровень = 90 Тогда + НаименованиеИСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(НовоеЗначение); + КодСериализацииДополнительногоОбъектаАдресации = РаботаСАдресамиКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(90, НаименованиеИСокращение.Сокращение); + ИначеЕсли Уровень = 91 Тогда + КодСериализацииДополнительногоОбъектаАдресации = РаботаСАдресамиКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(91); + Иначе + КодСериализацииДополнительногоОбъектаАдресации = РаботаСАдресамиКлиентСервер.КодСериализацииДополнительногоОбъектаАдресации(0); + КонецЕсли; + + XPathЭлемента = "ДопАдрЭл[ТипАдрЭл='" + КодСериализацииДополнительногоОбъектаАдресации + "']"; + ЗначениеПоля = АдресРФ.Получить(XPathЭлемента); + Если ЗначениеПоля = Неопределено Тогда + ЗначениеПоля = АдресРФ.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип)); + ЗначениеПоля.ТипАдрЭл = КодСериализацииДополнительногоОбъектаАдресации; + КонецЕсли; + ЗначениеПоля.Значение = НовоеЗначение; + +КонецПроцедуры + +// Читает и устанавливает здания и помещения адреса. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO - Контактная информация или XDTO адреса. +// НовоеЗначение - Структура - устанавливаемое значение. Ожидаются поля: +// * Здания - ТаблицаЗначений с колонками: +// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных +// объектов. Например "Корпус". +// ** Значение - Строка - значение номера дома, квартиры и т.п. +// * Помещения - ТаблицаЗначений с колонками, аналогично полю Здание. +// +// Возвращаемое значение: +// Структура - текущие данные. Содержит поля: +// * Здания - ТаблицаЗначений с колонками: +// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных объектов. +// Например "Корпус". +// ** Сокращение - Строка - сокращение названия для использования в представлении. +// ** Значение - Строка - значение номера дома, квартиры и т.п. +// ** ПутьXPath - Строка - путь к значению объекта. +// * Помещения - ТаблицаЗначений с колонками, аналогично полю Здание. +// +Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт + + Результат = Новый Структура("Здания, Помещения", + ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"), + ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид")); + + АдресРФ = НациональныйАдрес(XDTOАдрес); + Если АдресРФ = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Если НовоеЗначение <> Неопределено Тогда + // Запись + Если НовоеЗначение.Свойство("Здания") Тогда + Для Каждого Строка Из НовоеЗначение.Здания Цикл + ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение); + КонецЦикла; + КонецЕсли; + Если НовоеЗначение.Свойство("Помещения") Тогда + Для Каждого Строка Из НовоеЗначение.Помещения Цикл + ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение); + КонецЦикла; + КонецЕсли; + Возврат НовоеЗначение + КонецЕсли; + + // Чтение + Для Каждого ДопЭлемент Из АдресРФ.ДопАдрЭл Цикл + Если ДопЭлемент.Номер <> Неопределено Тогда + КодОбъекта = ДопЭлемент.Номер.Тип; + ТипОбъекта = РаботаСАдресамиКлиентСервер.ТипОбъектаПоКодуСериализации(КодОбъекта); + Если ТипОбъекта <> Неопределено Тогда + Вид = ТипОбъекта.Тип; + Если Вид = 1 Или Вид = 2 Тогда + НоваяСтрока = Результат.Здания.Добавить(); + ИначеЕсли Вид = 3 Тогда + НоваяСтрока = Результат.Помещения.Добавить(); + Иначе + НоваяСтрока = Неопределено; + КонецЕсли; + Если НоваяСтрока <> Неопределено Тогда + НоваяСтрока.Тип = ТипОбъекта.Наименование; + НоваяСтрока.Значение = ДопЭлемент.Номер.Значение; + НоваяСтрока.Сокращение = ТипОбъекта.Сокращение; + НоваяСтрока.ПутьXPath = РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(НоваяСтрока.Тип); + НоваяСтрока.Вид = Вид; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Результат.Здания.Сортировать("Вид"); + Результат.Помещения.Сортировать("Вид"); + + Возврат Результат; +КонецФункции + +Функция ЗначениеЗданияИлиПомещения(Данные, Варианты, ВсеЗначенияВарианта) + Результат = ТаблицаЗначений("Тип, Значение"); + + Для Каждого Вариант Из Варианты.ВариантыТипа Цикл + Для Каждого Строка Из Данные.НайтиСтроки(Новый Структура("Тип", Вариант)) Цикл + ЗаполнитьЗначенияСвойств(Результат.Добавить(), Строка); + Если Не ВсеЗначенияВарианта Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; +КонецФункции + +Процедура ВставитьЗданиеПомещение(XDTOАдрес, Тип, Значение) + Если ПустаяСтрока(Значение) Тогда + Возврат; + КонецЕсли; + + Запись = XDTOАдрес.Получить(РаботаСАдресамиКлиентСервер.XPathНомераДополнительногоОбъектаАдресации(Тип) ); + Если Запись = Неопределено Тогда + Запись = XDTOАдрес.ДопАдрЭл.Добавить( ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип) ); + Запись.Номер = ФабрикаXDTO.Создать(Запись.Свойства().Получить("Номер").Тип); + Запись.Номер.Значение = Значение; + + КодТипа = РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации(Тип); + Если КодТипа = Неопределено Тогда + КодТипа = Тип; + КонецЕсли; + Запись.Номер.Тип = КодТипа + Иначе + Запись.Значение = Значение; + КонецЕсли; + +КонецПроцедуры + +// Конструктор таблицы значений. +// +Функция ТаблицаЗначений(СписокКолонок, СписокИндексов = "") + ТаблицаРезультата = Новый ТаблицаЗначений; + + Для Каждого КлючЗначение Из (Новый Структура(СписокКолонок)) Цикл + ТаблицаРезультата.Колонки.Добавить(КлючЗначение.Ключ); + КонецЦикла; + + СтрокиИндексов = СтрЗаменить(СписокИндексов, "|", Символы.ПС); + Для НомерИндекса = 1 По СтрЧислоСтрок(СтрокиИндексов) Цикл + КолонкиИндекса = СокрЛП(СтрПолучитьСтроку(СтрокиИндексов, НомерИндекса)); + Для Каждого КлючЗначение Из (Новый Структура(КолонкиИндекса)) Цикл + ТаблицаРезультата.Индексы.Добавить(КлючЗначение.Ключ); + КонецЦикла; + КонецЦикла; + + Возврат ТаблицаРезультата; +КонецФункции + +Процедура ОпределитьСоответствиеСокращений(Результат, ЭлементаАдреса, ИмяЭлемента, СоответствиеСокращений, НаименованиеВключаетСокращение, Уровень) + + НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЭлементаАдреса); + Результат.Вставить(ИмяЭлемента, ?(НаименованиеВключаетСокращение, ЭлементаАдреса, НаименованиеСокращение.Наименование)); + СоответствиеСокращений.Вставить(Уровень, НаименованиеСокращение.Сокращение); + +КонецПроцедуры + +// Возвращает ОКТОМ в правильном формате 8 или 11 символов. +// +// Параметры: +// ОКТМО - Строка, Число - Код ОКТМО. +// +// Возвращаемое значение: +// Строка - Код ОКТМО. +// +Функция ОКТМО(ОКТМО) Экспорт + + ОКТМОСтрока = Формат(ОКТМО, "ЧГ=0"); + + Если СтрДлина(ОКТМОСтрока) < 8 Тогда + Возврат Формат(ОКТМО, "ЧЦ=8; ЧВН=; ЧГ=0"); + ИначеЕсли СтрДлина(ОКТМОСтрока) = 10 Тогда + Возврат Формат(ОКТМО, "ЧЦ=11; ЧВН=; ЧГ=0"); + КонецЕсли; + + Возврат ОКТМОСтрока; + +КонецФункции + +Процедура ОпределитьФорматКодов(Результат, АдресРФ) + Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда + Если ЗначениеЗаполнено(АдресРФ.ОКТМО) Тогда + Результат.ДополнительныеКоды.ОКТМО = ОКТМО(АдресРФ.ОКТМО); + КонецЕсли; + Если ЗначениеЗаполнено(АдресРФ.ОКАТО) Тогда + Результат.ДополнительныеКоды.ОКАТО = Формат(АдресРФ.ОКАТО, "ЧГ=0"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ПоместитьАдресВXDTO(АдресРФ, АдресПоУровням) + + ТаблицаЗданийПомещений = Новый ТаблицаЗначений; + ТаблицаЗданийПомещений.Колонки.Добавить("Тип"); + ТаблицаЗданийПомещений.Колонки.Добавить("Значение"); + + Для каждого ЭлементАдреса Из АдресПоУровням Цикл + // XPath + Если ЭлементАдреса.Уровень = 1 Тогда + Путь = "СубъектРФ"; + ИначеЕсли ЭлементАдреса.Уровень = 2 Тогда + Путь = "Округ"; + ИначеЕсли ЭлементАдреса.Уровень = 3 Тогда + Путь = "СвРайМО/Район"; + ИначеЕсли ЭлементАдреса.Уровень = 4 Тогда + Путь = "Город"; + ИначеЕсли ЭлементАдреса.Уровень = 5 Тогда + Путь = "ВнутригРайон"; + ИначеЕсли ЭлементАдреса.Уровень = 6 Тогда + Путь = "НаселПункт"; + ИначеЕсли ЭлементАдреса.Уровень = 7 Тогда + Путь = "Улица"; + ИначеЕсли ЭлементАдреса.Уровень = 90 Тогда + ДобавитьДополнительныеЭлементыАдреса(АдресРФ, ЭлементАдреса.Значение, 90); + ИначеЕсли ЭлементАдреса.Уровень = 91 Тогда + ДобавитьДополнительныеЭлементыАдреса(АдресРФ, ЭлементАдреса.Значение, 91); + ИначеЕсли ЭлементАдреса.Уровень = -3 Тогда + Продолжить; + ИначеЕсли ЭлементАдреса.Уровень = -1 Тогда + ПочтовыйИндексАдреса(АдресРФ, ЭлементАдреса.Наименование); + Иначе + // Проверка на квартиру или здание. + Тип = СокрЛП(СтрЗаменить(ЭлементАдреса.Наименование, "№", "")); + Если РаботаСАдресамиКлиентСервер.КодСериализацииОбъектаАдресации(Тип) <> Неопределено Тогда + // Вставляем в начало, так как порядок результата запроса у нас обратный. + НоваяСтрока = ТаблицаЗданийПомещений.Вставить(0); + НоваяСтрока.Значение = СокрЛП(СтрЗаменить(ЭлементАдреса.Сокращение, "№", "")); + НоваяСтрока.Тип = Тип; + ЭлементАдреса.Уровень = -3; + КонецЕсли; + + Продолжить; + КонецЕсли; + + Если ЭлементАдреса.Уровень > 0 И ЭлементАдреса.Уровень < 90 Тогда + УстановитьСвойствоПоXPath(АдресРФ, Путь, ЭлементАдреса.Значение); + КонецЕсли; + + КонецЦикла; + + ЗданияИПомещения = Новый Структура("Здания, Помещения", ТаблицаЗданийПомещений, ТаблицаЗданийПомещений); + ЗданияИПомещенияАдреса(АдресРФ, ЗданияИПомещения); + +КонецПроцедуры + +Функция ЧастиАдресаТаблицей(Знач Текст) + + ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(128)); + ТипЧисло = Новый ОписаниеТипов("Число"); + + Результат = Новый ТаблицаЗначений; + Колонки = Результат.Колонки; + Колонки.Добавить("Уровень", ТипЧисло); + Колонки.Добавить("Позиция", ТипЧисло); + Колонки.Добавить("Значение", ТипСтрока); + Колонки.Добавить("Наименование", ТипСтрока); + Колонки.Добавить("Сокращение", ТипСтрока); + Колонки.Добавить("Начало", ТипЧисло); + Колонки.Добавить("Длина", ТипЧисло); + Колонки.Добавить("Идентификатор", ТипСтрока); + + Номер = 1; + Для Каждого Часть Из СловаТекстаТаблицей(Текст, "," + Символы.ПС) Цикл + Значение = СокрЛП(Часть.Значение); + Если ПустаяСтрока(Значение) Тогда + Продолжить; + КонецЕсли; + + Строка = Результат.Добавить(); + + Строка.Уровень = 0; + Строка.Позиция = Номер; + Номер = Номер + 1; + + Строка.Начало = Часть.Начало; + Строка.Длина = Часть.Длина; + + Позиция = СтрДлина(Значение); + Пока Позиция > 0 Цикл + Символ = Сред(Значение, Позиция, 1); + Если ПустаяСтрока(Символ) Тогда + Строка.Наименование = СокрЛП(Лев(Значение, Позиция-1)); + Прервать; + КонецЕсли; + Строка.Сокращение = Символ + Строка.Сокращение; + Позиция = Позиция - 1; + КонецЦикла; + + Если ПустаяСтрока(Строка.Наименование) Тогда + Строка.Наименование = СокрЛП(Строка.Сокращение); + Строка.Сокращение = ""; + КонецЕсли; + Строка.Значение = Строка.Наименование + " " + Строка.Сокращение; // Значение; + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция СловаТекстаТаблицей(Знач Текст, Знач Разделители = Неопределено) + + // Удаление из текста спец. символов "точек", "номеров". + Текст = СтрЗаменить(Текст, "№", ""); + + НачалоСлова = 0; + Состояние = 0; + + ТипСтрока = Новый ОписаниеТипов("Строка"); + ТипЧисло = Новый ОписаниеТипов("Число"); + + Результат = Новый ТаблицаЗначений; + Колонки = Результат.Колонки; + Колонки.Добавить("Значение", ТипСтрока); + Колонки.Добавить("Начало", ТипЧисло); + Колонки.Добавить("Длина", ТипЧисло); + + Для Позиция = 1 По СтрДлина(Текст) Цикл + ТекущийСимвол = Сред(Текст, Позиция, 1); + ЭтоРазделитель = ?(Разделители = Неопределено, ПустаяСтрока(ТекущийСимвол), СтрНайти(Разделители, ТекущийСимвол) > 0); + + Если Состояние = 0 И (Не ЭтоРазделитель) Тогда + НачалоСлова = Позиция; + Состояние = 1; + ИначеЕсли Состояние = 1 И ЭтоРазделитель Тогда + Строка = Результат.Добавить(); + Строка.Начало = НачалоСлова; + Строка.Длина = Позиция-НачалоСлова; + Строка.Значение = Сред(Текст, Строка.Начало, Строка.Длина); + Состояние = 0; + КонецЕсли; + КонецЦикла; + + Если Состояние = 1 Тогда + Строка = Результат.Добавить(); + Строка.Начало = НачалоСлова; + Строка.Длина = Позиция-НачалоСлова; + Строка.Значение = Сред(Текст, Строка.Начало, Строка.Длина) + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция УровниАдресныхОбъектов(ТипАдресногоОбъекта = "Полный") + Уровни = Новый Массив; + Если ТипАдресногоОбъекта = "Улица" Тогда + Уровни.Добавить(7); + Уровни.Добавить(90); + Уровни.Добавить(91); + ИначеЕсли ТипАдресногоОбъекта = "НаселенныйПункт" Тогда + Уровни.Добавить(1); + Уровни.Добавить(2); + Уровни.Добавить(3); + Уровни.Добавить(4); + Уровни.Добавить(5); + Уровни.Добавить(6); + Иначе + Уровни.Добавить(1); + Уровни.Добавить(2); + Уровни.Добавить(3); + Уровни.Добавить(4); + Уровни.Добавить(5); + Уровни.Добавить(6); + Уровни.Добавить(7); + Уровни.Добавить(90); + Уровни.Добавить(91); + КонецЕсли; + + Возврат Уровни; +КонецФункции + +// Установка глубокого свойства объекта. +Процедура УстановитьСвойствоПоXPath(ОбъектXTDO, XPath, Значение) + + // Переносов строки в XPath не ожидаем. + СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); + + ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); + Если ЧислоСвойств = 1 Тогда + ОбъектXTDO.Установить(СтрокаСвойств, Значение); + Возврат; + ИначеЕсли ЧислоСвойств < 1 Тогда + Возврат; + КонецЕсли; + + РодительскийОбъект = Неопределено; + ТекущийОбъект = ОбъектXTDO; + Для Индекс = 1 По ЧислоСвойств Цикл + + ТекущееИмя = СтрПолучитьСтроку(СтрокаСвойств, Индекс); + Если ТекущийОбъект.Установлено(ТекущееИмя) Тогда + РодительскийОбъект = ТекущийОбъект; + ТекущийОбъект = ТекущийОбъект.ПолучитьXDTO(ТекущееИмя); + Иначе + НовыйТип = ТекущийОбъект.Свойства().Получить(ТекущееИмя).Тип; + ТипТипа = ТипЗнч(НовыйТип); + Если ТипТипа = Тип("ТипОбъектаXDTO") Тогда + НовыйОбъект = ФабрикаXDTO.Создать(НовыйТип); + ТекущийОбъект.Установить(ТекущееИмя, НовыйОбъект); + РодительскийОбъект = ТекущийОбъект; + ТекущийОбъект = НовыйОбъект; + ИначеЕсли ТипТипа = Тип("ТипЗначенияXDTO") Тогда + // Непосредственное значение + ТекущийОбъект.Установить(ТекущееИмя, Значение); + РодительскийОбъект = Неопределено; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если РодительскийОбъект <> Неопределено Тогда + РодительскийОбъект.Установить(ТекущееИмя, Значение); + КонецЕсли; + +КонецПроцедуры + +// Получение глубокого свойства объекта. +// +Функция ПолучитьXDTOРеквизитОбъекта(ОбъектXTDO, XPath) Экспорт + + // Переносов строки в XPath не ожидаем. + СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); + + ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); + Если ЧислоСвойств = 1 Тогда + Результат = ОбъектXTDO.Получить(СтрокаСвойств); + Если ТипЗнч(Результат) = Тип("ОбъектXDTO") Тогда + Возврат Результат.Значение; + КонецЕсли; + Возврат Результат; + КонецЕсли; + + Результат = ?(ЧислоСвойств = 0, Неопределено, ОбъектXTDO); + Для Индекс = 1 По ЧислоСвойств Цикл + Результат = Результат.Получить(СтрПолучитьСтроку(СтрокаСвойств, Индекс)); + Если Результат = Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Устанавливает в XDTO адресе значение по XPath. +// +Процедура УстановитьXDTOРеквизитОбъекта(ОбъектXDTO, ПутьXPath, Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + // Части XPath + ЧастиПути = СтрЗаменить(ПутьXPath, "/", Символы.ПС); + ЧастейПути = СтрЧислоСтрок(ЧастиПути); + + ВедущийОбъект = ОбъектXDTO; + Объект = ОбъектXDTO; + + Для Позиция = 1 По ЧастейПути Цикл + ЧастьПути = СтрПолучитьСтроку(ЧастиПути, Позиция); + Если ЧастейПути = 1 Тогда + Прервать; + КонецЕсли; + + Свойство = Объект.Свойства().Получить(ЧастьПути); + Если Не Объект.Установлено(Свойство) Тогда + Объект.Установить(Свойство, ФабрикаXDTO.Создать(Свойство.Тип)); + КонецЕсли; + ВедущийОбъект = Объект; + Объект = Объект[ЧастьПути]; + КонецЦикла; + + Если Объект <> Неопределено Тогда + + Если СтрНайти(ЧастьПути, "ДопАдрЭл") = 0 Тогда + Объект[ЧастьПути] = Значение; + Иначе + КодПутьXPath = Сред(ЧастьПути, 20, 8); + ЗначениеПоля = Объект.ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(Объект.ДопАдрЭл.ВладеющееСвойство.Тип)); + ЗначениеПоля.ТипАдрЭл = КодПутьXPath; + ЗначениеПоля.Значение = Значение; + КонецЕсли; + + ИначеЕсли ВедущийОбъект <> Неопределено Тогда + ВедущийОбъект[ЧастьПути] = Значение; + + КонецЕсли; + +КонецПроцедуры + +//====================================================================================================================== +// Проверка адреса + +// Возвращает перечень ошибок для адреса. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO, СписокЗначений, Строка - описание адреса. +// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - ссылка на соответствующий вид +// контактной информации. +// РезультатГруппами - Булево - если указана Истина, то будет возвращен массив групп ошибок, иначе - список +// значений. +// +// Возвращаемое значение: +// СписокЗначений - если параметр РезультатГруппами равен Ложь. Внутри представление - текст ошибки, значение - +// XPath ошибочного поля. +// Массив - если параметр РезультатГруппами равен Истина. Содержит структуры с полями: +// ** ТипОшибки - Строка - наименование группы (типа) ошибки. Возможные значения: +// "ПредставлениеНеСоответствуетНаборуПолей" +// "НеЗаполненыОбязательныеПоля" +// "НеУказаныСокращенияПолей" +// "НедопустимыеСимволыПолей" +// "НеСоответствуетДлинаПолей" +// "ОшибкиПоКлассификатору". +// ** Сообщение - Строка - подробный текст ошибки. +// ** Поля - Массив - содержит структуры описания ошибочных полей. Каждая структура имеет +// реквизиты: +// *** ИмяПоля - Строка - внутренний идентификатор ошибочного элемента адреса. +// *** Сообщение - Строка - подробный текст ошибки для этого поля. +// +Функция ОшибкиЗаполненияАдресаXDTO(XDTOАдрес, ВидИнформации, РезультатГруппами = Ложь) Экспорт + + Если ТипЗнч(XDTOАдрес) = Тип("ОбъектXDTO") Тогда + АдресРФ = XDTOАдрес.Состав; + Иначе + XTDOКонтактная = АдресXMLВXDTO(XDTOАдрес); + Адрес = XTDOКонтактная.Состав; + АдресРФ = ?(Адрес = Неопределено, Неопределено, Адрес.Состав); + КонецЕсли; + + // Флаги проверки + Если ТипЗнч(ВидИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ФлагиПроверки = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(ВидИнформации); + Иначе + ФлагиПроверки = ВидИнформации; + КонецЕсли; + + Если ТипЗнч(АдресРФ) <> Тип("ОбъектXDTO") Или АдресРФ.Тип() <> ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ") Тогда + // Адрес за пределами РФ + Результат = ?(РезультатГруппами, Новый Массив, Новый СписокЗначений); + + Если ФлагиПроверки.ТолькоНациональныйАдрес Тогда + ТекстОшибки = НСтр("ru = 'Адрес должен быть только российским.'"); + Если РезультатГруппами Тогда + Результат.Добавить(Новый Структура("Поля, ТипОшибки, Сообщение", Новый Массив, + "НеЗаполненыОбязательныеПоля", ТекстОшибки)); + Иначе + Результат.Добавить("/", ТекстОшибки); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + КонецЕсли; + + // Отдельно проверяем пустой адрес, если необходимо его заполнение. + Если Не УправлениеКонтактнойИнформациейСлужебный.XDTOКонтактнаяИнформацияЗаполнена(АдресРФ) Тогда + // Адрес пуст + Если ФлагиПроверки.ОбязательноеЗаполнение Тогда + // Но должен быть заполнен + ТекстОшибки = НСтр("ru = 'Адрес не заполнен.'"); + + Если РезультатГруппами Тогда + Результат = Новый Массив; + Результат.Добавить(Новый Структура("Поля, ТипОшибки, Сообщение", Новый Массив, + "НеЗаполненыОбязательныеПоля", ТекстОшибки)); + Иначе + Результат = Новый СписокЗначений; + Результат.Добавить("/", ТекстОшибки); + КонецЕсли; + + Возврат Результат + КонецЕсли; + + // Адрес пуст и не должен быть заполнен - считаем его корректным. + Возврат ?(РезультатГруппами, Новый Массив, Новый СписокЗначений); + КонецЕсли; + + ВсеОшибки = ОбщиеГруппыОшибокЗаполненияАдреса(АдресРФ, ФлагиПроверки); + ПроверятьКлассификатор = Истина; + + Для Каждого Группа Из ВсеОшибки Цикл + Если СтрНайти("НеУказаныСокращенияПолей, НедопустимыеСимволыПолей", Группа.ТипОшибки) > 0 Тогда + // Некорректные данные в полях, проверять их по классификатору нет смысла. + ПроверятьКлассификатор = Ложь; + Прервать; + КонецЕсли + КонецЦикла; + + ОшибкиКлассификатора = Новый СписокЗначений; + Если ПроверятьКлассификатор И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + ЗаполнитьОшибкиАдресаПоКлассификатору(АдресРФ, ФлагиПроверки, ОшибкиКлассификатора); + КонецЕсли; + + Если РезультатГруппами Тогда + НаименованиеГруппыОшибки = "ОшибкиПоКлассификатору"; + КоличествоОшибок = ОшибкиКлассификатора.Количество(); + + Если КоличествоОшибок = 1 И ОшибкиКлассификатора[0].Значение <> Неопределено + И ОшибкиКлассификатора[0].Значение.ПутьXPath = Неопределено Тогда + ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, ОшибкиКлассификатора[0].Представление)); + + ИначеЕсли КоличествоОшибок > 0 Тогда + // Подробное описание ошибок + ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, + НСтр("ru = 'Части адреса не соответствуют адресному классификатору:'"))); + + ГруппаОшибокКлассификатора = ВсеОшибки[ВсеОшибки.ВГраница()]; + + СписокСущностей = ""; + Для Каждого Элемент Из ОшибкиКлассификатора Цикл + ЭлементОшибки = Элемент.Значение; + Если ЭлементОшибки = Неопределено Тогда + // Абстрактная ошибка + ДобавитьОшибкуЗаполненияАдреса(ГруппаОшибокКлассификатора, "", Элемент.Представление); + Иначе + ДобавитьОшибкуЗаполненияАдреса(ГруппаОшибокКлассификатора, ЭлементОшибки.ПутьXPath, Элемент.Представление); + СписокСущностей = СписокСущностей + ", " + ЭлементОшибки.СущностьПоля; + КонецЕсли; + КонецЦикла; + + ГруппаОшибокКлассификатора.Сообщение = ГруппаОшибокКлассификатора.Сообщение + Сред(СписокСущностей, 2); + КонецЕсли; + + Возврат ВсеОшибки; + КонецЕсли; + + // Объединяем все в список + Результат = Новый СписокЗначений; + Для Каждого Группа Из ВсеОшибки Цикл + Для Каждого Поле Из Группа.Поля Цикл + Результат.Добавить(Поле.ИмяПоля, Поле.Сообщение, Истина); + КонецЦикла; + КонецЦикла; + Для Каждого ЭлементСписка Из ОшибкиКлассификатора Цикл + Результат.Добавить(ЭлементСписка.Значение.ПутьXPath, ЭлементСписка.Представление, ЭлементСписка.Значение.АдресПроверен); + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Общие проверки на корректность адреса. +// +// Параметры: +// ДанныеАдреса - Строка, СписокЗначений - XML, XDTO с данными адреса РФ. +// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на соответствующий вид контактной информации. +// +// Возвращаемое значение: +// Массив - содержит структуры с полями: +// * ТипОшибки - Строка - идентификатор группы ошибки. Может принимать значение: +// "ПредставлениеНеСоответствуетНаборуПолей", +// "НеЗаполненыОбязательныеПоля" +// "НеУказаныСокращенияПолей" +// "НедопустимыеСимволыПолей" +// "НеСоответствуетДлинаПолей". +// * Сообщение - Строка - Подробный текст ошибки. +// * Поля - Массив структур с полями: +// ** ИмяПоля - внутренний идентификатор ошибочного поля. +// ** Сообщение - подробный текст ошибки для поля. +// +Функция ОбщиеГруппыОшибокЗаполненияАдреса(Знач ДанныеАдреса, Знач ВидИнформации) + Результат = Новый Массив; + + Если ТипЗнч(ДанныеАдреса) = Тип("ОбъектXDTO") Тогда + АдресРФ = ДанныеАдреса; + + Иначе + XTDOКонтактная = АдресXMLВXDTO(ДанныеАдреса); + Адрес = XTDOКонтактная.Состав; + Если Не ЭтоНациональныйАдрес(Адрес) Тогда + Возврат Результат; + КонецЕсли; + АдресРФ = Адрес.Состав; + + // С) совпадение представления и набора данных. + Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеАдреса(АдресРФ, ВидИнформации); + Если XTDOКонтактная.Представление <> Представление Тогда + Результат.Добавить(ГруппаОшибокАдреса("ПредставлениеНеСоответствуетНаборуПолей", + НСтр("ru = 'Адрес не соответствует значениям в наборе полей.'"))); + ДобавитьОшибкуЗаполненияАдреса(Результат[0], "", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Представление адреса для вида контактной информации ""%1"" отличается от данных в адресе.'"), + Строка(ВидИнформации.Наименование))); + КонецЕсли; + КонецЕсли; + + НеЗаполненыОбязательныеПоля = ГруппаОшибокАдреса("НеЗаполненыОбязательныеПоля", + НСтр("ru = 'Не заполнены обязательные поля:'")); + Результат.Добавить(НеЗаполненыОбязательныеПоля); + + НеУказаныСокращенияПолей = ГруппаОшибокАдреса("НеУказаныСокращенияПолей", + НСтр("ru = 'Не указано сокращение для полей:'")); + Результат.Добавить(НеУказаныСокращенияПолей); + + НедопустимыеСимволыПолей = ГруппаОшибокАдреса("НедопустимыеСимволыПолей", + НСтр("ru = 'Найдены недопустимые символы в полях:'")); + Результат.Добавить(НедопустимыеСимволыПолей); + + НеСоответствуетДлинаПолей = ГруппаОшибокАдреса("НеСоответствуетДлинаПолей", + НСтр("ru = 'Не соответствует установленной длина полей:'")); + Результат.Добавить(НеСоответствуетДлинаПолей); + + // 2) Индекс, Регион, Дом должны быть заполнены. + Индекс = ПочтовыйИндексАдреса(АдресРФ); + Если ПустаяСтрока(Индекс) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса(), + НСтр("ru = 'Не указан почтовый индекс.'"), "Индекс"); + КонецЕсли; + + Регион = АдресРФ.СубъектРФ; + Если ПустаяСтрока(Регион) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "СубъектРФ", + НСтр("ru = 'Не указан регион.'"), "Регион"); + КонецЕсли; + + ЗданияПомещения = ЗданияИПомещенияАдреса(АдресРФ); + + // 3) Регион, Район, Город, НаселенныйПункт, Улица должны: + // - иметь сокращение. + // - не длинней 50 символов. + // - только кириллица. + + ДопустимоКромеКириллицы = "/,-. 0123456789_N"; + + // Регион + Если Не ПустаяСтрока(Регион) Тогда + Поле = "СубъектРФ"; + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Регион)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, "СубъектРФ", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии региона ""%1"".'"), Регион), НСтр("ru = 'Регион'")); + КонецЕсли; + Если СтрДлина(Регион) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название региона ""%1"" должно быть короче 50 символов.'"),Регион), НСтр("ru = 'Регион'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Регион, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии региона ""%1"" есть не кириллические символы.'"), Регион), НСтр("ru = 'Регион'")); + КонецЕсли + КонецЕсли; + + // Район + Район = РайонАдреса(АдресРФ); + Если Не ПустаяСтрока(Район) Тогда + Поле = РаботаСАдресамиКлиентСервер.XPathРайона(); + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Район)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии района ""%1"".'"), Район), НСтр("ru = 'Район'")); + КонецЕсли; + Если СтрДлина(Район) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название района ""%1"" должно быть короче 50 символов.'"), Район), НСтр("ru = 'Район'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Район, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии района ""%1"" есть не кириллические символы.'"), Район), НСтр("ru = 'Район'")); + КонецЕсли; + КонецЕсли; + + // Город + Город = АдресРФ.Город; + Если Не ПустаяСтрока(Город) Тогда + Поле = "Город"; + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Город)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии города ""%1"".'"), Город), НСтр("ru = 'Город'")); + КонецЕсли; + Если СтрДлина(Город) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название города ""%1"" должно быть короче 50 символов.'"), Город), НСтр("ru = 'Город'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Город, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии города ""%1"" есть не кириллические символы.'"), Город), НСтр("ru = 'Город'")); + КонецЕсли; + КонецЕсли; + + // Населенный пункт + НаселенныйПункт = АдресРФ.НаселПункт; + Если Не ПустаяСтрока(НаселенныйПункт) Тогда + Поле = "НаселПункт"; + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(НаселенныйПункт)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии населенного пункта ""%1"".'"), НаселенныйПункт), + НСтр("ru = 'Населенный пункт'")); + КонецЕсли; + Если СтрДлина(НаселенныйПункт) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название населенного пункта ""%1"" должно быть короче 50 символов.'"), НаселенныйПункт), + НСтр("ru = 'Населенный пункт'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(НаселенныйПункт, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии населенного пункта ""%1"" есть не кириллические символы.'"), НаселенныйПункт), + НСтр("ru = 'Населенный пункт'")); + КонецЕсли; + КонецЕсли; + + // Улица + Улица = АдресРФ.Улица; + Если Не ПустаяСтрока(Улица) Тогда + Поле = "Улица"; + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Улица)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение в названии улицы ""%1"".'"), Улица), НСтр("ru = 'Улица'")); + КонецЕсли; + Если СтрДлина(Район) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название улицы ""%1"" должно быть короче 50 символов.'"), Улица), НСтр("ru = 'Улица'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Улица, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии улицы ""%1"" есть не кириллические символы.'"), Улица), НСтр("ru = 'Улица'")); + КонецЕсли; + КонецЕсли; + + // Дополнительный элемент + ДополнительныйЭлемент = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; + Если ЗначениеЗаполнено(ДополнительныйЭлемент) Тогда + Поле = "Улица"; + Если ПустаяСтрока(УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(ДополнительныйЭлемент)) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не указано сокращение у дополнительного элемента ""%1"".'"), ДополнительныйЭлемент), + НСтр("ru = 'Улица'")); + КонецЕсли; + Если СтрДлина(Район) > 50 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Название дополнительного элемента ""%1"" должно быть короче 50 символов.'"), ДополнительныйЭлемент), + НСтр("ru = 'ДополнительныйЭлемент'")); + КонецЕсли; + Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ДополнительныйЭлемент, Ложь, ДопустимоКромеКириллицы) Тогда + ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В названии дополнительного элемента ""%1"" есть не кириллические символы.'"), ДополнительныйЭлемент), + НСтр("ru = 'ДополнительныйЭлемент'")); + КонецЕсли; + КонецЕсли; + + // 4) Индекс - если есть, то 6 цифр. + Если Не ПустаяСтрока(Индекс) Тогда + Поле = РаботаСАдресамиКлиентСервер.XPathПочтовогоИндекса(); + Если СтрДлина(Индекс) <> 6 Или Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Индекс) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, + НСтр("ru = 'Почтовый индекс должен состоять из 6 цифр.'"), + НСтр("ru = 'Индекс'")); + КонецЕсли; + КонецЕсли; + + // 5) Дом, Корпус, Квартира не длинней 12 символов. + Для Каждого ДанныеЗдания Из ЗданияПомещения.Здания Цикл + Если СтрДлина(ДанныеЗдания.Значение) > 12 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеЗдания.ПутьXPath, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Значение поля ""%1"" должно быть короче 12 символов.'"), ДанныеЗдания.Тип), ДанныеЗдания.Тип); + КонецЕсли; + КонецЦикла; + Для Каждого ДанныеПомещения Из ЗданияПомещения.Помещения Цикл + Если СтрДлина(ДанныеПомещения.Значение) > 12 Тогда + ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеПомещения.ПутьXPath, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Значение поля ""%1"" должно быть короче 12 символов.'"), ДанныеПомещения.Тип), ДанныеПомещения.Тип); + КонецЕсли; + КонецЦикла; + + // 6) Поля Город и НаселенныйПункт могут быть одновременно пустые только в регионе - городе ФЗ. + Если ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Район) Тогда + Если НазванияГородовФедеральногоЗначения().Найти(ВРег(Регион)) = Неопределено Тогда + ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Город", + НСтр("ru = 'Город может быть не указан только в регионе - городе федерального значения.'"), + НСтр("ru = 'Город'")); + ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "НаселПункт", + НСтр("ru = 'Населенный пункт может быть не указан только в регионе - городе федерального значения.'"), + НСтр("ru = 'Населенный пункт'")); + КонецЕсли; + КонецЕсли; + + // 7) Улица не может быть пустой если НаселенныйПункт пустой. + Если Не ИсключатьПроверкуУлицыВАдресе(АдресРФ) Тогда + + Если ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Улица) И НЕ ЗначениеЗаполнено(ДополнительныйЭлемент) Тогда + ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Улица", + НСтр("ru = 'Город или населенный пункт должен содержать название улицы.'"), + НСтр("ru = 'Улица'")); + КонецЕсли; + + КонецЕсли; + + // Все. Убираем пустые результаты, корректируем сообщение группы. + Для Индекс = 1-Результат.Количество() По 0 Цикл + Группа = Результат[-Индекс]; + Поля = Группа.Поля; + СписокСущностей = ""; + Для ИндексПоля = 1-Поля.Количество() По 0 Цикл + Поле = Поля[-ИндексПоля]; + Если ПустаяСтрока(Поле.Сообщение) Тогда + Поля.Удалить(-ИндексПоля); + Иначе + СписокСущностей = ", " + Поле.СущностьПоля + СписокСущностей; + Поле.Удалить("СущностьПоля"); + КонецЕсли; + КонецЦикла; + Если Поля.Количество() = 0 Тогда + Результат.Удалить(-Индекс); + ИначеЕсли Не ПустаяСтрока(СписокСущностей) Тогда + Группа.Сообщение = Группа.Сообщение + Сред(СписокСущностей, 2); + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ГруппаОшибокАдреса(ТипОшибки, Сообщение) + Возврат Новый Структура("ТипОшибки, Сообщение, Поля", ТипОшибки, Сообщение, Новый Массив); +КонецФункции + +Процедура ДобавитьОшибкуЗаполненияАдреса(Группа, ИмяПоля = "", Сообщение = "", СущностьПоля = "") + Группа.Поля.Добавить(Новый Структура("ИмяПоля, Сообщение, СущностьПоля", ИмяПоля, Сообщение, СущностьПоля)); +КонецПроцедуры + +Процедура ЗаполнитьОшибкиАдресаПоКлассификатору(XDTOАдресРФ, ФлагиПроверки, Результат) + + Адреса = Новый Массив; + + Если ФлагиПроверки.ПроверятьПоФИАС Тогда + Адреса.Добавить( Новый Структура("Адрес, ФорматАдреса", XDTOАдресРФ, "ФИАС") ); + ИначеЕсли ФлагиПроверки.ПроверятьКорректность Тогда + Адреса.Добавить( Новый Структура("Адрес, ФорматАдреса", XDTOАдресРФ, "КЛАДР") ); + КонецЕсли; + + Если Адреса.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + РезультатыАнализа = МодульАдресныйКлассификаторСлужебный.РезультатПроверкиАдресовПоКлассификатору(Адреса); + Если РезультатыАнализа.Отказ Тогда + Результат.Добавить( Новый Структура("ПутьXPath, СущностьПоля, АдресПроверен", "/",, Ложь), РезультатыАнализа.КраткоеПредставлениеОшибки); + Возврат; + КонецЕсли; + + // Только уникальные ошибки - мы могли проверить адрес два раза. + Обработанные = Новый Соответствие; + Для Каждого РезультатПроверки Из РезультатыАнализа.Данные Цикл + Для Каждого ОшибкаАдреса Из РезультатПроверки.Ошибки Цикл + Ключ = ОшибкаАдреса.Ключ; + Если Обработанные[Ключ] = Неопределено Тогда + Результат.Добавить(Новый Структура("ПутьXPath, СущностьПоля, АдресПроверен", Ключ,, РезультатПроверки.АдресПроверен), + СокрЛП(ОшибкаАдреса.Текст + Символы.ПС + ОшибкаАдреса.Подсказка)); + Обработанные[Ключ] = Истина; + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Локальные исключения при проверке адреса. +// +Функция ИсключатьПроверкуУлицыВАдресе(Знач АдресРФ) + Результат = Ложь; + + // В Зеленограде улицы не проверяем. + Если ВРег(СокрЛП(АдресРФ.СубъектРФ)) = НСтр("ru = 'МОСКВА Г'") И ВРег(СокрЛП(АдресРФ.Город)) = НСтр("ru = 'ЗЕЛЕНОГРАД Г'") Тогда + Результат = Истина; + КонецЕсли; + + // Дополнительные элементы адреса могут быть без улиц. + ДополнительныеЭлементы = ЗначениеДополнительныхЭлементов(АдресРФ); + Если ЗначениеЗаполнено(ДополнительныеЭлементы.ДополнительныйЭлемент) Тогда + Результат = Истина; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает массив наименований регионов - городов федерального значения. +Функция НазванияГородовФедеральногоЗначения() + + Результат = Новый Массив; + Результат.Добавить("МОСКВА Г"); + Результат.Добавить("САНКТ-ПЕТЕРБУРГ Г"); + Результат.Добавить("СЕВАСТОПОЛЬ Г"); + Результат.Добавить("БАЙКОНУР Г"); + + Возврат Результат; +КонецФункции + +Функция СтруктураОшибкиПоставщикаАдресногоКлассификатора(ИсходнаяСтруктура = Неопределено) + + Если ИсходнаяСтруктура = Неопределено Тогда + ИсходнаяСтруктура = Новый Структура; + КонецЕсли; + + ИсходнаяСтруктура.Вставить("Отказ", Ложь); + ИсходнаяСтруктура.Вставить("ПодробноеПредставлениеОшибки"); + ИсходнаяСтруктура.Вставить("КраткоеПредставлениеОшибки"); + + Возврат ИсходнаяСтруктура; +КонецФункции + +Процедура ЗаполнитьСвойстваXDTOКонтактнойИнформацииДляРасширенныхАдресов(Знач Владелец, Знач Игнорируемые, Знач ПространствоИмен, Знач ТипВладельца) Экспорт + + Если ТипВладельца = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда + // Игнорируем список с пустыми значениями и возможно непустыми типами. + Список = Владелец.ПолучитьСписок("ДопАдрЭл"); + Если Список <> Неопределено Тогда + Для Каждого СвойствоСписка Из Список Цикл + Если ПустаяСтрока(СвойствоСписка.Значение) Тогда + Игнорируемые.Вставить(СвойствоСписка, Истина); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьРасширенныеРеквизитыТабличнойЧастиДляАдреса(Знач Адрес, Знач СтрокаТабличнойЧасти) Экспорт + + АдресРФ = НациональныйАдрес(Адрес); + Если АдресРФ <> Неопределено Тогда + // Российский адрес + СтрокаТабличнойЧасти.Регион = АдресРФ.СубъектРФ; + СтрокаТабличнойЧасти.Город = АдресРФ.Город; + КонецЕсли; + +КонецПроцедуры + +//====================================================================================================================== +// Обратная совместимость + +// Возвращает поля контактной информации. +// +// Параметры: +// XDTOКонтактнаяИнформация - ОбъектXDTO, Строка - контактная информация или строка XML. +// СтарыйСоставПолей - Булево - необязательный флаг того, что из состава полей будут исключены +// поля, отсутствующие в версиях БСП младше 2.1.3. +// +// Возвращаемое значение: +// Структура - данные. Содержит поля: +// * Представление - Строка - представление адреса. +// * ЗначенияПолей - СписокЗначений - значения. Состав значений для адреса: +// ** Страна - Строка - текстовое представление страны. +// ** КодСтраны - Строка - код страны по ОКСМ. +// ** Индекс - Строка - почтовый индекс (только для адресов РФ). +// ** Регион - Строка - текстовое представление региона РФ (только для адресов РФ). +// ** КодРегиона - Строка - код региона РФ (только для адресов РФ). +// ** РегионСокращение - Строка - сокращение региона (если СтарыйСоставПолей = Ложь). +// ** Район - Строка - текстовое представление района (только для адресов РФ). +// ** РайонСокращение - Строка - сокращение района (если СтарыйСоставПолей = Ложь). +// ** Город - Строка - текстовое представление города (только для адресов РФ). +// ** ГородСокращение - Строка - сокращение города (только для адресов РФ). +// ** НаселенныйПункт - Строка - текстовое представление населенного пункта (только для адресов РФ). +// ** НаселенныйПунктСокращение - сокращение населенного пункта (если СтарыйСоставПолей = Ложь). +// ** ТипДома - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Дом - Строка - текстовое представление дома (только для адресов РФ). +// ** ТипКорпуса - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Корпус - Строка - текстовое представление корпуса (только для адресов РФ). +// ** ТипКвартиры - Строка - см. РаботаСАдресамиКлиентСервер.ТипыОбъектовАдресацииАдресаРФ(). +// ** Квартира - Строка - текстовое представление квартиры (только для адресов РФ). +// Состав значений для телефона: +// ** КодСтраны - Строка - код страны. Например, +7. +// ** КодГорода - Строка - код города. Например, 495. +// ** НомерТелефона - Строка - номер телефона. +// ** Добавочный - Строка - добавочный номер телефона. +// +Функция КонтактнаяИнформацияВСтаруюСтруктуру(XDTOКонтактнаяИнформация, СтарыйСоставПолей = Ложь) Экспорт + + Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOКонтактнаяИнформация) Тогда + XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(XDTOКонтактнаяИнформация); + Иначе + XDTOКонтактная = XDTOКонтактнаяИнформация + КонецЕсли; + + Результат = Новый Структура("Представление, ЗначенияПолей", XDTOКонтактная.Представление, Новый СписокЗначений); + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + Состав = XDTOКонтактная.Состав; + + Если Состав = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Тип = Состав.Тип(); + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Результат.ЗначенияПолей = АдресВСтарыйСписокПолей(Состав, Не СтарыйСоставПолей); + Результат.ЗначенияПолей.Добавить(Результат.Представление, "Представление"); + + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + Результат.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.НомерТелефонаВСтарыйСписокПолей(Состав); + Результат.ЗначенияПолей.Добавить(XDTOКонтактная.Комментарий, "Комментарий"); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Преобразует адрес формата XDTO в старый список полей типа СписокЗначений. +// +// Параметры: +// XDTOАдрес - ОбъектXDTO, Строка - контактная информация или строка XML. +// РасширенныйСоставПолей - Булево - необязательный флаг того, что состав полей будет сокращен для совместимости +// с обменом БСП 2.1.2. +// +// Возвращаемое значение: +// СписокЗначений +// +Функция АдресВСтарыйСписокПолей(XDTOАдрес, РасширенныйСоставПолей = Истина) + Список = Новый СписокЗначений; + + ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСервер.ПространствоИмен(); + XDTOТип = XDTOАдрес.Тип(); + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + + // Страна с кодом + ДобавитьЗначение(Список, "Страна", XDTOАдрес.Страна); + Если ПустаяСтрока(XDTOАдрес.Страна) Тогда + КодСтраны = ""; + Иначе + Страна = Справочники.СтраныМира.НайтиПоНаименованию(XDTOАдрес.Страна, Истина); + КодСтраны = СокрЛП(Страна.Код); + КонецЕсли; + ДобавитьЗначение(Список, "КодСтраны", КодСтраны); + + Если Не ЭтоНациональныйАдрес(XDTOАдрес) Тогда + Возврат Список; + КонецЕсли; + + АдресРФ = XDTOАдрес.Состав; + + ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(РаботаСАдресами.ПространствоИмен(), "АдресРФ") Тогда + АдресРФ = XDTOАдрес; + + Иначе + Возврат Список; + + КонецЕсли; + + ДобавитьЗначение(Список, "Индекс", ПочтовыйИндексАдреса(АдресРФ) ); + + ДобавитьЗначение(Список, "Регион", АдресРФ.СубъектРФ); + ДобавитьЗначение(Список, "КодРегиона", КодРегиона(АдресРФ.СубъектРФ) ); + Если РасширенныйСоставПолей Тогда + ДобавитьЗначение(Список, "РегионСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(АдресРФ.СубъектРФ)); + КонецЕсли; + + Район = РайонАдреса(АдресРФ); + ДобавитьЗначение(Список, "Район", Район); + Если РасширенныйСоставПолей Тогда + ДобавитьЗначение(Список, "РайонСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Район)); + КонецЕсли; + + ДобавитьЗначение(Список, "Город", АдресРФ.Город); + Если РасширенныйСоставПолей Тогда + ДобавитьЗначение(Список, "ГородСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(АдресРФ.Город)); + КонецЕсли; + + // преобразование ФИАС в КЛАДР + НаселенныйПункт = АдресРФ.НаселПункт; + Улица = АдресРФ.Улица; + ДополнительныйЭлементАдреса = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение; + ПодчиненныйЭлементЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, + РаботаСАдресамиКлиентСервер.XPathДополнительногоОбъектаАдресации(91)); + + ЕстьУлица = ЗначениеЗаполнено(Улица); + ЕстьДополнительныйЭлементАдреса = ЗначениеЗаполнено(ДополнительныйЭлементАдреса); + ЕстьПодчиненныйЭлементЭлементАдреса = ЗначениеЗаполнено(ПодчиненныйЭлементЭлементАдреса); + + Если ЕстьДополнительныйЭлементАдреса Тогда + + Если ЕстьПодчиненныйЭлементЭлементАдреса Тогда + НаселенныйПункт = ДополнительныйЭлементАдреса; + Улица = ПодчиненныйЭлементЭлементАдреса; + Иначе + Улица = ДополнительныйЭлементАдреса; + КонецЕсли; + + ИначеЕсли ЕстьПодчиненныйЭлементЭлементАдреса Тогда + Улица = ПодчиненныйЭлементЭлементАдреса; + КонецЕсли; + + ДобавитьЗначение(Список, "НаселенныйПункт", НаселенныйПункт); + Если РасширенныйСоставПолей Тогда + ДобавитьЗначение(Список, "НаселенныйПунктСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(НаселенныйПункт)); + КонецЕсли; + + ДобавитьЗначение(Список, "Улица", Улица); + + Если РасширенныйСоставПолей Тогда + ДобавитьЗначение(Список, "УлицаСокращение", УправлениеКонтактнойИнформациейКлиентСервер.Сокращение(Улица)); + КонецЕсли; + + // Дом и корпус + ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ); + + ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхДом(), РасширенныйСоставПолей); + Если ПараметрыОбъекта.Количество() = 0 Тогда + ДобавитьЗначение(Список, "ТипДома", ""); + ДобавитьЗначение(Список, "Дом", ""); + Иначе + Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл + ДобавитьЗначение(Список, "ТипДома", СтрокаОбъекта.Тип, РасширенныйСоставПолей); + ДобавитьЗначение(Список, "Дом", СтрокаОбъекта.Значение, РасширенныйСоставПолей); + КонецЦикла; + КонецЕсли; + + ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхСтроение(), РасширенныйСоставПолей); + Если ПараметрыОбъекта.Количество() = 0 Тогда + ДобавитьЗначение(Список, "ТипКорпуса", ""); + ДобавитьЗначение(Список, "Корпус", ""); + ИначеЕсли ПараметрыОбъекта.Количество() = 1 Тогда + СтрокаОбъекта = ПараметрыОбъекта[0]; + ДобавитьЗначение(Список, "ТипКорпуса", СтрокаОбъекта.Тип, РасширенныйСоставПолей); + ДобавитьЗначение(Список, "Корпус", СтрокаОбъекта.Значение, РасширенныйСоставПолей); + Иначе + ТипКорпуса = ПараметрыОбъекта[0].Тип; + ЗначениеКорпуса = ""; + Разделитель = ""; + Сокращения = РаботаСАдресамиКлиентСервер.СокращенияОбъектовАдресацииАдресаРФ(); + Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл + ИмяЗдания = ?(ЗначениеЗаполнено(Сокращения[СтрокаОбъекта.Тип]), Сокращения[СтрокаОбъекта.Тип], СтрокаОбъекта.Тип); + ЗначениеКорпуса = ЗначениеКорпуса + Разделитель + ИмяЗдания + " " + СтрокаОбъекта.Значение; + Разделитель = ", " ; + КонецЦикла; + ДобавитьЗначение(Список, "ТипКорпуса", ТипКорпуса, РасширенныйСоставПолей); + ДобавитьЗначение(Список, "Корпус", ЗначениеКорпуса , РасширенныйСоставПолей); + КонецЕсли; + + ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Помещения, ВариантыДанныхПомещение(), РасширенныйСоставПолей); + Если ПараметрыОбъекта.Количество() = 0 Тогда + ДобавитьЗначение(Список, "ТипКвартиры", ""); + ДобавитьЗначение(Список, "Квартира", ""); + ИначеЕсли ПараметрыОбъекта.Количество() = 1 Тогда + СтрокаОбъекта = ПараметрыОбъекта[0]; + ДобавитьЗначение(Список, "ТипКвартиры", СтрокаОбъекта.Тип, РасширенныйСоставПолей); + ДобавитьЗначение(Список, "Квартира", СтрокаОбъекта.Значение, РасширенныйСоставПолей); + Иначе + ТипПомещения = ПараметрыОбъекта[0].Тип; + ЗначениеПомещения = ""; + Разделитель = ""; + Сокращения = РаботаСАдресамиКлиентСервер.СокращенияОбъектовАдресацииАдресаРФ(); + Для Каждого СтрокаОбъекта Из ПараметрыОбъекта Цикл + ИмяПомещения = ?(ЗначениеЗаполнено(Сокращения[СтрокаОбъекта.Тип]), Сокращения[СтрокаОбъекта.Тип], СтрокаОбъекта.Тип); + ЗначениеПомещения = ЗначениеПомещения + Разделитель + ИмяПомещения + " " + СтрокаОбъекта.Значение; + Разделитель = ", " ; + КонецЦикла; + ДобавитьЗначение(Список, "ТипКвартиры", ТипПомещения, РасширенныйСоставПолей); + ДобавитьЗначение(Список, "Квартира", ЗначениеПомещения, РасширенныйСоставПолей); + КонецЕсли; + + Возврат Список; +КонецФункции + +Процедура ДобавитьЗначение(Список, ИмяПоля, Значение, РазрешитьДубли = Ложь) + + Если Не РазрешитьДубли Тогда + Для Каждого Элемент Из Список Цикл + Если Элемент.Представление = ИмяПоля Тогда + Элемент.Значение = Строка(Значение); + Возврат; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Список.Добавить(Строка(Значение), ИмяПоля); +КонецПроцедуры + +// Возвращает варианты типов домов (по признаку владения). +Функция ВариантыДанныхДом() Экспорт + + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", + РаботаСАдресамиКлиентСервер.НаименованияОбъектовАдресацииПоТипу(1), Ложь); + +КонецФункции + +// Возвращает варианты типов домов (по признаку строения). +Функция ВариантыДанныхСтроение() Экспорт + + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", + РаботаСАдресамиКлиентСервер.НаименованияОбъектовАдресацииПоТипу(2), Ложь); + +КонецФункции + +// Возвращает варианты типов помещений. +Функция ВариантыДанныхПомещение() Экспорт + + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", + РаботаСАдресамиКлиентСервер.НаименованияОбъектовАдресацииПоТипу(3, Ложь), Ложь); + +КонецФункции + +#КонецОбласти + +#КонецЕсли + + diff --git a/SSL/src/Constants/ПараметрыДополнительныхРеквизитовИСведений/ValueManagerModule.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ObjectModule.bsl similarity index 100% rename from SSL/src/Constants/ПараметрыДополнительныхРеквизитовИСведений/ValueManagerModule.bsl rename to SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ObjectModule.bsl diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/РасширенныйВводКонтактнойИнформации.mdo b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/РасширенныйВводКонтактнойИнформации.mdo new file mode 100644 index 000000000..317b65cbe --- /dev/null +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/РасширенныйВводКонтактнойИнформации.mdo @@ -0,0 +1,115 @@ + + + + + + + РасширенныйВводКонтактнойИнформации + + ru + Расширенный ввод контактной информации + + DataProcessor.РасширенныйВводКонтактнойИнформации.Form.ВводАдреса + + + ru + + + + ВводАдреса + + ru + Ввод адреса + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборАдресаПоПочтовомуИндексу + + ru + Выбор адреса по почтовому индексу + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборАдресаПоУровню + + ru + Выбор адреса по уровню + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборДома + + ru + Выбор дома + + PersonalComputer + MobileDevice + + + ВыборУлицы + + ru + Выбор улицы + + + + ru + + + PersonalComputer + MobileDevice + + + ЗагрузкаАдресногоКлассификатора + + ru + Загрузка адресного классификатора + + PersonalComputer + MobileDevice + + + НаселенныйПунктАдреса + + ru + Населенный пункт адреса + + + + ru + + + PersonalComputer + MobileDevice + + + НастройкиАдреса + + ru + Настройки адреса + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form index 9c9bc4e68..ff5ce4705 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form @@ -7,6 +7,10 @@ СписокКонстант 4 + + <key>ru</key> + <value>Список констант</value> + true true @@ -379,6 +383,10 @@ true + + <key>ru</key> + <value>Список констант контекстное меню группа 1</value> + СписокКонстантКонтекстноеМенюГруппа1ExtendedTooltip 30 @@ -419,9 +427,6 @@ СписокКонстант.ИндексКартинки - None - None - None true diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form index 952fc5035..854774881 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form @@ -10,6 +10,10 @@ Отбор 15 + + <key>ru</key> + <value>Отбор</value> + true true @@ -323,9 +327,6 @@ true true true - None - None - None true All false @@ -373,10 +374,6 @@ ru Группа пользовательских настроек - - ru - Группа пользовательских настроек - ГруппаПользовательскихНастроекРасширеннаяПодсказка 64 @@ -400,6 +397,10 @@ СписокДанных 10 + + <key>ru</key> + <value>Список данных</value> + true true @@ -700,6 +701,10 @@ true + + <key>ru</key> + <value>Список данных контекстное меню группа 2</value> + СписокДанныхКонтекстноеМенюГруппа2ExtendedTooltip 51 @@ -850,6 +855,10 @@ true + + <key>ru</key> + <value>Список данных контекстное меню группа 1</value> + СписокДанныхКонтекстноеМенюГруппа1ExtendedTooltip 53 @@ -883,9 +892,6 @@ СписокДанных.DefaultPicture - None - None - None true 60 diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Form.form index c374ebaae..93a7045e7 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Form.form @@ -126,10 +126,6 @@ ru Описание узла - - ru - Описание узла - ДеревоУзловОбменаПометкаНаименованиеExtendedTooltip 44 @@ -407,6 +403,10 @@ true + + <key>ru</key> + <value>Дерево узлов обмена контекстное меню группа 1</value> + ДеревоУзловОбменаКонтекстноеМенюГруппа1ExtendedTooltip 40 @@ -444,9 +444,6 @@ ДеревоУзловОбмена.ИндексКартинки - None - None - None true diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl index 00ce9fe8f..577a41dea 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl @@ -156,7 +156,6 @@ КонецЦикла; КонецПроцедуры -&НаСервере Функция ЭтотОбъект(ТекущийОбъект = Неопределено) Если ТекущийОбъект = Неопределено Тогда Возврат РеквизитФормыВЗначение("Объект"); diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form index 7b027c6eb..aa50420f3 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form @@ -5,10 +5,10 @@ Настройки - Группа8 + РегистрацияИНомераСообщений 32 - Группа1 + Авторегистрация 5 Декорация1 @@ -42,7 +42,7 @@ - Группа4 + АвторегистрацияВертикальная 12 АвторегистрацияДвижений @@ -125,8 +125,12 @@ true + + <key>ru</key> + <value>Авторегистрация вертикальная</value> + - Группа4ExtendedTooltip + АвторегистрацияВертикальнаяРасширеннаяПодсказка 38 Label true @@ -155,7 +159,7 @@ Авторегистрация - Группа1ExtendedTooltip + АвторегистрацияРасширеннаяПодсказка 36 Label true @@ -176,7 +180,7 @@ - Группа7 + НомераСообщений 29 НомераСообщенийРегистрации @@ -243,7 +247,7 @@ Установка номера сообщения при регистрации - Группа7ExtendedTooltip + НомераСообщенийРасширеннаяПодсказка 41 Label true @@ -269,8 +273,12 @@ true + + <key>ru</key> + <value>Регистрация и номера сообщений</value> + - Группа8ExtendedTooltip + РегистрацияИНомераСообщенийРасширеннаяПодсказка 35 Label true @@ -289,7 +297,7 @@ - Группа2 + КонсольЗапросов 8 Декорация2 @@ -323,10 +331,10 @@ - Группа3 + КонсольЗапросовРасположение 15 - Группа5 + КонсольЗапросовВертикальная 24 ОбработкаЗапросаВнешняя @@ -401,8 +409,12 @@ true + + <key>ru</key> + <value>Консоль запросов вертикальная</value> + - Группа5ExtendedTooltip + КонсольЗапросовВертикальнаяРасширеннаяПодсказка 46 Label true @@ -422,7 +434,7 @@ - Группа6 + КонсольЗапросовПуть 25 ОбработкаЗапросаПуть @@ -481,8 +493,12 @@ true + + <key>ru</key> + <value>Консоль запросов путь к обработке</value> + - Группа6ExtendedTooltip + КонсольЗапросовПутьРасширеннаяПодсказка 48 Label true @@ -506,9 +522,13 @@ true + + <key>ru</key> + <value>Консоль запросов расположение</value> + true - Группа3ExtendedTooltip + КонсольЗапросовРасположениеРасширеннаяПодсказка 45 Label true @@ -536,7 +556,7 @@ Консоль запросов - Группа2ExtendedTooltip + КонсольЗапросовРасширеннаяПодсказка 43 Label true @@ -606,10 +626,6 @@ ru Библиотека стандартных подсистем - - ru - Группа БСП - ГруппаБСПExtendedTooltip 50 diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form index 6bcafc677..93a09f3a9 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form @@ -5,7 +5,7 @@ Номера сообщений узла плана обмена - Группа3 + НомераСообщений 6 НомерОтправленного @@ -119,7 +119,7 @@ Номера сообщений - Группа3ExtendedTooltip + НомераСообщенийРасширеннаяПодсказка 15 Label true @@ -140,7 +140,7 @@ - Группа4 + КомандыГоризонтально 11 ЗаписатьИзмененияУзла @@ -207,8 +207,12 @@ true + + <key>ru</key> + <value>Команды горизонтально</value> + - Группа4ExtendedTooltip + КомандыГоризонтальноРасширеннаяПодсказка 18 Label true diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form index 11aa5b3e7..2093a1230 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form @@ -124,10 +124,6 @@ ru Описание узла - - ru - Описание узла - ДеревоУзловОбменаПометкаНаименованиеExtendedTooltip 74 @@ -492,6 +488,10 @@ true + + <key>ru</key> + <value>Дерево узлов обмена контекстное меню группа 1</value> + ДеревоУзловОбменаКонтекстноеМенюГруппа1ExtendedTooltip 65 @@ -594,6 +594,10 @@ true + + <key>ru</key> + <value>Дерево узлов обмена контекстное меню группа 2</value> + ДеревоУзловОбменаКонтекстноеМенюГруппа2ExtendedTooltip 70 @@ -631,9 +635,6 @@ ДеревоУзловОбмена.ИндексКартинки - None - None - None true @@ -678,12 +679,8 @@ <key>ru</key> - <value>Группа скрытых данных</value> + <value>Скрытых данных</value> - - ru - Группа скрытых данных - true ГруппаСкрытыхДанныхExtendedTooltip @@ -885,10 +882,6 @@ ru Дополнительно - - ru - Группа2 - Группа2ExtendedTooltip 62 diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form index 81509fd2b..870c17e7a 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form @@ -5,232 +5,32 @@ Регистрация изменений для обмена данными - Группа2 - 35 - - УзелОбменаСсылка - 1 - true - true - - true - - - УзелОбменаСсылка - - - OnChange - УзелОбменаСсылкаПриИзменении - - - УзелОбменаСсылкаExtendedTooltip - 201 - Label - true - true - - Left - - - - УзелОбменаСсылкаКонтекстноеМеню - 2 - true - - InputField - Enter - true - Left - true - - - StartChoice - УзелОбменаСсылкаНачалоВыбора - - - Clearing - УзелОбменаСсылкаОчистка - - - ChoiceProcessing - УзелОбменаСсылкаОбработкаВыбора - - true - true - false - true - false - true - ShowInInputField - false - false - false - false - true - true - true - Normal - - - - ФормаРедактироватьНомераСообщений - 85 - - <key>ru</key> - <value>№ отправленного 0, № принятого 0</value> - - true - true - - true - - - ФормаРедактироватьНомераСообщенийExtendedTooltip - 202 - Label - true - true - - Left - - - Hyperlink - Form.Command.РедактироватьНомераСообщений - Normal - Auto - true - true - UserCmds - Auto - - - ВариантОтбораПоНомеруСообщения - 172 - - <key>ru</key> - <value>Отображать</value> - - true - true - - true - - - ВариантОтбораПоНомеруСообщения - - - OnChange - ВариантОтбораПоНомеруСообщенияПриИзменении - - - ВариантОтбораПоНомеруСообщенияExtendedTooltip - 203 - Label - true - true - - Left - - - - ВариантОтбораПоНомеруСообщенияКонтекстноеМеню - 173 - true - - InputField - Enter - true - Left - true - - 18 - true - true - true - true - true - - - ru - Все - - - 0 - - - - - ru - Только выгруженные - - - 1 - - - - - ru - Только невыгруженные - - - 2 - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Быстрые отборы</value> - - - Группа2ExtendedTooltip - 200 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа1 - 5 + ГруппаСтраницы + 374 - КоманднаяПанельОбщая - 95 + Основная + 376 - ДеревоМетаданныхГруппаДобавить - 39 - - ДеревоМетаданныхДобавитьРегистрациюВсехОбъектов - 40 - - <key>ru</key> - <value>Все объекты выбранных типов</value> - + ГруппаБыстрыеОтборы + 35 + + УзелОбменаСсылка + 1 true true true + + УзелОбменаСсылка + + + OnChange + УзелОбменаСсылкаПриИзменении + - ДеревоМетаданныхДобавитьРегистрациюВсехОбъектовExtendedTooltip - 207 + УзелОбменаСсылкаExtendedTooltip + 201 Label true true @@ -238,796 +38,61 @@ Left - Form.Command.ДобавитьРегистрациюВсехОбъектов - Normal - Auto - true - true - UserCmds - Auto - - - ДеревоМетаданныхДобавитьРегистрациюАвтоОбъектов - 41 - - <key>ru</key> - <value>Объекты выбранных типов с авторегистрацией</value> - - true - true - - true - - - ДеревоМетаданныхДобавитьРегистрациюАвтоОбъектовExtendedTooltip - 208 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюАвтоОбъектов - Normal - Auto - true - true - UserCmds - Auto - - - ГруппаКомандДобавить - 183 - - ФормаДобавитьРегистрациюОдногоОбъекта - 184 - - <key>ru</key> - <value>Одиночный объект</value> - - true - true - - true - - - ФормаДобавитьРегистрациюОдногоОбъектаExtendedTooltip - 210 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюОдногоОбъекта - Normal - Auto - true - true - UserCmds - - StdPicture.CreateListItem - - Auto - - - ФормаДобавитьРегистрациюОтбор - 185 - - <key>ru</key> - <value>Объекты при помощи отбора</value> - - true - true - - true - - - ФормаДобавитьРегистрациюОтборExtendedTooltip - 211 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюОтбор - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Регистрация</value> - - - ru - Группа команд добавить - - - ГруппаКомандДобавитьExtendedTooltip - 209 - Label - true - true - - Left - - - - - - ДеревоМетаданныхГруппа3 - 60 - - ДеревоМетаданныхДобавитьРегистрациюРезультатаЗапроса - 59 - - <key>ru</key> - <value>Результаты запроса</value> - - true - true - - true - - - ДеревоМетаданныхДобавитьРегистрациюРезультатаЗапросаExtendedTooltip - 213 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюРезультатаЗапроса - Normal - Auto - true - true - UserCmds - - Auto - - true - true - - true - - - <key>ru</key> - <value>Регистрация результатов запроса</value> - - - ДеревоМетаданныхГруппа3ExtendedTooltip - 212 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Зарегистрировать</value> - - - ru - Зарегистрировать объекты выбранных типов - - - ДеревоМетаданныхГруппаДобавитьExtendedTooltip - 206 - Label - true - true - - Left - - - Popup - - - StdPicture.CreateListItem - - Auto - Normal - - - - ДеревоМетаданныхГруппаУдалить - 42 - - ДеревоМетаданныхУдалитьРегистрациюВсехОбъектов - 43 - - <key>ru</key> - <value>Всех объектов выбранных типов</value> - - true - true - - true - - - ДеревоМетаданныхУдалитьРегистрациюВсехОбъектовExtendedTooltip - 215 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюВсехОбъектов - Normal - Auto - true - true - UserCmds - Auto - - - ДеревоМетаданныхУдалитьРегистрациюАвтоОбъектов - 44 - - <key>ru</key> - <value>Объектов выбранных типов с авторегистрацией</value> - - true - true - - true - - - ДеревоМетаданныхУдалитьРегистрациюАвтоОбъектовExtendedTooltip - 216 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюАвтоОбъектов - Normal - Auto - true - true - UserCmds - Auto - - - ГруппаКомандУдалить - 186 - - ФормаУдалитьРегистрациюОдногоОбъекта - 187 - - <key>ru</key> - <value>Одиночного объекта</value> - - true - true - - true - - - ФормаУдалитьРегистрациюОдногоОбъектаExtendedTooltip - 218 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюОдногоОбъекта - Normal - Auto - true - true - UserCmds - - StdPicture.DeleteDirectly - - Auto - - - ФормаУдалитьРегистрациюОтбор - 188 - - <key>ru</key> - <value>Объектов при помощи отбора</value> - - true - true - - true - - - ФормаУдалитьРегистрациюОтборExtendedTooltip - 219 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюОтбор - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Отмена регистрации</value> - - - ru - Группа команд удалить - - - ГруппаКомандУдалитьExtendedTooltip - 217 - Label - true - true - - Left - - - - - - ДеревоМетаданныхГруппа4 - 61 - - ДеревоМетаданныхУдалитьРегистрациюРезультатаЗапроса - 62 - - <key>ru</key> - <value>Результатов запроса</value> - - true - true - - true - - - ДеревоМетаданныхУдалитьРегистрациюРезультатаЗапросаExtendedTooltip - 221 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюРезультатаЗапроса - Normal - Auto - true - true - UserCmds - - Auto - - true - true - - true - - - <key>ru</key> - <value>Отмена регистрации результатов запроса</value> - - - ДеревоМетаданныхГруппа4ExtendedTooltip - 220 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Отменить регистрацию</value> - - - ru - Отменить регистрацию объектов выбранных типов - - - ДеревоМетаданныхГруппаУдалитьExtendedTooltip - 214 - Label - true - true - - Left - - - Popup - - - StdPicture.DeleteDirectly - - Auto - Normal - - - - ОбновитьВсеДанные - 97 - - <key>ru</key> - <value>Обновить</value> - - true - true - - true - - - ОбновитьВсеДанныеExtendedTooltip - 222 - Label - true - true - - Left - - - Form.Command.ОбновитьВсеДанные - Normal - PictureAndText - true - true - UserCmds - Auto - - - ФормаОткрытьФормуНастроек - 145 - - <key>ru</key> - <value>Настройки</value> - - true - true - - true - - - ФормаОткрытьФормуНастроекExtendedTooltip - 223 - Label - true - true - - Left - - - Form.Command.ОткрытьФормуНастроек - Normal - PictureAndText - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаОткрытьФормуРегистрацииНаУзлах - 182 - - <key>ru</key> - <value>Регистрация объекта на всех узлах</value> - - true - true - - true - - - ФормаОткрытьФормуРегистрацииНаУзлахExtendedTooltip - 225 - Label - true - true - - Left - - - Form.Command.ОткрытьФормуРегистрацииНаУзлах - Normal - Picture - true - true - UserCmds - - StdPicture.ExchangePlan - - Auto - InAdditionalSubmenu - - - ФормаГруппаКнопокРИБ - 316 - - ПоказатьРезультатВыгрузки - 133 - true - true - - true - - - ПоказатьРезультатВыгрузкиExtendedTooltip - 224 - Label - true - true - - Left - - - Form.Command.ПоказатьРезультатВыгрузки - Normal - Auto - true - true - UserCmds - - Auto - - - ФормаЗарегистрироватьИОМИПредопределенные - 314 - true - true - - true - - - ФормаЗарегистрироватьИОМИПредопределенныеРасширеннаяПодсказка - 315 - Label - true - true - - Left - - - Form.Command.ЗарегистрироватьИОМИПредопределенные - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Форма группа кнопок РИБ</value> - - - ru - Группа кнопок РИБ - - - ФормаГруппаКнопокРИБРасширеннаяПодсказка - 317 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Командная панель </value> - - - ru - Общая командная панель - - - КоманднаяПанельОбщаяExtendedTooltip - 205 - Label - true - true - - Left - - - CommandBar - - Left - Form - - - - Группа5 - 96 - - ДеревоМетаданных - 6 - - <key>ru</key> - <value>Виды объектов регистрации</value> - - true - true - - true - - - ДеревоМетаданных - - None - Add - Change - Copy - Delete - EndEdit - HierarchicalList - List - MoveDown - MoveUp - SortListAsc - SortListDesc - Tree - - ДеревоМетаданныхГруппа1 - 9 - - ДеревоМетаданныхПометка - 16 - true - true - - true - - - ДеревоМетаданных.Пометка - - None + + УзелОбменаСсылкаКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + - OnChange - ДеревоМетаданныхПометкаПриИзменении + StartChoice + УзелОбменаСсылкаНачалоВыбора - - ДеревоМетаданныхПометкаExtendedTooltip - 244 - Label - true - true - - Left - - - - ДеревоМетаданныхПометкаКонтекстноеМеню - 17 - true - - CheckBoxField - true - Left - - true - - - - ДеревоМетаданныхНаименование - 10 - - <key>ru</key> - <value>Объект конфигурации</value> - - true - true - - true - - - ДеревоМетаданных.Наименование - - - ДеревоМетаданныхНаименованиеExtendedTooltip - 245 - Label - true - true - - Left - - - - ДеревоМетаданныхНаименованиеКонтекстноеМеню - 11 - true - - LabelField - true - Auto - true - Left - true - - 17 - true - true - - + + Clearing + УзелОбменаСсылкаОчистка + + + ChoiceProcessing + УзелОбменаСсылкаОбработкаВыбора + + true + true + false + true + false + true + ShowInInputField + false + false + false + false + true + true + true + Normal + + + + ФормаРедактироватьНомераСообщений + 85 + + <key>ru</key> + <value>№ отправленного 0, № принятого 0</value> + true true true - - <key>ru</key> - <value>Объекты регистрации</value> - - true - ДеревоМетаданныхГруппа1ExtendedTooltip - 243 + ФормаРедактироватьНомераСообщенийExtendedTooltip + 202 Label true true @@ -1035,125 +100,37 @@ Left - ColumnGroup - - InCell - auto - true - + Hyperlink + Form.Command.РедактироватьНомераСообщений + Normal + Auto + true + true + UserCmds + Auto - - ДеревоМетаданныхГруппа2 - 26 - - ДеревоМетаданныхАвторегистрация - 27 - - <key>ru</key> - <value>Авторегистрация</value> - - true - true - - - ДеревоМетаданных.Авторегистрация - - None - - ДеревоМетаданныхАвторегистрацияExtendedTooltip - 247 - Label - true - true - - Left - - - - ДеревоМетаданныхАвторегистрацияКонтекстноеМеню - 28 - true - - PictureField - true - Left - Auto - true - Left - true - - 2 - true - true - - - - 1 - - - - - ДеревоМетаданныхКоличествоИзмененийСтрокой - 29 - - <key>ru</key> - <value>Количество</value> - - true - true - - true - - - ДеревоМетаданных.КоличествоИзмененийСтрокой - - - ru - Зарегистрировано / не выгружено - - - ДеревоМетаданныхКоличествоИзмененийСтрокойExtendedTooltip - 248 - Label - true - true - - Left - - - - ДеревоМетаданныхКоличествоИзмененийСтрокойКонтекстноеМеню - 30 - true - - LabelField - true - Left - Auto - true - Left - true - - 10 - true - 1 - true - false - - + + ВариантОтбораПоНомеруСообщения + 172 + + <key>ru</key> + <value>Отображать</value> + true true true - - <key>ru</key> - <value>Информация о регистрации</value> - - true + + ВариантОтбораПоНомеруСообщения + + + OnChange + ВариантОтбораПоНомеруСообщенияПриИзменении + - ДеревоМетаданныхГруппа2ExtendedTooltip - 246 + ВариантОтбораПоНомеруСообщенияExtendedTooltip + 203 Label true true @@ -1161,96 +138,65 @@ Left - ColumnGroup - - InCell - auto - true + + ВариантОтбораПоНомеруСообщенияКонтекстноеМеню + 173 + true + + InputField + Enter + true + Left + true + + 18 + true + true + true + true + true + + + ru + Все + + + 0 + + + + + ru + Только выгруженные + + + 1 + + + + + ru + Только невыгруженные + + + 2 + + + Normal - - ДеревоМетаданныхКоманднаяПанель - 8 - Left - - - OnActivateRow - ДеревоМетаданныхПриАктивизацииСтроки - - - ДеревоМетаданныхСтрокаПоиска - 326 - - ДеревоМетаданныхСтрокаПоискаРасширеннаяПодсказка - 328 - Label - true - true - - Left - - - - ДеревоМетаданныхСтрокаПоискаКонтекстноеМеню - 327 - true - - ДеревоМетаданных - - true - - - - ДеревоМетаданныхСостояниеПросмотра - 329 - - ДеревоМетаданныхСостояниеПросмотраРасширеннаяПодсказка - 331 - Label - true - true - - Left - - - - ДеревоМетаданныхСостояниеПросмотраКонтекстноеМеню - 330 - true - - ViewStatusAddition - ДеревоМетаданных - - true - - - - ДеревоМетаданныхУправлениеПоиском - 332 - - ДеревоМетаданныхУправлениеПоискомРасширеннаяПодсказка - 334 - Label - true - true - - Left - - - - ДеревоМетаданныхУправлениеПоискомКонтекстноеМеню - 333 - true - - SearchControlAddition - ДеревоМетаданных - - true - - + true + true + + true + + + <key>ru</key> + <value>Быстрые отборы</value> + - ДеревоМетаданныхExtendedTooltip - 242 + ГруппаБыстрыеОтборыРасширеннаяПодсказка + 200 Label true true @@ -1258,18 +204,30 @@ Left - - ДеревоМетаданныхКонтекстноеМеню - 7 + UsualGroup + + Auto + true + true + Auto + Auto + + + + ДанныеРегистрации + 5 + + КоманднаяПанельОбщая + 95 - ДеревоМетаданныхКонтекстноеМенюГруппа1 - 114 + ДеревоМетаданныхГруппаДобавить + 39 - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюВсехОбъектов - 115 + ДеревоМетаданныхДобавитьРегистрациюВсехОбъектов + 40 <key>ru</key> - <value>Зарегистрировать изменения всех объектов выбранных типов</value> + <value>Все объекты выбранных типов</value> true true @@ -1277,8 +235,8 @@ true - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюВсехОбъектовExtendedTooltip - 228 + ДеревоМетаданныхДобавитьРегистрациюВсехОбъектовExtendedTooltip + 207 Label true true @@ -1292,17 +250,14 @@ true true UserCmds - - StdPicture.CreateListItem - Auto - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюАвтоОбъектов - 116 + ДеревоМетаданныхДобавитьРегистрациюАвтоОбъектов + 41 <key>ru</key> - <value>Зарегистрировать изменения объектов выбранных типов с авторегистрацией</value> + <value>Объекты выбранных типов с авторегистрацией</value> true true @@ -1310,8 +265,8 @@ true - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюАвтоОбъектовExtendedTooltip - 229 + ДеревоМетаданныхДобавитьРегистрациюАвтоОбъектовExtendedTooltip + 208 Label true true @@ -1327,45 +282,88 @@ UserCmds Auto - true - true - - true - - - <key>ru</key> - <value>Добавление по виду объектов</value> - - - ДеревоМетаданныхКонтекстноеМенюГруппа1ExtendedTooltip - 227 - Label - true - true - - Left - - - - - - ГруппаКомандДобавить1 - 190 - - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОдногоОбъекта - 191 - - <key>ru</key> - <value>Зарегистрировать изменения одиночного объекта</value> - + + ГруппаКомандДобавить + 183 + + ФормаДобавитьРегистрациюОдногоОбъекта + 184 + + <key>ru</key> + <value>Одиночный объект</value> + + true + true + + true + + + ФормаДобавитьРегистрациюОдногоОбъектаExtendedTooltip + 210 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюОдногоОбъекта + Normal + Auto + true + true + UserCmds + + StdPicture.CreateListItem + + Auto + + + ФормаДобавитьРегистрациюОтбор + 185 + + <key>ru</key> + <value>Объекты при помощи отбора</value> + + true + true + + true + + + ФормаДобавитьРегистрациюОтборExtendedTooltip + 211 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюОтбор + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Регистрация</value> + + + ru + Команды добавления регистрации + - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОдногоОбъектаExtendedTooltip - 231 + ГруппаКомандДобавитьExtendedTooltip + 209 Label true true @@ -1373,32 +371,54 @@ Left - Form.Command.ДобавитьРегистрациюОдногоОбъекта - Normal - Auto - true - true - UserCmds - - StdPicture.CreateListItem - - Auto + - - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОтбор - 192 - - <key>ru</key> - <value>Зарегистрировать изменения объектов при помощи отбора</value> - + + ДеревоМетаданныхГруппа3 + 60 + + ДеревоМетаданныхДобавитьРегистрациюРезультатаЗапроса + 59 + + <key>ru</key> + <value>Результаты запроса</value> + + true + true + + true + + + ДеревоМетаданныхДобавитьРегистрациюРезультатаЗапросаExtendedTooltip + 213 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюРезультатаЗапроса + Normal + Auto + true + true + UserCmds + + Auto + true true true + + <key>ru</key> + <value>Регистрация результатов запроса</value> + - ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОтборExtendedTooltip - 232 + ДеревоМетаданныхГруппа3ExtendedTooltip + 212 Label true true @@ -1406,13 +426,7 @@ Left - Form.Command.ДобавитьРегистрациюОтбор - Normal - Auto - true - true - UserCmds - Auto + true true @@ -1421,15 +435,15 @@ <key>ru</key> - <value>Добавление объектов</value> + <value>Зарегистрировать</value> ru - Группа команд добавить + Зарегистрировать объекты выбранных типов - ГруппаКомандДобавить1ExtendedTooltip - 230 + ДеревоМетаданныхГруппаДобавитьExtendedTooltip + 206 Label true true @@ -1437,17 +451,24 @@ Left - + Popup + + + StdPicture.CreateListItem + + Auto + Normal + - ДеревоМетаданныхКонтекстноеМенюГруппа2 - 142 + ДеревоМетаданныхГруппаУдалить + 42 - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюВсехОбъектов - 143 + ДеревоМетаданныхУдалитьРегистрациюВсехОбъектов + 43 <key>ru</key> - <value>Отменить регистрацию изменений всех объектов выбранных типов</value> + <value>Всех объектов выбранных типов</value> true true @@ -1455,8 +476,8 @@ true - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюВсехОбъектовExtendedTooltip - 234 + ДеревоМетаданныхУдалитьРегистрациюВсехОбъектовExtendedTooltip + 215 Label true true @@ -1470,17 +491,14 @@ true true UserCmds - - StdPicture.DeleteDirectly - Auto - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюАвтоОбъектов - 144 + ДеревоМетаданныхУдалитьРегистрациюАвтоОбъектов + 44 <key>ru</key> - <value>Отменить регистрацию изменений объектов выбранных типов с авторегистрацией</value> + <value>Объектов выбранных типов с авторегистрацией</value> true true @@ -1488,8 +506,8 @@ true - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюАвтоОбъектовExtendedTooltip - 235 + ДеревоМетаданныхУдалитьРегистрациюАвтоОбъектовExtendedTooltip + 216 Label true true @@ -1505,45 +523,88 @@ UserCmds Auto - true - true - - true - - - <key>ru</key> - <value>Отмена регистрации по виду объектов</value> - - - ДеревоМетаданныхКонтекстноеМенюГруппа2ExtendedTooltip - 233 - Label - true - true - - Left - - - - - - ГруппаКомандУдалить1 - 193 - - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОдногоОбъекта - 194 - - <key>ru</key> - <value>Отменить регистрацию изменений одиночного объекта</value> - + + ГруппаКомандУдалить + 186 + + ФормаУдалитьРегистрациюОдногоОбъекта + 187 + + <key>ru</key> + <value>Одиночного объекта</value> + + true + true + + true + + + ФормаУдалитьРегистрациюОдногоОбъектаExtendedTooltip + 218 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюОдногоОбъекта + Normal + Auto + true + true + UserCmds + + StdPicture.DeleteDirectly + + Auto + + + ФормаУдалитьРегистрациюОтбор + 188 + + <key>ru</key> + <value>Объектов при помощи отбора</value> + + true + true + + true + + + ФормаУдалитьРегистрациюОтборExtendedTooltip + 219 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюОтбор + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Отмена регистрации</value> + + + ru + Команды удаления регистрации + - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОдногоОбъектаExtendedTooltip - 237 + ГруппаКомандУдалитьExtendedTooltip + 217 Label true true @@ -1551,32 +612,54 @@ Left - Form.Command.УдалитьРегистрациюОдногоОбъекта - Normal - Auto - true - true - UserCmds - - StdPicture.DeleteDirectly - - Auto + - - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОтбор - 195 - - <key>ru</key> - <value>Отменить регистрацию изменений объектов при помощи отбора</value> - + + ДеревоМетаданныхГруппа4 + 61 + + ДеревоМетаданныхУдалитьРегистрациюРезультатаЗапроса + 62 + + <key>ru</key> + <value>Результатов запроса</value> + + true + true + + true + + + ДеревоМетаданныхУдалитьРегистрациюРезультатаЗапросаExtendedTooltip + 221 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюРезультатаЗапроса + Normal + Auto + true + true + UserCmds + + Auto + true true true + + <key>ru</key> + <value>Отмена регистрации результатов запроса</value> + - ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОтборExtendedTooltip - 238 + ДеревоМетаданныхГруппа4ExtendedTooltip + 220 Label true true @@ -1584,13 +667,7 @@ Left - Form.Command.УдалитьРегистрациюОтбор - Normal - Auto - true - true - UserCmds - Auto + true true @@ -1599,15 +676,15 @@ <key>ru</key> - <value>Отмена регистрации</value> + <value>Отменить регистрацию</value> ru - Группа команд удалить + Отменить регистрацию объектов выбранных типов - ГруппаКомандУдалить1ExtendedTooltip - 236 + ДеревоМетаданныхГруппаУдалитьExtendedTooltip + 214 Label true true @@ -1615,75 +692,30 @@ Left - + Popup + + + StdPicture.DeleteDirectly + + Auto + Normal + - - ДеревоМетаданныхКонтекстноеМенюГруппа3 - 149 - - ДеревоМетаданныхКонтекстноеМенюВывестиСписок - 150 - true - true - - true - - - ДеревоМетаданныхКонтекстноеМенюВывестиСписокExtendedTooltip - 240 - Label - true - true - - Left - - - Form.Item.ДеревоМетаданных.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - - ДеревоМетаданныхКонтекстноеМенюКопироватьВБуферОбмена - 151 - true - true - - true - - - ДеревоМетаданныхКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip - 241 - Label - true - true - - Left - - - Form.Item.ДеревоМетаданных.StandardCommand.CopyToClipboard - Normal - Auto - true - true - UserCmds - Auto - + + ОбновитьВсеДанные + 97 + + <key>ru</key> + <value>Обновить</value> + true true true - - <key>ru</key> - <value>Системное меню</value> - - ДеревоМетаданныхКонтекстноеМенюГруппа3ExtendedTooltip - 239 + ОбновитьВсеДанныеExtendedTooltip + 222 Label true true @@ -1691,11 +723,48 @@ Left - + Form.Command.ОбновитьВсеДанные + Normal + PictureAndText + true + true + UserCmds + Auto - ФормаОткрытьФормуРегистрацииНаУзлахКонтекст - 324 + ФормаОткрытьФормуНастроек + 145 + + <key>ru</key> + <value>Настройки</value> + + true + true + + true + + + ФормаОткрытьФормуНастроекExtendedTooltip + 223 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуНастроек + Normal + PictureAndText + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаОткрытьФормуРегистрацииНаУзлах + 182 <key>ru</key> <value>Регистрация объекта на всех узлах</value> @@ -1706,8 +775,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОткрытьФормуРегистрацииНаУзлахКонтекстРасширеннаяПодсказка</name> - <id>325</id> + <name>ФормаОткрытьФормуРегистрацииНаУзлахExtendedTooltip</name> + <id>225</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1727,114 +796,20 @@ <representationInContextMenu>Auto</representationInContextMenu> <locationInCommandBar>InAdditionalSubmenu</locationInCommandBar> </items> - <autoFill>true</autoFill> - </contextMenu> - <representation>Tree</representation> - <width>32</width> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <autoMaxRowsCount>true</autoMaxRowsCount> - <header>true</header> - <headerHeight>1</headerHeight> - <footerHeight>1</footerHeight> - <horizontalScrollBar>AutoUse</horizontalScrollBar> - <verticalScrollBar>AutoUse</verticalScrollBar> - <horizontalLines>true</horizontalLines> - <verticalLines>true</verticalLines> - <horizontalLinesBWA>false</horizontalLinesBWA> - <verticalLinesBWA>false</verticalLinesBWA> - <useAlternationRowColorBWA>false</useAlternationRowColorBWA> - <searchOnInput>Auto</searchOnInput> - <initialListView>Auto</initialListView> - <initialTreeView>ExpandTopLevel</initialTreeView> - <horizontalStretch>true</horizontalStretch> - <verticalStretch>true</verticalStretch> - <rowPictureDataPath xsi:type="form:DataPath"> - <segments>ДеревоМетаданных.ИндексКартинки</segments> - </rowPictureDataPath> - <rowsPicture xsi:type="form:FormPicture"/> - <searchStringLocation>None</searchStringLocation> - <viewStatusLocation>None</viewStatusLocation> - <searchControlLocation>None</searchControlLocation> - <autoMaxCardHeight>true</autoMaxCardHeight> - </items> - <items xsi:type="form:FormGroup"> - <name>ВариантыСпискаОбъектов</name> - <id>45</id> - <items xsi:type="form:FormGroup"> - <name>СтраницаКонстанты</name> - <id>49</id> <items xsi:type="form:FormGroup"> - <name>ГруппаПользовательскихНастроекКонстанты</name> - <id>318</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>Группа пользовательских настроек константы</value> - - - ru - Группа пользовательских настроек константы - - - ГруппаПользовательскихНастроекКонстантыРасширеннаяПодсказка - 319 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - СписокКонстант - 63 - - <key>ru</key> - <value>Список констант</value> - - true - true - - true - - - СписокКонстант - - None - Choose - - СписокКонстантНаименование - 66 - - <key>ru</key> - <value>Константа</value> - + ФормаГруппаКнопокРИБ + 316 + + ПоказатьРезультатВыгрузки + 133 true true true - - СписокКонстант.Наименование - - СписокКонстантНаименованиеExtendedTooltip - 265 + ПоказатьРезультатВыгрузкиExtendedTooltip + 224 Label true true @@ -1842,28 +817,243 @@ Left - - СписокКонстантНаименованиеКонтекстноеМеню - 67 - true - - LabelField - Enter - true - Left - true - + Form.Command.ПоказатьРезультатВыгрузки + Normal + Auto + true + true + UserCmds + + Auto + + + ФормаЗарегистрироватьИОМИПредопределенные + 314 + true + true + + true + + + ФормаЗарегистрироватьИОМИПредопределенныеРасширеннаяПодсказка + 315 + Label true true - true + + Left + + + Form.Command.ЗарегистрироватьИОМИПредопределенные + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма группа кнопок РИБ</value> + + + ru + Группа кнопок РИБ + + + ФормаГруппаКнопокРИБРасширеннаяПодсказка + 317 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Командная панель </value> + + + ru + Общая командная панель + + + КоманднаяПанельОбщаяExtendedTooltip + 205 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + РегистрируемыеОбъекты + 96 + + ДеревоМетаданных + 6 + + <key>ru</key> + <value>Виды объектов регистрации</value> + + true + true + + true + + + ДеревоМетаданных + + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + ДеревоМетаданныхГруппа1 + 9 + + ДеревоМетаданныхПометка + 16 + true + true + + true + + + ДеревоМетаданных.Пометка + + None + + OnChange + ДеревоМетаданныхПометкаПриИзменении + + + ДеревоМетаданныхПометкаExtendedTooltip + 244 + Label + true + true + + Left + + + + ДеревоМетаданныхПометкаКонтекстноеМеню + 17 + true + + CheckBoxField + true + Left + + true + + + + ДеревоМетаданныхНаименование + 10 + + <key>ru</key> + <value>Объект конфигурации</value> + + true + true + + true + + + ДеревоМетаданных.Наименование + + + ДеревоМетаданныхНаименованиеExtendedTooltip + 245 + Label + true + true + + Left + + + + ДеревоМетаданныхНаименованиеКонтекстноеМеню + 11 + true + + LabelField + true + Auto + true + Left + true + + 17 + true + true + + + true + true + + true + + + <key>ru</key> + <value>Объекты регистрации</value> + + true + + ДеревоМетаданныхГруппа1ExtendedTooltip + 243 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true - СписокКонстантГруппа1 - 148 + ДеревоМетаданныхГруппа2 + 26 - СписокКонстантАвторегистрация - 146 + ДеревоМетаданныхАвторегистрация + 27 <key>ru</key> <value>Авторегистрация</value> @@ -1872,12 +1062,12 @@ <enabled>true</enabled> <userVisible/> <dataPath xsi:type="form:DataPath"> - <segments>СписокКонстант.ИндексКартинкиАвторегистрация</segments> + <segments>ДеревоМетаданных.Авторегистрация</segments> </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>СписокКонстантАвторегистрацияExtendedTooltip</name> - <id>267</id> + <name>ДеревоМетаданныхАвторегистрацияExtendedTooltip</name> + <id>247</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1886,20 +1076,21 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокКонстантАвторегистрацияКонтекстноеМеню</name> - <id>147</id> + <name>ДеревоМетаданныхАвторегистрацияКонтекстноеМеню</name> + <id>28</id> <autoFill>true</autoFill> </contextMenu> <type>PictureField</type> <readOnly>true</readOnly> + <horizontalAlign>Left</horizontalAlign> + <editMode>Auto</editMode> <showInHeader>true</showInHeader> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> <extInfo xsi:type="form:ImageFieldExtInfo"> + <width>2</width> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> - <horizontalStretch>true</horizontalStretch> - <verticalStretch>true</verticalStretch> <valuesPicture xsi:type="form:FormPicture"/> <border xsi:type="core:BorderDef"> <style>Single</style> @@ -1908,11 +1099,11 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>СписокКонстантНомерСообщения</name> - <id>68</id> + <name>ДеревоМетаданныхКоличествоИзмененийСтрокой</name> + <id>29</id> <title> <key>ru</key> - <value>№ отправленного</value> + <value>Количество</value> true true @@ -1920,11 +1111,15 @@ true - СписокКонстант.НомерСообщения + ДеревоМетаданных.КоличествоИзмененийСтрокой + + ru + Зарегистрировано / не выгружено + - СписокКонстантНомерСообщенияExtendedTooltip - 268 + ДеревоМетаданныхКоличествоИзмененийСтрокойExtendedTooltip + 248 Label true true @@ -1933,18 +1128,23 @@ - СписокКонстантНомерСообщенияКонтекстноеМеню - 69 + ДеревоМетаданныхКоличествоИзмененийСтрокойКонтекстноеМеню + 30 true LabelField + true Left + Auto true Left true + 10 true + 1 true + false true @@ -1956,9 +1156,10 @@ ru Информация о регистрации + true - СписокКонстантГруппа1ExtendedTooltip - 266 + ДеревоМетаданныхГруппа2ExtendedTooltip + 246 Label true true @@ -1974,20 +1175,20 @@ - СписокКонстантКоманднаяПанель - 65 + ДеревоМетаданныхКоманднаяПанель + 8 Left - ChoiceProcessing - СписокКонстантОбработкаВыбора + OnActivateRow + ДеревоМетаданныхПриАктивизацииСтроки - СписокКонстантСтрокаПоиска - 335 + ДеревоМетаданныхСтрокаПоиска + 326 - СписокКонстантСтрокаПоискаРасширеннаяПодсказка - 337 + ДеревоМетаданныхСтрокаПоискаРасширеннаяПодсказка + 328 Label true true @@ -1996,21 +1197,21 @@ - СписокКонстантСтрокаПоискаКонтекстноеМеню - 336 + ДеревоМетаданныхСтрокаПоискаКонтекстноеМеню + 327 true - СписокКонстант + ДеревоМетаданных true - СписокКонстантСостояниеПросмотра - 338 + ДеревоМетаданныхСостояниеПросмотра + 329 - СписокКонстантСостояниеПросмотраРасширеннаяПодсказка - 340 + ДеревоМетаданныхСостояниеПросмотраРасширеннаяПодсказка + 331 Label true true @@ -2019,22 +1220,22 @@ - СписокКонстантСостояниеПросмотраКонтекстноеМеню - 339 + ДеревоМетаданныхСостояниеПросмотраКонтекстноеМеню + 330 true ViewStatusAddition - СписокКонстант + ДеревоМетаданных true - СписокКонстантУправлениеПоиском - 341 + ДеревоМетаданныхУправлениеПоиском + 332 - СписокКонстантУправлениеПоискомРасширеннаяПодсказка - 343 + ДеревоМетаданныхУправлениеПоискомРасширеннаяПодсказка + 334 Label true true @@ -2043,19 +1244,19 @@ - СписокКонстантУправлениеПоискомКонтекстноеМеню - 342 + ДеревоМетаданныхУправлениеПоискомКонтекстноеМеню + 333 true SearchControlAddition - СписокКонстант + ДеревоМетаданных true - СписокКонстантExtendedTooltip - 264 + ДеревоМетаданныхExtendedTooltip + 242 Label true true @@ -2064,17 +1265,17 @@ - СписокКонстантКонтекстноеМеню - 64 + ДеревоМетаданныхКонтекстноеМеню + 7 - СписокКонстантКонтекстноеМенюГруппа1 - 101 + ДеревоМетаданныхКонтекстноеМенюГруппа1 + 114 - СписокКонстантКонтекстноеМенюДобавитьРегистрациюКонстанты - 98 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюВсехОбъектов + 115 <key>ru</key> - <value>Зарегистрировать изменение константы</value> + <value>Зарегистрировать изменения всех объектов выбранных типов</value> true true @@ -2082,8 +1283,8 @@ true - СписокКонстантКонтекстноеМенюДобавитьРегистрациюКонстантыExtendedTooltip - 252 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюВсехОбъектовExtendedTooltip + 228 Label true true @@ -2091,7 +1292,7 @@ Left - Form.Command.ДобавитьРегистрациюКонстанты + Form.Command.ДобавитьРегистрациюВсехОбъектов Normal Auto true @@ -2103,11 +1304,11 @@ Auto - СписокКонстантКонтекстноеМенюУдалитьРегистрациюКонстанты - 99 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюАвтоОбъектов + 116 <key>ru</key> - <value>Отменить регистрацию изменений константы</value> + <value>Зарегистрировать изменения объектов выбранных типов с авторегистрацией</value> true true @@ -2115,8 +1316,8 @@ true - СписокКонстантКонтекстноеМенюУдалитьРегистрациюКонстантыExtendedTooltip - 253 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюАвтоОбъектовExtendedTooltip + 229 Label true true @@ -2124,116 +1325,7 @@ Left - Form.Command.УдалитьРегистрациюКонстанты - Normal - Auto - true - true - UserCmds - - StdPicture.DeleteDirectly - - Auto - - true - true - - true - - - СписокКонстантКонтекстноеМенюГруппа1ExtendedTooltip - 251 - Label - true - true - - Left - - - - - - СписокКонстантКонтекстноеМенюГруппа3 - 177 - - СписокКонстантКонтекстноеМенюПоказатьРезультатВыгрузки - 100 - - <key>ru</key> - <value>Результат стандартной выгрузки (РИБ)</value> - - true - true - - true - - - СписокКонстантКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip - 255 - Label - true - true - - Left - - - Form.Command.ПоказатьРезультатВыгрузки - Normal - Auto - true - true - UserCmds - - Auto - - - СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах - 178 - true - true - - true - - - СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip - 256 - Label - true - true - - Left - - - Form.Command.ОткрытьФормуРегистрацииНаУзлах - Normal - Auto - true - true - UserCmds - - StdPicture.ExchangePlan - - Auto - - - СписокКонстантКонтекстноеМенюРедактироватьНомерСообщенияОбъекта - 197 - true - true - - true - - - СписокКонстантКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip - 257 - Label - true - true - - Left - - - Form.Command.РедактироватьНомерСообщенияОбъекта + Form.Command.ДобавитьРегистрациюАвтоОбъектов Normal Auto true @@ -2246,9 +1338,13 @@ true + + <key>ru</key> + <value>Добавление по виду объектов</value> + - СписокКонстантКонтекстноеМенюГруппа3ExtendedTooltip - 254 + ДеревоМетаданныхКонтекстноеМенюГруппа1ExtendedTooltip + 227 Label true true @@ -2259,461 +1355,14 @@ - СписокКонстантКонтекстноеМенюГруппа2 - 152 + ГруппаКомандДобавить1 + 190 - СписокКонстантКонтекстноеМенюНайти - 153 - true - true - - true - - - СписокКонстантКонтекстноеМенюНайтиExtendedTooltip - 259 - Label - true - true - - Left - - - Form.Item.СписокКонстант.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонстантКонтекстноеМенюОтменитьПоиск - 154 - true - true - - true - - - СписокКонстантКонтекстноеМенюОтменитьПоискExtendedTooltip - 260 - Label - true - true - - Left - - - Form.Item.СписокКонстант.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонстантКонтекстноеМенюНастройкаСписка - 155 - true - true - - true - - - СписокКонстантКонтекстноеМенюНастройкаСпискаExtendedTooltip - 261 - Label - true - true - - Left - - - Form.Item.СписокКонстант.StandardCommand.ListSettings - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонстантКонтекстноеМенюВывестиСписок - 156 - true - true - - true - - - СписокКонстантКонтекстноеМенюВывестиСписокExtendedTooltip - 262 - Label - true - true - - Left - - - Form.Item.СписокКонстант.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонстантКонтекстноеМенюОбновить - 157 - true - true - - true - - - СписокКонстантКонтекстноеМенюОбновитьExtendedTooltip - 263 - Label - true - true - - Left - - - Form.Item.СписокКонстант.StandardCommand.Refresh - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - СписокКонстантКонтекстноеМенюГруппа2ExtendedTooltip - 258 - Label - true - true - - Left - - - - - - true - true - true - MultiRow -
                  true
                  - 1 - 1 - AutoUse - AutoUse - true - true - false - false - Auto - true - true - true - - СписокКонстант.ИндексКартинки - - - 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 - Страница константы - - - СтраницаКонстантыExtendedTooltip - 250 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
                  - - СтраницаСписокСсылок - 48 - - ГруппаПользовательскихНастроекСсылки - 320 - true - true - - true - - - <key>ru</key> - <value>Группа пользовательских настроек ссылки</value> - - - ru - Группа пользовательских настроек константы - - - ГруппаПользовательскихНастроекСсылкиРасширеннаяПодсказка - 321 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - СписокСсылок - 18 - - <key>ru</key> - <value>Список ссылок</value> - - true - true - - true - - - СписокСсылок - - Choose - - СписокСсылокСсылкаПредставление - 21 - true - true - - true - - - СписокСсылок.Ссылка - - - СписокСсылокСсылкаПредставлениеExtendedTooltip - 288 - Label - true - true - - Left - - - - СписокСсылокСсылкаПредставлениеКонтекстноеМеню - 22 - true - - LabelField - Enter - true - Left - true - - true - true - true - - - - СписокСсылокНомерСообщения - 52 - - <key>ru</key> - <value>№ отправленного</value> - - true - true - - true - - - СписокСсылок.НомерСообщения - - - СписокСсылокНомерСообщенияExtendedTooltip - 289 - Label - true - true - - Left - - - - СписокСсылокНомерСообщенияКонтекстноеМеню - 53 - true - - LabelField - Enter - true - Left - true - - true - true - - - - СписокСсылокКоманднаяПанель - 20 - Left - - - Selection - СписокСсылокВыбор - - - ChoiceProcessing - СписокСсылокОбработкаВыбора - - - СписокСсылокСтрокаПоиска - 344 - - СписокСсылокСтрокаПоискаРасширеннаяПодсказка - 346 - Label - true - true - - Left - - - - СписокСсылокСтрокаПоискаКонтекстноеМеню - 345 - true - - СписокСсылок - - true - - - - СписокСсылокСостояниеПросмотра - 347 - - СписокСсылокСостояниеПросмотраРасширеннаяПодсказка - 349 - Label - true - true - - Left - - - - СписокСсылокСостояниеПросмотраКонтекстноеМеню - 348 - true - - ViewStatusAddition - СписокСсылок - - true - - - - СписокСсылокУправлениеПоиском - 350 - - СписокСсылокУправлениеПоискомРасширеннаяПодсказка - 352 - Label - true - true - - Left - - - - СписокСсылокУправлениеПоискомКонтекстноеМеню - 351 - true - - SearchControlAddition - СписокСсылок - - true - - - - СписокСсылокExtendedTooltip - 287 - Label - true - true - - Left - - - - СписокСсылокКонтекстноеМеню - 19 - - СписокСсылокКонтекстноеМенюГруппа1 - 102 - - СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиПодбор - 134 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОдногоОбъекта + 191 <key>ru</key> - <value>Зарегистрировать изменение объекта</value> + <value>Зарегистрировать изменения одиночного объекта</value> true true @@ -2721,8 +1370,8 @@ true - СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиПодборExtendedTooltip - 271 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОдногоОбъектаExtendedTooltip + 231 Label true true @@ -2730,7 +1379,7 @@ Left - Form.Command.ДобавитьРегистрациюСсылкиПодбор + Form.Command.ДобавитьРегистрациюОдногоОбъекта Normal Auto true @@ -2742,8 +1391,8 @@ Auto - СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиОтбор - 135 + ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОтбор + 192 <key>ru</key> <value>Зарегистрировать изменения объектов при помощи отбора</value> @@ -2754,8 +1403,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиОтборExtendedTooltip</name> - <id>272</id> + <name>ДеревоМетаданныхКонтекстноеМенюДобавитьРегистрациюОтборExtendedTooltip</name> + <id>232</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2763,37 +1412,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ДобавитьРегистрациюСсылкиОтбор</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <items xsi:type="form:Button"> - <name>СписокСсылокКонтекстноеМенюДобавитьРегистрациюУдаленияОбъекта</name> - <id>196</id> - <title> - <key>ru</key> - <value>Зарегистрировать удаление объекта</value> - - true - true - - true - - - СписокСсылокКонтекстноеМенюДобавитьРегистрациюУдаленияОбъектаExtendedTooltip - 273 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюУдаленияОбъекта + Form.Command.ДобавитьРегистрациюОтбор Normal Auto true @@ -2806,9 +1425,13 @@ true + + <key>ru</key> + <value>Добавление объектов</value> + - СписокСсылокКонтекстноеМенюГруппа1ExtendedTooltip - 270 + ГруппаКомандДобавить1ExtendedTooltip + 230 Label true true @@ -2819,14 +1442,14 @@ - СписокСсылокКонтекстноеМенюГруппа3 - 158 + ДеревоМетаданныхКонтекстноеМенюГруппа2 + 142 - СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылки - 105 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюВсехОбъектов + 143 <key>ru</key> - <value>Отменить регистрацию изменений объекта</value> + <value>Отменить регистрацию изменений всех объектов выбранных типов</value> true true @@ -2834,8 +1457,8 @@ true - СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиExtendedTooltip - 275 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюВсехОбъектовExtendedTooltip + 234 Label true true @@ -2843,7 +1466,7 @@ Left - Form.Command.УдалитьРегистрациюСсылки + Form.Command.УдалитьРегистрациюВсехОбъектов Normal Auto true @@ -2855,11 +1478,11 @@ Auto - СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиОтбор - 189 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюАвтоОбъектов + 144 <key>ru</key> - <value>Отменить регистрацию изменения объектов при помощи отбора</value> + <value>Отменить регистрацию изменений объектов выбранных типов с авторегистрацией</value> true true @@ -2867,8 +1490,8 @@ true - СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиОтборExtendedTooltip - 276 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюАвтоОбъектовExtendedTooltip + 235 Label true true @@ -2876,7 +1499,7 @@ Left - Form.Command.УдалитьРегистрациюСсылкиОтбор + Form.Command.УдалитьРегистрациюАвтоОбъектов Normal Auto true @@ -2889,9 +1512,13 @@ true + + <key>ru</key> + <value>Отмена регистрации по виду объектов</value> + - СписокСсылокКонтекстноеМенюГруппа3ExtendedTooltip - 274 + ДеревоМетаданныхКонтекстноеМенюГруппа2ExtendedTooltip + 233 Label true true @@ -2902,14 +1529,14 @@ - СписокСсылокКонтекстноеМенюГруппа4 - 181 + ГруппаКомандУдалить1 + 193 - СписокСсылокКонтекстноеМенюПоказатьРезультатВыгрузки - 106 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОдногоОбъекта + 194 <key>ru</key> - <value>Показать результат выгрузки</value> + <value>Отменить регистрацию изменений одиночного объекта</value> true true @@ -2917,8 +1544,8 @@ true - СписокСсылокКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip - 278 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОдногоОбъектаExtendedTooltip + 237 Label true true @@ -2926,613 +1553,7 @@ Left - Form.Command.ПоказатьРезультатВыгрузки - Normal - Auto - true - true - UserCmds - - Auto - - - СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах - 137 - - <key>ru</key> - <value>Регистрация на других узлах</value> - - true - true - - true - - - СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip - 279 - Label - true - true - - Left - - - Form.Command.ОткрытьФормуРегистрацииНаУзлах - Normal - Auto - true - true - UserCmds - - StdPicture.ExchangePlan - - Auto - - - СписокСсылокКонтекстноеМенюРедактироватьНомерСообщенияОбъекта - 198 - true - true - - true - - - СписокСсылокКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip - 280 - Label - true - true - - Left - - - Form.Command.РедактироватьНомерСообщенияОбъекта - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - СписокСсылокКонтекстноеМенюГруппа4ExtendedTooltip - 277 - Label - true - true - - Left - - - - - - СписокСсылокКонтекстноеМенюГруппа2 - 136 - - СписокСсылокКонтекстноеМенюНайти - 159 - true - true - - true - - - СписокСсылокКонтекстноеМенюНайтиExtendedTooltip - 282 - Label - true - true - - Left - - - Form.Item.СписокСсылок.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - СписокСсылокКонтекстноеМенюОтменитьПоиск - 160 - true - true - - true - - - СписокСсылокКонтекстноеМенюОтменитьПоискExtendedTooltip - 283 - Label - true - true - - Left - - - Form.Item.СписокСсылок.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - СписокСсылокКонтекстноеМенюНастройкаСписка - 161 - true - true - - true - - - СписокСсылокКонтекстноеМенюНастройкаСпискаExtendedTooltip - 284 - Label - true - true - - Left - - - Form.Item.СписокСсылок.StandardCommand.ListSettings - Normal - Auto - true - true - UserCmds - Auto - - - СписокСсылокКонтекстноеМенюВывестиСписок - 162 - true - true - - true - - - СписокСсылокКонтекстноеМенюВывестиСписокExtendedTooltip - 285 - Label - true - true - - Left - - - Form.Item.СписокСсылок.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - - СписокСсылокКонтекстноеМенюОбновить - 163 - true - true - - true - - - СписокСсылокКонтекстноеМенюОбновитьExtendedTooltip - 286 - Label - true - true - - Left - - - Form.Item.СписокСсылок.StandardCommand.Refresh - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - СписокСсылокКонтекстноеМенюГруппа2ExtendedTooltip - 281 - Label - true - true - - Left - - - - - - true - true - true - true - MultiRow -
                  true
                  - 1 - 1 - AutoUse - AutoUse - true - true - 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 - - true - - - <key>ru</key> - <value>Ссылки</value> - - - ru - Страница списка ссылок - - - СтраницаСписокСсылокExtendedTooltip - 269 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
                  - - СтраницаНаборЗаписей - 50 - - ГруппаПользовательскихНастроекНаборЗаписей - 322 - true - true - - true - - - <key>ru</key> - <value>Группа пользовательских настроек набор записей</value> - - - ru - Группа пользовательских настроек константы - - - ГруппаПользовательскихНастроекНаборЗаписейРасширеннаяПодсказка - 323 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - СписокНаборовЗаписей - 78 - - <key>ru</key> - <value>Набор записей</value> - - true - true - - true - - - СписокНаборовЗаписей - - None - Choose - - СписокНаборовЗаписейГруппаИзмерений - 86 - true - true - - true - - - <key>ru</key> - <value>Измерения</value> - - - ru - Измерения набора записей - - - СписокНаборовЗаписейГруппаИзмеренийExtendedTooltip - 307 - Label - true - true - - Left - - - ColumnGroup - - InCell - auto - true - - - - СписокНаборовЗаписейНомерСообщения - 83 - - <key>ru</key> - <value>№ отправленного</value> - - true - true - - true - - - СписокНаборовЗаписей.НомерСообщения - - - СписокНаборовЗаписейНомерСообщенияExtendedTooltip - 308 - Label - true - true - - Left - - - - СписокНаборовЗаписейНомерСообщенияКонтекстноеМеню - 84 - true - - LabelField - Enter - true - Left - true - - true - true - - - - СписокНаборовЗаписейКоманднаяПанель - 80 - Left - - - Selection - СписокНаборовЗаписейВыбор - - - ChoiceProcessing - СписокНаборовЗаписейОбработкаВыбора - - - СписокНаборовЗаписейСтрокаПоиска - 353 - - СписокНаборовЗаписейСтрокаПоискаРасширеннаяПодсказка - 355 - Label - true - true - - Left - - - - СписокНаборовЗаписейСтрокаПоискаКонтекстноеМеню - 354 - true - - СписокНаборовЗаписей - - true - - - - СписокНаборовЗаписейСостояниеПросмотра - 356 - - СписокНаборовЗаписейСостояниеПросмотраРасширеннаяПодсказка - 358 - Label - true - true - - Left - - - - СписокНаборовЗаписейСостояниеПросмотраКонтекстноеМеню - 357 - true - - ViewStatusAddition - СписокНаборовЗаписей - - true - - - - СписокНаборовЗаписейУправлениеПоиском - 359 - - СписокНаборовЗаписейУправлениеПоискомРасширеннаяПодсказка - 361 - Label - true - true - - Left - - - - СписокНаборовЗаписейУправлениеПоискомКонтекстноеМеню - 360 - true - - SearchControlAddition - СписокНаборовЗаписей - - true - - - - СписокНаборовЗаписейExtendedTooltip - 306 - Label - true - true - - Left - - - - СписокНаборовЗаписейКонтекстноеМеню - 79 - - СписокНаборовЗаписейКонтекстноеМенюГруппа1 - 164 - - СписокНаборовЗаписейКонтекстноеМенюДобавитьРегистрациюНабораЗаписейОтбор - 138 - - <key>ru</key> - <value>Зарегистрировать изменения набора записей</value> - - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюДобавитьРегистрациюНабораЗаписейОтборExtendedTooltip - 292 - Label - true - true - - Left - - - Form.Command.ДобавитьРегистрациюНабораЗаписейОтбор - Normal - Auto - true - true - UserCmds - - StdPicture.CreateListItem - - Auto - - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюГруппа1ExtendedTooltip - 291 - Label - true - true - - Left - - - - - - СписокНаборовЗаписейКонтекстноеМенюГруппа2 - 165 - - СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписей - 139 - - <key>ru</key> - <value>Отменить регистрацию изменений текущей строки</value> - - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейExtendedTooltip - 294 - Label - true - true - - Left - - - Form.Command.УдалитьРегистрациюНабораЗаписей + Form.Command.УдалитьРегистрациюОдногоОбъекта Normal Auto true @@ -3544,11 +1565,11 @@ Auto - СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейОтбор - 140 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОтбор + 195 <key>ru</key> - <value>Отменить регистрацию изменений при помощи отбора</value> + <value>Отменить регистрацию изменений объектов при помощи отбора</value> true true @@ -3556,8 +1577,8 @@ true - СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейОтборExtendedTooltip - 295 + ДеревоМетаданныхКонтекстноеМенюУдалитьРегистрациюОтборExtendedTooltip + 238 Label true true @@ -3565,7 +1586,7 @@ Left - Form.Command.УдалитьРегистрациюНабораЗаписейОтбор + Form.Command.УдалитьРегистрациюОтбор Normal Auto true @@ -3578,9 +1599,13 @@ true + + <key>ru</key> + <value>Отмена регистрации</value> + - СписокНаборовЗаписейКонтекстноеМенюГруппа2ExtendedTooltip - 293 + ГруппаКомандУдалить1ExtendedTooltip + 236 Label true true @@ -3591,23 +1616,19 @@ - СписокНаборовЗаписейКонтекстноеМенюГруппа4 - 179 + ДеревоМетаданныхКонтекстноеМенюГруппа3 + 149 - СписокНаборовЗаписейКонтекстноеМенюПоказатьРезультатВыгрузки - 141 - - <key>ru</key> - <value>Показать результат выгрузки</value> - + ДеревоМетаданныхКонтекстноеМенюВывестиСписок + 150 true true true - СписокНаборовЗаписейКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip - 297 + ДеревоМетаданныхКонтекстноеМенюВывестиСписокExtendedTooltip + 240 Label true true @@ -3615,26 +1636,25 @@ Left - Form.Command.ПоказатьРезультатВыгрузки + Form.Item.ДеревоМетаданных.StandardCommand.OutputList Normal Auto true true UserCmds - Auto - СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах - 180 + ДеревоМетаданныхКонтекстноеМенюКопироватьВБуферОбмена + 151 true true true - СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip - 298 + ДеревоМетаданныхКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 241 Label true true @@ -3642,36 +1662,7 @@ Left - Form.Command.ОткрытьФормуРегистрацииНаУзлах - Normal - Auto - true - true - UserCmds - - StdPicture.ExchangePlan - - Auto - - - СписокНаборовЗаписейКонтекстноеМенюРедактироватьНомерСообщенияОбъекта - 199 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip - 299 - Label - true - true - - Left - - - Form.Command.РедактироватьНомерСообщенияОбъекта + Form.Item.ДеревоМетаданных.StandardCommand.CopyToClipboard Normal Auto true @@ -3684,9 +1675,13 @@ true + + <key>ru</key> + <value>Системное меню</value> + - СписокНаборовЗаписейКонтекстноеМенюГруппа4ExtendedTooltip - 296 + ДеревоМетаданныхКонтекстноеМенюГруппа3ExtendedTooltip + 239 Label true true @@ -3696,147 +1691,21 @@ - - СписокНаборовЗаписейКонтекстноеМенюГруппа3 - 166 - - СписокНаборовЗаписейКонтекстноеМенюНайти - 167 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюНайтиExtendedTooltip - 301 - Label - true - true - - Left - - - Form.Item.СписокНаборовЗаписей.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - СписокНаборовЗаписейКонтекстноеМенюОбновить - 168 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюОбновитьExtendedTooltip - 302 - Label - true - true - - Left - - - Form.Item.СписокНаборовЗаписей.StandardCommand.Refresh - Normal - Auto - true - true - UserCmds - Auto - - - СписокНаборовЗаписейКонтекстноеМенюОтменитьПоиск - 169 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюОтменитьПоискExtendedTooltip - 303 - Label - true - true - - Left - - - Form.Item.СписокНаборовЗаписей.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - СписокНаборовЗаписейКонтекстноеМенюНастройкаСписка - 170 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюНастройкаСпискаExtendedTooltip - 304 - Label - true - true - - Left - - - Form.Item.СписокНаборовЗаписей.StandardCommand.ListSettings - Normal - Auto - true - true - UserCmds - Auto - - - СписокНаборовЗаписейКонтекстноеМенюВывестиСписок - 171 - true - true - - true - - - СписокНаборовЗаписейКонтекстноеМенюВывестиСписокExtendedTooltip - 305 - Label - true - true - - Left - - - Form.Item.СписокНаборовЗаписей.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - + + ФормаОткрытьФормуРегистрацииНаУзлахКонтекст + 324 + + <key>ru</key> + <value>Регистрация объекта на всех узлах</value> + true true true - СписокНаборовЗаписейКонтекстноеМенюГруппа3ExtendedTooltip - 300 + ФормаОткрытьФормуРегистрацииНаУзлахКонтекстРасширеннаяПодсказка + 325 Label true true @@ -3844,17 +1713,25 @@ Left - + Form.Command.ОткрытьФормуРегистрацииНаУзлах + Normal + Picture + true + true + UserCmds + + StdPicture.ExchangePlan + + Auto + InAdditionalSubmenu + true - HierarchicalList - true - true + Tree + 32 true true true - AfterCurrentRow - MultiRow
                  true
                  1 1 @@ -3863,74 +1740,732 @@ true true false + false + false Auto + Auto + ExpandTopLevel true true - true - None - None - None + + ДеревоМетаданных.ИндексКартинки + + true - - 60 - - 0001-01-01T00:00:00 - 0001-01-01T00:00:00 - - true - - true - true - ГруппаПользовательскихНастроекНаборЗаписей -
                  - true - true - - true - - - <key>ru</key> - <value>Наборы записей</value> - - - ru - Страница набора записей - - - СтраницаНаборЗаписейExtendedTooltip - 290 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
                  - - СтраницаПустая - 74 - Группа4 - 77 - - ДекорацияПустаяСтраница - 75 + ВариантыСпискаОбъектов + 45 + + СтраницаКонстанты + 49 + + ГруппаПользовательскихНастроекКонстанты + 318 + true + true + + true + + + <key>ru</key> + <value>Пользовательских настроек константы</value> + + + ru + Группа пользовательских настроек констант + + + ГруппаПользовательскихНастроекКонстантыРасширеннаяПодсказка + 319 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СписокКонстант + 63 + + <key>ru</key> + <value>Список констант</value> + + true + true + + true + + + СписокКонстант + + None + Choose + + СписокКонстантНаименование + 66 + + <key>ru</key> + <value>Константа</value> + + true + true + + true + + + СписокКонстант.Наименование + + + СписокКонстантНаименованиеExtendedTooltip + 265 + Label + true + true + + Left + + + + СписокКонстантНаименованиеКонтекстноеМеню + 67 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + СписокКонстантГруппа1 + 148 + + СписокКонстантАвторегистрация + 146 + + <key>ru</key> + <value>Авторегистрация</value> + + true + true + + + СписокКонстант.ИндексКартинкиАвторегистрация + + None + + СписокКонстантАвторегистрацияExtendedTooltip + 267 + Label + true + true + + Left + + + + СписокКонстантАвторегистрацияКонтекстноеМеню + 147 + true + + PictureField + true + true + Left + true + + true + true + true + true + + + + 1 + + + + + СписокКонстантНомерСообщения + 68 + + <key>ru</key> + <value>№ отправленного</value> + + true + true + + true + + + СписокКонстант.НомерСообщения + + + СписокКонстантНомерСообщенияExtendedTooltip + 268 + Label + true + true + + Left + + + + СписокКонстантНомерСообщенияКонтекстноеМеню + 69 + true + + LabelField + Left + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Информация о регистрации</value> + + + СписокКонстантГруппа1ExtendedTooltip + 266 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокКонстантКоманднаяПанель + 65 + Left + + + ChoiceProcessing + СписокКонстантОбработкаВыбора + + + СписокКонстантСтрокаПоиска + 335 + + СписокКонстантСтрокаПоискаРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + + СписокКонстантСтрокаПоискаКонтекстноеМеню + 336 + true + + СписокКонстант + + true + + + + СписокКонстантСостояниеПросмотра + 338 + + СписокКонстантСостояниеПросмотраРасширеннаяПодсказка + 340 + Label + true + true + + Left + + + + СписокКонстантСостояниеПросмотраКонтекстноеМеню + 339 + true + + ViewStatusAddition + СписокКонстант + + true + + + + СписокКонстантУправлениеПоиском + 341 + + СписокКонстантУправлениеПоискомРасширеннаяПодсказка + 343 + Label + true + true + + Left + + + + СписокКонстантУправлениеПоискомКонтекстноеМеню + 342 + true + + SearchControlAddition + СписокКонстант + + true + + + + СписокКонстантExtendedTooltip + 264 + Label + true + true + + Left + + + + СписокКонстантКонтекстноеМеню + 64 + + СписокКонстантКонтекстноеМенюГруппа1 + 101 + + СписокКонстантКонтекстноеМенюДобавитьРегистрациюКонстанты + 98 + + <key>ru</key> + <value>Зарегистрировать изменение константы</value> + + true + true + + true + + + СписокКонстантКонтекстноеМенюДобавитьРегистрациюКонстантыExtendedTooltip + 252 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюКонстанты + Normal + Auto + true + true + UserCmds + + StdPicture.CreateListItem + + Auto + + + СписокКонстантКонтекстноеМенюУдалитьРегистрациюКонстанты + 99 + + <key>ru</key> + <value>Отменить регистрацию изменений константы</value> + + true + true + + true + + + СписокКонстантКонтекстноеМенюУдалитьРегистрациюКонстантыExtendedTooltip + 253 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюКонстанты + Normal + Auto + true + true + UserCmds + + StdPicture.DeleteDirectly + + Auto + + true + true + + true + + + <key>ru</key> + <value>Список констант контекстное меню 1</value> + + + СписокКонстантКонтекстноеМенюГруппа1ExtendedTooltip + 251 + Label + true + true + + Left + + + + + + СписокКонстантКонтекстноеМенюГруппа3 + 177 + + СписокКонстантКонтекстноеМенюПоказатьРезультатВыгрузки + 100 + + <key>ru</key> + <value>Результат стандартной выгрузки (РИБ)</value> + + true + true + + true + + + СписокКонстантКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip + 255 + Label + true + true + + Left + + + Form.Command.ПоказатьРезультатВыгрузки + Normal + Auto + true + true + UserCmds + + Auto + + + СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах + 178 + true + true + + true + + + СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip + 256 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуРегистрацииНаУзлах + Normal + Auto + true + true + UserCmds + + StdPicture.ExchangePlan + + Auto + + + СписокКонстантКонтекстноеМенюРедактироватьНомерСообщенияОбъекта + 197 + true + true + + true + + + СписокКонстантКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip + 257 + Label + true + true + + Left + + + Form.Command.РедактироватьНомерСообщенияОбъекта + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список констант контекстное меню 3</value> + + + СписокКонстантКонтекстноеМенюГруппа3ExtendedTooltip + 254 + Label + true + true + + Left + + + + + + СписокКонстантКонтекстноеМенюГруппа2 + 152 + + СписокКонстантКонтекстноеМенюНайти + 153 + true + true + + true + + + СписокКонстантКонтекстноеМенюНайтиExtendedTooltip + 259 + Label + true + true + + Left + + + Form.Item.СписокКонстант.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонстантКонтекстноеМенюОтменитьПоиск + 154 + true + true + + true + + + СписокКонстантКонтекстноеМенюОтменитьПоискExtendedTooltip + 260 + Label + true + true + + Left + + + Form.Item.СписокКонстант.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонстантКонтекстноеМенюНастройкаСписка + 155 + true + true + + true + + + СписокКонстантКонтекстноеМенюНастройкаСпискаExtendedTooltip + 261 + Label + true + true + + Left + + + Form.Item.СписокКонстант.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонстантКонтекстноеМенюВывестиСписок + 156 + true + true + + true + + + СписокКонстантКонтекстноеМенюВывестиСписокExtendedTooltip + 262 + Label + true + true + + Left + + + Form.Item.СписокКонстант.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонстантКонтекстноеМенюОбновить + 157 + true + true + + true + + + СписокКонстантКонтекстноеМенюОбновитьExtendedTooltip + 263 + Label + true + true + + Left + + + Form.Item.СписокКонстант.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список констант контекстное меню 2</value> + + + СписокКонстантКонтекстноеМенюГруппа2ExtendedTooltip + 258 + Label + true + true + + Left + + + + + + true + true + true + MultiRow +
                  true
                  + 1 + 1 + AutoUse + AutoUse + true + true + false + false + Auto + true + true + true + + СписокКонстант.ИндексКартинки + + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + ГруппаПользовательскихНастроекКонстанты + +
                  true true true + + <key>ru</key> + <value>Константы</value> + + + ru + Страница данные константы + - ДекорацияПустаяСтраницаExtendedTooltip - 311 + СтраницаКонстантыExtendedTooltip + 250 Label true true @@ -3938,18 +2473,1580 @@ Left - - ДекорацияПустаяСтраницаКонтекстноеМеню - 76 - true - - Label - true - true - true - - Left - Top + Page + + Vertical + auto + false + +
                  + + СтраницаСписокСсылок + 48 + + ГруппаПользовательскихНастроекСсылки + 320 + true + true + + true + + + <key>ru</key> + <value>Пользовательских настроек ссылки</value> + + + ru + Группа пользовательских настроек константы + + + ГруппаПользовательскихНастроекСсылкиРасширеннаяПодсказка + 321 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СписокСсылок + 18 + + <key>ru</key> + <value>Список ссылок</value> + + true + true + + true + + + СписокСсылок + + Choose + + СписокСсылокСсылкаПредставление + 21 + true + true + + true + + + СписокСсылок.Ссылка + + + СписокСсылокСсылкаПредставлениеExtendedTooltip + 288 + Label + true + true + + Left + + + + СписокСсылокСсылкаПредставлениеКонтекстноеМеню + 22 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + СписокСсылокНомерСообщения + 52 + + <key>ru</key> + <value>№ отправленного</value> + + true + true + + true + + + СписокСсылок.НомерСообщения + + + СписокСсылокНомерСообщенияExtendedTooltip + 289 + Label + true + true + + Left + + + + СписокСсылокНомерСообщенияКонтекстноеМеню + 53 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокСсылокКоманднаяПанель + 20 + Left + + + Selection + СписокСсылокВыбор + + + ChoiceProcessing + СписокСсылокОбработкаВыбора + + + СписокСсылокСтрокаПоиска + 344 + + СписокСсылокСтрокаПоискаРасширеннаяПодсказка + 346 + Label + true + true + + Left + + + + СписокСсылокСтрокаПоискаКонтекстноеМеню + 345 + true + + СписокСсылок + + true + + + + СписокСсылокСостояниеПросмотра + 347 + + СписокСсылокСостояниеПросмотраРасширеннаяПодсказка + 349 + Label + true + true + + Left + + + + СписокСсылокСостояниеПросмотраКонтекстноеМеню + 348 + true + + ViewStatusAddition + СписокСсылок + + true + + + + СписокСсылокУправлениеПоиском + 350 + + СписокСсылокУправлениеПоискомРасширеннаяПодсказка + 352 + Label + true + true + + Left + + + + СписокСсылокУправлениеПоискомКонтекстноеМеню + 351 + true + + SearchControlAddition + СписокСсылок + + true + + + + СписокСсылокExtendedTooltip + 287 + Label + true + true + + Left + + + + СписокСсылокКонтекстноеМеню + 19 + + СписокСсылокКонтекстноеМенюГруппа1 + 102 + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиПодбор + 134 + + <key>ru</key> + <value>Зарегистрировать изменение объекта</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиПодборExtendedTooltip + 271 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюСсылкиПодбор + Normal + Auto + true + true + UserCmds + + StdPicture.CreateListItem + + Auto + + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиОтбор + 135 + + <key>ru</key> + <value>Зарегистрировать изменения объектов при помощи отбора</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюСсылкиОтборExtendedTooltip + 272 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюСсылкиОтбор + Normal + Auto + true + true + UserCmds + Auto + + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюУдаленияОбъекта + 196 + + <key>ru</key> + <value>Зарегистрировать удаление объекта</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюДобавитьРегистрациюУдаленияОбъектаExtendedTooltip + 273 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюУдаленияОбъекта + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список ссылок контекстное меню 1</value> + + + СписокСсылокКонтекстноеМенюГруппа1ExtendedTooltip + 270 + Label + true + true + + Left + + + + + + СписокСсылокКонтекстноеМенюГруппа3 + 158 + + СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылки + 105 + + <key>ru</key> + <value>Отменить регистрацию изменений объекта</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиExtendedTooltip + 275 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюСсылки + Normal + Auto + true + true + UserCmds + + StdPicture.DeleteDirectly + + Auto + + + СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиОтбор + 189 + + <key>ru</key> + <value>Отменить регистрацию изменения объектов при помощи отбора</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюУдалитьРегистрациюСсылкиОтборExtendedTooltip + 276 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюСсылкиОтбор + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список ссылок контекстное меню 3</value> + + + СписокСсылокКонтекстноеМенюГруппа3ExtendedTooltip + 274 + Label + true + true + + Left + + + + + + СписокСсылокКонтекстноеМенюГруппа4 + 181 + + СписокСсылокКонтекстноеМенюПоказатьРезультатВыгрузки + 106 + + <key>ru</key> + <value>Показать результат выгрузки</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip + 278 + Label + true + true + + Left + + + Form.Command.ПоказатьРезультатВыгрузки + Normal + Auto + true + true + UserCmds + + Auto + + + СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах + 137 + + <key>ru</key> + <value>Регистрация на других узлах</value> + + true + true + + true + + + СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip + 279 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуРегистрацииНаУзлах + Normal + Auto + true + true + UserCmds + + StdPicture.ExchangePlan + + Auto + + + СписокСсылокКонтекстноеМенюРедактироватьНомерСообщенияОбъекта + 198 + true + true + + true + + + СписокСсылокКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip + 280 + Label + true + true + + Left + + + Form.Command.РедактироватьНомерСообщенияОбъекта + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список ссылок контекстное меню 4</value> + + + СписокСсылокКонтекстноеМенюГруппа4ExtendedTooltip + 277 + Label + true + true + + Left + + + + + + СписокСсылокКонтекстноеМенюГруппа2 + 136 + + СписокСсылокКонтекстноеМенюНайти + 159 + true + true + + true + + + СписокСсылокКонтекстноеМенюНайтиExtendedTooltip + 282 + Label + true + true + + Left + + + Form.Item.СписокСсылок.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + СписокСсылокКонтекстноеМенюОтменитьПоиск + 160 + true + true + + true + + + СписокСсылокКонтекстноеМенюОтменитьПоискExtendedTooltip + 283 + Label + true + true + + Left + + + Form.Item.СписокСсылок.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СписокСсылокКонтекстноеМенюНастройкаСписка + 161 + true + true + + true + + + СписокСсылокКонтекстноеМенюНастройкаСпискаExtendedTooltip + 284 + Label + true + true + + Left + + + Form.Item.СписокСсылок.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + + + СписокСсылокКонтекстноеМенюВывестиСписок + 162 + true + true + + true + + + СписокСсылокКонтекстноеМенюВывестиСписокExtendedTooltip + 285 + Label + true + true + + Left + + + Form.Item.СписокСсылок.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + СписокСсылокКонтекстноеМенюОбновить + 163 + true + true + + true + + + СписокСсылокКонтекстноеМенюОбновитьExtendedTooltip + 286 + Label + true + true + + Left + + + Form.Item.СписокСсылок.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список ссылок контекстное меню 2</value> + + + СписокСсылокКонтекстноеМенюГруппа2ExtendedTooltip + 281 + Label + true + true + + Left + + + + + + true + true + true + true + MultiRow +
                  true
                  + 1 + 1 + AutoUse + AutoUse + true + true + Auto + true + true + true + + СписокСсылок.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + true + ГруппаПользовательскихНастроекСсылки + +
                  + true + true + + true + + + <key>ru</key> + <value>Ссылки</value> + + + ru + Страница списка ссылок + + + СтраницаСписокСсылокExtendedTooltip + 269 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
                  + + СтраницаНаборЗаписей + 50 + + ГруппаПользовательскихНастроекНаборЗаписей + 322 + true + true + + true + + + <key>ru</key> + <value>Пользовательских настроек набор записей</value> + + + ru + Группа пользовательских настроек константы + + + ГруппаПользовательскихНастроекНаборЗаписейРасширеннаяПодсказка + 323 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СписокНаборовЗаписей + 78 + + <key>ru</key> + <value>Набор записей</value> + + true + true + + true + + + СписокНаборовЗаписей + + None + Choose + + СписокНаборовЗаписейГруппаИзмерений + 86 + true + true + + true + + + <key>ru</key> + <value>Измерения</value> + + + ru + Измерения набора записей + + + СписокНаборовЗаписейГруппаИзмеренийExtendedTooltip + 307 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокНаборовЗаписейНомерСообщения + 83 + + <key>ru</key> + <value>№ отправленного</value> + + true + true + + true + + + СписокНаборовЗаписей.НомерСообщения + + + СписокНаборовЗаписейНомерСообщенияExtendedTooltip + 308 + Label + true + true + + Left + + + + СписокНаборовЗаписейНомерСообщенияКонтекстноеМеню + 84 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокНаборовЗаписейКоманднаяПанель + 80 + Left + + + Selection + СписокНаборовЗаписейВыбор + + + ChoiceProcessing + СписокНаборовЗаписейОбработкаВыбора + + + СписокНаборовЗаписейСтрокаПоиска + 353 + + СписокНаборовЗаписейСтрокаПоискаРасширеннаяПодсказка + 355 + Label + true + true + + Left + + + + СписокНаборовЗаписейСтрокаПоискаКонтекстноеМеню + 354 + true + + СписокНаборовЗаписей + + true + + + + СписокНаборовЗаписейСостояниеПросмотра + 356 + + СписокНаборовЗаписейСостояниеПросмотраРасширеннаяПодсказка + 358 + Label + true + true + + Left + + + + СписокНаборовЗаписейСостояниеПросмотраКонтекстноеМеню + 357 + true + + ViewStatusAddition + СписокНаборовЗаписей + + true + + + + СписокНаборовЗаписейУправлениеПоиском + 359 + + СписокНаборовЗаписейУправлениеПоискомРасширеннаяПодсказка + 361 + Label + true + true + + Left + + + + СписокНаборовЗаписейУправлениеПоискомКонтекстноеМеню + 360 + true + + SearchControlAddition + СписокНаборовЗаписей + + true + + + + СписокНаборовЗаписейExtendedTooltip + 306 + Label + true + true + + Left + + + + СписокНаборовЗаписейКонтекстноеМеню + 79 + + СписокНаборовЗаписейКонтекстноеМенюГруппа1 + 164 + + СписокНаборовЗаписейКонтекстноеМенюДобавитьРегистрациюНабораЗаписейОтбор + 138 + + <key>ru</key> + <value>Зарегистрировать изменения набора записей</value> + + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюДобавитьРегистрациюНабораЗаписейОтборExtendedTooltip + 292 + Label + true + true + + Left + + + Form.Command.ДобавитьРегистрациюНабораЗаписейОтбор + Normal + Auto + true + true + UserCmds + + StdPicture.CreateListItem + + Auto + + true + true + + true + + + <key>ru</key> + <value>Список наборов записей контекстное меню группа 1</value> + + + СписокНаборовЗаписейКонтекстноеМенюГруппа1ExtendedTooltip + 291 + Label + true + true + + Left + + + + + + СписокНаборовЗаписейКонтекстноеМенюГруппа2 + 165 + + СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписей + 139 + + <key>ru</key> + <value>Отменить регистрацию изменений текущей строки</value> + + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейExtendedTooltip + 294 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюНабораЗаписей + Normal + Auto + true + true + UserCmds + + StdPicture.DeleteDirectly + + Auto + + + СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейОтбор + 140 + + <key>ru</key> + <value>Отменить регистрацию изменений при помощи отбора</value> + + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюУдалитьРегистрациюНабораЗаписейОтборExtendedTooltip + 295 + Label + true + true + + Left + + + Form.Command.УдалитьРегистрациюНабораЗаписейОтбор + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список наборов записей контекстное меню группа 2</value> + + + СписокНаборовЗаписейКонтекстноеМенюГруппа2ExtendedTooltip + 293 + Label + true + true + + Left + + + + + + СписокНаборовЗаписейКонтекстноеМенюГруппа4 + 179 + + СписокНаборовЗаписейКонтекстноеМенюПоказатьРезультатВыгрузки + 141 + + <key>ru</key> + <value>Показать результат выгрузки</value> + + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюПоказатьРезультатВыгрузкиExtendedTooltip + 297 + Label + true + true + + Left + + + Form.Command.ПоказатьРезультатВыгрузки + Normal + Auto + true + true + UserCmds + + Auto + + + СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах + 180 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлахExtendedTooltip + 298 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуРегистрацииНаУзлах + Normal + Auto + true + true + UserCmds + + StdPicture.ExchangePlan + + Auto + + + СписокНаборовЗаписейКонтекстноеМенюРедактироватьНомерСообщенияОбъекта + 199 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюРедактироватьНомерСообщенияОбъектаExtendedTooltip + 299 + Label + true + true + + Left + + + Form.Command.РедактироватьНомерСообщенияОбъекта + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список наборов записей контекстное меню группа 4</value> + + + СписокНаборовЗаписейКонтекстноеМенюГруппа4ExtendedTooltip + 296 + Label + true + true + + Left + + + + + + СписокНаборовЗаписейКонтекстноеМенюГруппа3 + 166 + + СписокНаборовЗаписейКонтекстноеМенюНайти + 167 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюНайтиExtendedTooltip + 301 + Label + true + true + + Left + + + Form.Item.СписокНаборовЗаписей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + СписокНаборовЗаписейКонтекстноеМенюОбновить + 168 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюОбновитьExtendedTooltip + 302 + Label + true + true + + Left + + + Form.Item.СписокНаборовЗаписей.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + + СписокНаборовЗаписейКонтекстноеМенюОтменитьПоиск + 169 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюОтменитьПоискExtendedTooltip + 303 + Label + true + true + + Left + + + Form.Item.СписокНаборовЗаписей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СписокНаборовЗаписейКонтекстноеМенюНастройкаСписка + 170 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюНастройкаСпискаExtendedTooltip + 304 + Label + true + true + + Left + + + Form.Item.СписокНаборовЗаписей.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + + + СписокНаборовЗаписейКонтекстноеМенюВывестиСписок + 171 + true + true + + true + + + СписокНаборовЗаписейКонтекстноеМенюВывестиСписокExtendedTooltip + 305 + Label + true + true + + Left + + + Form.Item.СписокНаборовЗаписей.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список наборов записей контекстное меню группа 3</value> + + + СписокНаборовЗаписейКонтекстноеМенюГруппа3ExtendedTooltip + 300 + Label + true + true + + Left + + + + + + HierarchicalList + true + true + true + true + true + AfterCurrentRow + MultiRow +
                  true
                  + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + true + true + true + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + true + ГруппаПользовательскихНастроекНаборЗаписей + +
                  + true + true + + true + + + <key>ru</key> + <value>Наборы записей</value> + + + ru + Страница набора записей + + + СтраницаНаборЗаписейExtendedTooltip + 290 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
                  + + СтраницаПустая + 74 + + ГруппаПустая + 77 + + ДекорацияПустаяСтраница + 75 + true + true + + true + + + ДекорацияПустаяСтраницаExtendedTooltip + 311 + Label + true + true + + Left + + + + ДекорацияПустаяСтраницаКонтекстноеМеню + 76 + true + + Label + true + true + true + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Описание</value> + + + ru + Пустое описание + + true + + ГруппаПустаяРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Итоги по виду объекта</value> + + + ru + Страница итогов + + true + + СтраницаПустаяExtendedTooltip + 309 + Label + true + true + + Left + + + Page + + Vertical + auto + false true @@ -3959,12 +4056,15 @@ <key>ru</key> - <value>Описание</value> + <value>Регистрация объектов</value> - true + + ru + Варианты списка регистрируемых объектов + - Группа4ExtendedTooltip - 310 + ВариантыСпискаОбъектовExtendedTooltip + 249 Label true true @@ -3972,15 +4072,12 @@ Left - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto + Pages + + + OnCurrentPageChange + ВариантыСпискаОбъектовПриСменеСтраницы + Auto
                  @@ -3991,16 +4088,11 @@ <key>ru</key> - <value>Итоги по виду объекта</value> + <value>Регистрируемые объекты</value> - - ru - Страница итогов - - true - СтраницаПустаяExtendedTooltip - 309 + РегистрируемыеОбъектыРасширеннаяПодсказка + 226 Label true true @@ -4008,11 +4100,13 @@ Left - Page - - Vertical - auto - false + UsualGroup + + Auto + true + true + Auto + Auto
                  true @@ -4022,15 +4116,12 @@ <key>ru</key> - <value>Регистрация объектов</value> + <value>Данные регистрации</value> - - ru - Варианты списка объектов - + true - ВариантыСпискаОбъектовExtendedTooltip - 249 + ДанныеРегистрацииРасширеннаяПодсказка + 204 Label true true @@ -4038,12 +4129,13 @@ Left - Pages - - - OnCurrentPageChange - ВариантыСпискаОбъектовПриСменеСтраницы - + UsualGroup + + Vertical + Auto + true + true + Auto Auto
                  @@ -4054,11 +4146,11 @@ <key>ru</key> - <value>Регистрируемые объекты</value> + <value>Основная</value> - Группа5ExtendedTooltip - 226 + ОсновнаяРасширеннаяПодсказка + 377 Label true true @@ -4066,13 +4158,115 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + Page + + Vertical + auto + false + +
                  + + Ожидание + 378 + + ДлительнаяОперация + 368 + + <key>ru</key> + <value>Длительная операция</value> + + true + true + + true + + + ДлительнаяОперацияExtendedTooltip + 370 + Label + true + true + + Left + + + + ДлительнаяОперацияКонтекстноеМеню + 369 + true + + true + 3 + 3 + + + CommonPicture.ДлительнаяОперация48 + + + + + СтатусДлительнойОперации + 371 + + <key>ru</key> + <value>Выполняется длительная операция. +Пожалуйста, подождите...</value> + + true + true + + true + + + СтатусДлительнойОперацииРасширеннаяПодсказка + 373 + Label + true + true + + Left + + + + СтатусДлительнойОперацииКонтекстноеМеню + 372 + true + + Label + 3 + 3 + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Ожидание</value> + + + ru + Ожидание длительной операции + + + ОжиданиеРасширеннаяПодсказка + 379 + Label + true + true + + Left + + + Page + + auto + false true @@ -4082,12 +4276,16 @@ <key>ru</key> - <value>Данные регистрации</value> + <value>Страницы</value> - true + + ru + Страницы формы + + None - Группа1ExtendedTooltip - 204 + ГруппаСтраницыРасширеннаяПодсказка + 375 Label true true @@ -4095,13 +4293,8 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto + Pages + Auto
                  @@ -4147,11 +4340,11 @@ <key>ru</key> - <value>Группа скрытых данных</value> + <value>Скрытых данных</value> ru - Группа скрытых данных + Группа скрытые данные true @@ -4731,6 +4924,124 @@ true + + ФоновоеЗаданиеАдресХранилища + + <key>ru</key> + <value>Фоновое задание адрес хранилища</value> + + 17 + + String + + + + true + + + true + + + + ФоновоеЗаданиеИдентификатор + + <key>ru</key> + <value>Фоновое задание идентификатор</value> + + 18 + + + true + + + true + + + + ФоновоеЗаданиеРезультатВыполнения + + <key>ru</key> + <value>Фоновое задание результат выполнения</value> + + 19 + + + true + + + true + + + + СообщениеОбОшибке + + <key>ru</key> + <value>Сообщение об ошибке</value> + + 20 + + String + + + + true + + + true + + + + ДлительнаяОперацияЗапущена + + <key>ru</key> + <value>Длительная операция запущена</value> + + 21 + + Boolean + + + true + + + true + + + + ВидДлительнойОперации + + <key>ru</key> + <value>Вид длительной операции</value> + + 22 + + Boolean + + + true + + + true + + + + ИмяЭтойФормы + + <key>ru</key> + <value>Имя этой формы</value> + + 23 + + String + + + + true + + + true + + ДобавитьРегистрациюСсылки @@ -4873,7 +5184,7 @@ <name>УдалитьРегистрациюАвтоОбъектов</name> <title> <key>ru</key> - <value>Удалить регистрацию только авторегиструемых объектов выбранных типов</value> + <value>Удалить регистрацию только авторегистрируемых объектов выбранных типов</value> 7 diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl index 4fef0622b..b43717304 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl @@ -24,6 +24,46 @@ #КонецОбласти +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +// Экспортный обработчик команд для подсистемы дополнительных отчетов и обработок. +// +// Параметры: +// ИдентификаторКоманды - Строка - Идентификатор команды для выполнения. +// ОбъектыНазначения - Массив - Ссылки для обработки. Здесь не используется, ожидается, что аналогичный параметр +// был передан и обработан при создании формы. +// СозданныеОбъекты - Массив - Возвращаемый массив ссылок на созданные объекты. +// В данной обработке не используется. +// +&НаКлиенте +Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты) Экспорт + + Если ИдентификаторКоманды = "ОткрытьФормуРедактированияРегистрации" Тогда + + Если ПараметрОбъектРегистрации <> Неопределено Тогда + // Используем параметры, полученные при создании на сервере. + + ПараметрыФормыРегистрации = Новый Структура; + ПараметрыФормыРегистрации.Вставить("ОбъектРегистрации", ПараметрОбъектРегистрации); + ПараметрыФормыРегистрации.Вставить("ТаблицаРегистрации", ПараметрТаблицаРегистрации); + + ОткрытьФорму(ИмяЭтойФормы + "Форма.УзлыРегистрацииОбъекта", ПараметрыФормыРегистрации); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +#КонецОбласти + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -42,7 +82,7 @@ ОткрытиеСУзломПараметром = Ложь; ТекущийОбъект = ЭтотОбъект(); - + ИмяЭтойФормы = ПолучитьИмяФормы(); // Определяем что создают Если Параметры.ДополнительнаяОбработкаСсылка = Неопределено Тогда // Запуск автономно, возможно с параметром-узлом. @@ -96,9 +136,10 @@ Если ПараметрОбъектРегистрации <> Неопределено Тогда Возврат; КонецЕсли; - + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Основная; // Список запретных объектов метаданных из параметров. Параметры.Свойство("ИменаСкрываемыхМетаданных", ИменаСкрываемыхМетаданных); + ДополнитьИменаСкрываемыхМетаданных(); ТекущаяСтрокаМетаданных = Неопределено; Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаПустая; @@ -219,7 +260,7 @@ &НаКлиенте Процедура УзелОбменаСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборУзлаПланаОбмена"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборУзлаПланаОбмена"; ТекПараметры = Новый Структура("МножественныйВыбор, НачальноеЗначениеВыбора", Ложь, УзелОбменаСсылка); ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элемент); КонецПроцедуры @@ -228,13 +269,13 @@ Процедура УзелОбменаСсылкаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если УзелОбменаСсылка <> ВыбранноеЗначение Тогда УзелОбменаСсылка = ВыбранноеЗначение; - ОбработкаВыбораУзлаОбмена(); + ПодключитьОбработчикОжидания("ОбработкаВыбораУзлаОбмена",1, Истина); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УзелОбменаСсылкаПриИзменении(Элемент) - ОбработкаВыбораУзлаОбмена(); + ОбработкаВыбораУзлаОбменаСервер(); РазвернутьДеревоМетаданных(); ОбновитьСодержимоеСтраницы(); КонецПроцедуры @@ -246,9 +287,7 @@ &НаКлиенте Процедура ВариантОтбораПоНомеруСообщенияПриИзменении(Элемент) - УстановитьОтборПоНомеруСообщения(СписокКонстант, ВариантОтбораПоНомеруСообщения); - УстановитьОтборПоНомеруСообщения(СписокСсылок, ВариантОтбораПоНомеруСообщения); - УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения); + УстановитьОтборыВДинамическихСписках(); ОбновитьСодержимоеСтраницы(); КонецПроцедуры @@ -283,10 +322,10 @@ &НаКлиенте Процедура СписокКонстантОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - Результат = ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ВыбранноеЗначение); + Результат = ДобавитьРегистрациюНаСервере(Истина, ВыбранноеЗначение); Элементы.СписокКонстант.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); - СообщитьОРезультатахРегистрации(Истина, Результат); + СообщитьОРезультатахРегистрации(Результат); Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") И ВыбранноеЗначение.Количество() > 0 Тогда Элемент.ТекущаяСтрока = ВыбранноеЗначение[0]; @@ -431,7 +470,7 @@ Данные = ПолучитьТекущийОбъектРедактирования(); Если Данные <> Неопределено Тогда ТаблицаРегистрации = ?(ТипЗнч(Данные) = Тип("Структура"), СписокНаборовЗаписейИмяТаблицы, ""); - ОткрытьФорму(ПолучитьИмяФормы() + "Форма.УзлыРегистрацииОбъекта", + ОткрытьФорму(ИмяЭтойФормы + "Форма.УзлыРегистрацииОбъекта", Новый Структура("ОбъектРегистрации, ТаблицаРегистрации, ОповещатьОбИзменениях", Данные, ТаблицаРегистрации, Истина), ЭтотОбъект); КонецЕсли; @@ -489,7 +528,7 @@ Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.НомераСообщенийУзлаПланаОбмена"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.НомераСообщенийУзлаПланаОбмена"; ТекПараметры = Новый Структура("УзелОбменаСсылка, Имя", УзелОбменаСсылка); ЗаполнитьЗначенияСвойств(ТекПараметры, ТекущийЭлемент); @@ -730,34 +769,6 @@ КонецПроцедуры // -// Экспортный обработчик команд для подсистемы дополнительных отчетов и обработок. -// -// Параметры: -// ИдентификаторКоманды - Строка - Идентификатор команды для выполнения. -// ОбъектыНазначения - Массив - Ссылки для обработки. Здесь не используется, ожидается, что аналогичный параметр -// был передан и обработан при создании формы. -// СозданныеОбъекты - Массив - Возвращаемый массив ссылок на созданные объекты. -// В данной обработке не используется. -// -&НаКлиенте -Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты) Экспорт - - Если ИдентификаторКоманды = "ОткрытьФормуРедактированияРегистрации" Тогда - - Если ПараметрОбъектРегистрации <> Неопределено Тогда - // Используем параметры, полученные при создании на сервере. - - ПараметрыФормыРегистрации = Новый Структура; - ПараметрыФормыРегистрации.Вставить("ОбъектРегистрации", ПараметрОбъектРегистрации); - ПараметрыФормыРегистрации.Вставить("ТаблицаРегистрации", ПараметрТаблицаРегистрации); - - ОткрытьФорму(ПолучитьИмяФормы() + "Форма.УзлыРегистрацииОбъекта", ПараметрыФормыРегистрации); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - // Обработчик оповещения продолжения диалога. &НаКлиенте Процедура ЗарегистрироватьИОМЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт @@ -766,7 +777,7 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(Истина, ЗарегистрироватьИОМИПредопределенныеНаСервере() ); + СообщитьОРезультатахРегистрации(ЗарегистрироватьИОМИПредопределенныеНаСервере() ); ЗаполнитьКоличествоРегистрацийВДереве(); ОбновитьСодержимоеСтраницы(); @@ -779,12 +790,17 @@ Возврат КонецЕсли; ВыбранноеЗначение = ДополнительныеПараметры.ВыбранноеЗначение; - - СообщитьОРезультатахРегистрации(ВыбранноеЗначение.ДействиеВыбора, - ИзменитьРегистрациюРезультатаЗапросаСервер(ВыбранноеЗначение.ДействиеВыбора, ВыбранноеЗначение.ДанныеВыбора)); + Если Объект.ДоступнаРегистрацияАсинхронно Тогда + ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(ВыбранноеЗначение.ДействиеВыбора, + ДополнительныеПараметры.БезУчетаАвторегистрации, Неопределено); + ПараметрыФоновогоЗадания.Вставить("ДанныеАдрес", ВыбранноеЗначение.ДанныеВыбора); + ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания); + Иначе + СообщитьОРезультатахРегистрации(ИзменитьРегистрациюРезультатаЗапросаСервер(ВыбранноеЗначение.ДействиеВыбора, ВыбранноеЗначение.ДанныеВыбора)); - ЗаполнитьКоличествоРегистрацийВДереве(); - ОбновитьСодержимоеСтраницы(); + ЗаполнитьКоличествоРегистрацийВДереве(); + ОбновитьСодержимоеСтраницы(); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -811,8 +827,7 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(НомерСообщения, - ИзменитьНомерСообщенияНаСервере(УзелОбменаСсылка, НомерСообщения, ДополнительныеПараметры.МетаПолноеИмя)); + СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере(НомерСообщения, ДополнительныеПараметры.МетаПолноеИмя)); Элементы.СписокКонстант.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); @@ -842,8 +857,7 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(НомерСообщения, - ИзменитьНомерСообщенияНаСервере(УзелОбменаСсылка, НомерСообщения, ДополнительныеПараметры.Ссылка)); + СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере(НомерСообщения, ДополнительныеПараметры.Ссылка)); Элементы.СписокСсылок.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); @@ -880,8 +894,8 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(НомерСообщения, ИзменитьНомерСообщенияНаСервере( - УзелОбменаСсылка, НомерСообщения, ДополнительныеПараметры.ДанныеСтроки, СписокНаборовЗаписейИмяТаблицы)); + СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере( + НомерСообщения, ДополнительныеПараметры.ДанныеСтроки, СписокНаборовЗаписейИмяТаблицы)); Элементы.СписокНаборовЗаписей.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); @@ -911,8 +925,13 @@ Элементы.ФормаРедактироватьНомераСообщений.Заголовок = Текст; КонецПроцедуры -&НаСервере +&НаКлиенте Процедура ОбработкаВыбораУзлаОбмена() + ОбработкаВыбораУзлаОбменаСервер(); +КонецПроцедуры + +&НаСервере +Процедура ОбработкаВыбораУзлаОбменаСервер() // Изменяем номера узлов в гиперссылке по редактированию. УстановитьЗаголовокНомеровСообщений(); @@ -941,8 +960,8 @@ КонецПроцедуры &НаКлиенте -Процедура СообщитьОРезультатахРегистрации(Команда, Результаты) - +Процедура СообщитьОРезультатахРегистрации(Результаты) + Команда = Результаты.Команда; Если ТипЗнч(Команда) = Тип("Булево") Тогда Если Команда Тогда ЗаголовокПредупреждения = НСтр("ru = 'Регистрация изменений:'"); @@ -1007,7 +1026,7 @@ &НаКлиенте Процедура ДобавитьРегистрациюКонстантыВСписке() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборКонстанты"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборКонстанты"; ТекПараметры = Новый Структура(); ТекПараметры.Вставить("УзелОбмена",УзелОбменаСсылка); ТекПараметры.Вставить("МассивИменМетаданных",СтруктураИменМетаданных.Константы); @@ -1057,8 +1076,7 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(Ложь, - УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ДополнительныеПараметры.СписокИмен)); + СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.СписокИмен)); Элементы.СписокКонстант.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); @@ -1093,7 +1111,7 @@ &НаКлиенте Процедура ДобавитьРегистрациюВСписокОтбор() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором"; ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Истина, СписокСсылокИмяТаблицы); @@ -1102,7 +1120,7 @@ &НаКлиенте Процедура УдалитьРегистрациюВСпискеОтбор() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором"; ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Ложь, СписокСсылокИмяТаблицы); @@ -1148,8 +1166,7 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(Ложь, - УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ДополнительныеПараметры.СписокУдаления)); + СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.СписокУдаления)); Элементы.СписокСсылок.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); @@ -1157,7 +1174,7 @@ &НаКлиенте Процедура ДобавитьРегистрациюВНаборЗаписейОтбор() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором"; ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Истина, СписокНаборовЗаписейИмяТаблицы); @@ -1199,7 +1216,7 @@ &НаКлиенте Процедура УдалитьРегистрациюВНабореЗаписейОтбор() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором"; ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Ложь, СписокНаборовЗаписейИмяТаблицы); @@ -1218,7 +1235,7 @@ Текст = НСтр("ru = 'Зарегистрировать %1 для выгрузки на узле ""%2""? | - |Изменение регистрации большого количества объектов может занять продолжительное время!'"); + |Изменение регистрации большого количества объектов может занять продолжительное время.'"); Текст = СтрЗаменить(Текст, "%1", Данные.Описание); Текст = СтрЗаменить(Текст, "%2", УзелОбменаСсылка); @@ -1238,13 +1255,18 @@ Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; - - Результат = ДобавитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, - УзелОбменаСсылка, ДополнительныеПараметры.МетаИмена); - - ЗаполнитьКоличествоРегистрацийВДереве(); - ОбновитьСодержимоеСтраницы(); - СообщитьОРезультатахРегистрации(Истина, Результат); + Если Объект.ДоступнаРегистрацияАсинхронно Тогда + ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Истина, ДополнительныеПараметры.БезУчетаАвторегистрации, + ДополнительныеПараметры.МетаИмена); + ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания); + Иначе + Результат = ДобавитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, + ДополнительныеПараметры.МетаИмена); + + ЗаполнитьКоличествоРегистрацийВДереве(); + ОбновитьСодержимоеСтраницы(); + СообщитьОРезультатахРегистрации(Результат); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -1258,7 +1280,7 @@ Текст = НСтр("ru = 'Отменить регистрацию %1 для выгрузки на узле ""%2""? | - |Изменение регистрации большого количества объектов может занять продолжительное время!'"); + |Изменение регистрации большого количества объектов может занять продолжительное время.'"); ЗаголовокВопроса = НСтр("ru = 'Подтверждение'"); @@ -1279,14 +1301,163 @@ Возврат; КонецЕсли; - СообщитьОРезультатахРегистрации(Ложь, - УдалитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, - УзелОбменаСсылка, ДополнительныеПараметры.МетаИмена)); - - ЗаполнитьКоличествоРегистрацийВДереве(); - ОбновитьСодержимоеСтраницы(); + Если Объект.ДоступнаРегистрацияАсинхронно Тогда + ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Ложь, ДополнительныеПараметры.БезУчетаАвторегистрации, + ДополнительныеПараметры.МетаИмена); + ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания); + Иначе + СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, + ДополнительныеПараметры.МетаИмена)); + + ЗаполнитьКоличествоРегистрацийВДереве(); + ОбновитьСодержимоеСтраницы(); + КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания) + ДлительнаяОперацияЗапущена = Истина; + ВидДлительнойОперации = ?(ПараметрыФоновогоЗадания.Команда, Истина, Ложь); + ПодключитьОбработчикОжидания("СтраницаДлительнойОперации",1,Истина); + Результат = ФоновоеЗаданиеЗапуститьНаСервере(ПараметрыФоновогоЗадания); + Если Результат = Неопределено Тогда + ДлительнаяОперацияЗапущена = Ложь; + ТекстПредупреждения = НСтр("ru='При запуске фонового задания с целью изменения регистрации произошла ошибка.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + КонецЕсли; + ОбщийМодульДлительныеОперацииКлиент = ОбщийМодуль("ДлительныеОперацииКлиент"); + Если Результат.Статус = "Выполняется" Тогда + ПараметрыОжидания = ОбщийМодульДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ПараметрыОжидания.ВыводитьСообщения = Истина; + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗавершениеФоновогоЗадания", ЭтотОбъект); + ОбщийМодульДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания); + Иначе + ФоновоеЗаданиеРезультатВыполнения = Результат; + ПодключитьОбработчикОжидания("РезультатВыполненияФоновогоЗадания", 1, Истина); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СтраницаДлительнойОперации() + Если НЕ ДлительнаяОперацияЗапущена Тогда + Возврат; + КонецЕсли; + Если ВидДлительнойОперации Тогда + СтатусОперации = НСтр("ru='Выполняется регистрация изменений. Пожалуйста, подождите.'"); + Иначе + СтатусОперации = НСтр("ru='Выполняется отмена регистрации изменений. Пожалуйста, подождите.'"); + КонецЕсли; + Элементы.СтатусДлительнойОперации.Заголовок = СтатусОперации; + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Ожидание; +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеФоновогоЗадания(Результат, ДополнительныеПараметры) Экспорт + + ФоновоеЗаданиеРезультатВыполнения = Результат; + РезультатВыполненияФоновогоЗадания(); + +КонецПроцедуры + +&НаКлиенте +Процедура РезультатВыполненияФоновогоЗадания() + ФоновоеЗаданиеПолучитьРезультатНаСервере(); + ДлительнаяОперацияЗапущена = Ложь; + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Основная; + Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = СообщениеОбОшибке; + Сообщение.Сообщить(); + КонецЕсли; + Если ФоновоеЗаданиеРезультатВыполнения.Свойство("ДополнительныеДанныеРезультата") + И ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата.Свойство("Команда") Тогда + СообщитьОРезультатахРегистрации(ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата); + ЗаполнитьКоличествоРегистрацийВДереве(); + ОбновитьСодержимоеСтраницы(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ФоновоеЗаданиеЗапуститьНаСервере(ПараметрыФоновогоЗадания) + МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); + ПараметрыВыполнения = МодульДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.ДополнительныйРезультат = Ложь; + + Если ПараметрыФоновогоЗадания.Свойство("ДанныеАдрес") Тогда + // Передан адрес хранения данных. + Результат = ПолучитьИзВременногоХранилища(ПараметрыФоновогоЗадания.ДанныеАдрес); + Результат= Результат[Результат.ВГраница()]; + Данные = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"); + ПараметрыФоновогоЗадания.Вставить("Данные", Данные); + КонецЕсли; + ИмяПроцедуры = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя() + ".МодульОбъекта.ВыполнитьИзменениеРегистрации"; + Результат = МодульДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыФоновогоЗадания, ПараметрыВыполнения); + ФоновоеЗаданиеИдентификатор = Результат.ИдентификаторЗадания; + ФоновоеЗаданиеАдресХранилища = Результат.АдресРезультата; + Возврат Результат; +КонецФункции + +&НаСервере +Процедура ФоновоеЗаданиеПолучитьРезультатНаСервере() + ФоновоеЗаданиеРезультатВыполнения.Вставить("ДополнительныеДанныеРезультата", Новый Структура()); + СообщениеОбОшибке = ""; + ТиповоеПредставлениеОшибки = НСтр("ru='При изменении регистрации произошла ошибка. Подробности см. в журнале регистрации'"); + Если ФоновоеЗаданиеРезультатВыполнения.Статус = "Ошибка" Тогда + СообщениеОбОшибке = ФоновоеЗаданиеРезультатВыполнения.ПодробноеПредставлениеОшибки; + Иначе + + РезультатВыполненияВФоне = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища); + + Если РезультатВыполненияВФоне = Неопределено Тогда + СообщениеОбОшибке = ТиповоеПредставлениеОшибки; + Иначе + ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата = РезультатВыполненияВФоне; + УдалитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища); + КонецЕсли; + КонецЕсли; + ФоновоеЗаданиеАдресХранилища = Неопределено; + ФоновоеЗаданиеИдентификатор = Неопределено; +КонецПроцедуры + +// Возвращает ссылку на общий модуль по имени. +// +// Параметры: +// Имя - Строка - имя общего модуля, например: +// "ОбщегоНазначения", +// "ОбщегоНазначенияКлиент". +// +// Возвращаемое значение: +// ОбщийМодуль. +// +&НаКлиентеНаСервереБезКонтекста +Функция ОбщийМодуль(Имя) + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда + Модуль = Вычислить(Имя); + Иначе + Модуль = Неопределено; + КонецЕсли; + + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение СтрЗаменить(НСтр("ru = 'Общий модуль ""%1"" не найден.'"),"%1", Имя); + КонецЕсли; +#Иначе + Модуль = Вычислить(Имя); +#Если НЕ ВебКлиент Тогда + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение СтрЗаменить(НСтр("ru = 'Общий модуль ""%1"" не найден.'"),"%1", Имя); + КонецЕсли; +#КонецЕсли +#КонецЕсли + + Возврат Модуль; + +КонецФункции + &НаКлиенте Процедура ОбработкаВыбораДанных(ТаблицаФормы, ВыбранноеЗначение) @@ -1294,6 +1465,12 @@ Тип = ТипЗнч(ВыбранноеЗначение); Если Тип = Тип("Структура") Тогда + Если Не (ВыбранноеЗначение.Свойство("ИмяТаблицы") + И ВыбранноеЗначение.Свойство("ДействиеВыбора") + И ВыбранноеЗначение.Свойство("ДанныеВыбора")) Тогда + // Ожидаем структуру в заданном формате. + Возврат; + КонецЕсли; ИмяТаблицы = ВыбранноеЗначение.ИмяТаблицы; Действие = ВыбранноеЗначение.ДействиеВыбора; Данные = ВыбранноеЗначение.ДанныеВыбора; @@ -1313,11 +1490,11 @@ КонецЕсли; Если Действие Тогда - Результат = ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные, ИмяТаблицы); + Результат = ДобавитьРегистрациюНаСервере(Истина, Данные, ИмяТаблицы); ТаблицаФормы.Обновить(); ЗаполнитьКоличествоРегистрацийВДереве(); - СообщитьОРезультатахРегистрации(Действие, Результат); + СообщитьОРезультатахРегистрации(Результат); ТаблицаФормы.ТекущаяСтрока = Ссылка; Возврат; @@ -1352,12 +1529,17 @@ Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; + Если Объект.ДоступнаРегистрацияАсинхронно Тогда + ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Ложь, Истина, ДополнительныеПараметры.Данные, + ДополнительныеПараметры.ИмяТаблицы); + ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания); + Иначе + Результат = УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.Данные, ДополнительныеПараметры.ИмяТаблицы); - Результат = УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ДополнительныеПараметры.Данные, ДополнительныеПараметры.ИмяТаблицы); - - ДополнительныеПараметры.ТаблицаФормы.Обновить(); - ЗаполнитьКоличествоРегистрацийВДереве(); - СообщитьОРезультатахРегистрации(ДополнительныеПараметры.Действие, Результат); + ДополнительныеПараметры.ТаблицаФормы.Обновить(); + ЗаполнитьКоличествоРегистрацийВДереве(); + СообщитьОРезультатахРегистрации(Результат); + КонецЕсли; ДополнительныеПараметры.ТаблицаФормы.ТекущаяСтрока = ДополнительныеПараметры.Ссылка; КонецПроцедуры @@ -1422,7 +1604,7 @@ &НаКлиенте Процедура ОткрытьФормуНастроекОбработки() - ТекИмяФормы = ПолучитьИмяФормы() + "Форма.Настройки"; + ТекИмяФормы = ИмяЭтойФормы + "Форма.Настройки"; ОткрытьФорму(ТекИмяФормы, , ЭтотОбъект); КонецПроцедуры @@ -1611,10 +1793,10 @@ Данные = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"); Если Команда Тогда - Возврат ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные); + Возврат ДобавитьРегистрациюНаСервере(Истина, Данные); КонецЕсли; - - Возврат УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные); + + Возврат УдалитьРегистрациюНаСервере(Истина, Данные); КонецФункции &НаСервере @@ -1826,8 +2008,7 @@ Если Строка <> Неопределено Тогда ТекстКоличеств = НСтр("ru = 'Зарегистрировано объектов: %1 |Выгружено объектов: %2 - |Не выгружено объектов: %3 - |'"); + |Не выгружено объектов: %3'"); ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%1", Формат(Строка.КоличествоИзменений, "ЧДЦ=0; ЧН=")); ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%2", Формат(Строка.КоличествоВыгруженных, "ЧДЦ=0; ЧН=")); @@ -2018,18 +2199,21 @@ КонецФункции &НаСервере -Функция УдалитьРегистрациюНаСервере(БезУчетаАвторегистрации, Узел, Удаляемые, ИмяТаблицы = Неопределено) - Возврат ЭтотОбъект().ИзменитьРегистрациюНаСервере(Ложь, БезУчетаАвторегистрации, Узел, Удаляемые, ИмяТаблицы); +Функция УдалитьРегистрациюНаСервере(БезУчетаАвторегистрации, Удаляемые, ИмяТаблицы = Неопределено) + ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(Ложь, БезУчетаАвторегистрации, Удаляемые, ИмяТаблицы); + Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации); КонецФункции &НаСервере -Функция ДобавитьРегистрациюНаСервере(БезУчетаАвторегистрации, Узел, Добавляемые, ИмяТаблицы = Неопределено) - Возврат ЭтотОбъект().ИзменитьРегистрациюНаСервере(Истина, БезУчетаАвторегистрации, Узел, Добавляемые, ИмяТаблицы); +Функция ДобавитьРегистрациюНаСервере(БезУчетаАвторегистрации, Добавляемые, ИмяТаблицы = Неопределено) + ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(Истина, БезУчетаАвторегистрации, Добавляемые, ИмяТаблицы); + Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации); КонецФункции &НаСервере -Функция ИзменитьНомерСообщенияНаСервере(Узел, НомерСообщения, Данные, ИмяТаблицы = Неопределено) - Возврат ЭтотОбъект().ИзменитьРегистрациюНаСервере(НомерСообщения, Истина, Узел, Данные, ИмяТаблицы); +Функция ИзменитьНомерСообщенияНаСервере(НомерСообщения, Данные, ИмяТаблицы = Неопределено) + ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(НомерСообщения, Истина, Данные, ИмяТаблицы); + Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации); КонецФункции &НаСервере @@ -2221,18 +2405,23 @@ КонецЕсли; Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда - ОбработкаВыбораУзлаОбмена(); + ОбработкаВыбораУзлаОбменаСервер(); КонецЕсли; ОбработатьЗапретИзмененияУзла(); // Зависимость настроек - УстановитьОтборПоНомеруСообщения(СписокКонстант, ВариантОтбораПоНомеруСообщения); - УстановитьОтборПоНомеруСообщения(СписокСсылок, ВариантОтбораПоНомеруСообщения); - УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения); + УстановитьОтборыВДинамическихСписках(); Возврат Результат; КонецФункции +&НаСервере +Процедура УстановитьОтборыВДинамическихСписках() + УстановитьОтборПоНомеруСообщения(СписокКонстант, ВариантОтбораПоНомеруСообщения); + УстановитьОтборПоНомеруСообщения(СписокСсылок, ВариантОтбораПоНомеруСообщения); + УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения); +КонецПроцедуры + &НаСервере Функция СтруктураКлючаНабораЗаписей(Знач ТекущиеДанные) @@ -2323,6 +2512,30 @@ КонецФункции +&НаСервере +Функция ПодготовитьПараметрыИзмененияРегистрации(Команда, БезУчетаАвторегистрации, Данные, ИмяТаблицы = Неопределено) + Результат = Новый Структура(); + Результат.Вставить("Команда", Команда); + Результат.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации); + Результат.Вставить("Узел", УзелОбменаСсылка); + Результат.Вставить("Данные", Данные); + Результат.Вставить("ИмяТаблицы", ИмяТаблицы); + Результат.Вставить("ДоступнаРегистрацияСредствамиБСП", Объект.ДоступнаРегистрацияСредствамиБСП); + Результат.Вставить("ДоступнаРаботаРИБ", Объект.ДоступнаРаботаРИБ); + Результат.Вставить("НастройкаКонтрольВыгрузкиОбъектов", Объект.НастройкаКонтрольВыгрузкиОбъектов); + Возврат Результат; +КонецФункции - +&НаСервере +Процедура ДополнитьИменаСкрываемыхМетаданных() + // Скрываются регистры у которых есть измерение Узел + Для Каждого РегистрСведенийМетаданные Из Метаданные.РегистрыСведений Цикл + Для Каждого ИзмерениеРегистра Из Метаданные.РегистрыСведений[РегистрСведенийМетаданные.Имя].Измерения Цикл + Если НРег(ИзмерениеРегистра.Имя) = "узел" Тогда + ИменаСкрываемыхМетаданных.Добавить("РегистрСведений." + РегистрСведенийМетаданные.Имя); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl index 3b90f4498..584b4b566 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl @@ -217,7 +217,7 @@ // ** Наименование - Строка - Представление вида объекта метаданных. // ** МетаПолноеИмя - Строка - Полное имя объекта метаданных. // ** ИндексКартинки - Число - Зависит от метаданных. -// ** Пометка - Неопределено. +// ** Пометка - Неопределено - далее используется для хранения пометок // ** ИдентификаторСтроки - Число - Индекс добавленной строки (обход дерева сверху вниз слева направо). // ** Авторегистрация - Булево - Если указан ИмяПланаОбмена, то для листьев: 1-разрешена, // 2-запрещена. Иначе Неопределено. @@ -294,9 +294,9 @@ // ТаблицаЗначений - колонки: // * МетаПолноеИмя - Строка - Полное имя метаданных, для которых рассчитываем количество. // * УзелОбмена - ПланОбменаСсылка - Ссылка на узел обмена, для которого рассчитываем количество. -// * КоличествоИзменений - Число. -// * КоличествоВыгруженных - Число. -// * КоличествоНеВыгруженных - Число. +// * КоличествоИзменений - Число - содержит общее количество изменений. +// * КоличествоВыгруженных - Число - содержит количество выгруженных изменений. +// * КоличествоНеВыгруженных - Число - содержит количество не выгруженных изменений. // Функция ПолучитьКоличествоИзменений(СписокТаблиц, СписокУзлов) Экспорт @@ -437,163 +437,106 @@ Возврат ПланыОбмена.ИзменениеЗарегистрировано(Узел, ТекущийОбъект); КонецФункции -// Изменяет регистрацию переданного. +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +// Служебное для регистрации в подключаемых обработках. // +// Возвращаемое значение: +// Структура - содержит сведения об обработке. +// +Функция СведенияОВнешнейОбработке() Экспорт + + Инфо = Новый Структура; + + Инфо.Вставить("Вид", "СозданиеСвязанныхОбъектов"); + Инфо.Вставить("Команды", Новый ТаблицаЗначений); + Инфо.Вставить("БезопасныйРежим", Истина); + Инфо.Вставить("Назначение", Новый Массив); + + Инфо.Вставить("Наименование", НСтр("ru = 'Регистрация изменений для обмена данными'")); + Инфо.Вставить("Версия", "1.0"); + Инфо.Вставить("ВерсияБСП", "1.2.1.4"); + Инфо.Вставить("Информация", НСтр("ru = 'Обработка для управления регистрацией объектов на узлах обмена до формирования выгрузки. При работе в составе конфигурации с БСП версии 2.1.2.0 и старше производит контроль ограничений миграции данных для узлов обмена.'")); + + Инфо.Назначение.Добавить("ПланыОбмена.*"); + Инфо.Назначение.Добавить("Константы.*"); + Инфо.Назначение.Добавить("Справочники.*"); + Инфо.Назначение.Добавить("Документы.*"); + Инфо.Назначение.Добавить("Последовательности.*"); + Инфо.Назначение.Добавить("ПланыВидовХарактеристик.*"); + Инфо.Назначение.Добавить("ПланыСчетов.*"); + Инфо.Назначение.Добавить("ПланыВидовРасчета.*"); + Инфо.Назначение.Добавить("РегистрыСведений.*"); + Инфо.Назначение.Добавить("РегистрыНакопления.*"); + Инфо.Назначение.Добавить("РегистрыБухгалтерии.*"); + Инфо.Назначение.Добавить("РегистрыРасчета.*"); + Инфо.Назначение.Добавить("БизнесПроцессы.*"); + Инфо.Назначение.Добавить("Задачи.*"); + + Колонки = Инфо.Команды.Колонки; + ТипСтрока = Новый ОписаниеТипов("Строка"); + Колонки.Добавить("Представление", ТипСтрока); + Колонки.Добавить("Идентификатор", ТипСтрока); + Колонки.Добавить("Использование", ТипСтрока); + Колонки.Добавить("Модификатор", ТипСтрока); + Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); + + // Единственная команда, что делать - определяем по типу переданного. + Команда = Инфо.Команды.Добавить(); + Команда.Представление = НСтр("ru = 'Редактирование регистрации изменений объекта'"); + Команда.Идентификатор = "ОткрытьФормуРедактированияРегистрации"; + Команда.Использование = "ВызовКлиентскогоМетода"; + + Возврат Инфо; +КонецФункции + +// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Запускает изменение регистрации в соответствии с переданными параметрами. // Параметры: -// Команда - Булево - Истина, если надо добавлять, Ложь, если удалять. -// БезУчетаАвторегистрации - Булево - Истина, если не надо анализировать флаг авторегистрации. -// Узел - ПланОбменаСсылка - Ссылка на узел плана обмена. -// Данные - ЛюбаяСсылка, Строка, Структура - данные или массив таких данных. -// ИмяТаблицы - Строка - Если Данные является структурой, то содержит имя таблицы. +// ПараметрыЗадания - Структура - Параметры для изменения регистрации +// * Команда - Булево - Истина, если надо добавлять, Ложь, если удалять. +// * БезУчетаАвторегистрации - Булево - Истина, если не надо анализировать флаг авторегистрации. +// * Узел - ПланОбменаСсылка - Ссылка на узел плана обмена. +// * Данные - ЛюбаяСсылка, Строка, Структура - данные или массив таких данных. +// * ИмяТаблицы - Строка - Если Данные является структурой, то содержит имя таблицы. +// АдресХранилища - Произвольный - Адрес временного хранилища для сохранения результата при запуске в фоновом задании. // // Возвращаемое значение: // Структура - результат операции: // * Всего - Число - общее число объектов. // * Успешно - Число - числом успешно обработанных объектов. +// * Команда - Значение входящего параметра Команда для упрощения обработки результатов. // -Функция ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Данные, ИмяТаблицы = Неопределено) Экспорт - - ПрочитатьНастройки(); - Результат = Новый Структура("Всего, Успешно", 0, 0); - - // Только при добавлении и работе в составе БСП. - НадоФильтрБСП = ТипЗнч(Команда) = Тип("Булево") И Команда И КонфигурацияПоддерживаетБСП И НастройкаКонтрольВыгрузкиОбъектов; - - Если ТипЗнч(Данные) = Тип("Массив") Тогда - ДанныеРегистрации = Данные; - Иначе - ДанныеРегистрации = Новый Массив; - ДанныеРегистрации.Добавить(Данные); +Функция ВыполнитьИзменениеРегистрации(ПараметрыЗадания, АдресХранилища = Неопределено) Экспорт + ИмяТаблицы = Неопределено; + ПараметрыЗадания.Свойство("ИмяТаблицы", ИмяТаблицы); + ДоступнаРегистрацияСредствамиБСП = ПараметрыЗадания.ДоступнаРегистрацияСредствамиБСП; + ДоступнаРаботаРИБ = ПараметрыЗадания.ДоступнаРаботаРИБ; + НастройкаКонтрольВыгрузкиОбъектов = ПараметрыЗадания.НастройкаКонтрольВыгрузкиОбъектов; + РезультатВыполнения = ИзменитьРегистрациюНаСервере(ПараметрыЗадания.Команда, ПараметрыЗадания.БезУчетаАвторегистрации, + ПараметрыЗадания.Узел, ПараметрыЗадания.Данные, ИмяТаблицы); + Если АдресХранилища <> Неопределено Тогда + ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища); КонецЕсли; - - Для Каждого Элемент Из ДанныеРегистрации Цикл - - Тип = ТипЗнч(Элемент); - Значения = Новый Массив; - - Если Элемент = Неопределено Тогда - // Вся конфигурация - - Если ТипЗнч(Команда) = Тип("Булево") И Команда Тогда - // Добавляем регистрацию по частям. - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Константы", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Справочники", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Документы", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Последовательности", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыВидовХарактеристик", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыСчетов", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыВидовРасчета", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыСведений", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыНакопления", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыБухгалтерии", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыРасчета", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "БизнесПроцессы", ИмяТаблицы) ); - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Задачи", ИмяТаблицы) ); - Продолжить; - КонецЕсли; - - // Удаление регистрации - платформенным методом. - Значения.Добавить(Неопределено); - - ИначеЕсли Тип = Тип("Строка") Тогда - // Метаданные, возможно как коллекция, так и конкретный вид, на авторегистрацию смотрим. - Описание = ХарактеристикиПоМетаданным(Элемент); - Если НадоФильтрБСП Тогда - ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийМетаданных(Узел, Описание, БезУчетаАвторегистрации) ); - Продолжить; - - ИначеЕсли БезУчетаАвторегистрации Тогда - Если Описание.ЭтоКоллекция Тогда - Для Каждого Мета Из Описание.Метаданные Цикл - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Мета.ПолноеИмя(), ИмяТаблицы) ); - КонецЦикла; - Продолжить; - Иначе - Мета = Описание.Метаданные; - ЭлементСостава = Узел.Метаданные().Состав.Найти(Мета); - Если ЭлементСостава = Неопределено Тогда - Продолжить; - КонецЕсли; - // Константа? - Значения.Добавить(Описание.Метаданные); - КонецЕсли; - - Иначе - // Отсеиваем неподходящие по авторегистрации. - Если Описание.ЭтоКоллекция Тогда - // Регистрируем поодиночке - Для Каждого Мета Из Описание.Метаданные Цикл - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Мета.ПолноеИмя(), ИмяТаблицы) ); - КонецЦикла; - Продолжить; - Иначе - Мета = Описание.Метаданные; - ЭлементСостава = Узел.Метаданные().Состав.Найти(Мета); - Если ЭлементСостава = Неопределено Или ЭлементСостава.Авторегистрация <> АвтоРегистрацияИзменений.Разрешить Тогда - Продолжить; - КонецЕсли; - // Константа? - Значения.Добавить(Описание.Метаданные); - КонецЕсли; - КонецЕсли; - - // Смотрим опциональные варианты, Значения[0] - метаданные конкретного вида с именем "Элемент". - Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации) Цикл - Значения.Добавить(ТекЭлемент); - КонецЦикла; - - ИначеЕсли Тип = Тип("Структура") Тогда - // Это или конкретный набор записей, или результат выбора ссылочного типа отбором. - Описание = ХарактеристикиПоМетаданным(ИмяТаблицы); - Если Описание.ЭтоСсылка Тогда - ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Элемент.Ссылка) ); - Продолжить; - КонецЕсли; - // Конкретный набор записей, на авторегистрацию уже не смотрим. - Если НадоФильтрБСП Тогда - ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийНабора(Узел, Элемент, Описание) ); - Продолжить; - КонецЕсли; - - Набор = Описание.Менеджер.СоздатьНаборЗаписей(); - Для Каждого КлючЗначение Из Элемент Цикл - Набор.Отбор[КлючЗначение.Ключ].Установить(КлючЗначение.Значение); - КонецЦикла; - Значения.Добавить(Набор); - // Смотрим опциональные варианты. - Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации, ИмяТаблицы) Цикл - Значения.Добавить(ТекЭлемент); - КонецЦикла; - - Иначе - // Конкретная ссылка, на авторегистрацию уже не смотрим. - Если НадоФильтрБСП Тогда - ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийСсылки(Узел, Элемент) ); - Продолжить; - - КонецЕсли; - Значения.Добавить(Элемент); - // Смотрим опциональные варианты. - Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации) Цикл - Значения.Добавить(ТекЭлемент); - КонецЦикла; - - КонецЕсли; - - // Собственно регистрация, уже без фильтра. - Для Каждого ТекЗначение Из Значения Цикл - ВыполнитьКомандуРегистрацииОбъекта(Команда, Узел, ТекЗначение); - Результат.Успешно = Результат.Успешно + 1; - Результат.Всего = Результат.Всего + 1; - КонецЦикла; - - КонецЦикла; // Перебор объектов в массиве данных для регистрации. - - Возврат Результат; + Возврат РезультатВыполнения; КонецФункции // Возвращает начало полного имени формы для открытия по переданному объекту. // +// Параметры: +// ТекущийОбъект - Строка или ДинамическийСписок, для которого необходимо получить имя формы. +// Возвращаемое значение: +// Строка - полное имя формы. +// Функция ПолучитьИмяФормы(ТекущийОбъект = Неопределено) Экспорт Тип = ТипЗнч(ТекущийОбъект); @@ -661,6 +604,8 @@ // Параметры: // Ссылка - ПланОбменаСсылка - Ссылка на узел обмена. // Данные - Строка - Список имен реквизитов для чтения через запятую. +// Поле - ПолеФормы - передается поле формы, содержащее номер принятого сообщения. +// Значение - Произвольный - используется в форме для вывода предупреждения при открытии формы. // // Возвращаемое значение: // Структура - считанные данные. @@ -720,7 +665,17 @@ // Возвращает описание данных по имени таблицы/полному имени метаданных или метаданным. // // Параметры: -// - ИмяТаблицы - Строка - Имя таблицы, например "Справочник.Валюты". +// - ИмяТаблицыМетаданных - Строка - Имя таблицы, например "Справочник.Валюты". +// +// Возвращаемое значение: +// Структура - описание данных в виде набора значений. Содержит следующие данные. +// ЭтоПоследовательность - Булево - признак последовательности. +// ЭтоКоллекция - Булево - признак коллекции значений. +// ЭтоКонстанта - Булево - признак константы. +// ЭтоСсылка - Булево - признак ссылочного типа данных. +// ЭтоНабор - Булево - признак набора записей регистра +// Менеджер - МенеджерЗначения - менеджер значения таблицы. +// ИмяТаблицы - Строка - имя таблицы. // Функция ХарактеристикиПоМетаданным(ИмяТаблицыМетаданных) Экспорт @@ -1071,6 +1026,9 @@ // Параметры: // - ОбъектПредставления - ЛюбаяСсылка - представление которого получаем. // +// Возвращаемое значение: +// Строка - представление объекта. +// Функция ПредставлениеСсылки(ОбъектПредставления) Экспорт Если ТипЗнч(ОбъектПредставления) = Тип("Строка") Тогда @@ -1114,7 +1072,8 @@ КонецФункции // Возвращает флаг того, что работа происходит в файловой базе. -// +// Возвращаемое значение: +// Булево - флаг того, что работа происходит в файловой базе. Функция ЭтоФайловаяБаза() Экспорт Возврат СтрНайти(СтрокаСоединенияИнформационнойБазы(), "File=") > 0; КонецФункции @@ -1124,6 +1083,9 @@ // Параметры: // - ИсточникДанных - ДинамическийСписок - реквизит формы. // +// Возвращаемое значение: +// ТаблицаЗначений - текущие данные динамического списка. +// Функция ТекущиеДанныеДинамическогоСписка(ИсточникДанных) Экспорт СхемаКомпоновки = Новый СхемаКомпоновкиДанных; @@ -1174,6 +1136,8 @@ КонецФункции // Читаем настройки из общего хранилища. +// Параметры: +// КлючНастройки - Строка - ключ для чтения настроек. // Процедура ПрочитатьНастройки(КлючНастройки = "") Экспорт @@ -1208,14 +1172,19 @@ // Используем внешний интерфейс регистрации. ДоступнаРегистрацияСредствамиБСП = БСП_ДоступнаТребуемаяВерсия("2.1.5.11"); ДоступнаРаботаРИБ = БСП_ДоступнаТребуемаяВерсия("2.1.3.25"); + ДоступнаРегистрацияАсинхронно = БСП_ДоступнаТребуемаяВерсия("2.3.5.34"); Иначе ДоступнаРегистрацияСредствамиБСП = Ложь; ДоступнаРаботаРИБ = Ложь; + ДоступнаРегистрацияАсинхронно = Ложь; КонецЕсли; КонецПроцедуры // Пишем настройки в общее хранилище. // +// Параметры: +// КлючНастройки - Строка - ключ для сохранения настроек. +// Процедура СохранитьНастройки(КлючНастройки = "") Экспорт КлючОбъекта = Метаданные().ПолноеИмя() + ".Форма.Форма"; @@ -1232,9 +1201,11 @@ // Проверяем настройки на корректность, сбрасываем в случае нарушения. // +// Параметры: +// КлючНастройки - Строка - Ключ проверяемой настройки. // Возвращаемое значение: -// Структура - ключ - имя настройки, значением содержит описанием ошибки или Неопределено -// при отсутствии ошибки для данного параметра. +// Структура - ключ - имя настройки. +// Значение - описание ошибки или Неопределено. // Функция ПроверитьКорректностьНастроек(КлючНастройки = "") Экспорт @@ -1286,59 +1257,162 @@ Возврат Результат; КонецФункции -// Служебное для регистрации в подключаемых обработках. +// Изменяет регистрацию переданного. // -Функция СведенияОВнешнейОбработке() Экспорт +// Параметры: +// Команда - Булево - Истина, если надо добавлять, Ложь, если удалять. +// БезУчетаАвторегистрации - Булево - Истина, если не надо анализировать флаг авторегистрации. +// Узел - ПланОбменаСсылка - Ссылка на узел плана обмена. +// Данные - ЛюбаяСсылка, Строка, Структура - данные или массив таких данных. +// ИмяТаблицы - Строка - Если Данные является структурой, то содержит имя таблицы. +// +// Возвращаемое значение: +// Структура - результат операции: +// * Всего - Число - общее число объектов. +// * Успешно - Число - числом успешно обработанных объектов. +// * Команда - Значение входящего параметра Команда для упрощения обработки результатов. +// +Функция ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Данные, ИмяТаблицы = Неопределено) - Инфо = Новый Структура; + ПрочитатьНастройки(); + Результат = Новый Структура("Всего, Успешно", 0, 0); - Инфо.Вставить("Вид", "СозданиеСвязанныхОбъектов"); - Инфо.Вставить("Команды", Новый ТаблицаЗначений); - Инфо.Вставить("БезопасныйРежим", Истина); - Инфо.Вставить("Назначение", Новый Массив); + // Только при добавлении и работе в составе БСП. + НадоФильтрБСП = ТипЗнч(Команда) = Тип("Булево") И Команда И КонфигурацияПоддерживаетБСП И НастройкаКонтрольВыгрузкиОбъектов; - Инфо.Вставить("Наименование", НСтр("ru = 'Регистрация изменений для обмена данными'")); - Инфо.Вставить("Версия", "1.0"); - Инфо.Вставить("ВерсияБСП", "1.2.1.4"); - Инфо.Вставить("Информация", НСтр("ru = 'Обработка для управления регистрацией объектов на узлах обмена до формирования выгрузки. При работе в составе конфигурации с БСП версии 2.1.2.0 и старше производит контроль ограничений миграции данных для узлов обмена.'")); + Если ТипЗнч(Данные) = Тип("Массив") Тогда + ДанныеРегистрации = Данные; + Иначе + ДанныеРегистрации = Новый Массив; + ДанныеРегистрации.Добавить(Данные); + КонецЕсли; - Инфо.Назначение.Добавить("ПланыОбмена.*"); - Инфо.Назначение.Добавить("Константы.*"); - Инфо.Назначение.Добавить("Справочники.*"); - Инфо.Назначение.Добавить("Документы.*"); - Инфо.Назначение.Добавить("Последовательности.*"); - Инфо.Назначение.Добавить("ПланыВидовХарактеристик.*"); - Инфо.Назначение.Добавить("ПланыСчетов.*"); - Инфо.Назначение.Добавить("ПланыВидовРасчета.*"); - Инфо.Назначение.Добавить("РегистрыСведений.*"); - Инфо.Назначение.Добавить("РегистрыНакопления.*"); - Инфо.Назначение.Добавить("РегистрыБухгалтерии.*"); - Инфо.Назначение.Добавить("РегистрыРасчета.*"); - Инфо.Назначение.Добавить("БизнесПроцессы.*"); - Инфо.Назначение.Добавить("Задачи.*"); - - Колонки = Инфо.Команды.Колонки; - ТипСтрока = Новый ОписаниеТипов("Строка"); - Колонки.Добавить("Представление", ТипСтрока); - Колонки.Добавить("Идентификатор", ТипСтрока); - Колонки.Добавить("Использование", ТипСтрока); - Колонки.Добавить("Модификатор", ТипСтрока); - Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); - - // Единственная команда, что делать - определяем по типу переданного. - Команда = Инфо.Команды.Добавить(); - Команда.Представление = НСтр("ru = 'Редактирование регистрации изменений объекта'"); - Команда.Идентификатор = "ОткрытьФормуРедактированияРегистрации"; - Команда.Использование = "ВызовКлиентскогоМетода"; - - Возврат Инфо; + Для Каждого Элемент Из ДанныеРегистрации Цикл + + Тип = ТипЗнч(Элемент); + Значения = Новый Массив; + + Если Элемент = Неопределено Тогда + // Вся конфигурация + + Если ТипЗнч(Команда) = Тип("Булево") И Команда Тогда + // Добавляем регистрацию по частям. + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Константы", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Справочники", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Документы", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Последовательности", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыВидовХарактеристик", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыСчетов", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "ПланыВидовРасчета", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыСведений", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыНакопления", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыБухгалтерии", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "РегистрыРасчета", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "БизнесПроцессы", ИмяТаблицы) ); + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, "Задачи", ИмяТаблицы) ); + Продолжить; + КонецЕсли; + + // Удаление регистрации - платформенным методом. + Значения.Добавить(Неопределено); + + ИначеЕсли Тип = Тип("Строка") Тогда + // Метаданные, возможно как коллекция, так и конкретный вид, на авторегистрацию смотрим. + Описание = ХарактеристикиПоМетаданным(Элемент); + Если НадоФильтрБСП Тогда + ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийМетаданных(Узел, Описание, БезУчетаАвторегистрации) ); + Продолжить; + + ИначеЕсли БезУчетаАвторегистрации Тогда + Если Описание.ЭтоКоллекция Тогда + Для Каждого Мета Из Описание.Метаданные Цикл + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Мета.ПолноеИмя(), ИмяТаблицы) ); + КонецЦикла; + Продолжить; + Иначе + Мета = Описание.Метаданные; + ЭлементСостава = Узел.Метаданные().Состав.Найти(Мета); + Если ЭлементСостава = Неопределено Тогда + Продолжить; + КонецЕсли; + // Константа? + Значения.Добавить(Описание.Метаданные); + КонецЕсли; + + Иначе + // Отсеиваем неподходящие по авторегистрации. + Если Описание.ЭтоКоллекция Тогда + // Регистрируем поодиночке + Для Каждого Мета Из Описание.Метаданные Цикл + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Мета.ПолноеИмя(), ИмяТаблицы) ); + КонецЦикла; + Продолжить; + Иначе + Мета = Описание.Метаданные; + ЭлементСостава = Узел.Метаданные().Состав.Найти(Мета); + Если ЭлементСостава = Неопределено Или ЭлементСостава.Авторегистрация <> АвтоРегистрацияИзменений.Разрешить Тогда + Продолжить; + КонецЕсли; + // Константа? + Значения.Добавить(Описание.Метаданные); + КонецЕсли; + КонецЕсли; + + // Смотрим опциональные варианты, Значения[0] - метаданные конкретного вида с именем "Элемент". + Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации) Цикл + Значения.Добавить(ТекЭлемент); + КонецЦикла; + + ИначеЕсли Тип = Тип("Структура") Тогда + // Это или конкретный набор записей, или результат выбора ссылочного типа отбором. + Описание = ХарактеристикиПоМетаданным(ИмяТаблицы); + Если Описание.ЭтоСсылка Тогда + ДобавитьРезультаты(Результат, ИзменитьРегистрациюНаСервере(Команда, БезУчетаАвторегистрации, Узел, Элемент.Ссылка) ); + Продолжить; + КонецЕсли; + // Конкретный набор записей, на авторегистрацию уже не смотрим. + Если НадоФильтрБСП Тогда + ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийНабора(Узел, Элемент, Описание) ); + Продолжить; + КонецЕсли; + + Набор = Описание.Менеджер.СоздатьНаборЗаписей(); + Для Каждого КлючЗначение Из Элемент Цикл + Набор.Отбор[КлючЗначение.Ключ].Установить(КлючЗначение.Значение); + КонецЦикла; + Значения.Добавить(Набор); + // Смотрим опциональные варианты. + Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации, ИмяТаблицы) Цикл + Значения.Добавить(ТекЭлемент); + КонецЦикла; + + Иначе + // Конкретная ссылка, на авторегистрацию уже не смотрим. + Если НадоФильтрБСП Тогда + ДобавитьРезультаты(Результат, БСП_РегистрацияИзмененийСсылки(Узел, Элемент) ); + Продолжить; + + КонецЕсли; + Значения.Добавить(Элемент); + // Смотрим опциональные варианты. + Для Каждого ТекЭлемент Из ПолучитьДополнительныеОбъектыРегистрации(Элемент, Узел, БезУчетаАвторегистрации) Цикл + Значения.Добавить(ТекЭлемент); + КонецЦикла; + + КонецЕсли; + + // Собственно регистрация, уже без фильтра. + Для Каждого ТекЗначение Из Значения Цикл + ВыполнитьКомандуРегистрацииОбъекта(Команда, Узел, ТекЗначение); + Результат.Успешно = Результат.Успешно + 1; + Результат.Всего = Результат.Всего + 1; + КонецЦикла; + + КонецЦикла; // Перебор объектов в массиве данных для регистрации. + Результат.Вставить("Команда", Команда); + Возврат Результат; КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции -// - // // Копирует отбор компоновки данных добавлением к существующим. // @@ -1417,8 +1491,40 @@ МодульОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(Узел, Выборка.Ссылка, ЭтотОбъект.НастройкаКонтрольВыгрузкиОбъектов); КонецЦикла; - Возврат; + ИначеЕсли Характеристики.ЭтоНабор Тогда + Для Каждого ИзмерениеРегистра Из ОбъектРегистрации.Измерения Цикл + Если НРег(ИзмерениеРегистра.Имя) = "узел" Тогда + Возврат; + КонецЕсли; + КонецЦикла; + ПоляИзмерений = ""; + Для Каждого Строка Из ИзмеренияНабораЗаписей(Характеристики.ИмяТаблицы) Цикл + ПоляИзмерений = ПоляИзмерений + "," + Строка.Имя + КонецЦикла; + ПоляИзмерений = Сред(ПоляИзмерений, 2); + Если ПустаяСтрока(ПоляИзмерений) Тогда + // У регистра сведений нет измерений с основным отбором. + // Регистрируются все изменения для объекта метаданных. + ПланыОбмена.ЗарегистрироватьИзменения(Узел, ОбъектРегистрации); + Иначе + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | " + ПоляИзмерений + " + |ИЗ + | " + Характеристики.ИмяТаблицы + " + |"); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Данные = Новый Структура(ПоляИзмерений); + ЗаполнитьЗначенияСвойств(Данные, Выборка); + БСП_РегистрацияИзмененийНабора(Узел, Данные, Характеристики); + КонецЦикла; + КонецЕсли; + ИначеЕсли Характеристики.ЭтоКонстанта Тогда + Выборка = Характеристики.Менеджер.СоздатьМенеджерЗначения(); + МодульОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(Узел, Выборка, ЭтотОбъект.НастройкаКонтрольВыгрузкиОбъектов); КонецЕсли; + Возврат; КонецЕсли; // Обычный объект @@ -1979,14 +2085,28 @@ ПоляИзмерений = ПоляИзмерений + "," + Строка.Имя КонецЦикла; ПоляИзмерений = Сред(ПоляИзмерений, 2); - + Если ПустаяСтрока(ПоляИзмерений) Тогда + // У РС нет измерений с основным отбором. + // Регистрируются все изменения для объекта метаданных. + ПланыОбмена.ЗарегистрироватьИзменения(Узел, Описание.Метаданные); + // Для подсчета результата. + Запрос = Новый Запрос("ВЫБРАТЬ + |Количество(*) КАК Количество + |ИЗ " + ТекИмяТаблицы + " + |"); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + Результат.Всего = Выборка.Количество; + Результат.Успешно = Выборка.Количество; + Возврат Результат; + КонецЕсли; Иначе Возврат Результат; КонецЕсли; Запрос = Новый Запрос(" |ВЫБРАТЬ РАЗЛИЧНЫЕ - | " + ?(ПустаяСтрока(ПоляИзмерений), "*", ПоляИзмерений) + " + | " + ПоляИзмерений + " |ИЗ | " + ТекИмяТаблицы + " |"); diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/РегистрацияИзмененийДляОбменаДанными.mdo b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/РегистрацияИзмененийДляОбменаДанными.mdo index 9bb79ce53..3166f0f4b 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/РегистрацияИзмененийДляОбменаДанными.mdo +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/РегистрацияИзмененийДляОбменаДанными.mdo @@ -151,6 +151,22 @@ + + ДоступнаРегистрацияАсинхронно + + ru + Доступна регистрация асинхронно + + + Boolean + + + ru + Регистрация в асинхронном режиме доступна. + + + + ВыборУзлаПланаОбмена diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form index 8da6fd447..deaaa0d24 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form @@ -82,12 +82,8 @@ <key>ru</key> - <value>Группа включение и расписание</value> + <value>Включение и расписание</value> - - ru - Группа включение и расписание - ГруппаВключениеИРасписаниеРасширеннаяПодсказка 72 @@ -318,10 +314,6 @@ ru 2. Действия при ошибках - - ru - Действия при ошибках - ДействияПриОшибкахExtendedTooltip 53 @@ -770,6 +762,10 @@ true + + <key>ru</key> + <value>Сообщения пользователю и описание информации об ошибке</value> + СообщенияПользователюИОписаниеИнформацииОбОшибкеExtendedTooltip 69 diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl index f36a8aa37..388f62053 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl @@ -181,7 +181,7 @@ КонецПроцедуры &НаКлиенте -Процедура ВыборШаблонаНовогоРегламентногоЗаданияЗавершение(ЭлементСписка, Неопределен) Экспорт +Процедура ВыборШаблонаНовогоРегламентногоЗаданияЗавершение(ЭлементСписка, Контекст) Экспорт Если ЭлементСписка = Неопределено Тогда Закрыть(); @@ -198,7 +198,7 @@ КонецПроцедуры &НаКлиенте -Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, Неопределен) Экспорт +Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, Контекст) Экспорт Если НовоеРасписание <> Неопределено Тогда Расписание = НовоеРасписание; @@ -229,8 +229,10 @@ Если Действие = "Изменить" Тогда Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); Иначе - Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание( - Метаданные.РегламентныеЗадания[ИмяМетаданных]); + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания[ИмяМетаданных]); + + Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); Идентификатор = Строка(Задание.УникальныйИдентификатор); Действие = "Изменить"; diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form index 34789199a..258f064e5 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form @@ -84,6 +84,10 @@ true + + <key>ru</key> + <value>Блокировка работы с внешними ресурсами</value> + ГруппаБлокировкаРаботыСВнешнимиРесурсамиРасширеннаяПодсказка 284 @@ -180,6 +184,10 @@ true + + <key>ru</key> + <value>Страница загрузка регламентных заданий</value> + СтраницаЗагрузкаРегламентныхЗаданийРасширеннаяПодсказка 294 @@ -201,6 +209,10 @@ ТаблицаРегламентныеЗадания 29 + + <key>ru</key> + <value>Таблица регламентные задания</value> + true true @@ -1194,9 +1206,6 @@ Auto true true - None - None - None true @@ -1205,6 +1214,10 @@ true + + <key>ru</key> + <value>Страница регламентные задания</value> + СтраницаРегламентныеЗаданияРасширеннаяПодсказка 296 @@ -1226,6 +1239,10 @@ true + + <key>ru</key> + <value>Страницы отложенная загрузка регламентных заданий</value> + СтраницыОтложеннаяЗагрузкаРегламентныхЗаданийРасширеннаяПодсказка 292 @@ -1707,6 +1724,10 @@ true + + <key>ru</key> + <value>Установка произвольного периода</value> + УстановкаПроизвольногоПериодаРасширеннаяПодсказка 216 @@ -1883,6 +1904,10 @@ true + + <key>ru</key> + <value>Шапка</value> + ГруппаШапкаРасширеннаяПодсказка 274 @@ -1912,6 +1937,10 @@ ТаблицаФоновыеЗадания 65 + + <key>ru</key> + <value>Таблица фоновые задания</value> + true true @@ -2148,6 +2177,32 @@ ТаблицаФоновыеЗаданияКоманднаяПанель 67 + + ТаблицаФоновыеЗаданияОбновитьРегламентныеЗадания + 281 + true + true + + true + + + ТаблицаФоновыеЗаданияОбновитьРегламентныеЗаданияРасширеннаяПодсказка + 282 + Label + true + true + + Left + + + Form.Command.ОбновитьРегламентныеЗадания + Normal + PictureAndText + true + true + UserCmds + Auto + ТаблицаФоновыеЗаданияОткрыть 121 @@ -2207,31 +2262,6 @@ UserCmds Auto - - ТаблицаФоновыеЗаданияОбновитьРегламентныеЗадания - 281 - true - true - - true - - - ТаблицаФоновыеЗаданияОбновитьРегламентныеЗаданияРасширеннаяПодсказка - 282 - Label - true - true - - Left - - - Form.Command.ОбновитьРегламентныеЗадания - Normal - true - true - UserCmds - Auto - ТаблицаФоновыеЗаданияСправка 154 @@ -2371,9 +2401,6 @@ Auto true true - None - None - None true @@ -2382,6 +2409,10 @@ true + + <key>ru</key> + <value>Страница фоновые задания</value> + СтраницаФоновыеЗаданияРасширеннаяПодсказка 267 @@ -2445,6 +2476,10 @@ true + + <key>ru</key> + <value>Страница длительная операция</value> + СтраницаДлительнаяОперацияРасширеннаяПодсказка 269 @@ -2467,6 +2502,10 @@ true + + <key>ru</key> + <value>Страницы отложенная загрузка фоновых заданий</value> + СтраницыОтложеннаяЗагрузкаФоновыхЗаданийРасширеннаяПодсказка 265 @@ -2513,6 +2552,10 @@ true + + <key>ru</key> + <value>Задания</value> + ЗаданияExtendedTooltip 176 @@ -3084,7 +3127,7 @@ ОтбиратьПоРегламентномуЗаданию <key>ru</key> - <value>Отбирать по регламентному заданию</value> + <value>Отбирать по регламентному заданию:</value> 2 diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl index 73386cd20..a4b1c6831 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl @@ -292,8 +292,6 @@ КонецЕсли; КонецЕсли; - ЗагрузитьРегламентныеЗадания(, Истина); - КонецПроцедуры &НаКлиенте @@ -400,7 +398,7 @@ Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(ИдентификаторЗадания); ИмяМетода = Задание.Метаданные.ИмяМетода; - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяМетода); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, Задание.Параметры); КонецФункции @@ -489,10 +487,11 @@ &НаСервере Процедура УстановитьВидимостьОтключенныхЗаданий(Показывать) - Элемент = УсловноеОформление.Элементы.Получить(3); + Элемент = УсловноеОформление.Элементы.Получить(4); ЭлементОформления = Элемент.Оформление.Элементы.Найти("Видимость"); Если Не Показывать Тогда + Элемент.Отбор.Элементы.Очистить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ИмяЗадания"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; @@ -519,7 +518,7 @@ КонецПроцедуры &НаКлиенте -Процедура ТаблицаРегламентныеЗаданияПередУдалениемЗавершение(Ответ, Неопределен) Экспорт +Процедура ТаблицаРегламентныеЗаданияПередУдалениемЗавершение(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда УдалитьРегламентноеЗаданиеВыполнитьНаСервере( @@ -907,6 +906,9 @@ ПараметрыДлительнойОперации.Вставить("ИдентификаторРегламентногоЗадания", ИдентификаторЗадания); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + Если ИдентификаторЗадания <> Неопределено Тогда + ПараметрыВыполнения.ЗапуститьНеВФоне = Истина; + КонецЕсли; ПараметрыВыполнения.ОжидатьЗавершение = 0; // запускать сразу ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Формирование таблицы регламентных заданий'"); @@ -922,7 +924,7 @@ ПараметрыОперации = Новый Структура; ПараметрыОперации.Вставить("Таблица", РеквизитФормыВЗначение("ТаблицаРегламентныеЗадания")); - ПараметрыОперации.Вставить("ОтключенныеЗадания", ОтключенныеЗадания); + ПараметрыОперации.Вставить("ОтключенныеЗадания", ОтключенныеЗадания.Скопировать()); Возврат ПараметрыОперации; @@ -932,7 +934,13 @@ Процедура ОбработатьРезультат(ПараметрыЗадания) Результат = ПолучитьИзВременногоХранилища(ПараметрыЗадания.АдресРезультата); - ОтключенныеЗадания = Результат.ОтключенныеЗадания; + ОтключенныеЗадания.Очистить(); + Для Каждого ЭлементСписка Из Результат.ОтключенныеЗадания Цикл + ОтключенныеЗадания.Добавить(ЭлементСписка.Значение); + КонецЦикла; + + УстановитьВидимостьОтключенныхЗаданий(Элементы.ТаблицаРегламентныеЗаданияПоказатьВсеЗадания.Пометка); + ЗначениеВРеквизитФормы(Результат.Таблица, "ТаблицаРегламентныеЗадания"); Элементы.ТаблицаРегламентныеЗадания.Обновить(); @@ -991,7 +999,6 @@ ПередаваемыеПараметры.Вставить("Отбор", Отбор); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - ПараметрыВыполнения.ЗапуститьНеВФоне = Истина; ПараметрыВыполнения.ОжидатьЗавершение = 0; ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Регламентные задания. Обновление списка фоновых заданий'"); diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form index e2d2aebd9..59b03d4c7 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form @@ -214,7 +214,7 @@ <key>ru</key> - <value>1. Основное</value> + <value>Основное</value> true @@ -231,9 +231,9 @@ Vertical Auto + NormalSeparation true true - Auto Auto @@ -367,7 +367,7 @@ <key>ru</key> - <value>2. Дополнительно</value> + <value>Дополнительно</value> true @@ -384,9 +384,9 @@ Vertical Auto + NormalSeparation true true - Auto Auto
                  @@ -484,7 +484,7 @@ <key>ru</key> - <value>3. Регламентное задание</value> + <value>Регламентное задание</value> true @@ -501,77 +501,35 @@ Vertical Auto + NormalSeparation true true - Auto Auto
                  - - СообщенияПользователюИОписаниеИнформацииОбОшибке - 29 - - СообщенияИОписаниеИнформацииОбОшибке - 26 - - <key>ru</key> - <value>Сообщение</value> - - true - true - - true - - - СообщенияПользователюИОписаниеИнформацииОбОшибке - - Left - - ru - Сообщения пользователю и описание информации об ошибке - - - СообщенияИОписаниеИнформацииОбОшибкеExtendedTooltip - 45 - Label - true - true - - Left - - - - СообщенияИОписаниеИнформацииОбОшибкеКонтекстноеМеню - 27 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - true - true - Normal - - + + СообщенияИОписаниеИнформацииОбОшибке + 26 + + <key>ru</key> + <value>Сообщение</value> + true true true + + СообщенияПользователюИОписаниеИнформацииОбОшибке + + Left + + ru + Сообщения пользователю и описание информации об ошибке + - СообщенияПользователюИОписаниеИнформацииОбОшибкеExtendedTooltip - 44 + СообщенияИОписаниеИнформацииОбОшибкеExtendedTooltip + 45 Label true true @@ -579,14 +537,28 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + СообщенияИОписаниеИнформацииОбОшибкеКонтекстноеМеню + 27 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + true + true + Normal @@ -752,7 +724,7 @@ Расположение <key>ru</key> - <value>Место выполнения </value> + <value>Место выполнения</value> 7 diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Commands/ПоказатьРезультат/CommandModule.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Commands/ПоказатьРезультат/CommandModule.bsl index d2e871159..fcf652974 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Commands/ПоказатьРезультат/CommandModule.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Commands/ПоказатьРезультат/CommandModule.bsl @@ -4,7 +4,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); ПараметрыРезервногоКопирования = ПараметрыРаботы.РезервноеКопированиеИБ; ПараметрыФормы = Новый Структура(); diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form index 1e820fe58..92f109cff 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form @@ -157,10 +157,10 @@ true - + <key>ru</key> - <value>Группа авторизации</value> - </toolTip> + <value>Авторизации</value> + ГруппаАвторизацииExtendedTooltip 105 @@ -223,6 +223,10 @@ true + + <key>ru</key> + <value>Страница пустая</value> + СтраницаПустаяРасширеннаяПодсказка 167 @@ -290,10 +294,6 @@ ru Группа картинки - - ru - Группа картинки - ГруппаКартинки1ExtendedTooltip 109 @@ -400,10 +400,6 @@ ru Группа надписей - - ru - Группа надписей - ГруппаНадписей1ExtendedTooltip 111 @@ -433,10 +429,6 @@ ru Страница активные пользователи - - ru - Страница активные пользователи - СтраницаАктивныеПользователиРасширеннаяПодсказка 160 @@ -621,6 +613,10 @@ true + + <key>ru</key> + <value>Comcntr файловый режим</value> + ГруппаComcntrФайловыйРежимExtendedTooltip 139 @@ -646,10 +642,10 @@ true - + <key>ru</key> - <value>Группа ошибки</value> - </toolTip> + <value>Ошибки</value> + ГруппаОшибкиExtendedTooltip 131 @@ -679,10 +675,6 @@ ru Страница ошибка подключения - - ru - Страница ошибка подключения - СтраницаОшибкаПодключенияРасширеннаяПодсказка 158 @@ -704,6 +696,10 @@ true + + <key>ru</key> + <value>Страницы статуса восстановления</value> + СтраницыСтатусаВосстановленияРасширеннаяПодсказка 156 @@ -728,10 +724,6 @@ ru Страница настройки загрузки - - ru - Страница настройки загрузки - СтраницаНастройкиЗагрузкиExtendedTooltip 96 @@ -803,12 +795,8 @@ <key>ru</key> - <value>Группа пояснения</value> + <value>Пояснения</value> - - ru - Группа пояснения - ГруппаПоясненияExtendedTooltip 117 @@ -872,12 +860,8 @@ <key>ru</key> - <value>Группа картинки активных пользователей</value> + <value>Картинки активных пользователей</value> - - ru - Группа картинки активных пользователей - ГруппаКартинкиАктивныхПользователейExtendedTooltip 120 @@ -1019,12 +1003,8 @@ <key>ru</key> - <value>Группа надписи активных пользователей</value> + <value>Надписи активных пользователей</value> - - ru - Группа надписи активных пользователей - ГруппаНадписиАктивныхПользователейExtendedTooltip 122 @@ -1053,10 +1033,6 @@ ru Группа - - ru - Группа - ГруппаРасширеннаяПодсказка 143 @@ -1084,7 +1060,7 @@ <key>ru</key> - <value>Группа активных пользователей</value> + <value>Активных пользователей</value> ГруппаАктивныхПользователейExtendedTooltip @@ -1147,10 +1123,6 @@ ru Страница информации и выполнения резервного копирования - - ru - Страница информации и выполнения резервного копирования - СтраницаИнформацииИВыполненияРезервногоКопированияExtendedTooltip 116 @@ -1221,6 +1193,10 @@ true + + <key>ru</key> + <value>Неуспешного копирования</value> + ГруппаНеуспешногоКопированияРасширеннаяПодсказка 174 @@ -1274,50 +1250,21 @@ - - Группа2 - 183 - - НадписьНеУдалось - 185 - - <key>ru</key> - <value>Текст ошибки</value> - - true - true - - true - - - НадписьНеУдалосьРасширеннаяПодсказка - 187 - Label - true - true - - Left - - - - НадписьНеУдалосьКонтекстноеМеню - 186 - true - - Label - true - - Left - - + + НадписьНеУдалось + 185 + + <key>ru</key> + <value>Текст ошибки</value> + true true true - Группа2РасширеннаяПодсказка - 184 + НадписьНеУдалосьРасширеннаяПодсказка + 187 Label true true @@ -1325,14 +1272,15 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + НадписьНеУдалосьКонтекстноеМеню + 186 + true + + Label + true + + Left true @@ -1340,6 +1288,10 @@ true + + <key>ru</key> + <value>Не удалось</value> + ГруппаНеУдалосьРасширеннаяПодсказка 179 @@ -1368,10 +1320,6 @@ ru Страница ошибок при копировании - - ru - Страница ошибок при копировании - СтраницаОшибокПриКопированииExtendedTooltip 172 @@ -1398,10 +1346,6 @@ ru Страницы загрузки данных - - ru - Страницы загрузки данных - СтраницыЗагрузкиДанныхExtendedTooltip 95 diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl index c3e718f24..687ccd290 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl @@ -325,7 +325,7 @@ СтрокаЗапуска = """%1"" ""%2"" [p1]%3[/p1]"; СтрокаЗапуска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаЗапуска, ПутьКПрограммеЗапуска, ИмяГлавногоФайлаСкрипта, РезервноеКопированиеИБКлиент.СтрокаUnicode(ПарольАдминистратораИБ)); - + ЗапуститьПриложение(СтрокаЗапуска); ЗавершитьРаботуСистемы(Ложь); @@ -339,7 +339,7 @@ Функция СформироватьФайлыСкриптаОбновления() ПараметрыКопирования = РезервноеКопированиеИБКлиент.КлиентскиеПараметрыРезервногоКопирования(); - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); СоздатьКаталог(ПараметрыКопирования.КаталогВременныхФайловОбновления); // Структура параметров необходима для их определения на клиенте и передачи на сервер. diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form index f5096b969..3d3fa000e 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form @@ -231,6 +231,10 @@ true + + <key>ru</key> + <value>Авторизации</value> + ГруппаАвторизацииРасширеннаяПодсказка 303 @@ -293,6 +297,10 @@ true + + <key>ru</key> + <value>Страница пустая</value> + СтраницаПустаяРасширеннаяПодсказка 397 @@ -434,12 +442,8 @@ <key>ru</key> - <value>Группа надписей</value> + <value>Надписей</value> - - ru - Группа надписей - ГруппаНадписейExtendedTooltip 309 @@ -465,6 +469,10 @@ true + + <key>ru</key> + <value>Страница активные пользователи</value> + СтраницаАктивныеПользователиРасширеннаяПодсказка 395 @@ -517,7 +525,7 @@ - Группа1 + ГруппаОшибка 274 ОбнаруженнаяОшибкаПодключения @@ -646,8 +654,12 @@ true + + <key>ru</key> + <value>Ошибка</value> + - Группа1ExtendedTooltip + ГруппаОшибкаРасширеннаяПодсказка 360 Label true @@ -671,6 +683,10 @@ true + + <key>ru</key> + <value>Страница ошибка подключения</value> + СтраницаОшибкаПодключенияРасширеннаяПодсказка 399 @@ -692,6 +708,10 @@ true + + <key>ru</key> + <value>Страницы статуса копирования</value> + СтраницыСтатусаКопированияРасширеннаяПодсказка 393 @@ -716,10 +736,6 @@ ru Страница выполнения резервного копирования - - ru - Страница выполнения резервного копирования - СтраницаВыполненияРезервногоКопированияExtendedTooltip 291 @@ -792,12 +808,8 @@ <key>ru</key> - <value>Группа пояснения</value> + <value>Пояснения</value> - - ru - Группа пояснения - ГруппаПоясненияExtendedTooltip 332 @@ -821,58 +833,19 @@ ГруппаАктивныхПользователей 81 - Группа5 - 433 - - ГруппаКартинкиАктивныхПользователей - 82 - - Декорация5 - 83 - true - true - - true - - - Декорация5ExtendedTooltip - 336 - Label - true - true - - Left - - - - Декорация5КонтекстноеМеню - 84 - true - - true - true - - - CommonPicture.ДлительнаяОперация48 - - - + ГруппаАктивныеСеансы + 420 + + Декорация5 + 83 true true true - - <key>ru</key> - <value>Группа картинки активных пользователей</value> - - - ru - Группа картинки активных пользователей - - ГруппаКартинкиАктивныхПользователейExtendedTooltip - 335 + Декорация5ExtendedTooltip + 336 Label true true @@ -880,18 +853,21 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + Декорация5КонтекстноеМеню + 84 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + - Группа2 + ГруппаЗавершениеСеансов 435 ГруппаОжидание @@ -1019,7 +995,7 @@ <key>ru</key> - <value>Группа ожидания активных пользователей</value> + <value>Ожидания активных пользователей</value> ГруппаОжиданияАктивныхПользователейРасширеннаяПодсказка @@ -1136,7 +1112,7 @@ <key>ru</key> - <value>Группа ожидание</value> + <value>Ожидание</value> ГруппаОжиданиеРасширеннаяПодсказка @@ -1193,8 +1169,12 @@ true + + <key>ru</key> + <value>Завершение сеансов</value> + - Группа2РасширеннаяПодсказка + ГруппаЗавершениеСеансовРасширеннаяПодсказка 436 Label true @@ -1218,41 +1198,10 @@ true - - Группа5РасширеннаяПодсказка - 434 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаАктивныеСеансы - 420 - true - true - - true - <key>ru</key> - <value>Группа активные сеансы</value> + <value>Активные сеансы</value> - - ru - Группа активные сеансы - ГруппаАктивныеСеансыРасширеннаяПодсказка 421 @@ -1279,7 +1228,7 @@ <key>ru</key> - <value>Группа активных пользователей</value> + <value>Активных пользователей</value> ГруппаАктивныхПользователейExtendedTooltip @@ -1311,10 +1260,6 @@ ru Страница информации и выполнения резервного копирования - - ru - Страница информации и выполнения резервного копирования - СтраницаИнформацииИВыполненияРезервногоКопированияExtendedTooltip 331 @@ -1475,7 +1420,7 @@ <key>ru</key> - <value>Группа объявления о успешном резервном копирование</value> + <value>Объявления о успешном резервном копирование</value> ГруппаОбъявленияОУспешномРезервномКопированиеРасширеннаяПодсказка @@ -1576,6 +1521,10 @@ true + + <key>ru</key> + <value>Автоматическое резервное копирование</value> + ГруппаАвтоматическоеРезервноеКопированиеРасширеннаяПодсказка 419 @@ -1605,10 +1554,6 @@ ru Страница успешного выполнения копирования - - ru - Страница успешного выполнения копирования - СтраницаУспешногоВыполненияКопированияExtendedTooltip 342 @@ -1679,6 +1624,10 @@ true + + <key>ru</key> + <value>Неуспешного копирования</value> + ГруппаНеуспешногоКопированияРасширеннаяПодсказка 348 @@ -1804,7 +1753,7 @@ <key>ru</key> - <value>Группа расшифровка</value> + <value>Расшифровка</value> ГруппаРасшифровкаРасширеннаяПодсказка @@ -1831,6 +1780,10 @@ true + + <key>ru</key> + <value>Не удалось</value> + ГруппаНеУдалосьРасширеннаяПодсказка 350 @@ -1859,10 +1812,6 @@ ru Страница ошибок при копировании - - ru - Страница ошибок при копировании - СтраницаОшибокПриКопированииExtendedTooltip 347 @@ -1889,10 +1838,6 @@ ru Страницы помощника - - ru - Страницы помощника - СтраницыПомощникаExtendedTooltip 290 diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl index 3e0ab791b..6d0ae92f0 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl @@ -1,6 +1,6 @@ #Область ОписаниеПеременных - &НаКлиенте +&НаКлиенте Перем ВыполняетсяРезервноеКопирование; #КонецОбласти @@ -574,7 +574,7 @@ Функция СформироватьФайлыСкриптаОбновления() ПараметрыРезервногоКопирования = РезервноеКопированиеИБКлиент.КлиентскиеПараметрыРезервногоКопирования(); - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); СоздатьКаталог(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления); // Структура параметров необходима для их определения на клиенте и передачи на сервер. diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt index 2a0245e27..6e3be8c8d 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt @@ -1,20 +1,10 @@ - - - - + + Восстановление данных из резервной копии... +